From 84adefa331c4159d432d22840663c38f155cd4c1 Mon Sep 17 00:00:00 2001 From: Erlang/OTP Date: Fri, 20 Nov 2009 14:54:40 +0000 Subject: The R13B03 release. --- lib/snmp/doc/src/MIB_mechanism.fig | 73 + lib/snmp/doc/src/MIB_mechanism.gif | Bin 0 -> 3268 bytes lib/snmp/doc/src/MIB_mechanism.ps | 217 ++ lib/snmp/doc/src/Makefile | 349 ++ lib/snmp/doc/src/book.gif | Bin 0 -> 1081 bytes lib/snmp/doc/src/book.xml | 49 + lib/snmp/doc/src/depend.mk | 82 + lib/snmp/doc/src/fascicules.xml | 18 + lib/snmp/doc/src/files.mk | 153 + lib/snmp/doc/src/getnext1.gif | Bin 0 -> 2951 bytes lib/snmp/doc/src/getnext1.ps | 2923 +++++++++++++++++ lib/snmp/doc/src/getnext2.gif | Bin 0 -> 3529 bytes lib/snmp/doc/src/getnext2.ps | 2997 +++++++++++++++++ lib/snmp/doc/src/getnext3.gif | Bin 0 -> 3876 bytes lib/snmp/doc/src/getnext3.ps | 3003 +++++++++++++++++ lib/snmp/doc/src/getnext4.gif | Bin 0 -> 3705 bytes lib/snmp/doc/src/getnext4.ps | 3002 +++++++++++++++++ lib/snmp/doc/src/index.html.src | 98 + lib/snmp/doc/src/make.dep | 77 + lib/snmp/doc/src/min_head.gif | Bin 0 -> 2652 bytes lib/snmp/doc/src/note.gif | Bin 0 -> 1539 bytes lib/snmp/doc/src/notes.gif | Bin 0 -> 2005 bytes lib/snmp/doc/src/notes.xml | 1024 ++++++ lib/snmp/doc/src/notes_history.xml | 2151 +++++++++++++ lib/snmp/doc/src/part.xml | 54 + lib/snmp/doc/src/part_notes.xml | 40 + lib/snmp/doc/src/part_notes_history.xml | 41 + lib/snmp/doc/src/ref_man.gif | Bin 0 -> 1530 bytes lib/snmp/doc/src/ref_man.xml | 71 + lib/snmp/doc/src/snmp-um-1-image-1.gif | Bin 0 -> 5684 bytes lib/snmp/doc/src/snmp-um-1-image-1.ps | 2912 +++++++++++++++++ lib/snmp/doc/src/snmp-um-1-image-2.gif | Bin 0 -> 2407 bytes lib/snmp/doc/src/snmp-um-1-image-2.ps | 2866 +++++++++++++++++ lib/snmp/doc/src/snmp-um-1-image-3.gif | Bin 0 -> 10952 bytes lib/snmp/doc/src/snmp-um-1-image-3.ps | 3400 ++++++++++++++++++++ lib/snmp/doc/src/snmp-um-1-image-8.gif | Bin 0 -> 6202 bytes lib/snmp/doc/src/snmp-um-1-image-8.ps | 2931 +++++++++++++++++ lib/snmp/doc/src/snmp.gif | Bin 0 -> 15889 bytes lib/snmp/doc/src/snmp.xml | 608 ++++ lib/snmp/doc/src/snmp_advanced_agent.xml | 482 +++ lib/snmp/doc/src/snmp_agent_config_files.xml | 464 +++ lib/snmp/doc/src/snmp_agent_funct_descr.xml | 947 ++++++ lib/snmp/doc/src/snmp_agent_netif.xml | 268 ++ lib/snmp/doc/src/snmp_agent_netif_1.gif | Bin 0 -> 5217 bytes lib/snmp/doc/src/snmp_agent_netif_1.ps | 2909 +++++++++++++++++ lib/snmp/doc/src/snmp_app.xml | 708 ++++ lib/snmp/doc/src/snmp_app_a.xml | 108 + lib/snmp/doc/src/snmp_app_b.xml | 511 +++ lib/snmp/doc/src/snmp_audit_trail_log.xml | 81 + lib/snmp/doc/src/snmp_community_mib.xml | 136 + lib/snmp/doc/src/snmp_config.xml | 1030 ++++++ lib/snmp/doc/src/snmp_def_instr_functions.xml | 477 +++ lib/snmp/doc/src/snmp_framework_mib.xml | 119 + lib/snmp/doc/src/snmp_generic.xml | 345 ++ lib/snmp/doc/src/snmp_impl_example_agent.xml | 510 +++ lib/snmp/doc/src/snmp_impl_example_manager.xml | 94 + lib/snmp/doc/src/snmp_index.xml | 266 ++ lib/snmp/doc/src/snmp_instr_functions.xml | 456 +++ lib/snmp/doc/src/snmp_intro.xml | 258 ++ lib/snmp/doc/src/snmp_manager_config_files.xml | 249 ++ lib/snmp/doc/src/snmp_manager_funct_descr.xml | 112 + lib/snmp/doc/src/snmp_manager_netif.xml | 174 + lib/snmp/doc/src/snmp_manager_netif_1.gif | Bin 0 -> 2714 bytes lib/snmp/doc/src/snmp_manager_netif_1.ps | 305 ++ lib/snmp/doc/src/snmp_mib_compiler.xml | 252 ++ lib/snmp/doc/src/snmp_notification_mib.xml | 131 + lib/snmp/doc/src/snmp_pdus.xml | 204 ++ lib/snmp/doc/src/snmp_standard_mib.xml | 135 + lib/snmp/doc/src/snmp_target_mib.xml | 195 ++ lib/snmp/doc/src/snmp_user_based_sm_mib.xml | 146 + lib/snmp/doc/src/snmp_view_based_acm_mib.xml | 201 ++ lib/snmp/doc/src/snmpa.xml | 1252 +++++++ lib/snmp/doc/src/snmpa_conf.xml | 861 +++++ lib/snmp/doc/src/snmpa_discovery_handler.xml | 118 + lib/snmp/doc/src/snmpa_error.xml | 91 + lib/snmp/doc/src/snmpa_error_io.xml | 88 + lib/snmp/doc/src/snmpa_error_logger.xml | 95 + lib/snmp/doc/src/snmpa_error_report.xml | 88 + lib/snmp/doc/src/snmpa_local_db.xml | 190 ++ lib/snmp/doc/src/snmpa_mpd.xml | 159 + lib/snmp/doc/src/snmpa_network_interface.xml | 170 + .../doc/src/snmpa_network_interface_filter.xml | 163 + .../snmpa_notification_delivery_info_receiver.xml | 120 + lib/snmp/doc/src/snmpa_notification_filter.xml | 73 + lib/snmp/doc/src/snmpa_supervisor.xml | 117 + lib/snmp/doc/src/snmpc.xml | 201 ++ lib/snmp/doc/src/snmpm.xml | 1043 ++++++ lib/snmp/doc/src/snmpm_conf.xml | 364 +++ lib/snmp/doc/src/snmpm_mpd.xml | 139 + lib/snmp/doc/src/snmpm_network_interface.xml | 252 ++ .../doc/src/snmpm_network_interface_filter.xml | 158 + lib/snmp/doc/src/snmpm_user.xml | 276 ++ lib/snmp/doc/src/structure.fig | 46 + lib/snmp/doc/src/structure.gif | Bin 0 -> 3878 bytes lib/snmp/doc/src/structure.ps | 170 + lib/snmp/doc/src/summary.html.src | 1 + lib/snmp/doc/src/user_guide.gif | Bin 0 -> 1581 bytes lib/snmp/doc/src/warning.gif | Bin 0 -> 1498 bytes 98 files changed, 47647 insertions(+) create mode 100644 lib/snmp/doc/src/MIB_mechanism.fig create mode 100644 lib/snmp/doc/src/MIB_mechanism.gif create mode 100644 lib/snmp/doc/src/MIB_mechanism.ps create mode 100644 lib/snmp/doc/src/Makefile create mode 100644 lib/snmp/doc/src/book.gif create mode 100644 lib/snmp/doc/src/book.xml create mode 100644 lib/snmp/doc/src/depend.mk create mode 100644 lib/snmp/doc/src/fascicules.xml create mode 100644 lib/snmp/doc/src/files.mk create mode 100644 lib/snmp/doc/src/getnext1.gif create mode 100644 lib/snmp/doc/src/getnext1.ps create mode 100644 lib/snmp/doc/src/getnext2.gif create mode 100644 lib/snmp/doc/src/getnext2.ps create mode 100644 lib/snmp/doc/src/getnext3.gif create mode 100644 lib/snmp/doc/src/getnext3.ps create mode 100644 lib/snmp/doc/src/getnext4.gif create mode 100644 lib/snmp/doc/src/getnext4.ps create mode 100644 lib/snmp/doc/src/index.html.src create mode 100644 lib/snmp/doc/src/make.dep create mode 100644 lib/snmp/doc/src/min_head.gif create mode 100644 lib/snmp/doc/src/note.gif create mode 100644 lib/snmp/doc/src/notes.gif create mode 100644 lib/snmp/doc/src/notes.xml create mode 100644 lib/snmp/doc/src/notes_history.xml create mode 100644 lib/snmp/doc/src/part.xml create mode 100644 lib/snmp/doc/src/part_notes.xml create mode 100644 lib/snmp/doc/src/part_notes_history.xml create mode 100644 lib/snmp/doc/src/ref_man.gif create mode 100644 lib/snmp/doc/src/ref_man.xml create mode 100644 lib/snmp/doc/src/snmp-um-1-image-1.gif create mode 100644 lib/snmp/doc/src/snmp-um-1-image-1.ps create mode 100644 lib/snmp/doc/src/snmp-um-1-image-2.gif create mode 100644 lib/snmp/doc/src/snmp-um-1-image-2.ps create mode 100644 lib/snmp/doc/src/snmp-um-1-image-3.gif create mode 100644 lib/snmp/doc/src/snmp-um-1-image-3.ps create mode 100644 lib/snmp/doc/src/snmp-um-1-image-8.gif create mode 100644 lib/snmp/doc/src/snmp-um-1-image-8.ps create mode 100644 lib/snmp/doc/src/snmp.gif create mode 100644 lib/snmp/doc/src/snmp.xml create mode 100644 lib/snmp/doc/src/snmp_advanced_agent.xml create mode 100644 lib/snmp/doc/src/snmp_agent_config_files.xml create mode 100644 lib/snmp/doc/src/snmp_agent_funct_descr.xml create mode 100644 lib/snmp/doc/src/snmp_agent_netif.xml create mode 100644 lib/snmp/doc/src/snmp_agent_netif_1.gif create mode 100644 lib/snmp/doc/src/snmp_agent_netif_1.ps create mode 100644 lib/snmp/doc/src/snmp_app.xml create mode 100644 lib/snmp/doc/src/snmp_app_a.xml create mode 100644 lib/snmp/doc/src/snmp_app_b.xml create mode 100644 lib/snmp/doc/src/snmp_audit_trail_log.xml create mode 100644 lib/snmp/doc/src/snmp_community_mib.xml create mode 100644 lib/snmp/doc/src/snmp_config.xml create mode 100644 lib/snmp/doc/src/snmp_def_instr_functions.xml create mode 100644 lib/snmp/doc/src/snmp_framework_mib.xml create mode 100644 lib/snmp/doc/src/snmp_generic.xml create mode 100644 lib/snmp/doc/src/snmp_impl_example_agent.xml create mode 100644 lib/snmp/doc/src/snmp_impl_example_manager.xml create mode 100644 lib/snmp/doc/src/snmp_index.xml create mode 100644 lib/snmp/doc/src/snmp_instr_functions.xml create mode 100644 lib/snmp/doc/src/snmp_intro.xml create mode 100644 lib/snmp/doc/src/snmp_manager_config_files.xml create mode 100644 lib/snmp/doc/src/snmp_manager_funct_descr.xml create mode 100644 lib/snmp/doc/src/snmp_manager_netif.xml create mode 100644 lib/snmp/doc/src/snmp_manager_netif_1.gif create mode 100644 lib/snmp/doc/src/snmp_manager_netif_1.ps create mode 100644 lib/snmp/doc/src/snmp_mib_compiler.xml create mode 100644 lib/snmp/doc/src/snmp_notification_mib.xml create mode 100644 lib/snmp/doc/src/snmp_pdus.xml create mode 100644 lib/snmp/doc/src/snmp_standard_mib.xml create mode 100644 lib/snmp/doc/src/snmp_target_mib.xml create mode 100644 lib/snmp/doc/src/snmp_user_based_sm_mib.xml create mode 100644 lib/snmp/doc/src/snmp_view_based_acm_mib.xml create mode 100644 lib/snmp/doc/src/snmpa.xml create mode 100644 lib/snmp/doc/src/snmpa_conf.xml create mode 100644 lib/snmp/doc/src/snmpa_discovery_handler.xml create mode 100644 lib/snmp/doc/src/snmpa_error.xml create mode 100644 lib/snmp/doc/src/snmpa_error_io.xml create mode 100644 lib/snmp/doc/src/snmpa_error_logger.xml create mode 100644 lib/snmp/doc/src/snmpa_error_report.xml create mode 100644 lib/snmp/doc/src/snmpa_local_db.xml create mode 100644 lib/snmp/doc/src/snmpa_mpd.xml create mode 100644 lib/snmp/doc/src/snmpa_network_interface.xml create mode 100644 lib/snmp/doc/src/snmpa_network_interface_filter.xml create mode 100644 lib/snmp/doc/src/snmpa_notification_delivery_info_receiver.xml create mode 100644 lib/snmp/doc/src/snmpa_notification_filter.xml create mode 100644 lib/snmp/doc/src/snmpa_supervisor.xml create mode 100644 lib/snmp/doc/src/snmpc.xml create mode 100644 lib/snmp/doc/src/snmpm.xml create mode 100644 lib/snmp/doc/src/snmpm_conf.xml create mode 100644 lib/snmp/doc/src/snmpm_mpd.xml create mode 100644 lib/snmp/doc/src/snmpm_network_interface.xml create mode 100644 lib/snmp/doc/src/snmpm_network_interface_filter.xml create mode 100644 lib/snmp/doc/src/snmpm_user.xml create mode 100644 lib/snmp/doc/src/structure.fig create mode 100644 lib/snmp/doc/src/structure.gif create mode 100644 lib/snmp/doc/src/structure.ps create mode 100644 lib/snmp/doc/src/summary.html.src create mode 100644 lib/snmp/doc/src/user_guide.gif create mode 100644 lib/snmp/doc/src/warning.gif (limited to 'lib/snmp/doc/src') diff --git a/lib/snmp/doc/src/MIB_mechanism.fig b/lib/snmp/doc/src/MIB_mechanism.fig new file mode 100644 index 0000000000..38d4c7c5e6 --- /dev/null +++ b/lib/snmp/doc/src/MIB_mechanism.fig @@ -0,0 +1,73 @@ +#FIG 3.1 +Landscape +Center +Inches +1200 2 +6 1725 525 3375 1875 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 3000 600 3000 1800 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 3000 600 3300 600 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 3000 1800 3300 1800 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 1725 1200 3000 1200 +-6 +6 1725 2925 3375 4275 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 3000 3000 3000 4200 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 3000 3000 3300 3000 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 3000 4200 3300 4200 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 1725 3600 3000 3600 +-6 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 5250 600 5250 1800 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4950 1800 5250 1800 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4950 600 5250 600 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5250 1200 6000 1200 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 1800 2400 3300 2400 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4950 2400 7800 2400 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 7200 1200 7800 1200 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4950 3000 7800 3000 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4950 4200 7800 4200 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 1800 4800 3300 4800 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 6000 4800 7800 4800 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 7800 1200 7800 4800 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 7800 2700 8400 2700 +2 2 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 5 + 900 225 9450 225 9450 5175 900 5175 900 225 +4 0 -1 0 0 0 12 0.0000 4 135 315 1200 1275 who\001 +4 0 -1 0 0 0 12 0.0000 4 135 465 1200 2400 where\001 +4 0 -1 0 0 0 12 0.0000 4 180 870 6150 1200 groupName\001 +4 0 -1 0 0 0 12 0.0000 4 135 1020 3600 2400 contexrName\001 +4 0 -1 0 0 0 12 0.0000 4 135 315 1200 3600 who\001 +4 0 -1 0 0 0 12 0.0000 4 180 315 1275 4800 why\001 +4 0 -1 0 0 0 12 0.0000 4 135 810 8475 2700 viewName\001 +4 0 -1 0 0 0 12 0.0000 4 180 1095 3600 600 securityModel\001 +4 0 -1 0 0 0 12 0.0000 4 180 1065 3600 1800 securityName\001 +4 0 -1 0 0 0 12 0.0000 4 180 1095 3600 3000 securityModel\001 +4 0 -1 0 0 0 12 0.0000 4 180 1035 3600 4200 securityLevel\001 +4 0 -1 0 0 0 12 0.0000 4 180 2175 3600 4800 viewType (read/write/notify)\001 diff --git a/lib/snmp/doc/src/MIB_mechanism.gif b/lib/snmp/doc/src/MIB_mechanism.gif new file mode 100644 index 0000000000..2a25c6e44f Binary files /dev/null and b/lib/snmp/doc/src/MIB_mechanism.gif differ diff --git a/lib/snmp/doc/src/MIB_mechanism.ps b/lib/snmp/doc/src/MIB_mechanism.ps new file mode 100644 index 0000000000..e45e7d0bad --- /dev/null +++ b/lib/snmp/doc/src/MIB_mechanism.ps @@ -0,0 +1,217 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: bild1.fig +%%Creator: fig2dev Version 3.1 Patchlevel 2 +%%CreationDate: Tue Dec 28 16:12:39 1999 +%%For: nibe@gundor (Bengt Nilsson, ETX/DN/SP) +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 515 300 +%%Pages: 0 +%%BeginSetup +%%IncludeFeature: *PageSize Letter +%%EndSetup +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +-53.0 312.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n 0 792 m 0 0 l 612 0 l 612 792 l cp clip + 0.06000 0.06000 sc +7.500 slw +% Polyline +n 3000 600 m 3000 1800 l gs col-1 s gr +% Polyline +gs clippath +3153 570 m 3273 600 l 3153 630 l 3315 630 l 3315 570 l cp clip +n 3000 600 m 3300 600 l gs col-1 s gr gr + +% arrowhead +n 3153 570 m 3273 600 l 3153 630 l col-1 s +% Polyline +gs clippath +3153 1770 m 3273 1800 l 3153 1830 l 3315 1830 l 3315 1770 l cp clip +n 3000 1800 m 3300 1800 l gs col-1 s gr gr + +% arrowhead +n 3153 1770 m 3273 1800 l 3153 1830 l col-1 s +% Polyline +n 1725 1200 m 3000 1200 l gs col-1 s gr +% Polyline +n 3000 3000 m 3000 4200 l gs col-1 s gr +% Polyline +gs clippath +3153 2970 m 3273 3000 l 3153 3030 l 3315 3030 l 3315 2970 l cp clip +n 3000 3000 m 3300 3000 l gs col-1 s gr gr + +% arrowhead +n 3153 2970 m 3273 3000 l 3153 3030 l col-1 s +% Polyline +gs clippath +3153 4170 m 3273 4200 l 3153 4230 l 3315 4230 l 3315 4170 l cp clip +n 3000 4200 m 3300 4200 l gs col-1 s gr gr + +% arrowhead +n 3153 4170 m 3273 4200 l 3153 4230 l col-1 s +% Polyline +n 1725 3600 m 3000 3600 l gs col-1 s gr +% Polyline +n 5250 600 m 5250 1800 l gs col-1 s gr +% Polyline +n 4950 1800 m 5250 1800 l gs col-1 s gr +% Polyline +n 4950 600 m 5250 600 l gs col-1 s gr +% Polyline +gs clippath +5853 1170 m 5973 1200 l 5853 1230 l 6015 1230 l 6015 1170 l cp clip +n 5250 1200 m 6000 1200 l gs col-1 s gr gr + +% arrowhead +n 5853 1170 m 5973 1200 l 5853 1230 l col-1 s +% Polyline +gs clippath +3153 2370 m 3273 2400 l 3153 2430 l 3315 2430 l 3315 2370 l cp clip +n 1800 2400 m 3300 2400 l gs col-1 s gr gr + +% arrowhead +n 3153 2370 m 3273 2400 l 3153 2430 l col-1 s +% Polyline +n 4950 2400 m 7800 2400 l gs col-1 s gr +% Polyline +n 7200 1200 m 7800 1200 l gs col-1 s gr +% Polyline +n 4950 3000 m 7800 3000 l gs col-1 s gr +% Polyline +n 4950 4200 m 7800 4200 l gs col-1 s gr +% Polyline +gs clippath +3153 4770 m 3273 4800 l 3153 4830 l 3315 4830 l 3315 4770 l cp clip +n 1800 4800 m 3300 4800 l gs col-1 s gr gr + +% arrowhead +n 3153 4770 m 3273 4800 l 3153 4830 l col-1 s +% Polyline +n 6000 4800 m 7800 4800 l gs col-1 s gr +% Polyline +n 7800 1200 m 7800 4800 l gs col-1 s gr +% Polyline +gs clippath +8253 2670 m 8373 2700 l 8253 2730 l 8415 2730 l 8415 2670 l cp clip +n 7800 2700 m 8400 2700 l gs col-1 s gr gr + +% arrowhead +n 8253 2670 m 8373 2700 l 8253 2730 l col-1 s +% Polyline +n 900 225 m 9450 225 l 9450 5175 l 900 5175 l cp gs col-1 s gr +/Times-Roman ff 180.00 scf sf +1200 1275 m +gs 1 -1 sc (who) col-1 sh gr +/Times-Roman ff 180.00 scf sf +1200 2400 m +gs 1 -1 sc (where) col-1 sh gr +/Times-Roman ff 180.00 scf sf +6150 1200 m +gs 1 -1 sc (groupName) col-1 sh gr +/Times-Roman ff 180.00 scf sf +3600 2400 m +gs 1 -1 sc (contexrName) col-1 sh gr +/Times-Roman ff 180.00 scf sf +1200 3600 m +gs 1 -1 sc (who) col-1 sh gr +/Times-Roman ff 180.00 scf sf +1275 4800 m +gs 1 -1 sc (why) col-1 sh gr +/Times-Roman ff 180.00 scf sf +8475 2700 m +gs 1 -1 sc (viewName) col-1 sh gr +/Times-Roman ff 180.00 scf sf +3600 600 m +gs 1 -1 sc (securityModel) col-1 sh gr +/Times-Roman ff 180.00 scf sf +3600 1800 m +gs 1 -1 sc (securityName) col-1 sh gr +/Times-Roman ff 180.00 scf sf +3600 3000 m +gs 1 -1 sc (securityModel) col-1 sh gr +/Times-Roman ff 180.00 scf sf +3600 4200 m +gs 1 -1 sc (securityLevel) col-1 sh gr +/Times-Roman ff 180.00 scf sf +3600 4800 m +gs 1 -1 sc (viewType \(read/write/notify\)) col-1 sh gr +$F2psEnd +rs diff --git a/lib/snmp/doc/src/Makefile b/lib/snmp/doc/src/Makefile new file mode 100644 index 0000000000..e1e3c7f41a --- /dev/null +++ b/lib/snmp/doc/src/Makefile @@ -0,0 +1,349 @@ +#-*-makefile-*- ; force emacs to enter makefile-mode + +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% + +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../../vsn.mk +VSN = $(SNMP_VSN) +APPLICATION=snmp + +# ---------------------------------------------------- +# Include dependency +# ---------------------------------------------------- + +ifndef DOCSUPPORT +include make.dep +endif + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- + +MIBSDIR = ../../mibs +include files.mk + +# ---------------------------------------------------- + +HTML_APP_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) +XML_PART_FILE2 = $(XML_PART_FILES) notes_history.xml +HTML_PART_FILES = \ + ../html/notes_history.html \ + $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html) + +HTML_FILES = \ + $(HTML_APP_FILES) \ + $(HTML_PART_FILES) + +XML_ERRS = $(XML_FILES:%.xml=%.latex.xmls_errs) \ + $(XML_FILES:%.xml=%.html.xmls_errs) + +XML_OUTPUT = $(XML_FILES:%.xml=%.latex.xmls_output) \ + $(XML_FILES:%.xml=%.html.xmls_output) + +INFO_FILE = ../../info + +HTML_REF3_FILES = $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) +HTML_REF6_FILES = $(XML_REF6_FILES:%.xml=$(HTMLDIR)/%.html) +HTML_CHAP_FILES = $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) + +EXTRA_FILES = summary.html.src \ + $(DEFAULT_HTML_FILES) \ + $(HTML_REF3_FILES) \ + $(HTML_REF6_FILES) \ + $(HTML_CHAP_FILES) + + +MAN7DIR = $(DOCDIR)/man7 + +MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) +MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6) +MAN7_FILES = $(MIB_FILES:$(MIBSDIR)/%.mib=$(MAN7DIR)/%.7) + +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else + +TEX_FILES_BOOK = \ + $(BOOK_FILES:%.xml=%.tex) +TEX_FILES_REF_MAN = \ + $(XML_REF3_FILES:%.xml=%.tex) \ + $(XML_REF6_FILES:%.xml=%.tex) \ + $(XML_APPLICATION_FILES:%.xml=%.tex) +TEX_PART_FILES = $(XML_PART_FILES:%.xml=%.tex) +TEX_FILES_USERS_GUIDE = \ + $(XML_CHAPTER_FILES:%.xml=%.tex) + +TOP_PDF_FILE = snmp-$(VSN).pdf +TOP_PS_FILE = snmp-$(VSN).ps + +$(TOP_PDF_FILE): book.dvi ../../vsn.mk + @echo "building $(TOP_PDF_FILE)" + $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ + +$(TOP_PS_FILE): book.dvi ../../vsn.mk + @echo "building $(TOP_PS_FILE)" + $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ + +TOP_HTML_FILES = $(INDEX_TARGET) + +endif + +INDEX_FILE = index.html +INDEX_SRC = $(INDEX_FILE).src +INDEX_TARGET = $(DOCDIR)/$(INDEX_FILE) + +GIF_TARGETS = $(GIF_FILES:%=$(HTMLDIR)/%) + + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- +XML_FLAGS += +DVIPS_FLAGS += + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- +$(HTMLDIR)/%.gif: %.gif # Copy them to ../html + $(INSTALL_DATA) $< $@ + +ifdef DOCSUPPORT + +docs: pdf html man + +ldocs: local_docs $(INDEX_TARGET) + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: clean_html clean_man clean_pdf + rm -f errs core *~ + +else + +ifeq ($(DOCTYPE),pdf) +docs: pdf +else +ifeq ($(DOCTYPE),ps) +docs: ps +else +docs: html gifs man +endif +endif + +pdf: $(TOP_PDF_FILE) + +ps: $(TOP_PS_FILE) + +html: $(HTML_FILES) $(TOP_HTML_FILES) gifs + +html2: gifs $(TOP_HTML_FILES) $(HTML_FILES) $(HTML_REF3_FILES) $(HTML_REF6_FILES) $(HTML_CHAP_FILES) + +clean: clean_tex clean_html clean_man clean_docs + + +clean_tex: + @echo "cleaning tex:" + rm -f $(TEX_FILES_USERS_GUIDE) + rm -f $(TEX_FILES_REF_MAN) + rm -f $(TEX_PART_FILES) + rm -f $(TEX_FILES_BOOK) + +clean_docs: + @echo "cleaning docs:" + rm -f $(TOP_PDF_FILE) + rm -f $(TOP_PS_FILE) + rm -f core $(LATEX_CLEAN) + + +$(HTML_PART_FILES): notes.xml + +endif + +$(INDEX_TARGET): $(INDEX_SRC) ../../vsn.mk # Create top make file + sed -e 's;%VSN%;$(VSN);' $< > $@ # inserting version number + +man: man3 man6 man7 + +man3: $(MAN3_FILES) + +man6: $(MAN6_FILES) + +man7: $(MAN7_FILES) + +gifs: $(GIF_TARGETS) + +debug opt: + +clean_pdf: + @echo "cleaning pdf:" + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + +clean_man: + @echo "cleaning man:" + rm -f $(MAN3DIR)/* + rm -f $(MAN6DIR)/* + rm -f $(MAN7DIR)/* + +clean_html: + @echo "cleaning html:" + rm -rf $(HTMLDIR)/* + +$(MAN7DIR)/%.7: $(MIBSDIR)/%.mib + @echo "processing $*" + @echo ".TH $* 7 \"SNMP\" \"Erlang/OTP\" \"MIB\"" > $@ + @echo ".nf" >> $@ + @cat $< >> $@ + @echo ".fi" >> $@ + @echo "" >> $@ + + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 + $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man6 + $(INSTALL_DIR) $(RELEASE_PATH)/man/man7 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man7 + +else + + +ifeq ($(DOCTYPE),pdf) +release_docs_spec: pdf + $(INSTALL_DIR) $(RELEASE_PATH)/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf +else +ifeq ($(DOCTYPE),ps) +release_docs_spec: ps + $(INSTALL_DIR) $(RELEASE_PATH)/ps + $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps +else +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 + $(INSTALL_DIR) $(RELEASE_PATH)/man/man6 + $(INSTALL_DATA) $(MAN6_FILES) $(RELEASE_PATH)/man/man6 + $(INSTALL_DIR) $(RELEASE_PATH)/man/man7 + $(INSTALL_DATA) $(MAN7_FILES) $(RELEASE_PATH)/man/man7 + $(INSTALL_DATA) $(TOP_HTML_FILES) \ + $(RELSYSDIR)/doc +endif +endif + +endif + +release_spec: + +ifdef DOCSUPPORT +info: info_xml info_man info_html +else +info: info_xml info_man info_html info_tex + @echo "DVI2PS = $(DVI2PS)" + @echo "DVIPS_FLAGS = $(DVIPS_FLAGS)" + @echo "" + @echo "DISTILL = $(DISTILL)" + @echo "DISTILL_FLAGS = $(DISTILL_FLAGS)" +endif + +info_man: + @echo "man files:" + @echo "MAN3_FILES = $(MAN3_FILES)" + @echo "MAN6_FILES = $(MAN6_FILES)" + @echo "MAN7_FILES = $(MAN7_FILES)" + @echo "" + @echo "MIB_FILES = $(MIB_FILES)" + +info_xml: + @echo "xml files:" + @echo "XML_REF3_FILES = $(XML_REF3_FILES)" + @echo "XML_REF6_FILES = $(XML_REF6_FILES)" + @echo "XML_PART_FILES = $(XML_PART_FILES)" + @echo "XML_CHAPTER_FILES = $(XML_CHAPTER_FILES)" + @echo "XML_APPLICATION_FILES = $(XML_APPLICATION_FILES)" + @echo "" + @echo "BOOK_FILES = $(BOOK_FILES)" + @echo "" + @echo "XML_FILES = $(XML_FILES)" + @echo "XML_ERRS = $(XML_ERRS)" + @echo "XML_OUTPUT = $(XML_OUTPUT)" + +info_html: + @echo "html files:" + @echo "DOCDIR = $(DOCDIR)" + @echo "INDEX_FILE = $(INDEX_FILE)" + @echo "INDEX_SRC = $(INDEX_SRC)" + @echo "INDEX_TARGET = $(INDEX_TARGET)" + @echo "" + @echo "HTMLDIR = $(HTMLDIR)" + @echo "HTML_APP_FILES = $(HTML_APP_FILES)" + @echo "HTML_PART_FILES = $(HTML_PART_FILES)" + @echo "HTML_FILES = $(HTML_FILES)" + @echo "" + @echo "EXTRA_FILES = $(EXTRA_FILES)" + @echo "" + @echo "DEFAULT_HTML_FILES = $(DEFAULT_HTML_FILES)" + @echo "" + @echo "HTML_REF3_FILES = $(HTML_REF3_FILES)" + @echo "HTML_REF6_FILES = $(HTML_REF6_FILES)" + @echo "HTML_CHAP_FILES = $(HTML_CHAP_FILES)" + +info_tex: + @echo "tex files:" + @echo "TEX_FILES_USERS_GUIDE = $(TEX_FILES_USERS_GUIDE)" + @echo "TEX_FILES_REF_MAN = $(TEX_FILES_REF_MAN)" + @echo "TEX_PART_FILES = $(TEX_PART_FILES)" + @echo "TEX_FILES_BOOK = $(TEX_FILES_BOOK)" + +ifndef DOCSUPPORT +include depend.mk +endif diff --git a/lib/snmp/doc/src/book.gif b/lib/snmp/doc/src/book.gif new file mode 100644 index 0000000000..94b3868792 Binary files /dev/null and b/lib/snmp/doc/src/book.gif differ diff --git a/lib/snmp/doc/src/book.xml b/lib/snmp/doc/src/book.xml new file mode 100644 index 0000000000..2897d25d55 --- /dev/null +++ b/lib/snmp/doc/src/book.xml @@ -0,0 +1,49 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Simple Network Management Protocol (SNMP) + + + + + book.xml +
+ + + Simple Network Management Protocol (SNMP) + + + + + + + + + + + + + + +
+ diff --git a/lib/snmp/doc/src/depend.mk b/lib/snmp/doc/src/depend.mk new file mode 100644 index 0000000000..bf9833274d --- /dev/null +++ b/lib/snmp/doc/src/depend.mk @@ -0,0 +1,82 @@ +#-*-makefile-*- ; force emacs to enter makefile-mode + +# %CopyrightBegin% +# +# Copyright Ericsson AB 2004-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% + +$(HTMLDIR)/part_notes.html: \ + part_notes_history.xml \ + part_notes.xml \ + notes_history.xml \ + notes.xml + +$(HTMLDIR)/part.html: \ + part.xml \ + snmp_intro.xml \ + snmp_agent_funct_descr.xml \ + snmp_manager_funct_descr.xml \ + snmp_mib_compiler.xml \ + snmp_config.xml \ + snmp_agent_config_files.xml \ + snmp_manager_config_files.xml \ + snmp_impl_example_agent.xml \ + snmp_impl_example_manager.xml \ + snmp_instr_functions.xml \ + snmp_def_instr_functions.xml \ + snmp_agent_netif.xml \ + snmp_manager_netif.xml \ + snmp_audit_trail_log.xml \ + snmp_advanced_agent.xml \ + snmp_app_a.xml \ + snmp_app_b.xml + +$(HTMLDIR)/ref_man.html: \ + ref_man.xml \ + snmp_app.xml \ + snmp.xml \ + snmpc.xml \ + snmpa.xml \ + snmpa_conf.xml \ + snmpa_discovery_handler.xml \ + snmpa_error_report.xml \ + snmpa_error.xml \ + snmpa_error_io.xml \ + snmpa_error_logger.xml \ + snmpa_local_db.xml \ + snmpa_mpd.xml \ + snmpa_network_interface.xml \ + snmpa_network_interface_filter.xml \ + snmpa_notification_delivery_info_receiver.xml \ + snmpa_notification_filter.xml \ + snmpa_supervisor.xml \ + snmp_community_mib.xml \ + snmp_framework_mib.xml \ + snmp_generic.xml \ + snmp_index.xml \ + snmp_notification_mib.xml \ + snmp_pdus.xml \ + snmp_standard_mib.xml \ + snmp_target_mib.xml \ + snmp_user_based_sm_mib.xml \ + snmp_view_based_acm_mib.xml \ + snmpm.xml \ + snmpm_conf.xml \ + snmpm_mpd.xml \ + snmpm_network_interface.xml \ + snmpm_network_interface_filter.xml \ + snmpm_user.xml + + diff --git a/lib/snmp/doc/src/fascicules.xml b/lib/snmp/doc/src/fascicules.xml new file mode 100644 index 0000000000..0678195e07 --- /dev/null +++ b/lib/snmp/doc/src/fascicules.xml @@ -0,0 +1,18 @@ + + + + + + User's Guide + + + Reference Manual + + + Release Notes + + + Off-Print + + + diff --git a/lib/snmp/doc/src/files.mk b/lib/snmp/doc/src/files.mk new file mode 100644 index 0000000000..293fb52ce0 --- /dev/null +++ b/lib/snmp/doc/src/files.mk @@ -0,0 +1,153 @@ +#-*-makefile-*- ; force emacs to enter makefile-mode + +# %CopyrightBegin% +# +# Copyright Ericsson AB 2001-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% + +XML_APPLICATION_FILES = \ + ref_man.xml + +XML_APP_REF3_FILES = \ + snmp.xml + +XML_COMP_REF3_FILES = \ + snmpc.xml + +XML_MISC_REF3_FILES = \ + snmp_pdus.xml + +XML_AGENT_REF3_FILES = \ + snmpa.xml \ + snmpa_conf.xml \ + snmpa_discovery_handler.xml \ + snmpa_error_report.xml \ + snmpa_error.xml \ + snmpa_error_io.xml \ + snmpa_error_logger.xml \ + snmpa_local_db.xml \ + snmpa_mpd.xml \ + snmpa_network_interface.xml \ + snmpa_network_interface_filter.xml \ + snmpa_notification_delivery_info_receiver.xml \ + snmpa_notification_filter.xml \ + snmpa_supervisor.xml \ + snmp_community_mib.xml \ + snmp_framework_mib.xml \ + snmp_generic.xml \ + snmp_index.xml \ + snmp_notification_mib.xml \ + snmp_standard_mib.xml \ + snmp_target_mib.xml \ + snmp_user_based_sm_mib.xml \ + snmp_view_based_acm_mib.xml + +XML_MANAGER_REF3_FILES = \ + snmpm.xml \ + snmpm_conf.xml \ + snmpm_mpd.xml \ + snmpm_network_interface.xml \ + snmpm_network_interface_filter.xml \ + snmpm_user.xml + +XML_REF3_FILES = \ + $(XML_APP_REF3_FILES) \ + $(XML_COMP_REF3_FILES) \ + $(XML_MISC_REF3_FILES) \ + $(XML_AGENT_REF3_FILES) \ + $(XML_MANAGER_REF3_FILES) + +XML_REF6_FILES = snmp_app.xml + +XML_PART_FILES = \ + part.xml \ + part_notes.xml \ + part_notes_history.xml + +XML_CHAPTER_FILES = \ + snmp_intro.xml \ + snmp_agent_funct_descr.xml \ + snmp_manager_funct_descr.xml \ + snmp_mib_compiler.xml \ + snmp_config.xml \ + snmp_agent_config_files.xml \ + snmp_manager_config_files.xml \ + snmp_impl_example_agent.xml \ + snmp_impl_example_manager.xml \ + snmp_instr_functions.xml \ + snmp_def_instr_functions.xml \ + snmp_agent_netif.xml \ + snmp_manager_netif.xml \ + snmp_audit_trail_log.xml \ + snmp_advanced_agent.xml \ + snmp_app_a.xml \ + snmp_app_b.xml \ + notes.xml + +BOOK_FILES = book.xml + +XML_FILES = $(BOOK_FILES) \ + $(XML_CHAPTER_FILES) \ + $(XML_PART_FILES) \ + $(XML_REF6_FILES) \ + $(XML_REF3_FILES) \ + $(XML_APPLICATION_FILES) + +GIF_FILES = book.gif \ + getnext1.gif \ + getnext2.gif \ + getnext3.gif \ + getnext4.gif \ + snmp_agent_netif_1.gif \ + snmp_manager_netif_1.gif \ + min_head.gif \ + note.gif \ + notes.gif \ + ref_man.gif \ + snmp-um-1-image-1.gif \ + snmp-um-1-image-2.gif \ + snmp-um-1-image-3.gif \ + snmp.gif \ + user_guide.gif \ + warning.gif \ + MIB_mechanism.gif + +PS_FILES = getnext1.ps \ + getnext2.ps \ + getnext3.ps \ + getnext4.ps \ + snmp_agent_netif.ps \ + snmp-um-1-image-1.ps \ + snmp-um-1-image-2.ps \ + snmp-um-1-image-3.ps \ + snmp-um-1-image-8.ps \ + MIB_mechanism.ps + + +MIB_FILES = \ + $(MIBSDIR)/RFC1213-MIB.mib \ + $(MIBSDIR)/STANDARD-MIB.mib \ + $(MIBSDIR)/SNMPv2-TM.mib \ + $(MIBSDIR)/SNMPv2-MIB.mib \ + $(MIBSDIR)/SNMP-FRAMEWORK-MIB.mib \ + $(MIBSDIR)/SNMP-MPD-MIB.mib \ + $(MIBSDIR)/SNMP-TARGET-MIB.mib \ + $(MIBSDIR)/SNMP-NOTIFICATION-MIB.mib \ + $(MIBSDIR)/SNMP-COMMUNITY-MIB.mib \ + $(MIBSDIR)/SNMP-USER-BASED-SM-MIB.mib \ + $(MIBSDIR)/SNMP-VIEW-BASED-ACM-MIB.mib \ + $(MIBSDIR)/SNMP-USM-AES-MIB.mib \ + $(MIBSDIR)/INET-ADDRESS-MIB.mib \ + $(MIBSDIR)/OTP-SNMPEA-MIB.mib diff --git a/lib/snmp/doc/src/getnext1.gif b/lib/snmp/doc/src/getnext1.gif new file mode 100644 index 0000000000..21725f4388 Binary files /dev/null and b/lib/snmp/doc/src/getnext1.gif differ diff --git a/lib/snmp/doc/src/getnext1.ps b/lib/snmp/doc/src/getnext1.ps new file mode 100644 index 0000000000..ba6bf18fec --- /dev/null +++ b/lib/snmp/doc/src/getnext1.ps @@ -0,0 +1,2923 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(r) 6.0 +%%For: (Anna Fedoriw) (Ericsson Telecom) +%%Title: (Contents.eps) +%%CreationDate: (97-05-23) (14.03) +%%BoundingBox: 112 623 440 757 +%%HiResBoundingBox: 112.5 623.5 439.5 756.8677 +%%DocumentProcessColors: Black +%%DocumentFonts: Univers +%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 +%%+ procset Adobe_typography_AI5 1.0 0 +%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 +%%+ procset Adobe_Illustrator_AI5 1.0 0 +%AI5_FileFormat 2.0 +%AI3_ColorUsage: Black&White +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 21 -12 588 802 +%AI3_DocumentPreview: Macintosh_ColorPic +%AI5_ArtSize: 595.2756 841.8898 +%AI5_RulerUnits: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI5_OpenToView: 54 804 2 1146 827 58 1 1 3 40 +%AI5_OpenViewLayers: 7 +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 23 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + 5 packedarray + } bind def + /setcustomcolor + { + exch aload pop pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + def + } if + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + level2? + { + gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore + add add add 4 eq + } + { + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + } ifelse + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset Adobe_typography_AI5 1.0 1 +%%Title: (Typography Operators) +%%Version: 1.0 +%%CreationDate:(03/26/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_typography_AI5 54 dict dup begin +put +/initialize +{ + begin + begin + Adobe_typography_AI5 begin + Adobe_typography_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + end + end + end + Adobe_typography_AI5 begin +} def +/terminate +{ + currentdict Adobe_typography_AI5 eq + { + end + } if +} def +/modifyEncoding +{ + /_tempEncode exch ddef + /_pntr 0 ddef + { + counttomark -1 roll + dup type dup /marktype eq + { + pop pop exit + } + { + /nametype eq + { + _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll + put + } + { + /_pntr exch ddef + } ifelse + } ifelse + } loop + _tempEncode +} def +/TE +{ + StandardEncoding 256 array copy modifyEncoding + /_nativeEncoding exch def +} def +% +/TZ +{ + dup type /arraytype eq + { + /_wv exch def + } + { + /_wv 0 def + } ifelse + /_useNativeEncoding exch def + pop pop + findfont _wv type /arraytype eq + { + _wv makeblendedfont + } if + dup length 2 add dict + begin + mark exch + { + 1 index /FID ne + { + def + } if + cleartomark mark + } forall + pop + /FontName exch def + counttomark 0 eq + { + 1 _useNativeEncoding eq + { + /Encoding _nativeEncoding def + } if + cleartomark + } + { + /Encoding load 256 array copy + modifyEncoding /Encoding exch def + } ifelse + FontName currentdict + end + definefont pop +} def +/tr +{ + _ax _ay 3 2 roll +} def +/trj +{ + _cx _cy _sp _ax _ay 6 5 roll +} def +/a0 +{ + /Tx + { + dup + currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + } ddef + /Tj + { + dup + currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + } ddef +} def +/a1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/e0 +{ + /Tx + { + tr _psf + } ddef + /Tj + { + trj _pjsf + } ddef +} def +/e1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + tr _psf + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + trj _pjsf + grestore 3 1 roll moveto tr jsp + } ddef +} def +/i0 +{ + /Tx + { + tr sp + } ddef + /Tj + { + trj jsp + } ddef +} def +/i1 +{ + W N +} def +/o0 +{ + /Tx + { + tr sw rmoveto + } ddef + /Tj + { + trj swj rmoveto + } ddef +} def +/r0 +{ + /Tx + { + tr _ctm _pss + } ddef + /Tj + { + trj _ctm _pjss + } ddef +} def +/r1 +{ + /Tx + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/To +{ + pop _ctm currentmatrix pop +} def +/TO +{ + iTe _ctm setmatrix newpath +} def +/Tp +{ + pop _tm astore pop _ctm setmatrix + _tDict begin + /W + { + } def + /h + { + } def +} def +/TP +{ + end + iTm 0 0 moveto +} def +/Tr +{ + _render 3 le + { + currentpoint newpath moveto + } if + dup 8 eq + { + pop 0 + } + { + dup 9 eq + { + pop 1 + } if + } ifelse + dup /_render exch ddef + _renderStart exch get load exec +} def +/iTm +{ + _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale +} def +/Tm +{ + _tm astore pop iTm 0 0 moveto +} def +/Td +{ + _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto +} def +/iTe +{ + _render -1 eq + { + } + { + _renderEnd _render get dup null ne + { + load exec + } + { + pop + } ifelse + } ifelse + /_render -1 ddef +} def +/Ta +{ + pop +} def +/Tf +{ + dup 1000 div /_fScl exch ddef +% + selectfont +} def +/Tl +{ + pop + 0 exch _leading astore pop +} def +/Tt +{ + pop +} def +/TW +{ + 3 npop +} def +/Tw +{ + /_cx exch ddef +} def +/TC +{ + 3 npop +} def +/Tc +{ + /_ax exch ddef +} def +/Ts +{ + /_rise exch ddef + currentpoint + iTm + moveto +} def +/Ti +{ + 3 npop +} def +/Tz +{ + 100 div /_hs exch ddef + iTm +} def +/TA +{ + pop +} def +/Tq +{ + pop +} def +/Th +{ + pop pop pop pop pop +} def +/TX +{ + pop +} def +/Tk +{ + exch pop _fScl mul neg 0 rmoveto +} def +/TK +{ + 2 npop +} def +/T* +{ + _leading aload pop neg Td +} def +/T*- +{ + _leading aload pop Td +} def +/T- +{ + _ax neg 0 rmoveto + _hyphen Tx +} def +/T+ +{ +} def +/TR +{ + _ctm currentmatrix pop + _tm astore pop + iTm 0 0 moveto +} def +/TS +{ + currentfont 3 1 roll + /_Symbol_ _fScl 1000 mul selectfont + + 0 eq + { + Tx + } + { + Tj + } ifelse + setfont +} def +/Xb +{ + pop pop +} def +/Tb /Xb load def +/Xe +{ + pop pop pop pop +} def +/Te /Xe load def +/XB +{ +} def +/TB /XB load def +currentdict readonly pop +end +setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 17 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin + + /initialize + { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 + { + dup type /arraytype eq + { + dup xcheck + { + bind + } if + } if + pop pop + } forall + } def + /terminate { end } def + + currentdict /Adobe_ColorImage_AI6_Vars known not + { + /Adobe_ColorImage_AI6_Vars 14 dict def + } if + + Adobe_ColorImage_AI6_Vars begin + /channelcount 0 def + /sourcecount 0 def + /sourcearray 4 array def + /plateindex -1 def + /XIMask 0 def + /XIBinary 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIBuffer null def + /XIDataProc null def + end + + /WalkRGBString null def + /WalkCMYKString null def + + /StuffRGBIntoGrayString null def + /RGBToGrayImageProc null def + /StuffCMYKIntoGrayString null def + /CMYKToGrayImageProc null def + /ColorImageCompositeEmulator null def + + /SeparateCMYKImageProc null def + + /FourEqual null def + /TestPlateIndex null def + + currentdict /_colorimage known not + { + /colorimage where + { + /colorimage get /_colorimage exch def + } + { + /_colorimage null def + } ifelse + } if + + /_currenttransfer systemdict /currenttransfer get def + + /colorimage null def + /XI null def + + + /WalkRGBString + { + 0 3 index + + dup length 1 sub 0 3 3 -1 roll + { + 3 getinterval { } forall + + 5 index exec + + 3 index + } for + + 5 { pop } repeat + + } def + + + /WalkCMYKString + { + 0 3 index + + dup length 1 sub 0 4 3 -1 roll + { + 4 getinterval { } forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + + } def + + + /StuffRGBIntoGrayString + { + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add + } def + + + /RGBToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 3 idiv string + dup 3 1 roll + + /StuffRGBIntoGrayString load exch + WalkRGBString + end + } def + + + /StuffCMYKIntoGrayString + { + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add + } def + + + /CMYKToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 4 idiv string + dup 3 1 roll + + /StuffCMYKIntoGrayString load exch + WalkCMYKString + end + } def + + + /ColorImageCompositeEmulator + { + pop true eq + { + Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat + } + { + Adobe_ColorImage_AI6_Vars /channelcount get 1 ne + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 3 -1 roll put + + channelcount 3 eq + { + /RGBToGrayImageProc + } + { + /CMYKToGrayImageProc + } ifelse + load + end + } if + image + } ifelse + } def + + + /SeparateCMYKImageProc + { + Adobe_ColorImage_AI6_Vars begin + + sourcecount 0 ne + { + sourcearray plateindex get exec + } + { + sourcearray 0 get exec + + dup length 4 idiv string + + 0 2 index + + plateindex 4 2 index length 1 sub + { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + + pop pop exch pop + } ifelse + end + } def + + + /FourEqual + { + 4 index ne + { + pop pop pop false + } + { + 4 index ne + { + pop pop false + } + { + 4 index ne + { + pop false + } + { + 4 index eq + } ifelse + } ifelse + } ifelse + } def + + + /TestPlateIndex + { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + + /setcmykcolor where + { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + + 1 0 0 0 FourEqual + { + /plateindex 0 def + } + { + 0 1 0 0 FourEqual + { + /plateindex 1 def + } + { + 0 0 1 0 FourEqual + { + /plateindex 2 def + } + { + 0 0 0 1 FourEqual + { + /plateindex 3 def + } + { + 0 0 0 0 FourEqual + { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end + } def + + + /colorimage + { + Adobe_ColorImage_AI6_Vars begin + /channelcount 1 index def + /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def + + 4 sourcecount add index dup + 8 eq exch 1 eq or not + end + + { + /_colorimage load null ne + { + _colorimage + } + { + Adobe_ColorImage_AI6_Vars /sourcecount get + 7 add { pop } repeat + } ifelse + } + { + dup 3 eq + TestPlateIndex + dup -1 eq exch 5 eq or or + { + /_colorimage load null eq + { + ColorImageCompositeEmulator + } + { + dup 1 eq + { + pop pop image + } + { + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + gsave + + 0 _currenttransfer exec + 1 _currenttransfer exec + eq + { 0 _currenttransfer exec 0.5 lt } + { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse + + { { pop 0 } } { { pop 1 } } ifelse + systemdict /settransfer get exec + } if + + _colorimage + + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + grestore + } if + } ifelse + } ifelse + } + { + dup 1 eq + { + pop pop + image + } + { + pop pop + + Adobe_ColorImage_AI6_Vars begin + sourcecount -1 0 + { + exch sourcearray 3 1 roll put + } for + + /SeparateCMYKImageProc load + end + + systemdict /image get exec + } ifelse + } ifelse + } ifelse + } def + + /XI + { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIMask exch 0 ne def + /XIBinary exch 0 ne def + pop + pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + + XIBitsPerPixel 1 eq + { + XIImageWidth 8 div ceiling cvi + } + { + XIImageWidth XIChannelCount mul + } ifelse + /XIBuffer exch string def + + XIBinary + { + /XIDataProc { currentfile XIBuffer readstring pop } def + currentfile 128 string readline pop pop + } + { + /XIDataProc { currentfile XIBuffer readhexstring pop } def + } ifelse + + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + XIMask + { + XIImageWidth XIImageHeight + false + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + /_lp /null ddef + _fc + /_lp /imagemask ddef + + imagemask + } + { + XIImageWidth XIImageHeight + XIBitsPerPixel + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + XIChannelCount 1 eq + { + + gsave + 0 setgray + + image + + grestore + } + { + false + XIChannelCount + colorimage + } ifelse + } ifelse + grestore + end + } def + +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin +put +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 91 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add +} def +/swj +{ + dup 4 1 roll + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add + 6 2 roll /_cnt 0 ddef + { + 1 index eq + { + /_cnt _cnt 1 add ddef + } if + } forall + pop + exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow + 3 npop +} def +/jss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + } ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow + 6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow + 2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + } ifelse + 2 copy rmoveto + } exch cshow + 5 npop +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer readline not + { + stop + } if + endString eq + { + cleartomark stop + } if + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer readline not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 4 npop + 6 1 roll + pop + 4 1 roll + pop pop pop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 3 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +end +setpacking +%%EndResource +%%EndProlog +%%BeginSetup +%%IncludeFont: Univers +Adobe_level2_AI5 /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +[ +39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +TE +%AI3_BeginEncoding: _Univers Univers +[/_Univers/Univers 0 0 1 TZ +%AI3_EndEncoding AdobeType +%AI5_Begin_NonPrinting +Np +8 Bn +%AI5_BeginGradient: (Black & White) +(Black & White) 0 2 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Green & Blue) +(Green & Blue) 0 2 Bd +[ +< +99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 +A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 +B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 +C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 +D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 +E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 +F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF +> +< +000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D +1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B +3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 +5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 +78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 +96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 +B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +[ +1 0.75 0 0 1 50 100 %_Bs +0.6 0 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Pink, Yellow, Green) +(Pink, Yellow, Green) 0 3 Bd +[ +< +00000000000000000000000000000000000000010101010101010101010101010101010101010101 +01010101010202020202020202020202020202020202020202020203030303030303030303030303 +03030303030303030404040404040404040404040404040404040404050505050505050505050505 +05050505050505060606060606060606060606060606060606060707070707070707070707070707 +07070707080808080808080808080808080808080809090909090909090909090909090909090A0A +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C +0C0C0C0C0C0C0C0D0D0D0D0D +> +< +050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 +17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F +2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A +4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 +69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 +88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 +A9AAABACADADAEAFB0B1B2B2 +> +< +CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 +B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B +9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B +7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 +5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 +3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C +0B0A09080706050403020100 +> +0 +1 %_Br +< +737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E +4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D +2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 +1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 +020201010101010000000000 +> +< +00000000000000000000000001010101010101010101010101010101010101010101010102020202 +02020202020202020202020202020202020202020202030303030303030303030303030303030303 +03030303030303030303030303040404040404040404040404040404040404040404040404040404 +04040404040404040404050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505 +> +< +BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 +C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 +C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA +CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC +CCCCCCCCCCCCCCCCCCCCCCCC +> +0 +1 %_Br +[ +0.05 0.7 0 0 1 50 100 %_Bs +0 0.02 0.8 0 1 57 36 %_Bs +0.45 0 0.75 0 1 37 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Purple, Red & Yellow) +(Purple, Red & Yellow) 0 3 Bd +[ +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A +> +< +CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 +D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC +DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 +E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED +EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 +F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE +FEFEFEFFFFFF +> +0 +1 %_Br +< +E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE +BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 +9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E +6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 +4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E +1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 +> +< +E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA +EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE +EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 +F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 +F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC +FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF +> +< +00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 +242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 +4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A +6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E +8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 +B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC +> +0 +1 %_Br +[ +0 0.04 1 0 1 50 100 %_Bs +0 1 0.8 0 1 50 50 %_Bs +0.9 0.9 0 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Rainbow) +(Rainbow) 0 6 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +0 +1 %_Br +1 +< +0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 +A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE +CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 +F7F8F9FAFBFCFDFEFF +> +0 +0 +1 %_Br +1 +< +00000000000000000000000000000000000001010101010101010101010101010101010101010101 +01010101010101010101010101010202020202020202020202020202020202020202020202020202 +02020202020202020202030303030303030303030303030303030303030303030303030303030303 +03030303030304040404040404040404040404040404040404040404040404040404040404040404 +04040505050505050505050505050505050505050505050505050505050505050505050505050606 +06060606060606060606060606060606060606060606060606060606060606060606070707070707 +07070707070707070707070707070707 +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 +1 +0 +1 %_Br +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +1 %_Br +[ +0 1 0 0 1 50 100 %_Bs +1 1 0 0 1 50 80 %_Bs +1 0.0279 0 0 1 50 60 %_Bs +1 0 1 0 1 50 40 %_Bs +0 0 1 0 1 50 20 %_Bs +0 1 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Steel Bar) +(Steel Bar) 0 3 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 70 %_Bs +0 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Orange Radial) +(Yellow & Orange Radial) 1 2 Bd +[ +0 +< +0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 +232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 +494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F +707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C +> +< +FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 +F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 +F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB +EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 +> +0 +1 %_Br +[ +0 0 1 0 1 52 19 %_Bs +0 0.55 0.9 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Purple Radial) +(Yellow & Purple Radial) 1 2 Bd +[ +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +< +1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 +393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D +5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 +83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 +A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB +CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 +F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF +> +< +ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 +908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 +7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B +5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 +403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 +25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B +0A090908070706050504030302010100 +> +0 +1 %_Br +[ +0 0.08 0.67 0 1 50 14 %_Bs +1 1 0 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_End_NonPrinting-- +%AI5_BeginPalette +0 0 Pb +Pn +Pc +1 g +Pc +0 g +Pc +0 0 0 0 k +Pc +0.75 g +Pc +0.5 g +Pc +0.25 g +Pc +0 g +Pc +Bb +2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0 0 0 k +Pc +0.5 0 0 0 k +Pc +0.75 0 0 0 k +Pc +1 0 0 0 k +Pc +0.25 0.25 0 0 k +Pc +0.5 0.5 0 0 k +Pc +0.75 0.75 0 0 k +Pc +1 1 0 0 k +Pc +Bb +2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0 0 k +Pc +0 0.5 0 0 k +Pc +0 0.75 0 0 k +Pc +0 1 0 0 k +Pc +0 0.25 0.25 0 k +Pc +0 0.5 0.5 0 k +Pc +0 0.75 0.75 0 k +Pc +0 1 1 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0 0.25 0 k +Pc +0 0 0.5 0 k +Pc +0 0 0.75 0 k +Pc +0 0 1 0 k +Pc +0.25 0 0.25 0 k +Pc +0.5 0 0.5 0 k +Pc +0.75 0 0.75 0 k +Pc +1 0 1 0 k +Pc +Bb +2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0 0 k +Pc +0.5 0.25 0 0 k +Pc +0.75 0.375 0 0 k +Pc +1 0.5 0 0 k +Pc +0.125 0.25 0 0 k +Pc +0.25 0.5 0 0 k +Pc +0.375 0.75 0 0 k +Pc +0.5 1 0 0 k +Pc +Bb +2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0.125 0 k +Pc +0 0.5 0.25 0 k +Pc +0 0.75 0.375 0 k +Pc +0 1 0.5 0 k +Pc +0 0.125 0.25 0 k +Pc +0 0.25 0.5 0 k +Pc +0 0.375 0.75 0 k +Pc +0 0.5 1 0 k +Pc +Bb +2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0 0.25 0 k +Pc +0.25 0 0.5 0 k +Pc +0.375 0 0.75 0 k +Pc +0.5 0 1 0 k +Pc +0.25 0 0.125 0 k +Pc +0.5 0 0.25 0 k +Pc +0.75 0 0.375 0 k +Pc +1 0 0.5 0 k +Pc +Bb +2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0.125 0 k +Pc +0.5 0.25 0.25 0 k +Pc +0.75 0.375 0.375 0 k +Pc +1 0.5 0.5 0 k +Pc +0.25 0.25 0.125 0 k +Pc +0.5 0.5 0.25 0 k +Pc +0.75 0.75 0.375 0 k +Pc +1 1 0.5 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0.25 0.125 0 k +Pc +0.25 0.5 0.25 0 k +Pc +0.375 0.75 0.375 0 k +Pc +0.5 1 0.5 0 k +Pc +0.125 0.25 0.25 0 k +Pc +0.25 0.5 0.5 0 k +Pc +0.375 0.75 0.75 0 k +Pc +0.5 1 1 0 k +Pc +0 0 0 0 k +Pc +0.125 0.125 0.25 0 k +Pc +0.25 0.25 0.5 0 k +Pc +0.375 0.375 0.75 0 k +Pc +0.5 0.5 1 0 k +Pc +0.25 0.125 0.25 0 k +Pc +0.5 0.25 0.5 0 k +Pc +0.75 0.375 0.75 0 k +Pc +1 0.5 1 0 k +Pc +PB +%AI5_EndPalette +%%EndSetup +%AI5_BeginLayer +1 1 1 1 0 0 0 79 128 255 Lb +(Layer 1) Ln +0 A +800 Ar +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +0 XR +-4014 283.5 m +4626 283.5 L +(N) * +453.5 4716 m +453.5 -3924 L +(N) * +85 4716 m +85 -3924 L +(N) * +-4014 765.5 m +4626 765.5 L +(N) * +0 R +0 G +113 683.5 m +439 683.5 l +S +113 663.5 m +439 663.5 l +S +113 643.5 m +439 643.5 l +S +113 686 m +439 686 l +S +1 Ap +439 624 m +439 709 L +113 709 L +113 624 L +439 624 L +s +0 Ap +178.5 709 m +178.5 624 l +S +243 709 m +243 624 l +S +374 709 m +374 624 l +S +308.5 709 m +308.5 624 l +S +0 To +1 0 0 1 146 692 0 Tp +TP +-12.2278 0 Td +0 Tr +0 O +0 g +/_Univers 10 Tf +0 Ts +100 Tz +0 Tt +1 TA +%_ 0 XL +36 0 Xb +XB +0 0 5 TC +100 100 200 TW +0 0 0 Ti +1 Ta +0 0 2 2 3 Th +0 Tq +0 0 Tl +0 Tc +0 Tw +(key 1) Tx +(\r) TX +TO +0 To +1 0 0 1 213 692 0 Tp +TP +-12.2278 0 Td +0 Tr +(key 2) Tx +(\r) TX +TO +0 To +1 0 0 1 276 692 0 Tp +TP +-11.1121 0 Td +0 Tr +(col 3) Tx +(\r) TX +TO +0 To +1 0 0 1 225.5 747.5 0 Tp +TP +0 Tr +(\r) Tx +TO +0 To +1 0 0 1 336.5 693.5 0 Tp +TP +0 Tr +(\r) Tx +TO +0 To +1 0 0 1 341 692 0 Tp +TP +-11.1121 0 Td +0 Tr +(col 4) Tx +(\r) TX +TO +0 To +1 0 0 1 407.5 692 0 Tp +TP +-11.1121 0 Td +0 Tr +(col 5) Tx +(\r) TX +TO +0 To +1 0 0 1 185.5 736 0 Tp +TP +0 Tr +(\r) Tx +TO +0 To +1 0 0 1 145 669.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 144.5 650.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 145 630 0 Tp +TP +-2.7795 0 Td +0 Tr +(2) Tx +(\r) TX +TO +0 To +1 0 0 1 209.5 669 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 209.5 649.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(2) Tx +(\r) TX +TO +0 To +1 0 0 1 209.5 629.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 274.5 669 0 Tp +TP +-2.7795 0 Td +0 Tr +(a) Tx +(\r) TX +TO +0 To +1 0 0 1 274.5 649.5 0 Tp +TP +-3.0542 0 Td +0 Tr +(d) Tx +(\r) TX +TO +0 To +1 0 0 1 274.5 629.5 0 Tp +TP +-3.0542 0 Td +0 Tr +(g) Tx +(\r) TX +TO +0 To +1 0 0 1 340 669 0 Tp +TP +-3.0542 0 Td +0 Tr +(b) Tx +(\r) TX +TO +0 To +1 0 0 1 340 649.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(e) Tx +(\r) TX +TO +0 To +1 0 0 1 340 629.5 0 Tp +TP +-8.8879 0 Td +0 Tr +(N/A) Tx +(\r) TX +TO +0 To +1 0 0 1 405 669 0 Tp +TP +-2.5 0 Td +0 Tr +(c) Tx +(\r) TX +TO +0 To +1 0 0 1 405 649.5 0 Tp +TP +-1.6638 0 Td +0 Tr +(f) Tx +(\r) TX +TO +0 To +1 0 0 1 405 629.5 0 Tp +TP +-1.3892 0 Td +0 Tr +(i) Tx +(\r) TX +TO +LB +%AI5_EndLayer-- +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_Illustrator_AI5 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_typography_AI5 /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF diff --git a/lib/snmp/doc/src/getnext2.gif b/lib/snmp/doc/src/getnext2.gif new file mode 100644 index 0000000000..caf44e93aa Binary files /dev/null and b/lib/snmp/doc/src/getnext2.gif differ diff --git a/lib/snmp/doc/src/getnext2.ps b/lib/snmp/doc/src/getnext2.ps new file mode 100644 index 0000000000..49721647cf --- /dev/null +++ b/lib/snmp/doc/src/getnext2.ps @@ -0,0 +1,2997 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(r) 6.0 +%%For: (Anna Fedoriw) (Ericsson Telecom) +%%Title: (GetNext311.eps) +%%CreationDate: (97-05-23) (14.04) +%%BoundingBox: 112 623 440 757 +%%HiResBoundingBox: 112.5 623.5 439.5 756.8677 +%%DocumentProcessColors: Black +%%DocumentFonts: Univers +%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 +%%+ procset Adobe_typography_AI5 1.0 0 +%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 +%%+ procset Adobe_Illustrator_AI5 1.0 0 +%AI5_FileFormat 2.0 +%AI3_ColorUsage: Black&White +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 21 -12 588 802 +%AI3_DocumentPreview: Macintosh_ColorPic +%AI5_ArtSize: 595.2756 841.8898 +%AI5_RulerUnits: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI5_OpenToView: 54 804 2 1146 827 58 1 1 3 40 +%AI5_OpenViewLayers: 7 +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 23 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + 5 packedarray + } bind def + /setcustomcolor + { + exch aload pop pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + def + } if + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + level2? + { + gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore + add add add 4 eq + } + { + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + } ifelse + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset Adobe_typography_AI5 1.0 1 +%%Title: (Typography Operators) +%%Version: 1.0 +%%CreationDate:(03/26/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_typography_AI5 54 dict dup begin +put +/initialize +{ + begin + begin + Adobe_typography_AI5 begin + Adobe_typography_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + end + end + end + Adobe_typography_AI5 begin +} def +/terminate +{ + currentdict Adobe_typography_AI5 eq + { + end + } if +} def +/modifyEncoding +{ + /_tempEncode exch ddef + /_pntr 0 ddef + { + counttomark -1 roll + dup type dup /marktype eq + { + pop pop exit + } + { + /nametype eq + { + _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll + put + } + { + /_pntr exch ddef + } ifelse + } ifelse + } loop + _tempEncode +} def +/TE +{ + StandardEncoding 256 array copy modifyEncoding + /_nativeEncoding exch def +} def +% +/TZ +{ + dup type /arraytype eq + { + /_wv exch def + } + { + /_wv 0 def + } ifelse + /_useNativeEncoding exch def + pop pop + findfont _wv type /arraytype eq + { + _wv makeblendedfont + } if + dup length 2 add dict + begin + mark exch + { + 1 index /FID ne + { + def + } if + cleartomark mark + } forall + pop + /FontName exch def + counttomark 0 eq + { + 1 _useNativeEncoding eq + { + /Encoding _nativeEncoding def + } if + cleartomark + } + { + /Encoding load 256 array copy + modifyEncoding /Encoding exch def + } ifelse + FontName currentdict + end + definefont pop +} def +/tr +{ + _ax _ay 3 2 roll +} def +/trj +{ + _cx _cy _sp _ax _ay 6 5 roll +} def +/a0 +{ + /Tx + { + dup + currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + } ddef + /Tj + { + dup + currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + } ddef +} def +/a1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/e0 +{ + /Tx + { + tr _psf + } ddef + /Tj + { + trj _pjsf + } ddef +} def +/e1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + tr _psf + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + trj _pjsf + grestore 3 1 roll moveto tr jsp + } ddef +} def +/i0 +{ + /Tx + { + tr sp + } ddef + /Tj + { + trj jsp + } ddef +} def +/i1 +{ + W N +} def +/o0 +{ + /Tx + { + tr sw rmoveto + } ddef + /Tj + { + trj swj rmoveto + } ddef +} def +/r0 +{ + /Tx + { + tr _ctm _pss + } ddef + /Tj + { + trj _ctm _pjss + } ddef +} def +/r1 +{ + /Tx + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/To +{ + pop _ctm currentmatrix pop +} def +/TO +{ + iTe _ctm setmatrix newpath +} def +/Tp +{ + pop _tm astore pop _ctm setmatrix + _tDict begin + /W + { + } def + /h + { + } def +} def +/TP +{ + end + iTm 0 0 moveto +} def +/Tr +{ + _render 3 le + { + currentpoint newpath moveto + } if + dup 8 eq + { + pop 0 + } + { + dup 9 eq + { + pop 1 + } if + } ifelse + dup /_render exch ddef + _renderStart exch get load exec +} def +/iTm +{ + _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale +} def +/Tm +{ + _tm astore pop iTm 0 0 moveto +} def +/Td +{ + _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto +} def +/iTe +{ + _render -1 eq + { + } + { + _renderEnd _render get dup null ne + { + load exec + } + { + pop + } ifelse + } ifelse + /_render -1 ddef +} def +/Ta +{ + pop +} def +/Tf +{ + dup 1000 div /_fScl exch ddef +% + selectfont +} def +/Tl +{ + pop + 0 exch _leading astore pop +} def +/Tt +{ + pop +} def +/TW +{ + 3 npop +} def +/Tw +{ + /_cx exch ddef +} def +/TC +{ + 3 npop +} def +/Tc +{ + /_ax exch ddef +} def +/Ts +{ + /_rise exch ddef + currentpoint + iTm + moveto +} def +/Ti +{ + 3 npop +} def +/Tz +{ + 100 div /_hs exch ddef + iTm +} def +/TA +{ + pop +} def +/Tq +{ + pop +} def +/Th +{ + pop pop pop pop pop +} def +/TX +{ + pop +} def +/Tk +{ + exch pop _fScl mul neg 0 rmoveto +} def +/TK +{ + 2 npop +} def +/T* +{ + _leading aload pop neg Td +} def +/T*- +{ + _leading aload pop Td +} def +/T- +{ + _ax neg 0 rmoveto + _hyphen Tx +} def +/T+ +{ +} def +/TR +{ + _ctm currentmatrix pop + _tm astore pop + iTm 0 0 moveto +} def +/TS +{ + currentfont 3 1 roll + /_Symbol_ _fScl 1000 mul selectfont + + 0 eq + { + Tx + } + { + Tj + } ifelse + setfont +} def +/Xb +{ + pop pop +} def +/Tb /Xb load def +/Xe +{ + pop pop pop pop +} def +/Te /Xe load def +/XB +{ +} def +/TB /XB load def +currentdict readonly pop +end +setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 17 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin + + /initialize + { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 + { + dup type /arraytype eq + { + dup xcheck + { + bind + } if + } if + pop pop + } forall + } def + /terminate { end } def + + currentdict /Adobe_ColorImage_AI6_Vars known not + { + /Adobe_ColorImage_AI6_Vars 14 dict def + } if + + Adobe_ColorImage_AI6_Vars begin + /channelcount 0 def + /sourcecount 0 def + /sourcearray 4 array def + /plateindex -1 def + /XIMask 0 def + /XIBinary 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIBuffer null def + /XIDataProc null def + end + + /WalkRGBString null def + /WalkCMYKString null def + + /StuffRGBIntoGrayString null def + /RGBToGrayImageProc null def + /StuffCMYKIntoGrayString null def + /CMYKToGrayImageProc null def + /ColorImageCompositeEmulator null def + + /SeparateCMYKImageProc null def + + /FourEqual null def + /TestPlateIndex null def + + currentdict /_colorimage known not + { + /colorimage where + { + /colorimage get /_colorimage exch def + } + { + /_colorimage null def + } ifelse + } if + + /_currenttransfer systemdict /currenttransfer get def + + /colorimage null def + /XI null def + + + /WalkRGBString + { + 0 3 index + + dup length 1 sub 0 3 3 -1 roll + { + 3 getinterval { } forall + + 5 index exec + + 3 index + } for + + 5 { pop } repeat + + } def + + + /WalkCMYKString + { + 0 3 index + + dup length 1 sub 0 4 3 -1 roll + { + 4 getinterval { } forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + + } def + + + /StuffRGBIntoGrayString + { + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add + } def + + + /RGBToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 3 idiv string + dup 3 1 roll + + /StuffRGBIntoGrayString load exch + WalkRGBString + end + } def + + + /StuffCMYKIntoGrayString + { + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add + } def + + + /CMYKToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 4 idiv string + dup 3 1 roll + + /StuffCMYKIntoGrayString load exch + WalkCMYKString + end + } def + + + /ColorImageCompositeEmulator + { + pop true eq + { + Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat + } + { + Adobe_ColorImage_AI6_Vars /channelcount get 1 ne + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 3 -1 roll put + + channelcount 3 eq + { + /RGBToGrayImageProc + } + { + /CMYKToGrayImageProc + } ifelse + load + end + } if + image + } ifelse + } def + + + /SeparateCMYKImageProc + { + Adobe_ColorImage_AI6_Vars begin + + sourcecount 0 ne + { + sourcearray plateindex get exec + } + { + sourcearray 0 get exec + + dup length 4 idiv string + + 0 2 index + + plateindex 4 2 index length 1 sub + { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + + pop pop exch pop + } ifelse + end + } def + + + /FourEqual + { + 4 index ne + { + pop pop pop false + } + { + 4 index ne + { + pop pop false + } + { + 4 index ne + { + pop false + } + { + 4 index eq + } ifelse + } ifelse + } ifelse + } def + + + /TestPlateIndex + { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + + /setcmykcolor where + { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + + 1 0 0 0 FourEqual + { + /plateindex 0 def + } + { + 0 1 0 0 FourEqual + { + /plateindex 1 def + } + { + 0 0 1 0 FourEqual + { + /plateindex 2 def + } + { + 0 0 0 1 FourEqual + { + /plateindex 3 def + } + { + 0 0 0 0 FourEqual + { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end + } def + + + /colorimage + { + Adobe_ColorImage_AI6_Vars begin + /channelcount 1 index def + /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def + + 4 sourcecount add index dup + 8 eq exch 1 eq or not + end + + { + /_colorimage load null ne + { + _colorimage + } + { + Adobe_ColorImage_AI6_Vars /sourcecount get + 7 add { pop } repeat + } ifelse + } + { + dup 3 eq + TestPlateIndex + dup -1 eq exch 5 eq or or + { + /_colorimage load null eq + { + ColorImageCompositeEmulator + } + { + dup 1 eq + { + pop pop image + } + { + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + gsave + + 0 _currenttransfer exec + 1 _currenttransfer exec + eq + { 0 _currenttransfer exec 0.5 lt } + { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse + + { { pop 0 } } { { pop 1 } } ifelse + systemdict /settransfer get exec + } if + + _colorimage + + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + grestore + } if + } ifelse + } ifelse + } + { + dup 1 eq + { + pop pop + image + } + { + pop pop + + Adobe_ColorImage_AI6_Vars begin + sourcecount -1 0 + { + exch sourcearray 3 1 roll put + } for + + /SeparateCMYKImageProc load + end + + systemdict /image get exec + } ifelse + } ifelse + } ifelse + } def + + /XI + { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIMask exch 0 ne def + /XIBinary exch 0 ne def + pop + pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + + XIBitsPerPixel 1 eq + { + XIImageWidth 8 div ceiling cvi + } + { + XIImageWidth XIChannelCount mul + } ifelse + /XIBuffer exch string def + + XIBinary + { + /XIDataProc { currentfile XIBuffer readstring pop } def + currentfile 128 string readline pop pop + } + { + /XIDataProc { currentfile XIBuffer readhexstring pop } def + } ifelse + + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + XIMask + { + XIImageWidth XIImageHeight + false + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + /_lp /null ddef + _fc + /_lp /imagemask ddef + + imagemask + } + { + XIImageWidth XIImageHeight + XIBitsPerPixel + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + XIChannelCount 1 eq + { + + gsave + 0 setgray + + image + + grestore + } + { + false + XIChannelCount + colorimage + } ifelse + } ifelse + grestore + end + } def + +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin +put +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 91 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add +} def +/swj +{ + dup 4 1 roll + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add + 6 2 roll /_cnt 0 ddef + { + 1 index eq + { + /_cnt _cnt 1 add ddef + } if + } forall + pop + exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow + 3 npop +} def +/jss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + } ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow + 6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow + 2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + } ifelse + 2 copy rmoveto + } exch cshow + 5 npop +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer readline not + { + stop + } if + endString eq + { + cleartomark stop + } if + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer readline not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 4 npop + 6 1 roll + pop + 4 1 roll + pop pop pop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 3 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +end +setpacking +%%EndResource +%%EndProlog +%%BeginSetup +%%IncludeFont: Univers +Adobe_level2_AI5 /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +[ +39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +TE +%AI3_BeginEncoding: _Univers Univers +[/_Univers/Univers 0 0 1 TZ +%AI3_EndEncoding AdobeType +%AI5_Begin_NonPrinting +Np +8 Bn +%AI5_BeginGradient: (Black & White) +(Black & White) 0 2 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Green & Blue) +(Green & Blue) 0 2 Bd +[ +< +99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 +A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 +B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 +C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 +D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 +E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 +F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF +> +< +000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D +1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B +3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 +5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 +78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 +96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 +B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +[ +1 0.75 0 0 1 50 100 %_Bs +0.6 0 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Pink, Yellow, Green) +(Pink, Yellow, Green) 0 3 Bd +[ +< +00000000000000000000000000000000000000010101010101010101010101010101010101010101 +01010101010202020202020202020202020202020202020202020203030303030303030303030303 +03030303030303030404040404040404040404040404040404040404050505050505050505050505 +05050505050505060606060606060606060606060606060606060707070707070707070707070707 +07070707080808080808080808080808080808080809090909090909090909090909090909090A0A +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C +0C0C0C0C0C0C0C0D0D0D0D0D +> +< +050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 +17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F +2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A +4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 +69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 +88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 +A9AAABACADADAEAFB0B1B2B2 +> +< +CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 +B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B +9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B +7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 +5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 +3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C +0B0A09080706050403020100 +> +0 +1 %_Br +< +737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E +4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D +2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 +1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 +020201010101010000000000 +> +< +00000000000000000000000001010101010101010101010101010101010101010101010102020202 +02020202020202020202020202020202020202020202030303030303030303030303030303030303 +03030303030303030303030303040404040404040404040404040404040404040404040404040404 +04040404040404040404050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505 +> +< +BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 +C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 +C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA +CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC +CCCCCCCCCCCCCCCCCCCCCCCC +> +0 +1 %_Br +[ +0.05 0.7 0 0 1 50 100 %_Bs +0 0.02 0.8 0 1 57 36 %_Bs +0.45 0 0.75 0 1 37 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Purple, Red & Yellow) +(Purple, Red & Yellow) 0 3 Bd +[ +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A +> +< +CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 +D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC +DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 +E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED +EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 +F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE +FEFEFEFFFFFF +> +0 +1 %_Br +< +E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE +BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 +9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E +6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 +4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E +1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 +> +< +E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA +EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE +EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 +F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 +F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC +FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF +> +< +00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 +242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 +4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A +6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E +8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 +B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC +> +0 +1 %_Br +[ +0 0.04 1 0 1 50 100 %_Bs +0 1 0.8 0 1 50 50 %_Bs +0.9 0.9 0 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Rainbow) +(Rainbow) 0 6 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +0 +1 %_Br +1 +< +0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 +A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE +CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 +F7F8F9FAFBFCFDFEFF +> +0 +0 +1 %_Br +1 +< +00000000000000000000000000000000000001010101010101010101010101010101010101010101 +01010101010101010101010101010202020202020202020202020202020202020202020202020202 +02020202020202020202030303030303030303030303030303030303030303030303030303030303 +03030303030304040404040404040404040404040404040404040404040404040404040404040404 +04040505050505050505050505050505050505050505050505050505050505050505050505050606 +06060606060606060606060606060606060606060606060606060606060606060606070707070707 +07070707070707070707070707070707 +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 +1 +0 +1 %_Br +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +1 %_Br +[ +0 1 0 0 1 50 100 %_Bs +1 1 0 0 1 50 80 %_Bs +1 0.0279 0 0 1 50 60 %_Bs +1 0 1 0 1 50 40 %_Bs +0 0 1 0 1 50 20 %_Bs +0 1 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Steel Bar) +(Steel Bar) 0 3 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 70 %_Bs +0 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Orange Radial) +(Yellow & Orange Radial) 1 2 Bd +[ +0 +< +0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 +232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 +494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F +707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C +> +< +FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 +F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 +F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB +EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 +> +0 +1 %_Br +[ +0 0 1 0 1 52 19 %_Bs +0 0.55 0.9 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Purple Radial) +(Yellow & Purple Radial) 1 2 Bd +[ +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +< +1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 +393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D +5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 +83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 +A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB +CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 +F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF +> +< +ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 +908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 +7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B +5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 +403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 +25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B +0A090908070706050504030302010100 +> +0 +1 %_Br +[ +0 0.08 0.67 0 1 50 14 %_Bs +1 1 0 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_End_NonPrinting-- +%AI5_BeginPalette +0 2 Pb +Pn +Pc +1 g +Pc +0 g +Pc +0 0 0 0 k +Pc +0.75 g +Pc +0.5 g +Pc +0.25 g +Pc +0 g +Pc +Bb +2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0 0 0 k +Pc +0.5 0 0 0 k +Pc +0.75 0 0 0 k +Pc +1 0 0 0 k +Pc +0.25 0.25 0 0 k +Pc +0.5 0.5 0 0 k +Pc +0.75 0.75 0 0 k +Pc +1 1 0 0 k +Pc +Bb +2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0 0 k +Pc +0 0.5 0 0 k +Pc +0 0.75 0 0 k +Pc +0 1 0 0 k +Pc +0 0.25 0.25 0 k +Pc +0 0.5 0.5 0 k +Pc +0 0.75 0.75 0 k +Pc +0 1 1 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0 0.25 0 k +Pc +0 0 0.5 0 k +Pc +0 0 0.75 0 k +Pc +0 0 1 0 k +Pc +0.25 0 0.25 0 k +Pc +0.5 0 0.5 0 k +Pc +0.75 0 0.75 0 k +Pc +1 0 1 0 k +Pc +Bb +2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0 0 k +Pc +0.5 0.25 0 0 k +Pc +0.75 0.375 0 0 k +Pc +1 0.5 0 0 k +Pc +0.125 0.25 0 0 k +Pc +0.25 0.5 0 0 k +Pc +0.375 0.75 0 0 k +Pc +0.5 1 0 0 k +Pc +Bb +2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0.125 0 k +Pc +0 0.5 0.25 0 k +Pc +0 0.75 0.375 0 k +Pc +0 1 0.5 0 k +Pc +0 0.125 0.25 0 k +Pc +0 0.25 0.5 0 k +Pc +0 0.375 0.75 0 k +Pc +0 0.5 1 0 k +Pc +Bb +2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0 0.25 0 k +Pc +0.25 0 0.5 0 k +Pc +0.375 0 0.75 0 k +Pc +0.5 0 1 0 k +Pc +0.25 0 0.125 0 k +Pc +0.5 0 0.25 0 k +Pc +0.75 0 0.375 0 k +Pc +1 0 0.5 0 k +Pc +Bb +2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0.125 0 k +Pc +0.5 0.25 0.25 0 k +Pc +0.75 0.375 0.375 0 k +Pc +1 0.5 0.5 0 k +Pc +0.25 0.25 0.125 0 k +Pc +0.5 0.5 0.25 0 k +Pc +0.75 0.75 0.375 0 k +Pc +1 1 0.5 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0.25 0.125 0 k +Pc +0.25 0.5 0.25 0 k +Pc +0.375 0.75 0.375 0 k +Pc +0.5 1 0.5 0 k +Pc +0.125 0.25 0.25 0 k +Pc +0.25 0.5 0.5 0 k +Pc +0.375 0.75 0.75 0 k +Pc +0.5 1 1 0 k +Pc +0 0 0 0 k +Pc +0.125 0.125 0.25 0 k +Pc +0.25 0.25 0.5 0 k +Pc +0.375 0.375 0.75 0 k +Pc +0.5 0.5 1 0 k +Pc +0.25 0.125 0.25 0 k +Pc +0.5 0.25 0.5 0 k +Pc +0.75 0.375 0.75 0 k +Pc +1 0.5 1 0 k +Pc +PB +%AI5_EndPalette +%%EndSetup +%AI5_BeginLayer +1 1 1 1 0 0 0 79 128 255 Lb +(Layer 1) Ln +0 A +800 Ar +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +0 XR +-4014 283.5 m +4626 283.5 L +(N) * +453.5 4716 m +453.5 -3924 L +(N) * +85 4716 m +85 -3924 L +(N) * +-4014 765.5 m +4626 765.5 L +(N) * +0 R +0 G +113 683.5 m +439 683.5 l +S +113 663.5 m +439 663.5 l +S +113 643.5 m +439 643.5 l +S +113 686 m +439 686 l +S +1 Ap +439 624 m +439 709 L +113 709 L +113 624 L +439 624 L +s +0 Ap +178.5 709 m +178.5 624 l +S +243 709 m +243 624 l +S +374 709 m +374 624 l +S +308.5 709 m +308.5 624 l +S +0 To +1 0 0 1 146 692 0 Tp +TP +-12.2278 0 Td +0 Tr +0 O +0 g +/_Univers 10 Tf +0 Ts +100 Tz +0 Tt +1 TA +%_ 0 XL +36 0 Xb +XB +0 0 5 TC +100 100 200 TW +0 0 0 Ti +1 Ta +0 0 2 2 3 Th +0 Tq +0 0 Tl +0 Tc +0 Tw +(key 1) Tx +(\r) TX +TO +0 To +1 0 0 1 213 692 0 Tp +TP +-12.2278 0 Td +0 Tr +(key 2) Tx +(\r) TX +TO +0 To +1 0 0 1 276 692 0 Tp +TP +-11.1121 0 Td +0 Tr +(col 3) Tx +(\r) TX +TO +0 To +1 0 0 1 225.5 747.5 0 Tp +TP +0 Tr +(\r) Tx +TO +0 To +1 0 0 1 336.5 693.5 0 Tp +TP +0 Tr +(\r) Tx +TO +0 To +1 0 0 1 341 692 0 Tp +TP +-11.1121 0 Td +0 Tr +(col 4) Tx +(\r) TX +TO +0 To +1 0 0 1 407.5 692 0 Tp +TP +-11.1121 0 Td +0 Tr +(col 5) Tx +(\r) TX +TO +0 To +1 0 0 1 185.5 736 0 Tp +TP +0 Tr +(\r) Tx +TO +0 To +1 0 0 1 145 669.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 144.5 650.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 145 630 0 Tp +TP +-2.7795 0 Td +0 Tr +(2) Tx +(\r) TX +TO +0 To +1 0 0 1 209.5 669 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 209.5 649.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(2) Tx +(\r) TX +TO +0 To +1 0 0 1 209.5 629.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 274.5 669 0 Tp +TP +-2.7795 0 Td +0 Tr +(a) Tx +(\r) TX +TO +0 To +1 0 0 1 274.5 649.5 0 Tp +TP +-3.0542 0 Td +0 Tr +(d) Tx +(\r) TX +TO +0 To +1 0 0 1 274.5 629.5 0 Tp +TP +-3.0542 0 Td +0 Tr +(g) Tx +(\r) TX +TO +0 To +1 0 0 1 340 669 0 Tp +TP +-3.0542 0 Td +0 Tr +(b) Tx +(\r) TX +TO +0 To +1 0 0 1 340 649.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(e) Tx +(\r) TX +TO +0 To +1 0 0 1 340 629.5 0 Tp +TP +-8.8879 0 Td +0 Tr +(N/A) Tx +(\r) TX +TO +0 To +1 0 0 1 405 669 0 Tp +TP +-2.5 0 Td +0 Tr +(c) Tx +(\r) TX +TO +0 To +1 0 0 1 405 649.5 0 Tp +TP +-1.6638 0 Td +0 Tr +(f) Tx +(\r) TX +TO +0 To +1 0 0 1 405 629.5 0 Tp +TP +-1.3892 0 Td +0 Tr +(i) Tx +(\r) TX +TO +u +1 Ap +0 R +0 G +274.4998 662.9963 m +279.1963 662.9963 283.0037 666.8037 283.0037 671.5002 c +283.0037 676.1968 279.1963 680.0042 274.4998 680.0042 c +269.8032 680.0042 265.9958 676.1968 265.9958 671.5002 c +265.9958 666.8037 269.8032 662.9963 274.4998 662.9963 c +s +[3 4 3 4 3 4 ]0 d +274.4998 643.4963 m +279.1963 643.4963 283.0037 647.3037 283.0037 652.0002 c +283.0037 656.6968 279.1963 660.5042 274.4998 660.5042 c +269.8032 660.5042 265.9958 656.6968 265.9958 652.0002 c +265.9958 647.3037 269.8032 643.4963 274.4998 643.4963 c +s +u +u +0 Ap +[]0 d +265.9958 671.5002 m +251 671.5 250.5 662 v +250.1312 654.9919 257.5 653 y +S +0 O +0 g +260.0476 653.373 m +258.5818 654.2863 257.6645 655.0108 256.5229 655.8709 c +255.2066 651.0014 l +255.7237 651.0949 257.7835 651.333 259.5097 651.3831 c +261.3573 651.4376 263.0016 651.3718 264.0403 651.2262 c +263.0697 651.6237 261.6162 652.3953 260.0476 653.373 c +f +U +U +U +u +1 Ap +0 R +0 G +404.9998 662.9963 m +409.6963 662.9963 413.5037 666.8037 413.5037 671.5002 c +413.5037 676.1968 409.6963 680.0042 404.9998 680.0042 c +400.3032 680.0042 396.4958 676.1968 396.4958 671.5002 c +396.4958 666.8037 400.3032 662.9963 404.9998 662.9963 c +s +[3 4 3 4 3 4 ]0 d +404.9998 643.4963 m +409.6963 643.4963 413.5037 647.3037 413.5037 652.0002 c +413.5037 656.6968 409.6963 660.5042 404.9998 660.5042 c +400.3032 660.5042 396.4958 656.6968 396.4958 652.0002 c +396.4958 647.3037 400.3032 643.4963 404.9998 643.4963 c +s +u +u +0 Ap +[]0 d +396.4958 671.5002 m +381.5 671.5 381 662 v +380.6312 654.9919 388 653 y +S +0 O +0 g +390.5476 653.373 m +389.0818 654.2863 388.1645 655.0108 387.0229 655.8709 c +385.7066 651.0014 l +386.2237 651.0949 388.2835 651.333 390.0097 651.3831 c +391.8573 651.4376 393.5016 651.3718 394.5403 651.2262 c +393.5697 651.6237 392.1162 652.3953 390.5476 653.373 c +f +U +U +U +LB +%AI5_EndLayer-- +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_Illustrator_AI5 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_typography_AI5 /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF diff --git a/lib/snmp/doc/src/getnext3.gif b/lib/snmp/doc/src/getnext3.gif new file mode 100644 index 0000000000..2e37cbc6dd Binary files /dev/null and b/lib/snmp/doc/src/getnext3.gif differ diff --git a/lib/snmp/doc/src/getnext3.ps b/lib/snmp/doc/src/getnext3.ps new file mode 100644 index 0000000000..1d1be88a12 --- /dev/null +++ b/lib/snmp/doc/src/getnext3.ps @@ -0,0 +1,3003 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(r) 6.0 +%%For: (Anna Fedoriw) (Ericsson Telecom) +%%Title: (GetNext321.eps) +%%CreationDate: (97-05-23) (14.04) +%%BoundingBox: 112 579 440 757 +%%HiResBoundingBox: 112.5 579.5 439.5 756.8677 +%%DocumentProcessColors: Black +%%DocumentFonts: Univers +%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 +%%+ procset Adobe_typography_AI5 1.0 0 +%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 +%%+ procset Adobe_Illustrator_AI5 1.0 0 +%AI5_FileFormat 2.0 +%AI3_ColorUsage: Black&White +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 21 -12 588 802 +%AI3_DocumentPreview: Macintosh_ColorPic +%AI5_ArtSize: 595.2756 841.8898 +%AI5_RulerUnits: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI5_OpenToView: 54 804 2 1146 827 58 1 1 3 40 +%AI5_OpenViewLayers: 7 +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 23 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + 5 packedarray + } bind def + /setcustomcolor + { + exch aload pop pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + def + } if + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + level2? + { + gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore + add add add 4 eq + } + { + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + } ifelse + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset Adobe_typography_AI5 1.0 1 +%%Title: (Typography Operators) +%%Version: 1.0 +%%CreationDate:(03/26/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_typography_AI5 54 dict dup begin +put +/initialize +{ + begin + begin + Adobe_typography_AI5 begin + Adobe_typography_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + end + end + end + Adobe_typography_AI5 begin +} def +/terminate +{ + currentdict Adobe_typography_AI5 eq + { + end + } if +} def +/modifyEncoding +{ + /_tempEncode exch ddef + /_pntr 0 ddef + { + counttomark -1 roll + dup type dup /marktype eq + { + pop pop exit + } + { + /nametype eq + { + _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll + put + } + { + /_pntr exch ddef + } ifelse + } ifelse + } loop + _tempEncode +} def +/TE +{ + StandardEncoding 256 array copy modifyEncoding + /_nativeEncoding exch def +} def +% +/TZ +{ + dup type /arraytype eq + { + /_wv exch def + } + { + /_wv 0 def + } ifelse + /_useNativeEncoding exch def + pop pop + findfont _wv type /arraytype eq + { + _wv makeblendedfont + } if + dup length 2 add dict + begin + mark exch + { + 1 index /FID ne + { + def + } if + cleartomark mark + } forall + pop + /FontName exch def + counttomark 0 eq + { + 1 _useNativeEncoding eq + { + /Encoding _nativeEncoding def + } if + cleartomark + } + { + /Encoding load 256 array copy + modifyEncoding /Encoding exch def + } ifelse + FontName currentdict + end + definefont pop +} def +/tr +{ + _ax _ay 3 2 roll +} def +/trj +{ + _cx _cy _sp _ax _ay 6 5 roll +} def +/a0 +{ + /Tx + { + dup + currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + } ddef + /Tj + { + dup + currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + } ddef +} def +/a1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/e0 +{ + /Tx + { + tr _psf + } ddef + /Tj + { + trj _pjsf + } ddef +} def +/e1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + tr _psf + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + trj _pjsf + grestore 3 1 roll moveto tr jsp + } ddef +} def +/i0 +{ + /Tx + { + tr sp + } ddef + /Tj + { + trj jsp + } ddef +} def +/i1 +{ + W N +} def +/o0 +{ + /Tx + { + tr sw rmoveto + } ddef + /Tj + { + trj swj rmoveto + } ddef +} def +/r0 +{ + /Tx + { + tr _ctm _pss + } ddef + /Tj + { + trj _ctm _pjss + } ddef +} def +/r1 +{ + /Tx + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/To +{ + pop _ctm currentmatrix pop +} def +/TO +{ + iTe _ctm setmatrix newpath +} def +/Tp +{ + pop _tm astore pop _ctm setmatrix + _tDict begin + /W + { + } def + /h + { + } def +} def +/TP +{ + end + iTm 0 0 moveto +} def +/Tr +{ + _render 3 le + { + currentpoint newpath moveto + } if + dup 8 eq + { + pop 0 + } + { + dup 9 eq + { + pop 1 + } if + } ifelse + dup /_render exch ddef + _renderStart exch get load exec +} def +/iTm +{ + _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale +} def +/Tm +{ + _tm astore pop iTm 0 0 moveto +} def +/Td +{ + _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto +} def +/iTe +{ + _render -1 eq + { + } + { + _renderEnd _render get dup null ne + { + load exec + } + { + pop + } ifelse + } ifelse + /_render -1 ddef +} def +/Ta +{ + pop +} def +/Tf +{ + dup 1000 div /_fScl exch ddef +% + selectfont +} def +/Tl +{ + pop + 0 exch _leading astore pop +} def +/Tt +{ + pop +} def +/TW +{ + 3 npop +} def +/Tw +{ + /_cx exch ddef +} def +/TC +{ + 3 npop +} def +/Tc +{ + /_ax exch ddef +} def +/Ts +{ + /_rise exch ddef + currentpoint + iTm + moveto +} def +/Ti +{ + 3 npop +} def +/Tz +{ + 100 div /_hs exch ddef + iTm +} def +/TA +{ + pop +} def +/Tq +{ + pop +} def +/Th +{ + pop pop pop pop pop +} def +/TX +{ + pop +} def +/Tk +{ + exch pop _fScl mul neg 0 rmoveto +} def +/TK +{ + 2 npop +} def +/T* +{ + _leading aload pop neg Td +} def +/T*- +{ + _leading aload pop Td +} def +/T- +{ + _ax neg 0 rmoveto + _hyphen Tx +} def +/T+ +{ +} def +/TR +{ + _ctm currentmatrix pop + _tm astore pop + iTm 0 0 moveto +} def +/TS +{ + currentfont 3 1 roll + /_Symbol_ _fScl 1000 mul selectfont + + 0 eq + { + Tx + } + { + Tj + } ifelse + setfont +} def +/Xb +{ + pop pop +} def +/Tb /Xb load def +/Xe +{ + pop pop pop pop +} def +/Te /Xe load def +/XB +{ +} def +/TB /XB load def +currentdict readonly pop +end +setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 17 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin + + /initialize + { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 + { + dup type /arraytype eq + { + dup xcheck + { + bind + } if + } if + pop pop + } forall + } def + /terminate { end } def + + currentdict /Adobe_ColorImage_AI6_Vars known not + { + /Adobe_ColorImage_AI6_Vars 14 dict def + } if + + Adobe_ColorImage_AI6_Vars begin + /channelcount 0 def + /sourcecount 0 def + /sourcearray 4 array def + /plateindex -1 def + /XIMask 0 def + /XIBinary 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIBuffer null def + /XIDataProc null def + end + + /WalkRGBString null def + /WalkCMYKString null def + + /StuffRGBIntoGrayString null def + /RGBToGrayImageProc null def + /StuffCMYKIntoGrayString null def + /CMYKToGrayImageProc null def + /ColorImageCompositeEmulator null def + + /SeparateCMYKImageProc null def + + /FourEqual null def + /TestPlateIndex null def + + currentdict /_colorimage known not + { + /colorimage where + { + /colorimage get /_colorimage exch def + } + { + /_colorimage null def + } ifelse + } if + + /_currenttransfer systemdict /currenttransfer get def + + /colorimage null def + /XI null def + + + /WalkRGBString + { + 0 3 index + + dup length 1 sub 0 3 3 -1 roll + { + 3 getinterval { } forall + + 5 index exec + + 3 index + } for + + 5 { pop } repeat + + } def + + + /WalkCMYKString + { + 0 3 index + + dup length 1 sub 0 4 3 -1 roll + { + 4 getinterval { } forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + + } def + + + /StuffRGBIntoGrayString + { + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add + } def + + + /RGBToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 3 idiv string + dup 3 1 roll + + /StuffRGBIntoGrayString load exch + WalkRGBString + end + } def + + + /StuffCMYKIntoGrayString + { + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add + } def + + + /CMYKToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 4 idiv string + dup 3 1 roll + + /StuffCMYKIntoGrayString load exch + WalkCMYKString + end + } def + + + /ColorImageCompositeEmulator + { + pop true eq + { + Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat + } + { + Adobe_ColorImage_AI6_Vars /channelcount get 1 ne + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 3 -1 roll put + + channelcount 3 eq + { + /RGBToGrayImageProc + } + { + /CMYKToGrayImageProc + } ifelse + load + end + } if + image + } ifelse + } def + + + /SeparateCMYKImageProc + { + Adobe_ColorImage_AI6_Vars begin + + sourcecount 0 ne + { + sourcearray plateindex get exec + } + { + sourcearray 0 get exec + + dup length 4 idiv string + + 0 2 index + + plateindex 4 2 index length 1 sub + { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + + pop pop exch pop + } ifelse + end + } def + + + /FourEqual + { + 4 index ne + { + pop pop pop false + } + { + 4 index ne + { + pop pop false + } + { + 4 index ne + { + pop false + } + { + 4 index eq + } ifelse + } ifelse + } ifelse + } def + + + /TestPlateIndex + { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + + /setcmykcolor where + { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + + 1 0 0 0 FourEqual + { + /plateindex 0 def + } + { + 0 1 0 0 FourEqual + { + /plateindex 1 def + } + { + 0 0 1 0 FourEqual + { + /plateindex 2 def + } + { + 0 0 0 1 FourEqual + { + /plateindex 3 def + } + { + 0 0 0 0 FourEqual + { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end + } def + + + /colorimage + { + Adobe_ColorImage_AI6_Vars begin + /channelcount 1 index def + /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def + + 4 sourcecount add index dup + 8 eq exch 1 eq or not + end + + { + /_colorimage load null ne + { + _colorimage + } + { + Adobe_ColorImage_AI6_Vars /sourcecount get + 7 add { pop } repeat + } ifelse + } + { + dup 3 eq + TestPlateIndex + dup -1 eq exch 5 eq or or + { + /_colorimage load null eq + { + ColorImageCompositeEmulator + } + { + dup 1 eq + { + pop pop image + } + { + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + gsave + + 0 _currenttransfer exec + 1 _currenttransfer exec + eq + { 0 _currenttransfer exec 0.5 lt } + { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse + + { { pop 0 } } { { pop 1 } } ifelse + systemdict /settransfer get exec + } if + + _colorimage + + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + grestore + } if + } ifelse + } ifelse + } + { + dup 1 eq + { + pop pop + image + } + { + pop pop + + Adobe_ColorImage_AI6_Vars begin + sourcecount -1 0 + { + exch sourcearray 3 1 roll put + } for + + /SeparateCMYKImageProc load + end + + systemdict /image get exec + } ifelse + } ifelse + } ifelse + } def + + /XI + { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIMask exch 0 ne def + /XIBinary exch 0 ne def + pop + pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + + XIBitsPerPixel 1 eq + { + XIImageWidth 8 div ceiling cvi + } + { + XIImageWidth XIChannelCount mul + } ifelse + /XIBuffer exch string def + + XIBinary + { + /XIDataProc { currentfile XIBuffer readstring pop } def + currentfile 128 string readline pop pop + } + { + /XIDataProc { currentfile XIBuffer readhexstring pop } def + } ifelse + + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + XIMask + { + XIImageWidth XIImageHeight + false + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + /_lp /null ddef + _fc + /_lp /imagemask ddef + + imagemask + } + { + XIImageWidth XIImageHeight + XIBitsPerPixel + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + XIChannelCount 1 eq + { + + gsave + 0 setgray + + image + + grestore + } + { + false + XIChannelCount + colorimage + } ifelse + } ifelse + grestore + end + } def + +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin +put +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 91 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add +} def +/swj +{ + dup 4 1 roll + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add + 6 2 roll /_cnt 0 ddef + { + 1 index eq + { + /_cnt _cnt 1 add ddef + } if + } forall + pop + exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow + 3 npop +} def +/jss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + } ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow + 6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow + 2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + } ifelse + 2 copy rmoveto + } exch cshow + 5 npop +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer readline not + { + stop + } if + endString eq + { + cleartomark stop + } if + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer readline not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 4 npop + 6 1 roll + pop + 4 1 roll + pop pop pop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 3 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +end +setpacking +%%EndResource +%%EndProlog +%%BeginSetup +%%IncludeFont: Univers +Adobe_level2_AI5 /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +[ +39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +TE +%AI3_BeginEncoding: _Univers Univers +[/_Univers/Univers 0 0 1 TZ +%AI3_EndEncoding AdobeType +%AI5_Begin_NonPrinting +Np +8 Bn +%AI5_BeginGradient: (Black & White) +(Black & White) 0 2 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Green & Blue) +(Green & Blue) 0 2 Bd +[ +< +99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 +A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 +B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 +C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 +D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 +E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 +F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF +> +< +000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D +1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B +3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 +5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 +78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 +96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 +B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +[ +1 0.75 0 0 1 50 100 %_Bs +0.6 0 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Pink, Yellow, Green) +(Pink, Yellow, Green) 0 3 Bd +[ +< +00000000000000000000000000000000000000010101010101010101010101010101010101010101 +01010101010202020202020202020202020202020202020202020203030303030303030303030303 +03030303030303030404040404040404040404040404040404040404050505050505050505050505 +05050505050505060606060606060606060606060606060606060707070707070707070707070707 +07070707080808080808080808080808080808080809090909090909090909090909090909090A0A +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C +0C0C0C0C0C0C0C0D0D0D0D0D +> +< +050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 +17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F +2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A +4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 +69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 +88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 +A9AAABACADADAEAFB0B1B2B2 +> +< +CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 +B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B +9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B +7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 +5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 +3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C +0B0A09080706050403020100 +> +0 +1 %_Br +< +737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E +4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D +2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 +1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 +020201010101010000000000 +> +< +00000000000000000000000001010101010101010101010101010101010101010101010102020202 +02020202020202020202020202020202020202020202030303030303030303030303030303030303 +03030303030303030303030303040404040404040404040404040404040404040404040404040404 +04040404040404040404050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505 +> +< +BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 +C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 +C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA +CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC +CCCCCCCCCCCCCCCCCCCCCCCC +> +0 +1 %_Br +[ +0.05 0.7 0 0 1 50 100 %_Bs +0 0.02 0.8 0 1 57 36 %_Bs +0.45 0 0.75 0 1 37 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Purple, Red & Yellow) +(Purple, Red & Yellow) 0 3 Bd +[ +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A +> +< +CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 +D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC +DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 +E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED +EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 +F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE +FEFEFEFFFFFF +> +0 +1 %_Br +< +E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE +BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 +9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E +6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 +4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E +1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 +> +< +E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA +EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE +EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 +F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 +F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC +FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF +> +< +00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 +242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 +4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A +6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E +8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 +B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC +> +0 +1 %_Br +[ +0 0.04 1 0 1 50 100 %_Bs +0 1 0.8 0 1 50 50 %_Bs +0.9 0.9 0 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Rainbow) +(Rainbow) 0 6 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +0 +1 %_Br +1 +< +0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 +A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE +CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 +F7F8F9FAFBFCFDFEFF +> +0 +0 +1 %_Br +1 +< +00000000000000000000000000000000000001010101010101010101010101010101010101010101 +01010101010101010101010101010202020202020202020202020202020202020202020202020202 +02020202020202020202030303030303030303030303030303030303030303030303030303030303 +03030303030304040404040404040404040404040404040404040404040404040404040404040404 +04040505050505050505050505050505050505050505050505050505050505050505050505050606 +06060606060606060606060606060606060606060606060606060606060606060606070707070707 +07070707070707070707070707070707 +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 +1 +0 +1 %_Br +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +1 %_Br +[ +0 1 0 0 1 50 100 %_Bs +1 1 0 0 1 50 80 %_Bs +1 0.0279 0 0 1 50 60 %_Bs +1 0 1 0 1 50 40 %_Bs +0 0 1 0 1 50 20 %_Bs +0 1 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Steel Bar) +(Steel Bar) 0 3 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 70 %_Bs +0 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Orange Radial) +(Yellow & Orange Radial) 1 2 Bd +[ +0 +< +0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 +232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 +494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F +707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C +> +< +FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 +F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 +F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB +EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 +> +0 +1 %_Br +[ +0 0 1 0 1 52 19 %_Bs +0 0.55 0.9 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Purple Radial) +(Yellow & Purple Radial) 1 2 Bd +[ +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +< +1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 +393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D +5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 +83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 +A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB +CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 +F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF +> +< +ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 +908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 +7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B +5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 +403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 +25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B +0A090908070706050504030302010100 +> +0 +1 %_Br +[ +0 0.08 0.67 0 1 50 14 %_Bs +1 1 0 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_End_NonPrinting-- +%AI5_BeginPalette +0 2 Pb +Pn +Pc +1 g +Pc +0 g +Pc +0 0 0 0 k +Pc +0.75 g +Pc +0.5 g +Pc +0.25 g +Pc +0 g +Pc +Bb +2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0 0 0 k +Pc +0.5 0 0 0 k +Pc +0.75 0 0 0 k +Pc +1 0 0 0 k +Pc +0.25 0.25 0 0 k +Pc +0.5 0.5 0 0 k +Pc +0.75 0.75 0 0 k +Pc +1 1 0 0 k +Pc +Bb +2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0 0 k +Pc +0 0.5 0 0 k +Pc +0 0.75 0 0 k +Pc +0 1 0 0 k +Pc +0 0.25 0.25 0 k +Pc +0 0.5 0.5 0 k +Pc +0 0.75 0.75 0 k +Pc +0 1 1 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0 0.25 0 k +Pc +0 0 0.5 0 k +Pc +0 0 0.75 0 k +Pc +0 0 1 0 k +Pc +0.25 0 0.25 0 k +Pc +0.5 0 0.5 0 k +Pc +0.75 0 0.75 0 k +Pc +1 0 1 0 k +Pc +Bb +2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0 0 k +Pc +0.5 0.25 0 0 k +Pc +0.75 0.375 0 0 k +Pc +1 0.5 0 0 k +Pc +0.125 0.25 0 0 k +Pc +0.25 0.5 0 0 k +Pc +0.375 0.75 0 0 k +Pc +0.5 1 0 0 k +Pc +Bb +2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0.125 0 k +Pc +0 0.5 0.25 0 k +Pc +0 0.75 0.375 0 k +Pc +0 1 0.5 0 k +Pc +0 0.125 0.25 0 k +Pc +0 0.25 0.5 0 k +Pc +0 0.375 0.75 0 k +Pc +0 0.5 1 0 k +Pc +Bb +2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0 0.25 0 k +Pc +0.25 0 0.5 0 k +Pc +0.375 0 0.75 0 k +Pc +0.5 0 1 0 k +Pc +0.25 0 0.125 0 k +Pc +0.5 0 0.25 0 k +Pc +0.75 0 0.375 0 k +Pc +1 0 0.5 0 k +Pc +Bb +2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0.125 0 k +Pc +0.5 0.25 0.25 0 k +Pc +0.75 0.375 0.375 0 k +Pc +1 0.5 0.5 0 k +Pc +0.25 0.25 0.125 0 k +Pc +0.5 0.5 0.25 0 k +Pc +0.75 0.75 0.375 0 k +Pc +1 1 0.5 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0.25 0.125 0 k +Pc +0.25 0.5 0.25 0 k +Pc +0.375 0.75 0.375 0 k +Pc +0.5 1 0.5 0 k +Pc +0.125 0.25 0.25 0 k +Pc +0.25 0.5 0.5 0 k +Pc +0.375 0.75 0.75 0 k +Pc +0.5 1 1 0 k +Pc +0 0 0 0 k +Pc +0.125 0.125 0.25 0 k +Pc +0.25 0.25 0.5 0 k +Pc +0.375 0.375 0.75 0 k +Pc +0.5 0.5 1 0 k +Pc +0.25 0.125 0.25 0 k +Pc +0.5 0.25 0.5 0 k +Pc +0.75 0.375 0.75 0 k +Pc +1 0.5 1 0 k +Pc +PB +%AI5_EndPalette +%%EndSetup +%AI5_BeginLayer +1 1 1 1 0 0 0 79 128 255 Lb +(Layer 1) Ln +0 A +800 Ar +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +0 XR +-4014 283.5 m +4626 283.5 L +(N) * +453.5 4716 m +453.5 -3924 L +(N) * +85 4716 m +85 -3924 L +(N) * +-4014 765.5 m +4626 765.5 L +(N) * +0 R +0 G +113 683.5 m +439 683.5 l +S +113 663.5 m +439 663.5 l +S +113 643.5 m +439 643.5 l +S +113 686 m +439 686 l +S +1 Ap +439 624 m +439 709 L +113 709 L +113 624 L +439 624 L +s +0 Ap +178.5 709 m +178.5 624 l +S +243 709 m +243 624 l +S +374 709 m +374 624 l +S +308.5 709 m +308.5 624 l +S +0 To +1 0 0 1 146 692 0 Tp +TP +-12.2278 0 Td +0 Tr +0 O +0 g +/_Univers 10 Tf +0 Ts +100 Tz +0 Tt +1 TA +%_ 0 XL +36 0 Xb +XB +0 0 5 TC +100 100 200 TW +0 0 0 Ti +1 Ta +0 0 2 2 3 Th +0 Tq +0 0 Tl +0 Tc +0 Tw +(key 1) Tx +(\r) TX +TO +0 To +1 0 0 1 213 692 0 Tp +TP +-12.2278 0 Td +0 Tr +(key 2) Tx +(\r) TX +TO +0 To +1 0 0 1 276 692 0 Tp +TP +-11.1121 0 Td +0 Tr +(col 3) Tx +(\r) TX +TO +0 To +1 0 0 1 225.5 747.5 0 Tp +TP +0 Tr +(\r) Tx +TO +0 To +1 0 0 1 336.5 693.5 0 Tp +TP +0 Tr +(\r) Tx +TO +0 To +1 0 0 1 341 692 0 Tp +TP +-11.1121 0 Td +0 Tr +(col 4) Tx +(\r) TX +TO +0 To +1 0 0 1 407.5 692 0 Tp +TP +-11.1121 0 Td +0 Tr +(col 5) Tx +(\r) TX +TO +0 To +1 0 0 1 185.5 736 0 Tp +TP +0 Tr +(\r) Tx +TO +0 To +1 0 0 1 145 669.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 144.5 650.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 145 630 0 Tp +TP +-2.7795 0 Td +0 Tr +(2) Tx +(\r) TX +TO +0 To +1 0 0 1 209.5 669 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 209.5 649.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(2) Tx +(\r) TX +TO +0 To +1 0 0 1 209.5 629.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 274.5 669 0 Tp +TP +-2.7795 0 Td +0 Tr +(a) Tx +(\r) TX +TO +0 To +1 0 0 1 274.5 649.5 0 Tp +TP +-3.0542 0 Td +0 Tr +(d) Tx +(\r) TX +TO +0 To +1 0 0 1 274.5 629.5 0 Tp +TP +-3.0542 0 Td +0 Tr +(g) Tx +(\r) TX +TO +0 To +1 0 0 1 340 669 0 Tp +TP +-3.0542 0 Td +0 Tr +(b) Tx +(\r) TX +TO +0 To +1 0 0 1 340 649.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(e) Tx +(\r) TX +TO +0 To +1 0 0 1 340 629.5 0 Tp +TP +-8.8879 0 Td +0 Tr +(N/A) Tx +(\r) TX +TO +0 To +1 0 0 1 405 669 0 Tp +TP +-2.5 0 Td +0 Tr +(c) Tx +(\r) TX +TO +0 To +1 0 0 1 405 649.5 0 Tp +TP +-1.6638 0 Td +0 Tr +(f) Tx +(\r) TX +TO +0 To +1 0 0 1 405 629.5 0 Tp +TP +-1.3892 0 Td +0 Tr +(i) Tx +(\r) TX +TO +1 Ap +0 R +0 G +274.4998 623.4963 m +279.1963 623.4963 283.0037 627.3037 283.0037 632.0002 c +283.0037 636.6968 279.1963 640.5042 274.4998 640.5042 c +269.8032 640.5042 265.9958 636.6968 265.9958 632.0002 c +265.9958 627.3037 269.8032 623.4963 274.4998 623.4963 c +s +[3 4 3 4 3 4 ]0 d +339.9998 663.4963 m +344.6963 663.4963 348.5037 667.3037 348.5037 672.0002 c +348.5037 676.6968 344.6963 680.5042 339.9998 680.5042 c +335.3032 680.5042 331.4958 676.6968 331.4958 672.0002 c +331.4958 667.3037 335.3032 663.4963 339.9998 663.4963 c +s +u +u +u +u +u +u +u +0 Ap +[]0 d +274.4998 623.4963 m +277 615.5 297 615.5 v +317 615.5 313.6364 635.614 316.5 648.5 c +318.5 657.5 326 662 y +S +0 O +0 g +327.4981 664.0941 m +325.8236 663.6715 324.6654 663.5131 323.254 663.2872 c +325.8493 658.9617 l +326.1406 659.3991 327.3976 661.0481 328.5586 662.3265 c +329.8008 663.6954 330.9886 664.8344 331.8138 665.4817 c +330.8543 665.0582 329.2904 664.5461 327.4981 664.0941 c +f +U +U +U +U +U +U +U +1 Ap +0 R +0 G +404.9998 624.4963 m +409.6963 624.4963 413.5037 628.3037 413.5037 633.0002 c +413.5037 637.6968 409.6963 641.5042 404.9998 641.5042 c +400.3032 641.5042 396.4958 637.6968 396.4958 633.0002 c +396.4958 628.3037 400.3032 624.4963 404.9998 624.4963 c +s +u +0 Ap +396.4958 633.0002 m +384.5 634.5089 384.5 620.5 v +383.5 603 l +S +0 O +0 g +384.3884 600.5834 m +384.9812 602.2055 385.5017 603.2521 386.1089 604.5461 c +381.0729 604.8338 l +381.2706 604.347 381.9268 602.38 382.3305 600.701 c +382.7634 598.904 383.0369 597.2812 383.1078 596.2348 c +383.2974 597.2663 383.7539 598.8474 384.3884 600.5834 c +f +U +0 To +1 0 0 1 383 582 0 Tp +TP +-26.9788 0 Td +0 Tr +(endOfT) Tx 1 104 Tk +(able) Tx +(\r) TX +TO +LB +%AI5_EndLayer-- +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_Illustrator_AI5 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_typography_AI5 /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF diff --git a/lib/snmp/doc/src/getnext4.gif b/lib/snmp/doc/src/getnext4.gif new file mode 100644 index 0000000000..703afcc7c5 Binary files /dev/null and b/lib/snmp/doc/src/getnext4.gif differ diff --git a/lib/snmp/doc/src/getnext4.ps b/lib/snmp/doc/src/getnext4.ps new file mode 100644 index 0000000000..8ef3ccf709 --- /dev/null +++ b/lib/snmp/doc/src/getnext4.ps @@ -0,0 +1,3002 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(r) 6.0 +%%For: (Anna Fedoriw) (Ericsson Telecom) +%%Title: (GetNext312.eps) +%%CreationDate: (97-05-23) (14.04) +%%BoundingBox: 112 605 440 757 +%%HiResBoundingBox: 112.5 605.1454 439.5 756.8677 +%%DocumentProcessColors: Black +%%DocumentFonts: Univers +%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 +%%+ procset Adobe_typography_AI5 1.0 0 +%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 +%%+ procset Adobe_Illustrator_AI5 1.0 0 +%AI5_FileFormat 2.0 +%AI3_ColorUsage: Black&White +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 21 -12 588 802 +%AI3_DocumentPreview: Macintosh_ColorPic +%AI5_ArtSize: 595.2756 841.8898 +%AI5_RulerUnits: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI5_OpenToView: 54 804 2 1146 827 58 1 1 3 40 +%AI5_OpenViewLayers: 7 +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 23 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + 5 packedarray + } bind def + /setcustomcolor + { + exch aload pop pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + def + } if + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + level2? + { + gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore + add add add 4 eq + } + { + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + } ifelse + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset Adobe_typography_AI5 1.0 1 +%%Title: (Typography Operators) +%%Version: 1.0 +%%CreationDate:(03/26/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_typography_AI5 54 dict dup begin +put +/initialize +{ + begin + begin + Adobe_typography_AI5 begin + Adobe_typography_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + end + end + end + Adobe_typography_AI5 begin +} def +/terminate +{ + currentdict Adobe_typography_AI5 eq + { + end + } if +} def +/modifyEncoding +{ + /_tempEncode exch ddef + /_pntr 0 ddef + { + counttomark -1 roll + dup type dup /marktype eq + { + pop pop exit + } + { + /nametype eq + { + _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll + put + } + { + /_pntr exch ddef + } ifelse + } ifelse + } loop + _tempEncode +} def +/TE +{ + StandardEncoding 256 array copy modifyEncoding + /_nativeEncoding exch def +} def +% +/TZ +{ + dup type /arraytype eq + { + /_wv exch def + } + { + /_wv 0 def + } ifelse + /_useNativeEncoding exch def + pop pop + findfont _wv type /arraytype eq + { + _wv makeblendedfont + } if + dup length 2 add dict + begin + mark exch + { + 1 index /FID ne + { + def + } if + cleartomark mark + } forall + pop + /FontName exch def + counttomark 0 eq + { + 1 _useNativeEncoding eq + { + /Encoding _nativeEncoding def + } if + cleartomark + } + { + /Encoding load 256 array copy + modifyEncoding /Encoding exch def + } ifelse + FontName currentdict + end + definefont pop +} def +/tr +{ + _ax _ay 3 2 roll +} def +/trj +{ + _cx _cy _sp _ax _ay 6 5 roll +} def +/a0 +{ + /Tx + { + dup + currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + } ddef + /Tj + { + dup + currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + } ddef +} def +/a1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/e0 +{ + /Tx + { + tr _psf + } ddef + /Tj + { + trj _pjsf + } ddef +} def +/e1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + tr _psf + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + trj _pjsf + grestore 3 1 roll moveto tr jsp + } ddef +} def +/i0 +{ + /Tx + { + tr sp + } ddef + /Tj + { + trj jsp + } ddef +} def +/i1 +{ + W N +} def +/o0 +{ + /Tx + { + tr sw rmoveto + } ddef + /Tj + { + trj swj rmoveto + } ddef +} def +/r0 +{ + /Tx + { + tr _ctm _pss + } ddef + /Tj + { + trj _ctm _pjss + } ddef +} def +/r1 +{ + /Tx + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/To +{ + pop _ctm currentmatrix pop +} def +/TO +{ + iTe _ctm setmatrix newpath +} def +/Tp +{ + pop _tm astore pop _ctm setmatrix + _tDict begin + /W + { + } def + /h + { + } def +} def +/TP +{ + end + iTm 0 0 moveto +} def +/Tr +{ + _render 3 le + { + currentpoint newpath moveto + } if + dup 8 eq + { + pop 0 + } + { + dup 9 eq + { + pop 1 + } if + } ifelse + dup /_render exch ddef + _renderStart exch get load exec +} def +/iTm +{ + _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale +} def +/Tm +{ + _tm astore pop iTm 0 0 moveto +} def +/Td +{ + _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto +} def +/iTe +{ + _render -1 eq + { + } + { + _renderEnd _render get dup null ne + { + load exec + } + { + pop + } ifelse + } ifelse + /_render -1 ddef +} def +/Ta +{ + pop +} def +/Tf +{ + dup 1000 div /_fScl exch ddef +% + selectfont +} def +/Tl +{ + pop + 0 exch _leading astore pop +} def +/Tt +{ + pop +} def +/TW +{ + 3 npop +} def +/Tw +{ + /_cx exch ddef +} def +/TC +{ + 3 npop +} def +/Tc +{ + /_ax exch ddef +} def +/Ts +{ + /_rise exch ddef + currentpoint + iTm + moveto +} def +/Ti +{ + 3 npop +} def +/Tz +{ + 100 div /_hs exch ddef + iTm +} def +/TA +{ + pop +} def +/Tq +{ + pop +} def +/Th +{ + pop pop pop pop pop +} def +/TX +{ + pop +} def +/Tk +{ + exch pop _fScl mul neg 0 rmoveto +} def +/TK +{ + 2 npop +} def +/T* +{ + _leading aload pop neg Td +} def +/T*- +{ + _leading aload pop Td +} def +/T- +{ + _ax neg 0 rmoveto + _hyphen Tx +} def +/T+ +{ +} def +/TR +{ + _ctm currentmatrix pop + _tm astore pop + iTm 0 0 moveto +} def +/TS +{ + currentfont 3 1 roll + /_Symbol_ _fScl 1000 mul selectfont + + 0 eq + { + Tx + } + { + Tj + } ifelse + setfont +} def +/Xb +{ + pop pop +} def +/Tb /Xb load def +/Xe +{ + pop pop pop pop +} def +/Te /Xe load def +/XB +{ +} def +/TB /XB load def +currentdict readonly pop +end +setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 17 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin + + /initialize + { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 + { + dup type /arraytype eq + { + dup xcheck + { + bind + } if + } if + pop pop + } forall + } def + /terminate { end } def + + currentdict /Adobe_ColorImage_AI6_Vars known not + { + /Adobe_ColorImage_AI6_Vars 14 dict def + } if + + Adobe_ColorImage_AI6_Vars begin + /channelcount 0 def + /sourcecount 0 def + /sourcearray 4 array def + /plateindex -1 def + /XIMask 0 def + /XIBinary 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIBuffer null def + /XIDataProc null def + end + + /WalkRGBString null def + /WalkCMYKString null def + + /StuffRGBIntoGrayString null def + /RGBToGrayImageProc null def + /StuffCMYKIntoGrayString null def + /CMYKToGrayImageProc null def + /ColorImageCompositeEmulator null def + + /SeparateCMYKImageProc null def + + /FourEqual null def + /TestPlateIndex null def + + currentdict /_colorimage known not + { + /colorimage where + { + /colorimage get /_colorimage exch def + } + { + /_colorimage null def + } ifelse + } if + + /_currenttransfer systemdict /currenttransfer get def + + /colorimage null def + /XI null def + + + /WalkRGBString + { + 0 3 index + + dup length 1 sub 0 3 3 -1 roll + { + 3 getinterval { } forall + + 5 index exec + + 3 index + } for + + 5 { pop } repeat + + } def + + + /WalkCMYKString + { + 0 3 index + + dup length 1 sub 0 4 3 -1 roll + { + 4 getinterval { } forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + + } def + + + /StuffRGBIntoGrayString + { + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add + } def + + + /RGBToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 3 idiv string + dup 3 1 roll + + /StuffRGBIntoGrayString load exch + WalkRGBString + end + } def + + + /StuffCMYKIntoGrayString + { + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add + } def + + + /CMYKToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 4 idiv string + dup 3 1 roll + + /StuffCMYKIntoGrayString load exch + WalkCMYKString + end + } def + + + /ColorImageCompositeEmulator + { + pop true eq + { + Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat + } + { + Adobe_ColorImage_AI6_Vars /channelcount get 1 ne + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 3 -1 roll put + + channelcount 3 eq + { + /RGBToGrayImageProc + } + { + /CMYKToGrayImageProc + } ifelse + load + end + } if + image + } ifelse + } def + + + /SeparateCMYKImageProc + { + Adobe_ColorImage_AI6_Vars begin + + sourcecount 0 ne + { + sourcearray plateindex get exec + } + { + sourcearray 0 get exec + + dup length 4 idiv string + + 0 2 index + + plateindex 4 2 index length 1 sub + { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + + pop pop exch pop + } ifelse + end + } def + + + /FourEqual + { + 4 index ne + { + pop pop pop false + } + { + 4 index ne + { + pop pop false + } + { + 4 index ne + { + pop false + } + { + 4 index eq + } ifelse + } ifelse + } ifelse + } def + + + /TestPlateIndex + { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + + /setcmykcolor where + { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + + 1 0 0 0 FourEqual + { + /plateindex 0 def + } + { + 0 1 0 0 FourEqual + { + /plateindex 1 def + } + { + 0 0 1 0 FourEqual + { + /plateindex 2 def + } + { + 0 0 0 1 FourEqual + { + /plateindex 3 def + } + { + 0 0 0 0 FourEqual + { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end + } def + + + /colorimage + { + Adobe_ColorImage_AI6_Vars begin + /channelcount 1 index def + /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def + + 4 sourcecount add index dup + 8 eq exch 1 eq or not + end + + { + /_colorimage load null ne + { + _colorimage + } + { + Adobe_ColorImage_AI6_Vars /sourcecount get + 7 add { pop } repeat + } ifelse + } + { + dup 3 eq + TestPlateIndex + dup -1 eq exch 5 eq or or + { + /_colorimage load null eq + { + ColorImageCompositeEmulator + } + { + dup 1 eq + { + pop pop image + } + { + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + gsave + + 0 _currenttransfer exec + 1 _currenttransfer exec + eq + { 0 _currenttransfer exec 0.5 lt } + { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse + + { { pop 0 } } { { pop 1 } } ifelse + systemdict /settransfer get exec + } if + + _colorimage + + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + grestore + } if + } ifelse + } ifelse + } + { + dup 1 eq + { + pop pop + image + } + { + pop pop + + Adobe_ColorImage_AI6_Vars begin + sourcecount -1 0 + { + exch sourcearray 3 1 roll put + } for + + /SeparateCMYKImageProc load + end + + systemdict /image get exec + } ifelse + } ifelse + } ifelse + } def + + /XI + { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIMask exch 0 ne def + /XIBinary exch 0 ne def + pop + pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + + XIBitsPerPixel 1 eq + { + XIImageWidth 8 div ceiling cvi + } + { + XIImageWidth XIChannelCount mul + } ifelse + /XIBuffer exch string def + + XIBinary + { + /XIDataProc { currentfile XIBuffer readstring pop } def + currentfile 128 string readline pop pop + } + { + /XIDataProc { currentfile XIBuffer readhexstring pop } def + } ifelse + + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + XIMask + { + XIImageWidth XIImageHeight + false + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + /_lp /null ddef + _fc + /_lp /imagemask ddef + + imagemask + } + { + XIImageWidth XIImageHeight + XIBitsPerPixel + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + XIChannelCount 1 eq + { + + gsave + 0 setgray + + image + + grestore + } + { + false + XIChannelCount + colorimage + } ifelse + } ifelse + grestore + end + } def + +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin +put +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 91 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add +} def +/swj +{ + dup 4 1 roll + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add + 6 2 roll /_cnt 0 ddef + { + 1 index eq + { + /_cnt _cnt 1 add ddef + } if + } forall + pop + exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow + 3 npop +} def +/jss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + } ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow + 6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow + 2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + } ifelse + 2 copy rmoveto + } exch cshow + 5 npop +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer readline not + { + stop + } if + endString eq + { + cleartomark stop + } if + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer readline not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 4 npop + 6 1 roll + pop + 4 1 roll + pop pop pop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 3 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +end +setpacking +%%EndResource +%%EndProlog +%%BeginSetup +%%IncludeFont: Univers +Adobe_level2_AI5 /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +[ +39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +TE +%AI3_BeginEncoding: _Univers Univers +[/_Univers/Univers 0 0 1 TZ +%AI3_EndEncoding AdobeType +%AI5_Begin_NonPrinting +Np +8 Bn +%AI5_BeginGradient: (Black & White) +(Black & White) 0 2 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Green & Blue) +(Green & Blue) 0 2 Bd +[ +< +99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 +A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 +B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 +C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 +D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 +E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 +F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF +> +< +000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D +1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B +3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 +5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 +78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 +96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 +B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +[ +1 0.75 0 0 1 50 100 %_Bs +0.6 0 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Pink, Yellow, Green) +(Pink, Yellow, Green) 0 3 Bd +[ +< +00000000000000000000000000000000000000010101010101010101010101010101010101010101 +01010101010202020202020202020202020202020202020202020203030303030303030303030303 +03030303030303030404040404040404040404040404040404040404050505050505050505050505 +05050505050505060606060606060606060606060606060606060707070707070707070707070707 +07070707080808080808080808080808080808080809090909090909090909090909090909090A0A +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C +0C0C0C0C0C0C0C0D0D0D0D0D +> +< +050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 +17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F +2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A +4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 +69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 +88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 +A9AAABACADADAEAFB0B1B2B2 +> +< +CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 +B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B +9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B +7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 +5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 +3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C +0B0A09080706050403020100 +> +0 +1 %_Br +< +737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E +4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D +2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 +1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 +020201010101010000000000 +> +< +00000000000000000000000001010101010101010101010101010101010101010101010102020202 +02020202020202020202020202020202020202020202030303030303030303030303030303030303 +03030303030303030303030303040404040404040404040404040404040404040404040404040404 +04040404040404040404050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505 +> +< +BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 +C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 +C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA +CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC +CCCCCCCCCCCCCCCCCCCCCCCC +> +0 +1 %_Br +[ +0.05 0.7 0 0 1 50 100 %_Bs +0 0.02 0.8 0 1 57 36 %_Bs +0.45 0 0.75 0 1 37 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Purple, Red & Yellow) +(Purple, Red & Yellow) 0 3 Bd +[ +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A +> +< +CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 +D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC +DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 +E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED +EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 +F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE +FEFEFEFFFFFF +> +0 +1 %_Br +< +E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE +BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 +9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E +6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 +4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E +1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 +> +< +E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA +EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE +EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 +F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 +F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC +FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF +> +< +00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 +242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 +4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A +6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E +8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 +B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC +> +0 +1 %_Br +[ +0 0.04 1 0 1 50 100 %_Bs +0 1 0.8 0 1 50 50 %_Bs +0.9 0.9 0 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Rainbow) +(Rainbow) 0 6 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +0 +1 %_Br +1 +< +0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 +A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE +CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 +F7F8F9FAFBFCFDFEFF +> +0 +0 +1 %_Br +1 +< +00000000000000000000000000000000000001010101010101010101010101010101010101010101 +01010101010101010101010101010202020202020202020202020202020202020202020202020202 +02020202020202020202030303030303030303030303030303030303030303030303030303030303 +03030303030304040404040404040404040404040404040404040404040404040404040404040404 +04040505050505050505050505050505050505050505050505050505050505050505050505050606 +06060606060606060606060606060606060606060606060606060606060606060606070707070707 +07070707070707070707070707070707 +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 +1 +0 +1 %_Br +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +1 %_Br +[ +0 1 0 0 1 50 100 %_Bs +1 1 0 0 1 50 80 %_Bs +1 0.0279 0 0 1 50 60 %_Bs +1 0 1 0 1 50 40 %_Bs +0 0 1 0 1 50 20 %_Bs +0 1 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Steel Bar) +(Steel Bar) 0 3 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 70 %_Bs +0 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Orange Radial) +(Yellow & Orange Radial) 1 2 Bd +[ +0 +< +0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 +232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 +494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F +707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C +> +< +FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 +F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 +F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB +EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 +> +0 +1 %_Br +[ +0 0 1 0 1 52 19 %_Bs +0 0.55 0.9 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Purple Radial) +(Yellow & Purple Radial) 1 2 Bd +[ +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +< +1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 +393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D +5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 +83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 +A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB +CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 +F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF +> +< +ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 +908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 +7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B +5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 +403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 +25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B +0A090908070706050504030302010100 +> +0 +1 %_Br +[ +0 0.08 0.67 0 1 50 14 %_Bs +1 1 0 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_End_NonPrinting-- +%AI5_BeginPalette +0 2 Pb +Pn +Pc +1 g +Pc +0 g +Pc +0 0 0 0 k +Pc +0.75 g +Pc +0.5 g +Pc +0.25 g +Pc +0 g +Pc +Bb +2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0 0 0 k +Pc +0.5 0 0 0 k +Pc +0.75 0 0 0 k +Pc +1 0 0 0 k +Pc +0.25 0.25 0 0 k +Pc +0.5 0.5 0 0 k +Pc +0.75 0.75 0 0 k +Pc +1 1 0 0 k +Pc +Bb +2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0 0 k +Pc +0 0.5 0 0 k +Pc +0 0.75 0 0 k +Pc +0 1 0 0 k +Pc +0 0.25 0.25 0 k +Pc +0 0.5 0.5 0 k +Pc +0 0.75 0.75 0 k +Pc +0 1 1 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0 0.25 0 k +Pc +0 0 0.5 0 k +Pc +0 0 0.75 0 k +Pc +0 0 1 0 k +Pc +0.25 0 0.25 0 k +Pc +0.5 0 0.5 0 k +Pc +0.75 0 0.75 0 k +Pc +1 0 1 0 k +Pc +Bb +2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0 0 k +Pc +0.5 0.25 0 0 k +Pc +0.75 0.375 0 0 k +Pc +1 0.5 0 0 k +Pc +0.125 0.25 0 0 k +Pc +0.25 0.5 0 0 k +Pc +0.375 0.75 0 0 k +Pc +0.5 1 0 0 k +Pc +Bb +2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0.125 0 k +Pc +0 0.5 0.25 0 k +Pc +0 0.75 0.375 0 k +Pc +0 1 0.5 0 k +Pc +0 0.125 0.25 0 k +Pc +0 0.25 0.5 0 k +Pc +0 0.375 0.75 0 k +Pc +0 0.5 1 0 k +Pc +Bb +2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0 0.25 0 k +Pc +0.25 0 0.5 0 k +Pc +0.375 0 0.75 0 k +Pc +0.5 0 1 0 k +Pc +0.25 0 0.125 0 k +Pc +0.5 0 0.25 0 k +Pc +0.75 0 0.375 0 k +Pc +1 0 0.5 0 k +Pc +Bb +2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0.125 0 k +Pc +0.5 0.25 0.25 0 k +Pc +0.75 0.375 0.375 0 k +Pc +1 0.5 0.5 0 k +Pc +0.25 0.25 0.125 0 k +Pc +0.5 0.5 0.25 0 k +Pc +0.75 0.75 0.375 0 k +Pc +1 1 0.5 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0.25 0.125 0 k +Pc +0.25 0.5 0.25 0 k +Pc +0.375 0.75 0.375 0 k +Pc +0.5 1 0.5 0 k +Pc +0.125 0.25 0.25 0 k +Pc +0.25 0.5 0.5 0 k +Pc +0.375 0.75 0.75 0 k +Pc +0.5 1 1 0 k +Pc +0 0 0 0 k +Pc +0.125 0.125 0.25 0 k +Pc +0.25 0.25 0.5 0 k +Pc +0.375 0.375 0.75 0 k +Pc +0.5 0.5 1 0 k +Pc +0.25 0.125 0.25 0 k +Pc +0.5 0.25 0.5 0 k +Pc +0.75 0.375 0.75 0 k +Pc +1 0.5 1 0 k +Pc +PB +%AI5_EndPalette +%%EndSetup +%AI5_BeginLayer +1 1 1 1 0 0 0 79 128 255 Lb +(Layer 1) Ln +0 A +800 Ar +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +0 XR +-4014 283.5 m +4626 283.5 L +(N) * +453.5 4716 m +453.5 -3924 L +(N) * +85 4716 m +85 -3924 L +(N) * +-4014 765.5 m +4626 765.5 L +(N) * +0 R +0 G +113 683.5 m +439 683.5 l +S +113 663.5 m +439 663.5 l +S +113 643.5 m +439 643.5 l +S +113 686 m +439 686 l +S +1 Ap +439 624 m +439 709 L +113 709 L +113 624 L +439 624 L +s +0 Ap +178.5 709 m +178.5 624 l +S +243 709 m +243 624 l +S +374 709 m +374 624 l +S +308.5 709 m +308.5 624 l +S +0 To +1 0 0 1 146 692 0 Tp +TP +-12.2278 0 Td +0 Tr +0 O +0 g +/_Univers 10 Tf +0 Ts +100 Tz +0 Tt +1 TA +%_ 0 XL +36 0 Xb +XB +0 0 5 TC +100 100 200 TW +0 0 0 Ti +1 Ta +0 0 2 2 3 Th +0 Tq +0 0 Tl +0 Tc +0 Tw +(key 1) Tx +(\r) TX +TO +0 To +1 0 0 1 213 692 0 Tp +TP +-12.2278 0 Td +0 Tr +(key 2) Tx +(\r) TX +TO +0 To +1 0 0 1 276 692 0 Tp +TP +-11.1121 0 Td +0 Tr +(col 3) Tx +(\r) TX +TO +0 To +1 0 0 1 225.5 747.5 0 Tp +TP +0 Tr +(\r) Tx +TO +0 To +1 0 0 1 336.5 693.5 0 Tp +TP +0 Tr +(\r) Tx +TO +0 To +1 0 0 1 341 692 0 Tp +TP +-11.1121 0 Td +0 Tr +(col 4) Tx +(\r) TX +TO +0 To +1 0 0 1 407.5 692 0 Tp +TP +-11.1121 0 Td +0 Tr +(col 5) Tx +(\r) TX +TO +0 To +1 0 0 1 185.5 736 0 Tp +TP +0 Tr +(\r) Tx +TO +0 To +1 0 0 1 145 669.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 144.5 650.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 145 630 0 Tp +TP +-2.7795 0 Td +0 Tr +(2) Tx +(\r) TX +TO +0 To +1 0 0 1 209.5 669 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 209.5 649.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(2) Tx +(\r) TX +TO +0 To +1 0 0 1 209.5 629.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(1) Tx +(\r) TX +TO +0 To +1 0 0 1 274.5 669 0 Tp +TP +-2.7795 0 Td +0 Tr +(a) Tx +(\r) TX +TO +0 To +1 0 0 1 274.5 649.5 0 Tp +TP +-3.0542 0 Td +0 Tr +(d) Tx +(\r) TX +TO +0 To +1 0 0 1 274.5 629.5 0 Tp +TP +-3.0542 0 Td +0 Tr +(g) Tx +(\r) TX +TO +0 To +1 0 0 1 340 669 0 Tp +TP +-3.0542 0 Td +0 Tr +(b) Tx +(\r) TX +TO +0 To +1 0 0 1 340 649.5 0 Tp +TP +-2.7795 0 Td +0 Tr +(e) Tx +(\r) TX +TO +0 To +1 0 0 1 340 629.5 0 Tp +TP +-8.8879 0 Td +0 Tr +(N/A) Tx +(\r) TX +TO +0 To +1 0 0 1 405 669 0 Tp +TP +-2.5 0 Td +0 Tr +(c) Tx +(\r) TX +TO +0 To +1 0 0 1 405 649.5 0 Tp +TP +-1.6638 0 Td +0 Tr +(f) Tx +(\r) TX +TO +0 To +1 0 0 1 405 629.5 0 Tp +TP +-1.3892 0 Td +0 Tr +(i) Tx +(\r) TX +TO +u +1 Ap +0 R +0 G +274.4998 643.4963 m +279.1963 643.4963 283.0037 647.3037 283.0037 652.0002 c +283.0037 656.6968 279.1963 660.5042 274.4998 660.5042 c +269.8032 660.5042 265.9958 656.6968 265.9958 652.0002 c +265.9958 647.3037 269.8032 643.4963 274.4998 643.4963 c +s +[3 4 3 4 3 4 ]0 d +274.4998 623.9963 m +279.1963 623.9963 283.0037 627.8037 283.0037 632.5002 c +283.0037 637.1968 279.1963 641.0042 274.4998 641.0042 c +269.8032 641.0042 265.9958 637.1968 265.9958 632.5002 c +265.9958 627.8037 269.8032 623.9963 274.4998 623.9963 c +s +u +u +0 Ap +[]0 d +265.9958 652.0002 m +251 652 250.5 642.5 v +250.1312 635.4919 257.5 633.5 y +S +0 O +0 g +260.0476 633.873 m +258.5818 634.7863 257.6645 635.5108 256.5229 636.3709 c +255.2066 631.5014 l +255.7237 631.5949 257.7835 631.833 259.5097 631.8831 c +261.3573 631.9376 263.0016 631.8718 264.0403 631.7262 c +263.0697 632.1237 261.6162 632.8953 260.0476 633.873 c +f +U +U +U +1 Ap +0 R +0 G +339.9998 643.4963 m +344.6963 643.4963 348.5037 647.3037 348.5037 652.0002 c +348.5037 656.6968 344.6963 660.5042 339.9998 660.5042 c +335.3032 660.5042 331.4958 656.6968 331.4958 652.0002 c +331.4958 647.3037 335.3032 643.4963 339.9998 643.4963 c +s +[3 4 3 4 3 4 ]0 d +404.9998 663.4963 m +409.6963 663.4963 413.5037 667.3037 413.5037 672.0002 c +413.5037 676.6968 409.6963 680.5042 404.9998 680.5042 c +400.3032 680.5042 396.4958 676.6968 396.4958 672.0002 c +396.4958 667.3037 400.3032 663.4963 404.9998 663.4963 c +s +u +u +u +u +u +0 Ap +[]0 d +331.4958 652.0002 m +305.5 617.5 323 607.5 v +338.4597 598.6658 363 623 377 643 c +383.7965 652.7091 392.5 660 y +S +0 O +0 g +393.6525 662.3024 m +392.0646 661.6234 390.9454 661.286 389.5867 660.8423 c +392.8259 656.9755 l +393.0452 657.453 394.0292 659.2782 394.9762 660.7223 c +395.9892 662.2684 396.9844 663.579 397.6983 664.3473 c +396.8168 663.779 395.3521 663.0289 393.6525 662.3024 c +f +U +U +U +U +U +LB +%AI5_EndLayer-- +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_Illustrator_AI5 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_typography_AI5 /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF diff --git a/lib/snmp/doc/src/index.html.src b/lib/snmp/doc/src/index.html.src new file mode 100644 index 0000000000..7ad2140559 --- /dev/null +++ b/lib/snmp/doc/src/index.html.src @@ -0,0 +1,98 @@ + + + + + +SNMP %VSN% + + + + +
+Erlang/OTP
+ + +[Up | +Erlang/OTP] +
+ +

+SNMP +
+Version %VSN% +

+ +

+ + + + + +
+SNMP + +

A bilingual Simple Network Management Protocol application, + featuring an Extensible Agent, a simple manager, a MIB compiler + and facilities for implementing SNMP MIBs etc. +

+ +

+ + + + + + + + + + +
+User's Guide
+ +User's Guide + +
+Reference Manual
+ +Reference Manual + +
+Release Notes
+ +Release Notes + +
+Off-Print
+ +Off-Print + +
+
+ +

+
+ +Copyright © 1991-2001 +Ericsson Utvecklings AB + +
+ + diff --git a/lib/snmp/doc/src/make.dep b/lib/snmp/doc/src/make.dep new file mode 100644 index 0000000000..ccd01b9d3a --- /dev/null +++ b/lib/snmp/doc/src/make.dep @@ -0,0 +1,77 @@ +#-*-makefile-*- ; force emacs to enter makefile-mode + +# %CopyrightBegin% +# +# Copyright Ericsson AB 1999-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% + +# ---------------------------------------------------- +# >>>> Do not edit this file <<<< +# This file was automaticly generated by +# /home/otp/bin/docdepend +# ---------------------------------------------------- + + +# ---------------------------------------------------- +# TeX files that the DVI file depend on +# ---------------------------------------------------- + +book.dvi: book.tex part.tex ref_man.tex snmp.tex snmp_advanced_agent.tex \ + snmp_agent_config_files.tex snmp_agent_funct_descr.tex \ + snmp_agent_netif.tex snmp_app.tex snmp_app_a.tex \ + snmp_app_b.tex snmp_audit_trail_log.tex \ + snmp_community_mib.tex \ + snmp_config.tex snmp_def_instr_functions.tex \ + snmp_framework_mib.tex snmp_generic.tex \ + snmp_impl_example_agent.tex \ + snmp_impl_example_manager.tex snmp_index.tex \ + snmp_instr_functions.tex snmp_intro.tex \ + snmp_manager_config_files.tex \ + snmp_manager_funct_descr.tex snmp_manager_netif.tex \ + snmp_mib_compiler.tex snmp_notification_mib.tex \ + snmp_pdus.tex snmp_standard_mib.tex snmp_target_mib.tex \ + snmp_user_based_sm_mib.tex snmp_view_based_acm_mib.tex \ + snmpa.tex snmpa_conf.tex snmpa_error.tex snmpa_error_io.tex \ + snmpa_error_logger.tex snmpa_error_report.tex \ + snmpa_local_db.tex snmpa_mpd.tex \ + snmpa_discovery_handler.tex \ + snmpa_network_interface.tex \ + snmpa_network_interface_filter.tex \ + snmpa_notification_delivery_info_receiver.tex \ + snmpa_notification_filter.tex \ + snmpa_supervisor.tex \ + snmpc.tex snmpm.tex snmpm_conf.tex snmpm_mpd.tex \ + snmpm_network_interface.tex snmpm_network_interface_filter.tex \ + snmpm_user.tex + +# ---------------------------------------------------- +# Source inlined when transforming from source to LaTeX +# ---------------------------------------------------- + +book.tex: ref_man.xml + +# ---------------------------------------------------- +# Pictures that the DVI file depend on +# ---------------------------------------------------- + +book.dvi: MIB_mechanism.ps snmp-um-1-image-1.ps snmp-um-1-image-2.ps \ + snmp-um-1-image-3.ps + +book.dvi: snmp_agent_netif_1.ps + +book.dvi: getnext1.ps getnext2.ps getnext3.ps getnext4.ps + +book.dvi: snmp_manager_netif_1.ps + diff --git a/lib/snmp/doc/src/min_head.gif b/lib/snmp/doc/src/min_head.gif new file mode 100644 index 0000000000..67948a6378 Binary files /dev/null and b/lib/snmp/doc/src/min_head.gif differ diff --git a/lib/snmp/doc/src/note.gif b/lib/snmp/doc/src/note.gif new file mode 100644 index 0000000000..6fffe30419 Binary files /dev/null and b/lib/snmp/doc/src/note.gif differ diff --git a/lib/snmp/doc/src/notes.gif b/lib/snmp/doc/src/notes.gif new file mode 100644 index 0000000000..e000cca26a Binary files /dev/null and b/lib/snmp/doc/src/notes.gif differ diff --git a/lib/snmp/doc/src/notes.xml b/lib/snmp/doc/src/notes.xml new file mode 100644 index 0000000000..96a444227d --- /dev/null +++ b/lib/snmp/doc/src/notes.xml @@ -0,0 +1,1024 @@ + + + + +
+ + 19962009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + SNMP Release Notes + + + + + + + + notes.xml +
+ +
+ SNMP Development Toolkit 4.15 + +

Version 4.15 supports code replacement in runtime from/to + version 4.14 and 4.13.5.

+ +
+ Improvements and new features + + + + +

The documentation is now built with open source tools + (xsltproc and fop) that exists on most + platforms. One visible change is that the frames are removed.

+

Own Id: OTP-8249

+
+ +
+ +
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[manager] When information from an unknown agent is received, + it was previously delivered to the default user via calls to all + the functions of the callback API depending on the info type + (pdu, trap, report or inform). + The problem was that the TargetName argument was useless + in this case (only an already known agent has a known/valid + TargetName, but the TargetName used in these calls + was generated "on the fly").

+

This has now been changed so that when a message is received + from an unknown agent, then only + handle_agent + (for the default user) is called, but now this call also has a + Type argument, which is + pdu | trap | report | inform, depending on what kind of + message was actually received, thus making it possible for the + user to properly analyze the data received.

+

To handle this, the + snmpm_user behaviour has + been updated.

+

*** POTENTIAL INCOMPATIBILITY ***

+

Own Id: OTP-8229

+ +
+ +
+ +
+ +
+ + +
+ SNMP Development Toolkit 4.14 + +

Version 4.14 supports code replacement in runtime from/to + version 4.13.5, 4.13.4, 4.13.3, 4.13.2, 4.13.1 and 4.13.

+ +
+ Improvements and new features + + + + +

[compiler] Include object- and notification groups in the + compiled mib. + This will make it possible to import groups from other mibs.

+

Also the SNMPv2-MIB-file has been updated to a more + up-to-date version.

+

Own Id: OTP-8223

+ +
+ + +

[manager] Added support for message filtering in the + network interface module provided with the application. + The component that actually make the filter decisions + is the network interface filter module. This module + must implement the + network interface filter behaviour + for message filtering. + See also the Configuring chapter of + the User's Guide to see how to configure this feature.

+

See the + configuration + chapter for more info about the filter options.

+

Own Id: OTP-8228

+

Aux Id: Seq 11411

+
+ + +

The MIBs delivered as part of the application is now + also available as man pages, section 7.

+

Own Id: OTP-8237

+ +
+ +
+ +
+ +
+ Reported Fixed Bugs and Malfunctions +

-

+ + + +
+ +
+ Incompatibilities +

-

+
+
+ + +
+ SNMP Development Toolkit 4.13.5 + +

Version 4.13.5 supports code replacement in runtime from/to + version 4.13.4, 4.13.3, 4.13.2, 4.13.1 and 4.13.

+ +
+ Improvements and new features + + + + +

[agent] Improved the cache handling of the mib server.

+

A number of new functions and config options for the mib server + cache has been added.

+

See + invalidate_mibs_cache/0,1, + enable_mibs_cache/0,1, + disable_mibs_cache/0,1, + gc_mibs_cache/0,1,2,3, + enable_mibs_cache_autogc/0,1, + disable_mibs_cache_autogc/0,1, + update_mibs_cache_age/1,2 and + update_mibs_cache_gclimit/1,2 for more info.

+

See also the + configuration + chapter for more info about the mib server cache options.

+

Own Id: OTP-8182

+

Aux Id: Seq 11383

+
+ + +

[agent] A manager could no longer use the SNMPv3 user "initial" + as this was interpretated as the first step of the discovery.

+

Introduced a new terminating option, trigger_username to + make it possible to configure the username the agent reacts to. + Default is "".

+

See the + configuration + chapter for more info about the discovery options.

+

Own Id: OTP-8120

+

Aux Id: Seq 11361

+
+ +
+ +
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[agent] The main agent type header file contained some miss-information + regarding the type of the entrytype field of the me-record, causing + unneccessary confusion.

+

Own Id: OTP-8116

+

Aux Id: Seq 11312

+
+ +
+ +
+ +
+ Incompatibilities +

-

+
+
+ + +
+ SNMP Development Toolkit 4.13.4 + +

Version 4.13.4 supports code replacement in runtime from/to + version 4.13.3, 4.13.2, 4.13.1 and 4.13.

+ +
+ Improvements and new features +

-

+ + + +
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[agent] Originating discovery problems.

+

Invalid state variable update during second stage of + discovery causes master agent crash.

+

Also the net_if process failed to activate socket + ({active, once}) after first discovery response was sent.

+

Own Id: OTP-8044

+

Aux Id: Seq 11295

+
+ + +

[agent] Terminating discovery problem.

+

The reply to the second stage request should include a + varbind with usmStatsNotInTimeWindows.

+

Own Id: OTP-8062

+

Aux Id: Seq 11318

+
+ + +

[agent] Originating discovery improvement.

+

Added the ExtraInfo argument to the + discovery function. + This argument will be passed on to the stage1_finish callback + function. Also, the + discovery function + will now always return {ok, ManagerEngineID} on successful + discovery.

+

The discovery handler + behaviour updated accordingly.

+

Own Id: OTP-8098

+

Aux Id: Seq 11346

+
+ +
+ +
+ +
+ Incompatibilities +

-

+
+
+ + +
+ SNMP Development Toolkit 4.13.3 + +

Version 4.13.3 supports code replacement in runtime from/to + version 4.13.2, 4.13.1 and 4.13.

+ +
+ Improvements and new features +

-

+ + + +
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[manager] A request for an oid of type BITS was actually + returned as OCTET STRING.

+

Values of type BITS are encoded as OCTET STRING, + which makes it impossible for the decoder to know that + they should really be of type BITS. + Instead, this has to be done higher up in the stack, where + there is knowledge of the MIB (assuming that the mib has + been loaded, there is info about the type of the mibentry).

+

This problem has now been fixed, but requires that the MIB + defining this mib-entry is loaded!

+

The utility function + oid_to_type + has been added, for debug purpose.

+

The utility function(s) + octet_string_to_bits + and + bits_to_octet_string + has also been added. These can be used if the user prefers to + handle the conversion on their own.

+

Own Id: OTP-8015

+

Aux Id: Seq 11285

+
+ + +

[agent] Fixed some issues with the discovery handling.

+

Changed the API of the + discovery + function to solve some + of these problems.

+

Introduced various options for controlling the discovery + process. See the + configuration + chapter for more info about the discovery options.

+

Own Id: OTP-8020

+

Aux Id: Seq 11295

+
+ +
+ +
+ +
+ Incompatibilities +

-

+
+
+ + +
+ SNMP Development Toolkit 4.13.2 + +

Version 4.13.2 supports code replacement in runtime from/to + version 4.13.1 and 4.13.

+ +
+ Improvements and new features +

-

+ + + +
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[manager] Failure during downed user cleanup. + As part of the cleanup after a crashed user, + the manager attempts to unregister the agents + registered by this user. This however failed, + causing a server crash.

+

Own Id: OTP-7961

+

Aux Id: Seq 11275

+
+ + +

[manager] Incorrectly documented value type for + IpAddress (ip). The value type for IpAddress is + documented as ip but is actually ia. The value type + ip has been added. The old (not documented) value + type ia still works.

+

Own Id: OTP-7977

+

Aux Id: Seq 11279

+
+ + +

[manager] EngineId lookup fails when using version-3.

+

Own Id: OTP-7983

+

Aux Id: Seq 11275

+
+ + +

[agent] As of version 4.13 the possible return values + of the function + snmpa_mpd:process_packet/4 + changed, but this was not documented.

+

Own Id: OTP-7989

+

Aux Id: Seq 11275

+
+ +
+ +
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.13.1 + +

Version 4.13.1 supports code replacement in runtime from/to + version 4.13.

+ +
+ Improvements and new features +

-

+ + + +
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[manager] Registration of users had some issues.

+

Not all of the registration functions where actually exported + (register_user/4 + and + register_user_monitor/4). + This has now been fixed.

+

Also, the registration did not succeed unless + user implemented the *new* behaviour. This has now + also been fixed (registration succeeds if the user + implements either the new (i.e. updated + snmpm_user) + or the old user behaviour (snmpm_user_old)).

+

Own Id: OTP-7902

+

Aux Id: Seq 11240

+
+ +
+ +
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.13 + + +
+ Improvements and new features + + + +

[agent] Support for the discovery process.

+

The agent can both initiate discovery itself (see the + discovery chapter + for more info) and respond to discovery initiated by a manager.

+

Own Id: OTP-7571

+

Aux Id: Seq 11053

+
+ +
+ +
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[agent] Unnecessary use of math:pow/2 could cause problems + on systems without floating point support.

+

Per Hedeland

+

Own Id: OTP-7735

+ +
+ + +

[manager] A major flaw was discovered with the agent handling.

+

First, TargetName was never used as intended, as a unique + identifier for the target (agent in this case).

+

Second, TargetName had a default value, which meant + that several agents could have the same TargetName, causing + unpredictable behaviour in the manager.

+

Third, EngineID was not a mandatory config option and had + furthermore also a default value.

+ +

These problems has been solved in the following way:

+

First, a new set of api functions has been introduced (and documented): + register_user/4, + register_user_monitor/4, + register_agent/3, + unregister_agent/2, + agent_info/2, + update_agent_info/4, + sync_get/3,4,5,6, + async_get/3,4,5,6, + sync_get_next/3,4,5,6, + async_get_next/3,4,5,6, + sync_set/3,4,5,6, + async_set/3,4,5,6, + sync_get_bulk/5,6,7,8 and + async_get_bulk/5,6,7,8 + that all use TargetName (and not, as previously, Addr + and Port) to identify the agent (also the return value of + which_agents has + been changed).

+

Second, for backward compatibility, the old functions still + exist, but are no longer documented and are now wrappers for the + new functions, including erroneous default value for EngineID and + all. The TargetName is however generated from the provided + Addr, Port and Version config options.

+

Third, the behaviour of the + SNMP manager user has + been changed to reflect this, i.e. + handle_pdu/4, + handle_trap/3, + handle_inform/3, + handle_report/3 + and the return-value of + handle_agent/4. + The old (non-documented) callback-functions (using Addr and Port) + will still be called if the agent was registered using the old + registration functions.

+ +

Own Id: OTP-7836

+ +
+ +
+ +
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.12.2 +

Version 4.12.2 supports code replacement in runtime from/to + version 4.12.1, 4.12, 4.11.2, 4.11.1 and 4.11.

+ +
+ Improvements and new features +

-

+ + +
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[agent] Bad session cache (usm+camv-info) invalidation + could cause user crash, through call(s) to (a number of) + MIB API function(s) (undefined function).

+

Own Id: OTP-7868

+ +
+ +
+ +
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.12.1 +

Version 4.12.1 supports code replacement in runtime from/to + version 4.12, 4.11.2, 4.11.1 and 4.11.

+ +
+ Improvements and new features +

-

+ + +
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

Logging of messages with the GetBulk-request PDU + incorrectly produced an erroneous entry in the + log: "An error occurred".

+

The reason for this was that the PDU-fields + error_status and error_index is re-used for + Non-repeaters and Max-repetitions for + GetBulk-request PDUs, but this was not handled + by the logging code.

+

Own Id: OTP-7695

+

Aux Id: Seq 11124

+
+ + +

[agent] An attempt to set the row status to active for an + notReady table row, could result in an "inconsistentValue" + error.

+

The same problem existed when attempting to set row status + to notInService for a row in notReady.

+

Serge Aleynikov

+

Own Id: OTP-7698

+ +
+ +
+ +
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.12 +

Version 4.12 supports code replacement in runtime from/to + version 4.11.2, 4.11.1 and 4.11.

+ +
+ Improvements and new features + + + +

[agent] A simple lookup cache has been added to improve + the mib server lookup performance.

+

This can be disabled with the mib_server + cache option.

+

Own Id: OTP-7346

+
+ + +

[agent] Improvement of the inform reporting. + It was previously not certain how many acks an + application received, 0, 1 or 2. This has now been + fixed, so that only 1 (one) ack is issued.

+

Per Hedeland

+

Own Id: OTP-7525

+
+ +
+ +
+ +
+ Reported Fixed Bugs and Malfunctions +

-

+ + +
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.11.2 +

Version 4.11.2 supports code replacement in runtime from/to + version 4.11.1 and 4.11.

+ +
+ Improvements and new features +

-

+ +
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[manager] Erroneous engine-id check when receiving version 3 + informs.

+

Own Id: OTP-7570

+

Aux Id: Seq 11060

+
+ + +

Receiving an snmp message with a very large version + number could cause the erlang node to run out of + memory and consequently crash.

+

The standard specifies the snmp version as an + (unlimited) INTEGER, but today only + 0 (version 1), 1 (version 2) and 3 (version 3) is + actually used. So, when decoding a message, a limit + has been put on the snmp version integer in order + to not allow this kind of a problem.

+

Own Id: OTP-7575

+

Aux Id: Seq 11064

+
+ +
+
+ +
+ Incompatibilities +

-

+
+
+ + +
+ SNMP Development Toolkit 4.11.1 +

Version 4.11.1 supports code replacement in runtime from/to + version 4.11.

+ +
+ Improvements and new features + + + +

[compiler] The MIB compiler did not retrieve the REFERENCE part + of a SNMP MIB definition.

+

This problem has been partly solved. For SNMP tables, + the assocList field of the tables mib-entry record now contains + this info (as {reference, string()}), if the + MIB was compiled with the compiler option +reference.

+

This solution is temporary, until such time as a permanent + solution (and probably not backward compatible) is devised, which + retrieves and stores all REFERENCE part(s) of a MIB.

+

See the + compiler options + for more info.

+ +

Serge Aleynikov

+

Own Id: OTP-7426

+
+ + +

Added utility functions for transforming DateAndTime + as [int()] to strings; + date_and_time_to_string/2 + and + date_and_time_to_string2/1.

+

Also added new validation function + validate_date_and_time/2.

+

Own Id: OTP-7412

+

Aux Id: Seq 10987

+
+ +
+ +
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[manager] Encryption error when attempting to send + version 3 inform-requests.

+

Own Id: OTP-7432

+

Aux Id: Seq 10966

+
+ +
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.11 +

Version 4.11 supports code replacement in runtime from/to + version 4.10.3, 4.10.2, 4.10.1 and 4.10.

+ +
+ Improvements and new features + + + +

[agent] Performance improvements in the case when an SNMP + manager performs an snmpwalk.

+

Martin Björklund

+

Own Id: OTP-7201

+
+ + +

The API for sending inform(s) has been improved. Also + the documentation has been corrected and updated. See + snmpa:send_notification and + snmpa_notification_delivery_info_receiver + for more info.

+

Own Id: OTP-7287

+

Aux Id: Seq 10926

+
+ + +

[agent] Performance of the internal database (local-db) + has been improved.

+

Own Id: OTP-7319

+

Aux Id: Seq 10942

+
+ + +

[agent] Added utility functions, + snmpa:restart_worker/0,1 and + snmpa:restart_set_worker/0,1, + for restarting the agent worker processes (in case the agent is + multi-threaded).

+

Own Id: OTP-7369

+
+ + +

Add utility function to + read + a compiled mib.

+

Own Id: OTP-7371

+
+ +
+
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[manager] Encryption error when attempting to send + version 3 inform-requests.

+

Own Id: OTP-7377

+

Aux Id: Seq 10966

+
+ +
+
+ +
+ Incompatibilities +

-

+
+
+ + +
+ diff --git a/lib/snmp/doc/src/notes_history.xml b/lib/snmp/doc/src/notes_history.xml new file mode 100644 index 0000000000..8739400773 --- /dev/null +++ b/lib/snmp/doc/src/notes_history.xml @@ -0,0 +1,2151 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + SNMP Release Notes history + + + + + + + + notes_history.xml +
+ +
+ SNMP Development Toolkit 4.10.3 +

Version 4.10.3 supports code replacement in runtime from/to + version 4.10.2, 4.10.1 and 4.10.

+ +
+ Improvements and new features + +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] The configuration option + inform_request_behaviour + was not properly parsed, which caused the manager to revert + to the default value, auto.

+

Own Id: OTP-7219

+
+ +
+ +
+ +
+ Incompatibilities +

-

+
+
+ + +
+ SNMP Development Toolkit 4.10.2 + +

Version 4.10.2 supports code replacement in run-time from/to + version 4.10.1 and 4.10

+ +
+ Improvements and new features + + + + +

[compiler] The MIB-compiler did not recognize well-known-names + as top parents. The names 'ccitt' (0) , 'iso' (1) and + 'joint-iso-ccitt' (2) is now also recognized by the MIB + compiler.

+

Ola Samuelsson

+

Own Id: OTP-7160

+
+ + +

[compiler] The MIB-compiler did not support a name assignment + which was sequence of numbers, only a parent object + name followed by a sequence of numbers.

+

Ola Samuelsson

+

Own Id: OTP-7158

+
+ +
+
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[agent] Invalid variable value causes crashing agent worker + process when sending traps.

+

Own Id: OTP-7159

+
+ + +

[agent] When sending a trap, the order of the variable + bindings not provided by the trap-sender, could be + mangled by the agent.

+

Ola Samuelsson

+

Own Id: OTP-7157

+
+ + +

[agent] Uninstalling MEs when unloading mibs incorrect and + therefor never done.

+

Own Id: OTP-7153

+
+ + +

[agent] snmp_generic:table_set_cols/3 did not handle unexpected + return values correctly when setting column values.

+

Serge Aleynikov

+

Own Id: OTP-7152

+
+ +
+
+ +
+ Incompatibilities +

-

+
+
+ + +
+ SNMP Development Toolkit 4.10.1 + +

Version 4.10.1 supports code replacement in run-time from/to + version 4.10

+ +
+ Improvements and new features +

-

+ +
+ +
+ Reported Fixed Bugs and Malfunctions + + + +

[manager] Fixed usage of inet:gethostname/1.

+

Dialyzer

+

Own Id: OTP-7123

+
+ + +

[agent] Remeoved invalid guard. There was an invalid + guard on the start function of the top agent + supervisor.

+

Dialyzer

+

Own Id: OTP-7121

+
+ + +

[compiler] Old style fun cleanup in the MIB compiler.

+

Dialyzer

+

Own Id: OTP-7119

+
+ + +

Corrected usage of function file:open/2 (the Modes + argument is a list).

+

Own Id: OTP-7110

+ +
+ + +

The SNMP application contains some (previously undocumented) + simple utility functions for function tracing (using dbg), + see + enable_trace, + disable_trace, + set_trace/1, + reset_trace and + set_trace/2 + for more info. + These functions are intended to make it easy to enable tracing on + individual functions. + There where some minor errors, which has now been corrected.

+

Own Id: OTP-7109

+ +
+ + +

There is a bug in snmp_pdus:enc_oct_str_tag/1. + All the enc_* functions are supposed to return + a flat list, but the second clause of this function + does not. If it gets a binary it returns a deep list.

+

Martin Björklund

+

Own Id: OTP-7083

+ +
+ +
+
+ +
+ Incompatibilities +

-

+
+
+ + +
+ SNMP Development Toolkit 4.10 + + +
+ Improvements and new features + + +

Added buffer sizes (both receive and send) of + the udp socket(s) info when calling the + agent info + and + manager info + function(s).

+

Own Id: OTP-6945

+
+ + +

[agent] Added the ability to change the request limit + in run-time, see + set_request_limit + for more info.

+

Own Id: OTP-6898

+
+ + +

Added the ability to change the audit trail log type + in run-time (both agent and manager), see function(s) + [manager] set_log_type + and + [agent] set_log_type + for more info.

+

Own Id: OTP-6841

+
+ + +

[agent] Added support for message filtering in the network + interface module provided with the application. + The component that actually make the filter decisions is the + network interface filter module. This module must implement the + network interface filter behaviour. + See also the + Configuring the application + chapter of the User's Guide to see how to configure this + feature.

+

Own Id: OTP-6649

+
+ +
+ +
+ +
+ Reported Fixed Bugs and Malfunctions +

-

+ +
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.9.6 +

Version 4.9.6 supports code replacement in run-time from/to + version 4.9.5, 4.9.4, 4.9.3, 4.9.2, 4.9.1 and 4.9.

+ +
+ Improvements and new features + +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[compiler] The MIB compiler did not handle import + of the macro from the MIB RFC1155-SMI.

+

Own Id: OTP-6840

+

Aux Id: Seq 10726

+
+ + +

Bad length check (i.e. none) when decoding + AuthenticationParameters.

+

Own Id: OTP-6843

+
+ +
+ +
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.9.5 +

Version 4.9.5 supports code replacement in run-time from/to + version 4.9.4, 4.9.3, 4.9.2, 4.9.1 and 4.9.

+ +
+ Improvements and new features + +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[agent] The order in which the processes in the snmp agent + where terminated was incorrect. This could, in some + case's, lead to incoming request(s) being processed + during the application termination phase. This, in + turn, could lead to various process crashes (when + expected resources where no longer available).

+

Own Id: OTP-6805

+

Aux Id: Seq 10717

+
+ + +

[agent] In version 4.9.4 some requests could be + handled single threaded regardless of the value of + the multi_thread config option.

+

Own Id: OTP-6815

+

Aux Id: Seq 10724

+
+
+ +
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.9.4 +

Version 4.9.4 supports code replacement in run-time from/to + version 4.9.3, 4.9.2, 4.9.1 and 4.9.

+ +
+ Improvements and new features + + +

The snmp documentation source has been converted + from SGML to XML.

+

Own Id: OTP-6771

+
+
+ +
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[agent] Unexpected worker process termination. + When the agent is multi-threaded (multi_thread = true), + sending a request to the agent with an invalid context + could lead to an unexpected worker process termination. + This is a non-fatal problem since the master-agent + would simply create a new worker process.

+

Own Id: OTP-6784

+

Aux Id: Seq 10689

+
+
+ +
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.9.3 +

Version 4.9.3 supports code replacement in run-time from/to + version 4.9.2, 4.9.1 and 4.9.

+ +
+ Improvements and new features +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[agent] Changing own [usm] pass-phrase when agent is + multi-threaded did not work.

+

Scott Lystig Fritchie

+

Martin Björklund

+

Own Id: OTP-6712

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.9.2 +

Version 4.9.2 supports code replacement in run-time from/to + version 4.9.1, 4.9 & 4.8.4.

+ +
+ Improvements and new features +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[agent] Incorrect default verbosity (trace) for target cache.

+

Own Id: OTP-6571

+

Aux Id: Seq 10437

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.9.1 +

Version 4.9.1 supports code replacement in run-time from/to + version 4.9 & 4.8.4.

+ +
+ Improvements and new features +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[agent] Used wrong DEFVAL for vacmAccessStorageType + (volatile instead of nonVolatile) in SNMP-VIEW-BASED-ACM-MIB.

+

Martin Björklund

+

Own Id: OTP-6569

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.9 +

Version 4.9 supports code replacement in run-time from/to + version 4.8.4, 4.8.3, 4.8.2, 4.8.1 and 4.8.

+ +
+ Improvements and new features + + +

Added documentation for + snmp:passwd2localized_key/3.

+

Own Id: OTP-6540

+
+ +

The + snmp:config/0 + utility function assumes by default + current working dir as the directory to write config + files. This is a problem since there are two files + that share the same name, usm.conf, one for the agent + and the other for the manager. Some extra checks has + been added to be able warn the user about this possible + conflict.

+

Own Id: OTP-6532

+
+ +

Minor documentation improvement for module snmp_generic.

+

Own Id: OTP-6518

+
+ +

[agent] Improve error handling of missing target params + config.

+

Own Id: OTP-6487

+
+ +

Minor improvement to the mnesia snmp indexing.

+

Own Id: OTP-6415

+
+ +

Include the INET-ADDRESS-MIB mib in the SNMP application.

+

Own Id: OTP-6383

+
+ +

Added utility modules to read, write and update the config + files of the + agent and + manager.

+

Own Id: OTP-6318

+
+ +

[agent] Improve behaviour during massive trap- + sending. This is done in two way's:

+ + +

Improving performance of the target(s) cache + (which is used during trap/notification sending).

+
+ +

A slightly better flow control, making it more + difficult to actually overload the agent.

+
+
+

Own Id: OTP-6317

+

Aux Id: Seq 10437

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

Incorrect handling of decrypt failure resulting in + incorrect error reporting. Applies to both the + agent and the manager. Detected by dialyzer.

+

Own Id: OTP-6533

+
+ +

[manager] Invalid guard on function snmpm:agn/5 + made it impossible to reach this particular clause. + Detected by dialyzer.

+

Own Id: OTP-6529

+
+ +

Miscellaneous minor corrections, such as + removing "dead code". Detected by dialyzer.

+

Own Id: OTP-6515

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.8.4 +

Version 4.8.4 supports code replacement in run-time from/to + version 4.8.3, 4.8.2, 4.8.1 and 4.8.

+ +
+ Improvements and new features +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[agent] An Audit Trail Log entry was sometimes done + using a list instead of the expected binary for the + snmp packet. This caused an error when converting the + log to a text-file.

+

Own Id: OTP-6408

+

Aux Id: Seq 10547

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.8.3 +

Version 4.8.3 supports code replacement in run-time from/to + version 4.8.2, 4.8.1 and 4.8.

+ +
+ Improvements and new features +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[agent] Verification of ViewTreeFamily + (SNMP-VIEW-BASED-ACM-MIB) incorrect. + No values other then null and [] where accepted.

+

Own Id: OTP-6337

+

Aux Id: Seq 10509

+
+ +

[agent] Start with type takeover did not work.

+

Own Id: OTP-6340

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.8.2 +

Version 4.8.2 supports code replacement in run-time from/to + version 4.8.1 and 4.8.

+ +
+ Improvements and new features + + +

Add time-stamp to the verbosity printouts.

+

Own Id: OTP-6214

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

A badly formatted debug printout caused console printouts.

+

Own Id: OTP-6247

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.8.1 +

Version 4.8.1 supports code replacement in run-time from/to + version 4.8, 4.7.4 and 4.7.3.

+ +
+ Improvements and new features +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

Removed an io:format in mini mib utility (used when + converting logs).

+

Own Id: OTP-6177

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.8 +

Version 4.8 supports code replacement in run-time from/to + version 4.7.4 and 4.7.3.

+ +
+ Improvements and new features + + +

Added a config option, sndbuf, for the net_if-module(s). + See + application configuration or + running the application + for more info (look for manager_net_if_options and + agent_net_if_options).

+

Own Id: OTP-6137

+
+ +

Improve error handling of the log_to_txt function(s). + [snmpm|snmpa]:log_to_txt on a non-existing log-file + causes an obscure error reason.

+

Own Id: OTP-6149

+
+ +

Performance improvement when converting audit trail logs.

+

Own Id: OTP-6164

+

Aux Id: Seq 10362

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[compiler] Allow empty definitions for SMI-II mibs, + i.e. mibs are allowed to only contain the + MODULE-IDENTITY construct.

+

Own Id: OTP-6150

+

Aux Id: Seq 10333

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.7.4 +

Version 4.7.4 supports code replacement in run-time from/to + version 4.7.3, 4.7.2, 4.7.1 and 4.7.

+ +
+ Improvements and new features + + +

Add another example, + ex2. + This example is basically a simple manager module.

+

Own Id: OTP-6042

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[agent] v1 trap sending minor problems. When sending a + v1 trap, the wrong record type (#pdu{}) was used to + access the type field (which does not exist in the + #tranpdu{} record). This value is used when logging.

+

Own Id: OTP-6077

+
+ +

[manager] Type guard error.

+

Kostis Sagonas.

+

Own Id: OTP-6074 (dialyzer)

+
+ +

Misc Dialyzer warnings.

+

Own Id: OTP-6068

+
+ +

[manager] Default value tags may conflict with actual + host name. When storing default values for agents, the + tag, default, was used for address (and port). This + could conflict with an actual host name.

+

Own Id: OTP-6062

+
+ +

Misc doc corrections.

+

Own Id: OTP-6044

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.7.3 +

Version 4.7.3 supports code replacement in run-time from/to + version 4.7.2, 4.7.1 and 4.7.

+ +
+ Improvements and new features +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

Misc compiler warning cleanup.

+

Own Id: OTP-6031

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.7.2 +

Version 4.7.2 supports code replacement in run-time from/to + version 4.7.1 and 4.7.

+ +
+ Improvements and new features + + +

[manager] Improve handling of empty messages. Today + when receiving an empty (size = 0) udp message, this + will result in a decode failure (a catched function + clause), which in turn will be passed on to the user, + via a call to the + handle_error + callback function, in the Reason argument. + This has now been changed so that instead, the + Reason argument will get a empty message + value.

+

See + handle_error + for more details.

+

Own Id: OTP-6024

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] Some error cases are reported to the 'user' + with the ReqId and Reason swapped in the call to the + handle_error + callback function.

+

Own Id: OTP-5992

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.7.1 +

Version 4.7.1 supports code replacement in run-time from/to + version 4.7, 4.6.1 and 4.6.

+ +
+ Improvements and new features + + +

Added new version info print functions, + print_version_info.

+

Own Id: OTP-5968

+
+ +

Updated the documentation for the + agent and + manager + log_to_txt functions.

+

Own Id: OTP-5969

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] The supervision structure contained several + errors which unnecessarily caused a complete restart of + the manager.

+

Own Id: OTP-5963

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.7 +

Version 4.7 supports code replacement in run-time from/to + version 4.6.1 and 4.6.

+ +
+ Improvements and new features + + +

Add simple backup mechanism, + see agent backup + and manager backup.

+

Own Id: OTP-5870

+
+ +

Improve handling of faulty data base files.

+

Added new agent and manager config option, + db_init_error, see + config for more + info.

+

Own Id: OTP-5934

+

Aux Id: Seq 10202

+
+ +

Added possibility to configure restart type for each of + the components (default is permanent for the agent and + transient for the manager). + See config for more + info.

+

Own Id: OTP-5935

+
+ +

[compiler] Improve error printouts.

+

Own Id: OTP-5937

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions +

-

+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.6.1 +

Version 4.6.1 supports code replacement in run-time from/to + version 4.6.

+ +
+ Improvements and new features +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[agent] SNMP sha/aes decryption did not work.

+

Magnus Fröberg

+

Own Id: OTP-5834

+
+ +

[agent] The SNMP agent internal data base (local db) + uses dets, and does not properly handle error's from + e.g. lookup.

+

Own Id: OTP-5838

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.6 +

Version 4.6 supports code replacement in run-time from/to + version 4.5.

+ +
+ Improvements and new features + + +

Improved application start flexibility. It is now + possible to start snmp application components (agent + or manager) after the application has been started. + It is even possible to start an "empty" snmp + application and start the agent and/or manager + afterwords. See + start_agent and + start_manager.

+

Own Id: OTP-5797

+

Aux Id: Seq 10128

+
+ +

[agent] Adding utility function to convert old + application config to current agent config. + See the convert_config + for more info.

+

Own Id: OTP-5787

+
+ +

Improved handling of audit trail logs. + See the atl_repair + config for more info.

+

Own Id: OTP-5771

+
+ +

[manager] Introduced the + notify_started + function used by a client to get a notification + when the manager is started.

+

Own Id: OTP-5763

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

Misc documentation corrections.

+

Own Id: OTP-5829

+

Aux Id: Seq 10152

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.5 +

Version 4.5 supports code replacement in run-time from/to + version 4.4.1 and 4.4.

+ +
+ Improvements and new features + + +

[manager] Introduced the + inform request behaviour + configuration option to allow the user to specify + how/when the manager shall acknowledge inform-request's.

+

Own Id: OTP-5733

+
+ +

[manager] In order to improve application behaviour, + all callback function (see the + snmpm_user behaviour) + calls + are now done by spawned processes (and not as previously + by the SNMP manager server process).

+

Own Id: OTP-5726

+
+ +

[manager] In order to present the various error + reason's returned by the manager, a + format_reason + function has been added. + The error reasons this function handles are those + returned by the (sync and async) get, get-next, + get-bulk and set-functions + (see the snmpm module) + as well as the + Reason argument of the + handle_error + function of the + user callback module.

+

Own Id: OTP-5581

+

Aux Id: Seq 9870

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] The (error) report according to RFC 2572, chapter + 7.2 point 6) was never sent.

+

Own Id: OTP-5742

+
+ +

[agent] Check of notification name collision + could fail due to incorrect record name (assumed to + be #trap, but could also be #notification). + This only cases a problem when the application is + compiled with the strict_record_tests option.

+

Own Id: OTP-5740

+
+ +

[agent] Table get-request failure in some cases.

+

Own Id: OTP-5732

+

Aux Id: Seq 10087

+
+ +

Explicitly sync all audit trail log's upon termination.

+

Own Id: OTP-5727

+
+
+
+ +
+ Incompatibilities + + +

[manager] The + snmpm_network_interface + behaviour has been updated (see + inform_response and + definition of the manager net if).

+

Own Id: OTP-5733

+
+
+
+
+ +
+ SNMP Development Toolkit 4.4.1 +

Version 4.4.1 supports code replacement in run-time from/to + version 4.4.

+ +
+ Improvements and new features + + +

[manager] Add monitoring of the SNMP manager. + The SNMP application consists of two different + run-time parts, the agent and the manager. They are + independent of each other. The agent is "permanent" + and the manager "transient". In order to handle + manager crashes a simple + monitor + (and demonitor) + function has been added.

+

Own Id: OTP-5720

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] If sending a set-request containing an + 'OCTET STRING' with an invalid integer (valid integer + are 0-255), the encoding will fail and cause the + net_if process to crash.

+

Own Id: OTP-5719

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.4 +

Version 4.4 supports code replacement in run-time from/to + version 4.3.

+ +
+ Improvements and new features + + +

Updated and extended the + agent + info retrieval function. Also added an info retrieval + function for the + manager.

+

Own Id: OTP-5666

+
+ +

[manager] Added get-bulk functionality, see (sync) get-bulk + and (async) get-bulk for more info.

+

Own Id: OTP-5669

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] Mini-MIB not properly initiated which could + cause a server crash if the name_to_oid or oid_to_name + functions where called (if no mib's where loaded).

+

Own Id: OTP-5675

+
+ +

[manager] The out packet counter was not incremented for + sent v1/v2 messages.

+

Own Id: OTP-5676

+
+ +

[manager] The request GC process was started with the + wrong default value (idle) which could (unlikely but + still) cause problems after a code-change.

+

Own Id: OTP-5678

+
+ +

Bad handling of error cases (corrupt log file) when + converting log files (i.e. when calling the function + log_to_txt).

+

Own Id: OTP-5703

+
+
+
+ +
+ Incompatibilities + + +

[agent] The format of the info returned by the agent + info retrieval function has been changed. The info + can be converted to the old format by calling the + old_info_format).

+

function.

+

Own Id: OTP-5666

+
+
+
+
+ +
+ SNMP Development Toolkit 4.3 +

Version 4.3 supports code replacement in run-time from/to + version 4.2.

+ +
+ Improvements and new features + + +

[manager] Improved async error reporting.

+

Own Id: OTP-5637

+

Aux Id: Seq 9970

+
+ +

Added support for The Advanced Encryption Standard (AES) + Cipher Algorithm in the SNMP User-based Security Model + (RFC 3826). Both agent and manager.

+

Martin Björklund

+

Own Id: OTP-5490

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] Reset of USM-cache when unregister agent.

+

Own Id: OTP-5636

+

Aux Id: Seq 9970

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.2 +

Version 4.2 supports code replacement in run-time from/to + version 4.1.5.

+ +
+ Improvements and new features + + +

[manager] Added another get, get-next and set function + with another argument, ExtraInfo (see + synchronous get (g), asynchronous get (ag), + synchronous set (s), asynchronous set (as), + synchronous get-next (gn), and asynchronous get-next (agn)). + This argument is passed on to the net-if process. The net-if + process included in this application makes no use of this + info, but other implementations might.

+

Own Id: OTP-5574

+

Aux Id: Seq 9850

+
+ +

[manager] report message with incorrect security info + (e.g. securtyModel and/or securityLevel) was ignored (dropped, + except for incrementing the proper error counter) even if all + other info was correct. This has been changed so that in this + situation, the user will be informed, either via the + return value from a synchronous call (see synchronous get (g), + synchronous set (s) and synchronous get-next (gn)) + or via a call to the handle_error callback function.

+

Own Id: OTP-5578

+

Aux Id: Seq 9850

+
+ +

[manager] Added a + unregister_usm_user function.

+

Own Id: OTP-5580

+

Aux Id: Seq 9850

+
+ +

[agent] Added new functions to get lists of all tables, + which_tables, + and variables, + which_variables, + known to the agent.

+

Own Id: OTP-5590

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] Incorrect SHA-key length check when + updating usm-user info (should have been 20 but + was 16).

+

Own Id: OTP-5579

+

Aux Id: Seq 9850

+
+ +

[compiler] Incorrect error report when the name of the + field and object is the same.

+

Kostis Sagonas

+

Own Id: OTP-5591 (dialyzer)

+
+ +

[manager] Arguments Port (third argument) and CtxName + (fourth argument) where swapped in snmpm:g/5 + when forwarding call.

+

Kostis Sagonas

+

Own Id: OTP-5592 (dialyzer)

+
+
+
+ +
+ Incompatibilities + + +

[manager] The snmpm_network_interface behaviour has changed. + One more argument (ExtraInfo) was added to the + function send_pdu (see + send_pdu).

+

Own Id: OTP-5574

+

Aux Id: Seq 9850

+
+
+
+
+ +
+ SNMP Development Toolkit 4.1.5 +

Version 4.1.5 supports code replacement in run-time from/to + version 4.1.4, 4.1.3, 4.1.2, 4.1.1 and 4.1.

+ +
+ Improvements and new features + + +

[agent] Add mapping of notification oid to alias-name.

+

Martin Björklund

+

Own Id: OTP-5562

+
+ +

[manager] Late (async) reply incorrectly delivered to + user via handle_pdu instead of handle_error.

+

Own Id: OTP-5506

+

Aux Id: Seq 9804

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] Security level handled incorrectly.

+

Own Id: OTP-5564

+

Aux Id: Seq 9850

+
+ +

[manager] (v3) Encryption/decryption failure.

+

Own Id: OTP-5560

+

Aux Id: Seq 9850

+
+ +

[manager] Cannot handle version-1 traps.

+

Own Id: OTP-5557

+

Aux Id: Seq 9850

+
+ +

[manager] Set-request without specifying the variable + type failed. The type of the oid had to be found in the + loaded MIB. This look-up was erroneous.

+

Own Id: OTP-5556

+

Aux Id: Seq 9850

+
+ +

[agent] Error's reported by the SecModule (v3) when + generating outgoing message was not handled correctly + in message processing dispatcher module.

+

Own Id: OTP-5550

+
+ +

[manager] Error's reported by the SecModule (v3) when + generating outgoing message was not handled correctly + in message processing dispatcher module. And also when + encryption failed, the real error was masked into another + error.

+

Own Id: OTP-5548

+

Aux Id: Seq 9804

+
+ +

[agent] Failure to stop the snmp application when + started with the old config type.

+

Own Id: OTP-5547

+

Aux Id: Seq 9842

+
+ +

[manager] User unregistration after reboot causes process crash + (snmpm_server).

+

Own Id: OTP-5539

+
+ +

[manager] Security engine id look-up errors.

+

Own Id: OTP-5508

+

Aux Id: Seq 9804

+
+ +

[manager] Registering of USM users erroneous.

+

Own Id: OTP-5505

+

Aux Id: Seq 9804

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.1.4 +

Version 4.1.4 supports code replacement in run-time from/to + version 4.1.3, 4.1.2, 4.1.1 and 4.1.

+ +
+ Improvements and new features +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

Fixed a perl related problem in the mibs Makefile.

+

Geoff White

+

Own Id: OTP-5491

+
+ +

[manager] Failed to register usm users. Both using the + usm config file + (usm.conf) + and the API functions + register_usm_user

+

Own Id: OTP-5499

+

Aux Id: Seq 9804

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.1.3 +

Version 4.1.3 supports code replacement in run-time from/to + version 4.1.2, 4.1.1 and 4.1.

+ +
+ Improvements and new features + + +

Added utility functions to update agent and manager + config files.

+

Own Id: OTP-5468

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[agent] Error replies was composed with invalid OIDs for the + following error counters: + usmStatsWrongDigests (RFC 2574, chap 3.2, point 6), + usmStatsUnsupportedSecLevels (point 5) and + usmStatsDecryptionErrors (point 8a).

+

Own Id: OTP-5464

+

Aux Id: Seq 9791

+
+ +

[agent] Malformed Oid returned from a get_next operation as + part of a get-bulk-request causes the agent to crash.

+

Own Id: OTP-5465

+

Aux Id: Seq 9783, Seq 9793

+
+ +

[agent] Missing catch on decode function call.

+

Kostis Sagonas (Dialyzer)

+

Own Id: OTP-5479

+
+ +

[manager] Invalid check for illegal options.

+

Kostis Sagonas (Dialyzer

+

Own Id: OTP-5480

+
+ +

Faulty utility function for generation of agent + config file target_addr.conf.

+

Own Id: OTP-5482

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit 4.1.2 +

Version 4.1.2 supports code replacement in run-time from/to + version 4.1.1 and 4.1.

+ +
+ Improvements and new features + + +

Export utility functions to create agent and manager + config files.

+

Own Id: OTP-5390

+
+ +

[agent] Documented instrumentation utility functions + (e.g. current_request_id).

+

Own Id: OTP-5423

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] If the client crashes after having issued + an async request, the server will crash when trying to + perform cleanup. Supervision of the calling process issuing an + async request has been removed.

+

Own Id: OTP-5370

+
+ +

Failure to convert an audit-trail-log to text-file when + using the default log name. This applies to both the manager + and the agent.

+

Own Id: OTP-5394

+
+ +

[manager] Corrected the discovery handling of the manager.

+

Own Id: OTP-5414

+
+ +

[manager] Statistic counter creation correction.

+

Own Id: OTP-5415

+
+ +

[agent] When using the old style agent configuration (pre 4.0), + it was not possible to specify a different error report + module (the agent always choose snmpa_error_logger). + A similar problem existed for the config option + force_config_load, which always reverted to false.

+

Own Id: OTP-5424

+
+ +

[manager] The manager net_if process failed to properly handle + the case bind_to option value true.

+

Own Id: OTP-5431

+
+ +

[agent] Various minor mnesia-related fixes.

+

Martin Björklund

+

Own Id: OTP-5433

+
+ +

[manager] Missing interface functions for loading and + unloading mibs into/from the manager: + load_mib, + unload_mib, + which_mibs, + name_to_oid and + oid_to_name.

+

Own Id: OTP-5441

+
+ +

Added utility functions to retrieve some system and application + info, see versions1 and + versions2.

+

Own Id: OTP-5445

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit v4.1.1 +

Version 4.1.1 supports code replacement in run-time from/to + version 4.1.

+

When performing a downgrade, make sure the verbosity of the + manager server process is silence, or else the process will crash + (due to a bug in version 4.0.4) and be restarted by it's + supervisor.

+ +
+ Improvements and new features +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] Manager synchronous get-function with timeout erroneous. + Results in a function clause.

+

Own Id: OTP-5364

+
+ +

Replace in decoder fun's of the "old style" fun format, + {atom(), atom()}, with a proper fun, e.g. "fun the_function/1".

+

Own Id: OTP-5365

+
+ +

[manager] Register agent using the config file + agents.conf failed due to incorrect function guard.

+

Own Id: OTP-5367

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit v4.1.0 +

Version 4.1.0 supports code replacement in run-time from/to + version 4.0.4.

+

When performing a downgrade, make sure the verbosity of the + manager server process is silence, or else the process will crash + (due to a bug in version 4.0.4) and be restarted by it's + supervisor.

+ +
+ Improvements and new features + + +

[manager] Added possibility to monitor a registered user. + See snmpm:register_user_monitor.

+

Own Id: OTP-5286

+
+ +

[agent] Improved symbolic store. Alias and Oids where stored + with similar key's (separated by types: atom() and + lists() respectively). Also added new function: + snmpa:which_aliasnames.

+

Own Id: OTP-5298

+
+ +

[agent] The agent local_db volatile storage method uses + an ets-table which is private. This table has been made + protected in order to make it easier to debug and test the + snmp agent.

+

Own Id: OTP-5308

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

Misspelled deprecated function. Non-existent function + snmp:is_constistent/1 was marked as deprecated. Should + have been snmp:is_consistent/1).

+

Own Id: OTP-5273

+
+ +

[agent] Unclear documentation for function + snmpa:send_notification. The Recv argument + (specifically the {M,F,A} variant).

+

Own Id: OTP-5281

+
+ +

[manager] It was never documented how the default + user behaviour + could be overridden (default user is the module + snmpm_user_default). + See application configuration or + configuration params.

+

Own Id: OTP-5299

+
+ +

[manager] The server process contained a bug that caused it + to crash, if it received an exit message from it's gct (GC timer) + process and it's verbosity was log or higher.

+

This also effects the application downgrade.

+

Own Id: OTP-5306

+
+ +

[agent] The agent config file, target_addr.conf, was + incorrectly described in the + Target Address Definitions chapter of the + User's Guide. The EngineId option was left out.

+

Own Id: OTP-5307

+

Aux Id: Seq 9689

+
+ +

[manager] When a InformRequest is received, the manager sends + a response message. This did not include the varbinds + of the original message. See RFC 3416, chapter 4.2.7.

+

Own Id: OTP-5314

+
+ +

[manager] Erroneous function guards made it possible to update + some agent info (that should be "static").

+

Own Id: OTP-5315

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit v4.0.4 +

Version 4.0.4 supports code replacement in run-time from/to + version 4.0.3, 4.0.2, 4.0.1 and 4.0. +

+ +
+ Improvements and new features +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] The timeout calculation for the request + gc timer incorrect.

+

Own Id: OTP-5267

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit v4.0.3 +

Version 4.0.3 supports code replacement in run-time from/to + version 4.0.2, 4.0.1 and 4.0.

+ +
+ Improvements and new features +

-

+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] Some basic SNMP types where not handled when + performing set-requests snmpm:s and snmpm:as): + 'BITS' (b), 'IpAddress' (ip), 'Opaque' (op), + 'Counter32' (c32), 'Counter64' (c64) and 'TimeTicks' (tt).

+

Own Id: OTP-5256

+
+ +

[manager] Unnecessary error message when receiving trap from + unregistered agent or agent using other port then the + request port for trap-sending.

+

Own Id: OTP-5258

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit v4.0.2 +

Version 4.0.2 supports code replacement in run-time from/to + version 4.0.1 and 4.0. +

+ +
+ Improvements and new features + + +

[manager] When the net_if process failed to send a message, for + whatever reason, this is just dropped. And the user is + "left hanging". Now, if the request is synchronous, + it will return with a proper reason (snmpm:g, snmpm:gn and + snmpm:s), and if the request + was asynchronous, the new callback function, + handle_error + (see snmpm_user) is + called.

+

Own Id: OTP-5242

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] The arguments CtxName and Port was swapped in the + function snmpm:g/6.

+

Own Id: OTP-5225

+
+ +

[manager] TRAP receive fails for unknown agent due to + failing message size calculation.

+

Own Id: OTP-5241

+
+
+
+ +
+ Incompatibilities + + +

[manager] Introduced a new callback function in the behaviour + snmpm_user.

+

Own Id: OTP-5242

+
+
+
+
+ +
+ SNMP Development Toolkit v4.0.1 +

Version 4.0.1 supports code replacement in run-time from/to version 4.0. +

+ +
+ Improvements and new features + + +

[agent] Added functions to get a list of all mibs loaded into + an agent + (see snmpa:which_mibs) + and to get the (full path) file name of a loaded mib (see + snmpa:whereis_mib).

+

Own Id: OTP-5187

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[manager] The wrong default value (1024) was used for the + net-if option recbuf. If no value is specified, then the OS + default shall be used.

+

Own Id: OTP-5196

+
+
+
+ +
+ Incompatibilities +

-

+
+
+ +
+ SNMP Development Toolkit v4.0 + +
+ Improvements and new features + + +

[manager] Added a proper snmp manager.

+

Major restructure of the application in order to + incorporate the new manager.

+
+ +

[agent] Add a snmpa:get/3 with an extra Context + argument. Also added similar snmpa:get_next/2,3 functions. + See snmpa:get and + snmpa:get_next.

+

Martin Björklund

+

Own Id: OTP-5054

+
+ +

[agent] Add notification filters. See + snmpa_notification_filter, + register_notification_filter, + unregister_notification_filter and + which_notification_filter.

+

Own Id: OTP-5055

+
+ +

[agent] Added two mib look-up functions, + me_of and + mib_of.

+

Own Id: OTP-5082

+

Aux Id: Seq 8848

+
+ +

[compiler] The MIB compiler is now (source code) independent + of the rest of the application (and vice versa).

+
+ +

[compiler] DISPLAY-HINT and UNITS included in the + compiled mib.

+

Own Id: OTP-5053

+
+ +

[compiler] Added compiler options imports and + module_identity to include the imports list and + module identity (only SMIv2) info in the compiled mib, + see snmpc.

+
+ +

[compiler] Added the MIB compiler option + +no_defs, see snmpc.

+

Martin Björklund

+
+ +

[compiler] Added the MIB compiler option + +'{module, atom()}', + see snmpc.

+

Martin Björklund

+
+
+
+ +
+ Reported Fixed Bugs and Malfunctions + + +

[agent] Failing MIB configure/reconfigure was difficult + to diagnose. Added better error handling and verbosity.

+
+ +

[compiler] Added "default value" for INTEGER with enumeration + without a DEFVAL clause. + The lowest valid integer value is chosen for the + variable_info defval.

+

Own Id: OTP-5124

+

Aux Id: Seq 8738

+
+ +

[compiler] Unnecessarily reserved words in the mib compiler + can cause some enumeration definitions to fail.

+

Martin Björklund

+

Own Id: OTP-5066

+
+
+
+ +
+ Incompatibilities + + +

New sys configuration format. + Although the old configuration format still + works (if only the agent is used), it is no + longer documented and will eventually be + eliminated. + See application configuration or + configuration params for more info.

+
+ +

Three new interface modules have been introduced. One + for each of the individual parts of the application:

+ + +

[agent] snmpa

+
+ +

[manager] snmpm

+
+ +

[compiler] snmpc

+
+
+

The primary interface module, snmp, still exist. + It contains the application generic functions. The + agent specific stuff still exist (for backward + compatibility reasons), but has been deprecated and will + eventually be removed.

+

Some previously already deprecated functions has been + removed (since they in turn was dependent on deprecated + functions, see calendar).

+
+ +

[agent] The agent network interface API has changed. + See snmp agent net if,

+
+ +

[agent] The default agent audit trail log name has changed.

+
+ +

[compiler] Mib format has changed (see OTP-5053 above).

+
+
+
+
+
+ diff --git a/lib/snmp/doc/src/part.xml b/lib/snmp/doc/src/part.xml new file mode 100644 index 0000000000..603ddc7a62 --- /dev/null +++ b/lib/snmp/doc/src/part.xml @@ -0,0 +1,54 @@ + + + + +
+ + 19962009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + SNMP User's Guide + + + + + part.xml +
+ +

A multilingual Simple Network Management Protocol application, + featuring an Extensible Agent, a simple manager and a MIB + compiler and facilities for implementing SNMP MIBs etc.

+
+ + + + + + + + + + + + + + + + + +
+ diff --git a/lib/snmp/doc/src/part_notes.xml b/lib/snmp/doc/src/part_notes.xml new file mode 100644 index 0000000000..6d00e5b7e3 --- /dev/null +++ b/lib/snmp/doc/src/part_notes.xml @@ -0,0 +1,40 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + SNMP Release Notes + + + + + part_notes.xml +
+ +

A multilingual Simple Network Management Protocol application, + featuring an Extensible Agent, a simple manager and a MIB + compiler and facilities for implementing SNMP MIBs etc.

+

For information about older versions see + release notes history.

+
+ +
+ diff --git a/lib/snmp/doc/src/part_notes_history.xml b/lib/snmp/doc/src/part_notes_history.xml new file mode 100644 index 0000000000..bebd33e81b --- /dev/null +++ b/lib/snmp/doc/src/part_notes_history.xml @@ -0,0 +1,41 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + SNMP Release Notes History + + + + + + + + part_notes_history.xml +
+ +

A multilingual Simple Network Management Protocol application, + featuring an Extensible Agent, a simple manager and a MIB + compiler and facilities for implementing SNMP MIBs etc.

+
+ +
+ diff --git a/lib/snmp/doc/src/ref_man.gif b/lib/snmp/doc/src/ref_man.gif new file mode 100644 index 0000000000..b13c4efd53 Binary files /dev/null and b/lib/snmp/doc/src/ref_man.gif differ diff --git a/lib/snmp/doc/src/ref_man.xml b/lib/snmp/doc/src/ref_man.xml new file mode 100644 index 0000000000..1ae5a8205b --- /dev/null +++ b/lib/snmp/doc/src/ref_man.xml @@ -0,0 +1,71 @@ + + + + +
+ + 19962009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + SNMP Reference Manual + + + + + ref_man.xml +
+ +

A multilingual Simple Network Management Protocol + application featuring an Extensible Agent, simple manager, + a MIB compiler and facilities for implementing SNMP MIBs etc. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ diff --git a/lib/snmp/doc/src/snmp-um-1-image-1.gif b/lib/snmp/doc/src/snmp-um-1-image-1.gif new file mode 100644 index 0000000000..a633391c9a Binary files /dev/null and b/lib/snmp/doc/src/snmp-um-1-image-1.gif differ diff --git a/lib/snmp/doc/src/snmp-um-1-image-1.ps b/lib/snmp/doc/src/snmp-um-1-image-1.ps new file mode 100644 index 0000000000..13562a8366 --- /dev/null +++ b/lib/snmp/doc/src/snmp-um-1-image-1.ps @@ -0,0 +1,2912 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(r) 6.0 +%%For: (Anna Fedoriw) (Ericsson Telecom) +%%Title: (MIBcompilerPrinciples.eps) +%%CreationDate: (97-05-23) (14.05) +%%BoundingBox: 86 487 456 695 +%%HiResBoundingBox: 86.1667 487.1601 455.3333 694.8333 +%%DocumentProcessColors: Black +%%DocumentFonts: Univers +%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 +%%+ procset Adobe_typography_AI5 1.0 0 +%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 +%%+ procset Adobe_Illustrator_AI5 1.0 0 +%AI5_FileFormat 2.0 +%AI3_ColorUsage: Black&White +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 21 -12 588 802 +%AI3_DocumentPreview: Macintosh_ColorPic +%AI5_ArtSize: 595.2756 841.8898 +%AI5_RulerUnits: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI5_OpenToView: 2 796 1.5 1146 827 58 1 1 3 40 +%AI5_OpenViewLayers: 7 +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 23 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + 5 packedarray + } bind def + /setcustomcolor + { + exch aload pop pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + def + } if + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + level2? + { + gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore + add add add 4 eq + } + { + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + } ifelse + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset Adobe_typography_AI5 1.0 1 +%%Title: (Typography Operators) +%%Version: 1.0 +%%CreationDate:(03/26/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_typography_AI5 54 dict dup begin +put +/initialize +{ + begin + begin + Adobe_typography_AI5 begin + Adobe_typography_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + end + end + end + Adobe_typography_AI5 begin +} def +/terminate +{ + currentdict Adobe_typography_AI5 eq + { + end + } if +} def +/modifyEncoding +{ + /_tempEncode exch ddef + /_pntr 0 ddef + { + counttomark -1 roll + dup type dup /marktype eq + { + pop pop exit + } + { + /nametype eq + { + _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll + put + } + { + /_pntr exch ddef + } ifelse + } ifelse + } loop + _tempEncode +} def +/TE +{ + StandardEncoding 256 array copy modifyEncoding + /_nativeEncoding exch def +} def +% +/TZ +{ + dup type /arraytype eq + { + /_wv exch def + } + { + /_wv 0 def + } ifelse + /_useNativeEncoding exch def + pop pop + findfont _wv type /arraytype eq + { + _wv makeblendedfont + } if + dup length 2 add dict + begin + mark exch + { + 1 index /FID ne + { + def + } if + cleartomark mark + } forall + pop + /FontName exch def + counttomark 0 eq + { + 1 _useNativeEncoding eq + { + /Encoding _nativeEncoding def + } if + cleartomark + } + { + /Encoding load 256 array copy + modifyEncoding /Encoding exch def + } ifelse + FontName currentdict + end + definefont pop +} def +/tr +{ + _ax _ay 3 2 roll +} def +/trj +{ + _cx _cy _sp _ax _ay 6 5 roll +} def +/a0 +{ + /Tx + { + dup + currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + } ddef + /Tj + { + dup + currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + } ddef +} def +/a1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/e0 +{ + /Tx + { + tr _psf + } ddef + /Tj + { + trj _pjsf + } ddef +} def +/e1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + tr _psf + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + trj _pjsf + grestore 3 1 roll moveto tr jsp + } ddef +} def +/i0 +{ + /Tx + { + tr sp + } ddef + /Tj + { + trj jsp + } ddef +} def +/i1 +{ + W N +} def +/o0 +{ + /Tx + { + tr sw rmoveto + } ddef + /Tj + { + trj swj rmoveto + } ddef +} def +/r0 +{ + /Tx + { + tr _ctm _pss + } ddef + /Tj + { + trj _ctm _pjss + } ddef +} def +/r1 +{ + /Tx + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/To +{ + pop _ctm currentmatrix pop +} def +/TO +{ + iTe _ctm setmatrix newpath +} def +/Tp +{ + pop _tm astore pop _ctm setmatrix + _tDict begin + /W + { + } def + /h + { + } def +} def +/TP +{ + end + iTm 0 0 moveto +} def +/Tr +{ + _render 3 le + { + currentpoint newpath moveto + } if + dup 8 eq + { + pop 0 + } + { + dup 9 eq + { + pop 1 + } if + } ifelse + dup /_render exch ddef + _renderStart exch get load exec +} def +/iTm +{ + _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale +} def +/Tm +{ + _tm astore pop iTm 0 0 moveto +} def +/Td +{ + _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto +} def +/iTe +{ + _render -1 eq + { + } + { + _renderEnd _render get dup null ne + { + load exec + } + { + pop + } ifelse + } ifelse + /_render -1 ddef +} def +/Ta +{ + pop +} def +/Tf +{ + dup 1000 div /_fScl exch ddef +% + selectfont +} def +/Tl +{ + pop + 0 exch _leading astore pop +} def +/Tt +{ + pop +} def +/TW +{ + 3 npop +} def +/Tw +{ + /_cx exch ddef +} def +/TC +{ + 3 npop +} def +/Tc +{ + /_ax exch ddef +} def +/Ts +{ + /_rise exch ddef + currentpoint + iTm + moveto +} def +/Ti +{ + 3 npop +} def +/Tz +{ + 100 div /_hs exch ddef + iTm +} def +/TA +{ + pop +} def +/Tq +{ + pop +} def +/Th +{ + pop pop pop pop pop +} def +/TX +{ + pop +} def +/Tk +{ + exch pop _fScl mul neg 0 rmoveto +} def +/TK +{ + 2 npop +} def +/T* +{ + _leading aload pop neg Td +} def +/T*- +{ + _leading aload pop Td +} def +/T- +{ + _ax neg 0 rmoveto + _hyphen Tx +} def +/T+ +{ +} def +/TR +{ + _ctm currentmatrix pop + _tm astore pop + iTm 0 0 moveto +} def +/TS +{ + currentfont 3 1 roll + /_Symbol_ _fScl 1000 mul selectfont + + 0 eq + { + Tx + } + { + Tj + } ifelse + setfont +} def +/Xb +{ + pop pop +} def +/Tb /Xb load def +/Xe +{ + pop pop pop pop +} def +/Te /Xe load def +/XB +{ +} def +/TB /XB load def +currentdict readonly pop +end +setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 17 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin + + /initialize + { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 + { + dup type /arraytype eq + { + dup xcheck + { + bind + } if + } if + pop pop + } forall + } def + /terminate { end } def + + currentdict /Adobe_ColorImage_AI6_Vars known not + { + /Adobe_ColorImage_AI6_Vars 14 dict def + } if + + Adobe_ColorImage_AI6_Vars begin + /channelcount 0 def + /sourcecount 0 def + /sourcearray 4 array def + /plateindex -1 def + /XIMask 0 def + /XIBinary 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIBuffer null def + /XIDataProc null def + end + + /WalkRGBString null def + /WalkCMYKString null def + + /StuffRGBIntoGrayString null def + /RGBToGrayImageProc null def + /StuffCMYKIntoGrayString null def + /CMYKToGrayImageProc null def + /ColorImageCompositeEmulator null def + + /SeparateCMYKImageProc null def + + /FourEqual null def + /TestPlateIndex null def + + currentdict /_colorimage known not + { + /colorimage where + { + /colorimage get /_colorimage exch def + } + { + /_colorimage null def + } ifelse + } if + + /_currenttransfer systemdict /currenttransfer get def + + /colorimage null def + /XI null def + + + /WalkRGBString + { + 0 3 index + + dup length 1 sub 0 3 3 -1 roll + { + 3 getinterval { } forall + + 5 index exec + + 3 index + } for + + 5 { pop } repeat + + } def + + + /WalkCMYKString + { + 0 3 index + + dup length 1 sub 0 4 3 -1 roll + { + 4 getinterval { } forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + + } def + + + /StuffRGBIntoGrayString + { + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add + } def + + + /RGBToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 3 idiv string + dup 3 1 roll + + /StuffRGBIntoGrayString load exch + WalkRGBString + end + } def + + + /StuffCMYKIntoGrayString + { + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add + } def + + + /CMYKToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 4 idiv string + dup 3 1 roll + + /StuffCMYKIntoGrayString load exch + WalkCMYKString + end + } def + + + /ColorImageCompositeEmulator + { + pop true eq + { + Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat + } + { + Adobe_ColorImage_AI6_Vars /channelcount get 1 ne + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 3 -1 roll put + + channelcount 3 eq + { + /RGBToGrayImageProc + } + { + /CMYKToGrayImageProc + } ifelse + load + end + } if + image + } ifelse + } def + + + /SeparateCMYKImageProc + { + Adobe_ColorImage_AI6_Vars begin + + sourcecount 0 ne + { + sourcearray plateindex get exec + } + { + sourcearray 0 get exec + + dup length 4 idiv string + + 0 2 index + + plateindex 4 2 index length 1 sub + { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + + pop pop exch pop + } ifelse + end + } def + + + /FourEqual + { + 4 index ne + { + pop pop pop false + } + { + 4 index ne + { + pop pop false + } + { + 4 index ne + { + pop false + } + { + 4 index eq + } ifelse + } ifelse + } ifelse + } def + + + /TestPlateIndex + { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + + /setcmykcolor where + { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + + 1 0 0 0 FourEqual + { + /plateindex 0 def + } + { + 0 1 0 0 FourEqual + { + /plateindex 1 def + } + { + 0 0 1 0 FourEqual + { + /plateindex 2 def + } + { + 0 0 0 1 FourEqual + { + /plateindex 3 def + } + { + 0 0 0 0 FourEqual + { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end + } def + + + /colorimage + { + Adobe_ColorImage_AI6_Vars begin + /channelcount 1 index def + /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def + + 4 sourcecount add index dup + 8 eq exch 1 eq or not + end + + { + /_colorimage load null ne + { + _colorimage + } + { + Adobe_ColorImage_AI6_Vars /sourcecount get + 7 add { pop } repeat + } ifelse + } + { + dup 3 eq + TestPlateIndex + dup -1 eq exch 5 eq or or + { + /_colorimage load null eq + { + ColorImageCompositeEmulator + } + { + dup 1 eq + { + pop pop image + } + { + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + gsave + + 0 _currenttransfer exec + 1 _currenttransfer exec + eq + { 0 _currenttransfer exec 0.5 lt } + { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse + + { { pop 0 } } { { pop 1 } } ifelse + systemdict /settransfer get exec + } if + + _colorimage + + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + grestore + } if + } ifelse + } ifelse + } + { + dup 1 eq + { + pop pop + image + } + { + pop pop + + Adobe_ColorImage_AI6_Vars begin + sourcecount -1 0 + { + exch sourcearray 3 1 roll put + } for + + /SeparateCMYKImageProc load + end + + systemdict /image get exec + } ifelse + } ifelse + } ifelse + } def + + /XI + { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIMask exch 0 ne def + /XIBinary exch 0 ne def + pop + pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + + XIBitsPerPixel 1 eq + { + XIImageWidth 8 div ceiling cvi + } + { + XIImageWidth XIChannelCount mul + } ifelse + /XIBuffer exch string def + + XIBinary + { + /XIDataProc { currentfile XIBuffer readstring pop } def + currentfile 128 string readline pop pop + } + { + /XIDataProc { currentfile XIBuffer readhexstring pop } def + } ifelse + + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + XIMask + { + XIImageWidth XIImageHeight + false + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + /_lp /null ddef + _fc + /_lp /imagemask ddef + + imagemask + } + { + XIImageWidth XIImageHeight + XIBitsPerPixel + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + XIChannelCount 1 eq + { + + gsave + 0 setgray + + image + + grestore + } + { + false + XIChannelCount + colorimage + } ifelse + } ifelse + grestore + end + } def + +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin +put +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 91 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add +} def +/swj +{ + dup 4 1 roll + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add + 6 2 roll /_cnt 0 ddef + { + 1 index eq + { + /_cnt _cnt 1 add ddef + } if + } forall + pop + exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow + 3 npop +} def +/jss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + } ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow + 6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow + 2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + } ifelse + 2 copy rmoveto + } exch cshow + 5 npop +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer readline not + { + stop + } if + endString eq + { + cleartomark stop + } if + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer readline not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 4 npop + 6 1 roll + pop + 4 1 roll + pop pop pop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 3 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +end +setpacking +%%EndResource +%%EndProlog +%%BeginSetup +%%IncludeFont: Univers +Adobe_level2_AI5 /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +[ +39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +TE +%AI3_BeginEncoding: _Univers Univers +[/_Univers/Univers 0 0 1 TZ +%AI3_EndEncoding AdobeType +%AI5_Begin_NonPrinting +Np +8 Bn +%AI5_BeginGradient: (Black & White) +(Black & White) 0 2 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Green & Blue) +(Green & Blue) 0 2 Bd +[ +< +99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 +A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 +B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 +C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 +D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 +E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 +F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF +> +< +000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D +1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B +3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 +5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 +78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 +96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 +B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +[ +1 0.75 0 0 1 50 100 %_Bs +0.6 0 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Pink, Yellow, Green) +(Pink, Yellow, Green) 0 3 Bd +[ +< +00000000000000000000000000000000000000010101010101010101010101010101010101010101 +01010101010202020202020202020202020202020202020202020203030303030303030303030303 +03030303030303030404040404040404040404040404040404040404050505050505050505050505 +05050505050505060606060606060606060606060606060606060707070707070707070707070707 +07070707080808080808080808080808080808080809090909090909090909090909090909090A0A +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C +0C0C0C0C0C0C0C0D0D0D0D0D +> +< +050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 +17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F +2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A +4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 +69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 +88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 +A9AAABACADADAEAFB0B1B2B2 +> +< +CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 +B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B +9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B +7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 +5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 +3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C +0B0A09080706050403020100 +> +0 +1 %_Br +< +737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E +4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D +2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 +1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 +020201010101010000000000 +> +< +00000000000000000000000001010101010101010101010101010101010101010101010102020202 +02020202020202020202020202020202020202020202030303030303030303030303030303030303 +03030303030303030303030303040404040404040404040404040404040404040404040404040404 +04040404040404040404050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505 +> +< +BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 +C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 +C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA +CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC +CCCCCCCCCCCCCCCCCCCCCCCC +> +0 +1 %_Br +[ +0.05 0.7 0 0 1 50 100 %_Bs +0 0.02 0.8 0 1 57 36 %_Bs +0.45 0 0.75 0 1 37 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Purple, Red & Yellow) +(Purple, Red & Yellow) 0 3 Bd +[ +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A +> +< +CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 +D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC +DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 +E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED +EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 +F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE +FEFEFEFFFFFF +> +0 +1 %_Br +< +E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE +BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 +9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E +6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 +4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E +1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 +> +< +E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA +EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE +EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 +F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 +F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC +FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF +> +< +00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 +242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 +4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A +6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E +8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 +B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC +> +0 +1 %_Br +[ +0 0.04 1 0 1 50 100 %_Bs +0 1 0.8 0 1 50 50 %_Bs +0.9 0.9 0 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Rainbow) +(Rainbow) 0 6 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +0 +1 %_Br +1 +< +0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 +A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE +CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 +F7F8F9FAFBFCFDFEFF +> +0 +0 +1 %_Br +1 +< +00000000000000000000000000000000000001010101010101010101010101010101010101010101 +01010101010101010101010101010202020202020202020202020202020202020202020202020202 +02020202020202020202030303030303030303030303030303030303030303030303030303030303 +03030303030304040404040404040404040404040404040404040404040404040404040404040404 +04040505050505050505050505050505050505050505050505050505050505050505050505050606 +06060606060606060606060606060606060606060606060606060606060606060606070707070707 +07070707070707070707070707070707 +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 +1 +0 +1 %_Br +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +1 %_Br +[ +0 1 0 0 1 50 100 %_Bs +1 1 0 0 1 50 80 %_Bs +1 0.0279 0 0 1 50 60 %_Bs +1 0 1 0 1 50 40 %_Bs +0 0 1 0 1 50 20 %_Bs +0 1 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Steel Bar) +(Steel Bar) 0 3 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 70 %_Bs +0 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Orange Radial) +(Yellow & Orange Radial) 1 2 Bd +[ +0 +< +0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 +232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 +494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F +707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C +> +< +FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 +F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 +F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB +EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 +> +0 +1 %_Br +[ +0 0 1 0 1 52 19 %_Bs +0 0.55 0.9 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Purple Radial) +(Yellow & Purple Radial) 1 2 Bd +[ +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +< +1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 +393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D +5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 +83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 +A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB +CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 +F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF +> +< +ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 +908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 +7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B +5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 +403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 +25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B +0A090908070706050504030302010100 +> +0 +1 %_Br +[ +0 0.08 0.67 0 1 50 14 %_Bs +1 1 0 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_End_NonPrinting-- +%AI5_BeginPalette +0 2 Pb +Pn +Pc +1 g +Pc +0 g +Pc +0 0 0 0 k +Pc +0.75 g +Pc +0.5 g +Pc +0.25 g +Pc +0 g +Pc +Bb +2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0 0 0 k +Pc +0.5 0 0 0 k +Pc +0.75 0 0 0 k +Pc +1 0 0 0 k +Pc +0.25 0.25 0 0 k +Pc +0.5 0.5 0 0 k +Pc +0.75 0.75 0 0 k +Pc +1 1 0 0 k +Pc +Bb +2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0 0 k +Pc +0 0.5 0 0 k +Pc +0 0.75 0 0 k +Pc +0 1 0 0 k +Pc +0 0.25 0.25 0 k +Pc +0 0.5 0.5 0 k +Pc +0 0.75 0.75 0 k +Pc +0 1 1 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0 0.25 0 k +Pc +0 0 0.5 0 k +Pc +0 0 0.75 0 k +Pc +0 0 1 0 k +Pc +0.25 0 0.25 0 k +Pc +0.5 0 0.5 0 k +Pc +0.75 0 0.75 0 k +Pc +1 0 1 0 k +Pc +Bb +2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0 0 k +Pc +0.5 0.25 0 0 k +Pc +0.75 0.375 0 0 k +Pc +1 0.5 0 0 k +Pc +0.125 0.25 0 0 k +Pc +0.25 0.5 0 0 k +Pc +0.375 0.75 0 0 k +Pc +0.5 1 0 0 k +Pc +Bb +2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0.125 0 k +Pc +0 0.5 0.25 0 k +Pc +0 0.75 0.375 0 k +Pc +0 1 0.5 0 k +Pc +0 0.125 0.25 0 k +Pc +0 0.25 0.5 0 k +Pc +0 0.375 0.75 0 k +Pc +0 0.5 1 0 k +Pc +Bb +2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0 0.25 0 k +Pc +0.25 0 0.5 0 k +Pc +0.375 0 0.75 0 k +Pc +0.5 0 1 0 k +Pc +0.25 0 0.125 0 k +Pc +0.5 0 0.25 0 k +Pc +0.75 0 0.375 0 k +Pc +1 0 0.5 0 k +Pc +Bb +2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0.125 0 k +Pc +0.5 0.25 0.25 0 k +Pc +0.75 0.375 0.375 0 k +Pc +1 0.5 0.5 0 k +Pc +0.25 0.25 0.125 0 k +Pc +0.5 0.5 0.25 0 k +Pc +0.75 0.75 0.375 0 k +Pc +1 1 0.5 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0.25 0.125 0 k +Pc +0.25 0.5 0.25 0 k +Pc +0.375 0.75 0.375 0 k +Pc +0.5 1 0.5 0 k +Pc +0.125 0.25 0.25 0 k +Pc +0.25 0.5 0.5 0 k +Pc +0.375 0.75 0.75 0 k +Pc +0.5 1 1 0 k +Pc +0 0 0 0 k +Pc +0.125 0.125 0.25 0 k +Pc +0.25 0.25 0.5 0 k +Pc +0.375 0.375 0.75 0 k +Pc +0.5 0.5 1 0 k +Pc +0.25 0.125 0.25 0 k +Pc +0.5 0.25 0.5 0 k +Pc +0.75 0.375 0.75 0 k +Pc +1 0.5 1 0 k +Pc +PB +%AI5_EndPalette +%%EndSetup +%AI5_BeginLayer +1 1 1 1 0 0 0 79 128 255 Lb +(Layer 1) Ln +0 A +800 Ar +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +0 XR +-4014 283.5 m +4626 283.5 L +(N) * +453.5 4716 m +453.5 -3924 L +(N) * +85 4716 m +85 -3924 L +(N) * +-4014 765.5 m +4626 765.5 L +(N) * +1 Ap +0 O +1 g +0 R +0 G +228.6667 637.3333 m +228.6667 694.3333 L +86.6667 694.3333 L +86.6667 637.3333 L +228.6667 637.3333 L +b +454.8333 643.8333 m +454.8333 679.8333 L +255.8333 679.8333 L +255.8333 643.8333 L +454.8333 643.8333 L +b +0 Ap +214.1667 671.3333 m +B +87.1667 671.3333 m +228.6667 671.3333 l +B +1 Ap +286.105 487.6601 m +286.105 516.0065 L +192.5617 516.0065 L +192.5617 487.6601 L +286.105 487.6601 L +b +u +u +u +0 Ap +151.7708 636.6458 m +223.2708 605.1458 l +B +0 g +225.8455 605.1261 m +224.5361 606.2522 223.74 607.1081 222.7428 608.1322 c +220.6995 603.5202 l +221.2248 603.5338 223.2969 603.455 225.0105 603.2414 c +226.8449 603.0136 228.46 602.6979 229.4643 602.3956 c +228.5657 602.9365 227.2467 603.9206 225.8455 605.1261 c +f +U +U +U +u +u +0 R +0 G +355.3333 643.2083 m +254.3333 604.7083 l +S +0 O +0 g +252.4878 602.9128 m +254.2108 603.032 255.3786 602.9827 256.8077 602.9549 c +255.02 607.6718 l +254.6558 607.293 253.1265 605.8928 251.7573 604.8403 c +250.2923 603.7133 248.9215 602.8028 247.9946 602.3119 c +249.014 602.5587 250.6439 602.7856 252.4878 602.9128 c +f +U +U +u +u +0 R +0 G +239.3333 558.8333 m +239.4177 522.6094 l +S +0 O +0 g +240.4481 520.2498 m +240.9434 521.9043 241.4009 522.9799 241.9302 524.3077 c +236.8859 524.2959 l +237.1123 523.8216 237.884 521.8971 238.3868 520.245 c +238.9256 518.4768 239.295 516.8732 239.4279 515.8328 c +239.556 516.8738 239.9177 518.4791 240.4481 520.2498 c +f +U +U +0 To +1 0 0 1 91.6667 676.8333 0 Tp +TP +0 Tr +/_Univers 10 Tf +0 Ts +100 Tz +0 Tt +1 TA +%_ 0 XL +36 0 Xb +XB +0 0 5 TC +100 100 200 TW +0 0 0 Ti +0 Ta +0 0 2 2 3 Th +0 Tq +0 0 Tl +0 Tc +0 Tw +(MIB in ASN.1) Tx +(\r) TX +TO +0 To +1 0 0 1 173.6667 676.8333 0 Tp +TP +0 Tr +(file.mib) Tx +(\r) TX +TO +0 To +1 0 0 1 92.6667 660.8333 0 Tp +TP +0 Tr +/_Univers 9 Tf +(sysContact OBJECT) Tx 1 92 Tk +(-TYPE\r) Tx +0 -11 Td +( SYNT) Tx 1 74 Tk +(AX DisplayString\r) Tx +0 -11 Td +( ...) Tx +(\r) TX +TO +163.1667 670.8333 m +F +163.6667 693.8333 m +F +0 R +0 G +163.6667 694.2083 m +163.6667 671.4583 l +S +0 To +1 0 0 1 264.8333 665.8333 0 Tp +TP +0 Tr +0 O +0 g +/_Univers 10 Tf +(Association file) Tx +(\r) TX +TO +0 To +1 0 0 1 264.8333 648.8333 0 Tp +TP +0 Tr +({sysContact, {mymod, sysCFunc, []}}.) Tx +(\r) TX +TO +0 R +0 G +228.3333 516.3333 m +228.3333 501.8333 l +285.8333 501.8333 l +S +0 To +1 0 0 1 195.3333 503.8333 0 Tp +TP +0 Tr +0 O +0 g +(Binary\r) Tx +0 -12 Td +(Representation) Tx +(\r) TX +TO +0 To +1 0 0 1 234.3333 504.3333 0 Tp +TP +0 Tr +(file.bin) Tx +(\r) TX +TO +0 R +0 G +255.8333 661.3333 m +454.8333 661.3333 l +S +352.8333 679.8333 m +352.8333 661.3333 l +S +0 To +1 0 0 1 363.3333 665.8333 0 Tp +TP +0 Tr +0 O +0 g +(file.funcs) Tx +(\r) TX +TO +u +1 Ap +0 R +0 G +239.3333 559.0734 m +258.9022 559.0734 274.7664 568.5919 274.7664 580.3332 c +274.7664 592.0746 258.9022 601.5931 239.3333 601.5931 c +219.7644 601.5931 203.9002 592.0746 203.9002 580.3332 c +203.9002 568.5919 219.7644 559.0734 239.3333 559.0734 c +s +0 To +1 0 0 1 239.3333 582.8994 0 Tp +TP +-9.4434 0 Td +0 Tr +0 O +0 g +1 Ta +(MIB\r) Tx +-12.2217 -12 Td +(Compiler) Tx +(\r) TX +TO +U +LB +%AI5_EndLayer-- +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_Illustrator_AI5 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_typography_AI5 /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF diff --git a/lib/snmp/doc/src/snmp-um-1-image-2.gif b/lib/snmp/doc/src/snmp-um-1-image-2.gif new file mode 100644 index 0000000000..3c976e4355 Binary files /dev/null and b/lib/snmp/doc/src/snmp-um-1-image-2.gif differ diff --git a/lib/snmp/doc/src/snmp-um-1-image-2.ps b/lib/snmp/doc/src/snmp-um-1-image-2.ps new file mode 100644 index 0000000000..38d875eff1 --- /dev/null +++ b/lib/snmp/doc/src/snmp-um-1-image-2.ps @@ -0,0 +1,2866 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(r) 6.0 +%%For: (Anna Fedoriw) (Ericsson Telecom) +%%Title: (StartingTheAgent.eps) +%%CreationDate: (97-05-23) (14.06) +%%BoundingBox: 126 592 437 744 +%%HiResBoundingBox: 126.8422 592.4803 436.5 743.6667 +%%DocumentProcessColors: Black +%%DocumentFonts: Courier +%%+ Univers +%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 +%%+ procset Adobe_typography_AI5 1.0 0 +%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 +%%+ procset Adobe_Illustrator_AI5 1.0 0 +%AI5_FileFormat 2.0 +%AI3_ColorUsage: Black&White +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 21 -12 588 802 +%AI3_DocumentPreview: Macintosh_ColorPic +%AI5_ArtSize: 595.2756 841.8898 +%AI5_RulerUnits: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI5_OpenToView: 78 768 2 1146 827 58 1 1 3 40 +%AI5_OpenViewLayers: 7 +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 23 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + 5 packedarray + } bind def + /setcustomcolor + { + exch aload pop pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + def + } if + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + level2? + { + gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore + add add add 4 eq + } + { + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + } ifelse + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset Adobe_typography_AI5 1.0 1 +%%Title: (Typography Operators) +%%Version: 1.0 +%%CreationDate:(03/26/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_typography_AI5 54 dict dup begin +put +/initialize +{ + begin + begin + Adobe_typography_AI5 begin + Adobe_typography_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + end + end + end + Adobe_typography_AI5 begin +} def +/terminate +{ + currentdict Adobe_typography_AI5 eq + { + end + } if +} def +/modifyEncoding +{ + /_tempEncode exch ddef + /_pntr 0 ddef + { + counttomark -1 roll + dup type dup /marktype eq + { + pop pop exit + } + { + /nametype eq + { + _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll + put + } + { + /_pntr exch ddef + } ifelse + } ifelse + } loop + _tempEncode +} def +/TE +{ + StandardEncoding 256 array copy modifyEncoding + /_nativeEncoding exch def +} def +% +/TZ +{ + dup type /arraytype eq + { + /_wv exch def + } + { + /_wv 0 def + } ifelse + /_useNativeEncoding exch def + pop pop + findfont _wv type /arraytype eq + { + _wv makeblendedfont + } if + dup length 2 add dict + begin + mark exch + { + 1 index /FID ne + { + def + } if + cleartomark mark + } forall + pop + /FontName exch def + counttomark 0 eq + { + 1 _useNativeEncoding eq + { + /Encoding _nativeEncoding def + } if + cleartomark + } + { + /Encoding load 256 array copy + modifyEncoding /Encoding exch def + } ifelse + FontName currentdict + end + definefont pop +} def +/tr +{ + _ax _ay 3 2 roll +} def +/trj +{ + _cx _cy _sp _ax _ay 6 5 roll +} def +/a0 +{ + /Tx + { + dup + currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + } ddef + /Tj + { + dup + currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + } ddef +} def +/a1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/e0 +{ + /Tx + { + tr _psf + } ddef + /Tj + { + trj _pjsf + } ddef +} def +/e1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + tr _psf + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + trj _pjsf + grestore 3 1 roll moveto tr jsp + } ddef +} def +/i0 +{ + /Tx + { + tr sp + } ddef + /Tj + { + trj jsp + } ddef +} def +/i1 +{ + W N +} def +/o0 +{ + /Tx + { + tr sw rmoveto + } ddef + /Tj + { + trj swj rmoveto + } ddef +} def +/r0 +{ + /Tx + { + tr _ctm _pss + } ddef + /Tj + { + trj _ctm _pjss + } ddef +} def +/r1 +{ + /Tx + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/To +{ + pop _ctm currentmatrix pop +} def +/TO +{ + iTe _ctm setmatrix newpath +} def +/Tp +{ + pop _tm astore pop _ctm setmatrix + _tDict begin + /W + { + } def + /h + { + } def +} def +/TP +{ + end + iTm 0 0 moveto +} def +/Tr +{ + _render 3 le + { + currentpoint newpath moveto + } if + dup 8 eq + { + pop 0 + } + { + dup 9 eq + { + pop 1 + } if + } ifelse + dup /_render exch ddef + _renderStart exch get load exec +} def +/iTm +{ + _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale +} def +/Tm +{ + _tm astore pop iTm 0 0 moveto +} def +/Td +{ + _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto +} def +/iTe +{ + _render -1 eq + { + } + { + _renderEnd _render get dup null ne + { + load exec + } + { + pop + } ifelse + } ifelse + /_render -1 ddef +} def +/Ta +{ + pop +} def +/Tf +{ + dup 1000 div /_fScl exch ddef +% + selectfont +} def +/Tl +{ + pop + 0 exch _leading astore pop +} def +/Tt +{ + pop +} def +/TW +{ + 3 npop +} def +/Tw +{ + /_cx exch ddef +} def +/TC +{ + 3 npop +} def +/Tc +{ + /_ax exch ddef +} def +/Ts +{ + /_rise exch ddef + currentpoint + iTm + moveto +} def +/Ti +{ + 3 npop +} def +/Tz +{ + 100 div /_hs exch ddef + iTm +} def +/TA +{ + pop +} def +/Tq +{ + pop +} def +/Th +{ + pop pop pop pop pop +} def +/TX +{ + pop +} def +/Tk +{ + exch pop _fScl mul neg 0 rmoveto +} def +/TK +{ + 2 npop +} def +/T* +{ + _leading aload pop neg Td +} def +/T*- +{ + _leading aload pop Td +} def +/T- +{ + _ax neg 0 rmoveto + _hyphen Tx +} def +/T+ +{ +} def +/TR +{ + _ctm currentmatrix pop + _tm astore pop + iTm 0 0 moveto +} def +/TS +{ + currentfont 3 1 roll + /_Symbol_ _fScl 1000 mul selectfont + + 0 eq + { + Tx + } + { + Tj + } ifelse + setfont +} def +/Xb +{ + pop pop +} def +/Tb /Xb load def +/Xe +{ + pop pop pop pop +} def +/Te /Xe load def +/XB +{ +} def +/TB /XB load def +currentdict readonly pop +end +setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 17 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin + + /initialize + { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 + { + dup type /arraytype eq + { + dup xcheck + { + bind + } if + } if + pop pop + } forall + } def + /terminate { end } def + + currentdict /Adobe_ColorImage_AI6_Vars known not + { + /Adobe_ColorImage_AI6_Vars 14 dict def + } if + + Adobe_ColorImage_AI6_Vars begin + /channelcount 0 def + /sourcecount 0 def + /sourcearray 4 array def + /plateindex -1 def + /XIMask 0 def + /XIBinary 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIBuffer null def + /XIDataProc null def + end + + /WalkRGBString null def + /WalkCMYKString null def + + /StuffRGBIntoGrayString null def + /RGBToGrayImageProc null def + /StuffCMYKIntoGrayString null def + /CMYKToGrayImageProc null def + /ColorImageCompositeEmulator null def + + /SeparateCMYKImageProc null def + + /FourEqual null def + /TestPlateIndex null def + + currentdict /_colorimage known not + { + /colorimage where + { + /colorimage get /_colorimage exch def + } + { + /_colorimage null def + } ifelse + } if + + /_currenttransfer systemdict /currenttransfer get def + + /colorimage null def + /XI null def + + + /WalkRGBString + { + 0 3 index + + dup length 1 sub 0 3 3 -1 roll + { + 3 getinterval { } forall + + 5 index exec + + 3 index + } for + + 5 { pop } repeat + + } def + + + /WalkCMYKString + { + 0 3 index + + dup length 1 sub 0 4 3 -1 roll + { + 4 getinterval { } forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + + } def + + + /StuffRGBIntoGrayString + { + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add + } def + + + /RGBToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 3 idiv string + dup 3 1 roll + + /StuffRGBIntoGrayString load exch + WalkRGBString + end + } def + + + /StuffCMYKIntoGrayString + { + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add + } def + + + /CMYKToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 4 idiv string + dup 3 1 roll + + /StuffCMYKIntoGrayString load exch + WalkCMYKString + end + } def + + + /ColorImageCompositeEmulator + { + pop true eq + { + Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat + } + { + Adobe_ColorImage_AI6_Vars /channelcount get 1 ne + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 3 -1 roll put + + channelcount 3 eq + { + /RGBToGrayImageProc + } + { + /CMYKToGrayImageProc + } ifelse + load + end + } if + image + } ifelse + } def + + + /SeparateCMYKImageProc + { + Adobe_ColorImage_AI6_Vars begin + + sourcecount 0 ne + { + sourcearray plateindex get exec + } + { + sourcearray 0 get exec + + dup length 4 idiv string + + 0 2 index + + plateindex 4 2 index length 1 sub + { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + + pop pop exch pop + } ifelse + end + } def + + + /FourEqual + { + 4 index ne + { + pop pop pop false + } + { + 4 index ne + { + pop pop false + } + { + 4 index ne + { + pop false + } + { + 4 index eq + } ifelse + } ifelse + } ifelse + } def + + + /TestPlateIndex + { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + + /setcmykcolor where + { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + + 1 0 0 0 FourEqual + { + /plateindex 0 def + } + { + 0 1 0 0 FourEqual + { + /plateindex 1 def + } + { + 0 0 1 0 FourEqual + { + /plateindex 2 def + } + { + 0 0 0 1 FourEqual + { + /plateindex 3 def + } + { + 0 0 0 0 FourEqual + { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end + } def + + + /colorimage + { + Adobe_ColorImage_AI6_Vars begin + /channelcount 1 index def + /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def + + 4 sourcecount add index dup + 8 eq exch 1 eq or not + end + + { + /_colorimage load null ne + { + _colorimage + } + { + Adobe_ColorImage_AI6_Vars /sourcecount get + 7 add { pop } repeat + } ifelse + } + { + dup 3 eq + TestPlateIndex + dup -1 eq exch 5 eq or or + { + /_colorimage load null eq + { + ColorImageCompositeEmulator + } + { + dup 1 eq + { + pop pop image + } + { + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + gsave + + 0 _currenttransfer exec + 1 _currenttransfer exec + eq + { 0 _currenttransfer exec 0.5 lt } + { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse + + { { pop 0 } } { { pop 1 } } ifelse + systemdict /settransfer get exec + } if + + _colorimage + + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + grestore + } if + } ifelse + } ifelse + } + { + dup 1 eq + { + pop pop + image + } + { + pop pop + + Adobe_ColorImage_AI6_Vars begin + sourcecount -1 0 + { + exch sourcearray 3 1 roll put + } for + + /SeparateCMYKImageProc load + end + + systemdict /image get exec + } ifelse + } ifelse + } ifelse + } def + + /XI + { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIMask exch 0 ne def + /XIBinary exch 0 ne def + pop + pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + + XIBitsPerPixel 1 eq + { + XIImageWidth 8 div ceiling cvi + } + { + XIImageWidth XIChannelCount mul + } ifelse + /XIBuffer exch string def + + XIBinary + { + /XIDataProc { currentfile XIBuffer readstring pop } def + currentfile 128 string readline pop pop + } + { + /XIDataProc { currentfile XIBuffer readhexstring pop } def + } ifelse + + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + XIMask + { + XIImageWidth XIImageHeight + false + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + /_lp /null ddef + _fc + /_lp /imagemask ddef + + imagemask + } + { + XIImageWidth XIImageHeight + XIBitsPerPixel + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + XIChannelCount 1 eq + { + + gsave + 0 setgray + + image + + grestore + } + { + false + XIChannelCount + colorimage + } ifelse + } ifelse + grestore + end + } def + +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin +put +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 91 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add +} def +/swj +{ + dup 4 1 roll + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add + 6 2 roll /_cnt 0 ddef + { + 1 index eq + { + /_cnt _cnt 1 add ddef + } if + } forall + pop + exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow + 3 npop +} def +/jss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + } ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow + 6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow + 2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + } ifelse + 2 copy rmoveto + } exch cshow + 5 npop +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer readline not + { + stop + } if + endString eq + { + cleartomark stop + } if + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer readline not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 4 npop + 6 1 roll + pop + 4 1 roll + pop pop pop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 3 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +end +setpacking +%%EndResource +%%EndProlog +%%BeginSetup +%%IncludeFont: Courier +%%IncludeFont: Univers +Adobe_level2_AI5 /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +[ +39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +TE +%AI3_BeginEncoding: _Courier Courier +[/_Courier/Courier 0 0 1 TZ +%AI3_EndEncoding TrueType +%AI3_BeginEncoding: _Univers Univers +[/_Univers/Univers 0 0 1 TZ +%AI3_EndEncoding AdobeType +%AI5_Begin_NonPrinting +Np +8 Bn +%AI5_BeginGradient: (Black & White) +(Black & White) 0 2 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Green & Blue) +(Green & Blue) 0 2 Bd +[ +< +99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 +A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 +B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 +C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 +D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 +E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 +F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF +> +< +000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D +1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B +3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 +5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 +78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 +96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 +B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +[ +1 0.75 0 0 1 50 100 %_Bs +0.6 0 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Pink, Yellow, Green) +(Pink, Yellow, Green) 0 3 Bd +[ +< +00000000000000000000000000000000000000010101010101010101010101010101010101010101 +01010101010202020202020202020202020202020202020202020203030303030303030303030303 +03030303030303030404040404040404040404040404040404040404050505050505050505050505 +05050505050505060606060606060606060606060606060606060707070707070707070707070707 +07070707080808080808080808080808080808080809090909090909090909090909090909090A0A +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C +0C0C0C0C0C0C0C0D0D0D0D0D +> +< +050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 +17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F +2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A +4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 +69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 +88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 +A9AAABACADADAEAFB0B1B2B2 +> +< +CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 +B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B +9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B +7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 +5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 +3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C +0B0A09080706050403020100 +> +0 +1 %_Br +< +737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E +4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D +2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 +1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 +020201010101010000000000 +> +< +00000000000000000000000001010101010101010101010101010101010101010101010102020202 +02020202020202020202020202020202020202020202030303030303030303030303030303030303 +03030303030303030303030303040404040404040404040404040404040404040404040404040404 +04040404040404040404050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505 +> +< +BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 +C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 +C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA +CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC +CCCCCCCCCCCCCCCCCCCCCCCC +> +0 +1 %_Br +[ +0.05 0.7 0 0 1 50 100 %_Bs +0 0.02 0.8 0 1 57 36 %_Bs +0.45 0 0.75 0 1 37 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Purple, Red & Yellow) +(Purple, Red & Yellow) 0 3 Bd +[ +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A +> +< +CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 +D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC +DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 +E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED +EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 +F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE +FEFEFEFFFFFF +> +0 +1 %_Br +< +E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE +BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 +9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E +6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 +4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E +1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 +> +< +E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA +EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE +EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 +F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 +F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC +FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF +> +< +00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 +242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 +4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A +6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E +8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 +B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC +> +0 +1 %_Br +[ +0 0.04 1 0 1 50 100 %_Bs +0 1 0.8 0 1 50 50 %_Bs +0.9 0.9 0 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Rainbow) +(Rainbow) 0 6 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +0 +1 %_Br +1 +< +0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 +A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE +CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 +F7F8F9FAFBFCFDFEFF +> +0 +0 +1 %_Br +1 +< +00000000000000000000000000000000000001010101010101010101010101010101010101010101 +01010101010101010101010101010202020202020202020202020202020202020202020202020202 +02020202020202020202030303030303030303030303030303030303030303030303030303030303 +03030303030304040404040404040404040404040404040404040404040404040404040404040404 +04040505050505050505050505050505050505050505050505050505050505050505050505050606 +06060606060606060606060606060606060606060606060606060606060606060606070707070707 +07070707070707070707070707070707 +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 +1 +0 +1 %_Br +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +1 %_Br +[ +0 1 0 0 1 50 100 %_Bs +1 1 0 0 1 50 80 %_Bs +1 0.0279 0 0 1 50 60 %_Bs +1 0 1 0 1 50 40 %_Bs +0 0 1 0 1 50 20 %_Bs +0 1 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Steel Bar) +(Steel Bar) 0 3 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 70 %_Bs +0 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Orange Radial) +(Yellow & Orange Radial) 1 2 Bd +[ +0 +< +0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 +232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 +494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F +707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C +> +< +FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 +F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 +F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB +EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 +> +0 +1 %_Br +[ +0 0 1 0 1 52 19 %_Bs +0 0.55 0.9 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Purple Radial) +(Yellow & Purple Radial) 1 2 Bd +[ +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +< +1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 +393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D +5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 +83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 +A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB +CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 +F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF +> +< +ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 +908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 +7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B +5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 +403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 +25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B +0A090908070706050504030302010100 +> +0 +1 %_Br +[ +0 0.08 0.67 0 1 50 14 %_Bs +1 1 0 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_End_NonPrinting-- +%AI5_BeginPalette +0 0 Pb +Pn +Pc +1 g +Pc +0 g +Pc +0 0 0 0 k +Pc +0.75 g +Pc +0.5 g +Pc +0.25 g +Pc +0 g +Pc +Bb +2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0 0 0 k +Pc +0.5 0 0 0 k +Pc +0.75 0 0 0 k +Pc +1 0 0 0 k +Pc +0.25 0.25 0 0 k +Pc +0.5 0.5 0 0 k +Pc +0.75 0.75 0 0 k +Pc +1 1 0 0 k +Pc +Bb +2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0 0 k +Pc +0 0.5 0 0 k +Pc +0 0.75 0 0 k +Pc +0 1 0 0 k +Pc +0 0.25 0.25 0 k +Pc +0 0.5 0.5 0 k +Pc +0 0.75 0.75 0 k +Pc +0 1 1 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0 0.25 0 k +Pc +0 0 0.5 0 k +Pc +0 0 0.75 0 k +Pc +0 0 1 0 k +Pc +0.25 0 0.25 0 k +Pc +0.5 0 0.5 0 k +Pc +0.75 0 0.75 0 k +Pc +1 0 1 0 k +Pc +Bb +2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0 0 k +Pc +0.5 0.25 0 0 k +Pc +0.75 0.375 0 0 k +Pc +1 0.5 0 0 k +Pc +0.125 0.25 0 0 k +Pc +0.25 0.5 0 0 k +Pc +0.375 0.75 0 0 k +Pc +0.5 1 0 0 k +Pc +Bb +2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0.125 0 k +Pc +0 0.5 0.25 0 k +Pc +0 0.75 0.375 0 k +Pc +0 1 0.5 0 k +Pc +0 0.125 0.25 0 k +Pc +0 0.25 0.5 0 k +Pc +0 0.375 0.75 0 k +Pc +0 0.5 1 0 k +Pc +Bb +2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0 0.25 0 k +Pc +0.25 0 0.5 0 k +Pc +0.375 0 0.75 0 k +Pc +0.5 0 1 0 k +Pc +0.25 0 0.125 0 k +Pc +0.5 0 0.25 0 k +Pc +0.75 0 0.375 0 k +Pc +1 0 0.5 0 k +Pc +Bb +2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0.125 0 k +Pc +0.5 0.25 0.25 0 k +Pc +0.75 0.375 0.375 0 k +Pc +1 0.5 0.5 0 k +Pc +0.25 0.25 0.125 0 k +Pc +0.5 0.5 0.25 0 k +Pc +0.75 0.75 0.375 0 k +Pc +1 1 0.5 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0.25 0.125 0 k +Pc +0.25 0.5 0.25 0 k +Pc +0.375 0.75 0.375 0 k +Pc +0.5 1 0.5 0 k +Pc +0.125 0.25 0.25 0 k +Pc +0.25 0.5 0.5 0 k +Pc +0.375 0.75 0.75 0 k +Pc +0.5 1 1 0 k +Pc +0 0 0 0 k +Pc +0.125 0.125 0.25 0 k +Pc +0.25 0.25 0.5 0 k +Pc +0.375 0.375 0.75 0 k +Pc +0.5 0.5 1 0 k +Pc +0.25 0.125 0.25 0 k +Pc +0.5 0.25 0.5 0 k +Pc +0.75 0.375 0.75 0 k +Pc +1 0.5 1 0 k +Pc +PB +%AI5_EndPalette +%%EndSetup +%AI5_BeginLayer +1 1 1 1 0 0 0 79 128 255 Lb +(Layer 1) Ln +0 A +800 Ar +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +0 XR +-4014 283.5 m +4626 283.5 L +(N) * +453.5 4716 m +453.5 -3924 L +(N) * +85 4716 m +85 -3924 L +(N) * +-4014 765.5 m +4626 765.5 L +(N) * +1 Ap +0 O +1 g +0 R +0 G +220.8907 672 m +220.8907 703 L +127.6667 703 L +127.3474 672 L +220.8907 672 L +b +0 Ap +163.119 702.4773 m +163.119 687.9773 l +220.619 687.9773 l +S +0 To +1 0 0 1 130.119 689.9773 0 Tp +TP +0 Tr +0 O +0 g +/_Univers 10 Tf +0 Ts +100 Tz +0 Tt +1 TA +%_ 0 XL +36 0 Xb +XB +0 0 5 TC +100 100 200 TW +0 0 0 Ti +0 Ta +0 0 2 2 3 Th +0 Tq +0 0 Tl +0 Tc +0 Tw +(Binary\r) Tx +0 -12 Td +(Representation) Tx +(\r) TX +TO +0 To +1 0 0 1 169.119 690.4773 0 Tp +TP +0 Tr +(file.bin) Tx +(\r) TX +TO +1 Ap +1 g +0 R +0 G +436 672 m +436 743.1667 L +237 743.1667 L +237 672 L +436 672 L +b +0 To +1 0 0 1 246 730.5 0 Tp +TP +0 Tr +0 g +(Instrumentation) Tx +(\r) TX +TO +0 To +1 0 0 1 246 713.5 0 Tp +TP +0 Tr +/_Courier 10 Tf +(sysCFunc\(get, ...\) ->) Tx +(\r) TX +0 -12 Td +( ;) Tx +(\r) TX +0 -12 Td +(sysCFunc\(set, ...\) ->) Tx +(\r) TX +0 -12 Td +( .) Tx +(\r) TX +TO +0 Ap +0 R +0 G +237 726 m +436 726 l +S +334 743 m +334 726 l +S +0 To +1 0 0 1 344.5 730.5 0 Tp +TP +0 Tr +0 O +0 g +/_Univers 10 Tf +(mymod.beam) Tx +(\r) TX +TO +u +u +u +u +1 g +0 R +0 G +170 672 m +248.8065 637.7501 l +B +0 g +251.3813 637.7486 m +250.0639 638.8655 249.2617 639.7157 248.2574 640.7327 c +246.2468 636.1064 l +246.772 636.1237 248.8445 636.0596 250.5596 635.8582 c +252.3955 635.6433 254.0128 635.339 255.0193 635.0439 c +254.1168 635.5784 252.791 636.5532 251.3813 637.7486 c +f +U +U +U +U +u +u +u +0 R +0 G +368.3333 672 m +289.672 637.3964 l +S +0 O +0 g +287.9227 635.5072 m +289.637 635.716 290.8059 635.7276 292.2345 635.7744 c +290.2033 640.3917 l +289.8594 639.9944 288.4051 638.5164 287.0927 637.394 c +285.6884 636.192 284.3669 635.2113 283.4669 634.6728 c +284.472 634.9724 286.0879 635.2839 287.9227 635.5072 c +f +U +U +U +u +1 Ap +0 R +0 G +268 592.9803 m +287.5689 592.9803 303.4331 602.4988 303.4331 614.2401 c +303.4331 625.9815 287.5689 635.5 268 635.5 c +248.4311 635.5 232.5669 625.9815 232.5669 614.2401 c +232.5669 602.4988 248.4311 592.9803 268 592.9803 c +s +0 To +1 0 0 1 268 610.8063 0 Tp +TP +-14.1614 0 Td +0 Tr +0 O +0 g +1 Ta +(Agent) Tx +(\r) TX +TO +U +LB +%AI5_EndLayer-- +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_Illustrator_AI5 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_typography_AI5 /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF diff --git a/lib/snmp/doc/src/snmp-um-1-image-3.gif b/lib/snmp/doc/src/snmp-um-1-image-3.gif new file mode 100644 index 0000000000..47f94bcf06 Binary files /dev/null and b/lib/snmp/doc/src/snmp-um-1-image-3.gif differ diff --git a/lib/snmp/doc/src/snmp-um-1-image-3.ps b/lib/snmp/doc/src/snmp-um-1-image-3.ps new file mode 100644 index 0000000000..6c63c88f87 --- /dev/null +++ b/lib/snmp/doc/src/snmp-um-1-image-3.ps @@ -0,0 +1,3400 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(r) 6.0 +%%For: (Anna Fedoriw) (Ericsson Telecom) +%%Title: (Architecture.eps) +%%CreationDate: (97-05-23) (14.03) +%%BoundingBox: 93 465 440 765 +%%HiResBoundingBox: 93.3333 465.1667 439.8333 764.3677 +%%DocumentProcessColors: Black +%%DocumentFonts: Univers +%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 +%%+ procset Adobe_typography_AI5 1.0 0 +%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 +%%+ procset Adobe_Illustrator_AI5 1.0 0 +%AI5_FileFormat 2.0 +%AI3_ColorUsage: Black&White +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 21 -12 588 802 +%AI3_DocumentPreview: Macintosh_ColorPic +%AI5_ArtSize: 595.2756 841.8898 +%AI5_RulerUnits: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI5_OpenToView: 194 764 3 1146 827 58 1 1 3 40 +%AI5_OpenViewLayers: 7 +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 23 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + 5 packedarray + } bind def + /setcustomcolor + { + exch aload pop pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + def + } if + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + level2? + { + gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore + add add add 4 eq + } + { + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + } ifelse + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset Adobe_typography_AI5 1.0 1 +%%Title: (Typography Operators) +%%Version: 1.0 +%%CreationDate:(03/26/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_typography_AI5 54 dict dup begin +put +/initialize +{ + begin + begin + Adobe_typography_AI5 begin + Adobe_typography_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + end + end + end + Adobe_typography_AI5 begin +} def +/terminate +{ + currentdict Adobe_typography_AI5 eq + { + end + } if +} def +/modifyEncoding +{ + /_tempEncode exch ddef + /_pntr 0 ddef + { + counttomark -1 roll + dup type dup /marktype eq + { + pop pop exit + } + { + /nametype eq + { + _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll + put + } + { + /_pntr exch ddef + } ifelse + } ifelse + } loop + _tempEncode +} def +/TE +{ + StandardEncoding 256 array copy modifyEncoding + /_nativeEncoding exch def +} def +% +/TZ +{ + dup type /arraytype eq + { + /_wv exch def + } + { + /_wv 0 def + } ifelse + /_useNativeEncoding exch def + pop pop + findfont _wv type /arraytype eq + { + _wv makeblendedfont + } if + dup length 2 add dict + begin + mark exch + { + 1 index /FID ne + { + def + } if + cleartomark mark + } forall + pop + /FontName exch def + counttomark 0 eq + { + 1 _useNativeEncoding eq + { + /Encoding _nativeEncoding def + } if + cleartomark + } + { + /Encoding load 256 array copy + modifyEncoding /Encoding exch def + } ifelse + FontName currentdict + end + definefont pop +} def +/tr +{ + _ax _ay 3 2 roll +} def +/trj +{ + _cx _cy _sp _ax _ay 6 5 roll +} def +/a0 +{ + /Tx + { + dup + currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + } ddef + /Tj + { + dup + currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + } ddef +} def +/a1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/e0 +{ + /Tx + { + tr _psf + } ddef + /Tj + { + trj _pjsf + } ddef +} def +/e1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + tr _psf + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + trj _pjsf + grestore 3 1 roll moveto tr jsp + } ddef +} def +/i0 +{ + /Tx + { + tr sp + } ddef + /Tj + { + trj jsp + } ddef +} def +/i1 +{ + W N +} def +/o0 +{ + /Tx + { + tr sw rmoveto + } ddef + /Tj + { + trj swj rmoveto + } ddef +} def +/r0 +{ + /Tx + { + tr _ctm _pss + } ddef + /Tj + { + trj _ctm _pjss + } ddef +} def +/r1 +{ + /Tx + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/To +{ + pop _ctm currentmatrix pop +} def +/TO +{ + iTe _ctm setmatrix newpath +} def +/Tp +{ + pop _tm astore pop _ctm setmatrix + _tDict begin + /W + { + } def + /h + { + } def +} def +/TP +{ + end + iTm 0 0 moveto +} def +/Tr +{ + _render 3 le + { + currentpoint newpath moveto + } if + dup 8 eq + { + pop 0 + } + { + dup 9 eq + { + pop 1 + } if + } ifelse + dup /_render exch ddef + _renderStart exch get load exec +} def +/iTm +{ + _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale +} def +/Tm +{ + _tm astore pop iTm 0 0 moveto +} def +/Td +{ + _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto +} def +/iTe +{ + _render -1 eq + { + } + { + _renderEnd _render get dup null ne + { + load exec + } + { + pop + } ifelse + } ifelse + /_render -1 ddef +} def +/Ta +{ + pop +} def +/Tf +{ + dup 1000 div /_fScl exch ddef +% + selectfont +} def +/Tl +{ + pop + 0 exch _leading astore pop +} def +/Tt +{ + pop +} def +/TW +{ + 3 npop +} def +/Tw +{ + /_cx exch ddef +} def +/TC +{ + 3 npop +} def +/Tc +{ + /_ax exch ddef +} def +/Ts +{ + /_rise exch ddef + currentpoint + iTm + moveto +} def +/Ti +{ + 3 npop +} def +/Tz +{ + 100 div /_hs exch ddef + iTm +} def +/TA +{ + pop +} def +/Tq +{ + pop +} def +/Th +{ + pop pop pop pop pop +} def +/TX +{ + pop +} def +/Tk +{ + exch pop _fScl mul neg 0 rmoveto +} def +/TK +{ + 2 npop +} def +/T* +{ + _leading aload pop neg Td +} def +/T*- +{ + _leading aload pop Td +} def +/T- +{ + _ax neg 0 rmoveto + _hyphen Tx +} def +/T+ +{ +} def +/TR +{ + _ctm currentmatrix pop + _tm astore pop + iTm 0 0 moveto +} def +/TS +{ + currentfont 3 1 roll + /_Symbol_ _fScl 1000 mul selectfont + + 0 eq + { + Tx + } + { + Tj + } ifelse + setfont +} def +/Xb +{ + pop pop +} def +/Tb /Xb load def +/Xe +{ + pop pop pop pop +} def +/Te /Xe load def +/XB +{ +} def +/TB /XB load def +currentdict readonly pop +end +setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 17 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin + + /initialize + { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 + { + dup type /arraytype eq + { + dup xcheck + { + bind + } if + } if + pop pop + } forall + } def + /terminate { end } def + + currentdict /Adobe_ColorImage_AI6_Vars known not + { + /Adobe_ColorImage_AI6_Vars 14 dict def + } if + + Adobe_ColorImage_AI6_Vars begin + /channelcount 0 def + /sourcecount 0 def + /sourcearray 4 array def + /plateindex -1 def + /XIMask 0 def + /XIBinary 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIBuffer null def + /XIDataProc null def + end + + /WalkRGBString null def + /WalkCMYKString null def + + /StuffRGBIntoGrayString null def + /RGBToGrayImageProc null def + /StuffCMYKIntoGrayString null def + /CMYKToGrayImageProc null def + /ColorImageCompositeEmulator null def + + /SeparateCMYKImageProc null def + + /FourEqual null def + /TestPlateIndex null def + + currentdict /_colorimage known not + { + /colorimage where + { + /colorimage get /_colorimage exch def + } + { + /_colorimage null def + } ifelse + } if + + /_currenttransfer systemdict /currenttransfer get def + + /colorimage null def + /XI null def + + + /WalkRGBString + { + 0 3 index + + dup length 1 sub 0 3 3 -1 roll + { + 3 getinterval { } forall + + 5 index exec + + 3 index + } for + + 5 { pop } repeat + + } def + + + /WalkCMYKString + { + 0 3 index + + dup length 1 sub 0 4 3 -1 roll + { + 4 getinterval { } forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + + } def + + + /StuffRGBIntoGrayString + { + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add + } def + + + /RGBToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 3 idiv string + dup 3 1 roll + + /StuffRGBIntoGrayString load exch + WalkRGBString + end + } def + + + /StuffCMYKIntoGrayString + { + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add + } def + + + /CMYKToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 4 idiv string + dup 3 1 roll + + /StuffCMYKIntoGrayString load exch + WalkCMYKString + end + } def + + + /ColorImageCompositeEmulator + { + pop true eq + { + Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat + } + { + Adobe_ColorImage_AI6_Vars /channelcount get 1 ne + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 3 -1 roll put + + channelcount 3 eq + { + /RGBToGrayImageProc + } + { + /CMYKToGrayImageProc + } ifelse + load + end + } if + image + } ifelse + } def + + + /SeparateCMYKImageProc + { + Adobe_ColorImage_AI6_Vars begin + + sourcecount 0 ne + { + sourcearray plateindex get exec + } + { + sourcearray 0 get exec + + dup length 4 idiv string + + 0 2 index + + plateindex 4 2 index length 1 sub + { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + + pop pop exch pop + } ifelse + end + } def + + + /FourEqual + { + 4 index ne + { + pop pop pop false + } + { + 4 index ne + { + pop pop false + } + { + 4 index ne + { + pop false + } + { + 4 index eq + } ifelse + } ifelse + } ifelse + } def + + + /TestPlateIndex + { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + + /setcmykcolor where + { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + + 1 0 0 0 FourEqual + { + /plateindex 0 def + } + { + 0 1 0 0 FourEqual + { + /plateindex 1 def + } + { + 0 0 1 0 FourEqual + { + /plateindex 2 def + } + { + 0 0 0 1 FourEqual + { + /plateindex 3 def + } + { + 0 0 0 0 FourEqual + { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end + } def + + + /colorimage + { + Adobe_ColorImage_AI6_Vars begin + /channelcount 1 index def + /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def + + 4 sourcecount add index dup + 8 eq exch 1 eq or not + end + + { + /_colorimage load null ne + { + _colorimage + } + { + Adobe_ColorImage_AI6_Vars /sourcecount get + 7 add { pop } repeat + } ifelse + } + { + dup 3 eq + TestPlateIndex + dup -1 eq exch 5 eq or or + { + /_colorimage load null eq + { + ColorImageCompositeEmulator + } + { + dup 1 eq + { + pop pop image + } + { + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + gsave + + 0 _currenttransfer exec + 1 _currenttransfer exec + eq + { 0 _currenttransfer exec 0.5 lt } + { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse + + { { pop 0 } } { { pop 1 } } ifelse + systemdict /settransfer get exec + } if + + _colorimage + + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + grestore + } if + } ifelse + } ifelse + } + { + dup 1 eq + { + pop pop + image + } + { + pop pop + + Adobe_ColorImage_AI6_Vars begin + sourcecount -1 0 + { + exch sourcearray 3 1 roll put + } for + + /SeparateCMYKImageProc load + end + + systemdict /image get exec + } ifelse + } ifelse + } ifelse + } def + + /XI + { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIMask exch 0 ne def + /XIBinary exch 0 ne def + pop + pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + + XIBitsPerPixel 1 eq + { + XIImageWidth 8 div ceiling cvi + } + { + XIImageWidth XIChannelCount mul + } ifelse + /XIBuffer exch string def + + XIBinary + { + /XIDataProc { currentfile XIBuffer readstring pop } def + currentfile 128 string readline pop pop + } + { + /XIDataProc { currentfile XIBuffer readhexstring pop } def + } ifelse + + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + XIMask + { + XIImageWidth XIImageHeight + false + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + /_lp /null ddef + _fc + /_lp /imagemask ddef + + imagemask + } + { + XIImageWidth XIImageHeight + XIBitsPerPixel + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + XIChannelCount 1 eq + { + + gsave + 0 setgray + + image + + grestore + } + { + false + XIChannelCount + colorimage + } ifelse + } ifelse + grestore + end + } def + +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin +put +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 91 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add +} def +/swj +{ + dup 4 1 roll + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add + 6 2 roll /_cnt 0 ddef + { + 1 index eq + { + /_cnt _cnt 1 add ddef + } if + } forall + pop + exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow + 3 npop +} def +/jss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + } ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow + 6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow + 2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + } ifelse + 2 copy rmoveto + } exch cshow + 5 npop +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer readline not + { + stop + } if + endString eq + { + cleartomark stop + } if + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer readline not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 4 npop + 6 1 roll + pop + 4 1 roll + pop pop pop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 3 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +end +setpacking +%%EndResource +%%EndProlog +%%BeginSetup +%%IncludeFont: Univers +Adobe_level2_AI5 /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +[ +39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +TE +%AI3_BeginEncoding: _Univers Univers +[/_Univers/Univers 0 0 1 TZ +%AI3_EndEncoding AdobeType +%AI5_Begin_NonPrinting +Np +8 Bn +%AI5_BeginGradient: (Black & White) +(Black & White) 0 2 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Green & Blue) +(Green & Blue) 0 2 Bd +[ +< +99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 +A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 +B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 +C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 +D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 +E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 +F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF +> +< +000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D +1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B +3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 +5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 +78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 +96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 +B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +[ +1 0.75 0 0 1 50 100 %_Bs +0.6 0 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Pink, Yellow, Green) +(Pink, Yellow, Green) 0 3 Bd +[ +< +00000000000000000000000000000000000000010101010101010101010101010101010101010101 +01010101010202020202020202020202020202020202020202020203030303030303030303030303 +03030303030303030404040404040404040404040404040404040404050505050505050505050505 +05050505050505060606060606060606060606060606060606060707070707070707070707070707 +07070707080808080808080808080808080808080809090909090909090909090909090909090A0A +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C +0C0C0C0C0C0C0C0D0D0D0D0D +> +< +050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 +17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F +2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A +4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 +69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 +88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 +A9AAABACADADAEAFB0B1B2B2 +> +< +CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 +B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B +9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B +7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 +5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 +3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C +0B0A09080706050403020100 +> +0 +1 %_Br +< +737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E +4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D +2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 +1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 +020201010101010000000000 +> +< +00000000000000000000000001010101010101010101010101010101010101010101010102020202 +02020202020202020202020202020202020202020202030303030303030303030303030303030303 +03030303030303030303030303040404040404040404040404040404040404040404040404040404 +04040404040404040404050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505 +> +< +BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 +C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 +C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA +CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC +CCCCCCCCCCCCCCCCCCCCCCCC +> +0 +1 %_Br +[ +0.05 0.7 0 0 1 50 100 %_Bs +0 0.02 0.8 0 1 57 36 %_Bs +0.45 0 0.75 0 1 37 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Purple, Red & Yellow) +(Purple, Red & Yellow) 0 3 Bd +[ +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A +> +< +CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 +D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC +DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 +E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED +EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 +F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE +FEFEFEFFFFFF +> +0 +1 %_Br +< +E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE +BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 +9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E +6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 +4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E +1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 +> +< +E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA +EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE +EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 +F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 +F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC +FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF +> +< +00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 +242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 +4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A +6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E +8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 +B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC +> +0 +1 %_Br +[ +0 0.04 1 0 1 50 100 %_Bs +0 1 0.8 0 1 50 50 %_Bs +0.9 0.9 0 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Rainbow) +(Rainbow) 0 6 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +0 +1 %_Br +1 +< +0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 +A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE +CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 +F7F8F9FAFBFCFDFEFF +> +0 +0 +1 %_Br +1 +< +00000000000000000000000000000000000001010101010101010101010101010101010101010101 +01010101010101010101010101010202020202020202020202020202020202020202020202020202 +02020202020202020202030303030303030303030303030303030303030303030303030303030303 +03030303030304040404040404040404040404040404040404040404040404040404040404040404 +04040505050505050505050505050505050505050505050505050505050505050505050505050606 +06060606060606060606060606060606060606060606060606060606060606060606070707070707 +07070707070707070707070707070707 +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 +1 +0 +1 %_Br +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +1 %_Br +[ +0 1 0 0 1 50 100 %_Bs +1 1 0 0 1 50 80 %_Bs +1 0.0279 0 0 1 50 60 %_Bs +1 0 1 0 1 50 40 %_Bs +0 0 1 0 1 50 20 %_Bs +0 1 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Steel Bar) +(Steel Bar) 0 3 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 70 %_Bs +0 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Orange Radial) +(Yellow & Orange Radial) 1 2 Bd +[ +0 +< +0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 +232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 +494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F +707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C +> +< +FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 +F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 +F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB +EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 +> +0 +1 %_Br +[ +0 0 1 0 1 52 19 %_Bs +0 0.55 0.9 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Purple Radial) +(Yellow & Purple Radial) 1 2 Bd +[ +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +< +1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 +393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D +5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 +83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 +A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB +CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 +F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF +> +< +ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 +908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 +7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B +5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 +403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 +25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B +0A090908070706050504030302010100 +> +0 +1 %_Br +[ +0 0.08 0.67 0 1 50 14 %_Bs +1 1 0 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_End_NonPrinting-- +%AI5_BeginPalette +0 0 Pb +Pn +Pc +1 g +Pc +0 g +Pc +0 0 0 0 k +Pc +0.75 g +Pc +0.5 g +Pc +0.25 g +Pc +0 g +Pc +Bb +2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0 0 0 k +Pc +0.5 0 0 0 k +Pc +0.75 0 0 0 k +Pc +1 0 0 0 k +Pc +0.25 0.25 0 0 k +Pc +0.5 0.5 0 0 k +Pc +0.75 0.75 0 0 k +Pc +1 1 0 0 k +Pc +Bb +2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0 0 k +Pc +0 0.5 0 0 k +Pc +0 0.75 0 0 k +Pc +0 1 0 0 k +Pc +0 0.25 0.25 0 k +Pc +0 0.5 0.5 0 k +Pc +0 0.75 0.75 0 k +Pc +0 1 1 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0 0.25 0 k +Pc +0 0 0.5 0 k +Pc +0 0 0.75 0 k +Pc +0 0 1 0 k +Pc +0.25 0 0.25 0 k +Pc +0.5 0 0.5 0 k +Pc +0.75 0 0.75 0 k +Pc +1 0 1 0 k +Pc +Bb +2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0 0 k +Pc +0.5 0.25 0 0 k +Pc +0.75 0.375 0 0 k +Pc +1 0.5 0 0 k +Pc +0.125 0.25 0 0 k +Pc +0.25 0.5 0 0 k +Pc +0.375 0.75 0 0 k +Pc +0.5 1 0 0 k +Pc +Bb +2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0.125 0 k +Pc +0 0.5 0.25 0 k +Pc +0 0.75 0.375 0 k +Pc +0 1 0.5 0 k +Pc +0 0.125 0.25 0 k +Pc +0 0.25 0.5 0 k +Pc +0 0.375 0.75 0 k +Pc +0 0.5 1 0 k +Pc +Bb +2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0 0.25 0 k +Pc +0.25 0 0.5 0 k +Pc +0.375 0 0.75 0 k +Pc +0.5 0 1 0 k +Pc +0.25 0 0.125 0 k +Pc +0.5 0 0.25 0 k +Pc +0.75 0 0.375 0 k +Pc +1 0 0.5 0 k +Pc +Bb +2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0.125 0 k +Pc +0.5 0.25 0.25 0 k +Pc +0.75 0.375 0.375 0 k +Pc +1 0.5 0.5 0 k +Pc +0.25 0.25 0.125 0 k +Pc +0.5 0.5 0.25 0 k +Pc +0.75 0.75 0.375 0 k +Pc +1 1 0.5 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0.25 0.125 0 k +Pc +0.25 0.5 0.25 0 k +Pc +0.375 0.75 0.375 0 k +Pc +0.5 1 0.5 0 k +Pc +0.125 0.25 0.25 0 k +Pc +0.25 0.5 0.5 0 k +Pc +0.375 0.75 0.75 0 k +Pc +0.5 1 1 0 k +Pc +0 0 0 0 k +Pc +0.125 0.125 0.25 0 k +Pc +0.25 0.25 0.5 0 k +Pc +0.375 0.375 0.75 0 k +Pc +0.5 0.5 1 0 k +Pc +0.25 0.125 0.25 0 k +Pc +0.5 0.25 0.5 0 k +Pc +0.75 0.375 0.75 0 k +Pc +1 0.5 1 0 k +Pc +PB +%AI5_EndPalette +%%EndSetup +%AI5_BeginLayer +1 1 1 1 0 0 0 79 128 255 Lb +(Layer 1) Ln +0 A +800 Ar +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +0 XR +-4014 283.5 m +4626 283.5 L +(N) * +453.5 4716 m +453.5 -3924 L +(N) * +85 4716 m +85 -3924 L +(N) * +-4014 765.5 m +4626 765.5 L +(N) * +1 Ap +0 R +0 G +[6 8 6 8 6 8 ]0 d +439.3333 689 m +439.3333 751 L +354 751 L +354 689 L +439.3333 689 L +s +322 523 m +322 734.3333 L +107.6667 734.3333 L +107.6667 523 L +322 523 L +s +u +0 Ap +1.1 w []0 d +137.6876 560.816 m +114.2154 572.6036 L +114.2154 595.9724 L +137.6876 607.7602 L +161.1596 595.9724 L +161.1596 572.6036 L +137.6876 560.816 L +s +0 To +1 0 0 1 137.6875 586.8542 0 Tp +TP +-21.665 0 Td +0 Tr +0 O +0 g +1 w +/_Univers 10 Tf +0 Ts +100 Tz +0 Tt +1 TA +%_ 0 XL +36 0 Xb +XB +0 0 5 TC +100 100 200 TW +0 0 0 Ti +1 Ta +0 0 2 2 3 Th +0 Tq +0 0 Tl +0 Tc +0 Tw +(Standard\r) Tx +12.2217 -12 Td +(MIB) Tx +(\r) TX +TO +U +u +0 R +0 G +261.6169 564.0939 m +244.5463 572.6667 L +244.5463 589.6621 L +261.6169 598.235 L +278.6875 589.6621 L +278.6875 572.6667 L +261.6169 564.0939 L +s +0 To +1 0 0 1 252.1735 577.7306 0 Tp +TP +0 Tr +0 O +0 g +0 Ta +(MIB) Tx +(\r) TX +TO +U +u +0 R +0 G +298.4248 564.0939 m +281.3542 572.6667 L +281.3542 589.6621 L +298.4248 598.235 L +315.4954 589.6621 L +315.4954 572.6667 L +298.4248 564.0939 L +s +0 To +1 0 0 1 288.9813 577.7306 0 Tp +TP +0 Tr +0 O +0 g +(MIB) Tx +(\r) TX +TO +U +u +0 R +0 G +203.1875 564.6667 m +186.1168 573.2395 L +186.1168 590.2349 L +203.1875 598.8079 L +220.2579 590.2349 L +220.2579 573.2395 L +203.1875 564.6667 L +s +0 To +1 0 0 1 193.744 578.3034 0 Tp +TP +0 Tr +0 O +0 g +(MIB) Tx +(\r) TX +TO +U +u +1 Ap +0 R +0 G +173.7708 529.6568 m +193.3397 529.6568 209.2039 539.1753 209.2039 550.9166 c +209.2039 562.6579 193.3397 572.1765 173.7708 572.1765 c +154.2019 572.1765 138.3377 562.6579 138.3377 550.9166 c +138.3377 539.1753 154.2019 529.6568 173.7708 529.6568 c +s +0 To +1 0 0 1 173.7708 553.4828 0 Tp +TP +-16.3867 0 Td +0 Tr +0 O +0 g +1 Ta +(Master\r) Tx +2.2253 -12 Td +(Agent) Tx +(\r) TX +TO +U +u +0 R +0 G +280.0208 533.9921 m +295.676 533.9921 308.3674 541.6069 308.3674 551 c +308.3674 560.393 295.676 568.008 280.0208 568.008 c +264.3656 568.008 251.6742 560.393 251.6742 551 c +251.6742 541.6069 264.3656 533.9921 280.0208 533.9921 c +s +0 To +1 0 0 1 280.0208 553.5662 0 Tp +TP +-9.4434 0 Td +0 Tr +0 O +0 g +(Sub\r) Tx +-4.718 -12 Td +(Agent) Tx +(\r) TX +TO +U +0 Ap +0 R +0 G +98.6458 481.9583 m +438.6458 481.9583 l +S +0 To +1 0 0 1 93.3333 499.3333 0 Tp +TP +0 Tr +0 O +0 g +0 Ta +(Manager) Tx +(\r) TX +TO +0 R +0 G +104.5 496.3333 m +104.5 482 l +S +u +195.3333 496.75 m +195.3333 482 l +S +u +1 Ap +216.8333 496.75 m +216.8333 523 L +173.8333 523 L +173.8333 496.75 L +216.8333 496.75 L +s +0 To +1 0 0 1 180.0574 506.4412 0 Tp +TP +0 Tr +0 O +0 g +(Erlang) Tx +(\r) TX +TO +U +U +u +0 Ap +0 R +0 G +391.6667 496.75 m +391.6667 482 l +S +u +1 Ap +413.1667 496.75 m +413.1667 523 L +370.1667 523 L +370.1667 496.75 L +413.1667 496.75 L +s +0 To +1 0 0 1 376.3908 506.4412 0 Tp +TP +0 Tr +0 O +0 g +(Erlang) Tx +(\r) TX +TO +U +U +u +0 R +0 G +204.5065 690.9501 m +207.8201 690.9501 210.5065 693.6364 210.5065 696.9501 C +210.5065 720.3831 L +210.5065 723.6969 207.8201 726.3832 204.5065 726.3832 C +188.1602 726.3832 L +184.8466 726.3832 182.1601 723.6969 182.1601 720.3831 C +182.1601 696.9501 L +182.1601 693.6364 184.8466 690.9501 188.1602 690.9501 C +204.5065 690.9501 L +s +0 To +1 0 0 1 196.3333 711.2328 0 Tp +TP +-12.4963 0 Td +0 Tr +0 O +0 g +1 Ta +(Appl.\r) Tx +9.7168 -12 Td +(1) Tx +(\r) TX +TO +U +u +0 R +0 G +238.5065 676.9501 m +241.8201 676.9501 244.5065 679.6364 244.5065 682.9501 C +244.5065 706.3831 L +244.5065 709.6969 241.8201 712.3832 238.5065 712.3832 C +222.1602 712.3832 L +218.8466 712.3832 216.1601 709.6969 216.1601 706.3831 C +216.1601 682.9501 L +216.1601 679.6364 218.8466 676.9501 222.1602 676.9501 C +238.5065 676.9501 L +s +0 To +1 0 0 1 230.3333 697.2328 0 Tp +TP +-12.4963 0 Td +0 Tr +0 O +0 g +(Appl.\r) Tx +9.7168 -12 Td +(2) Tx +(\r) TX +TO +U +u +0 R +0 G +272.5065 662.6168 m +275.8201 662.6168 278.5065 665.3031 278.5065 668.6168 C +278.5065 692.0498 L +278.5065 695.3636 275.8201 698.0499 272.5065 698.0499 C +256.1602 698.0499 L +252.8466 698.0499 250.1601 695.3636 250.1601 692.0498 C +250.1601 668.6168 L +250.1601 665.3031 252.8466 662.6168 256.1602 662.6168 C +272.5065 662.6168 L +s +0 To +1 0 0 1 264.3333 682.8995 0 Tp +TP +-12.4963 0 Td +0 Tr +0 O +0 g +(Appl.\r) Tx +9.7168 -12 Td +(3) Tx +(\r) TX +TO +U +u +0 R +0 G +306.5065 648.6168 m +309.8201 648.6168 312.5065 651.3031 312.5065 654.6168 C +312.5065 678.0498 L +312.5065 681.3636 309.8201 684.0499 306.5065 684.0499 C +290.1602 684.0499 L +286.8466 684.0499 284.1601 681.3636 284.1601 678.0498 C +284.1601 654.6168 L +284.1601 651.3031 286.8466 648.6168 290.1602 648.6168 C +306.5065 648.6168 L +s +0 To +1 0 0 1 298.3333 668.8995 0 Tp +TP +-12.4963 0 Td +0 Tr +0 O +0 g +(Appl.\r) Tx +9.7168 -12 Td +(4) Tx +(\r) TX +TO +U +u +0 R +0 G +373.1026 619.6168 m +376.4161 619.6168 379.1026 622.3031 379.1026 625.6168 C +379.1026 649.0498 L +379.1026 652.3636 376.4161 655.0499 373.1026 655.0499 C +356.7563 655.0499 L +353.4427 655.0499 350.7561 652.3636 350.7561 649.0498 C +350.7561 625.6168 L +350.7561 622.3031 353.4427 619.6168 356.7563 619.6168 C +373.1026 619.6168 L +s +0 To +1 0 0 1 364.9293 639.8995 0 Tp +TP +-12.4963 0 Td +0 Tr +0 O +0 g +(Appl.\r) Tx +9.7168 -12 Td +(5) Tx +(\r) TX +TO +U +u +0 R +0 G +416.1732 703.6168 m +419.4868 703.6168 422.1732 706.3031 422.1732 709.6168 C +422.1732 733.0498 L +422.1732 736.3636 419.4868 739.0499 416.1732 739.0499 C +399.8269 739.0499 L +396.5133 739.0499 393.8268 736.3636 393.8268 733.0498 C +393.8268 709.6168 L +393.8268 706.3031 396.5133 703.6168 399.8269 703.6168 C +416.1732 703.6168 L +s +0 To +1 0 0 1 408 723.8995 0 Tp +TP +-12.4963 0 Td +0 Tr +0 O +0 g +(Appl.\r) Tx +9.7168 -12 Td +(6) Tx +(\r) TX +TO +U +0 To +1 0 0 1 210 738 0 Tp +TP +-16.9458 0 Td +0 Tr +(Node 1) Tx +(\r) TX +TO +0 To +1 0 0 1 395.6667 755 0 Tp +TP +-16.9458 0 Td +0 Tr +(Node 3) Tx +(\r) TX +TO +0 To +1 0 0 1 383.3333 670 0 Tp +TP +-16.9458 0 Td +0 Tr +(Node 2) Tx +(\r) TX +TO +0 To +1 0 0 1 255 467.6667 0 Tp +TP +-19.9951 0 Td +0 Tr +(Network) Tx +(\r) TX +TO +0 To +1 0 0 1 158.6667 503 0 Tp +TP +-10.553 0 Td +0 Tr +(UDP) Tx +(\r) TX +TO +u +u +0 Ap +0 R +0 G +196.1667 682.9167 m +202.5 606.5833 l +S +0 O +0 g +203.7167 604.3142 m +204.0775 606.0031 204.447 607.1121 204.8679 608.478 c +199.8409 608.0609 l +200.1046 607.6064 201.0285 605.7501 201.6624 604.1437 c +202.3416 602.4246 202.8386 600.8558 203.0548 599.8294 c +203.0987 600.8774 203.3303 602.5066 203.7167 604.3142 c +f +194.9499 685.1859 m +194.5892 683.4969 194.2196 682.388 193.7987 681.022 c +198.8258 681.4391 l +198.5621 681.8936 197.6381 683.7499 197.0042 685.3563 c +196.325 687.0755 195.828 688.6442 195.6119 689.6706 c +195.5679 688.6227 195.3363 686.9934 194.9499 685.1859 c +f +U +U +0 R +0 G +110.3333 492.3333 m +152.1209 494.1551 165.3333 502 v +176 508.3333 183.3333 519.3333 182 530 c +S +276.3333 533.6667 m +281.3333 517.6667 296.3333 512.3333 v +310.4293 507.3215 326.0289 506.8196 344.3333 512 c +362 517 365.6667 521.3333 375.6667 534.6667 c +S +0 To +1 0 0 1 310 497 0 Tp +TP +-42.7673 0 Td +0 Tr +0 O +0 g +(Distributed Erlang) Tx +(\r) TX +TO +u +u +0 R +0 G +233.6667 668.6667 m +258.3333 605.3333 l +S +0 O +0 g +260.1455 603.5043 m +260.0107 605.2261 260.0494 606.3943 260.0641 607.8236 c +255.3637 605.993 l +255.7458 605.6322 257.1599 604.1157 258.2248 602.7562 c +259.3652 601.3015 260.2881 599.9391 260.7874 599.0167 c +260.5313 600.0338 260.2896 601.6616 260.1455 603.5043 c +f +231.8545 670.4957 m +231.9893 668.7739 231.9506 667.6056 231.9359 666.1764 c +236.6363 668.007 l +236.2542 668.3677 234.8401 669.8842 233.7752 671.2438 c +232.6348 672.6985 231.7119 674.0609 231.2126 674.9833 c +231.4687 673.9662 231.7104 672.3384 231.8545 670.4957 c +f +U +U +u +u +u +0 R +0 G +268.8303 655 m +286.3333 601.3333 l +S +0 O +0 g +288.0401 599.4055 m +288.002 601.1321 288.1062 602.2964 288.201 603.7226 c +283.4054 602.1585 l +283.7667 601.777 285.0934 600.1835 286.0803 598.7664 c +287.1373 597.25 287.9824 595.8379 288.4291 594.889 c +288.2305 595.9188 288.0805 597.5576 288.0401 599.4055 c +f +267.1236 656.9278 m +267.1616 655.2012 267.0575 654.0369 266.9626 652.6107 c +271.7583 654.1748 l +271.397 654.5563 270.0702 656.1498 269.0833 657.5669 c +268.0263 659.0833 267.1813 660.4954 266.7345 661.4443 c +266.9331 660.4145 267.0831 658.7757 267.1236 656.9278 c +f +U +U +U +u +u +0 R +0 G +298.3333 640.3125 m +298.3333 605.9792 l +S +0 O +0 g +299.3582 603.6172 m +299.8574 605.2705 300.3174 606.3451 300.8498 607.6716 c +295.8055 607.6716 l +296.0307 607.1968 296.798 605.2705 297.2969 603.6172 c +297.8316 601.8478 298.1972 600.2433 298.3277 599.2026 c +298.4582 600.2433 298.8237 601.8478 299.3582 603.6172 c +f +297.3084 642.6745 m +296.8092 641.0212 296.3492 639.9466 295.8168 638.6201 c +300.8611 638.6201 l +300.6359 639.0949 299.8686 641.0212 299.3697 642.6745 c +298.835 644.4439 298.4694 646.0484 298.3389 647.0891 c +298.2084 646.0484 297.8429 644.4439 297.3084 642.6745 c +f +U +U +u +u +0 R +0 G +217 550 m +244 550 l +S +0 O +0 g +246.362 551.0249 m +244.7087 551.5241 243.6341 551.9841 242.3076 552.5165 c +242.3076 547.4722 l +242.7824 547.6974 244.7087 548.4647 246.362 548.9636 c +248.1314 549.4983 249.7359 549.8639 250.7766 549.9944 c +249.7359 550.1249 248.1314 550.4904 246.362 551.0249 c +f +214.638 548.9751 m +216.2913 548.4759 217.3659 548.0159 218.6924 547.4835 c +218.6924 552.5278 l +218.2176 552.3026 216.2913 551.5353 214.638 551.0364 c +212.8686 550.5017 211.2641 550.1361 210.2234 550.0056 c +211.2641 549.8751 212.8686 549.5096 214.638 548.9751 c +f +U +U +u +0 R +0 G +364.9294 563.9595 m +347.8588 572.5323 L +347.8588 589.5277 L +364.9294 598.1006 L +382 589.5277 L +382 572.5323 L +364.9294 563.9595 L +s +0 To +1 0 0 1 355.486 577.5962 0 Tp +TP +0 Tr +0 O +0 g +0 Ta +(MIB) Tx +(\r) TX +TO +U +u +0 R +0 G +401.7373 563.9595 m +384.6667 572.5323 L +384.6667 589.5277 L +401.7373 598.1006 L +418.8079 589.5277 L +418.8079 572.5323 L +401.7373 563.9595 L +s +0 To +1 0 0 1 392.2938 577.5962 0 Tp +TP +0 Tr +0 O +0 g +(MIB) Tx +(\r) TX +TO +U +u +1 Ap +0 R +0 G +383.3333 533.8577 m +398.9885 533.8577 411.6799 541.4725 411.6799 550.8656 c +411.6799 560.2586 398.9885 567.8736 383.3333 567.8736 c +367.6781 567.8736 354.9867 560.2586 354.9867 550.8656 c +354.9867 541.4725 367.6781 533.8577 383.3333 533.8577 c +s +0 To +1 0 0 1 383.3333 553.4318 0 Tp +TP +-9.4434 0 Td +0 Tr +0 O +0 g +1 Ta +(Sub\r) Tx +-4.718 -12 Td +(Agent) Tx +(\r) TX +TO +U +0 R +0 G +[6 8 6 8 6 8 ]0 d +439.3333 523 m +439.3333 666.3333 L +331.3333 666.3333 L +331.3333 523 L +439.3333 523 L +s +u +0 Ap +[]0 d +365.0208 604.6458 m +365.0208 612.6458 l +S +0 O +0 g +363.9959 615.0078 m +363.4967 613.3545 363.0367 612.2799 362.5043 610.9534 c +367.5486 610.9534 l +367.3234 611.4282 366.5561 613.3545 366.0572 615.0078 c +365.5225 616.7772 365.1569 618.3817 365.0264 619.4224 c +364.8959 618.3817 364.5304 616.7772 363.9959 615.0078 c +f +366.0457 602.2838 m +366.5449 603.9371 367.0049 605.0117 367.5373 606.3382 c +362.493 606.3382 l +362.7182 605.8634 363.4855 603.9371 363.9844 602.2838 c +364.5191 600.5144 364.8847 598.9099 365.0152 597.8692 c +365.1457 598.9099 365.5112 600.5144 366.0457 602.2838 c +f +U +u +u +0 R +0 G +402.4166 605.2917 m +411.3333 695.6667 l +S +0 O +0 g +410.5453 698.1179 m +409.8862 696.5216 409.3229 695.4974 408.6628 694.2295 c +413.6827 693.7342 l +413.5052 694.2289 412.9308 696.2212 412.5966 697.9155 c +412.2383 699.7288 412.032 701.3615 412.0043 702.4099 c +411.7722 701.3871 411.251 699.8262 410.5453 698.1179 c +f +U +403.2089 602.8419 m +403.8653 604.4393 404.4268 605.4645 405.0846 606.7335 c +400.0639 607.22 l +400.2422 606.7257 400.8201 604.7344 401.1573 603.0407 c +401.5188 601.228 401.7279 599.5957 401.7575 598.5473 c +401.9877 599.5705 402.5063 601.1323 403.2089 602.8419 c +f +U +LB +%AI5_EndLayer-- +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_Illustrator_AI5 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_typography_AI5 /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF diff --git a/lib/snmp/doc/src/snmp-um-1-image-8.gif b/lib/snmp/doc/src/snmp-um-1-image-8.gif new file mode 100644 index 0000000000..db224a1937 Binary files /dev/null and b/lib/snmp/doc/src/snmp-um-1-image-8.gif differ diff --git a/lib/snmp/doc/src/snmp-um-1-image-8.ps b/lib/snmp/doc/src/snmp-um-1-image-8.ps new file mode 100644 index 0000000000..b16739aba0 --- /dev/null +++ b/lib/snmp/doc/src/snmp-um-1-image-8.ps @@ -0,0 +1,2931 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(r) 6.0 +%%For: (Anna Fedoriw) (Ericsson Telecom) +%%Title: (ProcessesOnOneNode.eps) +%%CreationDate: (97-05-23) (14.05) +%%BoundingBox: 84 522 452 731 +%%HiResBoundingBox: 84.5 522.5 451.1162 730.5099 +%%DocumentProcessColors: Black +%%DocumentFonts: Univers +%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 +%%+ procset Adobe_typography_AI5 1.0 0 +%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 +%%+ procset Adobe_Illustrator_AI5 1.0 0 +%AI5_FileFormat 2.0 +%AI3_ColorUsage: Black&White +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 21 -12 588 802 +%AI3_DocumentPreview: Macintosh_ColorPic +%AI5_ArtSize: 595.2756 841.8898 +%AI5_RulerUnits: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI5_OpenToView: 2 860 1.5 1146 827 58 1 1 3 40 +%AI5_OpenViewLayers: 7 +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 23 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + 5 packedarray + } bind def + /setcustomcolor + { + exch aload pop pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + def + } if + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + level2? + { + gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore + add add add 4 eq + } + { + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + } ifelse + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset Adobe_typography_AI5 1.0 1 +%%Title: (Typography Operators) +%%Version: 1.0 +%%CreationDate:(03/26/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_typography_AI5 54 dict dup begin +put +/initialize +{ + begin + begin + Adobe_typography_AI5 begin + Adobe_typography_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + end + end + end + Adobe_typography_AI5 begin +} def +/terminate +{ + currentdict Adobe_typography_AI5 eq + { + end + } if +} def +/modifyEncoding +{ + /_tempEncode exch ddef + /_pntr 0 ddef + { + counttomark -1 roll + dup type dup /marktype eq + { + pop pop exit + } + { + /nametype eq + { + _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll + put + } + { + /_pntr exch ddef + } ifelse + } ifelse + } loop + _tempEncode +} def +/TE +{ + StandardEncoding 256 array copy modifyEncoding + /_nativeEncoding exch def +} def +% +/TZ +{ + dup type /arraytype eq + { + /_wv exch def + } + { + /_wv 0 def + } ifelse + /_useNativeEncoding exch def + pop pop + findfont _wv type /arraytype eq + { + _wv makeblendedfont + } if + dup length 2 add dict + begin + mark exch + { + 1 index /FID ne + { + def + } if + cleartomark mark + } forall + pop + /FontName exch def + counttomark 0 eq + { + 1 _useNativeEncoding eq + { + /Encoding _nativeEncoding def + } if + cleartomark + } + { + /Encoding load 256 array copy + modifyEncoding /Encoding exch def + } ifelse + FontName currentdict + end + definefont pop +} def +/tr +{ + _ax _ay 3 2 roll +} def +/trj +{ + _cx _cy _sp _ax _ay 6 5 roll +} def +/a0 +{ + /Tx + { + dup + currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + } ddef + /Tj + { + dup + currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + } ddef +} def +/a1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/e0 +{ + /Tx + { + tr _psf + } ddef + /Tj + { + trj _pjsf + } ddef +} def +/e1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + tr _psf + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + trj _pjsf + grestore 3 1 roll moveto tr jsp + } ddef +} def +/i0 +{ + /Tx + { + tr sp + } ddef + /Tj + { + trj jsp + } ddef +} def +/i1 +{ + W N +} def +/o0 +{ + /Tx + { + tr sw rmoveto + } ddef + /Tj + { + trj swj rmoveto + } ddef +} def +/r0 +{ + /Tx + { + tr _ctm _pss + } ddef + /Tj + { + trj _ctm _pjss + } ddef +} def +/r1 +{ + /Tx + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/To +{ + pop _ctm currentmatrix pop +} def +/TO +{ + iTe _ctm setmatrix newpath +} def +/Tp +{ + pop _tm astore pop _ctm setmatrix + _tDict begin + /W + { + } def + /h + { + } def +} def +/TP +{ + end + iTm 0 0 moveto +} def +/Tr +{ + _render 3 le + { + currentpoint newpath moveto + } if + dup 8 eq + { + pop 0 + } + { + dup 9 eq + { + pop 1 + } if + } ifelse + dup /_render exch ddef + _renderStart exch get load exec +} def +/iTm +{ + _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale +} def +/Tm +{ + _tm astore pop iTm 0 0 moveto +} def +/Td +{ + _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto +} def +/iTe +{ + _render -1 eq + { + } + { + _renderEnd _render get dup null ne + { + load exec + } + { + pop + } ifelse + } ifelse + /_render -1 ddef +} def +/Ta +{ + pop +} def +/Tf +{ + dup 1000 div /_fScl exch ddef +% + selectfont +} def +/Tl +{ + pop + 0 exch _leading astore pop +} def +/Tt +{ + pop +} def +/TW +{ + 3 npop +} def +/Tw +{ + /_cx exch ddef +} def +/TC +{ + 3 npop +} def +/Tc +{ + /_ax exch ddef +} def +/Ts +{ + /_rise exch ddef + currentpoint + iTm + moveto +} def +/Ti +{ + 3 npop +} def +/Tz +{ + 100 div /_hs exch ddef + iTm +} def +/TA +{ + pop +} def +/Tq +{ + pop +} def +/Th +{ + pop pop pop pop pop +} def +/TX +{ + pop +} def +/Tk +{ + exch pop _fScl mul neg 0 rmoveto +} def +/TK +{ + 2 npop +} def +/T* +{ + _leading aload pop neg Td +} def +/T*- +{ + _leading aload pop Td +} def +/T- +{ + _ax neg 0 rmoveto + _hyphen Tx +} def +/T+ +{ +} def +/TR +{ + _ctm currentmatrix pop + _tm astore pop + iTm 0 0 moveto +} def +/TS +{ + currentfont 3 1 roll + /_Symbol_ _fScl 1000 mul selectfont + + 0 eq + { + Tx + } + { + Tj + } ifelse + setfont +} def +/Xb +{ + pop pop +} def +/Tb /Xb load def +/Xe +{ + pop pop pop pop +} def +/Te /Xe load def +/XB +{ +} def +/TB /XB load def +currentdict readonly pop +end +setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 17 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin + + /initialize + { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 + { + dup type /arraytype eq + { + dup xcheck + { + bind + } if + } if + pop pop + } forall + } def + /terminate { end } def + + currentdict /Adobe_ColorImage_AI6_Vars known not + { + /Adobe_ColorImage_AI6_Vars 14 dict def + } if + + Adobe_ColorImage_AI6_Vars begin + /channelcount 0 def + /sourcecount 0 def + /sourcearray 4 array def + /plateindex -1 def + /XIMask 0 def + /XIBinary 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIBuffer null def + /XIDataProc null def + end + + /WalkRGBString null def + /WalkCMYKString null def + + /StuffRGBIntoGrayString null def + /RGBToGrayImageProc null def + /StuffCMYKIntoGrayString null def + /CMYKToGrayImageProc null def + /ColorImageCompositeEmulator null def + + /SeparateCMYKImageProc null def + + /FourEqual null def + /TestPlateIndex null def + + currentdict /_colorimage known not + { + /colorimage where + { + /colorimage get /_colorimage exch def + } + { + /_colorimage null def + } ifelse + } if + + /_currenttransfer systemdict /currenttransfer get def + + /colorimage null def + /XI null def + + + /WalkRGBString + { + 0 3 index + + dup length 1 sub 0 3 3 -1 roll + { + 3 getinterval { } forall + + 5 index exec + + 3 index + } for + + 5 { pop } repeat + + } def + + + /WalkCMYKString + { + 0 3 index + + dup length 1 sub 0 4 3 -1 roll + { + 4 getinterval { } forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + + } def + + + /StuffRGBIntoGrayString + { + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add + } def + + + /RGBToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 3 idiv string + dup 3 1 roll + + /StuffRGBIntoGrayString load exch + WalkRGBString + end + } def + + + /StuffCMYKIntoGrayString + { + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add + } def + + + /CMYKToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 4 idiv string + dup 3 1 roll + + /StuffCMYKIntoGrayString load exch + WalkCMYKString + end + } def + + + /ColorImageCompositeEmulator + { + pop true eq + { + Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat + } + { + Adobe_ColorImage_AI6_Vars /channelcount get 1 ne + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 3 -1 roll put + + channelcount 3 eq + { + /RGBToGrayImageProc + } + { + /CMYKToGrayImageProc + } ifelse + load + end + } if + image + } ifelse + } def + + + /SeparateCMYKImageProc + { + Adobe_ColorImage_AI6_Vars begin + + sourcecount 0 ne + { + sourcearray plateindex get exec + } + { + sourcearray 0 get exec + + dup length 4 idiv string + + 0 2 index + + plateindex 4 2 index length 1 sub + { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + + pop pop exch pop + } ifelse + end + } def + + + /FourEqual + { + 4 index ne + { + pop pop pop false + } + { + 4 index ne + { + pop pop false + } + { + 4 index ne + { + pop false + } + { + 4 index eq + } ifelse + } ifelse + } ifelse + } def + + + /TestPlateIndex + { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + + /setcmykcolor where + { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + + 1 0 0 0 FourEqual + { + /plateindex 0 def + } + { + 0 1 0 0 FourEqual + { + /plateindex 1 def + } + { + 0 0 1 0 FourEqual + { + /plateindex 2 def + } + { + 0 0 0 1 FourEqual + { + /plateindex 3 def + } + { + 0 0 0 0 FourEqual + { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end + } def + + + /colorimage + { + Adobe_ColorImage_AI6_Vars begin + /channelcount 1 index def + /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def + + 4 sourcecount add index dup + 8 eq exch 1 eq or not + end + + { + /_colorimage load null ne + { + _colorimage + } + { + Adobe_ColorImage_AI6_Vars /sourcecount get + 7 add { pop } repeat + } ifelse + } + { + dup 3 eq + TestPlateIndex + dup -1 eq exch 5 eq or or + { + /_colorimage load null eq + { + ColorImageCompositeEmulator + } + { + dup 1 eq + { + pop pop image + } + { + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + gsave + + 0 _currenttransfer exec + 1 _currenttransfer exec + eq + { 0 _currenttransfer exec 0.5 lt } + { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse + + { { pop 0 } } { { pop 1 } } ifelse + systemdict /settransfer get exec + } if + + _colorimage + + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + grestore + } if + } ifelse + } ifelse + } + { + dup 1 eq + { + pop pop + image + } + { + pop pop + + Adobe_ColorImage_AI6_Vars begin + sourcecount -1 0 + { + exch sourcearray 3 1 roll put + } for + + /SeparateCMYKImageProc load + end + + systemdict /image get exec + } ifelse + } ifelse + } ifelse + } def + + /XI + { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIMask exch 0 ne def + /XIBinary exch 0 ne def + pop + pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + + XIBitsPerPixel 1 eq + { + XIImageWidth 8 div ceiling cvi + } + { + XIImageWidth XIChannelCount mul + } ifelse + /XIBuffer exch string def + + XIBinary + { + /XIDataProc { currentfile XIBuffer readstring pop } def + currentfile 128 string readline pop pop + } + { + /XIDataProc { currentfile XIBuffer readhexstring pop } def + } ifelse + + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + XIMask + { + XIImageWidth XIImageHeight + false + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + /_lp /null ddef + _fc + /_lp /imagemask ddef + + imagemask + } + { + XIImageWidth XIImageHeight + XIBitsPerPixel + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + XIChannelCount 1 eq + { + + gsave + 0 setgray + + image + + grestore + } + { + false + XIChannelCount + colorimage + } ifelse + } ifelse + grestore + end + } def + +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin +put +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 91 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add +} def +/swj +{ + dup 4 1 roll + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add + 6 2 roll /_cnt 0 ddef + { + 1 index eq + { + /_cnt _cnt 1 add ddef + } if + } forall + pop + exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow + 3 npop +} def +/jss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + } ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow + 6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow + 2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + } ifelse + 2 copy rmoveto + } exch cshow + 5 npop +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer readline not + { + stop + } if + endString eq + { + cleartomark stop + } if + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer readline not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 4 npop + 6 1 roll + pop + 4 1 roll + pop pop pop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 3 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +end +setpacking +%%EndResource +%%EndProlog +%%BeginSetup +%%IncludeFont: Univers +Adobe_level2_AI5 /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +[ +39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +TE +%AI3_BeginEncoding: _Univers Univers +[/_Univers/Univers 0 0 1 TZ +%AI3_EndEncoding AdobeType +%AI5_Begin_NonPrinting +Np +8 Bn +%AI5_BeginGradient: (Black & White) +(Black & White) 0 2 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Green & Blue) +(Green & Blue) 0 2 Bd +[ +< +99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 +A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 +B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 +C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 +D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 +E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 +F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF +> +< +000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D +1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B +3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 +5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 +78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 +96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 +B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +[ +1 0.75 0 0 1 50 100 %_Bs +0.6 0 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Pink, Yellow, Green) +(Pink, Yellow, Green) 0 3 Bd +[ +< +00000000000000000000000000000000000000010101010101010101010101010101010101010101 +01010101010202020202020202020202020202020202020202020203030303030303030303030303 +03030303030303030404040404040404040404040404040404040404050505050505050505050505 +05050505050505060606060606060606060606060606060606060707070707070707070707070707 +07070707080808080808080808080808080808080809090909090909090909090909090909090A0A +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C +0C0C0C0C0C0C0C0D0D0D0D0D +> +< +050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 +17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F +2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A +4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 +69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 +88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 +A9AAABACADADAEAFB0B1B2B2 +> +< +CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 +B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B +9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B +7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 +5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 +3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C +0B0A09080706050403020100 +> +0 +1 %_Br +< +737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E +4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D +2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 +1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 +020201010101010000000000 +> +< +00000000000000000000000001010101010101010101010101010101010101010101010102020202 +02020202020202020202020202020202020202020202030303030303030303030303030303030303 +03030303030303030303030303040404040404040404040404040404040404040404040404040404 +04040404040404040404050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505 +> +< +BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 +C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 +C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA +CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC +CCCCCCCCCCCCCCCCCCCCCCCC +> +0 +1 %_Br +[ +0.05 0.7 0 0 1 50 100 %_Bs +0 0.02 0.8 0 1 57 36 %_Bs +0.45 0 0.75 0 1 37 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Purple, Red & Yellow) +(Purple, Red & Yellow) 0 3 Bd +[ +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A +> +< +CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 +D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC +DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 +E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED +EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 +F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE +FEFEFEFFFFFF +> +0 +1 %_Br +< +E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE +BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 +9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E +6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 +4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E +1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 +> +< +E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA +EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE +EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 +F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 +F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC +FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF +> +< +00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 +242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 +4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A +6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E +8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 +B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC +> +0 +1 %_Br +[ +0 0.04 1 0 1 50 100 %_Bs +0 1 0.8 0 1 50 50 %_Bs +0.9 0.9 0 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Rainbow) +(Rainbow) 0 6 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +0 +1 %_Br +1 +< +0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 +A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE +CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 +F7F8F9FAFBFCFDFEFF +> +0 +0 +1 %_Br +1 +< +00000000000000000000000000000000000001010101010101010101010101010101010101010101 +01010101010101010101010101010202020202020202020202020202020202020202020202020202 +02020202020202020202030303030303030303030303030303030303030303030303030303030303 +03030303030304040404040404040404040404040404040404040404040404040404040404040404 +04040505050505050505050505050505050505050505050505050505050505050505050505050606 +06060606060606060606060606060606060606060606060606060606060606060606070707070707 +07070707070707070707070707070707 +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 +1 +0 +1 %_Br +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +1 %_Br +[ +0 1 0 0 1 50 100 %_Bs +1 1 0 0 1 50 80 %_Bs +1 0.0279 0 0 1 50 60 %_Bs +1 0 1 0 1 50 40 %_Bs +0 0 1 0 1 50 20 %_Bs +0 1 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Steel Bar) +(Steel Bar) 0 3 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 70 %_Bs +0 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Orange Radial) +(Yellow & Orange Radial) 1 2 Bd +[ +0 +< +0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 +232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 +494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F +707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C +> +< +FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 +F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 +F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB +EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 +> +0 +1 %_Br +[ +0 0 1 0 1 52 19 %_Bs +0 0.55 0.9 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Purple Radial) +(Yellow & Purple Radial) 1 2 Bd +[ +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +< +1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 +393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D +5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 +83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 +A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB +CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 +F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF +> +< +ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 +908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 +7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B +5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 +403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 +25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B +0A090908070706050504030302010100 +> +0 +1 %_Br +[ +0 0.08 0.67 0 1 50 14 %_Bs +1 1 0 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_End_NonPrinting-- +%AI5_BeginPalette +0 2 Pb +Pn +Pc +1 g +Pc +0 g +Pc +0 0 0 0 k +Pc +0.75 g +Pc +0.5 g +Pc +0.25 g +Pc +0 g +Pc +Bb +2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0 0 0 k +Pc +0.5 0 0 0 k +Pc +0.75 0 0 0 k +Pc +1 0 0 0 k +Pc +0.25 0.25 0 0 k +Pc +0.5 0.5 0 0 k +Pc +0.75 0.75 0 0 k +Pc +1 1 0 0 k +Pc +Bb +2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0 0 k +Pc +0 0.5 0 0 k +Pc +0 0.75 0 0 k +Pc +0 1 0 0 k +Pc +0 0.25 0.25 0 k +Pc +0 0.5 0.5 0 k +Pc +0 0.75 0.75 0 k +Pc +0 1 1 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0 0.25 0 k +Pc +0 0 0.5 0 k +Pc +0 0 0.75 0 k +Pc +0 0 1 0 k +Pc +0.25 0 0.25 0 k +Pc +0.5 0 0.5 0 k +Pc +0.75 0 0.75 0 k +Pc +1 0 1 0 k +Pc +Bb +2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0 0 k +Pc +0.5 0.25 0 0 k +Pc +0.75 0.375 0 0 k +Pc +1 0.5 0 0 k +Pc +0.125 0.25 0 0 k +Pc +0.25 0.5 0 0 k +Pc +0.375 0.75 0 0 k +Pc +0.5 1 0 0 k +Pc +Bb +2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0.125 0 k +Pc +0 0.5 0.25 0 k +Pc +0 0.75 0.375 0 k +Pc +0 1 0.5 0 k +Pc +0 0.125 0.25 0 k +Pc +0 0.25 0.5 0 k +Pc +0 0.375 0.75 0 k +Pc +0 0.5 1 0 k +Pc +Bb +2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0 0.25 0 k +Pc +0.25 0 0.5 0 k +Pc +0.375 0 0.75 0 k +Pc +0.5 0 1 0 k +Pc +0.25 0 0.125 0 k +Pc +0.5 0 0.25 0 k +Pc +0.75 0 0.375 0 k +Pc +1 0 0.5 0 k +Pc +Bb +2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0.125 0 k +Pc +0.5 0.25 0.25 0 k +Pc +0.75 0.375 0.375 0 k +Pc +1 0.5 0.5 0 k +Pc +0.25 0.25 0.125 0 k +Pc +0.5 0.5 0.25 0 k +Pc +0.75 0.75 0.375 0 k +Pc +1 1 0.5 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0.25 0.125 0 k +Pc +0.25 0.5 0.25 0 k +Pc +0.375 0.75 0.375 0 k +Pc +0.5 1 0.5 0 k +Pc +0.125 0.25 0.25 0 k +Pc +0.25 0.5 0.5 0 k +Pc +0.375 0.75 0.75 0 k +Pc +0.5 1 1 0 k +Pc +0 0 0 0 k +Pc +0.125 0.125 0.25 0 k +Pc +0.25 0.25 0.5 0 k +Pc +0.375 0.375 0.75 0 k +Pc +0.5 0.5 1 0 k +Pc +0.25 0.125 0.25 0 k +Pc +0.5 0.25 0.5 0 k +Pc +0.75 0.375 0.75 0 k +Pc +1 0.5 1 0 k +Pc +PB +%AI5_EndPalette +%%EndSetup +%AI5_BeginLayer +1 1 1 1 0 0 0 79 128 255 Lb +(Layer 1) Ln +0 A +800 Ar +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +0 XR +-4014 283.5 m +4626 283.5 L +(N) * +453.5 4716 m +453.5 -3924 L +(N) * +85 4716 m +85 -3924 L +(N) * +-4014 765.5 m +4626 765.5 L +(N) * +u +1 Ap +0 R +0 G +415.1831 559.9902 m +434.752 559.9902 450.6162 569.5087 450.6162 581.25 c +450.6162 592.9914 434.752 602.5099 415.1831 602.5099 c +395.6142 602.5099 379.75 592.9914 379.75 581.25 c +379.75 569.5087 395.6142 559.9902 415.1831 559.9902 c +s +0 To +1 0 0 1 415.1831 577.8162 0 Tp +TP +-9.4434 0 Td +0 Tr +0 O +0 g +/_Univers 10 Tf +0 Ts +100 Tz +0 Tt +1 TA +%_ 0 XL +36 0 Xb +XB +0 0 5 TC +100 100 200 TW +0 0 0 Ti +1 Ta +0 0 2 2 3 Th +0 Tq +0 0 Tl +0 Tc +0 Tw +(MIB) Tx +(\r) TX +TO +U +u +0 R +0 G +341.4331 559.9902 m +361.002 559.9902 376.8662 569.5087 376.8662 581.25 c +376.8662 592.9914 361.002 602.5099 341.4331 602.5099 c +321.8642 602.5099 306 592.9914 306 581.25 c +306 569.5087 321.8642 559.9902 341.4331 559.9902 c +s +0 To +1 0 0 1 341.4331 577.8162 0 Tp +TP +-9.4434 0 Td +0 Tr +0 O +0 g +(MIB) Tx +(\r) TX +TO +U +u +0 R +0 G +267.6831 559.9902 m +287.252 559.9902 303.1162 569.5087 303.1162 581.25 c +303.1162 592.9914 287.252 602.5099 267.6831 602.5099 c +248.1142 602.5099 232.25 592.9914 232.25 581.25 c +232.25 569.5087 248.1142 559.9902 267.6831 559.9902 c +s +0 To +1 0 0 1 267.6831 577.8162 0 Tp +TP +-12.7747 0 Td +0 Tr +0 O +0 g +(Net if) Tx +(\r) TX +TO +U +u +0 R +0 G +415.1831 616.7402 m +434.752 616.7402 450.6162 626.2587 450.6162 638 c +450.6162 649.7414 434.752 659.2599 415.1831 659.2599 c +395.6142 659.2599 379.75 649.7414 379.75 638 c +379.75 626.2587 395.6142 616.7402 415.1831 616.7402 c +s +0 To +1 0 0 1 415.1831 634.5662 0 Tp +TP +-6.9446 0 Td +0 Tr +0 O +0 g +(SA) Tx +(\r) TX +TO +U +u +0 R +0 G +341.4331 616.7402 m +361.002 616.7402 376.8662 626.2587 376.8662 638 c +376.8662 649.7414 361.002 659.2599 341.4331 659.2599 c +321.8642 659.2599 306 649.7414 306 638 c +306 626.2587 321.8642 616.7402 341.4331 616.7402 c +s +0 To +1 0 0 1 341.4331 634.5662 0 Tp +TP +-8.3289 0 Td +0 Tr +0 O +0 g +(MA) Tx +(\r) TX +TO +U +u +0 R +0 G +267.6831 616.7402 m +287.252 616.7402 303.1162 626.2587 303.1162 638 c +303.1162 649.7414 287.252 659.2599 267.6831 659.2599 c +248.1142 659.2599 232.25 649.7414 232.25 638 c +232.25 626.2587 248.1142 616.7402 267.6831 616.7402 c +s +0 To +1 0 0 1 267.6831 640.5662 0 Tp +TP +-21.3855 0 Td +0 Tr +0 O +0 g +(symbolic\r) Tx +9.4434 -12 Td +(store) Tx +(\r) TX +TO +U +u +0 R +0 G +193.9331 616.7402 m +213.502 616.7402 229.3662 626.2587 229.3662 638 c +229.3662 649.7414 213.502 659.2599 193.9331 659.2599 c +174.3642 659.2599 158.5 649.7414 158.5 638 c +158.5 626.2587 174.3642 616.7402 193.9331 616.7402 c +s +0 To +1 0 0 1 193.9331 634.5662 0 Tp +TP +-23.8831 0 Td +0 Tr +0 O +0 g +(note store) Tx +(\r) TX +TO +U +u +0 R +0 G +120.4331 616.7402 m +140.002 616.7402 155.8662 626.2587 155.8662 638 c +155.8662 649.7414 140.002 659.2599 120.4331 659.2599 c +100.8642 659.2599 85 649.7414 85 638 c +85 626.2587 100.8642 616.7402 120.4331 616.7402 c +s +0 To +1 0 0 1 120.4331 634.5662 0 Tp +TP +-18.6096 0 Td +0 Tr +0 O +0 g +(local db) Tx +(\r) TX +TO +U +u +0 R +0 G +231 687.4902 m +250.5689 687.4902 266.4331 697.0087 266.4331 708.75 c +266.4331 720.4914 250.5689 730.0099 231 730.0099 c +211.4311 730.0099 195.5669 720.4914 195.5669 708.75 c +195.5669 697.0087 211.4311 687.4902 231 687.4902 c +s +0 To +1 0 0 1 231 705.3162 0 Tp +TP +-25 0 Td +0 Tr +0 O +0 g +(supervisor) Tx +(\r) TX +TO +U +0 Ap +0 R +0 G +96.6667 526 m +156.6667 526 l +S +0 To +1 0 0 1 171.6667 525 0 Tp +TP +-9.7229 0 Td +0 Tr +0 O +0 g +(Link) Tx +(\r) TX +TO +0 R +0 G +193.9331 659.2599 m +231 687.4902 l +267.6831 659.2599 l +S +231 687.4902 m +341.4331 659.2599 l +S +415.1831 659.2599 m +231 687.4902 l +120.4331 659.2599 l +S +341.4331 602.5 m +341.4331 616.7402 l +267.6831 602.5099 l +S +376.8662 638 m +379.75 638 l +S +415.1831 616.7402 m +415.1831 602.5099 l +S +LB +%AI5_EndLayer-- +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_Illustrator_AI5 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_typography_AI5 /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF diff --git a/lib/snmp/doc/src/snmp.gif b/lib/snmp/doc/src/snmp.gif new file mode 100644 index 0000000000..d9985f990b Binary files /dev/null and b/lib/snmp/doc/src/snmp.gif differ diff --git a/lib/snmp/doc/src/snmp.xml b/lib/snmp/doc/src/snmp.xml new file mode 100644 index 0000000000..af0833f005 --- /dev/null +++ b/lib/snmp/doc/src/snmp.xml @@ -0,0 +1,608 @@ + + + + +
+ + 19962009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmp + + + + + + + + snmp.xml +
+ snmp + Interface functions to the SNMP toolkit + +

The module snmp contains interface functions to the + SNMP toolkit.

+
+ +
+ Common Data Types +

The following data-types are used in the functions below:

+ + +

datetime() = {date(), time()}

+

See calendar + for more info.

+
+ +
+ + +
+ + + + config() -> ok | {error, Reason} + Configure with a simple interactive tool + +

A simple interactive configuration tool. Simple + configuration files can be generated, but more complex + configurations still have to be edited manually. +

+

The tool is a textual based tool that asks some questions + and generates sys.config and *.conf files. +

+

Note that if the application shall support version 3, + then the crypto app must be started before running this function + (password generation).

+

Note also that some of the configuration files for the + agent and manager share the same names. This means that + they have to be stored in different directories!

+ + +
+
+ + + start() -> ok | {error, Reason} + start(Type) -> ok | {error, Reason} + Start the SNMP application + + Type = start_type() + + +

Starts the SNMP application.

+

See application for more info.

+ + +
+
+ + + start_agent() -> ok | {error, Reason} + start_agent(Type) -> ok | {error, Reason} + Start the agent part of the SNMP application + + Type = start_type() + + +

The SNMP application consists of several entities, of which the + agent is one. This function starts the agent entity of the + application. +

+

Note that the only way to actually start the agent in this way is + to add the agent related config after starting the application (e.g + it cannot be part of the normal application config; sys.config). + This is done by calling: + application:set_env(snmp, agent, Conf). +

+

The default value for Type is normal.

+ + +
+
+ + + start_manager() -> ok | {error, Reason} + start_manager(Type) -> ok | {error, Reason} + Start the manager part of the SNMP application + + Type = start_type() + + +

The SNMP application consists of several entities, of which the + manager is one. This function starts the manager entity of the + application. +

+

Note that the only way to actually start the manager in this way is + to add the manager related config after starting the application (e.g + it cannot be part of the normal application config; sys.config). + This is done by calling: + application:set_env(snmp, manager, Conf). +

+

The default value for Type is normal.

+ + +
+
+ + + date_and_time() -> DateAndTime + Return the current date and time as an OCTET STRING + + DateAndTime = [int()] + + +

Returns current date and time as the data type DateAndTime, + as specified in RFC1903. This is an OCTET STRING.

+ + +
+
+ + + date_and_time_to_universal_time_dst(DateAndTime) -> [utc()] + Convert a DateAndTime value to a list of possible utc() + + DateAndTime = [int()] + utc() = {{Y,Mo,D},{H,M,S}} + + +

Converts a DateAndTime list to a list of possible universal + time(s). The universal time value on the same format as defined in + calendar(3).

+ + +
+
+ + + date_and_time_to_string(DateAndTime) -> string() + date_and_time_to_string(DateAndTime, Validate) -> string() + Convert a DateAndTime value to a string + + DateAndTime = [int()] + Validate = fun(Kind, Data) -> boolean() + + +

Converts a DateAndTime list to a printable string, according + to the DISPLAY-HINT definition in RFC2579.

+ +

The validation fun, Validate, allows for a more "flexible" + validation of the DateAndTime argument. Whenever the data + is found to not follow RFC2579, the fun is called to allow a more + "lax" validation. + See the validate_date_and_time/2 + function for more info on the Validate fun.

+ + +
+
+ + + date_and_time_to_string2(DateAndTime) -> string() + Convert a DateAndTime value to a string + + DateAndTime = [int()] + + +

Converts a DateAndTime list to a printable string, according + to the DISPLAY-HINT definition in RFC2579, with the extension + that it also allows the values "hours from UTC" = 14 together with + "minutes from UTC" = 0.

+ + +
+
+ + + local_time_to_date_and_time_dst(Local) -> [DateAndTime] + Convert a Local time value to a list of possible DateAndTime(s) + + Local = {{Y,Mo,D},{H,M,S}} + DateAndTime = [int()] + + +

Converts a local time value to a list of possible DateAndTime + list(s). The local time value on the same format as defined in + calendar(3).

+ + +
+
+ + + universal_time_to_date_and_time(UTC) -> DateAndTime + Convert a UTC value to DateAndTime + + UTC = {{Y,Mo,D},{H,M,S}} + DateAndTime = [int()] + + +

Converts a universal time value to a DateAndTime list. The + universal time value on the same format as defined in calendar(3).

+ + +
+
+ + + validate_date_and_time(DateAndTime) -> bool() + validate_date_and_time(DateAndTime, Validate) -> bool() + Check if a DateAndTime value is correct + + DateAndTime = term() + Validate = fun(Kind, Data) -> boolean() + + +

Checks if DateAndTime is a correct DateAndTime + value, as specified in RFC2579. This function can be used in + instrumentation functions to validate a DateAndTime value.

+ + +

The validation fun, Validate, allows for a more "flexible" + validation of the DateAndTime argument. Whenever the data + is found to not follow RFC2579, the fun is called to allow a more + "lax" validation. + The input to the validation fun looks like this:

+ +
+          Kind             Data
+          --------------   ----------------------
+          year             {Year1, Year2}
+          month            Month
+          day              Day
+          hour             Hour
+          minute           Minute
+          seconds          Seconds
+          deci_seconds     DeciSeconds
+          diff             [Sign, Hour, Minute]
+          valid_date       {Year, Month, Day}
+	
+ + +
+
+ + + passwd2localized_key(Alg, Passwd, EngineID) -> Key + Generates an localized key + + Alg = algorithm() + algorithm() = md5 | sha + Passwd = string() + EngineID = string() + Key = list() + + +

Generates a key that can be used as an authentication + or privacy key using MD5 och SHA. The key is + localized for EngineID.

+ + +
+
+ + + octet_string_to_bits(S) -> Val + Convert an OCTET-STRING to BITS + + Val = bits() + + +

Utility function for converting a value of type + OCTET-STRING to BITS.

+ + +
+
+ + + bits_to_octet_string(B) -> Val + Convert an OCTET-STRING to BITS + + Val = octet_string() + + +

Utility function for converting a value of type BITS + to OCTET-STRING.

+ + +
+
+ + + read_mib(FileName) -> {ok, mib()} | {error, Reason} + + + FileName = string() + mib() = #mib{} + Reason = term() + + +

Read a compiled mib.

+ + +
+
+ + + log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile) -> ok | {error, Reason} + log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start) -> ok | {error, Reason} + log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start, Stop) -> ok | {error, Reason} + Convert an Audit Trail Log to text format + + LogDir = string() + Mibs = [MibName] + OutFile = string() + MibName = string() + LogName = string() + LogFile = string() + Start = Stop = null | datetime() | {local_time,datetime()} | {universal_time,datetime()} + Reason = term() + + +

Converts an Audit Trail Log to a readable text file, where + each item has a trailing TAB character, and any TAB + character in the body of an item has been replaced by ESC + TAB. +

+

The function can be used on a running system, or by copying + the entire log directory and calling this function. SNMP + must be running in order to provide MIB information. +

+

LogDir is the name of the directory where the audit + trail log is stored. + Mibs is a list of Mibs to be used. The function uses + the information in the Mibs to convert for example object + identifiers to their symbolic name. + OutFile is the name of the generated text-file. + LogName is the name of the log, + LogFile is the name of the log file. + Start is the start (first) date and time from which + log events will be converted and + Stop is the stop (last) date and time to which log + events will be converted. +

+

The format of an audit trail log text item is as follows: +

+

Tag Addr - Community [TimeStamp] Vsn

+ PDU

+

where Tag is request, response, + report, trap or inform; Addr is + IP:Port (or comma space separated list of such); + Community is the community parameter (SNMP version + v1 and v2), or SecLevel:"AuthEngineID":"UserName" + (SNMP v3); TimeStamp is a date and time stamp, + and Vsn is the SNMP version. PDU is a textual + version of the protocol data unit. There is a new line + between Vsn and PDU.

+ + +
+
+ + + change_log_size(LogName, NewSize) -> ok | {error, Reason} + Change the size of the Audit Trail Log + + LogName = string() + NewSize = {MaxBytes, MaxFiles} + MaxBytes = integer() + MaxFiles = integer() + Reason = term() + + +

Changes the log size of the Audit Trail Log. The + application must be configured to use the audit trail log + function. Please refer to disk_log(3) in Kernel Reference + Manual for a description of how to change the log size. +

+

The change is permanent, as long as the log is not deleted. + That means, the log size is remembered across reboots.

+ + +
+
+ + + print_version_info() -> void() + print_version_info(Prefix) -> void() + Formatted print of result of the versions functions + + Prefix = string() | integer() + + +

Utility function(s) to produce a formatted printout of the versions + info generated by the versions1 function

+

This is the same as doing, e.g.:

+
+           {ok, V} = snmp:versions1(), 
+           snmp:print_versions(V).
+        
+ + + +
+
+ + + versions1() -> {ok, Info} | {error, Reason} + versions2() -> {ok, Info} | {error, Reason} + Retrieve various system and application info + + Info = [info()] + info() = term() + Reason = term() + + +

Utility functions used to retrieve some system and + application info.

+

The difference between the two functions is in how they get + the modules to check. versions1 uses the app-file and + versions2 uses the function application:get_key.

+ + +
+
+ + + print_versions(VersionInfo) -> void() + print_versions(Prefix, VersionInfo) -> void() + Formatted print of result of the versions functions + + VersionInfo = [version_info()] + version_info() = term() + Prefix = string() | integer() + + +

Utility function to produce a formatted printout of the versions + info generated by the versions1 and versions2 + functions

+

Example:

+
+           {ok, V} = snmp:versions1(), 
+           snmp:print_versions(V).
+        
+ + +
+
+ + + enable_trace() -> void() + Starts a tracer + + +

Starts a dbg tracer that prints trace events to stdout (using + plain io:format after a minor formatting).

+ + +
+
+ + + disable_trace() -> void() + Stop the tracer + + +

Stop the tracer.

+ + +
+
+ + + set_trace(Targets) -> void() + Set trace target + + Targets = target() | targets() + target() = module() + module() = atom() + targets() = [target() | {target(), target_options()}] + target_options() = [target_option()] + target_option() = {return_trace, boolean()} | {scope, scope()} + scope() = all_functions | exported_functions | function_name() | {function_name(), function_arity()} + function_name() = atom() + function_arity() = integer() >= 0 + + +

This function is used to set up default trace on function(s) + for the given module or modules. The scope of the trace will be + all exported functions (both the call info and the return + value). Timestamp info will also be included.

+ + +
+
+ + + reset_trace(Targets) -> void() + Reset trace target + + Targets = module() | modules() + modules() = [module()] + module() = atom() + + +

This function is used to reset (disable) trace for the + given module(s).

+ + +
+
+ + + set_trace(Targets, Opts) -> void() + Set trace target + + Targets = target() | targets() + target() = module() + module() = atom() + targets() = [target() | {target(), target_options()}] + target_options() = [target_option()] + target_option() = {return_trace, boolean()} | {scope, scope()} + scope() = all_functions | exported_functions | function_name() | {function_name(), function_arity()} + function_name() = atom() + function_arity() = integer() >= 0 + Opts = disable | trace_options() + trace_options() = [trace_option()] + trace_option() = {timestamp, boolean()} | target_option() + + +

This function is used to set up trace on function(s) for the given + module or modules.

+ +

The example below sets up trace on the exported functions (default) + of module snmp_generic and all functions of module + snmp_generic_mnesia. With return values (which is default) + and timestamps in both cases (which is also default):

+ +
+	  snmp:enable_trace(),
+	  snmp:set_trace([snmp_generic, 
+                          {snmp_generic_mnesia, [{scope, all_functions}]}]),
+	  .
+	  .
+	  .
+          snmp:set_trace(snmp_generic, disable),
+	  .
+	  .
+	  .
+	  snmp:disable_trace(),
+	
+ +
+
+ +
+ +
+ See Also +

calendar(3) +

+
+ +
+ diff --git a/lib/snmp/doc/src/snmp_advanced_agent.xml b/lib/snmp/doc/src/snmp_advanced_agent.xml new file mode 100644 index 0000000000..6600206c2d --- /dev/null +++ b/lib/snmp/doc/src/snmp_advanced_agent.xml @@ -0,0 +1,482 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Advanced Agent Topics + + + + + + + + snmp_advanced_agent.xml +
+

The chapter Advanced Agent Topics describes the more advanced + agent related features of the SNMP development tool. The following topics + are covered: +

+ + When to use a Sub-agent + Agent semantics + Sub-agents and dependencies + Distributed tables + Fault tolerance + Using Mnesia tables as SNMP tables + Audit Trail Logging + Deviations from the standard + + + +
+ When to use a Sub-agent +

The section When to use a Sub-agent describes situations + where the mechanism of loading and unloading MIBs is insufficient. + In these cases a sub-agent is needed. +

+ +
+ Special Set Transaction Mechanism +

Each sub-agent can implement its own mechanisms for + set, get and get-next. For example, if the + application requires the get mechanism to be + asynchronous, or needs a N-phase set mechanism, a + specialized sub-agent should be used. +

+

The toolkit allows different kinds of sub-agents at the same + time. Accordingly, different MIBs can have different set + or get mechanisms. +

+
+ +
+ Process Communication +

A simple distributed agent can be managed without sub-agents. + The instrumentation functions can use distributed Erlang to + communicate with other parts of the application. However, a + sub-agent can be used on each node if this generates too much + unnecessary traffic. A sub-agent processes requests per + incoming SNMP request, not per variable. Therefore the network + traffic is minimized. +

+

If the instrumentation functions communicate with UNIX + processes, it might be a good idea to use a special + sub-agent. This sub-agent sends the SNMP request to the other + process in one packet in order to minimize context switches. For + example, if a whole MIB is implemented on the C level in UNIX, + but you still want to use the Erlang SNMP tool, then you may + have one special sub-agent, which sends the variables in the + request as a single operation down to C. +

+
+ +
+ Frequent Loading of MIBs +

Loading and unloading of MIBs are quite cheap + operations. However, if the application does this very often, + perhaps several times per minute, it should load the MIBs once + and for all in a sub-agent. This sub-agent only registers and + unregisters itself under another agent instead of loading the + MIBs each time. This is cheaper than loading an MIB. +

+
+ +
+ Interaction With Other SNMP Agent Toolkits +

If the SNMP agent needs to interact with sub-agents + constructed in another package, a special sub-agent should be + used, which communicates through a protocol specified by the + other package. +

+
+
+ +
+ Agent Semantics +

The agent can be configured to be multi-threaded, to process + one incoming request at a time, or to have a request limit + enabled (this can be used for load control or to limit the effect + of DoS attacks). If it is multi-threaded, read requests (get, + get-next and get-bulk) and traps are processed in + parallel with each other and set requests. However, all + set requests are serialized, which means that if the agent + is waiting for the application to complete a complicated write + operation, it will not process any new write requests until this + operation is finished. It processes read requests and sends traps, + concurrently. The reason for not handle write requests in parallel is + that a complex locking mechanism would be needed even in the simplest + cases. Even with the scheme described above, the user must be + careful not to violate that the set requests are atoms. + If this is hard to do, do not use the multi-threaded feature. +

+

The order within an request is undefined and variables are not + processed in a defined order. Do not assume that the first + variable in the PDU will be processed before the second, even if + the agent processes variables in this order. It + cannot even be assumed that requests belonging to different + sub-agents have any order. +

+

If the manager tries to set the same variable many times in the + same PDU, the agent is free to improvise. There is no definition + which determines if the instrumentation will be called once or + twice. If called once only, there is no definition that determines + which of the new values is going to be supplied. +

+

When the agent receives a request, it keeps the request ID for + one second after the response is sent. If the agent receives + another request with the same request ID during this time, from + the same IP address and UDP port, that request will be + discarded. This mechanism has nothing to do with the function + snmpa:current_request_id/0.

+
+ +
+ Sub-agents and Dependencies +

The toolkit supports the use of different types of sub-agents, + but not the construction of sub-agents. +

+

Also, the toolkit does not support dependencies between + sub-agents. A sub-agent should by definition be stand alone and it is + therefore not good design to create dependencies between them. +

+
+ +
+ Distributed Tables +

A common situation in more complex systems is that the data in + a table is distributed. Different table rows are implemented in + different places. Some SNMP tool-kits dedicate an SNMP sub-agent for + each part of the table and load the corresponding MIB into all + sub-agents. The Master Agent is responsible for presenting the + distributed table as a single table to the manager. The toolkit + supplied uses a different method. +

+

The method used to implement distributed tables with this SNMP + tool is to implement a table coordinator process responsible for + coordinating the processes, which hold the table data and they + are called table holders. All table holders must in some way be + known by the coordinator; the structure of the table data + determines how this is achieved. The coordinator may require + that the table holders explicitly register themselves and specify + their information. In other cases, the table holders can be + determined once at compile time. +

+

When the instrumentation function for the distributed table is + called, the request should be forwarded to the table + coordinator. The coordinator finds the requested information among + the table holders and then returns the answer to the + instrumentation function. The SNMP toolkit contains no support for + coordination of tables since this must be independent of the + implementation. +

+

The advantages of separating the table coordinator from the + SNMP tool are: +

+ + We do not need a sub-agent for each table holder. Normally, + the sub-agent is needed to take care of communication, but in + Distributed Erlang we use ordinary message passing. + + Most likely, some type of table coordinator already + exists. This process should take care of the instrumentation for + the table. + + The method used to present a distributed table is strongly + application dependent. The use of different masking techniques + is only valid for a small subset of problems and registering + every row in a distributed table makes it non-distributed. + + +
+ +
+ Fault Tolerance +

The SNMP agent toolkit gets input from three different sources: +

+ + UDP packets from the network + return values from the user defined instrumentation functions + return values from the MIB. + + +

The agent is highly fault tolerant. If the manager gets an + unexpected response from the agent, it is possible that some + instrumentation function has returned an erroneous value. The + agent will not crash even if the instrumentation does. It should + be noted that if an instrumentation function enters an infinite + loop, the agent will also be blocked forever. The supervisor ,or + the application, specifies how to restart the agent. +

+ +
+ Using the SNMP Agent in a Distributed Environment +

The normal way to use the agent in a distributed + environment is to use one master agent located at one node, + and zero or more sub-agents located on other nodes. However, + this configuration makes the master agent node a single point + of failure. If that node goes down, the agent will not work. +

+

One solution to this problem is to make the snmp application + a distributed Erlang application, and that means, the agent + may be configured to run on one of several nodes. If the node + where it runs goes down, another node restarts the agent. + This is called failover. When the node starts again, + it may takeover the application. This solution to + the problem adds another problem. Generally, the new node has + another IP address than the first one, which may cause + problems in the communication between the SNMP managers and + the agent. +

+

If the snmp agent is configured as a distributed Erlang + application, it will during takeover try to load the same MIBs + that were loaded at the old node. It uses the same filenames + as the old node. If the MIBs are not located in the same + paths at the different nodes, the MIBs must be loaded + explicitly after takeover. +

+
+
+ +
+ Using Mnesia Tables as SNMP Tables +

The Mnesia DBMS can be used for storing data of SNMP + tables. This means that an SNMP table can be implemented as a + Mnesia table, and that a Mnesia table can be made visible via + SNMP. This mapping is largely automated. +

+

There are three main reasons for using this mapping: +

+ + We get all features of Mnesia, such as fault tolerance, + persistent data storage, replication, and so on. + + Much of the work involved is automated. This includes + get-next processing and RowStatus handling. + + The table may be used as an ordinary Mnesia table, using + the Mnesia API internally in the application at the same time as + it is visible through SNMP. + + +

When this mapping is used, insertion and deletion in the + original Mnesia table is slower, with a factor O(log n). The read + access is not affected. +

+

A drawback with implementing an SNMP table as a Mnesia table is + that the internal resource is forced to use the table definition + from the MIB, which means that the external data model must be + used internally. Actually, this is only partially true. The Mnesia + table may extend the SNMP table, which means that the Mnesia table + may have columns which are use internally and are not seen by + SNMP. Still, the data model from SNMP must be maintained. Although + this is undesirable, it is a pragmatic compromise in many + situations where simple and efficient implementation is preferable + to abstraction. +

+ +
+ Creating the Mnesia Table +

The table must be created in Mnesia before the manager can + use it. The table must be declared as type snmp. This + makes the table ordered in accordance with the lexicographical + ordering rules of SNMP. The name of the Mnesia table must be + identical to the SNMP table name. The types of the INDEX fields + in the corresponding SNMP table must be specified. +

+

If the SNMP table has more than one INDEX column, the + corresponding Mnesia row is a tuple, where the first element + is a tuple with the INDEX columns. Generally, if the SNMP table + has N INDEX columns and C data columns, the + Mnesia table is of arity (C-N)+1, where the key is a + tuple of arity N if N > 1, or a single term + if N = 1. +

+

Refer to the Mnesia User's Guide for information on how to + declare a Mnesia table as an SNMP table. +

+

The following example illustrates a situation in which we + have an SNMP table that we wish to implement as a Mnesia + table. The table stores information about employees at a + company. Each employee is indexed with the department number and + the name. +

+ + empTable OBJECT-TYPE + SYNTAX SEQUENCE OF EmpEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A table with information about employees." + ::= { emp 1} + empEntry OBJECT-TYPE + SYNTAX EmpEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "" + INDEX { empDepNo, empName } + ::= { empTable 1 } + EmpEntry ::= + SEQUENCE { + empDepNo INTEGER, + empName DisplayString, + empTelNo DisplayString + empStatus RowStatus + } + +

The corresponding Mnesia table is specified as follows: +

+ +mnesia:create_table([{name, employees}, + {snmp, [{key, {integer, string}}]}, + {attributes, [key, telno, row_status]}]). + + +

In the Mnesia tables, the two key columns are stored as a + tuple with two elements. Therefore, the arity of the table is + 3.

+
+
+ +
+ Instrumentation Functions +

The MIB table shown in the previous section can be compiled + as follows: +

+
+1> snmpc:compile("EmpMIB", [{db, mnesia}]).
+      
+

This is all that has to be done! Now the manager can read, + add, and modify rows. Also, you can use the ordinary Mnesia API + to access the table from your programs. The only explicit action + is to create the Mnesia table, an action the user has to perform + in order to create the required table schemas.

+
+ +
+ Adding Own Actions +

It is often necessary to take some specific action when a + table is modified. This is accomplished with an instrumentation + function. It executes some specific code when the table is set, + and passes all other requests down to the pre-defined function. +

+

The following example illustrates this idea: +

+ +emp_table(set, RowIndex, Cols) -> + notify_internal_resources(RowIndex, Cols), + snmp_generic:table_func(set, RowIndex, Cols, {empTable, mnesia}); +emp_table(Op, RowIndex, Cols) -> + snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}). + +

The default instrumentation functions are defined in the + module snmp_generic. Refer to the Reference Manual, + section SNMP, module snmp_generic for details.

+
+ +
+ Extending the Mnesia Table +

A table may contain columns that are used internally, but + should not be visible to a manager. These internal columns must + be the last columns in the table. The set operation will + not work with this arrangement, because there are columns that + the agent does not know about. This situation is handled by + adding values for the internal columns in the set + function. +

+

To illustrate this, suppose we extend our Mnesia + empTable with one internal column. We create it as + before, but with an arity of 4, by adding another attribute. +

+ +mnesia:create_table([{name, employees}, + {snmp, [{key, {integer, string}}]}, + {attributes, {key, telno, row_status, internal_col}}]). + +

The last column is the internal column. When performing a + set operation, which creates a row, we must give a + value to the internal column. The instrumentation functions will now + look as follows: +

+ +-define(createAndGo, 4). +-define(createAndWait, 5). + +emp_table(set, RowIndex, Cols) -> + notify_internal_resources(RowIndex, Cols), + NewCols = + case is_row_created(empTable, Cols) of + true -> Cols ++ [{4, "internal"}]; % add internal column + false -> Cols % keep original cols + end, + snmp_generic:table_func(set, RowIndex, NewCols, {empTable, mnesia}); +emp_table(Op, RowIndex, Cols) -> + snmp_generic:table_func(Op, RowIndex, Cols, {empTable, mnesia}). + +is_row_created(Name, Cols) -> + case snmp_generic:get_status_col(Name, Cols) of + {ok, ?createAndGo} -> true; + {ok, ?createAndWait} -> true; + _ -> false + end. + +

If a row is created, we always set the internal column to + "internal". +

+
+
+ +
+ Deviations from the Standard +

In some aspects the agent does not implement SNMP fully. Here + are the differences: +

+ + The default functions and snmp_generic cannot + handle an object of type NetworkAddress as INDEX + (SNMPv1 only!). Use IpAddress instead. + + The agent does not check complex ranges specified for + INTEGER objects. In these cases it just checks that the value + lies within the minimum and maximum values specified. For + example, if the range is specified as 1..10 | 12..20 + the agent would let 11 through, but not 0 or 21. The + instrumentation functions must check the complex ranges + itself. + + The agent will never generate the wrongEncoding + error. If a variable binding is erroneous encoded, the + asn1ParseError counter will be incremented. + + A tooBig error in an SNMPv1 packet will always use + the 'NULL' value in all variable bindings. + + The default functions and snmp_generic do not check + the range of each OCTET in textual conventions derived from + OCTET STRING, e.g. DisplayString and + DateAndTime. This must be checked in an overloaded + is_set_ok function. + + +
+
+ diff --git a/lib/snmp/doc/src/snmp_agent_config_files.xml b/lib/snmp/doc/src/snmp_agent_config_files.xml new file mode 100644 index 0000000000..0bab563f87 --- /dev/null +++ b/lib/snmp/doc/src/snmp_agent_config_files.xml @@ -0,0 +1,464 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Definition of Agent Configuration Files + + + + + + + + snmp_agent_config_files.xml +
+

All configuration data must be included in configuration files + that are located in the configuration directory. The name of this + directory is given in the config_dir configuration + parameter. These files are read at start-up, and are used to + initialize the SNMPv2-MIB or STANDARD-MIB, SNMP-FRAMEWORK-MIB, + SNMP-MPD-MIB, SNMP-VIEW-BASED-ACM-MIB, SNMP-COMMUNITY-MIB, + SNMP-USER-BASED-SM-MIB, SNMP-TARGET-MIB and SNMP-NOTIFICATION-MIB + (refer to the Management of the Agent for a description of the MIBs).

+

The files are:

+ + +

agent.conf: see + Agent Information

+
+ +

standard.conf: see + System Information

+
+ +

context.conf: see + Contexts

+
+ +

community.conf: see + Communities

+
+ +

target_addr.conf: see + Target Address Definitions

+
+ +

target_params.conf: see + Target Parameters Definitions

+
+ +

vacm.conf: see + MIB Views for VACM

+
+ +

usm.conf: see + Security data for USM

+
+ +

notify.conf: see + Notify Definitions

+
+
+

The directory where the configuration files are found is given as + a parameter to the agent.

+

The entry format in all files are Erlang terms, separated by a + '.' and a newline. In the following sections, the + formats of these terms are described. Comments may be specified as + ordinary Erlang comments.

+

Syntax errors in these files are discovered and reported with the + function config_err/2 of the error report module at start-up.

+ +
+ + Agent Information +

The agent information should be stored in a file called + agent.conf. +

+

Each entry is a tuple of size two: +

+

{AgentVariable, Value}.

+ + AgentVariable is one of the variables is + SNMP-FRAMEWORK-MIB or one of the internal variables + intAgentUDPPort, which defines which UDP port the agent + listens to, or intAgentIpAddress, which defines the IP + address of the agent. + + Value is the value for the variable. + + +

The following example shows a agent.conf file: +

+
+{intAgentUDPPort, 4000}.
+{intAgentIpAddress,[141,213,11,24]}.
+{snmpEngineID, "mbj's engine"}.
+{snmpEngineMaxPacketSize, 484}.
+    
+

The value of snmpEngineID is a string, which for a + deployed agent should have a very specific structure. See + RFC 2271/2571 for details. +

+
+ +
+ + Contexts +

The context information should be stored in a file called + context.conf. The default context "" + need not be present. +

+

Each row defines a context in the agent. This information is + used in the table vacmContextTable in the + SNMP-VIEW-BASED-ACM-MIB. +

+

Each entry is a term: +

+

ContextName.

+ + ContextName is a string. + + +
+ +
+ + System Information +

The system information should be stored in a file called + standard.conf. +

+

Each entry is a tuple of size two: +

+

{SystemVariable, Value}.

+ + SystemVariable is one of the variables in the + system group, or snmpEnableAuthenTraps. + + Value is the value for the variable. + + +

The following example shows a valid standard.conf file: +

+
+{sysDescr, "Erlang SNMP agent"}.
+{sysObjectID, [1,2,3]}.
+{sysContact, "(mbj,eklas)@erlang.ericsson.se"}.
+{sysName, "test"}.
+{sysServices, 72}.
+{snmpEnableAuthenTraps, enabled}.
+    
+

A value must be provided for all variables, which lack default + values in the MIB. +

+
+ +
+ + Communities +

The community information should be stored in a file called + community.conf. It must be present if the agent is + configured for SNMPv1 or SNMPv2c. +

+

The corresponding table is snmpCommunityTable in the + SNMP-COMMUNITY-MIB. +

+

Each entry is a term: +

+

{CommunityIndex, CommunityName, SecurityName, ContextName, TransportTag}.

+ + CommunityIndex is a non-empty string. + + CommunityName is a string. + + SecurityName is a string. + + ContextName is a string. + + TransportTag is a string. + + +
+ +
+ + MIB Views for VACM +

The information about MIB Views for VACM should be stored in a + file called + vacm.conf. +

+

The corresponding tables are vacmSecurityToGroupTable, + vacmAccessTable and vacmViewTreeFamilyTable in the + SNMP-VIEW-BASED-ACM-MIB. +

+

Each entry is one of the terms, one entry corresponds to one + row in one of the tables. +

+

{vacmSecurityToGroup, SecModel, SecName, GroupName}.

+

{vacmAccess, GroupName, Prefix, SecModel, SecLevel, Match, ReadView, WriteView, NotifyView}.

+

{vacmViewTreeFamily, ViewIndex, ViewSubtree, ViewStatus, ViewMask}.

+ + +

SecModel is any, v1, v2c, or + usm.

+
+ +

SecName is a string.

+
+ +

GroupName is a string.

+
+ +

Prefix is a string.

+
+ +

SecLevel is noAuthNoPriv, authNoPriv, + or authPriv

+
+ +

Match is prefix or exact.

+
+ +

ReadView is a string.

+
+ +

WriteView is a string.

+
+ +

NotifyView is a string. +

+
+ +

ViewIndex is an integer.

+
+ +

ViewSubtree is a list of integer.

+
+ +

ViewStatus is either included or excluded

+
+ +

ViewMask is either null or a list of ones and + zeros. Ones nominate that an exact match is used for this + sub-identifier. Zeros are wild-cards which match any + sub-identifier. If the mask is shorter than the sub-tree, the + tail is regarded as all ones. null is shorthand for a + mask with all ones.

+
+
+
+ +
+ + Security data for USM +

The information about Security data for USM should be stored in a + file called + usm.conf, which must be present if the agent is configured + for SNMPv3. +

+

The corresponding table is usmUserTable in the + SNMP-USER-BASED-SM-MIB. +

+

Each entry is a term: +

+

{EngineID, UserName, SecName, Clone, AuthP, AuthKeyC, OwnAuthKeyC, PrivP, PrivKeyC, OwnPrivKeyC, Public, AuthKey, PrivKey}.

+ + +

EngineID is a string. +

+
+ +

UserName is a string.

+
+ +

SecName is a string.

+
+ +

Clone is zeroDotZero or a list of integers.

+
+ +

AuthP is a usmNoAuthProtocol, + usmHMACMD5AuthProtocol, or usmHMACSHAAuthProtocol.

+
+ +

AuthKeyC is a string.

+
+ +

OwnAuthKeyC is a string.

+
+ +

PrivP is a usmNoPrivProtocol, + usmDESPrivProtocol or usmAesCfb128Protocol.

+
+ +

PrivKeyC is a string.

+
+ +

OwnPrivKeyC is a string.

+
+ +

Public is a string.

+
+ +

AuthKey is a list (of integer). This is the User's secret + localized authentication key. It is not visible in the MIB. The length + of this key needs to be 16 if usmHMACMD5AuthProtocol is used, and + 20 if usmHMACSHAAuthProtocol is used.

+
+ +

PrivKey is a list (of integer). This is the User's secret + localized encryption key. It is not visible in the MIB. The length + of this key needs to be 16 if usmDESPrivProtocol or + usmAesCfb128Protocol is used. +

+
+
+
+ +
+ + Notify Definitions +

The information about Notify Definitions should be stored in a + file called + notify.conf. +

+

The corresponding table is snmpNotifyTable in the + SNMP-NOTIFICATION-MIB. +

+

Each entry is a term: +

+

{NotifyName, Tag, Type}.

+ + +

NotifyName is a unique non-empty string. +

+
+ +

Tag is a string. +

+
+ +

Type is trap or inform. +

+
+
+
+ +
+ + Target Address Definitions +

The information about Target Address Definitions should be + stored in a file called + target_addr.conf. +

+

The corresponding tables are snmpTargetAddrTable in the + SNMP-TARGET-MIB and snmpTargetAddrExtTable in the SNMP-COMMUNITY-MIB. +

+

Each entry is a term: +

+

{TargetName, Ip, Udp, Timeout, RetryCount, TagList, ParamsName, EngineId}. or

+{TargetName, Ip, Udp, Timeout, RetryCount, TagList, ParamsName, EngineId, TMask, MaxMessageSize}.

+ + +

TargetName is a unique non-empty string. +

+
+ +

Ip is a list of four integers. +

+
+ +

Udp is an integer. +

+
+ +

Timeout is an integer. +

+
+ +

RetryCount is an integer. +

+
+ +

TagList is a string. +

+
+ +

ParamsName is a string. +

+
+ +

EngineId is a string or the atom discovery. +

+
+ +

TMask is a string of size 0, or size 6 (default: []). +

+
+ +

MaxMessageSize is an integer (default: 2048). +

+
+
+

Note that if EngineId has the value discovery, + the agent cannot send + inform messages to that manager until it has performed the + discovery process with that manager.

+
+ +
+ + Target Parameters Definitions +

The information about Target Parameters Definitions should be + stored in a file called + target_params.conf. +

+

The corresponding table is snmpTargetParamsTable in the + SNMP-TARGET-MIB. +

+

Each entry is a term: +

+

{ParamsName, MPModel, SecurityModel, SecurityName, SecurityLevel}.

+ + +

ParamsName is a unique non-empty string. +

+
+ +

MPModel is v1, v2c or v3

+
+ +

SecurityModel is v1, v2c, or usm. +

+
+ +

SecurityName is a string. +

+
+ +

SecurityLevel is noAuthNoPriv, authNoPriv + or authPriv. +

+
+
+
+
+ diff --git a/lib/snmp/doc/src/snmp_agent_funct_descr.xml b/lib/snmp/doc/src/snmp_agent_funct_descr.xml new file mode 100644 index 0000000000..9a1bf28ab1 --- /dev/null +++ b/lib/snmp/doc/src/snmp_agent_funct_descr.xml @@ -0,0 +1,947 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Agent Functional Description + + + + + + + + snmp_agent_funct_descr.xml +
+

The SNMP agent system consists of one Master Agent and + optional Sub-agents. +

+

The tool makes it easy to dynamically extend an SNMP agent in + run-time. MIBs can be loaded and unloaded at any time. It is also + easy to change the implementation of an MIB in run-time, without + having to recompile the MIB. The MIB implementation is clearly + separated from the agent. +

+

To facilitate incremental MIB implementation, the tool can + generate a prototype implementation for a whole MIB, or parts + thereof. This allows different MIBs and management applications to + be developed at the same time. +

+ +
+ Features + +

To implement an agent, the programmer writes instrumentation + functions for the variables and the tables in the MIBs that the + agent is going to support. A running prototype which handles set, + get, and get-next can be created without any programming. +

+

The toolkit provides the following: +

+ + multi-lingual multi-threaded extensible SNMP agent + easy writing of instrumentation functions with a + high-level programming language + basic fault handling such as automatic type checking + access control + authentication + privacy through encryption + loading and unloading of MIBs in run-time + the ability to change instrumentation functions without + recompiling the MIB + rapid prototyping environment where the MIB compiler can + use generic instrumentation functions, which later can be + refined by the programmer + a simple and extensible model for transaction handling and + consistency checking of set-requests + support of the sub-agent concept via distributed Erlang + a mechanism for sending notifications (traps and informs) + support for implementing SNMP tables in the Mnesia DBMS. + +
+ +
+ SNMPv1, SNMPv2 and SNMPv3 + +

The SNMP development toolkit works with all three versions of + Standard Internet Management Framework; SNMPv1, SNMPv2 and SNMPv3. + They all share the same basic structure and components. And they + follow the same architecture.

+

The versions are defined in following RFCs

+ + SNMPv1 RFC 1555, 1157 1212, 1213 and 1215 + SNMPv2 RFC 1902 - 1907 + SNMPv3 RFC 2570 - 2575 + +

Over time, as the Framework has evolved from SNMPv1 , through SNMPv2, + to SNMPv3 the definitions of each of these architectural components + have become richer and more clearly defined, but the fundamental + architecture has remained consistent.

+

The main features of SNMPv2 compared to SNMPv1 are: +

+ + The get-bulk operation for transferring large + amounts of data. + + Enhanced error codes. + + A more precise language for MIB specification + +

The standard documents that define SNMPv2 are incomplete, in + the sense that they do not specify how an SNMPv2 message looks + like. The message format and security issues are left to a + special Administrative Framework. One such framework is the + Community-based SNMPv2 Framework (SNMPv2c), which uses the same + message format and framework as SNMPv1. Other + experimental frameworks as exist, e.g. SNMPv2u and SNMPv2*. +

+

The SNMPv3 specifications take a modular + approach to SNMP. All modules are + separated from each other, and can be extended or replaced + individually. Examples of modules are Message definition, + Security and Access Control. The main features of SNMPv3 are: +

+ + Encryption and authentication is added. + + MIBs for agent configuration are defined. + +

All these specifications are commonly referred to as "SNMPv3", + but it is actually only the Message module, which defines a new + message format, and Security module, which takes care of + encryption and authentication, that cannot be used with SNMPv1 or + SNMPv2c. In this version of the agent toolkit, all the standard + MIBs for agent configuration are used. This includes MIBs for + definition of management targets for notifications. These MIBs + are used regardless of which SNMP version the agent is configured + to use. +

+

The extensible agent in this toolkit understands the SNMPv1, + SNMPv2c and SNMPv3. Recall that SNMP consists of two separate + parts, the MIB definition language (SMI), and the protocol. On + the protocol level, the agent can be configured to speak v1, v2c, + v3 or any combination of them at the same time, i.e. a v1 request + gets an v1 reply, a v2c request gets a v2c reply, and a v3 request + gets a v3 reply. On the MIB level, the MIB compiler can compile + both SMIv1 and SMIv2 MIBs. Once compiled, any of the formats can + be loaded into the agent, regardless of which protocol version the + agent is configured to use. This means that the agent translates + from v2 notifications to v1 traps, and vice versa. For example, + v2 MIBs can be loaded into an agent that speaks v1 only. The + procedures for the translation between the two protocols are + described in RFC 1908 and RFC 2089. +

+

In order for an implementation to make full use of the enhanced + SNMPv2 error codes, it is essential that the instrumentation + functions always return SNMPv2 error codes, in case of error. + These are translated into the corresponding SNMPv1 error codes by + the agent, if necessary.

+ +

The translation from an SMIv1 MIB to an SNMPv2c or SNMPv3 reply + is always very straightforward, but the translation from a v2 MIB + to a v1 reply is somewhat more complicated. There is one data + type in SMIv2, called Counter64, that an SNMPv1 manager cannot + decode correctly. Therefore, an agent may never send a Counter64 + object to an SNMPv1 manager. The common practice in these + situations is to simple ignore any Counter64 objects, when sending + a reply or a trap to an SNMPv1 manager. For example, if an SNMPv1 + manager tries to GET an object of type Counter64, he will get a + noSuchName error, while an SNMPv2 manager would get a + correct value.

+
+
+ +
+ Operation + +

The following steps are needed to get a running agent:

+ + +

Write your MIB in SMI in a text file.

+
+ +

Write the instrumentation functions in Erlang and compile them.

+
+ +

Put their names in the association file.

+
+ +

Run the MIB together with the association file through the + MIB compiler.

+
+ +

Configure the application (agent).

+
+ +

Start the application (agent).

+
+ +

Load the compiled MIB into the agent.

+
+
+

The figures in this section illustrate the steps involved in + the development of an SNMP agent.

+ + + MIB Compiler Principles + +

The compiler parses the SMI file and associates each table or + variable with an instrumentation function (see the figure MIB Compiler Principles). The actual + instrumentation functions are not needed at MIB compile time, only + their names. +

+

The binary output file produced by the compiler is read by the + agent at MIB load time (see the figure Starting the Agent). The instrumentation is ordinary Erlang code which + is loaded explicitly or automatically the first time it is called.

+ + + Starting the Agent + +

The SNMP agent system consists of one Master Agent and optional + sub-agents. The Master Agent can be seen as a special kind of + sub-agent. It implements the core agent functionality, UDP packet + processing, type checking, access control, trap distribution, and + so on. From a user perspective, it is used as an ordinary + sub-agent. +

+

Sub-agents are only needed if your application requires special + support for distribution from the SNMP toolkit. A sub-agent can + also be used if the application requires a more complex set + transaction scheme than is found in the master agent. +

+

The following illustration shows how a system can look in runtime.

+ + + Architecture + +

A typical operation could include the following steps:

+ + The Manager sends a request to the Agent. + The Master Agent decodes the incoming UDP packet. + The Master Agent determines which items in the request + that should be processed here and which items should be + forwarded to its subagent. + Step 3 is repeated by all subagents. + Each sub-agent calls the instrumentation for its loaded MIBs. + The results of calling the instrumentation are propagated + back to the Master Agent. + The answer to the request is encoded to a UDP Protocol + Data Unit (PDU). + +

The sequence of steps shown is probably more complex than + normal, but it illustrates the amount of functionality which is + available. The following points should be noted: +

+ + An agent can have many MIBs loaded at the same time. + Sub-agents can also have sub-agents. Each sub-agent can have + an arbitrary number of child sub-agents registered, forming a + hierarchy. + One MIB can communicate with many applications. + Instrumentation can use Distributed Erlang to communicate + with an application. + +

Most applications only need the Master Agent because an agent + can have multiple MIBs loaded at the same time.

+
+ +
+ Sub-agents and MIB Loading + +

Since applications tend to be transient (they are dynamically + loaded and unloaded), the management of these applications must be + dynamic as well. For example, if we have an equipment MIB for a + rack and different MIBs for boards, which can be installed in the + rack, the MIB for a card should be loaded when the card is + inserted, and unloaded when the card is removed. +

+

In this agent system, there are two ways to dynamically install + management information. The most common way is to load an MIB into + an agent. The other way is to use a sub-agent, which is controlled + by the application and is able to register and unregister itself. A + sub-agent can register itself for managing a sub-tree (not to be mixed up + with erlang:register). The sub-tree is identified by an + Object Identifier. When a sub-agent is registered, it receives all + requests for this particular sub-tree and it is responsible for + answering them. It should also be noted that a sub-agent can be + started and stopped at any time. +

+

Compared to other SNMP agent packages, there is a significant + difference in this way of using sub-agents. Other packages normally + use sub-agents to load and unload MIBs in run-time. In Erlang, it is + easy to load code in run-time and it is possible to load an MIB + into an existing sub-agent. It is not necessary to create a new process + for handling a new MIB. +

+

Sub-agents are used for the following reasons: +

+ + to provide a more complex set-transaction scheme than + master agent + to avoid unnecessary process communication + to provide a more lightweight mechanism for loading and + unloading MIBs in run-time + to provide interaction with other SNMP agent toolkits. + +

Refer to the chapter + Advanced Agent Topics + in this User's Guide for more information about these topics. +

+

The communication protocol between sub-agents is the normal + message passing which is used in distributed Erlang systems. This + implies that sub-agent communication is very efficient compared to + SMUX, DPI, AgentX, and similar protocols.

+
+ +
+ Contexts and Communities + +

A context is a collection of management information accessible + by an SNMP entity. An instance of a management object may exist in + more than one context. An SNMP entity potentially has access to + many contexts.

+

Each managed object can exist in many instances within a + SNMP entity. To identify the instances, specified by an MIB module, + a method to distinguish the actual instance by its 'scope' or + context is used. Often the context is a physical or a logical device. + It can include multiple devices, a subset of a single device or a + subset of multiple devices, but the context is always + defined as a subset of a single SNMP entity. To be able to + identify a specific + item of management information within an SNMP entity, the context, + the object type and its instance must be used.

+

For example, the managed object type ifDescr from RFC1573, is + defined as the description of a network interface. To identify + the description of device-X's first network interface, four pieces + of information are needed: the snmpEngineID of the SNMP entity + which provides access to the management information at device-X, + the contextName (device-X), the managed object type + (ifDescr), and the instance ("1"). +

+

In SNMPv1 and SNMPv2c, the community string in the message was + used for (at least) three different purposes: +

+ + +

to identify the context

+
+ +

to provide authentication

+
+ +

to identify a set of trap targets

+
+
+

In SNMPv3, each of these usage areas has its own unique + mechanism. A context is identified by the name of the SNMP + entity, contextEngineID, and the name of the context, + contextName. Each SNMPv3 message contains values for these + two parameters. +

+

There is a MIB, SNMP-COMMUNITY-MIB, which maps a community + string to a contextEngineID and contextName. Thus, + each message, an SNMPv1, SNMPv2c or an SNMPv3 message, always + uniquely identifies a context. +

+

For an agent, the contextEngineID identified by a received + message, is always equal to the snmpEngineID of the agent. + Otherwise, the message was not intended for the agent. If the + agent is configured with more than one context, the + instrumentation code must be able to figure out for which context + the request was intended. There is a function + snmpa:current_context/0 provided for this purpose. +

+

By default, the agent has no knowledge of any other contexts + than the default context, "". If it is to support more + contexts, these must be explicitly added, by using an appropriate + configuration file + Agent Configuration Files. +

+
+ +
+ Management of the Agent + +

There is a set of standard MIBs, which are used to control and + configure an SNMP agent. All of these MIBs, with the exception of + the optional SNMP-PROXY-MIB (which is only used for proxy agents), + are implemented in this agent. Further, it is configurable which + of these MIBs are actually loaded, and thus made visible to SNMP + managers. For example, in a non-secure environment, it might be a + good idea to not make MIBs that define access control visible. + Note, the data the MIBs define is used internally in the + agent, even if the MIBs not are loaded. This chapter describes + these standard MIBs, and some aspects of their implementation. +

+

Any SNMP agent must implement the system group and the + snmp group, defined in MIB-II. The definitions of these + groups have changed from SNMPv1 to SNMPv2. MIBs and implementations + for both of these versions are Provided in the + distribution. The MIB file for SNMPv1 is called STANDARD-MIB, and the + corresponding for SNMPv2 is called SNMPv2-MIB. If the agent is + configured for SNMPv1 only, the STANDARD-MIB is loaded by default; + otherwise, the SNMPv2-MIB is loaded by default. It is possible to + override this default behavior, by explicitly loading another + version of this MIB, for example, you could choose to implement + the union of all objects in these two MIBs. +

+

An SNMPv3 agent must implement the SNMP-FRAMEWORK-MIB and + SNMP-MPD-MIB. These MIBs are loaded by default, if the agent is + configured for SNMPv3. These MIBs can be loaded for other + versions as well. +

+

There are five other standard MIBs, which also may be loaded + into the agent. These MIBs are: +

+ + +

SNMP-TARGET-MIB and SNMP-NOTIFICATION-MIB, which defines + managed objects for configuration of management targets, + i.e. receivers of notifications (traps and informs). These + MIBs can be used with any SNMP version. +

+
+ +

SNMP-VIEW-BASED-ACM-MIB, which defined managed objects + for access control. This MIB can be used with any SNMP + version. +

+
+ +

SNMP-COMMUNITY-MIB, which defines managed objects for + coexistence of SNMPv1 and SNMPv2c with SNMPv3. This MIB is + only useful if SNMPv1 or SNMPv2c is used, possibly in + combination with SNMPv3. +

+
+ +

SNMP-USER-BASED-SM-MIB, which defines managed objects + for authentication and privacy. This MIB is only useful + with SNMPv3. +

+
+
+

All of these MIBs should be loaded into the Master Agent. Once + loaded, these MIBs are always available in all contexts. +

+

The ASN.1 code, the Erlang source code, and the generated + .hrl files for them are provided in the distribution and are + placed in the directories mibs, src, and include, + respectively, in the snmp application. +

+

The .hrl files are generated with + snmpc:mib_to_hrl/1. Include these files in your code as in + the following example: +

+ +-include_lib("snmp/include/SNMPv2-MIB.hrl"). + +

The initial values for the managed objects defined in these + tables, are read at start-up from a set of configuration files. + These are described in Configuration Files. +

+ +
+ STANDARD-MIB and SNMPv2-MIB +

These MIBs contain the snmp- and system groups + from MIB-II which is defined in RFC1213 (STANDARD-MIB) or + RFC1907 (SNMPv2-MIB). They are implemented in the + snmp_standard_mib module. The snmp counters all + reside in volatile memory and the system and + snmpEnableAuthenTraps variables in persistent memory, + using the SNMP built-in database (refer to the Reference Manual, + section snmp, module snmpa_local_db for more + details).

+

If another implementation of any of these variables is needed, + e.g. to store the persistent variables in a Mnesia database, + an own implementation of the variables must be made. That MIB + will be compiled and loaded instead of the default MIB. + The new compiled MIB + must have the same name as the original MIB (i.e. STANDARD-MIB + or SNMPv2-MIB), and be located in the SNMP configuration + directory (see Configuration Files.) +

+

One of these MIBs is always loaded. If only SNMPv1 is used, + STANDARD-MIB is loaded, otherwise SNMPv2-MIB is loaded. +

+ +
+ Data Types +

There are some new data types in SNMPv2 that are useful in + SNMPv1 as well. In the STANDARD-MIB, three data types are + defined, RowStatus, TruthValue and + DateAndTime. These data types are originally defined + as textual conventions in SNMPv2-TC (RFC1903). +

+
+
+ +
+ SNMP-FRAMEWORK-MIB and SNMP-MPD-MIB +

The SNMP-FRAMEWORK-MIB and SNMP-MPD-MIB define additional + read-only managed objects, which + is used in the generic SNMP framework defined in RFC2271 and the + generic message processing and dispatching module defined in + RFC2272. They are generic in the sense that they are not tied + to any specific SNMP version. +

+

The objects in these MIBs are implemented in the modules + snmp_framework_mib and snmp_standard_mib, + respectively. All objects reside in volatile memory, and the + configuration files are always reread at start-up. +

+

If SNMPv3 is used, these MIBs are loaded by default. +

+
+ +
+ SNMP-TARGET-MIB and SNMP-NOTIFICATION-MIB +

The SNMP-TARGET-MIB and SNMP-NOTIFICATION-MIB define managed + objects for configuration of notification receivers. They + are described in detail in RFC2273. Only a brief description + is given here. +

+

All tables in these MIBs have a column of type + StorageType. The value of this column specifies how each + row is stored, and what happens in case of a restart of the + agent. The implementation supports the values volatile + and nonVolatile. When the tables are initially filled + with data from the configuration files, these rows will + automatically have storage type nonVolatile. Should the + agent restart, all nonVolatile rows survive the restart, + while the volatile rows are lost. + The configuration files are not read at restart, by default. +

+

These MIBs are not loaded by default. +

+ +
+ snmpNotifyTable +

An entry in the snmpNotifyTable selects a set + of management targets, which should receive notifications, + as well as the type (trap or inform) of notification that + should be sent to each selected management target. + When an application sends a notification using + the function send_notification/5 or the function + send_trap the parameter NotifyName, specified in + the call, is used as an index in the table. The notification + is sent to the management targets selected by that entry. +

+
+ +
+ snmpTargetAddrTable +

An entry in the snmpTargetAddrTable defines + transport parameters (such as + IP address and UDP port) for each management target. Each row + in the snmpNotifyTable refers to potentially many rows + in the snmpTargetAddrTable. Each row in the + snmpTargetAddrTable + refers to an entry in the snmpTargetParamsTable. +

+
+ +
+ snmpTargetParamsTable +

An entry in the snmpTargetParamsTable defines + which SNMP version to use, and which security parameters to use. +

+

Which SNMP version to use is implicitly defined by + specifying the Message Processing Model. This version of the + agent handles the models v1, v2c and v3. +

+

Each row specifies which security model to use, along with + security level and security parameters. +

+
+
+ +
+ SNMP-VIEW-BASED-ACM-MIB +

The SNMP-VIEW-BASED-ACM-MIB defines managed objects to + control access to the the managed objects for the managers. + The View Based Access Control Module (VACM) can be used with + any SNMP version. However, if it is used with SNMPv1 or SNMPv2c, + the SNMP-COMMUNITY-MIB defines additional objects to map + community strings to VACM parameters. +

+

All tables in this MIB have a column of type StorageType. + The value of this column specifies how each + row is stored, and what happens in case of a restart of the + agent. The implementation supports the values volatile + and nonVolatile. When the tables are initially filled + with data from the configuration files, these rows will + automatically have storage type nonVolatile. Should the + agent restart, all nonVolatile rows survive the restart, + while the volatile rows are lost. + The configuration files are not read at restart by default. +

+

This MIB is not loaded by default. +

+

VACM is described in detail in RFC2275. Here is only a brief + description given. +

+

The basic concept is that of a MIB view. An MIB view + is a subset of all the objects implemented by an agent. A + manager has access to a certain MIB view, depending on which + security parameters are used, in which context the request is + made, and which type of request is made. +

+

The following picture gives an overview of the mechanism to + select an MIB view:

+ + Overview of the mechanism of MIB selection + + +
+ vacmContextTable +

The vacmContextTable is a read-only table that lists all + available contexts. +

+
+ +
+ vacmSecurityToGroupTable +

The vacmSecurityToGroupTable maps a securityModel + and a + securityName to a groupName. +

+
+ +
+ vacmAccessTable +

The vacmAccessTable maps the groupName (found in + vacmSecurityToGroupTable), contextName, + securityModel, and securityLevel to an MIB view + for each type of operation (read, write, or notify). The MIB + view is represented as a viewName. The definition of + the MIB view represented by the viewName is found in + the vacmViewTreeFamilyTable

+
+ +
+ vacmViewTreeFamilyTable +

The vacmViewTreeFamilyTable is indexed by the + viewName, and defines + which objects are included in the MIB view. +

+

The MIB definition for the table looks as follows:

+
+VacmViewTreeFamilyEntry ::= SEQUENCE
+    {
+        vacmViewTreeFamilyViewName     SnmpAdminString,
+        vacmViewTreeFamilySubtree      OBJECT IDENTIFIER,
+        vacmViewTreeFamilyMask         OCTET STRING,
+        vacmViewTreeFamilyType         INTEGER,
+        vacmViewTreeFamilyStorageType  StorageType,
+        vacmViewTreeFamilyStatus       RowStatus
+    }
+
+INDEX { vacmViewTreeFamilyViewName,
+        vacmViewTreeFamilySubtree
+      }
+        
+

Each vacmViewTreeFamilyViewName refers to a + collection of sub-trees. +

+ +
+ MIB View Semantics +

An MIB view is a collection of included and excluded + sub-trees. A sub-tree is identified by an OBJECT IDENTIFIER. A + mask is associated with each sub-tree. +

+

For each possible MIB object instance, the instance + belongs to a sub-tree if: +

+ + the OBJECT IDENTIFIER name of that MIB object + instance comprises at least as many sub-identifiers as + does the sub-tree, and + + each sub-identifier in the name of that MIB object + instance matches the corresponding sub-identifier of the + sub-tree whenever the corresponding bit of the associated + mask is 1 (0 is a wild card that matches anything). + +

Membership of an object instance in an MIB view is + determined by the following algorithm: +

+ + If an MIB object instance does not belong to any of + the relevant sub-trees, then the instance is not in the + MIB view. + + If an MIB object instance belongs to exactly one + sub-tree, then the instance is included in, or excluded + from, the relevant MIB view according to the type of + that entry. + + If an MIB object instance belongs to more than one + sub-tree, then the sub-tree which comprises the greatest + number of sub-identifiers, and is the lexicographically + greatest, is used. + + + +

If the OBJECT IDENTIFIER is longer than an OBJECT + IDENTIFIER of an object type in the MIB, it refers to + object instances. Because of this, it is possible to + control whether or not particular rows in a table shall be + visible.

+
+
+
+
+ +
+ SNMP-COMMUNITY-MIB +

The SNMP-COMMUNITY-MIB defines managed objects that is used + for coexistence between SNMPv1 and SNMPv2c with SNMPv3. + Specifically, it contains objects for mapping between community + strings and version-independent SNMP message parameters. In + addition, this MIB provides a mechanism for performing source address + validation on incoming requests, and for selecting community + strings based on target addresses for outgoing notifications. +

+

All tables in this MIB have a column of type + StorageType. The value of this column specifies how each + row is stored, and what happens in case of a restart of the + agent. The implementation supports the values volatile + and nonVolatile. When the tables are initially filled + with data from the configuration files, these rows will + automatically have storage type nonVolatile. Should the + agent restart, all nonVolatile rows survive the restart, + while the volatile rows are lost. + The configuration files are not read at restart, by default. +

+

This MIB is not loaded by default. +

+
+ +
+ SNMP-USER-BASED-SM-MIB +

The SNMP-USER-BASED-SM-MIB defines managed objects that is + used for the User-Based Security Model. +

+

All tables in this MIB have a column of type + StorageType. The value of the column specifies how each + row is stored, and what happens in case of a restart of the + agent. The implementation supports the values volatile + and nonVolatile. When the tables are initially filled + with data from the configuration files, these rows will + automatically have storage type nonVolatile. Should the + agent restart, all nonVolatile rows survive the restart, + while the volatile rows are lost. + The configuration files are not read at restart, by default. +

+

This MIB is not loaded by default. +

+
+ +
+ OTP-SNMPEA-MIB +

The OTP-SNMPEA-MIB was used in earlier versions of the agent, before + standard MIBs existed for access control, MIB views, and trap + target specification. All objects in this MIB are now obsolete. +

+
+
+ +
+ Notifications + +

Notifications are defined in SMIv1 with the TRAP-TYPE macro in + the definition of an MIB (see RFC1215). The corresponding + macro in SMIv2 is NOTIFICATION-TYPE. When an application + decides to send a notification, it calls one of the following + functions: +

+ +snmpa:send_notification(Agent, Notification, Receiver + [, NotifyName, ContextName, Varbinds]) +snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds]) + +

providing the registered name or process identifier of the + agent where the MIB, which defines the notification is loaded and + the symbolic name of the notification. +

+

If the send_notification/3,4 function is used, all + management targets are selected, as defined in RFC2273. The + Receiver parameter defines where the agent should send + information about the delivery of inform requests. +

+

If the send_notification/5 function is used, an + NotifyName must be provided. This parameter is used as an + index in the snmpNotifyTable, and the management targets + defined by that single entry is used. +

+

The send_notification/6 function is the most general + version of the function. A ContextName must be specified, + from which the notification will be sent. If this parameter is + not specified, the default context ("") is used. +

+

The function send_trap is kept for backwards + compatibility and should not be used in new code. Applications + that use this function will + continue to work. The snmpNotifyName is used as the + community string by the agent when a notification is sent. +

+ +
+ Notification Sending +

The simplest way to send a notification is to call the function + snmpa:send_notification(Agent, Notification, no_receiver). + In this case, the agent performs a get-operation to retrieve the + object values that are defined in the notification + specification (with the TRAP-TYPE or NOTIFICATION-TYPE macros). + The notification is sent to all managers defined in the target + and notify tables, either unacknowledged as traps, or + acknowledged as inform requests. +

+

If the caller of the function wants to know whether or not + acknowledgments are received for a certain notification + (provided it is sent as an inform), the Receiver + parameter can be specified as {Tag, ProcessName} (refer + to the Reference Manual, section snmp, module snmp for + more details). In this case, the agent send a message + {snmp_notification, Tag, {got_response, ManagerAddr}} or + {snmp_notification, Tag, {no_response, ManagerAddr}} for + each management target. +

+

Sometimes it is not possible to retrieve the values for some + of the objects in the notification specification with a + get-operation. However, they are known when the + send_notification function is called. This is the case if + an object is an element in a table. It is possible to give the + values of some objects to the send_notification function + snmpa:send_notification(Agent, Notification, Receiver, Varbinds). In this function, Varbinds is a list of + Varbind, where each Varbind is one of: +

+ + {Variable, Value}, where Variable is the + symbolic name of a scalar variable referred to in the notification + specification. + + {Column, RowIndex, Value}, where Column is + the symbolic name of a column variable. RowIndex is a + list of indices for the specified element. If this is the + case, the OBJECT IDENTIFIER sent in the trap is the + RowIndex appended to the OBJECT IDENTIFIER for the + table column. This is the OBJECT IDENTIFIER which specifies + the element. + + {OID, Value}, where OID is the OBJECT + IDENTIFIER for an instance of an object, scalar variable or + column variable. + + +

For example, to specify that sysLocation should have the + value "upstairs" in the notification, we could use one of: +

+ + {sysLocation, "upstairs"} or + {[1,3,6,1,2,1,1,6,0], "upstairs"} + +

It is also possible to specify names and values for extra + variables that should be sent in the notification, but were not + defined in the notification specification. +

+

The notification is sent to all management targets found in + the tables. However, make sure that each manager has access to + the variables in the notification. If a variable is outside a + manager's MIB view, this manager will not receive the + notification. +

+ +

By definition, it is not possible to send objects with + ACCESS not-accessible in notifications. However, + historically this is often done and for this reason we allow + it in notification sending. If a variable has ACCESS + not-accessible, the user must provide a value for the + variable in the Varbinds list. It is not possible for + the agent to perform a get-operation to retrieve this value. +

+
+
+ +
+ Notification Filters +

It is possible to add notification filters to an agent. + These filters will be called when a notification is to be + sent. Their purpose is to allow modification, suppression or + other type of actions.

+

A notification filter is a module implementing the + snmpa_notification_filter behaviour. A filter is added/deleted using the functions: + snmpa:register_notification_filter and + snmpa:unregister_notification_filter.

+

Unless otherwise specified, the order of the registered filters + will be the order in which they are registered.

+
+ +
+ Sub-agent Path +

If a value for an object is not given to the + send_notification function, the sub-agent will perform a + get-operation to retrieve it. If the object is not implemented + in this sub-agent, its parent agent tries to perform a + get-operation to retrieve it. If the object is not implemented + in this agent either, it forwards the object to its parent, and + so on. Eventually the Master Agent is reached and at this point + all unknown object values must be resolved. If some object is + unknown even to the Master Agent, this is regarded as an error + and is reported with a call to user_err/2 of the + error report module. No notifications are sent in this case. +

+

For a given notification, the variables, which are referred to + in the notification specification, must be implemented by the + agent that has the MIB loaded, or by some parent to this + agent. If not, the application must provide values for the + unknown variables. The application must also provide values for + all elements in tables. +

+
+
+ +
+ Discovery + +

The sender is authoritative for messages containing + payload which does not expect a response (for example + SNMPv2-Trap, Response or Report PDU).

+

The receiver is authoritative for messages containing + payload which expects a response (for example + Get, GetNext, Get-Bulk, Set or Inform PDU).

+

The agent can both perform and respond to discovery.

+

The agent responds to discovery autonomously, without interaction + by the user.

+

Initiating discovery towards a manager is done by calling the + discovery function. + The EngineId field of the target (manager) entry in the + target_addr.conf file has to have the value discovery. + Note that if the manager does not respond, the Timeout and + RetryCount + fields decide how long the function will hang before it returns.

+

Discovery can only be performed towards one manager at a time.

+
+ +
+ diff --git a/lib/snmp/doc/src/snmp_agent_netif.xml b/lib/snmp/doc/src/snmp_agent_netif.xml new file mode 100644 index 0000000000..1f2dbe80db --- /dev/null +++ b/lib/snmp/doc/src/snmp_agent_netif.xml @@ -0,0 +1,268 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Definition of Agent Net if + + + + + + + + snmp_agent_netif.xml +
+

+ + The Purpose of Agent Net if + +

The Network Interface (Net if) process delivers SNMP PDUs to a + master agent, and receives SNMP PDUs from the master agent. The most + common behaviour of a Net if process is that is receives bytes from + a network, decodes them into an SNMP PDU, which it sends to a master + agent. When the master agent has processed the PDU, it sends a + response PDU to the Net if process, which encodes the PDU into bytes + and transmits the bytes onto the network. +

+

However, that simple behaviour can be modified in numerous + ways. For example, the Net if process can apply some kind of + encrypting/decrypting scheme on the bytes or + act as a proxy filter, which sends some packets to a proxy agent and + some packets to the master agent. +

+

It is also possible to write your own Net if process. The default + Net if process is implemented in the module snmpa_net_if and + it uses UDP as the transport protocol. +

+

This section describes how to write a Net if process. +

+ +
+ + Mandatory Functions +

A Net if process must implement the SNMP agent + network interface behaviour. +

+
+ +
+ Messages +

The section Messages describes mandatory messages, which + Net if must send and be able to receive. +

+ +
+ Outgoing Messages +

Net if must send the following message when it receives an + SNMP PDU from the network that is aimed for the MasterAgent: +

+
+MasterAgent ! {snmp_pdu, Vsn, Pdu, PduMS, ACMData, From, Extra}
+      
+ + Vsn is either 'version-1', + 'version-2', or 'version-3'. + + Pdu is an SNMP PDU record, as defined in + snmp_types.hrl, with the SNMP request. + + PduMS is the Maximum Size of the response Pdu + allowed. Normally this is returned from + snmpa_mpd:process_packet (see Reference Manual). + + ACMData is data used by the Access Control Module + in use. Normally this is returned from + snmpa_mpd:process_packet (see Reference Manual). + + From is the source address. If UDP over IP is + used, this should be a 2-tuple {IP, UDPport}, where + IP is a 4-tuple with the IP address, and UDPport + is an integer. + + Extra is any term the Net if process wishes to + send to the agent. This term can be retrieved by the + instrumentation functions by calling + snmp:current_net_if_data(). This data is also sent back + to the Net if process when the agent generates a response to + the request. + +

The following message is used to report that a response to a + request has been received. The only request an agent can send + is an Inform-Request. +

+
+Pid ! {snmp_response_received, Vsn, Pdu, From}
+      
+ + Pid is the Process that waits for the response + for the request. The Pid was specified in the + send_pdu_req message (see below). + + Vsn is either 'version-1', 'version-2', or + 'version-3'. + + Pdu is the SNMP Pdu received + + From is the source address. If UDP over IP is + used, this should be a 2-tuple {IP, UDPport}, where + IP is a 4-tuple with the IP address, and UDPport + is an integer. + + +
+ +
+ Incoming Messages +

This section describes the incoming messages which a Net if + process must be able to receive. +

+ + +

{snmp_response, Vsn, Pdu, Type, ACMData, To, Extra}

+

This message is sent to the Net if process from a master + agent as a response to a previously received request. +

+ + Vsn is either 'version-1', + 'version-2', or 'version-3'. + + Pdu is an SNMP PDU record (as defined in + snmp_types.hrl) with the SNMP response. + + Type is the #pdu.type of the original + request. + + ACMData is data used by the Access Control + Module in use. Normally this is just sent to + snmpa_mpd:generate_response_message (see Reference Manual). + + To is the destination address. If UDP over IP + is used, this should be a 2-tuple {IP, UDPport}, + where IP is a 4-tuple with the IP address, and + UDPport is an integer. + + Extra is the term that the Net if process + sent to the agent when the request was sent to the agent. + + +
+ +

{discarded_pdu, Vsn, ReqId, ACMData, Variable, Extra}

+

This message is sent from a master agent if it for some + reason decided to discard the pdu. +

+ + Vsn is either 'version-1', + 'version-2', or 'version-3'. + + ReqId is the request id of the original + request. + + ACMData is data used by the Access Control + Module in use. Normally this is just sent to + snmpa_mpd:generate_response_message (see Reference Manual). + + Variable is the name of an snmp counter that + represents the error, e.g. snmpInBadCommunityUses. + + Extra is the term that the Net if process + sent to the agent when the request was sent to the agent. + + +
+ +

{send_pdu, Vsn, Pdu, MsgData, To}

+

This message is sent from a master agent when a trap is + to be sent. +

+ + Vsn is either 'version-1', + 'version-2', or 'version-3'. + + Pdu is an SNMP PDU record (as defined in + snmp_types.hrl) with the SNMP response. + + MsgData is the message specific data used in + the SNMP message. This value is normally sent to + snmpa_mpd:generate_message/4. In SNMPv1 and + SNMPv2c, this message data is the community string. In + SNMPv3, it is the context information. + + To is a list of the destination addresses and + their corresponding security parameters. This value is + normally sent to snmpa_mpd:generate_message/4. + + +
+ +

{send_pdu_req, Vsn, Pdu, MsgData, To, Pid}

+

This + message is sent from a master + agent when a request is + to be sent. The only request an agent can send is + Inform-Request. The net if process needs to remember the + request id and the Pid, and when a response is received for + the request id, send it to Pid, using a + snmp_response_received message. +

+ + Vsn is either 'version-1', + 'version-2', or 'version-3'. + + Pdu is an SNMP PDU record (as defined in + snmp_types.hrl) with the SNMP response. + + MsgData is the message specific data used in + the SNMP message. This value is normally sent to + snmpa_mpd:generate_message/4. In SNMPv1 and + SNMPv2c, this message data is the community string. In + SNMPv3, it is the context information. + + To is a list of the destination addresses and + their corresponding security parameters. This value is + normally sent to snmpa_mpd:generate_message/4. + + Pid is a process identifier. + + +
+
+
+ +
+ Notes +

Since the Net if process is responsible for encoding and + decoding of SNMP messages, it must also update the relevant + counters in the SNMP group in MIB-II. It can use the functions + in the module snmpa_mpd for this purpose (refer to the + Reference Manual, section snmp, + module snmpa_mpd + for more details.) +

+

There are also some useful functions for encoding and + decoding of SNMP messages in the module + snmp_pdus. +

+
+
+
+ diff --git a/lib/snmp/doc/src/snmp_agent_netif_1.gif b/lib/snmp/doc/src/snmp_agent_netif_1.gif new file mode 100644 index 0000000000..8687ae56fb Binary files /dev/null and b/lib/snmp/doc/src/snmp_agent_netif_1.gif differ diff --git a/lib/snmp/doc/src/snmp_agent_netif_1.ps b/lib/snmp/doc/src/snmp_agent_netif_1.ps new file mode 100644 index 0000000000..40a6376591 --- /dev/null +++ b/lib/snmp/doc/src/snmp_agent_netif_1.ps @@ -0,0 +1,2909 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Adobe Illustrator(r) 6.0 +%%For: (Anna Fedoriw) (Ericsson Telecom) +%%Title: (PurposeofNetif.eps) +%%CreationDate: (97-05-23) (14.06) +%%BoundingBox: 89 539 446 708 +%%HiResBoundingBox: 89.6046 539.5735 445.5998 707.3677 +%%DocumentProcessColors: Black +%%DocumentFonts: Univers +%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.0 0 +%%+ procset Adobe_typography_AI5 1.0 0 +%%+ procset Adobe_Illustrator_AI6_vars Adobe_Illustrator_AI6 +%%+ procset Adobe_Illustrator_AI5 1.0 0 +%AI5_FileFormat 2.0 +%AI3_ColorUsage: Black&White +%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) +%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 +%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () +%AI3_TemplateBox: 306 396 306 396 +%AI3_TileBox: 21 -12 588 802 +%AI3_DocumentPreview: Macintosh_ColorPic +%AI5_ArtSize: 595.2756 841.8898 +%AI5_RulerUnits: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 1 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI5_OpenToView: 2 796 1.5 1146 827 58 1 1 3 40 +%AI5_OpenViewLayers: 7 +%%EndComments +%%BeginProlog +%%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 23 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + 5 packedarray + } bind def + /setcustomcolor + { + exch aload pop pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + def + } if + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + level2? + { + gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore + add add add 4 eq + } + { + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + } ifelse + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset Adobe_typography_AI5 1.0 1 +%%Title: (Typography Operators) +%%Version: 1.0 +%%CreationDate:(03/26/93) () +%%Copyright: ((C) 1987-1993 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_typography_AI5 54 dict dup begin +put +/initialize +{ + begin + begin + Adobe_typography_AI5 begin + Adobe_typography_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + end + end + end + Adobe_typography_AI5 begin +} def +/terminate +{ + currentdict Adobe_typography_AI5 eq + { + end + } if +} def +/modifyEncoding +{ + /_tempEncode exch ddef + /_pntr 0 ddef + { + counttomark -1 roll + dup type dup /marktype eq + { + pop pop exit + } + { + /nametype eq + { + _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll + put + } + { + /_pntr exch ddef + } ifelse + } ifelse + } loop + _tempEncode +} def +/TE +{ + StandardEncoding 256 array copy modifyEncoding + /_nativeEncoding exch def +} def +% +/TZ +{ + dup type /arraytype eq + { + /_wv exch def + } + { + /_wv 0 def + } ifelse + /_useNativeEncoding exch def + pop pop + findfont _wv type /arraytype eq + { + _wv makeblendedfont + } if + dup length 2 add dict + begin + mark exch + { + 1 index /FID ne + { + def + } if + cleartomark mark + } forall + pop + /FontName exch def + counttomark 0 eq + { + 1 _useNativeEncoding eq + { + /Encoding _nativeEncoding def + } if + cleartomark + } + { + /Encoding load 256 array copy + modifyEncoding /Encoding exch def + } ifelse + FontName currentdict + end + definefont pop +} def +/tr +{ + _ax _ay 3 2 roll +} def +/trj +{ + _cx _cy _sp _ax _ay 6 5 roll +} def +/a0 +{ + /Tx + { + dup + currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + } ddef + /Tj + { + dup + currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + } ddef +} def +/a1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + tr _psf + newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + dup currentpoint 3 2 roll + trj _pjsf + newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/e0 +{ + /Tx + { + tr _psf + } ddef + /Tj + { + trj _pjsf + } ddef +} def +/e1 +{ + /Tx + { + dup currentpoint 4 2 roll gsave + tr _psf + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll gsave + trj _pjsf + grestore 3 1 roll moveto tr jsp + } ddef +} def +/i0 +{ + /Tx + { + tr sp + } ddef + /Tj + { + trj jsp + } ddef +} def +/i1 +{ + W N +} def +/o0 +{ + /Tx + { + tr sw rmoveto + } ddef + /Tj + { + trj swj rmoveto + } ddef +} def +/r0 +{ + /Tx + { + tr _ctm _pss + } ddef + /Tj + { + trj _ctm _pjss + } ddef +} def +/r1 +{ + /Tx + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + tr _ctm _pss + grestore 3 1 roll moveto tr sp + } ddef + /Tj + { + dup currentpoint 4 2 roll currentpoint gsave newpath moveto + trj _ctm _pjss + grestore 3 1 roll moveto tr jsp + } ddef +} def +/To +{ + pop _ctm currentmatrix pop +} def +/TO +{ + iTe _ctm setmatrix newpath +} def +/Tp +{ + pop _tm astore pop _ctm setmatrix + _tDict begin + /W + { + } def + /h + { + } def +} def +/TP +{ + end + iTm 0 0 moveto +} def +/Tr +{ + _render 3 le + { + currentpoint newpath moveto + } if + dup 8 eq + { + pop 0 + } + { + dup 9 eq + { + pop 1 + } if + } ifelse + dup /_render exch ddef + _renderStart exch get load exec +} def +/iTm +{ + _ctm setmatrix _tm concat 0 _rise translate _hs 1 scale +} def +/Tm +{ + _tm astore pop iTm 0 0 moveto +} def +/Td +{ + _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto +} def +/iTe +{ + _render -1 eq + { + } + { + _renderEnd _render get dup null ne + { + load exec + } + { + pop + } ifelse + } ifelse + /_render -1 ddef +} def +/Ta +{ + pop +} def +/Tf +{ + dup 1000 div /_fScl exch ddef +% + selectfont +} def +/Tl +{ + pop + 0 exch _leading astore pop +} def +/Tt +{ + pop +} def +/TW +{ + 3 npop +} def +/Tw +{ + /_cx exch ddef +} def +/TC +{ + 3 npop +} def +/Tc +{ + /_ax exch ddef +} def +/Ts +{ + /_rise exch ddef + currentpoint + iTm + moveto +} def +/Ti +{ + 3 npop +} def +/Tz +{ + 100 div /_hs exch ddef + iTm +} def +/TA +{ + pop +} def +/Tq +{ + pop +} def +/Th +{ + pop pop pop pop pop +} def +/TX +{ + pop +} def +/Tk +{ + exch pop _fScl mul neg 0 rmoveto +} def +/TK +{ + 2 npop +} def +/T* +{ + _leading aload pop neg Td +} def +/T*- +{ + _leading aload pop Td +} def +/T- +{ + _ax neg 0 rmoveto + _hyphen Tx +} def +/T+ +{ +} def +/TR +{ + _ctm currentmatrix pop + _tm astore pop + iTm 0 0 moveto +} def +/TS +{ + currentfont 3 1 roll + /_Symbol_ _fScl 1000 mul selectfont + + 0 eq + { + Tx + } + { + Tj + } ifelse + setfont +} def +/Xb +{ + pop pop +} def +/Tb /Xb load def +/Xe +{ + pop pop pop pop +} def +/Te /Xe load def +/XB +{ +} def +/TB /XB load def +currentdict readonly pop +end +setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.0 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 17 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin + + /initialize + { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 + { + dup type /arraytype eq + { + dup xcheck + { + bind + } if + } if + pop pop + } forall + } def + /terminate { end } def + + currentdict /Adobe_ColorImage_AI6_Vars known not + { + /Adobe_ColorImage_AI6_Vars 14 dict def + } if + + Adobe_ColorImage_AI6_Vars begin + /channelcount 0 def + /sourcecount 0 def + /sourcearray 4 array def + /plateindex -1 def + /XIMask 0 def + /XIBinary 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIBuffer null def + /XIDataProc null def + end + + /WalkRGBString null def + /WalkCMYKString null def + + /StuffRGBIntoGrayString null def + /RGBToGrayImageProc null def + /StuffCMYKIntoGrayString null def + /CMYKToGrayImageProc null def + /ColorImageCompositeEmulator null def + + /SeparateCMYKImageProc null def + + /FourEqual null def + /TestPlateIndex null def + + currentdict /_colorimage known not + { + /colorimage where + { + /colorimage get /_colorimage exch def + } + { + /_colorimage null def + } ifelse + } if + + /_currenttransfer systemdict /currenttransfer get def + + /colorimage null def + /XI null def + + + /WalkRGBString + { + 0 3 index + + dup length 1 sub 0 3 3 -1 roll + { + 3 getinterval { } forall + + 5 index exec + + 3 index + } for + + 5 { pop } repeat + + } def + + + /WalkCMYKString + { + 0 3 index + + dup length 1 sub 0 4 3 -1 roll + { + 4 getinterval { } forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + + } def + + + /StuffRGBIntoGrayString + { + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add + } def + + + /RGBToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 3 idiv string + dup 3 1 roll + + /StuffRGBIntoGrayString load exch + WalkRGBString + end + } def + + + /StuffCMYKIntoGrayString + { + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add + } def + + + /CMYKToGrayImageProc + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + dup length 4 idiv string + dup 3 1 roll + + /StuffCMYKIntoGrayString load exch + WalkCMYKString + end + } def + + + /ColorImageCompositeEmulator + { + pop true eq + { + Adobe_ColorImage_AI6_Vars /sourcecount get 5 add { pop } repeat + } + { + Adobe_ColorImage_AI6_Vars /channelcount get 1 ne + { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 3 -1 roll put + + channelcount 3 eq + { + /RGBToGrayImageProc + } + { + /CMYKToGrayImageProc + } ifelse + load + end + } if + image + } ifelse + } def + + + /SeparateCMYKImageProc + { + Adobe_ColorImage_AI6_Vars begin + + sourcecount 0 ne + { + sourcearray plateindex get exec + } + { + sourcearray 0 get exec + + dup length 4 idiv string + + 0 2 index + + plateindex 4 2 index length 1 sub + { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + + pop pop exch pop + } ifelse + end + } def + + + /FourEqual + { + 4 index ne + { + pop pop pop false + } + { + 4 index ne + { + pop pop false + } + { + 4 index ne + { + pop false + } + { + 4 index eq + } ifelse + } ifelse + } ifelse + } def + + + /TestPlateIndex + { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + + /setcmykcolor where + { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + + 1 0 0 0 FourEqual + { + /plateindex 0 def + } + { + 0 1 0 0 FourEqual + { + /plateindex 1 def + } + { + 0 0 1 0 FourEqual + { + /plateindex 2 def + } + { + 0 0 0 1 FourEqual + { + /plateindex 3 def + } + { + 0 0 0 0 FourEqual + { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end + } def + + + /colorimage + { + Adobe_ColorImage_AI6_Vars begin + /channelcount 1 index def + /sourcecount 2 index 1 eq { channelcount 1 sub } { 0 } ifelse def + + 4 sourcecount add index dup + 8 eq exch 1 eq or not + end + + { + /_colorimage load null ne + { + _colorimage + } + { + Adobe_ColorImage_AI6_Vars /sourcecount get + 7 add { pop } repeat + } ifelse + } + { + dup 3 eq + TestPlateIndex + dup -1 eq exch 5 eq or or + { + /_colorimage load null eq + { + ColorImageCompositeEmulator + } + { + dup 1 eq + { + pop pop image + } + { + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + gsave + + 0 _currenttransfer exec + 1 _currenttransfer exec + eq + { 0 _currenttransfer exec 0.5 lt } + { 0 _currenttransfer exec 1 _currenttransfer exec gt } ifelse + + { { pop 0 } } { { pop 1 } } ifelse + systemdict /settransfer get exec + } if + + _colorimage + + Adobe_ColorImage_AI6_Vars /plateindex get 5 eq + { + grestore + } if + } ifelse + } ifelse + } + { + dup 1 eq + { + pop pop + image + } + { + pop pop + + Adobe_ColorImage_AI6_Vars begin + sourcecount -1 0 + { + exch sourcearray 3 1 roll put + } for + + /SeparateCMYKImageProc load + end + + systemdict /image get exec + } ifelse + } ifelse + } ifelse + } def + + /XI + { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIMask exch 0 ne def + /XIBinary exch 0 ne def + pop + pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + + XIBitsPerPixel 1 eq + { + XIImageWidth 8 div ceiling cvi + } + { + XIImageWidth XIChannelCount mul + } ifelse + /XIBuffer exch string def + + XIBinary + { + /XIDataProc { currentfile XIBuffer readstring pop } def + currentfile 128 string readline pop pop + } + { + /XIDataProc { currentfile XIBuffer readhexstring pop } def + } ifelse + + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + XIMask + { + XIImageWidth XIImageHeight + false + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + /_lp /null ddef + _fc + /_lp /imagemask ddef + + imagemask + } + { + XIImageWidth XIImageHeight + XIBitsPerPixel + [ XIImageWidth 0 0 XIImageHeight neg 0 0 ] + /XIDataProc load + + XIChannelCount 1 eq + { + + gsave + 0 setgray + + image + + grestore + } + { + false + XIChannelCount + colorimage + } ifelse + } ifelse + grestore + end + } def + +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Full Prolog) +%%Version: 1.1 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1994 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 81 dict dup begin +put +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_rise 0 def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fScl 0 def +/_cnt 0 def +/_hs 1 def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_wv 0 def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 91 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/sw +{ + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add +} def +/swj +{ + dup 4 1 roll + dup length exch stringwidth + exch 5 -1 roll 3 index mul add + 4 1 roll 3 1 roll mul add + 6 2 roll /_cnt 0 ddef + { + 1 index eq + { + /_cnt _cnt 1 add ddef + } if + } forall + pop + exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop +} def +/ss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put pop + gsave + false charpath currentpoint + 4 index setmatrix + stroke + grestore + moveto + 2 copy rmoveto + } exch cshow + 3 npop +} def +/jss +{ + 4 1 roll + { + 2 npop + (0) exch 2 copy 0 exch put + gsave + _sp eq + { + exch 6 index 6 index 6 index 5 -1 roll widthshow + currentpoint + } + { + false charpath currentpoint + 4 index setmatrix stroke + } ifelse + grestore + moveto + 2 copy rmoveto + } exch cshow + 6 npop +} def +/sp +{ + { + 2 npop (0) exch + 2 copy 0 exch put pop + false charpath + 2 copy rmoveto + } exch cshow + 2 npop +} def +/jsp +{ + { + 2 npop + (0) exch 2 copy 0 exch put + _sp eq + { + exch 5 index 5 index 5 index 5 -1 roll widthshow + } + { + false charpath + } ifelse + 2 copy rmoveto + } exch cshow + 5 npop +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + ashow + } ddef + /_pjsf + { + _fc + awidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer readline not + { + stop + } if + endString eq + { + cleartomark stop + } if + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer readline not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 4 npop + 6 1 roll + pop + 4 1 roll + pop pop pop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 3 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +end +setpacking +%%EndResource +%%EndProlog +%%BeginSetup +%%IncludeFont: Univers +Adobe_level2_AI5 /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +[ +39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis +/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute +/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde +/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex +/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls +/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash +/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef +/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash +/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef +/guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe +/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide +/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright +/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand +/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex +/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex +/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla +/hungarumlaut/ogonek/caron +TE +%AI3_BeginEncoding: _Univers Univers +[/_Univers/Univers 0 0 1 TZ +%AI3_EndEncoding AdobeType +%AI5_Begin_NonPrinting +Np +8 Bn +%AI5_BeginGradient: (Black & White) +(Black & White) 0 2 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Green & Blue) +(Green & Blue) 0 2 Bd +[ +< +99999A9A9B9B9B9C9C9D9D9D9E9E9F9F9FA0A0A1A1A1A2A2A3A3A3A4A4A5A5A5A6A6A7A7A7A8A8A9 +A9A9AAAAABABABACACADADADAEAEAFAFAFB0B0B1B1B1B2B2B3B3B3B4B4B5B5B5B6B6B7B7B7B8B8B9 +B9B9BABABBBBBBBCBCBDBDBDBEBEBFBFBFC0C0C1C1C1C2C2C3C3C3C4C4C5C5C5C6C6C7C7C7C8C8C9 +C9C9CACACBCBCBCCCCCDCDCDCECECFCFCFD0D0D1D1D1D2D2D3D3D3D4D4D5D5D5D6D6D7D7D7D8D8D9 +D9D9DADADBDBDBDCDCDDDDDDDEDEDFDFDFE0E0E1E1E1E2E2E3E3E3E4E4E5E5E5E6E6E7E7E7E8E8E9 +E9E9EAEAEBEBEBECECEDEDEDEEEEEFEFEFF0F0F1F1F1F2F2F3F3F3F4F4F5F5F5F6F6F7F7F7F8F8F9 +F9F9FAFAFBFBFBFCFCFDFDFDFEFEFFFF +> +< +000102020304050506070808090A0B0B0C0D0E0E0F101111121314141516171718191A1A1B1C1D1D +1E1F20202122232324252626272829292A2B2C2C2D2E2F2F303132323334353536373838393A3B3B +3C3D3E3E3F404141424344444546474748494A4A4B4C4D4D4E4F5050515253535455565657585959 +5A5B5C5C5D5E5F5F606162626364656566676868696A6B6B6C6D6E6E6F7071717273747475767777 +78797A7A7B7C7D7D7E7F80808182828384858586878888898A8B8B8C8D8E8E8F9091919293949495 +96979798999A9A9B9C9D9D9E9FA0A0A1A2A3A3A4A5A6A6A7A8A9A9AAABACACADAEAFAFB0B1B2B2B3 +B4B5B5B6B7B8B8B9BABBBBBCBDBEBEBF +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +[ +1 0.75 0 0 1 50 100 %_Bs +0.6 0 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Pink, Yellow, Green) +(Pink, Yellow, Green) 0 3 Bd +[ +< +00000000000000000000000000000000000000010101010101010101010101010101010101010101 +01010101010202020202020202020202020202020202020202020203030303030303030303030303 +03030303030303030404040404040404040404040404040404040404050505050505050505050505 +05050505050505060606060606060606060606060606060606060707070707070707070707070707 +07070707080808080808080808080808080808080809090909090909090909090909090909090A0A +0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C +0C0C0C0C0C0C0C0D0D0D0D0D +> +< +050506060606070708080809090A0A0A0B0B0C0C0D0D0E0E0F0F1010111112121313141415151617 +17181819191A1A1B1C1C1D1D1E1F1F202021222223232425252626272828292A2A2B2C2C2D2D2E2F +2F3031313233333435353637373839393A3B3B3C3D3E3E3F4040414242434445454647474849494A +4B4C4C4D4E4F4F505151525354545556575758595A5A5B5C5C5D5E5F5F6061626363646566666768 +69696A6B6C6C6D6E6F707071727373747576777778797A7B7B7C7D7E7F7F80818283838485868787 +88898A8B8B8C8D8E8F8F9091929394949596979898999A9B9C9D9D9E9FA0A1A2A2A3A4A5A6A7A7A8 +A9AAABACADADAEAFB0B1B2B2 +> +< +CCCCCBCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4C4C3C2C2C1C1C0C0BFBEBEBDBDBCBBBBBAB9B9B8B7 +B7B6B6B5B4B4B3B2B1B1B0AFAFAEADADACABAAAAA9A8A8A7A6A5A5A4A3A2A2A1A0A09F9E9D9C9C9B +9A999998979696959493929291908F8E8E8D8C8B8A8A8988878686858483828181807F7E7D7C7C7B +7A7978777776757473727171706F6E6D6C6B6A6A69686766656463636261605F5E5D5C5B5B5A5958 +5756555453525151504F4E4D4C4B4A49484746464544434241403F3E3D3C3B3A3938383736353433 +3231302F2E2D2C2B2A29282726252423222221201F1E1D1C1B1A191817161514131211100F0E0D0C +0B0A09080706050403020100 +> +0 +1 %_Br +< +737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5B5A59585756555453525150504F4E +4D4C4B4A4949484746454443434241403F3E3E3D3C3B3A3A393837363635343333323130302F2E2D +2D2C2B2A2A29282827262525242323222121201F1F1E1D1D1C1C1B1A1A1918181717161615141413 +1312121111100F0F0E0E0D0D0C0C0C0B0B0A0A090908080807070606060505050404040303030202 +020201010101010000000000 +> +< +00000000000000000000000001010101010101010101010101010101010101010101010102020202 +02020202020202020202020202020202020202020202030303030303030303030303030303030303 +03030303030303030303030303040404040404040404040404040404040404040404040404040404 +04040404040404040404050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505 +> +< +BFBFBFC0C0C0C0C0C0C0C0C0C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3C3C3C3 +C3C4C4C4C4C4C4C4C4C4C4C5C5C5C5C5C5C5C5C5C5C5C6C6C6C6C6C6C6C6C6C6C6C6C7C7C7C7C7C7 +C7C7C7C7C7C7C8C8C8C8C8C8C8C8C8C8C8C8C8C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9CACACACACACA +CACACACACACACACACACACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCCCCCCCCCCCCCCC +CCCCCCCCCCCCCCCCCCCCCCCC +> +0 +1 %_Br +[ +0.05 0.7 0 0 1 50 100 %_Bs +0 0.02 0.8 0 1 57 36 %_Bs +0.45 0 0.75 0 1 37 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Purple, Red & Yellow) +(Purple, Red & Yellow) 0 3 Bd +[ +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A +> +< +CCCCCCCDCDCDCDCDCECECECECECFCFCFCFD0D0D0D0D0D1D1D1D1D1D2D2D2D2D2D3D3D3D3D3D4D4D4 +D4D5D5D5D5D5D6D6D6D6D6D7D7D7D7D7D8D8D8D8D8D9D9D9D9DADADADADADBDBDBDBDBDCDCDCDCDC +DDDDDDDDDDDEDEDEDEDFDFDFDFDFE0E0E0E0E0E1E1E1E1E1E2E2E2E2E2E3E3E3E3E4E4E4E4E4E5E5 +E5E5E5E6E6E6E6E6E7E7E7E7E7E8E8E8E8E9E9E9E9E9EAEAEAEAEAEBEBEBEBEBECECECECECEDEDED +EDEEEEEEEEEEEFEFEFEFEFF0F0F0F0F0F1F1F1F1F1F2F2F2F2F3F3F3F3F3F4F4F4F4F4F5F5F5F5F5 +F6F6F6F6F6F7F7F7F7F8F8F8F8F8F9F9F9F9F9FAFAFAFAFAFBFBFBFBFBFCFCFCFCFDFDFDFDFDFEFE +FEFEFEFFFFFF +> +0 +1 %_Br +< +E5E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE +BDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796 +9594939291908F8E8D8C8B8A898887868584838281807F7E7D7C7B7A797877767574737271706F6E +6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A49484746 +4544434241403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524232221201F1E +1D1C1B1A191817161514131211100F0E0D0C0B0A09080706050403020100 +> +< +E5E6E6E6E6E6E6E6E6E7E7E7E7E7E7E7E7E7E8E8E8E8E8E8E8E8E8E9E9E9E9E9E9E9E9E9EAEAEAEA +EAEAEAEAEAEBEBEBEBEBEBEBEBEBECECECECECECECECECEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEE +EEEFEFEFEFEFEFEFEFEFF0F0F0F0F0F0F0F0F0F1F1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F2F3F3F3 +F3F3F3F3F3F3F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F7F7F7F7 +F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFCFC +FCFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF +> +< +00010203040405060708090A0B0C0C0D0E0F10111213141415161718191A1B1C1D1D1E1F20212223 +242525262728292A2B2C2D2D2E2F30313233343535363738393A3B3C3D3D3E3F4041424344454546 +4748494A4B4C4D4E4E4F50515253545556565758595A5B5C5D5E5E5F60616263646566666768696A +6B6C6D6E6E6F70717273747576767778797A7B7C7D7E7F7F80818283848586878788898A8B8C8D8E +8F8F90919293949596979798999A9B9C9D9E9F9FA0A1A2A3A4A5A6A7A7A8A9AAABACADAEAFAFB0B1 +B2B3B4B5B6B7B8B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C8C9CACBCC +> +0 +1 %_Br +[ +0 0.04 1 0 1 50 100 %_Bs +0 1 0.8 0 1 50 50 %_Bs +0.9 0.9 0 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Rainbow) +(Rainbow) 0 6 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +0 +1 %_Br +1 +< +0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +5758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6 +A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE +CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6 +F7F8F9FAFBFCFDFEFF +> +0 +0 +1 %_Br +1 +< +00000000000000000000000000000000000001010101010101010101010101010101010101010101 +01010101010101010101010101010202020202020202020202020202020202020202020202020202 +02020202020202020202030303030303030303030303030303030303030303030303030303030303 +03030303030304040404040404040404040404040404040404040404040404040404040404040404 +04040505050505050505050505050505050505050505050505050505050505050505050505050606 +06060606060606060606060606060606060606060606060606060606060606060606070707070707 +07070707070707070707070707070707 +> +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 +1 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 +1 +0 +1 %_Br +0 +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +1 +0 +1 %_Br +[ +0 1 0 0 1 50 100 %_Bs +1 1 0 0 1 50 80 %_Bs +1 0.0279 0 0 1 50 60 %_Bs +1 0 1 0 1 50 40 %_Bs +0 0 1 0 1 50 20 %_Bs +0 1 1 0 1 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Steel Bar) +(Steel Bar) 0 3 Bd +[ +< +FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 +D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 +AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 +87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 +5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 +37363534333231302F2E2D2C2B2A292827262524232221201F1E1D1C1B1A19181716151413121110 +0F0E0D0C0B0A09080706050403020100 +> +0 %_Br +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +0 %_Br +[ +0 0 50 100 %_Bs +1 0 50 70 %_Bs +0 0 50 0 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Orange Radial) +(Yellow & Orange Radial) 1 2 Bd +[ +0 +< +0001010203040506060708090A0B0C0C0D0E0F10111213131415161718191A1B1C1D1D1E1F202122 +232425262728292A2B2B2C2D2E2F303132333435363738393A3B3C3D3E3E3F404142434445464748 +494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60606162636465666768696A6B6C6D6E6F +707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C +> +< +FFFFFFFFFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9 +F9F8F8F8F8F8F8F7F7F7F7F7F7F6F6F6F6F6F6F5F5F5F5F5F5F4F4F4F4F4F3F3F3F3F3F3F2F2F2F2 +F2F2F1F1F1F1F1F0F0F0F0F0F0EFEFEFEFEFEFEEEEEEEEEEEDEDEDEDEDEDECECECECECEBEBEBEBEB +EBEAEAEAEAEAE9E9E9E9E9E9E8E8E8E8E8E8E7E7E7E7E7E6E6E6E6E6E5 +> +0 +1 %_Br +[ +0 0 1 0 1 52 19 %_Bs +0 0.55 0.9 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_BeginGradient: (Yellow & Purple Radial) +(Yellow & Purple Radial) 1 2 Bd +[ +< +000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +28292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +78797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F +A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7 +C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF +F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF +> +< +1415161718191A1B1C1D1E1F1F202122232425262728292A2A2B2C2D2E2F30313233343536363738 +393A3B3C3D3E3F40414142434445464748494A4B4C4D4D4E4F50515253545556575858595A5B5C5D +5E5F60616263646465666768696A6B6C6D6E6F6F707172737475767778797A7B7B7C7D7E7F808182 +83848586868788898A8B8C8D8E8F90919292939495969798999A9B9C9D9D9E9FA0A1A2A3A4A5A6A7 +A8A9A9AAABACADAEAFB0B1B2B3B4B4B5B6B7B8B9BABBBCBDBEBFC0C0C1C2C3C4C5C6C7C8C9CACBCB +CCCDCECFD0D1D2D3D4D5D6D7D7D8D9DADBDCDDDEDFE0E1E2E2E3E4E5E6E7E8E9EAEBECEDEEEEEFF0 +F1F2F3F4F5F6F7F8F9F9FAFBFCFDFEFF +> +< +ABAAAAA9A8A7A7A6A5A5A4A3A3A2A1A1A09F9F9E9D9D9C9B9B9A9999989797969595949393929191 +908F8F8E8D8D8C8B8B8A8989888787868585848383828181807F7F7E7D7D7C7B7B7A797978777776 +7575747373727171706F6F6E6D6D6C6B6B6A6969686767666565646362626160605F5E5E5D5C5C5B +5A5A5958585756565554545352525150504F4E4E4D4C4C4B4A4A4948484746464544444342424140 +403F3E3E3D3C3C3B3A3A3938383736363534343332323130302F2E2E2D2C2C2B2A2A292828272626 +25242423222121201F1F1E1D1D1C1B1B1A1919181717161515141313121111100F0F0E0D0D0C0B0B +0A090908070706050504030302010100 +> +0 +1 %_Br +[ +0 0.08 0.67 0 1 50 14 %_Bs +1 1 0 0 1 50 100 %_Bs +BD +%AI5_EndGradient +%AI5_End_NonPrinting-- +%AI5_BeginPalette +0 2 Pb +Pn +Pc +1 g +Pc +0 g +Pc +0 0 0 0 k +Pc +0.75 g +Pc +0.5 g +Pc +0.25 g +Pc +0 g +Pc +Bb +2 (Black & White) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0 0 0 k +Pc +0.5 0 0 0 k +Pc +0.75 0 0 0 k +Pc +1 0 0 0 k +Pc +0.25 0.25 0 0 k +Pc +0.5 0.5 0 0 k +Pc +0.75 0.75 0 0 k +Pc +1 1 0 0 k +Pc +Bb +2 (Pink, Yellow, Green) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0 0 k +Pc +0 0.5 0 0 k +Pc +0 0.75 0 0 k +Pc +0 1 0 0 k +Pc +0 0.25 0.25 0 k +Pc +0 0.5 0.5 0 k +Pc +0 0.75 0.75 0 k +Pc +0 1 1 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Purple Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0 0.25 0 k +Pc +0 0 0.5 0 k +Pc +0 0 0.75 0 k +Pc +0 0 1 0 k +Pc +0.25 0 0.25 0 k +Pc +0.5 0 0.5 0 k +Pc +0.75 0 0.75 0 k +Pc +1 0 1 0 k +Pc +Bb +2 (Rainbow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0 0 k +Pc +0.5 0.25 0 0 k +Pc +0.75 0.375 0 0 k +Pc +1 0.5 0 0 k +Pc +0.125 0.25 0 0 k +Pc +0.25 0.5 0 0 k +Pc +0.375 0.75 0 0 k +Pc +0.5 1 0 0 k +Pc +Bb +2 (Steel Bar) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0 0.25 0.125 0 k +Pc +0 0.5 0.25 0 k +Pc +0 0.75 0.375 0 k +Pc +0 1 0.5 0 k +Pc +0 0.125 0.25 0 k +Pc +0 0.25 0.5 0 k +Pc +0 0.375 0.75 0 k +Pc +0 0.5 1 0 k +Pc +Bb +2 (Purple, Red & Yellow) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0 0.25 0 k +Pc +0.25 0 0.5 0 k +Pc +0.375 0 0.75 0 k +Pc +0.5 0 1 0 k +Pc +0.25 0 0.125 0 k +Pc +0.5 0 0.25 0 k +Pc +0.75 0 0.375 0 k +Pc +1 0 0.5 0 k +Pc +Bb +2 (Green & Blue) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.25 0.125 0.125 0 k +Pc +0.5 0.25 0.25 0 k +Pc +0.75 0.375 0.375 0 k +Pc +1 0.5 0.5 0 k +Pc +0.25 0.25 0.125 0 k +Pc +0.5 0.5 0.25 0 k +Pc +0.75 0.75 0.375 0 k +Pc +1 1 0.5 0 k +Pc +Bb +0 0 0 0 Bh +2 (Yellow & Orange Radial) -4014 4716 0 0 1 0 0 1 0 0 Bg +0 BB +Pc +0.125 0.25 0.125 0 k +Pc +0.25 0.5 0.25 0 k +Pc +0.375 0.75 0.375 0 k +Pc +0.5 1 0.5 0 k +Pc +0.125 0.25 0.25 0 k +Pc +0.25 0.5 0.5 0 k +Pc +0.375 0.75 0.75 0 k +Pc +0.5 1 1 0 k +Pc +0 0 0 0 k +Pc +0.125 0.125 0.25 0 k +Pc +0.25 0.25 0.5 0 k +Pc +0.375 0.375 0.75 0 k +Pc +0.5 0.5 1 0 k +Pc +0.25 0.125 0.25 0 k +Pc +0.5 0.25 0.5 0 k +Pc +0.75 0.375 0.75 0 k +Pc +1 0.5 1 0 k +Pc +PB +%AI5_EndPalette +%%EndSetup +%AI5_BeginLayer +1 1 1 1 0 0 0 79 128 255 Lb +(Layer 1) Ln +0 A +800 Ar +0 J 0 j 1 w 4 M []0 d +%AI3_Note: +0 D +0 XR +-4014 283.5 m +4626 283.5 L +(N) * +453.5 4716 m +453.5 -3924 L +(N) * +85 4716 m +85 -3924 L +(N) * +-4014 765.5 m +4626 765.5 L +(N) * +u +0 R +0.25 G +2 w +152.7439 649.8296 m +164.3439 653.4296 158.3439 667.0297 v +153.0847 678.9503 141.5439 672.6297 y +141.9635 683.3994 130.3438 683.8297 v +119.5438 684.2297 118.7438 672.6297 y +113.429 685.1021 100.7437 677.0297 v +91.9437 671.4297 96.3437 661.0297 y +85.9436 655.0296 93.1437 643.0296 v +98.1213 634.7336 107.5437 638.6296 y +105.5437 626.6295 118.7438 627.0295 v +131.9438 627.4295 130.3438 638.6296 y +138.0225 629.4983 148.3439 636.2296 v +157.5439 642.2296 152.7439 649.8296 y +s +0 To +1 0 0 1 125.3333 652 0 Tp +TP +-19.9951 0 Td +0 Tr +0 O +0 g +1 w +/_Univers 10 Tf +0 Ts +100 Tz +0 Tt +1 TA +%_ 0 XL +36 0 Xb +XB +0 0 5 TC +100 100 200 TW +0 0 0 Ti +1 Ta +0 0 2 2 3 Th +0 Tq +0 0 Tl +0 Tc +0 Tw +(Network) Tx +(\r) TX +TO +U +1 Ap +0 R +0 G +245 630.7402 m +256.7413 630.7402 266.2598 640.2587 266.2598 652 c +266.2598 663.7413 256.7413 673.2598 245 673.2598 c +233.2587 673.2598 223.7402 663.7413 223.7402 652 c +223.7402 640.2587 233.2587 630.7402 245 630.7402 c +s +u +409.6667 630.7402 m +429.2355 630.7402 445.0998 640.2587 445.0998 652 c +445.0998 663.7414 429.2355 673.2599 409.6667 673.2599 c +390.0978 673.2599 374.2335 663.7414 374.2335 652 c +374.2335 640.2587 390.0978 630.7402 409.6667 630.7402 c +s +0 To +1 0 0 1 409.6667 654.5662 0 Tp +TP +-16.3867 0 Td +0 Tr +0 O +0 g +(Master\r) Tx +2.2253 -12 Td +(Agent) Tx +(\r) TX +TO +U +0 To +1 0 0 1 415 698 0 Tp +TP +0 Tr +(\r) Tx +TO +u +0 R +0 G +341.6667 540.0735 m +361.2355 540.0735 377.0998 549.592 377.0998 561.3333 c +377.0998 573.0747 361.2355 582.5932 341.6667 582.5932 c +322.0978 582.5932 306.2335 573.0747 306.2335 561.3333 c +306.2335 549.592 322.0978 540.0735 341.6667 540.0735 c +s +0 To +1 0 0 1 341.6667 563.8995 0 Tp +TP +-29.1626 0 Td +0 Tr +0 O +0 g +(Proxy Agent\r) Tx +2.7771 -12 Td +(Subsystem) Tx +(\r) TX +TO +U +u +u +0 Ap +0 R +0 G +274.4641 652 m +366 652 l +S +0 O +0 g +368.362 653.0249 m +366.7087 653.5241 365.6341 653.9841 364.3076 654.5165 c +364.3076 649.4722 l +364.7824 649.6974 366.7087 650.4647 368.362 650.9636 c +370.1314 651.4983 371.7359 651.8639 372.7766 651.9944 c +371.7359 652.1249 370.1314 652.4904 368.362 653.0249 c +f +U +272.1021 650.9751 m +273.7554 650.4759 274.83 650.0159 276.1565 649.4835 c +276.1565 654.5278 l +275.6817 654.3026 273.7554 653.5353 272.1021 653.0364 c +270.3327 652.5017 268.7282 652.1361 267.6875 652.0056 c +268.7282 651.8751 270.3327 651.5096 272.1021 650.9751 c +f +U +u +0 R +0 G +265.2292 630.5208 m +314.2292 584.5208 l +S +0 O +0 g +316.6527 583.6514 m +315.789 585.147 315.3204 586.2179 314.7176 587.5139 c +311.2651 583.8362 l +311.7654 583.6754 313.695 582.9164 315.2419 582.1486 c +316.8979 581.3274 318.3179 580.4958 319.166 579.8786 c +318.4966 580.6861 317.5769 582.0507 316.6527 583.6514 c +f +262.8056 631.3902 m +263.6693 629.8947 264.1379 628.8238 264.7407 627.5278 c +268.1932 631.2055 l +267.6929 631.3663 265.7633 632.1252 264.2164 632.8931 c +262.5604 633.7143 261.1404 634.5459 260.2923 635.163 c +260.9617 634.3556 261.8814 632.9909 262.8056 631.3902 c +f +U +0 To +1 0 0 1 245 648.5662 0 Tp +TP +-12.7747 0 Td +0 Tr +(Net if) Tx +(\r) TX +TO +0 To +1 0 0 1 319.6667 656.6667 0 Tp +TP +-31.1438 0 Td +0 Tr +(Erlang T) Tx 1 104 Tk +(erms) Tx +(\r) TX +TO +0 To +1 0 0 1 294.3333 606.3333 0 Tp +TP +-73.335 0 Td +0 Tr +2 Ta +(Proxy agent\312\312\312\312\312\312\r) Tx +-33.8769 -12 Td +(specific representation) Tx +(\r) TX +TO +0 To +1 0 0 1 263.6667 601.3333 0 Tp +TP +0 Tr +(\r) Tx +TO +u +0 R +0 G +168 652 m +215.3333 652 l +B +217.6953 653.0249 m +216.042 653.5241 214.9674 653.9841 213.6409 654.5165 c +213.6409 649.4722 l +214.1157 649.6974 216.042 650.4647 217.6953 650.9636 c +219.4647 651.4983 221.0692 651.8639 222.1099 651.9944 c +221.0692 652.1249 219.4647 652.4904 217.6953 653.0249 c +f +165.638 650.9751 m +167.2913 650.4759 168.3659 650.0159 169.6924 649.4835 c +169.6924 654.5278 l +169.2176 654.3026 167.2913 653.5353 165.638 653.0364 c +163.8686 652.5017 162.2641 652.1361 161.2234 652.0056 c +162.2641 651.8751 163.8686 651.5096 165.638 650.9751 c +f +U +0 To +1 0 0 1 190.75 656.25 0 Tp +TP +-13.0579 0 Td +0 Tr +1 Ta +(Bytes) Tx +(\r) TX +TO +LB +%AI5_EndLayer-- +%%PageTrailer +gsave annotatepage grestore showpage +%%Trailer +Adobe_Illustrator_AI5 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_typography_AI5 /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF diff --git a/lib/snmp/doc/src/snmp_app.xml b/lib/snmp/doc/src/snmp_app.xml new file mode 100644 index 0000000000..460f0b8018 --- /dev/null +++ b/lib/snmp/doc/src/snmp_app.xml @@ -0,0 +1,708 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmp + + + + + + + + snmp.xml +
+ snmp + The SNMP Application + +

This chapter describes the snmp + application in OTP. The SNMP application provides the following + services:

+ + +

a multilingual extensible SNMP agent

+
+ +

a SNMP manager

+
+ +

a MIB compiler

+
+
+ +
+ +
+ + Configuration +

The following configuration parameters are defined for the SNMP + application. Refer to application(3) for more information about + configuration parameters. +

+ +

The snmp part of the config file specifying the configuration + parameters is basically the following tuple:

+
+      {snmp, snmp_components_config()}
+    
+ +

A minimal config file for starting a node with both a manager + and an agent:

+
+      [{snmp, 
+        [{agent, [{db_dir, "/tmp/snmp/agent/db"},
+                  {config, [{dir, "/tmp/snmp/agent/conf"}]}]},
+         {manager, [{config, [{dir, "/tmp/snmp/manager/conf"},
+                              {db_dir, "/tmp/snmp/manager/db"}]}]}]}
+        ]
+       }
+      ].
+    
+ +

Each snmp component has it's own set of configuration parameters, + even though some of the types are common to both components.

+ + + +
+      snmp_components_config() -> [snmp_component_config()]
+      snmp_component_config() -> {agent, agent_options()} | {manager, manager_options()}
+      agent_options() = [agent_option()]
+      agent_option() = {restart_type,     restart_type()}     | 
+                       {agent_type,       agent_type()}       |  
+                       {agent_verbosity,  verbosity()}        |  
+                       {discovery,        agent_discovery()}  |  
+                       {versions,         versions()}         |  
+                       {priority,         priority()}         |  
+                       {multi_threaded,   multi_threaded()}   |  
+                       {db_dir,           db_dir()}           |  
+                       {db_init_error,    db_init_error()}    |  
+                       {local_db,         local_db()}         |  
+                       {net_if,           agent_net_if()}     |  
+                       {mibs,             mibs()}             |  
+                       {mib_storage,      mib_storage()}      |  
+                       {mib_server,       mib_server()}       |  
+                       {audit_trail_log,  audit_trail_log()}  |  
+                       {error_report_mod, error_report_mod()} |  
+                       {note_store,       note_store()}       |  
+                       {symbolic_store,   symbolic_store()}   |  
+                       {target_cache,     target_cache()}     |  
+                       {config,           agent_config()}
+      manager_options() = [manager_option()]
+      manager_option() = {restart_type,             restart_type()}    | 
+                         {net_if,                   manager_net_if()}  |  
+                         {server,                   server()}          | 
+                         {note_store,               note_store()}      | 
+                         {config,                   manager_config()}  |  
+                         {inform_request_behaviour, manager_irb()}     | 
+                         {mibs,                     manager_mibs()}    | 
+                         {priority,                 priority()}        |  
+                         {audit_trail_log,          audit_trail_log()} | 
+                         {versions,                 versions()}        | 
+                         {def_user_mod,             def_user_module()  | 
+                         {def_user_data,            def_user_data()}
+    
+ +

Agent specific config options and types:

+ + ]]> + +

If master, one master agent is + started. Otherwise, no agents are started.

+

Default is master.

+
+ + ]]> + +

agent_discovery_opt() = + {terminating, agent_terminating_discovery_opts()} | + {originating, agent_originating_discovery_opts()}

+

The terminating options effects discovery initiated by + a manager.

+

The originating options effects discovery initiated + by this agent.

+

For defaults see the options in agent_discovery_opt().

+
+ + ]]> + +

agent_terminating_discovery_opt() = + {enable, boolean()} | + {stage2, discovery | plain} | + {trigger_username, string()}

+

These are options effecting discovery terminating in this + agent (i.e. initiated by a manager).

+

The default values for the terminating + discovery options are:

+ + enable: true + stage2: discovery + trigger_username: "" + +
+ + ]]> + +

agent_originating_discovery_opt() = + {enable, boolean()}

+

These are options effecting discovery originating in this + agent.

+

The default values for the originating + discovery options are:

+ + enable: true + +
+ + ]]> + +

If true, the agent is multi-threaded, with one + thread for each get request.

+

Default is false.

+
+ + ]]> + +

Defines where the SNMP agent internal db files are stored.

+
+ + ]]> + +

local_db_opt() = {repair, agent_repair()} | {auto_save, agent_auto_save()} | {verbosity, verbosity()}

+

Defines options specific for the SNMP agent local database.

+

For defaults see the options in local_db_opt().

+
+ + ]]> + +

When starting snmpa_local_db it always tries to open an + existing database. If false, and some errors occur, a new + database is created instead. If true, an existing file + will be repaired. If force, the table will be repaired + even if it was properly closed.

+

Default is true.

+
+ + ]]> + +

The auto save interval. The table is flushed to disk + whenever not accessed for this amount of time.

+

Default is 5000.

+
+ + ]]> + +

agent_net_if_opt() = {module, agent_net_if_module()} | {verbosity, verbosity()} | {options, agent_net_if_options()}

+

Defines options specific for the SNMP agent network interface + entity.

+

For defaults see the options in agent_net_if_opt().

+
+ + ]]> + +

Module which handles the network interface part for the + SNMP agent. Must implement the + snmpa_network_interface behaviour.

+

Default is snmpa_net_if.

+
+ + ]]> + +

agent_net_if_option() = {bind_to, bind_to()} | + {sndbuf, sndbuf()} | + {recbuf, recbuf()} | + {no_reuse, no_reuse()} | + {req_limit, req_limit()} | + {filter, agent_net_if_filter_options()}

+

These options are actually specific to the used module. + The ones shown here are applicable to the default + agent_net_if_module().

+

For defaults see the options in agent_net_if_option().

+
+ + ]]> + +

Max number of simultaneous requests handled by the agent.

+

Default is infinity.

+
+ + ]]> + +

agent_net_if_filter_option() = {module, agent_net_if_filter_module()}

+

These options are actually specific to the used module. + The ones shown here are applicable to the default + .

+

For defaults see the options in + agent_net_if_filter_option().

+
+ + ]]> + +

Module which handles the network interface filter part for the + SNMP agent. Must implement the + snmpa_network_interface_filter behaviour.

+

Default is snmpa_net_if_filter.

+
+ + ]]> + +

Specifies a list of MIBs (including path) that defines which MIBs + are initially loaded into the SNMP master agent.

+

Note that the following mibs will always be loaded:

+ + version v1: STANDARD-MIB + version v2: SNMPv2 + version v3: SNMPv2, SNMP-FRAMEWORK-MIB + and SNMP-MPD-MIB + +

Default is [].

+
+ + ]]> + +

Specifies how info retrieved from the mibs will be stored.

+

If mib_storage is {ets, Dir}, the table will also be + stored on file. If Dir is default, then db_dir + will be used.

+

If mib_storage is dets or if Dir is + default, then db_dir will be used for Dir.

+

If mib_storage is mnesia then erlang:nodes() + will be used for Nodes.

+

Default is ets.

+

Dir = default | string(). Dir is the directory where the + files will be stored. If default, then db_dir will be + used.

+

Nodes = visible | connected | [node()]. + Nodes = visible is translated to + erlang:nodes(visible). + Nodes = connected is translated to + erlang:nodes(connected). + If Nodes = [] then the own node is assumed.

+

Action = clear | keep. Default is keep. + Action is used to specify what shall be done if the + mnesia/dets table already exist.

+
+ + ]]> + +

mib_server_opt() = {mibentry_override, mibentry_override()} | {trapentry_override, trapentry_override()} | {verbosity, verbosity()} | {cache, mibs_cache()}

+

Defines options specific for the SNMP agent mib server.

+

For defaults see the options in mib_server_opt().

+
+ + ]]> + +

If this value is false, then when loading a mib each mib- + entry is checked prior to installation of the mib. + The purpose of the check is to prevent that the same symbolic + mibentry name is used for different oid's.

+

Default is false.

+
+ + ]]> + +

If this value is false, then when loading a mib each trap + is checked prior to installation of the mib. + The purpose of the check is to prevent that the same symbolic + trap name is used for different trap's.

+

Default is false.

+
+ + ]]> + +

Shall the agent utilize the mib server lookup cache or not.

+

Default is true (in which case the mibs_cache_opts() + default values apply).

+
+ + ]]> + +

mibs_cache_opt() = {autogc, mibs_cache_autogc()} | {gclimit, mibs_cache_gclimit()} | {age, mibs_cache_age()}

+

Defines options specific for the SNMP agent mib server cache.

+

For defaults see the options in mibs_cache_opt().

+
+ + ]]> + +

Defines if the mib server shall perform cache gc automatically or + leave it to the user (see + gc_mibs_cache/0,1,2,3).

+

Default is false.

+
+ + 0 ]]> + +

Defines how old the entries in the cache will be allowed before + they are GC'ed (assuming GC is performed). Each entry in the + cache is "touched" whenever it is accessed.

+

The age is defined in milliseconds.

+

Default is 10 timutes.

+
+ + 0 | infinity ]]> + +

When performing a GC, this is the max number of cache entries + that will be deleted from the cache.

+

The reason for having this limit is that if the cache is + large, the GC can potentially take a long time, during which + the agent is locked.

+

Default is 100.

+
+ + ]]> + +

Defines an error report module, implementing the + snmpa_error_report + behaviour. Two modules are provided with the toolkit: + snmpa_error_logger and snmpa_error_io.

+

Default is snmpa_error_logger.

+
+ + symbolic_store() = [symbolic_store_opt()] + +

symbolic_store_opt() = {verbosity, verbosity()}

+

Defines options specific for the SNMP agent symbolic store.

+

For defaults see the options in symbolic_store_opt().

+
+ + target_cache() = [target_cache_opt()] + +

target_cache_opt() = {verbosity, verbosity()}

+

Defines options specific for the SNMP agent target cache.

+

For defaults see the options in target_cache_opt().

+
+ ]]> + +

agent_config_opt() = {dir, agent_config_dir()} | {force_load, force_load()} | {verbosity, verbosity()}

+

Defines specific config related options for the SNMP agent.

+

For defaults see the options in agent_config_opt().

+
+ ]]> + +

Defines where the SNMP agent configuration files are stored.

+
+ + ]]> + +

If true the configuration files are re-read + during start-up, and the contents of the configuration + database ignored. Thus, if true, changes to + the configuration database are lost upon reboot of the + agent.

+

Default is false.

+
+
+ +

Manager specific config options and types:

+ + ]]> + +

server_opt() = {timeout, server_timeout()} | {verbosity, verbosity()}

+

Specifies the options for the manager server process.

+

Default is silence.

+
+ ]]> + +

Asynchroneous request cleanup time. For every requests, + some info is stored internally, in order to be able to + deliver the reply (when it arrives) to the proper destination. + If the reply arrives, this info will be deleted. But if + there is no reply (in time), the info has to be deleted + after the best before time has been passed. + This cleanup will be performed at regular intervals, defined + by the server_timeout() time. + The information will have an best before time, + defined by the Expire time given when calling the + request function (see + async_get, + async_get_next and + async_set).

+

Time in milli-seconds.

+

Default is 30000.

+
+ + ]]> + +

manager_config_opt() = {dir, manager_config_dir()} | {db_dir, manager_db_dir()} | {db_init_error, db_init_error()} | {repair, manager_repair()} | {auto_save, manager_auto_save()} | {verbosity, verbosity()}

+

Defines specific config related options for the SNMP manager.

+

For defaults see the options in manager_config_opt().

+
+ + ]]> + +

Defines where the SNMP manager configuration files are stored.

+
+ + ]]> + +

Defines where the SNMP manager store persistent data.

+
+ + ]]> + +

Defines the repair option for the persistent database (if + and how the table is repaired when opened).

+

Default is true.

+
+ + ]]> + +

The auto save interval. The table is flushed to disk + whenever not accessed for this amount of time.

+

Default is 5000.

+
+ + ]]> + +

This option defines how the manager will handle the sending of + response (acknowledgment) to received inform-requests.

+ + +

auto - The manager will autonomously send response + (acknowledgment> to inform-request messages.

+
+ +

{user, integer()} - The manager will send response + (acknowledgment) to inform-request messages when the + handle_inform + function completes. The integer is the time, in milli-seconds, + that the manager will consider the stored inform-request info + valid.

+
+ +

user - Same as {user, integer()}, except that + the default time, 15 seconds (15000), is used.

+
+
+

See + snmpm_network_interface, + handle_inform and + definition of the manager net if for more info.

+

Default is auto.

+
+ + ]]> + +

Specifies a list of MIBs (including path) and defines which MIBs + are initially loaded into the SNMP manager.

+

Default is [].

+
+ + ]]> + +

manager_net_if_opt() = {module, manager_net_if_module()} | + {verbosity, verbosity()} | + {options, manager_net_if_options()}

+

Defines options specific for the SNMP manager network interface + entity.

+

For defaults see the options in manager_net_if_opt().

+
+ + ]]> + +

manager_net_if_option() = {bind_to, bind_to()} | + {sndbuf, sndbuf()} | + {recbuf, recbuf()} | + {no_reuse, no_reuse()} | + {filter, manager_net_if_filter_options()}

+

These options are actually specific to the used module. + The ones shown here are applicable to the default + manager_net_if_module().

+

For defaults see the options in manager_net_if_option().

+
+ + ]]> + +

Module which handles the network interface part for the + SNMP manager. Must implement the + snmpm_network_interface behaviour.

+

Default is snmpm_net_if.

+
+ + ]]> + +

manager_net_if_filter_option() = {module, manager_net_if_filter_module()}

+

These options are actually specific to the used module. + The ones shown here are applicable to the default + .

+

For defaults see the options in + manager_net_if_filter_option().

+
+ + ]]> + +

Module which handles the network interface filter part for the + SNMP manager. Must implement the + snmpm_network_interface_filter behaviour.

+

Default is snmpm_net_if_filter.

+
+ + ]]> + +

The module implementing the default user. See the + snmpm_user behaviour.

+

Default is snmpm_user_default.

+
+ + ]]> + +

Data for the default user. Passed to the user module when + calling the callback functions.

+

Default is undefined.

+
+
+ +

Common config types:

+ + restart_type() = permanent | transient | temporary + +

See supervisor + documentation for more info.

+

Default is permanent for the agent and transient + for the manager.

+
+ db_init_error() = terminate | create + +

Defines what to do if the agent or manager is unable to open an + existing database file. terminate means that the + agent/manager will terminate and create means that the + agent/manager will remove the faulty file(s) and create new ones.

+

Default is terminate.

+
+ ]]> + +

Defines the Erlang priority for all SNMP processes.

+

Default is normal.

+
+ ]]> + +

version() = v1 | v2 | v3

+

Which SNMP versions shall be accepted/used.

+

Default is [v1,v2,v3].

+
+ ]]> + +

Verbosity for a SNMP process. This specifies now much debug info + is printed.

+

Default is silence.

+
+ ]]> + +

If true, net_if binds to the IP address. + If false, net_if listens on any IP address on the host + where it is running.

+

Default is false.

+
+ ]]> + +

If true, net_if does not specify that the IP + and port address should be reusable. If false, + the address is set to reusable.

+

Default is false.

+
+ ]]> + +

Receive buffer size.

+

Default value is defined by gen_udp.

+
+ ]]> + +

Send buffer size.

+

Default value is defined by gen_udp.

+
+ ]]> + +

note_store_opt() = {timeout, note_store_timeout()} | {verbosity, verbosity()}

+

Specifies the start-up verbosity for the SNMP note store.

+

For defaults see the options in note_store_opt().

+
+ ]]> + +

Note cleanup time. When storing a note in the note store, + each note is given lifetime. Every timeout the note_store + process performs a GC to remove the expired note's. Time in + milli-seconds.

+

Default is 30000.

+
+ ]]> + +

audit_trail_log_opt() = {type, atl_type()} | {dir, atl_dir()} | {size, atl_size()} | {repair, atl_repair()}

+

If present, this option specifies the options for the + audit trail logging. The disk_log module is used + to maintain a wrap log. If present, the dir and + size options are mandatory.

+

If not present, audit trail logging is not used.

+
+ ]]> + +

Specifies what type of an audit trail log should be used. + The effect of the type is actually different for the the agent + and the manager.

+

For the agent:

+ + If write is specified, only set requests are logged. + If read is specified, only get requests are logged. + If read_write, all requests are logged. + +

For the manager:

+ + If write is specified, only sent messages are logged. + If read is specified, only received messages are logged. + If read_write, both outgoing and incoming messages are + logged. + +

Default is read_write.

+
+ ]]> + +

Specifies where the audit trail log should be stored.

+

If audit_trail_log specifies that logging should take + place, this parameter must be defined.

+
+ ]]> + +

Specifies the size of the audit + trail log. This parameter is sent to disk_log.

+

If audit_trail_log specifies that logging should + take place, this parameter must be defined.

+
+ ]]> + +

Specifies if and how the audit trail log shall be repaired + when opened. Unless this parameter has the value snmp_repair + it is sent to disk_log. If, on the other hand, the value is + snmp_repair, snmp attempts to handle certain faults on it's + own. And even if it cannot repair the file, it does not truncate it + directly, but instead moves it aside for later off-line + analysis.

+

Default is true.

+
+
+
+ +
+ See Also +

application(3), disk_log(3)

+
+ +
+ diff --git a/lib/snmp/doc/src/snmp_app_a.xml b/lib/snmp/doc/src/snmp_app_a.xml new file mode 100644 index 0000000000..5192279a45 --- /dev/null +++ b/lib/snmp/doc/src/snmp_app_a.xml @@ -0,0 +1,108 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + SNMP Appendix A + + + + + + + + snmp_app_a.xml +
+ +
+ Appendix A +

This appendix describes the conversion of SNMPv2 to SNMPv1 + error messages. The instrumentation functions should return v2 + error messages. +

+

Mapping of SNMPv2 error message to SNMPv1: +

+ + + SNMPv2 message + SNMPv1 message + + + noError + noError + + + genErr + genErr + + + noAccess + noSuchName + + + wrongType + badValue + + + wrongLength + badValue + + + wrongEncoding + badValue + + + wrongValue + badValue + + + noCreation + noSuchName + + + inconsistentValue + badValue + + + resourceUnavailable + genErr + + + commitFailed + genErr + + + undoFailed + genErr + + + notWritable + noSuchName + + + inconsistentName + noSuchName + + Error Messages +
+
+
+ diff --git a/lib/snmp/doc/src/snmp_app_b.xml b/lib/snmp/doc/src/snmp_app_b.xml new file mode 100644 index 0000000000..536a4b5c6f --- /dev/null +++ b/lib/snmp/doc/src/snmp_app_b.xml @@ -0,0 +1,511 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + SNMP Appendix B + + + + + + + + snmp_app_b.xml +
+ +
+ Appendix B + +
+ RowStatus (from RFC1903) +
+RowStatus ::= TEXTUAL-CONVENTION
+    STATUS       current
+    DESCRIPTION
+            "The RowStatus textual convention is used to manage the
+            creation and deletion of conceptual rows, and is used as the
+            value of the SYNTAX clause for the status column of a
+            conceptual row (as described in Section 7.7.1 in RFC1902.)
+
+            The status column has six defined values:
+
+                 - `active', which indicates that the conceptual row is
+                 available for use by the managed device;
+
+                 - `notInService', which indicates that the conceptual
+                 row exists in the agent, but is unavailable for use by
+                 the managed device (see NOTE below);
+
+                 - `notReady', which indicates that the conceptual row
+                 exists in the agent, but is missing information
+                 necessary in order to be available for use by the
+                 managed device;
+
+                 - `createAndGo', which is supplied by a management
+                 station wishing to create a new instance of a
+                 conceptual row and to have its status automatically set
+                 to active, making it available for use by the managed
+                 device;
+
+                 - `createAndWait', which is supplied by a management
+                 station wishing to create a new instance of a
+                 conceptual row (but not make it available for use by
+                 the managed device); and,
+
+                 - `destroy', which is supplied by a management station
+                 wishing to delete all of the instances associated with
+                 an existing conceptual row.
+
+            Whereas five of the six values (all except `notReady') may
+            be specified in a management protocol set operation, only
+            three values will be returned in response to a management
+            protocol retrieval operation:  `notReady', `notInService' or
+            `active'.  That is, when queried, an existing conceptual row
+            has only three states:  it is either available for use by
+            the managed device (the status column has value `active');
+            it is not available for use by the managed device, though
+            the agent has sufficient information to make it so (the
+            status column has value `notInService'); or, it is not
+            available for use by the managed device, and an attempt to
+            make it so would fail because the agent has insufficient
+            information (the state column has value `notReady').
+
+
+                                     NOTE WELL
+
+                 This textual convention may be used for a MIB table,
+                 irrespective of whether the values of that table's
+                 conceptual rows are able to be modified while it is
+                 active, or whether its conceptual rows must be taken
+                 out of service in order to be modified.  That is, it is
+                 the responsibility of the DESCRIPTION clause of the
+                 status column to specify whether the status column must
+                 not be `active' in order for the value of some other
+                 column of the same conceptual row to be modified.  If
+                 such a specification is made, affected columns may be
+                 changed by an SNMP set PDU if the RowStatus would not
+                 be equal to `active' either immediately before or after
+                 processing the PDU.  In other words, if the PDU also
+                 contained a varbind that would change the RowStatus
+                 value, the column in question may be changed if the
+                 RowStatus was not equal to `active' as the PDU was
+                 received, or if the varbind sets the status to a value
+                 other than 'active'.
+
+
+            Also note that whenever any elements of a row exist, the
+            RowStatus column must also exist.
+
+            To summarize the effect of having a conceptual row with a
+            status column having a SYNTAX clause value of RowStatus,
+            consider the following state diagram:
+
+
+                                         STATE
+              +--------------+-----------+-------------+-------------
+              |      A       |     B     |      C      |      D
+              |              |status col.|status column|
+              |status column |    is     |      is     |status column
+    ACTION    |does not exist|  notReady | notInService|  is active
+--------------+--------------+-----------+-------------+-------------
+set status    |noError    ->D|inconsist- |inconsistent-|inconsistent-
+column to     |       or     |   entValue|        Value|        Value
+createAndGo   |inconsistent- |           |             |
+              |         Value|           |             |
+--------------+--------------+-----------+-------------+-------------
+set status    |noError  see 1|inconsist- |inconsistent-|inconsistent-
+column to     |       or     |   entValue|        Value|        Value
+createAndWait |wrongValue    |           |             |
+--------------+--------------+-----------+-------------+-------------
+set status    |inconsistent- |inconsist- |noError      |noError
+column to     |         Value|   entValue|             |
+active        |              |           |             |
+              |              |     or    |             |
+              |              |           |             |
+              |              |see 2   ->D|          ->D|          ->D
+--------------+--------------+-----------+-------------+-------------
+set status    |inconsistent- |inconsist- |noError      |noError   ->C
+column to     |         Value|   entValue|             |
+notInService  |              |           |             |
+              |              |     or    |             |      or
+              |              |           |             |
+              |              |see 3   ->C|          ->C|wrongValue
+--------------+--------------+-----------+-------------+-------------
+set status    |noError       |noError    |noError      |noError
+column to     |              |           |             |
+destroy       |           ->A|        ->A|          ->A|          ->A
+--------------+--------------+-----------+-------------+-------------
+set any other |see 4         |noError    |noError      |see 5
+column to some|              |           |             |
+value         |              |      see 1|          ->C|          ->D
+--------------+--------------+-----------+-------------+-------------
+
+            (1) goto B or C, depending on information available to the
+            agent.
+
+            (2) if other variable bindings included in the same PDU,
+            provide values for all columns which are missing but
+            required, then return noError and goto D.
+
+            (3) if other variable bindings included in the same PDU,
+            provide values for all columns which are missing but
+            required, then return noError and goto C.
+
+            (4) at the discretion of the agent, the return value may be
+            either:
+
+                 inconsistentName:  because the agent does not choose to
+                 create such an instance when the corresponding
+                 RowStatus instance does not exist, or
+
+                 inconsistentValue:  if the supplied value is
+                 inconsistent with the state of some other MIB object's
+                 value, or
+
+                 noError: because the agent chooses to create the
+                 instance.
+
+            If noError is returned, then the instance of the status
+            column must also be created, and the new state is B or C,
+            depending on the information available to the agent.  If
+            inconsistentName or inconsistentValue is returned, the row
+            remains in state A.
+
+            (5) depending on the MIB definition for the column/table,
+            either noError or inconsistentValue may be returned.
+
+            NOTE: Other processing of the set request may result in a
+            response other than noError being returned, e.g.,
+            wrongValue, noCreation, etc.
+
+
+                              Conceptual Row Creation
+
+            There are four potential interactions when creating a
+            conceptual row:  selecting an instance-identifier which is
+            not in use; creating the conceptual row; initializing any
+            objects for which the agent does not supply a default; and,
+            making the conceptual row available for use by the managed
+            device.
+
+
+            Interaction 1: Selecting an Instance-Identifier
+
+            The algorithm used to select an instance-identifier varies
+            for each conceptual row.  In some cases, the instance-
+            identifier is semantically significant, e.g., the
+            destination address of a route, and a management station
+            selects the instance-identifier according to the semantics.
+
+            In other cases, the instance-identifier is used solely to
+            distinguish conceptual rows, and a management station
+            without specific knowledge of the conceptual row might
+            examine the instances present in order to determine an
+            unused instance-identifier.  (This approach may be used, but
+            it is often highly sub-optimal; however, it is also a
+            questionable practice for a naive management station to
+            attempt conceptual row creation.)
+
+            Alternately, the MIB module which defines the conceptual row
+            might provide one or more objects which provide assistance
+            in determining an unused instance-identifier.  For example,
+            if the conceptual row is indexed by an integer-value, then
+            an object having an integer-valued SYNTAX clause might be
+            defined for such a purpose, allowing a management station to
+            issue a management protocol retrieval operation.  In order
+            to avoid unnecessary collisions between competing management
+            stations, `adjacent' retrievals of this object should be
+            different.
+
+            Finally, the management station could select a pseudo-random
+            number to use as the index.  In the event that this index
+            was already in use and an inconsistentValue was returned in
+            response to the management protocol set operation, the
+            management station should simply select a new pseudo-random
+            number and retry the operation.
+
+            A MIB designer should choose between the two latter
+            algorithms based on the size of the table (and therefore the
+            efficiency of each algorithm).  For tables in which a large
+            number of entries are expected, it is recommended that a MIB
+            object be defined that returns an acceptable index for
+            creation.  For tables with small numbers of entries, it is
+            recommended that the latter pseudo-random index mechanism be
+            used.
+
+
+            Interaction 2: Creating the Conceptual Row
+
+            Once an unused instance-identifier has been selected, the
+            management station determines if it wishes to create and
+            activate the conceptual row in one transaction or in a
+            negotiated set of interactions.
+
+            Interaction 2a: Creating and Activating the Conceptual Row
+
+            The management station must first determine the column
+            requirements, i.e., it must determine those columns for
+            which it must or must not provide values.  Depending on the
+            complexity of the table and the management station's
+            knowledge of the agent's capabilities, this determination
+            can be made locally by the management station.  Alternately,
+            the management station issues a management protocol get
+            operation to examine all columns in the conceptual row that
+            it wishes to create.  In response, for each column, there
+            are three possible outcomes:
+
+                 - a value is returned, indicating that some other
+                 management station has already created this conceptual
+                 row.  We return to interaction 1.
+
+                 - the exception `noSuchInstance' is returned,
+                 indicating that the agent implements the object-type
+                 associated with this column, and that this column in at
+                 least one conceptual row would be accessible in the MIB
+                 view used by the retrieval were it to exist. For those
+                 columns to which the agent provides read-create access,
+                 the `noSuchInstance' exception tells the management
+                 station that it should supply a value for this column
+                 when the conceptual row is to be created.
+
+                 - the exception `noSuchObject' is returned, indicating
+                 that the agent does not implement the object-type
+                 associated with this column or that there is no
+                 conceptual row for which this column would be
+                 accessible in the MIB view used by the retrieval.  As
+                 such, the management station cannot issue any
+                 management protocol set operations to create an
+                 instance of this column.
+
+            Once the column requirements have been determined, a
+            management protocol set operation is accordingly issued.
+            This operation also sets the new instance of the status
+            column to `createAndGo'.
+
+            When the agent processes the set operation, it verifies that
+            it has sufficient information to make the conceptual row
+            available for use by the managed device.  The information
+            available to the agent is provided by two sources:  the
+            management protocol set operation which creates the
+            conceptual row, and, implementation-specific defaults
+            supplied by the agent (note that an agent must provide
+            implementation-specific defaults for at least those objects
+            which it implements as read-only).  If there is sufficient
+            information available, then the conceptual row is created, a
+            `noError' response is returned, the status column is set to
+            `active', and no further interactions are necessary (i.e.,
+            interactions 3 and 4 are skipped).  If there is insufficient
+            information, then the conceptual row is not created, and the
+            set operation fails with an error of `inconsistentValue'.
+            On this error, the management station can issue a management
+            protocol retrieval operation to determine if this was
+            because it failed to specify a value for a required column,
+            or, because the selected instance of the status column
+            already existed.  In the latter case, we return to
+            interaction 1.  In the former case, the management station
+            can re-issue the set operation with the additional
+            information, or begin interaction 2 again using
+            `createAndWait' in order to negotiate creation of the
+            conceptual row.
+
+                                     NOTE WELL
+
+                 Regardless of the method used to determine the column
+                 requirements, it is possible that the management
+                 station might deem a column necessary when, in fact,
+                 the agent will not allow that particular columnar
+                 instance to be created or written.  In this case, the
+                 management protocol set operation will fail with an
+                 error such as `noCreation' or `notWritable'.  In this
+                 case, the management station decides whether it needs
+                 to be able to set a value for that particular columnar
+                 instance.  If not, the management station re-issues the
+                 management protocol set operation, but without setting
+                 a value for that particular columnar instance;
+                 otherwise, the management station aborts the row
+                 creation algorithm.
+
+            Interaction 2b: Negotiating the Creation of the Conceptual
+            Row
+
+            The management station issues a management protocol set
+            operation which sets the desired instance of the status
+            column to `createAndWait'.  If the agent is unwilling to
+            process a request of this sort, the set operation fails with
+            an error of `wrongValue'.  (As a consequence, such an agent
+            must be prepared to accept a single management protocol set
+            operation, i.e., interaction 2a above, containing all of the
+            columns indicated by its column requirements.)  Otherwise,
+            the conceptual row is created, a `noError' response is
+            returned, and the status column is immediately set to either
+            `notInService' or `notReady', depending on whether it has
+            sufficient information to make the conceptual row available
+            for use by the managed device.  If there is sufficient
+            information available, then the status column is set to
+            `notInService'; otherwise, if there is insufficient
+            information, then the status column is set to `notReady'.
+            Regardless, we proceed to interaction 3.
+
+            Interaction 3: Initializing non-defaulted Objects
+
+            The management station must now determine the column
+            requirements.  It issues a management protocol get operation
+            to examine all columns in the created conceptual row.  In
+            the response, for each column, there are three possible
+            outcomes:
+
+                 - a value is returned, indicating that the agent
+                 implements the object-type associated with this column
+                 and had sufficient information to provide a value.  For
+                 those columns to which the agent provides read-create
+                 access (and for which the agent allows their values to
+                 be changed after their creation), a value return tells
+                 the management station that it may issue additional
+                 management protocol set operations, if it desires, in
+                 order to change the value associated with this column.
+
+                 - the exception `noSuchInstance' is returned,
+                 indicating that the agent implements the object-type
+                 associated with this column, and that this column in at
+                 least one conceptual row would be accessible in the MIB
+                 view used by the retrieval were it to exist. However,
+                 the agent does not have sufficient information to
+                 provide a value, and until a value is provided, the
+                 conceptual row may not be made available for use by the
+                 managed device.  For those columns to which the agent
+                 provides read-create access, the `noSuchInstance'
+                 exception tells the management station that it must
+                 issue additional management protocol set operations, in
+                 order to provide a value associated with this column.
+
+                 - the exception `noSuchObject' is returned, indicating
+                 that the agent does not implement the object-type
+                 associated with this column or that there is no
+                 conceptual row for which this column would be
+                 accessible in the MIB view used by the retrieval.  As
+                 such, the management station cannot issue any
+                 management protocol set operations to create an
+                 instance of this column.
+
+            If the value associated with the status column is
+            `notReady', then the management station must first deal with
+            all `noSuchInstance' columns, if any.  Having done so, the
+            value of the status column becomes `notInService', and we
+            proceed to interaction 4.
+
+            Interaction 4: Making the Conceptual Row Available
+
+            Once the management station is satisfied with the values
+            associated with the columns of the conceptual row, it issues
+            a management protocol set operation to set the status column
+            to `active'.  If the agent has sufficient information to
+            make the conceptual row available for use by the managed
+            device, the management protocol set operation succeeds (a
+            `noError' response is returned).  Otherwise, the management
+            protocol set operation fails with an error of
+            `inconsistentValue'.
+
+
+                                     NOTE WELL
+
+                 A conceptual row having a status column with value
+                 `notInService' or `notReady' is unavailable to the
+                 managed device.  As such, it is possible for the
+                 managed device to create its own instances during the
+                 time between the management protocol set operation
+                 which sets the status column to `createAndWait' and the
+                 management protocol set operation which sets the status
+                 column to `active'.  In this case, when the management
+                 protocol set operation is issued to set the status
+                 column to `active', the values held in the agent
+                 supersede those used by the managed device.
+
+            If the management station is prevented from setting the
+            status column to `active' (e.g., due to management station
+            or network failure) the conceptual row will be left in the
+            `notInService' or `notReady' state, consuming resources
+            indefinitely.  The agent must detect conceptual rows that
+            have been in either state for an abnormally long period of
+            time and remove them.  It is the responsibility of the
+            DESCRIPTION clause of the status column to indicate what an
+            abnormally long period of time would be.  This period of
+            time should be long enough to allow for human response time
+            (including `think time') between the creation of the
+            conceptual row and the setting of the status to `active'.
+            In the absence of such information in the DESCRIPTION
+            clause, it is suggested that this period be approximately 5
+            minutes in length.  This removal action applies not only to
+            newly-created rows, but also to previously active rows which
+            are set to, and left in, the notInService state for a
+            prolonged period exceeding that which is considered normal
+            for such a conceptual row.
+
+
+                             Conceptual Row Suspension
+
+            When a conceptual row is `active', the management station
+            may issue a management protocol set operation which sets the
+            instance of the status column to `notInService'.  If the
+            agent is unwilling to do so, the set operation fails with an
+            error of `wrongValue'.  Otherwise, the conceptual row is
+            taken out of service, and a `noError' response is returned.
+            It is the responsibility of the DESCRIPTION clause of the
+            status column to indicate under what circumstances the
+            status column should be taken out of service (e.g., in order
+            for the value of some other column of the same conceptual
+            row to be modified).
+
+
+                              Conceptual Row Deletion
+
+            For deletion of conceptual rows, a management protocol set
+            operation is issued which sets the instance of the status
+            column to `destroy'.  This request may be made regardless of
+            the current value of the status column (e.g., it is possible
+            to delete conceptual rows which are either `notReady',
+            `notInService' or `active'.)  If the operation succeeds,
+            then all instances associated with the conceptual row are
+            immediately removed."
+
+
+    SYNTAX       INTEGER {
+                     -- the following two values are states:
+                     -- these values may be read or written
+                     active(1),
+                     notInService(2),
+
+                     -- the following value is a state:
+                     -- this value may be read, but not written
+                     notReady(3),
+
+                     -- the following three values are
+                     -- actions: these values may be written,
+                     --   but are never read
+                     createAndGo(4),
+                     createAndWait(5),
+                     destroy(6)
+                 }
+      
+
+
+
+ diff --git a/lib/snmp/doc/src/snmp_audit_trail_log.xml b/lib/snmp/doc/src/snmp_audit_trail_log.xml new file mode 100644 index 0000000000..9a49a0175b --- /dev/null +++ b/lib/snmp/doc/src/snmp_audit_trail_log.xml @@ -0,0 +1,81 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Audit Trail Log + + + + + + + + snmp_audit_trail_log.xml +
+

The chapter Audit Trail Log describes the audit trail logging. +

+

Both the agent and the manager can be configured to log + incoming and outgoing messages. It uses the Erlang standard log + mechanism disk_log for logging. The size and location of + the log files are configurable. A wrap log is used, which means + that when the log has grown to a maximum size, it starts from the + beginning of the log, overwriting existing log records. +

+

The log can be either a read, write or a + read_write. +

+ +
+ Agent Logging +

For the agent, a write, means that all set + requests and their responses are stored. No get requests + or traps are stored in a write. A read_write, + all requests, responses and traps are stored. +

+

The log uses a raw data format (basically the BER encoded + message), in order to minimize the CPU load needed for the log + mechanism. This means that the log is not human readable, but + needs to be formatted off-line before it can be read. Use the + function + snmpa:log_to_txt + for this purpose. +

+
+ +
+ Manager Logging +

For the manager, a write, means that all + requests (set and get) and their responses are stored. + No traps are stored in a write. A read_write, + all requests, responses and traps are stored. +

+

The log uses a raw data format (basically the BER encoded + message), in order to minimize the CPU load needed for the log + mechanism. This means that the log is not human readable, but + needs to be formatted off-line before it can be read. Use the + function + snmpm:log_to_txt + for this purpose. +

+
+
+ diff --git a/lib/snmp/doc/src/snmp_community_mib.xml b/lib/snmp/doc/src/snmp_community_mib.xml new file mode 100644 index 0000000000..7c7386af19 --- /dev/null +++ b/lib/snmp/doc/src/snmp_community_mib.xml @@ -0,0 +1,136 @@ + + + + +
+ + 19992009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmp_community_mib + + + + + + + + snmp_community_mib.xml +
+ snmp_community_mib + Instrumentation Functions for SNMP-COMMUNITY-MIB + +

The module snmp_community_mib implements the instrumentation + functions for the + SNMP-COMMUNITY-MIB, and functions for configuring the database. +

+

The configuration files are described in the SNMP User's Manual.

+
+ + + configure(ConfDir) -> void() + Configure the SNMP-COMMUNITY-MIB + + ConfDir = string() + + +

This function is called from the supervisor at system + start-up. +

+

Inserts all data in the configuration files into the + database and destroys all old rows with StorageType + volatile. The rows created from the configuration file + will have StorageType nonVolatile. +

+

All snmp counters are set to zero. +

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the error, + report module and the function fails with reason + configuration_error. +

+

ConfDir is a string which points to the directory + where the configuration files are found. +

+

The configuration file read is: community.conf. +

+
+
+ + reconfigure(ConfDir) -> void() + Configure the SNMP-COMMUNITY-MIB + + ConfDir = string() + + +

Inserts all data in the configuration files into the + database and destroys all old data, including the rows with + StorageType nonVolatile. The rows created from the + configuration file will have StorageType nonVolatile. +

+

Thus, the data in the SNMP-COMMUNITY-MIB, after this + function has been called, is from the configuration files. +

+

All snmp counters are set to zero. +

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the error report + module, and the function fails with reason + configuration_error. +

+

ConfDir is a string which points to the directory + where the configuration files are found. +

+

The configuration file read is: community.conf.

+ +
+
+ + add_community(Idx, CommName, SecName, CtxName, TransportTag) -> Ret + Added one community + + Idx = string() + CommName = string() + SecName = string() + CtxName = string() + TransportTag = string() + Ret = {ok, Key} | {error, Reason} + Key = term() + Reason = term() + + +

Adds a community to the agent config. + Equivalent to one line in the community.conf file.

+ +
+
+ + delete_community(Key) -> Ret + Delete one community + + Key = term() + Ret = ok | {error, Reason} + Reason = term() + + +

Delete a community from the agent config.

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmp_config.xml b/lib/snmp/doc/src/snmp_config.xml new file mode 100644 index 0000000000..073cdde308 --- /dev/null +++ b/lib/snmp/doc/src/snmp_config.xml @@ -0,0 +1,1030 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Running the application + + + + + + + + snmp_config.xml +
+

The chapter Running the application describes how the + application is configured and started. + The topics include:

+ + configuration directories and parameters + modifying the configuration files + starting the application (agent and/or manager) + debugging the application (agent and/or manager) + +

Refer also to the chapter(s) + Definition of Agent Configuration Files and + Definition of Manager Configuration Files which contains more detailed information + about the agent and manager configuration files.

+ +
+ + Configuring the application +

The following two directories must exist in the system + to run the agent:

+ + +

the configuration directory stores all + configuration files used by the agent (refer to the chapter + Definition of Agent Configuration Files for more information).

+
+ the database directory stores the internal + database files. +
+

The following directory must exist in the system + to run the manager:

+ + +

the configuration directory stores all + configuration files used by the manager (refer to the chapter + Definition of Manager Configuration Files for more information).

+
+ +

the database directory stores the internal + database files.

+
+
+ +

The agent and manager uses (application) configuration parameters to + find out where these directories are located. The parameters should be + defined in an Erlang system configuration file. The following + configuration parameters are defined for the SNMP application:

+ + + +
+      agent_options() = [agent_option()]
+      agent_option() = {restart_type,     restart_type()}     | 
+                       {agent_type,       agent_type()}       |  
+                       {agent_verbosity,  verbosity()}        |  
+                       {versions,         versions()}         |  
+                       {discovery,        agent_discovery()}  |  
+                       {priority,         priority()}         |  
+                       {multi_threaded,   multi_threaded()}   |  
+                       {db_dir,           db_dir()}           |  
+                       {db_init_error,    db_init_error()}    |  
+                       {local_db,         local_db()}         |  
+                       {net_if,           agent_net_if()}     |  
+                       {mibs,             mibs()}             |  
+                       {mib_storage,      mib_storage()}      |  
+                       {mib_server,       mib_server()}       |  
+                       {audit_trail_log,  audit_trail_log()}  |  
+                       {error_report_mod, error_report_mod()} |  
+                       {note_store,       note_store()}       |  
+                       {symbolic_store,   symbolic_store()}   |  
+                       {target_cache,     target_cache()}     |  
+                       {config,           agent_config()}
+      manager_options() = [manager_option()]
+      manager_option() = {restart_type,             restart_type()}    | 
+                         {net_if,                   manager_net_if()}  |  
+                         {server,                   server()}          | 
+                         {note_store,               note_store()}      | 
+                         {config,                   manager_config()}  |  
+                         {inform_request_behaviour, manager_irb()}     | 
+                         {mibs,                     manager_mibs()}    | 
+                         {priority,                 priority()}        |  
+                         {audit_trail_log,          audit_trail_log()} | 
+                         {versions,                 versions()}        | 
+                         {def_user_mod,             def_user_module()  | 
+                         {def_user_data,            def_user_data()}
+    
+ +

Agent specific config options and types:

+ + ]]> + +

If master, one master agent is + started. Otherwise, no agents are started.

+

Default is master.

+
+ + ]]> + +

agent_discovery_opt() = + {terminating, agent_terminating_discovery_opts()} | + {originating, agent_originating_discovery_opts()}

+

The terminating options effects discovery initiated by + a manager.

+

The originating options effects discovery initiated + by this agent.

+

For defaults see the options in agent_discovery_opt().

+
+ + ]]> + +

agent_terminating_discovery_opt() = + {enable, boolean()} | + {stage2, discovery | plain} | + {trigger_username, string()}

+

These are options effecting discovery terminating in this + agent (i.e. initiated by a manager).

+

The default values for the terminating + discovery options are:

+ + enable: true + stage2: discovery + trigger_username: "" + +
+ + ]]> + +

agent_originating_discovery_opt() = + {enable, boolean()}

+

These are options effecting discovery originating in this + agent.

+

The default values for the originating + discovery options are:

+ + enable: true + +
+ + ]]> + +

If true, the agent is multi-threaded, with one + thread for each get request.

+

Default is false.

+
+ + ]]> + +

Defines where the SNMP agent internal db files are stored.

+
+ + ]]> + +

local_db_opt() = {repair, agent_repair()} | {auto_save, agent_auto_save()} | {verbosity, verbosity()}

+

Defines options specific for the SNMP agent local database.

+

For defaults see the options in local_db_opt().

+
+ + ]]> + +

When starting snmpa_local_db it always tries to open an + existing database. If false, and some errors occur, a new + database is created instead. If true, an existing file + will be repaired. If force, the table will be repaired + even if it was properly closed.

+

Default is true.

+
+ + ]]> + +

The auto save interval. The table is flushed to disk + whenever not accessed for this amount of time.

+

Default is 5000.

+
+ + ]]> + +

agent_net_if_option() = {module, agent_net_if_module()} | + {verbosity, verbosity()} | + {options, agent_net_if_options()}

+

Defines options specific for the SNMP agent network interface + entity.

+

For defaults see the options in agent_net_if_opt().

+
+ + ]]> + +

Module which handles the network interface part for the + SNMP agent. Must implement the + snmpa_network_interface behaviour.

+

Default is snmpa_net_if.

+
+ + ]]> + +

agent_net_if_option() = {bind_to, bind_to()} | + {sndbuf, sndbuf()} | + {recbuf, recbuf()} | + {no_reuse, no_reuse()} | + {req_limit, req_limit()} | + {filter, agent_net_if_filter_options()}

+

These options are actually specific to the used module. + The ones shown here are applicable to the default + agent_net_if_module().

+

For defaults see the options in agent_net_if_option().

+
+ + ]]> + +

+

These options are actually specific to the used module. + The ones shown here are applicable to the default + agent_net_if_filter_module().

+

For defaults see the options in agent_net_if_filter_option().

+
+ + ]]> + +

Module which handles the network interface filter part for the + SNMP agent. Must implement the + snmpa_network_interface_filter + behaviour.

+

Default is snmpa_net_if_filter.

+
+ + ]]> + +

Max number of simultaneous requests handled by the agent.

+

Default is infinity.

+
+ + ]]> + +

Specifies a list of MIBs (including path) that defines which MIBs + are initially loaded into the SNMP master agent.

+

Note that the following will always be loaded:

+ + version v1: STANDARD-MIB + version v2: SNMPv2 + version v3: SNMPv2, SNMP-FRAMEWORK-MIB + and SNMP-MPD-MIB + +

Default is [].

+
+ + ]]> + +

Specifies how info retrieved from the mibs will be stored.

+

If mib_storage is {ets, Dir}, the table will also be + stored on file. If Dir is default, then db_dir + will be used.

+

If mib_storage is dets or if Dir is + default, then db_dir will be used for Dir.

+

If mib_storage is mnesia then erlang:nodes() + will be used for Nodes.

+

Default is ets.

+

Dir = default | string(). Dir is the directory where the + files will be stored. If default, then db_dir will be + used.

+

Nodes = visible | connected | [node()]. + Nodes = visible is translated to + erlang:nodes(visible). + Nodes = connected is translated to + erlang:nodes(connected). + If Nodes = [] then the own node is assumed.

+

Action = clear | keep. Default is keep. + Action is used to specify what shall be done if the + mnesia/dets table already exist.

+
+ + ]]> + +

mib_server_opt() = {mibentry_override, mibentry_override()} | {trapentry_override, trapentry_override()} | {verbosity, verbosity()} | {cache, mibs_cache()}

+

Defines options specific for the SNMP agent mib server.

+

For defaults see the options in mib_server_opt().

+
+ + ]]> + +

If this value is false, then when loading a mib each mib- + entry is checked prior to installation of the mib. + The purpose of the check is to prevent that the same symbolic + mibentry name is used for different oid's.

+

Default is false.

+
+ + ]]> + +

If this value is false, then when loading a mib each trap + is checked prior to installation of the mib. + The purpose of the check is to prevent that the same symbolic + trap name is used for different trap's.

+

Default is false.

+
+ + ]]> + +

Shall the agent utilize the mib server lookup cache or not.

+

Default is true (in which case the mibs_cache_opts() + default values apply).

+
+ + ]]> + +

mibs_cache_opt() = {autogc, mibs_cache_autogc()} | {gclimit, mibs_cache_gclimit()} | {age, mibs_cache_age()}

+

Defines options specific for the SNMP agent mib server cache.

+

For defaults see the options in mibs_cache_opt().

+
+ + ]]> + +

Defines if the mib server shall perform cache gc automatically or + leave it to the user (see + gc_mibs_cache/0,1,2,3).

+

Default is false.

+
+ + 0 ]]> + +

Defines how old the entries in the cache will be allowed before + they are GC'ed (assuming GC is performed). Each entry in the + cache is "touched" whenever it is accessed.

+

The age is defined in milliseconds.

+

Default is 10 timutes.

+
+ + 0 | infinity ]]> + +

When performing a GC, this is the max number of cache entries + that will be deleted from the cache.

+

The reason for having this limit is that if the cache is + large, the GC can potentially take a long time, during which + the agent is locked.

+

Default is 100.

+
+ + ]]> + +

Defines an error report module, implementing the + snmpa_error_report + behaviour. Two modules are provided with the toolkit: + snmpa_error_logger and snmpa_error_io.

+

Default is snmpa_error_logger.

+
+ + symbolic_store() = [symbolic_store_opt()] + +

symbolic_store_opt() = {verbosity, verbosity()}

+

Defines options specific for the SNMP agent symbolic store.

+

For defaults see the options in symbolic_store_opt().

+
+ + target_cache() = [target_cache_opt()] + +

target_cache_opt() = {verbosity, verbosity()}

+

Defines options specific for the SNMP agent target cache.

+

For defaults see the options in target_cache_opt().

+
+ ]]> + +

agent_config_opt() = {dir, agent_config_dir()} | {force_load, force_load()} | {verbosity, verbosity()}

+

Defines specific config related options for the SNMP agent.

+

For defaults see the options in agent_config_opt().

+
+ + ]]> + +

Defines where the SNMP agent configuration files are stored.

+
+ + ]]> + +

If true the configuration files are re-read + during start-up, and the contents of the configuration + database ignored. Thus, if true, changes to + the configuration database are lost upon reboot of the + agent.

+

Default is false.

+
+
+ +

Manager specific config options and types:

+ + ]]> + +

server_opt() = {timeout, server_timeout()} | {verbosity, verbosity()}

+

Specifies the options for the manager server process.

+

Default is silence.

+
+ ]]> + +

Asynchroneous request cleanup time. For every requests, + some info is stored internally, in order to be able to + deliver the reply (when it arrives) to the proper destination. + If the reply arrives, this info will be deleted. But if + there is no reply (in time), the info has to be deleted + after the best before time has been passed. + This cleanup will be performed at regular intervals, defined + by the server_timeout() time. + The information will have a best before time, + defined by the Expire time given when calling the + request function (see + async_get, + async_get_next and + async_set).

+

Time in milli-seconds.

+

Default is 30000.

+
+ + ]]> + +

manager_config_opt() = {dir, manager_config_dir()} | {db_dir, manager_db_dir()} | {db_init_error, db_init_error()} | {repair, manager_repair()} | {auto_save, manager_auto_save()} | {verbosity, verbosity()}

+

Defines specific config related options for the SNMP manager.

+

For defaults see the options in manager_config_opt().

+
+ + ]]> + +

Defines where the SNMP manager configuration files are stored.

+
+ + ]]> + +

Defines where the SNMP manager store persistent data.

+
+ + ]]> + +

Defines the repair option for the persistent database (if + and how the table is repaired when opened).

+

Default is true.

+
+ + ]]> + +

The auto save interval. The table is flushed to disk + whenever not accessed for this amount of time.

+

Default is 5000.

+
+ + ]]> + +

This option defines how the manager will handle the sending of + response (acknowledgment) to received inform-requests.

+ + +

auto - The manager will autonomously send response + (acknowledgment> to inform-request messages.

+
+ +

{user, integer()} - The manager will send response + (acknowledgment) to inform-request messages when the + handle_inform + function completes. The integer is the time, in milli-seconds, + that the manager will consider the stored inform-request info + valid.

+
+ +

user - Same as {user, integer()}, except that + the default time, 15000 milli-seconds, is used.

+
+
+

See + snmpm_network_interface, + handle_inform and + definition of the manager net if for more info.

+

Default is auto.

+
+ + ]]> + +

Specifies a list of MIBs (including path) and defines which MIBs + are initially loaded into the SNMP manager.

+

Default is [].

+
+ + ]]> + +

manager_net_if_opt() = {module, manager_net_if_module()} | + {verbosity, verbosity()} | + {options, manager_net_if_options()}

+

Defines options specific for the SNMP manager network interface + entity.

+

For defaults see the options in manager_net_if_opt().

+
+ + ]]> + +

manager_net_if_option() = {bind_to, bind_to()} | + {sndbuf, sndbuf()} | + {recbuf, recbuf()} | + {no_reuse, no_reuse()} | + {filter, manager_net_if_filter_options()}

+

These options are actually specific to the used module. + The ones shown here are applicable to the default + manager_net_if_module().

+

For defaults see the options in manager_net_if_option().

+
+ + ]]> + +

Module which handles the network interface part for the + SNMP manager. Must implement the + snmpm_network_interface behaviour.

+

Default is snmpm_net_if.

+
+ + ]]> + +

manager_net_if_filter_option() = {module, manager_net_if_filter_module()}

+

These options are actually specific to the used module. + The ones shown here are applicable to the default + .

+

For defaults see the options in + manager_net_if_filter_option().

+
+ + ]]> + +

Module which handles the network interface filter part for the + SNMP manager. Must implement the + snmpm_network_interface_filter behaviour.

+

Default is snmpm_net_if_filter.

+
+ + ]]> + +

The module implementing the default user. See the + snmpm_user behaviour.

+

Default is snmpm_user_default.

+
+ + ]]> + +

Data for the default user. Passed to the user when calling + the callback functions.

+

Default is undefined.

+
+
+ +

Common config types:

+ + restart_type() = permanent | transient | temporary + +

See supervisor + documentation for more info.

+

Default is permanent for the agent and transient + for the manager.

+
+ + db_init_error() = terminate | create + +

Defines what to do if the agent is unable to open an + existing database file. terminate means that the + agent/manager will terminate and create means that the + agent/manager will remove the faulty file(s) and create new ones.

+

Default is terminate.

+
+ + ]]> + +

Defines the Erlang priority for all SNMP processes.

+

Default is normal.

+
+ + ]]> + +

version() = v1 | v2 | v3

+

Which SNMP versions shall be accepted/used.

+

Default is [v1,v2,v3].

+
+ + ]]> + +

Verbosity for a SNMP process. This specifies now much debug info + is printed.

+

Default is silence.

+
+ + ]]> + +

If true, net_if binds to the IP address. + If false, net_if listens on any IP address on the host + where it is running.

+

Default is false.

+
+ + ]]> + +

If true, net_if does not specify that the IP + and port address should be reusable. If false, + the address is set to reusable.

+

Default is false.

+
+ + ]]> + +

Receive buffer size.

+

Default value is defined by gen_udp.

+
+ ]]> + +

Send buffer size.

+

Default value is defined by gen_udp.

+
+ + ]]> + +

note_store_opt() = {timeout, note_store_timeout()} | {verbosity, verbosity()}

+

Specifies the options for the SNMP note store.

+

For defaults see the options in note_store_opt().

+
+ + ]]> + +

Note cleanup time. When storing a note in the note store, + each note is given lifetime. Every timeout the note_store + process performs a GC to remove the expired note's. Time in + milli-seconds.

+

Default is 30000.

+
+ + ]]> + +

audit_trail_log_opt() = {type, atl_type()} | {dir, atl_dir()} | {size, atl_size()} | {repair, atl_repair()}

+

If present, this option specifies the options for the + audit trail logging. The disk_log module is used + to maintain a wrap log. If present, the dir and + size options are mandatory.

+

If not present, audit trail logging is not used.

+
+ + ]]> + +

Specifies what type of an audit trail log should be used. + The effect of the type is actually different for the the agent + and the manager.

+

For the agent:

+ + If write is specified, only set requests are logged. + If read is specified, only get requests are logged. + If read_write, all requests are logged. + +

For the manager:

+ + If write is specified, only sent messages are logged. + If read is specified, only received messages are logged. + If read_write, both outgoing and incoming messages are + logged. + +

Default is read_write.

+
+ + ]]> + +

Specifies where the audit trail log should be stored.

+

If audit_trail_log specifies that logging should take + place, this parameter must be defined.

+
+ + ]]> + +

Specifies the size of the audit + trail log. This parameter is sent to disk_log.

+

If audit_trail_log specifies that logging should + take place, this parameter must be defined.

+
+ + ]]> + +

Specifies if and how the audit trail log shall be repaired + when opened. Unless this parameter has the value snmp_repair + it is sent to disk_log. If, on the other hand, the value is + snmp_repair, snmp attempts to handle certain faults on it's + own. And even if it cannot repair the file, it does not truncate it + directly, but instead moves it aside for later off-line + analysis.

+

Default is true.

+
+
+
+ +
+ Modifying the Configuration Files +

To to start the application (agent and/or manager), the + configuration files must be modified and there are two ways + of doing this. Either edit the files manually, or run the + configuration tool as follows.

+

If authentication or encryption is used (SNMPv3 only), start + the crypto application.

+
+1> snmp:config().
+
+Simple SNMP configuration tool (version 4.0)
+------------------------------------------------
+Note: Non-trivial configurations still has to be
+      done manually. IP addresses may be entered 
+      as dront.ericsson.se (UNIX only) or
+      123.12.13.23
+------------------------------------------------
+
+Configure an agent (y/n)? [y] 
+
+Agent system config: 
+--------------------
+1. Agent process priority (low/normal/high) [normal] 
+2. What SNMP version(s) should be used (1,2,3,1&2,1&2&3,2&3)? [3] 1&2&3
+3. Configuration directory (absolute path)? [/ldisk/snmp] /ldisk/snmp/agent/conf
+4. Config verbosity (silence/info/log/debug/trace)? [silence] 
+5. Database directory (absolute path)? [/ldisk/snmp] /ldisk/snmp/agent/db
+6. Mib storage type (ets/dets/mnesia)? [ets] 
+7. Target cache verbosity (silence/info/log/debug/trace)? [silence] 
+8. Symbolic store verbosity (silence/info/log/debug/trace)? [silence] 
+9. Local DB verbosity (silence/info/log/debug/trace)? [silence] 
+10. Local DB repair (true/false/force)? [true] 
+11. Local DB auto save (infinity/milli seconds)? [5000] 
+12. Error report module? [snmpa_error_logger] 
+13. Agent type (master/sub)? [master] 
+14. Master-agent verbosity (silence/info/log/debug/trace)? [silence] log
+15. Shall the agent re-read the configuration files during startup 
+    (and ignore the configuration database) (true/false)? [true] 
+16. Multi threaded agent (true/false)? [false] true
+17. Check for duplicate mib entries when installing a mib (true/false)? [false] 
+18. Check for duplicate trap names when installing a mib (true/false)? [false] 
+19. Mib server verbosity (silence/info/log/debug/trace)? [silence] 
+20. Mib server cache (true/false)? [true]
+21. Note store verbosity (silence/info/log/debug/trace)? [silence] 
+22. Note store GC timeout? [30000] 
+23. Shall the agent use an audit trail log (y/n)? [n] y
+23b. Audit trail log type (write/read_write)? [read_write] 
+23c. Where to store the audit trail log? [/ldisk/snmp] /ldisk/snmp/agent/log
+23d. Max number of files? [10] 
+23e. Max size (in bytes) of each file? [10240] 
+23f. Audit trail log repair (true/false/truncate)? [true] 
+24. Which network interface module shall be used? [snmpa_net_if] 
+25. Network interface verbosity (silence/info/log/debug/trace)? [silence] log
+25a. Bind the agent IP address (true/false)? [false] 
+25b. Shall the agents IP address and port be not reusable (true/false)? [false] 
+25c. Agent request limit (used for flow control) (infinity/pos integer)? [infinity] 32
+25d. Receive buffer size of the agent (in bytes) (default/pos integer)? [default] 
+25e. Send buffer size of the agent (in bytes) (default/pos integer)? [default]
+25f. Do you wish to specify a network interface filter module (or use default) [default] 
+
+Agent snmp config: 
+------------------
+1. System name (sysName standard variable) [bmk's agent] 
+2. Engine ID (snmpEngineID standard variable) [bmk's engine] 
+3. Max message size? [484] 
+4. The UDP port the agent listens to. (standard 161) [4000] 
+5. IP address for the agent (only used as id 
+   when sending traps) [127.0.0.1] 
+6. IP address for the manager (only this manager 
+   will have access to the agent, traps are sent 
+   to this one) [127.0.0.1] 
+7. To what UDP port at the manager should traps 
+   be sent (standard 162)? [5000] 
+8. Do you want a none- minimum- or semi-secure configuration? 
+   Note that if you chose v1 or v2, you won't get any security for these
+   requests (none, minimum, semi_des, semi_aes) [minimum] 
+making sure crypto server is started...
+8b. Give a password of at least length 8. It is used to generate 
+    private keys for the configuration:  kalle-anka
+9. Current configuration files will now be overwritten. Ok (y/n)? [y] 
+
+- - - - - - - - - - - - -
+Info: 1. SecurityName "initial" has noAuthNoPriv read access
+         and authenticated write access to the "restricted"
+         subtree.
+      2. SecurityName "all-rights" has noAuthNoPriv read/write
+         access to the "internet" subtree.
+      3. Standard traps are sent to the manager.
+      4. Community "public" is mapped to security name "initial".
+      5. Community "all-rights" is mapped to security name "all-rights".
+The following agent files were written: agent.conf, community.conf,
+standard.conf, target_addr.conf, target_params.conf, 
+notify.conf, vacm.conf and usm.conf
+- - - - - - - - - - - - -
+
+Configure a manager (y/n)? [y] 
+
+Manager system config: 
+----------------------
+1. Manager process priority (low/normal/high) [normal] 
+2. What SNMP version(s) should be used (1,2,3,1&2,1&2&3,2&3)? [3] 1&2&3
+3. Configuration directory (absolute path)? [/ldisk/snmp] /ldisk/snmp/manager/conf
+4. Config verbosity (silence/info/log/debug/trace)? [silence] log
+5. Database directory (absolute path)? [/ldisk/snmp] /ldisk/snmp/manager/db
+6. Database repair (true/false/force)? [true] 
+7. Database auto save (infinity/milli seconds)? [5000] 
+8. Inform request behaviour (auto/user)? [auto] 
+9. Server verbosity (silence/info/log/debug/trace)? [silence] log
+10. Server GC timeout? [30000] 
+11. Note store verbosity (silence/info/log/debug/trace)? [silence] 
+12. Note store GC timeout? [30000] 
+13. Which network interface module shall be used? [snmpm_net_if] 
+14. Network interface verbosity (silence/info/log/debug/trace)? [silence] log
+15. Bind the manager IP address (true/false)? [false] 
+16. Shall the manager IP address and port be not reusable (true/false)? [false] 
+17. Receive buffer size of the manager (in bytes) (default/pos integer)? [default] 
+18. Send buffer size of the manager (in bytes) (default/pos integer)? [default] 
+19. Shall the manager use an audit trail log (y/n)? [n] y
+19b. Where to store the audit trail log? [/ldisk/snmp] /ldisk/snmp/manager/log
+19c. Max number of files? [10] 
+19d. Max size (in bytes) of each file? [10240] 
+19e. Audit trail log repair (true/false/truncate)? [true] 
+20. Do you wish to assign a default user [yes] or use
+    the default settings [no] (y/n)? [n] 
+
+Manager snmp config: 
+--------------------
+1. Engine ID (snmpEngineID standard variable) [bmk's engine] 
+2. Max message size? [484] 
+3. IP address for the manager (only used as id 
+   when sending requests) [127.0.0.1] 
+4. Port number (standard 162)? [5000] 
+5. Configure a user of this manager (y/n)? [y] 
+5b. User id? kalle
+5c. User callback module? snmpm_user_default
+5d. User (callback) data? [undefined] 
+5. Configure a user of this manager (y/n)? [y] n
+6. Configure an agent handled by this manager (y/n)? [y] 
+6b. User id? kalle
+6c. Target name? [bmk's agent] 
+6d. Version (1/2/3)? [1] 3
+6e. Community string ? [public] 
+6f. Engine ID (snmpEngineID standard variable) [bmk's engine] 
+6g. IP address for the agent [127.0.0.1] 
+6h. The UDP port the agent listens to. (standard 161) [4000] 
+6i. Retransmission timeout (infinity/pos integer)? [infinity] 
+6j. Max message size? [484] 
+6k. Security model (any/v1/v2c/usm)? [any] usm
+6l. Security name? ["initial"] 
+6m. Security level (noAuthNoPriv/authNoPriv/authPriv)? [noAuthNoPriv] authPriv
+6. Configure an agent handled by this manager (y/n)? [y] n
+7. Configure an usm user handled by this manager (y/n)? [y] 
+7a. Engine ID [bmk's engine] 
+7b. User name? hobbes
+7c. Security name? [hobbes] 
+7d. Authentication protocol (no/sha/md5)? [no] sha
+7e  Authentication [sha] key (length 0 or 20)? [""] [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
+7d. Priv protocol (no/des/aes)? [no] des
+7f  Priv [des] key (length 0 or 16)? [""] 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25
+7. Configure an usm user handled by this manager (y/n)? [y] n
+8. Current configuration files will now be overwritten. Ok (y/n)? [y] 
+
+- - - - - - - - - - - - -
+The following manager files were written: manager.conf, agents.conf , users.conf and usm.conf
+- - - - - - - - - - - - -
+
+--------------------
+Configuration directory for system file (absolute path)? [/ldisk/snmp] 
+ok
+    
+
+ +
+ Starting the application +

Start Erlang with the command:

+ +erl -config /tmp/snmp/sys + +

If authentication or encryption is used (SNMPv3 only), start + the crypto application. If this step is forgotten, the + agent will not start, but report a + {config_error,{unsupported_crypto,_}} error.

+
+1> application:start(crypto).
+ok
+    
+
+2> application:start(snmp).
+ok
+    
+
+ +
+ + Debugging the application +

It is possible to debug every (non-supervisor) process of the + application (both agent and manager), possibly with the exception + of the net_if module(s), which could be supplied by a user of the + application). This is done by calling the + snmpa:verbosity/2 and snmpm:verbosity/2 function(s) + and/or using + configuration parameters. + The verbosity itself has several levels: silence | info | log | debug | trace. For the lowest verbosity silence, + nothing is printed. The higher the verbosity, the more is printed. + Default value is always silence.

+
+3> snmpa:verbosity(master_agent, log).
+ok
+5> snmpa:verbosity(net_if, log).
+ok
+6> 
+%% Example of output from the agent when a get-next-request arrives:
+** SNMP NET-IF LOG: 
+   got packet from {147,12,12,12}:5000
+
+** SNMP NET-IF MPD LOG: 
+   v1, community: all-rights
+
+** SNMP NET-IF LOG: 
+   got pdu from {147,12,12,12}:5000 {pdu, 'get-next-request',
+                                          62612569,noError,0,
+                                          [{varbind,[1,1],'NULL','NULL',1}]}
+
+** SNMP MASTER-AGENT LOG: 
+   apply: snmp_generic,variable_func,[get,{sysDescr,persistent}]
+
+** SNMP MASTER-AGENT LOG: 
+   returned: {value,"Erlang SNMP agent"}
+
+** SNMP NET-IF LOG: 
+   reply pdu: {pdu,'get-response',62612569,noError,0,
+                   [{varbind,[1,3,6,1,2,1,1,1,0],
+                             'OCTET STRING',
+                             "Erlang SNMP agent",1}]}
+
+** SNMP NET-IF INFO: time in agent: 19711 mysec
+    
+ +

Other useful function(s) for debugging the agent are:

+ + + +

info is used to retrieve a list of miscellaneous agent information.

+
+ + + +

which_aliasnames is used to retrieve a list of all alias-names known to the agent.

+
+ + + +

which_tables is used to retrieve a list of all (MIB) tables known to the agent.

+
+ + + +

which_variables is used to retrieve a list of all (MIB) variables known to the agent.

+
+ + + +

which_notifications is used to retrieve a list of all (MIB) notifications/traps known to the agent.

+
+ + + +

restart_worker is used to restart the worker process of a multi-threaded agent.

+
+ + + +

restart_set_worker is used to restart the set-worker process of a multi-threaded agent.

+
+ + + +

For example, this function can show the counters + snmpInPkts and snmpOutPkts.

+
+
+ +

Another usefull way to debug the agent is to pretty-print the content of + some of the (MIB-) tables handled directly by the agent. This can be done + for the following tables:

+ + + +

+
+ + + +

+
+ + + +

+
+ + + +

+
+ + + +

+
+ +
+ +
+
+ diff --git a/lib/snmp/doc/src/snmp_def_instr_functions.xml b/lib/snmp/doc/src/snmp_def_instr_functions.xml new file mode 100644 index 0000000000..f88469aeae --- /dev/null +++ b/lib/snmp/doc/src/snmp_def_instr_functions.xml @@ -0,0 +1,477 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Definition of Instrumentation Functions + + + + + + + + snmp_def_instr_functions.xml +
+

The section Definition of Instrumentation Functions describes + the user defined functions, which the agent calls at different times. +

+ +
+ Variable Instrumentation +

For scalar variables, a function f(Operation, ...) must + be defined. +

+

The Operation can be new, delete, + get, is_set_ok, set, or undo. +

+

In case of an error, all instrumentation functions may return + either an SNMPv1 or an SNMPv2 error code. If it returns an SNMPv2 + code, it is converted into an SNMPv1 code before it is sent to a + SNMPv1 manager. It is recommended to use the SNMPv2 error codes + for all instrumentation functions, as these provide more + details. See Appendix A for a + description of error code conversions. +

+ +
+ f(new [, ExtraArgs]) +

The function f(new [, ExtraArgs]) is called for each + variable in the MIB when the + MIB is loaded into the agent. This makes it possible to perform + necessary initialization. +

+

This function is optional. The return value is discarded.

+
+ +
+ f(delete [, ExtraArgs]) +

The function f(delete [, ExtraArgs]) is called + for each object in an MIB when the + MIB is unloaded from the agent. This makes it possible to + perform necessary clean-up. +

+

This function is optional. The return value is discarded.

+
+ +
+ f(get [, ExtraArgs]) +

The function f(get [, ExtraArgs]) is called when a + get-request or a get-next + request refers to the variable. +

+

This function is mandatory. +

+ +
+ Valid Return Values + + {value, Value}. The Value must be of + correct type, length and within ranges, otherwise + genErr is returned in the response PDU. If the + object is an enumerated integer, the symbolic enum value + may be used as an atom. If the object is of type BITS, the + return value shall be an integer or a list of bits that + are set. + + {noValue, noSuchName}(SNMPv1) + + {noValue, noSuchObject | noSuchInstance} (SNMPv2) + + genErr. Used if an error occurred. Note, + this should be an internal processing error, e.g. a caused + by a programing fault somewhere. If the variable does not + exist, use {noValue, noSuchName} or + {noValue, noSuchInstance}. + + +
+
+ +
+ f(is_set_ok, NewValue [, ExtraArgs]) +

The function f(is_set_ok, NewValue [, ExtraArgs]) is + called in phase one of the set-request + processing so that the new value can be checked for + inconsistencies. +

+

NewValue is guaranteed to be of the correct type, + length and within ranges, as specified in the MIB. If the + object is an enumerated integer or of type BITS, the integer + value is used. +

+

This function is optional. +

+

If this function is called, it will be called again, either + with undo or with set as first argument. +

+ +
+ Valid return values + + noError + badValue | noSuchName | genErr(SNMPv1) + + noAccess | noCreation | inconsistentValue | resourceUnavailable | inconsistentName | genErr(SNMPv2) + +
+
+ +
+ f(undo, NewValue [, ExtraArgs]) +

If an error occurred, this function is called after the + is_set_ok function is called. If set is called for + this object, undo is not called. +

+

NewValue is guaranteed to be of the correct type, + length and within ranges, as specified in the MIB. If the + object is an enumerated integer or of type BITS, the integer + value is used. +

+

This function is optional. +

+ +
+ Valid return values + + noError + genErr(SNMPv1) + + undoFailed | genErr(SNMPv2) + +
+
+ +
+ f(set, NewValue [, ExtraArgs]) +

This function is called to perform the set in phase two of + the set-request processing. It is only called if the + corresponding is_set_ok function is present and returns + noError. +

+

NewValue is guaranteed to be of the correct type, + length and within ranges, as specified in the MIB. If the + object is an enumerated integer or of type BITS, the integer + value is used. +

+

This function is mandatory. +

+ +
+ Valid return values + + noError + genErr(SNMPv1) + + commitFailed | undoFailed | genErr(SNMPv2) + +
+
+
+ +
+ Table Instrumentation +

For tables, a f(Operation, ...) function should be + defined (the function shown is exemplified with f). +

+

The Operation can be new, delete, + get, next, is_set_ok, undo or + set. +

+

In case of an error, all instrumentation functions may return + either an SNMPv1 or an SNMPv2 error code. If it returns an SNMPv2 + code, it is converted into an SNMPv1 code before it is sent to a + SNMPv1 manager. It is recommended to use the SNMPv2 error codes + for all instrumentation functions, as these provide more + details. See Appendix A for a + description of error code conversions.

+ +
+ f(new [, ExtraArgs]) +

The function f(new [, ExtraArgs]) is called for each object in an MIB when the + MIB is loaded into the agent. This makes it possible to perform + the necessary initialization. +

+

This function is optional. The return value is discarded.

+
+ +
+ f(delete [, ExtraArgs]) +

The function f(delete [, ExtraArgs]) is called for each object in an MIB when the + MIB is unloaded from the agent. This makes it possible to + perform any necessary clean-up. +

+

This function is optional. The return value is discarded.

+
+ +
+ f(get, RowIndex, Cols [, ExtraArgs]) +

The function f(get, RowIndex, Cols [, ExtraArgs]) is + called when a get-request refers to a table. +

+

This function is mandatory. +

+ +
+ Arguments + + RowIndex is a list of integers which define the + key values for the row. The RowIndex is the list + representation (list of integers) which follow the + Cols integer in the OBJECT IDENTIFIER. + + Cols is a list of integers which represent the + column numbers. The Cols are sorted by increasing + value and are guaranteed to be valid column numbers. + +
+ +
+ Valid Return Values + + +

A list with as many elements as the Cols list, + where each element is the value of the corresponding + column. Each element can be:

+ + {value, Value}. The Value must be of + correct type, length and within ranges, otherwise + genErr is returned in the response PDU. If the + object is an enumerated integer, the symbolic enum + value may be used (as an atom). If the object is of + type BITS, the return value shall be an integer or a + list of bits that are set. + + {noValue, noSuchName}(SNMPv1) + + {noValue, noSuchObject | noSuchInstance}(SNMPv2) + + +
+ {noValue, Error}. If the row does not exist, + because all columns have {noValue, Error}), the + single tuple {noValue, Error} can be returned. + This is a shorthand for a list with all elements + {noValue, Error}. + + genErr. Used if an error occurred. Note that + this should be an internal processing error, e.g. a caused + by a programing fault somewhere. If some column does not + exist, use {noValue, noSuchName} or + {noValue, noSuchInstance}. + +
+
+
+ +
+ f(get_next, RowIndex, Cols [, ExtraArgs]) +

The function f(get_next, RowIndex, Cols [, ExtraArgs]) is + called when a get-next- or a + get-bulk-request refers to the table. +

+

The RowIndex argument may refer to an existing row or a + non-existing row, or it may be unspecified. The Cols list + may refer to inaccessible columns or non-existing columns. For + each column in the Cols list, the corresponding next + instance is determined, and the last part of its OBJECT + IDENTIFIER and its value is returned. +

+

This function is mandatory. +

+ +
+ Arguments + + RowIndex is a list of integers (possibly empty) + that defines the key values for a row. The RowIndex + is the list representation (list of integers), which follow + the Cols integer in the OBJECT IDENTIFIER. + + Cols is a list of integers, greater than or + equal to zero, which represents the column numbers. + +
+ +
+ Valid Return Values + + +

A list with as many elements as the Cols list + Each element can be:

+ + {NextOid, NextValue}, where NextOid + is the lexicographic next OBJECT IDENTIFIER for the + corresponding column. This should be specified as the + OBJECT IDENTIFER part following the table entry. This + means that the first integer is the column number and + the rest is a specification of the keys. + NextValue is the value of this element. + + endOfTable if there are no accessible + elements after this one. + + +
+ {genErr, Column} where Column denotes + the column that caused the error. Column must be + one of the columns in the Cols list. Note that + this should be an internal processing error, e.g. a caused + by a programing fault somewhere. If some column does not + exist, you must return the next accessible element (or + endOfTable). + +
+
+
+ +
+ f(is_set_ok, RowIndex, Cols [, ExtraArgs]) +

The function f(is_set_ok, RowIndex, Cols [, ExtraArgs]) + is called in phase one of the set-request + processing so that new values can be checked for + inconsistencies. +

+

If the function is called, it will be called again with + undo, or with set as first argument. +

+

This function is optional. +

+ +
+ Arguments + + RowIndex is a list of integers which define the + key values for the row. The RowIndex is the list + representation (list of integers) which follow the + Cols integer in the OBJECT IDENTIFIER. + + Cols is a list of {Column, NewValue}, + where Column is an integer, and NewValue is + guaranteed to be of the correct type, length and within + ranges, as specified in the MIB. If the object is an + enumerated integer or of type BITS, the integer value is + used. The list is sorted by Column (increasing) and + each Column is guaranteed to be a valid column + number. + +
+ +
+ Valid Return Values + + {noError, 0} + {Error, Column}, where Error is the same + as for is_set_ok for variables, and Column + denotes the faulty column. Column must be one of the + columns in the Cols list. + +
+
+ +
+ f(undo, RowIndex, Cols [, ExtraArgs]) +

If an error occurs, The function + f(undo, RowIndex, Cols [, ExtraArgs]) is called after the + is_set_ok function. If set is called for this + object, undo is not called. +

+

This function is optional. +

+ +
+ Arguments + + RowIndex is a list of integers which define the + key values for the row. The RowIndex is the list + representation (list of integers) which follow the + Cols integer in the OBJECT IDENTIFIER. + + Cols is a list of {Column, NewValue}, + where Column is an integer, and NewValue is + guaranteed to be of the correct type, length and within + ranges, as specified in the MIB. If the object is an + enumerated integer or of type BITS, the integer value is + used. The list is sorted by Column (increasing) and + each Column is guaranteed to be a valid column + number. + + +
+ +
+ Valid Return Values + + {noError, 0} + {Error, Column} where Error is the same + as for undo for variables, and Column denotes + the faulty column. Column must be one of the columns + in the Cols list. + + +
+
+ +
+ f(set, RowIndex, Cols [, ExtraArgs]) +

The function f(set, RowIndex, Cols [, ExtraArgs]) is + called to perform the set in phase two of + the set-request processing. It is only called if the + corresponding is_set_ok function did not exist, or + returned {noError, 0}. +

+

This function is mandatory. +

+ +
+ Arguments + + RowIndex is a list of integers that define the + key values for the row. The RowIndex is the list + representation (list of integers) which follow the + Cols integer in the OBJECT IDENTIFIER. + + Cols is a list of {Column, NewValue}, + where Column is an integer, and NewValue is + guaranteed to be of the correct type, length and within + ranges, as specified in the MIB. If the object is an + enumerated integer or of type BITS, the integer value is + used. The list is sorted by Column (increasing) and + each Column is guaranteed to be a valid column + number. + + +
+ +
+ Valid Return Values + + {noError, 0} + {Error, Column} where Error is the same + as set for variables, and Column denotes + the faulty column. Column must be one of the columns + in the Cols list. + +
+
+
+
+ diff --git a/lib/snmp/doc/src/snmp_framework_mib.xml b/lib/snmp/doc/src/snmp_framework_mib.xml new file mode 100644 index 0000000000..38fb531d3e --- /dev/null +++ b/lib/snmp/doc/src/snmp_framework_mib.xml @@ -0,0 +1,119 @@ + + + + +
+ + 19992009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmp_framework_mib + + + + + + + + snmp_framework_mib.xml +
+ snmp_framework_mib + Instrumentation Functions for SNMP-FRAMEWORK-MIB + +

The module snmp_framework_mib implements instrumentation + functions for the + SNMP-FRAMEWORK-MIB, and functions for initializing and configuring the + database. +

+

The configuration files are described in the SNMP User's Manual.

+
+ + + configure(ConfDir) -> void() + Configure the SNMP-FRAMEWORK-MIB + + ConfDir = string() + + +

This function is called from the supervisor at system + start-up. +

+

Inserts all data in the configuration files into the + database and destroys all old data. +

+

Thus, the data in the SNMP-FRAMEWORK-MIB, after this + function has been called, is from the configuration + files. +

+

All snmp counters are set to zero. +

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the error + report module, and the function fails with reason + configuration_error. +

+

ConfDir is a string which points to the directory + where the configuration files are found. +

+

The configuration file read is: context.conf. +

+
+
+ + init() -> void() + Initialize the SNMP-FRAMEWORK-MIB + +

This function is called from the supervisor at system + start-up. +

+

Creates the necessary objects in the database if they do not + exist. It does not destroy any old values. + +

+
+
+ + add_context(Ctx) -> Ret + Added one context + + Ctx = string() + Ret = {ok, Key} | {error, Reason} + Key = term() + Reason = term() + + +

Adds a context to the agent config. + Equivalent to one line in the context.conf file.

+ +
+
+ + delete_context(Key) -> Ret + Delete one context + + Key = term() + Ret = ok | {error, Reason} + Reason = term() + + +

Delete a context from the agent config.

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmp_generic.xml b/lib/snmp/doc/src/snmp_generic.xml new file mode 100644 index 0000000000..77f3cefaa2 --- /dev/null +++ b/lib/snmp/doc/src/snmp_generic.xml @@ -0,0 +1,345 @@ + + + + +
+ + 19962009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmp_generic + + + + + + + + snmp_generic.xml +
+ snmp_generic + Generic Functions for Implementing SNMP Objects in a Database + +

The module snmp_generic contains generic functions for implementing tables + (and variables) using the SNMP built-in database or Mnesia. These + default functions are used if no instrumentation function is + provided for a managed object in a MIB. Sometimes, it might be + necessary to customize the behaviour of the default functions. For + example, in some situations a trap should be sent if a row is + deleted or modified, or some hardware is to be informed, when + information is changed. +

+

The overall structure is shown in the following figure:

+
+         +---------------+
+         |   SNMP Agent  |
+         +- - - - - - - -+
+         |      MIB      |
+         +---------------+
+                 |
+         Association file       (associates a MIB object with
+                 |               snmp_generic:table_funct
+                 |               snmp_generic:variable_func)
++--------------------------------------+
+|           snmp_generic               |  Support for get-next,
+|                                      |  RowStatus operations
++----------------------+---------------+
+|    snmpa_local_db    |    Mnesia     |  Database
++--------------+-------+---------------+
+|     dets     |  ets  | 
+| (persistent) |       | 
++--------------+-------+     
+

Each function takes the argument NameDb, which is a + tuple {Name, Db}, to identify which database the + functions should use. Name is the symbolic name of the + managed object as defined in the MIB, and Db is either + volatile, persistent, or mnesia. If it is + mnesia, all variables are stored in the Mnesia table + snmp_variables which must be a table with two attributes + (not a Mnesia SNMP table). The SNMP tables are stored in Mnesia + tables with the same names as the SNMP tables. All functions + assume that a Mnesia table exists with the correct name and + attributes. It is the programmer's responsibility to ensure + this. Specifically, if variables are stored in Mnesia, the table + snmp_variables must be created by the programmer. The + record definition for this table is defined in the file + snmp/include/snmp_types.hrl. +

+

If an instrumentation function in the association file for a + variable myVar does not have a name when compiling an + MIB, the compiler generates an entry. +

+
+{myVar, {snmp_generic, variable_func, [{myVar, Db]}}.
+    
+

And for a table:

+
+{myTable, {snmp_generic, table_func, [{myTable, Db]}}.
+    
+
+ +
+ DATA TYPES +

In the functions defined below, the following types are used:

+ +name_db() = {name(), db()} +name() = atom() +db() = volatile | persistent | mnesia +row_index() = [int()] +columns() = [column()] | [{column(), value()}] +column() = int() +value() = term() + + + row_index() + +

Denotes the last part of the OID which specifies the + index of the row in the table (see RFC1212, 4.1.6 for + more information about INDEX).

+
+ columns() + +

Is a list of column numbers in the case of a get + operation, and a list of column numbers and values in the + case of a set operation.

+
+
+
+ + + get_status_col(Name, Cols) + get_status_col(NameDb, Cols) -> {ok, StatusVal} | false + Get the value of the status column from Cols + + Name = name() + NameDb = name_db() + Cols = columns() + StatusVal = term() + + +

Gets the value of the status column from Cols. +

+

This function can be used in instrumentation functions for + is_set_ok, undo or set to check if the + status column of a table is modified.

+
+
+ + get_index_types(Name) + Get the index types of Name + + Name = name() + + +

Gets the index types of Name

+

This function can be used in instrumentation functions to + retrieve the index types part of the table info.

+
+
+ + table_func(Op1, NameDb) + table_func(Op2, RowIndex, Cols, NameDb) -> Ret + Default instrumentation function for tables + + Op1 = new | delete + Op2 = get | next | is_set_ok | set | undo + NameDb = name_db() + RowIndex = row_index() + Cols = columns() + Ret = term() + + +

This is the default instrumentation function for tables. +

+ + The new function creates the table if it does + not exist, but only if the database is the SNMP internal db. + The delete function does not delete the table + from the database since unloading an MIB does not + necessarily mean that the table should be destroyed. + The is_set_ok function checks that a row which + is to be modified or deleted exists, and that a row which + is to be created does not exist. + The undo function does nothing. + The set function checks if it has enough + information to make the row change its status from + notReady to notInService (when a row has + been been set to createAndWait). If a row is set to + createAndWait, columns without a value are set to + noinit. If Mnesia is used, the set functionality is + handled within a transaction. + +

If it is possible for a manager to create or delete rows in + the table, there must be a RowStatus column for + is_set_ok, set and undo to work properly. +

+

The function returns according to the specification of an + instrumentation function. +

+
+
+ + table_get_elements(NameDb, RowIndex, Cols) -> Values + Get elements in a table row + + NameDb = name_db() + RowIndex = row_index() + Cols = columns() + Values = [value() | noinit] + + +

Returns a list with values for all columns in Cols. + If a column is undefined, its value is noinit.

+
+
+ + table_next(NameDb, RestOid) -> RowIndex | endOfTable + Find the next row in the table + + NameDb = name_db() + RestOid = [int()] + RowIndex = row_index() + + +

Finds the indices of the next row in the table. RestOid + does not have to specify an existing row.

+
+
+ + table_row_exists(NameDb, RowIndex) -> bool() + Check if a row in a table exists + + NameDb = name_db() + RowIndex = row_index() + + +

Checks if a row in a table exists.

+
+
+ + table_set_elements(NameDb, RowIndex, Cols) -> bool() + Set elements in a table row + + NameDb = name_db() + RowIndex = row_index() + Cols = columns() + + +

Sets the elements in Cols to the row specified by + RowIndex. No checks are performed on the new values. +

+

If the Mnesia database is used, this function calls + mnesia:write to store the values. This means that + this function must be called from within a transaction + (mnesia:transaction/1 or mnesia:dirty/1).

+
+
+ + variable_func(Op1, NameDb) + variable_func(Op2, Val, NameDb) -> Ret + Default instrumentation function for tables + + Op1 = new | delete | get + Op2 = is_set_ok | set | undo + NameDb = name_db() + Val = value() + Ret = term() + + +

This is the default instrumentation function for variables.

+

The new function creates a new variable in the + database with a default value as defined in the MIB, or a zero + value (depending on the type).

+

The delete function does not delete the variable from + the database.

+

The function returns according to the specification of an + instrumentation function.

+
+
+ + variable_get(NameDb) -> {value, Value} | undefined + Get the value of a variable + + NameDb = name_db() + Value = value() + + +

Gets the value of a variable.

+
+
+ + variable_set(NameDb, NewVal) -> true | false + Set a value for a variable + + NameDb = name_db() + NewVal = value() + + +

Sets a new value to a variable. The variable is created if + it does not exist. No checks are made on the type of the + new value.

+

Returns false if the NameDb argument + is incorrectly specified, otherwise true.

+
+
+
+ +
+ Example +

The following example shows an implementation of a table which is + stored in Mnesia, but with some checks performed at set-request + operations. +

+
+myTable_func(new, NameDb) ->   % pass unchanged
+  snmp_generic:table_func(new, NameDb).
+
+myTable_func(delete, NameDb) ->   % pass unchanged
+  snmp_generic:table_func(delete, NameDb).
+
+%% change row
+myTable_func(is_set_ok, RowIndex, Cols, NameDb) ->
+  case snmp_generic:table_func(is_set_ok, RowIndex,
+                               Cols, NameDb) of
+    {noError, 0} -> 
+      myApplication:is_set_ok(RowIndex, Cols);
+    Err ->
+      Err
+  end;
+
+myTable_func(set, RowIndex, Cols, NameDb) ->
+  case snmp_generic:table_func(set, RowIndex, Cols,
+                               NameDb),
+    {noError, 0} ->
+      % Now the row is updated, tell the application
+      myApplication:update(RowIndex, Cols);
+    Err ->
+      Err
+  end;
+
+myTable_func(Op, RowIndex, Cols, NameDb) ->   % pass unchanged
+  snmp_generic:table_func(Op, RowIndex, Cols, NameDb).
+    
+

The .funcs file would look like: +

+
+{myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
+    
+
+ +
+ diff --git a/lib/snmp/doc/src/snmp_impl_example_agent.xml b/lib/snmp/doc/src/snmp_impl_example_agent.xml new file mode 100644 index 0000000000..3bba6467ed --- /dev/null +++ b/lib/snmp/doc/src/snmp_impl_example_agent.xml @@ -0,0 +1,510 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Agent Implementation Example + + + + + + + + snmp_impl_example_agent.xml +
+

This Implementation Example section describes how an + MIB can be implemented with the SNMP Development Toolkit.

+

The example shown can be found in the toolkit distribution.

+

The agent is configured with the configuration tool, using + default suggestions for everything but the manager node.

+ +
+ MIB +

The MIB used in this example is called EX1-MIB. It contains two + objects, a variable with a name and a table with friends. +

+ +EX1-MIB DEFINITIONS ::= BEGIN + + IMPORTS + RowStatus FROM STANDARD-MIB + DisplayString FROM RFC1213-MIB + OBJECT-TYPE FROM RFC-1212 + ; + + example1 OBJECT IDENTIFIER ::= { experimental 7 } + + myName OBJECT-TYPE + SYNTAX DisplayString (SIZE (0..255)) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "My own name" + ::= { example1 1 } + + friendsTable OBJECT-TYPE + SYNTAX SEQUENCE OF FriendsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "A list of friends." + ::= { example1 4 } + + friendsEntry OBJECT-TYPE + SYNTAX FriendsEntry + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "" + INDEX { fIndex } + ::= { friendsTable 1 } + + FriendsEntry ::= + SEQUENCE { + fIndex + INTEGER, + fName + DisplayString, + fAddress + DisplayString, + fStatus + RowStatus } + + fIndex OBJECT-TYPE + SYNTAX INTEGER + ACCESS not-accessible + STATUS mandatory + DESCRIPTION + "number of friend" + ::= { friendsEntry 1 } + + fName OBJECT-TYPE + SYNTAX DisplayString (SIZE (0..255)) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Name of friend" + ::= { friendsEntry 2 } + fAddress OBJECT-TYPE + SYNTAX DisplayString (SIZE (0..255)) + ACCESS read-write + STATUS mandatory + DESCRIPTION + "Address of friend" + ::= { friendsEntry 3 } + fStatus OBJECT-TYPE + SYNTAX RowStatus + ACCESS read-write + STATUS mandatory + DESCRIPTION + "The status of this conceptual row." + ::= { friendsEntry 4 } + fTrap TRAP-TYPE + ENTERPRISE example1 + VARIABLES { myName, fIndex } + DESCRIPTION + "This trap is sent when something happens to + the friend specified by fIndex." + ::= 1 +END + +
+ +
+ Default Implementation +

Without writing any instrumentation functions, we can compile + the MIB and use the default implementation of it. Recall that MIBs + imported by "EX1-MIB.mib" must be present and compiled in the + current directory ("./STANDARD-MIB.bin","./RFC1213-MIB.bin") when + compiling. +

+
+unix> erl -config ./sys
+1> application:start(snmp).
+ok
+2> snmpc:compile("EX1-MIB").
+No accessfunction for 'friendsTable', using default.
+No accessfunction for 'myName', using default.
+{ok, "EX1-MIB.bin"}
+3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
+ok
+    
+

This MIB is now loaded into the agent, and a manager can ask + questions. As an example of this, we start another Erlang system + and the simple Erlang manager in the toolkit: +

+
+1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"all-rights"},
+ %% making it understand symbolic names: {mibs,["EX1-MIB","STANDARD-MIB"]}]).
+{ok, <0.89.0>}
+%% a get-next request with one OID.
+2> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
+ok 
+* Got PDU:
+[myName,0] = [] 
+%% A set-request (now using symbolic names for convenience)
+3> snmp_test_mgr:s([{[myName,0], "Martin"}]).
+ok                           
+* Got PDU:
+[myName,0] = "Martin"    
+%% Try the same get-next request again
+4> snmp_test_mgr:gn([[1,3,6,1,3,7]]).
+ok                           
+* Got PDU:
+[myName,0] = "Martin"    
+%% ... and we got the new value.
+%% you can event do row operations. How to add a row:
+5> snmp_test_mgr:s([{[fName,0], "Martin"}, {[fAddress,0],"home"}, {[fStatus,0],4}]).
+ %% createAndGo
+ok
+* Got PDU:
+[fName,0] = "Martin"    
+[fAddress,0] = "home"    
+[fStatus,0] = 4    
+6> snmp_test_mgr:gn([[myName,0]]).
+ok
+* Got PDU:
+[fName,0] = "Martin"    
+7> snmp_test_mgr:gn().
+ok
+* Got PDU:
+[fAddress,0] = "home"    
+8> snmp_test_mgr:gn().
+ok
+* Got PDU:
+[fStatus,0] = 1    
+9> 
+    
+
+ +
+ Manual Implementation +

The following example shows a "manual" implementation of the + EX1-MIB in Erlang. In this example, the values of the objects are + stored in an Erlang server. The server has a 2-tuple as loop + data, where the first element is the value of variable + myName, and the second is a sorted list of rows in the + table friendsTable. Each row is a 4-tuple. +

+ +

There are more efficient ways to create tables manually, i.e. + to use the module snmp_index.

+
+ +
+ Code + + spawn(ex1, init, []). +%%---------------------------------------------------------------- +%% Instrumentation function for variable myName. +%% Returns: (get) {value, Name} +%% (set) noError +%%---------------------------------------------------------------- +my_name(get) -> + ex1_server ! {self(), get_my_name}, + Name = wait_answer(), + {value, Name}. +my_name(set, NewName) -> + ex1_server ! {self(), {set_my_name, NewName}}, + noError. +%%---------------------------------------------------------------- +%% Instrumentation function for table friendsTable. +%%---------------------------------------------------------------- +friends_table(get, RowIndex, Cols) -> + case get_row(RowIndex) of + {ok, Row} -> + get_cols(Cols, Row); + _ -> + {noValue, noSuchInstance} + end; +friends_table(get_next, RowIndex, Cols) -> + case get_next_row(RowIndex) of + {ok, Row} -> + get_next_cols(Cols, Row); + _ -> + case get_next_row([]) of + {ok, Row} -> + % Get next cols from first row. + NewCols = add_one_to_cols(Cols), + get_next_cols(NewCols, Row); + _ -> + end_of_table(Cols) + end + end; +%%---------------------------------------------------------------- +%% If RowStatus is set, then: +%% *) If set to destroy, check that row does exist +%% *) If set to createAndGo, check that row does not exist AND +%% that all columns are given values. +%% *) Otherwise, error (for simplicity). +%% Otherwise, row is modified; check that row exists. +%%---------------------------------------------------------------- +friends_table(is_set_ok, RowIndex, Cols) -> + RowExists = + case get_row(RowIndex) of + {ok, _Row} -> true; + _ -> false + end, + case is_row_status_col_changed(Cols) of + {true, ?destroy} when RowExists == true -> + {noError, 0}; + {true, ?createAndGo} when RowExists == false, + length(Cols) == 3 -> + {noError, 0}; + {true, _} -> + {inconsistentValue, ?status_col}; + false when RowExists == true -> + {noError, 0}; + _ -> + [{Col, _NewVal} | _Cols] = Cols, + {inconsistentName, Col} + end; +friends_table(set, RowIndex, Cols) -> + case is_row_status_col_changed(Cols) of + {true, ?destroy} -> + ex1_server ! {self(), {delete_row, RowIndex}}; + {true, ?createAndGo} -> + NewRow = make_row(RowIndex, Cols), + ex1_server ! {self(), {add_row, NewRow}}; + false -> + {ok, Row} = get_row(RowIndex), + NewRow = merge_rows(Row, Cols), + ex1_server ! {self(), {delete_row, RowIndex}}, + ex1_server ! {self(), {add_row, NewRow}} + end, + {noError, 0}. + +%%---------------------------------------------------------------- +%% Make a list of {value, Val} of the Row and Cols list. +%%---------------------------------------------------------------- +get_cols([Col | Cols], Row) -> + [{value, element(Col, Row)} | get_cols(Cols, Row)]; +get_cols([], _Row) -> + []. +%%---------------------------------------------------------------- +%% As get_cols, but the Cols list may contain invalid column +%% numbers. If it does, we must find the next valid column, +%% or return endOfTable. +%%---------------------------------------------------------------- +get_next_cols([Col | Cols], Row) when Col < 2 -> + [{[2, element(1, Row)], element(2, Row)} | + get_next_cols(Cols, Row)]; +get_next_cols([Col | Cols], Row) when Col > 4 -> + [endOfTable | + get_next_cols(Cols, Row)]; +get_next_cols([Col | Cols], Row) -> + [{[Col, element(1, Row)], element(Col, Row)} | + get_next_cols(Cols, Row)]; +get_next_cols([], _Row) -> + []. +%%---------------------------------------------------------------- +%% Make a list of endOfTable with as many elems as Cols list. +%%---------------------------------------------------------------- +end_of_table([Col | Cols]) -> + [endOfTable | end_of_table(Cols)]; +end_of_table([]) -> + []. +add_one_to_cols([Col | Cols]) -> + [Col + 1 | add_one_to_cols(Cols)]; +add_one_to_cols([]) -> + []. +is_row_status_col_changed(Cols) -> + case lists:keysearch(?status_col, 1, Cols) of + {value, {?status_col, StatusVal}} -> + {true, StatusVal}; + _ -> false + end. +get_row(RowIndex) -> + ex1_server ! {self(), {get_row, RowIndex}}, + wait_answer(). +get_next_row(RowIndex) -> + ex1_server ! {self(), {get_next_row, RowIndex}}, + wait_answer(). +wait_answer() -> + receive + {ex1_server, Answer} -> + Answer + end. +%%%--------------------------------------------------------------- +%%% Server code follows +%%%--------------------------------------------------------------- +init() -> + register(ex1_server, self()), + loop("", []). + +loop(MyName, Table) -> + receive + {From, get_my_name} -> + From ! {ex1_server, MyName}, + loop(MyName, Table); + {From, {set_my_name, NewName}} -> + loop(NewName, Table); + {From, {get_row, RowIndex}} -> + Res = table_get_row(Table, RowIndex), + From ! {ex1_server, Res}, + loop(MyName, Table); + {From, {get_next_row, RowIndex}} -> + Res = table_get_next_row(Table, RowIndex), + From ! {ex1_server, Res}, + loop(MyName, Table); + {From, {delete_row, RowIndex}} -> + NewTable = table_delete_row(Table, RowIndex), + loop(MyName, NewTable); + {From, {add_row, NewRow}} -> + NewTable = table_add_row(Table, NewRow), + loop(MyName, NewTable) + end. +%%%--------------------------------------------------------------- +%%% Functions for table operations. The table is represented as +%%% a list of rows. +%%%--------------------------------------------------------------- +table_get_row([{Index, Name, Address, Status} | _], [Index]) -> + {ok, {Index, Name, Address, Status}}; +table_get_row([H | T], RowIndex) -> + table_get_row(T, RowIndex); +table_get_row([], _RowIndex) -> + no_such_row. +table_get_next_row([Row | T], []) -> + {ok, Row}; +table_get_next_row([Row | T], [Index | _]) +when element(1, Row) > Index -> + {ok, Row}; +table_get_next_row([Row | T], RowIndex) -> + table_get_next_row(T, RowIndex); +table_get_next_row([], RowIndex) -> + endOfTable. +table_delete_row([{Index, _, _, _} | T], [Index]) -> + T; +table_delete_row([H | T], RowIndex) -> + [H | table_delete_row(T, RowIndex)]; +table_delete_row([], _RowIndex) -> + []. +table_add_row([Row | T], NewRow) + when element(1, Row) > element(1, NewRow) -> + [NewRow, Row | T]; +table_add_row([H | T], NewRow) -> + [H | table_add_row(T, NewRow)]; +table_add_row([], NewRow) -> + [NewRow]. +make_row([Index], [{2, Name}, {3, Address} | _]) -> + {Index, Name, Address, ?active}. +merge_rows(Row, [{Col, NewVal} | T]) -> + merge_rows(setelement(Col, Row, NewVal), T); +merge_rows(Row, []) -> + Row. + ]]> +
+ +
+ Association File +

The association file EX1-MIB.funcs for the real + implementation looks as follows: +

+ +{myName, {ex1, my_name, []}}. +{friendsTable, {ex1, friends_table, []}}. + +
+ +
+ Transcript +

To use the real implementation, we must recompile the MIB and + load it into the agent. +

+
+1> application:start(snmp).
+ok
+2> snmpc:compile("EX1-MIB").
+{ok,"EX1-MIB.bin"}
+3> snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).
+ok
+4> ex1:start().
+<0.115.0>
+%% Now all requests operates on this "real" implementation.
+%% The output from the manager requests will *look* exactly the
+%% same as for the default implementation.
+      
+
+ +
+ Trap Sending +

How to send a trap by sending the + fTrap from the master agent is shown in this section. + The master agent has the MIB EX1-MIB loaded, where the + trap is defined. This trap specifies that two variables should + be sent along with the trap, myName and fIndex. + fIndex is a table column, so we must provide its value + and the index for the row in the call to snmpa:send_trap/4. + In the example below, we assume that the row in question is + indexed by 2 (the row with fIndex 2). +

+

we use a simple Erlang SNMP manager, which can receive traps. +

+
+[MANAGER]
+1> snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"public"}
+ %% does not have write-access
+1>{mibs,["EX1-MIB","STANDARD-MIB"]}]).
+{ok, <0.100.0>}
+2> snmp_test_mgr:s([{[myName,0], "Klas"}]).
+ok                           
+* Got PDU:
+Received a trap:
+      Generic: 4       %% authenticationFailure
+   Enterprise: [iso,2,3]
+     Specific: 0
+   Agent addr: [123,12,12,21]
+    TimeStamp: 42993
+2> 
+[AGENT]
+3> snmpa:send_trap(snmp_master_agent, fTrap,"standard trap", [{fIndex,[2],2}]).
+[MANAGER]
+2>
+* Got PDU:
+Received a trap:             
+      Generic: 6
+   Enterprise: [example1]
+     Specific: 1
+   Agent addr: [123,12,12,21]
+    TimeStamp: 69649
+[myName,0] = "Martin"    
+[fIndex,2] = 2    
+2>
+      
+
+
+
+ diff --git a/lib/snmp/doc/src/snmp_impl_example_manager.xml b/lib/snmp/doc/src/snmp_impl_example_manager.xml new file mode 100644 index 0000000000..edc1f3998e --- /dev/null +++ b/lib/snmp/doc/src/snmp_impl_example_manager.xml @@ -0,0 +1,94 @@ + + + + +
+ + 20062009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Manager Implementation Example + + + + + + + + snmp_impl_example_manager.xml +
+

This Implementation Example section describes + how a simple manager can be implemented with the + SNMP Development Toolkit.

+

The example shown, ex2, can be found in the toolkit + distribution.

+

This example has two functions:

+ + +

A simple example of how to use the manager component of + the SNMP Development Toolkit.

+
+ +

A simple example of how to write agent test cases, using the new + manager.

+
+
+ +
+ The example manager +

The example manager, snmp_ex2_manager, is a simple example of + how to implement an snmp manager using the manager component of the + SNMP Development Toolkit.

+

The module exports the following functions:

+ + +

start_link/0, start_link/1

+
+ +

stop/0

+
+ +

agent/2, agent/3

+
+ +

sync_get/2, sync_get/3

+
+ +

sync_get_next/2, sync_get_next/3

+
+ +

sync_get_bulk/4, sync_get_bulk/5

+
+ +

sync_set/2, sync_set/3

+
+ +

oid_to_name/1

+
+
+

This module is also used by the test module described in the + next section.

+
+ +
+ A simple standard test +

This simple standard test, snmp_ex2_simple_standard_test, + a module which, using the snmp_ex2_manager described in the + previous section, implements a simple agent test utility.

+
+
+ diff --git a/lib/snmp/doc/src/snmp_index.xml b/lib/snmp/doc/src/snmp_index.xml new file mode 100644 index 0000000000..cd241820e8 --- /dev/null +++ b/lib/snmp/doc/src/snmp_index.xml @@ -0,0 +1,266 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmp_index + + + + + + + + snmp_index.xml +
+ snmp_index + Abstract Data Type for SNMP Indexing + +

The module snmp_index implements an Abstract + Data Type (ADT) for an SNMP + index structure for SNMP tables. It is implemented as an ets + table of the ordered_set data-type, which means that all operations are + O(log n). In the table, the key is an ASN.1 OBJECT + IDENTIFIER. +

+

This index is used to separate the implementation of the SNMP + ordering from the actual implementation of the table. The SNMP + ordering, that is implementation of GET NEXT, is implemented in this + module. +

+

For example, suppose there is an SNMP table, which is best + implemented in Erlang as one process per SNMP table row. Suppose + further that the INDEX in the SNMP table is an OCTET STRING. The + index structure would be created as follows: +

+ +snmp_index:new(string) + +

For each new process we create, we insert an item in an + snmp_index structure: +

+ + Pid = start_process(), + NewSnmpIndex = + snmp_index:insert(SnmpIndex, Name, Pid), + <...> + ]]> +

With this structure, we can now map an OBJECT IDENTIFIER in + e.g. a GET NEXT request, to the correct process: +

+ +get_next_pid(Oid, SnmpIndex) -> + {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid), + Pid. + +
+ +
+ Common data types +

The following data types are used in the functions below: +

+ + +

index()

+
+ +

oid() = [byte()]

+
+ +

key_types = type_spec() | {type_spec(), type_spec(), ...}

+
+ +

type_spec() = fix_string | string | integer

+
+ +

key() = key_spec() | {key_spec(), key_spec(), ...}

+
+ +

key_spec() = string() | integer()

+
+
+

The index() type denotes an snmp index structure. +

+

The oid() type is used to represent an ASN.1 OBJECT + IDENTIFIER. +

+

The key_types() type is used when creating the + index structure, and the key() type is used when inserting + and deleting items from the structure. +

+

The key_types() type defines the types of the SNMP INDEX + columns for the table. If the table has one single INDEX column, + this type should be a single atom, but if the table has multiple + INDEX columns, it should be a tuple with atoms. +

+

If the INDEX column is of type INTEGER, or derived from + INTEGER, the corresponding type should be integer. If it + is a variable length type (e.g. OBJECT IDENTIFIER, OCTET STRING), + the corresponding type should be string. Finally, if the + type is of variable length, but with a fixed size restriction + (e.g. IpAddress), the corresponding type should be + fix_string. +

+

For example, if the SNMP table has two INDEX columns, the first + one an OCTET STRING with size 2, and the second one an OBJECT + IDENTIFER, the corresponding key_types parameter would be + {fix_string, string}. +

+

The key() type correlates to the key_types() + type. If the key_types() is a single atom, the + corresponding key() is a single type as well, but if the + key_types() is a tuple, key must be a tuple of the + same size. +

+

In the example above, valid keys could be {"hi", "mom"} and {"no", "thanks"}, whereas "hi", + {"hi", 42} and {"hello", "there"} would be invalid.

+ + +

All API functions that update the index return a NewIndex + term. This is for backward compatibility with a previous + implementation that used a B+ tree written purely in Erlang for + the index. The NewIndex return value can now be ignored. + The return value is now the unchanged table identifier for the + ets table.

+

The implementation using ets tables introduces a semantic + incompatibility with older implementations. In those older + implementations, using pure Erlang terms, the index was garbage + collected like any other Erlang term and did not have to be + deleted when discarded. An ets table is deleted only when the + process creating it explicitly deletes it or when the creating + process terminates.

+

A new interface delete/1 is now added to + handle the case when a process wants to discard an index table + (i.e. to build a completely new). Any application using + transient snmp indexes has to be modified to handle this.

+

As an snmp adaption usually keeps the index for the whole of the + systems lifetime, this is rarely a problem.

+
+
+ + + delete(Index) -> true + Delete an index table + + Index = NewIndex = index() + Key = key() + + +

Deletes a complete index structure (i.e. the ets table + holding the index). The index can no longer be referenced + after this call. See the warning note + above.

+
+
+ + delete(Index, Key) -> NewIndex + Delete an item from the index + + Index = NewIndex = index() + Key = key() + + +

Deletes a key and its value from the index structure. + Returns a new structure.

+
+
+ + get(Index, KeyOid) -> {ok, {KeyOid, Value}} | undefined + Get the item with KeyOid + + Index = index() + KeyOid = oid() + Value = term() + + +

Gets the item with key KeyOid. Could be used from + within an SNMP instrumentation function.

+
+
+ + get_last(Index) -> {ok, {KeyOid, Value}} | undefined + Get the last item in the index structure + + Index = index() + KeyOid = oid() + Value = term() + + +

Gets the last item in the index structure.

+
+
+ + get_next(Index, KeyOid) -> {ok, {NextKeyOid, Value}} | undefined + Get the next item + + Index = index() + KeyOid = NextKeyOid = oid() + Value = term() + + +

Gets the next item in the SNMP lexicographic ordering, + after KeyOid in the index structure. KeyOid + does not have to refer to an existing item in the index.

+
+
+ + insert(Index, Key, Value) -> NewIndex + Insert an item into the index + + Index = NewIndex = index() + Key = key() + Value = term() + + +

Inserts a new key value tuple into the index structure. If + an item with the same key already exists, the new Value + overwrites the old value.

+
+
+ + key_to_oid(Index, Key) -> KeyOid + Convert a key to an OBJECT IDENTIFIER + + Index = index() + Key = key() + KeyOid = NextKeyOid = oid() + + +

Converts Key to an OBJECT IDENTIFIER.

+
+
+ + new(KeyTypes) -> Index + Create a new snmp index structure + + KeyTypes = key_types() + Index = index() + + +

Creates a new snmp index structure. The key_types() + type is described above.

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmp_instr_functions.xml b/lib/snmp/doc/src/snmp_instr_functions.xml new file mode 100644 index 0000000000..32a1844554 --- /dev/null +++ b/lib/snmp/doc/src/snmp_instr_functions.xml @@ -0,0 +1,456 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Instrumentation Functions + + + + + + + + snmp_instr_functions.xml +
+

A user-defined instrumentation function for each object attaches + the managed objects to real resources. This function is called by + the agent on a get or set operation. The function + could read some hardware register, perform a calculation, or + whatever is necessary to implement the semantics associated with the + conceptual variable. These functions must be written both for scalar + variables and for tables. They are specified in the association + file, which is a text file. In this file, the OBJECT IDENTIFIER, or symbolic name for each managed object, is + associated with an Erlang tuple {Module,Function, + ListOfExtraArguments}. +

+

When a managed object is referenced in an SNMP operation, the + associated {Module, Function, ListOfExtraArguments} is + called. The function is applied to some standard arguments (for + example, the operation type) and the extra arguments supplied by the + user. +

+

Instrumentation functions must be written for get and + set for scalar variables and tables, and for get-next + for tables only. The get-bulk operation is translated into a + series of calls to get-next. +

+ +
+ Instrumentation Functions +

The following sections describe how the instrumentation + functions should be defined in Erlang for the different + operations. In the following, RowIndex is a list of key + values for the table, and Column is a column number. +

+

These functions are described in detail in + Definition of Instrumentation Functions. +

+ +
+ New / Delete Operations +

For scalar variables: +

+ +variable_access(new [, ExtraArg1, ...]) +variable_access(delete [, ExtraArg1, ...]) + +

For tables: +

+ +table_access(new [, ExtraArg1, ...]) +table_access(delete [, ExtraArg1, ...]) + +

These functions are called for each object in an MIB when the + MIB is unloaded or loaded, respectively.

+
+ +
+ Get Operation +

For scalar variables: +

+ +variable_access(get [, ExtraArg1, ...]) + +

For tables: +

+ +table_access(get,RowIndex,Cols [,ExtraArg1, ...]) + +

Cols is a list of Column. The agent will sort + incoming variables so that all operations on one row (same + index) will be supplied at the same time. The reason for this is + that a database normally retrieves information row by row. +

+

These functions must return the current values of the + associated variables.

+
+ +
+ Set Operation +

For scalar variables: +

+ +variable_access(set, NewValue [, ExtraArg1, ...]) + +

For tables: +

+ +table_access(set, RowIndex, Cols [, ExtraArg1,..]) + +

Cols is a list of tuples {Column, NewValue}. +

+

These functions returns noError if the assignment was + successful, otherwise an error code.

+
+ +
+ Is-set-ok Operation +

As a complement to the set operation, it is possible + to specify a test function. This function has the same syntax as + the set operation above, except that the first argument is + is_set_ok instead of set. This function is called + before the variable is set. Its purpose is to ensure that it is + permissible to set the variable to the new value.

+ +variable_access(is_set_ok, NewValue [, ExtraArg1, ...]) + +

For tables: +

+ +table_access(set, RowIndex, Cols [, ExtraArg1,..]) + +

Cols is a list of tuples {Column, NewValue}. +

+
+ +
+ Undo Operation +

A function which has been called with is_set_ok will + be called again, either with set if there was no error, + or with undo, if an error occurred. In this way, + resources can be reserved in the is_set_ok operation, + released in the undo operation, or made permanent in the + set operation.

+ +variable_access(undo, NewValue [, ExtraArg1, ...]) + +

For tables: +

+ +table_access(set, RowIndex, Cols [, ExtraArg1,..]) + +

Cols is a list of tuples {Column, NewValue}. +

+
+ +
+ GetNext Operation +

The GetNext Operation operation should only be defined for + tables since the + agent can find the next instance of plain variables in the MIB + and call the instrumentation with the get operation. +

+ +table_access(get_next, RowIndex, Cols [, ExtraArg1, ...]) + +

Cols is a list of integers, all greater than or equal + to zero. This indicates that the instrumentation should find the + next accessible instance. This function returns the tuple + {NextOid, NextValue}, or + endOfTable. NextOid should be the + lexicographically next accessible instance of a managed object + in the table. It should be a list of integers, where the first + integer is the column, and the rest of the list is the indices + for the next row. If endOfTable is returned, the agent + continues to search for the next instance among the other + variables and tables. +

+

RowIndex may be an empty list, an incompletely + specified row index, or the index for an unspecified row. +

+

This operation is best described with an example. +

+ +
+ GetNext Example +

A table called myTable has five columns. The first + two are keys (not accessible), and the table has three + rows. The instrumentation function for this table is called + my_table.

+ + + Contents of my_table + + +

N/A means not accessible.

+
+

The manager issues the following getNext request: +

+ +getNext{ myTable.myTableEntry.3.1.1, + myTable.myTableEntry.5.1.1 } + +

Since both operations involve the 1.1 index, this is + transformed into one call to my_table: +

+ +my_table(get_next, [1, 1], [3, 5]) + +

In this call, [1, 1] is the RowIndex, where + key 1 has value 1, and key 2 has value 1, and [3, 5] is + the list of requested columns. The function should now return + the lexicographically next elements: +

+ +[{[3, 1, 2], d}, {[5, 1, 2], f}] + +

This is illustrated in the following table: +

+

+ + + GetNext from [3,1,1] and [5,1,1]. + +

The manager now issues the following getNext request: +

+ +getNext{ myTable.myTableEntry.3.2.1, + myTable.myTableEntry.5.2.1 } + +

This is transformed into one call to my_table: +

+ +my_table(get_next, [2, 1], [3, 5]) + +

The function should now return: +

+ +[{[4, 1, 1], b}, endOfTable] + +

This is illustrated in the following table: +

+

+ + + GetNext from [3,2,1] and [5,2,1]. + +

The manager now issues the following getNext request: +

+ +getNext{ myTable.myTableEntry.3.1.2, + myTable.myTableEntry.4.1.2 } + +

This will be transform into one call to my_table: +

+ +my_table(get_next, [1, 2], [3, 4]) + +

The function should now return: +

+ +[{[3, 2, 1], g}, {[5, 1, 1], c}] + +

This is illustrated in the following table: +

+

+ + + GetNext from [3,1,2] and [4,1,2]. + +

The manager now issues the following getNext request: +

+ +getNext{ myTable.myTableEntry, + myTable.myTableEntry.1.3.2 } + +

This will be transform into two calls to my_table: +

+ +my_table(get_next, [], [0]) and +my_table(get_next, [3, 2], [1]) + +

The function should now return: +

+ +[{[3, 1, 1], a}] and +[{[3, 1, 1], a}] + +

In both cases, the first accessible element in the table + should be returned. As the key columns are not accessible, + this means that the third column is the first row.

+ +

Normally, the functions described above behave exactly as + shown, but they are free to perform other actions. For + example, a get-request may have side effects such as setting + some other variable, perhaps a global lastAccessed + variable.

+
+
+
+
+ +
+ Using the ExtraArgument +

The ListOfExtraArguments can be used to write generic + functions. This list is appended to the standard arguments for + each function. Consider two read-only variables for a device, + ipAdr and name with object identifiers 1.1.23.4 and + 1.1.7 respectively. To access these variables, one could implement + the two Erlang functions ip_access and name_access, + which will be in the MIB. The functions could be specified in a + text file as follows: +

+

+ +{ipAdr, {my_module, ip_access, []}}. +% Or using the oid syntax for 'name' +{[1,1,7], {my_module, name_access, []}}. + +

The ExtraArgument parameter is the empty list. For + example, when the agent receives a get-request for the + ipAdr variable, a call will be made to + ip_access(get). The value returned by this function is the + answer to the get-request. +

+

If ip_access and name_access are implemented + similarly, we could write a generic_access function using + the ListOfExtraArguments: +

+ +{ipAdr, {my_module, generic_access, ['IPADR']}}. +% The mnemonic 'name' is more convenient than 1.1.7 +{name, {my_module, generic_access, ['NAME']}}. + +

When the agent receives the same get-request as above, a call + will be made to generic_access(get, 'IPADR'). +

+

Yet another possibility, closer to the hardware, could be: +

+ +{ipAdr, {my_module, generic_access, [16#2543]}}. +{name, {my_module, generic_access, [16#A2B3]}}. + +
+ +
+ Default Instrumentation + +

When the MIB definition work is finished, there are two major + issues left. +

+ + Implementing the MIB + + Implementing a Manager Application. + +

Implementing an MIB can be a tedious task. Most probably, there + is a need to test the agent before all tables and variables are + implemented. In this case, the default instrumentation functions + are useful. The toolkit can generate default instrumentation + functions for variables as well as for tables. Consequently, a + running prototype agent, which can handle set, get, + get-next and table operations, is generated without any + programming. +

+

The agent stores the values in an internal volatile database, + which is based on the standard module ets. However, it is + possible to let the MIB compiler generate functions which use an + internal, persistent database, or the Mnesia DBMS. Refer to the + Mnesia User Guide and the Reference Manual, section SNMP, module + snmp_generic for more information. +

+

When parts of the MIB are implemented, you recompile it and + continue on by using default functions. With this approach, the + SNMP agent can be developed incrementally. +

+

The default instrumentation allows the application on the + manager side to be developed and tested simultaneously with the + agent. As soon as the ASN.1 file is completed, let the MIB + compiler generate a default implementation and develop the + management application from this. +

+ +
+ Table Operations +

The generation of default functions for tables works for + tables which use the RowStatus textual convention from + SNMPv2, defined in STANDARD-MIB and SNMPv2-TC. +

+ +

We strongly encourage the use of the RowStatus + convention for every table that can be modified from the + manager, even for newly designed SNMPv1 MIBs. In SNMPv1, + everybody has invented their own scheme for emulating table + operations, which has led to numerous inconsistencies. The + convention in SNMPv2 is flexible and powerful and has been + tested successfully. If the table is read only, no RowStatus + column should be used. +

+
+
+
+ +
+ Atomic Set +

In SNMP, the set operation is atomic. Either all + variables which are specified in a set operation are + changed, or none are changed. Therefore, the set operation + is divided into two phases. In the first phase, the new value of + each variable is checked against the definition of the variable in + the MIB. The following definitions are checked: +

+ + the type + the length + the range + the variable is writable and within the MIB view. + + +

At + the end of phase one, the user defined is_set_ok functions + are called for each scalar variable, and for each group of table + operations. +

+

If no error occurs, the second phase is performed. This phase + calls the user defined set function for all variables. +

+

If an error occurs, either in the is_set_ok phase, or in + the set phase, all functions which were called with + is_set_ok but not set, are called with undo. +

+

There are limitations with this transaction mechanism. If + complex dependencies exist between variables, for example between + month and day, another mechanism is needed. Setting + the date to 'Feb 31' can be avoided by a somewhat more generic + transaction mechanism. You can continue and find more and more + complex situations and construct an N-phase set-mechanism. This + toolkit only contains a trivial mechanism. +

+

The most common application of transaction mechanisms is to + keep row operations together. Since our agent sorts row + operations, the mechanism implemented in combination with the + RowStatus (particularly 'createAndWait' value) solve most + problems elegantly. +

+
+
+ diff --git a/lib/snmp/doc/src/snmp_intro.xml b/lib/snmp/doc/src/snmp_intro.xml new file mode 100644 index 0000000000..b01bfdd88f --- /dev/null +++ b/lib/snmp/doc/src/snmp_intro.xml @@ -0,0 +1,258 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + SNMP Introduction + + + + + + + + snmp_intro.xml +
+

The SNMP development toolkit contains the following parts: +

+ + An Extensible multi-lingual SNMP agent, which understands SNMPv1 + (RFC1157), SNMPv2c (RFC1901, 1905, 1906 and 1907), SNMPv3 + (RFC2271, 2272, 2273, 2274 and 2275), or any combination of + these protocols. + + A multi-lingual SNMP manager. + + A MIB compiler, which understands SMIv1 (RFC1155, 1212, and + 1215) and SMIv2 (RFC1902, 1903, and 1904). + + +

The SNMP development tool provides an environment for + rapid agent/manager prototyping and construction. With the + following information provided, this tool is used to set up a + running multi-lingual SNMP agent/manager: +

+ + a description of a Management Information Base (MIB) in + Abstract Syntax Notation One (ASN.1) + + instrumentation functions for the managed objects in the MIB, + written in Erlang. + + +

The advantage of using an extensible (agent/manager) toolkit is to + remove details such as type-checking, access rights, Protocol Data Unit + (PDU), encoding, decoding, and trap distribution from the + programmer, who only has to write the instrumentation functions, + which implement the MIBs. The get-next function only + has to be implemented for tables, and not for every variable in + the global naming tree. This information can be deduced from the + ASN.1 file. +

+ +
+ Scope and Purpose +

This manual describes the SNMP development tool, + as a component of the Erlang/Open Telecom Platform development + environment. It is assumed that the reader is familiar with the + Erlang Development Environment, which is described in a separate + User's Guide.

+
+ +
+ Prerequisites +

The following prerequisites + is required for understanding the material in the SNMP + User's Guide: +

+ + the basics of the Simple Network Management Protocol + version 1 (SNMPv1) + + the basics of the community-based Simple Network + Management Protocol version 2 (SNMPv2c) + + the basics of the Simple Network Management Protocol + version 3 (SNMPv3) + + the knowledge of defining MIBs using SMIv1 and SMIv2 + + familiarity with the Erlang system and Erlang programming + + +

The tool requires Erlang release 4.7 or later. +

+
+ +
+ Definitions +

The following definitions are used in the SNMP User's Guide. +

+ + MIB + The conceptual repository for management information is + called the Management Information Base (MIB). It does not + hold any data, merely a definition of what + data can be accessed. A definition of an MIB is a + description of a collection of managed objects. + + SMI + The MIB is specified in an adapted subset of the Abstract + Syntax Notation One (ASN.1) language. This adapted subset is + called the Structure of Management Information (SMI). + + ASN.1 + ASN.1 is used in two different ways in SNMP. The SMI is + based on ASN.1, and the messages in the protocol are defined by + using ASN.1. + + Managed object + +

A resource to be managed is represented by a managed + object, which resides in the MIB. In an SNMP MIB, the managed + objects are either:

+ + scalar variables, which have only one instance + per context. They have single values, not multiple values like + vectors or structures. + + tables, which can grow dynamically. + + a table element, which is a special type of + scalar variable. + +
+ Operations + SNMP relies on the three basic operations: get (object), + set (object, value) and get-next (object). + + Instrumentation function + An instrumentation function is associated with each + managed object. This is the function, which actually implements + the operations and will be called by the agent when it receives + a request from the management station. + Manager + A manager generates commands and receives notifications + from agents. There usually are only a few managers in a system. + Agent + An agent responds to commands from the manager, and sends + notification to the manager. There are potentially many agents + in a system. +
+
+ +
+ About This Manual +

In addition to this introductory chapter, the SNMP User's Guide + contains the following chapters: +

+ + Chapter 2: "Functional Description" describes the features + and operation of the SNMP development toolkit. It includes + topics on Sub-agents and MIB loading, Internal MIBs, and Traps. + + Chapter 3: "The MIB Compiler" describes the features and the + operation of the MIB compiler. + + Chapter 4: "Running the application" describes how to start and + configure the application. Topics on how to debug the application + are also included. + + Chapter 5: "Definition of Agent Configuration Files" is a + reference chapter, which contains more detailed information about + the agent configuration files. + + Chapter 6: "Definition of Manager Configuration Files" is a + reference chapter, which contains more detailed information about + the manager configuration files. + + Chapter 7: "Agent Implementation Example" describes how an MIB + can be implemented with the SNMP Development Toolkit. + Implementation examples are included. + + Chapter 8: "Instrumentation Functions" describes how + instrumentation functions should be defined in Erlang for the + different operations. + + Chapter 9: "Definition of Instrumentation Functions" is a + reference chapter which contains more detailed information + about the instrumentation functions. + + Chapter 10: "Definition of Agent Net if" is a reference chapter, + which describes the Agent Net if function in detail. + + Chapter 11: "Definition of Manager Net if" is a reference chapter, + which describes the Manager Net if function in detail. + + Chapter 12: "Advanced Agent Topics" describes sub-agents, agent + semantics, audit trail logging, and the consideration of + distributed tables. + + Appendix A describes the conversion of SNMPv2 to SNMPv1 + error messages. + + Appendix B contains the RFC1903 text on RowStatus. + + +
+ +
+ Where to Find More Information +

Refer to the following documentation for more information about + SNMP and about the Erlang/OTP development system: +

+ + Marshall T. Rose (1991), "The Simple Book - An + Introduction to Internet Management", Prentice-Hall + + Evan McGinnis and David Perkins (1997), "Understanding SNMP + MIBs", Prentice-Hall + + RFC1155, 1157, 1212 and 1215 (SNMPv1) + + RFC1901-1907 (SNMPv2c) + + RFC1908, 2089 (coexistence between SNMPv1 and SNMPv2) + + RFC2271, RFC2273 (SNMP std MIBs) + + the Mnesia User's Guide + + the Erlang 4.4 Extensions User's Guide + + the Reference Manual + + the Erlang Embedded Systems User's Guide + + the System Architecture Support Libraries (SASL) User's + Guide + + the Installation Guide + + the Asn1 User's Guide + + Concurrent Programming in Erlang, 2nd Edition (1996), + Prentice-Hall, ISBN 0-13-508301-X. + + +
+
+ diff --git a/lib/snmp/doc/src/snmp_manager_config_files.xml b/lib/snmp/doc/src/snmp_manager_config_files.xml new file mode 100644 index 0000000000..c2ef3cd2c7 --- /dev/null +++ b/lib/snmp/doc/src/snmp_manager_config_files.xml @@ -0,0 +1,249 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Definition of Manager Configuration Files + + + + + + + + snmp_manager_config_files.xml +
+

Configuration data may be included in configuration files + that is located in the configuration directory. The name of this + directory is given in the config_dir configuration + parameter. These files are read at start-up. +

+

The directory where the configuration files are found is given as + a parameter to the manager. +

+

The entry format in all files are Erlang terms, separated by a + '.' and a newline. In the following sections, the + formats of these terms are described. Comments may be specified as + ordinary Erlang comments. +

+

If syntax errors are discovered in these files they are reported with the + function config_err/2 of the + error report module + at start-up. +

+ +
+ + + Manager Information +

The manager information should be stored in a file called + manager.conf. +

+

Each entry is a tuple of size two: +

+

{Variable, Value}.

+ + +

Variable is one of the following:

+ + +

address - which defines the IP address of the + manager. Default is local host.

+
+ +

port - which defines which UDP port the manager uses + for communicating with agents. Mandatory.

+
+ +

engine_id - The SnmpEngineID as defined in + SNMP-FRAMEWORK-MIB. Mandatory.

+
+ +

max_message_size - The snmpEngineMaxMessageSize as + defined in SNMP-FRAMEWORK-MIB. Mandatory.

+
+
+
+ +

Value is the value for the variable. +

+
+
+

The following example shows a manager.conf file: +

+
+{address,          [141,213,11,24]}.
+{port,             5000}.
+{engine_id,        "mgrEngine"}.
+{max_message_size, 484}.
+    
+

The value of engine_id is a string, which should have a + very specific structure. See RFC 2271/2571 for details. +

+
+ +
+ + Users +

For each manager user, the manager needs some information. + This information is either added in the users.conf config + file or by calling the + register_user + function in run-time. +

+

Each row defines a manager user of the manager. +

+

Each entry is a tuple of size four: +

+ +

{UserId, UserMod, UserData, DefaultAgentConfig}.

+ + +

UserId is any term (used to uniquely identify the user).

+
+ +

UserMod is the user callback module (atom).

+
+ +

UserData is any term (passed on to the user when calling the + UserMod. +

+
+ +

DefaultAgentConfig is a list of default agent config's. + These values are used as default values when this user registers + agents. +

+
+
+
+ +
+ + Agents +

The information needed to handle agents should be stored in a + file called agents.conf. It is also possible to add agents + in run-time by calling the + register_agent. +

+

Each entry is a tuple: +

+

{UserId, TargetName, Comm, Ip, Port, EngineID, Timeout, MaxMessageSize, Version, SecModel, SecName, SecLevel}.

+ + +

UserId is the identity of the manager user + responsible for this agent (term). +

+
+ +

TargetName is a unique non-empty string.

+
+ +

Comm is the community string (string).

+
+ +

Ip is the ip address of the agent (a list of four integers).

+
+ +

Port is the port number of the agent (integer).

+
+ +

EngineID is the engine-id of the agent (string).

+
+ +

Timeout is re-transmission timeout + (infinity | integer).

+
+ +

MaxMessageSize is the max message size for outgoing messages + to this agent (integer).

+
+ +

Version is the version (v1 | v2 | v3).

+
+ +

SecModel is the security model (any | v1 | v2c | usm).

+
+ +

SecName is the security name (string).

+
+ +

SecLevel is security level (noAuthNoPriv | authNoPriv | + authPriv).

+
+
+
+ +
+ + + Security data for USM +

The information about Security data for USM should be stored in a + file called usm.conf, which must be present if the manager + wishes to use SNMPv3 when communicating with agents. It is also + possible to add usm data in run-time by calling the + register_usm_user. +

+

The corresponding table is usmUserTable in the + SNMP-USER-BASED-SM-MIB. +

+

Each entry is a term: +

+

{EngineID, UserName, AuthP, AuthKey, PrivP, PrivKey}.

+{EngineID, UserName, SecName, AuthP, AuthKey, PrivP, PrivKey}.

+

The first case is when we have the identity-function + (SecName = UserName). +

+ + +

EngineID is a string.

+
+ +

UserName is a string.

+
+ +

SecName is a string.

+
+ +

AuthP is a usmNoAuthProtocol, + usmHMACMD5AuthProtocol or usmHMACSHAAuthProtocol.

+
+ +

AuthKey is a list (of integer). This is the User's + secret localized authentication key. It is not visible in the MIB. + The length of this key needs to be 16 if + usmHMACMD5AuthProtocol is used and 20 if + usmHMACSHAAuthProtocol is used.

+
+ +

PrivP is a usmNoPrivProtocol, + usmDESPrivProtocol or usmAesCfb128Protocol.

+
+ +

PrivKey is a list (of integer). This is the User's secret + localized encryption key. It is not visible in the MIB. The length + of this key needs to be 16 if usmDESPrivProtocol + or usmAesCfb128Protocol is used.

+
+
+
+
+ diff --git a/lib/snmp/doc/src/snmp_manager_funct_descr.xml b/lib/snmp/doc/src/snmp_manager_funct_descr.xml new file mode 100644 index 0000000000..db4ab9bf15 --- /dev/null +++ b/lib/snmp/doc/src/snmp_manager_funct_descr.xml @@ -0,0 +1,112 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Manager Functional Description + + + + + + + + snmp_manager_funct_descr.xml +
+ +
+ Features + +

The manager provided with the tool is a lightweight manager + that basically provides a means to communicate with agents.

+

It does not really implement any management capabilities by + itself. That is up to the user. +

+

A user in this context is basically a module implementing + the snmpm_user behaviour. + A user can issue snmp requests and receive + notification/traps.

+

Agents to be accessed by the manager needs to be registered by + a user. Once registered, they can be accessed by all registered + users.

+

Notifications/traps from an agent is delivered to the user that + did the registration.

+

Any message from an agent that is not registered is delivered to + the default user.

+

By default, the default user is set to the + snmpm_user_default module, which simply sends an info message + to the error_logger. It is however highly recommended that this + module be replaced by another that does something useful + (see configuration params for more info).

+

When using version 3, then (at least one) usm user has to + be registered.

+

Requests can be issued in two different ways. Synchronous (see + sync_set, + sync_get, + sync_get_next and + sync_get_bulk) + and asynchronous (see + async_set, + async_get, + async_get_next and + async_get_bulk). + With synchronous + the snmp reply is returned by the function. With asynchronous, + the reply will instead be delivered through a call to one of the + handle_pdu callback function defined by the + handle_pdu + behaviour.

+
+ +
+ Operation + +

The following steps are needed to get the manager running:

+ + +

[optional] Implement the default user.

+
+ +

Implement the user(s).

+
+ +

Configure the application (manager).

+
+ +

Start the application (manager).

+
+ +

Register the user(s).

+
+ +

The user(s) register their agents.

+
+
+
+ +
+ MIB loading + +

It is possible to load mibs into the manager, but this is not + necessary for normal operation, and not recommended.

+
+
+ diff --git a/lib/snmp/doc/src/snmp_manager_netif.xml b/lib/snmp/doc/src/snmp_manager_netif.xml new file mode 100644 index 0000000000..2738ca76c1 --- /dev/null +++ b/lib/snmp/doc/src/snmp_manager_netif.xml @@ -0,0 +1,174 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Definition of Manager Net if + + + + + + + + snmp_manager_netif.xml +
+

+ + The Purpose of Manager Net if + +

The Network Interface (Net if) process delivers SNMP PDUs to the + manager server, and receives SNMP PDUs from the manager server. + The most common behaviour of a Net if process is that is receives + request PDU from the manager server, encodes the PDU into bytes + and transmits the bytes onto the network to an agent. When the + reply from the agent is received by the Net if process, which it + decodes into an SNMP PDU, which it sends to the manager server. +

+

However, that simple behaviour can be modified in numerous + ways. For example, the Net if process can apply some kind of + encrypting/decrypting scheme on the bytes. +

+

It is also possible to write your own Net if process. The default + Net if process is implemented in the module snmpm_net_if and + it uses UDP as the transport protocol. +

+

This section describes how to write a Net if process. +

+ +
+ + Mandatory Functions +

A Net if process must implement the SNMP manager + network interface behaviour. +

+
+ +
+ Messages +

The section Messages describes mandatory messages, which + Net if must send to the manager server process. +

+

Net if must send the following message when it receives an + SNMP PDU from the network that is aimed for the MasterAgent: +

+
+Server ! {snmp_pdu, Pdu, Addr, Port}
+    
+ + +

Pdu is an SNMP PDU record, as defined in + snmp_types.hrl, with the SNMP request.

+
+ +

Addr is the source address.

+
+ +

Port is port number of the sender.

+
+
+
+Server ! {snmp_trap, Trap, Addr, Port}
+    
+ + +

Trap is either an SNMP pdu record or an trappdu record, + as defined in snmp_types.hrl, with the SNMP request.

+
+ +

Addr is the source address.

+
+ +

Port is port number of the sender.

+
+
+
+Server ! {snmp_inform, Ref, Pdu, PduMS, Addr, Port}
+    
+ + +

Ref is either the atom ignore or something + that can be used to identify the inform-request (e.g. request-id). + ignore is used if the response (acknowledgment) to the + inform-request has already been sent (this means that the server + will not make the call to the + inform_response + function). See the + inform request behaviour + configuration option for more info.

+
+ +

Pdu is an SNMP PDU record, as defined in + snmp_types.hrl, with the SNMP request.

+
+ +

Addr is the source address.

+
+ +

Port is port number of the sender.

+
+
+
+Server ! {snmp_report, Data, Addr, Port}
+    
+ + +

Data is either {ok, Pdu} or + {error, ReqId, ReasonInfo, Pdu}. Which one is used depends + on the return value from the MPD + process_msg function. If the MsgData is ok, + the first is used, and if it is {error, ReqId, Reason} + the latter is used.

+
+ +

Pdu is an SNMP PDU record, as defined in + snmp_types.hrl, with the SNMP request.

+
+ +

ReqId is an integer.

+
+ +

ReasonInfo is a term().

+
+ +

Addr is the source address.

+
+ +

Port is port number of the sender.

+
+
+ +
+ Notes +

Since the Net if process is responsible for encoding and + decoding of SNMP messages, it must also update the relevant + counters in the SNMP group in MIB-II. It can use the functions + in the module snmpm_mpd for this purpose (refer to the + Reference Manual, section snmp, module snmpm_mpd + for more details). +

+

There are also some useful functions for encoding and + decoding of SNMP messages in the module snmp_pdus. +

+
+
+
+ diff --git a/lib/snmp/doc/src/snmp_manager_netif_1.gif b/lib/snmp/doc/src/snmp_manager_netif_1.gif new file mode 100644 index 0000000000..a1f7a6a0c5 Binary files /dev/null and b/lib/snmp/doc/src/snmp_manager_netif_1.gif differ diff --git a/lib/snmp/doc/src/snmp_manager_netif_1.ps b/lib/snmp/doc/src/snmp_manager_netif_1.ps new file mode 100644 index 0000000000..913997d0bd --- /dev/null +++ b/lib/snmp/doc/src/snmp_manager_netif_1.ps @@ -0,0 +1,305 @@ +%!PS-Adobe-3.0 +%%Creator: GIMP PostScript file plugin V 1.16 by Peter Kirchgessner +%%Title: /usr/local/ccase/vws/bmk/bmk_app_dev_snap/clearcase/otp/libraries/snmp/doc/src/snmp_manager_netif_1.ps +%%CreationDate: Mon Jul 19 16:24:48 2004 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 453 74 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228346456694 14.173228346456694 translate +% Translate to begin of first scanline +0 59 translate +438 -59 scale +% Image geometry +438 59 8 +% Transformation matrix +[ 438 0 0 59 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 438 string def +/gstr 438 string def +/bstr 438 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 13832 ASCII Bytes +colorimage +Jc:6"Jc>WIoDm\GJ,~> +Jc:6"Jc>WIoDm\GJ,~> +Jc:6"Jc>WIoDm\GJ,~> +Jc:6"L&UlJo`"XdjSjZ~> +Jc:6"L&UlJo`"XdjSjZ~> +Jc:6"L&UlJo`"XdjSjZ~> +Jc +Jc +Jc +Jc<[gqZ-EjquD +Jc<[gqZ-EjquD +Jc<[gqZ-EjquD +Jc +Jc +Jc +mf*1cJc=U,rrD<_rr@WLir8rXeGfIJmf%_~> +mf*1cJc=U,rrD<_rr@WLir8rXeGfIJmf%_~> +mf*1cJc=U,rrD<_rr@WLir8rXeGfIJmf%_~> +nc&Lfrr2lsJc=d1rrD0[rr@WLjo,5[d/O%FnG[q~> +nc&Lfrr2lsJc=d1rrD0[rr@WLjo,5[d/O%FnG[q~> +nc&Lfrr2lsJc=d1rrD0[rr@WLjo,5[d/O%FnG[q~> +o)8Uhq#:9nJc=p5rrD$Wrr@WLl2L\_c2I\Cnc"%~> +o)8Uhq#:9nJc=p5rrD$Wrr@WLl2L\_c2I\Cnc"%~> +o)8Uhq#:9nJc=p5rrD$Wrr@WLl2L\_c2I\Cnc"%~> +oDS^ip&=skJc>$8!!(jSrr@WLm/?tbb5VD@oDX7~> +oDS^ip&=skJc>$8!!(jSrr@WLm/?tbb5VD@oDX7~> +oDS^ip&=skJc>$8!!(jSrr@WLm/?tbb5VD@oDX7~> +o_ngjo)8UhnG`=cK`1rOgAV'PJc>*:!!((=!!)ZjJ,~> +o_ngjo)8UhnG`=cK`1rOgAV'PJc>*:!!((=!!)ZjJ,~> +o_ngjo)8UhnG`=cK`1rOgAV'PJc>*:!!((=!!)ZjJ,~> +o_ngjnbrLgoD\air;Q]rM#RDSf_tjNJc>3=rrC%;rrDclJ,~> +o_ngjnbrLgoD\air;Q]rM#RDSf_tjNJc>3=rrC%;rrDclJ,~> +o_ngjnbrLgoD\air;Q]rM#RDSf_tjNJc>3=rrC%;rrDclJ,~> +p&4pkn,<:ep&4pkq#:9nMuE\Vec,RKJc><@!!'k7!!)cmJ,~> +p&4pkn,<:ep&4pkq#:9nMuE\Vec,RKJc><@!!'k7!!)cmJ,~> +p&4pkn,<:ep&4pkq#:9nMuE\Vec,RKJc><@!!'k7!!)cmJ,~> +p&4pkmf!1dpAP$lpAP$lNW&nXdf'4HJc>BB!!'e5!!)fnJ,~> +p&4pkmf!1dpAP$lpAP$lNW&nXdf'4HJc>BB!!'e5!!)fnJ,~> +p&4pkmf!1dpAP$lpAP$lNW&nXdf'4HJc>BB!!'e5!!)fnJ,~> +pAP$lm/?tbq#16no_ngjO8]+Zd/F"FJc>EC!!'b4!!)ioJ,~> +pAP$lm/?tbq#16no_ngjO8]+Zd/F"FJc>EC!!'b4!!)ioJ,~> +pAP$lm/?tbq#16no_ngjO8]+Zd/F"FJc>EC!!'b4!!)ioJ,~> +pAP$lli$kaqYgHpo)8UhOT#4[d/F"FJc>HD!!'_3!!)ioJ,~> +pAP$lli$kaqYgHpo)8UhOT#4[d/F"FJc>HD!!'_3!!)ioJ,~> +pAP$lli$kaqYgHpo)8UhOT#4[d/F"FJc>HD!!'_3!!)ioJ,~> +rVlcrrVccslM^b`rVlfsnGWCfP5YF]cMdeDJc>NF!!'Y1!!)lpJ,~> +rVlcrrVccslM^b`rVlfsnGWCfP5YF]cMdeDJc>NF!!'Y1!!)lpJ,~> +rVlcrrVccslM^b`rVlfsnGWCfP5YF]cMdeDJc>NF!!'Y1!!)lpJ,~> +s8N#urr2cplMg_^mJ[(cq>UBoh>RZ=>6&GS>;DuLrW2"He,B=IcMdeDJc>QG!!'S/!!)oqJ,~> +s8N#urr2cplMg_^mJ[(cq>UBoh>RZ=>6&GS>;DuLrW2"He,B=IcMdeDJc>QG!!'S/!!)oqJ,~> +s8N#urr2cplMg_^mJ[(cq>UBoh>RZ=>6&GS>;DuLrW2"He,B=IcMdeDJc>QG!!'S/!!)oqJ,~> +s8DuuqYpKpd/Nh@s8N#uhYmQ)!<2ruUC?tt!TFO;rVurBrVur\rW-4'rG)Boqu-V#'BK,t10[sW +!*`Y_bPhJA\GcI.r;M3~> +s8DuuqYpKpd/Nh@s8N#uhYmQ)!<2ruUC?tt!TFO;rVurBrVur\rW-4'rG)Boqu-V#'BK,t10[sW +!*`Y_bPhJA\GcI.r;M3~> +s8DuuqYpKpd/Nh@s8N#uhYmQ)!<2ruUC?tt!TFO;rVurBrVur\rW-4'rG)Boqu-V#'BK,t10[sW +!*`Y_bPhJA\GcI.r;M3~> +s8Duu]D_d1hu3Z*!<2s9N%=lX)h\,o1<`r&COQ3A>AJ"Qir6enFA6l;rVurBrVur\rW1IJrVce4 +qu-WU'BK,t;uZdF!<2srbl.SB\,H@-r;M3~> +s8Duu]D_d1hu3Z*!<2s9N%=lX)h\,o1<`r&COQ3A>AJ"Qir6enFA6l;rVurBrVur\rW1IJrVce4 +qu-WU'BK,t;uZdF!<2srbl.SB\,H@-r;M3~> +s8Duu]D_d1hu3Z*!<2s9N%=lX)h\,o1<`r&COQ3A>AJ"Qir6enFA6l;rVurBrVur\rW1IJrVce4 +qu-WU'BK,t;uZdF!<2srbl.SB\,H@-r;M3~> +!WE)0rVurVrXdNYCNMs"lMeX#lMcaZrnS7erX16grr/?Ir]7[jr^>iH!!(1@!!)3]!Rh&JrWuO& +r]1^O3\02'rr*XbFDF:Frr+qlN'nnkrr0M[@WVTcN;EMSdfB@G)rb(;CK'4R'9"t&r]1^O6mK'k +6mK)<_GbPNFR&i*!4De+!<)nI~> +!WE)0rVurVrXdNYCNMs"lMeX#lMcaZrnS7erX16grr/?Ir]7[jr^>iH!!(1@!!)3]!Rh&JrWuO& +r]1^O3\02'rr*XbFDF:Frr+qlN'nnkrr0M[@WVTcN;EMSdfB@G)rb(;CK'4R'9"t&r]1^O6mK'k +6mK)<_GbPNFR&i*!4De+!<)nI~> +!WE)0rVurVrXdNYCNMs"lMeX#lMcaZrnS7erX16grr/?Ir]7[jr^>iH!!(1@!!)3]!Rh&JrWuO& +r]1^O3\02'rr*XbFDF:Frr+qlN'nnkrr0M[@WVTcN;EMSdfB@G)rb(;CK'4R'9"t&r]1^O6mK'k +6mK)<_GbPNFR&i*!4De+!<)nI~> +!WE)/rVurWrW1IJrr*dN3r]+HKDngKrnS"^rmLj_CNO#HrerUrbiA[&!6Y9@!9a=kdf< +!WE)/rVurWrW1IJrr*dN3r]+HKDngKrnS"^rmLj_CNO#HrerUrbiA[&!6Y9@!9a=kdf< +!WE)/rVurWrW1IJrr*dN3r]+HKDngKrnS"^rmLj_CNO#HrerUrbiA[&!6Y9@!9a=kdf< +!WE)/rVurWrW1IJrr*J@!;$3,)o@7,ro+@crmLl4qu-]WRQ=C.rVur?rVur^rW1IJrr*%Qrr1mc +rr)rX'E7tE]3A`K'E8!j%0$7^'E6G\oD[2Iq#1 +!WE)/rVurWrW1IJrr*J@!;$3,)o@7,ro+@crmLl4qu-]WRQ=C.rVur?rVur^rW1IJrr*%Qrr1mc +rr)rX'E7tE]3A`K'E8!j%0$7^'E6G\oD[2Iq#1 +!WE)/rVurWrW1IJrr*J@!;$3,)o@7,ro+@crmLl4qu-]WRQ=C.rVur?rVur^rW1IJrr*%Qrr1mc +rr)rX'E7tE]3A`K'E8!j%0$7^'E6G\oD[2Iq#1 +!WE).rVurdrVurlrW1IJrr)qW)ufgO3[!!)6^ +!Rh&GrW2!lrr*bo'E8!r!7Ur,'E8!j'E8!e%0"]UlMfTJq#1e'E8!e% +0$7^%0$7cUH2?>rVur)rVurtrdX~> +!WE).rVurdrVurlrW1IJrr)qW)ufgO3[!!)6^ +!Rh&GrW2!lrr*bo'E8!r!7Ur,'E8!j'E8!e%0"]UlMfTJq#1e'E8!e% +0$7^%0$7cUH2?>rVur)rVurtrdX~> +!WE).rVurdrVurlrW1IJrr)qW)ufgO3[!!)6^ +!Rh&GrW2!lrr*bo'E8!r!7Ur,'E8!j'E8!e%0"]UlMfTJq#1e'E8!e% +0$7^%0$7cUH2?>rVur)rVurtrdX~> +!WE).rVurfrr)olrWhFe!,H@S7*PZ0!P;;/rXV_4N;hg8@WYi>rcCkM9rn!erW)Qh!!)]k!c&Hb +rr)t7)f,9K!THNErW1J/rr*"8@WZ)QrVurdrVurrrW1IJrVcn7ro+UjrYXW.rr1mWir6e.rr1mj +rr1mcrr*SCrhBnsrW1IJrVd$PRf<<8:#ZibrX\!%rr1mcrr1^er_ +!WE).rVurfrr)olrWhFe!,H@S7*PZ0!P;;/rXV_4N;hg8@WYi>rcCkM9rn!erW)Qh!!)]k!c&Hb +rr)t7)f,9K!THNErW1J/rr*"8@WZ)QrVurdrVurrrW1IJrVcn7ro+UjrYXW.rr1mWir6e.rr1mj +rr1mcrr*SCrhBnsrW1IJrVd$PRf<<8:#ZibrX\!%rr1mcrr1^er_ +!WE).rVurfrr)olrWhFe!,H@S7*PZ0!P;;/rXV_4N;hg8@WYi>rcCkM9rn!erW)Qh!!)]k!c&Hb +rr)t7)f,9K!THNErW1J/rr*"8@WZ)QrVurdrVurrrW1IJrVcn7ro+UjrYXW.rr1mWir6e.rr1mj +rr1mcrr*SCrhBnsrW1IJrVd$PRf<<8:#ZibrX\!%rr1mcrr1^er_ +!WE).rVurgrqui`rW/4iir8iUp&4pko_nnQ%&UjlC\.OX12C>-IK![aFT,JQFT/m&@Y5?irW?q?!6kHA)rae*FBe$>!,LEiraH:X +r`]eQraH:OFA6OFX8Mtr!;$0i!;6 +!WE).rVurgrqui`rW/4iir8iUp&4pko_nnQ%&UjlC\.OX12C>-IK![aFT,JQFT/m&@Y5?irW?q?!6kHA)rae*FBe$>!,LEiraH:X +r`]eQraH:OFA6OFX8Mtr!;$0i!;6 +!WE).rVurgrqui`rW/4iir8iUp&4pko_nnQ%&UjlC\.OX12C>-IK![aFT,JQFT/m&@Y5?irW?q?!6kHA)rae*FBe$>!,LEiraH:X +r`]eQraH:OFA6OFX8Mtr!;$0i!;6 +!WE)nrW6jKC]=;7CE%'brW2"HkPbKd'Cbu$!;$3e!:Kgf.q2uHrqc]hrVurjrY%*\_M7/m2F +>AJ"Qiq$@SCOQ0\#@\AGraH:ON:d)L!:p-f!8RPWl2^,K]2R,VquHEh!!)Zj!]gb,rr)ua1'#Gq +!!*#tJ,~> +!WE)nrW6jKC]=;7CE%'brW2"HkPbKd'Cbu$!;$3e!:Kgf.q2uHrqc]hrVurjrY%*\_M7/m2F +>AJ"Qiq$@SCOQ0\#@\AGraH:ON:d)L!:p-f!8RPWl2^,K]2R,VquHEh!!)Zj!]gb,rr)ua1'#Gq +!!*#tJ,~> +!WE)nrW6jKC]=;7CE%'brW2"HkPbKd'Cbu$!;$3e!:Kgf.q2uHrqc]hrVurjrY%*\_M7/m2F +>AJ"Qiq$@SCOQ0\#@\AGraH:ON:d)L!:p-f!8RPWl2^,K]2R,VquHEh!!)Zj!]gb,rr)ua1'#Gq +!!*#tJ,~> +!WE)mrW5+hU]15m:&+\giXG#L!TFd^rVurjrqZW +!WE)mrW5+hU]15m:&+\giXG#L!TFd^rVurjrqZW +!WE)mrW5+hU]15m:&+\giXG#L!TFd^rVurjrqZW +!WE)mr\@3T%*\_M7/m2F>AJ"Qiq$@SCOK+pN;fS-ro-=?rr1nUCMRDN3YRH5/,nNArr,;@PP+nT +!;?E&!;cZp!;$0r:&b,j:&[Q[dfBA_"CaFkh$j2["mQd#ro+U^rVurkrqZVlrqQQirVurirWl6` +'=@bfCXW:]rWp^uro*pprj3pIrWp^urr*Sc!<2tJ~> +!WE)mr\@3T%*\_M7/m2F>AJ"Qiq$@SCOK+pN;fS-ro-=?rr1nUCMRDN3YRH5/,nNArr,;@PP+nT +!;?E&!;cZp!;$0r:&b,j:&[Q[dfBA_"CaFkh$j2["mQd#ro+U^rVurkrqZVlrqQQirVurirWl6` +'=@bfCXW:]rWp^uro*pprj3pIrWp^urr*Sc!<2tJ~> +!WE)mr\@3T%*\_M7/m2F>AJ"Qiq$@SCOK+pN;fS-ro-=?rr1nUCMRDN3YRH5/,nNArr,;@PP+nT +!;?E&!;cZp!;$0r:&b,j:&[Q[dfBA_"CaFkh$j2["mQd#ro+U^rVurkrqZVlrqQQirVurirWl6` +'=@bfCXW:]rWp^uro*pprj3pIrWp^urr*Sc!<2tJ~> +!!)]k0N7t',O58&rr+F[rr/?Iro+UjrppQXr`]f[raPKur[Y&KrdA#1!6kF:ro+UjX((]"!!)Zj +q>e_@LeMrmLl=rmM;TrmLj_CNO#HiXG>U!W`6!J,~> +!!)]k0N7t',O58&rr+F[rr/?Iro+UjrppQXr`]f[raPKur[Y&KrdA#1!6kF:ro+UjX((]"!!)Zj +q>e_@LeMrmLl=rmM;TrmLj_CNO#HiXG>U!W`6!J,~> +!!)]k0N7t',O58&rr+F[rr/?Iro+UjrppQXr`]f[raPKur[Y&KrdA#1!6kF:ro+UjX((]"!!)Zj +q>e_@LeMrmLl=rmM;TrmLj_CNO#HiXG>U!W`6!J,~> +!!)]k#u1Eu;bd6ZrmLlHCBS*-rnS"^rXr.nl>'=Ho4%^udfA\4rk]*'%/p/.iY-_?iq*-L!;$3e +!6bB=!;?Bl!;-6j:&b,&h%M= +:&a_t@X\7)!<26`e,J>?ro+UjrnS"^rosL4ro+UjdfA\4h$j;^dfA\3rW2!lnGWIhrr.E~> +!!)]k#u1Eu;bd6ZrmLlHCBS*-rnS"^rXr.nl>'=Ho4%^udfA\4rk]*'%/p/.iY-_?iq*-L!;$3e +!6bB=!;?Bl!;-6j:&b,&h%M= +:&a_t@X\7)!<26`e,J>?ro+UjrnS"^rosL4ro+UjdfA\4h$j;^dfA\3rW2!lnGWIhrr.E~> +!!)]k#u1Eu;bd6ZrmLlHCBS*-rnS"^rXr.nl>'=Ho4%^udfA\4rk]*'%/p/.iY-_?iq*-L!;$3e +!6bB=!;?Bl!;-6j:&b,&h%M= +:&a_t@X\7)!<26`e,J>?ro+UjrnS"^rosL4ro+UjdfA\4h$j;^dfA\3rW2!lnGWIhrr.E~> +!!)]k$<-s'o.,5WrmLl4r;H`V%0$5=X#cHVX!=[Grr1@HlMge"%,qs!rWM3\_G`5^rVurfrqui? +rqlchrVurkrW6j[C]=;C]-I=Si_s<.>O)4e9k'([rWcm@C\)!8CVocD!!)WiqZ*MmqZ-Bi!!)Wi +,t.b3N#VBfdfBC,!94!p'E6u)rr1mcrr1mWir6e.rr*SCrhBo$rWasBrr1A@iY1h\!W`6!J,~> +!!)]k$<-s'o.,5WrmLl4r;H`V%0$5=X#cHVX!=[Grr1@HlMge"%,qs!rWM3\_G`5^rVurfrqui? +rqlchrVurkrW6j[C]=;C]-I=Si_s<.>O)4e9k'([rWcm@C\)!8CVocD!!)WiqZ*MmqZ-Bi!!)Wi +,t.b3N#VBfdfBC,!94!p'E6u)rr1mcrr1mWir6e.rr*SCrhBo$rWasBrr1A@iY1h\!W`6!J,~> +!!)]k$<-s'o.,5WrmLl4r;H`V%0$5=X#cHVX!=[Grr1@HlMge"%,qs!rWM3\_G`5^rVurfrqui? +rqlchrVurkrW6j[C]=;C]-I=Si_s<.>O)4e9k'([rWcm@C\)!8CVocD!!)WiqZ*MmqZ-Bi!!)Wi +,t.b3N#VBfdfBC,!94!p'E6u)rr1mcrr1mWir6e.rr*SCrhBo$rWasBrr1A@iY1h\!W`6!J,~> +!!)]k!)!!)Qgr;`_oquHEh!!)]k!c&a'rVdnU>6&I- +IK$i/@Y5?nrX%R_@WYi>@K:3"oDS^irr.E~> +!!)]k!)!!)Qgr;`_oquHEh!!)]k!c&a'rVdnU>6&I- +IK$i/@Y5?nrX%R_@WYi>@K:3"oDS^irr.E~> +!!)]k!)!!)Qgr;`_oquHEh!!)]k!c&a'rVdnU>6&I- +IK$i/@Y5?nrX%R_@WYi>@K:3"oDS^irr.E~> +!!)`l!c'#rrr*\F,Q@]%;dsiQlMgcW@Z:$u=\uraH:Xr_if+oCr4a +!:Bac!6bBA!:p*h!6G->!:^!e!2fbp!;$0i!7^uOl2^,K]2Rkk!!*#tJ,~> +!!)`l!c'#rrr*\F,Q@]%;dsiQlMgcW@Z:$u=\uraH:Xr_if+oCr4a +!:Bac!6bBA!:p*h!6G->!:^!e!2fbp!;$0i!7^uOl2^,K]2Rkk!!*#tJ,~> +!!)`l!c'#rrr*\F,Q@]%;dsiQlMgcW@Z:$u=\uraH:Xr_if+oCr4a +!:Bac!6bBA!:p*h!6G->!:^!e!2fbp!;$0i!7^uOl2^,K]2Rkk!!*#tJ,~> +!!'M-!!&ho!!(.?!!)Hd!!&nqrrDWh!!(LIs#L4'@d<+T!!*#tJ,~> +!!'M-!!&ho!!(.?!!)Hd!!&nqrrDWh!!(LIs#L4'@d<+T!!*#tJ,~> +!!'M-!!&ho!!(.?!!)Hd!!&nqrrDWh!!(LIs#L4'@d<+T!!*#tJ,~> +!WE)/rVuqorVur@rVuqLrW2uuZi0q)rr.E~> +!WE)/rVuqorVur@rVuqLrW2uuZi0q)rr.E~> +!WE)/rVuqorVur@rVuqLrW2uuZi0q)rr.E~> +s8Duu\c)R/V#C>ob5MA@Jc>]K!!'G+!!)usJ,~> +s8Duu\c)R/V#C>ob5MA@Jc>]K!!'G+!!)usJ,~> +s8Duu\c)R/V#C>ob5MA@Jc>]K!!'G+!!)usJ,~> +rr2ot]D_d1U](5nbl.SBJc>ZJ!!'G+!!)usJ,~> +rr2ot]D_d1U](5nbl.SBJc>ZJ!!'G+!!)usJ,~> +rr2ot]D_d1U](5nbl.SBJc>ZJ!!'G+!!)usJ,~> +r;QZq^]"35UAb,mbl.SBJc>ZJ!!'G+!!)usJ,~> +r;QZq^]"35UAb,mbl.SBJc>ZJ!!'G+!!)usJ,~> +r;QZq^]"35UAb,mbl.SBJc>ZJ!!'G+!!)usJ,~> +q>L?o_#=<6U&G#lcMdeDJc>TH!!'M-!!)rrJ,~> +q>L?o_#=<6U&G#lcMdeDJc>TH!!'M-!!)rrJ,~> +q>L?o_#=<6U&G#lcMdeDJc>TH!!'M-!!)rrJ,~> +q>L?o_>XE7T`+okcMdeDJc>QG!!'P.!!)rrJ,~> +q>L?o_>XE7T`+okcMdeDJc>QG!!'P.!!)rrJ,~> +q>L?o_>XE7T`+okcMdeDJc>QG!!'P.!!)rrJ,~> +q#16n`;]c:T)J]id/F"FJc>NF!!'S/!!)oqJ,~> +q#16n`;]c:T)J]id/F"FJc>NF!!'S/!!)oqJ,~> +q#16n`;]c:T)J]id/F"FJc>NF!!'S/!!)oqJ,~> +q#16nbPq>KE!!'Y1!!)lpJ,~> +q#16nbPq>KE!!'Y1!!)lpJ,~> +q#16nbPq>KE!!'Y1!!)lpJ,~> +p\k-mc2I\CPl:X_df'4HJc>EC!!'_3!!)ioJ,~> +p\k-mc2I\CPl:X_df'4HJc>EC!!'_3!!)ioJ,~> +p\k-mc2I\CPl:X_df'4HJc>EC!!'_3!!)ioJ,~> +p\k-mc2I\CPPtO^ec,RKJc>?A!!'b4!!)ioJ,~> +p\k-mc2I\CPPtO^ec,RKJc>?A!!'b4!!)ioJ,~> +p\k-mc2I\CPPtO^ec,RKJc>?A!!'b4!!)ioJ,~> +p\k-mcMdeDOo>=\fDYaMJc>9?!!'e5!!)fnJ,~> +p\k-mcMdeDOo>=\fDYaMJc>9?!!'e5!!)fnJ,~> +p\k-mcMdeDOo>=\fDYaMJc>9?!!'e5!!)fnJ,~> +pAP$ld/F"FO8f.ZgAV'PJc>3=!!'k7!!)cmJ,~> +pAP$ld/F"FO8f.ZgAV'PJc>3=!!'k7!!)cmJ,~> +pAP$ld/F"FO8f.ZgAV'PJc>3=!!'k7!!)cmJ,~> +pAP$ld/F"FNW&nXh>[ESJc>-;!!'t:rrDclJ,~> +pAP$ld/F"FNW&nXh>[ESJc>-;!!'t:rrDclJ,~> +pAP$ld/F"FNW&nXh>[ESJc>-;!!'t:rrDclJ,~> +pAP$lkl1;Vo_ngjMuN_Vi;N]VJc>$8rrC+=!!)ZjJ,~> +pAP$lkl1;Vo_ngjMuN_Vi;N]VJc>$8rrC+=!!)ZjJ,~> +pAP$lkl1;Vo_ngjMuN_Vi;N]VJc>$8rrC+=!!)ZjJ,~> +p&4pkli-nap\t!hrVlfsM#RDSjSo/ZJc=p5!!(1@rrDZiJ,~> +p&4pkli-nap\t!hrVlfsM#RDSjSo/ZJc=p5!!(1@rrDZiJ,~> +p&4pkli-nap\t!hrVlfsM#RDSjSo/ZJc=p5!!(1@rrDZiJ,~> +o_ngjmf*4dmf*.bK`:uOkl1S^Jc=g2!!(7B!!)QgJ,~> +o_ngjmf*4dmf*.bK`:uOkl1S^Jc=g2!!(7B!!)QgJ,~> +o_ngjmf*4dmf*.bK`:uOkl1S^Jc=g2!!(7B!!)QgJ,~> +oD\ainbrLgJc=p5rrDEbrr@WLj8T&Yd/O%FnG[q~> +oD\ainbrLgJc=p5rrDEbrr@WLj8T&Yd/O%FnG[q~> +oD\ainbrLgJc=p5rrDEbrr@WLj8T&Yd/O%FnG[q~> +nc&IepAP$lJc=g2qZ-EjqZ)3Hhu +nc&IepAP$lJc=g2qZ-EjqZ)3Hhu +nc&IepAP$lJc=g2qZ-EjqZ)3Hhu +mJd%ar;Q]rJc=R+p],mEfDbaLgA_'Om/DM~> +mJd%ar;Q]rJc=R+p],mEfDbaLgA_'Om/DM~> +mJd%ar;Q]rJc=R+p],mEfDbaLgA_'Om/DM~> +l2LS\Jc:6"VuH\rhZ!NTl2H2~> +l2LS\Jc:6"VuH\rhZ!NTl2H2~> +l2LS\Jc:6"VuH\rhZ!NTl2H2~> +Jc:6"M#RARjSo,YkPfu~> +Jc:6"M#RARjSo,YkPfu~> +Jc:6"M#RARjSo,YkPfu~> +Jc:6"L&UlJo`"XdjSjZ~> +Jc:6"L&UlJo`"XdjSjZ~> +Jc:6"L&UlJo`"XdjSjZ~> +Jc:6"Jc>WIoDm\GJ,~> +Jc:6"Jc>WIoDm\GJ,~> +Jc:6"Jc>WIoDm\GJ,~> +Jc:6"Jc +Jc:6"Jc +Jc:6"Jc +Jc:6"Jc +Jc:6"Jc +Jc:6"Jc +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/lib/snmp/doc/src/snmp_mib_compiler.xml b/lib/snmp/doc/src/snmp_mib_compiler.xml new file mode 100644 index 0000000000..63af19f479 --- /dev/null +++ b/lib/snmp/doc/src/snmp_mib_compiler.xml @@ -0,0 +1,252 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + The MIB Compiler + + + + + + + + snmp_mib_compiler.xml +
+

The chapter The MIB Compiler describes the MIB compiler + and contains the following topics: +

+ + Operation + Import + Consistency checking between MIBs + .hrl file generation + Emacs integration + Deviations from the standard + + + +

When importing MIBs, ensure that the imported MIBs as well as the + importing MIB are compiled using the same version of the + SNMP-compiler.

+
+ +
+ Operation +

The MIB must be written as a text file in SMIv1 or SMIv2 using + an ASN.1 notation before + it will be compiled. This text file must have the same name as the MIB, + but with the suffix .mib. This is necessary for handling + the IMPORT statement. +

+

The association file, which contains the names of + instrumentation functions for the MIB, should have the suffix + .funcs. If the compiler does not find the association file, + it gives a warning message and uses default instrumentation + functions. (See Default Instrumentation for more details). +

+

The MIB compiler is started with a call to + ).]]> For example: +

+ +snmpc:compile("RFC1213-MIB"). + +

The output is a new file which is called .bin]]>. +

+

The MIB compiler understands both SMIv1 and SMIv2 MIBs. It + uses the MODULE-IDENTITY statement to determinate if the MIB is + written in SMI version 1 or 2. +

+
+ +
+ Importing MIBs +

The compiler handles the IMPORT statement. It is important to + import the compiled file and not the ASN.1 (source) file. A MIB must + be recompiled to make changes visible to other MIBs importing it. +

+

The compiled files of the imported MIBs must be present in the + current directory, or a directory in the current path. The path is + supplied with the {i, Path} option, for example: +

+ +snmpc:compile("MY-MIB", + [{i, ["friend_mibs/", "../standard_mibs/"]}]). + +

It is also possible to import MIBs from OTP applications in an + "include_lib" like fashion with the il + option. Example: +

+ +snmpc:compile("MY-MIB", + [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]). + +

finds the latest version of the snmp and myapp + applications in the OTP system and uses the expanded paths as + include paths. +

+

Note that an SMIv2 MIB can import an SMIv1 MIB and vice versa. +

+

The following MIBs are built-ins of the Erlang SNMP compiler: + SNMPv2-SMI, RFC-1215, RFC-1212, SNMPv2-TC, SNMPv2-CONF, and + RFC1155-SMI. They cannot therefore be compiled separately. +

+
+ +
+ MIB Consistency Checking +

When an MIB is compiled, the compiler detects if several + managed objects use the same OBJECT IDENTIFIER. If that is + the case, it issues an error message. However, the compiler cannot + detect Oid conflicts between different MIBs. These kinds of + conflicts generate an error at load time. To avoid this, the + following function can be used to do consistency checking between + MIBs: +

+
+
+erl>snmpc:is_consistent(ListOfMibNames).
+    
+

ListOfMibNames is a list of compiled MIBs, for example + ["RFC1213-MIB", "MY-MIB"]. The function also performs + consistency checking of trap definitions.

+
+ +
+ .hrl File Generation +

It is possible to generate an .hrl file which contains + definitions of Erlang constants from a compiled MIB file. This + file can then be included in Erlang source code. The file will + contain constants for: +

+ + object Identifiers for tables, table entries and variables + column numbers + enumerated values + default values for variables and table columns. + + +

Use the following command to generate a .hrl file from an MIB: +

+
+erl>snmpc:mib_to_hrl(MibName).
+    
+
+ +
+ Emacs Integration +

With the Emacs editor, the next-error (C-X `) + function can be used indicate where a compilation error occurred, + provided the error message is described by a line number. +

+

Use M-x compile to compile an MIB from inside Emacs, and + enter: +

+
+ erl -s snmpc compile <MibName> -noshell
+    
+

An example of ]]> is RFC1213-MIB. +

+
+ +
+ Compiling from a Shell or a Makefile +

The erlc commands can be used to compile SNMP MIBs. Example: +

+
+ erlc MY-MIB.mib
+    
+

All the standard erlc flags are supported, e.g. +

+
+ erlc -I mymibs -o mymibs -W MY-MIB.mib
+    
+

The flags specific to the MIB compiler can be specified by + using the + syntax: +

+
+ erlc +'{group_check,false}' MY-MIB.mib
+    
+
+ +
+ Deviations from the Standard +

In some aspects the Erlang MIB compiler does not follow or + implement the SMI fully. Here are the differences: +

+ + +

Tables must be written in the following order: + tableObject, entryObject, column1, ..., + columnN (in order).

+
+ +

Integer values, for example in the SIZE expression + must be entered in decimal syntax, not in hex or bit syntax.

+
+ +

Symbolic names must be unique within a MIB and within a + system.

+
+ +

Hyphens are allowed in SMIv2 (a pragmatic approach). The + reason for this is that according to SMIv2, hyphens are allowed + for objects converted from SMIv1, but not for others. This is + impossible to check for the compiler.

+
+ +

If a word is a keyword in any of SMIv1 or SMIv2, it is a + keyword in the compiler (deviates from SMIv1 only).

+
+ +

Indexes in a table must be objects, not types (deviates + from SMIv1 only).

+
+ +

A subset of all semantic checks on types are + implemented. For example, strictly the TimeTicks may not + be sub-classed but the compiler allows this (standard MIBs must + pass through the compiler) (deviates from SMIv2 only).

+
+ +

The MIB.Object syntax is not implemented (since all + objects must be unique anyway).

+
+ +

Two different names cannot define the same OBJECT IDENTIFIER.

+
+ +

The type checking in the SEQUENCE construct is non-strict + (i.e. subtypes may be specified). The reason for this is + that some standard MIBs use this.

+
+ A definition has normally a status field. When the status field + has the value deprecated, then the MIB-compiler will ignore this + definition. With the MIB-compiler option {deprecated,true} + the MIB-compiler does not ignore the deprecated definitions. + An object has a DESCRIPTIONS field. The descriptions-field will + not be included in the compiled mib by default. In order to get + the description, the mib must be compiled with the option + description. +
+
+
+ diff --git a/lib/snmp/doc/src/snmp_notification_mib.xml b/lib/snmp/doc/src/snmp_notification_mib.xml new file mode 100644 index 0000000000..d1d83570d1 --- /dev/null +++ b/lib/snmp/doc/src/snmp_notification_mib.xml @@ -0,0 +1,131 @@ + + + + +
+ + 19982009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmp_notification_mib + + + + + + + + snmp_notification_mib.xml +
+ snmp_notification_mib + Instrumentation Functions for SNMP-NOTIFICATION-MIB + +

The module snmp_notification_mib implements the + instrumentation functions for the + SNMP-NOTIFICATION-MIB, and functions for configuring the database. +

+

The configuration files are described in the SNMP User's Manual.

+
+ + + configure(ConfDir) -> void() + Configure the SNMP-NOTIFICATION-MIB + + ConfDir = string() + + +

This function is called from the supervisor at system + start-up. +

+

Inserts all data in the configuration files into the + database and destroys all old rows with StorageType + volatile. The rows created from the configuration file + will have StorageType nonVolatile. +

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the + error report module, + and the function fails with reason configuration_error. +

+

ConfDir is a string which points to the directory + where the configuration files are found. +

+

The configuration file read is: notify.conf. +

+
+
+ + reconfigure(ConfDir) -> void() + Configure the SNMP-NOTIFICATION-MIB + + ConfDir = string() + + +

Inserts all data in the configuration files into the + database and destroys all old data, including the rows with + StorageType nonVolatile. The rows created from the + configuration file will have StorageType nonVolatile. +

+

Thus, the data in the SNMP-NOTIFICATION-MIB, after this + function has been called, is from the configuration files. +

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the + error report module, + and the function fails with reason configuration_error. +

+

ConfDir is a string which points to the directory + where the configuration files are found. +

+

The configuration file read is: notify.conf. + +

+
+
+ + add_notify(Name, Tag, Type) -> Ret + Added one notify definition + + Name = string() + Tag = string() + Type = trap | inform + Ret = {ok, Key} | {error, Reason} + Key = term() + Reason = term() + + +

Adds a notify definition to the agent config. + Equivalent to one line in the notify.conf file.

+ +
+
+ + delete_notify(Key) -> Ret + Delete one notify definition + + Key = term() + Ret = ok | {error, Reason} + Reason = term() + + +

Delete a notify definition from the agent config.

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmp_pdus.xml b/lib/snmp/doc/src/snmp_pdus.xml new file mode 100644 index 0000000000..6c323c3ad9 --- /dev/null +++ b/lib/snmp/doc/src/snmp_pdus.xml @@ -0,0 +1,204 @@ + + + + +
+ + 19962009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmp_pdus + + + + + + + + snmp_pdus.xml +
+ snmp_pdus + Encode and Decode Functions for SNMP PDUs + +

RFC1157, RFC1905 and/or RFC2272 should be studied carefully + before using this module, snmp_pdus. +

+

The module snmp_pdus contains functions for encoding + and decoding of + SNMP protocol data units (PDUs). In short, this module converts a + list of bytes to Erlang record representations and vice versa. + The record definitions can be found in the file + snmp/include/snmp_types.hrl. If snmpv3 is used, the module + that includes snmp_types.hrl must define the constant + SNMP_USE_V3 before the header file is included. Example:

+
+-define(SNMP_USE_V3, true).
+-include_lib("snmp/include/snmp_types.hrl").    
+

Encoding and decoding must be done explicitly when writing your + own Net if process. +

+
+ + + dec_message([byte()]) -> Message + Decode an SNMP Message + + Message = #message + + +

Decodes a list of bytes into an SNMP Message. Note, if there + is a v3 message, the msgSecurityParameters are not + decoded. They must be explicitly decoded by a call to a + security model specific decoding function, + e.g. dec_usm_security_parameters/1. Also note, if + the scopedPDU is encrypted, the OCTET STRING encoded + encryptedPDU will be present in the data field.

+
+
+ + dec_message_only([byte()]) -> Message + Decode an SNMP Message, but not the data part + + Message = #message + + +

Decodes a list of bytes into an SNMP Message, but does not + decode the data part of the Message. That means, data is still + a list of bytes, normally an encoded PDU (v1 and V2) or an + encoded and possibly encrypted scopedPDU (v3).

+
+
+ + dec_pdu([byte()]) -> Pdu + Decode an SNMP Pdu + + Pdu = #pdu + + +

Decodes a list of bytes into an SNMP Pdu.

+
+
+ + dec_scoped_pdu([byte()]) -> ScopedPdu + Decode an SNMP ScopedPdu + + ScopedPdu = #scoped_pdu + + +

Decodes a list of bytes into an SNMP ScopedPdu.

+
+
+ + dec_scoped_pdu_data([byte()]) -> ScopedPduData + Decode an SNMP ScopedPduData + + ScopedPduData = #scoped_pdu | EncryptedPDU + EncryptedPDU = [byte()] + + +

Decodes a list of bytes into either a scoped pdu record, or + - if the scoped pdu was encrypted - to a list of bytes.

+
+
+ + dec_usm_security_parameters([byte()]) -> UsmSecParams + Decode SNMP UsmSecurityParameters + + UsmSecParams = #usmSecurityParameters + + +

Decodes a list of bytes into an SNMP UsmSecurityParameters

+
+
+ + enc_encrypted_scoped_pdu(EncryptedScopedPdu) -> [byte()] + Encode an encrypted SNMP scopedPDU + + EncryptedScopedPdu = [byte()] + + +

Encodes an encrypted SNMP ScopedPdu into an OCTET STRING + that can be used as the data field in a + message record, that later can be encoded with a call + to enc_message_only/1. +

+

This function should be used whenever the ScopedPDU + is encrypted.

+
+
+ + enc_message(Message) -> [byte()] + Encode an SNMP Message + + Message = #message + + +

Encodes a message record to a list of bytes.

+
+
+ + enc_message_only(Message) -> [byte()] + Encode an SNMP Message, but not the data part + + Message = #message + + +

Message is a record where the data field is + assumed to be encoded (a list of bytes). If there is a v1 or v2 + message, the data field is an encoded PDU, and if + there is a v3 message, data is an encoded and possibly + encrypted scopedPDU.

+
+
+ + enc_pdu(Pd) -> [byte()] + Encode an SNMP Pdu + + Pdu = #pdu + + +

Encodes an SNMP Pdu into a list of bytes.

+
+
+ + enc_scoped_pdu(ScopedPdu) -> [byte()] + Encode an SNMP scopedPDU + + ScopedPdu = #scoped_pdu + + +

Encodes an SNMP ScopedPdu into a list of bytes, which can be + encrypted, and after encryption, encoded with + a call to enc_encrypted_scoped_pdu/1; or it can be + used as the data field in a message record, which + then can be encoded with enc_message_only/1.

+
+
+ + enc_usm_security_parameters(UsmSecParams) -> [byte()] + Encode SNMP UsmSecurityParameters + + UsmSecParams = #usmSecurityParameters + + +

Encodes SNMP UsmSecurityParameters into a list of bytes.

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmp_standard_mib.xml b/lib/snmp/doc/src/snmp_standard_mib.xml new file mode 100644 index 0000000000..e8dea46f32 --- /dev/null +++ b/lib/snmp/doc/src/snmp_standard_mib.xml @@ -0,0 +1,135 @@ + + + + +
+ + 19962009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmp_standard_mib + + + + + + + + snmp_standard_mib.xml +
+ snmp_standard_mib + Instrumentation Functions for STANDARD-MIB and SNMPv2-MIB + +

The module snmp_standard_mib implements the instrumentation functions for the + STANDARD-MIB and SNMPv2-MIB, and functions for configuring the database. +

+

The configuration files are described in the SNMP User's Manual.

+
+ + + configure(ConfDir) -> void() + Configure the STANDARD-MIB and SNMPv2-MIB + + ConfDir = string() + + +

This function is called from the supervisor at system + start-up. +

+

Inserts all data in the configuration files into the + database and destroys all old rows with StorageType + volatile. The rows created from the configuration file + will have StorageType nonVolatile. +

+

All snmp counters are set to zero. +

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the error + report module, and the function fails with the reason + configuration_error. +

+

ConfDir is a string which points to the directory + where the configuration files are found. +

+

The configuration file read is: standard.conf. +

+
+
+ + inc(Name) -> void() + inc(Name, N) -> void() + Increment a variable in the MIB + + Name = atom() + N = integer() + + +

Increments a variable in the MIB with N, or one if + N is not specified.

+
+
+ + reconfigure(ConfDir) -> void() + Configure the STANDARD-MIB and SNMPv2-MIB + + ConfDir = string() + + +

Inserts all data in the configuration files into the + database and destroys all old data, including the rows with + StorageType nonVolatile. The rows created from the + configuration file will have StorageType nonVolatile. +

+

Thus, the data in the SNMP-STANDARD-MIB and SNMPv2-MIB, + after this function has been called, is from the + configuration files. +

+

All snmp counters are set to zero. +

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the error + report module, and the function fails with the reason + configuration_error. +

+

ConfDir is a string which points to the directory + where the configuration files are found. +

+

The configuration file read is: standard.conf. +

+
+
+ + reset() -> void() + Reset all snmpcounters to 0 + +

Resets all snmp counters to 0.

+
+
+ + sys_up_time() -> Time + Get the system up time + + Time = int() + + +

Gets the system up time in hundredth of a second.

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmp_target_mib.xml b/lib/snmp/doc/src/snmp_target_mib.xml new file mode 100644 index 0000000000..4a36be19a3 --- /dev/null +++ b/lib/snmp/doc/src/snmp_target_mib.xml @@ -0,0 +1,195 @@ + + + + +
+ + 19982009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmp_target_mib + + + + + + + + snmp_target_mib.xml +
+ snmp_target_mib + Instrumentation Functions for SNMP-TARGET-MIB + +

The module snmp_target_mib implements the instrumentation + functions for the SNMP-TARGET-MIB, + and functions for configuring the database.

+

The configuration files are described in the SNMP User's Manual.

+ + +
+ + + + configure(ConfDir) -> void() + Configure the SNMP-TARGET-MIB + + ConfDir = string() + + +

This function is called from the supervisor at system + start-up. +

+

Inserts all data in the configuration files into the + database and destroys all old rows with StorageType + volatile. The rows created from the configuration file + will have StorageType nonVolatile.

+

All snmp counters are set to zero.

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the error + report module, and the function fails with the reason + configuration_error.

+

ConfDir is a string which points to the directory + where the configuration files are found.

+

The configuration files read are: target_addr.conf + and target_params.conf.

+ + +
+
+ + + reconfigure(ConfDir) -> void() + Configure the SNMP-TARGET-MIB + + ConfDir = string() + + +

Inserts all data in the configuration files into the + database and destroys all old data, including the rows with + StorageType nonVolatile. The rows created from the + configuration file will have StorageType nonVolatile.

+

Thus, the data in the SNMP-TARGET-MIB, after this + function has been called, is the data from the configuration + files.

+

All snmp counters are set to zero.

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the , + and the function fails with the reason + configuration_error.

+

ConfDir is a string which points to the directory + where the configuration files are found.

+

The configuration files read are: target_addr.conf + and target_params.conf.

+ + +
+
+ + + set_target_engine_id(TargetAddrName, EngineId) -> boolean() + Set the engine id for a targetAddr row. + + TargetAddrName = string() + EngineId = string() + + +

Changes the engine id for a target in the + snmpTargetAddrTable. + If notifications are sent as Inform requests to a target, its + engine id must be set.

+ + +
+
+ + + add_addr(Name, Ip, Port, Timeout, Retry, TagList, Params, EngineId, TMask, MMS) -> Ret + Add one target address definition + + Name = string() + Ip = [integer()], length 4 + Port = integer() + Timeout = integer() + Retry = integer() + TagList = string() + ParamsName = string() + EngineId = string() + TMask = string(), length 0 or 6 + MMS = integer() + Ret = {ok, Key} | {error, Reason} + Key = term() + Reason = term() + + +

Adds a target address definition to the agent config. + Equivalent to one line in the target_addr.conf file.

+ + +
+
+ + + delete_addr(Key) -> Ret + Delete one target address definition + + Key = term() + Ret = ok | {error, Reason} + Reason = term() + + +

Delete a target address definition from the agent config.

+ + +
+
+ + + add_params(Name, MPModel, SecModel, SecName, SecLevel) -> Ret + Add one target parameter definition + + Name = string() + MPModel = v1 | v2c | v3 + SecModel = v1 | v2c | usm + SecName = string() + SecLevel = noAuthNoPriv | authNoPriv | authPriv + Ret = {ok, Key} | {error, Reason} + Key = term() + Reason = term() + + +

Adds a target parameter definition to the agent config. + Equivalent to one line in the target_params.conf file.

+ + +
+
+ + delete_params(Key) -> Ret + Delete one target parameter definition + + Key = term() + Ret = ok | {error, Reason} + Reason = term() + + +

Delete a target parameter definition from the agent config.

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmp_user_based_sm_mib.xml b/lib/snmp/doc/src/snmp_user_based_sm_mib.xml new file mode 100644 index 0000000000..7485e5af57 --- /dev/null +++ b/lib/snmp/doc/src/snmp_user_based_sm_mib.xml @@ -0,0 +1,146 @@ + + + + +
+ + 19992009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmp_user_based_sm_mib + + + + + + + + snmp_user_based_sm_mib.xml +
+ snmp_user_based_sm_mib + Instrumentation Functions for SNMP-USER-BASED-SM-MIB + +

The module snmp_user_based_sm_mib implements the instrumentation + functions for the SNMP-USER-BASED-SM-MIB, and functions for configuring + the database. +

+

The configuration files are described in the SNMP User's Manual.

+
+ + + configure(ConfDir) -> void() + Configure the SNMP-USER-BASED-SM-MIB + + ConfDir = string() + + +

This function is called from the supervisor at system + start-up. +

+

Inserts all data in the configuration files into the + database and destroys all old rows with StorageType + volatile. The rows created from the configuration file + will have StorageType nonVolatile. +

+

All snmp counters are set to zero. +

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the error + report module, and the function fails with the reason + configuration_error. +

+

ConfDir is a string which points to the directory + where the configuration files are found. +

+

The configuration file read is: usm.conf. +

+
+
+ + reconfigure(ConfDir) -> void() + Configure the SNMP-USER-BASED-SM-MIB + + ConfDir = string() + + +

Inserts all data in the configuration files into the + database and destroys all old data, including the rows with + StorageType nonVolatile. The rows created from the + configuration file will have StorageType nonVolatile. +

+

Thus, the data in the SNMP-USER-BASED-SM-MIB, after this + function has been called, is the data from the configuration + files. +

+

All snmp counters are set to zero. +

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the error + report module, and the function fails with the reason + configuration_error. +

+

ConfDir is a string which points to the directory + where the configuration files are found. +

+

The configuration file read is: usm.conf. + +

+
+
+ + add_user(EngineID, Name, SecName, Clone, AuthP, AuthKeyC, OwnAuthKeyC, PrivP, PrivKeyC, OwnPrivKeyC, Public, AuthKey, PrivKey) -> Ret + Add one user + + EngineID = string() + Name = string() + SecName = string() + Clone = zeroDotZero | [integer()] + AuthP = usmNoAuthProtocol | usmHMACMD5AuthProtocol | usmHMACSHAAuthProtocol + AuthKeyC = string() + OwnAuthKeyC = string() + PrivP = usmNoPrivProtocol | usmDESPrivProtocol + PrivKeyC = string() + OwnPrivKeyC = string() + Public = string() + AuthKey = string() + PrivKey = string() + Ret = {ok, Key} | {error, Reason} + Key = term() + Reason = term() + + +

Adds a USM security data (user) to the agent config. + Equivalent to one line in the usm.conf file.

+ +
+
+ + delete_user(Key) -> Ret + Delete one user + + Key = term() + Ret = ok | {error, Reason} + Reason = term() + + +

Delete a USM security data (user) from the agent config.

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmp_view_based_acm_mib.xml b/lib/snmp/doc/src/snmp_view_based_acm_mib.xml new file mode 100644 index 0000000000..ffea256608 --- /dev/null +++ b/lib/snmp/doc/src/snmp_view_based_acm_mib.xml @@ -0,0 +1,201 @@ + + + + +
+ + 19992009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmp_view_based_acm_mib + + + + + + + + snmp_view_based_acm_mib.xml +
+ snmp_view_based_acm_mib + Instrumentation Functions for SNMP-VIEW-BASED-ACM-MIB + +

The module snmp_view_based_acm_mib implements the instrumentation functions for the + SNMP-VIEW-BASED-ACM-MIB, and functions for configuring the database. +

+

The configuration files are described in the SNMP User's Manual.

+
+ + + configure(ConfDir) -> void() + Configure the SNMP-VIEW-BASED-ACM-MIB + + ConfDir = string() + + +

This function is called from the supervisor at system + start-up. +

+

Inserts all data in the configuration files into the + database and destroys all old rows with StorageType + volatile. The rows created from the configuration file + will have StorageType nonVolatile. +

+

All snmp counters are set to zero. +

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the error + report module, and the function fails with the reason + configuration_error. +

+

ConfDir is a string which points to the directory + where the configuration files are found. +

+

The configuration file read is: vacm.conf. +

+
+
+ + reconfigure(ConfDir) -> void() + Configure the SNMP-VIEW-BASED-ACM-MIB + + ConfDir = string() + + +

Inserts all data in the configuration files into the + database and destroys all old data, including the rows with + StorageType nonVolatile. The rows created from the + configuration file will have StorageType nonVolatile. +

+

Thus, the data in the SNMP-VIEW-BASED-ACM-MIB, after this + function has been called, is the data from the configuration + files. +

+

All snmp counters are set to zero. +

+

If an error is found in the configuration file, it is + reported using the function config_err/2 of the error + report module, and the function fails with the reason + configuration_error. +

+

ConfDir is a string which points to the directory + where the configuration files are found. +

+

The configuration file read is: vacm.conf. + +

+
+
+ + add_sec2group(SecModel, SecName, GroupName) -> Ret + Add one security to group definition + + SecModel = v1 | v2c | usm + SecName = string() + GroupName = string() + Ret = {ok, Key} | {error, Reason} + Key = term() + Reason = term() + + +

Adds a security to group definition to the agent config. + Equivalent to one vacmSecurityToGroup-line in the vacm.conf file.

+ +
+
+ + delete_sec2group(Key) -> Ret + Delete one security to group definition + + Key = term() + Ret = ok | {error, Reason} + Reason = term() + + +

Delete a security to group definition from the agent config.

+ +
+
+ + add_access(GroupName, Prefix, SecModel, SecLevel, Match, RV, WV, NV) -> Ret + Add one access definition + + GroupName = string() + Prefix = string() + SecModel = v1 | v2c | usm + SecLevel = string() + Match = prefix | exact + RV = string() + WV = string() + NV = string() + Ret = {ok, Key} | {error, Reason} + Key = term() + Reason = term() + + +

Adds a access definition to the agent config. + Equivalent to one vacmAccess-line in the vacm.conf file.

+ +
+
+ + delete_access(Key) -> Ret + Delete one access definition + + Key = term() + Ret = ok | {error, Reason} + Reason = term() + + +

Delete a access definition from the agent config.

+ +
+
+ + add_view_tree_fam(ViewIndex, SubTree, Status, Mask) -> Ret + Add one view tree family definition + + ViewIndex = integer() + SubTree = oid() + Status = included | excluded + Mask = null | [integer()], where all values are either 0 or 1 + Ret = {ok, Key} | {error, Reason} + Key = term() + Reason = term() + + +

Adds a view tree family definition to the agent config. + Equivalent to one vacmViewTreeFamily-line in the vacm.conf file.

+ +
+
+ + delete_view_tree_fam(Key) -> Ret + Delete one view tree family definition + + Key = term() + Ret = ok | {error, Reason} + Reason = term() + + +

Delete a view tree family definition from the agent config.

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmpa.xml b/lib/snmp/doc/src/snmpa.xml new file mode 100644 index 0000000000..b3661ae9b0 --- /dev/null +++ b/lib/snmp/doc/src/snmpa.xml @@ -0,0 +1,1252 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa + + + + + + + + snmpa.xml +
+ snmpa + Interface Functions to the SNMP toolkit agent + +

The module snmpa contains interface functions to the + SNMP agent.

+ + +
+ +
+ DATA TYPES + + +

The oid() type is used to represent an ASN.1 OBJECT IDENTIFIER.

+ +

The record contains the following fields:

+ + + +

A user defined identity representing this notification send + operation.

+
+ + +

A module implementing the + snmpa_notification_delivery_info_receiver + behaviour. The info functions of this module will be called at + various stages of delivery.

+
+ + +

This is any extra info the user wants to have supplied + when the functions in the callback module is called.

+
+
+ + +
+ + + + add_agent_caps(SysORID, SysORDescr) -> SysORIndex + Add an AGENT-CAPABILITY definition to the agent + + SysORID = oid() + SysORDescr = string() + SysORIndex = integer() + + +

This function can be used to add an AGENT-CAPABILITY + statement to the sysORTable in the agent. The table is + defined in the SNMPv2-MIB.

+ +
+
+ + + del_agent_caps(SysORIndex) -> void() + Delete an AGENT-CAPABILITY definition from the agent + + SysORIndex = integer() + + +

This function can be used to delete an AGENT-CAPABILITY + statement to the sysORTable in the agent. This table is + defined in the SNMPv2-MIB.

+ + +
+
+ + + get_agent_caps() -> [[SysORIndex, SysORID, SysORDescr, SysORUpTime]] + Return all AGENT-CAPABILITY definitions in the agent + + SysORIndex = integer() + SysORId = oid() + SysORDescr = string() + SysORUpTime = integer() + + +

Returns all AGENT-CAPABILITY statements in the sysORTable + in the agent. This table is defined in the SNMPv2-MIB.

+ + +
+
+ + + get(Agent, Vars) -> Values | {error, Reason} + get(Agent, Vars, Context) -> Values | {error, Reason} + Perform a get operation on the agent + + Agent = pid() | atom() + Vars = [oid()] + Context = string() + Values = [term()] + Reason = {atom(), oid()} + + +

Performs a GET operation on the agent. All loaded MIB + objects are visible in this operation. The agent calls the + corresponding instrumentation functions just as if it was a + GET request coming from a manager.

+

Note that the request specific parameters (such as + current_request_id) + are not accessible for the instrumentation functions if this + function is used.

+ + +
+
+ + + get_next(Agent, Vars) -> Values | {error, Reason} + get_next(Agent, Vars, Context) -> Values | {error, Reason} + Perform a get-next operation on the agent + + Agent = pid() | atom() + Vars = [oid()] + Context = string() + Values = [{oid(), term()}] + Reason = {atom(), oid()} + + +

Performs a GET-NEXT operation on the agent. All loaded MIB + objects are visible in this operation. The agent calls the + corresponding instrumentation functions just as if it was a + GET request coming from a manager.

+

Note that the request specific parameters (such as + snmpa:current_request_id/0 are not accessible for the + instrumentation functions if this function is used.

+ + + +
+
+ + + + backup(BackupDir) -> ok | {error, Reason} + backup(Agent, BackupDir) -> ok | {error, Reason} + Backup agent data + + BackupDir = string() + Agent = pid() | atom() + + +

Backup persistent/permanent data handled by the agent + (such as local-db, mib-data and vacm).

+

Data stored by mnesia is not handled.

+

BackupDir cannot be identical to DbDir.

+ + +
+
+ + info() -> [{Key, Value}] + info(Agent) -> [{Key, Value}] + Return information about the agent + + Agent = pid() | atom() + + +

Returns a list (a dictionary) containing information about + the agent. Information includes loaded MIBs, registered + sub-agents, some information about the memory allocation.

+

As of version 4.4 the format of the info has been changed. + To convert the info to the old format, call the + old_info_format + function.

+ + +
+
+ + + old_info_format(NewInfo) -> OldInfo + Return information about the agent + + OldInfo = NewInfo = [{Key, Value}] + + +

As of version 4.4 the format of the info has been changed. + This function is used to convert to the old (pre-4.4) info + format.

+ + +
+
+ + + load_mibs(Mibs) -> ok | {error, Reason} + load_mibs(Agent,Mibs) -> ok | {error, Reason} + Load MIBs into the agent + + Agent = pid() | atom() + Mibs = [MibName] + MibName = string() + Reason = term() + + +

Loads Mibs into an agent. If the agent cannot load + all MIBs, it will indicate where loading was aborted. The + MibName is the name of the Mib, including the path to + where the compiled mib is found. For example,

+ + Dir = code:priv_dir(my_app) ++ "/mibs/", + snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]). + + + +
+
+ + + unload_mibs(Mibs) -> ok | {error, Reason} + unload_mibs(Agent,Mibs) -> ok | {error, Reason} + Unload MIBs from the agent + + Agent = pid() | atom() + Mibs = [MibName] + MibName = string() + + +

Unloads MIBs into an agent. If it cannot unload all MIBs, + it will indicate where unloading was aborted.

+ + +
+
+ + + which_mibs() -> Mibs + which_mibs(Agent) -> Mibs + Get a list of all the loaded mibs + + Agent = pid() | atom() + Mibs = [{MibName, MibFile}] + MibName = atom() + MibFile = string() + + +

Retrieve the list of all the mibs loaded into this agent. Default + is the master agent.

+ + +
+
+ + + whereis_mib(MibName) -> {ok, MibFile} | {error, Reason} + whereis_mib(Agent, MibName) -> {ok, MibFile} | {error, Reason} + Get the path to the mib file + + Agent = pid() | atom() + MibName = atom() + MibFile = string() + Reason = term() + + +

Get the full path to the (compiled) mib-file.

+ + + + + +
+
+ + + current_request_id() -> {value, RequestId} | false + current_context() -> {value, Context} | false + current_community() -> {value, Community} | false + current_address() -> {value, Address} | false + Get the request-id, context, community and address of the current request + + RequestId = integer() + Context = string() + Community = string() + Address = term() + + +

Get the request-id, context, community and address of the + request currently being processed by the agent.

+

Note that these functions is intended to be called by the + instrumentation functions and only if they are + executed in the context of the agent process (e.g. it does + not work if called from a spawned process).

+ + +
+
+ + + enum_to_int(Name, Enum) -> {value, Int} | false + enum_to_int(Db, Name, Enum) -> {value, Int} | false + Convert an enum value to an integer + + Db = term() + Name = atom() + Enum = atom() + Int = int() + + +

Converts the symbolic value Enum to the + corresponding integer of the enumerated object or type + Name in a MIB. The MIB must be loaded. +

+

false is returned if the object or type is not + defined in any loaded MIB, or if it does not define the + symbolic value as enumerated. +

+

Db is a reference to the symbolic store database + (retrieved by a call to get_symbolic_store_db/0).

+ + +
+
+ + + int_to_enum(Name, Int) -> {value, Enum} | false + int_to_enum(Db, Name, Int) -> {value, Enum} | false + Convert an integer to an enum value + + Db = term() + Name = atom() + Int = int() + Enum = atom() + + +

Converts the integer Int to the corresponding + symbolic value of the enumerated object or type Name in + a MIB. The MIB must be loaded. +

+

false is returned if the object or type is not + defined in any loaded MIB, or if it does not define the + symbolic value as enumerated. +

+

Db is a reference to the symbolic store database + (retrieved by a call to get_symbolic_store_db/0).

+ + +
+
+ + + name_to_oid(Name) -> {value, oid()} | false + name_to_oid(Db, Name) -> {value, oid()} | false + Convert a symbolic name to an OID + + Db = term() + Name = atom() + + +

Looks up the OBJECT IDENTIFIER of a MIB object, given the + symbolic name. Note, the OBJECT IDENTIFIER is given for the + object, not for an instance.

+

false is returned if the object is not defined in any + loaded MIB.

+

Db is a reference to the symbolic store database + (retrieved by a call to get_symbolic_store_db/0).

+ + +
+
+ + + oid_to_name(OID) -> {value, Name} | false + oid_to_name(Db, OID) -> {value, Name} | false + Convert an OID to a symbolic name + + Db = term() + OID = oid() + Name = atom() + + +

Looks up the symbolic name of a MIB object, given OBJECT + IDENTIFIER.

+

false is returned if the object is not defined in any + loaded MIB.

+

Db is a reference to the symbolic store database + (retrieved by a call to get_symbolic_store_db/0).

+ + +
+
+ + + which_aliasnames() -> Result + Get all alias-names known to the agent + + Result = [atom()] + + +

Retrieve all alias-names known to the agent.

+ +
+
+ + + which_tables() -> Result + Get all tables known to the agent + + Result = [atom()] + + +

Retrieve all tables known to the agent.

+ + +
+
+ + + which_variables() -> Result + Get all variables known to the agent + + Result = [atom()] + + +

Retrieve all variables known to the agent.

+ + +
+
+ + + which_notifications() -> Result + Get all notifications known to the agent + + Result = [{Name, MibName, Info}] + Name = atom() + MibName = atom() + Info = term() + + +

Retrieve all notifications (and traps) known to the agent.

+ + +
+
+ + + log_to_txt(LogDir, Mibs) + log_to_txt(LogDir, Mibs, OutFile) -> ok | {error, Reason} + log_to_txt(LogDir, Mibs, OutFile, LogName) -> ok | {error, Reason} + log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile) -> ok | {error, Reason} + log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start) -> ok | {error, Reason} + log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start, Stop) -> ok | {error, Reason} + Convert an Audit Trail Log to text format + + LogDir = string() + Mibs = [MibName] + MibName = string() + OutFile = string() + LogName = string() + LogFile = string() + Start = Stop = null | datetime() | {local_time,datetime()} | {universal_time,datetime()} + Reason = disk_log_open_error() | file_open_error() | term() + disk_log_open_error() = {LogName, term()} + file_open_error() = {OutFile, term()} + + +

Converts an Audit Trail Log to a readable text file. + OutFile defaults to "./snmpa_log.txt". + LogName defaults to "snmpa_log". + LogFile defaults to "snmpa.log". + See snmp:log_to_txt + for more info.

+ + +
+
+ + + change_log_size(NewSize) -> ok | {error, Reason} + Change the size of the Audit Trail Log + + NewSize = {MaxBytes, MaxFiles} + MaxBytes = integer() + MaxFiles = integer() + Reason = term() + + +

Changes the log size of the Audit Trail Log. The application must + be configured to use the audit trail log function. Please refer to + disk_log(3) in Kernel Reference Manual for a description of how to + change the log size.

+

The change is permanent, as long as the log is not deleted. + That means, the log size is remembered across reboots.

+ + +
+
+ + + set_log_type(NewType) -> {ok, OldType} | {error, Reason} + set_log_type(Agent, NewType) -> {ok, OldType} | {error, Reason} + Change the type of the Audit Trail Log + + NewType = OldType = atl_type() + Agent = pid() | atom() + Reason = term() + + +

Changes the run-time Audit Trail log type.

+

Note that this has no effect on the application configuration as + defined by configuration files, so a node restart will revert the + config to whatever is in those files.

+

This function is primarily useful in testing/debugging + scenarios.

+ + +
+ +
+ + + mib_of(Oid) -> {ok, MibName} | {error, Reason} + mib_of(Agent, Oid) -> {ok, MibName} | {error, Reason} + Which mib an Oid belongs to + + Agent = pid() | atom() + Oid = oid() + MibName = atom() + Reason = term() + + +

Finds the mib corresponding to the Oid. If it is a + variable, the Oid must be + <Oid for var>.0 and if it is a table, Oid must be + <table>.<entry>.<col>.<any>

+ + +
+
+ + + me_of(Oid) -> {ok, Me} | {error, Reason} + me_of(Agent, Oid) -> {ok, Me} | {error, Reason} + Retrieve the mib-entry of an Oid + + Agent = pid() | atom() + Oid = oid() + Me = #me{} + Reason = term() + + +

Finds the mib entry corresponding to the Oid. If it is a + variable, the Oid must be + <Oid for var>.0 and if it is a table, Oid must be + <table>.<entry>.<col>.<any>

+ + +
+
+ + + invalidate_mibs_cache() -> void() + invalidate_mibs_cache(Agent) -> void() + Invalidate the mib server cache + + Agent = pid() | atom() + + +

Invalidate the mib server cache.

+

The entire contents of the cache will be deleted.

+ + +
+
+ + + enable_mibs_cache() -> void() + enable_mibs_cache(Agent) -> void() + Enable the mib server cache + + Agent = pid() | atom() + + +

Enable the mib server cache.

+ + +
+
+ + + disable_mibs_cache() -> void() + disable_mibs_cache(Agent) -> void() + Disable the mib server cache + + Agent = pid() | atom() + + +

Disable the mib server cache.

+ + +
+
+ + + gc_mibs_cache() -> {ok, NumElementsGCed} | {error, Reason} + gc_mibs_cache(Agent) -> {ok, NumElementsGCed} | {error, Reason} + gc_mibs_cache(Age) -> {ok, NumElementsGCed} | {error, Reason} + gc_mibs_cache(Agent, Age) -> {ok, NumElementsGCed} | {error, Reason} + gc_mibs_cache(Age, GcLimit) -> {ok, NumElementsGCed} | {error, Reason} + gc_mibs_cache(Agent, Age, GcLimit) -> {ok, NumElementsGCed} | {error, Reason} + Perform mib server cache gc + + Agent = pid() | atom() + Age = integer() > 0 + GcLimit = integer() > 0 | infinity + NumElementsGCed = integer() >= 0 + Reason = term() + + +

Perform mib server cache gc.

+

Manually performs a mib server cache gc. + This can be done regardless of the value of the + autogc option. + The NumElementsGCed value indicates how many + elements where actually removed from the cache.

+ + +
+
+ + + enable_mibs_cache_autogc() -> void() + enable_mibs_cache_autogc(Agent) -> void() + Enable automatic gc of the mib server cache + + Agent = pid() | atom() + + +

Enable automatic gc of the mib server cache.

+ + +
+
+ + + disable_mibs_cache_autogc() -> void() + disable_mibs_cache_autogc(Agent) -> void() + Disable automatic gc of the mib server cache + + Agent = pid() | atom() + + +

Disable automatic gc of the mib server cache.

+ + +
+
+ + + update_mibs_cache_age(NewAge) -> ok | {error, Reason} + update_mibs_cache_age(Agent, NewAge) -> ok | {error, Reason} + Change the mib server cache age property + + Agent = pid() | atom() + NewAge = integer() > 0 + Reason = term() + + +

Change the mib server cache age property.

+ + +
+
+ + + update_mibs_cache_gclimit(NewGcLimit) -> ok | {error, Reason} + update_mibs_cache_gclimit(Agent, NewGCLimit) -> ok | {error, Reason} + Change the mib server cache gclimit property + + Agent = pid() | atom() + NewGcLimit = integer() > 0 | infinity + Reason = term() + + +

Change the mib server cache gclimit property.

+ + +
+
+ + + + register_notification_filter(Id, Mod, Data) -> ok | {error, Reason} + register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason} + register_notification_filter(Id, Mod, Data, Where) -> ok | {error, Reason} + register_notification_filter(Agent, Id, Mod, Data, Where) -> ok | {error, Reason} + Register a notification filter + + Agent = pid() | atom() + Id = filter_id() + filter_id() = term() + Mod = atom() + Data = term() + Where = filter_position() + Reason = term() + filter_position() = first | last | {insert_before, filter_id()} | {insert_after, filter_id()} + + +

Registers a notification filter. +

+

Mod is a module implementing the + snmpa_notification_filter behaviour.

+

Data will be passed on to the filter when calling the + functions of the behaviour.

+ + +
+
+ + + unregister_notification_filter(Id) -> ok | {error, Reason} + unregister_notification_filter(Agent, Id) -> ok | {error, Reason} + Unregister a notification filter + + Agent = pid() | atom() + Id = filter_id() + filter_id() = term() + + +

Unregister a notification filter.

+ + +
+
+ + + which_notification_filter() -> Filters + which_notification_filter(Agent) -> Filters + Which notification filter + + Agent = pid() | atom() + Filters = [filter_id()] + filter_id() = term() + + +

List all notification filters in an agent.

+ + +
+
+ + + set_request_limit(NewLimit) -> {ok, OldLimit} | {error, Reason} + set_request_limit(Agent, NewLimit) -> {ok, OldLimit} | {error, Reason} + Change the request limit + + NewLimit = OldLimit = infinity | integer() >= 0 + Agent = pid() | atom() + Reason = term() + + +

Changes the request limit.

+

Note that this has no effect on the application configuration as + defined by configuration files, so a node restart will revert the + config to whatever is in those files.

+

This function is primarily useful in load regulation + scenarios.

+ + +
+
+ + + register_subagent(Agent, SubTreeOid, Subagent) -> ok | {error, Reason} + Register a sub-agent under a sub-tree + + Agent = pid() | atom() + SubTreeOid = oid() + SubAgent = pid() + + +

Registers a sub-agent under a sub-tree of another agent.

+

It is easy to make mistakes when registering sub-agents and + this activity should be done carefully. For example, a + strange behaviour would result from the following + configuration:

+
+snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
+snmp_agent:register_subagent(SA1,[1,2,3], SA2).
+        
+

SA2 will not get requests starting with object + identifier [1,2,3] since SA1 does not.

+ + +
+
+ + + unregister_subagent(Agent, SubagentOidOrPid) -> ok | {ok, SubAgentPid} | {error, Reason} + Unregister a sub-agent + + Agent = pid() | atom() + SubTreeOidorPid = oid() | pid() + + +

Unregister a sub-agent. If the second argument is a pid, + then that sub-agent will be unregistered from all trees in + Agent.

+ + +
+
+ + + send_notification(Agent, Notification, Receiver) + send_notification(Agent, Notification, Receiver, Varbinds) + send_notification(Agent, Notification, Receiver, NotifyName, Varbinds) + send_notification(Agent, Notification, Receiver, NotifyName, ContextName, Varbinds) -> void() + Send a notification + + Agent = pid() | atom() + Notification = atom() + Receiver = no_receiver | {Tag, Recv} | notification_delivery_info() + Tag = term() + Recv = receiver() + receiver() = pid() | atom() | {Mod, Func, Args} + Mod = atom() + Func = atom() + Args = list() + NotifyName = string() + ContextName = string() + Varbinds = varbinds() + varbinds() = [varbind()] + varbind() = {Variable, Value} | {Column, RowIndex, Value} | {OID, Value} + Variable = atom() + Column = atom() + OID = oid() + Value = term() + RowIndex = [int()] + + +

Sends the notification Notification to the + management targets defined for NotifyName in the + snmpNotifyTable in SNMP-NOTIFICATION-MIB from the + specified context. If no NotifyName is specified (or + if it is ""), the notification is sent to all + management targets (Addresses below). If no ContextName + is specified, the default "" context is used. +

+ +

The parameter Receiver specifies where information + about delivery of Inform-Requests should be sent. The agent + sends Inform-Requests and waits for acknowledgments from the + managers. Receiver can have three values:

+ + + +

no_receiver - No information is delivered.

+
+ + +

{Tag, Recv} - The information is delivered either via messages + or via a function call according to the value of Recv.

+
+ + +

notification_delivery_info() - The information is + delivered via a function call according to this data. See the + DATA TYPES section + above for details.

+
+ +
+ + +

If Receiver has the value {Tag, Recv}, the delivery is + done according to Recv:

+ + + +

pid() | atom() - The info will be delivered in + the following messages:

+ + +

{snmp_targets, Tag, Addresses}

+

This inform the user which target addresses the + notification was sent to.

+
+ +

{snmp_notification, Tag, {got_response, Address}}

+

This informs the user that this target address + acknowledged the notification.

+
+ +

{snmp_notification, Tag, {no_response, Address}}

+

This informs the user that this target address + did not acknowledge notification.

+
+
+

The notification is sent as an Inform-Request to each + target address in Addresses and if there are no + targets for which an Inform-Request is sent, Addresses + is the empty list [].

+

The receiver will first be sent the snmp_targets + message, and then for each address in Addresses list, + one of the two snmp_notification messages.

+
+ +

{Mod, Func, Args} - The info will be delivered via + the function call:

+

Mod:Func([Msg | Args])

+

where Msg has the same content and purpose as the + messages descrived above.

+
+
+ +

Address is a management target address and Addresses is a + list of management target addresses. They are defined as followes:

+ +
+        Addresses  = [address()]
+        Address    = address()
+        address()  = v1_address() | v3_address()
+        v1_address() = {TDomain, TAddress}
+        v3_address() = {{TDomain, TAddress}, V3MsgData}
+        TDomain    = tdoamin()
+        TAddress   = taddress()
+        tdomain()  = The oid of snmpUDPDomain 
+                     This is the only supported transport domain.
+        taddress() = [A1, A2, A3, A4, P1, P3]
+                     The 4 first bytes makes up the IP-address and the last 2,
+                     the UDP-port number.
+        V3MsgData  = v3_msg_data()
+        v3_msg_data() = term()
+
+ +

If Receiver is a notification_delivery_info() record, + then the information about the notification delivery will be delivered + to the receiver via the callback functions defined by the + snmpa_notification_delivery_info_receiver + behaviour according to the content of the notification_delivery_info() + record.

+ +

The optional argument Varbinds defines + values for the objects in the notification. If no value is + given for an object, the Agent performs a get-operation + to retrieve the value. +

+

Varbinds is a list of Varbind, where each + Varbind is one of: +

+ + {Variable, Value}, where Variable is the + symbolic name of a scalar variable referred to in the notification + specification. + + {Column, RowIndex, Value}, where Column + is the symbolic name of a column variable. + RowIndex is a list of indices for the specified + element. If this is the case, the OBJECT IDENTIFIER sent + in the notification is the RowIndex appended to the OBJECT + IDENTIFIER for the table column. This is the OBJECT + IDENTIFIER which specifies the element. + + {OID, Value}, where OID is the OBJECT + IDENTIFIER for an instance of an object, scalar variable, + or column variable. + + +

For example, to specify that sysLocation should have the + value "upstairs" in the notification, we could use one of: +

+ + {sysLocation, "upstairs"} or + {[1,3,6,1,2,1,1,6,0], "upstairs"} or + {?sysLocation_instance, "upstairs"} (provided + that the generated .hrl file is included) + +

If a variable in the notification is a table element, the + RowIndex for the element must be given in the + Varbinds list. In this case, the OBJECT IDENTIFIER sent + in the notification is the OBJECT IDENTIFIER that identifies this + element. This OBJECT IDENTIFIER could be used in a get + operation later. +

+

This function is asynchronous, and does not return any + information. If an error occurs, user_err/2 of the error + report module is called and the notification is discarded. +

+ + +
+
+ + + send_trap(Agent,Trap,Community) + send_trap(Agent,Trap,Community,Varbinds) -> void() + Send a trap + + Agent = pid() | atom() + Trap = atom() + Community = string() + Varbinds = [Varbind] + Varbind = {Variable, Value} | {Column, RowIndex, Value} | {OID, Value} + Variable = atom() + Column = atom() + OID = oid() + Value = term() + RowIndex = [int()] + + +

Note! This function is only kept for backwards + compatibility reasons. Use send_notification instead. +

+

Sends the trap Trap to the managers defined for + Community in the intTrapDestTable in + OTP-SNMPEA-MIB. The optional argument Varbinds defines + values for the objects in the trap. If no value is given for + an object, the Agent performs a get-operation to + retrieve the value. +

+

Varbinds is a list of Varbind, where each + Varbind is one of: +

+ + {Variable, Value}, where Variable is the + symbolic name of a scalar variable referred to in the trap + specification. + + {Column, RowIndex, Value}, where Column + is the symbolic name of a column variable. + RowIndex is a list of indices for the specified + element. If this is the case, the OBJECT IDENTIFIER sent + in the trap is the RowIndex appended to the OBJECT + IDENTIFIER for the table column. This is the OBJECT + IDENTIFIER which specifies the element. + + {OID, Value}, where OID is the OBJECT + IDENTIFIER for an instance of an object, scalar variable, + or column variable. + + +

For example, to specify that sysLocation should have the + value "upstairs" in the trap, we could use one of: +

+ + {sysLocation, "upstairs"} or + {[1,3,6,1,2,1,1,6,0], "upstairs"} or + {?sysLocation_instance, "upstairs"} (provided + that the generated .hrl file is included) + +

If a variable in the trap is a table element, the + RowIndex for the element must be given in the + Varbinds list. In this case, the OBJECT IDENTIFIER sent + in the trap is the OBJECT IDENTIFIER that identifies this + element. This OBJECT IDENTIFIER could be used in a get + operation later. +

+

This function is asynchronous, and does not return any + information. If an error occurs, snmp_error:user_err/2 + is called and the trap is discarded.

+ + +
+
+ + + discovery(TargetName, Notification) -> {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification, Varbinds) -> {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification, DiscoHandler) -> {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification, ContextName, Varbinds) -> {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification, Varbinds, DiscoHandler) -> {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler) -> {ok, ManagerEngineID} | {error, Reason} + discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler, ExtraInfo) -> {ok, ManagerEngineID} | {error, Reason} + Initiate the discovery process with a manager + + TargetName = string() + Notification = atom() + ContextName = string() (defaults to "") + Varbinds = varbinds() + varbinds() = [varbind()] + DiscoHandler = snmpa_discovery_handler() + ExtraInfo = term() + snmpa_discovery_handler() = Module implementing the snmpa_discovery_handler behaviour + ManagerEngineID = string() + varbind() = {Variable, Value} | {Column, RowIndex, Value} | {OID, Value} + Variable = atom() + Column = atom() + OID = oid() + Value = term() + RowIndex = [int()] + Reason = term() + + +

Initiate the discovery process with the manager identified by + TargetName using the notification Notification.

+ +

This function is synchronous, which means that it will return when + the discovery process has been completed or failed.

+ +

The DiscoHandler module is used during the discovery + process. See + discovery handler + for more info.

+ +

The ExtraInfo argument is passed on to the callback functions + of the DiscoHandler.

+ +

If we are not at security-level noAuthNoPriv, + this could be complicated, since the agent will then continue + with stage 2, before which the usm-related updates must be + done.

+ +

The default discovery handler will require + additional actions by the caller and the discovery will not work + if the security-level is higher then noAuthNoPriv.

+ + +
+
+ + + convert_config(OldConfig) -> AgentConfig + Convert old snmp config to new agent config + + OldConfig = list() + AgentConfig = list() + + +

This off-line utility function can be used to convert + the old snmp application config (pre snmp-4.0) to the + new snmp agent config (as of snmp-4.0).

+

For information about the old config (OldConfig) + see the OTP R9C documentation.

+

For information about the current agent config + (AgentConfig), see either + the SNMP application + part of the reference manual or the + Configuring the application + chapter of the SNMP user's guide.

+ + +
+
+ + + restart_worker() -> void() + restart_worker(Agent) -> void() + Restart the worker process of a multi-threaded agent + + Agent = pid() | atom() + + +

Restart the worker process of a multi-threaded agent.

+

This is a utility function, that can be usefull when + e.g. debugging instrumentation functions.

+ + +
+
+ + + restart_set_worker() -> void() + restart_set_worker(Agent) -> void() + Restart the set worker process of a multi-threaded agent + + Agent = pid() | atom() + + +

Restart the set worker process of a multi-threaded agent.

+

This is a utility function, that can be usefull when + e.g. debugging instrumentation functions.

+ + +
+
+ + + verbosity(Ref,Verbosity) -> void() + Assign a new verbosity for the process + + Ref = pid() | sub_agents | master_agent | net_if | mib_server | symbolic_store | note_store | local_db + Verbosity = verbosity() | {subagents, verbosity()} + verbosity() = silence | info | log | debug | trace + + +

Sets verbosity for the designated process. For the lowest + verbosity silence, nothing is printed. The higher the + verbosity, the more is printed.

+
+
+
+ +
+ See Also +

calendar(3), erlc(1)

+
+ + +
+ diff --git a/lib/snmp/doc/src/snmpa_conf.xml b/lib/snmp/doc/src/snmpa_conf.xml new file mode 100644 index 0000000000..f383394b7a --- /dev/null +++ b/lib/snmp/doc/src/snmpa_conf.xml @@ -0,0 +1,861 @@ + + + + +
+ + 20062009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa_conf + + + + + + + + snmpa_conf.xml +
+ snmpa_conf + Utility functions for handling the agent config files. + +

The module snmpa_conf contains various utility functions to + used for manipulating (write/append/read) the config files of the + SNMP agent.

+ + +
+ + + agent_entry(Tag, Val) -> agent_entry() + Create an agent entry + + Tag = intAgentIpAddress | intAgentUDPPort | intAgentMaxPacketSize | snmpEngineMaxMessageSize | snmpEngineID + Val = term() + agent_entry() = term() + + +

Create an entry for the agent config file, agent.conf.

+

The type of Val depends on the value of Tag, + see + Agent Information + for more info.

+ + +
+
+ + + write_agent_config(Dir, Conf) -> ok + write_agent_config(Dir, Hdr, Conf) -> ok + Write the agent config to the config file + + Dir = string() + Hdr = string() + Conf = [agent_entry()] + + +

Write the agent config to the agent config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + Agent Information + for more info.

+ + +
+
+ + + append_agent_config(Dir, Conf) -> ok + Append the agent config to the config file + + Dir = string() + Conf = [agent_entry()] + + +

Append the config to the current agent config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Agent Information + for more info.

+ + +
+
+ + + read_agent_config(Dir) -> Conf + Read the agent config from the config file + + Dir = string() + Conf = [agent_entry()] + + +

Read the current agent config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Agent Information + for more info.

+ + +
+
+ + + standard_entry(Tag, Val) -> standard_entry() + Create an standard entry + + Tag = sysDescr | sysObjectID | sysContact | sysName | sysLocation | sysServices | snmpEnableAuthenTraps + Val = term() + standard_entry() = term() + + +

Create an entry for the agent standard config file, + standard.conf.

+

The type of Val depends on the value of Tag, + see + System Information + for more info.

+ + +
+
+ + + write_standard_config(Dir, Conf) -> ok + write_standard_config(Dir, Hdr, Conf) -> ok + Write the agent standard config to the config file + + Dir = string() + Hdr = string() + Conf = [standard_entry()] + + +

Write the agent standard config to the agent standard + config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + System Information + for more info.

+ + +
+
+ + + append_standard_config(Dir, Conf) -> ok + Append the agent standard config to the config file + + Dir = string() + Conf = [standard_entry()] + + +

Append the standard config to the current agent standard + config file.

+

Dir is the path to the directory where to store the + config file.

+

See + System Information + for more info.

+ + +
+
+ + + read_standard_config(Dir) -> Conf + Read the agent standard config from the config file + + Dir = string() + Conf = [standard_entry()] + + +

Read the current agent standard config file.

+

Dir is the path to the directory where to store the + config file.

+

See + System Information + for more info.

+ + +
+
+ + + context_entry(Context) -> context_entry() + Create an context entry + + Context = string() + context_entry() = term() + + +

Create an entry for the agent context config file, + context.conf.

+

See + Contexts + for more info.

+ + +
+
+ + + write_context_config(Dir, Conf) -> ok + write_context_config(Dir, Hdr, Conf) -> ok + Write the agent context(s) to the config file + + Dir = string() + Hdr = string() + Conf = [context_entry()] + + +

Write the agent context config to the agent context + config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + Contexts + for more info.

+ + +
+
+ + + append_context_config(Dir, Conf) -> ok + Append the agent context(s) to the config file + + Dir = string() + Conf = [context_entry()] + + +

Append the context config to the current agent context + config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Contexts + for more info.

+ + +
+
+ + + read_context_config(Dir) -> Conf + Read the agent context config from the config file + + Dir = string() + Conf = [context_entry()] + + +

Read the current agent context config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Contexts + for more info.

+ + +
+
+ + + community_entry(CommunityIndex) -> community_entry() + community_entry(CommunityIndex, CommunityName, SecName, ContextName, TransportTag) -> community_entry() + Create an community entry + + CommunityIndex = string() + CommunityName = string() + SecName = string() + CtxName = string() + TransportTag = string() + community_entry() = term() + + +

Create an entry for the agent community config file, + community.conf.

+

CommunityIndex must be a non-empty string.

+

community_entry("public") translates to the following call: + community_entry(CommunityIndex, CommunityIndex, "initial", "", "").

+

community_entry("all-rights") translates to the following + call: community_entry(CommunityIndex, CommunityIndex, CommunityIndex, "", "").

+

See + Community + for more info.

+ + +
+
+ + + write_community_config(Dir, Conf) -> ok + write_community_config(Dir, Hdr, Conf) -> ok + Write the agent community config to the config file + + Dir = string() + Hdr = string() + Conf = [community_entry()] + + +

Write the agent community config to the agent community + config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + Community + for more info.

+ + +
+
+ + + append_community_config(Dir, Conf) -> ok + Append the agent community config to the config file + + Dir = string() + Conf = [community_entry()] + + +

Append the community config to the current agent community + config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Community + for more info.

+ + +
+
+ + + read_community_config(Dir) -> Conf + Read the agent community config from the config file + + Dir = string() + Conf = [community_entry()] + + +

Read the current agent community config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Communities + for more info.

+ + +
+
+ + + target_addr_entry(Name, Ip, TagList, ParamsName, EngineId) -> target_addr_entry() + target_addr_entry(Name, Ip, TagList, ParamsName, EngineId, TMask) -> target_addr_entry() + target_addr_entry(Name, Ip, Udp, TagList, ParamsName, EngineId, TMask, MaxMessageSize) -> target_addr_entry() + target_addr_entry(Name, Ip, Udp, Timeout, RetryCount, TagList, ParamsName, EngineId, TMask, MaxMessageSize) -> target_addr_entry() + Create an target_addr entry + + Name = string() + Ip = string() + Udp = integer() + Timeout = integer() + RetryCount = integer() + TagList = string() + ParamsName = string() + EngineId = string() + TMask = string() + MaxMessageSize = integer() + target_addr_entry() = term() + + +

Create an entry for the agent target_addr config file, + target_addr.conf.

+

Name must be a non-empty string.

+

target_addr_entry/5 translates to the following call: + target_addr_entry(Name, Ip, TagList, ParamsName, EngineId).

+

target_addr_entry/6 translates to the following call: + target_addr_entry(Name, Ip, 162, TagList, ParamsName, EngineId, TMask, 2048).

+

target_addr_entry/8 translates to the following call: + target_addr_entry(Name, Ip, Udp, 1500, 3, TagList, ParamsName, EngineId, TMask, MaxMessageSize).

+

See + Target Address Definitions + for more info.

+ + +
+
+ + + write_target_addr_config(Dir, Conf) -> ok + write_target_addr_config(Dir, Hdr, Conf) -> ok + Write the agent target_addr config to the config file + + Dir = string() + Hdr = string() + Conf = [target_addr_entry()] + + +

Write the agent target_addr config to the agent target_addr + config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + Target Address Definitions + for more info.

+ + +
+
+ + + append_target_addr_config(Dir, Conf) -> ok + Append the agent target_addr config to the config file + + Dir = string() + Conf = [target_addr_entry()] + + +

Append the target_addr config to the current agent target_addr + config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Target Address Definitions + for more info.

+ + +
+
+ + + read_target_addr_config(Dir) -> Conf + Read the agent target_addr config from the config file + + Dir = string() + Conf = [target_addr_entry()] + + +

Read the current agent target_addr config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Target Address Definitions + for more info.

+ + +
+
+ + + target_params_entry(Name, Vsn) -> target_params_entry() + target_params_entry(Name, Vsn, SecName, SecLevel) -> target_params_entry() + target_params_entry(Name, MPModel, SecModel, SecName, SecLevel) -> target_params_entry() + Create an target_params entry + + Name = string() + Vsn = v1 | v2 | v3 + MPModel = v1 | v2c | v3 + SecModel = v1 | v2c | usm + SecName = string() + SecLevel = noAuthNoPriv | authNoPriv | authPriv + target_params_entry() = term() + + +

Create an entry for the agent target_params config file, + target_params.conf.

+

Name must be a non-empty string.

+

Vsn translates into MPModel and SecModel as follows:

+
+\011  Vsn = v1 => MPModel = v1,  SecModel = v1
+\011  Vsn = v2 => MPModel = v2c, SecModel = v2c
+\011  Vsn = v3 => MPModel = v3,  SecModel = usm
+        
+

target_params_entry/2 translates to the following call: + target_params_entry(Name, Vsn, "initial", noAuthNoPriv).

+

target_params_entry/4 translates to the following + call: target_params_entry(Name, MPModel, SecModel, SecName, SecLevel) where MPModel and + SecModel is mapped from Vsn, see above.

+

See + Target Parameters Definitions + for more info.

+ + +
+
+ + + write_target_params_config(Dir, Conf) -> ok + write_target_params_config(Dir, Hdr, Conf) -> ok + Write the agent target_params config to the config file + + Dir = string() + Hdr = string() + Conf = [target_params_entry()] + + +

Write the agent target_params config to the agent target_params + config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + Target Parameters Definitions + for more info.

+ + +
+
+ + + append_target_params_config(Dir, Conf) -> ok + Append the agent target_params config to the config file + + Dir = string() + Conf = [target_params_entry()] + + +

Append the target_params config to the current agent target_params + config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Target Parameters Definitions + for more info.

+ + +
+
+ + + read_target_params_config(Dir) -> Conf + Read the agent target_params config from the config file + + Dir = string() + Conf = [target_params_entry()] + + +

Read the current agent target_params config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Target Parameters Definitions + for more info.

+ + +
+
+ + + vacm_s2g_entry(SecModel, SecName, GroupName) -> vacm_s2g_entry() + vacm_acc_entry(GroupName, Prefix, SecModel, SecLevel, Match, ReadView, WriteView, NotifyView) -> vacm_acc_entry() + vacm_vtf_entry(ViewIndex, ViewSubtree) -> vacm_vtf_entry() + vacm_vtf_entry(ViewIndex, ViewSubtree, ViewStatus, ViewMask) -> vacm_vtf_entry() + Create an vacm entry + + SecModel = v1 | v2c | usm + SecName = string() + GroupName = string() + Prefix = string() + SecLevel = noAuthNoPriv | authNoPriv | authPriv + Match = prefix | exact + ReadView = string() + WriteView = string() + NotifyView = string() + ViewIndex = integer() + ViewSubtree = [integer()] + ViewStatus = included | excluded + ViewMask = null | [zero_or_one()] + zero_or_one() = 0 | 1 + vacm_s2g_entry() = term() + vacm_acc_entry() = term() + vacm_vtf_entry() = term() + + +

Create an entry for the agent vacm config file, + vacm.conf.

+

vacm_vtf_entry/2 translates to the following call: + vacm_vtf_entry(ViewIndex, ViewSubtree, included, null).

+

See + MIB Views for VACM + for more info.

+ + +
+
+ + + write_vacm_config(Dir, Conf) -> ok + write_vacm_config(Dir, Hdr, Conf) -> ok + Write the agent vacm config to the config file + + Dir = string() + Hdr = string() + Conf = [vacm_entry()] + vacm_entry() = vacm_sg2_entry() | vacm_acc_entry() | vacm_vtf_entry() + + +

Write the agent vacm config to the agent vacm + config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + MIB Views for VACM + for more info.

+ + +
+
+ + + append_vacm_config(Dir, Conf) -> ok + Append the agent vacm config to the config file + + Dir = string() + Conf = [vacm_entry()] + + +

Append the vacm config to the current agent vacm + config file.

+

Dir is the path to the directory where to store the + config file.

+

See + MIB Views for VACM + for more info.

+ + +
+
+ + + read_vacm_config(Dir) -> Conf + Read the agent vacm config from the config file + + Dir = string() + Conf = [vacm_entry()] + + +

Read the current agent vacm config file.

+

Dir is the path to the directory where to store the + config file.

+

See + MIB Views for VACM + for more info.

+ + +
+
+ + + usm_entry(EngineId) -> usm_entry() + usm_entry(EngineID, UserName, SecName, Clone, AuthP, AuthKeyC, OwnAuthKeyC, PrivP, PrivKeyC, OwnPrivKeyC, Public, AuthKey, PrivKey) -> usm_entry() + Create an usm entry + + EngineId = string() + UserName = string() + SecName = string() + Clone = zeroDotZero | [integer()] + AuthP = usmNoAuthProtocol | usmHMACMD5AuthProtocol, | usmHMACSHAAuthProtocol + AuthKeyC = string() + OwnAuthKeyC = string() + PrivP = usmNoPrivProtocol | usmDESPrivProtocol | usmAesCfb128Protocol + PrivKeyC = string() + OwnPrivKeyC = string() + Public = string() + AuthKey = [integer()] + PrivKey = [integer()] + usm_entry() = term() + + +

Create an entry for the agent vacm config file, + vacm.conf.

+

usm_entry/1 translates to the following call: + usm_entry("initial", "initial", zeroDotZero, usmNoAuthProtocol, "", "", usmNoPrivProtocol, "", "", "", "", "").

+

See + Security data for USM + for more info.

+ + +
+
+ + + write_usm_config(Dir, Conf) -> ok + write_usm_config(Dir, Hdr, Conf) -> ok + Write the agent usm config to the config file + + Dir = string() + Hdr = string() + Conf = [usm_entry()] + + +

Write the agent usm config to the agent usm + config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + Security data for USM + for more info.

+ + +
+
+ + + append_usm_config(Dir, Conf) -> ok + Append the agent usm config to the config file + + Dir = string() + Conf = [usm_entry()] + + +

Append the usm config to the current agent vacm + config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Security data for USM + for more info.

+ +
+
+ + + read_usm_config(Dir) -> Conf + Read the agent usm config from the config file + + Dir = string() + Conf = [usm_entry()] + + +

Read the current agent usm config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Security data for USM + for more info.

+ + +
+
+ + + notify_entry(Name, Tag, Type) -> notify_entry() + Create an notify entry + + Name = string() + Tag = string() + Type = trap | inform + community_entry() = term() + + +

Create an entry for the agent notify config file, + notify.conf.

+

Name must be a non-empty string.

+

See + Notify Definitions + for more info.

+ + +
+
+ + + write_notify_config(Dir, Conf) -> ok + write_notify_config(Dir, Hdr, Conf) -> ok + Write the agent notify config to the config file + + Dir = string() + Hdr = string() + Conf = [notify_entry()] + + +

Write the agent notify config to the agent notify + config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + Notify Definitions + for more info.

+ + +
+
+ + + append_notify_config(Dir, Conf) -> ok + Append the agent notify config to the config file + + Dir = string() + Conf = [notify_entry()] + + +

Append the notify config to the current agent notify + config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Notify Definitions + for more info.

+ + +
+
+ + + read_notify_config(Dir) -> Conf + Read the agent notify config from the config file + + Dir = string() + Conf = [community_entry()] + + +

Read the current agent notify config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Notify Definitions + for more info.

+ +
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmpa_discovery_handler.xml b/lib/snmp/doc/src/snmpa_discovery_handler.xml new file mode 100644 index 0000000000..47814221aa --- /dev/null +++ b/lib/snmp/doc/src/snmpa_discovery_handler.xml @@ -0,0 +1,118 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa_discovery_handler + + + + + + + + snmpa_discovery_handler.xml +
+ snmpa_discovery_handler + Behaviour module for the SNMP agent discovery handler. + +

This module defines the behaviour of the agent discovery + handler. A snmpa_discovery_handler compliant module + must export the following functions:

+ + +

stage1_finish/2

+
+
+

The semantics of them and their exact signatures are explained + below.

+ + +
+ + + + stage1_finish(TargetName, ManagerEngineID, ExtraInfo) -> ignore | {ok, usm_entry() | [usm_entry()]} | {ok, usm_entry() | [usm_entry()], NewExtraInfo} + Discovery stage 1 finish + + TargetName = string() + ManagerEngineID = string() + ExtraInfo = term() + usm_entry() = tuple() compatible with usm.conf + NewExtraInfo = term() + + +

This function is called at the end of stage 1 of the + discovery process. It should return either the atom + ignore or {ok, usm_entry() | [usm_entry()]}. See + usm_entry() + and + usm_entry/13 + for more info.

+ +

If the function returns ignore, then it is assumed that + either:

+ + + The caller (of the discovery function) will make the + needed updates later. + The callback function itself did the updates. + + +

In either case, the agent will do nothing, but return + the retrieved ManagerEngineID (see + discovery + for more info) and possible continue with stage 2 of + the discovery process.

+ +

The ExtraInfo argument is passed on from the + discovery + function.

+ +

This function may return an updated NewExtraInfo + that will be used in subsequent calls to the callback + functions. Intended for future use.

+ +

The purpose of this function is to generate the usm- + related security data needed for usm processing in the + agent. Specifically, updating the usmUserTable.

+ +

When an usm_entry() tuple (or a list of such + tuples) is returned, this data is then added to the + usmUserTable by the (master-) agent.

+ +

When an usm_entry() tuple (or a list of such + tuples) is returned, this data is then added to the + usmUserTable by the (master-) agent.

+ +

Note that the function does not check if this entry + already exists.

+ +

Note that this function is executed in the context of + the master-agent process.

+ +
+
+ +
+ +
+ diff --git a/lib/snmp/doc/src/snmpa_error.xml b/lib/snmp/doc/src/snmpa_error.xml new file mode 100644 index 0000000000..a7312e8b24 --- /dev/null +++ b/lib/snmp/doc/src/snmpa_error.xml @@ -0,0 +1,91 @@ + + + + +
+ + 20022009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa_error + + + + + + + + snmpa_error.xml +
+ snmpa_error + Functions for Reporting SNMP Errors + + +

The module snmpa_error contains two callback functions + which are called if an error occurs at different times during agent + operation. These functions in turn calls the corresponding function + in the configured error report module, which implements the actual + report functionality. +

+

Two simple implementation(s) is provided with the + toolkit; the modules + snmpa_error_logger + which is the default and + snmpa_error_io. +

+

The error report module is configured using the directive + error_report_mod, see + configuration parameters. +

+
+ + + config_err(Format, Args) -> void() + Called if a configuration error occurs + + Format = string() + Args = list() + + +

The function is called if an error occurs during the + configuration phase, for example if a syntax error is found in + a configuration file. +

+

Format and Args are as in + io:format(Format, Args).

+
+
+ + user_err(Format, Args) -> void() + Called if a user related error occurs + + Format = string() + Args = list() + + +

The function is called if a user related error occurs at + run-time, for example if a user defined instrumentation + function returns erroneous. +

+

Format and Args are as in + io:format(Format, Args).

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmpa_error_io.xml b/lib/snmp/doc/src/snmpa_error_io.xml new file mode 100644 index 0000000000..33fbfac20c --- /dev/null +++ b/lib/snmp/doc/src/snmpa_error_io.xml @@ -0,0 +1,88 @@ + + + + +
+ + 20022009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa_error_io + + + + + + + + snmpa_error_io.xml +
+ snmpa_error_io + Functions for Reporting SNMP Errors on stdio + +

The module snmpa_error_io implements the + snmp_error_report behaviour + (see snmpa_error_report) + containing two callback functions which are called in order to + report SNMP errors. +

+

This module provides a simple mechanism for reporting SNMP + errors. Errors are written to stdout using the io module. + It is provided as an simple example. +

+

This module needs to be explicitly configured, see + snmpa_error and + configuration parameters. +

+
+ + + config_err(Format, Args) -> void() + Called if a configuration error occurs + + Format = string() + Args = list() + + +

The function is called if an error occurs during the + configuration phase, for example if a syntax error is found in + a configuration file. +

+

Format and Args are as in + io:format(Format, Args).

+
+
+ + user_err(Format, Args) -> void() + Called if a user related error occurs + + Format = string() + Args = list() + + +

The function is called if a user related error occurs at + run-time, for example if a user defined instrumentation + function returns erroneous. +

+

Format and Args are as in + io:format(Format, Args).

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmpa_error_logger.xml b/lib/snmp/doc/src/snmpa_error_logger.xml new file mode 100644 index 0000000000..06382a6057 --- /dev/null +++ b/lib/snmp/doc/src/snmpa_error_logger.xml @@ -0,0 +1,95 @@ + + + + +
+ + 19962009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa_error_logger + + + + + + + + snmpa_error_logger.xml +
+ snmpa_error_logger + Functions for Reporting SNMP Errors through the error_logger + +

The module snmpa_error_logger implements the + snmpa_error_report behaviour + (see snmpa_error_report) + containing two callback functions which are called in order to + report SNMP errors. +

+

This module provides a simple mechanism for reporting SNMP + errors. Errors are sent to the error_logger after a + size check. Messages are truncated after 1024 chars. + It is provided as an example. +

+

This module is the default error report module, but can be + explicitly configured, see + snmpa_error and + configuration parameters. +

+
+ + + config_err(Format, Args) -> void() + Called if a configuration error occurs + + Format = string() + Args = list() + + +

The function is called if an error occurs during the + configuration phase, for example if a syntax error is found in + a configuration file. +

+

Format and Args are as in + io:format(Format, Args).

+
+
+ + user_err(Format, Args) -> void() + Called if a user related error occurs + + Format = string() + Args = list() + + +

The function is called if a user related error occurs at + run-time, for example if a user defined instrumentation + function returns erroneous. +

+

Format and Args are as in + io:format(Format, Args).

+
+
+
+ +
+ See Also +

error_logger(3)

+
+ +
+ diff --git a/lib/snmp/doc/src/snmpa_error_report.xml b/lib/snmp/doc/src/snmpa_error_report.xml new file mode 100644 index 0000000000..421202bade --- /dev/null +++ b/lib/snmp/doc/src/snmpa_error_report.xml @@ -0,0 +1,88 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa_error_report + + + + + + + + snmpa_error_report.xml +
+ snmpa_error_report + Behaviour module for reporting SNMP agent errors + + +

This module defines the behaviour of the agent error reporting. + A snmpa_error_report compliant module + must export the following functions:

+ + +

config_err/2

+
+ +

user_err/2

+
+
+

The semantics of them and their exact signatures are explained + below.

+
+ + + config_err(Format, Args) -> void() + Called if a configuration error occurs + + Format = string() + Args = list() + + +

The function is called if an error occurs during the + configuration phase, for example if a syntax error is found in + a configuration file. +

+

Format and Args are as in + io:format(Format, Args).

+
+
+ + user_err(Format, Args) -> void() + Called if a user related error occurs + + Format = string() + Args = list() + + +

The function is called if a user related error occurs at + run-time, for example if a user defined instrumentation + function returns erroneous. +

+

Format and Args are as in + io:format(Format, Args).

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmpa_local_db.xml b/lib/snmp/doc/src/snmpa_local_db.xml new file mode 100644 index 0000000000..c077bc96d8 --- /dev/null +++ b/lib/snmp/doc/src/snmpa_local_db.xml @@ -0,0 +1,190 @@ + + + + +
+ + 19962009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa_local_db + + + + + + + + snmpa_local_db.xml +
+ snmpa_local_db + The SNMP built-in database + +

The module snmpa_local_db contains functions for + implementing tables (and variables) using the SNMP built-in + database. The database exists in two instances, one volatile + and one persistent. The volatile database is implemented with + ets. The persistent database is implemented with dets. +

+

There is a scaling problem with this database. +

+ + Insertions and deletions are inefficient for large tables. + + +

This problem is best solved by using Mnesia instead. +

+

The following functions describe the interface to + snmpa_local_db. Each function has a Mnesia equivalent. + The argument NameDb is a tuple {Name, Db} where + Name is the symbolic name of the managed object (as defined + in the MIB), and Db is either volatile or + persistent. mnesia is not possible since all these + functions are snmpa_local_db specific. +

+
+ +
+ Common Data Types +

In the functions defined below, the following types are + used: +

+ + +

NameDb = {Name, Db}

+
+ +

Name = atom(), Db = volatile | persistent

+
+ +

RowIndex = [int()]

+
+ +

Cols = [Col] | [{Col, Value}], Col = int(), Value = term()

+
+
+

where RowIndex denotes the last part of the OID, that + specifies the index of the row in the table. Cols is a + list of column numbers in case of a get operation, and a list of + column numbers and values in case of a set operation. +

+
+ + + dump() -> ok | {error, Reason} + Dump the database to disk + + Reason = term() + + +

This function can be used to manually dump the database + to file.

+
+
+ + match(NameDb, Pattern) + Perform a match on the table + +

Performs an ets/dets matching on the table. + See Stdlib documentation, module ets, for a description of + Pattern and the return values.

+
+
+ + print() + print(TableName) + print(TableName, Db) + Print the database to screen + + TableName = atom() + + +

Prints the contents of the database on + screen. This is useful for debugging since the + STANDARD-MIB and OTP-SNMPEA-MIB + (and maybe your own MIBs) are stored in snmpa_local_db. +

+

TableName is an atom for a table in the database. + When no name is supplied, the whole database is shown.

+
+
+ + table_create(NameDb) -> bool() + Create a table + +

Creates a table. If the table already exist, the old copy + is destroyed. +

+

Returns false if the NameDb argument is + incorrectly specified, true otherwise.

+
+
+ + table_create_row(NameDb, RowIndex, Row) -> bool() + Create a row in a table + + Row = {Val1, Val2, ..., ValN} + Val1 = Val2 = ... = ValN = term() + + +

Creates a row in a table. Row is a tuple with + values for all columns, including the index columns.

+
+
+ + table_delete(NameDb) -> void() + Delete a table + +

Deletes a table.

+
+
+ + table_delete_row(NameDb, RowIndex) -> bool() + Delete the row in the table + +

Deletes the row in the table.

+
+
+ + table_exists(NameDb) -> bool() + Check if a table exists + +

Checks if a table exists.

+
+
+ + table_get_row(NameDb, RowIndex) -> Row | undefined + Get a row from the table + + Row = {Val1, Val2, ..., ValN} + Val1 = Val2 = ... = ValN = term() + + +

Row is a tuple with values for all columns, + including the index columns.

+
+
+
+ +
+ See Also +

ets(3), dets(3), snmp_generic(3) +

+
+ +
+ diff --git a/lib/snmp/doc/src/snmpa_mpd.xml b/lib/snmp/doc/src/snmpa_mpd.xml new file mode 100644 index 0000000000..ea5bde8956 --- /dev/null +++ b/lib/snmp/doc/src/snmpa_mpd.xml @@ -0,0 +1,159 @@ + + + + +
+ + 19992009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa_mpd + + + + + + + + snmpa_mpd.xml +
+ snmpa_mpd + Message Processing and Dispatch module for the SNMP agent + +

The module snmpa_mpd implements the version independent + Message Processing and Dispatch functionality in SNMP for the agent. + It is supposed to be used from a Network Interface process + (Definition of Agent Net if). +

+ + +
+ + + + init(Vsns) -> mpd_state() + Initialize the MPD module + + Vsns = [Vsn] + Vsn = v1 | v2 | v3 + + +

This function can be called from the net_if process at start-up. + The options list defines which versions to use. +

+

It also initializes some SNMP counters. +

+ + +
+
+ + + process_packet(Packet, TDomain, TAddress, State) -> {ok, Vsn, Pdu, PduMS, ACMData} | {discarded, Reason} | {discovery, DiscoPacket} + Process a packet received from the network + + Packet = binary() + TDomain = snmpUDPDomain + TAddress = {Ip, Udp} + Ip = {integer(), integer(), integer(), integer()} + Udp = integer() + State = mpd_state() + Vsn = 'version-1' | 'version-2' | 'version-3' + Pdu = #pdu + PduMs = integer() + ACMData = acm_data() + Reason = term() + DiscoPacket = binary() + + +

Processes an incoming packet. Performs authentication and + decryption as necessary. The return values should be passed the + agent.

+ + +
+
+ + + generate_response_msg(Vsn, RePdu, Type, ACMData) -> {ok, Packet} | {discarded, Reason} + Generate a response packet to be sent to the network + + Vsn = 'version-1' | 'version-2' | 'version-3' + RePdu = #pdu + Type = atom() + ACMData = acm_data() + Packet = binary() + + +

Generates a possibly encrypted response packet to be sent to the + network. Type is the #pdu.type of the original + request.

+ + +
+
+ + + generate_msg(Vsn, Pdu, MsgData, To) -> {ok, PacketsAndAddresses} | {discarded, Reason} + Generate a request message to be sent to the network + + Vsn = 'version-1' | 'version-2' | 'version-3' + Pdu = #pdu + MsgData = msg_data() + To = [dest_addrs()] + PacketsAndAddresses = [{TDomain, TAddress, Packet}] + TDomain = snmpUDPDomain + TAddress = {Ip, Udp} + Ip = {integer(), integer(), integer(), integer()} + Udp = integer() + Packet = binary() + + +

Generates a possibly encrypted request packet to be sent to the + network. +

+

MsgData is the message specific data used in + the SNMP message. This value is received in a send_pdu + or send_pdu_req message from the agent. In SNMPv1 and + SNMPv2c, this message data is the community string. In + SNMPv3, it is the context information. + To is a list of the destination addresses and + their corresponding security parameters. This value is + also received from the requests mentioned above. +

+ + +
+
+ + + discarded_pdu(Variable) -> void() + Increment the variable associated with a discarded pdu + + Variable = atom() + + +

Increments the variable associated with a discarded pdu. + This function can be used when the net_if process receives a + discarded_pdu message from the agent. +

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmpa_network_interface.xml b/lib/snmp/doc/src/snmpa_network_interface.xml new file mode 100644 index 0000000000..a986343a4f --- /dev/null +++ b/lib/snmp/doc/src/snmpa_network_interface.xml @@ -0,0 +1,170 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa_network_interface + + + + + + + + snmpa_network_interface.xml +
+ snmpa_network_interface + Behaviour module for the SNMP agent network interface. + +

This module defines the behaviour of the agent network + interface. A snmpa_network_interface compliant module + must export the following functions:

+ + +

start_link/4

+
+ +

info/1

+
+ +

get_log_type/1

+
+ +

set_log_type/2

+
+ +

verbosity/2

+
+
+

The semantics of them and their exact signatures are explained + below.

+

But this is not enough. There is also a set of mandatory + messages which the network interface entity must be able to + receive and be able to send. This is described in chapter + snmp_agent_netif. +

+ + +
+ + + + start_link(Prio, NoteStore, MasterAgent, Opts) -> {ok, Pid} | {error, Reason} + Start-link the network interface process + + Prio = priority() + NoteStore = pid() + MasterAgent = pid() + Opts = [opt()] + opt() = {verbosity, verbosity()} | {versions, versions()} | term() + versions() = [version()] + version() = v1 | v2 | v3 + + +

Start-link the network interface process.

+

NoteStore is the pid of the note-store process and + MasterAgent is the pid of the master-agent process.

+

Opts is an (basically) implementation dependent list of + options to the network interface process. There are however + a number of options which must be handled: + versions and verbosity.

+ + +
+
+ + + info(Pid) -> [{Key, Value}] + Return information about the running network interface process + + Pid = pid() + + +

The info returned is basically up to the implementer to decide. + This implementation provided by the application provides info about + memory allocation and various socket information.

+

The info returned by this function is returned together with other + info collected by the agent when the + info function is called + (tagged with with the key net_if).

+ + +
+
+ + + verbosity(Pid, Verbosity) -> void() + Change the verbosity of a running network interface process + + Pid = pid() + Verbosity = verbosity() + + +

Change the verbosity of a running network interface process.

+ + +
+
+ + + get_log_type(Pid) -> {ok, LogType} | {error, Reason} + Get the Audit Trail Log type + + Pid = pid() + LogType = atl_type() + Reason = term() + + +

The Audit Trail Log is managed by the network interface process. + So, it is this process that has to retrieve the actual log-type.

+ + + +
+
+ + + set_log_type(Pid, NewType) -> {ok, OldType} | {error, Reason} + Change the Audit Trail Log type + + Pid = pid() + NewType = OldType = atl_type() + Reason = term() + + +

The Audit Trail Log is managed by the network interface process. + So, it is this process that has to do the actual changing of the + type.

+

See + set_log_type + for more info.

+
+
+ +
+ + +
+ diff --git a/lib/snmp/doc/src/snmpa_network_interface_filter.xml b/lib/snmp/doc/src/snmpa_network_interface_filter.xml new file mode 100644 index 0000000000..d625fd3e4a --- /dev/null +++ b/lib/snmp/doc/src/snmpa_network_interface_filter.xml @@ -0,0 +1,163 @@ + + + + +
+ + 20072009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa_network_interface_filter + + + + + + + + snmpa_network_interface_filter.xml +
+ snmpa_network_interface_filter + Behaviour module for the SNMP agent network-interface filter. + +

This module defines the behaviour of the agent network interface + filter. A snmpa_network_interface_filter compliant module + must export the following functions:

+ + +

accept_recv/2

+
+ +

accept_send/2

+
+ +

accept_recv_pdu/3

+
+ +

accept_send_pdu/2

+
+
+

The semantics of them and their exact signatures are explained + below.

+

The purpose of the network interface filter is to allow for filtering + of messages (accept or reject) receive and send. This is done + on two levels:

+ + +

The first level is at the UDP entry / exit point, i.e. + immediately after the receipt of the message, before any message + processing is done (accept_recv) and + immediately before sending the message, after all message + processing is done (accept_send).

+
+ +

The second level is at the MPD entry / exit point, i.e. + immediately after the basic message processing (accept_recv_pdu) / + immediately before the basic message processing (accept_send_pdu).

+
+
+

Note that the network interface filter is something which is used + by the network interface implementation provided by the application + (snmpa_net_if). The default filter accepts all messages.

+

A network interface filter can e.g. be used during testing or for load + regulation. If the intended use is load regulation, see also + req_limit and + the function + register_notification_filter.

+
+ +
+ DATA TYPES + +port() = integer() > 0 +pdu_type() = 'get-request' | 'get-next-request' | 'get-response' | 'set-request' | trap | 'get-bulk-request' | 'inform-request' | report + + +
+ + + accept_recv(Ip, Port) -> boolean() + Shall the received message be accepted + + Ip = ip_address() + Port = port() + + +

Called at the reception of a message (before any processing + has been done).

+

For the message to be discarded, the function must return + false.

+ +
+
+ + accept_send(Ip, Port) -> boolean() + Shall the message be sent + + Ip = ip_address() + Port = port() + + +

Called before the sending of a message (after all processing + has been done).

+

For the message to be discarded, the function must return + false.

+ +
+
+ + accept_recv_pdu(Ip, Port, PduType) -> boolean() + Shall the received pdu be accepted + + Ip = ip_address() + Port = port() + PduType = pdu_type() + + +

Called after the basic message processing (MPD) has been done, + but before the pdu is handed over to the master-agent for + primary processing.

+

For the pdu to be discarded, the function must return + false.

+ +
+
+ + accept_send_pdu(Targets, PduType) -> Reply + Shall the pdu be sent + + Targets = targets() + targets() = [target()] + target() = {ip_address(), port()} + PduType = pdu_type() > 0 + Reply = boolean() | NewTargets + NewTargets = targets() + + +

Called before the basic message processing (MPD) is done, + when a pdu has been received from the master-agent.

+

For the message to be discarded all together, the function + must return false.

+

Note that it is possible for this function to filter out targets + (but not add it's own) by returning an updated + Targets list (NewTargets).

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmpa_notification_delivery_info_receiver.xml b/lib/snmp/doc/src/snmpa_notification_delivery_info_receiver.xml new file mode 100644 index 0000000000..c52479f76a --- /dev/null +++ b/lib/snmp/doc/src/snmpa_notification_delivery_info_receiver.xml @@ -0,0 +1,120 @@ + + + + +
+ + 2008 + 2009 + Ericsson AB, All Rights Reserved + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + The Initial Developer of the Original Code is Ericsson AB. + + + snmpa_notification_delivery_info_receiver + + + + + + + + snmpa_notification_delivery_info_receiver.xml +
+ snmpa_notification_delivery_info_receiver + + Behaviour module for the SNMP agent notification delivery + information receiver. + + +

This module defines the behaviour of the notification + delivery information receiver.

+

A snmpa_notification_delivery_info_receiver compliant module + must export the following functions:

+ + +

delivery_targets/3

+
+ +

delivery_info/4

+
+
+

The semantics of them and their exact signatures are explained + below.

+ +
+ +
+ DATA TYPES + + + +
+ + + + delivery_targets(Tag, Targets, Extra) -> void() + Inform about target addresses + + Tag = term() + Targets = [target()] + target() = {Address, Port} + Address = address() + Port = integer() + Extra = term() + + +

Inform about target addresses.

+

This is the first function called when a notification delivery is + in progress. It informs the receiver which targets will + get the notification. The result of the delivery will be + provided via successive calls to delivery_info/4 function, + see below.

+ + +
+
+ + + delivery_info(Tag, Target, DeliveryResult, Extra) -> void() + Inform about delivery result + + Tag = term() + Target = target() + target() = {Address, Port} + Address = address() + Port = integer() + DeliveryResult = delivery_result() + delivery_result() = no_response | got_response + Extra = term() + + +

Inform about delivery result.

+

This function is called for each target in the Targets + argument of the delivery_targets/3 function, see above.

+

The purpose is to inform the receiver of the + result of the delivery (was the notification acknowledged or + not) for each target.

+ +
+
+ +
+ + +
+ diff --git a/lib/snmp/doc/src/snmpa_notification_filter.xml b/lib/snmp/doc/src/snmpa_notification_filter.xml new file mode 100644 index 0000000000..c3b300ecab --- /dev/null +++ b/lib/snmp/doc/src/snmpa_notification_filter.xml @@ -0,0 +1,73 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa_notification_filter + + + + + + + + snmpa_notification_filter.xml +
+ snmpa_notification_filter + Behaviour module for the SNMP agent notification filters. + +

This module defines the behaviour of the agent notification + filters. A snmpa_notification_filter compliant module + must export the following functions:

+ + +

handle_notification/2

+
+
+

The semantics of them and their exact signatures are explained + below.

+

The purpose of notification filters is to allow for modification + and/or suppression of a notification.

+

A misbehaving filter will be removed.

+
+ + + handle_notification(Notif, Data) -> Reply + Handle a notification + + Reply = send | {send, NewNotif} | dont_send + Notif = NewNotif = notification() | trap() + Data = term() + + +

Handle a notification to be sent. The filter can either + accept the notification as is, return send, modify + the notification, return {send, NewNotif} or + suppress the notification, return dont_send.

+

Data is supplied at filter registration time, + see register_notification_filter. +

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmpa_supervisor.xml b/lib/snmp/doc/src/snmpa_supervisor.xml new file mode 100644 index 0000000000..89b4eb8d54 --- /dev/null +++ b/lib/snmp/doc/src/snmpa_supervisor.xml @@ -0,0 +1,117 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpa_supervisor + + + + + + + + snmpa_supervisor.xml +
+ snmpa_supervisor + A supervisor for the SNMP agent Processes + +

This is the top supervisor for the agent part of the SNMP + application. There is always one supervisor at each node with + an SNMP agent (master agent or sub-agent). +

+
+ + + start_sub_sup(Opts) -> {ok, pid()} | {error, {already_started, pid()}} | {error, Reason} + Start the SNMP supervisor for sub-agents only + + Opts = [opt()] + opt() = {db_dir, string()} | ... + + +

Starts a supervisor for the SNMP agent system without a + master agent. The supervisor starts all involved SNMP + processes, but no agent processes. Sub-agents should be + started by calling start_sub_agent/3. +

+

db_dir is mandatory.

+

See configuration parameters for + a description of the options.

+
+
+ + start_master_sup(Opts) -> {ok, pid()} | {error, {already_started, pid()}} | {error, Reason} + Start the SNMP supervisor for all agents + + Opts = [opt()] + opt() = {db_dir, string()} | {config, ConfOpts()} | ... + ConfOpts = [conf_opts()] + conf_opts() = {dir, string()} | ... + Reason = term() + + +

Starts a supervisor for the SNMP agent system. The + supervisor starts all involved SNMP processes, including the + master agent. Sub-agents should be started by calling + start_subagent/3. +

+

db_dir is mandatory.

+

dir in config is mandatory.

+

See snmp config for + a description of the options.

+
+
+ + start_sub_agent(ParentAgent,Subtree,Mibs) -> {ok, pid()} | {error, Reason} + Start a sub-agent + + ParentAgent = pid() + SubTree = oid() + Mibs = [MibName] + MibName = [string()] + + +

Starts a sub-agent on the node where the function is + called. The snmpa_supervisor must be running. +

+

If the supervisor is not running, the function fails with the + reason badarg.

+
+
+ + stop_sub_agent(SubAgent) -> ok | no_such_child + Stop a sub-agent + + SubAgent = pid() + + +

Stops the sub-agent on the node where the function is + called. The snmpa_supervisor must be running. +

+

If the supervisor is not running, the function fails with the + reason badarg.

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmpc.xml b/lib/snmp/doc/src/snmpc.xml new file mode 100644 index 0000000000..48d63d6c91 --- /dev/null +++ b/lib/snmp/doc/src/snmpc.xml @@ -0,0 +1,201 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpc + + + + + + + + snmpc.xml +
+ snmpc + Interface Functions to the SNMP toolkit MIB compiler + +

The module snmpc contains interface functions to the + SNMP toolkit MIB compiler.

+ +
+ + + + compile(File) + compile(File, Options) -> {ok, BinFileName} | {error, Reason} + Compile the specified MIB + + File = string() + Options = [opt()] + opt() = db() | deprecated() | description() | reference() | group_check() | i() | il() | imports() | module() | module_identity() | outdir() | no_defs() | verbosity() | warnings() + db() = {db, volatile|persistent|mnesia} + deprecated() = {deprecated, bool()} + description() = description + reference() = reference + group_check() = {group_check, bool()} + i() = {i, [dir()]} + il() = {il, [dir()]} + imports() = imports + module() = {module, atom()} + module_identity() = module_identity + no_defs() = no_defs + outdir() = {outdir, dir()} + verbosity() = {verbosity, silence|warning|info|log|debug|trace} + warnings() = {warnings, bool()} + dir() = string() + BinFileName = string() + + + +

Compiles the specified MIB file .mib]]>. The + compiled file BinFileName is called + .bin]]>.

+ + The option db specifies which database should + be used for the default instrumentation. Default is + volatile. + + The option deprecated specifies if a deprecated + definition should be kept or not. If the option is + false the MIB compiler will ignore all deprecated + definitions. Default is true. + + The option description specifies if the text + of the DESCRIPTION field will be included or not. By default + it is not included, but if this option is present it will + be. + + The option reference specifies if the text + of the REFERENCE field, when found in a table definition, + will be included or not. By default + it is not included, but if this option is present it will + be. The reference text will be placed in the allocList field + of the mib-entry record (#me{}) for the table. + + The option group_check specifies whether the + mib compiler should check the OBJECT-GROUP macro and + the NOTIFICATION-GROUP macro for correctness or not. + Default is true. + + The option i specifies the path to search for + imported (compiled) MIB files. The directories should be + strings with a trailing directory delimiter. Default is + ["./"]. + + The option il (include_lib) also specifies a + list of directories to search for imported MIBs. It + assumes that the first element in the directory name + corresponds to an OTP application. The compiler will find + the current installed version. For example, the value + ["snmp/mibs/"] will be replaced by ["snmp-3.1.1/mibs/"] + (or what the current version may be in the system). The + current directory and the /priv/mibs/]]> + are always listed last in the include path. + + The option imports, if present, specifies that the + IMPORT statement of the MIB shall be included in the compiled mib. + + The option module, if present, specifies the + name of a module which implements all instrumentation + functions for the MIB. The name of all instrumentation + functions must be the same as the corresponding managed + object it implements. + + The option module_identity, if present, specifies + that the info part of the MODULE-IDENTITY statement of the MIB + shall be included in the compiled mib. + + The option no_defs, if present, specifies + that if a managed object does not have an instrumentation + function, the default instrumentation function should NOT + be used, instead this is reported as an error, and the + compilation aborts. + + The option verbosity specifies the verbosity of + the SNMP mib compiler. I.e. if warning, info, log, debug + and trace messages shall be shown. Default is silence. + Note that if the option warnings is true and the + option verbosity is silence, warning messages will + still be shown. + + The option warnings specifies whether warning + messages should be shown. Default is true. + + +

The MIB compiler understands both SMIv1 and SMIv2 MIBs. It + uses the MODULE-IDENTITY statement to determine if the MIB is + version 1 or 2. +

+

The MIB compiler can be invoked from the OS command line by + using the command erlc. erlc recognizes the + extension .mib, and invokes the SNMP MIB compiler for + files with that extension. The options db, + group_check, deprecated, description, + verbosity, imports and module_identity + have to be specified to erlc using the syntax + +term. See erlc(1) for details. +

+
+
+ + is_consistent(Mibs) -> ok | {error, Reason} + Check for OID conflicts between MIBs + + Mibs = [MibName] + MibName = string() + + +

Checks for multiple usage of object identifiers and traps + between MIBs. +

+
+
+ + mib_to_hrl(MibName) -> ok | {error, Reason} + Generate constants for the objects in the MIB + + MibName = string() + + +

Generates a .hrl file with definitions of Erlang + constants for the objects in the MIB. The .hrl file is + called .hrl]]>. The MIB must be compiled, and + present in the current directory. +

+

The mib_to_hrl generator can be invoked from the OS + command line by using the command erlc. erlc + recognizes the extension .bin, and invokes this function + for files with that extension. +

+
+
+
+ +
+ See Also +

erlc(1) +

+
+ +
+ diff --git a/lib/snmp/doc/src/snmpm.xml b/lib/snmp/doc/src/snmpm.xml new file mode 100644 index 0000000000..9e7ac75daf --- /dev/null +++ b/lib/snmp/doc/src/snmpm.xml @@ -0,0 +1,1043 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpm + + + + + + + + snmpm.xml +
+ snmpm + Interface functions to the SNMP toolkit manager + +

The module snmpm contains interface functions to the + SNMP manager.

+
+ +
+ Common Data Types +

The following data types are used in the functions below:

+ + + +
+ + + monitor() -> Ref + Monitor the snmp manager + + Ref = reference() + + +

Monitor the SNMP manager. In case of a crash, the calling + (monitoring) process will get a 'DOWN' message (see the erlang + module for more info).

+ + +
+
+ + + demonitor(Ref) -> void() + Turn off monitoring of the snmp manager + + Ref = reference() + + +

Turn off monitoring of the SNMP manager.

+ + +
+
+ + + notify_started(Timeout) -> Pid + Request to be notified when manager started + + Timeout = integer() + Pid = pid() + + +

Request a notification (message) when the SNMP manager has + started.

+

The Timeout is the time the request is valid. The + value has to be greater then zero.

+

The Pid is the process handling the supervision of the + SNMP manager start. When the manager has started a completion + message will be sent to the client from this process: + {snmpm_started, Pid}. If the SNMP manager was not started + in time, a timeout message will be sent to the client: + {snmpm_start_timeout, Pid}.

+

A client application that is dependent on the SNMP manager + will use this function in order to be notified of when the + manager has started. There are two situations when this + is useful:

+ + +

During the start of a system, when a client application + could start prior to the SNMP manager but is dependent + upon it, and therefor has to wait for it to start.

+
+ +

When the SNMP manager has crashed, the dependent client + application has to wait for the SNMP manager to be restarted + before it can reconnect.

+
+
+

The function returns the pid() of a handler process, that does + the supervision on behalf of the client application. Note that the + client application is linked to this handler.

+

This function is used in conjunction with the monitor function.

+ + +
+
+ + + cancel_notify_started(Pid) -> void() + Cancel request to be notified when manager started + + Pid = pid() + + +

Cancel a previous request to be notified of SNMP manager start.

+ + +
+
+ + + register_user(Id, Module, Data) -> ok | {error, Reason} + register_user(Id, Module, Data, DefaultAgentConfig) -> ok | {error, Reason} + Register a user of the manager + + Id = term() + Module = snmpm_user() + Data = term() + DefaultAgentConfig = [default_agent_config()] + default_agent_config() = {Item, Val} + Item = community | timeout | max_message_size | version | sec_model | sec_name | sec_level + Val = term() + Reason = term() + snmpm_user() = Module implementing the snmpm_user behaviour + + +

Register the manager entity (=user) responsible for specific + agent(s).

+ +

Module is the callback module (snmpm_user behaviour) which + will be called whenever something happens (detected + agent, incoming reply or incoming trap/notification). + Note that this could have already been done as a + consequence of the node config. (see users.conf).

+ +

The argument DefaultAgentConfig is used as default values when + this user register agents.

+ +

The type of Val depends on Item:

+ + + +
+
+ + + register_user_monitor(Id, Module, Data) -> ok | {error, Reason} + register_user_monitor(Id, Module, Data, DefaultAgentConfig) -> ok | {error, Reason} + Register a monitored user of the manager + + Id = term() + Module = snmpm_user() + DefaultAgentConfig = [default_agent_config()] + default_agent_config() = {Item, Val} + Item = community | timeout | max_message_size | version | sec_model | sec_name | sec_level + Val = term() + Data = term() + Reason = term() + snmpm_user() = Module implementing the snmpm_user behaviour + + +

Register the monitored manager entity (=user) responsible + for specific agent(s).

+ +

The process performing the registration will be monitored. + Which means that if that process should die, all agents + registered by that user process will be unregistered. All + outstanding requests will be canceled.

+ +

Module is the callback module (snmpm_user behaviour) which + will be called whenever something happens (detected + agent, incoming reply or incoming trap/notification). + Note that this could have already been done as a + consequence of the node config. (see users.conf).

+ +

The argument DefaultAgentConfig is used as default values when + this user register agents.

+ +

The type of Val depends on Item:

+ + + +
+
+ + + unregister_user(Id) -> ok | {error, Reason} + Unregister the user + + Id = term() + + +

Unregister the user.

+ + +
+
+ + + which_users() -> Users + Get a list of all users + + Users = [UserId] + UserId = term() + + +

Get a list of the identities of all registered users.

+ + +
+
+ + + register_agent(UserId, TargetName, Config) -> ok | {error, Reason} + Register this agent + + UserId = term() + Addr = ip_address() + TargetName = target_name() + Config = [agent_config()] + agent_config() = {Item, Val} + Item = engine_id | address | port | community | timeout | max_message_size | version | sec_model | sec_name | sec_level + Val = term() + Reason = term() + + +

Explicitly instruct the manager to handle this agent, with + UserId as the responsible user.

+

Called to instruct the manager that this agent + shall be handled. This function is used when + the user knows in advance which agents the + manager shall handle. + Note that there is an alternate way to do the same thing: + Add the agent to the manager config files (see + agents.conf).

+

TargetName is a non-empty string, + uniquely identifying the agent.

+

The type of Val depends on Item:

+ +

Note that if no Port is given, the default value is used.

+ + +
+
+ + + unregister_agent(UserId, TargetName) -> ok | {error, Reason} + Unregister the user + + UserId = term() + TargetName = target_name() + + +

Unregister the agent.

+ + +
+
+ + + agent_info(TargetName, Item) -> {ok, Val} | {error, Reason} + Retrieve agent config + + TargetName = target_name() + Item = atom() + Reason = term() + + +

Retrieve agent config.

+ + +
+
+ + + update_agent_info(UserId, TargetName, Item, Val) -> ok | {error, Reason} + Update agent config + + UserId = term() + TargetName = target_name() + Item = atom() + Val = term() + Reason = term() + + +

Update agent config.

+ + +
+
+ + + which_agents() -> Agents + which_agents(UserId) -> Agents + List the registered agents + + UserId = term() + Agents = [TargetName] + TargetName = target_name() + + +

Get a list of all registered agents or all agents registered + by a specific user.

+ + +
+
+ + + register_usm_user(EngineID, UserName, Conf) -> ok | {error, Reason} + Register this USM user + + EngineID = string() + UserName = string() + Conf = [usm_config()] + usm_config() = {Item, Val} + Item = sec_name | auth | auth_key | priv | priv_key + Val = term() + Reason = term() + + +

Explicitly instruct the manager to handle this USM user. + Note that there is an alternate way to do the same thing: + Add the usm user to the manager config files (see + usm.conf).

+

The type of Val depends on Item:

+ + + +
+
+ + + unregister_usm_user(EngineID, UserName) -> ok | {error, Reason} + Unregister this USM user + + EngineID = string() + UserName = string() + Reason = term() + + +

Unregister this USM user.

+ + +
+
+ + + usm_user_info(EngineID, UserName, Item) -> {ok, Val} | {error, Reason} + Retrieve usm user config + + EngineID = string() + UsmName = string() + Item = sec_name | auth | auth_key | priv | priv_key + Reason = term() + + +

Retrieve usm user config.

+ + +
+
+ + + update_usm_user_info(EngineID, UserName, Item, Val) -> ok | {error, Reason} + Update agent config + + EngineID = string() + UsmName = string() + Item = sec_name | auth | auth_key | priv | priv_key + Val = term() + Reason = term() + + +

Update usm user config.

+ + +
+
+ + + which_usm_users() -> UsmUsers + List all the registered usm users + + UsmUsers = [{EngineID,UserName}] + EngineID = string() + UsmName = string() + + +

Get a list of all registered usm users.

+ + +
+
+ + + which_usm_users(EngineID) -> UsmUsers + List the registered usm users + + UsmUsers = [UserName] + UserName = string() + + +

Get a list of all registered usm users with engine-id + EngineID.

+ + +
+
+ + + sync_get(UserId, TargetName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_get(UserId, TargetName, ContextName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_get(UserId, TargetName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_get(UserId, TargetName, ContextName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_get(UserId, TargetName, ContextName, Oids, Timeout, ExtraInfo) -> {ok, SnmpReply, Remaining} | {error, Reason} + Synchronous get-request + + UserId = term() + TargetName = target_name() + ContextName = string() + Oids = [oid()] + Timeout = integer() + ExtraInfo = term() + SnmpReply = snmp_reply() + Remaining = integer() + Reason = {send_failed, ReqId, R} | {invalid_sec_info, SecInfo, SnmpInfo} | term() + R = term() + SecInfo = [sec_info()] + sec_info() = {sec_tag(), ExpectedValue, ReceivedValue} + sec_tag() = atom() + ExpectedValue = ReceivedValue = term() + SnmpInfo = term() + + +

Synchronous get-request.

+

Remaining is the remaining time of the given or + default timeout time.

+

When Reason is {send_failed, ...} it means that + the net_if process failed to send the message. This could happen + because of any number of reasons, i.e. encoding error. R + is the actual reason in this case.

+

ExtraInfo is an opaque data structure passed on to + the net-if process. The net-if process included in this + application makes no use of this info, so the only use for it + in such a configuration (when using the built in net-if) would + be tracing.

+

For SnmpInfo, see the user callback function + handle_report.

+ + +
+
+ + + async_get(UserId, TargetName, Oids) -> {ok, ReqId} | {error, Reason} + async_get(UserId, TargetName, ContextName, Oids) -> {ok, ReqId} | {error, Reason} + async_get(UserId, TargetName, Oids, Expire) -> {ok, ReqId} | {error, Reason} + async_get(UserId, TargetName, ContextName, Oids, Expire) -> {ok, ReqId} | {error, Reason} + async_get(UserId, TargetName, ContextName, Oids, Expire, ExtraInfo) -> {ok, ReqId} | {error, Reason} + Asynchronous get-request + + UserId = term() + TargetName = target_name() + ContextName = string() + Oids = [oid()] + Expire = integer() + ExtraInfo = term() + ReqId = term() + Reason = term() + + +

Asynchronous get-request.

+

The reply, if it arrives, will be delivered to the user + through a call to the snmpm_user callback function + handle_pdu.

+

The Expire time indicates for how long the request is + valid (after which the manager is free to delete it).

+

ExtraInfo is an opaque data structure passed on to + the net-if process. The net-if process included in this + application makes no use of this info, so the only use for it + in such a configuration (when using the built in net-if) would + be tracing.

+ + +
+
+ + + sync_get_next(UserId, TargetName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_get_next(UserId, TargetName, ContextName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_get_next(UserId, TargetName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_get_next(UserId, TargetName, ContextName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_get_next(UserId, TargetName, ContextName, Oids, Timeout, ExtraInfo) -> {ok, SnmpReply, Remaining} | {error, Reason} + Synchronous get-next-request + + UserId = term() + TargetName = target_name() + ContextName = string() + Oids = [oid()] + Timeout = integer() + ExtraInfo = term() + SnmpReply = snmp_reply() + Remaining = integer() + Reason = {send_failed, ReqId, R} | {invalid_sec_info, SecInfo, SnmpInfo} | term() + R = term() + + +

Synchronous get-next-request.

+

Remaining time of the given or default timeout time.

+

When Reason is {send_failed, ...} it means that + the net_if process failed to send the message. This could happen + because of any number of reasons, i.e. encoding error. R + is the actual reason in this case.

+

ExtraInfo is an opaque data structure passed on to + the net-if process. The net-if process included in this + application makes no use of this info, so the only use for it + in such a configuration (when using the built in net-if) would + be tracing.

+ + +
+
+ + + async_get_next(UserId, TargetName, Oids) -> {ok, ReqId} | {error, Reason} + async_get_next(UserId, TargetName, ContextName, Oids) -> {ok, ReqId} | {error, Reason} + async_get_next(UserId, TargetName, Oids, Expire) -> {ok, ReqId} | {error, Reason} + async_get_next(UserId, TargetName, ContextName, Oids, Expire) -> {ok, ReqId} | {error, Reason} + async_get_next(UserId, TargetName, ContextName, Oids, Expire, ExtraInfo) -> {ok, ReqId} | {error, Reason} + Asynchronous get-next-request + + UserId = term() + TargetName = target_name() + ContextName = string() + Oids = [oid()] + Expire = integer() + ExtraInfo = term() + ReqId = integer() + Reason = term() + + +

Asynchronous get-next-request.

+

The reply will be delivered to the user through a call + to the snmpm_user callback function handle_pdu.

+

The Expire time indicates for how long the request is + valid (after which the manager is free to delete it).

+ + +
+
+ + + sync_set(UserId, TargetName, VarsAndVals) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_set(UserId, TargetName, ContextName, VarsAndVals) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_set(UserId, TargetName, VarsAndVals, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_set(UserId, TargetName, ContextName, VarsAndVals, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_set(UserId, TargetName, ContextName, VarsAndVals, Timeout, ExtraInfo) -> {ok, SnmpReply, Remaining} | {error, Reason} + Synchronous set-request + + UserId = term() + TargetName = target_name() + ContextName = string() + VarsAndVals = vars_and_vals() + Timeout = integer() + ExtraInfo = term() + SnmpReply = snmp_reply() + Remaining = integer() + Reason = {send_failed, ReqId, ActualReason} | {invalid_sec_info, SecInfo, SnmpInfo} | term() + ActualReason = term() + + +

Synchronous set-request.

+

Remaining time of the given or default timeout time.

+

When Reason is {send_failed, ...} it means that + the net_if process failed to send the message. This could happen + because of any number of reasons, i.e. encoding error. R + is the actual reason in this case.

+

When var_and_val() is {oid(), value()}, the + manager makes an educated guess based on the loaded mibs.

+

ExtraInfo is an opaque data structure passed on to + the net-if process. The net-if process included in this + application makes no use of this info, so the only use for it + in such a configuration (when using the built in net-if) would + be tracing.

+ + +
+
+ + + async_set(UserId, TargetName, VarsAndVals) -> {ok, ReqId} | {error, Reason} + async_set(UserId, TargetName, ContextName, VarsAndVals) -> {ok, ReqId} | {error, Reason} + async_set(UserId, TargetName, VarsAndVals, Expire) -> {ok, ReqId} | {error, Reason} + async_set(UserId, TargetName, ContextName, VarsAndVals, Expire) -> {ok, ReqId} | {error, Reason} + async_set(UserId, TargetName, ContextName, VarsAndVals, Expire, ExtraInfo) -> {ok, ReqId} | {error, Reason} + Asynchronous set-request + + UserId = term() + TargetName = target_name() + VarsAndVals = vars_and_vals() + Expire = integer() + ExtraInfo = term() + ReqId = term() + Reason = term() + + +

Asynchronous set-request.

+

The reply will be delivered to the user through a call + to the snmpm_user callback function handle_pdu.

+

The Expire time indicates for how long the request is + valid (after which the manager is free to delete it).

+

When var_and_val() is {oid(), value()}, the + manager makes an educated guess based on the loaded mibs.

+

ExtraInfo is an opaque data structure passed on to + the net-if process. The net-if process included in this + application makes no use of this info, so the only use for it + in such a configuration (when using the built in net-if) would + be tracing.

+ + +
+
+ + + sync_get_bulk(UserId, TragetName, NonRep, MaxRep, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_get_bulk(UserId, TragetName, NonRep, MaxRep, ContextName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_get_bulk(UserId, TragetName, NonRep, MaxRep, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_get_bulk(UserId, TragetName, NonRep, MaxRep, ContextName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason} + sync_get_bulk(UserId, TragetName, NonRep, MaxRep, ContextName, Oids, Timeout, ExtraInfo) -> {ok, SnmpReply, Remaining} | {error, Reason} + Synchronous get-bulk-request + + UserId = term() + TargetName = target_name() + NonRep = integer() + MaxRep = integer() + ContextName = string() + Oids = [oid()] + Timeout = integer() + ExtraInfo = term() + SnmpReply = snmp_reply() + Remaining = integer() + Reason = {send_failed, ReqId, R} | {invalid_sec_info, SecInfo, SnmpInfo} | term() + + +

Synchronous get-bulk-request (See RFC1905).

+

Remaining time of the given or default timeout time.

+

When Reason is {send_failed, ...} it means that + the net_if process failed to send the message. This could happen + because of any number of reasons, i.e. encoding error. R + is the actual reason in this case.

+

ExtraInfo is an opaque data structure passed on to + the net-if process. The net-if process included in this + application makes no use of this info, so the only use for it + in such a configuration (when using the built in net-if) would + be tracing.

+ + +
+
+ + + async_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids) -> {ok, ReqId} | {error, Reason} + async_get_bulk(UserId, TargetName, NonRep, MaxRep, ContextName, Oids) -> {ok, ReqId} | {error, Reason} + async_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids, Expire) -> {ok, ReqId} | {error, Reason} + async_get_bulk(UserId, TargetName, NonRep, MaxRep, ContextName, Oids, Expire) -> {ok, ReqId} | {error, Reason} + async_get_bulk(UserId, TargetName, NonRep, MaxRep, ContextName, Oids, Expire, ExtraInfo) -> {ok, ReqId} | {error, Reason} + Asynchronous get-bulk-request + + UserId = term() + TargetName = target_name() + NonRep = integer() + MaxRep = integer() + ContextName = string() + Oids = [oid()] + Expire = integer() + ExtraInfo = term() + ReqId = integer() + Reason = term() + + +

Asynchronous get-bulk-request (See RFC1905).

+

The reply will be delivered to the user through a call + to the snmpm_user callback function handle_pdu.

+

The Expire time indicates for how long the request is + valid (after which the manager is free to delete it).

+ + +
+
+ + + cancel_async_request(UserId, ReqId) -> ok | {error, Reason} + Cancel a asynchronous request + + UserId = term() + ReqId = term() + Reason = term() + + +

Cancel a previous asynchronous request.

+ + +
+
+ + + log_to_txt(LogDir, Mibs) + log_to_txt(LogDir, Mibs, OutFile) -> ok | {error, Reason} + log_to_txt(LogDir, Mibs, OutFile, LogName) -> ok | {error, Reason} + log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile) -> ok | {error, Reason} + log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start) -> ok | {error, Reason} + log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start, Stop) -> ok | {error, Reason} + Convert an Audit Trail Log to text format + + LogDir = string() + Mibs = [MibName] + MibName = string() + OutFile = string() + LogName = string() + LogFile = string() + Start = Stop = null | datetime() | {local_time,datetime()} | {universal_time,datetime()} + Reason = disk_log_open_error() | file_open_error() | term() + disk_log_open_error() = {LogName, term()} + file_open_error() = {OutFile, term()} + + +

Converts an Audit Trail Log to a readable text file. + OutFile defaults to "./snmpm_log.txt". + LogName defaults to "snmpm_log". + LogFile defaults to "snmpm.log". + See snmp:log_to_txt + for more info.

+ + +
+
+ + + change_log_size(NewSize) -> ok | {error, Reason} + Change the size of the Audit Trail Log + + NewSize = {MaxBytes, MaxFiles} + MaxBytes = integer() + MaxFiles = integer() + Reason = term() + + +

Changes the log size of the Audit Trail Log. The application must + be configured to use the audit trail log function. Please refer to + disk_log(3) in Kernel Reference Manual for a description of how to + change the log size. +

+

The change is permanent, as long as the log is not deleted. + That means, the log size is remembered across reboots.

+ + +
+
+ + + set_log_type(NewType) -> {ok, OldType} | {error, Reason} + Change the Audit Trail Log type + + NewType = OldType = atl_type() + Reason = term() + + +

Changes the run-time Audit Trail log type.

+

Note that this has no effect on the application configuration as + defined by configuration files, so a node restart will revert the + config to whatever is in those files.

+

This function is primarily useful in testing/debugging + scenarios.

+ + +
+
+ + + load_mib(Mib) -> ok | {error, Reason} + Load a MIB into the manager + + Mib = MibName + MibName = string() + Reason = term() + + +

Load a Mib into the manager. The MibName is the + name of the Mib, including the path to where the compiled mib is + found. For example,

+ + Dir = code:priv_dir(my_app) ++ "/mibs/", + snmpm:load_mib(Dir ++ "MY-MIB"). + + + +
+
+ + + unload_mib(Mib) -> ok | {error, Reason} + Unload a MIB from the manager + + Mib = MibName + MibName = string() + Reason = term() + + +

Unload a Mib from the manager. The MibName is the + name of the Mib, including the path to where the compiled mib is + found. For example,

+ + Dir = code:priv_dir(my_app) ++ "/mibs/", + snmpm:unload_mib(Dir ++ "MY-MIB"). + + + +
+
+ + + which_mibs() -> Mibs + Which mibs are loaded into the manager + + Mibs = [{MibName, MibFile}] + MibName = atom() + MibFile = string() + + +

Get a list of all the mib's loaded into the manager.

+ + +
+
+ + + name_to_oid(Name) -> {ok, Oids} | {error, Reason} + Get all the possible oid's for an alias-name + + Name = atom() + Oids = [oid()] + + +

Transform a alias-name to it's oid.

+

Note that an alias-name is only unique within the mib, so + when loading several mib's into a manager, there might be + several instances of the same aliasname.

+ + +
+
+ + + oid_to_name(Oid) -> {ok, Name} | {error, Reason} + Get the alias-name of the oid + + Oid = oid() + Name = atom() + Reason = term() + + +

Transform a oid to it's aliasname.

+ + +
+
+ + + oid_to_type(Oid) -> {ok, Type} | {error, Reason} + Get the type of the the oid + + Oid = oid() + Type = atom() + Reason = term() + + +

Retreive the type (asn1 bertype) of an oid.

+ + +
+
+ + + backup(BackupDir) -> ok | {error, Reason} + Backup manager data + + BackupDir = string() + + +

Backup persistent data handled by the manager.

+

BackupDir cannot be identical to DbDir.

+ + +
+
+ + + info() -> [{Key, Value}] + Return information about the manager + + Key = atom() + Value = term() + + +

Returns a list (a dictionary) containing information about + the manager. Information includes statistics counters, + miscellaneous info about each process (e.g. memory allocation), + and so on.

+ + +
+
+ + + verbosity(Ref, Verbosity) -> void() + Assign a new verbosity for the process + + Ref = server | config | net_if | note_store | all + Verbosity = verbosity() + verbosity() = silence | info | log | debug | trace + + +

Sets verbosity for the designated process. For the lowest + verbosity silence, nothing is printed. The higher the + verbosity, the more is printed.

+ + +
+
+ + + format_reason(Reason) -> string() + format_reason(Prefix, Reason) -> string() + Assign a new verbosity for the process + + Reason = term() + Prefix = integer() | string() + + +

This utility function is used to create a formatted + (pretty printable) string of the error reason received + from either: +

+ + +

The Reason returned value if any of the + sync/async get/get-next/set/get-bulk + functions returns {error, Reason}

+
+ +

The Reason parameter in the + handle_error user callback function.

+
+
+

Prefix should either be an indention string + (e.g. a list of spaces) or a positive integer (which will be used + to create the indention string of that length).

+
+
+
+ + +
+ diff --git a/lib/snmp/doc/src/snmpm_conf.xml b/lib/snmp/doc/src/snmpm_conf.xml new file mode 100644 index 0000000000..177e29faa3 --- /dev/null +++ b/lib/snmp/doc/src/snmpm_conf.xml @@ -0,0 +1,364 @@ + + + + +
+ + 20062009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpm_conf + + + + + + + + snmpm_conf.xml +
+ snmpm_conf + Utility functions for handling the manager config files. + +

The module snmpm_conf contains various utility functions to + used for manipulating (write/append/read) the config files of the + SNMP manager.

+ +
+ + + manager_entry(Tag, Val) -> manager_entry() + Create an manager entry + + Tag = address | port | engine_id | max_message_size + Val = term() + manager_entry() = term() + + +

Create an entry for the manager config file, + manager.conf.

+

The type of Val depends on the value of Tag, + see + Manager Information + for more info.

+ +
+
+ + write_manager_config(Dir, Conf) -> ok + write_manager_config(Dir, Hdr, Conf) -> ok + Write the manager config to the config file + + Dir = string() + Hdr = string() + Conf = [manager_entry()] + + +

Write the manager config to the manager config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + Manager Information + for more info.

+ +
+
+ + append_manager_config(Dir, Conf) -> ok + Append the manager config to the config file + + Dir = string() + Conf = [manager_entry()] + + +

Append the config to the current manager config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Manager Information + for more info.

+ +
+
+ + read_manager_config(Dir) -> Conf + Read the manager config from the config file + + Dir = string() + Conf = [manager_entry()] + + +

Read the current manager config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Manager Information + for more info.

+ +
+
+ + users_entry(UserId) -> users_entry() + users_entry(UserId, UserMod) -> users_entry() + users_entry(UserId, UserMod, UserData) -> users_entry() + Create an users entry + + UserId = term() + UserMod = atom() + UserData = term() + standard_entry() = term() + + +

Create an entry for the manager users config file, + users.conf.

+

users_entry(UserId) translates to the following call: + users_entry(UserId, snmpm_user_default).

+

users_entry(UserId, UserMod) translates to the following + call: users_entry(UserId, UserMod, undefined).

+

See + Users + for more info.

+ +
+
+ + write_users_config(Dir, Conf) -> ok + write_users_config(Dir, Hdr, Conf) -> ok + Write the manager users config to the config file + + Dir = string() + Hdr = string() + Conf = [users_entry()] + + +

Write the manager users config to the manager users + config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + Users + for more info.

+ +
+
+ + append_users_config(Dir, Conf) -> ok + Append the manager users config to the config file + + Dir = string() + Conf = [users_entry()] + + +

Append the users config to the current manager users + config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Users + for more info.

+ +
+
+ + read_users_config(Dir) -> Conf + Read the manager users config from the config file + + Dir = string() + Conf = [users_entry()] + + +

Read the current manager users config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Users + for more info.

+ +
+
+ + agents_entry(UserId, TargetName, Comm, Ip, Port, EngineID, Timeout, MaxMessageSize, Version, SecModel, SecName, SecLevel) -> agents_entry() + Create an agents entry + + UserId = term() + TargetName = string() + Comm = string() + Ip = string() + Port = integer() + EngineID = string() + Timeout = integer() + MaxMessageSize = integer() + Version = v1 | v2 | v3 + SecModel = v1 | v2c | usm + SecName = string() + SecLevel = noAuthNoPriv | authNoPriv | authPriv + agents_entry() = term() + + +

Create an entry for the manager agents config file, + agents.conf.

+

See + Agents + for more info.

+ +
+
+ + write_agents_config(Dir, Conf) -> ok + write_agents_config(Dir, Hdr, Conf) -> ok + Write the manager agents to the config file + + Dir = string() + Hdr = string() + Conf = [_entry()] + + +

Write the manager agents config to the manager agents + config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + Agents + for more info.

+ +
+
+ + append_agents_config(Dir, Conf) -> ok + Append the manager agents to the config file + + Dir = string() + Conf = [agents_entry()] + + +

Append the agents config to the current manager agents + config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Agents + for more info.

+ +
+
+ + read_agents_config(Dir) -> Conf + Read the manager agents config from the config file + + Dir = string() + Conf = [agents_entry()] + + +

Read the current manager agents config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Agents + for more info.

+ +
+
+ + usm_entry(EngineID, UserName, AuthP, AuthKey, PrivP, PrivKey) -> usm_entry() + usm_entry(EngineID, UserName, SecName, AuthP, AuthKey, PrivP, PrivKey) -> usm_entry() + Create an usm entry + + EngineID = string() + UserName = string() + SecName = string() + AuthP = usmNoAuthProtocol | usmHMACMD5AuthProtocol | usmHMACSHAAuthProtocol + AuthKey = [integer()] + PrivP = usmNoPrivProtocol | usmDESPrivProtocol | usmAesCfb128Protocol + PrivKey = [integer()] + usm_entry() = term() + + +

Create an entry for the agent community config file, + community.conf.

+

See + Security data for USM + for more info.

+ +
+
+ + write_usm_config(Dir, Conf) -> ok + write_usm_config(Dir, Hdr, Conf) -> ok + Write the manager usm config to the config file + + Dir = string() + Hdr = string() + Conf = [usm_entry()] + + +

Write the manager usm config to the manager usm + config file.

+

Dir is the path to the directory where to store the + config file.

+

Hdr is an optional file header (note that this text is + written to the file as is).

+

See + Security data for USM + for more info.

+ +
+
+ + append_usm_config(Dir, Conf) -> ok + Append the manager usm config to the config file + + Dir = string() + Conf = [usm_entry()] + + +

Append the usm config to the current manager usm + config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Security data for USM + for more info.

+ +
+
+ + read_usm_config(Dir) -> Conf + Read the manager usm config from the config file + + Dir = string() + Conf = [usm_entry()] + + +

Read the current manager usm config file.

+

Dir is the path to the directory where to store the + config file.

+

See + Security data for USM + for more info.

+ +
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmpm_mpd.xml b/lib/snmp/doc/src/snmpm_mpd.xml new file mode 100644 index 0000000000..030c79e0e6 --- /dev/null +++ b/lib/snmp/doc/src/snmpm_mpd.xml @@ -0,0 +1,139 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpm_mpd + + + + + + + + snmpm_mpd.xml +
+ snmpm_mpd + Message Processing and Dispatch module for the SNMP manager + +

The module snmpm_mpd implements the version independent + Message Processing and Dispatch functionality in SNMP for the manager. + It is supposed to be used from a Network Interface process + (Definition of Manager Net if). +

+
+ + + init_mpd(Vsns) -> mpd_state() + Initialize the MPD module + + Vsns = [Vsn] + Vsn = v1 | v2 | v3 + + +

This function can be called from the net_if process at start-up. + The options list defines which versions to use. +

+

It also initializes some SNMP counters. + +

+
+
+ + process_msg(Msg, TDomain, Addr, Port, State, NoteStore, Logger) -> {ok, Vsn, Pdu, PduMS, MsgData} | {discarded, Reason} + Process a message received from the network + + Msg = binary() + TDomain = snmpUDPDomain + Addr = {integer(), integer(), integer(), integer()} + Port = integer() + State = mpd_state() + NoteStore = pid() + Logger = function() + Vsn = 'version-1' | 'version-2' | 'version-3' + Pdu = #pdu + PduMs = integer() + MsgData = term() + + +

Processes an incoming message. Performs authentication and + decryption as necessary. The return values should be passed the + manager server. +

+

NoteStore is the pid() of the note-store process.

+

Logger is the function used for audit trail logging. +

+

In the case when the pdu type is report, MsgData is + either ok or {error, ReqId, Reason}. +

+
+
+ + generate_msg(Vsn, NoteStore, Pdu, MsgData, Logger) -> {ok, Packet} | {discarded, Reason} + Generate a request message to be sent to the network + + Vsn = 'version-1' | 'version-2' | 'version-3' + NoteStore = pid() + Pdu = #pdu + MsgData = term() + Logger = function() + Packet = binary() + Reason = term() + + +

Generates a possibly encrypted packet to be sent to the network. +

+

NoteStore is the pid() of the note-store process. +

+

MsgData is the message specific data used in the SNMP + message. In SNMPv1 and SNMPv2c, this message data is the community + string. In SNMPv3, it is the context information. +

+

Logger is the function used for audit trail logging. +

+
+
+ + generate_response_msg(Vsn, Pdu, MsgData, Logger) -> {ok, Packet} | {discarded, Reason} + Generate a response packet to be sent to the network + + Vsn = 'version-1' | 'version-2' | 'version-3' + Pdu = #pdu + MsgData = term() + Logger = function() + Packet = binary() + Reason = term() + + +

Generates a possibly encrypted response packet to be sent to the + network. +

+

MsgData is the message specific data used in the SNMP + message. This value is received from the + process_msg + function. +

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmpm_network_interface.xml b/lib/snmp/doc/src/snmpm_network_interface.xml new file mode 100644 index 0000000000..33eb736b8f --- /dev/null +++ b/lib/snmp/doc/src/snmpm_network_interface.xml @@ -0,0 +1,252 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpm_network_interface + + + + + + + + snmpm_network_interface.xml +
+ snmpm_network_interface + Behaviour module for the SNMP manager network interface. + +

This module defines the behaviour of the manager network + interface. A snmpm_network_interface compliant module + must export the following functions:

+ + +

start_link/2

+
+ +

stop/1

+
+ +

send_pdu/7

+
+ +

inform_response/4

+
+ +

note_store/2

+
+ +

info/1

+
+ +

get_log_type/1

+
+ +

set_log_type/2

+
+ +

verbosity/2

+
+
+

The semantics of them and their exact signatures are explained + below.

+ + +
+ + + + start_link(Server, NoteStore) -> {ok, Pid} | {error, Reason} + Start-link the network interface process + + Server = pid() + NoteStore = pid() + + +

Start-link the network interface process.

+

Server is the pid of the managing process.

+

NoteStore is the pid of the note-store process.

+ + +
+
+ + + stop(Pid) -> void() + Stop the network interface process + + Pid = pid() + + +

Stop the network interface process.

+ + +
+
+ + + send_pdu(Pid, Pdu, Vsn, MsgData, Addr, Port, ExtraInfo) -> void() + Request the network interface process to send this pdu + + Pid = pid() + Pdu = pdu() + Vsn = 'version-1' | 'version-2' | 'version-3' + MsgData = term() + Addr = address() + Port = integer() + ExtraInfo = term() + + +

Request the network interface process (Pid) to send + this pdu (Pdu).

+

ExtraInfo is some opaque data that is passed to the + net-if process. It originates from the ExtraInfo + parameter in the calls to the + synchronous get-request, + asynchronous get-request, + synchronous get-next-request, + asynchronous get-next-request, + synchronous set-request + and + asynchronous set-request + functions. + Whether the net-if process chooses + to use this is implementation dependent. The net-if process + included in this application ignores it.

+ + +
+
+ + + inform_response(Pid, Ref, Addr, Port) -> void() + Send the inform-request ack + + Pid = pid() + Ref = term() + Addr = address() + Port = integer() + + +

Instruct the network interface process to send the response + (acknowledgment) to an inform-request.

+

Ref is something that can be used to identify the + inform-request, e.g. request-id of the inform-request.

+

Addr and Port identifies the agent, from + which the inform-request originated.

+ + +
+
+ + + note_store(Pid, NoteStore) -> void() + Change the verbosity of the network interface process + + Pid = pid() + NoteStore = pid() + + +

Change the pid of the note-store process. + This is used when the server re-starts the note_store + (e.g. after a crach).

+ + +
+
+ + + info(Pid) -> [{Key, Value}] + Return information about the running network interface process + + Pid = pid() + + +

The info returned is basically up to the implementer to decide. + The implementation provided by this application provides info about + memory allocation and various socket information.

+

The info returned by this function is returned together with other + info collected by the manager when the + info function is called + (tagged with the key net_if).

+ + +
+
+ + + verbosity(Pid, Verbosity) -> void() + Change the verbosity of the network interface process + + Pid = pid() + Verbosity = verbosity() + + +

Change the verbosity of the network interface process.

+ + +
+
+ + + get_log_type(Pid) -> {ok, LogType} | {error, Reason} + Get the Audit Trail Log type + + Pid = pid() + LogType = atl_type() + Reason = term() + + +

The Audit Trail Log is managed by the network interface process. + So, it is this process that has to return the actual log-type.

+ + + +
+
+ + + set_log_type(Pid, NewType) -> {ok, OldType} | {error, Reason} + Change the Audit Trail Log type + + Pid = pid() + NewType = OldType = atl_type() + Reason = term() + + +

The Audit Trail Log is managed by the network interface process. + So, it is this process that has to do the actual changing of the + type.

+

See + set_log_type + for more info.

+
+
+ +
+ + +
+ diff --git a/lib/snmp/doc/src/snmpm_network_interface_filter.xml b/lib/snmp/doc/src/snmpm_network_interface_filter.xml new file mode 100644 index 0000000000..ea1e183848 --- /dev/null +++ b/lib/snmp/doc/src/snmpm_network_interface_filter.xml @@ -0,0 +1,158 @@ + + + + +
+ + 20072009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpm_network_interface_filter + + + + + + + + snmpm_network_interface_filter.xml +
+ snmpm_network_interface_filter + Behaviour module for the SNMP manager network-interface filter. + +

This module defines the behaviour of the manager network interface + filter. A snmpm_network_interface_filter compliant module + must export the following functions:

+ + +

accept_recv/2

+
+ +

accept_send/2

+
+ +

accept_recv_pdu/3

+
+ +

accept_send_pdu/2

+
+
+

The semantics of them and their exact signatures are explained + below.

+

The purpose of the network interface filter is to allow for filtering + of messages (accept or reject) receive and send. This is done + on two levels:

+ + +

The first level is at the UDP entry / exit point, i.e. + immediately after the receipt of the message, before any message + processing is done (accept_recv) and + immediately before sending the message, after all message + processing is done (accept_send).

+
+ +

The second level is at the MPD entry / exit point, i.e. + immediately after the basic message processing (accept_recv_pdu) / + immediately before the basic message processing (accept_send_pdu).

+
+
+

Note that the network interface filter is something which is used + by the network interface implementation provided by the application + (snmpm_net_if). The default filter accepts all messages.

+

A network interface filter can e.g. be used during testing or for load + regulation.

+
+ +
+ DATA TYPES + +port() = integer() > 0 +pdu_type() = 'get-request' | 'get-next-request' | 'get-response' | 'set-request' | trap | 'get-bulk-request' | 'inform-request' | report | trappdu + + +
+ + + + accept_recv(Addr, Port) -> boolean() + Shall the received message be accepted + + Addr = ip_address() + Port = port() + + +

Called at the reception of a message (before any processing + has been done).

+

For the message to be rejected, the function must return + false.

+ +
+
+ + + accept_send(Addr, Port) -> boolean() + Shall the message be sent + + Addr = ip_address() + Port = port() + + +

Called before the sending of a message (after all processing + has been done).

+

For the message to be rejected, the function must return + false.

+ +
+
+ + + accept_recv_pdu(Addr, Port, PduType) -> boolean() + Shall the received pdu be accepted + + Addr = ip_address() + Port = port() + PduType = pdu_type() + + +

Called after the basic message processing (MPD) has been done, + but before the pdu is handed over to the server for primary + processing.

+

For the pdu to be rejected, the function must return + false.

+ +
+
+ + + accept_send_pdu(Addr, Port, PduType) -> boolean() + Shall the pdu be sent + + Addr = ip_address() + Port = port() + PduType = pdu_type() > 0 + + +

Called before the basic message processing (MPD) is done, + when a pdu has been received from the master-agent.

+

For the message to be rejected, the function must return + false.

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/snmpm_user.xml b/lib/snmp/doc/src/snmpm_user.xml new file mode 100644 index 0000000000..1823e0c815 --- /dev/null +++ b/lib/snmp/doc/src/snmpm_user.xml @@ -0,0 +1,276 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + snmpm_user + + + + + + + + snmpm_user.xml +
+ snmpm_user + Behaviour module for the SNMP manager user. + +

This module defines the behaviour of the manager user. + A snmpm_user compliant module + must export the following functions:

+ + +

handle_error/3

+
+ +

handle_agent/4

+
+ +

handle_pdu/4

+
+ +

handle_trap/3

+
+ +

handle_inform/3

+
+ +

handle_report/3

+
+
+

The semantics of them and their exact signatures are explained + below.

+

Note that if an agent is registered using the old, no longer + documented, functions (using Addr and Port), the old variant of the + callback functions, handle_pdu, handle_trap, handle_inform and + handle_report, will be called.

+ + +
+ + + handle_error(ReqId, Reason, UserData) -> Reply + Handle error + + ReqId = integer() + Reason = {unexpected_pdu, SnmpInfo} | {invalid_sec_info, SecInfo, SnmpInfo} | {empty_message, Addr, Port} | term() + Addr = ip_address() + Port = integer() + UserData = term() + Reply = ignore + + +

This function is called when the manager needs to + communicate an "asynchronous" error, to the user: + e.g. failure to send an asynchronous message (i.e. encoding + error), a received message was discarded due to security + error, the manager failed to generate a response message to + a received inform-request, or when receiving an unexpected + PDU from an agent (could be an expired async request).

+

If ReqId is less then 0, it means that this + information was not available to the manager (that info was + never retrieved before the message was discarded). +

+

For SnmpInfo see handle_agent below.

+ + +
+
+ + + handle_agent(Addr, Port, Type, SnmpInfo, UserData) -> Reply + Handle agent + + Addr = ip_address() + Port = integer() + Type = pdu | trap | report | inform + SnmpInfo = SnmpPduInfo | SnmpTrapInfo | SnmpReportInfo | SnmpInformInfo + ErrorStatus = atom() + ErrorIndex = integer() + Varbinds = [varbind()] + varbind() = #varbind + UserData = term() + Reply = ignore | {register, UserId, TargetName, agent_info()} + UserId = term() + TargetName = target_name() + agent_info() = [{agent_info_item(), agent_info_value()}] + + +

This function is called when a message is received from an + unknown agent.

+

Note that this will always be the default user that is called.

+

For more info about the agent_info(), see + register_agent.

+ +

The arguments Type and SnmpInfo relates in the + following way:

+ + + +

pdu - SnmpPduInfo + (see handle_pdu + for more info).

+
+ +

trap - SnmpTrapInfo + (see handle_trap + for more info).

+
+ +

report - SnmpReportInfo + (see handle_report + for more info).

+
+ +

inform - SnmpInformInfo + (see handle_inform + for more info).

+
+
+ +

The only user which would return + {register, UserId, TargetName, agent_info()} is the + default user.

+ + +
+
+ + + handle_pdu(TargetName, ReqId, SnmpPduInfo, UserData) -> Reply + Handle the reply to an asynchronous request + + TargetName = target_name() + ReqId = term() + SnmpPduInfo = {ErrorStatus, ErrorIndex, Varbinds} + ErrorStatus = atom() + ErrorIndex = integer() + Varbinds = [varbind()] + varbind() = #varbind + UserData = term() + Reply = ignore + + +

Handle the reply to an asynchronous request, such as + async_get, + async_get_next or + async_set.

+

It could also be a late reply to a synchronous request.

+

ReqId is returned by the asynchronous request function.

+ + +
+
+ + + handle_trap(TargetName, SnmpTrapInfo, UserData) -> Reply + Handle a trap/notification message + + TargetName = TargetName2 = target_name() + SnmpTrapInfo = {Enteprise, Generic, Spec, Timestamp, Varbinds} | {ErrorStatus, ErrorIndex, Varbinds} + Enterprise = oid() + Generic = integer() + Spec = integer() + Timestamp = integer() + ErrorStatus = atom() + ErrorIndex = integer() + Varbinds = [varbind()] + varbind() = #varbind + UserData = term() + Reply = ignore | unregister | {register, UserId, TargetName2, agent_info()} + UserId = term() + agent_info() = [{agent_info_item(), agent_info_value()}] + + +

Handle a trap/notification message from an agent.

+

For more info about the agent_info(), see + register_agent

+

The only user which would return + {register, UserId, TargetName2, agent_info()} is the + default user.

+ + +
+
+ + + handle_inform(TargetName, SnmpInformInfo, UserData) -> Reply + Handle a inform message + + TargetName = TargetName2 = target_name() + SnmpInformInfo = {ErrorStatus, ErrorIndex, Varbinds} + ErrorStatus = atom() + ErrorIndex = integer() + Varbinds = [varbind()] + varbind() = #varbind + UserData = term() + Reply = ignore | unregister | {register, UserId, TargetName2, agent_info()} + UserId = term() + agent_info() = [{agent_info_item(), agent_info_value()}] + + +

Handle a inform message.

+

For more info about the agent_info(), see + register_agent

+

The only user which would return + {register, UserId, TargetName2, agent_info()} is the + default user.

+

If the + inform request behaviour + configuration option is set to user or + {user, integer()}, the response (acknowledgment) to this + inform-request will be sent when this function returns.

+ + +
+
+ + + handle_report(TargetName, SnmpReportInfo, UserData) -> Reply + Handle a report message + + TargetName = TargetName2 = target_name() + Addr = ip_address() + Port = integer() + SnmpReportInfo = {ErrorStatus, ErrorIndex, Varbinds} + ErrorStatus = atom() + ErrorIndex = integer() + Varbinds = [varbind()] + varbind() = #varbind + UserData = term() + Reply = ignore | unregister | {register, UserId, TargetName2, agent_info()} + UserId = term() + agent_info() = [{agent_info_item(), agent_info_value()}] + + +

Handle a report message.

+

For more info about the agent_info(), see + register_agent

+

The only user which would return + {register, UserId, TargetName2, agent_info()} is the + default user.

+
+
+
+ +
+ diff --git a/lib/snmp/doc/src/structure.fig b/lib/snmp/doc/src/structure.fig new file mode 100644 index 0000000000..c7feff6f47 --- /dev/null +++ b/lib/snmp/doc/src/structure.fig @@ -0,0 +1,46 @@ +#FIG 3.1 +Landscape +Center +Inches +1200 2 +6 5850 2400 8100 3075 +4 0 -1 0 0 0 12 0.0000 4 180 2025 5850 2550 (associate a MIB object with\001 +4 0 -1 0 0 0 12 0.0000 4 180 1815 5850 2775 snmp_generic:table_funct\001 +4 0 -1 0 0 0 12 0.0000 4 180 2055 5850 3000 snmp_generic:variable_func)\001 +-6 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4200 3150 4200 3450 +2 2 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 5 + 3600 1275 4800 1275 4800 1725 3600 1725 3600 1275 +2 2 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 5 + 3600 1725 4800 1725 4800 2100 3600 2100 3600 1725 +2 1 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 2 + 4200 2100 4200 2775 +2 2 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 5 + 3000 3450 5400 3450 5400 3975 3000 3975 3000 3450 +2 2 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 5 + 4200 3975 5400 3975 5400 4500 4200 4500 4200 3975 +2 2 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 5 + 3000 5025 4200 5025 4200 5550 3000 5550 3000 5025 +2 2 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 5 + 3000 3975 4200 3975 4200 4500 3000 4500 3000 3975 +2 2 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 5 + 3000 4500 4200 4500 4200 5025 3000 5025 3000 4500 +2 2 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 5 + 2400 900 8625 900 8625 6000 2400 6000 2400 900 +2 2 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 5 + 8625 6000 8625 6000 8625 6000 8625 6000 8625 6000 +4 0 -1 0 0 0 12 0.0000 4 135 1230 3525 3000 Assosiacition file\001 +4 0 -1 0 0 0 12 0.0000 4 180 990 3750 1575 SNMP Agent\001 +4 0 -1 0 0 0 12 0.0000 4 135 345 4050 1950 MIB\001 +4 0 -1 0 0 0 12 0.0000 4 180 1080 3075 4275 snmp_local_db\001 +4 0 -1 0 0 0 12 0.0000 4 135 525 4500 4275 Mnesia\001 +4 0 -1 0 0 0 12 0.0000 4 165 285 3450 4800 pets\001 +4 0 -1 0 0 0 12 0.0000 4 120 195 3450 5325 ets\001 +4 0 -1 0 0 0 12 0.0000 4 180 990 3600 3825 snmp_generic\001 +4 0 -1 0 0 0 12 0.0000 4 180 1530 5925 3600 Support for get-next,\001 +4 0 -1 0 0 0 12 0.0000 4 180 1560 5925 3825 RowStatus operations\001 +4 0 -1 0 0 0 12 0.0000 4 135 645 6000 4275 Database\001 +4 0 -1 0 0 0 12 0.0000 4 180 1860 6000 4800 Adds persistent properties\001 +4 0 -1 0 0 0 12 0.0000 4 120 375 6000 5025 to ets\001 +4 0 -1 0 0 0 12 0.0000 4 180 1995 6000 5475 The standard Erlang module\001 diff --git a/lib/snmp/doc/src/structure.gif b/lib/snmp/doc/src/structure.gif new file mode 100644 index 0000000000..69ce000357 Binary files /dev/null and b/lib/snmp/doc/src/structure.gif differ diff --git a/lib/snmp/doc/src/structure.ps b/lib/snmp/doc/src/structure.ps new file mode 100644 index 0000000000..ffb345eb6a --- /dev/null +++ b/lib/snmp/doc/src/structure.ps @@ -0,0 +1,170 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: bild2.fig +%%Creator: fig2dev Version 3.1 Patchlevel 2 +%%CreationDate: Mon Jan 3 10:34:34 2000 +%%For: nibe@gundor (Bengt Nilsson, ETX/DN/SP) +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 376 308 +%%Pages: 0 +%%BeginSetup +%%IncludeFeature: *PageSize Letter +%%EndSetup +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +-143.0 361.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n 0 792 m 0 0 l 612 0 l 612 792 l cp clip + 0.06000 0.06000 sc +/Times-Roman ff 180.00 scf sf +5850 2550 m +gs 1 -1 sc (\(associate a MIB object with) col-1 sh gr +/Times-Roman ff 180.00 scf sf +5850 2775 m +gs 1 -1 sc (snmp_generic:table_funct) col-1 sh gr +/Times-Roman ff 180.00 scf sf +5850 3000 m +gs 1 -1 sc (snmp_generic:variable_func\)) col-1 sh gr +7.500 slw +% Polyline +n 4200 3150 m 4200 3450 l gs col-1 s gr +% Polyline +n 3600 1275 m 4800 1275 l 4800 1725 l 3600 1725 l cp gs col-1 s gr +% Polyline +n 3600 1725 m 4800 1725 l 4800 2100 l 3600 2100 l cp gs col-1 s gr +% Polyline +n 4200 2100 m 4200 2775 l gs col-1 s gr +% Polyline +n 3000 3450 m 5400 3450 l 5400 3975 l 3000 3975 l cp gs col-1 s gr +% Polyline +n 4200 3975 m 5400 3975 l 5400 4500 l 4200 4500 l cp gs col-1 s gr +% Polyline +n 3000 5025 m 4200 5025 l 4200 5550 l 3000 5550 l cp gs col-1 s gr +% Polyline +n 3000 3975 m 4200 3975 l 4200 4500 l 3000 4500 l cp gs col-1 s gr +% Polyline +n 3000 4500 m 4200 4500 l 4200 5025 l 3000 5025 l cp gs col-1 s gr +% Polyline +n 2400 900 m 8625 900 l 8625 6000 l 2400 6000 l cp gs col-1 s gr +% Polyline +n 8625 6000 m 8625 6000 l 8625 6000 l 8625 6000 l cp gs col-1 s gr +/Times-Roman ff 180.00 scf sf +3525 3000 m +gs 1 -1 sc (Assosiacition file) col-1 sh gr +/Times-Roman ff 180.00 scf sf +3750 1575 m +gs 1 -1 sc (SNMP Agent) col-1 sh gr +/Times-Roman ff 180.00 scf sf +4050 1950 m +gs 1 -1 sc (MIB) col-1 sh gr +/Times-Roman ff 180.00 scf sf +3075 4275 m +gs 1 -1 sc (snmp_local_db) col-1 sh gr +/Times-Roman ff 180.00 scf sf +4500 4275 m +gs 1 -1 sc (Mnesia) col-1 sh gr +/Times-Roman ff 180.00 scf sf +3450 4800 m +gs 1 -1 sc (pets) col-1 sh gr +/Times-Roman ff 180.00 scf sf +3450 5325 m +gs 1 -1 sc (ets) col-1 sh gr +/Times-Roman ff 180.00 scf sf +3600 3825 m +gs 1 -1 sc (snmp_generic) col-1 sh gr +/Times-Roman ff 180.00 scf sf +5925 3600 m +gs 1 -1 sc (Support for get-next,) col-1 sh gr +/Times-Roman ff 180.00 scf sf +5925 3825 m +gs 1 -1 sc (RowStatus operations) col-1 sh gr +/Times-Roman ff 180.00 scf sf +6000 4275 m +gs 1 -1 sc (Database) col-1 sh gr +/Times-Roman ff 180.00 scf sf +6000 4800 m +gs 1 -1 sc (Adds persistent properties) col-1 sh gr +/Times-Roman ff 180.00 scf sf +6000 5025 m +gs 1 -1 sc (to ets) col-1 sh gr +/Times-Roman ff 180.00 scf sf +6000 5475 m +gs 1 -1 sc (The standard Erlang module) col-1 sh gr +$F2psEnd +rs diff --git a/lib/snmp/doc/src/summary.html.src b/lib/snmp/doc/src/summary.html.src new file mode 100644 index 0000000000..9bad4adbeb --- /dev/null +++ b/lib/snmp/doc/src/summary.html.src @@ -0,0 +1 @@ +Simple Network Management Protocol (SNMP) support including a MIB compiler, a simple SNMP manager and tools for creating SNMP agents diff --git a/lib/snmp/doc/src/user_guide.gif b/lib/snmp/doc/src/user_guide.gif new file mode 100644 index 0000000000..e6275a803d Binary files /dev/null and b/lib/snmp/doc/src/user_guide.gif differ diff --git a/lib/snmp/doc/src/warning.gif b/lib/snmp/doc/src/warning.gif new file mode 100644 index 0000000000..96af52360e Binary files /dev/null and b/lib/snmp/doc/src/warning.gif differ -- cgit v1.2.3