aboutsummaryrefslogtreecommitdiffstats
path: root/lib/snmp/doc
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/snmp/doc
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/snmp/doc')
-rw-r--r--lib/snmp/doc/html/.gitignore0
-rw-r--r--lib/snmp/doc/man3/.gitignore0
-rw-r--r--lib/snmp/doc/man6/.gitignore0
-rw-r--r--lib/snmp/doc/man7/.gitignore0
-rw-r--r--lib/snmp/doc/pdf/.gitignore0
-rw-r--r--lib/snmp/doc/src/MIB_mechanism.fig73
-rw-r--r--lib/snmp/doc/src/MIB_mechanism.gifbin0 -> 3268 bytes
-rw-r--r--lib/snmp/doc/src/MIB_mechanism.ps217
-rw-r--r--lib/snmp/doc/src/Makefile349
-rw-r--r--lib/snmp/doc/src/book.gifbin0 -> 1081 bytes
-rw-r--r--lib/snmp/doc/src/book.xml49
-rw-r--r--lib/snmp/doc/src/depend.mk82
-rw-r--r--lib/snmp/doc/src/fascicules.xml18
-rw-r--r--lib/snmp/doc/src/files.mk153
-rw-r--r--lib/snmp/doc/src/getnext1.gifbin0 -> 2951 bytes
-rw-r--r--lib/snmp/doc/src/getnext1.ps2923
-rw-r--r--lib/snmp/doc/src/getnext2.gifbin0 -> 3529 bytes
-rw-r--r--lib/snmp/doc/src/getnext2.ps2997
-rw-r--r--lib/snmp/doc/src/getnext3.gifbin0 -> 3876 bytes
-rw-r--r--lib/snmp/doc/src/getnext3.ps3003
-rw-r--r--lib/snmp/doc/src/getnext4.gifbin0 -> 3705 bytes
-rw-r--r--lib/snmp/doc/src/getnext4.ps3002
-rw-r--r--lib/snmp/doc/src/index.html.src98
-rw-r--r--lib/snmp/doc/src/make.dep77
-rw-r--r--lib/snmp/doc/src/min_head.gifbin0 -> 2652 bytes
-rw-r--r--lib/snmp/doc/src/note.gifbin0 -> 1539 bytes
-rw-r--r--lib/snmp/doc/src/notes.gifbin0 -> 2005 bytes
-rw-r--r--lib/snmp/doc/src/notes.xml1024
-rw-r--r--lib/snmp/doc/src/notes_history.xml2151
-rw-r--r--lib/snmp/doc/src/part.xml54
-rw-r--r--lib/snmp/doc/src/part_notes.xml40
-rw-r--r--lib/snmp/doc/src/part_notes_history.xml41
-rw-r--r--lib/snmp/doc/src/ref_man.gifbin0 -> 1530 bytes
-rw-r--r--lib/snmp/doc/src/ref_man.xml71
-rw-r--r--lib/snmp/doc/src/snmp-um-1-image-1.gifbin0 -> 5684 bytes
-rw-r--r--lib/snmp/doc/src/snmp-um-1-image-1.ps2912
-rw-r--r--lib/snmp/doc/src/snmp-um-1-image-2.gifbin0 -> 2407 bytes
-rw-r--r--lib/snmp/doc/src/snmp-um-1-image-2.ps2866
-rw-r--r--lib/snmp/doc/src/snmp-um-1-image-3.gifbin0 -> 10952 bytes
-rw-r--r--lib/snmp/doc/src/snmp-um-1-image-3.ps3400
-rw-r--r--lib/snmp/doc/src/snmp-um-1-image-8.gifbin0 -> 6202 bytes
-rw-r--r--lib/snmp/doc/src/snmp-um-1-image-8.ps2931
-rw-r--r--lib/snmp/doc/src/snmp.gifbin0 -> 15889 bytes
-rw-r--r--lib/snmp/doc/src/snmp.xml608
-rw-r--r--lib/snmp/doc/src/snmp_advanced_agent.xml482
-rw-r--r--lib/snmp/doc/src/snmp_agent_config_files.xml464
-rw-r--r--lib/snmp/doc/src/snmp_agent_funct_descr.xml947
-rw-r--r--lib/snmp/doc/src/snmp_agent_netif.xml268
-rw-r--r--lib/snmp/doc/src/snmp_agent_netif_1.gifbin0 -> 5217 bytes
-rw-r--r--lib/snmp/doc/src/snmp_agent_netif_1.ps2909
-rw-r--r--lib/snmp/doc/src/snmp_app.xml708
-rw-r--r--lib/snmp/doc/src/snmp_app_a.xml108
-rw-r--r--lib/snmp/doc/src/snmp_app_b.xml511
-rw-r--r--lib/snmp/doc/src/snmp_audit_trail_log.xml81
-rw-r--r--lib/snmp/doc/src/snmp_community_mib.xml136
-rw-r--r--lib/snmp/doc/src/snmp_config.xml1030
-rw-r--r--lib/snmp/doc/src/snmp_def_instr_functions.xml477
-rw-r--r--lib/snmp/doc/src/snmp_framework_mib.xml119
-rw-r--r--lib/snmp/doc/src/snmp_generic.xml345
-rw-r--r--lib/snmp/doc/src/snmp_impl_example_agent.xml510
-rw-r--r--lib/snmp/doc/src/snmp_impl_example_manager.xml94
-rw-r--r--lib/snmp/doc/src/snmp_index.xml266
-rw-r--r--lib/snmp/doc/src/snmp_instr_functions.xml456
-rw-r--r--lib/snmp/doc/src/snmp_intro.xml258
-rw-r--r--lib/snmp/doc/src/snmp_manager_config_files.xml249
-rw-r--r--lib/snmp/doc/src/snmp_manager_funct_descr.xml112
-rw-r--r--lib/snmp/doc/src/snmp_manager_netif.xml174
-rw-r--r--lib/snmp/doc/src/snmp_manager_netif_1.gifbin0 -> 2714 bytes
-rw-r--r--lib/snmp/doc/src/snmp_manager_netif_1.ps305
-rw-r--r--lib/snmp/doc/src/snmp_mib_compiler.xml252
-rw-r--r--lib/snmp/doc/src/snmp_notification_mib.xml131
-rw-r--r--lib/snmp/doc/src/snmp_pdus.xml204
-rw-r--r--lib/snmp/doc/src/snmp_standard_mib.xml135
-rw-r--r--lib/snmp/doc/src/snmp_target_mib.xml195
-rw-r--r--lib/snmp/doc/src/snmp_user_based_sm_mib.xml146
-rw-r--r--lib/snmp/doc/src/snmp_view_based_acm_mib.xml201
-rw-r--r--lib/snmp/doc/src/snmpa.xml1252
-rw-r--r--lib/snmp/doc/src/snmpa_conf.xml861
-rw-r--r--lib/snmp/doc/src/snmpa_discovery_handler.xml118
-rw-r--r--lib/snmp/doc/src/snmpa_error.xml91
-rw-r--r--lib/snmp/doc/src/snmpa_error_io.xml88
-rw-r--r--lib/snmp/doc/src/snmpa_error_logger.xml95
-rw-r--r--lib/snmp/doc/src/snmpa_error_report.xml88
-rw-r--r--lib/snmp/doc/src/snmpa_local_db.xml190
-rw-r--r--lib/snmp/doc/src/snmpa_mpd.xml159
-rw-r--r--lib/snmp/doc/src/snmpa_network_interface.xml170
-rw-r--r--lib/snmp/doc/src/snmpa_network_interface_filter.xml163
-rw-r--r--lib/snmp/doc/src/snmpa_notification_delivery_info_receiver.xml120
-rw-r--r--lib/snmp/doc/src/snmpa_notification_filter.xml73
-rw-r--r--lib/snmp/doc/src/snmpa_supervisor.xml117
-rw-r--r--lib/snmp/doc/src/snmpc.xml201
-rw-r--r--lib/snmp/doc/src/snmpm.xml1043
-rw-r--r--lib/snmp/doc/src/snmpm_conf.xml364
-rw-r--r--lib/snmp/doc/src/snmpm_mpd.xml139
-rw-r--r--lib/snmp/doc/src/snmpm_network_interface.xml252
-rw-r--r--lib/snmp/doc/src/snmpm_network_interface_filter.xml158
-rw-r--r--lib/snmp/doc/src/snmpm_user.xml276
-rw-r--r--lib/snmp/doc/src/structure.fig46
-rw-r--r--lib/snmp/doc/src/structure.gifbin0 -> 3878 bytes
-rw-r--r--lib/snmp/doc/src/structure.ps170
-rw-r--r--lib/snmp/doc/src/summary.html.src1
-rw-r--r--lib/snmp/doc/src/user_guide.gifbin0 -> 1581 bytes
-rw-r--r--lib/snmp/doc/src/warning.gifbin0 -> 1498 bytes
103 files changed, 47647 insertions, 0 deletions
diff --git a/lib/snmp/doc/html/.gitignore b/lib/snmp/doc/html/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/snmp/doc/html/.gitignore
diff --git a/lib/snmp/doc/man3/.gitignore b/lib/snmp/doc/man3/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/snmp/doc/man3/.gitignore
diff --git a/lib/snmp/doc/man6/.gitignore b/lib/snmp/doc/man6/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/snmp/doc/man6/.gitignore
diff --git a/lib/snmp/doc/man7/.gitignore b/lib/snmp/doc/man7/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/snmp/doc/man7/.gitignore
diff --git a/lib/snmp/doc/pdf/.gitignore b/lib/snmp/doc/pdf/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/snmp/doc/pdf/.gitignore
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
--- /dev/null
+++ b/lib/snmp/doc/src/MIB_mechanism.gif
Binary files 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
--- /dev/null
+++ b/lib/snmp/doc/src/book.gif
Binary files 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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE book SYSTEM "book.dtd">
+
+<book xmlns:xi="http://www.w3.org/2001/XInclude">
+ <header titlestyle="normal">
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Simple Network Management Protocol (SNMP)</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>book.xml</file>
+ </header>
+ <insidecover>
+ </insidecover>
+ <pagetext>Simple Network Management Protocol (SNMP)</pagetext>
+ <preamble>
+ <contents level="2"></contents>
+ </preamble>
+ <parts lift="no">
+ <xi:include href="part.xml"/>
+ </parts>
+ <applications>
+ <xi:include href="ref_man.xml"/>
+ </applications>
+ <releasenotes>
+ <xi:include href="notes.xml"/>
+ </releasenotes>
+ <listofterms></listofterms>
+ <index></index>
+</book>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE fascicules SYSTEM "fascicules.dtd">
+
+<fascicules>
+ <fascicule file="part" href="part_frame.html" entry="no">
+ User's Guide
+ </fascicule>
+ <fascicule file="ref_man" href="ref_man_frame.html" entry="yes">
+ Reference Manual
+ </fascicule>
+ <fascicule file="part_notes" href="part_notes_frame.html" entry="no">
+ Release Notes
+ </fascicule>
+ <fascicule file="" href="../../../../doc/print.html" entry="no">
+ Off-Print
+ </fascicule>
+</fascicules>
+
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
--- /dev/null
+++ b/lib/snmp/doc/src/getnext1.gif
Binary files 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
--- /dev/null
+++ b/lib/snmp/doc/src/getnext2.gif
Binary files 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
--- /dev/null
+++ b/lib/snmp/doc/src/getnext3.gif
Binary files 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
--- /dev/null
+++ b/lib/snmp/doc/src/getnext4.gif
Binary files 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 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- This file is obsolete -->
+<HTML>
+<!--
+ ``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 via the world wide web 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 Utvecklings AB.
+ Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+ AB. All Rights Reserved.''
+
+ $Id$
+-->
+<HEAD>
+<TITLE>SNMP %VSN%</TITLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF">
+
+<CENTER>
+<A HREF="http://www.erlang.se/"><IMG ALT="Erlang/OTP" BORDER=0 SRC="html/min_head.gif"></A><BR>
+
+<FONT SIZE="-1">
+[<A HREF="../../../doc/index.html">Up</A> |
+<A HREF="http://www.erlang.se/">Erlang/OTP</A>]
+</FONT><BR>
+
+<P><FONT SIZE="+3">
+SNMP
+</FONT><BR>
+Version %VSN%
+</CENTER>
+
+<P><TABLE>
+<TR>
+<TD>
+<IMG ALIGN=LEFT ALT="SNMP" SRC="html/snmp.gif">
+</TD>
+
+<TD>
+<P>A bilingual Simple Network Management Protocol application,
+ featuring an Extensible Agent, a simple manager, a MIB compiler
+ and facilities for implementing SNMP MIBs etc.
+</TD>
+</TR>
+</TABLE>
+
+<P><CENTER>
+<TABLE CELLPADDING=15>
+<TR>
+<TD ALIGN=CENTER>
+<A HREF="html/users_guide.html"><IMG ALT="User's Guide" BORDER=0 SRC="html/user_guide.gif"></A><BR>
+<FONT SIZE="-1">
+<A HREF="html/users_guide.html">User's Guide</A>
+</FONT>
+</TD>
+
+<TD ALIGN=CENTER>
+<A HREF="html/index.html"><IMG ALT="Reference Manual" BORDER=0 SRC="html/ref_man.gif"></A><BR>
+<FONT SIZE="-1">
+<A HREF="html/index.html">Reference Manual</A>
+</FONT>
+</TD>
+
+<TD ALIGN=CENTER>
+<A HREF="html/release_notes.html"><IMG ALT="Release Notes" BORDER=0 SRC="html/notes.gif"></A><BR>
+<FONT SIZE="-1">
+<A HREF="html/release_notes.html">Release Notes</A>
+</FONT>
+</TD>
+
+<TD ALIGN=CENTER>
+<A HREF="pdf/snmp-%VSN%.pdf"><IMG ALT="Off-Print" BORDER=0 SRC="html/book.gif"></A><BR>
+<FONT SIZE="-1">
+<A HREF="pdf/snmp-%VSN%.pdf">Off-Print</A>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+
+<P><CENTER>
+<HR>
+<FONT SIZE="-1">
+Copyright &copy; 1991-2001
+<A HREF="http://www.erlang.se/">Ericsson Utvecklings AB</A>
+</FONT>
+</CENTER>
+</BODY>
+</HTML>
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
--- /dev/null
+++ b/lib/snmp/doc/src/min_head.gif
Binary files differ
diff --git a/lib/snmp/doc/src/note.gif b/lib/snmp/doc/src/note.gif
new file mode 100644
index 0000000000..6fffe30419
--- /dev/null
+++ b/lib/snmp/doc/src/note.gif
Binary files differ
diff --git a/lib/snmp/doc/src/notes.gif b/lib/snmp/doc/src/notes.gif
new file mode 100644
index 0000000000..e000cca26a
--- /dev/null
+++ b/lib/snmp/doc/src/notes.gif
Binary files 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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1996</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>SNMP Release Notes</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>notes.xml</file>
+ </header>
+
+ <section>
+ <title>SNMP Development Toolkit 4.15</title>
+
+ <p>Version 4.15 supports code replacement in runtime from/to
+ version 4.14 and 4.13.5.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <!--
+ <p>-</p>
+ -->
+
+ <list type="bulleted">
+ <item>
+ <p>The documentation is now built with open source tools
+ (<em>xsltproc</em> and <em>fop</em>) that exists on most
+ platforms. One visible change is that the frames are removed.</p>
+ <p>Own Id: OTP-8249</p>
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[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
+ (<c>pdu</c>, <c>trap</c>, <c>report</c> or <c>inform</c>).
+ The problem was that the <c>TargetName</c> argument was useless
+ in this case (only an already known agent has a known/valid
+ <c>TargetName</c>, but the <c>TargetName</c> used in these calls
+ was generated "on the fly"). </p>
+ <p>This has now been changed so that when a message is received
+ from an unknown agent, then only
+ <seealso marker="snmpm_user#handle_agent">handle_agent</seealso>
+ (for the default user) is called, but now this call also has a
+ <c>Type</c> argument, which is
+ <c>pdu | trap | report | inform</c>, depending on what kind of
+ message was actually received, thus making it possible for the
+ user to properly analyze the data received. </p>
+ <p>To handle this, the
+ <seealso marker="snmpm_user">snmpm_user</seealso> behaviour has
+ been updated. </p>
+ <p>*** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>Own Id: OTP-8229</p>
+ <!-- <p>Aux Id: Seq 11312</p> -->
+ </item>
+
+ </list>
+
+ </section>
+
+ </section> <!-- 4.15 -->
+
+
+ <section>
+ <title>SNMP Development Toolkit 4.14</title>
+
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <!--
+ <p>-</p>
+ -->
+
+ <list type="bulleted">
+ <item>
+ <p>[compiler] Include object- and notification groups in the
+ compiled mib.
+ This will make it possible to import groups from other mibs. </p>
+ <p>Also the SNMPv2-MIB-file has been updated to a more
+ up-to-date version. </p>
+ <p>Own Id: OTP-8223</p>
+ <!-- <p>Aux Id: Seq 11383</p> -->
+ </item>
+
+ <item>
+ <p>[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
+ <seealso marker="snmpm_network_interface_filter">network interface filter behaviour</seealso>
+ for message filtering.
+ See also the Configuring chapter of
+ the User's Guide to see how to configure this feature. </p>
+ <p>See the
+ <seealso marker="snmp_app#configuration_params">configuration</seealso>
+ chapter for more info about the filter options.</p>
+ <p>Own Id: OTP-8228</p>
+ <p>Aux Id: Seq 11411</p>
+ </item>
+
+ <item>
+ <p>The MIBs delivered as part of the application is now
+ also available as man pages, section 7. </p>
+ <p>Own Id: OTP-8237</p>
+ <!-- <p>Aux Id: Seq 11383</p> -->
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <p>-</p>
+
+ <!--
+ <list type="bulleted">
+ <item>
+ <p>[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.</p>
+ <p>Own Id: OTP-8116</p>
+ <p>Aux Id: Seq 11312</p>
+ </item>
+
+ </list>
+ -->
+
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.14 -->
+
+
+ <section>
+ <title>SNMP Development Toolkit 4.13.5</title>
+
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <!--
+ <p>-</p>
+ -->
+
+ <list type="bulleted">
+ <item>
+ <p>[agent] Improved the cache handling of the mib server. </p>
+ <p>A number of new functions and config options for the mib server
+ cache has been added. </p>
+ <p>See
+ <seealso marker="snmpa#invalidate_mibs_cache">invalidate_mibs_cache/0,1</seealso>,
+ <seealso marker="snmpa#enable_mibs_cache">enable_mibs_cache/0,1</seealso>,
+ <seealso marker="snmpa#disable_mibs_cache">disable_mibs_cache/0,1</seealso>,
+ <seealso marker="snmpa#gc_mibs_cache">gc_mibs_cache/0,1,2,3</seealso>,
+ <seealso marker="snmpa#enable_mibs_cache_autogc">enable_mibs_cache_autogc/0,1</seealso>,
+ <seealso marker="snmpa#disable_mibs_cache_autogc">disable_mibs_cache_autogc/0,1</seealso>,
+ <seealso marker="snmpa#update_mibs_cache_age">update_mibs_cache_age/1,2</seealso> and
+ <seealso marker="snmpa#update_mibs_cache_gclimit">update_mibs_cache_gclimit/1,2</seealso> for more info. </p>
+ <p>See also the
+ <seealso marker="snmp_app#configuration_params">configuration</seealso>
+ chapter for more info about the mib server cache options.</p>
+ <p>Own Id: OTP-8182</p>
+ <p>Aux Id: Seq 11383</p>
+ </item>
+
+ <item>
+ <p>[agent] A manager could no longer use the SNMPv3 user "initial"
+ as this was interpretated as the first step of the discovery. </p>
+ <p>Introduced a new terminating option, <c>trigger_username</c> to
+ make it possible to configure the username the agent reacts to.
+ Default is <c>""</c>. </p>
+ <p>See the
+ <seealso marker="snmp_app#configuration_params">configuration</seealso>
+ chapter for more info about the discovery options.</p>
+ <p>Own Id: OTP-8120</p>
+ <p>Aux Id: Seq 11361</p>
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[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.</p>
+ <p>Own Id: OTP-8116</p>
+ <p>Aux Id: Seq 11312</p>
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.13.5 -->
+
+
+ <section>
+ <title>SNMP Development Toolkit 4.13.4</title>
+
+ <p>Version 4.13.4 supports code replacement in runtime from/to
+ version 4.13.3, 4.13.2, 4.13.1 and 4.13.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+
+ <!--
+ <list type="bulleted">
+ <item>
+ <p>[agent] Support for the discovery process. </p>
+ <p>The agent can both initiate discovery itself (see the
+ <seealso marker="snmp_agent_funct_descr#discovery">discovery</seealso> chapter
+ for more info) and respond to discovery initiated by a manager.</p>
+ <p>Own Id: OTP-7571</p>
+ <p>Aux Id: Seq 11053</p>
+ </item>
+
+ </list>
+ -->
+
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[agent] Originating discovery problems. </p>
+ <p>Invalid state variable update during second stage of
+ discovery causes master agent crash. </p>
+ <p>Also the net_if process failed to activate socket
+ ({active, once}) after first discovery response was sent. </p>
+ <p>Own Id: OTP-8044</p>
+ <p>Aux Id: Seq 11295</p>
+ </item>
+
+ <item>
+ <p>[agent] Terminating discovery problem. </p>
+ <p>The reply to the second stage request should include a
+ varbind with <c>usmStatsNotInTimeWindows</c>.</p>
+ <p>Own Id: OTP-8062</p>
+ <p>Aux Id: Seq 11318</p>
+ </item>
+
+ <item>
+ <p>[agent] Originating discovery improvement. </p>
+ <p>Added the ExtraInfo argument to the
+ <seealso marker="snmpa#discovery">discovery</seealso> function.
+ This argument will be passed on to the stage1_finish callback
+ function. Also, the
+ <seealso marker="snmpa#discovery">discovery</seealso> function
+ will now always return <c>{ok, ManagerEngineID}</c> on successful
+ discovery. </p>
+ <p>The <seealso marker="snmpa_discovery_handler">discovery handler</seealso>
+ behaviour updated accordingly. </p>
+ <p>Own Id: OTP-8098</p>
+ <p>Aux Id: Seq 11346</p>
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.13.4 -->
+
+
+ <section>
+ <title>SNMP Development Toolkit 4.13.3</title>
+
+ <p>Version 4.13.3 supports code replacement in runtime from/to
+ version 4.13.2, 4.13.1 and 4.13.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+
+ <!--
+ <list type="bulleted">
+ <item>
+ <p>[agent] Support for the discovery process. </p>
+ <p>The agent can both initiate discovery itself (see the
+ <seealso marker="snmp_agent_funct_descr#discovery">discovery</seealso> chapter
+ for more info) and respond to discovery initiated by a manager.</p>
+ <p>Own Id: OTP-7571</p>
+ <p>Aux Id: Seq 11053</p>
+ </item>
+
+ </list>
+ -->
+
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[manager] A request for an oid of type BITS was actually
+ returned as OCTET STRING. </p>
+ <p>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). </p>
+ <p>This problem has now been fixed, but requires that the MIB
+ defining this mib-entry is loaded! </p>
+ <p>The utility function
+ <seealso marker="snmpm#oid_to_type">oid_to_type</seealso>
+ has been added, for debug purpose. </p>
+ <p>The utility function(s)
+ <seealso marker="snmp#octet_string_to_bits">octet_string_to_bits</seealso>
+ and
+ <seealso marker="snmp#bits_to_octet_string">bits_to_octet_string</seealso>
+ has also been added. These can be used if the user prefers to
+ handle the conversion on their own. </p>
+ <p>Own Id: OTP-8015</p>
+ <p>Aux Id: Seq 11285</p>
+ </item>
+
+ <item>
+ <p>[agent] Fixed some issues with the discovery handling. </p>
+ <p>Changed the API of the
+ <seealso marker="snmpa#discovery">discovery</seealso>
+ function to solve some
+ of these problems. </p>
+ <p>Introduced various options for controlling the discovery
+ process. See the
+ <seealso marker="snmp_app#configuration_params">configuration</seealso>
+ chapter for more info about the discovery options.</p>
+ <p>Own Id: OTP-8020</p>
+ <p>Aux Id: Seq 11295</p>
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.13.3 -->
+
+
+ <section>
+ <title>SNMP Development Toolkit 4.13.2</title>
+
+ <p>Version 4.13.2 supports code replacement in runtime from/to
+ version 4.13.1 and 4.13.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+
+ <!--
+ <list type="bulleted">
+ <item>
+ <p>[agent] Support for the discovery process. </p>
+ <p>The agent can both initiate discovery itself (see the
+ <seealso marker="snmp_agent_funct_descr#discovery">discovery</seealso> chapter
+ for more info) and respond to discovery initiated by a manager.</p>
+ <p>Own Id: OTP-7571</p>
+ <p>Aux Id: Seq 11053</p>
+ </item>
+
+ </list>
+ -->
+
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[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. </p>
+ <p>Own Id: OTP-7961</p>
+ <p>Aux Id: Seq 11275</p>
+ </item>
+
+ <item>
+ <p>[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. </p>
+ <p>Own Id: OTP-7977</p>
+ <p>Aux Id: Seq 11279</p>
+ </item>
+
+ <item>
+ <p>[manager] EngineId lookup fails when using version-3. </p>
+ <p>Own Id: OTP-7983</p>
+ <p>Aux Id: Seq 11275</p>
+ </item>
+
+ <item>
+ <p>[agent] As of version 4.13 the possible return values
+ of the function
+ <seealso marker="snmpa_mpd#process_packet">snmpa_mpd:process_packet/4</seealso>
+ changed, but this was not documented. </p>
+ <p>Own Id: OTP-7989</p>
+ <p>Aux Id: Seq 11275</p>
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.13.2 -->
+
+ <section>
+ <title>SNMP Development Toolkit 4.13.1</title>
+
+ <p>Version 4.13.1 supports code replacement in runtime from/to
+ version 4.13.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+
+ <!--
+ <list type="bulleted">
+ <item>
+ <p>[agent] Support for the discovery process. </p>
+ <p>The agent can both initiate discovery itself (see the
+ <seealso marker="snmp_agent_funct_descr#discovery">discovery</seealso> chapter
+ for more info) and respond to discovery initiated by a manager.</p>
+ <p>Own Id: OTP-7571</p>
+ <p>Aux Id: Seq 11053</p>
+ </item>
+
+ </list>
+ -->
+
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[manager] Registration of users had some issues. </p>
+ <p>Not all of the registration functions where actually exported
+ (<seealso marker="snmpm#register_user">register_user/4</seealso>
+ and
+ <seealso marker="snmpm#register_user_monitor">register_user_monitor/4</seealso>).
+ This has now been fixed. </p>
+ <p>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
+ <seealso marker="snmpm_user">snmpm_user</seealso>)
+ or the old user behaviour (<c>snmpm_user_old</c>)). </p>
+ <p>Own Id: OTP-7902</p>
+ <p>Aux Id: Seq 11240</p>
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.13.1 -->
+
+ <section>
+ <title>SNMP Development Toolkit 4.13</title>
+<!--
+ <p>Version 4.13 supports code replacement in runtime from/to
+ version 4.12.1.</p>
+-->
+
+ <section>
+ <title>Improvements and new features</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[agent] Support for the discovery process. </p>
+ <p>The agent can both initiate discovery itself (see the
+ <seealso marker="snmp_agent_funct_descr#discovery">discovery</seealso> chapter
+ for more info) and respond to discovery initiated by a manager.</p>
+ <p>Own Id: OTP-7571</p>
+ <p>Aux Id: Seq 11053</p>
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[agent] Unnecessary use of math:pow/2 could cause problems
+ on systems without floating point support. </p>
+ <p>Per Hedeland</p>
+ <p>Own Id: OTP-7735</p>
+ <!-- <p>Aux Id: Seq 10966</p> -->
+ </item>
+
+ <item>
+ <p>[manager] A major flaw was discovered with the agent handling. </p>
+ <p>First, <c>TargetName</c> was never used as intended, as a unique
+ identifier for the target (agent in this case). </p>
+ <p>Second, <c>TargetName</c> had a <em>default value</em>, which meant
+ that several agents could have the same <c>TargetName</c>, causing
+ unpredictable behaviour in the manager. </p>
+ <p>Third, <c>EngineID</c> was not a mandatory config option and had
+ furthermore also a <em>default value</em>. </p>
+
+ <p>These problems has been solved in the following way: </p>
+ <p>First, a new set of api functions has been introduced (and documented):
+ <seealso marker="snmpm#register_user">register_user/4</seealso>,
+ <seealso marker="snmpm#register_user_monitor">register_user_monitor/4</seealso>,
+ <seealso marker="snmpm#register_agent">register_agent/3</seealso>,
+ <seealso marker="snmpm#unregister_agent">unregister_agent/2</seealso>,
+ <seealso marker="snmpm#agent_info">agent_info/2</seealso>,
+ <seealso marker="snmpm#update_agent_info">update_agent_info/4</seealso>,
+ <seealso marker="snmpm#sync_get">sync_get/3,4,5,6</seealso>,
+ <seealso marker="snmpm#async_get">async_get/3,4,5,6</seealso>,
+ <seealso marker="snmpm#sync_get_next">sync_get_next/3,4,5,6</seealso>,
+ <seealso marker="snmpm#async_get_next">async_get_next/3,4,5,6</seealso>,
+ <seealso marker="snmpm#sync_set">sync_set/3,4,5,6</seealso>,
+ <seealso marker="snmpm#async_set">async_set/3,4,5,6</seealso>,
+ <seealso marker="snmpm#sync_get_bulk">sync_get_bulk/5,6,7,8</seealso> and
+ <seealso marker="snmpm#async_get_bulk">async_get_bulk/5,6,7,8</seealso>
+ that all use <c>TargetName</c> (and not, as previously, <c>Addr</c>
+ and <c>Port</c>) to identify the agent (also the return value of
+ <seealso marker="snmpm#which_agents">which_agents</seealso> has
+ been changed). </p>
+ <p>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
+ <c>Addr</c>, <c>Port</c> and <c>Version</c> config options. </p>
+ <p>Third, the behaviour of the
+ <seealso marker="snmpm_user">SNMP manager user</seealso> has
+ been changed to reflect this, i.e.
+ <seealso marker="snmpm_user#handle_pdu">handle_pdu/4</seealso>,
+ <seealso marker="snmpm_user#handle_trap">handle_trap/3</seealso>,
+ <seealso marker="snmpm_user#handle_inform">handle_inform/3</seealso>,
+ <seealso marker="snmpm_user#handle_report">handle_report/3</seealso>
+ and the return-value of
+ <seealso marker="snmpm_user#handle_agent">handle_agent/4</seealso>.
+ The old (non-documented) callback-functions (using Addr and Port)
+ will still be called if the agent was registered using the old
+ registration functions. </p>
+
+ <p>Own Id: OTP-7836</p>
+ <!-- <p>Aux Id: Seq 10966</p> -->
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.13 -->
+
+ <section>
+ <title>SNMP Development Toolkit 4.12.2</title>
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ <!--
+ <list type="bulleted">
+ <item>
+ <item>
+ <p>[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. </p>
+ <p>Per Hedeland</p>
+ <p>Own Id: OTP-7525</p>
+ </item>
+
+ </list>
+ -->
+
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[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). </p>
+ <p>Own Id: OTP-7868</p>
+ <!-- <p>Aux Id: Seq 11124</p> -->
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.12.2 -->
+
+ <section>
+ <title>SNMP Development Toolkit 4.12.1</title>
+ <p>Version 4.12.1 supports code replacement in runtime from/to
+ version 4.12, 4.11.2, 4.11.1 and 4.11.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ <!--
+ <list type="bulleted">
+ <item>
+ <item>
+ <p>[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. </p>
+ <p>Per Hedeland</p>
+ <p>Own Id: OTP-7525</p>
+ </item>
+
+ </list>
+ -->
+
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>Logging of messages with the GetBulk-request PDU
+ incorrectly produced an erroneous entry in the
+ log: "An error occurred". </p>
+ <p>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. </p>
+ <p>Own Id: OTP-7695</p>
+ <p>Aux Id: Seq 11124</p>
+ </item>
+
+ <item>
+ <p>[agent] An attempt to set the row status to active for an
+ notReady table row, could result in an "inconsistentValue"
+ error. </p>
+ <p>The same problem existed when attempting to set row status
+ to notInService for a row in notReady. </p>
+ <p>Serge Aleynikov</p>
+ <p>Own Id: OTP-7698</p>
+ <!-- <p>Aux Id: Seq 10966</p> -->
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.12.1 -->
+
+ <section>
+ <title>SNMP Development Toolkit 4.12</title>
+ <p>Version 4.12 supports code replacement in runtime from/to
+ version 4.11.2, 4.11.1 and 4.11.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[agent] A simple lookup cache has been added to improve
+ the mib server lookup performance. </p>
+ <p>This can be disabled with the mib_server
+ <seealso marker="snmp_app">cache</seealso> option. </p>
+ <p>Own Id: OTP-7346</p>
+ </item>
+
+ <item>
+ <p>[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. </p>
+ <p>Per Hedeland</p>
+ <p>Own Id: OTP-7525</p>
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <p>-</p>
+ <!--
+ <list type="bulleted">
+ <item>
+ <p>[manager] Encryption error when attempting to send
+ version 3 inform-requests. </p>
+ <p>Own Id: OTP-7432</p>
+ <p>Aux Id: Seq 10966</p>
+ </item>
+
+ </list>
+ -->
+
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.12 -->
+
+ <section>
+ <title>SNMP Development Toolkit 4.11.2</title>
+ <p>Version 4.11.2 supports code replacement in runtime from/to
+ version 4.11.1 and 4.11. </p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ <!--
+ <list type="bulleted">
+ <item>
+ <p>Added utility functions for transforming DateAndTime
+ as [int()] to strings;
+ <seealso marker="snmp#dat2s">date_and_time_to_string/2</seealso>
+ and
+ <seealso marker="snmp#dat2s2">date_and_time_to_string2/1</seealso>. </p>
+ <p>Also added new validation function
+ <seealso marker="snmp#vdat">validate_date_and_time/2</seealso>. </p>
+ <p>Own Id: OTP-7412</p>
+ <p>Aux Id: Seq 10987</p>
+ </item>
+ </list>
+ -->
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[manager] Erroneous engine-id check when receiving version 3
+ informs. </p>
+ <p>Own Id: OTP-7570</p>
+ <p>Aux Id: Seq 11060</p>
+ </item>
+
+ <item>
+ <p>Receiving an snmp message with a very large version
+ number could cause the erlang node to run out of
+ memory and consequently crash. </p>
+ <p>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. </p>
+ <p>Own Id: OTP-7575</p>
+ <p>Aux Id: Seq 11064</p>
+ </item>
+
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.11.2 -->
+
+
+ <section>
+ <title>SNMP Development Toolkit 4.11.1</title>
+ <p>Version 4.11.1 supports code replacement in runtime from/to
+ version 4.11.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[compiler] The MIB compiler did not retrieve the REFERENCE part
+ of a SNMP MIB definition. </p>
+ <p>This problem has been partly solved. For SNMP tables,
+ the assocList field of the tables mib-entry record now contains
+ this info (as <c>{reference, string()}</c>), <em>if</em> the
+ MIB was compiled with the compiler option <em>+reference</em>. </p>
+ <p>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. </p>
+ <p>See the
+ <seealso marker="snmpc#compiler_opts">compiler options</seealso>
+ for more info. </p>
+
+ <p>Serge Aleynikov</p>
+ <p>Own Id: OTP-7426</p>
+ </item>
+
+ <item>
+ <p>Added utility functions for transforming DateAndTime
+ as [int()] to strings;
+ <seealso marker="snmp#dat2s">date_and_time_to_string/2</seealso>
+ and
+ <seealso marker="snmp#dat2s2">date_and_time_to_string2/1</seealso>. </p>
+ <p>Also added new validation function
+ <seealso marker="snmp#vdat">validate_date_and_time/2</seealso>. </p>
+ <p>Own Id: OTP-7412</p>
+ <p>Aux Id: Seq 10987</p>
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[manager] Encryption error when attempting to send
+ version 3 inform-requests. </p>
+ <p>Own Id: OTP-7432</p>
+ <p>Aux Id: Seq 10966</p>
+ </item>
+
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.11.1 -->
+
+ <section>
+ <title>SNMP Development Toolkit 4.11</title>
+ <p>Version 4.11 supports code replacement in runtime from/to
+ version 4.10.3, 4.10.2, 4.10.1 and 4.10.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[agent] Performance improvements in the case when an SNMP
+ manager performs an snmpwalk. </p>
+ <p>Martin Bj&ouml;rklund</p>
+ <p>Own Id: OTP-7201</p>
+ </item>
+
+ <item>
+ <p>The API for sending inform(s) has been improved. Also
+ the documentation has been corrected and updated. See
+ <seealso marker="snmpa#send_notification">snmpa:send_notification</seealso> and
+ <seealso marker="snmpa_notification_delivery_info_receiver">snmpa_notification_delivery_info_receiver</seealso>
+ for more info.</p>
+ <p>Own Id: OTP-7287</p>
+ <p>Aux Id: Seq 10926</p>
+ </item>
+
+ <item>
+ <p>[agent] Performance of the internal database (local-db)
+ has been improved.</p>
+ <p>Own Id: OTP-7319</p>
+ <p>Aux Id: Seq 10942</p>
+ </item>
+
+ <item>
+ <p>[agent] Added utility functions,
+ <seealso marker="snmpa#restart_worker">snmpa:restart_worker/0,1</seealso> and
+ <seealso marker="snmpa#restart_set_worker">snmpa:restart_set_worker/0,1</seealso>,
+ for restarting the agent worker processes (in case the agent is
+ multi-threaded).</p>
+ <p>Own Id: OTP-7369</p>
+ </item>
+
+ <item>
+ <p>Add utility function to
+ <seealso marker="snmp#read_mib">read</seealso>
+ a compiled mib. </p>
+ <p>Own Id: OTP-7371</p>
+ </item>
+
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[manager] Encryption error when attempting to send
+ version 3 inform-requests. </p>
+ <p>Own Id: OTP-7377</p>
+ <p>Aux Id: Seq 10966</p>
+ </item>
+
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.11 -->
+
+ <!-- section>
+ <title>Release notes history</title>
+ <p>For information about older versions see
+ <url href="part_notes_history_frame.html">release notes history</url>.</p>
+ </section -->
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>SNMP Release Notes history</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>notes_history.xml</file>
+ </header>
+
+ <section>
+ <title>SNMP Development Toolkit 4.10.3</title>
+ <p>Version 4.10.3 supports code replacement in runtime from/to
+ version 4.10.2, 4.10.1 and 4.10.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <!--
+ <list type="bulleted">
+ <item>
+ <p>The snmp documentation source has been converted
+ from SGML to XML.</p>
+ <p>Own Id: OTP-6771</p>
+ </item>
+ </list>
+ -->
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] The configuration option
+ <seealso marker="snmp_app">inform_request_behaviour</seealso>
+ was not properly parsed, which caused the manager to revert
+ to the default value, <c>auto</c>. </p>
+ <p>Own Id: OTP-7219</p>
+ </item>
+
+ </list>
+ <!-- <p>-</p> -->
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.10.3 -->
+
+
+ <section> <!-- 4.10.2 -->
+ <title>SNMP Development Toolkit 4.10.2</title>
+
+ <p>Version 4.10.2 supports code replacement in run-time from/to
+ version 4.10.1 and 4.10</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <!--
+ <p>-</p>
+ -->
+
+ <list type="bulleted">
+ <item>
+ <p>[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. </p>
+ <p>Ola Samuelsson</p>
+ <p>Own Id: OTP-7160</p>
+ </item>
+
+ <item>
+ <p>[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. </p>
+ <p>Ola Samuelsson</p>
+ <p>Own Id: OTP-7158</p>
+ </item>
+
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[agent] Invalid variable value causes crashing agent worker
+ process when sending traps. </p>
+ <p>Own Id: OTP-7159</p>
+ </item>
+
+ <item>
+ <p>[agent] When sending a trap, the order of the variable
+ bindings not provided by the trap-sender, could be
+ mangled by the agent. </p>
+ <p>Ola Samuelsson</p>
+ <p>Own Id: OTP-7157</p>
+ </item>
+
+ <item>
+ <p>[agent] Uninstalling MEs when unloading mibs incorrect and
+ therefor never done. </p>
+ <p>Own Id: OTP-7153</p>
+ </item>
+
+ <item>
+ <p>[agent] snmp_generic:table_set_cols/3 did not handle unexpected
+ return values correctly when setting column values. </p>
+ <p>Serge Aleynikov</p>
+ <p>Own Id: OTP-7152</p>
+ </item>
+
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.10.2 -->
+
+
+ <section> <!-- 4.10.1 -->
+ <title>SNMP Development Toolkit 4.10.1</title>
+
+ <p>Version 4.10.1 supports code replacement in run-time from/to
+ version 4.10</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ <!--
+ <list type="bulleted">
+ <item>
+ <p>Added buffer sizes (both receive and send) of
+ the udp socket(s) info when calling the
+ <seealso marker="snmpa#info">agent info</seealso>
+ and
+ <seealso marker="snmpm#info">manager info</seealso>
+ function(s). </p>
+ <p>Own Id: OTP-6945</p>
+ </item>
+
+ </list>
+ -->
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <!--
+ <p>-</p>
+ -->
+ <list type="bulleted">
+ <item>
+ <p>[manager] Fixed usage of inet:gethostname/1. </p>
+ <p>Dialyzer</p>
+ <p>Own Id: OTP-7123</p>
+ </item>
+
+ <item>
+ <p>[agent] Remeoved invalid guard. There was an invalid
+ guard on the start function of the top agent
+ supervisor. </p>
+ <p>Dialyzer</p>
+ <p>Own Id: OTP-7121</p>
+ </item>
+
+ <item>
+ <p>[compiler] Old style fun cleanup in the MIB compiler. </p>
+ <p>Dialyzer</p>
+ <p>Own Id: OTP-7119</p>
+ </item>
+
+ <item>
+ <p>Corrected usage of function file:open/2 (the <c>Modes</c>
+ argument is a list). </p>
+ <p>Own Id: OTP-7110</p>
+ <!-- <p>Aux Id: Seq 10717</p> -->
+ </item>
+
+ <item>
+ <p>The SNMP application contains some (previously undocumented)
+ simple utility functions for function tracing (using dbg),
+ see
+ <seealso marker="snmp#enable_trace">enable_trace</seealso>,
+ <seealso marker="snmp#disable_trace">disable_trace</seealso>,
+ <seealso marker="snmp#set_trace1">set_trace/1</seealso>,
+ <seealso marker="snmp#reset_trace">reset_trace</seealso> and
+ <seealso marker="snmp#set_trace2">set_trace/2</seealso>
+ 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. </p>
+ <p>Own Id: OTP-7109</p>
+ <!-- <p>Aux Id: Seq 10717</p> -->
+ </item>
+
+ <item>
+ <p>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. </p>
+ <p>Martin Bj&ouml;rklund</p>
+ <p>Own Id: OTP-7083</p>
+ <!-- <p>Aux Id: Seq 10717</p> -->
+ </item>
+
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.10.1 -->
+
+
+ <section> <!-- 4.10 -->
+ <title>SNMP Development Toolkit 4.10</title>
+ <!--
+ <p>Version 4.10 supports code replacement in run-time from/to
+ version 4.9.6</p>
+ -->
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>Added buffer sizes (both receive and send) of
+ the udp socket(s) info when calling the
+ <seealso marker="snmpa#info">agent info</seealso>
+ and
+ <seealso marker="snmpm#info">manager info</seealso>
+ function(s). </p>
+ <p>Own Id: OTP-6945</p>
+ </item>
+
+ <item>
+ <p>[agent] Added the ability to change the request limit
+ in run-time, see
+ <seealso marker="snmpa#set_request_limit">set_request_limit</seealso>
+ for more info. </p>
+ <p>Own Id: OTP-6898</p>
+ </item>
+
+ <item>
+ <p>Added the ability to change the audit trail log type
+ in run-time (both agent and manager), see function(s)
+ <seealso marker="snmpm#set_log_type">[manager] set_log_type</seealso>
+ and
+ <seealso marker="snmpa#set_log_type">[agent] set_log_type</seealso>
+ for more info. </p>
+ <p>Own Id: OTP-6841</p>
+ </item>
+
+ <item>
+ <p>[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
+ <seealso marker="snmpa_network_interface_filter">network interface filter behaviour</seealso>.
+ See also the
+ <seealso marker="snmp_app#configuration_params">Configuring the application</seealso>
+ chapter of the User's Guide to see how to configure this
+ feature. </p>
+ <p>Own Id: OTP-6649</p>
+ </item>
+
+ </list>
+ <!--
+ <p>-</p>
+ -->
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <p>-</p>
+ <!--
+ <list type="bulleted">
+ <item>
+ <p>[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). </p>
+ <p>Own Id: OTP-6805</p>
+ <p>Aux Id: Seq 10717</p>
+ </item>
+
+ </list>
+ -->
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.10 -->
+
+ <section>
+ <title>SNMP Development Toolkit 4.9.6</title>
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <!--
+ <list type="bulleted">
+ <item>
+ <p>The snmp documentation source has been converted
+ from SGML to XML.</p>
+ <p>Own Id: OTP-6771</p>
+ </item>
+ </list>
+ -->
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[compiler] The MIB compiler did not handle import
+ of the macro from the MIB RFC1155-SMI. </p>
+ <p>Own Id: OTP-6840</p>
+ <p>Aux Id: Seq 10726</p>
+ </item>
+
+ <item>
+ <p>Bad length check (i.e. none) when decoding
+ AuthenticationParameters. </p>
+ <p>Own Id: OTP-6843</p>
+ </item>
+
+ </list>
+ <!-- <p>-</p> -->
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.9.6 -->
+
+ <section>
+ <title>SNMP Development Toolkit 4.9.5</title>
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <!--
+ <list type="bulleted">
+ <item>
+ <p>The snmp documentation source has been converted
+ from SGML to XML.</p>
+ <p>Own Id: OTP-6771</p>
+ </item>
+ </list>
+ -->
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[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). </p>
+ <p>Own Id: OTP-6805</p>
+ <p>Aux Id: Seq 10717</p>
+ </item>
+
+ <item>
+ <p>[agent] In version 4.9.4 some requests could be
+ handled single threaded regardless of the value of
+ the multi_thread config option. </p>
+ <p>Own Id: OTP-6815</p>
+ <p>Aux Id: Seq 10724</p>
+ </item>
+ </list>
+ <!-- <p>-</p> -->
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.9.4</title>
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>The snmp documentation source has been converted
+ from SGML to XML.</p>
+ <p>Own Id: OTP-6771</p>
+ </item>
+ </list>
+ <!-- <p>-</p> -->
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[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. </p>
+ <p>Own Id: OTP-6784</p>
+ <p>Aux Id: Seq 10689</p>
+ </item>
+ </list>
+ <!-- <p>-</p> -->
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.9.4 -->
+
+ <section>
+ <title>SNMP Development Toolkit 4.9.3</title>
+ <p>Version 4.9.3 supports code replacement in run-time from/to
+ version 4.9.2, 4.9.1 and 4.9.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[agent] Changing own [usm] pass-phrase when agent is
+ multi-threaded did not work.</p>
+ <p>Scott Lystig Fritchie</p>
+ <p>Martin Bj&ouml;rklund</p>
+ <p>Own Id: OTP-6712</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.9.2</title>
+ <p>Version 4.9.2 supports code replacement in run-time from/to
+ version 4.9.1, 4.9 &amp; 4.8.4.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[agent] Incorrect default verbosity (trace) for target cache.</p>
+ <p>Own Id: OTP-6571</p>
+ <p>Aux Id: Seq 10437</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.9.1</title>
+ <p>Version 4.9.1 supports code replacement in run-time from/to
+ version 4.9 &amp; 4.8.4.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[agent] Used wrong DEFVAL for vacmAccessStorageType
+ (volatile instead of nonVolatile) in SNMP-VIEW-BASED-ACM-MIB. </p>
+ <p>Martin Bj&ouml;rklund</p>
+ <p>Own Id: OTP-6569</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.9</title>
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>Added documentation for
+ <seealso marker="snmp#passwd2localized_key">snmp:passwd2localized_key/3</seealso>. </p>
+ <p>Own Id: OTP-6540</p>
+ </item>
+ <item>
+ <p>The
+ <seealso marker="snmp#config">snmp:config/0</seealso>
+ 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. </p>
+ <p>Own Id: OTP-6532</p>
+ </item>
+ <item>
+ <p>Minor documentation improvement for module snmp_generic. </p>
+ <p>Own Id: OTP-6518</p>
+ </item>
+ <item>
+ <p>[agent] Improve error handling of missing target params
+ config. </p>
+ <p>Own Id: OTP-6487</p>
+ </item>
+ <item>
+ <p>Minor improvement to the mnesia snmp indexing. </p>
+ <p>Own Id: OTP-6415</p>
+ </item>
+ <item>
+ <p>Include the INET-ADDRESS-MIB mib in the SNMP application. </p>
+ <p>Own Id: OTP-6383</p>
+ </item>
+ <item>
+ <p>Added utility modules to read, write and update the config
+ files of the
+ <seealso marker="snmpa_conf">agent</seealso> and
+ <seealso marker="snmpm_conf">manager</seealso>. </p>
+ <p>Own Id: OTP-6318</p>
+ </item>
+ <item>
+ <p>[agent] Improve behaviour during massive trap-
+ sending. This is done in two way's:</p>
+ <list type="bulleted">
+ <item>
+ <p>Improving performance of the target(s) cache
+ (which is used during trap/notification sending). </p>
+ </item>
+ <item>
+ <p>A slightly better flow control, making it more
+ difficult to actually overload the agent.</p>
+ </item>
+ </list>
+ <p>Own Id: OTP-6317</p>
+ <p>Aux Id: Seq 10437</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>Incorrect handling of decrypt failure resulting in
+ incorrect error reporting. Applies to both the
+ agent and the manager. Detected by dialyzer. </p>
+ <p>Own Id: OTP-6533</p>
+ </item>
+ <item>
+ <p>[manager] Invalid guard on function snmpm:agn/5
+ made it impossible to reach this particular clause.
+ Detected by dialyzer. </p>
+ <p>Own Id: OTP-6529</p>
+ </item>
+ <item>
+ <p>Miscellaneous minor corrections, such as
+ removing "dead code". Detected by dialyzer. </p>
+ <p>Own Id: OTP-6515</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.8.4</title>
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[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. </p>
+ <p>Own Id: OTP-6408</p>
+ <p>Aux Id: Seq 10547</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.8.3</title>
+ <p>Version 4.8.3 supports code replacement in run-time from/to
+ version 4.8.2, 4.8.1 and 4.8.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[agent] Verification of ViewTreeFamily
+ (SNMP-VIEW-BASED-ACM-MIB) incorrect.
+ No values other then <c>null</c> and <c>[]</c> where accepted. </p>
+ <p>Own Id: OTP-6337</p>
+ <p>Aux Id: Seq 10509</p>
+ </item>
+ <item>
+ <p>[agent] Start with type <c>takeover</c> did not work. </p>
+ <p>Own Id: OTP-6340</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.8.2</title>
+ <p>Version 4.8.2 supports code replacement in run-time from/to
+ version 4.8.1 and 4.8.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>Add time-stamp to the verbosity printouts. </p>
+ <p>Own Id: OTP-6214</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>A badly formatted debug printout caused console printouts. </p>
+ <p>Own Id: OTP-6247</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.8.1</title>
+ <p>Version 4.8.1 supports code replacement in run-time from/to
+ version 4.8, 4.7.4 and 4.7.3.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>Removed an io:format in mini mib utility (used when
+ converting logs). </p>
+ <p>Own Id: OTP-6177</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.8</title>
+ <p>Version 4.8 supports code replacement in run-time from/to
+ version 4.7.4 and 4.7.3.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>Added a config option, <c>sndbuf</c>, for the net_if-module(s).
+ See
+ <seealso marker="snmp_app">application configuration</seealso> or
+ <seealso marker="snmp_config">running the application</seealso>
+ for more info (look for manager_net_if_options and
+ agent_net_if_options). </p>
+ <p>Own Id: OTP-6137</p>
+ </item>
+ <item>
+ <p>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.</p>
+ <p>Own Id: OTP-6149</p>
+ </item>
+ <item>
+ <p>Performance improvement when converting audit trail logs.</p>
+ <p>Own Id: OTP-6164</p>
+ <p>Aux Id: Seq 10362</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[compiler] Allow empty definitions for SMI-II mibs,
+ i.e. mibs are allowed to only contain the
+ MODULE-IDENTITY construct. </p>
+ <p>Own Id: OTP-6150</p>
+ <p>Aux Id: Seq 10333</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.7.4</title>
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>Add another example,
+ <seealso marker="snmp_impl_example_manager">ex2</seealso>.
+ This example is basically a simple manager module. </p>
+ <p>Own Id: OTP-6042</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[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.</p>
+ <p>Own Id: OTP-6077</p>
+ </item>
+ <item>
+ <p>[manager] Type guard error.</p>
+ <p>Kostis Sagonas.</p>
+ <p>Own Id: OTP-6074 (dialyzer)</p>
+ </item>
+ <item>
+ <p>Misc Dialyzer warnings.</p>
+ <p>Own Id: OTP-6068</p>
+ </item>
+ <item>
+ <p>[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.</p>
+ <p>Own Id: OTP-6062</p>
+ </item>
+ <item>
+ <p>Misc doc corrections.</p>
+ <p>Own Id: OTP-6044</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.7.3</title>
+ <p>Version 4.7.3 supports code replacement in run-time from/to
+ version 4.7.2, 4.7.1 and 4.7.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>Misc compiler warning cleanup.</p>
+ <p>Own Id: OTP-6031</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.7.2</title>
+ <p>Version 4.7.2 supports code replacement in run-time from/to
+ version 4.7.1 and 4.7.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>[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
+ <seealso marker="snmpm_user#handle_error">handle_error</seealso>
+ callback function, in the <c>Reason</c> argument.
+ This has now been changed so that instead, the
+ <c>Reason</c> argument will get a <c>empty message</c>
+ value.</p>
+ <p>See
+ <seealso marker="snmpm_user#handle_error">handle_error</seealso>
+ for more details. </p>
+ <p>Own Id: OTP-6024</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] Some error cases are reported to the 'user'
+ with the ReqId and Reason swapped in the call to the
+ <seealso marker="snmpm_user#handle_error">handle_error</seealso>
+ callback function.</p>
+ <p>Own Id: OTP-5992</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.7.1</title>
+ <p>Version 4.7.1 supports code replacement in run-time from/to
+ version 4.7, 4.6.1 and 4.6.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>Added new version info print functions,
+ <seealso marker="snmp#print_version_info">print_version_info</seealso>.</p>
+ <p>Own Id: OTP-5968</p>
+ </item>
+ <item>
+ <p>Updated the documentation for the
+ <seealso marker="snmpa#log_to_txt">agent</seealso> and
+ <seealso marker="snmpm#log_to_txt">manager</seealso>
+ log_to_txt functions.</p>
+ <p>Own Id: OTP-5969</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] The supervision structure contained several
+ errors which unnecessarily caused a complete restart of
+ the manager.</p>
+ <p>Own Id: OTP-5963</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.7</title>
+ <p>Version 4.7 supports code replacement in run-time from/to
+ version 4.6.1 and 4.6.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>Add simple backup mechanism,
+ see <seealso marker="snmpa#backup">agent backup</seealso>
+ and <seealso marker="snmpm#backup">manager backup</seealso>.</p>
+ <p>Own Id: OTP-5870</p>
+ </item>
+ <item>
+ <p>Improve handling of faulty data base files.</p>
+ <p>Added new agent and manager config option,
+ <c>db_init_error</c>, see
+ <seealso marker="snmp_config">config</seealso> for more
+ info.</p>
+ <p>Own Id: OTP-5934</p>
+ <p>Aux Id: Seq 10202</p>
+ </item>
+ <item>
+ <p>Added possibility to configure restart type for each of
+ the components (default is permanent for the agent and
+ transient for the manager).
+ See <seealso marker="snmp_config">config</seealso> for more
+ info.</p>
+ <p>Own Id: OTP-5935</p>
+ </item>
+ <item>
+ <p>[compiler] Improve error printouts.</p>
+ <p>Own Id: OTP-5937</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.6.1</title>
+ <p>Version 4.6.1 supports code replacement in run-time from/to
+ version 4.6.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[agent] SNMP sha/aes decryption did not work. </p>
+ <p>Magnus Fr&ouml;berg</p>
+ <p>Own Id: OTP-5834</p>
+ </item>
+ <item>
+ <p>[agent] The SNMP agent internal data base (local db)
+ uses dets, and does not properly handle error's from
+ e.g. lookup.</p>
+ <p>Own Id: OTP-5838</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.6</title>
+ <p>Version 4.6 supports code replacement in run-time from/to
+ version 4.5.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>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
+ <seealso marker="snmp#start_agent">start_agent</seealso> and
+ <seealso marker="snmp#start_manager">start_manager</seealso>.</p>
+ <p>Own Id: OTP-5797</p>
+ <p>Aux Id: Seq 10128</p>
+ </item>
+ <item>
+ <p>[agent] Adding utility function to convert old
+ application config to current agent config.
+ See the <seealso marker="snmpa#convert_config">convert_config</seealso>
+ for more info.</p>
+ <p>Own Id: OTP-5787</p>
+ </item>
+ <item>
+ <p>Improved handling of audit trail logs.
+ See the <seealso marker="snmp_app">atl_repair</seealso>
+ config for more info.</p>
+ <p>Own Id: OTP-5771</p>
+ </item>
+ <item>
+ <p>[manager] Introduced the
+ <seealso marker="snmpm#notify_started">notify_started</seealso>
+ function used by a <em>client</em> to get a notification
+ when the manager is started.</p>
+ <p>Own Id: OTP-5763</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>Misc documentation corrections.</p>
+ <p>Own Id: OTP-5829</p>
+ <p>Aux Id: Seq 10152</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.5</title>
+ <p>Version 4.5 supports code replacement in run-time from/to
+ version 4.4.1 and 4.4.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] Introduced the
+ <seealso marker="snmp_app">inform request behaviour</seealso>
+ configuration option to allow the user to specify
+ how/when the manager shall acknowledge inform-request's.</p>
+ <p>Own Id: OTP-5733</p>
+ </item>
+ <item>
+ <p>[manager] In order to improve application behaviour,
+ all callback function (see the
+ <seealso marker="snmpm_user">snmpm_user behaviour</seealso>)
+ calls
+ are now done by spawned processes (and not as previously
+ by the SNMP manager server process).</p>
+ <p>Own Id: OTP-5726</p>
+ </item>
+ <item>
+ <p>[manager] In order to present the various error
+ reason's returned by the manager, a
+ <seealso marker="snmpm#format_reason">format_reason</seealso>
+ 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 <seealso marker="snmpm">snmpm</seealso> module)
+ as well as the
+ <c>Reason</c> argument of the
+ <seealso marker="snmpm_user#handle_error">handle_error</seealso>
+ function of the
+ <seealso marker="snmpm_user">user callback module</seealso>.</p>
+ <p>Own Id: OTP-5581</p>
+ <p>Aux Id: Seq 9870</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] The (error) report according to RFC 2572, chapter
+ 7.2 point 6) was never sent.</p>
+ <p>Own Id: OTP-5742</p>
+ </item>
+ <item>
+ <p>[agent] Check of notification name collision
+ could fail due to incorrect record name (assumed to
+ be <c>#trap</c>, but could also be <c>#notification</c>).
+ This only cases a problem when the application is
+ compiled with the strict_record_tests option.</p>
+ <p>Own Id: OTP-5740</p>
+ </item>
+ <item>
+ <p>[agent] Table get-request failure in some cases.</p>
+ <p>Own Id: OTP-5732</p>
+ <p>Aux Id: Seq 10087</p>
+ </item>
+ <item>
+ <p>Explicitly sync all audit trail log's upon termination.</p>
+ <p>Own Id: OTP-5727</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] The
+ <seealso marker="snmpm_network_interface">snmpm_network_interface</seealso>
+ behaviour has been updated (see
+ <seealso marker="snmpm_network_interface#inform_response">inform_response</seealso> and
+ <seealso marker="snmp_manager_netif">definition of the manager net if</seealso>).</p>
+ <p>Own Id: OTP-5733</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.4.1</title>
+ <p>Version 4.4.1 supports code replacement in run-time from/to
+ version 4.4.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>[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
+ <seealso marker="snmpm#monitor">monitor</seealso>
+ (and <seealso marker="snmpm#demonitor">demonitor</seealso>)
+ function has been added.</p>
+ <p>Own Id: OTP-5720</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[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.</p>
+ <p>Own Id: OTP-5719</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.4</title>
+ <p>Version 4.4 supports code replacement in run-time from/to
+ version 4.3.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>Updated and extended the
+ <seealso marker="snmpa#info">agent</seealso>
+ info retrieval function. Also added an info retrieval
+ function for the
+ <seealso marker="snmpm#info">manager</seealso>.</p>
+ <p>Own Id: OTP-5666</p>
+ </item>
+ <item>
+ <p>[manager] Added get-bulk functionality, see (sync) get-bulk
+ and (async) get-bulk for more info.</p>
+ <p>Own Id: OTP-5669</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[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).</p>
+ <p>Own Id: OTP-5675</p>
+ </item>
+ <item>
+ <p>[manager] The out packet counter was not incremented for
+ sent v1/v2 messages.</p>
+ <p>Own Id: OTP-5676</p>
+ </item>
+ <item>
+ <p>[manager] The request GC process was started with the
+ wrong default value (idle) which could (unlikely but
+ still) cause problems after a code-change.</p>
+ <p>Own Id: OTP-5678</p>
+ </item>
+ <item>
+ <p>Bad handling of error cases (corrupt log file) when
+ converting log files (i.e. when calling the function
+ log_to_txt).</p>
+ <p>Own Id: OTP-5703</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <list type="bulleted">
+ <item>
+ <p>[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
+ <seealso marker="snmpa#old_info_format">old_info_format</seealso>).</p>
+ <p>function. </p>
+ <p>Own Id: OTP-5666</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.3</title>
+ <p>Version 4.3 supports code replacement in run-time from/to
+ version 4.2.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] Improved async error reporting.</p>
+ <p>Own Id: OTP-5637</p>
+ <p>Aux Id: Seq 9970</p>
+ </item>
+ <item>
+ <p>Added support for The Advanced Encryption Standard (AES)
+ Cipher Algorithm in the SNMP User-based Security Model
+ (RFC 3826). Both agent and manager. </p>
+ <p>Martin Bj&ouml;rklund</p>
+ <p>Own Id: OTP-5490</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] Reset of USM-cache when unregister agent.</p>
+ <p>Own Id: OTP-5636</p>
+ <p>Aux Id: Seq 9970</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.2</title>
+ <p>Version 4.2 supports code replacement in run-time from/to
+ version 4.1.5.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] Added another get, get-next and set function
+ with another argument, <c>ExtraInfo</c> (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.</p>
+ <p>Own Id: OTP-5574</p>
+ <p>Aux Id: Seq 9850</p>
+ </item>
+ <item>
+ <p>[manager] <c>report</c> 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.</p>
+ <p>Own Id: OTP-5578</p>
+ <p>Aux Id: Seq 9850</p>
+ </item>
+ <item>
+ <p>[manager] Added a
+ <seealso marker="snmpm#unregister_usm_user">unregister_usm_user</seealso> function.</p>
+ <p>Own Id: OTP-5580</p>
+ <p>Aux Id: Seq 9850</p>
+ </item>
+ <item>
+ <p>[agent] Added new functions to get lists of all tables,
+ <seealso marker="snmpa#which_tables">which_tables</seealso>,
+ and variables,
+ <seealso marker="snmpa#which_variables">which_variables</seealso>,
+ known to the agent.</p>
+ <p>Own Id: OTP-5590</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] Incorrect SHA-key length check when
+ updating usm-user info (should have been 20 but
+ was 16).</p>
+ <p>Own Id: OTP-5579</p>
+ <p>Aux Id: Seq 9850</p>
+ </item>
+ <item>
+ <p>[compiler] Incorrect error report when the name of the
+ field and object is the same. </p>
+ <p>Kostis Sagonas</p>
+ <p>Own Id: OTP-5591 (dialyzer)</p>
+ </item>
+ <item>
+ <p>[manager] Arguments Port (third argument) and CtxName
+ (fourth argument) where swapped in snmpm:g/5
+ when forwarding call. </p>
+ <p>Kostis Sagonas</p>
+ <p>Own Id: OTP-5592 (dialyzer)</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] The <c>snmpm_network_interface</c> behaviour has changed.
+ One more argument (ExtraInfo) was added to the
+ function send_pdu (see
+ <seealso marker="snmpm_network_interface#send_pdu">send_pdu</seealso>).</p>
+ <p>Own Id: OTP-5574</p>
+ <p>Aux Id: Seq 9850</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.1.5</title>
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>[agent] Add mapping of notification oid to alias-name. </p>
+ <p>Martin Bj&ouml;rklund</p>
+ <p>Own Id: OTP-5562</p>
+ </item>
+ <item>
+ <p>[manager] Late (async) reply incorrectly delivered to
+ user via handle_pdu instead of handle_error.</p>
+ <p>Own Id: OTP-5506</p>
+ <p>Aux Id: Seq 9804</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] Security level handled incorrectly.</p>
+ <p>Own Id: OTP-5564</p>
+ <p>Aux Id: Seq 9850</p>
+ </item>
+ <item>
+ <p>[manager] (v3) Encryption/decryption failure.</p>
+ <p>Own Id: OTP-5560</p>
+ <p>Aux Id: Seq 9850</p>
+ </item>
+ <item>
+ <p>[manager] Cannot handle version-1 traps.</p>
+ <p>Own Id: OTP-5557</p>
+ <p>Aux Id: Seq 9850</p>
+ </item>
+ <item>
+ <p>[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.</p>
+ <p>Own Id: OTP-5556</p>
+ <p>Aux Id: Seq 9850</p>
+ </item>
+ <item>
+ <p>[agent] Error's reported by the SecModule (v3) when
+ generating outgoing message was not handled correctly
+ in message processing dispatcher module.</p>
+ <p>Own Id: OTP-5550</p>
+ </item>
+ <item>
+ <p>[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.</p>
+ <p>Own Id: OTP-5548</p>
+ <p>Aux Id: Seq 9804</p>
+ </item>
+ <item>
+ <p>[agent] Failure to stop the snmp application when
+ started with the old config type.</p>
+ <p>Own Id: OTP-5547</p>
+ <p>Aux Id: Seq 9842</p>
+ </item>
+ <item>
+ <p>[manager] User unregistration after reboot causes process crash
+ (snmpm_server).</p>
+ <p>Own Id: OTP-5539</p>
+ </item>
+ <item>
+ <p>[manager] Security engine id look-up errors.</p>
+ <p>Own Id: OTP-5508</p>
+ <p>Aux Id: Seq 9804</p>
+ </item>
+ <item>
+ <p>[manager] Registering of USM users erroneous.</p>
+ <p>Own Id: OTP-5505</p>
+ <p>Aux Id: Seq 9804</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.1.4</title>
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>Fixed a perl related problem in the mibs Makefile. </p>
+ <p>Geoff White</p>
+ <p>Own Id: OTP-5491</p>
+ </item>
+ <item>
+ <p>[manager] Failed to register usm users. Both using the
+ usm config file
+ (<seealso marker="snmp_manager_config_files#usm_user">usm.conf</seealso>)
+ and the API functions
+ <seealso marker="snmpm#register_usm_user">register_usm_user</seealso></p>
+ <p>Own Id: OTP-5499</p>
+ <p>Aux Id: Seq 9804</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.1.3</title>
+ <p>Version 4.1.3 supports code replacement in run-time from/to
+ version 4.1.2, 4.1.1 and 4.1.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>Added utility functions to update agent and manager
+ config files.</p>
+ <p>Own Id: OTP-5468</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[agent] Error replies was composed with invalid OIDs for the
+ following error counters:
+ <em>usmStatsWrongDigests</em> (RFC 2574, chap 3.2, point 6),
+ <em>usmStatsUnsupportedSecLevels</em> (point 5) and
+ <em>usmStatsDecryptionErrors</em> (point 8a).</p>
+ <p>Own Id: OTP-5464</p>
+ <p>Aux Id: Seq 9791</p>
+ </item>
+ <item>
+ <p>[agent] Malformed Oid returned from a get_next operation as
+ part of a get-bulk-request causes the agent to crash.</p>
+ <p>Own Id: OTP-5465</p>
+ <p>Aux Id: Seq 9783, Seq 9793</p>
+ </item>
+ <item>
+ <p>[agent] Missing catch on decode function call.</p>
+ <p>Kostis Sagonas (Dialyzer)</p>
+ <p>Own Id: OTP-5479</p>
+ </item>
+ <item>
+ <p>[manager] Invalid check for illegal options.</p>
+ <p>Kostis Sagonas (Dialyzer</p>
+ <p>Own Id: OTP-5480</p>
+ </item>
+ <item>
+ <p>Faulty utility function for generation of agent
+ config file target_addr.conf.</p>
+ <p>Own Id: OTP-5482</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit 4.1.2</title>
+ <p>Version 4.1.2 supports code replacement in run-time from/to
+ version 4.1.1 and 4.1.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>Export utility functions to create agent and manager
+ config files.</p>
+ <p>Own Id: OTP-5390</p>
+ </item>
+ <item>
+ <p>[agent] Documented instrumentation utility functions
+ (e.g. <seealso marker="snmpa#current_request_id">current_request_id</seealso>).</p>
+ <p>Own Id: OTP-5423</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[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. </p>
+ <p>Own Id: OTP-5370</p>
+ </item>
+ <item>
+ <p>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. </p>
+ <p>Own Id: OTP-5394</p>
+ </item>
+ <item>
+ <p>[manager] Corrected the discovery handling of the manager.</p>
+ <p>Own Id: OTP-5414</p>
+ </item>
+ <item>
+ <p>[manager] Statistic counter creation correction.</p>
+ <p>Own Id: OTP-5415</p>
+ </item>
+ <item>
+ <p>[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.</p>
+ <p>Own Id: OTP-5424</p>
+ </item>
+ <item>
+ <p>[manager] The manager net_if process failed to properly handle
+ the case bind_to option value true.</p>
+ <p>Own Id: OTP-5431</p>
+ </item>
+ <item>
+ <p>[agent] Various minor mnesia-related fixes.</p>
+ <p>Martin Bj&ouml;rklund</p>
+ <p>Own Id: OTP-5433</p>
+ </item>
+ <item>
+ <p>[manager] Missing interface functions for loading and
+ unloading mibs into/from the manager:
+ <seealso marker="snmpm#load_mib">load_mib</seealso>,
+ <seealso marker="snmpm#unload_mib">unload_mib</seealso>,
+ <seealso marker="snmpm#which_mibs">which_mibs</seealso>,
+ <seealso marker="snmpm#name_to_oid">name_to_oid</seealso> and
+ <seealso marker="snmpm#oid_to_name">oid_to_name</seealso>.</p>
+ <p>Own Id: OTP-5441</p>
+ </item>
+ <item>
+ <p>Added utility functions to retrieve some system and application
+ info, see <seealso marker="snmp#versions1">versions1</seealso> and
+ <seealso marker="snmp#versions2">versions2</seealso>.</p>
+ <p>Own Id: OTP-5445</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit v4.1.1</title>
+ <p>Version 4.1.1 supports code replacement in run-time from/to
+ version 4.1. </p>
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] Manager synchronous get-function with timeout erroneous.
+ Results in a function clause.</p>
+ <p>Own Id: OTP-5364</p>
+ </item>
+ <item>
+ <p>Replace in decoder fun's of the "old style" fun format,
+ {atom(), atom()}, with a proper fun, e.g. "fun the_function/1".</p>
+ <p>Own Id: OTP-5365</p>
+ </item>
+ <item>
+ <p>[manager] Register agent using the config file
+ agents.conf failed due to incorrect function guard.</p>
+ <p>Own Id: OTP-5367</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit v4.1.0</title>
+ <p>Version 4.1.0 supports code replacement in run-time from/to
+ version 4.0.4. </p>
+ <p>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.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] Added possibility to monitor a registered user.
+ See <seealso marker="snmpm#register_user_monitor">snmpm:register_user_monitor</seealso>.</p>
+ <p>Own Id: OTP-5286</p>
+ </item>
+ <item>
+ <p>[agent] Improved symbolic store. Alias and Oids where stored
+ with similar key's (separated by types: atom() and
+ lists() respectively). Also added new function:
+ <seealso marker="snmpa#which_aliasnames">snmpa:which_aliasnames</seealso>.</p>
+ <p>Own Id: OTP-5298</p>
+ </item>
+ <item>
+ <p>[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.</p>
+ <p>Own Id: OTP-5308</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>Misspelled deprecated function. Non-existent function
+ snmp:is_constistent/1 was marked as deprecated. Should
+ have been snmp:is_consistent/1).</p>
+ <p>Own Id: OTP-5273</p>
+ </item>
+ <item>
+ <p>[agent] Unclear documentation for function
+ <seealso marker="snmpa#send_notification">snmpa:send_notification</seealso>. The Recv argument
+ (specifically the {M,F,A} variant).</p>
+ <p>Own Id: OTP-5281</p>
+ </item>
+ <item>
+ <p>[manager] It was never documented how the default
+ <seealso marker="snmpm_user">user behaviour</seealso>
+ could be overridden (default user is the module
+ <c>snmpm_user_default</c>).
+ See <seealso marker="snmp_app">application configuration</seealso> or
+ <seealso marker="snmp_config#configuration_params">configuration params</seealso>.</p>
+ <p>Own Id: OTP-5299</p>
+ </item>
+ <item>
+ <p>[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 <em>log</em> or higher. </p>
+ <p>This also effects the application downgrade. </p>
+ <p>Own Id: OTP-5306</p>
+ </item>
+ <item>
+ <p>[agent] The agent config file, target_addr.conf, was
+ incorrectly described in the
+ <seealso marker="snmp_agent_config_files#target_addr">Target Address Definitions</seealso> chapter of the
+ User's Guide. The EngineId option was left out.</p>
+ <p>Own Id: OTP-5307</p>
+ <p>Aux Id: Seq 9689</p>
+ </item>
+ <item>
+ <p>[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.</p>
+ <p>Own Id: OTP-5314</p>
+ </item>
+ <item>
+ <p>[manager] Erroneous function guards made it possible to update
+ some agent info (that should be "static").</p>
+ <p>Own Id: OTP-5315</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit v4.0.4</title>
+ <p>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.
+ </p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] The timeout calculation for the request
+ gc timer incorrect.</p>
+ <p>Own Id: OTP-5267</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit v4.0.3</title>
+ <p>Version 4.0.3 supports code replacement in run-time from/to
+ version 4.0.2, 4.0.1 and 4.0. </p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <p>-</p>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[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).</p>
+ <p>Own Id: OTP-5256</p>
+ </item>
+ <item>
+ <p>[manager] Unnecessary error message when receiving trap from
+ unregistered agent or agent using other port then the
+ request port for trap-sending.</p>
+ <p>Own Id: OTP-5258</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit v4.0.2</title>
+ <p>Version 4.0.2 supports code replacement in run-time from/to
+ version 4.0.1 and 4.0.
+ </p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>[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 <seealso marker="snmpm_user">snmpm_user</seealso>) is
+ called. </p>
+ <p>Own Id: OTP-5242</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] The arguments CtxName and Port was swapped in the
+ function snmpm:g/6.</p>
+ <p>Own Id: OTP-5225</p>
+ </item>
+ <item>
+ <p>[manager] TRAP receive fails for unknown agent due to
+ failing message size calculation.</p>
+ <p>Own Id: OTP-5241</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] Introduced a new callback function in the behaviour
+ <seealso marker="snmpm_user">snmpm_user</seealso>.</p>
+ <p>Own Id: OTP-5242</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit v4.0.1</title>
+ <p>Version 4.0.1 supports code replacement in run-time from/to version 4.0.
+ </p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>[agent] Added functions to get a list of all mibs loaded into
+ an agent
+ (see <seealso marker="snmpa#which_mibs">snmpa:which_mibs</seealso>)
+ and to get the (full path) file name of a loaded mib (see
+ <seealso marker="snmpa#whereis_mib">snmpa:whereis_mib</seealso>).</p>
+ <p>Own Id: OTP-5187</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[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.</p>
+ <p>Own Id: OTP-5196</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP Development Toolkit v4.0</title>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>[manager] Added a proper snmp manager.</p>
+ <p>Major restructure of the application in order to
+ incorporate the new manager.</p>
+ </item>
+ <item>
+ <p>[agent] Add a <c>snmpa:get/3</c> with an extra <c>Context</c>
+ argument. Also added similar <c>snmpa:get_next/2,3</c> functions.
+ See <seealso marker="snmpa#get">snmpa:get</seealso> and
+ <seealso marker="snmpa#get_next">snmpa:get_next</seealso>. </p>
+ <p>Martin Bj&ouml;rklund</p>
+ <p>Own Id: OTP-5054</p>
+ </item>
+ <item>
+ <p>[agent] Add <em>notification filters</em>. See
+ <seealso marker="snmpa_notification_filter">snmpa_notification_filter</seealso>,
+ <seealso marker="snmpa#register_notification_filter">register_notification_filter</seealso>,
+ <seealso marker="snmpa#unregister_notification_filter">unregister_notification_filter</seealso> and
+ <seealso marker="snmpa#which_notification_filter">which_notification_filter</seealso>.</p>
+ <p>Own Id: OTP-5055</p>
+ </item>
+ <item>
+ <p>[agent] Added two mib look-up functions,
+ <seealso marker="snmpa#me_of">me_of</seealso> and
+ <seealso marker="snmpa#mib_of">mib_of</seealso>.</p>
+ <p>Own Id: OTP-5082</p>
+ <p>Aux Id: Seq 8848</p>
+ </item>
+ <item>
+ <p>[compiler] The MIB compiler is now (source code) independent
+ of the rest of the application (and vice versa).</p>
+ </item>
+ <item>
+ <p>[compiler] DISPLAY-HINT and UNITS included in the
+ compiled mib.</p>
+ <p>Own Id: OTP-5053</p>
+ </item>
+ <item>
+ <p>[compiler] Added compiler options <c>imports</c> and
+ <c>module_identity</c> to include the imports list and
+ module identity (only SMIv2) info in the compiled mib,
+ see <seealso marker="snmpc">snmpc</seealso>.</p>
+ </item>
+ <item>
+ <p>[compiler] Added the MIB compiler option
+ <c>+no_defs</c>, see <seealso marker="snmpc">snmpc</seealso>.</p>
+ <p>Martin Bj&ouml;rklund</p>
+ </item>
+ <item>
+ <p>[compiler] Added the MIB compiler option
+ <c>+'{module, atom()}'</c>,
+ see <seealso marker="snmpc">snmpc</seealso>. </p>
+ <p>Martin Bj&ouml;rklund</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Reported Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>[agent] Failing MIB configure/reconfigure was difficult
+ to diagnose. Added better error handling and verbosity.</p>
+ </item>
+ <item>
+ <p>[compiler] Added "default value" for INTEGER with enumeration
+ without a DEFVAL clause.
+ The lowest valid integer value is chosen for the
+ variable_info defval.</p>
+ <p>Own Id: OTP-5124</p>
+ <p>Aux Id: Seq 8738</p>
+ </item>
+ <item>
+ <p>[compiler] Unnecessarily reserved words in the mib compiler
+ can cause some enumeration definitions to fail.</p>
+ <p>Martin Bj&ouml;rklund</p>
+ <p>Own Id: OTP-5066</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <list type="bulleted">
+ <item>
+ <p>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 <seealso marker="snmp_app">application configuration</seealso> or
+ <seealso marker="snmp_config#configuration_params">configuration params</seealso> for more info.</p>
+ </item>
+ <item>
+ <p>Three new interface modules have been introduced. One
+ for each of the individual parts of the application:</p>
+ <list type="bulleted">
+ <item>
+ <p>[agent] <c>snmpa</c></p>
+ </item>
+ <item>
+ <p>[manager] <c>snmpm</c></p>
+ </item>
+ <item>
+ <p>[compiler] <c>snmpc</c></p>
+ </item>
+ </list>
+ <p>The primary interface module, <c>snmp</c>, 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.</p>
+ <p>Some previously already deprecated functions has been
+ removed (since they in turn was dependent on deprecated
+ functions, see calendar).</p>
+ </item>
+ <item>
+ <p>[agent] The agent network interface API has changed.
+ See <seealso marker="snmp_agent_netif">snmp agent net if</seealso>,</p>
+ </item>
+ <item>
+ <p>[agent] The default agent audit trail log name has changed.</p>
+ </item>
+ <item>
+ <p>[compiler] Mib format has changed (see OTP-5053 above).</p>
+ </item>
+ </list>
+ </section>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE part SYSTEM "part.dtd">
+
+<part xmlns:xi="http://www.w3.org/2001/XInclude">
+ <header>
+ <copyright>
+ <year>1996</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>SNMP User's Guide</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>part.xml</file>
+ </header>
+ <description>
+ <p>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.</p>
+ </description>
+ <xi:include href="snmp_intro.xml"/>
+ <xi:include href="snmp_agent_funct_descr.xml"/>
+ <xi:include href="snmp_manager_funct_descr.xml"/>
+ <xi:include href="snmp_mib_compiler.xml"/>
+ <xi:include href="snmp_config.xml"/>
+ <xi:include href="snmp_agent_config_files.xml"/>
+ <xi:include href="snmp_manager_config_files.xml"/>
+ <xi:include href="snmp_impl_example_agent.xml"/>
+ <xi:include href="snmp_impl_example_manager.xml"/>
+ <xi:include href="snmp_instr_functions.xml"/>
+ <xi:include href="snmp_def_instr_functions.xml"/>
+ <xi:include href="snmp_agent_netif.xml"/>
+ <xi:include href="snmp_manager_netif.xml"/>
+ <xi:include href="snmp_audit_trail_log.xml"/>
+ <xi:include href="snmp_advanced_agent.xml"/>
+ <xi:include href="snmp_app_a.xml"/>
+ <xi:include href="snmp_app_b.xml"/>
+</part>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE part SYSTEM "part.dtd">
+
+<part xmlns:xi="http://www.w3.org/2001/XInclude">
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>SNMP Release Notes</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>part_notes.xml</file>
+ </header>
+ <description>
+ <p>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.</p>
+ <p>For information about older versions see
+ <url href="part_notes_history_frame.html">release notes history</url>.</p>
+ </description>
+ <xi:include href="notes.xml"/>
+</part>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE part SYSTEM "part.dtd">
+
+<part>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>SNMP Release Notes History</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>part_notes_history.xml</file>
+ </header>
+ <description>
+ <p>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.</p>
+ </description>
+ <include file="notes_history"></include>
+</part>
+
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
--- /dev/null
+++ b/lib/snmp/doc/src/ref_man.gif
Binary files 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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE application SYSTEM "application.dtd">
+
+<application xmlns:xi="http://www.w3.org/2001/XInclude">
+ <header>
+ <copyright>
+ <year>1996</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>SNMP Reference Manual</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>ref_man.xml</file>
+ </header>
+ <description>
+ <p>A multilingual Simple Network Management Protocol
+ application featuring an Extensible Agent, simple manager,
+ a MIB compiler and facilities for implementing SNMP MIBs etc.
+ </p>
+ </description>
+ <xi:include href="snmp.xml"/>
+ <xi:include href="snmp_app.xml"/>
+ <xi:include href="snmpa.xml"/>
+ <xi:include href="snmpa_conf.xml"/>
+ <xi:include href="snmpa_discovery_handler.xml"/>
+ <xi:include href="snmpa_error_report.xml"/>
+ <xi:include href="snmpa_error.xml"/>
+ <xi:include href="snmpa_error_io.xml"/>
+ <xi:include href="snmpa_error_logger.xml"/>
+ <xi:include href="snmpa_local_db.xml"/>
+ <xi:include href="snmpa_mpd.xml"/>
+ <xi:include href="snmpa_network_interface.xml"/>
+ <xi:include href="snmpa_network_interface_filter.xml"/>
+ <xi:include href="snmpa_notification_delivery_info_receiver.xml"/>
+ <xi:include href="snmpa_notification_filter.xml"/>
+ <xi:include href="snmpa_supervisor.xml"/>
+ <xi:include href="snmp_community_mib.xml"/>
+ <xi:include href="snmp_framework_mib.xml"/>
+ <xi:include href="snmp_generic.xml"/>
+ <xi:include href="snmp_index.xml"/>
+ <xi:include href="snmp_notification_mib.xml"/>
+ <xi:include href="snmp_pdus.xml"/>
+ <xi:include href="snmp_standard_mib.xml"/>
+ <xi:include href="snmp_target_mib.xml"/>
+ <xi:include href="snmp_user_based_sm_mib.xml"/>
+ <xi:include href="snmp_view_based_acm_mib.xml"/>
+ <xi:include href="snmpc.xml"/>
+ <xi:include href="snmpm.xml"/>
+ <xi:include href="snmpm_conf.xml"/>
+ <xi:include href="snmpm_mpd.xml"/>
+ <xi:include href="snmpm_network_interface.xml"/>
+ <xi:include href="snmpm_user.xml"/>
+ <xi:include href="snmpm_network_interface_filter.xml"/>
+</application>
+
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
--- /dev/null
+++ b/lib/snmp/doc/src/snmp-um-1-image-1.gif
Binary files 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
--- /dev/null
+++ b/lib/snmp/doc/src/snmp-um-1-image-2.gif
Binary files 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
+( <code>;) Tx
+(\r) TX
+0 -12 Td
+(sysCFunc\(set, ...\) ->) Tx
+(\r) TX
+0 -12 Td
+( <code>.) 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
--- /dev/null
+++ b/lib/snmp/doc/src/snmp-um-1-image-3.gif
Binary files 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
--- /dev/null
+++ b/lib/snmp/doc/src/snmp-um-1-image-8.gif
Binary files 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
--- /dev/null
+++ b/lib/snmp/doc/src/snmp.gif
Binary files 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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1996</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmp</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp.xml</file>
+ </header>
+ <module>snmp</module>
+ <modulesummary>Interface functions to the SNMP toolkit</modulesummary>
+ <description>
+ <p>The module <c>snmp</c> contains interface functions to the
+ SNMP toolkit.</p>
+ </description>
+
+ <section>
+ <title>Common Data Types</title>
+ <p>The following data-types are used in the functions below: </p>
+ <list type="bulleted">
+ <item>
+ <p><c>datetime() = {date(), time()}</c></p>
+ <p>See <seealso marker="stdlib:calendar">calendar</seealso>
+ for more info.</p>
+ </item>
+
+ </list>
+
+ <marker id="config"></marker>
+ </section>
+
+ <funcs>
+ <func>
+ <name>config() -> ok | {error, Reason}</name>
+ <fsummary>Configure with a simple interactive tool</fsummary>
+ <desc>
+ <p>A simple interactive configuration tool. Simple
+ configuration files can be generated, but more complex
+ configurations still have to be edited manually.
+ </p>
+ <p>The tool is a textual based tool that asks some questions
+ and generates <c>sys.config</c> and <c>*.conf</c> files.
+ </p>
+ <p><em>Note</em> that if the application shall support version 3,
+ then the crypto app must be started before running this function
+ (password generation).</p>
+ <p><em>Note</em> 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 <em>different</em> directories!</p>
+
+ <marker id="start"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>start() -> ok | {error, Reason}</name>
+ <name>start(Type) -> ok | {error, Reason}</name>
+ <fsummary>Start the SNMP application</fsummary>
+ <type>
+ <v>Type = start_type()</v>
+ </type>
+ <desc>
+ <p>Starts the SNMP application.</p>
+ <p>See <seealso marker="kernel:application">application</seealso> for more info.</p>
+
+ <marker id="start_agent"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>start_agent() -> ok | {error, Reason}</name>
+ <name>start_agent(Type) -> ok | {error, Reason}</name>
+ <fsummary>Start the agent part of the SNMP application</fsummary>
+ <type>
+ <v>Type = start_type()</v>
+ </type>
+ <desc>
+ <p>The SNMP application consists of several entities, of which the
+ agent is one. This function starts the agent entity of the
+ application.
+ </p>
+ <p>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:
+ <c>application:set_env(snmp, agent, Conf)</c>.
+ </p>
+ <p>The default value for <c>Type</c> is <c>normal</c>.</p>
+
+ <marker id="start_manager"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>start_manager() -> ok | {error, Reason}</name>
+ <name>start_manager(Type) -> ok | {error, Reason}</name>
+ <fsummary>Start the manager part of the SNMP application</fsummary>
+ <type>
+ <v>Type = start_type()</v>
+ </type>
+ <desc>
+ <p>The SNMP application consists of several entities, of which the
+ manager is one. This function starts the manager entity of the
+ application.
+ </p>
+ <p>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:
+ <c>application:set_env(snmp, manager, Conf)</c>.
+ </p>
+ <p>The default value for <c>Type</c> is <c>normal</c>.</p>
+
+ <marker id="dat"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>date_and_time() -> DateAndTime</name>
+ <fsummary>Return the current date and time as an OCTET STRING</fsummary>
+ <type>
+ <v>DateAndTime = [int()]</v>
+ </type>
+ <desc>
+ <p>Returns current date and time as the data type DateAndTime,
+ as specified in RFC1903. This is an OCTET STRING.</p>
+
+ <marker id="dat2ut_dst"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>date_and_time_to_universal_time_dst(DateAndTime) -> [utc()]</name>
+ <fsummary>Convert a DateAndTime value to a list of possible utc()</fsummary>
+ <type>
+ <v>DateAndTime = [int()]</v>
+ <v>utc() = {{Y,Mo,D},{H,M,S}}</v>
+ </type>
+ <desc>
+ <p>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). </p>
+
+ <marker id="dat2s"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>date_and_time_to_string(DateAndTime) -> string()</name>
+ <name>date_and_time_to_string(DateAndTime, Validate) -> string()</name>
+ <fsummary>Convert a DateAndTime value to a string</fsummary>
+ <type>
+ <v>DateAndTime = [int()]</v>
+ <v>Validate = fun(Kind, Data) -> boolean()</v>
+ </type>
+ <desc>
+ <p>Converts a DateAndTime list to a printable string, according
+ to the DISPLAY-HINT definition in RFC2579.</p>
+
+ <p>The validation fun, <c>Validate</c>, allows for a more "flexible"
+ validation of the <c>DateAndTime</c> argument. Whenever the data
+ is found to not follow RFC2579, the fun is called to allow a more
+ "lax" validation.
+ See the <seealso marker="#vdat">validate_date_and_time/2</seealso>
+ function for more info on the <c>Validate</c> fun. </p>
+
+ <marker id="dat2s2"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>date_and_time_to_string2(DateAndTime) -> string()</name>
+ <fsummary>Convert a DateAndTime value to a string</fsummary>
+ <type>
+ <v>DateAndTime = [int()]</v>
+ </type>
+ <desc>
+ <p>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. </p>
+
+ <marker id="lt2dat_dst"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>local_time_to_date_and_time_dst(Local) -> [DateAndTime]</name>
+ <fsummary>Convert a Local time value to a list of possible DateAndTime(s)</fsummary>
+ <type>
+ <v>Local = {{Y,Mo,D},{H,M,S}}</v>
+ <v>DateAndTime = [int()]</v>
+ </type>
+ <desc>
+ <p>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).</p>
+
+ <marker id="ut2dat"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>universal_time_to_date_and_time(UTC) -> DateAndTime</name>
+ <fsummary>Convert a UTC value to DateAndTime</fsummary>
+ <type>
+ <v>UTC = {{Y,Mo,D},{H,M,S}}</v>
+ <v>DateAndTime = [int()]</v>
+ </type>
+ <desc>
+ <p>Converts a universal time value to a DateAndTime list. The
+ universal time value on the same format as defined in calendar(3).</p>
+
+ <marker id="vdat"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>validate_date_and_time(DateAndTime) -> bool()</name>
+ <name>validate_date_and_time(DateAndTime, Validate) -> bool()</name>
+ <fsummary>Check if a DateAndTime value is correct</fsummary>
+ <type>
+ <v>DateAndTime = term()</v>
+ <v>Validate = fun(Kind, Data) -> boolean()</v>
+ </type>
+ <desc>
+ <p>Checks if <c>DateAndTime</c> is a correct DateAndTime
+ value, as specified in RFC2579. This function can be used in
+ instrumentation functions to validate a DateAndTime value.</p>
+
+
+ <p>The validation fun, <c>Validate</c>, allows for a more "flexible"
+ validation of the <c>DateAndTime</c> 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: </p>
+
+ <pre>
+ 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}
+ </pre>
+
+ <marker id="passwd2localized_key"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>passwd2localized_key(Alg, Passwd, EngineID) -> Key</name>
+ <fsummary>Generates an localized key</fsummary>
+ <type>
+ <v>Alg = algorithm()</v>
+ <v>algorithm() = md5 | sha</v>
+ <v>Passwd = string()</v>
+ <v>EngineID = string()</v>
+ <v>Key = list()</v>
+ </type>
+ <desc>
+ <p>Generates a key that can be used as an authentication
+ or privacy key using MD5 och SHA. The key is
+ localized for EngineID.</p>
+
+ <marker id="octet_string_to_bits"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>octet_string_to_bits(S) -> Val</name>
+ <fsummary>Convert an OCTET-STRING to BITS</fsummary>
+ <type>
+ <v>Val = bits()</v>
+ </type>
+ <desc>
+ <p>Utility function for converting a value of type
+ <c>OCTET-STRING</c> to <c>BITS</c>. </p>
+
+ <marker id="bits_to_octet_string"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>bits_to_octet_string(B) -> Val</name>
+ <fsummary>Convert an OCTET-STRING to BITS</fsummary>
+ <type>
+ <v>Val = octet_string()</v>
+ </type>
+ <desc>
+ <p>Utility function for converting a value of type <c>BITS</c>
+ to <c>OCTET-STRING</c>. </p>
+
+ <marker id="read_mib"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>read_mib(FileName) -> {ok, mib()} | {error, Reason}</name>
+ <fsummary></fsummary>
+ <type>
+ <v>FileName = string()</v>
+ <v>mib() = #mib{}</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Read a compiled mib.</p>
+
+ <marker id="log_to_txt"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile) -> ok | {error, Reason}</name>
+ <name>log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start) -> ok | {error, Reason}</name>
+ <name>log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start, Stop) -> ok | {error, Reason}</name>
+ <fsummary>Convert an Audit Trail Log to text format</fsummary>
+ <type>
+ <v>LogDir = string()</v>
+ <v>Mibs = [MibName]</v>
+ <v>OutFile = string()</v>
+ <v>MibName = string()</v>
+ <v>LogName = string()</v>
+ <v>LogFile = string()</v>
+ <v>Start = Stop = null | datetime() | {local_time,datetime()} | {universal_time,datetime()} </v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+ <p><c>LogDir</c> is the name of the directory where the audit
+ trail log is stored.
+ <c>Mibs</c> 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.
+ <c>OutFile</c> is the name of the generated text-file.
+ <c>LogName</c> is the name of the log,
+ <c>LogFile</c> is the name of the log file.
+ <c>Start</c> is the start (first) date and time from which
+ log events will be converted and
+ <c>Stop</c> is the stop (last) date and time to which log
+ events will be converted.
+ </p>
+ <p>The format of an audit trail log text item is as follows:
+ </p>
+ <p><c>Tag Addr - Community [TimeStamp] Vsn</c><br></br>
+ <c>PDU</c></p>
+ <p>where <c>Tag</c> is <c>request</c>, <c>response</c>,
+ <c>report</c>, <c>trap</c> or <c>inform</c>; Addr is
+ <c>IP:Port</c> (or comma space separated list of such);
+ <c>Community</c> is the community parameter (SNMP version
+ v1 and v2), or <c>SecLevel:"AuthEngineID":"UserName"</c>
+ (SNMP v3); <c>TimeStamp</c> is a date and time stamp,
+ and <c>Vsn</c> is the SNMP version. <c>PDU</c> is a textual
+ version of the protocol data unit. There is a new line
+ between <c>Vsn</c> and <c>PDU</c>.</p>
+
+ <marker id="change_log_size"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>change_log_size(LogName, NewSize) -> ok | {error, Reason}</name>
+ <fsummary>Change the size of the Audit Trail Log</fsummary>
+ <type>
+ <v>LogName = string()</v>
+ <v>NewSize = {MaxBytes, MaxFiles}</v>
+ <v>MaxBytes = integer()</v>
+ <v>MaxFiles = integer()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>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.
+ </p>
+ <p>The change is permanent, as long as the log is not deleted.
+ That means, the log size is remembered across reboots.</p>
+
+ <marker id="print_version_info"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>print_version_info() -> void()</name>
+ <name>print_version_info(Prefix) -> void()</name>
+ <fsummary>Formatted print of result of the versions functions</fsummary>
+ <type>
+ <v>Prefix = string() | integer()</v>
+ </type>
+ <desc>
+ <p>Utility function(s) to produce a formatted printout of the versions
+ info generated by the <c>versions1</c> function</p>
+ <p>This is the same as doing, e.g.: </p>
+ <pre>
+ {ok, V} = snmp:versions1(),
+ snmp:print_versions(V).
+ </pre>
+
+ <marker id="versions1"></marker>
+ <marker id="versions2"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>versions1() -> {ok, Info} | {error, Reason}</name>
+ <name>versions2() -> {ok, Info} | {error, Reason}</name>
+ <fsummary>Retrieve various system and application info</fsummary>
+ <type>
+ <v>Info = [info()]</v>
+ <v>info() = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Utility functions used to retrieve some system and
+ application info.</p>
+ <p>The difference between the two functions is in how they get
+ the modules to check. <c>versions1</c> uses the app-file and
+ <c>versions2</c> uses the function <c>application:get_key</c>.</p>
+
+ <marker id="print_versions"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>print_versions(VersionInfo) -> void()</name>
+ <name>print_versions(Prefix, VersionInfo) -> void()</name>
+ <fsummary>Formatted print of result of the versions functions</fsummary>
+ <type>
+ <v>VersionInfo = [version_info()]</v>
+ <v>version_info() = term()</v>
+ <v>Prefix = string() | integer()</v>
+ </type>
+ <desc>
+ <p>Utility function to produce a formatted printout of the versions
+ info generated by the <c>versions1</c> and <c>versions2</c>
+ functions</p>
+ <p>Example: </p>
+ <pre>
+ {ok, V} = snmp:versions1(),
+ snmp:print_versions(V).
+ </pre>
+
+ <marker id="enable_trace"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>enable_trace() -> void()</name>
+ <fsummary>Starts a tracer</fsummary>
+ <!--
+ <type>
+ <v>Prefix = string() | integer()</v>
+ </type>
+ -->
+ <desc>
+ <p>Starts a dbg tracer that prints trace events to stdout (using
+ plain io:format after a minor formatting). </p>
+
+ <marker id="disable_trace"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>disable_trace() -> void()</name>
+ <fsummary>Stop the tracer</fsummary>
+ <!--
+ <type>
+ <v>Prefix = string() | integer()</v>
+ </type>
+ -->
+ <desc>
+ <p>Stop the tracer. </p>
+
+ <marker id="set_trace1"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>set_trace(Targets) -> void()</name>
+ <fsummary>Set trace target</fsummary>
+ <type>
+ <v>Targets = target() | targets()</v>
+ <v>target() = module()</v>
+ <v>module() = atom()</v>
+ <v>targets() = [target() | {target(), target_options()}]</v>
+ <v>target_options() = [target_option()]</v>
+ <v>target_option() = {return_trace, boolean()} | {scope, scope()}</v>
+ <v>scope() = all_functions | exported_functions | function_name() | {function_name(), function_arity()}</v>
+ <v>function_name() = atom()</v>
+ <v>function_arity() = integer() >= 0</v>
+ </type>
+ <desc>
+ <p>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 <em>exported</em> functions (both the call info and the return
+ value). Timestamp info will also be included. </p>
+
+ <marker id="reset_trace"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>reset_trace(Targets) -> void()</name>
+ <fsummary>Reset trace target</fsummary>
+ <type>
+ <v>Targets = module() | modules()</v>
+ <v>modules() = [module()]</v>
+ <v>module() = atom()</v>
+ </type>
+ <desc>
+ <p>This function is used to reset (disable) trace for the
+ given module(s). </p>
+
+ <marker id="set_trace2"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>set_trace(Targets, Opts) -> void()</name>
+ <fsummary>Set trace target</fsummary>
+ <type>
+ <v>Targets = target() | targets()</v>
+ <v>target() = module()</v>
+ <v>module() = atom()</v>
+ <v>targets() = [target() | {target(), target_options()}]</v>
+ <v>target_options() = [target_option()]</v>
+ <v>target_option() = {return_trace, boolean()} | {scope, scope()}</v>
+ <v>scope() = all_functions | exported_functions | function_name() | {function_name(), function_arity()}</v>
+ <v>function_name() = atom()</v>
+ <v>function_arity() = integer() >= 0</v>
+ <v>Opts = disable | trace_options()</v>
+ <v>trace_options() = [trace_option()]</v>
+ <v>trace_option() = {timestamp, boolean()} | target_option()</v>
+ </type>
+ <desc>
+ <p>This function is used to set up trace on function(s) for the given
+ module or modules. </p>
+
+ <p>The example below sets up trace on the exported functions (default)
+ of module <c>snmp_generic</c> and all functions of module
+ <c>snmp_generic_mnesia</c>. With return values (which is default)
+ and timestamps in both cases (which is also default): </p>
+
+ <pre>
+ snmp:enable_trace(),
+ snmp:set_trace([snmp_generic,
+ {snmp_generic_mnesia, [{scope, all_functions}]}]),
+ .
+ .
+ .
+ snmp:set_trace(snmp_generic, disable),
+ .
+ .
+ .
+ snmp:disable_trace(),
+ </pre>
+
+ </desc>
+ </func>
+
+ </funcs>
+
+ <section>
+ <title>See Also</title>
+ <p>calendar(3)
+ </p>
+ </section>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Advanced Agent Topics</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_advanced_agent.xml</file>
+ </header>
+ <p>The chapter <em>Advanced Agent Topics</em> describes the more advanced
+ agent related features of the SNMP development tool. The following topics
+ are covered:
+ </p>
+ <list type="bulleted">
+ <item>When to use a Sub-agent</item>
+ <item>Agent semantics</item>
+ <item>Sub-agents and dependencies</item>
+ <item>Distributed tables</item>
+ <item>Fault tolerance</item>
+ <item>Using Mnesia tables as SNMP tables</item>
+ <item>Audit Trail Logging</item>
+ <item>Deviations from the standard
+ </item>
+ </list>
+
+ <section>
+ <title>When to use a Sub-agent</title>
+ <p>The section <em>When to use a Sub-agent</em> describes situations
+ where the mechanism of loading and unloading MIBs is insufficient.
+ In these cases a sub-agent is needed.
+ </p>
+
+ <section>
+ <title>Special Set Transaction Mechanism</title>
+ <p>Each sub-agent can implement its own mechanisms for
+ <c>set</c>, <c>get</c> and <c>get-next</c>. For example, if the
+ application requires the <c>get</c> mechanism to be
+ asynchronous, or needs a N-phase <c>set</c> mechanism, a
+ specialized sub-agent should be used.
+ </p>
+ <p>The toolkit allows different kinds of sub-agents at the same
+ time. Accordingly, different MIBs can have different <c>set</c>
+ or <c>get</c> mechanisms.
+ </p>
+ </section>
+
+ <section>
+ <title>Process Communication</title>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+ </section>
+
+ <section>
+ <title>Frequent Loading of MIBs</title>
+ <p>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.
+ </p>
+ </section>
+
+ <section>
+ <title>Interaction With Other SNMP Agent Toolkits</title>
+ <p>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.
+ </p>
+ </section>
+ </section>
+
+ <section>
+ <title>Agent Semantics</title>
+ <p>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 (<c>get</c>,
+ <c>get-next</c> and <c>get-bulk</c>) and traps are processed in
+ parallel with each other and <c>set</c> requests. However, all
+ <c>set</c> 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 <c>set</c> requests are atoms.
+ If this is hard to do, do not use the multi-threaded feature.
+ </p>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+ <p>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
+ <c>snmpa:current_request_id/0</c>.</p>
+ </section>
+
+ <section>
+ <title>Sub-agents and Dependencies </title>
+ <p>The toolkit supports the use of different types of sub-agents,
+ but not the construction of sub-agents.
+ </p>
+ <p>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.
+ </p>
+ </section>
+
+ <section>
+ <title>Distributed Tables</title>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+ <p>The advantages of separating the table coordinator from the
+ SNMP tool are:
+ </p>
+ <list type="bulleted">
+ <item>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.
+ </item>
+ <item>Most likely, some type of table coordinator already
+ exists. This process should take care of the instrumentation for
+ the table.
+ </item>
+ <item>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.
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Fault Tolerance</title>
+ <p>The SNMP agent toolkit gets input from three different sources:
+ </p>
+ <list type="bulleted">
+ <item>UDP packets from the network</item>
+ <item>return values from the user defined instrumentation functions</item>
+ <item>return values from the MIB.
+ </item>
+ </list>
+ <p>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.
+ </p>
+
+ <section>
+ <title>Using the SNMP Agent in a Distributed Environment</title>
+ <p>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.
+ </p>
+ <p>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 <em>failover</em>. When the node starts again,
+ it may <em>takeover</em> 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.
+ </p>
+ <p>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.
+ </p>
+ </section>
+ </section>
+
+ <section>
+ <title>Using Mnesia Tables as SNMP Tables</title>
+ <p>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.
+ </p>
+ <p>There are three main reasons for using this mapping:
+ </p>
+ <list type="bulleted">
+ <item>We get all features of Mnesia, such as fault tolerance,
+ persistent data storage, replication, and so on.
+ </item>
+ <item>Much of the work involved is automated. This includes
+ <c>get-next</c> processing and <c>RowStatus</c> handling.
+ </item>
+ <item>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.
+ </item>
+ </list>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+
+ <section>
+ <title>Creating the Mnesia Table</title>
+ <p>The table must be created in Mnesia before the manager can
+ use it. The table must be declared as type <c>snmp</c>. 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.
+ </p>
+ <p>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 <em>N</em> INDEX columns and <em>C</em> data columns, the
+ Mnesia table is of arity <em>(C-N)+1</em>, where the key is a
+ tuple of arity <em>N</em> if <em>N > 1</em>, or a single term
+ if <em>N = 1</em>.
+ </p>
+ <p>Refer to the Mnesia User's Guide for information on how to
+ declare a Mnesia table as an SNMP table.
+ </p>
+ <p>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.
+ </p>
+ <code type="none">
+ 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
+ }
+ </code>
+ <p>The corresponding Mnesia table is specified as follows:
+ </p>
+ <code type="none">
+mnesia:create_table([{name, employees},
+ {snmp, [{key, {integer, string}}]},
+ {attributes, [key, telno, row_status]}]).
+ </code>
+ <note>
+ <p>In the Mnesia tables, the two key columns are stored as a
+ tuple with two elements. Therefore, the arity of the table is
+ 3.</p>
+ </note>
+ </section>
+
+ <section>
+ <title>Instrumentation Functions</title>
+ <p>The MIB table shown in the previous section can be compiled
+ as follows:
+ </p>
+ <pre>
+1> <input>snmpc:compile("EmpMIB", [{db, mnesia}]).</input>
+ </pre>
+ <p>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.</p>
+ </section>
+
+ <section>
+ <title>Adding Own Actions</title>
+ <p>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.
+ </p>
+ <p>The following example illustrates this idea:
+ </p>
+ <code type="none">
+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}).
+ </code>
+ <p>The default instrumentation functions are defined in the
+ module <c>snmp_generic</c>. Refer to the Reference Manual,
+ section SNMP, module <c>snmp_generic</c> for details.</p>
+ </section>
+
+ <section>
+ <title>Extending the Mnesia Table</title>
+ <p>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 <c>set</c> 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 <c>set</c>
+ function.
+ </p>
+ <p>To illustrate this, suppose we extend our Mnesia
+ <c>empTable</c> with one internal column. We create it as
+ before, but with an arity of 4, by adding another attribute.
+ </p>
+ <code type="none">
+mnesia:create_table([{name, employees},
+ {snmp, [{key, {integer, string}}]},
+ {attributes, {key, telno, row_status, internal_col}}]).
+ </code>
+ <p>The last column is the internal column. When performing a
+ <c>set</c> operation, which creates a row, we must give a
+ value to the internal column. The instrumentation functions will now
+ look as follows:
+ </p>
+ <code type="none">
+-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.
+ </code>
+ <p>If a row is created, we always set the internal column to
+ <c>"internal"</c>.
+ </p>
+ </section>
+ </section>
+
+ <section>
+ <title>Deviations from the Standard</title>
+ <p>In some aspects the agent does not implement SNMP fully. Here
+ are the differences:
+ </p>
+ <list type="bulleted">
+ <item>The default functions and <c>snmp_generic</c> cannot
+ handle an object of type <c>NetworkAddress</c> as INDEX
+ (SNMPv1 only!). Use <c>IpAddress</c> instead.
+ </item>
+ <item>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 <c>1..10 | 12..20</c>
+ the agent would let 11 through, but not 0 or 21. The
+ instrumentation functions must check the complex ranges
+ itself.
+ </item>
+ <item>The agent will never generate the <c>wrongEncoding</c>
+ error. If a variable binding is erroneous encoded, the
+ <c>asn1ParseError</c> counter will be incremented.
+ </item>
+ <item>A <c>tooBig</c> error in an SNMPv1 packet will always use
+ the <c>'NULL'</c> value in all variable bindings.
+ </item>
+ <item>The default functions and <c>snmp_generic</c> do not check
+ the range of each OCTET in textual conventions derived from
+ OCTET STRING, e.g. <c>DisplayString</c> and
+ <c>DateAndTime</c>. This must be checked in an overloaded
+ <c>is_set_ok</c> function.
+ </item>
+ </list>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Definition of Agent Configuration Files</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_agent_config_files.xml</file>
+ </header>
+ <p>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 <c>config_dir</c> 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 <seealso marker="snmp_agent_funct_descr#management">Management of the Agent</seealso> for a description of the MIBs). </p>
+ <p>The files are: </p>
+ <list type="bulleted">
+ <item>
+ <p><c>agent.conf</c>: see
+ <seealso marker="#agent_information">Agent Information</seealso></p>
+ </item>
+ <item>
+ <p><c>standard.conf</c>: see
+ <seealso marker="#system_information">System Information</seealso></p>
+ </item>
+ <item>
+ <p><c>context.conf</c>: see
+ <seealso marker="#context">Contexts</seealso></p>
+ </item>
+ <item>
+ <p><c>community.conf</c>: see
+ <seealso marker="#community">Communities</seealso></p>
+ </item>
+ <item>
+ <p><c>target_addr.conf</c>: see
+ <seealso marker="#target_addr">Target Address Definitions</seealso></p>
+ </item>
+ <item>
+ <p><c>target_params.conf</c>: see
+ <seealso marker="#target_params">Target Parameters Definitions</seealso></p>
+ </item>
+ <item>
+ <p><c>vacm.conf</c>: see
+ <seealso marker="#vacm">MIB Views for VACM</seealso></p>
+ </item>
+ <item>
+ <p><c>usm.conf</c>: see
+ <seealso marker="#usm">Security data for USM</seealso></p>
+ </item>
+ <item>
+ <p><c>notify.conf</c>: see
+ <seealso marker="#notify">Notify Definitions</seealso></p>
+ </item>
+ </list>
+ <p>The directory where the configuration files are found is given as
+ a parameter to the agent. </p>
+ <p>The entry format in all files are Erlang terms, separated by a
+ '<em>.</em>' and a <em>newline</em>. In the following sections, the
+ formats of these terms are described. Comments may be specified as
+ ordinary Erlang comments. </p>
+ <p>Syntax errors in these files are discovered and reported with the
+ function <c>config_err/2</c> of the error report module at start-up. </p>
+
+ <section>
+ <marker id="agent_information"></marker>
+ <title>Agent Information</title>
+ <p>The agent information should be stored in a file called
+ <c>agent.conf</c>.
+ </p>
+ <p>Each entry is a tuple of size two:
+ </p>
+ <p><c>{AgentVariable, Value}.</c></p>
+ <list type="bulleted">
+ <item><c>AgentVariable</c> is one of the variables is
+ SNMP-FRAMEWORK-MIB or one of the internal variables
+ <c>intAgentUDPPort</c>, which defines which UDP port the agent
+ listens to, or <c>intAgentIpAddress</c>, which defines the IP
+ address of the agent.
+ </item>
+ <item><c>Value</c> is the value for the variable.
+ </item>
+ </list>
+ <p>The following example shows a <c>agent.conf</c> file:
+ </p>
+ <pre>
+{intAgentUDPPort, 4000}.
+{intAgentIpAddress,[141,213,11,24]}.
+{snmpEngineID, "mbj's engine"}.
+{snmpEngineMaxPacketSize, 484}.
+ </pre>
+ <p>The value of <c>snmpEngineID</c> is a string, which for a
+ deployed agent should have a very specific structure. See
+ RFC 2271/2571 for details.
+ </p>
+ </section>
+
+ <section>
+ <marker id="context"></marker>
+ <title>Contexts</title>
+ <p>The context information should be stored in a file called
+ <c>context.conf</c>. The default context <c>""</c>
+ need not be present.
+ </p>
+ <p>Each row defines a context in the agent. This information is
+ used in the table <c>vacmContextTable</c> in the
+ SNMP-VIEW-BASED-ACM-MIB.
+ </p>
+ <p>Each entry is a term:
+ </p>
+ <p><c>ContextName.</c></p>
+ <list type="bulleted">
+ <item><c>ContextName</c> is a string.
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <marker id="system_information"></marker>
+ <title>System Information</title>
+ <p>The system information should be stored in a file called
+ <c>standard.conf</c>.
+ </p>
+ <p>Each entry is a tuple of size two:
+ </p>
+ <p><c>{SystemVariable, Value}.</c></p>
+ <list type="bulleted">
+ <item><c>SystemVariable</c> is one of the variables in the
+ system group, or <c>snmpEnableAuthenTraps</c>.
+ </item>
+ <item><c>Value</c> is the value for the variable.
+ </item>
+ </list>
+ <p>The following example shows a valid <c>standard.conf</c> file:
+ </p>
+ <pre>
+{sysDescr, "Erlang SNMP agent"}.
+{sysObjectID, [1,2,3]}.
+{sysContact, "(mbj,eklas)@erlang.ericsson.se"}.
+{sysName, "test"}.
+{sysServices, 72}.
+{snmpEnableAuthenTraps, enabled}.
+ </pre>
+ <p>A value must be provided for all variables, which lack default
+ values in the MIB.
+ </p>
+ </section>
+
+ <section>
+ <marker id="community"></marker>
+ <title>Communities</title>
+ <p>The community information should be stored in a file called
+ <c>community.conf</c>. It must be present if the agent is
+ configured for SNMPv1 or SNMPv2c.
+ </p>
+ <p>The corresponding table is <c>snmpCommunityTable</c> in the
+ SNMP-COMMUNITY-MIB.
+ </p>
+ <p>Each entry is a term:
+ </p>
+ <p><c>{CommunityIndex, CommunityName, SecurityName, ContextName, TransportTag}.</c></p>
+ <list type="bulleted">
+ <item><c>CommunityIndex</c> is a non-empty string.
+ </item>
+ <item><c>CommunityName</c> is a string.
+ </item>
+ <item><c>SecurityName</c> is a string.
+ </item>
+ <item><c>ContextName</c> is a string.
+ </item>
+ <item><c>TransportTag</c> is a string.
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <marker id="vacm"></marker>
+ <title>MIB Views for VACM</title>
+ <p>The information about MIB Views for VACM should be stored in a
+ file called
+ <c>vacm.conf</c>.
+ </p>
+ <p>The corresponding tables are <c>vacmSecurityToGroupTable</c>,
+ <c>vacmAccessTable</c> and <c>vacmViewTreeFamilyTable</c> in the
+ SNMP-VIEW-BASED-ACM-MIB.
+ </p>
+ <p>Each entry is one of the terms, one entry corresponds to one
+ row in one of the tables.
+ </p>
+ <p><c>{vacmSecurityToGroup, SecModel, SecName, GroupName}.</c></p>
+ <p><c>{vacmAccess, GroupName, Prefix, SecModel, SecLevel, Match, ReadView, WriteView, NotifyView}.</c></p>
+ <p><c>{vacmViewTreeFamily, ViewIndex, ViewSubtree, ViewStatus, ViewMask}.</c></p>
+ <list type="bulleted">
+ <item>
+ <p><c>SecModel</c> is <c>any</c>, <c>v1</c>, <c>v2c</c>, or
+ <c>usm</c>.</p>
+ </item>
+ <item>
+ <p><c>SecName</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>GroupName</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>Prefix</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>SecLevel</c> is <c>noAuthNoPriv</c>, <c>authNoPriv</c>,
+ or <c>authPriv</c></p>
+ </item>
+ <item>
+ <p><c>Match</c> is <c>prefix</c> or <c>exact</c>.</p>
+ </item>
+ <item>
+ <p><c>ReadView</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>WriteView</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>NotifyView</c> is a string.
+ </p>
+ </item>
+ <item>
+ <p><c>ViewIndex</c> is an integer.</p>
+ </item>
+ <item>
+ <p><c>ViewSubtree</c> is a list of integer.</p>
+ </item>
+ <item>
+ <p><c>ViewStatus</c> is either <c>included</c> or <c>excluded</c></p>
+ </item>
+ <item>
+ <p><c>ViewMask</c> is either <c>null</c> 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. <c>null</c> is shorthand for a
+ mask with all ones.</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <marker id="usm"></marker>
+ <title>Security data for USM</title>
+ <p>The information about Security data for USM should be stored in a
+ file called
+ <c>usm.conf</c>, which must be present if the agent is configured
+ for SNMPv3.
+ </p>
+ <p>The corresponding table is <c>usmUserTable</c> in the
+ SNMP-USER-BASED-SM-MIB.
+ </p>
+ <p>Each entry is a term:
+ </p>
+ <p><c>{EngineID, UserName, SecName, Clone, AuthP, AuthKeyC, OwnAuthKeyC, PrivP, PrivKeyC, OwnPrivKeyC, Public, AuthKey, PrivKey}.</c></p>
+ <list type="bulleted">
+ <item>
+ <p><c>EngineID</c> is a string.
+ </p>
+ </item>
+ <item>
+ <p><c>UserName</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>SecName</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>Clone</c> is <c>zeroDotZero</c> or a list of integers.</p>
+ </item>
+ <item>
+ <p><c>AuthP</c> is a <c>usmNoAuthProtocol</c>,
+ <c>usmHMACMD5AuthProtocol</c>, or <c>usmHMACSHAAuthProtocol</c>.</p>
+ </item>
+ <item>
+ <p><c>AuthKeyC</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>OwnAuthKeyC</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>PrivP</c> is a <c>usmNoPrivProtocol</c>,
+ <c>usmDESPrivProtocol</c> or <c>usmAesCfb128Protocol</c>.</p>
+ </item>
+ <item>
+ <p><c>PrivKeyC</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>OwnPrivKeyC</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>Public</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>AuthKey</c> 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 <c>usmHMACMD5AuthProtocol</c> is used, and
+ 20 if <c>usmHMACSHAAuthProtocol</c> is used.</p>
+ </item>
+ <item>
+ <p><c>PrivKey</c> 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 <c>usmDESPrivProtocol</c> or
+ <c>usmAesCfb128Protocol</c> is used.
+ </p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <marker id="notify"></marker>
+ <title>Notify Definitions</title>
+ <p>The information about Notify Definitions should be stored in a
+ file called
+ <c>notify.conf</c>.
+ </p>
+ <p>The corresponding table is <c>snmpNotifyTable</c> in the
+ SNMP-NOTIFICATION-MIB.
+ </p>
+ <p>Each entry is a term:
+ </p>
+ <p><c>{NotifyName, Tag, Type}.</c></p>
+ <list type="bulleted">
+ <item>
+ <p><c>NotifyName</c> is a unique non-empty string.
+ </p>
+ </item>
+ <item>
+ <p><c>Tag</c> is a string.
+ </p>
+ </item>
+ <item>
+ <p><c>Type</c> is <c>trap</c> or <c>inform</c>.
+ </p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <marker id="target_addr"></marker>
+ <title>Target Address Definitions</title>
+ <p>The information about Target Address Definitions should be
+ stored in a file called
+ <c>target_addr.conf</c>.
+ </p>
+ <p>The corresponding tables are <c>snmpTargetAddrTable</c> in the
+ SNMP-TARGET-MIB and <c>snmpTargetAddrExtTable</c> in the SNMP-COMMUNITY-MIB.
+ </p>
+ <p>Each entry is a term:
+ </p>
+ <p><c>{TargetName, Ip, Udp, Timeout, RetryCount, TagList, ParamsName, EngineId}.</c> or <br></br>
+<c>{TargetName, Ip, Udp, Timeout, RetryCount, TagList, ParamsName, EngineId, TMask, MaxMessageSize}.</c></p>
+ <list type="bulleted">
+ <item>
+ <p><c>TargetName</c> is a unique non-empty string.
+ </p>
+ </item>
+ <item>
+ <p><c>Ip</c> is a list of four integers.
+ </p>
+ </item>
+ <item>
+ <p><c>Udp</c> is an integer.
+ </p>
+ </item>
+ <item>
+ <p><c>Timeout</c> is an integer.
+ </p>
+ </item>
+ <item>
+ <p><c>RetryCount</c> is an integer.
+ </p>
+ </item>
+ <item>
+ <p><c>TagList</c> is a string.
+ </p>
+ </item>
+ <item>
+ <p><c>ParamsName</c> is a string.
+ </p>
+ </item>
+ <item>
+ <p><c>EngineId</c> is a string or the atom <c>discovery</c>.
+ </p>
+ </item>
+ <item>
+ <p><c>TMask</c> is a string of size 0, or size 6 (default: []).
+ </p>
+ </item>
+ <item>
+ <p><c>MaxMessageSize</c> is an integer (default: 2048).
+ </p>
+ </item>
+ </list>
+ <p>Note that if <c>EngineId</c> has the value <c>discovery</c>,
+ the agent cannot send
+ <c>inform</c> messages to that manager until it has performed the
+ <em>discovery</em> process with that manager. </p>
+ </section>
+
+ <section>
+ <marker id="target_params"></marker>
+ <title>Target Parameters Definitions</title>
+ <p>The information about Target Parameters Definitions should be
+ stored in a file called
+ <c>target_params.conf</c>.
+ </p>
+ <p>The corresponding table is <c>snmpTargetParamsTable</c> in the
+ SNMP-TARGET-MIB.
+ </p>
+ <p>Each entry is a term:
+ </p>
+ <p><c>{ParamsName, MPModel, SecurityModel, SecurityName, SecurityLevel}.</c></p>
+ <list type="bulleted">
+ <item>
+ <p><c>ParamsName</c> is a unique non-empty string.
+ </p>
+ </item>
+ <item>
+ <p><c>MPModel</c> is <c>v1</c>, <c>v2c</c> or <c>v3</c></p>
+ </item>
+ <item>
+ <p><c>SecurityModel</c> is <c>v1</c>, <c>v2c</c>, or <c>usm</c>.
+ </p>
+ </item>
+ <item>
+ <p><c>SecurityName</c> is a string.
+ </p>
+ </item>
+ <item>
+ <p><c>SecurityLevel</c> is <c>noAuthNoPriv</c>, <c>authNoPriv</c>
+ or <c>authPriv</c>.
+ </p>
+ </item>
+ </list>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Agent Functional Description</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_agent_funct_descr.xml</file>
+ </header>
+ <p>The SNMP agent system consists of one Master Agent and
+ optional Sub-agents.
+ </p>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+
+ <section>
+ <title>Features</title>
+ <marker id="features"></marker>
+ <p>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 <c>set</c>,
+ <c>get</c>, and <c>get-next</c> can be created without any programming.
+ </p>
+ <p>The toolkit provides the following:
+ </p>
+ <list type="bulleted">
+ <item>multi-lingual multi-threaded extensible SNMP agent</item>
+ <item>easy writing of instrumentation functions with a
+ high-level programming language</item>
+ <item>basic fault handling such as automatic type checking</item>
+ <item>access control</item>
+ <item>authentication</item>
+ <item>privacy through encryption</item>
+ <item>loading and unloading of MIBs in run-time</item>
+ <item>the ability to change instrumentation functions without
+ recompiling the MIB</item>
+ <item>rapid prototyping environment where the MIB compiler can
+ use generic instrumentation functions, which later can be
+ refined by the programmer</item>
+ <item>a simple and extensible model for transaction handling and
+ consistency checking of set-requests</item>
+ <item>support of the sub-agent concept via distributed Erlang</item>
+ <item>a mechanism for sending notifications (traps and informs)</item>
+ <item>support for implementing SNMP tables in the Mnesia DBMS.</item>
+ </list>
+ </section>
+
+ <section>
+ <title>SNMPv1, SNMPv2 and SNMPv3</title>
+ <marker id="versions"></marker>
+ <p>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.</p>
+ <p>The versions are defined in following RFCs</p>
+ <list type="bulleted">
+ <item>SNMPv1 RFC 1555, 1157 1212, 1213 and 1215</item>
+ <item>SNMPv2 RFC 1902 - 1907</item>
+ <item>SNMPv3 RFC 2570 - 2575</item>
+ </list>
+ <p>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.</p>
+ <p>The main features of SNMPv2 compared to SNMPv1 are:
+ </p>
+ <list type="bulleted">
+ <item>The <c>get-bulk</c> operation for transferring large
+ amounts of data.
+ </item>
+ <item>Enhanced error codes.
+ </item>
+ <item>A more precise language for MIB specification</item>
+ </list>
+ <p>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*.
+ </p>
+ <p>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:
+ </p>
+ <list type="bulleted">
+ <item>Encryption and authentication is added.
+ </item>
+ <item>MIBs for agent configuration are defined.</item>
+ </list>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+ <p>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.</p>
+ <note>
+ <p>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 <c>Counter64</c>, that an SNMPv1 manager cannot
+ decode correctly. Therefore, an agent may never send a <c>Counter64</c>
+ object to an SNMPv1 manager. The common practice in these
+ situations is to simple ignore any <c>Counter64</c> 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 <c>Counter64</c>, he will get a
+ <c>noSuchName</c> error, while an SNMPv2 manager would get a
+ correct value.</p>
+ </note>
+ </section>
+
+ <section>
+ <title>Operation</title>
+ <marker id="operations"></marker>
+ <p>The following steps are needed to get a running agent:</p>
+ <list type="ordered">
+ <item>
+ <p>Write your MIB in SMI in a text file.</p>
+ </item>
+ <item>
+ <p>Write the instrumentation functions in Erlang and compile them.</p>
+ </item>
+ <item>
+ <p>Put their names in the association file.</p>
+ </item>
+ <item>
+ <p>Run the MIB together with the association file through the
+ MIB compiler.</p>
+ </item>
+ <item>
+ <p>Configure the application (agent).</p>
+ </item>
+ <item>
+ <p>Start the application (agent).</p>
+ </item>
+ <item>
+ <p>Load the compiled MIB into the agent.</p>
+ </item>
+ </list>
+ <p>The figures in this section illustrate the steps involved in
+ the development of an SNMP agent.</p>
+ <marker id="image-1"></marker>
+ <image file="snmp-um-1-image-1.gif">
+ <icaption>MIB Compiler Principles</icaption>
+ </image>
+ <p>The compiler parses the SMI file and associates each table or
+ variable with an instrumentation function (see the figure <seealso marker="#image-1">MIB Compiler Principles</seealso>). The actual
+ instrumentation functions are not needed at MIB compile time, only
+ their names.
+ </p>
+ <p>The binary output file produced by the compiler is read by the
+ agent at MIB load time (see the figure <seealso marker="#image-2">Starting the Agent</seealso>). The instrumentation is ordinary Erlang code which
+ is loaded explicitly or automatically the first time it is called.</p>
+ <marker id="image-2"></marker>
+ <image file="snmp-um-1-image-2.gif">
+ <icaption>Starting the Agent</icaption>
+ </image>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+ <p>The following illustration shows how a system can look in runtime.</p>
+ <marker id="snmp_ch2_fig3"></marker>
+ <image file="snmp-um-1-image-3.gif">
+ <icaption>Architecture</icaption>
+ </image>
+ <p>A typical operation could include the following steps:</p>
+ <list type="ordered">
+ <item>The Manager sends a request to the Agent.</item>
+ <item>The Master Agent decodes the incoming UDP packet.</item>
+ <item>The Master Agent determines which items in the request
+ that should be processed here and which items should be
+ forwarded to its subagent.</item>
+ <item>Step 3 is repeated by all subagents.</item>
+ <item>Each sub-agent calls the instrumentation for its loaded MIBs.</item>
+ <item>The results of calling the instrumentation are propagated
+ back to the Master Agent.</item>
+ <item>The answer to the request is encoded to a UDP Protocol
+ Data Unit (PDU).</item>
+ </list>
+ <p>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:
+ </p>
+ <list type="bulleted">
+ <item>An agent can have many MIBs loaded at the same time.</item>
+ <item>Sub-agents can also have sub-agents. Each sub-agent can have
+ an arbitrary number of child sub-agents registered, forming a
+ hierarchy.</item>
+ <item>One MIB can communicate with many applications.</item>
+ <item>Instrumentation can use Distributed Erlang to communicate
+ with an application.</item>
+ </list>
+ <p>Most applications only need the Master Agent because an agent
+ can have multiple MIBs loaded at the same time.</p>
+ </section>
+
+ <section>
+ <title>Sub-agents and MIB Loading</title>
+ <marker id="sub_agent_mib_loading"></marker>
+ <p>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.
+ </p>
+ <p>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 <c>erlang:register</c>). 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.
+ </p>
+ <p>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.
+ </p>
+ <p>Sub-agents are used for the following reasons:
+ </p>
+ <list type="bulleted">
+ <item>to provide a more complex set-transaction scheme than
+ master agent</item>
+ <item>to avoid unnecessary process communication</item>
+ <item>to provide a more lightweight mechanism for loading and
+ unloading MIBs in run-time</item>
+ <item>to provide interaction with other SNMP agent toolkits.</item>
+ </list>
+ <p>Refer to the chapter
+ <seealso marker="snmp_advanced_agent">Advanced Agent Topics</seealso>
+ in this User's Guide for more information about these topics.
+ </p>
+ <p>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.</p>
+ </section>
+
+ <section>
+ <title>Contexts and Communities</title>
+ <marker id="context_and_communities"></marker>
+ <p>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.</p>
+ <p>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.</p>
+ <p>For example, the managed object type <c>ifDescr</c> 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 <c>contextName</c> (device-X), the managed object type
+ (<c>ifDescr</c>), and the instance ("1").
+ </p>
+ <p>In SNMPv1 and SNMPv2c, the community string in the message was
+ used for (at least) three different purposes:
+ </p>
+ <list type="bulleted">
+ <item>
+ <p>to identify the context</p>
+ </item>
+ <item>
+ <p>to provide authentication</p>
+ </item>
+ <item>
+ <p>to identify a set of trap targets</p>
+ </item>
+ </list>
+ <p>In SNMPv3, each of these usage areas has its own unique
+ mechanism. A context is identified by the name of the SNMP
+ entity, <c>contextEngineID</c>, and the name of the context,
+ <c>contextName</c>. Each SNMPv3 message contains values for these
+ two parameters.
+ </p>
+ <p>There is a MIB, SNMP-COMMUNITY-MIB, which maps a community
+ string to a <c>contextEngineID</c> and <c>contextName</c>. Thus,
+ each message, an SNMPv1, SNMPv2c or an SNMPv3 message, always
+ uniquely identifies a context.
+ </p>
+ <p>For an agent, the <c>contextEngineID</c> identified by a received
+ message, is always equal to the <c>snmpEngineID</c> 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
+ <c>snmpa:current_context/0</c> provided for this purpose.
+ </p>
+ <p>By default, the agent has no knowledge of any other contexts
+ than the default context, <c>""</c>. If it is to support more
+ contexts, these must be explicitly added, by using an appropriate
+ configuration file
+ <seealso marker="snmp_agent_config_files">Agent Configuration Files</seealso>.
+ </p>
+ </section>
+
+ <section>
+ <title>Management of the Agent</title>
+ <marker id="management"></marker>
+ <p>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.
+ </p>
+ <p>Any SNMP agent must implement the <c>system</c> group and the
+ <c>snmp</c> 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.
+ </p>
+ <p>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.
+ </p>
+ <p>There are five other standard MIBs, which also may be loaded
+ into the agent. These MIBs are:
+ </p>
+ <list type="bulleted">
+ <item>
+ <p>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.
+ </p>
+ </item>
+ <item>
+ <p>SNMP-VIEW-BASED-ACM-MIB, which defined managed objects
+ for access control. This MIB can be used with any SNMP
+ version.
+ </p>
+ </item>
+ <item>
+ <p>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.
+ </p>
+ </item>
+ <item>
+ <p>SNMP-USER-BASED-SM-MIB, which defines managed objects
+ for authentication and privacy. This MIB is only useful
+ with SNMPv3.
+ </p>
+ </item>
+ </list>
+ <p>All of these MIBs should be loaded into the Master Agent. Once
+ loaded, these MIBs are always available in all contexts.
+ </p>
+ <p>The ASN.1 code, the Erlang source code, and the generated
+ <c>.hrl</c> files for them are provided in the distribution and are
+ placed in the directories <c>mibs</c>, <c>src</c>, and <c>include</c>,
+ respectively, in the <c>snmp</c> application.
+ </p>
+ <p>The <c>.hrl</c> files are generated with
+ <c>snmpc:mib_to_hrl/1</c>. Include these files in your code as in
+ the following example:
+ </p>
+ <code type="none">
+-include_lib("snmp/include/SNMPv2-MIB.hrl").
+ </code>
+ <p>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 <seealso marker="snmp_config">Configuration Files</seealso>.
+ </p>
+
+ <section>
+ <title>STANDARD-MIB and SNMPv2-MIB</title>
+ <p>These MIBs contain the <c>snmp-</c> and <c>system</c> groups
+ from MIB-II which is defined in RFC1213 (STANDARD-MIB) or
+ RFC1907 (SNMPv2-MIB). They are implemented in the
+ <c>snmp_standard_mib</c> module. The <c>snmp</c> counters all
+ reside in volatile memory and the <c>system</c> and
+ <c>snmpEnableAuthenTraps</c> variables in persistent memory,
+ using the SNMP built-in database (refer to the Reference Manual,
+ section <c>snmp</c>, module <c>snmpa_local_db</c> for more
+ details).</p>
+ <p>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 <seealso marker="snmp_config">Configuration Files</seealso>.)
+ </p>
+ <p>One of these MIBs is always loaded. If only SNMPv1 is used,
+ STANDARD-MIB is loaded, otherwise SNMPv2-MIB is loaded.
+ </p>
+
+ <section>
+ <title>Data Types</title>
+ <p>There are some new data types in SNMPv2 that are useful in
+ SNMPv1 as well. In the STANDARD-MIB, three data types are
+ defined, <c>RowStatus</c>, <c>TruthValue</c> and
+ <c>DateAndTime</c>. These data types are originally defined
+ as textual conventions in SNMPv2-TC (RFC1903).
+ </p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP-FRAMEWORK-MIB and SNMP-MPD-MIB</title>
+ <p>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.
+ </p>
+ <p>The objects in these MIBs are implemented in the modules
+ <c>snmp_framework_mib</c> and <c>snmp_standard_mib</c>,
+ respectively. All objects reside in volatile memory, and the
+ configuration files are always reread at start-up.
+ </p>
+ <p>If SNMPv3 is used, these MIBs are loaded by default.
+ </p>
+ </section>
+
+ <section>
+ <title>SNMP-TARGET-MIB and SNMP-NOTIFICATION-MIB</title>
+ <p>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.
+ </p>
+ <p>All tables in these MIBs have a column of type
+ <c>StorageType</c>. 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 <c>volatile</c>
+ and <c>nonVolatile</c>. When the tables are initially filled
+ with data from the configuration files, these rows will
+ automatically have storage type <c>nonVolatile</c>. Should the
+ agent restart, all <c>nonVolatile</c> rows survive the restart,
+ while the <c>volatile</c> rows are lost.
+ The configuration files are not read at restart, by default.
+ </p>
+ <p>These MIBs are not loaded by default.
+ </p>
+
+ <section>
+ <title>snmpNotifyTable</title>
+ <p>An entry in the <c>snmpNotifyTable</c> 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 <c>send_notification/5</c> or the function
+ <c>send_trap</c> the parameter <c>NotifyName</c>, specified in
+ the call, is used as an index in the table. The notification
+ is sent to the management targets selected by that entry.
+ </p>
+ </section>
+
+ <section>
+ <title>snmpTargetAddrTable</title>
+ <p>An entry in the <c>snmpTargetAddrTable</c> defines
+ transport parameters (such as
+ IP address and UDP port) for each management target. Each row
+ in the <c>snmpNotifyTable</c> refers to potentially many rows
+ in the <c>snmpTargetAddrTable</c>. Each row in the
+ <c>snmpTargetAddrTable</c>
+ refers to an entry in the <c>snmpTargetParamsTable</c>.
+ </p>
+ </section>
+
+ <section>
+ <title>snmpTargetParamsTable</title>
+ <p>An entry in the <c>snmpTargetParamsTable</c> defines
+ which SNMP version to use, and which security parameters to use.
+ </p>
+ <p>Which SNMP version to use is implicitly defined by
+ specifying the Message Processing Model. This version of the
+ agent handles the models <c>v1</c>, <c>v2c</c> and <c>v3</c>.
+ </p>
+ <p>Each row specifies which security model to use, along with
+ security level and security parameters.
+ </p>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP-VIEW-BASED-ACM-MIB</title>
+ <p>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.
+ </p>
+ <p>All tables in this MIB have a column of type <c>StorageType</c>.
+ 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 <c>volatile</c>
+ and <c>nonVolatile</c>. When the tables are initially filled
+ with data from the configuration files, these rows will
+ automatically have storage type <c>nonVolatile</c>. Should the
+ agent restart, all <c>nonVolatile</c> rows survive the restart,
+ while the <c>volatile</c> rows are lost.
+ The configuration files are not read at restart by default.
+ </p>
+ <p>This MIB is not loaded by default.
+ </p>
+ <p>VACM is described in detail in RFC2275. Here is only a brief
+ description given.
+ </p>
+ <p>The basic concept is that of a <em>MIB view</em>. 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.
+ </p>
+ <p>The following picture gives an overview of the mechanism to
+ select an MIB view:</p>
+ <image file="MIB_mechanism.gif">
+ <icaption>Overview of the mechanism of MIB selection</icaption>
+ </image>
+
+ <section>
+ <title>vacmContextTable</title>
+ <p>The <c>vacmContextTable</c> is a read-only table that lists all
+ available contexts.
+ </p>
+ </section>
+
+ <section>
+ <title>vacmSecurityToGroupTable</title>
+ <p>The <c>vacmSecurityToGroupTable</c> maps a <c>securityModel</c>
+ and a
+ <c>securityName</c> to a <c>groupName</c>.
+ </p>
+ </section>
+
+ <section>
+ <title>vacmAccessTable</title>
+ <p>The <c>vacmAccessTable</c> maps the <c>groupName</c> (found in
+ <c>vacmSecurityToGroupTable</c>), <c>contextName</c>,
+ <c>securityModel</c>, and <c>securityLevel</c> to an MIB view
+ for each type of operation (read, write, or notify). The MIB
+ view is represented as a <c>viewName</c>. The definition of
+ the MIB view represented by the <c>viewName</c> is found in
+ the <c>vacmViewTreeFamilyTable</c></p>
+ </section>
+
+ <section>
+ <title>vacmViewTreeFamilyTable</title>
+ <p>The <c>vacmViewTreeFamilyTable</c> is indexed by the
+ <c>viewName</c>, and defines
+ which objects are included in the MIB view.
+ </p>
+ <p>The MIB definition for the table looks as follows:</p>
+ <pre>
+VacmViewTreeFamilyEntry ::= SEQUENCE
+ {
+ vacmViewTreeFamilyViewName SnmpAdminString,
+ vacmViewTreeFamilySubtree OBJECT IDENTIFIER,
+ vacmViewTreeFamilyMask OCTET STRING,
+ vacmViewTreeFamilyType INTEGER,
+ vacmViewTreeFamilyStorageType StorageType,
+ vacmViewTreeFamilyStatus RowStatus
+ }
+
+INDEX { vacmViewTreeFamilyViewName,
+ vacmViewTreeFamilySubtree
+ }
+ </pre>
+ <p>Each <c>vacmViewTreeFamilyViewName</c> refers to a
+ collection of sub-trees.
+ </p>
+
+ <section>
+ <title>MIB View Semantics</title>
+ <p>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.
+ </p>
+ <p>For each possible MIB object instance, the instance
+ belongs to a sub-tree if:
+ </p>
+ <list type="bulleted">
+ <item>the OBJECT IDENTIFIER name of that MIB object
+ instance comprises at least as many sub-identifiers as
+ does the sub-tree, and
+ </item>
+ <item>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).</item>
+ </list>
+ <p>Membership of an object instance in an MIB view is
+ determined by the following algorithm:
+ </p>
+ <list type="bulleted">
+ <item>If an MIB object instance does not belong to any of
+ the relevant sub-trees, then the instance is not in the
+ MIB view.
+ </item>
+ <item>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.
+ </item>
+ <item>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.
+ </item>
+ </list>
+ <note>
+ <p>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.</p>
+ </note>
+ </section>
+ </section>
+ </section>
+
+ <section>
+ <title>SNMP-COMMUNITY-MIB</title>
+ <p>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.
+ </p>
+ <p>All tables in this MIB have a column of type
+ <c>StorageType</c>. 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 <c>volatile</c>
+ and <c>nonVolatile</c>. When the tables are initially filled
+ with data from the configuration files, these rows will
+ automatically have storage type <c>nonVolatile</c>. Should the
+ agent restart, all <c>nonVolatile</c> rows survive the restart,
+ while the <c>volatile</c> rows are lost.
+ The configuration files are not read at restart, by default.
+ </p>
+ <p>This MIB is not loaded by default.
+ </p>
+ </section>
+
+ <section>
+ <title>SNMP-USER-BASED-SM-MIB</title>
+ <p>The SNMP-USER-BASED-SM-MIB defines managed objects that is
+ used for the User-Based Security Model.
+ </p>
+ <p>All tables in this MIB have a column of type
+ <c>StorageType</c>. 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 <c>volatile</c>
+ and <c>nonVolatile</c>. When the tables are initially filled
+ with data from the configuration files, these rows will
+ automatically have storage type <c>nonVolatile</c>. Should the
+ agent restart, all <c>nonVolatile</c> rows survive the restart,
+ while the <c>volatile</c> rows are lost.
+ The configuration files are not read at restart, by default.
+ </p>
+ <p>This MIB is not loaded by default.
+ </p>
+ </section>
+
+ <section>
+ <title>OTP-SNMPEA-MIB</title>
+ <p>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.
+ </p>
+ </section>
+ </section>
+
+ <section>
+ <title>Notifications</title>
+ <marker id="notifications"></marker>
+ <p>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:
+ </p>
+ <code type="none">
+snmpa:send_notification(Agent, Notification, Receiver
+ [, NotifyName, ContextName, Varbinds])
+snmpa:send_trap(Agent, Notification, Community [, Receiver, Varbinds])
+ </code>
+ <p>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.
+ </p>
+ <p>If the <c>send_notification/3,4</c> function is used, all
+ management targets are selected, as defined in RFC2273. The
+ <c>Receiver</c> parameter defines where the agent should send
+ information about the delivery of inform requests.
+ </p>
+ <p>If the <c>send_notification/5</c> function is used, an
+ <c>NotifyName</c> must be provided. This parameter is used as an
+ index in the <c>snmpNotifyTable</c>, and the management targets
+ defined by that single entry is used.
+ </p>
+ <p>The <c>send_notification/6</c> function is the most general
+ version of the function. A <c>ContextName</c> must be specified,
+ from which the notification will be sent. If this parameter is
+ not specified, the default context (<c>""</c>) is used.
+ </p>
+ <p>The function <c>send_trap</c> is kept for backwards
+ compatibility and should not be used in new code. Applications
+ that use this function will
+ continue to work. The <c>snmpNotifyName</c> is used as the
+ community string by the agent when a notification is sent.
+ </p>
+
+ <section>
+ <title>Notification Sending</title>
+ <p>The simplest way to send a notification is to call the function
+ <c>snmpa:send_notification(Agent, Notification, no_receiver)</c>.
+ 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.
+ </p>
+ <p>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 <c>Receiver</c>
+ parameter can be specified as <c>{Tag, ProcessName}</c> (refer
+ to the Reference Manual, section snmp, module <c>snmp</c> for
+ more details). In this case, the agent send a message
+ <c>{snmp_notification, Tag, {got_response, ManagerAddr}}</c> or
+ <c>{snmp_notification, Tag, {no_response, ManagerAddr}}</c> for
+ each management target.
+ </p>
+ <p>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
+ <c>send_notification</c> 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 <c>send_notification</c> function
+ <c>snmpa:send_notification(Agent, Notification, Receiver, Varbinds)</c>. In this function, <c>Varbinds</c> is a list of
+ <c>Varbind</c>, where each <c>Varbind</c> is one of:
+ </p>
+ <list type="bulleted">
+ <item><c>{Variable, Value}</c>, where <c>Variable</c> is the
+ symbolic name of a scalar variable referred to in the notification
+ specification.
+ </item>
+ <item><c>{Column, RowIndex, Value}</c>, where <c>Column</c> is
+ the symbolic name of a column variable. <c>RowIndex</c> is a
+ list of indices for the specified element. If this is the
+ case, the OBJECT IDENTIFIER sent in the trap is the
+ <c>RowIndex</c> appended to the OBJECT IDENTIFIER for the
+ table column. This is the OBJECT IDENTIFIER which specifies
+ the element.
+ </item>
+ <item><c>{OID, Value}</c>, where <c>OID</c> is the OBJECT
+ IDENTIFIER for an instance of an object, scalar variable or
+ column variable.
+ </item>
+ </list>
+ <p>For example, to specify that <c>sysLocation</c> should have the
+ value <c>"upstairs"</c> in the notification, we could use one of:
+ </p>
+ <list type="bulleted">
+ <item><c>{sysLocation, "upstairs"}</c> or</item>
+ <item><c>{[1,3,6,1,2,1,1,6,0], "upstairs"}</c></item>
+ </list>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+ <note>
+ <p>By definition, it is not possible to send objects with
+ ACCESS <c>not-accessible</c> in notifications. However,
+ historically this is often done and for this reason we allow
+ it in notification sending. If a variable has ACCESS
+ <c>not-accessible</c>, the user must provide a value for the
+ variable in the <c>Varbinds</c> list. It is not possible for
+ the agent to perform a get-operation to retrieve this value.
+ </p>
+ </note>
+ </section>
+
+ <section>
+ <title>Notification Filters</title>
+ <p>It is possible to add <em>notification filters</em> 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.</p>
+ <p>A notification filter is a module implementing the
+ <seealso marker="snmpa_notification_filter">snmpa_notification_filter</seealso> behaviour. A filter is added/deleted using the functions:
+ <seealso marker="snmpa#register_notification_filter">snmpa:register_notification_filter</seealso> and
+ <seealso marker="snmpa#unregister_notification_filter">snmpa:unregister_notification_filter</seealso>.</p>
+ <p>Unless otherwise specified, the order of the registered filters
+ will be the order in which they are registered.</p>
+ </section>
+
+ <section>
+ <title>Sub-agent Path</title>
+ <p>If a value for an object is not given to the
+ <c>send_notification</c> 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 <c>user_err/2</c> of the
+ error report module. No notifications are sent in this case.
+ </p>
+ <p>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.
+ </p>
+ </section>
+ </section>
+
+ <section>
+ <title>Discovery</title>
+ <marker id="discovery"></marker>
+ <p>The <em>sender</em> is <em>authoritative</em> for messages containing
+ payload which does <em>not</em> expect a response (for example
+ SNMPv2-Trap, Response or Report PDU). </p>
+ <p>The <em>receiver</em> is <em>authoritative</em> for messages containing
+ payload which expects a response (for example
+ Get, GetNext, Get-Bulk, Set or Inform PDU). </p>
+ <p>The agent can both perform and respond to discovery.</p>
+ <p>The agent responds to discovery autonomously, without interaction
+ by the user. </p>
+ <p>Initiating discovery towards a manager is done by calling the
+ <seealso marker="snmpa#discovery">discovery</seealso> function.
+ The <c>EngineId</c> field of the target (manager) entry in the
+ <seealso marker="snmp_agent_config_files#target_addr">target_addr.conf</seealso> file has to have the value <c>discovery</c>.
+ Note that if the manager does not respond, the <c>Timeout</c> and
+ <c>RetryCount</c>
+ fields decide how long the function will hang before it returns. </p>
+ <p>Discovery can only be performed towards one manager at a time.</p>
+ </section>
+
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Definition of Agent Net if</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_agent_netif.xml</file>
+ </header>
+ <p></p>
+ <image file="snmp_agent_netif_1.gif">
+ <icaption>The Purpose of Agent Net if</icaption>
+ </image>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+ <p>It is also possible to write your own Net if process. The default
+ Net if process is implemented in the module <c>snmpa_net_if</c> and
+ it uses UDP as the transport protocol.
+ </p>
+ <p>This section describes how to write a Net if process.
+ </p>
+
+ <section>
+ <marker id="mandatory_functions"></marker>
+ <title>Mandatory Functions</title>
+ <p>A Net if process must implement the SNMP agent
+ <seealso marker="snmpa_network_interface">network interface behaviour</seealso>.
+ </p>
+ </section>
+
+ <section>
+ <title>Messages</title>
+ <p>The section <em>Messages</em> describes mandatory messages, which
+ Net if must send and be able to receive.
+ </p>
+
+ <section>
+ <title>Outgoing Messages</title>
+ <p>Net if must send the following message when it receives an
+ SNMP PDU from the network that is aimed for the MasterAgent:
+ </p>
+ <pre>
+MasterAgent ! {snmp_pdu, Vsn, Pdu, PduMS, ACMData, From, Extra}
+ </pre>
+ <list type="bulleted">
+ <item><c>Vsn</c> is either <c>'version-1'</c>,
+ <c>'version-2'</c>, or <c>'version-3'</c>.
+ </item>
+ <item><c>Pdu</c> is an SNMP PDU record, as defined in
+ <c>snmp_types.hrl</c>, with the SNMP request.
+ </item>
+ <item><c>PduMS</c> is the Maximum Size of the response Pdu
+ allowed. Normally this is returned from
+ <c>snmpa_mpd:process_packet</c> (see Reference Manual).
+ </item>
+ <item><c>ACMData</c> is data used by the Access Control Module
+ in use. Normally this is returned from
+ <c>snmpa_mpd:process_packet</c> (see Reference Manual).
+ </item>
+ <item><c>From</c> is the source address. If UDP over IP is
+ used, this should be a 2-tuple <c>{IP, UDPport}</c>, where
+ <c>IP</c> is a 4-tuple with the IP address, and <c>UDPport</c>
+ is an integer.
+ </item>
+ <item><c>Extra</c> is any term the Net if process wishes to
+ send to the agent. This term can be retrieved by the
+ instrumentation functions by calling
+ <c>snmp:current_net_if_data()</c>. This data is also sent back
+ to the Net if process when the agent generates a response to
+ the request.</item>
+ </list>
+ <p>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.
+ </p>
+ <pre>
+Pid ! {snmp_response_received, Vsn, Pdu, From}
+ </pre>
+ <list type="bulleted">
+ <item><c>Pid</c> is the Process that waits for the response
+ for the request. The Pid was specified in the
+ <c>send_pdu_req</c> message <seealso marker="#message">(see below)</seealso>.
+ </item>
+ <item><c>Vsn</c> is either <c>'version-1'</c>, <c>'version-2'</c>, or
+ <c>'version-3'</c>.
+ </item>
+ <item><c>Pdu</c> is the SNMP Pdu received
+ </item>
+ <item><c>From</c> is the source address. If UDP over IP is
+ used, this should be a 2-tuple <c>{IP, UDPport}</c>, where
+ <c>IP</c> is a 4-tuple with the IP address, and <c>UDPport</c>
+ is an integer.
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Incoming Messages</title>
+ <p>This section describes the incoming messages which a Net if
+ process must be able to receive.
+ </p>
+ <list type="bulleted">
+ <item>
+ <p><c>{snmp_response, Vsn, Pdu, Type, ACMData, To, Extra}</c></p>
+ <p>This message is sent to the Net if process from a master
+ agent as a response to a previously received request.
+ </p>
+ <list type="bulleted">
+ <item><c>Vsn</c> is either <c>'version-1'</c>,
+ <c>'version-2'</c>, or <c>'version-3'</c>.
+ </item>
+ <item><c>Pdu</c> is an SNMP PDU record (as defined in
+ snmp_types.hrl) with the SNMP response.
+ </item>
+ <item><c>Type</c> is the <c>#pdu.type</c> of the original
+ request.
+ </item>
+ <item><c>ACMData</c> is data used by the Access Control
+ Module in use. Normally this is just sent to
+ <c>snmpa_mpd:generate_response_message</c> (see Reference Manual).
+ </item>
+ <item><c>To</c> is the destination address. If UDP over IP
+ is used, this should be a 2-tuple <c>{IP, UDPport}</c>,
+ where <c>IP</c> is a 4-tuple with the IP address, and
+ <c>UDPport</c> is an integer.
+ </item>
+ <item><c>Extra</c> is the term that the Net if process
+ sent to the agent when the request was sent to the agent.
+ </item>
+ </list>
+ </item>
+ <item>
+ <p><c>{discarded_pdu, Vsn, ReqId, ACMData, Variable, Extra}</c></p>
+ <p>This message is sent from a master agent if it for some
+ reason decided to discard the pdu.
+ </p>
+ <list type="bulleted">
+ <item><c>Vsn</c> is either <c>'version-1'</c>,
+ <c>'version-2'</c>, or <c>'version-3'</c>.
+ </item>
+ <item><c>ReqId</c> is the request id of the original
+ request.
+ </item>
+ <item><c>ACMData</c> is data used by the Access Control
+ Module in use. Normally this is just sent to
+ <c>snmpa_mpd:generate_response_message</c> (see Reference Manual).
+ </item>
+ <item><c>Variable</c> is the name of an snmp counter that
+ represents the error, e.g. <c>snmpInBadCommunityUses</c>.
+ </item>
+ <item><c>Extra</c> is the term that the Net if process
+ sent to the agent when the request was sent to the agent.
+ </item>
+ </list>
+ </item>
+ <item>
+ <p><c>{send_pdu, Vsn, Pdu, MsgData, To}</c></p>
+ <p>This message is sent from a master agent when a trap is
+ to be sent.
+ </p>
+ <list type="bulleted">
+ <item><c>Vsn</c> is either <c>'version-1'</c>,
+ <c>'version-2'</c>, or <c>'version-3'</c>.
+ </item>
+ <item><c>Pdu</c> is an SNMP PDU record (as defined in
+ snmp_types.hrl) with the SNMP response.
+ </item>
+ <item><c>MsgData</c> is the message specific data used in
+ the SNMP message. This value is normally sent to
+ <c>snmpa_mpd:generate_message/4</c>. In SNMPv1 and
+ SNMPv2c, this message data is the community string. In
+ SNMPv3, it is the context information.
+ </item>
+ <item><c>To</c> is a list of the destination addresses and
+ their corresponding security parameters. This value is
+ normally sent to <c>snmpa_mpd:generate_message/4</c>.
+ </item>
+ </list>
+ </item>
+ <item>
+ <p><c>{send_pdu_req, Vsn, Pdu, MsgData, To, Pid}</c></p>
+ <p>This <marker id="message"></marker>
+ 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
+ <c>snmp_response_received</c> message.
+ </p>
+ <list type="bulleted">
+ <item><c>Vsn</c> is either <c>'version-1'</c>,
+ <c>'version-2'</c>, or <c>'version-3'</c>.
+ </item>
+ <item><c>Pdu</c> is an SNMP PDU record (as defined in
+ snmp_types.hrl) with the SNMP response.
+ </item>
+ <item><c>MsgData</c> is the message specific data used in
+ the SNMP message. This value is normally sent to
+ <c>snmpa_mpd:generate_message/4</c>. In SNMPv1 and
+ SNMPv2c, this message data is the community string. In
+ SNMPv3, it is the context information.
+ </item>
+ <item><c>To</c> is a list of the destination addresses and
+ their corresponding security parameters. This value is
+ normally sent to <c>snmpa_mpd:generate_message/4</c>.
+ </item>
+ <item><c>Pid</c> is a process identifier.
+ </item>
+ </list>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Notes</title>
+ <p>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 <c>snmpa_mpd</c> for this purpose (refer to the
+ Reference Manual, section <c>snmp</c>,
+ module <seealso marker="snmp_pdus">snmpa_mpd</seealso>
+ for more details.)
+ </p>
+ <p>There are also some useful functions for encoding and
+ decoding of SNMP messages in the module
+ <seealso marker="snmp_pdus">snmp_pdus</seealso>.
+ </p>
+ </section>
+ </section>
+</chapter>
+
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
--- /dev/null
+++ b/lib/snmp/doc/src/snmp_agent_netif_1.gif
Binary files 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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE appref SYSTEM "appref.dtd">
+
+<appref>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmp</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp.xml</file>
+ </header>
+ <app>snmp</app>
+ <appsummary>The SNMP Application</appsummary>
+ <description>
+ <p>This chapter describes the <c>snmp</c>
+ application in OTP. The SNMP application provides the following
+ services:</p>
+ <list type="bulleted">
+ <item>
+ <p>a multilingual extensible SNMP agent</p>
+ </item>
+ <item>
+ <p>a SNMP manager</p>
+ </item>
+ <item>
+ <p>a MIB compiler</p>
+ </item>
+ </list>
+
+ </description>
+
+ <section>
+ <marker id="configuration_params"></marker>
+ <title>Configuration</title>
+ <p>The following configuration parameters are defined for the SNMP
+ application. Refer to application(3) for more information about
+ configuration parameters.
+ </p>
+
+ <p>The snmp part of the config file specifying the configuration
+ parameters is basically the following tuple:</p>
+ <pre>
+ {snmp, snmp_components_config()}
+ </pre>
+
+ <p>A minimal config file for starting a node with both a manager
+ and an agent:</p>
+ <pre>
+ [{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"}]}]}]}
+ ]
+ }
+ ].
+ </pre>
+
+ <p>Each snmp component has it's own set of configuration parameters,
+ even though some of the types are common to both components. </p>
+
+ <!-- Also in snmp_config.xml -->
+
+ <pre>
+ 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()}
+ </pre>
+
+ <p>Agent specific config options and types:</p>
+ <taglist>
+ <tag><c><![CDATA[agent_type() = master | sub <optional>]]></c></tag>
+ <item>
+ <p>If <c>master</c>, one master agent is
+ started. Otherwise, no agents are started. </p>
+ <p>Default is <c>master</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_discovery() = [agent_discovery_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>agent_discovery_opt() =
+ {terminating, agent_terminating_discovery_opts()} |
+ {originating, agent_originating_discovery_opts()}</c></p>
+ <p>The <c>terminating</c> options effects discovery initiated by
+ a manager. </p>
+ <p>The <c>originating</c> options effects discovery initiated
+ by this agent. </p>
+ <p>For defaults see the options in <c>agent_discovery_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>agent_terminating_discovery_opt() =
+ {enable, boolean()} |
+ {stage2, discovery | plain} |
+ {trigger_username, string()}</c></p>
+ <p>These are options effecting discovery <c>terminating</c> in this
+ agent (i.e. initiated by a manager). </p>
+ <p>The default values for the <c>terminating</c>
+ discovery options are: </p>
+ <list type="bulleted">
+ <item>enable: <c>true</c></item>
+ <item>stage2: <c>discovery</c></item>
+ <item>trigger_username: <c>""</c></item>
+ </list>
+ </item>
+
+ <tag><c><![CDATA[agent_originating_discovery_opts() = [agent_originating_discovery_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>agent_originating_discovery_opt() =
+ {enable, boolean()}</c></p>
+ <p>These are options effecting discovery <c>originating</c> in this
+ agent. </p>
+ <p>The default values for the <c>originating</c>
+ discovery options are: </p>
+ <list type="bulleted">
+ <item>enable: <c>true</c></item>
+ </list>
+ </item>
+
+ <tag><c><![CDATA[multi_threaded() = bool() <optional>]]></c></tag>
+ <item>
+ <p>If <c>true</c>, the agent is multi-threaded, with one
+ thread for each get request. </p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[db_dir() = string() <mandatory>]]></c></tag>
+ <item>
+ <p>Defines where the SNMP agent internal db files are stored.</p>
+ </item>
+
+ <tag><c><![CDATA[local_db() = [local_db_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>local_db_opt() = {repair, agent_repair()} | {auto_save, agent_auto_save()} | {verbosity, verbosity()}</c></p>
+ <p>Defines options specific for the SNMP agent local database.</p>
+ <p>For defaults see the options in <c>local_db_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_repair() = false | true | force <optional>]]></c></tag>
+ <item>
+ <p>When starting snmpa_local_db it always tries to open an
+ existing database. If <c>false</c>, and some errors occur, a new
+ database is created instead. If <c>true</c>, an existing file
+ will be repaired. If <c>force</c>, the table will be repaired
+ even if it was properly closed. </p>
+ <p>Default is <c>true</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_auto_save() = integer() | infinity <optional>]]></c></tag>
+ <item>
+ <p>The auto save interval. The table is flushed to disk
+ whenever not accessed for this amount of time.</p>
+ <p>Default is <c>5000</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_net_if() = [agent_net_if_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>agent_net_if_opt() = {module, agent_net_if_module()} | {verbosity, verbosity()} | {options, agent_net_if_options()}</c></p>
+ <p>Defines options specific for the SNMP agent network interface
+ entity. </p>
+ <p>For defaults see the options in <c>agent_net_if_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_net_if_module() = atom() <optional>]]></c></tag>
+ <item>
+ <p>Module which handles the network interface part for the
+ SNMP agent. Must implement the
+ <seealso marker="snmpa_network_interface">snmpa_network_interface</seealso> behaviour.</p>
+ <p>Default is <c>snmpa_net_if</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_net_if_options() = [agent_net_if_option()] <optional>]]></c></tag>
+ <item>
+ <p><c>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()}</c></p>
+ <p>These options are actually specific to the used module.
+ The ones shown here are applicable to the default
+ <c>agent_net_if_module()</c>.</p>
+ <p>For defaults see the options in <c>agent_net_if_option()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[req_limit() = integer() | infinity <optional>]]></c></tag>
+ <item>
+ <p>Max number of simultaneous requests handled by the agent.</p>
+ <p>Default is <c>infinity</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_net_if_filter_options() = [agent_net_if_filter_option()] <optional>]]></c></tag>
+ <item>
+ <p><c>agent_net_if_filter_option() = {module, agent_net_if_filter_module()}</c></p>
+ <p>These options are actually specific to the used module.
+ The ones shown here are applicable to the default
+ <c><![CDATA[agent_net_if_filter_module()]]></c>.</p>
+ <p>For defaults see the options in
+ <c>agent_net_if_filter_option()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_net_if_filter_module() = atom() <optional>]]></c></tag>
+ <item>
+ <p>Module which handles the network interface filter part for the
+ SNMP agent. Must implement the
+ <seealso marker="snmpa_network_interface_filter">snmpa_network_interface_filter</seealso> behaviour.</p>
+ <p>Default is <c>snmpa_net_if_filter</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_mibs() = [string()] <optional>]]></c></tag>
+ <item>
+ <p>Specifies a list of MIBs (including path) that defines which MIBs
+ are initially loaded into the SNMP master agent. </p>
+ <p>Note that the following mibs will always be loaded:</p>
+ <list type="bulleted">
+ <item>version v1: <c>STANDARD-MIB</c></item>
+ <item>version v2: <c>SNMPv2</c></item>
+ <item>version v3: <c>SNMPv2</c>, <c>SNMP-FRAMEWORK-MIB</c>
+ and <c>SNMP-MPD-MIB</c></item>
+ </list>
+ <p>Default is <c>[]</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[mib_storage() = ets | {ets, Dir} | {ets, Dir, Action} | dets | {dets, Dir} | {dets, Dir, Action} | mnesia | {mnesia, Nodes} | {mnesia, Nodes, Action} <optional>]]></c></tag>
+ <item>
+ <p>Specifies how info retrieved from the mibs will be stored.</p>
+ <p>If <c>mib_storage</c> is <c>{ets, Dir}</c>, the table will also be
+ stored on file. If <c>Dir</c> is <c>default</c>, then <c>db_dir</c>
+ will be used.</p>
+ <p>If <c>mib_storage</c> is <c>dets</c> or if <c>Dir</c> is
+ <c>default</c>, then <c>db_dir</c> will be used for <c>Dir</c>.</p>
+ <p>If <c>mib_storage</c> is <c>mnesia</c> then <c>erlang:nodes()</c>
+ will be used for <c>Nodes</c>.</p>
+ <p>Default is <c>ets</c>. </p>
+ <p><c>Dir = default | string()</c>. Dir is the directory where the
+ files will be stored. If <c>default</c>, then <c>db_dir</c> will be
+ used.</p>
+ <p><c>Nodes = visible | connected | [node()]</c>.
+ <c>Nodes = visible</c> is translated to
+ <c>erlang:nodes(visible)</c>.
+ <c>Nodes = connected</c> is translated to
+ <c>erlang:nodes(connected)</c>.
+ If <c>Nodes = []</c> then the own node is assumed.</p>
+ <p><c>Action = clear | keep</c>. Default is <c>keep</c>.
+ <c>Action</c> is used to specify what shall be done if the
+ mnesia/dets table already exist.</p>
+ </item>
+
+ <tag><c><![CDATA[mib_server() = [mib_server_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>mib_server_opt() = {mibentry_override, mibentry_override()} | {trapentry_override, trapentry_override()} | {verbosity, verbosity()} | {cache, mibs_cache()}</c></p>
+ <p>Defines options specific for the SNMP agent mib server. </p>
+ <p>For defaults see the options in <c>mib_server_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[mibentry_override() = bool() <optional>]]></c></tag>
+ <item>
+ <p>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.</p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[trapentry_override() = bool() <optional>]]></c></tag>
+ <item>
+ <p>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.</p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[mibs_cache() = bool() | mibs_cache_opts() <optional>]]></c></tag>
+ <item>
+ <p>Shall the agent utilize the mib server lookup cache or not.</p>
+ <p>Default is <c>true</c> (in which case the <c>mibs_cache_opts()</c>
+ default values apply).</p>
+ </item>
+
+ <tag><c><![CDATA[mibs_cache_opts() = [mibs_cache_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>mibs_cache_opt() = {autogc, mibs_cache_autogc()} | {gclimit, mibs_cache_gclimit()} | {age, mibs_cache_age()}</c></p>
+ <p>Defines options specific for the SNMP agent mib server cache. </p>
+ <p>For defaults see the options in <c>mibs_cache_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[mibs_cache_autogc() = bool() <optional>]]></c></tag>
+ <item>
+ <p>Defines if the mib server shall perform cache gc automatically or
+ leave it to the user (see
+ <seealso marker="snmpa#gc_mibs_cache">gc_mibs_cache/0,1,2,3</seealso>). </p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[mibs_cache_age() = integer() > 0 <optional>]]></c></tag>
+ <item>
+ <p>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. </p>
+ <p>The age is defined in milliseconds. </p>
+ <p>Default is <c>10 timutes</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[mibs_cache_gclimit() = integer() > 0 | infinity <optional>]]></c></tag>
+ <item>
+ <p>When performing a GC, this is the max number of cache entries
+ that will be deleted from the cache. </p>
+ <p>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. </p>
+ <p>Default is <c>100</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[error_report_mod() = atom() <optional>]]></c></tag>
+ <item>
+ <p>Defines an error report module, implementing the
+ <seealso marker="snmpa_error_report">snmpa_error_report</seealso>
+ behaviour. Two modules are provided with the toolkit:
+ <c>snmpa_error_logger</c> and <c>snmpa_error_io</c>.</p>
+ <p>Default is <c>snmpa_error_logger</c>.</p>
+ </item>
+
+ <tag><c>symbolic_store() = [symbolic_store_opt()]</c></tag>
+ <item>
+ <p><c>symbolic_store_opt() = {verbosity, verbosity()}</c></p>
+ <p>Defines options specific for the SNMP agent symbolic store. </p>
+ <p>For defaults see the options in <c>symbolic_store_opt()</c>.</p>
+ </item>
+
+ <tag><c>target_cache() = [target_cache_opt()]</c></tag>
+ <item>
+ <p><c>target_cache_opt() = {verbosity, verbosity()}</c></p>
+ <p>Defines options specific for the SNMP agent target cache. </p>
+ <p>For defaults see the options in <c>target_cache_opt()</c>.</p>
+ </item>
+ <tag><c><![CDATA[agent_config() = [agent_config_opt()] <mandatory>]]></c></tag>
+ <item>
+ <p><c>agent_config_opt() = {dir, agent_config_dir()} | {force_load, force_load()} | {verbosity, verbosity()}</c></p>
+ <p>Defines specific config related options for the SNMP agent. </p>
+ <p>For defaults see the options in <c>agent_config_opt()</c>.</p>
+ </item>
+ <tag><c><![CDATA[agent_config_dir = dir() <mandatory>]]></c></tag>
+ <item>
+ <p>Defines where the SNMP agent configuration files are stored.</p>
+ </item>
+
+ <tag><c><![CDATA[force_load() = bool() <optional>]]></c></tag>
+ <item>
+ <p>If <c>true</c> the configuration files are re-read
+ during start-up, and the contents of the configuration
+ database ignored. Thus, if <c>true</c>, changes to
+ the configuration database are lost upon reboot of the
+ agent. </p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+ </taglist>
+
+ <p>Manager specific config options and types:</p>
+ <taglist>
+ <tag><c><![CDATA[server() = [server_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>server_opt() = {timeout, server_timeout()} | {verbosity, verbosity()}</c></p>
+ <p>Specifies the options for the manager server process.</p>
+ <p>Default is <c>silence</c>.</p>
+ </item>
+ <tag><c><![CDATA[server_timeout() = integer() <optional>]]></c></tag>
+ <item>
+ <p>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 <em>best before</em> time has been passed.
+ This cleanup will be performed at regular intervals, defined
+ by the <c>server_timeout()</c> time.
+ The information will have an <em>best before</em> time,
+ defined by the <c>Expire</c> time given when calling the
+ request function (see
+ <seealso marker="snmpm#async_get">async_get</seealso>,
+ <seealso marker="snmpm#async_get_next">async_get_next</seealso> and
+ <seealso marker="snmpm#async_set">async_set</seealso>).</p>
+ <p>Time in milli-seconds.</p>
+ <p>Default is <c>30000</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_config() = [manager_config_opt()] <mandatory>]]></c></tag>
+ <item>
+ <p><c>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()}</c></p>
+ <p>Defines specific config related options for the SNMP manager. </p>
+ <p>For defaults see the options in <c>manager_config_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_config_dir = dir() <mandatory>]]></c></tag>
+ <item>
+ <p>Defines where the SNMP manager configuration files are stored.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_db_dir = dir() <mandatory>]]></c></tag>
+ <item>
+ <p>Defines where the SNMP manager store persistent data.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_repair() = false | true | force <optional>]]></c></tag>
+ <item>
+ <p>Defines the repair option for the persistent database (if
+ and how the table is repaired when opened). </p>
+ <p>Default is <c>true</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_auto_save() = integer() | infinity <optional>]]></c></tag>
+ <item>
+ <p>The auto save interval. The table is flushed to disk
+ whenever not accessed for this amount of time.</p>
+ <p>Default is <c>5000</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_irb() = auto | user | {user, integer()} <optional>]]></c></tag>
+ <item>
+ <p>This option defines how the manager will handle the sending of
+ response (acknowledgment) to received inform-requests. </p>
+ <list type="bulleted">
+ <item>
+ <p><c>auto</c> - The manager will autonomously send response
+ (acknowledgment&gt; to inform-request messages.</p>
+ </item>
+ <item>
+ <p><c>{user, integer()}</c> - The manager will send response
+ (acknowledgment) to inform-request messages when the
+ <seealso marker="snmpm_user#handle_inform">handle_inform</seealso>
+ function completes. The integer is the time, in milli-seconds,
+ that the manager will consider the stored inform-request info
+ valid.</p>
+ </item>
+ <item>
+ <p><c>user</c> - Same as <c>{user, integer()}</c>, except that
+ the default time, 15 seconds (15000), is used.</p>
+ </item>
+ </list>
+ <p>See
+ <seealso marker="snmpm_network_interface">snmpm_network_interface</seealso>,
+ <seealso marker="snmpm_user">handle_inform</seealso> and
+ <seealso marker="snmp_manager_netif">definition of the manager net if</seealso> for more info.</p>
+ <p>Default is <c>auto</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_mibs() = [string()] <optional>]]></c></tag>
+ <item>
+ <p>Specifies a list of MIBs (including path) and defines which MIBs
+ are initially loaded into the SNMP manager. </p>
+ <p>Default is <c>[]</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_net_if() = [manager_net_if_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>manager_net_if_opt() = {module, manager_net_if_module()} |
+ {verbosity, verbosity()} |
+ {options, manager_net_if_options()}</c></p>
+ <p>Defines options specific for the SNMP manager network interface
+ entity. </p>
+ <p>For defaults see the options in <c>manager_net_if_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_net_if_options() = [manager_net_if_option()] <optional>]]></c></tag>
+ <item>
+ <p><c>manager_net_if_option() = {bind_to, bind_to()} |
+ {sndbuf, sndbuf()} |
+ {recbuf, recbuf()} |
+ {no_reuse, no_reuse()} |
+ {filter, manager_net_if_filter_options()} </c></p>
+ <p>These options are actually specific to the used module.
+ The ones shown here are applicable to the default
+ <c>manager_net_if_module()</c>.</p>
+ <p>For defaults see the options in <c>manager_net_if_option()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_net_if_module() = atom() <optional>]]></c></tag>
+ <item>
+ <p>Module which handles the network interface part for the
+ SNMP manager. Must implement the
+ <seealso marker="snmpm_network_interface">snmpm_network_interface</seealso> behaviour.</p>
+ <p>Default is <c>snmpm_net_if</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_net_if_filter_options() = [manager_net_if_filter_option()] <optional>]]></c></tag>
+ <item>
+ <p><c>manager_net_if_filter_option() = {module, manager_net_if_filter_module()}</c></p>
+ <p>These options are actually specific to the used module.
+ The ones shown here are applicable to the default
+ <c><![CDATA[manager_net_if_filter_module()]]></c>.</p>
+ <p>For defaults see the options in
+ <c>manager_net_if_filter_option()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_net_if_filter_module() = atom() <optional>]]></c></tag>
+ <item>
+ <p>Module which handles the network interface filter part for the
+ SNMP manager. Must implement the
+ <seealso marker="snmpm_network_interface_filter">snmpm_network_interface_filter</seealso> behaviour.</p>
+ <p>Default is <c>snmpm_net_if_filter</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[def_user_module() = atom() <optional>]]></c></tag>
+ <item>
+ <p>The module implementing the default user. See the
+ <seealso marker="snmpm_user">snmpm_user</seealso> behaviour.</p>
+ <p>Default is <c>snmpm_user_default</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[def_user_data() = term() <optional>]]></c></tag>
+ <item>
+ <p>Data for the default user. Passed to the user module when
+ calling the callback functions.</p>
+ <p>Default is <c>undefined</c>.</p>
+ </item>
+ </taglist>
+
+ <p>Common config types:</p>
+ <taglist>
+ <tag><c>restart_type() = permanent | transient | temporary</c></tag>
+ <item>
+ <p>See <seealso marker="stdlib:supervisor#child_spec">supervisor</seealso>
+ documentation for more info.</p>
+ <p>Default is <c>permanent</c> for the agent and <c>transient</c>
+ for the manager.</p>
+ </item>
+ <tag><c>db_init_error() = terminate | create</c></tag>
+ <item>
+ <p>Defines what to do if the agent or manager is unable to open an
+ existing database file. <c>terminate</c> means that the
+ agent/manager will terminate and <c>create</c> means that the
+ agent/manager will remove the faulty file(s) and create new ones.</p>
+ <p>Default is <c>terminate</c>.</p>
+ </item>
+ <tag><c><![CDATA[priority() = atom() <optional>]]></c></tag>
+ <item>
+ <p>Defines the Erlang priority for all SNMP processes.</p>
+ <p>Default is <c>normal</c>.</p>
+ </item>
+ <tag><c><![CDATA[versions() = [version()] <optional>]]></c></tag>
+ <item>
+ <p><c>version() = v1 | v2 | v3</c></p>
+ <p>Which SNMP versions shall be accepted/used.</p>
+ <p>Default is <c>[v1,v2,v3]</c>.</p>
+ </item>
+ <tag><c><![CDATA[verbosity() = silence | info | log | debug | trace <optional>]]></c></tag>
+ <item>
+ <p>Verbosity for a SNMP process. This specifies now much debug info
+ is printed.</p>
+ <p>Default is <c>silence</c>.</p>
+ </item>
+ <tag><c><![CDATA[bind_to() = bool() <optional>]]></c></tag>
+ <item>
+ <p>If <c>true</c>, net_if binds to the IP address.
+ If <c>false</c>, net_if listens on any IP address on the host
+ where it is running. </p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+ <tag><c><![CDATA[no_reuse() = bool() <optional>]]></c></tag>
+ <item>
+ <p>If <c>true</c>, net_if does not specify that the IP
+ and port address should be reusable. If <c>false</c>,
+ the address is set to reusable. </p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+ <tag><c><![CDATA[recbuf() = integer() <optional>]]></c></tag>
+ <item>
+ <p>Receive buffer size. </p>
+ <p>Default value is defined by <c>gen_udp</c>.</p>
+ </item>
+ <tag><c><![CDATA[sndbuf() = integer() <optional>]]></c></tag>
+ <item>
+ <p>Send buffer size. </p>
+ <p>Default value is defined by <c>gen_udp</c>.</p>
+ </item>
+ <tag><c><![CDATA[note_store() = [note_store_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>note_store_opt() = {timeout, note_store_timeout()} | {verbosity, verbosity()}</c></p>
+ <p>Specifies the start-up verbosity for the SNMP note store.</p>
+ <p>For defaults see the options in <c>note_store_opt()</c>.</p>
+ </item>
+ <tag><c><![CDATA[note_store_timeout() = integer() <optional>]]></c></tag>
+ <item>
+ <p>Note cleanup time. When storing a note in the note store,
+ each note is given lifetime. Every <c>timeout</c> the note_store
+ process performs a GC to remove the expired note's. Time in
+ milli-seconds.</p>
+ <p>Default is <c>30000</c>.</p>
+ </item>
+ <tag><c><![CDATA[audit_trail_log() = [audit_trail_log_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>audit_trail_log_opt() = {type, atl_type()} | {dir, atl_dir()} | {size, atl_size()} | {repair, atl_repair()}</c></p>
+ <p>If present, this option specifies the options for the
+ audit trail logging. The <c>disk_log</c> module is used
+ to maintain a wrap log. If present, the <c>dir</c> and
+ <c>size</c> options are mandatory.</p>
+ <p>If not present, audit trail logging is not used.</p>
+ </item>
+ <tag><c><![CDATA[atl_type() = read | write | read_write <optional>]]></c></tag>
+ <item>
+ <p>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. </p>
+ <p>For the agent:</p>
+ <list type="bulleted">
+ <item>If <c>write</c> is specified, only set requests are logged. </item>
+ <item>If <c>read</c> is specified, only get requests are logged. </item>
+ <item>If <c>read_write</c>, all requests are logged. </item>
+ </list>
+ <p>For the manager:</p>
+ <list type="bulleted">
+ <item>If <c>write</c> is specified, only sent messages are logged. </item>
+ <item>If <c>read</c> is specified, only received messages are logged. </item>
+ <item>If <c>read_write</c>, both outgoing and incoming messages are
+ logged. </item>
+ </list>
+ <p>Default is <c>read_write</c>.</p>
+ </item>
+ <tag><c><![CDATA[atl_dir = dir() <mandatory>]]></c></tag>
+ <item>
+ <p>Specifies where the audit trail log should be stored.</p>
+ <p>If <c>audit_trail_log</c> specifies that logging should take
+ place, this parameter <em>must</em> be defined.</p>
+ </item>
+ <tag><c><![CDATA[atl_size() = {integer(), integer()} <mandatory>]]></c></tag>
+ <item>
+ <p>Specifies the size of the audit
+ trail log. This parameter is sent to <c>disk_log</c>. </p>
+ <p>If <c>audit_trail_log</c> specifies that logging should
+ take place, this parameter <em>must</em> be defined.</p>
+ </item>
+ <tag><c><![CDATA[atl_repair() = true | false | truncate | snmp_repair <optional>]]></c></tag>
+ <item>
+ <p>Specifies if and how the audit trail log shall be repaired
+ when opened. Unless this parameter has the value <c>snmp_repair</c>
+ it is sent to <c>disk_log</c>. If, on the other hand, the value is
+ <c>snmp_repair</c>, 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 <em>moves it aside</em> for later off-line
+ analysis.</p>
+ <p>Default is <c>true</c>.</p>
+ </item>
+ </taglist>
+ </section>
+
+ <section>
+ <title>See Also</title>
+ <p>application(3), disk_log(3)</p>
+ </section>
+
+</appref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>SNMP Appendix A</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_app_a.xml</file>
+ </header>
+
+ <section>
+ <title>Appendix A</title>
+ <p>This appendix describes the conversion of SNMPv2 to SNMPv1
+ error messages. The instrumentation functions should return v2
+ error messages.
+ </p>
+ <p>Mapping of SNMPv2 error message to SNMPv1:
+ </p>
+ <table>
+ <row>
+ <cell align="left" valign="middle">SNMPv2 message</cell>
+ <cell align="left" valign="middle">SNMPv1 message</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">noError</cell>
+ <cell align="left" valign="middle">noError</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">genErr</cell>
+ <cell align="left" valign="middle">genErr</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">noAccess</cell>
+ <cell align="left" valign="middle">noSuchName</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">wrongType</cell>
+ <cell align="left" valign="middle">badValue</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">wrongLength</cell>
+ <cell align="left" valign="middle">badValue</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">wrongEncoding</cell>
+ <cell align="left" valign="middle">badValue</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">wrongValue</cell>
+ <cell align="left" valign="middle">badValue</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">noCreation</cell>
+ <cell align="left" valign="middle">noSuchName</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">inconsistentValue</cell>
+ <cell align="left" valign="middle">badValue</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">resourceUnavailable</cell>
+ <cell align="left" valign="middle">genErr</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">commitFailed</cell>
+ <cell align="left" valign="middle">genErr</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">undoFailed</cell>
+ <cell align="left" valign="middle">genErr</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">notWritable</cell>
+ <cell align="left" valign="middle">noSuchName</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">inconsistentName</cell>
+ <cell align="left" valign="middle">noSuchName</cell>
+ </row>
+ <tcaption>Error Messages</tcaption>
+ </table>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>SNMP Appendix B</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_app_b.xml</file>
+ </header>
+
+ <section>
+ <title>Appendix B</title>
+
+ <section>
+ <title>RowStatus (from RFC1903)</title>
+ <pre>
+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)
+ }
+ </pre>
+ </section>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Audit Trail Log</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_audit_trail_log.xml</file>
+ </header>
+ <p>The chapter <em>Audit Trail Log</em> describes the audit trail logging.
+ </p>
+ <p>Both the agent and the manager can be configured to log
+ incoming and outgoing messages. It uses the Erlang standard log
+ mechanism <c>disk_log</c> 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.
+ </p>
+ <p>The log can be either a <c>read</c>, <c>write</c> or a
+ <c>read_write</c>.
+ </p>
+
+ <section>
+ <title>Agent Logging</title>
+ <p>For the agent, a <c>write</c>, means that all <c>set</c>
+ requests and their responses are stored. No <c>get</c> requests
+ or traps are stored in a <c>write</c>. A <c>read_write</c>,
+ all requests, responses and traps are stored.
+ </p>
+ <p>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
+ <seealso marker="snmpa#log_to_txt">snmpa:log_to_txt</seealso>
+ for this purpose.
+ </p>
+ </section>
+
+ <section>
+ <title>Manager Logging</title>
+ <p>For the manager, a <c>write</c>, means that all
+ requests (<c>set</c> and <c>get</c>) and their responses are stored.
+ No traps are stored in a <c>write</c>. A <c>read_write</c>,
+ all requests, responses and traps are stored.
+ </p>
+ <p>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
+ <seealso marker="snmpm#log_to_txt">snmpm:log_to_txt</seealso>
+ for this purpose.
+ </p>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1999</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmp_community_mib</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_community_mib.xml</file>
+ </header>
+ <module>snmp_community_mib</module>
+ <modulesummary>Instrumentation Functions for SNMP-COMMUNITY-MIB</modulesummary>
+ <description>
+ <p>The module <c>snmp_community_mib</c> implements the instrumentation
+ functions for the
+ SNMP-COMMUNITY-MIB, and functions for configuring the database.
+ </p>
+ <p>The configuration files are described in the SNMP User's Manual.</p>
+ </description>
+ <funcs>
+ <func>
+ <name>configure(ConfDir) -> void()</name>
+ <fsummary>Configure the SNMP-COMMUNITY-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>This function is called from the supervisor at system
+ start-up.
+ </p>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old rows with StorageType
+ <c>volatile</c>. The rows created from the configuration file
+ will have StorageType <c>nonVolatile</c>.
+ </p>
+ <p>All <c>snmp</c> counters are set to zero.
+ </p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the error,
+ report module and the function fails with reason
+ <c>configuration_error</c>.
+ </p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found.
+ </p>
+ <p>The configuration file read is: <c>community.conf</c>.
+ </p>
+ </desc>
+ </func>
+ <func>
+ <name>reconfigure(ConfDir) -> void()</name>
+ <fsummary>Configure the SNMP-COMMUNITY-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old data, including the rows with
+ StorageType <c>nonVolatile</c>. The rows created from the
+ configuration file will have StorageType <c>nonVolatile</c>.
+ </p>
+ <p>Thus, the data in the SNMP-COMMUNITY-MIB, after this
+ function has been called, is from the configuration files.
+ </p>
+ <p>All <c>snmp</c> counters are set to zero.
+ </p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the error report
+ module, and the function fails with reason
+ <c>configuration_error</c>.
+ </p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found.
+ </p>
+ <p>The configuration file read is: <c>community.conf</c>.</p>
+ <marker id="add_community"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>add_community(Idx, CommName, SecName, CtxName, TransportTag) -> Ret</name>
+ <fsummary>Added one community</fsummary>
+ <type>
+ <v>Idx = string()</v>
+ <v>CommName = string()</v>
+ <v>SecName = string()</v>
+ <v>CtxName = string()</v>
+ <v>TransportTag = string()</v>
+ <v>Ret = {ok, Key} | {error, Reason}</v>
+ <v>Key = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Adds a community to the agent config.
+ Equivalent to one line in the <c>community.conf</c> file.</p>
+ <marker id="delete_community"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>delete_community(Key) -> Ret</name>
+ <fsummary>Delete one community</fsummary>
+ <type>
+ <v>Key = term()</v>
+ <v>Ret = ok | {error, Reason}</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Delete a community from the agent config.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Running the application</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_config.xml</file>
+ </header>
+ <p>The chapter <em>Running the application</em> describes how the
+ application is configured and started.
+ The topics include:</p>
+ <list type="bulleted">
+ <item>configuration directories and parameters</item>
+ <item>modifying the configuration files</item>
+ <item>starting the application (agent and/or manager)</item>
+ <item>debugging the application (agent and/or manager)</item>
+ </list>
+ <p>Refer also to the chapter(s)
+ <seealso marker="snmp_agent_config_files">Definition of Agent Configuration Files</seealso> and
+ <seealso marker="snmp_manager_config_files">Definition of Manager Configuration Files</seealso> which contains more detailed information
+ about the agent and manager configuration files.</p>
+
+ <section>
+ <marker id="configuration_params"></marker>
+ <title>Configuring the application</title>
+ <p>The following two directories must exist in the system
+ to run the agent:</p>
+ <list type="bulleted">
+ <item>
+ <p>the <em>configuration directory</em> stores all
+ configuration files used by the agent (refer to the chapter
+ <seealso marker="snmp_agent_config_files">Definition of Agent Configuration Files</seealso> for more information). </p>
+ </item>
+ <item>the <em>database directory</em> stores the internal
+ database files.</item>
+ </list>
+ <p>The following directory must exist in the system
+ to run the manager:</p>
+ <list type="bulleted">
+ <item>
+ <p>the <em>configuration directory</em> stores all
+ configuration files used by the manager (refer to the chapter
+ <seealso marker="snmp_manager_config_files">Definition of Manager Configuration Files</seealso> for more information). </p>
+ </item>
+ <item>
+ <p>the <em>database directory</em> stores the internal
+ database files. </p>
+ </item>
+ </list>
+
+ <p>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:</p>
+
+ <!-- Also in snmp_app.xml -->
+
+ <pre>
+ 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()}
+ </pre>
+
+ <p>Agent specific config options and types:</p>
+ <taglist>
+ <tag><c><![CDATA[agent_type() = master | sub <optional>]]></c></tag>
+ <item>
+ <p>If <c>master</c>, one master agent is
+ started. Otherwise, no agents are started. </p>
+ <p>Default is <c>master</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_discovery() = [agent_discovery_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>agent_discovery_opt() =
+ {terminating, agent_terminating_discovery_opts()} |
+ {originating, agent_originating_discovery_opts()}</c></p>
+ <p>The <c>terminating</c> options effects discovery initiated by
+ a manager. </p>
+ <p>The <c>originating</c> options effects discovery initiated
+ by this agent. </p>
+ <p>For defaults see the options in <c>agent_discovery_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_terminating_discovery_opts() = [agent_terminating_discovery_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>agent_terminating_discovery_opt() =
+ {enable, boolean()} |
+ {stage2, discovery | plain} |
+ {trigger_username, string()}</c></p>
+ <p>These are options effecting discovery <c>terminating</c> in this
+ agent (i.e. initiated by a manager). </p>
+ <p>The default values for the <c>terminating</c>
+ discovery options are: </p>
+ <list type="bulleted">
+ <item>enable: <c>true</c></item>
+ <item>stage2: <c>discovery</c></item>
+ <item>trigger_username: <c>""</c></item>
+ </list>
+ </item>
+
+ <tag><c><![CDATA[agent_originating_discovery_opts() = [agent_originating_discovery_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>agent_originating_discovery_opt() =
+ {enable, boolean()}</c></p>
+ <p>These are options effecting discovery <c>originating</c> in this
+ agent. </p>
+ <p>The default values for the <c>originating</c>
+ discovery options are: </p>
+ <list type="bulleted">
+ <item>enable: <c>true</c></item>
+ </list>
+ </item>
+
+ <tag><c><![CDATA[multi_threaded() = bool() <optional>]]></c></tag>
+ <item>
+ <p>If <c>true</c>, the agent is multi-threaded, with one
+ thread for each get request. </p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[db_dir() = string() <mandatory>]]></c></tag>
+ <item>
+ <p>Defines where the SNMP agent internal db files are stored.</p>
+ </item>
+
+ <tag><c><![CDATA[local_db() = [local_db_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>local_db_opt() = {repair, agent_repair()} | {auto_save, agent_auto_save()} | {verbosity, verbosity()}</c></p>
+ <p>Defines options specific for the SNMP agent local database.</p>
+ <p>For defaults see the options in <c>local_db_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_repair() = false | true | force <optional>]]></c></tag>
+ <item>
+ <p>When starting snmpa_local_db it always tries to open an
+ existing database. If <c>false</c>, and some errors occur, a new
+ database is created instead. If <c>true</c>, an existing file
+ will be repaired. If <c>force</c>, the table will be repaired
+ even if it was properly closed. </p>
+ <p>Default is <c>true</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_auto_save() = integer() | infinity <optional>]]></c></tag>
+ <item>
+ <p>The auto save interval. The table is flushed to disk
+ whenever not accessed for this amount of time.</p>
+ <p>Default is <c>5000</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_net_if() = [agent_net_if_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>agent_net_if_option() = {module, agent_net_if_module()} |
+ {verbosity, verbosity()} |
+ {options, agent_net_if_options()}</c></p>
+ <p>Defines options specific for the SNMP agent network interface
+ entity. </p>
+ <p>For defaults see the options in <c>agent_net_if_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_net_if_module() = atom() <optional>]]></c></tag>
+ <item>
+ <p>Module which handles the network interface part for the
+ SNMP agent. Must implement the
+ <seealso marker="snmpa_network_interface">snmpa_network_interface</seealso> behaviour.</p>
+ <p>Default is <c>snmpa_net_if</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_net_if_options() = [agent_net_if_option()] <optional>]]></c></tag>
+ <item>
+ <p><c>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()}</c></p>
+ <p>These options are actually specific to the used module.
+ The ones shown here are applicable to the default
+ <c>agent_net_if_module()</c>.</p>
+ <p>For defaults see the options in <c>agent_net_if_option()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_net_if_filter_options() = [agent_net_if_filter_option()] <optional>]]></c></tag>
+ <item>
+ <p><c><![CDATA[agent_net_if_filter_option() = {module, agent_net_if_filter_module()}]]></c></p>
+ <p>These options are actually specific to the used module.
+ The ones shown here are applicable to the default
+ <c>agent_net_if_filter_module()</c>.</p>
+ <p>For defaults see the options in <c>agent_net_if_filter_option()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_net_if_filter_module() = atom() <optional>]]></c></tag>
+ <item>
+ <p>Module which handles the network interface filter part for the
+ SNMP agent. Must implement the
+ <seealso marker="snmpa_network_interface_filter">snmpa_network_interface_filter
+ </seealso> behaviour.</p>
+ <p>Default is <c>snmpa_net_if_filter</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[req_limit() = integer() | infinity <optional>]]></c></tag>
+ <item>
+ <p>Max number of simultaneous requests handled by the agent.</p>
+ <p>Default is <c>infinity</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_mibs() = [string()] <optional>]]></c></tag>
+ <item>
+ <p>Specifies a list of MIBs (including path) that defines which MIBs
+ are initially loaded into the SNMP master agent. </p>
+ <p>Note that the following will always be loaded:</p>
+ <list type="bulleted">
+ <item>version v1: <c>STANDARD-MIB</c></item>
+ <item>version v2: <c>SNMPv2</c></item>
+ <item>version v3: <c>SNMPv2</c>, <c>SNMP-FRAMEWORK-MIB</c>
+ and <c>SNMP-MPD-MIB</c></item>
+ </list>
+ <p>Default is <c>[]</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[mib_storage() = ets | {ets, Dir} | {ets, Dir, Action} | dets | {dets, Dir} | {dets, Dir, Action} | mnesia | {mnesia, Nodes} | {mnesia, Nodes, Action} <optional>]]></c></tag>
+ <item>
+ <p>Specifies how info retrieved from the mibs will be stored.</p>
+ <p>If <c>mib_storage</c> is <c>{ets, Dir}</c>, the table will also be
+ stored on file. If <c>Dir</c> is <c>default</c>, then <c>db_dir</c>
+ will be used.</p>
+ <p>If <c>mib_storage</c> is <c>dets</c> or if <c>Dir</c> is
+ <c>default</c>, then <c>db_dir</c> will be used for <c>Dir</c>.</p>
+ <p>If <c>mib_storage</c> is <c>mnesia</c> then <c>erlang:nodes()</c>
+ will be used for <c>Nodes</c>.</p>
+ <p>Default is <c>ets</c>. </p>
+ <p><c>Dir = default | string()</c>. Dir is the directory where the
+ files will be stored. If <c>default</c>, then <c>db_dir</c> will be
+ used.</p>
+ <p><c>Nodes = visible | connected | [node()]</c>.
+ <c>Nodes = visible</c> is translated to
+ <c>erlang:nodes(visible)</c>.
+ <c>Nodes = connected</c> is translated to
+ <c>erlang:nodes(connected)</c>.
+ If <c>Nodes = []</c> then the own node is assumed.</p>
+ <p><c>Action = clear | keep</c>. Default is <c>keep</c>.
+ <c>Action</c> is used to specify what shall be done if the
+ mnesia/dets table already exist.</p>
+ </item>
+
+ <tag><c><![CDATA[mib_server() = [mib_server_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>mib_server_opt() = {mibentry_override, mibentry_override()} | {trapentry_override, trapentry_override()} | {verbosity, verbosity()} | {cache, mibs_cache()}</c></p>
+ <p>Defines options specific for the SNMP agent mib server. </p>
+ <p>For defaults see the options in <c>mib_server_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[mibentry_override() = bool() <optional>]]></c></tag>
+ <item>
+ <p>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.</p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[trapentry_override() = bool() <optional>]]></c></tag>
+ <item>
+ <p>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.</p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[mibs_cache() = bool() | mibs_cache_opts() <optional>]]></c></tag>
+ <item>
+ <p>Shall the agent utilize the mib server lookup cache or not.</p>
+ <p>Default is <c>true</c> (in which case the <c>mibs_cache_opts()</c>
+ default values apply).</p>
+ </item>
+
+ <tag><c><![CDATA[mibs_cache_opts() = [mibs_cache_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>mibs_cache_opt() = {autogc, mibs_cache_autogc()} | {gclimit, mibs_cache_gclimit()} | {age, mibs_cache_age()}</c></p>
+ <p>Defines options specific for the SNMP agent mib server cache. </p>
+ <p>For defaults see the options in <c>mibs_cache_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[mibs_cache_autogc() = bool() <optional>]]></c></tag>
+ <item>
+ <p>Defines if the mib server shall perform cache gc automatically or
+ leave it to the user (see
+ <seealso marker="snmpa#gc_mibs_cache">gc_mibs_cache/0,1,2,3</seealso>). </p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[mibs_cache_age() = integer() > 0 <optional>]]></c></tag>
+ <item>
+ <p>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. </p>
+ <p>The age is defined in milliseconds. </p>
+ <p>Default is <c>10 timutes</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[mibs_cache_gclimit() = integer() > 0 | infinity <optional>]]></c></tag>
+ <item>
+ <p>When performing a GC, this is the max number of cache entries
+ that will be deleted from the cache. </p>
+ <p>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. </p>
+ <p>Default is <c>100</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[error_report_mod() = atom() <optional>]]></c></tag>
+ <item>
+ <p>Defines an error report module, implementing the
+ <seealso marker="snmpa_error_report">snmpa_error_report</seealso>
+ behaviour. Two modules are provided with the toolkit:
+ <c>snmpa_error_logger</c> and <c>snmpa_error_io</c>.</p>
+ <p>Default is <c>snmpa_error_logger</c>.</p>
+ </item>
+
+ <tag><c>symbolic_store() = [symbolic_store_opt()]</c></tag>
+ <item>
+ <p><c>symbolic_store_opt() = {verbosity, verbosity()}</c></p>
+ <p>Defines options specific for the SNMP agent symbolic store. </p>
+ <p>For defaults see the options in <c>symbolic_store_opt()</c>.</p>
+ </item>
+
+ <tag><c>target_cache() = [target_cache_opt()]</c></tag>
+ <item>
+ <p><c>target_cache_opt() = {verbosity, verbosity()}</c></p>
+ <p>Defines options specific for the SNMP agent target cache. </p>
+ <p>For defaults see the options in <c>target_cache_opt()</c>.</p>
+ </item>
+ <tag><c><![CDATA[agent_config() = [agent_config_opt()] <mandatory>]]></c></tag>
+ <item>
+ <p><c>agent_config_opt() = {dir, agent_config_dir()} | {force_load, force_load()} | {verbosity, verbosity()}</c></p>
+ <p>Defines specific config related options for the SNMP agent. </p>
+ <p>For defaults see the options in <c>agent_config_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[agent_config_dir = dir() <mandatory>]]></c></tag>
+ <item>
+ <p>Defines where the SNMP agent configuration files are stored.</p>
+ </item>
+
+ <tag><c><![CDATA[force_load() = bool() <optional>]]></c></tag>
+ <item>
+ <p>If <c>true</c> the configuration files are re-read
+ during start-up, and the contents of the configuration
+ database ignored. Thus, if <c>true</c>, changes to
+ the configuration database are lost upon reboot of the
+ agent. </p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+ </taglist>
+
+ <p>Manager specific config options and types:</p>
+ <taglist>
+ <tag><c><![CDATA[server() = [server_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>server_opt() = {timeout, server_timeout()} | {verbosity, verbosity()}</c></p>
+ <p>Specifies the options for the manager server process.</p>
+ <p>Default is <c>silence</c>.</p>
+ </item>
+ <tag><c><![CDATA[server_timeout() = integer() <optional>]]></c></tag>
+ <item>
+ <p>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 <em>best before</em> time has been passed.
+ This cleanup will be performed at regular intervals, defined
+ by the <c>server_timeout()</c> time.
+ The information will have a <em>best before</em> time,
+ defined by the <c>Expire</c> time given when calling the
+ request function (see
+ <seealso marker="snmpm#async_get">async_get</seealso>,
+ <seealso marker="snmpm#async_get_next">async_get_next</seealso> and
+ <seealso marker="snmpm#async_set">async_set</seealso>).</p>
+ <p>Time in milli-seconds.</p>
+ <p>Default is <c>30000</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_config() = [manager_config_opt()] <mandatory>]]></c></tag>
+ <item>
+ <p><c>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()}</c></p>
+ <p>Defines specific config related options for the SNMP manager. </p>
+ <p>For defaults see the options in <c>manager_config_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_config_dir = dir() <mandatory>]]></c></tag>
+ <item>
+ <p>Defines where the SNMP manager configuration files are stored.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_db_dir = dir() <mandatory>]]></c></tag>
+ <item>
+ <p>Defines where the SNMP manager store persistent data.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_repair() = false | true | force <optional>]]></c></tag>
+ <item>
+ <p>Defines the repair option for the persistent database (if
+ and how the table is repaired when opened). </p>
+ <p>Default is <c>true</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_auto_save() = integer() | infinity <optional>]]></c></tag>
+ <item>
+ <p>The auto save interval. The table is flushed to disk
+ whenever not accessed for this amount of time.</p>
+ <p>Default is <c>5000</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_irb() = auto | user | {user, integer()} <optional>]]></c></tag>
+ <item>
+ <p>This option defines how the manager will handle the sending of
+ response (acknowledgment) to received inform-requests. </p>
+ <list type="bulleted">
+ <item>
+ <p><c>auto</c> - The manager will autonomously send response
+ (acknowledgment&gt; to inform-request messages.</p>
+ </item>
+ <item>
+ <p><c>{user, integer()}</c> - The manager will send response
+ (acknowledgment) to inform-request messages when the
+ <seealso marker="snmpm_user#handle_inform">handle_inform</seealso>
+ function completes. The integer is the time, in milli-seconds,
+ that the manager will consider the stored inform-request info
+ valid.</p>
+ </item>
+ <item>
+ <p><c>user</c> - Same as <c>{user, integer()}</c>, except that
+ the default time, 15000 milli-seconds, is used.</p>
+ </item>
+ </list>
+ <p>See
+ <seealso marker="snmpm_network_interface">snmpm_network_interface</seealso>,
+ <seealso marker="snmpm_user">handle_inform</seealso> and
+ <seealso marker="snmp_manager_netif">definition of the manager net if</seealso> for more info.</p>
+ <p>Default is <c>auto</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_mibs() = [string()] <optional>]]></c></tag>
+ <item>
+ <p>Specifies a list of MIBs (including path) and defines which MIBs
+ are initially loaded into the SNMP manager. </p>
+ <p>Default is <c>[]</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_net_if() = [manager_net_if_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>manager_net_if_opt() = {module, manager_net_if_module()} |
+ {verbosity, verbosity()} |
+ {options, manager_net_if_options()}</c></p>
+ <p>Defines options specific for the SNMP manager network interface
+ entity. </p>
+ <p>For defaults see the options in <c>manager_net_if_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_net_if_options() = [manager_net_if_option()] <optional>]]></c></tag>
+ <item>
+ <p><c>manager_net_if_option() = {bind_to, bind_to()} |
+ {sndbuf, sndbuf()} |
+ {recbuf, recbuf()} |
+ {no_reuse, no_reuse()} |
+ {filter, manager_net_if_filter_options()}</c></p>
+ <p>These options are actually specific to the used module.
+ The ones shown here are applicable to the default
+ <c>manager_net_if_module()</c>.</p>
+ <p>For defaults see the options in <c>manager_net_if_option()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_net_if_module() = atom() <optional>]]></c></tag>
+ <item>
+ <p>Module which handles the network interface part for the
+ SNMP manager. Must implement the
+ <seealso marker="snmpm_network_interface">snmpm_network_interface</seealso> behaviour.</p>
+ <p>Default is <c>snmpm_net_if</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_net_if_filter_options() = [manager_net_if_filter_option()] <optional>]]></c></tag>
+ <item>
+ <p><c>manager_net_if_filter_option() = {module, manager_net_if_filter_module()}</c></p>
+ <p>These options are actually specific to the used module.
+ The ones shown here are applicable to the default
+ <c><![CDATA[manager_net_if_filter_module()]]></c>.</p>
+ <p>For defaults see the options in
+ <c>manager_net_if_filter_option()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[manager_net_if_filter_module() = atom() <optional>]]></c></tag>
+ <item>
+ <p>Module which handles the network interface filter part for the
+ SNMP manager. Must implement the
+ <seealso marker="snmpm_network_interface_filter">snmpm_network_interface_filter</seealso> behaviour.</p>
+ <p>Default is <c>snmpm_net_if_filter</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[def_user_module() = atom() <optional>]]></c></tag>
+ <item>
+ <p>The module implementing the default user. See the
+ <seealso marker="snmpm_user">snmpm_user</seealso> behaviour.</p>
+ <p>Default is <c>snmpm_user_default</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[def_user_data() = term() <optional>]]></c></tag>
+ <item>
+ <p>Data for the default user. Passed to the user when calling
+ the callback functions.</p>
+ <p>Default is <c>undefined</c>.</p>
+ </item>
+ </taglist>
+
+ <p>Common config types:</p>
+ <taglist>
+ <tag><c>restart_type() = permanent | transient | temporary</c></tag>
+ <item>
+ <p>See <seealso marker="stdlib:supervisor#child_spec">supervisor</seealso>
+ documentation for more info.</p>
+ <p>Default is <c>permanent</c> for the agent and <c>transient</c>
+ for the manager.</p>
+ </item>
+
+ <tag><c>db_init_error() = terminate | create</c></tag>
+ <item>
+ <p>Defines what to do if the agent is unable to open an
+ existing database file. <c>terminate</c> means that the
+ agent/manager will terminate and <c>create</c> means that the
+ agent/manager will remove the faulty file(s) and create new ones.</p>
+ <p>Default is <c>terminate</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[priority() = atom() <optional>]]></c></tag>
+ <item>
+ <p>Defines the Erlang priority for all SNMP processes.</p>
+ <p>Default is <c>normal</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[versions() = [version()] <optional>]]></c></tag>
+ <item>
+ <p><c>version() = v1 | v2 | v3</c></p>
+ <p>Which SNMP versions shall be accepted/used.</p>
+ <p>Default is <c>[v1,v2,v3]</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[verbosity() = silence | info | log | debug | trace <optional>]]></c></tag>
+ <item>
+ <p>Verbosity for a SNMP process. This specifies now much debug info
+ is printed.</p>
+ <p>Default is <c>silence</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[bind_to() = bool() <optional>]]></c></tag>
+ <item>
+ <p>If <c>true</c>, net_if binds to the IP address.
+ If <c>false</c>, net_if listens on any IP address on the host
+ where it is running. </p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[no_reuse() = bool() <optional>]]></c></tag>
+ <item>
+ <p>If <c>true</c>, net_if does not specify that the IP
+ and port address should be reusable. If <c>false</c>,
+ the address is set to reusable. </p>
+ <p>Default is <c>false</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[recbuf() = integer() <optional>]]></c></tag>
+ <item>
+ <p>Receive buffer size. </p>
+ <p>Default value is defined by <c>gen_udp</c>.</p>
+ </item>
+ <tag><c><![CDATA[sndbuf() = integer() <optional>]]></c></tag>
+ <item>
+ <p>Send buffer size. </p>
+ <p>Default value is defined by <c>gen_udp</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[note_store() = [note_store_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>note_store_opt() = {timeout, note_store_timeout()} | {verbosity, verbosity()}</c></p>
+ <p>Specifies the options for the SNMP note store.</p>
+ <p>For defaults see the options in <c>note_store_opt()</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[note_store_timeout() = integer() <optional>]]></c></tag>
+ <item>
+ <p>Note cleanup time. When storing a note in the note store,
+ each note is given lifetime. Every <c>timeout</c> the note_store
+ process performs a GC to remove the expired note's. Time in
+ milli-seconds.</p>
+ <p>Default is <c>30000</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[audit_trail_log() [audit_trail_log_opt()] <optional>]]></c></tag>
+ <item>
+ <p><c>audit_trail_log_opt() = {type, atl_type()} | {dir, atl_dir()} | {size, atl_size()} | {repair, atl_repair()}</c></p>
+ <p>If present, this option specifies the options for the
+ <em>audit trail logging</em>. The <c>disk_log</c> module is used
+ to maintain a wrap log. If present, the <c>dir</c> and
+ <c>size</c> options are mandatory.</p>
+ <p>If not present, audit trail logging is not used.</p>
+ </item>
+
+ <tag><c><![CDATA[atl_type() = read | write | read_write <optional>]]></c></tag>
+ <item>
+ <p>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. </p>
+ <p>For the agent:</p>
+ <list type="bulleted">
+ <item>If <c>write</c> is specified, only set requests are logged. </item>
+ <item>If <c>read</c> is specified, only get requests are logged. </item>
+ <item>If <c>read_write</c>, all requests are logged. </item>
+ </list>
+ <p>For the manager:</p>
+ <list type="bulleted">
+ <item>If <c>write</c> is specified, only sent messages are logged. </item>
+ <item>If <c>read</c> is specified, only received messages are logged. </item>
+ <item>If <c>read_write</c>, both outgoing and incoming messages are
+ logged. </item>
+ </list>
+ <p>Default is <c>read_write</c>.</p>
+ </item>
+
+ <tag><c><![CDATA[atl_dir = dir() <mandatory>]]></c></tag>
+ <item>
+ <p>Specifies where the audit trail log should be stored.</p>
+ <p>If <c>audit_trail_log</c> specifies that logging should take
+ place, this parameter <em>must</em> be defined.</p>
+ </item>
+
+ <tag><c><![CDATA[atl_size() = {integer(), integer()} <mandatory>]]></c></tag>
+ <item>
+ <p>Specifies the size of the audit
+ trail log. This parameter is sent to <c>disk_log</c>. </p>
+ <p>If <c>audit_trail_log</c> specifies that logging should
+ take place, this parameter <em>must</em> be defined.</p>
+ </item>
+
+ <tag><c><![CDATA[atl_repair() = true | false | truncate | snmp_repair <optional>]]></c></tag>
+ <item>
+ <p>Specifies if and how the audit trail log shall be repaired
+ when opened. Unless this parameter has the value <c>snmp_repair</c>
+ it is sent to <c>disk_log</c>. If, on the other hand, the value is
+ <c>snmp_repair</c>, 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 <em>moves it aside</em> for later off-line
+ analysis.</p>
+ <p>Default is <c>true</c>.</p>
+ </item>
+ </taglist>
+ </section>
+
+ <section>
+ <title>Modifying the Configuration Files</title>
+ <p>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.</p>
+ <p>If authentication or encryption is used (SNMPv3 only), start
+ the <c>crypto</c> application.</p>
+ <pre>
+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&amp;2,1&amp;2&amp;3,2&amp;3)? [3] 1&amp;2&amp;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&amp;2,1&amp;2&amp;3,2&amp;3)? [3] 1&amp;2&amp;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
+ </pre>
+ </section>
+
+ <section>
+ <title>Starting the application</title>
+ <p>Start Erlang with the command:</p>
+ <code type="none">
+erl -config /tmp/snmp/sys
+ </code>
+ <p>If authentication or encryption is used (SNMPv3 only), start
+ the <c>crypto</c> application. If this step is forgotten, the
+ agent will not start, but report a
+ <c>{config_error,{unsupported_crypto,_}}</c> error.</p>
+ <pre>
+1> <input>application:start(crypto).</input>
+ok
+ </pre>
+ <pre>
+2> <input>application:start(snmp).</input>
+ok
+ </pre>
+ </section>
+
+ <section>
+ <marker id="verbosity"></marker>
+ <title>Debugging the application</title>
+ <p>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
+ <c>snmpa:verbosity/2</c> and <c>snmpm:verbosity/2</c> function(s)
+ and/or using
+ <seealso marker="#configuration_params">configuration parameters</seealso>.
+ The verbosity itself has several <em>levels</em>: <c>silence | info | log | debug | trace</c>. For the lowest verbosity <c>silence</c>,
+ nothing is printed. The higher the verbosity, the more is printed.
+ Default value is always <c>silence</c>.</p>
+ <pre>
+3> <input>snmpa:verbosity(master_agent, log).</input>
+ok
+5> <input>snmpa:verbosity(net_if, log).</input>
+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
+ </pre>
+
+ <p>Other useful function(s) for debugging the agent are: </p>
+ <taglist>
+ <tag><c><![CDATA[snmpa:info/0,1]]></c></tag>
+ <item>
+ <p><seealso marker="snmpa#info">info</seealso> is used to retrieve a list of miscellaneous agent information.</p>
+ </item>
+
+ <tag><c><![CDATA[snmpa:which_aliasnames/0]]></c></tag>
+ <item>
+ <p><seealso marker="snmpa#which_aliasnames">which_aliasnames</seealso> is used to retrieve a list of all alias-names known to the agent. </p>
+ </item>
+
+ <tag><c><![CDATA[snmpa:which_tables/0]]></c></tag>
+ <item>
+ <p><seealso marker="snmpa#which_tables">which_tables</seealso> is used to retrieve a list of all (MIB) tables known to the agent. </p>
+ </item>
+
+ <tag><c><![CDATA[snmpa:which_variables/0]]></c></tag>
+ <item>
+ <p><seealso marker="snmpa#which_variables">which_variables</seealso> is used to retrieve a list of all (MIB) variables known to the agent. </p>
+ </item>
+
+ <tag><c><![CDATA[snmpa:which_notifications/0]]></c></tag>
+ <item>
+ <p><seealso marker="snmpa#which_notifications">which_notifications</seealso> is used to retrieve a list of all (MIB) notifications/traps known to the agent. </p>
+ </item>
+
+ <tag><c><![CDATA[snmpa:restart_worker/0,1]]></c></tag>
+ <item>
+ <p><seealso marker="snmpa#restart_worker">restart_worker</seealso> is used to restart the worker process of a multi-threaded agent. </p>
+ </item>
+
+ <tag><c><![CDATA[snmpa:restart_set_worker/0,1]]></c></tag>
+ <item>
+ <p><seealso marker="snmpa#restart_set_worker">restart_set_worker</seealso> is used to restart the set-worker process of a multi-threaded agent. </p>
+ </item>
+
+ <tag><c><![CDATA[snmpa_local_db:print/0,1,2]]></c></tag>
+ <item>
+ <p>For example, this function can show the counters
+ <c>snmpInPkts</c> and <c>snmpOutPkts</c>.</p>
+ </item>
+ </taglist>
+
+ <p>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: </p>
+ <taglist>
+ <tag><c><![CDATA[snmpCommunityTable]]></c></tag>
+ <item>
+ <p><c><![CDATA[snmp_community_mib:snmpCommunityTable(print).]]></c></p>
+ </item>
+
+ <tag><c><![CDATA[snmpNotifyTable]]></c></tag>
+ <item>
+ <p><c><![CDATA[snmp_notification_mib:snmpNotifyTable(print).]]></c></p>
+ </item>
+
+ <tag><c><![CDATA[snmpTargetAddrTable]]></c></tag>
+ <item>
+ <p><c><![CDATA[snmp_target_mib:snmpTargetAddrTable(print).]]></c></p>
+ </item>
+
+ <tag><c><![CDATA[snmpTargetParamsTable]]></c></tag>
+ <item>
+ <p><c><![CDATA[snmp_target_mib:snmpTargetParamsTable(print).]]></c></p>
+ </item>
+
+ <tag><c><![CDATA[usmUserTable]]></c></tag>
+ <item>
+ <p><c><![CDATA[snmp_user_based_sm_mib:usmUserTable(print).]]></c></p>
+ </item>
+
+ </taglist>
+
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Definition of Instrumentation Functions</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_def_instr_functions.xml</file>
+ </header>
+ <p>The section <em>Definition of Instrumentation Functions</em> describes
+ the user defined functions, which the agent calls at different times.
+ </p>
+
+ <section>
+ <title>Variable Instrumentation</title>
+ <p>For scalar variables, a function <c>f(Operation, ...)</c> must
+ be defined.
+ </p>
+ <p>The <c>Operation</c> can be <c>new</c>, <c>delete</c>,
+ <c>get</c>, <c>is_set_ok</c>, <c>set</c>, or <c>undo</c>.
+ </p>
+ <p>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 <seealso marker="snmp_app_a">Appendix A</seealso> for a
+ description of error code conversions.
+ </p>
+
+ <section>
+ <title>f(new [, ExtraArgs])</title>
+ <p>The function <c>f(new [, ExtraArgs])</c> is called for each
+ variable in the MIB when the
+ MIB is loaded into the agent. This makes it possible to perform
+ necessary initialization.
+ </p>
+ <p>This function is optional. The return value is discarded.</p>
+ </section>
+
+ <section>
+ <title>f(delete [, ExtraArgs])</title>
+ <p>The function <c>f(delete [, ExtraArgs])</c> 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.
+ </p>
+ <p>This function is optional. The return value is discarded.</p>
+ </section>
+
+ <section>
+ <title>f(get [, ExtraArgs])</title>
+ <p>The function <c>f(get [, ExtraArgs])</c> is called when a
+ get-request or a get-next
+ request refers to the variable.
+ </p>
+ <p>This function is mandatory.
+ </p>
+
+ <section>
+ <title>Valid Return Values</title>
+ <list type="bulleted">
+ <item><c>{value, Value}</c>. The <c>Value</c> must be of
+ correct type, length and within ranges, otherwise
+ <c>genErr</c> 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.
+ </item>
+ <item><c>{noValue, noSuchName}</c>(SNMPv1)
+ </item>
+ <item><c>{noValue, noSuchObject | noSuchInstance} </c>(SNMPv2)
+ </item>
+ <item><c>genErr</c>. 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 <c>{noValue, noSuchName}</c> or
+ <c>{noValue, noSuchInstance}</c>.
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>f(is_set_ok, NewValue [, ExtraArgs])</title>
+ <p>The function <c>f(is_set_ok, NewValue [, ExtraArgs])</c> is
+ called in phase one of the set-request
+ processing so that the new value can be checked for
+ inconsistencies.
+ </p>
+ <p><c>NewValue</c> 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.
+ </p>
+ <p>This function is optional.
+ </p>
+ <p>If this function is called, it will be called again, either
+ with <c>undo</c> or with <c>set</c> as first argument.
+ </p>
+
+ <section>
+ <title>Valid return values</title>
+ <list type="bulleted">
+ <item><c>noError</c></item>
+ <item><c>badValue | noSuchName | genErr</c>(SNMPv1)
+ </item>
+ <item><c>noAccess | noCreation | inconsistentValue | resourceUnavailable | inconsistentName | genErr</c>(SNMPv2)</item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>f(undo, NewValue [, ExtraArgs])</title>
+ <p>If an error occurred, this function is called after the
+ <c>is_set_ok</c> function is called. If <c>set</c> is called for
+ this object, <c>undo</c> is not called.
+ </p>
+ <p><c>NewValue</c> 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.
+ </p>
+ <p>This function is optional.
+ </p>
+
+ <section>
+ <title>Valid return values</title>
+ <list type="bulleted">
+ <item><c>noError</c></item>
+ <item><c>genErr</c>(SNMPv1)
+ </item>
+ <item><c>undoFailed | genErr</c>(SNMPv2)</item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>f(set, NewValue [, ExtraArgs])</title>
+ <p>This function is called to perform the set in phase two of
+ the set-request processing. It is only called if the
+ corresponding <c>is_set_ok</c> function is present and returns
+ <c>noError</c>.
+ </p>
+ <p><c>NewValue</c> 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.
+ </p>
+ <p>This function is mandatory.
+ </p>
+
+ <section>
+ <title>Valid return values</title>
+ <list type="bulleted">
+ <item><c>noError</c></item>
+ <item><c>genErr</c>(SNMPv1)
+ </item>
+ <item><c>commitFailed | undoFailed | genErr</c>(SNMPv2)</item>
+ </list>
+ </section>
+ </section>
+ </section>
+
+ <section>
+ <title>Table Instrumentation</title>
+ <p>For tables, a <c>f(Operation, ...)</c> function should be
+ defined (the function shown is exemplified with <c>f</c>).
+ </p>
+ <p>The <c>Operation</c> can be <c>new</c>, <c>delete</c>,
+ <c>get</c>, <c>next</c>, <c>is_set_ok</c>, <c>undo</c> or
+ <c>set</c>.
+ </p>
+ <p>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 <seealso marker="snmp_app_a">Appendix A</seealso> for a
+ description of error code conversions.</p>
+
+ <section>
+ <title>f(new [, ExtraArgs])</title>
+ <p>The function <c>f(new [, ExtraArgs])</c> 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.
+ </p>
+ <p>This function is optional. The return value is discarded.</p>
+ </section>
+
+ <section>
+ <title>f(delete [, ExtraArgs])</title>
+ <p>The function <c>f(delete [, ExtraArgs])</c> 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.
+ </p>
+ <p>This function is optional. The return value is discarded.</p>
+ </section>
+
+ <section>
+ <title>f(get, RowIndex, Cols [, ExtraArgs])</title>
+ <p>The function <c>f(get, RowIndex, Cols [, ExtraArgs])</c> is
+ called when a get-request refers to a table.
+ </p>
+ <p>This function is mandatory.
+ </p>
+
+ <section>
+ <title>Arguments</title>
+ <list type="bulleted">
+ <item><c>RowIndex</c> is a list of integers which define the
+ key values for the row. The <c>RowIndex</c> is the list
+ representation (list of integers) which follow the
+ <c>Cols</c> integer in the OBJECT IDENTIFIER.
+ </item>
+ <item><c>Cols</c> is a list of integers which represent the
+ column numbers. The <c>Cols</c> are sorted by increasing
+ value and are guaranteed to be valid column numbers.</item>
+ </list>
+ </section>
+
+ <section>
+ <title>Valid Return Values</title>
+ <list type="bulleted">
+ <item>
+ <p>A list with as many elements as the <c>Cols</c> list,
+ where each element is the value of the corresponding
+ column. Each element can be:</p>
+ <list type="bulleted">
+ <item><c>{value, Value}</c>. The <c>Value</c> must be of
+ correct type, length and within ranges, otherwise
+ <c>genErr</c> 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.
+ </item>
+ <item><c>{noValue, noSuchName}</c>(SNMPv1)
+ </item>
+ <item><c>{noValue, noSuchObject | noSuchInstance}</c>(SNMPv2)
+ </item>
+ </list>
+ </item>
+ <item><c>{noValue, Error}</c>. If the row does not exist,
+ because all columns have <c>{noValue, Error}</c>), the
+ single tuple <c>{noValue, Error}</c> can be returned.
+ This is a shorthand for a list with all elements
+ <c>{noValue, Error}</c>.
+ </item>
+ <item><c>genErr</c>. 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 <c>{noValue, noSuchName}</c> or
+ <c>{noValue, noSuchInstance}</c>.
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>f(get_next, RowIndex, Cols [, ExtraArgs])</title>
+ <p>The function <c>f(get_next, RowIndex, Cols [, ExtraArgs])</c> is
+ called when a get-next- or a
+ get-bulk-request refers to the table.
+ </p>
+ <p>The <c>RowIndex</c> argument may refer to an existing row or a
+ non-existing row, or it may be unspecified. The <c>Cols</c> list
+ may refer to inaccessible columns or non-existing columns. For
+ each column in the <c>Cols</c> list, the corresponding next
+ instance is determined, and the last part of its OBJECT
+ IDENTIFIER and its value is returned.
+ </p>
+ <p>This function is mandatory.
+ </p>
+
+ <section>
+ <title>Arguments</title>
+ <list type="bulleted">
+ <item><c>RowIndex</c> is a list of integers (possibly empty)
+ that defines the key values for a row. The <c>RowIndex</c>
+ is the list representation (list of integers), which follow
+ the <c>Cols</c> integer in the OBJECT IDENTIFIER.
+ </item>
+ <item><c>Cols</c> is a list of integers, greater than or
+ equal to zero, which represents the column numbers.</item>
+ </list>
+ </section>
+
+ <section>
+ <title>Valid Return Values</title>
+ <list type="bulleted">
+ <item>
+ <p>A list with as many elements as the <c>Cols</c> list
+ Each element can be:</p>
+ <list type="bulleted">
+ <item><c>{NextOid, NextValue}</c>, where <c>NextOid</c>
+ 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.
+ <c>NextValue</c> is the value of this element.
+ </item>
+ <item><c>endOfTable</c> if there are no accessible
+ elements after this one.
+ </item>
+ </list>
+ </item>
+ <item><c>{genErr, Column}</c> where <c>Column</c> denotes
+ the column that caused the error. <c>Column</c> must be
+ one of the columns in the <c>Cols</c> 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
+ <c>endOfTable</c>).
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>f(is_set_ok, RowIndex, Cols [, ExtraArgs])</title>
+ <p>The function <c>f(is_set_ok, RowIndex, Cols [, ExtraArgs])</c>
+ is called in phase one of the set-request
+ processing so that new values can be checked for
+ inconsistencies.
+ </p>
+ <p>If the function is called, it will be called again with
+ <c>undo</c>, or with <c>set</c> as first argument.
+ </p>
+ <p>This function is optional.
+ </p>
+
+ <section>
+ <title>Arguments</title>
+ <list type="bulleted">
+ <item><c>RowIndex</c> is a list of integers which define the
+ key values for the row. The <c>RowIndex</c> is the list
+ representation (list of integers) which follow the
+ <c>Cols</c> integer in the OBJECT IDENTIFIER.
+ </item>
+ <item><c>Cols</c> is a list of <c>{Column, NewValue}</c>,
+ where <c>Column</c> is an integer, and <c>NewValue</c> 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 <c>Column</c> (increasing) and
+ each <c>Column</c> is guaranteed to be a valid column
+ number.</item>
+ </list>
+ </section>
+
+ <section>
+ <title>Valid Return Values</title>
+ <list type="bulleted">
+ <item><c>{noError, 0}</c></item>
+ <item><c>{Error, Column}</c>, where <c>Error</c> is the same
+ as for <c>is_set_ok</c> for variables, and <c>Column</c>
+ denotes the faulty column. <c>Column</c> must be one of the
+ columns in the <c>Cols</c> list.</item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>f(undo, RowIndex, Cols [, ExtraArgs])</title>
+ <p>If an error occurs, The function
+ <c>f(undo, RowIndex, Cols [, ExtraArgs])</c> is called after the
+ <c>is_set_ok</c> function. If <c>set</c> is called for this
+ object, <c>undo</c> is not called.
+ </p>
+ <p>This function is optional.
+ </p>
+
+ <section>
+ <title>Arguments</title>
+ <list type="bulleted">
+ <item><c>RowIndex</c> is a list of integers which define the
+ key values for the row. The <c>RowIndex</c> is the list
+ representation (list of integers) which follow the
+ <c>Cols</c> integer in the OBJECT IDENTIFIER.
+ </item>
+ <item><c>Cols</c> is a list of <c>{Column, NewValue}</c>,
+ where <c>Column</c> is an integer, and <c>NewValue</c> 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 <c>Column</c> (increasing) and
+ each <c>Column</c> is guaranteed to be a valid column
+ number.
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Valid Return Values</title>
+ <list type="bulleted">
+ <item><c>{noError, 0}</c></item>
+ <item><c>{Error, Column}</c> where <c>Error</c> is the same
+ as for <c>undo</c> for variables, and <c>Column</c> denotes
+ the faulty column. <c>Column</c> must be one of the columns
+ in the <c>Cols</c> list.
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>f(set, RowIndex, Cols [, ExtraArgs])</title>
+ <p>The function <c>f(set, RowIndex, Cols [, ExtraArgs])</c> is
+ called to perform the set in phase two of
+ the set-request processing. It is only called if the
+ corresponding <c>is_set_ok</c> function did not exist, or
+ returned <c>{noError, 0}</c>.
+ </p>
+ <p>This function is mandatory.
+ </p>
+
+ <section>
+ <title>Arguments</title>
+ <list type="bulleted">
+ <item><c>RowIndex</c> is a list of integers that define the
+ key values for the row. The <c>RowIndex</c> is the list
+ representation (list of integers) which follow the
+ <c>Cols</c> integer in the OBJECT IDENTIFIER.
+ </item>
+ <item><c>Cols</c> is a list of <c>{Column, NewValue}</c>,
+ where <c>Column</c> is an integer, and <c>NewValue</c> 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 <c>Column</c> (increasing) and
+ each <c>Column</c> is guaranteed to be a valid column
+ number.
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Valid Return Values</title>
+ <list type="bulleted">
+ <item><c>{noError, 0}</c></item>
+ <item><c>{Error, Column}</c> where <c>Error</c> is the same
+ as <c>set</c> for variables, and <c>Column</c> denotes
+ the faulty column. <c>Column</c> must be one of the columns
+ in the <c>Cols</c> list.</item>
+ </list>
+ </section>
+ </section>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1999</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmp_framework_mib</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_framework_mib.xml</file>
+ </header>
+ <module>snmp_framework_mib</module>
+ <modulesummary>Instrumentation Functions for SNMP-FRAMEWORK-MIB</modulesummary>
+ <description>
+ <p>The module <c>snmp_framework_mib</c> implements instrumentation
+ functions for the
+ SNMP-FRAMEWORK-MIB, and functions for initializing and configuring the
+ database.
+ </p>
+ <p>The configuration files are described in the SNMP User's Manual.</p>
+ </description>
+ <funcs>
+ <func>
+ <name>configure(ConfDir) -> void()</name>
+ <fsummary>Configure the SNMP-FRAMEWORK-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>This function is called from the supervisor at system
+ start-up.
+ </p>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old data.
+ </p>
+ <p>Thus, the data in the SNMP-FRAMEWORK-MIB, after this
+ function has been called, is from the configuration
+ files.
+ </p>
+ <p>All <c>snmp</c> counters are set to zero.
+ </p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the error
+ report module, and the function fails with reason
+ <c>configuration_error</c>.
+ </p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found.
+ </p>
+ <p>The configuration file read is: <c>context.conf</c>.
+ </p>
+ </desc>
+ </func>
+ <func>
+ <name>init() -> void()</name>
+ <fsummary>Initialize the SNMP-FRAMEWORK-MIB</fsummary>
+ <desc>
+ <p>This function is called from the supervisor at system
+ start-up.
+ </p>
+ <p>Creates the necessary objects in the database if they do not
+ exist. It does not destroy any old values.
+ <marker id="add_context"></marker>
+</p>
+ </desc>
+ </func>
+ <func>
+ <name>add_context(Ctx) -> Ret</name>
+ <fsummary>Added one context</fsummary>
+ <type>
+ <v>Ctx = string()</v>
+ <v>Ret = {ok, Key} | {error, Reason}</v>
+ <v>Key = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Adds a context to the agent config.
+ Equivalent to one line in the <c>context.conf</c> file.</p>
+ <marker id="delete_context"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>delete_context(Key) -> Ret</name>
+ <fsummary>Delete one context</fsummary>
+ <type>
+ <v>Key = term()</v>
+ <v>Ret = ok | {error, Reason}</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Delete a context from the agent config.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1996</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmp_generic</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_generic.xml</file>
+ </header>
+ <module>snmp_generic</module>
+ <modulesummary>Generic Functions for Implementing SNMP Objects in a Database</modulesummary>
+ <description>
+ <p>The module <c>snmp_generic</c> 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.
+ </p>
+ <p>The overall structure is shown in the following figure:</p>
+ <pre>
+ +---------------+
+ | 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) | |
++--------------+-------+ </pre>
+ <p>Each function takes the argument <c>NameDb</c>, which is a
+ tuple <c>{Name, Db}</c>, to identify which database the
+ functions should use. <c>Name</c> is the symbolic name of the
+ managed object as defined in the MIB, and <c>Db</c> is either
+ <c>volatile</c>, <c>persistent</c>, or <c>mnesia</c>. If it is
+ <c>mnesia</c>, all variables are stored in the Mnesia table
+ <c>snmp_variables</c> 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
+ <c>snmp_variables</c> must be created by the programmer. The
+ record definition for this table is defined in the file
+ <c>snmp/include/snmp_types.hrl</c>.
+ </p>
+ <p>If an instrumentation function in the association file for a
+ variable <c>myVar</c> does not have a name when compiling an
+ MIB, the compiler generates an entry.
+ </p>
+ <pre>
+{myVar, {snmp_generic, variable_func, [{myVar, Db]}}.
+ </pre>
+ <p>And for a table:</p>
+ <pre>
+{myTable, {snmp_generic, table_func, [{myTable, Db]}}.
+ </pre>
+ </description>
+
+ <section>
+ <title>DATA TYPES</title>
+ <p>In the functions defined below, the following types are used:</p>
+ <code type="none">
+name_db() = {name(), db()}
+name() = atom()
+db() = volatile | persistent | mnesia
+row_index() = [int()]
+columns() = [column()] | [{column(), value()}]
+column() = int()
+value() = term()
+ </code>
+ <taglist>
+ <tag><c>row_index()</c></tag>
+ <item>
+ <p>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). </p>
+ </item>
+ <tag><c>columns()</c></tag>
+ <item>
+ <p>Is a list of column numbers in the case of a <c>get</c>
+ operation, and a list of column numbers and values in the
+ case of a <c>set</c> operation. </p>
+ </item>
+ </taglist>
+ </section>
+ <funcs>
+ <func>
+ <name>get_status_col(Name, Cols)</name>
+ <name>get_status_col(NameDb, Cols) -> {ok, StatusVal} | false</name>
+ <fsummary>Get the value of the status column from <c>Cols</c></fsummary>
+ <type>
+ <v>Name = name()</v>
+ <v>NameDb = name_db()</v>
+ <v>Cols = columns()</v>
+ <v>StatusVal = term()</v>
+ </type>
+ <desc>
+ <p>Gets the value of the status column from <c>Cols</c>.
+ </p>
+ <p>This function can be used in instrumentation functions for
+ <c>is_set_ok</c>, <c>undo</c> or <c>set</c> to check if the
+ status column of a table is modified.</p>
+ </desc>
+ </func>
+ <func>
+ <name>get_index_types(Name)</name>
+ <fsummary>Get the index types of <c>Name</c></fsummary>
+ <type>
+ <v>Name = name()</v>
+ </type>
+ <desc>
+ <p>Gets the index types of <c>Name</c></p>
+ <p>This function can be used in instrumentation functions to
+ retrieve the index types part of the table info.</p>
+ </desc>
+ </func>
+ <func>
+ <name>table_func(Op1, NameDb)</name>
+ <name>table_func(Op2, RowIndex, Cols, NameDb) -> Ret</name>
+ <fsummary>Default instrumentation function for tables</fsummary>
+ <type>
+ <v>Op1 = new | delete </v>
+ <v>Op2 = get | next | is_set_ok | set | undo</v>
+ <v>NameDb = name_db()</v>
+ <v>RowIndex = row_index()</v>
+ <v>Cols = columns()</v>
+ <v>Ret = term()</v>
+ </type>
+ <desc>
+ <p>This is the default instrumentation function for tables.
+ </p>
+ <list type="bulleted">
+ <item>The <c>new</c> function creates the table if it does
+ not exist, but only if the database is the SNMP internal db.</item>
+ <item>The <c>delete</c> function does not delete the table
+ from the database since unloading an MIB does not
+ necessarily mean that the table should be destroyed.</item>
+ <item>The <c>is_set_ok</c> 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.</item>
+ <item>The <c>undo</c> function does nothing.</item>
+ <item>The <c>set</c> function checks if it has enough
+ information to make the row change its status from
+ <c>notReady</c> to <c>notInService</c> (when a row has
+ been been set to <c>createAndWait</c>). If a row is set to
+ <c>createAndWait</c>, columns without a value are set to
+ <c>noinit</c>. If Mnesia is used, the set functionality is
+ handled within a transaction.</item>
+ </list>
+ <p>If it is possible for a manager to create or delete rows in
+ the table, there must be a <c>RowStatus</c> column for
+ <c>is_set_ok</c>, <c>set</c> and <c>undo</c> to work properly.
+ </p>
+ <p>The function returns according to the specification of an
+ instrumentation function.
+ </p>
+ </desc>
+ </func>
+ <func>
+ <name>table_get_elements(NameDb, RowIndex, Cols) -> Values</name>
+ <fsummary>Get elements in a table row</fsummary>
+ <type>
+ <v>NameDb = name_db()</v>
+ <v>RowIndex = row_index()</v>
+ <v>Cols = columns()</v>
+ <v>Values = [value() | noinit]</v>
+ </type>
+ <desc>
+ <p>Returns a list with values for all columns in <c>Cols</c>.
+ If a column is undefined, its value is <c>noinit</c>.</p>
+ </desc>
+ </func>
+ <func>
+ <name>table_next(NameDb, RestOid) -> RowIndex | endOfTable</name>
+ <fsummary>Find the next row in the table</fsummary>
+ <type>
+ <v>NameDb = name_db()</v>
+ <v>RestOid = [int()]</v>
+ <v>RowIndex = row_index()</v>
+ </type>
+ <desc>
+ <p>Finds the indices of the next row in the table. <c>RestOid</c>
+ does not have to specify an existing row.</p>
+ </desc>
+ </func>
+ <func>
+ <name>table_row_exists(NameDb, RowIndex) -> bool()</name>
+ <fsummary>Check if a row in a table exists</fsummary>
+ <type>
+ <v>NameDb = name_db()</v>
+ <v>RowIndex = row_index()</v>
+ </type>
+ <desc>
+ <p>Checks if a row in a table exists.</p>
+ </desc>
+ </func>
+ <func>
+ <name>table_set_elements(NameDb, RowIndex, Cols) -> bool()</name>
+ <fsummary>Set elements in a table row</fsummary>
+ <type>
+ <v>NameDb = name_db()</v>
+ <v>RowIndex = row_index()</v>
+ <v>Cols = columns()</v>
+ </type>
+ <desc>
+ <p>Sets the elements in <c>Cols</c> to the row specified by
+ <c>RowIndex</c>. No checks are performed on the new values.
+ </p>
+ <p>If the Mnesia database is used, this function calls
+ <c>mnesia:write</c> to store the values. This means that
+ this function must be called from within a transaction
+ (<c>mnesia:transaction/1</c> or <c>mnesia:dirty/1</c>).</p>
+ </desc>
+ </func>
+ <func>
+ <name>variable_func(Op1, NameDb)</name>
+ <name>variable_func(Op2, Val, NameDb) -> Ret</name>
+ <fsummary>Default instrumentation function for tables</fsummary>
+ <type>
+ <v>Op1 = new | delete | get</v>
+ <v>Op2 = is_set_ok | set | undo</v>
+ <v>NameDb = name_db()</v>
+ <v>Val = value()</v>
+ <v>Ret = term()</v>
+ </type>
+ <desc>
+ <p>This is the default instrumentation function for variables.</p>
+ <p>The <c>new</c> 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). </p>
+ <p>The <c>delete</c> function does not delete the variable from
+ the database. </p>
+ <p>The function returns according to the specification of an
+ instrumentation function. </p>
+ </desc>
+ </func>
+ <func>
+ <name>variable_get(NameDb) -> {value, Value} | undefined</name>
+ <fsummary>Get the value of a variable</fsummary>
+ <type>
+ <v>NameDb = name_db()</v>
+ <v>Value = value()</v>
+ </type>
+ <desc>
+ <p>Gets the value of a variable.</p>
+ </desc>
+ </func>
+ <func>
+ <name>variable_set(NameDb, NewVal) -> true | false</name>
+ <fsummary>Set a value for a variable</fsummary>
+ <type>
+ <v>NameDb = name_db()</v>
+ <v>NewVal = value()</v>
+ </type>
+ <desc>
+ <p>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. </p>
+ <p>Returns <c>false</c> if the <c>NameDb</c> argument
+ is incorrectly specified, otherwise <c>true</c>.</p>
+ </desc>
+ </func>
+ </funcs>
+
+ <section>
+ <title>Example</title>
+ <p>The following example shows an implementation of a table which is
+ stored in Mnesia, but with some checks performed at set-request
+ operations.
+ </p>
+ <pre>
+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).
+ </pre>
+ <p>The <c>.funcs</c> file would look like:
+ </p>
+ <pre>
+{myTable, {myModule, myTable_func, [{myTable, mnesia}]}}.
+ </pre>
+ </section>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Agent Implementation Example</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_impl_example_agent.xml</file>
+ </header>
+ <p>This <em>Implementation Example</em> section describes how an
+ MIB can be implemented with the SNMP Development Toolkit. </p>
+ <p>The example shown can be found in the toolkit distribution. </p>
+ <p>The agent is configured with the configuration tool, using
+ default suggestions for everything but the manager node. </p>
+
+ <section>
+ <title>MIB</title>
+ <p>The MIB used in this example is called EX1-MIB. It contains two
+ objects, a variable with a name and a table with friends.
+ </p>
+ <code type="none">
+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
+ </code>
+ </section>
+
+ <section>
+ <title>Default Implementation</title>
+ <p>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.
+ </p>
+ <pre>
+unix> <input>erl -config ./sys</input>
+1> <input>application:start(snmp).</input>
+ok
+2> <input>snmpc:compile("EX1-MIB").</input>
+No accessfunction for 'friendsTable', using default.
+No accessfunction for 'myName', using default.
+{ok, "EX1-MIB.bin"}
+3> <input>snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).</input>
+ok
+ </pre>
+ <p>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:
+ </p>
+ <pre>
+1> <input>snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"all-rights"},</input>
+ %% making it understand symbolic names: {mibs,["EX1-MIB","STANDARD-MIB"]}]).
+{ok, &lt;0.89.0&gt;}
+%% a get-next request with one OID.
+2> <input>snmp_test_mgr:gn([[1,3,6,1,3,7]]).</input>
+ok
+* Got PDU:
+[myName,0] = []
+%% A set-request (now using symbolic names for convenience)
+3> <input>snmp_test_mgr:s([{[myName,0], "Martin"}]).</input>
+ok
+* Got PDU:
+[myName,0] = "Martin"
+%% Try the same get-next request again
+4> <input>snmp_test_mgr:gn([[1,3,6,1,3,7]]).</input>
+ok
+* Got PDU:
+[myName,0] = "Martin"
+%% ... and we got the new value.
+%% you can event do row operations. How to add a row:
+5> <input>snmp_test_mgr:s([{[fName,0], "Martin"}, {[fAddress,0],"home"}, {[fStatus,0],4}]).</input>
+ %% createAndGo
+ok
+* Got PDU:
+[fName,0] = "Martin"
+[fAddress,0] = "home"
+[fStatus,0] = 4
+6> <input>snmp_test_mgr:gn([[myName,0]]).</input>
+ok
+* Got PDU:
+[fName,0] = "Martin"
+7> <input>snmp_test_mgr:gn().</input>
+ok
+* Got PDU:
+[fAddress,0] = "home"
+8> <input>snmp_test_mgr:gn().</input>
+ok
+* Got PDU:
+[fStatus,0] = 1
+9>
+ </pre>
+ </section>
+
+ <section>
+ <title>Manual Implementation</title>
+ <p>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
+ <c>myName</c>, and the second is a sorted list of rows in the
+ table <c>friendsTable</c>. Each row is a 4-tuple.
+ </p>
+ <note>
+ <p>There are more efficient ways to create tables manually, i.e.
+ to use the module <c>snmp_index</c>.</p>
+ </note>
+
+ <section>
+ <title>Code</title>
+ <code type="none"><![CDATA[
+-module(ex1).
+-author('[email protected]').
+%% External exports
+-export([start/0, my_name/1, my_name/2, friends_table/3]).
+%% Internal exports
+-export([init/0]).
+-define(status_col, 4).
+-define(active, 1).
+-define(notInService, 2).
+-define(notReady, 3).
+-define(createAndGo, 4). % Action; written, not read
+-define(createAndWait, 5). % Action; written, not read
+-define(destroy, 6). % Action; written, not read
+start() ->
+ 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.
+ ]]></code>
+ </section>
+
+ <section>
+ <title>Association File</title>
+ <p>The association file <c>EX1-MIB.funcs</c> for the real
+ implementation looks as follows:
+ </p>
+ <code type="none">
+{myName, {ex1, my_name, []}}.
+{friendsTable, {ex1, friends_table, []}}.
+ </code>
+ </section>
+
+ <section>
+ <title>Transcript</title>
+ <p>To use the real implementation, we must recompile the MIB and
+ load it into the agent.
+ </p>
+ <pre>
+1> <input>application:start(snmp).</input>
+ok
+2> <input>snmpc:compile("EX1-MIB").</input>
+{ok,"EX1-MIB.bin"}
+3> <input>snmpa:load_mibs(snmp_master_agent, ["EX1-MIB"]).</input>
+ok
+4> <input>ex1:start().</input>
+&lt;0.115.0&gt;
+%% Now all requests operates on this "real" implementation.
+%% The output from the manager requests will *look* exactly the
+%% same as for the default implementation.
+ </pre>
+ </section>
+
+ <section>
+ <title>Trap Sending</title>
+ <p>How to send a trap by sending the
+ <c>fTrap</c> from the master agent is shown in this section.
+ The master agent has the MIB <c>EX1-MIB</c> loaded, where the
+ trap is defined. This trap specifies that two variables should
+ be sent along with the trap, <c>myName</c> and <c>fIndex</c>.
+ <c>fIndex</c> is a table column, so we must provide its value
+ and the index for the row in the call to <c>snmpa:send_trap/4</c>.
+ In the example below, we assume that the row in question is
+ indexed by 2 (the row with <c>fIndex</c> 2).
+ </p>
+ <p>we use a simple Erlang SNMP manager, which can receive traps.
+ </p>
+ <pre>
+[MANAGER]
+1> <input>snmp_test_mgr:start_link([{agent,"dront.ericsson.se"},{community,"public"}</input>
+ %% does not have write-access
+1><input>{mibs,["EX1-MIB","STANDARD-MIB"]}]).</input>
+{ok, &lt;0.100.0&gt;}
+2> <input>snmp_test_mgr:s([{[myName,0], "Klas"}]).</input>
+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> <input>snmpa:send_trap(snmp_master_agent, fTrap,"standard trap", [{fIndex,[2],2}]).</input>
+[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>
+ </pre>
+ </section>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2006</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Manager Implementation Example</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_impl_example_manager.xml</file>
+ </header>
+ <p>This <em>Implementation Example</em> section describes
+ how a simple manager can be implemented with the
+ SNMP Development Toolkit. </p>
+ <p>The example shown, <em>ex2</em>, can be found in the toolkit
+ distribution. </p>
+ <p>This example has two functions: </p>
+ <list type="bulleted">
+ <item>
+ <p>A simple example of how to use the manager component of
+ the SNMP Development Toolkit.</p>
+ </item>
+ <item>
+ <p>A simple example of how to write agent test cases, using the new
+ manager.</p>
+ </item>
+ </list>
+
+ <section>
+ <title>The example manager</title>
+ <p>The example manager, <c>snmp_ex2_manager</c>, is a simple example of
+ how to implement an snmp manager using the manager component of the
+ SNMP Development Toolkit.</p>
+ <p>The module exports the following functions:</p>
+ <list type="bulleted">
+ <item>
+ <p>start_link/0, start_link/1</p>
+ </item>
+ <item>
+ <p>stop/0</p>
+ </item>
+ <item>
+ <p>agent/2, agent/3</p>
+ </item>
+ <item>
+ <p>sync_get/2, sync_get/3</p>
+ </item>
+ <item>
+ <p>sync_get_next/2, sync_get_next/3</p>
+ </item>
+ <item>
+ <p>sync_get_bulk/4, sync_get_bulk/5</p>
+ </item>
+ <item>
+ <p>sync_set/2, sync_set/3</p>
+ </item>
+ <item>
+ <p>oid_to_name/1</p>
+ </item>
+ </list>
+ <p>This module is also used by the test module described in the
+ next section.</p>
+ </section>
+
+ <section>
+ <title>A simple standard test</title>
+ <p>This simple standard test, <c>snmp_ex2_simple_standard_test</c>,
+ a module which, using the <c>snmp_ex2_manager</c> described in the
+ previous section, implements a simple agent test utility. </p>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmp_index</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_index.xml</file>
+ </header>
+ <module>snmp_index</module>
+ <modulesummary>Abstract Data Type for SNMP Indexing</modulesummary>
+ <description>
+ <p>The module <c>snmp_index</c> 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.
+ </p>
+ <p>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.
+ </p>
+ <p>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:
+ </p>
+ <code type="none">
+snmp_index:new(string)
+ </code>
+ <p>For each new process we create, we insert an item in an
+ <c>snmp_index</c> structure:
+ </p>
+ <code type="none"><![CDATA[
+new_process(Name, SnmpIndex) ->
+ Pid = start_process(),
+ NewSnmpIndex =
+ snmp_index:insert(SnmpIndex, Name, Pid),
+ <...>
+ ]]></code>
+ <p>With this structure, we can now map an OBJECT IDENTIFIER in
+ e.g. a GET NEXT request, to the correct process:
+ </p>
+ <code type="none">
+get_next_pid(Oid, SnmpIndex) ->
+ {ok, {_, Pid}} = snmp_index:get_next(SnmpIndex, Oid),
+ Pid.
+ </code>
+ </description>
+
+ <section>
+ <title>Common data types</title>
+ <p>The following data types are used in the functions below:
+ </p>
+ <list type="bulleted">
+ <item>
+ <p><c>index()</c></p>
+ </item>
+ <item>
+ <p><c>oid() = [byte()]</c></p>
+ </item>
+ <item>
+ <p><c>key_types = type_spec() | {type_spec(), type_spec(), ...}</c></p>
+ </item>
+ <item>
+ <p><c>type_spec() = fix_string | string | integer</c></p>
+ </item>
+ <item>
+ <p><c>key() = key_spec() | {key_spec(), key_spec(), ...}</c></p>
+ </item>
+ <item>
+ <p><c>key_spec() = string() | integer()</c></p>
+ </item>
+ </list>
+ <p>The <c>index()</c> type denotes an snmp index structure.
+ </p>
+ <p>The <c>oid()</c> type is used to represent an ASN.1 OBJECT
+ IDENTIFIER.
+ </p>
+ <p>The <c>key_types()</c> type is used when creating the
+ index structure, and the <c>key()</c> type is used when inserting
+ and deleting items from the structure.
+ </p>
+ <p>The <c>key_types()</c> 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.
+ </p>
+ <p>If the INDEX column is of type INTEGER, or derived from
+ INTEGER, the corresponding type should be <c>integer</c>. If it
+ is a variable length type (e.g. OBJECT IDENTIFIER, OCTET STRING),
+ the corresponding type should be <c>string</c>. Finally, if the
+ type is of variable length, but with a fixed size restriction
+ (e.g. IpAddress), the corresponding type should be
+ <c>fix_string</c>.
+ </p>
+ <p>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 <c>key_types</c> parameter would be
+ <c>{fix_string, string}</c>.
+ </p>
+ <p>The <c>key()</c> type correlates to the <c>key_types()</c>
+ type. If the <c>key_types()</c> is a single atom, the
+ corresponding <c>key()</c> is a single type as well, but if the
+ <c>key_types()</c> is a tuple, <c>key</c> must be a tuple of the
+ same size.
+ </p>
+ <p>In the example above, valid <c>keys</c> could be <c>{"hi", "mom"}</c> and <c>{"no", "thanks"}</c>, whereas <c>"hi"</c>,
+ <c>{"hi", 42}</c> and <c>{"hello", "there"}</c> would be invalid.</p>
+ <warning>
+ <marker id="1"></marker>
+ <p>All API functions that update the index return a <c>NewIndex</c>
+ term. This is for backward compatibility with a previous
+ implementation that used a B+ tree written purely in Erlang for
+ the index. The <c>NewIndex</c> return value can now be ignored.
+ The return value is now the unchanged table identifier for the
+ ets table.</p>
+ <p>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.</p>
+ <p>A new interface <c>delete/1</c> 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.</p>
+ <p>As an snmp adaption usually keeps the index for the whole of the
+ systems lifetime, this is rarely a problem.</p>
+ </warning>
+ </section>
+ <funcs>
+ <func>
+ <name>delete(Index) -> true</name>
+ <fsummary>Delete an index table</fsummary>
+ <type>
+ <v>Index = NewIndex = index()</v>
+ <v>Key = key()</v>
+ </type>
+ <desc>
+ <p>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 <seealso marker="#1">warning note</seealso>
+ above.</p>
+ </desc>
+ </func>
+ <func>
+ <name>delete(Index, Key) -> NewIndex</name>
+ <fsummary>Delete an item from the index</fsummary>
+ <type>
+ <v>Index = NewIndex = index()</v>
+ <v>Key = key()</v>
+ </type>
+ <desc>
+ <p>Deletes a key and its value from the index structure.
+ Returns a new structure.</p>
+ </desc>
+ </func>
+ <func>
+ <name>get(Index, KeyOid) -> {ok, {KeyOid, Value}} | undefined</name>
+ <fsummary>Get the item with <c>KeyOid</c></fsummary>
+ <type>
+ <v>Index = index()</v>
+ <v>KeyOid = oid()</v>
+ <v>Value = term()</v>
+ </type>
+ <desc>
+ <p>Gets the item with key <c>KeyOid</c>. Could be used from
+ within an SNMP instrumentation function.</p>
+ </desc>
+ </func>
+ <func>
+ <name>get_last(Index) -> {ok, {KeyOid, Value}} | undefined</name>
+ <fsummary>Get the last item in the index structure</fsummary>
+ <type>
+ <v>Index = index()</v>
+ <v>KeyOid = oid()</v>
+ <v>Value = term()</v>
+ </type>
+ <desc>
+ <p>Gets the last item in the index structure.</p>
+ </desc>
+ </func>
+ <func>
+ <name>get_next(Index, KeyOid) -> {ok, {NextKeyOid, Value}} | undefined</name>
+ <fsummary>Get the next item</fsummary>
+ <type>
+ <v>Index = index()</v>
+ <v>KeyOid = NextKeyOid = oid()</v>
+ <v>Value = term()</v>
+ </type>
+ <desc>
+ <p>Gets the next item in the SNMP lexicographic ordering,
+ after <c>KeyOid</c> in the index structure. <c>KeyOid</c>
+ does not have to refer to an existing item in the index.</p>
+ </desc>
+ </func>
+ <func>
+ <name>insert(Index, Key, Value) -> NewIndex</name>
+ <fsummary>Insert an item into the index</fsummary>
+ <type>
+ <v>Index = NewIndex = index()</v>
+ <v>Key = key()</v>
+ <v>Value = term()</v>
+ </type>
+ <desc>
+ <p>Inserts a new key value tuple into the index structure. If
+ an item with the same key already exists, the new <c>Value</c>
+ overwrites the old value.</p>
+ </desc>
+ </func>
+ <func>
+ <name>key_to_oid(Index, Key) -> KeyOid</name>
+ <fsummary>Convert a key to an OBJECT IDENTIFIER</fsummary>
+ <type>
+ <v>Index = index()</v>
+ <v>Key = key()</v>
+ <v>KeyOid = NextKeyOid = oid()</v>
+ </type>
+ <desc>
+ <p>Converts <c>Key</c> to an OBJECT IDENTIFIER.</p>
+ </desc>
+ </func>
+ <func>
+ <name>new(KeyTypes) -> Index</name>
+ <fsummary>Create a new snmp index structure</fsummary>
+ <type>
+ <v>KeyTypes = key_types()</v>
+ <v>Index = index()</v>
+ </type>
+ <desc>
+ <p>Creates a new snmp index structure. The <c>key_types()</c>
+ type is described above.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Instrumentation Functions</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_instr_functions.xml</file>
+ </header>
+ <p>A user-defined instrumentation function for each object attaches
+ the managed objects to real resources. This function is called by
+ the agent on a <c>get</c> or <c>set</c> 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 <c>OBJECT IDENTIFIER</c>, or symbolic name for each managed object, is
+ associated with an Erlang tuple <c>{Module,</c><c>Function</c>,
+ <c>ListOfExtraArguments}</c>.
+ </p>
+ <p>When a managed object is referenced in an SNMP operation, the
+ associated <c>{Module, Function, ListOfExtraArguments}</c> is
+ called. The function is applied to some standard arguments (for
+ example, the operation type) and the extra arguments supplied by the
+ user.
+ </p>
+ <p>Instrumentation functions must be written for <c>get</c> and
+ <c>set</c> for scalar variables and tables, and for <c>get-next</c>
+ for tables only. The <c>get-bulk</c> operation is translated into a
+ series of calls to <c>get-next</c>.
+ </p>
+
+ <section>
+ <title>Instrumentation Functions</title>
+ <p>The following sections describe how the instrumentation
+ functions should be defined in Erlang for the different
+ operations. In the following, <c>RowIndex</c> is a list of key
+ values for the table, and <c>Column</c> is a column number.
+ </p>
+ <p>These functions are described in detail in
+ <seealso marker="snmp_def_instr_functions">Definition of Instrumentation Functions</seealso>.
+ </p>
+
+ <section>
+ <title>New / Delete Operations</title>
+ <p>For scalar variables:
+ </p>
+ <code type="none">
+variable_access(new [, ExtraArg1, ...])
+variable_access(delete [, ExtraArg1, ...])
+ </code>
+ <p>For tables:
+ </p>
+ <code type="none">
+table_access(new [, ExtraArg1, ...])
+table_access(delete [, ExtraArg1, ...])
+ </code>
+ <p>These functions are called for each object in an MIB when the
+ MIB is unloaded or loaded, respectively.</p>
+ </section>
+
+ <section>
+ <title>Get Operation</title>
+ <p>For scalar variables:
+ </p>
+ <code type="none">
+variable_access(get [, ExtraArg1, ...])
+ </code>
+ <p>For tables:
+ </p>
+ <code type="none">
+table_access(get,RowIndex,Cols [,ExtraArg1, ...])
+ </code>
+ <p><c>Cols</c> is a list of <c>Column</c>. 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.
+ </p>
+ <p>These functions must return the current values of the
+ associated variables.</p>
+ </section>
+
+ <section>
+ <title>Set Operation</title>
+ <p>For scalar variables:
+ </p>
+ <code type="none">
+variable_access(set, NewValue [, ExtraArg1, ...])
+ </code>
+ <p>For tables:
+ </p>
+ <code type="none">
+table_access(set, RowIndex, Cols [, ExtraArg1,..])
+ </code>
+ <p><c>Cols</c> is a list of tuples <c>{Column, NewValue}</c>.
+ </p>
+ <p>These functions returns <c>noError</c> if the assignment was
+ successful, otherwise an error code.</p>
+ </section>
+
+ <section>
+ <title>Is-set-ok Operation</title>
+ <p>As a complement to the <c>set</c> 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
+ <c>is_set_ok</c> instead of <c>set</c>. 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.</p>
+ <code type="none">
+variable_access(is_set_ok, NewValue [, ExtraArg1, ...])
+ </code>
+ <p>For tables:
+ </p>
+ <code type="none">
+table_access(set, RowIndex, Cols [, ExtraArg1,..])
+ </code>
+ <p><c>Cols</c> is a list of tuples <c>{Column, NewValue}</c>.
+ </p>
+ </section>
+
+ <section>
+ <title>Undo Operation</title>
+ <p>A function which has been called with <c>is_set_ok</c> will
+ be called again, either with <c>set</c> if there was no error,
+ or with <c>undo</c>, if an error occurred. In this way,
+ resources can be reserved in the <c>is_set_ok</c> operation,
+ released in the <c>undo</c> operation, or made permanent in the
+ <c>set</c> operation.</p>
+ <code type="none">
+variable_access(undo, NewValue [, ExtraArg1, ...])
+ </code>
+ <p>For tables:
+ </p>
+ <code type="none">
+table_access(set, RowIndex, Cols [, ExtraArg1,..])
+ </code>
+ <p><c>Cols</c> is a list of tuples <c>{Column, NewValue}</c>.
+ </p>
+ </section>
+
+ <section>
+ <title>GetNext Operation</title>
+ <p>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 <c>get</c> operation.
+ </p>
+ <code type="none">
+table_access(get_next, RowIndex, Cols [, ExtraArg1, ...])
+ </code>
+ <p><c>Cols</c> 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
+ <c>{NextOid, NextValue}</c>, or
+ <c>endOfTable</c>. <c>NextOid</c> 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 <c>endOfTable</c> is returned, the agent
+ continues to search for the next instance among the other
+ variables and tables.
+ </p>
+ <p><c>RowIndex</c> may be an empty list, an incompletely
+ specified row index, or the index for an unspecified row.
+ </p>
+ <p>This operation is best described with an example.
+ </p>
+
+ <section>
+ <title>GetNext Example</title>
+ <p>A table called <c>myTable</c> has five columns. The first
+ two are keys (not accessible), and the table has three
+ rows. The instrumentation function for this table is called
+ <c>my_table</c>.</p>
+ <marker id="getnext1"></marker>
+ <image file="getnext1.gif">
+ <icaption>Contents of my_table</icaption>
+ </image>
+ <note>
+ <p>N/A means not accessible.</p>
+ </note>
+ <p>The manager issues the following <c>getNext</c> request:
+ </p>
+ <code type="none">
+getNext{ myTable.myTableEntry.3.1.1,
+ myTable.myTableEntry.5.1.1 }
+ </code>
+ <p>Since both operations involve the 1.1 index, this is
+ transformed into one call to <c>my_table</c>:
+ </p>
+ <code type="none">
+my_table(get_next, [1, 1], [3, 5])
+ </code>
+ <p>In this call, <c>[1, 1]</c> is the <c>RowIndex</c>, where
+ key 1 has value 1, and key 2 has value 1, and <c>[3, 5]</c> is
+ the list of requested columns. The function should now return
+ the lexicographically next elements:
+ </p>
+ <code type="none">
+[{[3, 1, 2], d}, {[5, 1, 2], f}]
+ </code>
+ <p>This is illustrated in the following table:
+ </p>
+ <p></p>
+ <marker id="getnext2"></marker>
+ <image file="getnext2.gif">
+ <icaption>GetNext from [3,1,1] and [5,1,1].</icaption>
+ </image>
+ <p>The manager now issues the following <c>getNext</c> request:
+ </p>
+ <code type="none">
+getNext{ myTable.myTableEntry.3.2.1,
+ myTable.myTableEntry.5.2.1 }
+ </code>
+ <p>This is transformed into one call to <c>my_table</c>:
+ </p>
+ <code type="none">
+my_table(get_next, [2, 1], [3, 5])
+ </code>
+ <p>The function should now return:
+ </p>
+ <code type="none">
+[{[4, 1, 1], b}, endOfTable]
+ </code>
+ <p>This is illustrated in the following table:
+ </p>
+ <p></p>
+ <marker id="getnext3"></marker>
+ <image file="getnext3.gif">
+ <icaption>GetNext from [3,2,1] and [5,2,1].</icaption>
+ </image>
+ <p>The manager now issues the following <c>getNext</c> request:
+ </p>
+ <code type="none">
+getNext{ myTable.myTableEntry.3.1.2,
+ myTable.myTableEntry.4.1.2 }
+ </code>
+ <p>This will be transform into one call to <c>my_table</c>:
+ </p>
+ <code type="none">
+my_table(get_next, [1, 2], [3, 4])
+ </code>
+ <p>The function should now return:
+ </p>
+ <code type="none">
+[{[3, 2, 1], g}, {[5, 1, 1], c}]
+ </code>
+ <p>This is illustrated in the following table:
+ </p>
+ <p></p>
+ <marker id="getnext4"></marker>
+ <image file="getnext4.gif">
+ <icaption>GetNext from [3,1,2] and [4,1,2].</icaption>
+ </image>
+ <p>The manager now issues the following <c>getNext</c> request:
+ </p>
+ <code type="none">
+getNext{ myTable.myTableEntry,
+ myTable.myTableEntry.1.3.2 }
+ </code>
+ <p>This will be transform into two calls to <c>my_table</c>:
+ </p>
+ <code type="none">
+my_table(get_next, [], [0]) and
+my_table(get_next, [3, 2], [1])
+ </code>
+ <p>The function should now return:
+ </p>
+ <code type="none">
+[{[3, 1, 1], a}] and
+[{[3, 1, 1], a}]
+ </code>
+ <p>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.</p>
+ <note>
+ <p>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 <c>lastAccessed</c>
+ variable.</p>
+ </note>
+ </section>
+ </section>
+ </section>
+
+ <section>
+ <title>Using the ExtraArgument</title>
+ <p>The <c>ListOfExtraArguments</c> 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,
+ <c>ipAdr</c> and <c>name</c> with object identifiers 1.1.23.4 and
+ 1.1.7 respectively. To access these variables, one could implement
+ the two Erlang functions <c>ip_access</c> and <c>name_access</c>,
+ which will be in the MIB. The functions could be specified in a
+ text file as follows:
+ </p>
+ <p></p>
+ <code type="none">
+{ipAdr, {my_module, ip_access, []}}.
+% Or using the oid syntax for 'name'
+{[1,1,7], {my_module, name_access, []}}.
+ </code>
+ <p>The <c>ExtraArgument</c> parameter is the empty list. For
+ example, when the agent receives a get-request for the
+ <c>ipAdr</c> variable, a call will be made to
+ <c>ip_access(get)</c>. The value returned by this function is the
+ answer to the get-request.
+ </p>
+ <p>If <c>ip_access</c> and <c>name_access</c> are implemented
+ similarly, we could write a <c>generic_access</c> function using
+ the <c>ListOfExtraArguments</c>:
+ </p>
+ <code type="none">
+{ipAdr, {my_module, generic_access, ['IPADR']}}.
+% The mnemonic 'name' is more convenient than 1.1.7
+{name, {my_module, generic_access, ['NAME']}}.
+ </code>
+ <p>When the agent receives the same get-request as above, a call
+ will be made to <c>generic_access(get, </c>'<c>IPADR')</c>.
+ </p>
+ <p>Yet another possibility, closer to the hardware, could be:
+ </p>
+ <code type="none">
+{ipAdr, {my_module, generic_access, [16#2543]}}.
+{name, {my_module, generic_access, [16#A2B3]}}.
+ </code>
+ </section>
+
+ <section>
+ <title>Default Instrumentation</title>
+ <marker id="snmp_3"></marker>
+ <p>When the MIB definition work is finished, there are two major
+ issues left.
+ </p>
+ <list type="bulleted">
+ <item>Implementing the MIB
+ </item>
+ <item>Implementing a Manager Application.</item>
+ </list>
+ <p>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 <c>set</c>, <c>get</c>,
+ <c>get-next</c> and table operations, is generated without any
+ programming.
+ </p>
+ <p>The agent stores the values in an internal volatile database,
+ which is based on the standard module <c>ets</c>. 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
+ <c>snmp_generic</c> for more information.
+ </p>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+
+ <section>
+ <title>Table Operations</title>
+ <p>The generation of default functions for tables works for
+ tables which use the <c>RowStatus</c> textual convention from
+ SNMPv2, defined in STANDARD-MIB and SNMPv2-TC.
+ </p>
+ <note>
+ <p>We strongly encourage the use of the <c>RowStatus</c>
+ 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.
+ </p>
+ </note>
+ </section>
+ </section>
+
+ <section>
+ <title>Atomic Set</title>
+ <p>In SNMP, the <c>set</c> operation is atomic. Either all
+ variables which are specified in a <c>set</c> operation are
+ changed, or none are changed. Therefore, the <c>set</c> 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:
+ </p>
+ <list type="bulleted">
+ <item>the type</item>
+ <item>the length</item>
+ <item>the range</item>
+ <item>the variable is writable and within the MIB view.
+ </item>
+ </list>
+ <p>At
+ the end of phase one, the user defined <c>is_set_ok</c> functions
+ are called for each scalar variable, and for each group of table
+ operations.
+ </p>
+ <p>If no error occurs, the second phase is performed. This phase
+ calls the user defined <c>set</c> function for all variables.
+ </p>
+ <p>If an error occurs, either in the <c>is_set_ok</c> phase, or in
+ the <c>set</c> phase, all functions which were called with
+ <c>is_set_ok</c> but not <c>set</c>, are called with <c>undo</c>.
+ </p>
+ <p>There are limitations with this transaction mechanism. If
+ complex dependencies exist between variables, for example between
+ <c>month</c> and <c>day</c>, 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.
+ </p>
+ <p>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.
+ </p>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>SNMP Introduction</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_intro.xml</file>
+ </header>
+ <p>The SNMP development toolkit contains the following parts:
+ </p>
+ <list type="bulleted">
+ <item>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.
+ </item>
+ <item>A multi-lingual SNMP manager.
+ </item>
+ <item>A MIB compiler, which understands SMIv1 (RFC1155, 1212, and
+ 1215) and SMIv2 (RFC1902, 1903, and 1904).
+ </item>
+ </list>
+ <p>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:
+ </p>
+ <list type="bulleted">
+ <item>a description of a Management Information Base (MIB) in
+ Abstract Syntax Notation One (ASN.1)
+ </item>
+ <item>instrumentation functions for the managed objects in the MIB,
+ written in Erlang.
+ </item>
+ </list>
+ <p>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 <c>get-next</c> 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.
+ </p>
+
+ <section>
+ <title>Scope and Purpose</title>
+ <p>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.</p>
+ </section>
+
+ <section>
+ <title>Prerequisites</title>
+ <p>The following prerequisites
+ is required for understanding the material in the SNMP
+ User's Guide:
+ </p>
+ <list type="bulleted">
+ <item>the basics of the Simple Network Management Protocol
+ version 1 (SNMPv1)
+ </item>
+ <item>the basics of the community-based Simple Network
+ Management Protocol version 2 (SNMPv2c)
+ </item>
+ <item>the basics of the Simple Network Management Protocol
+ version 3 (SNMPv3)
+ </item>
+ <item>the knowledge of defining MIBs using SMIv1 and SMIv2
+ </item>
+ <item>familiarity with the Erlang system and Erlang programming
+ </item>
+ </list>
+ <p>The tool requires Erlang release 4.7 or later.
+ </p>
+ </section>
+
+ <section>
+ <title>Definitions</title>
+ <p>The following definitions are used in the SNMP User's Guide.
+ </p>
+ <taglist>
+ <tag>MIB</tag>
+ <item>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.
+ </item>
+ <tag>SMI</tag>
+ <item>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).
+ </item>
+ <tag>ASN.1</tag>
+ <item>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.
+ </item>
+ <tag>Managed object</tag>
+ <item>
+ <p>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:</p>
+ <list type="bulleted">
+ <item><em>scalar variables</em>, which have only one instance
+ per context. They have single values, not multiple values like
+ vectors or structures.
+ </item>
+ <item><em>tables</em>, which can grow dynamically.
+ </item>
+ <item>a <em>table element</em>, which is a special type of
+ scalar variable.</item>
+ </list>
+ </item>
+ <tag>Operations</tag>
+ <item>SNMP relies on the three basic operations: get (object),
+ set (object, value) and get-next (object).
+ </item>
+ <tag>Instrumentation function</tag>
+ <item>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.</item>
+ <tag>Manager</tag>
+ <item>A manager generates commands and receives notifications
+ from agents. There usually are only a few managers in a system.</item>
+ <tag>Agent</tag>
+ <item>An agent responds to commands from the manager, and sends
+ notification to the manager. There are potentially many agents
+ in a system.</item>
+ </taglist>
+ </section>
+
+ <section>
+ <title>About This Manual</title>
+ <p>In addition to this introductory chapter, the SNMP User's Guide
+ contains the following chapters:
+ </p>
+ <list type="bulleted">
+ <item>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.
+ </item>
+ <item>Chapter 3: "The MIB Compiler" describes the features and the
+ operation of the MIB compiler.
+ </item>
+ <item>Chapter 4: "Running the application" describes how to start and
+ configure the application. Topics on how to debug the application
+ are also included.
+ </item>
+ <item>Chapter 5: "Definition of Agent Configuration Files" is a
+ reference chapter, which contains more detailed information about
+ the agent configuration files.
+ </item>
+ <item>Chapter 6: "Definition of Manager Configuration Files" is a
+ reference chapter, which contains more detailed information about
+ the manager configuration files.
+ </item>
+ <item>Chapter 7: "Agent Implementation Example" describes how an MIB
+ can be implemented with the SNMP Development Toolkit.
+ Implementation examples are included.
+ </item>
+ <item>Chapter 8: "Instrumentation Functions" describes how
+ instrumentation functions should be defined in Erlang for the
+ different operations.
+ </item>
+ <item>Chapter 9: "Definition of Instrumentation Functions" is a
+ reference chapter which contains more detailed information
+ about the instrumentation functions.
+ </item>
+ <item>Chapter 10: "Definition of Agent Net if" is a reference chapter,
+ which describes the Agent Net if function in detail.
+ </item>
+ <item>Chapter 11: "Definition of Manager Net if" is a reference chapter,
+ which describes the Manager Net if function in detail.
+ </item>
+ <item>Chapter 12: "Advanced Agent Topics" describes sub-agents, agent
+ semantics, audit trail logging, and the consideration of
+ distributed tables.
+ </item>
+ <item>Appendix A describes the conversion of SNMPv2 to SNMPv1
+ error messages.
+ </item>
+ <item>Appendix B contains the RFC1903 text on <c>RowStatus</c>.
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Where to Find More Information</title>
+ <p>Refer to the following documentation for more information about
+ SNMP and about the Erlang/OTP development system:
+ </p>
+ <list type="bulleted">
+ <item>Marshall T. Rose (1991), "The Simple Book - An
+ Introduction to Internet Management", Prentice-Hall
+ </item>
+ <item>Evan McGinnis and David Perkins (1997), "Understanding SNMP
+ MIBs", Prentice-Hall
+ </item>
+ <item>RFC1155, 1157, 1212 and 1215 (SNMPv1)
+ </item>
+ <item>RFC1901-1907 (SNMPv2c)
+ </item>
+ <item>RFC1908, 2089 (coexistence between SNMPv1 and SNMPv2)
+ </item>
+ <item>RFC2271, RFC2273 (SNMP std MIBs)
+ </item>
+ <item>the Mnesia User's Guide
+ </item>
+ <item>the Erlang 4.4 Extensions User's Guide
+ </item>
+ <item>the Reference Manual
+ </item>
+ <item>the Erlang Embedded Systems User's Guide
+ </item>
+ <item>the System Architecture Support Libraries (SASL) User's
+ Guide
+ </item>
+ <item>the Installation Guide
+ </item>
+ <item>the Asn1 User's Guide
+ </item>
+ <item>Concurrent Programming in Erlang, 2nd Edition (1996),
+ Prentice-Hall, ISBN 0-13-508301-X.
+ </item>
+ </list>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Definition of Manager Configuration Files</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_manager_config_files.xml</file>
+ </header>
+ <p>Configuration data may be included in configuration files
+ that is located in the configuration directory. The name of this
+ directory is given in the <c>config_dir</c> configuration
+ parameter. These files are read at start-up.
+ </p>
+ <p>The directory where the configuration files are found is given as
+ a parameter to the manager.
+ </p>
+ <p>The entry format in all files are Erlang terms, separated by a
+ '<em>.</em>' and a <em>newline</em>. In the following sections, the
+ formats of these terms are described. Comments may be specified as
+ ordinary Erlang comments.
+ </p>
+ <p>If syntax errors are discovered in these files they are reported with the
+ function <c>config_err/2</c> of the
+ <seealso marker="snmpa_error_report">error report module</seealso>
+ at start-up.
+ </p>
+
+ <section>
+ <marker id="manager"></marker>
+ <marker id="manager_information"></marker>
+ <title>Manager Information</title>
+ <p>The manager information should be stored in a file called
+ <c>manager.conf</c>.
+ </p>
+ <p>Each entry is a tuple of size two:
+ </p>
+ <p><c>{Variable, Value}.</c></p>
+ <list type="bulleted">
+ <item>
+ <p><c>Variable</c> is one of the following:</p>
+ <list type="bulleted">
+ <item>
+ <p><c>address</c> - which defines the IP address of the
+ manager. Default is local host.</p>
+ </item>
+ <item>
+ <p><c>port</c> - which defines which UDP port the manager uses
+ for communicating with agents. <em>Mandatory</em>.</p>
+ </item>
+ <item>
+ <p><c>engine_id</c> - The <c>SnmpEngineID</c> as defined in
+ SNMP-FRAMEWORK-MIB. <em>Mandatory</em>.</p>
+ </item>
+ <item>
+ <p><c>max_message_size</c> - The <c>snmpEngineMaxMessageSize</c> as
+ defined in SNMP-FRAMEWORK-MIB. <em>Mandatory</em>.</p>
+ </item>
+ </list>
+ </item>
+ <item>
+ <p><c>Value</c> is the value for the variable.
+ </p>
+ </item>
+ </list>
+ <p>The following example shows a <c>manager.conf</c> file:
+ </p>
+ <pre>
+{address, [141,213,11,24]}.
+{port, 5000}.
+{engine_id, "mgrEngine"}.
+{max_message_size, 484}.
+ </pre>
+ <p>The value of <c>engine_id</c> is a string, which should have a
+ very specific structure. See RFC 2271/2571 for details.
+ </p>
+ </section>
+
+ <section>
+ <marker id="users"></marker>
+ <title>Users</title>
+ <p>For each <em>manager user</em>, the manager needs some information.
+ This information is either added in the <c>users.conf</c> config
+ file or by calling the
+ <seealso marker="snmpm#register_user">register_user</seealso>
+ function in run-time.
+ </p>
+ <p>Each row defines a <em>manager user</em> of the manager.
+ </p>
+ <p>Each entry is a tuple of size four:
+ </p>
+ <!-- <p><c>{UserId, UserMod, UserData}.</c></p> -->
+ <p><c>{UserId, UserMod, UserData, DefaultAgentConfig}.</c></p>
+ <list type="bulleted">
+ <item>
+ <p><c>UserId</c> is any term (used to uniquely identify the user).</p>
+ </item>
+ <item>
+ <p><c>UserMod</c> is the user callback module (atom).</p>
+ </item>
+ <item>
+ <p><c>UserData</c> is any term (passed on to the user when calling the
+ <c>UserMod</c>.
+ </p>
+ </item>
+ <item>
+ <p><c>DefaultAgentConfig</c> is a list of default agent config's.
+ These values are used as default values when this user registers
+ agents.
+ </p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <marker id="agents"></marker>
+ <title>Agents</title>
+ <p>The information needed to handle agents should be stored in a
+ file called <c>agents.conf</c>. It is also possible to add agents
+ in run-time by calling the
+ <seealso marker="snmpm#register_agent">register_agent</seealso>.
+ </p>
+ <p>Each entry is a tuple:
+ </p>
+ <p><c>{UserId, TargetName, Comm, Ip, Port, EngineID, Timeout, MaxMessageSize, Version, SecModel, SecName, SecLevel}.</c></p>
+ <list type="bulleted">
+ <item>
+ <p><c>UserId</c> is the identity of the <em>manager user</em>
+ responsible for this agent (term).
+ </p>
+ </item>
+ <item>
+ <p><c>TargetName</c> is a <em>unique</em> <em>non-empty</em> string.</p>
+ </item>
+ <item>
+ <p><c>Comm</c> is the community string (string).</p>
+ </item>
+ <item>
+ <p><c>Ip</c> is the ip address of the agent (a list of four integers).</p>
+ </item>
+ <item>
+ <p><c>Port</c> is the port number of the agent (integer).</p>
+ </item>
+ <item>
+ <p><c>EngineID</c> is the engine-id of the agent (string).</p>
+ </item>
+ <item>
+ <p><c>Timeout</c> is re-transmission timeout
+ (<c>infinity</c> | integer).</p>
+ </item>
+ <item>
+ <p><c>MaxMessageSize</c> is the max message size for outgoing messages
+ to this agent (integer).</p>
+ </item>
+ <item>
+ <p><c>Version</c> is the version (v1 | v2 | v3).</p>
+ </item>
+ <item>
+ <p><c>SecModel</c> is the security model (any | v1 | v2c | usm).</p>
+ </item>
+ <item>
+ <p><c>SecName</c> is the security name (string).</p>
+ </item>
+ <item>
+ <p><c>SecLevel</c> is security level (noAuthNoPriv | authNoPriv |
+ authPriv).</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <marker id="usm"></marker>
+ <marker id="usm_user"></marker>
+ <title>Security data for USM</title>
+ <p>The information about Security data for USM should be stored in a
+ file called <c>usm.conf</c>, 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
+ <seealso marker="snmpm#register_usm_user">register_usm_user</seealso>.
+ </p>
+ <p>The corresponding table is <c>usmUserTable</c> in the
+ SNMP-USER-BASED-SM-MIB.
+ </p>
+ <p>Each entry is a term:
+ </p>
+ <p><c>{EngineID, UserName, AuthP, AuthKey, PrivP, PrivKey}.</c> <br></br>
+<c>{EngineID, UserName, SecName, AuthP, AuthKey, PrivP, PrivKey}.</c></p>
+ <p>The first case is when we have the identity-function
+ (<c>SecName</c> = <c>UserName</c>).
+ </p>
+ <list type="bulleted">
+ <item>
+ <p><c>EngineID</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>UserName</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>SecName</c> is a string.</p>
+ </item>
+ <item>
+ <p><c>AuthP</c> is a <c>usmNoAuthProtocol</c>,
+ <c>usmHMACMD5AuthProtocol</c> or <c>usmHMACSHAAuthProtocol</c>.</p>
+ </item>
+ <item>
+ <p><c>AuthKey</c> 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
+ <c>usmHMACMD5AuthProtocol</c> is used and 20 if
+ <c>usmHMACSHAAuthProtocol</c> is used.</p>
+ </item>
+ <item>
+ <p><c>PrivP</c> is a <c>usmNoPrivProtocol</c>,
+ <c>usmDESPrivProtocol</c> or <c>usmAesCfb128Protocol</c>.</p>
+ </item>
+ <item>
+ <p><c>PrivKey</c> 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 <c>usmDESPrivProtocol</c>
+ or <c>usmAesCfb128Protocol</c> is used.</p>
+ </item>
+ </list>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Manager Functional Description</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_manager_funct_descr.xml</file>
+ </header>
+
+ <section>
+ <title>Features</title>
+ <marker id="features"></marker>
+ <p>The manager provided with the tool is a lightweight manager
+ that basically provides a means to communicate with agents.</p>
+ <p>It does not really implement any management capabilities by
+ itself. That is up to the <em>user</em>.
+ </p>
+ <p>A <em>user</em> in this context is basically a module implementing
+ the <seealso marker="snmpm_user">snmpm_user</seealso> behaviour.
+ A <em>user</em> can issue snmp requests and receive
+ notification/traps.</p>
+ <p>Agents to be accessed by the manager needs to be registered by
+ a user. Once registered, they can be accessed by all registered
+ users.</p>
+ <p>Notifications/traps from an agent is delivered to the user that
+ did the registration.</p>
+ <p>Any message from an agent that is not registered is delivered to
+ the <em>default user</em>.</p>
+ <p>By default, the <em>default user</em> is set to the
+ <c>snmpm_user_default</c> 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 <seealso marker="snmp_config#configuration_params">configuration params</seealso> for more info).</p>
+ <p>When using version 3, then (at least one) <em>usm user</em> has to
+ be registered.</p>
+ <p>Requests can be issued in two different ways. Synchronous (see
+ <seealso marker="snmpm#sync_set">sync_set</seealso>,
+ <seealso marker="snmpm#sync_get">sync_get</seealso>,
+ <seealso marker="snmpm#sync_get_next">sync_get_next</seealso> and
+ <seealso marker="snmpm#sync_get_bulk">sync_get_bulk</seealso>)
+ and asynchronous (see
+ <seealso marker="snmpm#async_set">async_set</seealso>,
+ <seealso marker="snmpm#async_get">async_get</seealso>,
+ <seealso marker="snmpm#async_get_next">async_get_next</seealso> and
+ <seealso marker="snmpm#async_get_bulk">async_get_bulk</seealso>).
+ 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
+ <c>handle_pdu</c> callback function defined by the
+ <seealso marker="snmpm_user#handle_pdu">handle_pdu</seealso>
+ behaviour.</p>
+ </section>
+
+ <section>
+ <title>Operation</title>
+ <marker id="operation"></marker>
+ <p>The following steps are needed to get the manager running:</p>
+ <list type="ordered">
+ <item>
+ <p>[optional] Implement the default user.</p>
+ </item>
+ <item>
+ <p>Implement the user(s).</p>
+ </item>
+ <item>
+ <p>Configure the application (manager).</p>
+ </item>
+ <item>
+ <p>Start the application (manager).</p>
+ </item>
+ <item>
+ <p>Register the user(s).</p>
+ </item>
+ <item>
+ <p>The user(s) register their agents.</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>MIB loading</title>
+ <marker id="mib_loading"></marker>
+ <p>It is possible to load mibs into the manager, but this is not
+ necessary for normal operation, and not recommended.</p>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Definition of Manager Net if</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_manager_netif.xml</file>
+ </header>
+ <p></p>
+ <image file="snmp_manager_netif_1.gif">
+ <icaption>The Purpose of Manager Net if</icaption>
+ </image>
+ <p>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.
+ </p>
+ <p>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.
+ </p>
+ <p>It is also possible to write your own Net if process. The default
+ Net if process is implemented in the module <c>snmpm_net_if</c> and
+ it uses UDP as the transport protocol.
+ </p>
+ <p>This section describes how to write a Net if process.
+ </p>
+
+ <section>
+ <marker id="mandatory_functions"></marker>
+ <title>Mandatory Functions</title>
+ <p>A Net if process must implement the SNMP manager
+ <seealso marker="snmpm_network_interface">network interface behaviour</seealso>.
+ </p>
+ </section>
+
+ <section>
+ <title>Messages</title>
+ <p>The section <em>Messages</em> describes mandatory messages, which
+ Net if must send to the manager server process.
+ </p>
+ <p>Net if must send the following message when it receives an
+ SNMP PDU from the network that is aimed for the MasterAgent:
+ </p>
+ <pre>
+Server ! {snmp_pdu, Pdu, Addr, Port}
+ </pre>
+ <list type="bulleted">
+ <item>
+ <p><c>Pdu</c> is an SNMP PDU record, as defined in
+ <c>snmp_types.hrl</c>, with the SNMP request.</p>
+ </item>
+ <item>
+ <p><c>Addr</c> is the source address. </p>
+ </item>
+ <item>
+ <p><c>Port</c> is port number of the sender.</p>
+ </item>
+ </list>
+ <pre>
+Server ! {snmp_trap, Trap, Addr, Port}
+ </pre>
+ <list type="bulleted">
+ <item>
+ <p><c>Trap</c> is either an SNMP pdu record or an trappdu record,
+ as defined in <c>snmp_types.hrl</c>, with the SNMP request.</p>
+ </item>
+ <item>
+ <p><c>Addr</c> is the source address. </p>
+ </item>
+ <item>
+ <p><c>Port</c> is port number of the sender.</p>
+ </item>
+ </list>
+ <pre>
+Server ! {snmp_inform, Ref, Pdu, PduMS, Addr, Port}
+ </pre>
+ <list type="bulleted">
+ <item>
+ <p><c>Ref</c> is either the atom <c>ignore</c> or something
+ that can be used to identify the inform-request (e.g. request-id).
+ <c>ignore</c> 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
+ <seealso marker="snmpm_network_interface#inform_response">inform_response</seealso>
+ function). See the
+ <seealso marker="snmp_app">inform request behaviour</seealso>
+ configuration option for more info.</p>
+ </item>
+ <item>
+ <p><c>Pdu</c> is an SNMP PDU record, as defined in
+ <c>snmp_types.hrl</c>, with the SNMP request.</p>
+ </item>
+ <item>
+ <p><c>Addr</c> is the source address. </p>
+ </item>
+ <item>
+ <p><c>Port</c> is port number of the sender.</p>
+ </item>
+ </list>
+ <pre>
+Server ! {snmp_report, Data, Addr, Port}
+ </pre>
+ <list type="bulleted">
+ <item>
+ <p><c>Data</c> is either <c>{ok, Pdu}</c> or
+ <c>{error, ReqId, ReasonInfo, Pdu}</c>. Which one is used depends
+ on the return value from the MPD
+ <seealso marker="snmpm_mpd#process_msg">process_msg</seealso> function. If the MsgData is <c>ok</c>,
+ the first is used, and if it is <c>{error, ReqId, Reason}</c>
+ the latter is used.</p>
+ </item>
+ <item>
+ <p><c>Pdu</c> is an SNMP PDU record, as defined in
+ <c>snmp_types.hrl</c>, with the SNMP request.</p>
+ </item>
+ <item>
+ <p><c>ReqId</c> is an integer.</p>
+ </item>
+ <item>
+ <p><c>ReasonInfo</c> is a term().</p>
+ </item>
+ <item>
+ <p><c>Addr</c> is the source address. </p>
+ </item>
+ <item>
+ <p><c>Port</c> is port number of the sender.</p>
+ </item>
+ </list>
+
+ <section>
+ <title>Notes</title>
+ <p>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 <c>snmpm_mpd</c> for this purpose (refer to the
+ Reference Manual, section <c>snmp</c>, module <c>snmpm_mpd</c>
+ for more details).
+ </p>
+ <p>There are also some useful functions for encoding and
+ decoding of SNMP messages in the module <c>snmp_pdus</c>.
+ </p>
+ </section>
+ </section>
+</chapter>
+
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
--- /dev/null
+++ b/lib/snmp/doc/src/snmp_manager_netif_1.gif
Binary files 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<Iap],mEdf04GjSo,YkPfu~>
+Jc<Iap],mEdf04GjSo,YkPfu~>
+Jc<Iap],mEdf04GjSo,YkPfu~>
+Jc<[gqZ-EjquD<Ig&D!OhZ!NTl2H2~>
+Jc<[gqZ-EjquD<Ig&D!OhZ!NTl2H2~>
+Jc<[gqZ-EjquD<Ig&D!OhZ!NTl2H2~>
+Jc<airrDHcrr@WLhZ!KSgA_'Om/DM~>
+Jc<airrDHcrr@WLhZ!KSgA_'Om/DM~>
+Jc<airrDHcrr@WLhZ!KSgA_'Om/DM~>
+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<<N;_n@O
+iW.4%:#Zi`rXd:(rr1mW_Z$nerr*S<rhC/%rW1IJrVd`d]Dheu3oU.`r_<CO!5e`B%)W"N/,hTA
+rr,=NrVur+rVursrdX~>
+!WE)/rVurWrW1IJrr*dN3r]+HKDngKrnS"^rmLj_CNO#HrerUrbiA[&!6Y9@!9a=kdf<<N;_n@O
+iW.4%:#Zi`rXd:(rr1mW_Z$nerr*S<rhC/%rW1IJrVd`d]Dheu3oU.`r_<CO!5e`B%)W"N/,hTA
+rr,=NrVur+rVursrdX~>
+!WE)/rVurWrW1IJrr*dN3r]+HKDngKrnS"^rmLj_CNO#HrerUrbiA[&!6Y9@!9a=kdf<<N;_n@O
+iW.4%:#Zi`rXd:(rr1mW_Z$nerr*S<rhC/%rW1IJrVd`d]Dheu3oU.`r_<CO!5e`B%)W"N/,hTA
+rr,=NrVur+rVursrdX~>
+!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<C!<2s'df=0!FCI;j%/p/8iXGhch$j;^h%TdH
+/!J3ArVur+rVursrdX~>
+!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<C!<2s'df=0!FCI;j%/p/8iXGhch$j;^h%TdH
+/!J3ArVur+rVursrdX~>
+!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<C!<2s'df=0!FCI;j%/p/8iXGhch$j;^h%TdH
+/!J3ArVur+rVursrdX~>
+!WE).rVurdrVurlrW1IJrr)qW)ufgO3[<Y`rospk3rUXurr1A@r^?bbdi8#[rrDWh!!(+>!!)6^
+!Rh&GrW2!lrr*bo'E8!r!7Ur,'E8!j'E8!e%0"]UlMfTJq#1<C!<2s!dfA\3rW2!lrVd>e'E8!e%
+0$7^%0$7cUH2?>rVur)rVurtrdX~>
+!WE).rVurdrVurlrW1IJrr)qW)ufgO3[<Y`rospk3rUXurr1A@r^?bbdi8#[rrDWh!!(+>!!)6^
+!Rh&GrW2!lrr*bo'E8!r!7Ur,'E8!j'E8!e%0"]UlMfTJq#1<C!<2s!dfA\3rW2!lrVd>e'E8!e%
+0$7^%0$7cUH2?>rVur)rVurtrdX~>
+!WE).rVurdrVurlrW1IJrr)qW)ufgO3[<Y`rospk3rUXurr1A@r^?bbdi8#[rrDWh!!(+>!!)6^
+!Rh&GrW2!lrr*bo'E8!r!7Ur,'E8!j'E8!e%0"]UlMfTJq#1<C!<2s!dfA\3rW2!lrVd>e'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_<CkbT$KZrrDWh!!'A)!!*#t
+J,~>
+!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_<CkbT$KZrrDWh!!'A)!!*#t
+J,~>
+!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_<CkbT$KZrrDWh!!'A)!!*#t
+J,~>
+!WE).rVurgrqui`rW/4iir8iUp&4pko_nnQ%&<h$!)<7f!TFOarWM'Vrosp`rVurfrr)oqrW,pt
+rG*K9raH:Oh>UjlC\.OX12C>-IK![aFT,JQFT/m&@Y5?irW?q?!6kHA)rae*FBe$>!,LEiraH:X
+r`]eQraH:OFA6OFX8Mtr!;$0i!;6<mCD0,6rW7]PCWcVV!<2tJ~>
+!WE).rVurgrqui`rW/4iir8iUp&4pko_nnQ%&<h$!)<7f!TFOarWM'Vrosp`rVurfrr)oqrW,pt
+rG*K9raH:Oh>UjlC\.OX12C>-IK![aFT,JQFT/m&@Y5?irW?q?!6kHA)rae*FBe$>!,LEiraH:X
+r`]eQraH:OFA6OFX8Mtr!;$0i!;6<mCD0,6rW7]PCWcVV!<2tJ~>
+!WE).rVurgrqui`rW/4iir8iUp&4pko_nnQ%&<h$!)<7f!TFOarWM'Vrosp`rVurfrr)oqrW,pt
+rG*K9raH:Oh>UjlC\.OX12C>-IK![aFT,JQFT/m&@Y5?irW?q?!6kHA)rae*FBe$>!,LEiraH:X
+r`]eQraH:OFA6OFX8Mtr!;$0i!;6<mCD0,6rW7]PCWcVV!<2tJ~>
+!WE)nrW6jKC]=;7CE%'brW2"HkPbKd'Cbu$!;$3e!:Kgf.q2uHrqc]hrVurjrY&#5%*\_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&#5%*\_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&#5%*\_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<rqQQirVurirXi*.K-T[\:&b,B]Dheu3r\+P
+qu-cY)ufir'Cu,&!;-9f!8IMQ3WaD=lI#V.!;HHm!;$0k7"$iirX`kG!<2tMFDF:Fr]1^O6mJc3
+rY^?1CIG6&rjs[iF9$*8ro.-tCK'4R'9"t&oDSdkrr.E~>
+!WE)mrW5+hU]15m:&+\giXG#L!TFd^rVurjrqZW<rqQQirVurirXi*.K-T[\:&b,B]Dheu3r\+P
+qu-cY)ufir'Cu,&!;-9f!8IMQ3WaD=lI#V.!;HHm!;$0k7"$iirX`kG!<2tMFDF:Fr]1^O6mJc3
+rY^?1CIG6&rjs[iF9$*8ro.-tCK'4R'9"t&oDSdkrr.E~>
+!WE)mrW5+hU]15m:&+\giXG#L!TFd^rVurjrqZW<rqQQirVurirXi*.K-T[\:&b,B]Dheu3r\+P
+qu-cY)ufir'Cu,&!;-9f!8IMQ3WaD=lI#V.!;HHm!;$0k7"$iirX`kG!<2tMFDF:Fr]1^O6mJc3
+rY^?1CIG6&rjs[iF9$*8ro.-tCK'4R'9"t&oDSdkrr.E~>
+!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*S<rhC/+rX(0frr/?IiW.4%:%S>c!<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*S<rhC/+rX(0frr/?IiW.4%:%S>c!<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*S<rhC/+rX(0frr/?IiW.4%:%S>c!<2tJ~>
+!!)]k0N7t',O58&rr+F[rr/?Iro+UjrppQXr`]f[raPKur[Y&KrdA#1!6kF:ro+UjX((]"!!)Zj
+q>e_<q#L6i!!)Wi$<-s'o.,5WrmLl4r;H`V%/^#-iZ%mriY1n^!!)cmPQ:RZ!!)Wi(.A.S/,ic<
+dfBCH]3A`K'E6u"rr1^err*\F>@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_<q#L6i!!)Wi$<-s'o.,5WrmLl4r;H`V%/^#-iZ%mriY1n^!!)cmPQ:RZ!!)Wi(.A.S/,ic<
+dfBCH]3A`K'E6u"rr1^err*\F>@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_<q#L6i!!)Wi$<-s'o.,5WrmLl4r;H`V%/^#-iZ%mriY1n^!!)cmPQ:RZ!!)Wi(.A.S/,ic<
+dfBCH]3A`K'E6u"rr1^err*\F>@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=<r[XH:rmOU@l4!YQrVcuc'E8!j'Cu,&!;6?f!2fbk!;ZTo!;$1>
+:&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=<r[XH:rmOU@l4!YQrVcuc'E8!j'Cu,&!;6?f!2fbk!;ZTo!;$1>
+:&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=<r[XH:rmOU@l4!YQrVcuc'E8!j'Cu,&!;6?f!2fbk!;ZTo!;$1>
+:&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!)<Il(u5iUrr+F:rr1A@rospk3r\^Z7/lck1@tME#:lkSrdA#1'E.n6iY2=_13E3g!!)Ke
+rW(.@rW)Qh!!(+>!!)Qgr;`_oquHEh!!)]k!c&a'rVdnU>6&I<K/.4O!/"JaFT,JQFT28l12C>-
+IK$i/@Y5?nrX%R_@WYi>@K:3"oDS^irr.E~>
+!!)]k!)<Il(u5iUrr+F:rr1A@rospk3r\^Z7/lck1@tME#:lkSrdA#1'E.n6iY2=_13E3g!!)Ke
+rW(.@rW)Qh!!(+>!!)Qgr;`_oquHEh!!)]k!c&a'rVdnU>6&I<K/.4O!/"JaFT,JQFT28l12C>-
+IK$i/@Y5?nrX%R_@WYi>@K:3"oDS^irr.E~>
+!!)]k!)<Il(u5iUrr+F:rr1A@rospk3r\^Z7/lck1@tME#:lkSrdA#1'E.n6iY2=_13E3g!!)Ke
+rW(.@rW)Qh!!(+>!!)Qgr;`_oquHEh!!)]k!c&a'rVdnU>6&I<K/.4O!/"JaFT,JQFT28l12C>-
+IK$i/@Y5?nrX%R_@WYi>@K:3"oDS^irr.E~>
+!!)`l!c'#rrr*\F,Q@]%;dsiQlMgcW@Z:<c;euC3@T37)'AZT&CLZm>$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:<c;euC3@T37)'AZT&CLZm>$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:<c;euC3@T37)'AZT&CLZm>$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><SGiKgd/F"FJc>KE!!'Y1!!)lpJ,~>
+q#16nbPq><SGiKgd/F"FJc>KE!!'Y1!!)lpJ,~>
+q#16nbPq><SGiKgd/F"FJc>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<WUeGfIJmf%_~>
+nc&IepAP$lJc=g2qZ-EjqZ)3Hhu<WUeGfIJmf%_~>
+nc&IepAP$lJc=g2qZ-EjqZ)3Hhu<WUeGfIJmf%_~>
+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<jlJ,~>
+Jc:6"Jc<jlJ,~>
+Jc:6"Jc<jlJ,~>
+Jc:6"Jc<jlJ,~>
+Jc:6"Jc<jlJ,~>
+Jc:6"Jc<jlJ,~>
+%%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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>The MIB Compiler</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_mib_compiler.xml</file>
+ </header>
+ <p>The chapter <em>The MIB Compiler</em> describes the MIB compiler
+ and contains the following topics:
+ </p>
+ <list type="bulleted">
+ <item>Operation</item>
+ <item>Import</item>
+ <item>Consistency checking between MIBs</item>
+ <item>.hrl file generation</item>
+ <item>Emacs integration</item>
+ <item>Deviations from the standard
+ </item>
+ </list>
+ <note>
+ <p>When importing MIBs, ensure that the imported MIBs as well as the
+ importing MIB are compiled using the same version of the
+ SNMP-compiler.</p>
+ </note>
+
+ <section>
+ <title>Operation</title>
+ <p>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 <c>.mib</c>. This is necessary for handling
+ the <c>IMPORT</c> statement.
+ </p>
+ <p>The association file, which contains the names of
+ instrumentation functions for the MIB, should have the suffix
+ <c>.funcs</c>. If the compiler does not find the association file,
+ it gives a warning message and uses default instrumentation
+ functions. (See <seealso marker="snmp_instr_functions#snmp_3">Default Instrumentation</seealso> for more details).
+ </p>
+ <p>The MIB compiler is started with a call to
+ <c><![CDATA[snmpc:compile(<mibname>).]]></c> For example:
+ </p>
+ <code type="none">
+snmpc:compile("RFC1213-MIB").
+ </code>
+ <p>The output is a new file which is called <c><![CDATA[<mibname>.bin]]></c>.
+ </p>
+ <p>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.
+ </p>
+ </section>
+
+ <section>
+ <title>Importing MIBs</title>
+ <p>The compiler handles the <c>IMPORT</c> 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.
+ </p>
+ <p>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 <c>{i, Path}</c> option, for example:
+ </p>
+ <code type="none">
+snmpc:compile("MY-MIB",
+ [{i, ["friend_mibs/", "../standard_mibs/"]}]).
+ </code>
+ <p>It is also possible to import MIBs from OTP applications in an
+ <c>"include_lib"</c> like fashion with the <c>il</c>
+ option. Example:
+ </p>
+ <code type="none">
+snmpc:compile("MY-MIB",
+ [{il, ["snmp/priv/mibs/", "myapp/priv/mibs/"]}]).
+ </code>
+ <p>finds the latest version of the <c>snmp</c> and <c>myapp</c>
+ applications in the OTP system and uses the expanded paths as
+ include paths.
+ </p>
+ <p>Note that an SMIv2 MIB can import an SMIv1 MIB and vice versa.
+ </p>
+ <p>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.
+ </p>
+ </section>
+
+ <section>
+ <title>MIB Consistency Checking</title>
+ <p>When an MIB is compiled, the compiler detects if several
+ managed objects use the same <c>OBJECT IDENTIFIER</c>. 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:
+ </p>
+ <pre>
+
+erl><input>snmpc:is_consistent(ListOfMibNames).</input>
+ </pre>
+ <p><c>ListOfMibNames</c> is a list of compiled MIBs, for example
+ <c>["RFC1213-MIB", "MY-MIB"]</c>. The function also performs
+ consistency checking of trap definitions.</p>
+ </section>
+
+ <section>
+ <title>.hrl File Generation</title>
+ <p>It is possible to generate an <c>.hrl</c> 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:
+ </p>
+ <list type="bulleted">
+ <item>object Identifiers for tables, table entries and variables</item>
+ <item>column numbers</item>
+ <item>enumerated values</item>
+ <item>default values for variables and table columns.
+ </item>
+ </list>
+ <p>Use the following command to generate a .hrl file from an MIB:
+ </p>
+ <pre>
+erl><input>snmpc:mib_to_hrl(MibName).</input>
+ </pre>
+ </section>
+
+ <section>
+ <title>Emacs Integration</title>
+ <p>With the Emacs editor, the <c>next-error</c> (<c>C-X `</c>)
+ function can be used indicate where a compilation error occurred,
+ provided the error message is described by a line number.
+ </p>
+ <p>Use <c>M-x compile</c> to compile an MIB from inside Emacs, and
+ enter:
+ </p>
+ <pre>
+ <input>erl -s snmpc compile &lt;MibName&gt; -noshell</input>
+ </pre>
+ <p>An example of <c><![CDATA[<MibName>]]></c> is <c>RFC1213-MIB</c>.
+ </p>
+ </section>
+
+ <section>
+ <title>Compiling from a Shell or a Makefile</title>
+ <p>The <c>erlc</c> commands can be used to compile SNMP MIBs. Example:
+ </p>
+ <pre>
+ <input>erlc MY-MIB.mib</input>
+ </pre>
+ <p>All the standard <c>erlc</c> flags are supported, e.g.
+ </p>
+ <pre>
+ <input>erlc -I mymibs -o mymibs -W MY-MIB.mib</input>
+ </pre>
+ <p>The flags specific to the MIB compiler can be specified by
+ using the <c>+</c> syntax:
+ </p>
+ <pre>
+ <input>erlc +'{group_check,false}' MY-MIB.mib</input>
+ </pre>
+ </section>
+
+ <section>
+ <title>Deviations from the Standard</title>
+ <p>In some aspects the Erlang MIB compiler does not follow or
+ implement the SMI fully. Here are the differences:
+ </p>
+ <list type="bulleted">
+ <item>
+ <p>Tables must be written in the following order:
+ <c>tableObject</c>, <c>entryObject</c>, <c>column1</c>, ...,
+ <c>columnN</c> (in order).</p>
+ </item>
+ <item>
+ <p>Integer values, for example in the <c>SIZE</c> expression
+ must be entered in decimal syntax, not in hex or bit syntax.</p>
+ </item>
+ <item>
+ <p>Symbolic names must be unique within a MIB and within a
+ system.</p>
+ </item>
+ <item>
+ <p>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.</p>
+ </item>
+ <item>
+ <p>If a word is a keyword in any of SMIv1 or SMIv2, it is a
+ keyword in the compiler (deviates from SMIv1 only).</p>
+ </item>
+ <item>
+ <p>Indexes in a table must be objects, not types (deviates
+ from SMIv1 only).</p>
+ </item>
+ <item>
+ <p>A subset of all semantic checks on types are
+ implemented. For example, strictly the <c>TimeTicks</c> may not
+ be sub-classed but the compiler allows this (standard MIBs must
+ pass through the compiler) (deviates from SMIv2 only).</p>
+ </item>
+ <item>
+ <p>The <c>MIB.Object</c> syntax is not implemented (since all
+ objects must be unique anyway).</p>
+ </item>
+ <item>
+ <p>Two different names cannot define the same OBJECT IDENTIFIER.</p>
+ </item>
+ <item>
+ <p>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.</p>
+ </item>
+ <item>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 <c>{deprecated,true}</c>
+ the MIB-compiler does not ignore the deprecated definitions.</item>
+ <item>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
+ <c>description</c>.</item>
+ </list>
+ </section>
+</chapter>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1998</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmp_notification_mib</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_notification_mib.xml</file>
+ </header>
+ <module>snmp_notification_mib</module>
+ <modulesummary>Instrumentation Functions for SNMP-NOTIFICATION-MIB</modulesummary>
+ <description>
+ <p>The module <c>snmp_notification_mib</c> implements the
+ instrumentation functions for the
+ SNMP-NOTIFICATION-MIB, and functions for configuring the database.
+ </p>
+ <p>The configuration files are described in the SNMP User's Manual.</p>
+ </description>
+ <funcs>
+ <func>
+ <name>configure(ConfDir) -> void()</name>
+ <fsummary>Configure the SNMP-NOTIFICATION-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>This function is called from the supervisor at system
+ start-up.
+ </p>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old rows with StorageType
+ <c>volatile</c>. The rows created from the configuration file
+ will have StorageType <c>nonVolatile</c>.
+ </p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the
+ error report module,
+ and the function fails with reason <c>configuration_error</c>.
+ </p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found.
+ </p>
+ <p>The configuration file read is: <c>notify.conf</c>.
+ </p>
+ </desc>
+ </func>
+ <func>
+ <name>reconfigure(ConfDir) -> void()</name>
+ <fsummary>Configure the SNMP-NOTIFICATION-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old data, including the rows with
+ StorageType <c>nonVolatile</c>. The rows created from the
+ configuration file will have StorageType <c>nonVolatile</c>.
+ </p>
+ <p>Thus, the data in the SNMP-NOTIFICATION-MIB, after this
+ function has been called, is from the configuration files.
+ </p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the
+ error report module,
+ and the function fails with reason <c>configuration_error</c>.
+ </p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found.
+ </p>
+ <p>The configuration file read is: <c>notify.conf</c>.
+ <marker id="add_notify"></marker>
+</p>
+ </desc>
+ </func>
+ <func>
+ <name>add_notify(Name, Tag, Type) -> Ret</name>
+ <fsummary>Added one notify definition</fsummary>
+ <type>
+ <v>Name = string()</v>
+ <v>Tag = string()</v>
+ <v>Type = trap | inform</v>
+ <v>Ret = {ok, Key} | {error, Reason}</v>
+ <v>Key = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Adds a notify definition to the agent config.
+ Equivalent to one line in the <c>notify.conf</c> file.</p>
+ <marker id="delete_notify"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>delete_notify(Key) -> Ret</name>
+ <fsummary>Delete one notify definition</fsummary>
+ <type>
+ <v>Key = term()</v>
+ <v>Ret = ok | {error, Reason}</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Delete a notify definition from the agent config.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1996</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmp_pdus</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_pdus.xml</file>
+ </header>
+ <module>snmp_pdus</module>
+ <modulesummary>Encode and Decode Functions for SNMP PDUs</modulesummary>
+ <description>
+ <p>RFC1157, RFC1905 and/or RFC2272 should be studied carefully
+ before using this module, <c>snmp_pdus</c>.
+ </p>
+ <p>The module <c>snmp_pdus</c> 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
+ <c>snmp/include/snmp_types.hrl</c>. If snmpv3 is used, the module
+ that includes <c>snmp_types.hrl</c> must define the constant
+ <c>SNMP_USE_V3</c> before the header file is included. Example:</p>
+ <pre>
+-define(SNMP_USE_V3, true).
+-include_lib("snmp/include/snmp_types.hrl"). </pre>
+ <p>Encoding and decoding must be done explicitly when writing your
+ own Net if process.
+ </p>
+ </description>
+ <funcs>
+ <func>
+ <name>dec_message([byte()]) -> Message</name>
+ <fsummary>Decode an SNMP Message</fsummary>
+ <type>
+ <v>Message = #message</v>
+ </type>
+ <desc>
+ <p>Decodes a list of bytes into an SNMP Message. Note, if there
+ is a v3 message, the <c>msgSecurityParameters</c> are not
+ decoded. They must be explicitly decoded by a call to a
+ security model specific decoding function,
+ e.g. <c>dec_usm_security_parameters/1</c>. Also note, if
+ the <c>scopedPDU</c> is encrypted, the OCTET STRING encoded
+ <c>encryptedPDU</c> will be present in the <c>data</c> field.</p>
+ </desc>
+ </func>
+ <func>
+ <name>dec_message_only([byte()]) -> Message</name>
+ <fsummary>Decode an SNMP Message, but not the data part</fsummary>
+ <type>
+ <v>Message = #message</v>
+ </type>
+ <desc>
+ <p>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 <c>PDU</c> (v1 and V2) or an
+ encoded and possibly encrypted <c>scopedPDU</c> (v3).</p>
+ </desc>
+ </func>
+ <func>
+ <name>dec_pdu([byte()]) -> Pdu</name>
+ <fsummary>Decode an SNMP Pdu</fsummary>
+ <type>
+ <v>Pdu = #pdu</v>
+ </type>
+ <desc>
+ <p>Decodes a list of bytes into an SNMP Pdu.</p>
+ </desc>
+ </func>
+ <func>
+ <name>dec_scoped_pdu([byte()]) -> ScopedPdu</name>
+ <fsummary>Decode an SNMP ScopedPdu</fsummary>
+ <type>
+ <v>ScopedPdu = #scoped_pdu</v>
+ </type>
+ <desc>
+ <p>Decodes a list of bytes into an SNMP ScopedPdu.</p>
+ </desc>
+ </func>
+ <func>
+ <name>dec_scoped_pdu_data([byte()]) -> ScopedPduData</name>
+ <fsummary>Decode an SNMP ScopedPduData</fsummary>
+ <type>
+ <v>ScopedPduData = #scoped_pdu | EncryptedPDU</v>
+ <v>EncryptedPDU = [byte()]</v>
+ </type>
+ <desc>
+ <p>Decodes a list of bytes into either a scoped pdu record, or
+ - if the scoped pdu was encrypted - to a list of bytes.</p>
+ </desc>
+ </func>
+ <func>
+ <name>dec_usm_security_parameters([byte()]) -> UsmSecParams</name>
+ <fsummary>Decode SNMP UsmSecurityParameters</fsummary>
+ <type>
+ <v>UsmSecParams = #usmSecurityParameters</v>
+ </type>
+ <desc>
+ <p>Decodes a list of bytes into an SNMP UsmSecurityParameters</p>
+ </desc>
+ </func>
+ <func>
+ <name>enc_encrypted_scoped_pdu(EncryptedScopedPdu) -> [byte()]</name>
+ <fsummary>Encode an encrypted SNMP scopedPDU</fsummary>
+ <type>
+ <v>EncryptedScopedPdu = [byte()]</v>
+ </type>
+ <desc>
+ <p>Encodes an encrypted SNMP ScopedPdu into an OCTET STRING
+ that can be used as the <c>data</c> field in a
+ <c>message</c> record, that later can be encoded with a call
+ to <c>enc_message_only/1</c>.
+ </p>
+ <p>This function should be used whenever the <c>ScopedPDU</c>
+ is encrypted.</p>
+ </desc>
+ </func>
+ <func>
+ <name>enc_message(Message) -> [byte()]</name>
+ <fsummary>Encode an SNMP Message</fsummary>
+ <type>
+ <v>Message = #message</v>
+ </type>
+ <desc>
+ <p>Encodes a message record to a list of bytes.</p>
+ </desc>
+ </func>
+ <func>
+ <name>enc_message_only(Message) -> [byte()]</name>
+ <fsummary>Encode an SNMP Message, but not the data part</fsummary>
+ <type>
+ <v>Message = #message</v>
+ </type>
+ <desc>
+ <p><c>Message</c> is a record where the <c>data</c> field is
+ assumed to be encoded (a list of bytes). If there is a v1 or v2
+ message, the <c>data</c> field is an encoded <c>PDU</c>, and if
+ there is a v3 message, <c>data</c> is an encoded and possibly
+ encrypted <c>scopedPDU</c>.</p>
+ </desc>
+ </func>
+ <func>
+ <name>enc_pdu(Pd) -> [byte()]</name>
+ <fsummary>Encode an SNMP Pdu</fsummary>
+ <type>
+ <v>Pdu = #pdu</v>
+ </type>
+ <desc>
+ <p>Encodes an SNMP Pdu into a list of bytes.</p>
+ </desc>
+ </func>
+ <func>
+ <name>enc_scoped_pdu(ScopedPdu) -> [byte()]</name>
+ <fsummary>Encode an SNMP scopedPDU</fsummary>
+ <type>
+ <v>ScopedPdu = #scoped_pdu</v>
+ </type>
+ <desc>
+ <p>Encodes an SNMP ScopedPdu into a list of bytes, which can be
+ encrypted, and after encryption, encoded with
+ a call to <c>enc_encrypted_scoped_pdu/1</c>; or it can be
+ used as the <c>data</c> field in a <c>message</c> record, which
+ then can be encoded with <c>enc_message_only/1</c>.</p>
+ </desc>
+ </func>
+ <func>
+ <name>enc_usm_security_parameters(UsmSecParams) -> [byte()]</name>
+ <fsummary>Encode SNMP UsmSecurityParameters</fsummary>
+ <type>
+ <v>UsmSecParams = #usmSecurityParameters</v>
+ </type>
+ <desc>
+ <p>Encodes SNMP UsmSecurityParameters into a list of bytes.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1996</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmp_standard_mib</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_standard_mib.xml</file>
+ </header>
+ <module>snmp_standard_mib</module>
+ <modulesummary>Instrumentation Functions for STANDARD-MIB and SNMPv2-MIB</modulesummary>
+ <description>
+ <p>The module <c>snmp_standard_mib</c> implements the instrumentation functions for the
+ STANDARD-MIB and SNMPv2-MIB, and functions for configuring the database.
+ </p>
+ <p>The configuration files are described in the SNMP User's Manual.</p>
+ </description>
+ <funcs>
+ <func>
+ <name>configure(ConfDir) -> void()</name>
+ <fsummary>Configure the STANDARD-MIB and SNMPv2-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>This function is called from the supervisor at system
+ start-up.
+ </p>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old rows with StorageType
+ <c>volatile</c>. The rows created from the configuration file
+ will have StorageType <c>nonVolatile</c>.
+ </p>
+ <p>All <c>snmp</c> counters are set to zero.
+ </p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the error
+ report module, and the function fails with the reason
+ <c>configuration_error</c>.
+ </p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found.
+ </p>
+ <p>The configuration file read is: <c>standard.conf</c>.
+ </p>
+ </desc>
+ </func>
+ <func>
+ <name>inc(Name) -> void()</name>
+ <name>inc(Name, N) -> void()</name>
+ <fsummary>Increment a variable in the MIB</fsummary>
+ <type>
+ <v>Name = atom()</v>
+ <v>N = integer()</v>
+ </type>
+ <desc>
+ <p>Increments a variable in the MIB with <c>N</c>, or one if
+ <c>N</c> is not specified.</p>
+ </desc>
+ </func>
+ <func>
+ <name>reconfigure(ConfDir) -> void()</name>
+ <fsummary>Configure the STANDARD-MIB and SNMPv2-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old data, including the rows with
+ StorageType <c>nonVolatile</c>. The rows created from the
+ configuration file will have StorageType <c>nonVolatile</c>.
+ </p>
+ <p>Thus, the data in the SNMP-STANDARD-MIB and SNMPv2-MIB,
+ after this function has been called, is from the
+ configuration files.
+ </p>
+ <p>All <c>snmp</c> counters are set to zero.
+ </p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the error
+ report module, and the function fails with the reason
+ <c>configuration_error</c>.
+ </p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found.
+ </p>
+ <p>The configuration file read is: <c>standard.conf</c>.
+ </p>
+ </desc>
+ </func>
+ <func>
+ <name>reset() -> void()</name>
+ <fsummary>Reset all <c>snmp</c>counters to 0</fsummary>
+ <desc>
+ <p>Resets all <c>snmp</c> counters to 0.</p>
+ </desc>
+ </func>
+ <func>
+ <name>sys_up_time() -> Time</name>
+ <fsummary>Get the system up time</fsummary>
+ <type>
+ <v>Time = int()</v>
+ </type>
+ <desc>
+ <p>Gets the system up time in hundredth of a second.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1998</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmp_target_mib</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_target_mib.xml</file>
+ </header>
+ <module>snmp_target_mib</module>
+ <modulesummary>Instrumentation Functions for SNMP-TARGET-MIB</modulesummary>
+ <description>
+ <p>The module <c>snmp_target_mib</c> implements the instrumentation
+ functions for the SNMP-TARGET-MIB,
+ and functions for configuring the database. </p>
+ <p>The configuration files are described in the SNMP User's Manual.</p>
+
+ <marker id="configure"></marker>
+ </description>
+
+ <funcs>
+ <func>
+ <name>configure(ConfDir) -> void()</name>
+ <fsummary>Configure the SNMP-TARGET-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>This function is called from the supervisor at system
+ start-up.
+ </p>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old rows with StorageType
+ <c>volatile</c>. The rows created from the configuration file
+ will have StorageType <c>nonVolatile</c>. </p>
+ <p>All <c>snmp</c> counters are set to zero. </p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the error
+ report module, and the function fails with the reason
+ <c>configuration_error</c>. </p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found. </p>
+ <p>The configuration files read are: <c>target_addr.conf</c>
+ and <c>target_params.conf</c>. </p>
+
+ <marker id="reconfigure"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>reconfigure(ConfDir) -> void()</name>
+ <fsummary>Configure the SNMP-TARGET-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old data, including the rows with
+ StorageType <c>nonVolatile</c>. The rows created from the
+ configuration file will have StorageType <c>nonVolatile</c>. </p>
+ <p>Thus, the data in the SNMP-TARGET-MIB, after this
+ function has been called, is the data from the configuration
+ files. </p>
+ <p>All <c>snmp</c> counters are set to zero.</p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the ,
+ and the function fails with the reason
+ <c>configuration_error</c>.</p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found. </p>
+ <p>The configuration files read are: <c>target_addr.conf</c>
+ and <c>target_params.conf</c>. </p>
+
+ <marker id="set_target_engine_id"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>set_target_engine_id(TargetAddrName, EngineId) -> boolean()</name>
+ <fsummary>Set the engine id for a targetAddr row.</fsummary>
+ <type>
+ <v>TargetAddrName = string()</v>
+ <v>EngineId = string()</v>
+ </type>
+ <desc>
+ <p>Changes the engine id for a target in the
+ <c>snmpTargetAddrTable</c>.
+ If notifications are sent as Inform requests to a target, its
+ engine id must be set. </p>
+
+ <marker id="add_addr"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>add_addr(Name, Ip, Port, Timeout, Retry, TagList, Params, EngineId, TMask, MMS) -> Ret</name>
+ <fsummary>Add one target address definition</fsummary>
+ <type>
+ <v>Name = string()</v>
+ <v>Ip = [integer()], length 4</v>
+ <v>Port = integer()</v>
+ <v>Timeout = integer()</v>
+ <v>Retry = integer()</v>
+ <v>TagList = string()</v>
+ <v>ParamsName = string()</v>
+ <v>EngineId = string()</v>
+ <v>TMask = string(), length 0 or 6</v>
+ <v>MMS = integer()</v>
+ <v>Ret = {ok, Key} | {error, Reason}</v>
+ <v>Key = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Adds a target address definition to the agent config.
+ Equivalent to one line in the <c>target_addr.conf</c> file.</p>
+
+ <marker id="delete_addr"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>delete_addr(Key) -> Ret</name>
+ <fsummary>Delete one target address definition</fsummary>
+ <type>
+ <v>Key = term()</v>
+ <v>Ret = ok | {error, Reason}</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Delete a target address definition from the agent config.</p>
+
+ <marker id="add_params"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>add_params(Name, MPModel, SecModel, SecName, SecLevel) -> Ret</name>
+ <fsummary>Add one target parameter definition</fsummary>
+ <type>
+ <v>Name = string()</v>
+ <v>MPModel = v1 | v2c | v3</v>
+ <v>SecModel = v1 | v2c | usm</v>
+ <v>SecName = string()</v>
+ <v>SecLevel = noAuthNoPriv | authNoPriv | authPriv</v>
+ <v>Ret = {ok, Key} | {error, Reason}</v>
+ <v>Key = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Adds a target parameter definition to the agent config.
+ Equivalent to one line in the <c>target_params.conf</c> file.</p>
+
+ <marker id="delete_params"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>delete_params(Key) -> Ret</name>
+ <fsummary>Delete one target parameter definition</fsummary>
+ <type>
+ <v>Key = term()</v>
+ <v>Ret = ok | {error, Reason}</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Delete a target parameter definition from the agent config.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1999</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmp_user_based_sm_mib</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_user_based_sm_mib.xml</file>
+ </header>
+ <module>snmp_user_based_sm_mib</module>
+ <modulesummary>Instrumentation Functions for SNMP-USER-BASED-SM-MIB</modulesummary>
+ <description>
+ <p>The module <c>snmp_user_based_sm_mib</c> implements the instrumentation
+ functions for the SNMP-USER-BASED-SM-MIB, and functions for configuring
+ the database.
+ </p>
+ <p>The configuration files are described in the SNMP User's Manual.</p>
+ </description>
+ <funcs>
+ <func>
+ <name>configure(ConfDir) -> void()</name>
+ <fsummary>Configure the SNMP-USER-BASED-SM-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>This function is called from the supervisor at system
+ start-up.
+ </p>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old rows with StorageType
+ <c>volatile</c>. The rows created from the configuration file
+ will have StorageType <c>nonVolatile</c>.
+ </p>
+ <p>All <c>snmp</c> counters are set to zero.
+ </p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the error
+ report module, and the function fails with the reason
+ <c>configuration_error</c>.
+ </p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found.
+ </p>
+ <p>The configuration file read is: <c>usm.conf</c>.
+ </p>
+ </desc>
+ </func>
+ <func>
+ <name>reconfigure(ConfDir) -> void()</name>
+ <fsummary>Configure the SNMP-USER-BASED-SM-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old data, including the rows with
+ StorageType <c>nonVolatile</c>. The rows created from the
+ configuration file will have StorageType <c>nonVolatile</c>.
+ </p>
+ <p>Thus, the data in the SNMP-USER-BASED-SM-MIB, after this
+ function has been called, is the data from the configuration
+ files.
+ </p>
+ <p>All <c>snmp</c> counters are set to zero.
+ </p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the error
+ report module, and the function fails with the reason
+ <c>configuration_error</c>.
+ </p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found.
+ </p>
+ <p>The configuration file read is: <c>usm.conf</c>.
+ <marker id="add_user"></marker>
+</p>
+ </desc>
+ </func>
+ <func>
+ <name>add_user(EngineID, Name, SecName, Clone, AuthP, AuthKeyC, OwnAuthKeyC, PrivP, PrivKeyC, OwnPrivKeyC, Public, AuthKey, PrivKey) -> Ret</name>
+ <fsummary>Add one user</fsummary>
+ <type>
+ <v>EngineID = string()</v>
+ <v>Name = string()</v>
+ <v>SecName = string()</v>
+ <v>Clone = zeroDotZero | [integer()]</v>
+ <v>AuthP = usmNoAuthProtocol | usmHMACMD5AuthProtocol | usmHMACSHAAuthProtocol</v>
+ <v>AuthKeyC = string()</v>
+ <v>OwnAuthKeyC = string()</v>
+ <v>PrivP = usmNoPrivProtocol | usmDESPrivProtocol</v>
+ <v>PrivKeyC = string()</v>
+ <v>OwnPrivKeyC = string()</v>
+ <v>Public = string()</v>
+ <v>AuthKey = string()</v>
+ <v>PrivKey = string()</v>
+ <v>Ret = {ok, Key} | {error, Reason}</v>
+ <v>Key = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Adds a USM security data (user) to the agent config.
+ Equivalent to one line in the <c>usm.conf</c> file.</p>
+ <marker id="delete_user"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>delete_user(Key) -> Ret</name>
+ <fsummary>Delete one user</fsummary>
+ <type>
+ <v>Key = term()</v>
+ <v>Ret = ok | {error, Reason}</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Delete a USM security data (user) from the agent config.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1999</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmp_view_based_acm_mib</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmp_view_based_acm_mib.xml</file>
+ </header>
+ <module>snmp_view_based_acm_mib</module>
+ <modulesummary>Instrumentation Functions for SNMP-VIEW-BASED-ACM-MIB</modulesummary>
+ <description>
+ <p>The module <c>snmp_view_based_acm_mib</c> implements the instrumentation functions for the
+ SNMP-VIEW-BASED-ACM-MIB, and functions for configuring the database.
+ </p>
+ <p>The configuration files are described in the SNMP User's Manual.</p>
+ </description>
+ <funcs>
+ <func>
+ <name>configure(ConfDir) -> void()</name>
+ <fsummary>Configure the SNMP-VIEW-BASED-ACM-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>This function is called from the supervisor at system
+ start-up.
+ </p>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old rows with StorageType
+ <c>volatile</c>. The rows created from the configuration file
+ will have StorageType <c>nonVolatile</c>.
+ </p>
+ <p>All <c>snmp</c> counters are set to zero.
+ </p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the error
+ report module, and the function fails with the reason
+ <c>configuration_error</c>.
+ </p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found.
+ </p>
+ <p>The configuration file read is: <c>vacm.conf</c>.
+ </p>
+ </desc>
+ </func>
+ <func>
+ <name>reconfigure(ConfDir) -> void()</name>
+ <fsummary>Configure the SNMP-VIEW-BASED-ACM-MIB</fsummary>
+ <type>
+ <v>ConfDir = string()</v>
+ </type>
+ <desc>
+ <p>Inserts all data in the configuration files into the
+ database and destroys all old data, including the rows with
+ StorageType <c>nonVolatile</c>. The rows created from the
+ configuration file will have StorageType <c>nonVolatile</c>.
+ </p>
+ <p>Thus, the data in the SNMP-VIEW-BASED-ACM-MIB, after this
+ function has been called, is the data from the configuration
+ files.
+ </p>
+ <p>All <c>snmp</c> counters are set to zero.
+ </p>
+ <p>If an error is found in the configuration file, it is
+ reported using the function <c>config_err/2</c> of the error
+ report module, and the function fails with the reason
+ <c>configuration_error</c>.
+ </p>
+ <p><c>ConfDir</c> is a string which points to the directory
+ where the configuration files are found.
+ </p>
+ <p>The configuration file read is: <c>vacm.conf</c>.
+ <marker id="add_sec2group"></marker>
+</p>
+ </desc>
+ </func>
+ <func>
+ <name>add_sec2group(SecModel, SecName, GroupName) -> Ret</name>
+ <fsummary>Add one security to group definition</fsummary>
+ <type>
+ <v>SecModel = v1 | v2c | usm</v>
+ <v>SecName = string()</v>
+ <v>GroupName = string()</v>
+ <v>Ret = {ok, Key} | {error, Reason}</v>
+ <v>Key = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Adds a security to group definition to the agent config.
+ Equivalent to one vacmSecurityToGroup-line in the <c>vacm.conf</c> file.</p>
+ <marker id="delete_sec2group"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>delete_sec2group(Key) -> Ret</name>
+ <fsummary>Delete one security to group definition</fsummary>
+ <type>
+ <v>Key = term()</v>
+ <v>Ret = ok | {error, Reason}</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Delete a security to group definition from the agent config.</p>
+ <marker id="add_access"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>add_access(GroupName, Prefix, SecModel, SecLevel, Match, RV, WV, NV) -> Ret</name>
+ <fsummary>Add one access definition</fsummary>
+ <type>
+ <v>GroupName = string()</v>
+ <v>Prefix = string()</v>
+ <v>SecModel = v1 | v2c | usm</v>
+ <v>SecLevel = string()</v>
+ <v>Match = prefix | exact</v>
+ <v>RV = string()</v>
+ <v>WV = string()</v>
+ <v>NV = string()</v>
+ <v>Ret = {ok, Key} | {error, Reason}</v>
+ <v>Key = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Adds a access definition to the agent config.
+ Equivalent to one vacmAccess-line in the <c>vacm.conf</c> file.</p>
+ <marker id="delete_access"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>delete_access(Key) -> Ret</name>
+ <fsummary>Delete one access definition</fsummary>
+ <type>
+ <v>Key = term()</v>
+ <v>Ret = ok | {error, Reason}</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Delete a access definition from the agent config.</p>
+ <marker id="add_view_tree_fam"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>add_view_tree_fam(ViewIndex, SubTree, Status, Mask) -> Ret</name>
+ <fsummary>Add one view tree family definition</fsummary>
+ <type>
+ <v>ViewIndex = integer()</v>
+ <v>SubTree = oid()</v>
+ <v>Status = included | excluded</v>
+ <v>Mask = null | [integer()], where all values are either 0 or 1</v>
+ <v>Ret = {ok, Key} | {error, Reason}</v>
+ <v>Key = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Adds a view tree family definition to the agent config.
+ Equivalent to one vacmViewTreeFamily-line in the <c>vacm.conf</c> file.</p>
+ <marker id="delete_view_tree_fam"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>delete_view_tree_fam(Key) -> Ret</name>
+ <fsummary>Delete one view tree family definition</fsummary>
+ <type>
+ <v>Key = term()</v>
+ <v>Ret = ok | {error, Reason}</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Delete a view tree family definition from the agent config.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa.xml</file>
+ </header>
+ <module>snmpa</module>
+ <modulesummary>Interface Functions to the SNMP toolkit agent</modulesummary>
+ <description>
+ <p>The module <c>snmpa</c> contains interface functions to the
+ SNMP agent.</p>
+
+ <marker id="data_types"></marker>
+ </description>
+
+ <section>
+ <title>DATA TYPES</title>
+ <code type="none"><![CDATA[
+oid() = [byte()]
+atl_type() = read | write | read_write
+notification_delivery_info() = #snmpa_notification_delivery_info{}
+ ]]></code>
+
+ <p>The <c>oid()</c> type is used to represent an ASN.1 OBJECT IDENTIFIER. </p>
+
+ <p>The record <c><![CDATA[snmpa_notification_delivery_info]]></c> contains the following fields: </p>
+ <taglist>
+ <tag><c><![CDATA[tag = term()]]></c></tag>
+ <item>
+ <p>A user defined identity representing this notification send
+ operation.</p>
+ </item>
+ <tag><c><![CDATA[mod = module()]]></c></tag>
+ <item>
+ <p>A module implementing the
+ <seealso marker="snmpa_notification_delivery_info_receiver">snmpa_notification_delivery_info_receiver</seealso>
+ behaviour. The info functions of this module will be called at
+ various stages of delivery. </p>
+ </item>
+ <tag><c><![CDATA[extra = term()]]></c></tag>
+ <item>
+ <p>This is any extra info the user wants to have supplied
+ when the functions in the callback module is called. </p>
+ </item>
+ </taglist>
+
+ <marker id="add_agent_caps"></marker>
+ </section>
+
+ <funcs>
+ <func>
+ <name>add_agent_caps(SysORID, SysORDescr) -> SysORIndex</name>
+ <fsummary>Add an AGENT-CAPABILITY definition to the agent</fsummary>
+ <type>
+ <v>SysORID = oid()</v>
+ <v>SysORDescr = string()</v>
+ <v>SysORIndex = integer()</v>
+ </type>
+ <desc>
+ <p>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.</p>
+ <marker id="del_agent_caps"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>del_agent_caps(SysORIndex) -> void()</name>
+ <fsummary>Delete an AGENT-CAPABILITY definition from the agent</fsummary>
+ <type>
+ <v>SysORIndex = integer()</v>
+ </type>
+ <desc>
+ <p>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. </p>
+
+ <marker id="get_agent_caps"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>get_agent_caps() -> [[SysORIndex, SysORID, SysORDescr, SysORUpTime]]</name>
+ <fsummary>Return all AGENT-CAPABILITY definitions in the agent</fsummary>
+ <type>
+ <v>SysORIndex = integer()</v>
+ <v>SysORId = oid()</v>
+ <v>SysORDescr = string()</v>
+ <v>SysORUpTime = integer()</v>
+ </type>
+ <desc>
+ <p>Returns all AGENT-CAPABILITY statements in the sysORTable
+ in the agent. This table is defined in the SNMPv2-MIB. </p>
+
+ <marker id="get"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>get(Agent, Vars) -> Values | {error, Reason}</name>
+ <name>get(Agent, Vars, Context) -> Values | {error, Reason}</name>
+ <fsummary>Perform a get operation on the agent</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Vars = [oid()]</v>
+ <v>Context = string()</v>
+ <v>Values = [term()]</v>
+ <v>Reason = {atom(), oid()}</v>
+ </type>
+ <desc>
+ <p>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. </p>
+ <p>Note that the request specific parameters (such as
+ <seealso marker="#current_request_id">current_request_id</seealso>)
+ are not accessible for the instrumentation functions if this
+ function is used. </p>
+
+ <marker id="get_next"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>get_next(Agent, Vars) -> Values | {error, Reason}</name>
+ <name>get_next(Agent, Vars, Context) -> Values | {error, Reason}</name>
+ <fsummary>Perform a get-next operation on the agent</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Vars = [oid()]</v>
+ <v>Context = string()</v>
+ <v>Values = [{oid(), term()}]</v>
+ <v>Reason = {atom(), oid()}</v>
+ </type>
+ <desc>
+ <p>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. </p>
+ <p>Note that the request specific parameters (such as
+ <c>snmpa:current_request_id/0</c> are not accessible for the
+ instrumentation functions if this function is used. </p>
+
+ <marker id="backup"></marker>
+ <!-- <marker id="get_symbolic_store_db"></marker> -->
+ </desc>
+ </func>
+
+<!--
+ <func>
+ <name>get_symbolic_store_db() -> Db</name>
+ <fsummary>Retrieve the symbolic store database reference</fsummary>
+ <type>
+ <v>Db = term()</v>
+ </type>
+ <desc>
+ <p>Retrieve the symbolic store database reference. This is used
+ for faster access to the database using the functions:
+ <c>int_to_enum/3</c>, <c>enum_to_int/3</c>, <c>name_to_oid/2</c>,
+ <c>oid_to_name/2</c>. </p>
+
+ <marker id="backup"></marker>
+ </desc>
+ </func>
+
+-->
+ <func>
+ <name>backup(BackupDir) -> ok | {error, Reason}</name>
+ <name>backup(Agent, BackupDir) -> ok | {error, Reason}</name>
+ <fsummary>Backup agent data</fsummary>
+ <type>
+ <v>BackupDir = string()</v>
+ <v>Agent = pid() | atom()</v>
+ </type>
+ <desc>
+ <p>Backup persistent/permanent data handled by the agent
+ (such as local-db, mib-data and vacm). </p>
+ <p>Data stored by mnesia is not handled. </p>
+ <p>BackupDir cannot be identical to DbDir. </p>
+
+ <marker id="info"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>info() -> [{Key, Value}]</name>
+ <name>info(Agent) -> [{Key, Value}]</name>
+ <fsummary>Return information about the agent</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ </type>
+ <desc>
+ <p>Returns a list (a dictionary) containing information about
+ the agent. Information includes loaded MIBs, registered
+ sub-agents, some information about the memory allocation. </p>
+ <p>As of version 4.4 the format of the info has been changed.
+ To convert the info to the old format, call the
+ <seealso marker="#old_info_format">old_info_format</seealso>
+ function. </p>
+
+ <marker id="old_info_format"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>old_info_format(NewInfo) -> OldInfo</name>
+ <fsummary>Return information about the agent</fsummary>
+ <type>
+ <v>OldInfo = NewInfo = [{Key, Value}]</v>
+ </type>
+ <desc>
+ <p>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. </p>
+
+ <marker id="load_mibs"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>load_mibs(Mibs) -> ok | {error, Reason}</name>
+ <name>load_mibs(Agent,Mibs) -> ok | {error, Reason}</name>
+ <fsummary>Load MIBs into the agent</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Mibs = [MibName]</v>
+ <v>MibName = string()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Loads <c>Mibs</c> into an agent. If the agent cannot load
+ all MIBs, it will indicate where loading was aborted. The
+ <c>MibName</c> is the name of the Mib, including the path to
+ where the compiled mib is found. For example,</p>
+ <code type="none">
+ Dir = code:priv_dir(my_app) ++ "/mibs/",
+ snmpa:load_mibs(snmp_master_agent, [Dir ++ "MY-MIB"]).
+ </code>
+
+ <marker id="unload_mibs"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>unload_mibs(Mibs) -> ok | {error, Reason}</name>
+ <name>unload_mibs(Agent,Mibs) -> ok | {error, Reason}</name>
+ <fsummary>Unload MIBs from the agent</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Mibs = [MibName]</v>
+ <v>MibName = string()</v>
+ </type>
+ <desc>
+ <p>Unloads MIBs into an agent. If it cannot unload all MIBs,
+ it will indicate where unloading was aborted. </p>
+
+ <marker id="which_mibs"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>which_mibs() -> Mibs</name>
+ <name>which_mibs(Agent) -> Mibs</name>
+ <fsummary>Get a list of all the loaded mibs</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Mibs = [{MibName, MibFile}]</v>
+ <v>MibName = atom()</v>
+ <v>MibFile = string()</v>
+ </type>
+ <desc>
+ <p>Retrieve the list of all the mibs loaded into this agent. Default
+ is the master agent. </p>
+
+ <marker id="whereis_mib"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>whereis_mib(MibName) -> {ok, MibFile} | {error, Reason}</name>
+ <name>whereis_mib(Agent, MibName) -> {ok, MibFile} | {error, Reason}</name>
+ <fsummary>Get the path to the mib file</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>MibName = atom()</v>
+ <v>MibFile = string()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Get the full path to the (compiled) mib-file. </p>
+
+ <marker id="current_request_id"></marker>
+ <marker id="current_context"></marker>
+ <marker id="current_community"></marker>
+ <marker id="current_address"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>current_request_id() -> {value, RequestId} | false</name>
+ <name>current_context() -> {value, Context} | false</name>
+ <name>current_community() -> {value, Community} | false</name>
+ <name>current_address() -> {value, Address} | false</name>
+ <fsummary>Get the request-id, context, community and address of the current request</fsummary>
+ <type>
+ <v>RequestId = integer()</v>
+ <v>Context = string()</v>
+ <v>Community = string()</v>
+ <v>Address = term()</v>
+ </type>
+ <desc>
+ <p>Get the request-id, context, community and address of the
+ request currently being processed by the agent. </p>
+ <p>Note that these functions is intended to be called by the
+ instrumentation functions and <em>only</em> if they are
+ executed in the context of the agent process (e.g. it does
+ not work if called from a spawned process).</p>
+
+ <marker id="enum_to_int"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>enum_to_int(Name, Enum) -> {value, Int} | false</name>
+ <name>enum_to_int(Db, Name, Enum) -> {value, Int} | false</name>
+ <fsummary>Convert an enum value to an integer</fsummary>
+ <type>
+ <v>Db = term()</v>
+ <v>Name = atom()</v>
+ <v>Enum = atom()</v>
+ <v>Int = int()</v>
+ </type>
+ <desc>
+ <p>Converts the symbolic value <c>Enum</c> to the
+ corresponding integer of the enumerated object or type
+ <c>Name</c> in a MIB. The MIB must be loaded.
+ </p>
+ <p><c>false</c> 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.
+ </p>
+ <p><c>Db</c> is a reference to the symbolic store database
+ (retrieved by a call to <c>get_symbolic_store_db/0</c>). </p>
+
+ <marker id="int_to_enum"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>int_to_enum(Name, Int) -> {value, Enum} | false</name>
+ <name>int_to_enum(Db, Name, Int) -> {value, Enum} | false</name>
+ <fsummary>Convert an integer to an enum value</fsummary>
+ <type>
+ <v>Db = term()</v>
+ <v>Name = atom()</v>
+ <v>Int = int()</v>
+ <v>Enum = atom()</v>
+ </type>
+ <desc>
+ <p>Converts the integer <c>Int</c> to the corresponding
+ symbolic value of the enumerated object or type <c>Name</c> in
+ a MIB. The MIB must be loaded.
+ </p>
+ <p><c>false</c> 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.
+ </p>
+ <p><c>Db</c> is a reference to the symbolic store database
+ (retrieved by a call to <c>get_symbolic_store_db/0</c>). </p>
+
+ <marker id="name_to_oid"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>name_to_oid(Name) -> {value, oid()} | false</name>
+ <name>name_to_oid(Db, Name) -> {value, oid()} | false</name>
+ <fsummary>Convert a symbolic name to an OID</fsummary>
+ <type>
+ <v>Db = term()</v>
+ <v>Name = atom()</v>
+ </type>
+ <desc>
+ <p>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. </p>
+ <p><c>false</c> is returned if the object is not defined in any
+ loaded MIB. </p>
+ <p><c>Db</c> is a reference to the symbolic store database
+ (retrieved by a call to <c>get_symbolic_store_db/0</c>). </p>
+
+ <marker id="oid_to_name"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>oid_to_name(OID) -> {value, Name} | false</name>
+ <name>oid_to_name(Db, OID) -> {value, Name} | false</name>
+ <fsummary>Convert an OID to a symbolic name</fsummary>
+ <type>
+ <v>Db = term()</v>
+ <v>OID = oid()</v>
+ <v>Name = atom()</v>
+ </type>
+ <desc>
+ <p>Looks up the symbolic name of a MIB object, given OBJECT
+ IDENTIFIER. </p>
+ <p><c>false</c> is returned if the object is not defined in any
+ loaded MIB. </p>
+ <p><c>Db</c> is a reference to the symbolic store database
+ (retrieved by a call to <c>get_symbolic_store_db/0</c>). </p>
+
+ <marker id="which_aliasnames"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>which_aliasnames() -> Result</name>
+ <fsummary>Get all alias-names known to the agent</fsummary>
+ <type>
+ <v>Result = [atom()]</v>
+ </type>
+ <desc>
+ <p>Retrieve all alias-names known to the agent.</p>
+ <marker id="which_tables"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>which_tables() -> Result</name>
+ <fsummary>Get all tables known to the agent</fsummary>
+ <type>
+ <v>Result = [atom()]</v>
+ </type>
+ <desc>
+ <p>Retrieve all tables known to the agent.</p>
+
+ <marker id="which_variables"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>which_variables() -> Result</name>
+ <fsummary>Get all variables known to the agent</fsummary>
+ <type>
+ <v>Result = [atom()]</v>
+ </type>
+ <desc>
+ <p>Retrieve all variables known to the agent.</p>
+
+ <marker id="which_notifications"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>which_notifications() -> Result</name>
+ <fsummary>Get all notifications known to the agent</fsummary>
+ <type>
+ <v>Result = [{Name, MibName, Info}]</v>
+ <v>Name = atom()</v>
+ <v>MibName = atom()</v>
+ <v>Info = term()</v>
+ </type>
+ <desc>
+ <p>Retrieve all notifications (and traps) known to the agent.</p>
+
+ <marker id="log_to_txt"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>log_to_txt(LogDir, Mibs)</name>
+ <name>log_to_txt(LogDir, Mibs, OutFile) -> ok | {error, Reason}</name>
+ <name>log_to_txt(LogDir, Mibs, OutFile, LogName) -> ok | {error, Reason}</name>
+ <name>log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile) -> ok | {error, Reason}</name>
+ <name>log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start) -> ok | {error, Reason}</name>
+ <name>log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start, Stop) -> ok | {error, Reason}</name>
+ <fsummary>Convert an Audit Trail Log to text format</fsummary>
+ <type>
+ <v>LogDir = string()</v>
+ <v>Mibs = [MibName]</v>
+ <v>MibName = string()</v>
+ <v>OutFile = string()</v>
+ <v>LogName = string()</v>
+ <v>LogFile = string()</v>
+ <v>Start = Stop = null | datetime() | {local_time,datetime()} | {universal_time,datetime()} </v>
+ <v>Reason = disk_log_open_error() | file_open_error() | term()</v>
+ <v>disk_log_open_error() = {LogName, term()}</v>
+ <v>file_open_error() = {OutFile, term()}</v>
+ </type>
+ <desc>
+ <p>Converts an Audit Trail Log to a readable text file.
+ <c>OutFile</c> defaults to "./snmpa_log.txt".
+ <c>LogName</c> defaults to "snmpa_log".
+ <c>LogFile</c> defaults to "snmpa.log".
+ See <seealso marker="snmp#log_to_txt">snmp:log_to_txt</seealso>
+ for more info.</p>
+
+ <marker id="change_log_size"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>change_log_size(NewSize) -> ok | {error, Reason}</name>
+ <fsummary>Change the size of the Audit Trail Log</fsummary>
+ <type>
+ <v>NewSize = {MaxBytes, MaxFiles}</v>
+ <v>MaxBytes = integer()</v>
+ <v>MaxFiles = integer()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>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. </p>
+ <p>The change is permanent, as long as the log is not deleted.
+ That means, the log size is remembered across reboots. </p>
+
+ <marker id="set_log_type"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>set_log_type(NewType) -> {ok, OldType} | {error, Reason}</name>
+ <name>set_log_type(Agent, NewType) -> {ok, OldType} | {error, Reason}</name>
+ <fsummary>Change the type of the Audit Trail Log</fsummary>
+ <type>
+ <v>NewType = OldType = atl_type()</v>
+ <v>Agent = pid() | atom()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Changes the run-time Audit Trail log type. </p>
+ <p>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. </p>
+ <p>This function is primarily useful in testing/debugging
+ scenarios. </p>
+
+ <marker id="mib_of"></marker>
+ </desc>
+
+ </func>
+
+ <func>
+ <name>mib_of(Oid) -> {ok, MibName} | {error, Reason}</name>
+ <name>mib_of(Agent, Oid) -> {ok, MibName} | {error, Reason}</name>
+ <fsummary>Which mib an Oid belongs to</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Oid = oid()</v>
+ <v>MibName = atom()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Finds the mib corresponding to the <c>Oid</c>. If it is a
+ variable, the Oid must be
+ &lt;Oid for var&gt;.0 and if it is a table, Oid must be
+ &lt;table&gt;.&lt;entry&gt;.&lt;col&gt;.&lt;any&gt;</p>
+
+ <marker id="me_of"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>me_of(Oid) -> {ok, Me} | {error, Reason}</name>
+ <name>me_of(Agent, Oid) -> {ok, Me} | {error, Reason}</name>
+ <fsummary>Retrieve the mib-entry of an Oid</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Oid = oid()</v>
+ <v>Me = #me{}</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Finds the mib entry corresponding to the <c>Oid</c>. If it is a
+ variable, the Oid must be
+ &lt;Oid for var&gt;.0 and if it is a table, Oid must be
+ &lt;table&gt;.&lt;entry&gt;.&lt;col&gt;.&lt;any&gt;</p>
+
+ <marker id="invalidate_mibs_cache"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>invalidate_mibs_cache() -> void()</name>
+ <name>invalidate_mibs_cache(Agent) -> void()</name>
+ <fsummary>Invalidate the mib server cache</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ </type>
+ <desc>
+ <p>Invalidate the mib server cache. </p>
+ <p>The entire contents of the cache will be deleted. </p>
+
+ <marker id="enable_mibs_cache"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>enable_mibs_cache() -> void()</name>
+ <name>enable_mibs_cache(Agent) -> void()</name>
+ <fsummary>Enable the mib server cache</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ </type>
+ <desc>
+ <p>Enable the mib server cache. </p>
+
+ <marker id="disable_mibs_cache"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>disable_mibs_cache() -> void()</name>
+ <name>disable_mibs_cache(Agent) -> void()</name>
+ <fsummary>Disable the mib server cache</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ </type>
+ <desc>
+ <p>Disable the mib server cache. </p>
+
+ <marker id="gc_mibs_cache"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>gc_mibs_cache() -> {ok, NumElementsGCed} | {error, Reason}</name>
+ <name>gc_mibs_cache(Agent) -> {ok, NumElementsGCed} | {error, Reason}</name>
+ <name>gc_mibs_cache(Age) -> {ok, NumElementsGCed} | {error, Reason}</name>
+ <name>gc_mibs_cache(Agent, Age) -> {ok, NumElementsGCed} | {error, Reason}</name>
+ <name>gc_mibs_cache(Age, GcLimit) -> {ok, NumElementsGCed} | {error, Reason}</name>
+ <name>gc_mibs_cache(Agent, Age, GcLimit) -> {ok, NumElementsGCed} | {error, Reason}</name>
+ <fsummary>Perform mib server cache gc</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Age = integer() > 0</v>
+ <v>GcLimit = integer() > 0 | infinity</v>
+ <v>NumElementsGCed = integer() >= 0</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Perform mib server cache gc. </p>
+ <p>Manually performs a mib server cache gc.
+ This can be done regardless of the value of the
+ <c>autogc</c> option.
+ The <c>NumElementsGCed</c> value indicates how many
+ elements where actually removed from the cache. </p>
+
+ <marker id="enable_mibs_cache_autogc"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>enable_mibs_cache_autogc() -> void()</name>
+ <name>enable_mibs_cache_autogc(Agent) -> void()</name>
+ <fsummary>Enable automatic gc of the mib server cache</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ </type>
+ <desc>
+ <p>Enable automatic gc of the mib server cache. </p>
+
+ <marker id="disable_mibs_cache_autogc"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>disable_mibs_cache_autogc() -> void()</name>
+ <name>disable_mibs_cache_autogc(Agent) -> void()</name>
+ <fsummary>Disable automatic gc of the mib server cache</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ </type>
+ <desc>
+ <p>Disable automatic gc of the mib server cache. </p>
+
+ <marker id="update_mibs_cache_age"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>update_mibs_cache_age(NewAge) -> ok | {error, Reason}</name>
+ <name>update_mibs_cache_age(Agent, NewAge) -> ok | {error, Reason}</name>
+ <fsummary>Change the mib server cache age property</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>NewAge = integer() > 0</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Change the mib server cache <c>age</c> property. </p>
+
+ <marker id="update_mibs_cache_gclimit"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>update_mibs_cache_gclimit(NewGcLimit) -> ok | {error, Reason}</name>
+ <name>update_mibs_cache_gclimit(Agent, NewGCLimit) -> ok | {error, Reason}</name>
+ <fsummary>Change the mib server cache gclimit property</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>NewGcLimit = integer() > 0 | infinity</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Change the mib server cache <c>gclimit</c> property. </p>
+
+ <marker id="register_notification_filter"></marker>
+ </desc>
+ </func>
+
+
+ <func>
+ <name>register_notification_filter(Id, Mod, Data) -> ok | {error, Reason}</name>
+ <name>register_notification_filter(Agent, Id, Mod, Data) -> ok | {error, Reason}</name>
+ <name>register_notification_filter(Id, Mod, Data, Where) -> ok | {error, Reason}</name>
+ <name>register_notification_filter(Agent, Id, Mod, Data, Where) -> ok | {error, Reason}</name>
+ <fsummary>Register a notification filter</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Id = filter_id()</v>
+ <v>filter_id() = term()</v>
+ <v>Mod = atom()</v>
+ <v>Data = term()</v>
+ <v>Where = filter_position()</v>
+ <v>Reason = term()</v>
+ <v>filter_position() = first | last | {insert_before, filter_id()} | {insert_after, filter_id()} </v>
+ </type>
+ <desc>
+ <p>Registers a notification filter.
+ </p>
+ <p><c>Mod</c> is a module implementing the
+ <c>snmpa_notification_filter</c> behaviour.</p>
+ <p><c>Data</c> will be passed on to the filter when calling the
+ functions of the behaviour.</p>
+
+ <marker id="unregister_notification_filter"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>unregister_notification_filter(Id) -> ok | {error, Reason}</name>
+ <name>unregister_notification_filter(Agent, Id) -> ok | {error, Reason}</name>
+ <fsummary>Unregister a notification filter</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Id = filter_id()</v>
+ <v>filter_id() = term()</v>
+ </type>
+ <desc>
+ <p>Unregister a notification filter. </p>
+
+ <marker id="which_notification_filter"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>which_notification_filter() -> Filters</name>
+ <name>which_notification_filter(Agent) -> Filters</name>
+ <fsummary>Which notification filter</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Filters = [filter_id()]</v>
+ <v>filter_id() = term()</v>
+ </type>
+ <desc>
+ <p>List all notification filters in an agent.</p>
+
+ <marker id="set_request_limit"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>set_request_limit(NewLimit) -> {ok, OldLimit} | {error, Reason}</name>
+ <name>set_request_limit(Agent, NewLimit) -> {ok, OldLimit} | {error, Reason}</name>
+ <fsummary>Change the request limit</fsummary>
+ <type>
+ <v>NewLimit = OldLimit = infinity | integer() >= 0</v>
+ <v>Agent = pid() | atom()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Changes the request limit. </p>
+ <p>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. </p>
+ <p>This function is primarily useful in load regulation
+ scenarios. </p>
+
+ <marker id="register_subagent"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>register_subagent(Agent, SubTreeOid, Subagent) -> ok | {error, Reason}</name>
+ <fsummary>Register a sub-agent under a sub-tree</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>SubTreeOid = oid()</v>
+ <v>SubAgent = pid()</v>
+ </type>
+ <desc>
+ <p>Registers a sub-agent under a sub-tree of another agent. </p>
+ <p>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:</p>
+ <pre>
+snmp_agent:register_subagent(MAPid,[1,2,3,4],SA1),
+snmp_agent:register_subagent(SA1,[1,2,3], SA2).
+ </pre>
+ <p><c>SA2</c> will not get requests starting with object
+ identifier <c>[1,2,3]</c> since <c>SA1</c> does not. </p>
+
+ <marker id="unregister_subagent"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>unregister_subagent(Agent, SubagentOidOrPid) -> ok | {ok, SubAgentPid} | {error, Reason}</name>
+ <fsummary>Unregister a sub-agent</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>SubTreeOidorPid = oid() | pid()</v>
+ </type>
+ <desc>
+ <p>Unregister a sub-agent. If the second argument is a pid,
+ then that sub-agent will be unregistered from all trees in
+ <c>Agent</c>. </p>
+
+ <marker id="send_notification"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>send_notification(Agent, Notification, Receiver)</name>
+ <name>send_notification(Agent, Notification, Receiver, Varbinds)</name>
+ <name>send_notification(Agent, Notification, Receiver, NotifyName, Varbinds)</name>
+ <name>send_notification(Agent, Notification, Receiver, NotifyName, ContextName, Varbinds) -> void() </name>
+ <fsummary>Send a notification</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Notification = atom()</v>
+ <v>Receiver = no_receiver | {Tag, Recv} | notification_delivery_info()</v>
+ <v>Tag = term()</v>
+ <v>Recv = receiver()</v>
+ <v>receiver() = pid() | atom() | {Mod, Func, Args}</v>
+ <v>Mod = atom()</v>
+ <v>Func = atom()</v>
+ <v>Args = list()</v>
+ <v>NotifyName = string()</v>
+ <v>ContextName = string()</v>
+ <v>Varbinds = varbinds()</v>
+ <v>varbinds() = [varbind()]</v>
+ <v>varbind() = {Variable, Value} | {Column, RowIndex, Value} | {OID, Value}</v>
+ <v>Variable = atom()</v>
+ <v>Column = atom()</v>
+ <v>OID = oid()</v>
+ <v>Value = term()</v>
+ <v>RowIndex = [int()]</v>
+ </type>
+ <desc>
+ <p>Sends the notification <c>Notification</c> to the
+ management targets defined for <c>NotifyName</c> in the
+ <c>snmpNotifyTable</c> in SNMP-NOTIFICATION-MIB from the
+ specified context. If no <c>NotifyName</c> is specified (or
+ if it is <c>""</c>), the notification is sent to all
+ management targets (<c>Addresses</c> below). If no <c>ContextName</c>
+ is specified, the default <c>""</c> context is used.
+ </p>
+
+ <p>The parameter <c>Receiver</c> specifies where information
+ about delivery of Inform-Requests should be sent. The agent
+ sends Inform-Requests and waits for acknowledgments from the
+ managers. <c>Receiver</c> can have three values: </p>
+
+ <list type="bulleted">
+ <item>
+ <p><c>no_receiver</c> - No information is delivered. </p>
+ </item>
+
+ <item>
+ <p><c>{Tag, Recv}</c> - The information is delivered either via messages
+ or via a function call according to the value of <c>Recv</c>. </p>
+ </item>
+
+ <item>
+ <p><c>notification_delivery_info()</c> - The information is
+ delivered via a function call according to this data. See the
+ <seealso marker="#data_types">DATA TYPES</seealso> section
+ above for details. </p>
+ </item>
+
+ </list>
+
+
+ <p>If <c>Receiver</c> has the value <c>{Tag, Recv}</c>, the delivery is
+ done according to <c>Recv</c>: </p>
+
+ <list>
+ <item>
+ <p><c>pid() | atom()</c> - The info will be delivered in
+ the following messages: </p>
+ <list>
+ <item>
+ <p><c>{snmp_targets, Tag, Addresses}</c></p>
+ <p>This inform the user which target addresses the
+ notification was sent to. </p>
+ </item>
+ <item>
+ <p><c>{snmp_notification, Tag, {got_response, Address}}</c></p>
+ <p>This informs the user that this target address
+ acknowledged the notification. </p>
+ </item>
+ <item>
+ <p><c>{snmp_notification, Tag, {no_response, Address}}</c></p>
+ <p>This informs the user that this target address
+ did not acknowledge notification. </p>
+ </item>
+ </list>
+ <p>The notification is sent as an Inform-Request to each
+ target address in <c>Addresses</c> and if there are no
+ targets for which an Inform-Request is sent, <c>Addresses</c>
+ is the empty list <c>[]</c>. </p>
+ <p>The <c>receiver</c> will first be sent the <c>snmp_targets</c>
+ message, and then for each address in <c>Addresses</c> list,
+ one of the two <c>snmp_notification</c> messages. </p>
+ </item>
+ <item>
+ <p><c>{Mod, Func, Args}</c> - The info will be delivered via
+ the function call: </p>
+ <p><c>Mod:Func([Msg | Args])</c></p>
+ <p>where <c>Msg</c> has the same content and purpose as the
+ messages descrived above.</p>
+ </item>
+ </list>
+
+ <p><c>Address</c> is a management target address and <c>Addresses</c> is a
+ list of management target addresses. They are defined as followes: </p>
+
+<pre>
+ 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()
+</pre>
+
+ <p>If <c>Receiver</c> is a <c>notification_delivery_info()</c> record,
+ then the information about the notification delivery will be delivered
+ to the <c>receiver</c> via the callback functions defined by the
+ <seealso marker="snmpa_notification_delivery_info_receiver">snmpa_notification_delivery_info_receiver</seealso>
+ behaviour according to the content of the <c>notification_delivery_info()</c>
+ record. </p>
+
+ <p>The optional argument <c>Varbinds</c> defines
+ values for the objects in the notification. If no value is
+ given for an object, the <c>Agent</c> performs a get-operation
+ to retrieve the value.
+ </p>
+ <p><c>Varbinds</c> is a list of <c>Varbind</c>, where each
+ <c>Varbind</c> is one of:
+ </p>
+ <list type="bulleted">
+ <item><c>{Variable, Value}</c>, where <c>Variable</c> is the
+ symbolic name of a scalar variable referred to in the notification
+ specification.
+ </item>
+ <item><c>{Column, RowIndex, Value}</c>, where <c>Column</c>
+ is the symbolic name of a column variable.
+ <c>RowIndex</c> is a list of indices for the specified
+ element. If this is the case, the OBJECT IDENTIFIER sent
+ in the notification is the <c>RowIndex</c> appended to the OBJECT
+ IDENTIFIER for the table column. This is the OBJECT
+ IDENTIFIER which specifies the element.
+ </item>
+ <item><c>{OID, Value}</c>, where <c>OID</c> is the OBJECT
+ IDENTIFIER for an instance of an object, scalar variable,
+ or column variable.
+ </item>
+ </list>
+ <p>For example, to specify that <c>sysLocation</c> should have the
+ value <c>"upstairs"</c> in the notification, we could use one of:
+ </p>
+ <list type="bulleted">
+ <item><c>{sysLocation, "upstairs"}</c> or</item>
+ <item><c>{[1,3,6,1,2,1,1,6,0], "upstairs"}</c> or</item>
+ <item><c>{?sysLocation_instance, "upstairs"}</c> (provided
+ that the generated <c>.hrl</c> file is included)</item>
+ </list>
+ <p>If a variable in the notification is a table element, the
+ <c>RowIndex</c> for the element must be given in the
+ <c>Varbinds</c> 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.
+ </p>
+ <p>This function is asynchronous, and does not return any
+ information. If an error occurs, <c>user_err/2</c> of the error
+ report module is called and the notification is discarded.
+ </p>
+
+ <marker id="send_trap"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>send_trap(Agent,Trap,Community)</name>
+ <name>send_trap(Agent,Trap,Community,Varbinds) -> void()</name>
+ <fsummary>Send a trap</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ <v>Trap = atom()</v>
+ <v>Community = string()</v>
+ <v>Varbinds = [Varbind]</v>
+ <v>Varbind = {Variable, Value} | {Column, RowIndex, Value} | {OID, Value}</v>
+ <v>Variable = atom()</v>
+ <v>Column = atom()</v>
+ <v>OID = oid()</v>
+ <v>Value = term()</v>
+ <v>RowIndex = [int()]</v>
+ </type>
+ <desc>
+ <p>Note! This function is only kept for backwards
+ compatibility reasons. Use <c>send_notification</c> instead.
+ </p>
+ <p>Sends the trap <c>Trap</c> to the managers defined for
+ <c>Community</c> in the <c>intTrapDestTable</c> in
+ OTP-SNMPEA-MIB. The optional argument <c>Varbinds</c> defines
+ values for the objects in the trap. If no value is given for
+ an object, the <c>Agent</c> performs a get-operation to
+ retrieve the value.
+ </p>
+ <p><c>Varbinds</c> is a list of <c>Varbind</c>, where each
+ <c>Varbind</c> is one of:
+ </p>
+ <list type="bulleted">
+ <item><c>{Variable, Value}</c>, where <c>Variable</c> is the
+ symbolic name of a scalar variable referred to in the trap
+ specification.
+ </item>
+ <item><c>{Column, RowIndex, Value}</c>, where <c>Column</c>
+ is the symbolic name of a column variable.
+ <c>RowIndex</c> is a list of indices for the specified
+ element. If this is the case, the OBJECT IDENTIFIER sent
+ in the trap is the <c>RowIndex</c> appended to the OBJECT
+ IDENTIFIER for the table column. This is the OBJECT
+ IDENTIFIER which specifies the element.
+ </item>
+ <item><c>{OID, Value}</c>, where <c>OID</c> is the OBJECT
+ IDENTIFIER for an instance of an object, scalar variable,
+ or column variable.
+ </item>
+ </list>
+ <p>For example, to specify that <c>sysLocation</c> should have the
+ value <c>"upstairs"</c> in the trap, we could use one of:
+ </p>
+ <list type="bulleted">
+ <item><c>{sysLocation, "upstairs"}</c> or</item>
+ <item><c>{[1,3,6,1,2,1,1,6,0], "upstairs"}</c> or</item>
+ <item><c>{?sysLocation_instance, "upstairs"}</c> (provided
+ that the generated <c>.hrl</c> file is included)</item>
+ </list>
+ <p>If a variable in the trap is a table element, the
+ <c>RowIndex</c> for the element must be given in the
+ <c>Varbinds</c> 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.
+ </p>
+ <p>This function is asynchronous, and does not return any
+ information. If an error occurs, <c>snmp_error:user_err/2</c>
+ is called and the trap is discarded. </p>
+
+ <marker id="discovery"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>discovery(TargetName, Notification) -> {ok, ManagerEngineID} | {error, Reason}</name>
+ <name>discovery(TargetName, Notification, Varbinds) -> {ok, ManagerEngineID} | {error, Reason}</name>
+ <name>discovery(TargetName, Notification, DiscoHandler) -> {ok, ManagerEngineID} | {error, Reason}</name>
+ <name>discovery(TargetName, Notification, ContextName, Varbinds) -> {ok, ManagerEngineID} | {error, Reason}</name>
+ <name>discovery(TargetName, Notification, Varbinds, DiscoHandler) -> {ok, ManagerEngineID} | {error, Reason}</name>
+ <name>discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler) -> {ok, ManagerEngineID} | {error, Reason}</name>
+ <name>discovery(TargetName, Notification, ContextName, Varbinds, DiscoHandler, ExtraInfo) -> {ok, ManagerEngineID} | {error, Reason}</name>
+ <fsummary>Initiate the discovery process with a manager</fsummary>
+ <type>
+ <v>TargetName = string()</v>
+ <v>Notification = atom()</v>
+ <v>ContextName = string() (defaults to "")</v>
+ <v>Varbinds = varbinds()</v>
+ <v>varbinds() = [varbind()]</v>
+ <v>DiscoHandler = snmpa_discovery_handler()</v>
+ <v>ExtraInfo = term()</v>
+ <v>snmpa_discovery_handler() = Module implementing the snmpa_discovery_handler behaviour</v>
+ <v>ManagerEngineID = string()</v>
+ <v>varbind() = {Variable, Value} | {Column, RowIndex, Value} | {OID, Value}</v>
+ <v>Variable = atom()</v>
+ <v>Column = atom()</v>
+ <v>OID = oid()</v>
+ <v>Value = term()</v>
+ <v>RowIndex = [int()]</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Initiate the discovery process with the manager identified by
+ <c>TargetName</c> using the notification <c>Notification</c>. </p>
+
+ <p>This function is synchronous, which means that it will return when
+ the discovery process has been completed or failed. </p>
+
+ <p>The <c>DiscoHandler</c> module is used during the discovery
+ process. See
+ <seealso marker="snmpa_discovery_handler">discovery handler</seealso>
+ for more info. </p>
+
+ <p>The <c>ExtraInfo</c> argument is passed on to the callback functions
+ of the <c>DiscoHandler</c>. </p>
+
+ <note><p>If we are not at security-level <c>noAuthNoPriv</c>,
+ this could be complicated, since the agent will then continue
+ with stage 2, before which the usm-related updates must be
+ done. </p></note>
+
+ <note><p>The default discovery handler will require
+ additional actions by the caller and the discovery will not work
+ if the security-level is higher then <c>noAuthNoPriv</c>. </p></note>
+
+ <marker id="convert_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>convert_config(OldConfig) -> AgentConfig</name>
+ <fsummary>Convert old snmp config to new agent config</fsummary>
+ <type>
+ <v>OldConfig = list()</v>
+ <v>AgentConfig = list()</v>
+ </type>
+ <desc>
+ <p>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).</p>
+ <p>For information about the old config (<c>OldConfig</c>)
+ see the OTP R9C documentation.</p>
+ <p>For information about the current agent config
+ (<c>AgentConfig</c>), see either
+ the <seealso marker="snmp_app">SNMP application</seealso>
+ part of the reference manual or the
+ <seealso marker="snmp_config">Configuring the application</seealso>
+ chapter of the SNMP user's guide.</p>
+
+ <marker id="restart_worker"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>restart_worker() -> void()</name>
+ <name>restart_worker(Agent) -> void()</name>
+ <fsummary>Restart the worker process of a multi-threaded agent</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ </type>
+ <desc>
+ <p>Restart the worker process of a multi-threaded agent.</p>
+ <p>This is a utility function, that can be usefull when
+ e.g. debugging instrumentation functions.</p>
+
+ <marker id="restart_set_worker"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>restart_set_worker() -> void()</name>
+ <name>restart_set_worker(Agent) -> void()</name>
+ <fsummary>Restart the set worker process of a multi-threaded agent</fsummary>
+ <type>
+ <v>Agent = pid() | atom()</v>
+ </type>
+ <desc>
+ <p>Restart the set worker process of a multi-threaded agent.</p>
+ <p>This is a utility function, that can be usefull when
+ e.g. debugging instrumentation functions.</p>
+
+ <marker id="verbosity"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>verbosity(Ref,Verbosity) -> void()</name>
+ <fsummary>Assign a new verbosity for the process</fsummary>
+ <type>
+ <v>Ref = pid() | sub_agents | master_agent | net_if | mib_server | symbolic_store | note_store | local_db</v>
+ <v>Verbosity = verbosity() | {subagents, verbosity()}</v>
+ <v>verbosity() = silence | info | log | debug | trace </v>
+ </type>
+ <desc>
+ <p>Sets verbosity for the designated process. For the lowest
+ verbosity <c>silence</c>, nothing is printed. The higher the
+ verbosity, the more is printed. </p>
+ </desc>
+ </func>
+ </funcs>
+
+ <section>
+ <title>See Also</title>
+ <p>calendar(3), erlc(1) </p>
+ </section>
+
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2006</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa_conf</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_conf.xml</file>
+ </header>
+ <module>snmpa_conf</module>
+ <modulesummary>Utility functions for handling the agent config files.</modulesummary>
+ <description>
+ <p>The module <c>snmpa_conf</c> contains various utility functions to
+ used for manipulating (write/append/read) the config files of the
+ SNMP agent. </p>
+
+ <marker id="agent_entry"></marker>
+ </description>
+ <funcs>
+ <func>
+ <name>agent_entry(Tag, Val) -> agent_entry()</name>
+ <fsummary>Create an agent entry</fsummary>
+ <type>
+ <v>Tag = intAgentIpAddress | intAgentUDPPort | intAgentMaxPacketSize | snmpEngineMaxMessageSize | snmpEngineID</v>
+ <v>Val = term()</v>
+ <v>agent_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the agent config file, <c>agent.conf</c>. </p>
+ <p>The type of <c>Val</c> depends on the value of <c>Tag</c>,
+ see
+ <seealso marker="snmp_agent_config_files#agent_information">Agent Information</seealso>
+ for more info. </p>
+
+ <marker id="write_agent_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>write_agent_config(Dir, Conf) -> ok</name>
+ <name>write_agent_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the agent config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [agent_entry()]</v>
+ </type>
+ <desc>
+ <p>Write the agent config to the agent config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#agent_information">Agent Information</seealso>
+ for more info. </p>
+
+ <marker id="append_agent_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>append_agent_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the agent config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [agent_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the config to the current agent config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#agent_information">Agent Information</seealso>
+ for more info. </p>
+
+ <marker id="read_agent_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>read_agent_config(Dir) -> Conf</name>
+ <fsummary>Read the agent config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [agent_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current agent config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#agent_information">Agent Information</seealso>
+ for more info. </p>
+
+ <marker id="standard_entry"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>standard_entry(Tag, Val) -> standard_entry()</name>
+ <fsummary>Create an standard entry</fsummary>
+ <type>
+ <v>Tag = sysDescr | sysObjectID | sysContact | sysName | sysLocation | sysServices | snmpEnableAuthenTraps</v>
+ <v>Val = term()</v>
+ <v>standard_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the agent standard config file,
+ <c>standard.conf</c>. </p>
+ <p>The type of <c>Val</c> depends on the value of <c>Tag</c>,
+ see
+ <seealso marker="snmp_agent_config_files#system_information">System Information</seealso>
+ for more info. </p>
+
+ <marker id="write_standard_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>write_standard_config(Dir, Conf) -> ok</name>
+ <name>write_standard_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the agent standard config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [standard_entry()]</v>
+ </type>
+ <desc>
+ <p>Write the agent standard config to the agent standard
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#system_information">System Information</seealso>
+ for more info. </p>
+
+ <marker id="append_standard_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>append_standard_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the agent standard config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [standard_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the standard config to the current agent standard
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#system_information">System Information</seealso>
+ for more info. </p>
+
+ <marker id="read_standard_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>read_standard_config(Dir) -> Conf</name>
+ <fsummary>Read the agent standard config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [standard_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current agent standard config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#system_information">System Information</seealso>
+ for more info. </p>
+
+ <marker id="context_entry"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>context_entry(Context) -> context_entry()</name>
+ <fsummary>Create an context entry</fsummary>
+ <type>
+ <v>Context = string()</v>
+ <v>context_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the agent context config file,
+ <c>context.conf</c>. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#context">Contexts</seealso>
+ for more info. </p>
+
+ <marker id="write_context_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>write_context_config(Dir, Conf) -> ok</name>
+ <name>write_context_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the agent context(s) to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [context_entry()]</v>
+ </type>
+ <desc>
+ <p>Write the agent context config to the agent context
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#context">Contexts</seealso>
+ for more info. </p>
+
+ <marker id="append_context_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>append_context_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the agent context(s) to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [context_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the context config to the current agent context
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#context">Contexts</seealso>
+ for more info. </p>
+
+ <marker id="read_context_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>read_context_config(Dir) -> Conf</name>
+ <fsummary>Read the agent context config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [context_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current agent context config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#context">Contexts</seealso>
+ for more info. </p>
+
+ <marker id="community_entry"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>community_entry(CommunityIndex) -> community_entry()</name>
+ <name>community_entry(CommunityIndex, CommunityName, SecName, ContextName, TransportTag) -> community_entry()</name>
+ <fsummary>Create an community entry</fsummary>
+ <type>
+ <v>CommunityIndex = string()</v>
+ <v>CommunityName = string()</v>
+ <v>SecName = string()</v>
+ <v>CtxName = string()</v>
+ <v>TransportTag = string()</v>
+ <v>community_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the agent community config file,
+ <c>community.conf</c>. </p>
+ <p><c>CommunityIndex</c> must be a <em>non-empty</em> string. </p>
+ <p><c>community_entry("public")</c> translates to the following call:
+ <c>community_entry(CommunityIndex, CommunityIndex, "initial", "", "")</c>. </p>
+ <p><c>community_entry("all-rights")</c> translates to the following
+ call: <c>community_entry(CommunityIndex, CommunityIndex, CommunityIndex, "", "")</c>. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#community">Community</seealso>
+ for more info. </p>
+
+ <marker id="write_community_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>write_community_config(Dir, Conf) -> ok</name>
+ <name>write_community_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the agent community config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [community_entry()]</v>
+ </type>
+ <desc>
+ <p>Write the agent community config to the agent community
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#community">Community</seealso>
+ for more info. </p>
+
+ <marker id="append_community_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>append_community_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the agent community config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [community_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the community config to the current agent community
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#community">Community</seealso>
+ for more info. </p>
+
+ <marker id="read_community_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>read_community_config(Dir) -> Conf</name>
+ <fsummary>Read the agent community config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [community_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current agent community config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#community">Communities</seealso>
+ for more info. </p>
+
+ <marker id="target_addr_entry"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>target_addr_entry(Name, Ip, TagList, ParamsName, EngineId) -> target_addr_entry()</name>
+ <name>target_addr_entry(Name, Ip, TagList, ParamsName, EngineId, TMask) -> target_addr_entry()</name>
+ <name>target_addr_entry(Name, Ip, Udp, TagList, ParamsName, EngineId, TMask, MaxMessageSize) -> target_addr_entry()</name>
+ <name>target_addr_entry(Name, Ip, Udp, Timeout, RetryCount, TagList, ParamsName, EngineId, TMask, MaxMessageSize) -> target_addr_entry()</name>
+ <fsummary>Create an target_addr entry</fsummary>
+ <type>
+ <v>Name = string()</v>
+ <v>Ip = string()</v>
+ <v>Udp = integer()</v>
+ <v>Timeout = integer()</v>
+ <v>RetryCount = integer()</v>
+ <v>TagList = string()</v>
+ <v>ParamsName = string()</v>
+ <v>EngineId = string()</v>
+ <v>TMask = string()</v>
+ <v>MaxMessageSize = integer()</v>
+ <v>target_addr_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the agent target_addr config file,
+ <c>target_addr.conf</c>. </p>
+ <p><c>Name</c> must be a <em>non-empty</em> string. </p>
+ <p><c>target_addr_entry/5</c> translates to the following call:
+ <c>target_addr_entry(Name, Ip, TagList, ParamsName, EngineId)</c>. </p>
+ <p><c>target_addr_entry/6</c> translates to the following call:
+ <c>target_addr_entry(Name, Ip, 162, TagList, ParamsName, EngineId, TMask, 2048)</c>. </p>
+ <p><c>target_addr_entry/8</c> translates to the following call:
+ <c>target_addr_entry(Name, Ip, Udp, 1500, 3, TagList, ParamsName, EngineId, TMask, MaxMessageSize)</c>. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#target_addr">Target Address Definitions</seealso>
+ for more info. </p>
+
+ <marker id="write_target_addr_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>write_target_addr_config(Dir, Conf) -> ok</name>
+ <name>write_target_addr_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the agent target_addr config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [target_addr_entry()]</v>
+ </type>
+ <desc>
+ <p>Write the agent target_addr config to the agent target_addr
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#target_addr">Target Address Definitions</seealso>
+ for more info. </p>
+
+ <marker id="append_target_addr_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>append_target_addr_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the agent target_addr config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [target_addr_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the target_addr config to the current agent target_addr
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#target_addr">Target Address Definitions</seealso>
+ for more info. </p>
+
+ <marker id="read_target_addr_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>read_target_addr_config(Dir) -> Conf</name>
+ <fsummary>Read the agent target_addr config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [target_addr_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current agent target_addr config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#target_addr">Target Address Definitions</seealso>
+ for more info. </p>
+
+ <marker id="target_params_entry"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>target_params_entry(Name, Vsn) -> target_params_entry()</name>
+ <name>target_params_entry(Name, Vsn, SecName, SecLevel) -> target_params_entry()</name>
+ <name>target_params_entry(Name, MPModel, SecModel, SecName, SecLevel) -> target_params_entry()</name>
+ <fsummary>Create an target_params entry</fsummary>
+ <type>
+ <v>Name = string()</v>
+ <v>Vsn = v1 | v2 | v3</v>
+ <v>MPModel = v1 | v2c | v3</v>
+ <v>SecModel = v1 | v2c | usm</v>
+ <v>SecName = string()</v>
+ <v>SecLevel = noAuthNoPriv | authNoPriv | authPriv</v>
+ <v>target_params_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the agent target_params config file,
+ <c>target_params.conf</c>. </p>
+ <p><c>Name</c> must be a <em>non-empty</em> string. </p>
+ <p><c>Vsn</c> translates into <c>MPModel</c> and <c>SecModel</c> as follows:</p>
+ <pre>
+\011 Vsn = v1 => MPModel = v1, SecModel = v1
+\011 Vsn = v2 => MPModel = v2c, SecModel = v2c
+\011 Vsn = v3 => MPModel = v3, SecModel = usm
+ </pre>
+ <p><c>target_params_entry/2</c> translates to the following call:
+ <c>target_params_entry(Name, Vsn, "initial", noAuthNoPriv)</c>. </p>
+ <p><c>target_params_entry/4</c> translates to the following
+ call: <c>target_params_entry(Name, MPModel, SecModel, SecName, SecLevel)</c> where <c>MPModel</c> and
+ <c>SecModel</c> is mapped from <c>Vsn</c>, see above. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#target_params">Target Parameters Definitions</seealso>
+ for more info. </p>
+
+ <marker id="write_target_params_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>write_target_params_config(Dir, Conf) -> ok</name>
+ <name>write_target_params_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the agent target_params config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [target_params_entry()]</v>
+ </type>
+ <desc>
+ <p>Write the agent target_params config to the agent target_params
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#target_params">Target Parameters Definitions</seealso>
+ for more info. </p>
+
+ <marker id="append_target_params_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>append_target_params_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the agent target_params config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [target_params_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the target_params config to the current agent target_params
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#target_params">Target Parameters Definitions</seealso>
+ for more info. </p>
+
+ <marker id="read_target_params_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>read_target_params_config(Dir) -> Conf</name>
+ <fsummary>Read the agent target_params config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [target_params_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current agent target_params config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#target_params">Target Parameters Definitions</seealso>
+ for more info. </p>
+
+ <marker id="vacm_entry"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>vacm_s2g_entry(SecModel, SecName, GroupName) -> vacm_s2g_entry()</name>
+ <name>vacm_acc_entry(GroupName, Prefix, SecModel, SecLevel, Match, ReadView, WriteView, NotifyView) -> vacm_acc_entry()</name>
+ <name>vacm_vtf_entry(ViewIndex, ViewSubtree) -> vacm_vtf_entry()</name>
+ <name>vacm_vtf_entry(ViewIndex, ViewSubtree, ViewStatus, ViewMask) -> vacm_vtf_entry()</name>
+ <fsummary>Create an vacm entry</fsummary>
+ <type>
+ <v>SecModel = v1 | v2c | usm</v>
+ <v>SecName = string()</v>
+ <v>GroupName = string()</v>
+ <v>Prefix = string()</v>
+ <v>SecLevel = noAuthNoPriv | authNoPriv | authPriv</v>
+ <v>Match = prefix | exact</v>
+ <v>ReadView = string()</v>
+ <v>WriteView = string()</v>
+ <v>NotifyView = string()</v>
+ <v>ViewIndex = integer()</v>
+ <v>ViewSubtree = [integer()]</v>
+ <v>ViewStatus = included | excluded</v>
+ <v>ViewMask = null | [zero_or_one()]</v>
+ <v>zero_or_one() = 0 | 1</v>
+ <v>vacm_s2g_entry() = term()</v>
+ <v>vacm_acc_entry() = term()</v>
+ <v>vacm_vtf_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the agent vacm config file,
+ <c>vacm.conf</c>. </p>
+ <p><c>vacm_vtf_entry/2</c> translates to the following call:
+ <c>vacm_vtf_entry(ViewIndex, ViewSubtree, included, null)</c>. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#vacm">MIB Views for VACM</seealso>
+ for more info. </p>
+
+ <marker id="write_vacm_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>write_vacm_config(Dir, Conf) -> ok</name>
+ <name>write_vacm_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the agent vacm config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [vacm_entry()]</v>
+ <v>vacm_entry() = vacm_sg2_entry() | vacm_acc_entry() | vacm_vtf_entry()</v>
+ </type>
+ <desc>
+ <p>Write the agent vacm config to the agent vacm
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#vacm">MIB Views for VACM</seealso>
+ for more info. </p>
+
+ <marker id="append_vacm_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>append_vacm_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the agent vacm config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [vacm_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the vacm config to the current agent vacm
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#vacm">MIB Views for VACM</seealso>
+ for more info. </p>
+
+ <marker id="read_vacm_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>read_vacm_config(Dir) -> Conf</name>
+ <fsummary>Read the agent vacm config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [vacm_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current agent vacm config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#vacm">MIB Views for VACM</seealso>
+ for more info. </p>
+
+ <marker id="usm_entry"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>usm_entry(EngineId) -> usm_entry()</name>
+ <name>usm_entry(EngineID, UserName, SecName, Clone, AuthP, AuthKeyC, OwnAuthKeyC, PrivP, PrivKeyC, OwnPrivKeyC, Public, AuthKey, PrivKey) -> usm_entry()</name>
+ <fsummary>Create an usm entry</fsummary>
+ <type>
+ <v>EngineId = string()</v>
+ <v>UserName = string()</v>
+ <v>SecName = string()</v>
+ <v>Clone = zeroDotZero | [integer()]</v>
+ <v>AuthP = usmNoAuthProtocol | usmHMACMD5AuthProtocol, | usmHMACSHAAuthProtocol</v>
+ <v>AuthKeyC = string()</v>
+ <v>OwnAuthKeyC = string()</v>
+ <v>PrivP = usmNoPrivProtocol | usmDESPrivProtocol | usmAesCfb128Protocol</v>
+ <v>PrivKeyC = string()</v>
+ <v>OwnPrivKeyC = string()</v>
+ <v>Public = string()</v>
+ <v>AuthKey = [integer()]</v>
+ <v>PrivKey = [integer()]</v>
+ <v>usm_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the agent vacm config file,
+ <c>vacm.conf</c>. </p>
+ <p><c>usm_entry/1</c> translates to the following call:
+ <c>usm_entry("initial", "initial", zeroDotZero, usmNoAuthProtocol, "", "", usmNoPrivProtocol, "", "", "", "", "")</c>. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#usm">Security data for USM</seealso>
+ for more info. </p>
+
+ <marker id="write_usm_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>write_usm_config(Dir, Conf) -> ok</name>
+ <name>write_usm_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the agent usm config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [usm_entry()]</v>
+ </type>
+ <desc>
+ <p>Write the agent usm config to the agent usm
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#usm">Security data for USM</seealso>
+ for more info. </p>
+
+ <marker id="append_usm_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>append_usm_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the agent usm config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [usm_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the usm config to the current agent vacm
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#usm">Security data for USM</seealso>
+ for more info. </p>
+ <marker id="read_usm_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>read_usm_config(Dir) -> Conf</name>
+ <fsummary>Read the agent usm config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [usm_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current agent usm config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#usm">Security data for USM</seealso>
+ for more info. </p>
+
+ <marker id="notify_entry"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>notify_entry(Name, Tag, Type) -> notify_entry()</name>
+ <fsummary>Create an notify entry</fsummary>
+ <type>
+ <v>Name = string()</v>
+ <v>Tag = string()</v>
+ <v>Type = trap | inform</v>
+ <v>community_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the agent notify config file,
+ <c>notify.conf</c>. </p>
+ <p><c>Name</c> must be a <em>non-empty</em> string. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#notify">Notify Definitions</seealso>
+ for more info. </p>
+
+ <marker id="write_notify_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>write_notify_config(Dir, Conf) -> ok</name>
+ <name>write_notify_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the agent notify config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [notify_entry()]</v>
+ </type>
+ <desc>
+ <p>Write the agent notify config to the agent notify
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#notify">Notify Definitions</seealso>
+ for more info. </p>
+
+ <marker id="append_notify_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>append_notify_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the agent notify config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [notify_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the notify config to the current agent notify
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#notify">Notify Definitions</seealso>
+ for more info. </p>
+
+ <marker id="read_notify_config"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>read_notify_config(Dir) -> Conf</name>
+ <fsummary>Read the agent notify config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [community_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current agent notify config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_agent_config_files#notify">Notify Definitions</seealso>
+ for more info. </p>
+ <marker id="end"></marker>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa_discovery_handler</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_discovery_handler.xml</file>
+ </header>
+ <module>snmpa_discovery_handler</module>
+ <modulesummary>Behaviour module for the SNMP agent discovery handler.</modulesummary>
+ <description>
+ <p>This module defines the behaviour of the agent discovery
+ handler. A <c>snmpa_discovery_handler</c> compliant module
+ must export the following functions: </p>
+ <list type="bulleted">
+ <item>
+ <p><seealso marker="#stage1_finish">stage1_finish/2</seealso></p>
+ </item>
+ </list>
+ <p>The semantics of them and their exact signatures are explained
+ below. </p>
+
+ <marker id="stage1_finish"></marker>
+ </description>
+
+ <funcs>
+ <func>
+ <name>stage1_finish(TargetName, ManagerEngineID, ExtraInfo) -> ignore | {ok, usm_entry() | [usm_entry()]} | {ok, usm_entry() | [usm_entry()], NewExtraInfo}</name>
+ <fsummary>Discovery stage 1 finish</fsummary>
+ <type>
+ <v>TargetName = string()</v>
+ <v>ManagerEngineID = string()</v>
+ <v>ExtraInfo = term()</v>
+ <v>usm_entry() = tuple() compatible with usm.conf</v>
+ <v>NewExtraInfo = term()</v>
+ </type>
+ <desc>
+ <p>This function is called at the end of stage 1 of the
+ discovery process. It should return either the atom
+ <c>ignore</c> or <c>{ok, usm_entry() | [usm_entry()]}</c>. See
+ <seealso marker="snmp_agent_config_files#usm">usm_entry()</seealso>
+ and
+ <seealso marker="snmpa_conf#usm_entry">usm_entry/13</seealso>
+ for more info. </p>
+
+ <p>If the function returns <c>ignore</c>, then it is assumed that
+ either: </p>
+
+ <list type="bulleted">
+ <item>The caller (of the discovery function) will make the
+ needed updates later. </item>
+ <item>The callback function itself did the updates. </item>
+ </list>
+
+ <p>In either case, the agent will do nothing, but return
+ the retrieved ManagerEngineID (see
+ <seealso marker="snmpa#discovery">discovery</seealso>
+ for more info) and possible continue with stage 2 of
+ the discovery process. </p>
+
+ <p>The <c>ExtraInfo</c> argument is passed on from the
+ <seealso marker="snmpa#discovery">discovery</seealso>
+ function. </p>
+
+ <p>This function may return an updated <c>NewExtraInfo</c>
+ that will be used in subsequent calls to the callback
+ functions. Intended for future use. </p>
+
+ <p>The purpose of this function is to generate the usm-
+ related security data needed for usm processing in the
+ agent. Specifically, updating the usmUserTable. </p>
+
+ <p>When an <c>usm_entry()</c> tuple (or a list of such
+ tuples) is returned, this data is then added to the
+ <c>usmUserTable</c> by the (master-) agent. </p>
+
+ <p>When an <c>usm_entry()</c> tuple (or a list of such
+ tuples) is returned, this data is then added to the
+ <c>usmUserTable</c> by the (master-) agent. </p>
+
+ <note><p>Note that the function does not check if this entry
+ already exists. </p></note>
+
+ <note><p>Note that this function is executed in the context of
+ the master-agent process. </p></note>
+
+ </desc>
+ </func>
+
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2002</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa_error</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_error.xml</file>
+ </header>
+ <module>snmpa_error</module>
+ <modulesummary>Functions for Reporting SNMP Errors</modulesummary>
+ <description>
+ <marker id="desc"></marker>
+ <p>The module <c>snmpa_error</c> 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.
+ </p>
+ <p>Two simple implementation(s) is provided with the
+ toolkit; the modules
+ <seealso marker="snmpa_error_logger">snmpa_error_logger</seealso>
+ which is the default and
+ <seealso marker="snmpa_error_io">snmpa_error_io</seealso>.
+ </p>
+ <p>The error report module is configured using the directive
+ <c>error_report_mod</c>, see
+ <seealso marker="snmp_config#configuration_params">configuration parameters</seealso>.
+ </p>
+ </description>
+ <funcs>
+ <func>
+ <name>config_err(Format, Args) -> void()</name>
+ <fsummary>Called if a configuration error occurs</fsummary>
+ <type>
+ <v>Format = string()</v>
+ <v>Args = list()</v>
+ </type>
+ <desc>
+ <p>The function is called if an error occurs during the
+ configuration phase, for example if a syntax error is found in
+ a configuration file.
+ </p>
+ <p><c>Format</c> and <c>Args</c> are as in
+ <c>io:format(Format, Args)</c>.</p>
+ </desc>
+ </func>
+ <func>
+ <name>user_err(Format, Args) -> void()</name>
+ <fsummary>Called if a user related error occurs</fsummary>
+ <type>
+ <v>Format = string()</v>
+ <v>Args = list()</v>
+ </type>
+ <desc>
+ <p>The function is called if a user related error occurs at
+ run-time, for example if a user defined instrumentation
+ function returns erroneous.
+ </p>
+ <p><c>Format</c> and <c>Args</c> are as in
+ <c>io:format(Format, Args)</c>.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2002</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa_error_io</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_error_io.xml</file>
+ </header>
+ <module>snmpa_error_io</module>
+ <modulesummary>Functions for Reporting SNMP Errors on stdio</modulesummary>
+ <description>
+ <p>The module <c>snmpa_error_io</c> implements the
+ <c>snmp_error_report</c> behaviour
+ (see <seealso marker="snmpa_error_report">snmpa_error_report</seealso>)
+ containing two callback functions which are called in order to
+ report SNMP errors.
+ </p>
+ <p>This module provides a simple mechanism for reporting SNMP
+ errors. Errors are written to stdout using the <c>io</c> module.
+ It is provided as an simple example.
+ </p>
+ <p>This module needs to be explicitly configured, see
+ <seealso marker="snmpa_error#desc">snmpa_error</seealso> and
+ <seealso marker="snmp_config#configuration_params">configuration parameters</seealso>.
+ </p>
+ </description>
+ <funcs>
+ <func>
+ <name>config_err(Format, Args) -> void()</name>
+ <fsummary>Called if a configuration error occurs</fsummary>
+ <type>
+ <v>Format = string()</v>
+ <v>Args = list()</v>
+ </type>
+ <desc>
+ <p>The function is called if an error occurs during the
+ configuration phase, for example if a syntax error is found in
+ a configuration file.
+ </p>
+ <p><c>Format</c> and <c>Args</c> are as in
+ <c>io:format(Format, Args)</c>.</p>
+ </desc>
+ </func>
+ <func>
+ <name>user_err(Format, Args) -> void()</name>
+ <fsummary>Called if a user related error occurs</fsummary>
+ <type>
+ <v>Format = string()</v>
+ <v>Args = list()</v>
+ </type>
+ <desc>
+ <p>The function is called if a user related error occurs at
+ run-time, for example if a user defined instrumentation
+ function returns erroneous.
+ </p>
+ <p><c>Format</c> and <c>Args</c> are as in
+ <c>io:format(Format, Args)</c>.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1996</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa_error_logger</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_error_logger.xml</file>
+ </header>
+ <module>snmpa_error_logger</module>
+ <modulesummary>Functions for Reporting SNMP Errors through the error_logger</modulesummary>
+ <description>
+ <p>The module <c>snmpa_error_logger</c> implements the
+ <c>snmpa_error_report</c> behaviour
+ (see <seealso marker="snmpa_error_report">snmpa_error_report</seealso>)
+ containing two callback functions which are called in order to
+ report SNMP errors.
+ </p>
+ <p>This module provides a simple mechanism for reporting SNMP
+ errors. Errors are sent to the <c>error_logger</c> after a
+ size check. Messages are truncated after 1024 chars.
+ It is provided as an example.
+ </p>
+ <p>This module is the default error report module, but can be
+ explicitly configured, see
+ <seealso marker="snmpa_error#desc">snmpa_error</seealso> and
+ <seealso marker="snmp_config#configuration_params">configuration parameters</seealso>.
+ </p>
+ </description>
+ <funcs>
+ <func>
+ <name>config_err(Format, Args) -> void()</name>
+ <fsummary>Called if a configuration error occurs</fsummary>
+ <type>
+ <v>Format = string()</v>
+ <v>Args = list()</v>
+ </type>
+ <desc>
+ <p>The function is called if an error occurs during the
+ configuration phase, for example if a syntax error is found in
+ a configuration file.
+ </p>
+ <p><c>Format</c> and <c>Args</c> are as in
+ <c>io:format(Format, Args)</c>.</p>
+ </desc>
+ </func>
+ <func>
+ <name>user_err(Format, Args) -> void()</name>
+ <fsummary>Called if a user related error occurs</fsummary>
+ <type>
+ <v>Format = string()</v>
+ <v>Args = list()</v>
+ </type>
+ <desc>
+ <p>The function is called if a user related error occurs at
+ run-time, for example if a user defined instrumentation
+ function returns erroneous.
+ </p>
+ <p><c>Format</c> and <c>Args</c> are as in
+ <c>io:format(Format, Args)</c>.</p>
+ </desc>
+ </func>
+ </funcs>
+
+ <section>
+ <title>See Also</title>
+ <p>error_logger(3)</p>
+ </section>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa_error_report</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_error_report.xml</file>
+ </header>
+ <module>snmpa_error_report</module>
+ <modulesummary>Behaviour module for reporting SNMP agent errors</modulesummary>
+ <description>
+ <marker id="desc"></marker>
+ <p>This module defines the behaviour of the agent error reporting.
+ A <c>snmpa_error_report</c> compliant module
+ must export the following functions: </p>
+ <list type="bulleted">
+ <item>
+ <p>config_err/2</p>
+ </item>
+ <item>
+ <p>user_err/2</p>
+ </item>
+ </list>
+ <p>The semantics of them and their exact signatures are explained
+ below. </p>
+ </description>
+ <funcs>
+ <func>
+ <name>config_err(Format, Args) -> void()</name>
+ <fsummary>Called if a configuration error occurs</fsummary>
+ <type>
+ <v>Format = string()</v>
+ <v>Args = list()</v>
+ </type>
+ <desc>
+ <p>The function is called if an error occurs during the
+ configuration phase, for example if a syntax error is found in
+ a configuration file.
+ </p>
+ <p><c>Format</c> and <c>Args</c> are as in
+ <c>io:format(Format, Args)</c>.</p>
+ </desc>
+ </func>
+ <func>
+ <name>user_err(Format, Args) -> void()</name>
+ <fsummary>Called if a user related error occurs</fsummary>
+ <type>
+ <v>Format = string()</v>
+ <v>Args = list()</v>
+ </type>
+ <desc>
+ <p>The function is called if a user related error occurs at
+ run-time, for example if a user defined instrumentation
+ function returns erroneous.
+ </p>
+ <p><c>Format</c> and <c>Args</c> are as in
+ <c>io:format(Format, Args)</c>.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1996</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa_local_db</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_local_db.xml</file>
+ </header>
+ <module>snmpa_local_db</module>
+ <modulesummary>The SNMP built-in database</modulesummary>
+ <description>
+ <p>The module <c>snmpa_local_db</c> 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.
+ </p>
+ <p>There is a scaling problem with this database.
+ </p>
+ <list type="bulleted">
+ <item>Insertions and deletions are inefficient for large tables.
+ </item>
+ </list>
+ <p>This problem is best solved by using Mnesia instead.
+ </p>
+ <p>The following functions describe the interface to
+ <c>snmpa_local_db</c>. Each function has a Mnesia equivalent.
+ The argument <c>NameDb</c> is a tuple <c>{Name, Db}</c> where
+ <c>Name</c> is the symbolic name of the managed object (as defined
+ in the MIB), and <c>Db</c> is either <c>volatile</c> or
+ <c>persistent</c>. <c>mnesia</c> is not possible since all these
+ functions are <c>snmpa_local_db</c> specific.
+ </p>
+ </description>
+
+ <section>
+ <title>Common Data Types</title>
+ <p>In the functions defined below, the following types are
+ used:
+ </p>
+ <list type="bulleted">
+ <item>
+ <p><c>NameDb = {Name, Db}</c></p>
+ </item>
+ <item>
+ <p><c>Name = atom(), Db = volatile | persistent</c></p>
+ </item>
+ <item>
+ <p><c>RowIndex = [int()]</c></p>
+ </item>
+ <item>
+ <p><c>Cols = [Col] | [{Col, Value}], Col = int(), Value = term()</c></p>
+ </item>
+ </list>
+ <p>where <c>RowIndex</c> denotes the last part of the OID, that
+ specifies the index of the row in the table. <c>Cols</c> 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.
+ </p>
+ </section>
+ <funcs>
+ <func>
+ <name>dump() -> ok | {error, Reason}</name>
+ <fsummary>Dump the database to disk</fsummary>
+ <type>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>This function can be used to manually dump the database
+ to file.</p>
+ </desc>
+ </func>
+ <func>
+ <name>match(NameDb, Pattern)</name>
+ <fsummary>Perform a match on the table</fsummary>
+ <desc>
+ <p>Performs an ets/dets matching on the table.
+ See Stdlib documentation, module ets, for a description of
+ <c>Pattern</c> and the return values.</p>
+ </desc>
+ </func>
+ <func>
+ <name>print()</name>
+ <name>print(TableName)</name>
+ <name>print(TableName, Db)</name>
+ <fsummary>Print the database to screen</fsummary>
+ <type>
+ <v>TableName = atom()</v>
+ </type>
+ <desc>
+ <p>Prints the contents of the database on
+ screen. This is useful for debugging since the
+ <c>STANDARD-MIB</c> and <c>OTP-SNMPEA-MIB</c>
+ (and maybe your own MIBs) are stored in <c>snmpa_local_db</c>.
+ </p>
+ <p><c>TableName</c> is an atom for a table in the database.
+ When no name is supplied, the whole database is shown.</p>
+ </desc>
+ </func>
+ <func>
+ <name>table_create(NameDb) -> bool()</name>
+ <fsummary>Create a table</fsummary>
+ <desc>
+ <p>Creates a table. If the table already exist, the old copy
+ is destroyed.
+ </p>
+ <p>Returns <c>false</c> if the <c>NameDb</c> argument is
+ incorrectly specified, <c>true</c> otherwise.</p>
+ </desc>
+ </func>
+ <func>
+ <name>table_create_row(NameDb, RowIndex, Row) -> bool()</name>
+ <fsummary>Create a row in a table</fsummary>
+ <type>
+ <v>Row = {Val1, Val2, ..., ValN}</v>
+ <v>Val1 = Val2 = ... = ValN = term()</v>
+ </type>
+ <desc>
+ <p>Creates a row in a table. <c>Row</c> is a tuple with
+ values for all columns, including the index columns.</p>
+ </desc>
+ </func>
+ <func>
+ <name>table_delete(NameDb) -> void()</name>
+ <fsummary>Delete a table</fsummary>
+ <desc>
+ <p>Deletes a table.</p>
+ </desc>
+ </func>
+ <func>
+ <name>table_delete_row(NameDb, RowIndex) -> bool()</name>
+ <fsummary>Delete the row in the table</fsummary>
+ <desc>
+ <p>Deletes the row in the table.</p>
+ </desc>
+ </func>
+ <func>
+ <name>table_exists(NameDb) -> bool()</name>
+ <fsummary>Check if a table exists</fsummary>
+ <desc>
+ <p>Checks if a table exists.</p>
+ </desc>
+ </func>
+ <func>
+ <name>table_get_row(NameDb, RowIndex) -> Row | undefined</name>
+ <fsummary>Get a row from the table</fsummary>
+ <type>
+ <v>Row = {Val1, Val2, ..., ValN}</v>
+ <v>Val1 = Val2 = ... = ValN = term()</v>
+ </type>
+ <desc>
+ <p><c>Row</c> is a tuple with values for all columns,
+ including the index columns.</p>
+ </desc>
+ </func>
+ </funcs>
+
+ <section>
+ <title>See Also</title>
+ <p>ets(3), dets(3), snmp_generic(3)
+ </p>
+ </section>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1999</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa_mpd</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_mpd.xml</file>
+ </header>
+ <module>snmpa_mpd</module>
+ <modulesummary>Message Processing and Dispatch module for the SNMP agent</modulesummary>
+ <description>
+ <p>The module <c>snmpa_mpd</c> 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
+ (<seealso marker="snmp_agent_netif">Definition of Agent Net if</seealso>).
+ </p>
+
+ <marker id="init"></marker>
+ </description>
+
+ <funcs>
+ <func>
+ <name>init(Vsns) -> mpd_state()</name>
+ <fsummary>Initialize the MPD module</fsummary>
+ <type>
+ <v>Vsns = [Vsn]</v>
+ <v>Vsn = v1 | v2 | v3</v>
+ </type>
+ <desc>
+ <p>This function can be called from the net_if process at start-up.
+ The options list defines which versions to use.
+ </p>
+ <p>It also initializes some SNMP counters.
+ </p>
+
+ <marker id="process_packet"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>process_packet(Packet, TDomain, TAddress, State) -> {ok, Vsn, Pdu, PduMS, ACMData} | {discarded, Reason} | {discovery, DiscoPacket}</name>
+ <fsummary>Process a packet received from the network</fsummary>
+ <type>
+ <v>Packet = binary()</v>
+ <v>TDomain = snmpUDPDomain</v>
+ <v>TAddress = {Ip, Udp}</v>
+ <v>Ip = {integer(), integer(), integer(), integer()}</v>
+ <v>Udp = integer()</v>
+ <v>State = mpd_state()</v>
+ <v>Vsn = 'version-1' | 'version-2' | 'version-3'</v>
+ <v>Pdu = #pdu</v>
+ <v>PduMs = integer()</v>
+ <v>ACMData = acm_data()</v>
+ <v>Reason = term()</v>
+ <v>DiscoPacket = binary()</v>
+ </type>
+ <desc>
+ <p>Processes an incoming packet. Performs authentication and
+ decryption as necessary. The return values should be passed the
+ agent.</p>
+
+ <marker id="generate_response_msg"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>generate_response_msg(Vsn, RePdu, Type, ACMData) -> {ok, Packet} | {discarded, Reason}</name>
+ <fsummary>Generate a response packet to be sent to the network</fsummary>
+ <type>
+ <v>Vsn = 'version-1' | 'version-2' | 'version-3'</v>
+ <v>RePdu = #pdu</v>
+ <v>Type = atom()</v>
+ <v>ACMData = acm_data()</v>
+ <v>Packet = binary()</v>
+ </type>
+ <desc>
+ <p>Generates a possibly encrypted response packet to be sent to the
+ network. <c>Type</c> is the <c>#pdu.type</c> of the original
+ request.</p>
+
+ <marker id="generate_msg"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>generate_msg(Vsn, Pdu, MsgData, To) -> {ok, PacketsAndAddresses} | {discarded, Reason}</name>
+ <fsummary>Generate a request message to be sent to the network</fsummary>
+ <type>
+ <v>Vsn = 'version-1' | 'version-2' | 'version-3'</v>
+ <v>Pdu = #pdu</v>
+ <v>MsgData = msg_data()</v>
+ <v>To = [dest_addrs()]</v>
+ <v>PacketsAndAddresses = [{TDomain, TAddress, Packet}]</v>
+ <v>TDomain = snmpUDPDomain</v>
+ <v>TAddress = {Ip, Udp}</v>
+ <v>Ip = {integer(), integer(), integer(), integer()}</v>
+ <v>Udp = integer()</v>
+ <v>Packet = binary()</v>
+ </type>
+ <desc>
+ <p>Generates a possibly encrypted request packet to be sent to the
+ network.
+ </p>
+ <p><c>MsgData</c> is the message specific data used in
+ the SNMP message. This value is received in a <c>send_pdu</c>
+ or <c>send_pdu_req</c> message from the agent. In SNMPv1 and
+ SNMPv2c, this message data is the community string. In
+ SNMPv3, it is the context information.
+ <c>To</c> is a list of the destination addresses and
+ their corresponding security parameters. This value is
+ also received from the requests mentioned above.
+ </p>
+
+ <marker id="discarded_pdu"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>discarded_pdu(Variable) -> void()</name>
+ <fsummary>Increment the variable associated with a discarded pdu</fsummary>
+ <type>
+ <v>Variable = atom()</v>
+ </type>
+ <desc>
+ <p>Increments the variable associated with a discarded pdu.
+ This function can be used when the net_if process receives a
+ <c>discarded_pdu</c> message from the agent.
+ </p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa_network_interface</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_network_interface.xml</file>
+ </header>
+ <module>snmpa_network_interface</module>
+ <modulesummary>Behaviour module for the SNMP agent network interface.</modulesummary>
+ <description>
+ <p>This module defines the behaviour of the agent network
+ interface. A <c>snmpa_network_interface</c> compliant module
+ must export the following functions: </p>
+ <list type="bulleted">
+ <item>
+ <p><seealso marker="#start_link">start_link/4</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#info">info/1</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#get_log_type">get_log_type/1</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#set_log_type">set_log_type/2</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#verbosity">verbosity/2</seealso></p>
+ </item>
+ </list>
+ <p>The semantics of them and their exact signatures are explained
+ below. </p>
+ <p>But this is not enough. There is also a set of <em>mandatory</em>
+ messages which the network interface entity must be able to
+ receive and be able to send. This is described in chapter
+ <seealso marker="snmp_agent_netif">snmp_agent_netif</seealso>.
+ </p>
+
+ <marker id="start_link"></marker>
+ </description>
+
+ <funcs>
+ <func>
+ <name>start_link(Prio, NoteStore, MasterAgent, Opts) -> {ok, Pid} | {error, Reason}</name>
+ <fsummary>Start-link the network interface process</fsummary>
+ <type>
+ <v>Prio = priority()</v>
+ <v>NoteStore = pid()</v>
+ <v>MasterAgent = pid()</v>
+ <v>Opts = [opt()]</v>
+ <v>opt() = {verbosity, verbosity()} | {versions, versions()} | term()</v>
+ <v>versions() = [version()]</v>
+ <v>version() = v1 | v2 | v3</v>
+ </type>
+ <desc>
+ <p>Start-link the network interface process.</p>
+ <p><c>NoteStore</c> is the pid of the note-store process and
+ <c>MasterAgent</c> is the pid of the master-agent process.</p>
+ <p><c>Opts</c> is an (basically) implementation dependent list of
+ options to the network interface process. There are however
+ a number of options which <em>must</em> be handled:
+ <c>versions</c> and <c>verbosity</c>.</p>
+
+ <marker id="info"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>info(Pid) -> [{Key, Value}]</name>
+ <fsummary>Return information about the running network interface process</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ </type>
+ <desc>
+ <p>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.</p>
+ <p>The info returned by this function is returned together with other
+ info collected by the agent when the
+ <seealso marker="snmpa#info">info</seealso> function is called
+ (tagged with with the key <c>net_if</c>).</p>
+
+ <marker id="verbosity"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>verbosity(Pid, Verbosity) -> void()</name>
+ <fsummary>Change the verbosity of a running network interface process</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ <v>Verbosity = verbosity()</v>
+ </type>
+ <desc>
+ <p>Change the verbosity of a running network interface process.</p>
+
+ <marker id="get_log_type"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>get_log_type(Pid) -> {ok, LogType} | {error, Reason}</name>
+ <fsummary>Get the Audit Trail Log type</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ <v>LogType = atl_type()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>The Audit Trail Log is managed by the network interface process.
+ So, it is this process that has to retrieve the actual log-type. </p>
+<!--
+ <p>See
+ <seealso marker="snmpa#get_log_type">get_log_type</seealso>
+ for more info. </p>
+-->
+
+ <marker id="set_log_type"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>set_log_type(Pid, NewType) -> {ok, OldType} | {error, Reason}</name>
+ <fsummary>Change the Audit Trail Log type</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ <v>NewType = OldType = atl_type()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>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. </p>
+ <p>See
+ <seealso marker="snmpa#set_log_type">set_log_type</seealso>
+ for more info. </p>
+ </desc>
+ </func>
+
+ </funcs>
+
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2007</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa_network_interface_filter</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_network_interface_filter.xml</file>
+ </header>
+ <module>snmpa_network_interface_filter</module>
+ <modulesummary>Behaviour module for the SNMP agent network-interface filter.</modulesummary>
+ <description>
+ <p>This module defines the behaviour of the agent network interface
+ filter. A <c>snmpa_network_interface_filter</c> compliant module
+ must export the following functions: </p>
+ <list type="bulleted">
+ <item>
+ <p><seealso marker="#accept_recv">accept_recv/2</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#accept_send">accept_send/2</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#accept_recv_pdu">accept_recv_pdu/3</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#accept_send_pdu">accept_send_pdu/2</seealso></p>
+ </item>
+ </list>
+ <p>The semantics of them and their exact signatures are explained
+ below. </p>
+ <p>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: </p>
+ <list type="bulleted">
+ <item>
+ <p>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).</p>
+ </item>
+ <item>
+ <p>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).</p>
+ </item>
+ </list>
+ <p>Note that the network interface filter is something which is used
+ by the network interface implementation provided by the application
+ (<c>snmpa_net_if</c>). The default filter accepts all messages.</p>
+ <p>A network interface filter can e.g. be used during testing or for load
+ regulation. If the intended use is load regulation, see also
+ <seealso marker="snmp_app#configuration_params">req_limit</seealso> and
+ the function
+ <seealso marker="snmpa#register_notification_filter">register_notification_filter</seealso>. </p>
+ </description>
+
+ <section>
+ <title>DATA TYPES</title>
+ <code type="none">
+port() = integer() > 0
+pdu_type() = 'get-request' | 'get-next-request' | 'get-response' | 'set-request' | trap | 'get-bulk-request' | 'inform-request' | report
+ </code>
+ <marker id="accept_recv"></marker>
+ </section>
+ <funcs>
+ <func>
+ <name>accept_recv(Ip, Port) -> boolean()</name>
+ <fsummary>Shall the received message be accepted</fsummary>
+ <type>
+ <v>Ip = ip_address()</v>
+ <v>Port = port()</v>
+ </type>
+ <desc>
+ <p>Called at the reception of a message (before <em>any</em> processing
+ has been done).</p>
+ <p>For the message to be discarded, the function <em>must</em> return
+ <em>false</em>. </p>
+ <marker id="accept_send"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>accept_send(Ip, Port) -> boolean()</name>
+ <fsummary>Shall the message be sent</fsummary>
+ <type>
+ <v>Ip = ip_address()</v>
+ <v>Port = port()</v>
+ </type>
+ <desc>
+ <p>Called before the sending of a message (after <em>all</em> processing
+ has been done).</p>
+ <p>For the message to be discarded, the function <em>must</em> return
+ <em>false</em>. </p>
+ <marker id="accept_recv_pdu"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>accept_recv_pdu(Ip, Port, PduType) -> boolean()</name>
+ <fsummary>Shall the received pdu be accepted</fsummary>
+ <type>
+ <v>Ip = ip_address()</v>
+ <v>Port = port()</v>
+ <v>PduType = pdu_type()</v>
+ </type>
+ <desc>
+ <p>Called after the basic message processing (MPD) has been done,
+ but before the pdu is handed over to the master-agent for
+ primary processing.</p>
+ <p>For the pdu to be discarded, the function <em>must</em> return
+ <em>false</em>. </p>
+ <marker id="accept_send_pdu"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>accept_send_pdu(Targets, PduType) -> Reply</name>
+ <fsummary>Shall the pdu be sent</fsummary>
+ <type>
+ <v>Targets = targets()</v>
+ <v>targets() = [target()]</v>
+ <v>target() = {ip_address(), port()}</v>
+ <v>PduType = pdu_type() > 0</v>
+ <v>Reply = boolean() | NewTargets</v>
+ <v>NewTargets = targets()</v>
+ </type>
+ <desc>
+ <p>Called before the basic message processing (MPD) is done,
+ when a pdu has been received from the master-agent.</p>
+ <p>For the message to be discarded all together, the function
+ <em>must</em> return <em>false</em>. </p>
+ <p>Note that it is possible for this function to filter out targets
+ (but <em>not</em> add it's own) by returning an updated
+ <c>Targets</c> list (<c>NewTargets</c>). </p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2008</year>
+ <year>2009</year>
+ <holder>Ericsson AB, All Rights Reserved</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+ </legalnotice>
+
+ <title>snmpa_notification_delivery_info_receiver</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_notification_delivery_info_receiver.xml</file>
+ </header>
+ <module>snmpa_notification_delivery_info_receiver</module>
+ <modulesummary>
+ Behaviour module for the SNMP agent notification delivery
+ information receiver.
+ </modulesummary>
+ <description>
+ <p>This module defines the behaviour of the notification
+ delivery information receiver. </p>
+ <p>A <c>snmpa_notification_delivery_info_receiver</c> compliant module
+ must export the following functions: </p>
+ <list type="bulleted">
+ <item>
+ <p><seealso marker="#delivery_targets">delivery_targets/3</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#delivery_info">delivery_info/4</seealso></p>
+ </item>
+ </list>
+ <p>The semantics of them and their exact signatures are explained
+ below. </p>
+
+ </description>
+
+ <section>
+ <title>DATA TYPES</title>
+ <code type="none"><![CDATA[
+address() = A 4-tuple
+ ]]></code>
+
+ <marker id="delivery_targets"></marker>
+ </section>
+
+ <funcs>
+ <func>
+ <name>delivery_targets(Tag, Targets, Extra) -> void()</name>
+ <fsummary>Inform about target addresses</fsummary>
+ <type>
+ <v>Tag = term()</v>
+ <v>Targets = [target()]</v>
+ <v>target() = {Address, Port}</v>
+ <v>Address = address()</v>
+ <v>Port = integer()</v>
+ <v>Extra = term()</v>
+ </type>
+ <desc>
+ <p>Inform about target addresses. </p>
+ <p>This is the first function called when a notification delivery is
+ in progress. It informs the <c>receiver</c> which targets will
+ get the notification. The result of the delivery will be
+ provided via successive calls to <c>delivery_info/4</c> function,
+ see below.</p>
+
+ <marker id="delivery_info"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>delivery_info(Tag, Target, DeliveryResult, Extra) -> void()</name>
+ <fsummary>Inform about delivery result</fsummary>
+ <type>
+ <v>Tag = term()</v>
+ <v>Target = target()</v>
+ <v>target() = {Address, Port}</v>
+ <v>Address = address()</v>
+ <v>Port = integer()</v>
+ <v>DeliveryResult = delivery_result()</v>
+ <v>delivery_result() = no_response | got_response</v>
+ <v>Extra = term()</v>
+ </type>
+ <desc>
+ <p>Inform about delivery result.</p>
+ <p>This function is called for each target in the <c>Targets</c>
+ argument of the <c>delivery_targets/3</c> function, see above. </p>
+ <p>The purpose is to inform the <c>receiver</c> of the
+ result of the delivery (was the notification acknowledged or
+ not) for each target.</p>
+
+ </desc>
+ </func>
+
+ </funcs>
+
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa_notification_filter</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_notification_filter.xml</file>
+ </header>
+ <module>snmpa_notification_filter</module>
+ <modulesummary>Behaviour module for the SNMP agent notification filters.</modulesummary>
+ <description>
+ <p>This module defines the behaviour of the agent notification
+ filters. A <c>snmpa_notification_filter</c> compliant module
+ must export the following functions: </p>
+ <list type="bulleted">
+ <item>
+ <p>handle_notification/2</p>
+ </item>
+ </list>
+ <p>The semantics of them and their exact signatures are explained
+ below. </p>
+ <p>The purpose of notification filters is to allow for modification
+ and/or suppression of a notification.</p>
+ <p>A misbehaving filter will be removed.</p>
+ </description>
+ <funcs>
+ <func>
+ <name>handle_notification(Notif, Data) -> Reply</name>
+ <fsummary>Handle a notification</fsummary>
+ <type>
+ <v>Reply = send | {send, NewNotif} | dont_send</v>
+ <v>Notif = NewNotif = notification() | trap()</v>
+ <v>Data = term()</v>
+ </type>
+ <desc>
+ <p>Handle a notification to be sent. The filter can either
+ accept the notification as is, return <c>send</c>, modify
+ the notification, return <c>{send, NewNotif}</c> or
+ suppress the notification, return <c>dont_send</c>.</p>
+ <p><c>Data</c> is supplied at filter registration time,
+ see <seealso marker="snmpa#register_notification_filter">register_notification_filter</seealso>.
+ </p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpa_supervisor</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpa_supervisor.xml</file>
+ </header>
+ <module>snmpa_supervisor</module>
+ <modulesummary>A supervisor for the SNMP agent Processes</modulesummary>
+ <description>
+ <p>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).
+ </p>
+ </description>
+ <funcs>
+ <func>
+ <name>start_sub_sup(Opts) -> {ok, pid()} | {error, {already_started, pid()}} | {error, Reason}</name>
+ <fsummary>Start the SNMP supervisor for sub-agents only</fsummary>
+ <type>
+ <v>Opts = [opt()]</v>
+ <v>opt() = {db_dir, string()} | ...</v>
+ </type>
+ <desc>
+ <p>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 <c>start_sub_agent/3</c>.
+ </p>
+ <p><c>db_dir</c> is mandatory.</p>
+ <p>See <seealso marker="snmp_config#configuration_params">configuration parameters</seealso> for
+ a description of the options.</p>
+ </desc>
+ </func>
+ <func>
+ <name>start_master_sup(Opts) -> {ok, pid()} | {error, {already_started, pid()}} | {error, Reason}</name>
+ <fsummary>Start the SNMP supervisor for all agents</fsummary>
+ <type>
+ <v>Opts = [opt()]</v>
+ <v>opt() = {db_dir, string()} | {config, ConfOpts()} | ...</v>
+ <v>ConfOpts = [conf_opts()]</v>
+ <v>conf_opts() = {dir, string()} | ...</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>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
+ <c>start_subagent/3</c>.
+ </p>
+ <p><c>db_dir</c> is mandatory.</p>
+ <p><c>dir</c> in config is mandatory.</p>
+ <p>See <seealso marker="snmp_config">snmp config</seealso> for
+ a description of the options.</p>
+ </desc>
+ </func>
+ <func>
+ <name>start_sub_agent(ParentAgent,Subtree,Mibs) -> {ok, pid()} | {error, Reason}</name>
+ <fsummary>Start a sub-agent</fsummary>
+ <type>
+ <v>ParentAgent = pid()</v>
+ <v>SubTree = oid()</v>
+ <v>Mibs = [MibName]</v>
+ <v>MibName = [string()]</v>
+ </type>
+ <desc>
+ <p>Starts a sub-agent on the node where the function is
+ called. The <c>snmpa_supervisor</c> must be running.
+ </p>
+ <p>If the supervisor is not running, the function fails with the
+ reason <c>badarg</c>.</p>
+ </desc>
+ </func>
+ <func>
+ <name>stop_sub_agent(SubAgent) -> ok | no_such_child</name>
+ <fsummary>Stop a sub-agent</fsummary>
+ <type>
+ <v>SubAgent = pid()</v>
+ </type>
+ <desc>
+ <p>Stops the sub-agent on the node where the function is
+ called. The <c>snmpa_supervisor</c> must be running.
+ </p>
+ <p>If the supervisor is not running, the function fails with the
+ reason <c>badarg</c>.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpc</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpc.xml</file>
+ </header>
+ <module>snmpc</module>
+ <modulesummary>Interface Functions to the SNMP toolkit MIB compiler</modulesummary>
+ <description>
+ <p>The module <c>snmpc</c> contains interface functions to the
+ SNMP toolkit MIB compiler.</p>
+
+ </description>
+
+ <funcs>
+ <func>
+ <name>compile(File)</name>
+ <name>compile(File, Options) -> {ok, BinFileName} | {error, Reason}</name>
+ <fsummary>Compile the specified MIB</fsummary>
+ <type>
+ <v>File = string()</v>
+ <v>Options = [opt()]</v>
+ <v>opt() = db() | deprecated() | description() | reference() | group_check() | i() | il() | imports() | module() | module_identity() | outdir() | no_defs() | verbosity() | warnings()</v>
+ <v>db() = {db, volatile|persistent|mnesia}</v>
+ <v>deprecated() = {deprecated, bool()}</v>
+ <v>description() = description</v>
+ <v>reference() = reference</v>
+ <v>group_check() = {group_check, bool()}</v>
+ <v>i() = {i, [dir()]}</v>
+ <v>il() = {il, [dir()]}</v>
+ <v>imports() = imports</v>
+ <v>module() = {module, atom()}</v>
+ <v>module_identity() = module_identity</v>
+ <v>no_defs() = no_defs</v>
+ <v>outdir() = {outdir, dir()}</v>
+ <v>verbosity() = {verbosity, silence|warning|info|log|debug|trace}</v>
+ <v>warnings() = {warnings, bool()}</v>
+ <v>dir() = string()</v>
+ <v>BinFileName = string()</v>
+ </type>
+ <desc>
+ <marker id="compiler_opts"></marker>
+ <p>Compiles the specified MIB file <c><![CDATA[<File>.mib]]></c>. The
+ compiled file <c>BinFileName</c> is called
+ <c><![CDATA[<File>.bin]]></c>. </p>
+ <list type="bulleted">
+ <item>The option <c>db</c> specifies which database should
+ be used for the default instrumentation. Default is
+ <c>volatile</c>.
+ </item>
+ <item>The option <c>deprecated</c> 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 <c>true</c>.
+ </item>
+ <item>The option <c>description</c> 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.
+ </item>
+ <item>The option <c>reference</c> 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.
+ </item>
+ <item>The option <c>group_check</c> specifies whether the
+ mib compiler should check the OBJECT-GROUP macro and
+ the NOTIFICATION-GROUP macro for correctness or not.
+ Default is <c>true</c>.
+ </item>
+ <item>The option <c>i</c> specifies the path to search for
+ imported (compiled) MIB files. The directories should be
+ strings with a trailing directory delimiter. Default is
+ <c>["./"]</c>.
+ </item>
+ <item>The option <c>il</c> (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 <c><![CDATA[<snmp-home>/priv/mibs/]]></c>
+ are always listed last in the include path.
+ </item>
+ <item>The option <c>imports</c>, if present, specifies that the
+ IMPORT statement of the MIB shall be included in the compiled mib.
+ </item>
+ <item>The option <c>module</c>, 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.
+ </item>
+ <item>The option <c>module_identity</c>, if present, specifies
+ that the info part of the MODULE-IDENTITY statement of the MIB
+ shall be included in the compiled mib.
+ </item>
+ <item>The option <c>no_defs</c>, 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.
+ </item>
+ <item>The option <c>verbosity</c> specifies the verbosity of
+ the SNMP mib compiler. I.e. if warning, info, log, debug
+ and trace messages shall be shown. Default is <c>silence</c>.
+ Note that if the option <c>warnings</c> is <c>true</c> and the
+ option <c>verbosity</c> is <c>silence</c>, warning messages will
+ still be shown.
+ </item>
+ <item>The option <c>warnings</c> specifies whether warning
+ messages should be shown. Default is <c>true</c>.
+ </item>
+ </list>
+ <p>The MIB compiler understands both SMIv1 and SMIv2 MIBs. It
+ uses the <c>MODULE-IDENTITY</c> statement to determine if the MIB is
+ version 1 or 2.
+ </p>
+ <p>The MIB compiler can be invoked from the OS command line by
+ using the command <c>erlc</c>. <c>erlc</c> recognizes the
+ extension <c>.mib</c>, and invokes the SNMP MIB compiler for
+ files with that extension. The options <c>db</c>,
+ <c>group_check</c>, <c>deprecated</c>, <c>description</c>,
+ <c>verbosity</c>, <c>imports</c> and <c>module_identity</c>
+ have to be specified to <c>erlc</c> using the syntax
+ <c>+term</c>. See <c>erlc(1)</c> for details.
+ </p>
+ </desc>
+ </func>
+ <func>
+ <name>is_consistent(Mibs) -> ok | {error, Reason}</name>
+ <fsummary>Check for OID conflicts between MIBs</fsummary>
+ <type>
+ <v>Mibs = [MibName]</v>
+ <v>MibName = string()</v>
+ </type>
+ <desc>
+ <p>Checks for multiple usage of object identifiers and traps
+ between MIBs.
+ </p>
+ </desc>
+ </func>
+ <func>
+ <name>mib_to_hrl(MibName) -> ok | {error, Reason}</name>
+ <fsummary>Generate constants for the objects in the MIB</fsummary>
+ <type>
+ <v>MibName = string()</v>
+ </type>
+ <desc>
+ <p>Generates a <c>.hrl</c> file with definitions of Erlang
+ constants for the objects in the MIB. The <c>.hrl</c> file is
+ called <c><![CDATA[<MibName>.hrl]]></c>. The MIB must be compiled, and
+ present in the current directory.
+ </p>
+ <p>The <c>mib_to_hrl</c> generator can be invoked from the OS
+ command line by using the command <c>erlc</c>. <c>erlc</c>
+ recognizes the extension <c>.bin</c>, and invokes this function
+ for files with that extension.
+ </p>
+ </desc>
+ </func>
+ </funcs>
+
+ <section>
+ <title>See Also</title>
+ <p>erlc(1)
+ </p>
+ </section>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpm</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpm.xml</file>
+ </header>
+ <module>snmpm</module>
+ <modulesummary>Interface functions to the SNMP toolkit manager</modulesummary>
+ <description>
+ <p>The module <c>snmpm</c> contains interface functions to the
+ SNMP manager. </p>
+ </description>
+
+ <section>
+ <title>Common Data Types</title>
+ <p>The following data types are used in the functions below:</p>
+<code type="none"><![CDATA[
+oid() = [byte()] - The oid() type is used to represent an ASN.1 OBJECT IDENTIFIER
+snmp_reply() = {error_status(), error_index(), varbinds()}
+error_status() = noError | atom()
+error_index() = integer()
+varbinds() = [varbind()]
+atl_type() = read | write | read_write
+target_name() = string() - Is a unique *non-empty* string
+vars_and_vals() = [var_and_val()]
+var_and_val() = {oid(), value_type(), value()} | {oid(), value()}
+value_type() = o ('OBJECT IDENTIFIER') |
+ i ('INTEGER') |
+ u ('Unsigned32') |
+ g ('Unsigned32') |
+ s ('OCTET SRING') |
+ b ('BITS') |
+ ip ('IpAddress') |
+ op ('Opaque') |
+ c32 ('Counter32') |
+ c64 ('Counter64') |
+ tt ('TimeTicks')
+value() = term()
+]]></code>
+
+ <marker id="monitor"></marker>
+ </section>
+ <funcs>
+ <func>
+ <name>monitor() -> Ref</name>
+ <fsummary>Monitor the snmp manager</fsummary>
+ <type>
+ <v>Ref = reference()</v>
+ </type>
+ <desc>
+ <p>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). </p>
+
+ <marker id="demonitor"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>demonitor(Ref) -> void()</name>
+ <fsummary>Turn off monitoring of the snmp manager</fsummary>
+ <type>
+ <v>Ref = reference()</v>
+ </type>
+ <desc>
+ <p>Turn off monitoring of the SNMP manager. </p>
+
+ <marker id="notify_started"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>notify_started(Timeout) -> Pid</name>
+ <fsummary>Request to be notified when manager started</fsummary>
+ <type>
+ <v>Timeout = integer()</v>
+ <v>Pid = pid()</v>
+ </type>
+ <desc>
+ <p>Request a notification (message) when the SNMP manager has
+ started. </p>
+ <p>The <c>Timeout</c> is the time the request is valid. The
+ value has to be greater then zero. </p>
+ <p>The <c>Pid</c> 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:
+ <c>{snmpm_started, Pid}</c>. If the SNMP manager was not started
+ in time, a timeout message will be sent to the client:
+ <c>{snmpm_start_timeout, Pid}</c>. </p>
+ <p>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:</p>
+ <list type="bulleted">
+ <item>
+ <p>During the start of a system, when a client application
+ <em>could</em> start prior to the SNMP manager but is dependent
+ upon it, and therefor has to wait for it to start.</p>
+ </item>
+ <item>
+ <p>When the SNMP manager has crashed, the dependent client
+ application has to wait for the SNMP manager to be restarted
+ before it can <em>reconnect</em>.</p>
+ </item>
+ </list>
+ <p>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. </p>
+ <p>This function is used in conjunction with the monitor function.</p>
+
+ <marker id="cancel_notify_started"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>cancel_notify_started(Pid) -> void()</name>
+ <fsummary>Cancel request to be notified when manager started</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ </type>
+ <desc>
+ <p>Cancel a previous request to be notified of SNMP manager start.</p>
+
+ <marker id="register_user"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>register_user(Id, Module, Data) -> ok | {error, Reason}</name>
+ <name>register_user(Id, Module, Data, DefaultAgentConfig) -> ok | {error, Reason}</name>
+ <fsummary>Register a user of the manager</fsummary>
+ <type>
+ <v>Id = term()</v>
+ <v>Module = snmpm_user()</v>
+ <v>Data = term()</v>
+ <v>DefaultAgentConfig = [default_agent_config()]</v>
+ <v>default_agent_config() = {Item, Val}</v>
+ <v>Item = community | timeout | max_message_size | version | sec_model | sec_name | sec_level</v>
+ <v>Val = term()</v>
+ <v>Reason = term()</v>
+ <v>snmpm_user() = Module implementing the snmpm_user behaviour</v>
+ </type>
+ <desc>
+ <p>Register the manager entity (=user) responsible for specific
+ agent(s). </p>
+
+ <p><c>Module</c> 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).</p>
+
+ <p>The argument <c>DefaultAgentConfig</c> is used as default values when
+ this user register agents.</p>
+
+ <p>The type of <c>Val</c> depends on <c>Item</c>: </p>
+<code type="none"><![CDATA[
+community = string()
+timeout = integer() | snmp_timer()
+max_message_size = integer()
+version = v1 | v2 | v3
+sec_model = any | v1 | v2c | usm
+sec_name = string()
+sec_level = noAuthNoPriv | authNoPriv | authPriv
+ ]]></code>
+
+ <marker id="register_user_monitor"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>register_user_monitor(Id, Module, Data) -> ok | {error, Reason}</name>
+ <name>register_user_monitor(Id, Module, Data, DefaultAgentConfig) -> ok | {error, Reason}</name>
+ <fsummary>Register a monitored user of the manager</fsummary>
+ <type>
+ <v>Id = term()</v>
+ <v>Module = snmpm_user()</v>
+ <v>DefaultAgentConfig = [default_agent_config()]</v>
+ <v>default_agent_config() = {Item, Val}</v>
+ <v>Item = community | timeout | max_message_size | version | sec_model | sec_name | sec_level</v>
+ <v>Val = term()</v>
+ <v>Data = term()</v>
+ <v>Reason = term()</v>
+ <v>snmpm_user() = Module implementing the snmpm_user behaviour</v>
+ </type>
+ <desc>
+ <p>Register the monitored manager entity (=user) responsible
+ for specific agent(s). </p>
+
+ <p>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. </p>
+
+ <p><c>Module</c> 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).</p>
+
+ <p>The argument <c>DefaultAgentConfig</c> is used as default values when
+ this user register agents.</p>
+
+ <p>The type of <c>Val</c> depends on <c>Item</c>: </p>
+<code type="none"><![CDATA[
+community = string()
+timeout = integer() | snmp_timer()
+max_message_size = integer()
+version = v1 | v2 | v3
+sec_model = any | v1 | v2c | usm
+sec_name = string()
+sec_level = noAuthNoPriv | authNoPriv | authPriv
+ ]]></code>
+
+ <marker id="unregister_user"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>unregister_user(Id) -> ok | {error, Reason}</name>
+ <fsummary>Unregister the user</fsummary>
+ <type>
+ <v>Id = term()</v>
+ </type>
+ <desc>
+ <p>Unregister the user.</p>
+
+ <marker id="which_users"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>which_users() -> Users</name>
+ <fsummary>Get a list of all users</fsummary>
+ <type>
+ <v>Users = [UserId]</v>
+ <v>UserId = term()</v>
+ </type>
+ <desc>
+ <p>Get a list of the identities of all registered users.</p>
+
+ <marker id="register_agent"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>register_agent(UserId, TargetName, Config) -> ok | {error, Reason}</name>
+ <fsummary>Register this agent</fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>Addr = ip_address()</v>
+ <v>TargetName = target_name()</v>
+ <v>Config = [agent_config()]</v>
+ <v>agent_config() = {Item, Val}</v>
+ <v>Item = engine_id | address | port | community | timeout | max_message_size | version | sec_model | sec_name | sec_level</v>
+ <v>Val = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Explicitly instruct the manager to handle this agent, with
+ <c>UserId</c> as the responsible user. </p>
+ <p>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
+ <seealso marker="snmp_manager_config_files#agents">agents.conf</seealso>).</p>
+ <p><c>TargetName</c> is a non-empty string,
+ uniquely identifying the agent. </p>
+ <p>The type of <c>Val</c> depends on <c>Item</c>: </p>
+<code type="none"><![CDATA[
+[mandatory] engine_id = string()
+[mandatory] address = ip_address()
+[optional] port = integer()
+[optional] community = string()
+[optional] timeout = integer() | snmp_timer()
+[optional] max_message_size = integer()
+[optional] version = v1 | v2 | v3
+[optional] sec_model = any | v1 | v2c | usm
+[optional] sec_name = string()
+[optional] sec_level = noAuthNoPriv | authNoPriv | authPriv
+]]></code>
+ <p>Note that if no <c>Port</c> is given, the default value is used.</p>
+
+ <marker id="unregister_agent"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>unregister_agent(UserId, TargetName) -> ok | {error, Reason}</name>
+ <fsummary>Unregister the user</fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>TargetName = target_name()</v>
+ </type>
+ <desc>
+ <p>Unregister the agent.</p>
+
+ <marker id="agent_info"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>agent_info(TargetName, Item) -> {ok, Val} | {error, Reason}</name>
+ <fsummary>Retrieve agent config</fsummary>
+ <type>
+ <v>TargetName = target_name()</v>
+ <v>Item = atom()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Retrieve agent config.</p>
+
+ <marker id="update_agent_info"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>update_agent_info(UserId, TargetName, Item, Val) -> ok | {error, Reason}</name>
+ <fsummary>Update agent config</fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>TargetName = target_name()</v>
+ <v>Item = atom()</v>
+ <v>Val = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Update agent config.</p>
+
+ <marker id="which_agents"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>which_agents() -> Agents</name>
+ <name>which_agents(UserId) -> Agents</name>
+ <fsummary>List the registered agents</fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>Agents = [TargetName]</v>
+ <v>TargetName = target_name()</v>
+ </type>
+ <desc>
+ <p>Get a list of all registered agents or all agents registered
+ by a specific user.</p>
+
+ <marker id="register_usm_user"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>register_usm_user(EngineID, UserName, Conf) -> ok | {error, Reason}</name>
+ <fsummary>Register this USM user</fsummary>
+ <type>
+ <v>EngineID = string()</v>
+ <v>UserName = string()</v>
+ <v>Conf = [usm_config()]</v>
+ <v>usm_config() = {Item, Val}</v>
+ <v>Item = sec_name | auth | auth_key | priv | priv_key</v>
+ <v>Val = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>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
+ <seealso marker="snmp_manager_config_files#usm_user">usm.conf</seealso>).</p>
+ <p>The type of <c>Val</c> depends on <c>Item</c>: </p>
+<code type="none"><![CDATA[
+sec_name = string()
+auth = usmNoAuthProtocol | usmHMACMD5AuthProtocol | usmHMACSHAAuthProtocoltimeout
+auth_key = [integer()] (length 16 if auth = usmHMACMD5AuthProtocol,
+ length 20 if auth = usmHMACSHAAuthProtocol)
+priv = usmNoPrivProtocol | usmDESPrivProtocol | usmAesCfb128Protocol
+priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb128Protocol).
+]]></code>
+
+ <marker id="unregister_usm_user"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>unregister_usm_user(EngineID, UserName) -> ok | {error, Reason}</name>
+ <fsummary>Unregister this USM user</fsummary>
+ <type>
+ <v>EngineID = string()</v>
+ <v>UserName = string()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Unregister this USM user.</p>
+
+ <marker id="which_usm_users1"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>usm_user_info(EngineID, UserName, Item) -> {ok, Val} | {error, Reason}</name>
+ <fsummary>Retrieve usm user config</fsummary>
+ <type>
+ <v>EngineID = string()</v>
+ <v>UsmName = string()</v>
+ <v>Item = sec_name | auth | auth_key | priv | priv_key</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Retrieve usm user config.</p>
+
+ <marker id="update_usm_user_info"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>update_usm_user_info(EngineID, UserName, Item, Val) -> ok | {error, Reason}</name>
+ <fsummary>Update agent config</fsummary>
+ <type>
+ <v>EngineID = string()</v>
+ <v>UsmName = string()</v>
+ <v>Item = sec_name | auth | auth_key | priv | priv_key</v>
+ <v>Val = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Update usm user config.</p>
+
+ <marker id="which_usm_users"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>which_usm_users() -> UsmUsers</name>
+ <fsummary>List all the registered usm users</fsummary>
+ <type>
+ <v>UsmUsers = [{EngineID,UserName}]</v>
+ <v>EngineID = string()</v>
+ <v>UsmName = string()</v>
+ </type>
+ <desc>
+ <p>Get a list of all registered usm users.</p>
+
+ <marker id="which_usm_users2"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>which_usm_users(EngineID) -> UsmUsers</name>
+ <fsummary>List the registered usm users</fsummary>
+ <type>
+ <v>UsmUsers = [UserName]</v>
+ <v>UserName = string()</v>
+ </type>
+ <desc>
+ <p>Get a list of all registered usm users with engine-id
+ <c>EngineID</c>.</p>
+
+ <marker id="sync_get"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>sync_get(UserId, TargetName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_get(UserId, TargetName, ContextName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_get(UserId, TargetName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_get(UserId, TargetName, ContextName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_get(UserId, TargetName, ContextName, Oids, Timeout, ExtraInfo) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <fsummary>Synchronous <c>get-request</c></fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>TargetName = target_name()</v>
+ <v>ContextName = string()</v>
+ <v>Oids = [oid()]</v>
+ <v>Timeout = integer()</v>
+ <v>ExtraInfo = term()</v>
+ <v>SnmpReply = snmp_reply()</v>
+ <v>Remaining = integer()</v>
+ <v>Reason = {send_failed, ReqId, R} | {invalid_sec_info, SecInfo, SnmpInfo} | term()</v>
+ <v>R = term()</v>
+ <v>SecInfo = [sec_info()]</v>
+ <v>sec_info() = {sec_tag(), ExpectedValue, ReceivedValue}</v>
+ <v>sec_tag() = atom()</v>
+ <v>ExpectedValue = ReceivedValue = term()</v>
+ <v>SnmpInfo = term()</v>
+ </type>
+ <desc>
+ <p>Synchronous <c>get-request</c>. </p>
+ <p><c>Remaining</c> is the remaining time of the given or
+ default timeout time.</p>
+ <p>When <em>Reason</em> is <em>{send_failed, ...}</em> 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. <em>R</em>
+ is the actual reason in this case. </p>
+ <p><c>ExtraInfo</c> 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.</p>
+ <p>For <c>SnmpInfo</c>, see the user callback function
+ <seealso marker="snmpm_user#handle_report">handle_report</seealso>.</p>
+
+ <marker id="async_get"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>async_get(UserId, TargetName, Oids) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_get(UserId, TargetName, ContextName, Oids) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_get(UserId, TargetName, Oids, Expire) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_get(UserId, TargetName, ContextName, Oids, Expire) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_get(UserId, TargetName, ContextName, Oids, Expire, ExtraInfo) -> {ok, ReqId} | {error, Reason}</name>
+ <fsummary>Asynchronous <c>get-request</c></fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>TargetName = target_name()</v>
+ <v>ContextName = string()</v>
+ <v>Oids = [oid()]</v>
+ <v>Expire = integer()</v>
+ <v>ExtraInfo = term()</v>
+ <v>ReqId = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Asynchronous <c>get-request</c>.</p>
+ <p>The reply, if it arrives, will be delivered to the user
+ through a call to the snmpm_user callback function
+ <c>handle_pdu</c>.</p>
+ <p>The <c>Expire</c> time indicates for how long the request is
+ valid (after which the manager is free to delete it).</p>
+ <p><c>ExtraInfo</c> 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.</p>
+
+ <marker id="sync_get_next"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>sync_get_next(UserId, TargetName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_get_next(UserId, TargetName, ContextName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_get_next(UserId, TargetName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_get_next(UserId, TargetName, ContextName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_get_next(UserId, TargetName, ContextName, Oids, Timeout, ExtraInfo) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <fsummary>Synchronous <c>get-next-request</c></fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>TargetName = target_name()</v>
+ <v>ContextName = string()</v>
+ <v>Oids = [oid()]</v>
+ <v>Timeout = integer()</v>
+ <v>ExtraInfo = term()</v>
+ <v>SnmpReply = snmp_reply()</v>
+ <v>Remaining = integer()</v>
+ <v>Reason = {send_failed, ReqId, R} | {invalid_sec_info, SecInfo, SnmpInfo} | term()</v>
+ <v>R = term()</v>
+ </type>
+ <desc>
+ <p>Synchronous <c>get-next-request</c>. </p>
+ <p><c>Remaining</c> time of the given or default timeout time.</p>
+ <p>When <em>Reason</em> is <em>{send_failed, ...}</em> 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. <em>R</em>
+ is the actual reason in this case. </p>
+ <p><c>ExtraInfo</c> 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.</p>
+
+ <marker id="async_get_next"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>async_get_next(UserId, TargetName, Oids) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_get_next(UserId, TargetName, ContextName, Oids) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_get_next(UserId, TargetName, Oids, Expire) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_get_next(UserId, TargetName, ContextName, Oids, Expire) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_get_next(UserId, TargetName, ContextName, Oids, Expire, ExtraInfo) -> {ok, ReqId} | {error, Reason}</name>
+ <fsummary>Asynchronous <c>get-next-request</c></fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>TargetName = target_name()</v>
+ <v>ContextName = string()</v>
+ <v>Oids = [oid()]</v>
+ <v>Expire = integer()</v>
+ <v>ExtraInfo = term()</v>
+ <v>ReqId = integer()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Asynchronous <c>get-next-request</c>. </p>
+ <p>The reply will be delivered to the user through a call
+ to the snmpm_user callback function <c>handle_pdu</c>.</p>
+ <p>The <c>Expire</c> time indicates for how long the request is
+ valid (after which the manager is free to delete it).</p>
+
+ <marker id="sync_set"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>sync_set(UserId, TargetName, VarsAndVals) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_set(UserId, TargetName, ContextName, VarsAndVals) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_set(UserId, TargetName, VarsAndVals, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_set(UserId, TargetName, ContextName, VarsAndVals, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_set(UserId, TargetName, ContextName, VarsAndVals, Timeout, ExtraInfo) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <fsummary>Synchronous <c>set-request</c></fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>TargetName = target_name()</v>
+ <v>ContextName = string()</v>
+ <v>VarsAndVals = vars_and_vals()</v>
+ <v>Timeout = integer()</v>
+ <v>ExtraInfo = term()</v>
+ <v>SnmpReply = snmp_reply()</v>
+ <v>Remaining = integer()</v>
+ <v>Reason = {send_failed, ReqId, ActualReason} | {invalid_sec_info, SecInfo, SnmpInfo} | term()</v>
+ <v>ActualReason = term()</v>
+ </type>
+ <desc>
+ <p>Synchronous <c>set-request</c>. </p>
+ <p><c>Remaining</c> time of the given or default timeout time.</p>
+ <p>When <em>Reason</em> is <em>{send_failed, ...}</em> 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. <em>R</em>
+ is the actual reason in this case. </p>
+ <p>When <em>var_and_val()</em> is <em>{oid(), value()}</em>, the
+ manager makes an educated guess based on the loaded mibs. </p>
+ <p><c>ExtraInfo</c> 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.</p>
+
+ <marker id="async_set"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>async_set(UserId, TargetName, VarsAndVals) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_set(UserId, TargetName, ContextName, VarsAndVals) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_set(UserId, TargetName, VarsAndVals, Expire) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_set(UserId, TargetName, ContextName, VarsAndVals, Expire) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_set(UserId, TargetName, ContextName, VarsAndVals, Expire, ExtraInfo) -> {ok, ReqId} | {error, Reason}</name>
+ <fsummary>Asynchronous <c>set-request</c></fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>TargetName = target_name()</v>
+ <v>VarsAndVals = vars_and_vals()</v>
+ <v>Expire = integer()</v>
+ <v>ExtraInfo = term()</v>
+ <v>ReqId = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Asynchronous <c>set-request</c>. </p>
+ <p>The reply will be delivered to the user through a call
+ to the snmpm_user callback function <c>handle_pdu</c>.</p>
+ <p>The <c>Expire</c> time indicates for how long the request is
+ valid (after which the manager is free to delete it).</p>
+ <p>When <em>var_and_val()</em> is <em>{oid(), value()}</em>, the
+ manager makes an educated guess based on the loaded mibs. </p>
+ <p><c>ExtraInfo</c> 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.</p>
+
+ <marker id="sync_get_bulk"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>sync_get_bulk(UserId, TragetName, NonRep, MaxRep, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_get_bulk(UserId, TragetName, NonRep, MaxRep, ContextName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_get_bulk(UserId, TragetName, NonRep, MaxRep, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_get_bulk(UserId, TragetName, NonRep, MaxRep, ContextName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <name>sync_get_bulk(UserId, TragetName, NonRep, MaxRep, ContextName, Oids, Timeout, ExtraInfo) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
+ <fsummary>Synchronous <c>get-bulk-request</c></fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>TargetName = target_name()</v>
+ <v>NonRep = integer()</v>
+ <v>MaxRep = integer()</v>
+ <v>ContextName = string()</v>
+ <v>Oids = [oid()]</v>
+ <v>Timeout = integer()</v>
+ <v>ExtraInfo = term()</v>
+ <v>SnmpReply = snmp_reply()</v>
+ <v>Remaining = integer()</v>
+ <v>Reason = {send_failed, ReqId, R} | {invalid_sec_info, SecInfo, SnmpInfo} | term()</v>
+ </type>
+ <desc>
+ <p>Synchronous <c>get-bulk-request</c> (See RFC1905).</p>
+ <p><c>Remaining</c> time of the given or default timeout time.</p>
+ <p>When <em>Reason</em> is <em>{send_failed, ...}</em> 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. <em>R</em>
+ is the actual reason in this case. </p>
+ <p><c>ExtraInfo</c> 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.</p>
+
+ <marker id="async_get_bulk"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>async_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_get_bulk(UserId, TargetName, NonRep, MaxRep, ContextName, Oids) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids, Expire) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_get_bulk(UserId, TargetName, NonRep, MaxRep, ContextName, Oids, Expire) -> {ok, ReqId} | {error, Reason}</name>
+ <name>async_get_bulk(UserId, TargetName, NonRep, MaxRep, ContextName, Oids, Expire, ExtraInfo) -> {ok, ReqId} | {error, Reason}</name>
+ <fsummary>Asynchronous <c>get-bulk-request</c></fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>TargetName = target_name()</v>
+ <v>NonRep = integer()</v>
+ <v>MaxRep = integer()</v>
+ <v>ContextName = string()</v>
+ <v>Oids = [oid()]</v>
+ <v>Expire = integer()</v>
+ <v>ExtraInfo = term()</v>
+ <v>ReqId = integer()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Asynchronous <c>get-bulk-request</c> (See RFC1905).</p>
+ <p>The reply will be delivered to the user through a call
+ to the snmpm_user callback function <c>handle_pdu</c>.</p>
+ <p>The <c>Expire</c> time indicates for how long the request is
+ valid (after which the manager is free to delete it).</p>
+
+ <marker id="cancel_async_request"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>cancel_async_request(UserId, ReqId) -> ok | {error, Reason}</name>
+ <fsummary>Cancel a asynchronous request</fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>ReqId = term()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Cancel a previous asynchronous request.</p>
+
+ <marker id="log_to_txt"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>log_to_txt(LogDir, Mibs)</name>
+ <name>log_to_txt(LogDir, Mibs, OutFile) -> ok | {error, Reason}</name>
+ <name>log_to_txt(LogDir, Mibs, OutFile, LogName) -> ok | {error, Reason}</name>
+ <name>log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile) -> ok | {error, Reason}</name>
+ <name>log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start) -> ok | {error, Reason}</name>
+ <name>log_to_txt(LogDir, Mibs, OutFile, LogName, LogFile, Start, Stop) -> ok | {error, Reason}</name>
+ <fsummary>Convert an Audit Trail Log to text format</fsummary>
+ <type>
+ <v>LogDir = string()</v>
+ <v>Mibs = [MibName]</v>
+ <v>MibName = string()</v>
+ <v>OutFile = string()</v>
+ <v>LogName = string()</v>
+ <v>LogFile = string()</v>
+ <v>Start = Stop = null | datetime() | {local_time,datetime()} | {universal_time,datetime()} </v>
+ <v>Reason = disk_log_open_error() | file_open_error() | term()</v>
+ <v>disk_log_open_error() = {LogName, term()}</v>
+ <v>file_open_error() = {OutFile, term()}</v>
+ </type>
+ <desc>
+ <p>Converts an Audit Trail Log to a readable text file.
+ <c>OutFile</c> defaults to "./snmpm_log.txt".
+ <c>LogName</c> defaults to "snmpm_log".
+ <c>LogFile</c> defaults to "snmpm.log".
+ See <seealso marker="snmp#log_to_txt">snmp:log_to_txt</seealso>
+ for more info.</p>
+
+ <marker id="change_log_size"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>change_log_size(NewSize) -> ok | {error, Reason}</name>
+ <fsummary>Change the size of the Audit Trail Log</fsummary>
+ <type>
+ <v>NewSize = {MaxBytes, MaxFiles}</v>
+ <v>MaxBytes = integer()</v>
+ <v>MaxFiles = integer()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>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.
+ </p>
+ <p>The change is permanent, as long as the log is not deleted.
+ That means, the log size is remembered across reboots.</p>
+
+ <marker id="set_log_type"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>set_log_type(NewType) -> {ok, OldType} | {error, Reason}</name>
+ <fsummary>Change the Audit Trail Log type</fsummary>
+ <type>
+ <v>NewType = OldType = atl_type()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Changes the run-time Audit Trail log type. </p>
+ <p>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. </p>
+ <p>This function is primarily useful in testing/debugging
+ scenarios. </p>
+
+ <marker id="load_mib"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>load_mib(Mib) -> ok | {error, Reason}</name>
+ <fsummary>Load a MIB into the manager</fsummary>
+ <type>
+ <v>Mib = MibName</v>
+ <v>MibName = string()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Load a <c>Mib</c> into the manager. The <c>MibName</c> is the
+ name of the Mib, including the path to where the compiled mib is
+ found. For example,</p>
+ <code type="none">
+ Dir = code:priv_dir(my_app) ++ "/mibs/",
+ snmpm:load_mib(Dir ++ "MY-MIB").
+ </code>
+
+ <marker id="unload_mib"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>unload_mib(Mib) -> ok | {error, Reason}</name>
+ <fsummary>Unload a MIB from the manager</fsummary>
+ <type>
+ <v>Mib = MibName</v>
+ <v>MibName = string()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Unload a <c>Mib</c> from the manager. The <c>MibName</c> is the
+ name of the Mib, including the path to where the compiled mib is
+ found. For example,</p>
+ <code type="none">
+ Dir = code:priv_dir(my_app) ++ "/mibs/",
+ snmpm:unload_mib(Dir ++ "MY-MIB").
+ </code>
+
+ <marker id="which_mibs"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>which_mibs() -> Mibs</name>
+ <fsummary>Which mibs are loaded into the manager</fsummary>
+ <type>
+ <v>Mibs = [{MibName, MibFile}]</v>
+ <v>MibName = atom()</v>
+ <v>MibFile = string()</v>
+ </type>
+ <desc>
+ <p>Get a list of all the mib's loaded into the manager.</p>
+
+ <marker id="name_to_oid"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>name_to_oid(Name) -> {ok, Oids} | {error, Reason}</name>
+ <fsummary>Get all the possible oid's for an alias-name</fsummary>
+ <type>
+ <v>Name = atom()</v>
+ <v>Oids = [oid()]</v>
+ </type>
+ <desc>
+ <p>Transform a alias-name to it's oid.</p>
+ <p>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.</p>
+
+ <marker id="oid_to_name"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>oid_to_name(Oid) -> {ok, Name} | {error, Reason}</name>
+ <fsummary>Get the alias-name of the oid </fsummary>
+ <type>
+ <v>Oid = oid()</v>
+ <v>Name = atom()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Transform a oid to it's aliasname.</p>
+
+ <marker id="oid_to_type"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>oid_to_type(Oid) -> {ok, Type} | {error, Reason}</name>
+ <fsummary>Get the type of the the oid</fsummary>
+ <type>
+ <v>Oid = oid()</v>
+ <v>Type = atom()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Retreive the type (asn1 bertype) of an oid.</p>
+
+ <marker id="backup"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>backup(BackupDir) -> ok | {error, Reason}</name>
+ <fsummary>Backup manager data</fsummary>
+ <type>
+ <v>BackupDir = string()</v>
+ </type>
+ <desc>
+ <p>Backup persistent data handled by the manager. </p>
+ <p>BackupDir cannot be identical to DbDir. </p>
+
+ <marker id="info"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>info() -> [{Key, Value}]</name>
+ <fsummary>Return information about the manager</fsummary>
+ <type>
+ <v>Key = atom()</v>
+ <v>Value = term()</v>
+ </type>
+ <desc>
+ <p>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.</p>
+
+ <marker id="verbosity"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>verbosity(Ref, Verbosity) -> void()</name>
+ <fsummary>Assign a new verbosity for the process</fsummary>
+ <type>
+ <v>Ref = server | config | net_if | note_store | all</v>
+ <v>Verbosity = verbosity()</v>
+ <v>verbosity() = silence | info | log | debug | trace </v>
+ </type>
+ <desc>
+ <p>Sets verbosity for the designated process. For the lowest
+ verbosity <c>silence</c>, nothing is printed. The higher the
+ verbosity, the more is printed.</p>
+
+ <marker id="format_reason"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>format_reason(Reason) -> string()</name>
+ <name>format_reason(Prefix, Reason) -> string()</name>
+ <fsummary>Assign a new verbosity for the process</fsummary>
+ <type>
+ <v>Reason = term()</v>
+ <v>Prefix = integer() | string()</v>
+ </type>
+ <desc>
+ <p>This utility function is used to create a formatted
+ (pretty printable) string of the error reason received
+ from either:
+ </p>
+ <list type="bulleted">
+ <item>
+ <p>The <c>Reason</c> returned value if any of the
+ sync/async get/get-next/set/get-bulk
+ functions returns <c>{error, Reason}</c></p>
+ </item>
+ <item>
+ <p>The <c>Reason</c> parameter in the
+ <seealso marker="snmpm_user#handle_error">handle_error</seealso> user callback function.</p>
+ </item>
+ </list>
+ <p><c>Prefix</c> 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).</p>
+ </desc>
+ </func>
+ </funcs>
+
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2006</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpm_conf</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpm_conf.xml</file>
+ </header>
+ <module>snmpm_conf</module>
+ <modulesummary>Utility functions for handling the manager config files.</modulesummary>
+ <description>
+ <p>The module <c>snmpm_conf</c> contains various utility functions to
+ used for manipulating (write/append/read) the config files of the
+ SNMP manager. </p>
+ <marker id="manager_entry"></marker>
+ </description>
+ <funcs>
+ <func>
+ <name>manager_entry(Tag, Val) -> manager_entry()</name>
+ <fsummary>Create an manager entry</fsummary>
+ <type>
+ <v>Tag = address | port | engine_id | max_message_size</v>
+ <v>Val = term()</v>
+ <v>manager_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the manager config file,
+ <c>manager.conf</c>. </p>
+ <p>The type of <c>Val</c> depends on the value of <c>Tag</c>,
+ see
+ <seealso marker="snmp_manager_config_files#manager_information">Manager Information</seealso>
+ for more info. </p>
+ <marker id="write_manager_config"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>write_manager_config(Dir, Conf) -> ok</name>
+ <name>write_manager_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the manager config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [manager_entry()]</v>
+ </type>
+ <desc>
+ <p>Write the manager config to the manager config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#manager_information">Manager Information</seealso>
+ for more info. </p>
+ <marker id="append_manager_config"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>append_manager_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the manager config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [manager_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the config to the current manager config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#manager_information">Manager Information</seealso>
+ for more info. </p>
+ <marker id="read_manager_config"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>read_manager_config(Dir) -> Conf</name>
+ <fsummary>Read the manager config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [manager_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current manager config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#manager_information">Manager Information</seealso>
+ for more info. </p>
+ <marker id="users_entry"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>users_entry(UserId) -> users_entry()</name>
+ <name>users_entry(UserId, UserMod) -> users_entry()</name>
+ <name>users_entry(UserId, UserMod, UserData) -> users_entry()</name>
+ <fsummary>Create an users entry</fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>UserMod = atom()</v>
+ <v>UserData = term()</v>
+ <v>standard_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the manager users config file,
+ <c>users.conf</c>. </p>
+ <p><c>users_entry(UserId)</c> translates to the following call:
+ <c>users_entry(UserId, snmpm_user_default)</c>. </p>
+ <p><c>users_entry(UserId, UserMod)</c> translates to the following
+ call: <c>users_entry(UserId, UserMod, undefined)</c>. </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#users">Users</seealso>
+ for more info. </p>
+ <marker id="write_users_config"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>write_users_config(Dir, Conf) -> ok</name>
+ <name>write_users_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the manager users config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [users_entry()]</v>
+ </type>
+ <desc>
+ <p>Write the manager users config to the manager users
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#users">Users</seealso>
+ for more info. </p>
+ <marker id="append_users_config"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>append_users_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the manager users config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [users_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the users config to the current manager users
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#users">Users</seealso>
+ for more info. </p>
+ <marker id="read_users_config"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>read_users_config(Dir) -> Conf</name>
+ <fsummary>Read the manager users config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [users_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current manager users config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#users">Users</seealso>
+ for more info. </p>
+ <marker id="agents_entry"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>agents_entry(UserId, TargetName, Comm, Ip, Port, EngineID, Timeout, MaxMessageSize, Version, SecModel, SecName, SecLevel) -> agents_entry()</name>
+ <fsummary>Create an agents entry</fsummary>
+ <type>
+ <v>UserId = term()</v>
+ <v>TargetName = string()</v>
+ <v>Comm = string()</v>
+ <v>Ip = string()</v>
+ <v>Port = integer()</v>
+ <v>EngineID = string()</v>
+ <v>Timeout = integer()</v>
+ <v>MaxMessageSize = integer()</v>
+ <v>Version = v1 | v2 | v3</v>
+ <v>SecModel = v1 | v2c | usm</v>
+ <v>SecName = string()</v>
+ <v>SecLevel = noAuthNoPriv | authNoPriv | authPriv</v>
+ <v>agents_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the manager agents config file,
+ <c>agents.conf</c>. </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#agents">Agents</seealso>
+ for more info. </p>
+ <marker id="write_agents_config"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>write_agents_config(Dir, Conf) -> ok</name>
+ <name>write_agents_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the manager agents to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [_entry()]</v>
+ </type>
+ <desc>
+ <p>Write the manager agents config to the manager agents
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#agents">Agents</seealso>
+ for more info. </p>
+ <marker id="append_agents_config"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>append_agents_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the manager agents to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [agents_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the agents config to the current manager agents
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#agents">Agents</seealso>
+ for more info. </p>
+ <marker id="read_agents_config"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>read_agents_config(Dir) -> Conf</name>
+ <fsummary>Read the manager agents config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [agents_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current manager agents config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#agents">Agents</seealso>
+ for more info. </p>
+ <marker id="usm_entry"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>usm_entry(EngineID, UserName, AuthP, AuthKey, PrivP, PrivKey) -> usm_entry()</name>
+ <name>usm_entry(EngineID, UserName, SecName, AuthP, AuthKey, PrivP, PrivKey) -> usm_entry()</name>
+ <fsummary>Create an usm entry</fsummary>
+ <type>
+ <v>EngineID = string()</v>
+ <v>UserName = string()</v>
+ <v>SecName = string()</v>
+ <v>AuthP = usmNoAuthProtocol | usmHMACMD5AuthProtocol | usmHMACSHAAuthProtocol</v>
+ <v>AuthKey = [integer()]</v>
+ <v>PrivP = usmNoPrivProtocol | usmDESPrivProtocol | usmAesCfb128Protocol</v>
+ <v>PrivKey = [integer()]</v>
+ <v>usm_entry() = term()</v>
+ </type>
+ <desc>
+ <p>Create an entry for the agent community config file,
+ <c>community.conf</c>. </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#usm">Security data for USM</seealso>
+ for more info. </p>
+ <marker id="write_usm_config"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>write_usm_config(Dir, Conf) -> ok</name>
+ <name>write_usm_config(Dir, Hdr, Conf) -> ok</name>
+ <fsummary>Write the manager usm config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Hdr = string()</v>
+ <v>Conf = [usm_entry()]</v>
+ </type>
+ <desc>
+ <p>Write the manager usm config to the manager usm
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p><c>Hdr</c> is an optional file header (note that this text is
+ written to the file as is). </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#usm">Security data for USM</seealso>
+ for more info. </p>
+ <marker id="append_usm_config"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>append_usm_config(Dir, Conf) -> ok</name>
+ <fsummary>Append the manager usm config to the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [usm_entry()]</v>
+ </type>
+ <desc>
+ <p>Append the usm config to the current manager usm
+ config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#usm">Security data for USM</seealso>
+ for more info. </p>
+ <marker id="read_usm_config"></marker>
+ </desc>
+ </func>
+ <func>
+ <name>read_usm_config(Dir) -> Conf</name>
+ <fsummary>Read the manager usm config from the config file</fsummary>
+ <type>
+ <v>Dir = string()</v>
+ <v>Conf = [usm_entry()]</v>
+ </type>
+ <desc>
+ <p>Read the current manager usm config file. </p>
+ <p><c>Dir</c> is the path to the directory where to store the
+ config file. </p>
+ <p>See
+ <seealso marker="snmp_manager_config_files#usm">Security data for USM</seealso>
+ for more info. </p>
+ <marker id="end"></marker>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpm_mpd</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpm_mpd.xml</file>
+ </header>
+ <module>snmpm_mpd</module>
+ <modulesummary>Message Processing and Dispatch module for the SNMP manager</modulesummary>
+ <description>
+ <p>The module <c>snmpm_mpd</c> 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
+ (<seealso marker="snmp_manager_netif">Definition of Manager Net if</seealso>).
+ </p>
+ </description>
+ <funcs>
+ <func>
+ <name>init_mpd(Vsns) -> mpd_state()</name>
+ <fsummary>Initialize the MPD module</fsummary>
+ <type>
+ <v>Vsns = [Vsn]</v>
+ <v>Vsn = v1 | v2 | v3</v>
+ </type>
+ <desc>
+ <p>This function can be called from the net_if process at start-up.
+ The options list defines which versions to use.
+ </p>
+ <p>It also initializes some SNMP counters.
+ <marker id="process_msg"></marker>
+</p>
+ </desc>
+ </func>
+ <func>
+ <name>process_msg(Msg, TDomain, Addr, Port, State, NoteStore, Logger) -> {ok, Vsn, Pdu, PduMS, MsgData} | {discarded, Reason}</name>
+ <fsummary>Process a message received from the network</fsummary>
+ <type>
+ <v>Msg = binary()</v>
+ <v>TDomain = snmpUDPDomain</v>
+ <v>Addr = {integer(), integer(), integer(), integer()}</v>
+ <v>Port = integer()</v>
+ <v>State = mpd_state()</v>
+ <v>NoteStore = pid()</v>
+ <v>Logger = function()</v>
+ <v>Vsn = 'version-1' | 'version-2' | 'version-3'</v>
+ <v>Pdu = #pdu</v>
+ <v>PduMs = integer()</v>
+ <v>MsgData = term()</v>
+ </type>
+ <desc>
+ <p>Processes an incoming message. Performs authentication and
+ decryption as necessary. The return values should be passed the
+ manager server.
+ </p>
+ <p><c>NoteStore</c> is the <c>pid()</c> of the note-store process.</p>
+ <p><c>Logger</c> is the function used for audit trail logging.
+ </p>
+ <p>In the case when the pdu type is <c>report</c>, <c>MsgData</c> is
+ either <c>ok</c> or <c>{error, ReqId, Reason}</c>.
+ </p>
+ </desc>
+ </func>
+ <func>
+ <name>generate_msg(Vsn, NoteStore, Pdu, MsgData, Logger) -> {ok, Packet} | {discarded, Reason}</name>
+ <fsummary>Generate a request message to be sent to the network</fsummary>
+ <type>
+ <v>Vsn = 'version-1' | 'version-2' | 'version-3'</v>
+ <v>NoteStore = pid()</v>
+ <v>Pdu = #pdu</v>
+ <v>MsgData = term()</v>
+ <v>Logger = function()</v>
+ <v>Packet = binary()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Generates a possibly encrypted packet to be sent to the network.
+ </p>
+ <p><c>NoteStore</c> is the <c>pid()</c> of the note-store process.
+ </p>
+ <p><c>MsgData</c> 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.
+ </p>
+ <p><c>Logger</c> is the function used for audit trail logging.
+ </p>
+ </desc>
+ </func>
+ <func>
+ <name>generate_response_msg(Vsn, Pdu, MsgData, Logger) -> {ok, Packet} | {discarded, Reason}</name>
+ <fsummary>Generate a response packet to be sent to the network</fsummary>
+ <type>
+ <v>Vsn = 'version-1' | 'version-2' | 'version-3'</v>
+ <v>Pdu = #pdu</v>
+ <v>MsgData = term()</v>
+ <v>Logger = function()</v>
+ <v>Packet = binary()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>Generates a possibly encrypted response packet to be sent to the
+ network.
+ </p>
+ <p><c>MsgData</c> is the message specific data used in the SNMP
+ message. This value is received from the
+ <seealso marker="snmpm_mpd#process_msg">process_msg</seealso>
+ function.
+ </p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpm_network_interface</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpm_network_interface.xml</file>
+ </header>
+ <module>snmpm_network_interface</module>
+ <modulesummary>Behaviour module for the SNMP manager network interface.</modulesummary>
+ <description>
+ <p>This module defines the behaviour of the manager network
+ interface. A <c>snmpm_network_interface</c> compliant module
+ must export the following functions: </p>
+ <list type="bulleted">
+ <item>
+ <p><seealso marker="#start_link">start_link/2</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#stop">stop/1</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#send_pdu">send_pdu/7</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#inform_response">inform_response/4</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#note_store">note_store/2</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#info">info/1</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#get_log_type">get_log_type/1</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#set_log_type">set_log_type/2</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#verbosity">verbosity/2</seealso></p>
+ </item>
+ </list>
+ <p>The semantics of them and their exact signatures are explained
+ below. </p>
+
+ <marker id="start_link"></marker>
+ </description>
+
+ <funcs>
+ <func>
+ <name>start_link(Server, NoteStore) -> {ok, Pid} | {error, Reason}</name>
+ <fsummary>Start-link the network interface process</fsummary>
+ <type>
+ <v>Server = pid()</v>
+ <v>NoteStore = pid()</v>
+ </type>
+ <desc>
+ <p>Start-link the network interface process.</p>
+ <p><c>Server</c> is the pid of the managing process.</p>
+ <p><c>NoteStore</c> is the pid of the note-store process.</p>
+
+ <marker id="stop"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>stop(Pid) -> void()</name>
+ <fsummary>Stop the network interface process</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ </type>
+ <desc>
+ <p>Stop the network interface process.</p>
+
+ <marker id="send_pdu"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>send_pdu(Pid, Pdu, Vsn, MsgData, Addr, Port, ExtraInfo) -> void()</name>
+ <fsummary>Request the network interface process to send this pdu</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ <v>Pdu = pdu()</v>
+ <v>Vsn = 'version-1' | 'version-2' | 'version-3'</v>
+ <v>MsgData = term()</v>
+ <v>Addr = address()</v>
+ <v>Port = integer()</v>
+ <v>ExtraInfo = term()</v>
+ </type>
+ <desc>
+ <p>Request the network interface process (<c>Pid</c>) to send
+ this pdu (<c>Pdu</c>).</p>
+ <p><c>ExtraInfo</c> is some opaque data that is passed to the
+ net-if process. It originates from the <c>ExtraInfo</c>
+ parameter in the calls to the
+ <seealso marker="snmpm#sync_get">synchronous get-request</seealso>,
+ <seealso marker="snmpm#async_get">asynchronous get-request</seealso>,
+ <seealso marker="snmpm#sync_get_next">synchronous get-next-request</seealso>,
+ <seealso marker="snmpm#async_get_next">asynchronous get-next-request</seealso>,
+ <seealso marker="snmpm#sync_set">synchronous set-request</seealso>
+ and
+ <seealso marker="snmpm#async_set">asynchronous set-request</seealso>
+ functions.
+ Whether the net-if process chooses
+ to use this is implementation dependent. The net-if process
+ included in this application ignores it. </p>
+
+ <marker id="inform_response"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>inform_response(Pid, Ref, Addr, Port) -> void()</name>
+ <fsummary>Send the inform-request ack</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ <v>Ref = term()</v>
+ <v>Addr = address()</v>
+ <v>Port = integer()</v>
+ </type>
+ <desc>
+ <p>Instruct the network interface process to send the response
+ (acknowledgment) to an inform-request.</p>
+ <p><c>Ref</c> is something that can be used to identify the
+ inform-request, e.g. request-id of the inform-request.</p>
+ <p><c>Addr</c> and <c>Port</c> identifies the agent, from
+ which the inform-request originated.</p>
+
+ <marker id="note_store"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>note_store(Pid, NoteStore) -> void()</name>
+ <fsummary>Change the verbosity of the network interface process</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ <v>NoteStore = pid()</v>
+ </type>
+ <desc>
+ <p>Change the pid of the note-store process.
+ This is used when the server re-starts the note_store
+ (e.g. after a crach).</p>
+
+ <marker id="info"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>info(Pid) -> [{Key, Value}]</name>
+ <fsummary>Return information about the running network interface process</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ </type>
+ <desc>
+ <p>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.</p>
+ <p>The info returned by this function is returned together with other
+ info collected by the manager when the
+ <seealso marker="snmpm#info">info</seealso> function is called
+ (tagged with the key <c>net_if</c>).</p>
+
+ <marker id="verbosity"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>verbosity(Pid, Verbosity) -> void()</name>
+ <fsummary>Change the verbosity of the network interface process</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ <v>Verbosity = verbosity()</v>
+ </type>
+ <desc>
+ <p>Change the verbosity of the network interface process.</p>
+
+ <marker id="get_log_type"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>get_log_type(Pid) -> {ok, LogType} | {error, Reason}</name>
+ <fsummary>Get the Audit Trail Log type</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ <v>LogType = atl_type()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>The Audit Trail Log is managed by the network interface process.
+ So, it is this process that has to return the actual log-type. </p>
+<!--
+ <p>See
+ <seealso marker="snmpm#get_log_type">get_log_type</seealso>
+ for more info. </p>
+-->
+
+ <marker id="set_log_type"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>set_log_type(Pid, NewType) -> {ok, OldType} | {error, Reason}</name>
+ <fsummary>Change the Audit Trail Log type</fsummary>
+ <type>
+ <v>Pid = pid()</v>
+ <v>NewType = OldType = atl_type()</v>
+ <v>Reason = term()</v>
+ </type>
+ <desc>
+ <p>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. </p>
+ <p>See
+ <seealso marker="snmpm#set_log_type">set_log_type</seealso>
+ for more info. </p>
+ </desc>
+ </func>
+
+ </funcs>
+
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2007</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpm_network_interface_filter</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpm_network_interface_filter.xml</file>
+ </header>
+ <module>snmpm_network_interface_filter</module>
+ <modulesummary>Behaviour module for the SNMP manager network-interface filter.</modulesummary>
+ <description>
+ <p>This module defines the behaviour of the manager network interface
+ filter. A <c>snmpm_network_interface_filter</c> compliant module
+ must export the following functions: </p>
+ <list type="bulleted">
+ <item>
+ <p><seealso marker="#accept_recv">accept_recv/2</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#accept_send">accept_send/2</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#accept_recv_pdu">accept_recv_pdu/3</seealso></p>
+ </item>
+ <item>
+ <p><seealso marker="#accept_send_pdu">accept_send_pdu/2</seealso></p>
+ </item>
+ </list>
+ <p>The semantics of them and their exact signatures are explained
+ below. </p>
+ <p>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: </p>
+ <list type="bulleted">
+ <item>
+ <p>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).</p>
+ </item>
+ <item>
+ <p>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).</p>
+ </item>
+ </list>
+ <p>Note that the network interface filter is something which is used
+ by the network interface implementation provided by the application
+ (<c>snmpm_net_if</c>). The default filter accepts all messages.</p>
+ <p>A network interface filter can e.g. be used during testing or for load
+ regulation. </p>
+ </description>
+
+ <section>
+ <title>DATA TYPES</title>
+ <code type="none">
+port() = integer() > 0
+pdu_type() = 'get-request' | 'get-next-request' | 'get-response' | 'set-request' | trap | 'get-bulk-request' | 'inform-request' | report | trappdu
+ </code>
+ <marker id="accept_recv"></marker>
+ </section>
+
+ <funcs>
+ <func>
+ <name>accept_recv(Addr, Port) -> boolean()</name>
+ <fsummary>Shall the received message be accepted</fsummary>
+ <type>
+ <v>Addr = ip_address()</v>
+ <v>Port = port()</v>
+ </type>
+ <desc>
+ <p>Called at the reception of a message (before <em>any</em> processing
+ has been done).</p>
+ <p>For the message to be rejected, the function <em>must</em> return
+ <em>false</em>. </p>
+ <marker id="accept_send"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>accept_send(Addr, Port) -> boolean()</name>
+ <fsummary>Shall the message be sent</fsummary>
+ <type>
+ <v>Addr = ip_address()</v>
+ <v>Port = port()</v>
+ </type>
+ <desc>
+ <p>Called before the sending of a message (after <em>all</em> processing
+ has been done).</p>
+ <p>For the message to be rejected, the function <em>must</em> return
+ <em>false</em>. </p>
+ <marker id="accept_recv_pdu"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>accept_recv_pdu(Addr, Port, PduType) -> boolean()</name>
+ <fsummary>Shall the received pdu be accepted</fsummary>
+ <type>
+ <v>Addr = ip_address()</v>
+ <v>Port = port()</v>
+ <v>PduType = pdu_type()</v>
+ </type>
+ <desc>
+ <p>Called after the basic message processing (MPD) has been done,
+ but before the pdu is handed over to the server for primary
+ processing.</p>
+ <p>For the pdu to be rejected, the function <em>must</em> return
+ <em>false</em>. </p>
+ <marker id="accept_send_pdu"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>accept_send_pdu(Addr, Port, PduType) -> boolean()</name>
+ <fsummary>Shall the pdu be sent</fsummary>
+ <type>
+ <v>Addr = ip_address()</v>
+ <v>Port = port()</v>
+ <v>PduType = pdu_type() > 0</v>
+ </type>
+ <desc>
+ <p>Called before the basic message processing (MPD) is done,
+ when a pdu has been received from the master-agent.</p>
+ <p>For the message to be rejected, the function <em>must</em> return
+ <em>false</em>. </p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpm_user</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpm_user.xml</file>
+ </header>
+ <module>snmpm_user</module>
+ <modulesummary>Behaviour module for the SNMP manager user.</modulesummary>
+ <description>
+ <p>This module defines the behaviour of the manager user.
+ A <c>snmpm_user</c> compliant module
+ must export the following functions: </p>
+ <list type="bulleted">
+ <item>
+ <p>handle_error/3</p>
+ </item>
+ <item>
+ <p>handle_agent/4</p>
+ </item>
+ <item>
+ <p>handle_pdu/4</p>
+ </item>
+ <item>
+ <p>handle_trap/3</p>
+ </item>
+ <item>
+ <p>handle_inform/3</p>
+ </item>
+ <item>
+ <p>handle_report/3</p>
+ </item>
+ </list>
+ <p>The semantics of them and their exact signatures are explained
+ below. </p>
+ <p>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. </p>
+
+ <marker id="handle_error"></marker>
+ </description>
+ <funcs>
+ <func>
+ <name>handle_error(ReqId, Reason, UserData) -> Reply</name>
+ <fsummary>Handle error</fsummary>
+ <type>
+ <v>ReqId = integer()</v>
+ <v>Reason = {unexpected_pdu, SnmpInfo} | {invalid_sec_info, SecInfo, SnmpInfo} | {empty_message, Addr, Port} | term()</v>
+ <v>Addr = ip_address()</v>
+ <v>Port = integer()</v>
+ <v>UserData = term()</v>
+ <v>Reply = ignore</v>
+ </type>
+ <desc>
+ <p>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). </p>
+ <p>If <c>ReqId</c> 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).
+ </p>
+ <p>For <c>SnmpInfo</c> see handle_agent below.</p>
+
+ <marker id="handle_agent"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>handle_agent(Addr, Port, Type, SnmpInfo, UserData) -> Reply</name>
+ <fsummary>Handle agent</fsummary>
+ <type>
+ <v>Addr = ip_address()</v>
+ <v>Port = integer()</v>
+ <v>Type = pdu | trap | report | inform</v>
+ <v>SnmpInfo = SnmpPduInfo | SnmpTrapInfo | SnmpReportInfo | SnmpInformInfo</v>
+ <v>ErrorStatus = atom()</v>
+ <v>ErrorIndex = integer()</v>
+ <v>Varbinds = [varbind()]</v>
+ <v>varbind() = #varbind</v>
+ <v>UserData = term()</v>
+ <v>Reply = ignore | {register, UserId, TargetName, agent_info()}</v>
+ <v>UserId = term()</v>
+ <v>TargetName = target_name()</v>
+ <v>agent_info() = [{agent_info_item(), agent_info_value()}]</v>
+ </type>
+ <desc>
+ <p>This function is called when a message is received from an
+ unknown agent.</p>
+ <p>Note that this will always be the default user that is called.</p>
+ <p>For more info about the <c>agent_info()</c>, see
+ <seealso marker="snmpm#register_agent">register_agent</seealso>.</p>
+
+ <p>The arguments <c>Type</c> and <c>SnmpInfo</c> relates in the
+ following way: </p>
+
+ <list type="bulleted">
+ <item>
+ <p><c>pdu</c> - <c>SnmpPduInfo</c>
+ (see <seealso marker="#handle_pdu">handle_pdu</seealso>
+ for more info).</p>
+ </item>
+ <item>
+ <p><c>trap</c> - <c>SnmpTrapInfo</c>
+ (see <seealso marker="#handle_trap">handle_trap</seealso>
+ for more info).</p>
+ </item>
+ <item>
+ <p><c>report</c> - <c>SnmpReportInfo</c>
+ (see <seealso marker="#handle_report">handle_report</seealso>
+ for more info).</p>
+ </item>
+ <item>
+ <p><c>inform</c> - <c>SnmpInformInfo</c>
+ (see <seealso marker="#handle_inform">handle_inform</seealso>
+ for more info).</p>
+ </item>
+ </list>
+
+ <p>The only user which would return
+ <c>{register, UserId, TargetName, agent_info()}</c> is the
+ <em>default user</em>.</p>
+
+ <marker id="handle_pdu"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>handle_pdu(TargetName, ReqId, SnmpPduInfo, UserData) -> Reply</name>
+ <fsummary>Handle the reply to an asynchronous request</fsummary>
+ <type>
+ <v>TargetName = target_name()</v>
+ <v>ReqId = term()</v>
+ <v>SnmpPduInfo = {ErrorStatus, ErrorIndex, Varbinds}</v>
+ <v>ErrorStatus = atom()</v>
+ <v>ErrorIndex = integer()</v>
+ <v>Varbinds = [varbind()]</v>
+ <v>varbind() = #varbind</v>
+ <v>UserData = term()</v>
+ <v>Reply = ignore</v>
+ </type>
+ <desc>
+ <p>Handle the reply to an asynchronous request, such as
+ <seealso marker="snmpm#async_get">async_get</seealso>,
+ <seealso marker="snmpm#async_get_next">async_get_next</seealso> or
+ <seealso marker="snmpm#async_set">async_set</seealso>.</p>
+ <p>It could also be a late reply to a synchronous request.</p>
+ <p><c>ReqId</c> is returned by the asynchronous request function.</p>
+
+ <marker id="handle_trap"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>handle_trap(TargetName, SnmpTrapInfo, UserData) -> Reply</name>
+ <fsummary>Handle a trap/notification message</fsummary>
+ <type>
+ <v>TargetName = TargetName2 = target_name()</v>
+ <v>SnmpTrapInfo = {Enteprise, Generic, Spec, Timestamp, Varbinds} | {ErrorStatus, ErrorIndex, Varbinds}</v>
+ <v>Enterprise = oid()</v>
+ <v>Generic = integer()</v>
+ <v>Spec = integer()</v>
+ <v>Timestamp = integer()</v>
+ <v>ErrorStatus = atom()</v>
+ <v>ErrorIndex = integer()</v>
+ <v>Varbinds = [varbind()]</v>
+ <v>varbind() = #varbind</v>
+ <v>UserData = term()</v>
+ <v>Reply = ignore | unregister | {register, UserId, TargetName2, agent_info()}</v>
+ <v>UserId = term()</v>
+ <v>agent_info() = [{agent_info_item(), agent_info_value()}]</v>
+ </type>
+ <desc>
+ <p>Handle a trap/notification message from an agent.</p>
+ <p>For more info about the <c>agent_info()</c>, see
+ <seealso marker="snmpm#register_agent">register_agent</seealso></p>
+ <p>The only user which would return
+ <c>{register, UserId, TargetName2, agent_info()}</c> is the
+ <em>default user</em>.</p>
+
+ <marker id="handle_inform"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>handle_inform(TargetName, SnmpInformInfo, UserData) -> Reply</name>
+ <fsummary>Handle a inform message</fsummary>
+ <type>
+ <v>TargetName = TargetName2 = target_name()</v>
+ <v>SnmpInformInfo = {ErrorStatus, ErrorIndex, Varbinds}</v>
+ <v>ErrorStatus = atom()</v>
+ <v>ErrorIndex = integer()</v>
+ <v>Varbinds = [varbind()]</v>
+ <v>varbind() = #varbind</v>
+ <v>UserData = term()</v>
+ <v>Reply = ignore | unregister | {register, UserId, TargetName2, agent_info()}</v>
+ <v>UserId = term()</v>
+ <v>agent_info() = [{agent_info_item(), agent_info_value()}]</v>
+ </type>
+ <desc>
+ <p>Handle a inform message.</p>
+ <p>For more info about the <c>agent_info()</c>, see
+ <seealso marker="snmpm#register_agent">register_agent</seealso></p>
+ <p>The only user which would return
+ <c>{register, UserId, TargetName2, agent_info()}</c> is the
+ <em>default user</em>.</p>
+ <p>If the
+ <seealso marker="snmp_app">inform request behaviour</seealso>
+ configuration option is set to <c>user</c> or
+ <c>{user, integer()}</c>, the response (acknowledgment) to this
+ inform-request will be sent when this function returns.</p>
+
+ <marker id="handle_report"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>handle_report(TargetName, SnmpReportInfo, UserData) -> Reply</name>
+ <fsummary>Handle a report message</fsummary>
+ <type>
+ <v>TargetName = TargetName2 = target_name()</v>
+ <v>Addr = ip_address()</v>
+ <v>Port = integer()</v>
+ <v>SnmpReportInfo = {ErrorStatus, ErrorIndex, Varbinds}</v>
+ <v>ErrorStatus = atom()</v>
+ <v>ErrorIndex = integer()</v>
+ <v>Varbinds = [varbind()]</v>
+ <v>varbind() = #varbind</v>
+ <v>UserData = term()</v>
+ <v>Reply = ignore | unregister | {register, UserId, TargetName2, agent_info()}</v>
+ <v>UserId = term()</v>
+ <v>agent_info() = [{agent_info_item(), agent_info_value()}]</v>
+ </type>
+ <desc>
+ <p>Handle a report message.</p>
+ <p>For more info about the <c>agent_info()</c>, see
+ <seealso marker="snmpm#register_agent">register_agent</seealso></p>
+ <p>The only user which would return
+ <c>{register, UserId, TargetName2, agent_info()}</c> is the
+ <em>default user</em>.</p>
+ </desc>
+ </func>
+ </funcs>
+
+</erlref>
+
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
--- /dev/null
+++ b/lib/snmp/doc/src/structure.gif
Binary files 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
--- /dev/null
+++ b/lib/snmp/doc/src/user_guide.gif
Binary files differ
diff --git a/lib/snmp/doc/src/warning.gif b/lib/snmp/doc/src/warning.gif
new file mode 100644
index 0000000000..96af52360e
--- /dev/null
+++ b/lib/snmp/doc/src/warning.gif
Binary files differ