Implement MultiCloud proxyed Designate
[demo.git] / vnfs / vCPE / vpp-radius-client-for-vbng / src / patches / Vpp-Integrate-FreeRADIUS-Client-for-vBNG.patch
1 From 0a97fd92483349178a6750ec4a232fea4f9864df Mon Sep 17 00:00:00 2001
2 From: Johnson Li <johnson.li@intel.com>
3 Date: Fri, 8 Sep 2017 17:09:58 +0800
4 Subject: [PATCH] Integrate FreeRADIUS Client for vBNG
5
6 Signed-off-by: Johnson Li <johnson.li@intel.com>
7
8 diff --git a/src/configure.ac b/src/configure.ac
9 index fb2ead6d..ef5537da 100644
10 --- a/src/configure.ac
11 +++ b/src/configure.ac
12 @@ -152,6 +152,7 @@ PLUGIN_ENABLED(ioam)
13  PLUGIN_ENABLED(ixge)
14  PLUGIN_ENABLED(lb)
15  PLUGIN_ENABLED(memif)
16 +PLUGIN_ENABLED(vbng)
17  PLUGIN_ENABLED(sixrd)
18  PLUGIN_ENABLED(snat)
19  
20 diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
21 index 623892e7..d6f607fc 100644
22 --- a/src/plugins/Makefile.am
23 +++ b/src/plugins/Makefile.am
24 @@ -61,6 +61,10 @@ if ENABLE_MEMIF_PLUGIN
25  include memif.am
26  endif
27  
28 +if ENABLE_VBNG_PLUGIN
29 +include vbng.am
30 +endif
31 +
32  if ENABLE_SIXRD_PLUGIN
33  include sixrd.am
34  endif
35 diff --git a/src/plugins/vbng.am b/src/plugins/vbng.am
36 new file mode 100644
37 index 00000000..99398f49
38 --- /dev/null
39 +++ b/src/plugins/vbng.am
40 @@ -0,0 +1,32 @@
41 +# Copyright (c) 2017 Intel and/or its affiliates.
42 +# Licensed under the Apache License, Version 2.0 (the "License");
43 +# you may not use this file except in compliance with the License.
44 +# You may obtain a copy of the License at:
45 +#
46 +#     http://www.apache.org/licenses/LICENSE-2.0
47 +#
48 +# Unless required by applicable law or agreed to in writing, software
49 +# distributed under the License is distributed on an "AS IS" BASIS,
50 +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
51 +# See the License for the specific language governing permissions and
52 +# limitations under the License.
53 +
54 +vppplugins_LTLIBRARIES += vbng_plugin.la
55 +
56 +vbng_plugin_la_LDFLAGS = $(AM_LDFLAGS) -lfreeradiusclient
57 +
58 +vbng_plugin_la_SOURCES = vbng/vbng_dhcp4_node.c        \
59 +                        vbng/vbng_dhcp4.c      \
60 +                        vbng/vbng_api.c        \
61 +                        vbng/vbng_aaa.c
62 +
63 +BUILT_SOURCES += vbng/vbng.api.h               \
64 +                vbng/vbng.api.json
65 +
66 +API_FILES += vbng/vbng.api
67 +
68 +nobase_apiinclude_HEADERS += vbng/vbng_all_api_h.h     \
69 +                            vbng/vbng_msg_enum.h       \
70 +                            vbng/vbng.api.h
71 +
72 +# vi:syntax=automake
73 diff --git a/src/plugins/vbng/etc/dictionary b/src/plugins/vbng/etc/dictionary
74 new file mode 100644
75 index 00000000..45f4189c
76 --- /dev/null
77 +++ b/src/plugins/vbng/etc/dictionary
78 @@ -0,0 +1,274 @@
79 +#
80 +# Updated 97/06/13 to livingston-radius-2.01 miquels@cistron.nl
81 +#
82 +#      This file contains dictionary translations for parsing
83 +#      requests and generating responses.  All transactions are
84 +#      composed of Attribute/Value Pairs.  The value of each attribute
85 +#      is specified as one of 4 data types.  Valid data types are:
86 +#
87 +#      string - 0-253 octets
88 +#      ipaddr - 4 octets in network byte order
89 +#      integer - 32 bit value in big endian order (high byte first)
90 +#      date - 32 bit value in big endian order - seconds since
91 +#                                      00:00:00 GMT,  Jan.  1,  1970
92 +#
93 +#      Enumerated values are stored in the user file with dictionary
94 +#      VALUE translations for easy administration.
95 +#
96 +#      Example:
97 +#
98 +#      ATTRIBUTE         VALUE
99 +#      ---------------   -----
100 +#      Framed-Protocol = PPP
101 +#      7               = 1     (integer encoding)
102 +#
103 +
104 +#
105 +#      Following are the proper new names. Use these.
106 +#
107 +ATTRIBUTE      User-Name               1       string
108 +ATTRIBUTE      Password                2       string
109 +ATTRIBUTE      CHAP-Password           3       string
110 +ATTRIBUTE      NAS-IP-Address          4       ipaddr
111 +ATTRIBUTE      NAS-Port-Id             5       integer
112 +ATTRIBUTE      Service-Type            6       integer
113 +ATTRIBUTE      Framed-Protocol         7       integer
114 +ATTRIBUTE      Framed-IP-Address       8       ipaddr
115 +ATTRIBUTE      Framed-IP-Netmask       9       ipaddr
116 +ATTRIBUTE      Framed-Routing          10      integer
117 +ATTRIBUTE      Filter-Id               11      string
118 +ATTRIBUTE      Framed-MTU              12      integer
119 +ATTRIBUTE      Framed-Compression      13      integer
120 +ATTRIBUTE      Login-IP-Host           14      ipaddr
121 +ATTRIBUTE      Login-Service           15      integer
122 +ATTRIBUTE      Login-TCP-Port          16      integer
123 +ATTRIBUTE      Reply-Message           18      string
124 +ATTRIBUTE      Callback-Number         19      string
125 +ATTRIBUTE      Callback-Id             20      string
126 +ATTRIBUTE      Framed-Route            22      string
127 +ATTRIBUTE      Framed-IPX-Network      23      ipaddr
128 +ATTRIBUTE      State                   24      string
129 +ATTRIBUTE      Class                   25      string
130 +ATTRIBUTE      Vendor-Specific         26      string
131 +ATTRIBUTE      Session-Timeout         27      integer
132 +ATTRIBUTE      Idle-Timeout            28      integer
133 +ATTRIBUTE      Termination-Action      29      integer
134 +ATTRIBUTE      Called-Station-Id       30      string
135 +ATTRIBUTE      Calling-Station-Id      31      string
136 +ATTRIBUTE      NAS-Identifier          32      string
137 +ATTRIBUTE      Proxy-State             33      string
138 +ATTRIBUTE      Login-LAT-Service       34      string
139 +ATTRIBUTE      Login-LAT-Node          35      string
140 +ATTRIBUTE      Login-LAT-Group         36      string
141 +ATTRIBUTE      Framed-AppleTalk-Link   37      integer
142 +ATTRIBUTE      Framed-AppleTalk-Network        38      integer
143 +ATTRIBUTE      Framed-AppleTalk-Zone   39      string
144 +ATTRIBUTE      Acct-Status-Type        40      integer
145 +ATTRIBUTE      Acct-Delay-Time         41      integer
146 +ATTRIBUTE      Acct-Input-Octets       42      integer
147 +ATTRIBUTE      Acct-Output-Octets      43      integer
148 +ATTRIBUTE      Acct-Session-Id         44      string
149 +ATTRIBUTE      Acct-Authentic          45      integer
150 +ATTRIBUTE      Acct-Session-Time       46      integer
151 +ATTRIBUTE      Acct-Input-Packets      47      integer
152 +ATTRIBUTE      Acct-Output-Packets     48      integer
153 +ATTRIBUTE      Acct-Terminate-Cause    49      integer
154 +ATTRIBUTE      Acct-Multi-Session-Id   50      string
155 +ATTRIBUTE      Acct-Link-Count         51      integer
156 +ATTRIBUTE      Acct-Input-Gigawords    52      integer
157 +ATTRIBUTE      Acct-Output-Gigawords   53      integer
158 +ATTRIBUTE      Event-Timestamp         55      integer
159 +ATTRIBUTE      CHAP-Challenge          60      string
160 +ATTRIBUTE      NAS-Port-Type           61      integer
161 +ATTRIBUTE      Port-Limit              62      integer
162 +ATTRIBUTE      Login-LAT-Port          63      integer
163 +ATTRIBUTE      Connect-Info            77      string
164 +
165 +#
166 +#      RFC3162 IPv6 attributes
167 +#
168 +ATTRIBUTE      NAS-IPv6-Address        95      string
169 +ATTRIBUTE      Framed-Interface-Id     96      string
170 +ATTRIBUTE      Framed-IPv6-Prefix      97      ipv6prefix
171 +ATTRIBUTE      Login-IPv6-Host         98      string
172 +ATTRIBUTE      Framed-IPv6-Route       99      string
173 +ATTRIBUTE      Framed-IPv6-Pool        100     string
174 +
175 +#
176 +#      RFC6911 IPv6 attributes
177 +#
178 +ATTRIBUTE      Framed-IPv6-Address     168     ipv6addr
179 +ATTRIBUTE      DNS-Server-IPv6-Address 169     ipv6addr
180 +ATTRIBUTE      Route-IPv6-Information  170     ipv6prefix
181 +
182 +#
183 +#      Experimental Non Protocol Attributes used by Cistron-Radiusd
184 +#
185 +ATTRIBUTE      Huntgroup-Name          221     string
186 +ATTRIBUTE      User-Category           1029    string
187 +ATTRIBUTE      Group-Name              1030    string
188 +ATTRIBUTE      Simultaneous-Use        1034    integer
189 +ATTRIBUTE      Strip-User-Name         1035    integer
190 +ATTRIBUTE      Fall-Through            1036    integer
191 +ATTRIBUTE      Add-Port-To-IP-Address  1037    integer
192 +ATTRIBUTE      Exec-Program            1038    string
193 +ATTRIBUTE      Exec-Program-Wait       1039    string
194 +ATTRIBUTE      Hint                    1040    string
195 +
196 +#
197 +#      Non-Protocol Attributes
198 +#      These attributes are used internally by the server
199 +#
200 +ATTRIBUTE      Expiration                21    date
201 +ATTRIBUTE      Auth-Type               1000    integer
202 +ATTRIBUTE      Menu                    1001    string
203 +ATTRIBUTE      Termination-Menu        1002    string
204 +ATTRIBUTE      Prefix                  1003    string
205 +ATTRIBUTE      Suffix                  1004    string
206 +ATTRIBUTE      Group                   1005    string
207 +ATTRIBUTE      Crypt-Password          1006    string
208 +ATTRIBUTE      Connect-Rate            1007    integer
209 +
210 +#
211 +#      Integer Translations
212 +#
213 +
214 +#      User Types
215 +
216 +VALUE          Service-Type            Login-User              1
217 +VALUE          Service-Type            Framed-User             2
218 +VALUE          Service-Type            Callback-Login-User     3
219 +VALUE          Service-Type            Callback-Framed-User    4
220 +VALUE          Service-Type            Outbound-User           5
221 +VALUE          Service-Type            Administrative-User     6
222 +VALUE          Service-Type            NAS-Prompt-User         7
223 +VALUE          Service-Type            Authenticate-Only       8
224 +VALUE          Service-Type            Callback-NAS-Prompt     9
225 +VALUE          Service-Type            Call-Check              10
226 +VALUE          Service-Type            Callback-Administrative 11
227 +
228 +#      Framed Protocols
229 +
230 +VALUE          Framed-Protocol         PPP                     1
231 +VALUE          Framed-Protocol         SLIP                    2
232 +VALUE          Framed-Protocol         ARAP                    3
233 +VALUE          Framed-Protocol         GANDALF-SLMLP           4
234 +VALUE          Framed-Protocol         XYLOGICS-IPX-SLIP       5
235 +VALUE          Framed-Protocol         X75                     6
236 +
237 +#      Framed Routing Values
238 +
239 +VALUE          Framed-Routing          None                    0
240 +VALUE          Framed-Routing          Broadcast               1
241 +VALUE          Framed-Routing          Listen                  2
242 +VALUE          Framed-Routing          Broadcast-Listen        3
243 +
244 +#      Framed Compression Types
245 +
246 +VALUE          Framed-Compression      None                    0
247 +VALUE          Framed-Compression      Van-Jacobson-TCP-IP     1
248 +VALUE          Framed-Compression      IPX-Header              2
249 +VALUE          Framed-Compression      Stac-LZS                3
250 +
251 +#      Login Services
252 +
253 +VALUE          Login-Service           Telnet                  0
254 +VALUE          Login-Service           Rlogin                  1
255 +VALUE          Login-Service           TCP-Clear               2
256 +VALUE          Login-Service           PortMaster              3
257 +VALUE          Login-Service           LAT                     4
258 +VALUE          Login-Service           X.25-PAD                5
259 +VALUE          Login-Service           X.25-T3POS              6
260 +VALUE          Login-Service           TCP-Clear-Quiet         8
261 +
262 +#      Status Types
263 +
264 +VALUE          Acct-Status-Type        Start                   1
265 +VALUE          Acct-Status-Type        Stop                    2
266 +VALUE          Acct-Status-Type        Alive                   3
267 +VALUE          Acct-Status-Type        Accounting-On           7
268 +VALUE          Acct-Status-Type        Accounting-Off          8
269 +
270 +#      Authentication Types
271 +
272 +VALUE          Acct-Authentic          RADIUS                  1
273 +VALUE          Acct-Authentic          Local                   2
274 +VALUE          Acct-Authentic          Remote                  3
275 +
276 +#      Termination Options
277 +
278 +VALUE          Termination-Action      Default                 0
279 +VALUE          Termination-Action      RADIUS-Request          1
280 +
281 +#      NAS Port Types, available in 3.3.1 and later
282 +
283 +VALUE          NAS-Port-Type           Async                   0
284 +VALUE          NAS-Port-Type           Sync                    1
285 +VALUE          NAS-Port-Type           ISDN                    2
286 +VALUE          NAS-Port-Type           ISDN-V120               3
287 +VALUE          NAS-Port-Type           ISDN-V110               4
288 +VALUE          NAS-Port-Type           Virtual                 5
289 +VALUE          NAS-Port-Type           PIAFS                   6
290 +VALUE          NAS-Port-Type           HDLC-Clear-Channel      7
291 +VALUE          NAS-Port-Type           X.25                    8
292 +VALUE          NAS-Port-Type           X.75                    9
293 +VALUE          NAS-Port-Type           G.3-Fax                 10
294 +VALUE          NAS-Port-Type           SDSL                    11
295 +VALUE          NAS-Port-Type           ADSL-CAP                12
296 +VALUE          NAS-Port-Type           ADSL-DMT                13
297 +VALUE          NAS-Port-Type           IDSL                    14
298 +VALUE          NAS-Port-Type           Ethernet                15
299 +
300 +#      Acct Terminate Causes, available in 3.3.2 and later
301 +
302 +VALUE           Acct-Terminate-Cause    User-Request            1
303 +VALUE           Acct-Terminate-Cause    Lost-Carrier            2
304 +VALUE           Acct-Terminate-Cause    Lost-Service            3
305 +VALUE           Acct-Terminate-Cause    Idle-Timeout            4
306 +VALUE           Acct-Terminate-Cause    Session-Timeout         5
307 +VALUE           Acct-Terminate-Cause    Admin-Reset             6
308 +VALUE           Acct-Terminate-Cause    Admin-Reboot            7
309 +VALUE           Acct-Terminate-Cause    Port-Error              8
310 +VALUE           Acct-Terminate-Cause    NAS-Error               9
311 +VALUE           Acct-Terminate-Cause    NAS-Request             10
312 +VALUE           Acct-Terminate-Cause    NAS-Reboot              11
313 +VALUE           Acct-Terminate-Cause    Port-Unneeded           12
314 +VALUE           Acct-Terminate-Cause    Port-Preempted          13
315 +VALUE           Acct-Terminate-Cause    Port-Suspended          14
316 +VALUE           Acct-Terminate-Cause    Service-Unavailable     15
317 +VALUE           Acct-Terminate-Cause    Callback                16
318 +VALUE           Acct-Terminate-Cause    User-Error              17
319 +VALUE           Acct-Terminate-Cause    Host-Request            18
320 +
321 +#
322 +#      Non-Protocol Integer Translations
323 +#
324 +
325 +VALUE          Auth-Type               Local                   0
326 +VALUE          Auth-Type               System                  1
327 +VALUE          Auth-Type               SecurID                 2
328 +VALUE          Auth-Type               Crypt-Local             3
329 +VALUE          Auth-Type               Reject                  4
330 +
331 +#
332 +#      Cistron extensions
333 +#
334 +VALUE          Auth-Type               Pam                     253
335 +VALUE          Auth-Type               Accept                  254
336 +
337 +#
338 +#      Experimental Non-Protocol Integer Translations for Cistron-Radiusd
339 +#
340 +VALUE          Fall-Through            No                      0
341 +VALUE          Fall-Through            Yes                     1
342 +VALUE          Add-Port-To-IP-Address  No                      0
343 +VALUE          Add-Port-To-IP-Address  Yes                     1
344 +
345 +#
346 +#      Configuration Values
347 +#      uncomment these two lines to turn account expiration on
348 +#
349 +
350 +#VALUE         Server-Config           Password-Expiration     30
351 +#VALUE         Server-Config           Password-Warning        5
352 +
353 diff --git a/src/plugins/vbng/etc/dictionary.ascend b/src/plugins/vbng/etc/dictionary.ascend
354 new file mode 100644
355 index 00000000..a02c207d
356 --- /dev/null
357 +++ b/src/plugins/vbng/etc/dictionary.ascend
358 @@ -0,0 +1,297 @@
359 +#
360 +# Ascend dictionary.
361 +#
362 +#              Enable by putting the line "$INCLUDE dictionary.ascend" into
363 +#              the main dictionary file.
364 +#
365 +# Version:     1.00  21-Jul-1997  Jens Glaser <jens@regio.net>
366 +#
367 +
368 +
369 +#
370 +#      Ascend specific extensions
371 +#      Used by ASCEND MAX/Pipeline products
372 +#
373 +ATTRIBUTE      Ascend-FCP-Parameter            119     string
374 +ATTRIBUTE      Ascend-Modem-PortNo             120     integer
375 +ATTRIBUTE      Ascend-Modem-SlotNo             121     integer
376 +ATTRIBUTE      Ascend-Modem-ShelfNo            122     integer
377 +ATTRIBUTE      Ascend-Call-Attempt-Limit       123     integer
378 +ATTRIBUTE      Ascend-Call-Block-Duration      124     integer
379 +ATTRIBUTE      Ascend-Maximum-Call-Duration    125     integer
380 +ATTRIBUTE      Ascend-Temporary-Rtes           126     integer
381 +ATTRIBUTE       Tunneling-Protocol              127     integer
382 +ATTRIBUTE       Ascend-Shared-Profile-Enable    128     integer
383 +ATTRIBUTE      Ascend-Primary-Home-Agent       129     string
384 +ATTRIBUTE      Ascend-Secondary-Home-Agent     130     string
385 +ATTRIBUTE      Ascend-Dialout-Allowed          131     integer
386 +ATTRIBUTE      Ascend-Client-Gateway           132     ipaddr
387 +ATTRIBUTE      Ascend-BACP-Enable              133     integer
388 +ATTRIBUTE      Ascend-DHCP-Maximum-Leases      134     integer
389 +ATTRIBUTE      Ascend-Client-Primary-DNS       135     ipaddr
390 +ATTRIBUTE      Ascend-Client-Secondary-DNS     136     ipaddr
391 +ATTRIBUTE      Ascend-Client-Assign-DNS        137     integer
392 +ATTRIBUTE      Ascend-User-Acct-Type           138     integer
393 +ATTRIBUTE      Ascend-User-Acct-Host           139     ipaddr
394 +ATTRIBUTE      Ascend-User-Acct-Port           140     integer
395 +ATTRIBUTE      Ascend-User-Acct-Key            141     string
396 +ATTRIBUTE      Ascend-User-Acct-Base           142     integer
397 +ATTRIBUTE      Ascend-User-Acct-Time           143     integer
398 +ATTRIBUTE      Ascend-Assign-IP-Client         144     ipaddr
399 +ATTRIBUTE      Ascend-Assign-IP-Server         145     ipaddr
400 +ATTRIBUTE      Ascend-Assign-IP-Global-Pool    146     string
401 +ATTRIBUTE      Ascend-DHCP-Reply               147     integer
402 +ATTRIBUTE      Ascend-DHCP-Pool-Number         148     integer
403 +ATTRIBUTE      Ascend-Expect-Callback          149     integer
404 +ATTRIBUTE      Ascend-Event-Type               150     integer
405 +ATTRIBUTE      Ascend-Session-Svr-Key          151     string
406 +ATTRIBUTE      Ascend-Multicast-Rate-Limit     152     integer
407 +ATTRIBUTE      Ascend-IF-Netmask               153     ipaddr
408 +ATTRIBUTE      Ascend-Remote-Addr              154     ipaddr
409 +ATTRIBUTE      Ascend-Multicast-Client         155     integer
410 +ATTRIBUTE      Ascend-FR-Circuit-Name          156     string
411 +ATTRIBUTE      Ascend-FR-LinkUp                157     integer
412 +ATTRIBUTE      Ascend-FR-Nailed-Grp            158     integer
413 +ATTRIBUTE      Ascend-FR-Type                  159     integer
414 +ATTRIBUTE      Ascend-FR-Link-Mgt              160     integer
415 +ATTRIBUTE      Ascend-FR-N391                  161     integer
416 +ATTRIBUTE      Ascend-FR-DCE-N392              162     integer
417 +ATTRIBUTE      Ascend-FR-DTE-N392              163     integer
418 +ATTRIBUTE      Ascend-FR-DCE-N393              164     integer
419 +ATTRIBUTE      Ascend-FR-DTE-N393              165     integer
420 +ATTRIBUTE      Ascend-FR-T391                  166     integer
421 +ATTRIBUTE      Ascend-FR-T392                  167     integer
422 +ATTRIBUTE      Ascend-Bridge-Address           168     string
423 +ATTRIBUTE       Ascend-TS-Idle-Limit            169     integer
424 +ATTRIBUTE       Ascend-TS-Idle-Mode             170     integer
425 +ATTRIBUTE      Ascend-DBA-Monitor              171     integer
426 +ATTRIBUTE      Ascend-Base-Channel-Count       172     integer
427 +ATTRIBUTE      Ascend-Minimum-Channels         173     integer
428 +ATTRIBUTE      Ascend-IPX-Route                174     string
429 +ATTRIBUTE      Ascend-FT1-Caller               175     integer
430 +ATTRIBUTE      Ascend-Backup                   176     string
431 +ATTRIBUTE      Ascend-Call-Type                177     integer
432 +ATTRIBUTE      Ascend-Group                    178     string
433 +ATTRIBUTE      Ascend-FR-DLCI                  179     integer
434 +ATTRIBUTE      Ascend-FR-Profile-Name          180     string
435 +ATTRIBUTE      Ascend-Ara-PW                   181     string
436 +ATTRIBUTE      Ascend-IPX-Node-Addr            182     string
437 +ATTRIBUTE      Ascend-Home-Agent-IP-Addr       183     ipaddr
438 +ATTRIBUTE      Ascend-Home-Agent-Password      184     string
439 +ATTRIBUTE      Ascend-Home-Network-Name        185     string
440 +ATTRIBUTE      Ascend-Home-Agent-UDP-Port      186     integer
441 +ATTRIBUTE      Ascend-Multilink-ID             187     integer
442 +ATTRIBUTE      Ascend-Num-In-Multilink         188     integer
443 +ATTRIBUTE      Ascend-First-Dest               189     ipaddr
444 +ATTRIBUTE      Ascend-Pre-Input-Octets         190     integer
445 +ATTRIBUTE      Ascend-Pre-Output-Octets        191     integer
446 +ATTRIBUTE      Ascend-Pre-Input-Packets        192     integer
447 +ATTRIBUTE      Ascend-Pre-Output-Packets       193     integer
448 +ATTRIBUTE      Ascend-Maximum-Time             194     integer
449 +ATTRIBUTE      Ascend-Disconnect-Cause         195     integer
450 +ATTRIBUTE      Ascend-Connect-Progress         196     integer
451 +ATTRIBUTE      Ascend-Data-Rate                197     integer
452 +ATTRIBUTE      Ascend-PreSession-Time          198     integer
453 +ATTRIBUTE      Ascend-Token-Idle               199     integer
454 +ATTRIBUTE      Ascend-Token-Immediate          200     integer
455 +ATTRIBUTE      Ascend-Require-Auth             201     integer
456 +ATTRIBUTE      Ascend-Number-Sessions          202     string
457 +ATTRIBUTE      Ascend-Authen-Alias             203     string
458 +ATTRIBUTE      Ascend-Token-Expiry             204     integer
459 +ATTRIBUTE      Ascend-Menu-Selector            205     string
460 +ATTRIBUTE      Ascend-Menu-Item                206     string
461 +ATTRIBUTE      Ascend-PW-Warntime              207     integer
462 +ATTRIBUTE      Ascend-PW-Lifetime              208     integer
463 +ATTRIBUTE      Ascend-IP-Direct                209     ipaddr
464 +ATTRIBUTE      Ascend-PPP-VJ-Slot-Comp         210     integer
465 +ATTRIBUTE      Ascend-PPP-VJ-1172              211     integer
466 +ATTRIBUTE      Ascend-PPP-Async-Map            212     integer
467 +ATTRIBUTE      Ascend-Third-Prompt             213     string
468 +ATTRIBUTE      Ascend-Send-Secret              214     string
469 +ATTRIBUTE      Ascend-Receive-Secret           215     string
470 +ATTRIBUTE      Ascend-IPX-Peer-Mode            216     integer
471 +ATTRIBUTE      Ascend-IP-Pool-Definition       217     string
472 +ATTRIBUTE      Ascend-Assign-IP-Pool           218     integer
473 +ATTRIBUTE      Ascend-FR-Direct                219     integer
474 +ATTRIBUTE      Ascend-FR-Direct-Profile        220     string
475 +ATTRIBUTE      Ascend-FR-Direct-DLCI           221     integer
476 +ATTRIBUTE      Ascend-Handle-IPX               222     integer
477 +ATTRIBUTE      Ascend-Netware-timeout          223     integer
478 +ATTRIBUTE      Ascend-IPX-Alias                224     integer
479 +ATTRIBUTE      Ascend-Metric                   225     integer
480 +ATTRIBUTE      Ascend-PRI-Number-Type          226     integer
481 +ATTRIBUTE      Ascend-Dial-Number              227     string
482 +ATTRIBUTE      Ascend-Route-IP                 228     integer
483 +ATTRIBUTE      Ascend-Route-IPX                229     integer
484 +ATTRIBUTE      Ascend-Bridge                   230     integer
485 +ATTRIBUTE      Ascend-Send-Auth                231     integer
486 +ATTRIBUTE      Ascend-Send-Passwd              232     string
487 +ATTRIBUTE      Ascend-Link-Compression         233     integer
488 +ATTRIBUTE      Ascend-Target-Util              234     integer
489 +ATTRIBUTE      Ascend-Maximum-Channels         235     integer
490 +ATTRIBUTE      Ascend-Inc-Channel-Count        236     integer
491 +ATTRIBUTE      Ascend-Dec-Channel-Count        237     integer
492 +ATTRIBUTE      Ascend-Seconds-Of-History       238     integer
493 +ATTRIBUTE      Ascend-History-Weigh-Type       239     integer
494 +ATTRIBUTE      Ascend-Add-Seconds              240     integer
495 +ATTRIBUTE      Ascend-Remove-Seconds           241     integer
496 +ATTRIBUTE      Ascend-Idle-Limit               244     integer
497 +ATTRIBUTE      Ascend-Preempt-Limit            245     integer
498 +ATTRIBUTE      Ascend-Callback                 246     integer
499 +ATTRIBUTE      Ascend-Data-Svc                 247     integer
500 +ATTRIBUTE      Ascend-Force-56                 248     integer
501 +ATTRIBUTE      Ascend-Billing-Number           249     string
502 +ATTRIBUTE      Ascend-Call-By-Call             250     integer
503 +ATTRIBUTE      Ascend-Transit-Number           251     string
504 +ATTRIBUTE      Ascend-Host-Info                252     string
505 +ATTRIBUTE      Ascend-PPP-Address              253     ipaddr
506 +ATTRIBUTE      Ascend-MPP-Idle-Percent         254     integer
507 +ATTRIBUTE      Ascend-Xmit-Rate                255     integer
508 +
509 +
510 +
511 +# Ascend protocols
512 +VALUE          Service-Type            Dialout-Framed-User     5
513 +VALUE          Framed-Protocol         ARA                     255
514 +VALUE          Framed-Protocol         MPP                     256
515 +VALUE          Framed-Protocol         EURAW                   257
516 +VALUE          Framed-Protocol         EUUI                    258
517 +VALUE          Framed-Protocol         X25                     259
518 +VALUE          Framed-Protocol         COMB                    260
519 +VALUE          Framed-Protocol         FR                      261
520 +VALUE          Framed-Protocol         MP                      262
521 +VALUE          Framed-Protocol         FR-CIR                  263
522 +
523 +
524 +#
525 +#      Ascend specific extensions
526 +#      Used by ASCEND MAX/Pipeline products (see above)
527 +#
528 +
529 +VALUE          Ascend-FR-Direct        FR-Direct-No            0
530 +VALUE          Ascend-FR-Direct        FR-Direct-Yes           1
531 +VALUE          Ascend-Handle-IPX       Handle-IPX-None         0
532 +VALUE          Ascend-Handle-IPX       Handle-IPX-Client       1
533 +VALUE          Ascend-Handle-IPX       Handle-IPX-Server       2
534 +VALUE          Ascend-IPX-Peer-Mode    IPX-Peer-Router         0
535 +VALUE          Ascend-IPX-Peer-Mode    IPX-Peer-Dialin         1
536 +VALUE          Ascend-Call-Type        Nailed                  1
537 +VALUE          Ascend-Call-Type        Nailed/Mpp              2
538 +VALUE          Ascend-Call-Type        Perm/Switched           3
539 +VALUE          Ascend-FT1-Caller       FT1-No                  0
540 +VALUE          Ascend-FT1-Caller       FT1-Yes                 1
541 +VALUE          Ascend-PRI-Number-Type  Unknown-Number          0
542 +VALUE          Ascend-PRI-Number-Type  Intl-Number             1
543 +VALUE          Ascend-PRI-Number-Type  National-Number         2
544 +VALUE          Ascend-PRI-Number-Type  Local-Number            4
545 +VALUE          Ascend-PRI-Number-Type  Abbrev-Number           5
546 +VALUE          Ascend-Route-IPX        Route-IPX-No            0
547 +VALUE          Ascend-Route-IPX        Route-IPX-Yes           1
548 +VALUE          Ascend-Bridge           Bridge-No               0
549 +VALUE          Ascend-Bridge           Bridge-Yes              1
550 +VALUE                  Ascend-TS-Idle-Mode     TS-Idle-None            0
551 +VALUE          Ascend-TS-Idle-Mode     TS-Idle-Input           1
552 +VALUE                  Ascend-TS-Idle-Mode     TS-Idle-Input-Output    2
553 +VALUE          Ascend-Send-Auth        Send-Auth-None          0
554 +VALUE          Ascend-Send-Auth        Send-Auth-PAP           1
555 +VALUE          Ascend-Send-Auth        Send-Auth-CHAP          2
556 +VALUE          Ascend-Send-Auth        Send-Auth-MS-CHAP       3
557 +VALUE          Ascend-Link-Compression Link-Comp-None          0
558 +VALUE          Ascend-Link-Compression Link-Comp-Stac          1
559 +VALUE          Ascend-Link-Compression Link-Comp-Stac-Draft-9  2
560 +VALUE          Ascend-Link-Compression Link-Comp-MS-Stac       3
561 +VALUE          Ascend-History-Weigh-Type       History-Constant        0
562 +VALUE          Ascend-History-Weigh-Type       History-Linear          1
563 +VALUE          Ascend-History-Weigh-Type       History-Quadratic       2
564 +VALUE          Ascend-Callback         Callback-No             0
565 +VALUE          Ascend-Callback         Callback-Yes            1
566 +VALUE          Ascend-Expect-Callback  Expect-Callback-No      0
567 +VALUE          Ascend-Expect-Callback  Expect-Callback-Yes     1
568 +VALUE          Ascend-Data-Svc         Switched-Voice-Bearer   0
569 +VALUE          Ascend-Data-Svc         Switched-56KR           1
570 +VALUE          Ascend-Data-Svc         Switched-64K            2
571 +VALUE          Ascend-Data-Svc         Switched-64KR           3
572 +VALUE          Ascend-Data-Svc         Switched-56K            4
573 +VALUE          Ascend-Data-Svc         Switched-384KR          5
574 +VALUE          Ascend-Data-Svc         Switched-384K           6
575 +VALUE          Ascend-Data-Svc         Switched-1536K          7
576 +VALUE          Ascend-Data-Svc         Switched-1536KR         8
577 +VALUE          Ascend-Data-Svc         Switched-128K           9
578 +VALUE          Ascend-Data-Svc         Switched-192K           10
579 +VALUE          Ascend-Data-Svc         Switched-256K           11
580 +VALUE          Ascend-Data-Svc         Switched-320K           12
581 +VALUE          Ascend-Data-Svc         Switched-384K-MR        13
582 +VALUE          Ascend-Data-Svc         Switched-448K           14
583 +VALUE          Ascend-Data-Svc         Switched-512K           15
584 +VALUE          Ascend-Data-Svc         Switched-576K           16
585 +VALUE          Ascend-Data-Svc         Switched-640K           17
586 +VALUE          Ascend-Data-Svc         Switched-704K           18
587 +VALUE          Ascend-Data-Svc         Switched-768K           19
588 +VALUE          Ascend-Data-Svc         Switched-832K           20
589 +VALUE          Ascend-Data-Svc         Switched-896K           21
590 +VALUE          Ascend-Data-Svc         Switched-960K           22
591 +VALUE          Ascend-Data-Svc         Switched-1024K          23
592 +VALUE          Ascend-Data-Svc         Switched-1088K          24
593 +VALUE          Ascend-Data-Svc         Switched-1152K          25
594 +VALUE          Ascend-Data-Svc         Switched-1216K          26
595 +VALUE          Ascend-Data-Svc         Switched-1280K          27
596 +VALUE          Ascend-Data-Svc         Switched-1344K          28
597 +VALUE          Ascend-Data-Svc         Switched-1408K          29
598 +VALUE          Ascend-Data-Svc         Switched-1472K          30
599 +VALUE          Ascend-Data-Svc         Switched-1600K          31
600 +VALUE          Ascend-Data-Svc         Switched-1664K          32
601 +VALUE          Ascend-Data-Svc         Switched-1728K          33
602 +VALUE          Ascend-Data-Svc         Switched-1792K          34
603 +VALUE          Ascend-Data-Svc         Switched-1856K          35
604 +VALUE          Ascend-Data-Svc         Switched-1920K          36
605 +VALUE          Ascend-Data-Svc         Switched-inherited              37
606 +VALUE          Ascend-Data-Svc         Switched-restricted-bearer-x30  38
607 +VALUE          Ascend-Data-Svc         Switched-clear-bearer-v110      39
608 +VALUE          Ascend-Data-Svc         Switched-restricted-64-x30      40
609 +VALUE          Ascend-Data-Svc         Switched-clear-56-v110          41
610 +VALUE          Ascend-Data-Svc         Switched-modem                  42
611 +VALUE          Ascend-Data-Svc         Switched-atmodem                43
612 +VALUE          Ascend-Data-Svc         Nailed-56KR             1
613 +VALUE          Ascend-Data-Svc         Nailed-64K              2
614 +VALUE          Ascend-Force-56         Force-56-No             0
615 +VALUE          Ascend-Force-56         Force-56-Yes            1
616 +VALUE          Ascend-PW-Lifetime      Lifetime-In-Days        0
617 +VALUE          Ascend-PW-Warntime      Days-Of-Warning         0
618 +VALUE          Ascend-PPP-VJ-1172      PPP-VJ-1172             1
619 +VALUE          Ascend-PPP-VJ-Slot-Comp VJ-Slot-Comp-No         1
620 +VALUE          Ascend-Require-Auth     Not-Require-Auth        0
621 +VALUE          Ascend-Require-Auth     Require-Auth            1
622 +VALUE          Ascend-Token-Immediate  Tok-Imm-No              0
623 +VALUE          Ascend-Token-Immediate  Tok-Imm-Yes             1
624 +VALUE          Ascend-DBA-Monitor              DBA-Transmit            0
625 +VALUE          Ascend-DBA-Monitor      DBA-Transmit-Recv       1
626 +VALUE          Ascend-DBA-Monitor      DBA-None                2
627 +VALUE          Ascend-FR-Type          Ascend-FR-DTE           0
628 +VALUE          Ascend-FR-Type          Ascend-FR-DCE           1
629 +VALUE          Ascend-FR-Type          Ascend-FR-NNI           2
630 +VALUE          Ascend-FR-Link-Mgt      Ascend-FR-No-Link-Mgt   0
631 +VALUE          Ascend-FR-Link-Mgt      Ascend-FR-T1-617D       1
632 +VALUE          Ascend-FR-Link-Mgt      Ascend-FR-Q-933A        2
633 +VALUE          Ascend-FR-LinkUp        Ascend-LinkUp-Default   0
634 +VALUE          Ascend-FR-LinkUp        Ascend-LinkUp-AlwaysUp  1
635 +VALUE          Ascend-Multicast-Client Multicast-No            0
636 +VALUE          Ascend-Multicast-Client Multicast-Yes           1
637 +VALUE          Ascend-User-Acct-Type   Ascend-User-Acct-None   0
638 +VALUE          Ascend-User-Acct-Type   Ascend-User-Acct-User   1
639 +VALUE          Ascend-User-Acct-Type   Ascend-User-Acct-User-Default   2
640 +VALUE          Ascend-User-Acct-Base   Base-10                 0
641 +VALUE          Ascend-User-Acct-Base   Base-16                 1
642 +VALUE          Ascend-DHCP-Reply       DHCP-Reply-No           0
643 +VALUE          Ascend-DHCP-Reply       DHCP-Reply-Yes          1
644 +VALUE          Ascend-Client-Assign-DNS        DNS-Assign-No           0
645 +VALUE          Ascend-Client-Assign-DNS        DNS-Assign-Yes          1
646 +VALUE          Ascend-Event-Type       Ascend-ColdStart        1
647 +VALUE          Ascend-Event-Type       Ascend-Session-Event    2
648 +VALUE          Ascend-BACP-Enable      BACP-No                 0
649 +VALUE          Ascend-BACP-Enable      BACP-Yes                1
650 +VALUE          Ascend-Dialout-Allowed  Dialout-Not-Allowed     0
651 +VALUE          Ascend-Dialout-Allowed  Dialout-Allowed         1
652 +VALUE          Ascend-Shared-Profile-Enable    Shared-Profile-No       0
653 +VALUE          Ascend-Shared-Profile-Enable    Shared-Profile-Yes      1
654 +VALUE          Ascend-Temporary-Rtes   Temp-Rtes-No            0
655 +VALUE          Ascend-Temporary-Rtes   Temp-Rtes-Yes           1
656 diff --git a/src/plugins/vbng/etc/dictionary.compat b/src/plugins/vbng/etc/dictionary.compat
657 new file mode 100644
658 index 00000000..4c85ea87
659 --- /dev/null
660 +++ b/src/plugins/vbng/etc/dictionary.compat
661 @@ -0,0 +1,47 @@
662 +#
663 +#      Obsolete names for backwards compatibility with older users files.
664 +#      Move the $INCLUDE in the main dictionary file to the end if you want
665 +#      these names to be used in the "details" logfile.
666 +#
667 +ATTRIBUTE      Client-Id               4       ipaddr
668 +ATTRIBUTE      Client-Port-Id          5       integer
669 +ATTRIBUTE      User-Service-Type       6       integer
670 +ATTRIBUTE      Framed-Address          8       ipaddr
671 +ATTRIBUTE      Framed-Netmask          9       ipaddr
672 +ATTRIBUTE      Framed-Filter-Id        11      string
673 +ATTRIBUTE      Login-Host              14      ipaddr
674 +ATTRIBUTE      Login-Port              16      integer
675 +ATTRIBUTE      Old-Password            17      string
676 +ATTRIBUTE      Port-Message            18      string
677 +ATTRIBUTE      Dialback-No             19      string
678 +ATTRIBUTE      Dialback-Name           20      string
679 +ATTRIBUTE      Challenge-State         24      string
680 +VALUE          Framed-Compression      Van-Jacobsen-TCP-IP     1
681 +VALUE          Framed-Compression      VJ-TCP-IP               1
682 +VALUE          Service-Type            Shell-User              6
683 +VALUE          Auth-Type               Unix                    1
684 +VALUE          Service-Type            Dialback-Login-User     3
685 +VALUE          Service-Type            Dialback-Framed-User    4
686 +
687 +#
688 +#      For compatibility with MERIT users files.
689 +#
690 +ATTRIBUTE      NAS-Port                5       integer
691 +ATTRIBUTE      Login-Host              14      ipaddr
692 +ATTRIBUTE      Login-Callback-Number   19      string
693 +ATTRIBUTE      Framed-Callback-Id      20      string
694 +ATTRIBUTE      Client-Port-DNIS        30      string
695 +ATTRIBUTE      Caller-ID               31      string
696 +VALUE          Service-Type            Login                   1
697 +VALUE          Service-Type            Framed                  2
698 +VALUE          Service-Type            Callback-Login          3
699 +VALUE          Service-Type            Callback-Framed         4
700 +VALUE          Service-Type            Exec-User               7
701 +
702 +#
703 +#      For compatibility with ESVA RADIUS, Old Cistron RADIUS
704 +#
705 +ATTRIBUTE      Session                 1034    integer
706 +ATTRIBUTE      User-Name-Is-Star       1035    integer
707 +VALUE          User-Name-Is-Star       No                      0
708 +VALUE          User-Name-Is-Star       Yes                     1
709 diff --git a/src/plugins/vbng/etc/dictionary.dhcp b/src/plugins/vbng/etc/dictionary.dhcp
710 new file mode 100644
711 index 00000000..cf329348
712 --- /dev/null
713 +++ b/src/plugins/vbng/etc/dictionary.dhcp
714 @@ -0,0 +1,440 @@
715 +# -*- text -*-
716 +# Copyright (C) 2011 The FreeRADIUS Server project and contributors
717 +##############################################################################
718 +#
719 +#      DHCP to RADUS gateway dictionary.
720 +#
721 +#      http://www.iana.org/assignments/bootp-dhcp-parameters
722 +#
723 +#      Also http://www.networksorcery.com/enp/protocol/bootp/options.htm
724 +#
725 +#      http://www.bind9.net/rfc-dhcp
726 +#
727 +#      $Id: 73632c57d3860bb30749a1df4dad2320d5f79f31 $
728 +#
729 +##############################################################################
730 +
731 +#
732 +
733 +#      This is really Apollo's number, but since they're out of business,
734 +#      I don't think they'll be needing this.
735 +#
736 +#      HP owns the Apollo assets, but let's not worry about that.
737 +#
738 +#      The vendor codes are 2 octets, because we need 256 numbers
739 +#      for the base DHCP options, PLUS a few for the DHCP headers,
740 +#      which aren't in option format.
741 +#
742 +#      On top of that, a number of options are really TLV's.
743 +#      We need to be able to understand them, too.
744 +#
745 +VENDOR         DHCP                            54      format=2,1
746 +
747 +BEGIN-VENDOR   DHCP
748 +
749 +ATTRIBUTE      DHCP-Opcode                             256     byte
750 +ATTRIBUTE      DHCP-Hardware-Type                      257     byte
751 +ATTRIBUTE      DHCP-Hardware-Address-Length            258     byte
752 +ATTRIBUTE      DHCP-Hop-Count                          259     byte
753 +ATTRIBUTE      DHCP-Transaction-Id                     260     integer
754 +ATTRIBUTE      DHCP-Number-of-Seconds                  261     short
755 +ATTRIBUTE      DHCP-Flags                              262     short
756 +ATTRIBUTE      DHCP-Client-IP-Address                  263     ipaddr
757 +ATTRIBUTE      DHCP-Your-IP-Address                    264     ipaddr
758 +ATTRIBUTE      DHCP-Server-IP-Address                  265     ipaddr
759 +ATTRIBUTE      DHCP-Gateway-IP-Address                 266     ipaddr
760 +ATTRIBUTE      DHCP-Client-Hardware-Address            267     ether     # 16 octets
761 +ATTRIBUTE      DHCP-Server-Host-Name                   268     string    # 64 octets
762 +ATTRIBUTE      DHCP-Boot-Filename                      269     string    # 128 octets
763 +
764 +ATTRIBUTE      DHCP-Relay-To-IP-Address                270     ipaddr
765 +ATTRIBUTE      DHCP-Relay-Max-Hop-Count                271     integer
766 +
767 +# This is copied from the request packet, giaddr, and
768 +# added to the reply packet by the server core.
769 +ATTRIBUTE      DHCP-Relay-IP-Address                   272     ipaddr
770 +
771 +VALUE  DHCP-Flags                      Broadcast               0x8000
772 +
773 +VALUE  DHCP-Hardware-Type              Ethernet                1
774 +VALUE  DHCP-Hardware-Type              Experiemental-Ethernet  2
775 +VALUE  DHCP-Hardware-Type              AX.25                   3
776 +VALUE  DHCP-Hardware-Type              Proteon-Token-Ring      4
777 +VALUE  DHCP-Hardware-Type              Chaos                   5
778 +VALUE  DHCP-Hardware-Type              IEEE-802                6
779 +VALUE  DHCP-Hardware-Type              Arcnet                  7
780 +VALUE  DHCP-Hardware-Type              Hyperchannel            8
781 +VALUE  DHCP-Hardware-Type              Lanstar                 9
782 +VALUE  DHCP-Hardware-Type              Autonet-Short-Address   10
783 +VALUE  DHCP-Hardware-Type              LocalTalk               11
784 +VALUE  DHCP-Hardware-Type              LocalNet                12
785 +VALUE  DHCP-Hardware-Type              Ultra-Link              13
786 +VALUE  DHCP-Hardware-Type              SMDS                    14
787 +VALUE  DHCP-Hardware-Type              Frame-Relay             15
788 +VALUE  DHCP-Hardware-Type              ATM-16                  16
789 +VALUE  DHCP-Hardware-Type              HDLC                    17
790 +VALUE  DHCP-Hardware-Type              Fibre-Channel           18
791 +VALUE  DHCP-Hardware-Type              ATM-19                  19
792 +VALUE  DHCP-Hardware-Type              Serial-Line             20
793 +VALUE  DHCP-Hardware-Type              ATM-21                  21
794 +VALUE  DHCP-Hardware-Type              MIL-STD-188-220         22
795 +VALUE  DHCP-Hardware-Type              Metricom                23
796 +VALUE  DHCP-Hardware-Type              IEEE-1394               24
797 +VALUE  DHCP-Hardware-Type              MAPOS                   25
798 +VALUE  DHCP-Hardware-Type              Twinaxial               26
799 +VALUE  DHCP-Hardware-Type              EUI-64                  27
800 +VALUE  DHCP-Hardware-Type              HIPARP                  28
801 +VALUE  DHCP-Hardware-Type              IP-Over-ISO-7816-3      29
802 +VALUE  DHCP-Hardware-Type              ARPSec                  30
803 +VALUE  DHCP-Hardware-Type              IPSec-Tunnel            31
804 +VALUE  DHCP-Hardware-Type              Infiniband              32
805 +VALUE  DHCP-Hardware-Type              CAI-TIA-102             33
806 +
807 +##############################################################################
808 +#
809 +#      DHCP Options, with comments.  For now, many are "octets",
810 +#      as FreeRADIUS doesn't handle complex data structures.
811 +#
812 +##############################################################################
813 +
814 +#ATTRIBUTE     DHCP-Pad                                0       octets
815 +ATTRIBUTE      DHCP-Subnet-Mask                        1       ipaddr
816 +# Time Offset in twos-complement notation.
817 +ATTRIBUTE      DHCP-Time-Offset                        2       integer
818 +ATTRIBUTE      DHCP-Router-Address                     3       ipaddr array
819 +ATTRIBUTE      DHCP-Time-Server                        4       ipaddr array
820 +ATTRIBUTE      DHCP-IEN-116-Name-Server                5       ipaddr array
821 +ATTRIBUTE      DHCP-Domain-Name-Server                 6       ipaddr array
822 +# Logging-Server addresses
823 +ATTRIBUTE      DHCP-Log-Server                         7       ipaddr array
824 +ATTRIBUTE      DHCP-Quotes-Server                      8       ipaddr array
825 +ATTRIBUTE      DHCP-LPR-Server                         9       ipaddr array
826 +ATTRIBUTE      DHCP-Impress-Server                     10      ipaddr array
827 +ATTRIBUTE      DHCP-RLP-Server                         11      ipaddr array
828 +# Hostname string
829 +ATTRIBUTE      DHCP-Hostname                           12      string
830 +# Size of boot file in 512 byte
831 +ATTRIBUTE      DHCP-Boot-File-Size                     13      short
832 +# Client to dump and name
833 +ATTRIBUTE      DHCP-Merit-Dump-File                    14      octets
834 +ATTRIBUTE      DHCP-Domain-Name                        15      string
835 +ATTRIBUTE      DHCP-Swap-Server                        16      ipaddr
836 +# Path name for root disk
837 +ATTRIBUTE      DHCP-Root-Path                          17      string
838 +ATTRIBUTE      DHCP-Bootp-Extensions-Path              18      string
839 +ATTRIBUTE      DHCP-IP-Forward-Enable                  19      byte
840 +ATTRIBUTE      DHCP-Source-Route-Enable                20      byte
841 +# Routing Policy Filters
842 +ATTRIBUTE      DHCP-Policy-Filter                      21      octets
843 +ATTRIBUTE      DHCP-Max-Datagram-Reassembly-Sz         22      short
844 +ATTRIBUTE      DHCP-Default-IP-TTL                     23      octets
845 +ATTRIBUTE      DHCP-Path-MTU-Aging-Timeout             24      integer
846 +ATTRIBUTE      DHCP-Path-MTU-Plateau-Table             25      short array
847 +ATTRIBUTE      DHCP-Interface-MTU-Size                 26      short
848 +ATTRIBUTE      DHCP-All-Subnets-Are-Local              27      byte
849 +ATTRIBUTE      DHCP-Broadcast-Address                  28      ipaddr
850 +ATTRIBUTE      DHCP-Perform-Mask-Discovery             29      byte
851 +ATTRIBUTE      DHCP-Provide-Mask-To-Others             30      byte
852 +ATTRIBUTE      DHCP-Perform-Router-Discovery           31      byte
853 +ATTRIBUTE      DHCP-Router-Solicitation-Address        32      ipaddr
854 +# first is destination address, second is router.
855 +ATTRIBUTE      DHCP-Static-Routes                      33      ipaddr array
856 +ATTRIBUTE      DHCP-Trailer-Encapsulation              34      byte
857 +ATTRIBUTE      DHCP-ARP-Cache-Timeout                  35      integer
858 +ATTRIBUTE      DHCP-Ethernet-Encapsulation             36      byte
859 +ATTRIBUTE      DHCP-Default-TCP-TTL                    37      byte
860 +ATTRIBUTE      DHCP-Keep-Alive-Interval                38      integer
861 +ATTRIBUTE      DHCP-Keep-Alive-Garbage                 39      byte
862 +ATTRIBUTE      DHCP-NIS-Domain-Name                    40      string
863 +ATTRIBUTE      DHCP-NIS-Servers                        41      ipaddr array
864 +ATTRIBUTE      DHCP-NTP-Servers                        42      ipaddr array
865 +# N Vendor Specific Information
866 +ATTRIBUTE      DHCP-Vendor                             43      octets # tlv
867 +ATTRIBUTE      DHCP-NETBIOS-Name-Servers               44      ipaddr array
868 +ATTRIBUTE      DHCP-NETBIOS-Dgm-Dist-Servers           45      ipaddr array
869 +ATTRIBUTE      DHCP-NETBIOS-Node-Type                  46      byte
870 +# N NETBIOS Scope
871 +ATTRIBUTE      DHCP-NETBIOS                            47      octets
872 +ATTRIBUTE      DHCP-X-Window-Font-Server               48      ipaddr array
873 +ATTRIBUTE      DHCP-X-Window-Display-Mgr               49      ipaddr array
874 +ATTRIBUTE      DHCP-Requested-IP-Address               50      ipaddr
875 +ATTRIBUTE      DHCP-IP-Address-Lease-Time              51      integer
876 +# Overload "sname" or "file"
877 +ATTRIBUTE      DHCP-Overload                           52      byte
878 +ATTRIBUTE      DHCP-Message-Type                       53      byte
879 +ATTRIBUTE      DHCP-DHCP-Server-Identifier             54      ipaddr
880 +
881 +# Array of 1-byte numbers indicating which options the client
882 +# would like to see in the response.
883 +ATTRIBUTE      DHCP-Parameter-Request-List             55      byte array
884 +ATTRIBUTE      DHCP-DHCP-Error-Message                 56      octets
885 +ATTRIBUTE      DHCP-DHCP-Maximum-Msg-Size              57      short
886 +ATTRIBUTE      DHCP-Renewal-Time                       58      integer
887 +ATTRIBUTE      DHCP-Rebinding-Time                     59      integer
888 +ATTRIBUTE      DHCP-Vendor-Class-Identifier            60      string
889 +
890 +# Client Identifier
891 +# First octets is DHCP-Hardware-Type, rest are type-specific data,
892 +# e.g. MAC address.
893 +ATTRIBUTE      DHCP-Client-Identifier                  61      ether
894 +ATTRIBUTE      DHCP-Netware-Domain-Name                62      octets
895 +ATTRIBUTE      DHCP-Netware-Sub-Options                63      octets
896 +ATTRIBUTE      DHCP-NIS-Client-Domain-Name             64      octets
897 +ATTRIBUTE      DHCP-NIS-Server-Address                 65      ipaddr
898 +ATTRIBUTE      DHCP-TFTP-Server-Name                   66      string
899 +ATTRIBUTE      DHCP-Boot-File-Name                     67      string
900 +# Home Agent Addresses
901 +ATTRIBUTE      DHCP-Home-Agent-Address                 68      octets
902 +ATTRIBUTE      DHCP-SMTP-Server-Address                69      ipaddr array
903 +ATTRIBUTE      DHCP-POP3-Server-Address                70      ipaddr array
904 +ATTRIBUTE      DHCP-NNTP-Server-Address                71      ipaddr array
905 +ATTRIBUTE      DHCP-WWW-Server-Address                 72      ipaddr array
906 +ATTRIBUTE      DHCP-Finger-Server-Address              73      ipaddr array
907 +ATTRIBUTE      DHCP-IRC-Server-Address                 74      ipaddr array
908 +ATTRIBUTE      DHCP-StreetTalk-Server-Address          75      ipaddr array
909 +ATTRIBUTE      DHCP-STDA-Server-Address                76      ipaddr array
910 +# User Class Information
911 +ATTRIBUTE      DHCP-User-Class                         77      octets
912 +# directory agent information
913 +ATTRIBUTE      DHCP-Directory-Agent                    78      octets
914 +# service location agent scope
915 +ATTRIBUTE      DHCP-Service-Scope                      79      octets
916 +# Rapid Commit
917 +ATTRIBUTE      DHCP-Rapid-Commit                       80      octets
918 +# Fully Qualified Domain Name
919 +ATTRIBUTE      DHCP-Client-FQDN                        81      string
920 +# Relay Agent Information
921 +ATTRIBUTE      DHCP-Relay-Agent-Information            82      tlv
922 +
923 +ATTRIBUTE      DHCP-Agent-Circuit-Id                   82.1    octets
924 +ATTRIBUTE      DHCP-Agent-Remote-Id                    82.2    octets
925 +
926 +ATTRIBUTE      DHCP-Relay-Circuit-Id                   82.1    octets
927 +ATTRIBUTE      DHCP-Relay-Remote-Id                    82.2    octets
928 +
929 +# 3 is reserved and shouldn't be used for anything
930 +ATTRIBUTE      DHCP-Docsis-Device-Class                82.4    integer
931 +ATTRIBUTE      DHCP-Relay-Link-Selection               82.5    ipaddr
932 +ATTRIBUTE      DHCP-Subscriber-Id                      82.6    string
933 +
934 +# AGH!  RADIUS inside of DHCP!
935 +ATTRIBUTE      DHCP-RADIUS-Attributes                  82.7    octets
936 +
937 +# Horribly complicated
938 +ATTRIBUTE      DHCP-Authentication-Information         82.8    octets
939 +ATTRIBUTE      DHCP-Vendor-Specific-Information        82.9    octets
940 +ATTRIBUTE      DHCP-Relay-Agent-Flags                  82.10   byte
941 +ATTRIBUTE      DHCP-Server-Identifier-Override         82.11   ipaddr
942 +
943 +# Internet Storage Name Service
944 +ATTRIBUTE      DHCP-iSNS                               83      octets
945 +# Novell Directory Services
946 +ATTRIBUTE      DHCP-NDS-Servers                        85      octets
947 +# Novell Directory Services
948 +ATTRIBUTE      DHCP-NDS-Tree-Name                      86      octets
949 +# Novell Directory Services
950 +ATTRIBUTE      DHCP-NDS-Context                        87      octets
951 +# Authentication
952 +ATTRIBUTE      DHCP-Authentication                     90      octets
953 +
954 +ATTRIBUTE      DHCP-Client-Last-Txn-Time               91      octets
955 +
956 +ATTRIBUTE      DHCP-associated-ip                      92      octets
957 +# Client System Architecture
958 +ATTRIBUTE      DHCP-Client-System                      93      octets
959 +# Client Network Device Interface
960 +ATTRIBUTE      DHCP-Client-NDI                         94      octets
961 +# Lightweight Directory Access Protocol
962 +ATTRIBUTE      DHCP-LDAP                               95      octets
963 +# UUID/GUID-based Client Identifier
964 +ATTRIBUTE      DHCP-UUID/GUID                          97      octets
965 +# Open Group's User Authentication
966 +ATTRIBUTE      DHCP-User-Auth                          98      octets
967 +# NetInfo Parent-Server Address
968 +ATTRIBUTE      DHCP-Netinfo-Address                    112     octets
969 +# NetInfo Parent-Server Tag
970 +ATTRIBUTE      DHCP-Netinfo-Tag                        113     octets
971 +# URL
972 +ATTRIBUTE      DHCP-URL                                114     octets
973 +# DHCP Auto-Configuration
974 +ATTRIBUTE      DHCP-Auto-Config                        116     byte
975 +# Name Service Search
976 +ATTRIBUTE      DHCP-Name-Service-Search                117     octets
977 +# Subnet Selection Option
978 +ATTRIBUTE      DHCP-Subnet-Selection-Option            118     octets
979 +# DNS domain serach list
980 +ATTRIBUTE      DHCP-Domain-Search                      119     octets
981 +# SIP-Servers DHCP Option
982 +ATTRIBUTE      DHCP-SIP-Servers-DHCP-Option            120     octets
983 +# Classless Static Route Option
984 +ATTRIBUTE      DHCP-Classless-Static-Route             121     octets
985 +# CableLabs Client Configuration
986 +ATTRIBUTE      DHCP-CCC                                122     octets
987 +# 16 GeoConf Option
988 +ATTRIBUTE      DHCP-GeoConf-Option                     123     octets
989 +
990 +# Vendor Class
991 +#
992 +# String name that defines the vendor space used for the TLV's
993 +# in option 125.
994 +#
995 +ATTRIBUTE      DHCP-V-I-Vendor-Class                   124     octets
996 +# Vendor-Specific
997 +ATTRIBUTE      DHCP-V-I-Vendor-Specific                125     octets # tlv
998 +ATTRIBUTE      DHCP-Etherboot                          128     ether
999 +# (for IP Phone software load)
1000 +ATTRIBUTE      DHCP-TFTP-Server-IP-Address             128     octets
1001 +
1002 +ATTRIBUTE      DHCP-Call-Server-IP-address             129     octets
1003 +
1004 +ATTRIBUTE      DHCP-Ethernet-Interface                 130     octets
1005 +
1006 +ATTRIBUTE      DHCP-Vendor-Discrimination-Str          130     octets
1007 +
1008 +ATTRIBUTE      DHCP-Remote-Stats-Svr-IP-Address        131     octets
1009 +
1010 +ATTRIBUTE      DHCP-IEEE-802.1Q-L2-Priority            132     octets
1011 +
1012 +ATTRIBUTE      DHCP-IEEE-802.1P-VLAN-ID                133     octets
1013 +
1014 +ATTRIBUTE      DHCP-Diffserv-Code-Point                134     octets
1015 +
1016 +ATTRIBUTE      DHCP-HTTP-Proxy                         135     octets
1017 +
1018 +ATTRIBUTE      DHCP-Cisco-TFTP-Server-IP-Addresses     150     ipaddr array
1019 +
1020 +ATTRIBUTE      DHCP-End-Of-Options                     255     byte
1021 +
1022 +VALUE  DHCP-Opcode                     Client-Message          1
1023 +VALUE  DHCP-Opcode                     Server-Message          2
1024 +
1025 +VALUE  DHCP-Message-Type               DHCP-Do-Not-Respond     0
1026 +VALUE  DHCP-Message-Type               DHCP-Discover           1
1027 +VALUE  DHCP-Message-Type               DHCP-Offer              2
1028 +VALUE  DHCP-Message-Type               DHCP-Request            3
1029 +VALUE  DHCP-Message-Type               DHCP-Decline            4
1030 +VALUE  DHCP-Message-Type               DHCP-Ack                5
1031 +VALUE  DHCP-Message-Type               DHCP-NAK                6
1032 +VALUE  DHCP-Message-Type               DHCP-Release            7
1033 +VALUE  DHCP-Message-Type               DHCP-Inform             8
1034 +VALUE  DHCP-Message-Type               DHCP-Force-Renew        9
1035 +
1036 +VALUE  DHCP-Parameter-Request-List     DHCP-Subnet-Mask        1
1037 +VALUE  DHCP-Parameter-Request-List     DHCP-Time-Offset        2
1038 +VALUE  DHCP-Parameter-Request-List     DHCP-Router-Address     3
1039 +VALUE  DHCP-Parameter-Request-List     DHCP-Time-Server        4
1040 +VALUE  DHCP-Parameter-Request-List     DHCP-IEN-116-Name-Server 5
1041 +VALUE  DHCP-Parameter-Request-List     DHCP-Domain-Name-Server 6
1042 +VALUE  DHCP-Parameter-Request-List     DHCP-Log-Server         7
1043 +VALUE  DHCP-Parameter-Request-List     DHCP-Quotes-Server      8
1044 +VALUE  DHCP-Parameter-Request-List     DHCP-LPR-Server         9
1045 +VALUE  DHCP-Parameter-Request-List     DHCP-Impress-Server     10
1046 +VALUE  DHCP-Parameter-Request-List     DHCP-RLP-Server         11
1047 +VALUE  DHCP-Parameter-Request-List     DHCP-Hostname           12
1048 +VALUE  DHCP-Parameter-Request-List     DHCP-Boot-File-Size     13
1049 +VALUE  DHCP-Parameter-Request-List     DHCP-Merit-Dump-File    14
1050 +VALUE  DHCP-Parameter-Request-List     DHCP-Domain-Name        15
1051 +VALUE  DHCP-Parameter-Request-List     DHCP-Swap-Server        16
1052 +VALUE  DHCP-Parameter-Request-List     DHCP-Root-Path          17
1053 +VALUE  DHCP-Parameter-Request-List     DHCP-Bootp-Extensions-Path 18
1054 +VALUE  DHCP-Parameter-Request-List     DHCP-IP-Forward-Enable  19
1055 +VALUE  DHCP-Parameter-Request-List     DHCP-Source-Route-Enable 20
1056 +VALUE  DHCP-Parameter-Request-List     DHCP-Policy-Filter      21
1057 +VALUE  DHCP-Parameter-Request-List     DHCP-Max-Datagram-Reassembly-Sz 22
1058 +VALUE  DHCP-Parameter-Request-List     DHCP-Default-IP-TTL     23
1059 +VALUE  DHCP-Parameter-Request-List     DHCP-Path-MTU-Aging-Timeout 24
1060 +VALUE  DHCP-Parameter-Request-List     DHCP-Path-MTU-Plateau-Table 25
1061 +VALUE  DHCP-Parameter-Request-List     DHCP-Interface-MTU-Size 26
1062 +VALUE  DHCP-Parameter-Request-List     DHCP-All-Subnets-Are-Local 27
1063 +VALUE  DHCP-Parameter-Request-List     DHCP-Broadcast-Address  28
1064 +VALUE  DHCP-Parameter-Request-List     DHCP-Perform-Mask-Discovery 29
1065 +VALUE  DHCP-Parameter-Request-List     DHCP-Provide-Mask-To-Others 30
1066 +VALUE  DHCP-Parameter-Request-List     DHCP-Perform-Router-Discovery 31
1067 +VALUE  DHCP-Parameter-Request-List     DHCP-Router-Solicitation-Address 32
1068 +VALUE  DHCP-Parameter-Request-List     DHCP-Static-Routes      33
1069 +VALUE  DHCP-Parameter-Request-List     DHCP-Trailer-Encapsulation 34
1070 +VALUE  DHCP-Parameter-Request-List     DHCP-ARP-Cache-Timeout  35
1071 +VALUE  DHCP-Parameter-Request-List     DHCP-Ethernet-Encapsulation 36
1072 +VALUE  DHCP-Parameter-Request-List     DHCP-Default-TCP-TTL    37
1073 +VALUE  DHCP-Parameter-Request-List     DHCP-Keep-Alive-Interval 38
1074 +VALUE  DHCP-Parameter-Request-List     DHCP-Keep-Alive-Garbage 39
1075 +VALUE  DHCP-Parameter-Request-List     DHCP-NIS-Domain-Name    40
1076 +VALUE  DHCP-Parameter-Request-List     DHCP-NIS-Servers        41
1077 +VALUE  DHCP-Parameter-Request-List     DHCP-NTP-Servers        42
1078 +VALUE  DHCP-Parameter-Request-List     DHCP-Vendor             43
1079 +VALUE  DHCP-Parameter-Request-List     DHCP-NETBIOS-Name-Servers 44
1080 +VALUE  DHCP-Parameter-Request-List     DHCP-NETBIOS-Dgm-Dist-Servers 45
1081 +VALUE  DHCP-Parameter-Request-List     DHCP-NETBIOS-Node-Type  46
1082 +VALUE  DHCP-Parameter-Request-List     DHCP-NETBIOS            47
1083 +VALUE  DHCP-Parameter-Request-List     DHCP-X-Window-Font-Server 48
1084 +VALUE  DHCP-Parameter-Request-List     DHCP-X-Window-Display-Mgr 49
1085 +VALUE  DHCP-Parameter-Request-List     DHCP-Requested-IP-Address 50
1086 +VALUE  DHCP-Parameter-Request-List     DHCP-IP-Address-Lease-Time 51
1087 +VALUE  DHCP-Parameter-Request-List     DHCP-Overload           52
1088 +VALUE  DHCP-Parameter-Request-List     DHCP-Message-Type       53
1089 +VALUE  DHCP-Parameter-Request-List     DHCP-DHCP-Server-Identifier 54
1090 +VALUE  DHCP-Parameter-Request-List     DHCP-Parameter-Request-List 55
1091 +VALUE  DHCP-Parameter-Request-List     DHCP-DHCP-Error-Message 56
1092 +VALUE  DHCP-Parameter-Request-List     DHCP-DHCP-Maximum-Msg-Size 57
1093 +VALUE  DHCP-Parameter-Request-List     DHCP-Renewal-Time       58
1094 +VALUE  DHCP-Parameter-Request-List     DHCP-Rebinding-Time     59
1095 +VALUE  DHCP-Parameter-Request-List     DHCP-Class-Identifier   60
1096 +VALUE  DHCP-Parameter-Request-List     DHCP-Client-Identifier  61
1097 +VALUE  DHCP-Parameter-Request-List     DHCP-Netware-Domain-Name 62
1098 +VALUE  DHCP-Parameter-Request-List     DHCP-Netware-Sub-Options 63
1099 +VALUE  DHCP-Parameter-Request-List     DHCP-NIS-Client-Domain-Name 64
1100 +VALUE  DHCP-Parameter-Request-List     DHCP-NIS-Server-Address 65
1101 +VALUE  DHCP-Parameter-Request-List     DHCP-TFTP-Server-Name   66
1102 +VALUE  DHCP-Parameter-Request-List     DHCP-Boot-File-Name     67
1103 +VALUE  DHCP-Parameter-Request-List     DHCP-Home-Agent-Address 68
1104 +VALUE  DHCP-Parameter-Request-List     DHCP-SMTP-Server-Address 69
1105 +VALUE  DHCP-Parameter-Request-List     DHCP-POP3-Server-Address 70
1106 +VALUE  DHCP-Parameter-Request-List     DHCP-NNTP-Server-Address 71
1107 +VALUE  DHCP-Parameter-Request-List     DHCP-WWW-Server-Address 72
1108 +VALUE  DHCP-Parameter-Request-List     DHCP-Finger-Server-Address 73
1109 +VALUE  DHCP-Parameter-Request-List     DHCP-IRC-Server-Address 74
1110 +VALUE  DHCP-Parameter-Request-List     DHCP-StreetTalk-Server-Address 75
1111 +VALUE  DHCP-Parameter-Request-List     DHCP-STDA-Server-Address 76
1112 +VALUE  DHCP-Parameter-Request-List     DHCP-User-Class         77
1113 +VALUE  DHCP-Parameter-Request-List     DHCP-Directory-Agent    78
1114 +VALUE  DHCP-Parameter-Request-List     DHCP-Service-Scope      79
1115 +VALUE  DHCP-Parameter-Request-List     DHCP-Rapid-Commit       80
1116 +VALUE  DHCP-Parameter-Request-List     DHCP-Client-FQDN        81
1117 +VALUE  DHCP-Parameter-Request-List     DHCP-Relay-Agent-Information 82
1118 +VALUE  DHCP-Parameter-Request-List     DHCP-iSNS               83
1119 +VALUE  DHCP-Parameter-Request-List     DHCP-NDS-Servers        85
1120 +VALUE  DHCP-Parameter-Request-List     DHCP-NDS-Tree-Name      86
1121 +VALUE  DHCP-Parameter-Request-List     DHCP-NDS-Context        87
1122 +VALUE  DHCP-Parameter-Request-List     DHCP-Authentication     90
1123 +VALUE  DHCP-Parameter-Request-List     DHCP-Client-Last-Txn-Time 91
1124 +VALUE  DHCP-Parameter-Request-List     DHCP-associated-ip      92
1125 +VALUE  DHCP-Parameter-Request-List     DHCP-Client-System      93
1126 +VALUE  DHCP-Parameter-Request-List     DHCP-Client-NDI         94
1127 +VALUE  DHCP-Parameter-Request-List     DHCP-LDAP               95
1128 +VALUE  DHCP-Parameter-Request-List     DHCP-UUID/GUID          97
1129 +VALUE  DHCP-Parameter-Request-List     DHCP-User-Auth          98
1130 +VALUE  DHCP-Parameter-Request-List     DHCP-Netinfo-Address    112
1131 +VALUE  DHCP-Parameter-Request-List     DHCP-Netinfo-Tag        113
1132 +VALUE  DHCP-Parameter-Request-List     DHCP-URL                114
1133 +VALUE  DHCP-Parameter-Request-List     DHCP-Auto-Config        116
1134 +VALUE  DHCP-Parameter-Request-List     DHCP-Name-Service-Search 117
1135 +VALUE  DHCP-Parameter-Request-List     DHCP-Subnet-Selection-Option 118
1136 +VALUE  DHCP-Parameter-Request-List     DHCP-Domain-Search      119
1137 +VALUE  DHCP-Parameter-Request-List     DHCP-SIP-Servers-DHCP-Option 120
1138 +VALUE  DHCP-Parameter-Request-List     DHCP-Classless-Static-Route 121
1139 +VALUE  DHCP-Parameter-Request-List     DHCP-CCC                122
1140 +VALUE  DHCP-Parameter-Request-List     DHCP-GeoConf-Option     123
1141 +VALUE  DHCP-Parameter-Request-List     DHCP-V-I-Vendor-Class   124
1142 +VALUE  DHCP-Parameter-Request-List     DHCP-V-I-Vendor-Specific 125
1143 +VALUE  DHCP-Parameter-Request-List     DHCP-Etherboot          128
1144 +VALUE  DHCP-Parameter-Request-List     DHCP-TFTP-Server-IP-Address 128
1145 +VALUE  DHCP-Parameter-Request-List     DHCP-Call-Server-IP-address 129
1146 +VALUE  DHCP-Parameter-Request-List     DHCP-Ethernet-Interface 130
1147 +VALUE  DHCP-Parameter-Request-List     DHCP-Vendor-Discrimination-Str 130
1148 +VALUE  DHCP-Parameter-Request-List     DHCP-Remote-Stats-Svr-IP-Address 131
1149 +VALUE  DHCP-Parameter-Request-List     DHCP-IEEE-802.1P-VLAN-ID 132
1150 +VALUE  DHCP-Parameter-Request-List     DHCP-IEEE-802.1Q-L2-Priority 133
1151 +VALUE  DHCP-Parameter-Request-List     DHCP-Diffserv-Code-Point 134
1152 +VALUE  DHCP-Parameter-Request-List     DHCP-HTTP-Proxy         135
1153 +
1154 +END-VENDOR     DHCP
1155 diff --git a/src/plugins/vbng/etc/dictionary.merit b/src/plugins/vbng/etc/dictionary.merit
1156 new file mode 100644
1157 index 00000000..7d675e50
1158 --- /dev/null
1159 +++ b/src/plugins/vbng/etc/dictionary.merit
1160 @@ -0,0 +1,17 @@
1161 +#
1162 +#      Experimental extensions, configuration only (for check-items)
1163 +#      Names/numbers as per the MERIT extensions (if possible).
1164 +#
1165 +ATTRIBUTE      NAS-Identifier          32      string
1166 +ATTRIBUTE      Proxy-State             33      string
1167 +ATTRIBUTE      Login-LAT-Service       34      string
1168 +ATTRIBUTE      Login-LAT-Node          35      string
1169 +ATTRIBUTE      Login-LAT-Group         36      string
1170 +ATTRIBUTE      Framed-AppleTalk-Link   37      integer
1171 +ATTRIBUTE      Framed-AppleTalk-Network 38     integer
1172 +ATTRIBUTE      Framed-AppleTalk-Zone   39      string
1173 +ATTRIBUTE       Acct-Input-Packets     47      integer
1174 +ATTRIBUTE       Acct-Output-Packets    48      integer
1175 +# 8 is a MERIT extension.
1176 +VALUE          Service-Type            Authenticate-Only       8
1177 +
1178 diff --git a/src/plugins/vbng/etc/dictionary.sip b/src/plugins/vbng/etc/dictionary.sip
1179 new file mode 100644
1180 index 00000000..149fa4cb
1181 --- /dev/null
1182 +++ b/src/plugins/vbng/etc/dictionary.sip
1183 @@ -0,0 +1,77 @@
1184 +#
1185 +# Updated 97/06/13 to livingston-radius-2.01 miquels@cistron.nl
1186 +#
1187 +#      This file contains dictionary translations for parsing
1188 +#      requests and generating responses.  All transactions are
1189 +#      composed of Attribute/Value Pairs.  The value of each attribute
1190 +#      is specified as one of 4 data types.  Valid data types are:
1191 +#
1192 +#      string - 0-253 octets
1193 +#      ipaddr - 4 octets in network byte order
1194 +#      integer - 32 bit value in big endian order (high byte first)
1195 +#      date - 32 bit value in big endian order - seconds since
1196 +#                                      00:00:00 GMT,  Jan.  1,  1970
1197 +#
1198 +#      Enumerated values are stored in the user file with dictionary
1199 +#      VALUE translations for easy administration.
1200 +#
1201 +#      Example:
1202 +#
1203 +#      ATTRIBUTE         VALUE
1204 +#      ---------------   -----
1205 +#      Framed-Protocol = PPP
1206 +#      7               = 1     (integer encoding)
1207 +#
1208 +
1209 +#
1210 +#      Experimental SIP Attributes/Values (draft-sterman-aaa-sip-00.txt etc)
1211 +#
1212 +ATTRIBUTE      Sip-Method              101     integer
1213 +ATTRIBUTE      Sip-Response-Code       102     integer
1214 +ATTRIBUTE      Sip-CSeq                103     string
1215 +ATTRIBUTE      Sip-To-Tag              104     string
1216 +ATTRIBUTE      Sip-From-Tag            105     string
1217 +ATTRIBUTE      Sip-Branch-ID           106     string
1218 +ATTRIBUTE      Sip-Translated-Request-URI      107     string
1219 +ATTRIBUTE      Sip-Source-IP-Address   108     ipaddr
1220 +ATTRIBUTE      Sip-Source-Port         109     integer
1221 +ATTRIBUTE      Sip-User-ID             110     string
1222 +ATTRIBUTE      Sip-User-Realm          111     string
1223 +ATTRIBUTE      Sip-User-Nonce          112     string
1224 +ATTRIBUTE      Sip-User-Method         113     string
1225 +ATTRIBUTE      Sip-User-Digest-URI     114     string
1226 +ATTRIBUTE      Sip-User-Nonce-Count    115     string
1227 +ATTRIBUTE      Sip-User-QOP            116     string
1228 +ATTRIBUTE      Sip-User-Opaque         117     string
1229 +ATTRIBUTE      Sip-User-Response       118     string
1230 +ATTRIBUTE      Sip-User-CNonce         119     string
1231 +ATTRIBUTE      Sip-URI-User            208     string
1232 +ATTRIBUTE      Sip-Req-URI             210     string
1233 +ATTRIBUTE      Sip-CC                  212     string
1234 +ATTRIBUTE      Sip-RPId                213     string
1235 +ATTRIBUTE      Digest-Response         206     string
1236 +ATTRIBUTE      Digest-Attributes       207     string
1237 +ATTRIBUTE      Digest-Realm            1063    string
1238 +ATTRIBUTE      Digest-Nonce            1064    string
1239 +ATTRIBUTE      Digest-Method           1065    string
1240 +ATTRIBUTE      Digest-URI              1066    string
1241 +ATTRIBUTE      Digest-QOP              1067    string
1242 +ATTRIBUTE      Digest-Algorithm        1068    string
1243 +ATTRIBUTE      Digest-Body-Digest      1069    string
1244 +ATTRIBUTE      Digest-CNonce           1070    string
1245 +ATTRIBUTE      Digest-Nonce-Count      1071    string
1246 +ATTRIBUTE      Digest-User-Name        1072    string
1247 +
1248 +VALUE          Service-Type            SIP                     15
1249 +
1250 +VALUE          Sip-Method              Other                   0
1251 +VALUE          Sip-Method              Invite                  1
1252 +VALUE          Sip-Method              Cancel                  2
1253 +VALUE          Sip-Method              Ack                     3
1254 +VALUE          Sip-Method              Bye                     4
1255 +
1256 +VALUE          Sip-Response-Code       Other                   0
1257 +VALUE          Sip-Response-Code       Invite                  1
1258 +VALUE          Sip-Response-Code       Cancel                  2
1259 +VALUE          Sip-Response-Code       Ack                     3
1260 +VALUE          Sip-Response-Code       Bye                     4
1261 diff --git a/src/plugins/vbng/etc/issue b/src/plugins/vbng/etc/issue
1262 new file mode 100644
1263 index 00000000..62544873
1264 --- /dev/null
1265 +++ b/src/plugins/vbng/etc/issue
1266 @@ -0,0 +1,5 @@
1267 +(\I)
1268 +-----------------------------------------------------
1269 +\S \R (\N) (port \L)
1270 +-----------------------------------------------------
1271 +
1272 diff --git a/src/plugins/vbng/etc/port-id-map b/src/plugins/vbng/etc/port-id-map
1273 new file mode 100644
1274 index 00000000..9088a0b9
1275 --- /dev/null
1276 +++ b/src/plugins/vbng/etc/port-id-map
1277 @@ -0,0 +1,24 @@
1278 +#
1279 +# port-id-map
1280 +#
1281 +# This file describes the ttyname to port id mapping. The port id
1282 +# is reported as part of a RADIUS authentication or accouting request.
1283 +#
1284 +#ttyname (as returned by ttyname(3))   port-id
1285 +/dev/tty1      1
1286 +/dev/tty2      2
1287 +/dev/tty3      3
1288 +/dev/tty4      4
1289 +/dev/tty5      5
1290 +/dev/tty6      6
1291 +/dev/tty7      7
1292 +/dev/tty8      8
1293 +/dev/ttyS0     9
1294 +/dev/ttyS1     10
1295 +/dev/ttyS2     11
1296 +/dev/ttyS3     12
1297 +/dev/ttyS4     13
1298 +/dev/ttyS5     14
1299 +/dev/ttyS6     15
1300 +/dev/ttyS7     16
1301
1302 \ No newline at end of file
1303 diff --git a/src/plugins/vbng/etc/radiusclient.conf b/src/plugins/vbng/etc/radiusclient.conf
1304 new file mode 100644
1305 index 00000000..3a315b46
1306 --- /dev/null
1307 +++ b/src/plugins/vbng/etc/radiusclient.conf
1308 @@ -0,0 +1,92 @@
1309 +# General settings
1310 +
1311 +# specify which authentication comes first respectively which
1312 +# authentication is used. possible values are: "radius" and "local".
1313 +# if you specify "radius,local" then the RADIUS server is asked
1314 +# first then the local one. if only one keyword is specified only
1315 +# this server is asked.
1316 +auth_order     radius,local
1317 +
1318 +# maximum login tries a user has
1319 +login_tries    4
1320 +
1321 +# timeout for all login tries
1322 +# if this time is exceeded the user is kicked out
1323 +login_timeout  60
1324 +
1325 +# name of the nologin file which when it exists disables logins.
1326 +# it may be extended by the ttyname which will result in
1327 +# a terminal specific lock (e.g. /etc/nologin.ttyS2 will disable
1328 +# logins on /dev/ttyS2)
1329 +nologin /etc/nologin
1330 +
1331 +# name of the issue file. it's only display when no username is passed
1332 +# on the radlogin command line
1333 +issue  /usr/local/etc/radiusclient/issue
1334 +
1335 +# RADIUS settings
1336 +
1337 +# RADIUS server to use for authentication requests. this config
1338 +# item can appear more then one time. if multiple servers are
1339 +# defined they are tried in a round robin fashion if one
1340 +# server is not answering.
1341 +# optionally you can specify a the port number on which is remote
1342 +# RADIUS listens separated by a colon from the hostname. if
1343 +# no port is specified /etc/services is consulted of the radius
1344 +# service. if this fails also a compiled in default is used.
1345 +authserver     localhost
1346 +
1347 +# RADIUS server to use for accouting requests. All that I
1348 +# said for authserver applies, too. 
1349 +#
1350 +acctserver     localhost
1351 +
1352 +# file holding shared secrets used for the communication
1353 +# between the RADIUS client and server
1354 +servers                /usr/local/etc/radiusclient/servers
1355 +
1356 +# dictionary of allowed attributes and values
1357 +# just like in the normal RADIUS distributions
1358 +dictionary     /usr/local/etc/radiusclient/dictionary
1359 +
1360 +# program to call for a RADIUS authenticated login
1361 +login_radius   /usr/local/sbin/login.radius
1362 +
1363 +# file which holds sequence number for communication with the
1364 +# RADIUS server
1365 +seqfile                /var/run/radius.seq
1366 +
1367 +# file which specifies mapping between ttyname and NAS-Port attribute
1368 +mapfile                /usr/local/etc/radiusclient/port-id-map
1369 +
1370 +# default authentication realm to append to all usernames if no
1371 +# realm was explicitly specified by the user
1372 +# the radiusd directly form Livingston doesnt use any realms, so leave
1373 +# it blank then
1374 +default_realm
1375 +
1376 +# time to wait for a reply from the RADIUS server
1377 +radius_timeout 10
1378 +
1379 +# resend request this many times before trying the next server
1380 +radius_retries 3
1381 +
1382 +# The length of time in seconds that we skip a nonresponsive RADIUS
1383 +# server for transaction requests.  Server(s) being in the "dead" state
1384 +# are tried only after all other non-dead servers have been tried and
1385 +# failed or timeouted.  The deadtime interval starts when the server
1386 +# does not respond to an authentication/accounting request transmissions. 
1387 +# When the interval expires, the "dead" server would be re-tried again,
1388 +# and if it's still down then it will be considered "dead" for another
1389 +# such interval and so on. This option is no-op if there is only one
1390 +# server in the list. Set to 0 in order to disable the feature.
1391 +radius_deadtime        0
1392 +
1393 +# local address from which radius packets have to be sent
1394 +bindaddr *
1395 +
1396 +# LOCAL settings
1397 +
1398 +# program to execute for local login
1399 +# it must support the -f flag for preauthenticated login
1400 +login_local    /bin/login
1401 diff --git a/src/plugins/vbng/etc/radiusclient.conf.in b/src/plugins/vbng/etc/radiusclient.conf.in
1402 new file mode 100644
1403 index 00000000..fdf62e6d
1404 --- /dev/null
1405 +++ b/src/plugins/vbng/etc/radiusclient.conf.in
1406 @@ -0,0 +1,92 @@
1407 +# General settings
1408 +
1409 +# specify which authentication comes first respectively which
1410 +# authentication is used. possible values are: "radius" and "local".
1411 +# if you specify "radius,local" then the RADIUS server is asked
1412 +# first then the local one. if only one keyword is specified only
1413 +# this server is asked.
1414 +auth_order     radius,local
1415 +
1416 +# maximum login tries a user has
1417 +login_tries    4
1418 +
1419 +# timeout for all login tries
1420 +# if this time is exceeded the user is kicked out
1421 +login_timeout  60
1422 +
1423 +# name of the nologin file which when it exists disables logins.
1424 +# it may be extended by the ttyname which will result in
1425 +# a terminal specific lock (e.g. /etc/nologin.ttyS2 will disable
1426 +# logins on /dev/ttyS2)
1427 +nologin /etc/nologin
1428 +
1429 +# name of the issue file. it's only display when no username is passed
1430 +# on the radlogin command line
1431 +issue  @pkgsysconfdir@/issue
1432 +
1433 +# RADIUS settings
1434 +
1435 +# RADIUS server to use for authentication requests. this config
1436 +# item can appear more then one time. if multiple servers are
1437 +# defined they are tried in a round robin fashion if one
1438 +# server is not answering.
1439 +# optionally you can specify a the port number on which is remote
1440 +# RADIUS listens separated by a colon from the hostname. if
1441 +# no port is specified /etc/services is consulted of the radius
1442 +# service. if this fails also a compiled in default is used.
1443 +authserver     localhost
1444 +
1445 +# RADIUS server to use for accouting requests. All that I
1446 +# said for authserver applies, too. 
1447 +#
1448 +acctserver     localhost
1449 +
1450 +# file holding shared secrets used for the communication
1451 +# between the RADIUS client and server
1452 +servers                @pkgsysconfdir@/servers
1453 +
1454 +# dictionary of allowed attributes and values
1455 +# just like in the normal RADIUS distributions
1456 +dictionary     @pkgsysconfdir@/dictionary
1457 +
1458 +# program to call for a RADIUS authenticated login
1459 +login_radius   @sbindir@/login.radius
1460 +
1461 +# file which holds sequence number for communication with the
1462 +# RADIUS server
1463 +seqfile                /var/run/radius.seq
1464 +
1465 +# file which specifies mapping between ttyname and NAS-Port attribute
1466 +mapfile                @pkgsysconfdir@/port-id-map
1467 +
1468 +# default authentication realm to append to all usernames if no
1469 +# realm was explicitly specified by the user
1470 +# the radiusd directly form Livingston doesnt use any realms, so leave
1471 +# it blank then
1472 +default_realm
1473 +
1474 +# time to wait for a reply from the RADIUS server
1475 +radius_timeout 10
1476 +
1477 +# resend request this many times before trying the next server
1478 +radius_retries 3
1479 +
1480 +# The length of time in seconds that we skip a nonresponsive RADIUS
1481 +# server for transaction requests.  Server(s) being in the "dead" state
1482 +# are tried only after all other non-dead servers have been tried and
1483 +# failed or timeouted.  The deadtime interval starts when the server
1484 +# does not respond to an authentication/accounting request transmissions. 
1485 +# When the interval expires, the "dead" server would be re-tried again,
1486 +# and if it's still down then it will be considered "dead" for another
1487 +# such interval and so on. This option is no-op if there is only one
1488 +# server in the list. Set to 0 in order to disable the feature.
1489 +radius_deadtime        0
1490 +
1491 +# local address from which radius packets have to be sent
1492 +bindaddr *
1493 +
1494 +# LOCAL settings
1495 +
1496 +# program to execute for local login
1497 +# it must support the -f flag for preauthenticated login
1498 +login_local    /bin/login
1499 diff --git a/src/plugins/vbng/etc/servers b/src/plugins/vbng/etc/servers
1500 new file mode 100644
1501 index 00000000..50eddd39
1502 --- /dev/null
1503 +++ b/src/plugins/vbng/etc/servers
1504 @@ -0,0 +1,10 @@
1505 +## Server Name or Client/Server pair           Key             
1506 +## ----------------                            ---------------
1507 +#
1508 +#portmaster.elemental.net                      hardlyasecret
1509 +#portmaster2.elemental.net                     donttellanyone
1510 +#
1511 +## uncomment the following line for simple testing of radlogin
1512 +## with freeradius-server
1513 +#
1514 +#localhost/localhost                           testing123
1515 diff --git a/src/plugins/vbng/include/freeradius-client.h b/src/plugins/vbng/include/freeradius-client.h
1516 new file mode 100644
1517 index 00000000..96c75460
1518 --- /dev/null
1519 +++ b/src/plugins/vbng/include/freeradius-client.h
1520 @@ -0,0 +1,528 @@
1521 +/*
1522 + * $Id: freeradius-client.h,v 1.18 2010/06/15 09:22:51 aland Exp $
1523 + *
1524 + * Copyright (C) 1995,1996,1997,1998 Lars Fenneberg
1525 + *
1526 + * Copyright 1992 Livingston Enterprises, Inc.
1527 + *
1528 + * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
1529 + * and Merit Network, Inc. All Rights Reserved
1530 + *
1531 + * See the file COPYRIGHT for the respective terms and conditions.
1532 + * If the file is missing contact me at lf@elemental.net
1533 + * and I'll send you a copy.
1534 + *
1535 + */
1536 +
1537 +#ifndef FREERADIUS_CLIENT_H
1538 +#define FREERADIUS_CLIENT_H
1539 +
1540 +#ifdef CP_DEBUG
1541 +#define                DEBUG(args, ...)        rc_log(## args)
1542 +#else
1543 +#define                DEBUG(args, ...)        ;
1544 +#endif
1545 +
1546 +#include       <sys/types.h>
1547 +/*
1548 + * Include for C99 uintX_t defines is stdint.h on most systems.  Solaris uses
1549 + * inttypes.h instead.  Comment out the stdint include if you get an error,
1550 + * and uncomment the inttypes.h include.
1551 + */
1552 +#include       <stdint.h>
1553 +/* #include    <inttypes.h> */
1554 +#include       <stdio.h>
1555 +#include       <time.h>
1556 +
1557 +#undef __BEGIN_DECLS
1558 +#undef __END_DECLS
1559 +#ifdef __cplusplus
1560 +# define __BEGIN_DECLS extern "C" {
1561 +# define __END_DECLS }
1562 +#else
1563 +# define __BEGIN_DECLS /* empty */
1564 +# define __END_DECLS /* empty */
1565 +#endif
1566 +
1567 +#define AUTH_VECTOR_LEN                16
1568 +#define AUTH_PASS_LEN          (3 * 16) /* multiple of 16 */
1569 +#define AUTH_ID_LEN            64
1570 +#define AUTH_STRING_LEN                253      /* maximum of 253 */
1571 +
1572 +#define        BUFFER_LEN              8192
1573 +
1574 +#define NAME_LENGTH            32
1575 +#define        GETSTR_LENGTH           128     /* must be bigger than AUTH_PASS_LEN */
1576 +
1577 +#define        MAX_SECRET_LENGTH       (3 * 16) /* MUST be multiple of 16 */
1578 +
1579 +#define        VENDOR(x)               (((x) >> 16) & 0xffff)
1580 +#define        ATTRID(x)               ((x) & 0xffff)
1581 +
1582 +#define PW_MAX_MSG_SIZE                4096
1583 +
1584 +/* codes for radius_buildreq, radius_getport, etc. */
1585 +#define AUTH                   0
1586 +#define ACCT                   1
1587 +
1588 +/* defines for config.c */
1589 +
1590 +#define SERVER_MAX 8
1591 +
1592 +#define AUTH_LOCAL_FST (1<<0)
1593 +#define AUTH_RADIUS_FST (1<<1)
1594 +#define AUTH_LOCAL_SND  (1<<2)
1595 +#define AUTH_RADIUS_SND (1<<3)
1596 +
1597 +typedef struct server {
1598 +       int max;
1599 +       char *name[SERVER_MAX];
1600 +       uint16_t port[SERVER_MAX];
1601 +       char *secret[SERVER_MAX];
1602 +       double deadtime_ends[SERVER_MAX];
1603 +} SERVER;
1604 +
1605 +typedef struct pw_auth_hdr
1606 +{
1607 +       uint8_t          code;
1608 +       uint8_t          id;
1609 +       uint16_t         length;
1610 +       uint8_t          vector[AUTH_VECTOR_LEN];
1611 +       uint8_t          data[2];
1612 +} AUTH_HDR;
1613 +
1614 +struct rc_conf
1615 +{
1616 +       struct _option          *config_options;
1617 +       uint32_t                        this_host_ipaddr;
1618 +       uint32_t                        *this_host_bind_ipaddr;
1619 +       struct map2id_s         *map2id_list;
1620 +       struct dict_attr        *dictionary_attributes;
1621 +       struct dict_value       *dictionary_values;
1622 +       struct dict_vendor      *dictionary_vendors;
1623 +       char                    buf[GETSTR_LENGTH];
1624 +       char                    buf1[14];
1625 +       char                    ifname[512];
1626 +};
1627 +
1628 +typedef struct rc_conf rc_handle;
1629 +
1630 +#define AUTH_HDR_LEN                   20
1631 +#define CHAP_VALUE_LENGTH              16
1632 +
1633 +#define PW_AUTH_UDP_PORT               1645
1634 +#define PW_ACCT_UDP_PORT               1646
1635 +
1636 +#define PW_TYPE_STRING                 0
1637 +#define PW_TYPE_INTEGER                        1
1638 +#define PW_TYPE_IPADDR                 2
1639 +#define PW_TYPE_DATE                   3
1640 +#define PW_TYPE_IPV6ADDR               4
1641 +#define PW_TYPE_IPV6PREFIX             5
1642 +
1643 +/* standard RADIUS codes */
1644 +
1645 +#define        PW_ACCESS_REQUEST               1
1646 +#define        PW_ACCESS_ACCEPT                2
1647 +#define        PW_ACCESS_REJECT                3
1648 +#define        PW_ACCOUNTING_REQUEST           4
1649 +#define        PW_ACCOUNTING_RESPONSE          5
1650 +#define        PW_ACCOUNTING_STATUS            6
1651 +#define        PW_PASSWORD_REQUEST             7
1652 +#define        PW_PASSWORD_ACK                 8
1653 +#define        PW_PASSWORD_REJECT              9
1654 +#define        PW_ACCOUNTING_MESSAGE           10
1655 +#define        PW_ACCESS_CHALLENGE             11
1656 +#define        PW_STATUS_SERVER                12
1657 +#define        PW_STATUS_CLIENT                13
1658 +
1659 +
1660 +/* standard RADIUS attribute-value pairs */
1661 +
1662 +#define        PW_USER_NAME                    1       /* string */
1663 +#define        PW_USER_PASSWORD                2       /* string */
1664 +#define        PW_CHAP_PASSWORD                3       /* string */
1665 +#define        PW_NAS_IP_ADDRESS               4       /* ipaddr */
1666 +#define        PW_NAS_PORT                     5       /* integer */
1667 +#define        PW_SERVICE_TYPE                 6       /* integer */
1668 +#define        PW_FRAMED_PROTOCOL              7       /* integer */
1669 +#define        PW_FRAMED_IP_ADDRESS            8       /* ipaddr */
1670 +#define        PW_FRAMED_IP_NETMASK            9       /* ipaddr */
1671 +#define        PW_FRAMED_ROUTING               10      /* integer */
1672 +#define        PW_FILTER_ID                    11      /* string */
1673 +#define        PW_FRAMED_MTU                   12      /* integer */
1674 +#define        PW_FRAMED_COMPRESSION           13      /* integer */
1675 +#define        PW_LOGIN_IP_HOST                14      /* ipaddr */
1676 +#define        PW_LOGIN_SERVICE                15      /* integer */
1677 +#define        PW_LOGIN_PORT                   16      /* integer */
1678 +#define        PW_OLD_PASSWORD                 17      /* string */ /* deprecated */
1679 +#define        PW_REPLY_MESSAGE                18      /* string */
1680 +#define        PW_LOGIN_CALLBACK_NUMBER        19      /* string */
1681 +#define        PW_FRAMED_CALLBACK_ID           20      /* string */
1682 +#define        PW_EXPIRATION                   21      /* date */ /* deprecated */
1683 +#define        PW_FRAMED_ROUTE                 22      /* string */
1684 +#define        PW_FRAMED_IPX_NETWORK           23      /* integer */
1685 +#define        PW_STATE                        24      /* string */
1686 +#define        PW_CLASS                        25      /* string */
1687 +#define        PW_VENDOR_SPECIFIC              26      /* string */
1688 +#define        PW_SESSION_TIMEOUT              27      /* integer */
1689 +#define        PW_IDLE_TIMEOUT                 28      /* integer */
1690 +#define        PW_TERMINATION_ACTION           29      /* integer */
1691 +#define        PW_CALLED_STATION_ID            30      /* string */
1692 +#define        PW_CALLING_STATION_ID           31      /* string */
1693 +#define        PW_NAS_IDENTIFIER               32      /* string */
1694 +#define        PW_PROXY_STATE                  33      /* string */
1695 +#define        PW_LOGIN_LAT_SERVICE            34      /* string */
1696 +#define        PW_LOGIN_LAT_NODE               35      /* string */
1697 +#define        PW_LOGIN_LAT_GROUP              36      /* string */
1698 +#define        PW_FRAMED_APPLETALK_LINK        37      /* integer */
1699 +#define        PW_FRAMED_APPLETALK_NETWORK     38      /* integer */
1700 +#define        PW_FRAMED_APPLETALK_ZONE        39      /* string */
1701 +#define        PW_EVENT_TIMESTAMP              55      /* integer */
1702 +#define        PW_CHAP_CHALLENGE               60      /* string */
1703 +#define        PW_NAS_PORT_TYPE                61      /* integer */
1704 +#define        PW_PORT_LIMIT                   62      /* integer */
1705 +#define PW_LOGIN_LAT_PORT               63      /* string */
1706 +#define PW_CONNECT_INFO                 77      /* string */
1707 +#define PW_MESSAGE_AUTHENTICATOR        80      /* string */
1708 +
1709 +/* RFC3162 IPv6 attributes */
1710 +
1711 +#define PW_NAS_IPV6_ADDRESS             95      /* string */
1712 +#define PW_FRAMED_INTERFACE_ID          96      /* string */
1713 +#define PW_FRAMED_IPV6_PREFIX           97      /* string */
1714 +#define PW_LOGIN_IPV6_HOST              98      /* string */
1715 +#define PW_FRAMED_IPV6_ROUTE            99      /* string */
1716 +#define PW_FRAMED_IPV6_POOL             100     /* string */
1717 +
1718 +/* RFC6911 IPv6 attributes */
1719 +#define PW_FRAMED_IPV6_ADDRESS         168     /* ipaddr6 */
1720 +#define PW_DNS_SERVER_IPV6_ADDRESS     169     /* ipaddr6 */
1721 +#define PW_ROUTE_IPV6_INFORMATION      170     /* ipv6prefix */
1722 +
1723 +/*     Accounting */
1724 +
1725 +#define        PW_ACCT_STATUS_TYPE             40      /* integer */
1726 +#define        PW_ACCT_DELAY_TIME              41      /* integer */
1727 +#define        PW_ACCT_INPUT_OCTETS            42      /* integer */
1728 +#define        PW_ACCT_OUTPUT_OCTETS           43      /* integer */
1729 +#define        PW_ACCT_SESSION_ID              44      /* string */
1730 +#define        PW_ACCT_AUTHENTIC               45      /* integer */
1731 +#define        PW_ACCT_SESSION_TIME            46      /* integer */
1732 +#define        PW_ACCT_INPUT_PACKETS           47      /* integer */
1733 +#define        PW_ACCT_OUTPUT_PACKETS          48      /* integer */
1734 +#define PW_ACCT_TERMINATE_CAUSE                49      /* integer */
1735 +#define PW_ACCT_MULTI_SESSION_ID       50      /* string */
1736 +#define PW_ACCT_LINK_COUNT             51      /* integer */
1737 +#define PW_ACCT_INPUT_GIGAWORDS                52      /* integer */
1738 +#define PW_ACCT_OUTPUT_GIGAWORDS       53      /* integer */
1739 +
1740 +/*     Experimental SIP-specific attributes (draft-sterman-aaa-sip-00.txt etc) */
1741 +
1742 +#define        PW_DIGEST_RESPONSE              206     /* string */
1743 +#define        PW_DIGEST_ATTRIBUTES            207     /* string */
1744 +#define        PW_DIGEST_REALM                 1063    /* string */
1745 +#define        PW_DIGEST_NONCE                 1064    /* string */
1746 +#define        PW_DIGEST_METHOD                1065    /* string */
1747 +#define        PW_DIGEST_URI                   1066    /* string */
1748 +#define        PW_DIGEST_QOP                   1067    /* string */
1749 +#define        PW_DIGEST_ALGORITHM             1068    /* string */
1750 +#define        PW_DIGEST_BODY_DIGEST           1069    /* string */
1751 +#define        PW_DIGEST_CNONCE                1070    /* string */
1752 +#define        PW_DIGEST_NONCE_COUNT           1071    /* string */
1753 +#define        PW_DIGEST_USER_NAME             1072    /* string */
1754 +
1755 +/*     Merit Experimental Extensions */
1756 +
1757 +#define PW_USER_ID                      222     /* string */
1758 +#define PW_USER_REALM                   223     /* string */
1759 +
1760 +/*     Integer Translations */
1761 +
1762 +/*     SERVICE TYPES   */
1763 +
1764 +#define        PW_LOGIN                        1
1765 +#define        PW_FRAMED                       2
1766 +#define        PW_CALLBACK_LOGIN               3
1767 +#define        PW_CALLBACK_FRAMED              4
1768 +#define        PW_OUTBOUND                     5
1769 +#define        PW_ADMINISTRATIVE               6
1770 +#define PW_NAS_PROMPT                   7
1771 +#define PW_AUTHENTICATE_ONLY           8
1772 +#define PW_CALLBACK_NAS_PROMPT          9
1773 +
1774 +/*     FRAMED PROTOCOLS        */
1775 +
1776 +#define        PW_PPP                          1
1777 +#define        PW_SLIP                         2
1778 +#define PW_ARA                          3
1779 +#define PW_GANDALF                      4
1780 +#define PW_XYLOGICS                     5
1781 +
1782 +/*     FRAMED ROUTING VALUES   */
1783 +
1784 +#define        PW_NONE                         0
1785 +#define        PW_BROADCAST                    1
1786 +#define        PW_LISTEN                       2
1787 +#define        PW_BROADCAST_LISTEN             3
1788 +
1789 +/*     FRAMED COMPRESSION TYPES        */
1790 +
1791 +#define        PW_VAN_JACOBSON_TCP_IP          1
1792 +#define        PW_IPX_HEADER_COMPRESSION       2
1793 +
1794 +/*     LOGIN SERVICES  */
1795 +
1796 +#define PW_TELNET                       0
1797 +#define PW_RLOGIN                       1
1798 +#define PW_TCP_CLEAR                    2
1799 +#define PW_PORTMASTER                   3
1800 +#define PW_LAT                          4
1801 +#define PW_X25_PAD                      5
1802 +#define PW_X25_T3POS                    6
1803 +
1804 +/*     TERMINATION ACTIONS     */
1805 +
1806 +#define        PW_DEFAULT                      0
1807 +#define        PW_RADIUS_REQUEST               1
1808 +
1809 +/*     PROHIBIT PROTOCOL  */
1810 +
1811 +#define PW_DUMB                0       /* 1 and 2 are defined in FRAMED PROTOCOLS */
1812 +#define PW_AUTH_ONLY   3
1813 +#define PW_ALL         255
1814 +
1815 +/*     ACCOUNTING STATUS TYPES    */
1816 +
1817 +#define PW_STATUS_START                1
1818 +#define PW_STATUS_STOP         2
1819 +#define PW_STATUS_ALIVE                3
1820 +#define PW_STATUS_MODEM_START  4
1821 +#define PW_STATUS_MODEM_STOP   5
1822 +#define PW_STATUS_CANCEL       6
1823 +#define PW_ACCOUNTING_ON       7
1824 +#define PW_ACCOUNTING_OFF      8
1825 +
1826 +/*      ACCOUNTING TERMINATION CAUSES   */
1827 +
1828 +#define PW_USER_REQUEST         1
1829 +#define PW_LOST_CARRIER         2
1830 +#define PW_LOST_SERVICE         3
1831 +#define PW_ACCT_IDLE_TIMEOUT    4
1832 +#define PW_ACCT_SESSION_TIMEOUT 5
1833 +#define PW_ADMIN_RESET          6
1834 +#define PW_ADMIN_REBOOT         7
1835 +#define PW_PORT_ERROR           8
1836 +#define PW_NAS_ERROR            9
1837 +#define PW_NAS_REQUEST          10
1838 +#define PW_NAS_REBOOT           11
1839 +#define PW_PORT_UNNEEDED        12
1840 +#define PW_PORT_PREEMPTED       13
1841 +#define PW_PORT_SUSPENDED       14
1842 +#define PW_SERVICE_UNAVAILABLE  15
1843 +#define PW_CALLBACK             16
1844 +#define PW_USER_ERROR           17
1845 +#define PW_HOST_REQUEST         18
1846 +
1847 +/*     NAS PORT TYPES    */
1848 +
1849 +#define PW_ASYNC               0
1850 +#define PW_SYNC                        1
1851 +#define PW_ISDN_SYNC           2
1852 +#define PW_ISDN_SYNC_V120      3
1853 +#define PW_ISDN_SYNC_V110      4
1854 +#define PW_VIRTUAL             5
1855 +
1856 +/*        AUTHENTIC TYPES */
1857 +#define PW_RADIUS      1
1858 +#define PW_LOCAL       2
1859 +#define PW_REMOTE      3
1860 +
1861 +/* Server data structures */
1862 +
1863 +typedef struct dict_attr
1864 +{
1865 +       char              name[NAME_LENGTH + 1];        /* attribute name */
1866 +       int               value;                        /* attribute index */
1867 +       int               type;                         /* string, int, etc. */
1868 +       struct dict_attr *next;
1869 +} DICT_ATTR;
1870 +
1871 +typedef struct dict_value
1872 +{
1873 +       char               attrname[NAME_LENGTH +1];
1874 +       char               name[NAME_LENGTH + 1];
1875 +       int                value;
1876 +       struct dict_value *next;
1877 +} DICT_VALUE;
1878 +
1879 +typedef struct dict_vendor
1880 +{
1881 +       char               vendorname[NAME_LENGTH +1];
1882 +       int                vendorpec;
1883 +       struct dict_vendor *next;
1884 +} DICT_VENDOR;
1885 +
1886 +typedef struct value_pair
1887 +{
1888 +       char               name[NAME_LENGTH + 1];
1889 +       int                attribute;
1890 +       int                type;
1891 +       uint32_t           lvalue;
1892 +       char               strvalue[AUTH_STRING_LEN + 1];
1893 +       struct value_pair *next;
1894 +} VALUE_PAIR;
1895 +
1896 +/* don't change this, as it has to be the same as in the Merit radiusd code */
1897 +#define MGMT_POLL_SECRET       "Hardlyasecret"
1898 +
1899 +/*     Define return codes from "SendServer" utility */
1900 +
1901 +#define BADRESP_RC     -2
1902 +#define ERROR_RC       -1
1903 +#define OK_RC          0
1904 +#define TIMEOUT_RC     1
1905 +#define REJECT_RC      2
1906 +
1907 +typedef struct send_data /* Used to pass information to sendserver() function */
1908 +{
1909 +       uint8_t        code;            /* RADIUS packet code */
1910 +       uint8_t        seq_nbr;         /* Packet sequence number */
1911 +       char           *server;         /* Name/addrress of RADIUS server */
1912 +       int            svc_port;        /* RADIUS protocol destination port */
1913 +       char           *secret;         /* Shared secret of RADIUS server */
1914 +       int            timeout;         /* Session timeout in seconds */
1915 +       int            retries;
1916 +       VALUE_PAIR     *send_pairs;     /* More a/v pairs to send */
1917 +       VALUE_PAIR     *receive_pairs;  /* Where to place received a/v pairs */
1918 +} SEND_DATA;
1919 +
1920 +#ifndef MIN
1921 +#define MIN(a, b)     ((a) < (b) ? (a) : (b))
1922 +#endif
1923 +#ifndef MAX
1924 +#define MAX(a, b)     ((a) > (b) ? (a) : (b))
1925 +#endif
1926 +
1927 +#ifndef PATH_MAX
1928 +#define PATH_MAX       1024
1929 +#endif
1930 +
1931 +typedef struct env
1932 +{
1933 +       int maxsize, size;
1934 +       char **env;
1935 +} ENV;
1936 +
1937 +#define ENV_SIZE       128
1938 +
1939 +__BEGIN_DECLS
1940 +
1941 +/*     Function prototypes     */
1942 +
1943 +/*     avpair.c                */
1944 +
1945 +VALUE_PAIR *rc_avpair_add(rc_handle const *, VALUE_PAIR **, int, void const *, int, int);
1946 +int rc_avpair_assign(VALUE_PAIR *, void const *, int);
1947 +VALUE_PAIR *rc_avpair_new(rc_handle const *, int, void const *, int, int);
1948 +VALUE_PAIR *rc_avpair_gen(rc_handle const *, VALUE_PAIR *, unsigned char const *, int, int);
1949 +VALUE_PAIR *rc_avpair_get(VALUE_PAIR *, int, int);
1950 +void rc_avpair_insert(VALUE_PAIR **, VALUE_PAIR *, VALUE_PAIR *);
1951 +void rc_avpair_free(VALUE_PAIR *);
1952 +int rc_avpair_parse(rc_handle const *, char const *, VALUE_PAIR **);
1953 +int rc_avpair_tostr(rc_handle const *, VALUE_PAIR *, char *, int, char *, int);
1954 +char *rc_avpair_log(rc_handle const *, VALUE_PAIR *, char *buf, size_t buf_len);
1955 +VALUE_PAIR *rc_avpair_readin(rc_handle const *, FILE *);
1956 +
1957 +/*     buildreq.c              */
1958 +
1959 +void rc_buildreq(rc_handle const *, SEND_DATA *, int, char *, unsigned short, char *, int, int);
1960 +unsigned char rc_get_id();
1961 +int rc_auth(rc_handle *, uint32_t, VALUE_PAIR *, VALUE_PAIR **, char *);
1962 +int rc_auth_proxy(rc_handle *, VALUE_PAIR *, VALUE_PAIR **, char *);
1963 +int rc_acct(rc_handle *, uint32_t, VALUE_PAIR *);
1964 +int rc_acct_proxy(rc_handle *, VALUE_PAIR *);
1965 +int rc_check(rc_handle *, char *, char *, unsigned short, char *);
1966 +
1967 +int rc_aaa(rc_handle *rh, uint32_t client_port, VALUE_PAIR *send, VALUE_PAIR **received,
1968 +    char *msg, int add_nas_port, int request_type);
1969 +
1970 +/*     clientid.c              */
1971 +
1972 +int rc_read_mapfile(rc_handle *, char const *);
1973 +uint32_t rc_map2id(rc_handle const *, char const *);
1974 +void rc_map2id_free(rc_handle *);
1975 +
1976 +/*     config.c                */
1977 +
1978 +rc_handle *rc_read_config(char const *);
1979 +char *rc_conf_str(rc_handle const *, char const *);
1980 +int rc_conf_int(rc_handle const *, char const *);
1981 +SERVER *rc_conf_srv(rc_handle const *, char const *);
1982 +int rc_find_server(rc_handle const *, char const *, uint32_t *, char *);
1983 +void rc_config_free(rc_handle *);
1984 +int rc_add_config(rc_handle *, char const *, char const *, char const *, int);
1985 +rc_handle *rc_config_init(rc_handle *);
1986 +int test_config(rc_handle const *, char const *);
1987 +
1988 +/*     dict.c                  */
1989 +
1990 +int rc_read_dictionary(rc_handle *, char const *);
1991 +DICT_ATTR *rc_dict_getattr(rc_handle const *, int);
1992 +DICT_ATTR *rc_dict_findattr(rc_handle const *, char const *);
1993 +DICT_VALUE *rc_dict_findval(rc_handle const *, char const *);
1994 +DICT_VENDOR *rc_dict_findvend(rc_handle const *, char const *);
1995 +DICT_VENDOR *rc_dict_getvend(rc_handle const *, int);
1996 +DICT_VALUE * rc_dict_getval(rc_handle const *, uint32_t, char const *);
1997 +void rc_dict_free(rc_handle *);
1998 +
1999 +/*     ip_util.c               */
2000 +
2001 +struct hostent *rc_gethostbyname(char const *);
2002 +struct hostent *rc_gethostbyaddr(char const *, size_t, int);
2003 +uint32_t rc_get_ipaddr(char const *);
2004 +int rc_good_ipaddr(char const *);
2005 +char const *rc_ip_hostname(uint32_t);
2006 +unsigned short rc_getport(int);
2007 +int rc_own_hostname(char *, int);
2008 +uint32_t rc_own_ipaddress(rc_handle *);
2009 +uint32_t rc_own_bind_ipaddress(rc_handle *);
2010 +struct sockaddr;
2011 +int rc_get_srcaddr(struct sockaddr *, struct sockaddr *);
2012 +
2013 +
2014 +/*     log.c                   */
2015 +
2016 +void rc_openlog(char const *);
2017 +void rc_log(int, char const *, ...);
2018 +
2019 +/*     sendserver.c            */
2020 +
2021 +int rc_send_server(rc_handle *, SEND_DATA *, char *);
2022 +
2023 +/*     util.c                  */
2024 +
2025 +void rc_str2tm(char const *, struct tm *);
2026 +char *rc_getifname(rc_handle *, char const *);
2027 +char *rc_getstr(rc_handle *, char const *, int);
2028 +void rc_mdelay(int);
2029 +char *rc_mksid(rc_handle *);
2030 +rc_handle *rc_new(void);
2031 +void rc_destroy(rc_handle *);
2032 +char *rc_fgetln(FILE *, size_t *);
2033 +double rc_getctime(void);
2034 +
2035 +/*     env.c                   */
2036 +
2037 +struct env *rc_new_env(int);
2038 +void rc_free_env(struct env *);
2039 +int rc_add_env(struct env *, char const *, char const *);
2040 +int rc_import_env(struct env *, char const **);
2041 +
2042 +/* md5.c                       */
2043 +
2044 +void rc_md5_calc(unsigned char *, unsigned char const *, unsigned int);
2045 +
2046 +__END_DECLS
2047 +
2048 +#endif /* FREERADIUS_CLIENT_H */
2049 diff --git a/src/plugins/vbng/include/includes.h b/src/plugins/vbng/include/includes.h
2050 new file mode 100644
2051 index 00000000..908f0e74
2052 --- /dev/null
2053 +++ b/src/plugins/vbng/include/includes.h
2054 @@ -0,0 +1,182 @@
2055 +/*
2056 + * $Id: includes.h,v 1.6 2007/06/21 18:07:22 cparker Exp $
2057 + *
2058 + * Copyright (C) 1997 Lars Fenneberg
2059 + *
2060 + * Copyright 1992 Livingston Enterprises, Inc.
2061 + *
2062 + * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
2063 + * and Merit Network, Inc. All Rights Reserved
2064 + *
2065 + * See the file COPYRIGHT for the respective terms and conditions.
2066 + * If the file is missing contact me at lf@elemental.net
2067 + * and I'll send you a copy.
2068 + *
2069 + */
2070 +
2071 +#include "config.h"
2072 +
2073 +/* AIX requires this to be the first thing in the file.  */
2074 +#ifndef __GNUC__
2075 +# if HAVE_ALLOCA_H
2076 +#  include <alloca.h>
2077 +# else
2078 +#  ifdef _AIX
2079 +#   pragma alloca
2080 +#  else
2081 +#   ifndef alloca /* predefined by HP cc +Olibcalls */
2082 +     char *alloca ();
2083 +#   endif
2084 +#  endif
2085 +# endif
2086 +#endif
2087 +
2088 +#include <sys/types.h>
2089 +
2090 +#include <ctype.h>
2091 +#include <stdio.h>
2092 +#include <errno.h>
2093 +
2094 +#ifdef HAVE_NETDB_H
2095 +#include <netdb.h>
2096 +#endif
2097 +
2098 +#ifdef HAVE_SYSLOG_H
2099 +#include <syslog.h>
2100 +#endif
2101 +
2102 +#ifdef STDC_HEADERS
2103 +# include <stdlib.h>
2104 +# include <string.h>
2105 +# include <stdarg.h>
2106 +#else
2107 +# include <stdarg.h>
2108 +# ifndef HAVE_STRCHR
2109 +#  define strchr index
2110 +#  define strrchr rindex
2111 +# endif
2112 +#endif
2113 +
2114 +/* I realize that this is ugly and unsafe.. :( */
2115 +#ifndef HAVE_SNPRINTF
2116 +# define snprintf(buf, len, format, ...) sprintf(buf, format, __VA_ARGS__)
2117 +#endif
2118 +#ifndef HAVE_VSNPRINTF
2119 +# define vsnprintf(buf, len, format, ap) vsprintf(buf, format, ap)
2120 +#endif
2121 +
2122 +#ifdef HAVE_UNISTD_H
2123 +# include <unistd.h>
2124 +#endif /* HAVE_UNISTD_H */
2125 +
2126 +#ifdef HAVE_FCNTL_H
2127 +# include <fcntl.h>
2128 +#endif
2129 +
2130 +#ifdef HAVE_SYS_FCNTL_H
2131 +# include <sys/fcntl.h>
2132 +#endif
2133 +
2134 +#ifdef HAVE_SYS_FILE_H
2135 +# include <sys/file.h>
2136 +#endif
2137 +
2138 +#ifdef HAVE_SYS_STAT_H
2139 +# include <sys/stat.h>
2140 +#endif
2141 +
2142 +#ifdef HAVE_SYS_UTSNAME_H
2143 +# include <sys/utsname.h>
2144 +#endif
2145 +
2146 +#ifdef HAVE_SYS_IOCTL_H
2147 +# include <sys/ioctl.h>
2148 +#endif
2149 +
2150 +#ifdef HAVE_CRYPT_H
2151 +# include <crypt.h>
2152 +#endif
2153 +
2154 +#ifdef HAVE_LIMITS_H
2155 +# include <limits.h>
2156 +#endif
2157 +
2158 +#ifdef HAVE_TERMIOS_H
2159 +# include <termios.h>
2160 +#endif
2161 +
2162 +#ifndef PATH_MAX
2163 +#define PATH_MAX        1024
2164 +#endif
2165 +
2166 +#ifndef UCHAR_MAX
2167 +# ifdef  __STDC__
2168 +#  define UCHAR_MAX       255U
2169 +# else
2170 +#  define UCHAR_MAX       255
2171 +# endif
2172 +#endif
2173 +
2174 +#ifdef HAVE_PWD_H
2175 +#include <pwd.h>
2176 +#endif
2177 +
2178 +#ifdef HAVE_SYS_SOCKET_H
2179 +#include <sys/socket.h>
2180 +#endif
2181 +
2182 +#ifdef HAVE_NETINET_IN_H
2183 +#include <netinet/in.h>
2184 +#endif
2185 +
2186 +#ifdef HAVE_ARPA_INET_H
2187 +#include <arpa/inet.h>
2188 +#endif
2189 +
2190 +#if defined(HAVE_SIGNAL_H)
2191 +# include <signal.h>
2192 +#endif
2193 +#if defined(HAVE_SYS_SIGNAL_H)
2194 +# include <sys/signal.h>
2195 +#endif
2196 +
2197 +#ifdef NEED_SIG_PROTOTYPES
2198 +int sigemptyset(sigset_t *);
2199 +int sigaddset(sigset_t *, int);
2200 +int sigprocmask (int, sigset_t *, sigset_t *);
2201 +#endif
2202 +
2203 +#if HAVE_GETOPT_H
2204 +# include <getopt.h>
2205 +#endif
2206 +
2207 +#if defined(HAVE_SHADOW_H) && defined(HAVE_SHADOW_PASSWORDS)
2208 +# include <shadow.h>
2209 +#endif
2210 +
2211 +#if TIME_WITH_SYS_TIME
2212 +# include <sys/time.h>
2213 +# include <time.h>
2214 +#else
2215 +# if HAVE_SYS_TIME_H
2216 +#  include <sys/time.h>
2217 +# else
2218 +#  include <time.h>
2219 +# endif
2220 +#endif
2221 +
2222 +/*
2223 + * prefer srandom/random over srand/rand as there generator has a
2224 + * better distribution of the numbers on certain systems.
2225 + * on Linux both generators are identical.
2226 + */
2227 +#ifndef HAVE_RANDOM
2228 +# ifdef HAVE_RAND
2229 +# define srandom        srand
2230 +# define random         rand
2231 +# endif
2232 +#endif
2233 +
2234 +/* rlib/lock.c */
2235 +int do_lock_exclusive(FILE *);
2236 +int do_unlock(FILE *);
2237 diff --git a/src/plugins/vbng/include/messages.h b/src/plugins/vbng/include/messages.h
2238 new file mode 100644
2239 index 00000000..9a5f0e81
2240 --- /dev/null
2241 +++ b/src/plugins/vbng/include/messages.h
2242 @@ -0,0 +1,53 @@
2243 +/*
2244 + * $Id: messages.h,v 1.2 2004/02/23 20:10:39 sobomax Exp $
2245 + *
2246 + * Copyright (C) 1995,1996 Lars Fenneberg
2247 + *
2248 + * Copyright 1992 Livingston Enterprises, Inc.
2249 + *
2250 + * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
2251 + * and Merit Network, Inc. All Rights Reserved
2252 + *
2253 + * See the file COPYRIGHT for the respective terms and conditions.
2254 + * If the file is missing contact me at lf@elemental.net
2255 + * and I'll send you a copy.
2256 + *
2257 + */
2258 +
2259 +/*
2260 + * Only messages that the user gets under normal use are in here.
2261 + * Error messages and such are still in the source code.
2262 + */
2263 +
2264 +#ifndef MESSAGES_H
2265 +#define MESSAGES_H
2266 +
2267 +/* radlogin.c */
2268 +
2269 +#define SC_LOGIN        "login: "
2270 +#define SC_PASSWORD     "Password: "
2271 +
2272 +#define SC_TIMEOUT      "\r\nlogin timed out after %d seconds. Bye.\r\n"
2273 +#define SC_EXCEEDED     "Maximum login tries exceeded. Go away!\r\n"
2274 +
2275 +#define SC_RADIUS_OK    "RADIUS: Authentication OK\r\n"
2276 +#define SC_RADIUS_FAILED "RADIUS: Authentication failure\r\n"
2277 +
2278 +#define SC_LOCAL_OK     "local: Authentication OK\r\n"
2279 +#define SC_LOCAL_FAILED         "local: Authentication failure\r\n"
2280 +#define SC_NOLOGIN      "\r\nSystem closed for maintenance. Try again later...\r\n"
2281 +
2282 +#define SC_SERVER_REPLY         "RADIUS: %s"
2283 +
2284 +#define SC_DEFAULT_ISSUE "(\\I)\r\n\r\n\\S \\R (\\N) (port \\L)\r\n\r\n"
2285 +
2286 +/* radacct.c */
2287 +
2288 +#define SC_ACCT_OK      "RADIUS accounting OK\r\n"
2289 +#define SC_ACCT_FAILED  "RADIUS accounting failed (RC=%i)\r\n"
2290 +
2291 +/* radstatus.c */
2292 +
2293 +#define SC_STATUS_FAILED       "RADIUS: Status failure\r\n"
2294 +
2295 +#endif /* MESSAGES_H */
2296 diff --git a/src/plugins/vbng/include/pathnames.h b/src/plugins/vbng/include/pathnames.h
2297 new file mode 100644
2298 index 00000000..0256d473
2299 --- /dev/null
2300 +++ b/src/plugins/vbng/include/pathnames.h
2301 @@ -0,0 +1,28 @@
2302 +/*
2303 + * $Id: pathnames.h,v 1.2 2004/02/23 20:10:39 sobomax Exp $
2304 + *
2305 + * Copyright (C) 1995,1996 Lars Fenneberg
2306 + *
2307 + * Copyright 1992 Livingston Enterprises, Inc.
2308 + *
2309 + * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
2310 + * and Merit Network, Inc. All Rights Reserved
2311 + *
2312 + * See the file COPYRIGHT for the respective terms and conditions.
2313 + * If the file is missing contact me at lf@elemental.net
2314 + * and I'll send you a copy.
2315 + *
2316 + */
2317 +
2318 +#ifndef PATHNAMES_H
2319 +#define PATHNAMES_H
2320 +
2321 +#define _PATH_DEV_URANDOM      "/dev/urandom"          /* Linux only */
2322 +#define _PATH_ETC_ISSUE                "/etc/issue"
2323 +
2324 +/* normally defined in the Makefile */
2325 +#ifndef _PATH_ETC_RADIUSCLIENT_CONF
2326 +#define _PATH_ETC_RADIUSCLIENT_CONF       "/etc/radiusclient.conf"
2327 +#endif
2328 +
2329 +#endif /* PATHNAMES_H */
2330 diff --git a/src/plugins/vbng/lib/avpair.c b/src/plugins/vbng/lib/avpair.c
2331 new file mode 100644
2332 index 00000000..8ce2a8ec
2333 --- /dev/null
2334 +++ b/src/plugins/vbng/lib/avpair.c
2335 @@ -0,0 +1,874 @@
2336 +/*
2337 + * $Id: avpair.c,v 1.26 2010/06/15 09:22:52 aland Exp $
2338 + *
2339 + * Copyright (C) 1995 Lars Fenneberg
2340 + *
2341 + * Copyright 1992 Livingston Enterprises, Inc.
2342 + *
2343 + * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
2344 + * and Merit Network, Inc. All Rights Reserved
2345 + *
2346 + * See the file COPYRIGHT for the respective terms and conditions.
2347 + * If the file is missing contact me at lf@elemental.net
2348 + * and I'll send you a copy.
2349 + *
2350 + */
2351 +
2352 +#include <config.h>
2353 +#include <includes.h>
2354 +#include <freeradius-client.h>
2355 +
2356 +/*
2357 + * Function: rc_avpair_add
2358 + *
2359 + * Purpose: add an attribute-value pair to the given list.
2360 + *
2361 + * Returns: pointer to added a/v pair upon success, NULL pointer upon failure.
2362 + *
2363 + * Remarks: Always appends the new pair to the end of the list.
2364 + *
2365 + */
2366 +
2367 +VALUE_PAIR *rc_avpair_add (rc_handle const *rh, VALUE_PAIR **list, int attrid, void const *pval, int len, int vendorpec)
2368 +{
2369 +       VALUE_PAIR     *vp;
2370 +
2371 +       vp = rc_avpair_new (rh, attrid, pval, len, vendorpec);
2372 +
2373 +       if (vp != NULL)
2374 +       {
2375 +               rc_avpair_insert (list, NULL, vp);
2376 +       }
2377 +
2378 +       return vp;
2379 +
2380 +}
2381 +
2382 +/*
2383 + * Function: rc_avpair_assign
2384 + *
2385 + * Purpose: assign the given value to an attribute-value pair.
2386 + *
2387 + * Returns:  0 on success,
2388 + *         -1 on failure.
2389 + *
2390 + */
2391 +
2392 +int rc_avpair_assign (VALUE_PAIR *vp, void const *pval, int len)
2393 +{
2394 +
2395 +       switch (vp->type)
2396 +       {
2397 +               case PW_TYPE_STRING:
2398 +                       if (len == -1)
2399 +                               len = (uint32_t)strlen((char const *)pval);
2400 +                       if (len > AUTH_STRING_LEN) {
2401 +                               rc_log(LOG_ERR, "rc_avpair_assign: bad attribute length");
2402 +                               return -1;
2403 +                       }
2404 +                       memcpy(vp->strvalue, (char const *)pval, len);
2405 +                       vp->strvalue[len] = '\0';
2406 +                       vp->lvalue = len;
2407 +                       break;
2408 +
2409 +               case PW_TYPE_DATE:
2410 +               case PW_TYPE_INTEGER:
2411 +               case PW_TYPE_IPADDR:
2412 +                       vp->lvalue = * (uint32_t *) pval;
2413 +                       break;
2414 +               case PW_TYPE_IPV6ADDR:
2415 +                       if (len != 16) {
2416 +                               rc_log(LOG_ERR, "rc_avpair_assign: bad IPv6 length");
2417 +                               return -1;
2418 +                       }
2419 +                       memcpy(vp->strvalue, (char const *)pval, len);
2420 +                       vp->lvalue = len;
2421 +                       break;
2422 +
2423 +               case PW_TYPE_IPV6PREFIX:
2424 +                       if (len < 2 || len > 18) {
2425 +                               rc_log(LOG_ERR, "rc_avpair_assign: bad IPv6 prefix length");
2426 +                               return -1;
2427 +                       }
2428 +                       memcpy(vp->strvalue, (char const *)pval, len);
2429 +                       vp->lvalue = len;
2430 +                       break;
2431 +
2432 +               default:
2433 +                       rc_log(LOG_ERR, "rc_avpair_assign: unknown attribute %d", vp->type);
2434 +                       return -1;
2435 +       }
2436 +       return 0;
2437 +}
2438 +
2439 +/*
2440 + * Function: rc_avpair_new
2441 + *
2442 + * Purpose: make a new attribute-value pair with given parameters.
2443 + *
2444 + * Returns: pointer to generated a/v pair when successful, NULL when failure.
2445 + *
2446 + */
2447 +
2448 +VALUE_PAIR *rc_avpair_new (rc_handle const *rh, int attrid, void const *pval, int len, int vendorpec)
2449 +{
2450 +       VALUE_PAIR     *vp = NULL;
2451 +       DICT_ATTR      *pda;
2452 +
2453 +       attrid = attrid | (vendorpec << 16);
2454 +       if ((pda = rc_dict_getattr (rh, attrid)) == NULL)
2455 +       {
2456 +               rc_log(LOG_ERR,"rc_avpair_new: unknown attribute %d", attrid);
2457 +               return NULL;
2458 +       }
2459 +       if (vendorpec != 0 && rc_dict_getvend(rh, vendorpec) == NULL)
2460 +       {
2461 +               rc_log(LOG_ERR,"rc_avpair_new: unknown Vendor-Id %d", vendorpec);
2462 +               return NULL;
2463 +       }
2464 +       if ((vp = malloc (sizeof (VALUE_PAIR))) != NULL)
2465 +       {
2466 +               strncpy (vp->name, pda->name, sizeof (vp->name));
2467 +               vp->attribute = attrid;
2468 +               vp->next = NULL;
2469 +               vp->type = pda->type;
2470 +               if (rc_avpair_assign (vp, pval, len) == 0)
2471 +               {
2472 +                       /* XXX: Fix up Digest-Attributes */
2473 +                       switch (vp->attribute) {
2474 +                       case PW_DIGEST_REALM:
2475 +                       case PW_DIGEST_NONCE:
2476 +                       case PW_DIGEST_METHOD:
2477 +                       case PW_DIGEST_URI:
2478 +                       case PW_DIGEST_QOP:
2479 +                       case PW_DIGEST_ALGORITHM:
2480 +                       case PW_DIGEST_BODY_DIGEST:
2481 +                       case PW_DIGEST_CNONCE:
2482 +                       case PW_DIGEST_NONCE_COUNT:
2483 +                       case PW_DIGEST_USER_NAME:
2484 +                               /* overlapping! */
2485 +                               if (vp->lvalue > AUTH_STRING_LEN - 2)
2486 +                                       vp->lvalue = AUTH_STRING_LEN - 2;
2487 +                               memmove(&vp->strvalue[2], &vp->strvalue[0], vp->lvalue);
2488 +                               vp->strvalue[0] = vp->attribute - PW_DIGEST_REALM + 1;
2489 +                               vp->lvalue += 2;
2490 +                               vp->strvalue[1] = vp->lvalue;
2491 +                               vp->strvalue[vp->lvalue] = '\0';
2492 +                               vp->attribute = PW_DIGEST_ATTRIBUTES;
2493 +                       default:
2494 +                               break;
2495 +                       }
2496 +                       return vp;
2497 +               }
2498 +               free (vp);
2499 +               vp = NULL;
2500 +       }
2501 +       else
2502 +       {
2503 +               rc_log(LOG_CRIT,"rc_avpair_new: out of memory");
2504 +       }
2505 +
2506 +       return vp;
2507 +}
2508 +
2509 +/*
2510 + *
2511 + * Function: rc_avpair_gen
2512 + *
2513 + * Purpose: takes attribute/value pairs from buffer and builds a
2514 + *         value_pair list using allocated memory. Uses recursion.
2515 + *
2516 + * Returns: value_pair list or NULL on failure
2517 + */
2518 +
2519 +VALUE_PAIR *
2520 +rc_avpair_gen(rc_handle const *rh, VALUE_PAIR *pair, unsigned char const *ptr,
2521 +    int length, int vendorpec)
2522 +{
2523 +       int attribute, attrlen, x_len;
2524 +       unsigned char const *x_ptr;
2525 +       uint32_t lvalue;
2526 +       DICT_ATTR *attr;
2527 +       VALUE_PAIR *rpair;
2528 +       char buffer[(AUTH_STRING_LEN * 2) + 1];
2529 +       /* For hex string conversion. */
2530 +       char hex[3];
2531 +
2532 +       if (length < 2) {
2533 +               rc_log(LOG_ERR, "rc_avpair_gen: received attribute with "
2534 +                   "invalid length");
2535 +               goto shithappens;
2536 +       }
2537 +       attrlen = ptr[1];
2538 +       if (length < attrlen || attrlen < 2) {
2539 +               rc_log(LOG_ERR, "rc_avpair_gen: received attribute with "
2540 +                   "invalid length");
2541 +               goto shithappens;
2542 +       }
2543 +
2544 +       /* Advance to the next attribute and process recursively */
2545 +       if (length != attrlen) {
2546 +               pair = rc_avpair_gen(rh, pair, ptr + attrlen, length - attrlen,
2547 +                   vendorpec);
2548 +               if (pair == NULL)
2549 +                       return NULL;
2550 +       }
2551 +
2552 +       /* Actual processing */
2553 +       attribute = ptr[0] | (vendorpec << 16);
2554 +       ptr += 2;
2555 +       attrlen -= 2;
2556 +
2557 +       /* VSA */
2558 +       if (attribute == PW_VENDOR_SPECIFIC) {
2559 +               if (attrlen < 4) {
2560 +                       rc_log(LOG_ERR, "rc_avpair_gen: received VSA "
2561 +                           "attribute with invalid length");
2562 +                       goto shithappens;
2563 +               }
2564 +               memcpy(&lvalue, ptr, 4);
2565 +               vendorpec = ntohl(lvalue);
2566 +               if (rc_dict_getvend(rh, vendorpec) == NULL) {
2567 +                       /* Warn and skip over the unknown VSA */
2568 +                       rc_log(LOG_WARNING, "rc_avpair_gen: received VSA "
2569 +                           "attribute with unknown Vendor-Id %d", vendorpec);
2570 +                       return pair;
2571 +               }
2572 +               /* Process recursively */
2573 +               return rc_avpair_gen(rh, pair, ptr + 4, attrlen - 4,
2574 +                   vendorpec);
2575 +       }
2576 +
2577 +       /* Normal */
2578 +       attr = rc_dict_getattr(rh, attribute);
2579 +       if (attr == NULL) {
2580 +               buffer[0] = '\0';       /* Initial length. */
2581 +               x_ptr = ptr;
2582 +               for (x_len = attrlen; x_len > 0; x_len--, x_ptr++) {
2583 +                       snprintf(hex, sizeof(hex), "%2.2X", x_ptr[0]);
2584 +                       strcat(buffer, hex);
2585 +               }
2586 +               if (vendorpec == 0) {
2587 +                       rc_log(LOG_WARNING, "rc_avpair_gen: received "
2588 +                           "unknown attribute %d of length %d: 0x%s",
2589 +                           attribute, attrlen + 2, buffer);
2590 +               } else {
2591 +                       rc_log(LOG_WARNING, "rc_avpair_gen: received "
2592 +                           "unknown VSA attribute %d, vendor %d of "
2593 +                           "length %d: 0x%s", attribute & 0xffff,
2594 +                           VENDOR(attribute), attrlen + 2, buffer);
2595 +               }
2596 +               goto shithappens;
2597 +       }
2598 +
2599 +       rpair = malloc(sizeof(*rpair));
2600 +       if (rpair == NULL) {
2601 +               rc_log(LOG_CRIT, "rc_avpair_gen: out of memory");
2602 +               goto shithappens;
2603 +       }
2604 +       memset(rpair, '\0', sizeof(*rpair));
2605 +
2606 +       /* Insert this new pair at the beginning of the list */
2607 +       rpair->next = pair;
2608 +       pair = rpair;
2609 +       strcpy(pair->name, attr->name);
2610 +       pair->attribute = attr->value;
2611 +       pair->type = attr->type;
2612 +
2613 +       switch (attr->type) {
2614 +       case PW_TYPE_STRING:
2615 +               memcpy(pair->strvalue, (char *)ptr, (size_t)attrlen);
2616 +               pair->strvalue[attrlen] = '\0';
2617 +               pair->lvalue = attrlen;
2618 +               break;
2619 +
2620 +       case PW_TYPE_INTEGER:
2621 +               if (attrlen != 4) {
2622 +                       rc_log(LOG_ERR, "rc_avpair_gen: received INT "
2623 +                           "attribute with invalid length");
2624 +                       goto shithappens;
2625 +               }
2626 +       case PW_TYPE_IPADDR:
2627 +               if (attrlen != 4) {
2628 +                       rc_log(LOG_ERR, "rc_avpair_gen: received IPADDR"
2629 +                           " attribute with invalid length");
2630 +                       goto shithappens;
2631 +               }
2632 +               memcpy((char *)&lvalue, (char *)ptr, 4);
2633 +               pair->lvalue = ntohl(lvalue);
2634 +               break;
2635 +       case PW_TYPE_IPV6ADDR:
2636 +               if (attrlen != 16) {
2637 +                       rc_log(LOG_ERR, "rc_avpair_gen: received IPV6ADDR"
2638 +                           " attribute with invalid length");
2639 +                       goto shithappens;
2640 +               }
2641 +               memcpy(pair->strvalue, (char *)ptr, 16);
2642 +               pair->lvalue = attrlen;
2643 +               break;
2644 +       case PW_TYPE_IPV6PREFIX:
2645 +               if (attrlen > 18 || attrlen < 2) {
2646 +                       rc_log(LOG_ERR, "rc_avpair_gen: received IPV6PREFIX"
2647 +                           " attribute with invalid length: %d", attrlen);
2648 +                       goto shithappens;
2649 +               }
2650 +               memcpy(pair->strvalue, (char *)ptr, attrlen);
2651 +               pair->lvalue = attrlen;
2652 +               break;
2653 +       case PW_TYPE_DATE:
2654 +               if (attrlen != 4) {
2655 +                       rc_log(LOG_ERR, "rc_avpair_gen: received DATE "
2656 +                           "attribute with invalid length");
2657 +                       goto shithappens;
2658 +               }
2659 +
2660 +       default:
2661 +               rc_log(LOG_WARNING, "rc_avpair_gen: %s has unknown type",
2662 +                   attr->name);
2663 +               goto shithappens;
2664 +       }
2665 +       return pair;
2666 +
2667 +shithappens:
2668 +       while (pair != NULL) {
2669 +               rpair = pair->next;
2670 +               free(pair);
2671 +               pair = rpair;
2672 +       }
2673 +       return NULL;
2674 +}
2675 +
2676 +/*
2677 + * Function: rc_avpair_get
2678 + *
2679 + * Purpose: Find the first attribute value-pair (which matches the given
2680 + *          attribute) from the specified value-pair list.
2681 + *
2682 + * Returns: found value_pair
2683 + *
2684 + */
2685 +
2686 +VALUE_PAIR *rc_avpair_get (VALUE_PAIR *vp, int attrid, int vendorpec)
2687 +{
2688 +       for (; vp != NULL && !(ATTRID(vp->attribute) == ATTRID(attrid) &&
2689 +           VENDOR(vp->attribute) == vendorpec); vp = vp->next)
2690 +       {
2691 +               continue;
2692 +       }
2693 +       return vp;
2694 +}
2695 +
2696 +/*
2697 + * Function: rc_avpair_insert
2698 + *
2699 + * Purpose: Given the address of an existing list "a" and a pointer
2700 + *         to an entry "p" in that list, add the value pair "b" to
2701 + *         the "a" list after the "p" entry.  If "p" is NULL, add
2702 + *         the value pair "b" to the end of "a".
2703 + *
2704 + */
2705 +
2706 +void rc_avpair_insert (VALUE_PAIR **a, VALUE_PAIR *p, VALUE_PAIR *b)
2707 +{
2708 +       VALUE_PAIR     *this_node = NULL;
2709 +       VALUE_PAIR     *vp;
2710 +
2711 +       if (b->next != NULL)
2712 +       {
2713 +               rc_log(LOG_CRIT, "rc_avpair_insert: value pair (0x%p) next ptr. (0x%p) not NULL", b, b->next);
2714 +               abort ();
2715 +       }
2716 +
2717 +       if (*a == NULL)
2718 +       {
2719 +               *a = b;
2720 +               return;
2721 +       }
2722 +
2723 +       vp = *a;
2724 +
2725 +       if ( p == NULL) /* run to end of "a" list */
2726 +       {
2727 +               while (vp != NULL)
2728 +               {
2729 +                       this_node = vp;
2730 +                       vp = vp->next;
2731 +               }
2732 +       }
2733 +       else /* look for the "p" entry in the "a" list */
2734 +       {
2735 +               this_node = *a;
2736 +               while (this_node != NULL)
2737 +               {
2738 +                       if (this_node == p)
2739 +                       {
2740 +                               break;
2741 +                       }
2742 +                       this_node = this_node->next;
2743 +               }
2744 +       }
2745 +
2746 +       b->next = this_node->next;
2747 +       this_node->next = b;
2748 +
2749 +       return;
2750 +}
2751 +
2752 +/*
2753 + * Function: rc_avpair_free
2754 + *
2755 + * Purpose: frees all value_pairs in the list
2756 + *
2757 + */
2758 +
2759 +void rc_avpair_free (VALUE_PAIR *pair)
2760 +{
2761 +       VALUE_PAIR     *next;
2762 +
2763 +       while (pair != NULL)
2764 +       {
2765 +               next = pair->next;
2766 +               free (pair);
2767 +               pair = next;
2768 +       }
2769 +}
2770 +
2771 +/*
2772 + * Function: rc_fieldcpy
2773 + *
2774 + * Purpose: Copy a data field from the buffer.  Advance the buffer
2775 + *          past the data field. Ensure that no more than len - 1
2776 + *          bytes are copied and that resulting string is terminated
2777 + *          with '\0'.
2778 + *
2779 + */
2780 +
2781 +static void
2782 +rc_fieldcpy(char *string, char const **uptr, char const *stopat, size_t len)
2783 +{
2784 +       char const *ptr, *estring;
2785 +
2786 +       ptr = *uptr;
2787 +       estring = string + len - 1;
2788 +       if (*ptr == '"')
2789 +       {
2790 +               ptr++;
2791 +               while (*ptr != '"' && *ptr != '\0' && *ptr != '\n')
2792 +               {
2793 +                       if (string < estring)
2794 +                               *string++ = *ptr;
2795 +                       ptr++;
2796 +               }
2797 +               if (*ptr == '"')
2798 +               {
2799 +                       ptr++;
2800 +               }
2801 +               *string = '\0';
2802 +               *uptr = ptr;
2803 +               return;
2804 +       }
2805 +
2806 +       while (*ptr != '\0' && strchr(stopat, *ptr) == NULL)
2807 +       {
2808 +               if (string < estring)
2809 +                       *string++ = *ptr;
2810 +               ptr++;
2811 +       }
2812 +       *string = '\0';
2813 +       *uptr = ptr;
2814 +       return;
2815 +}
2816 +
2817 +
2818 +/*
2819 + * Function: rc_avpair_parse
2820 + *
2821 + * Purpose: parses the buffer to extract the attribute-value pairs.
2822 + *
2823 + * Returns: 0 = successful parse of attribute-value pair,
2824 + *        -1 = syntax (or other) error detected.
2825 + *
2826 + */
2827 +
2828 +#define PARSE_MODE_NAME                0
2829 +#define PARSE_MODE_EQUAL       1
2830 +#define PARSE_MODE_VALUE       2
2831 +#define PARSE_MODE_INVALID     3
2832 +
2833 +int rc_avpair_parse (rc_handle const *rh, char const *buffer, VALUE_PAIR **first_pair)
2834 +{
2835 +       int             mode;
2836 +       char            attrstr[AUTH_ID_LEN];
2837 +       char            valstr[AUTH_STRING_LEN + 1], *p;
2838 +       DICT_ATTR      *attr = NULL;
2839 +       DICT_VALUE     *dval;
2840 +       VALUE_PAIR     *pair;
2841 +       VALUE_PAIR     *link;
2842 +       struct tm      *tm;
2843 +       time_t          timeval;
2844 +
2845 +       mode = PARSE_MODE_NAME;
2846 +       while (*buffer != '\n' && *buffer != '\0')
2847 +       {
2848 +               if (*buffer == ' ' || *buffer == '\t')
2849 +               {
2850 +                       buffer++;
2851 +                       continue;
2852 +               }
2853 +
2854 +               switch (mode)
2855 +               {
2856 +                   case PARSE_MODE_NAME:               /* Attribute Name */
2857 +                       rc_fieldcpy (attrstr, &buffer, " \t\n=,", sizeof(attrstr));
2858 +                       if ((attr =
2859 +                               rc_dict_findattr (rh, attrstr)) == NULL)
2860 +                       {
2861 +                               rc_log(LOG_ERR, "rc_avpair_parse: unknown attribute");
2862 +                               if (*first_pair) {
2863 +                                       rc_avpair_free(*first_pair);
2864 +                                       *first_pair = NULL;
2865 +                               }
2866 +                               return -1;
2867 +                       }
2868 +                       mode = PARSE_MODE_EQUAL;
2869 +                       break;
2870 +
2871 +                   case PARSE_MODE_EQUAL:              /* Equal sign */
2872 +                       if (*buffer == '=')
2873 +                       {
2874 +                               mode = PARSE_MODE_VALUE;
2875 +                               buffer++;
2876 +                       }
2877 +                       else
2878 +                       {
2879 +                               rc_log(LOG_ERR, "rc_avpair_parse: missing or misplaced equal sign");
2880 +                               if (*first_pair) {
2881 +                                       rc_avpair_free(*first_pair);
2882 +                                       *first_pair = NULL;
2883 +                               }
2884 +                               return -1;
2885 +                       }
2886 +                       break;
2887 +
2888 +                   case PARSE_MODE_VALUE:              /* Value */
2889 +                       rc_fieldcpy (valstr, &buffer, " \t\n,", sizeof(valstr));
2890 +
2891 +                       if ((pair = malloc (sizeof (VALUE_PAIR))) == NULL)
2892 +                       {
2893 +                               rc_log(LOG_CRIT, "rc_avpair_parse: out of memory");
2894 +                               if (*first_pair) {
2895 +                                       rc_avpair_free(*first_pair);
2896 +                                       *first_pair = NULL;
2897 +                               }
2898 +                               return -1;
2899 +                       }
2900 +                       strcpy (pair->name, attr->name);
2901 +                       pair->attribute = attr->value;
2902 +                       pair->type = attr->type;
2903 +
2904 +                       switch (pair->type)
2905 +                       {
2906 +
2907 +                           case PW_TYPE_STRING:
2908 +                               strcpy (pair->strvalue, valstr);
2909 +                               pair->lvalue = (uint32_t)strlen(valstr);
2910 +                               break;
2911 +
2912 +                           case PW_TYPE_INTEGER:
2913 +                               if (isdigit (*valstr))
2914 +                               {
2915 +                                       pair->lvalue = atoi (valstr);
2916 +                               }
2917 +                               else
2918 +                               {
2919 +                                       if ((dval = rc_dict_findval (rh, valstr))
2920 +                                                       == NULL)
2921 +                                       {
2922 +                                               rc_log(LOG_ERR, "rc_avpair_parse: unknown attribute value: %s", valstr);
2923 +                                               if (*first_pair) {
2924 +                                                       rc_avpair_free(*first_pair);
2925 +                                                       *first_pair = NULL;
2926 +                                               }
2927 +                                               free (pair);
2928 +                                               return -1;
2929 +                                       }
2930 +                                       else
2931 +                                       {
2932 +                                               pair->lvalue = dval->value;
2933 +                                       }
2934 +                               }
2935 +                               break;
2936 +
2937 +                           case PW_TYPE_IPADDR:
2938 +                                pair->lvalue = rc_get_ipaddr(valstr);
2939 +                               break;
2940 +
2941 +                           case PW_TYPE_IPV6ADDR:
2942 +                               if (inet_pton(AF_INET6, valstr, pair->strvalue) == 0) {
2943 +                                       rc_log(LOG_ERR, "rc_avpair_parse: invalid IPv6 address %s", valstr);
2944 +                                       free(pair);
2945 +                                       return -1;
2946 +                               }
2947 +                               pair->lvalue = 16;
2948 +                               break;
2949 +
2950 +                           case PW_TYPE_IPV6PREFIX:
2951 +                               p = strchr(valstr, '/');
2952 +                               if (p == NULL) {
2953 +                                       rc_log(LOG_ERR, "rc_avpair_parse: invalid IPv6 prefix %s", valstr);
2954 +                                       free(pair);
2955 +                                       return -1;
2956 +                               }
2957 +                               *p = 0;
2958 +                               p++;
2959 +                               pair->strvalue[0] = 0;
2960 +                               pair->strvalue[1] = atoi(p);
2961 +
2962 +                               if (inet_pton(AF_INET6, valstr, pair->strvalue+2) == 0) {
2963 +                                       rc_log(LOG_ERR, "rc_avpair_parse: invalid IPv6 prefix %s", valstr);
2964 +                                       free(pair);
2965 +                                       return -1;
2966 +                               }
2967 +                               pair->lvalue = 2+16;
2968 +                               break;
2969 +
2970 +                           case PW_TYPE_DATE:
2971 +                               timeval = time (0);
2972 +                               tm = localtime (&timeval);
2973 +                               tm->tm_hour = 0;
2974 +                               tm->tm_min = 0;
2975 +                               tm->tm_sec = 0;
2976 +                               rc_str2tm (valstr, tm);
2977 +#ifdef TIMELOCAL
2978 +                               pair->lvalue = (uint32_t) timelocal (tm);
2979 +#else  /* TIMELOCAL */
2980 +                               pair->lvalue = (uint32_t) mktime (tm);
2981 +#endif /* TIMELOCAL */
2982 +                               break;
2983 +
2984 +                           default:
2985 +                               rc_log(LOG_ERR, "rc_avpair_parse: unknown attribute type %d", pair->type);
2986 +                               if (*first_pair) {
2987 +                                       rc_avpair_free(*first_pair);
2988 +                                       *first_pair = NULL;
2989 +                               }
2990 +                               free (pair);
2991 +                               return -1;
2992 +                       }
2993 +
2994 +                       /* XXX: Fix up Digest-Attributes */
2995 +                       switch (pair->attribute) {
2996 +                       case PW_DIGEST_REALM:
2997 +                       case PW_DIGEST_NONCE:
2998 +                       case PW_DIGEST_METHOD:
2999 +                       case PW_DIGEST_URI:
3000 +                       case PW_DIGEST_QOP:
3001 +                       case PW_DIGEST_ALGORITHM:
3002 +                       case PW_DIGEST_BODY_DIGEST:
3003 +                       case PW_DIGEST_CNONCE:
3004 +                       case PW_DIGEST_NONCE_COUNT:
3005 +                       case PW_DIGEST_USER_NAME:
3006 +                               /* overlapping! */
3007 +                               if (pair->lvalue > AUTH_STRING_LEN - 2)
3008 +                                       pair->lvalue = AUTH_STRING_LEN - 2;
3009 +                               memmove(&pair->strvalue[2], &pair->strvalue[0], pair->lvalue);
3010 +                               pair->strvalue[0] = pair->attribute - PW_DIGEST_REALM + 1;
3011 +                               pair->lvalue += 2;
3012 +                               pair->strvalue[1] = pair->lvalue;
3013 +                               pair->strvalue[pair->lvalue] = '\0';
3014 +                               pair->attribute = PW_DIGEST_ATTRIBUTES;
3015 +                       }
3016 +
3017 +                       pair->next = NULL;
3018 +
3019 +                       if (*first_pair == NULL)
3020 +                       {
3021 +                               *first_pair = pair;
3022 +                       }
3023 +                       else
3024 +                       {
3025 +                               link = *first_pair;
3026 +                               while (link->next != NULL)
3027 +                               {
3028 +                                       link = link->next;
3029 +                               }
3030 +                               link->next = pair;
3031 +                       }
3032 +
3033 +                       mode = PARSE_MODE_NAME;
3034 +                       break;
3035 +
3036 +                   default:
3037 +                       mode = PARSE_MODE_NAME;
3038 +                       break;
3039 +               }
3040 +       }
3041 +       return 0;
3042 +}
3043 +
3044 +/*
3045 + * Function: rc_avpair_tostr
3046 + *
3047 + * Purpose: Translate an av_pair into two strings
3048 + *
3049 + * Returns: 0 on success, -1 on failure
3050 + *
3051 + */
3052 +
3053 +int rc_avpair_tostr (rc_handle const *rh, VALUE_PAIR *pair, char *name, int ln, char *value, int lv)
3054 +{
3055 +       DICT_VALUE     *dval;
3056 +       char            buffer[32];
3057 +       struct in_addr  inad;
3058 +       unsigned char         *ptr;
3059 +
3060 +       *name = *value = '\0';
3061 +
3062 +       if (!pair || pair->name[0] == '\0') {
3063 +               rc_log(LOG_ERR, "rc_avpair_tostr: pair is NULL or empty");
3064 +               return -1;
3065 +       }
3066 +
3067 +       strncpy(name, pair->name, (size_t) ln);
3068 +
3069 +       switch (pair->type)
3070 +       {
3071 +           case PW_TYPE_STRING:
3072 +               lv--;
3073 +               ptr = (unsigned char *) pair->strvalue;
3074 +               if (pair->attribute == PW_DIGEST_ATTRIBUTES) {
3075 +                       pair->strvalue[*(ptr + 1)] = '\0';
3076 +                       ptr += 2;
3077 +               }
3078 +               while (*ptr != '\0')
3079 +               {
3080 +                       if (!(isprint (*ptr)))
3081 +                       {
3082 +                               snprintf (buffer, sizeof(buffer), "\\%03o", *ptr);
3083 +                               strncat(value, buffer, (size_t) lv);
3084 +                               lv -= 4;
3085 +                               if (lv < 0) break;
3086 +                       }
3087 +                       else
3088 +                       {
3089 +                               strncat(value, (char *)ptr, 1);
3090 +                               lv--;
3091 +                               if (lv <= 0) break;
3092 +                       }
3093 +                       ptr++;
3094 +               }
3095 +               break;
3096 +
3097 +           case PW_TYPE_INTEGER:
3098 +               dval = rc_dict_getval (rh, pair->lvalue, pair->name);
3099 +               if (dval != NULL)
3100 +               {
3101 +                       strncpy(value, dval->name, (size_t) lv-1);
3102 +               }
3103 +               else
3104 +               {
3105 +                       snprintf(buffer, sizeof(buffer), "%ld", (long int)pair->lvalue);
3106 +                       strncpy(value, buffer, (size_t) lv);
3107 +               }
3108 +               break;
3109 +
3110 +           case PW_TYPE_IPADDR:
3111 +               inad.s_addr = htonl(pair->lvalue);
3112 +               strncpy (value, inet_ntoa (inad), (size_t) lv-1);
3113 +               break;
3114 +
3115 +           case PW_TYPE_IPV6ADDR:
3116 +               if (inet_ntop(AF_INET6, pair->strvalue, value, lv-1) == NULL)
3117 +                       return -1;
3118 +               break;
3119 +
3120 +           case PW_TYPE_IPV6PREFIX: {
3121 +               uint8_t ip[16];
3122 +               uint8_t txt[48];
3123 +               if (pair->lvalue < 2)
3124 +                       return -1;
3125 +
3126 +               memset(ip, 0, sizeof(ip));
3127 +               memcpy(ip, pair->strvalue+2, pair->lvalue-2);
3128 +
3129 +               if (inet_ntop(AF_INET6, ip, txt, sizeof(txt)) == NULL)
3130 +                       return -1;
3131 +               snprintf(value, lv-1, "%s/%u", txt, (unsigned)pair->strvalue[1]);
3132 +
3133 +               break;
3134 +           }
3135 +           case PW_TYPE_DATE:
3136 +               strftime (buffer, sizeof (buffer), "%m/%d/%y %H:%M:%S",
3137 +                         gmtime ((time_t *) & pair->lvalue));
3138 +               strncpy(value, buffer, lv-1);
3139 +               break;
3140 +
3141 +           default:
3142 +               rc_log(LOG_ERR, "rc_avpair_tostr: unknown attribute type %d", pair->type);
3143 +               return -1;
3144 +               break;
3145 +       }
3146 +
3147 +       return 0;
3148 +}
3149 +
3150 +/*
3151 + * Function: rc_avpair_log
3152 + *
3153 + * Purpose: format sequence of attribute value pairs into printable
3154 + * string. The caller should provide a storage buffer and the buffer length.
3155 + * Returns pointer to provided storage buffer.
3156 + *
3157 + */
3158 +char *
3159 +rc_avpair_log(rc_handle const *rh, VALUE_PAIR *pair, char *buf, size_t buf_len)
3160 +{
3161 +       size_t len, nlen;
3162 +       VALUE_PAIR *vp;
3163 +       char name[33], value[256];
3164 +
3165 +       len = 0;
3166 +       for (vp = pair; vp != NULL; vp = vp->next) {
3167 +               if (rc_avpair_tostr(rh, vp, name, sizeof(name), value,
3168 +                   sizeof(value)) == -1)
3169 +                       return NULL;
3170 +               nlen = len + 32 + 3 + strlen(value) + 2 + 2;
3171 +               if(nlen<buf_len-1) {
3172 +                       sprintf(buf + len, "%-32s = '%s'\n", name, value);
3173 +               } else return buf;
3174 +               len = nlen - 1;
3175 +       }
3176 +       return buf;
3177 +}
3178 +
3179 +/*
3180 + * Function: rc_avpair_readin
3181 + *
3182 + * Purpose: get a sequence of attribute value pairs from the file input
3183 + *         and make them into a list of value_pairs
3184 + *
3185 + */
3186 +
3187 +VALUE_PAIR *rc_avpair_readin(rc_handle const *rh, FILE *input)
3188 +{
3189 +       VALUE_PAIR *vp = NULL;
3190 +       char buffer[1024], *q;
3191 +
3192 +       while (fgets(buffer, sizeof(buffer), input) != NULL)
3193 +       {
3194 +               q = buffer;
3195 +
3196 +               while(*q && isspace(*q)) q++;
3197 +
3198 +               if ((*q == '\n') || (*q == '#') || (*q == '\0'))
3199 +                       continue;
3200 +
3201 +               if (rc_avpair_parse(rh, q, &vp) < 0) {
3202 +                       rc_log(LOG_ERR, "rc_avpair_readin: malformed attribute: %s", buffer);
3203 +                       rc_avpair_free(vp);
3204 +                       return NULL;
3205 +               }
3206 +       }
3207 +
3208 +       return vp;
3209 +}
3210 diff --git a/src/plugins/vbng/lib/buildreq.c b/src/plugins/vbng/lib/buildreq.c
3211 new file mode 100644
3212 index 00000000..a71b1f99
3213 --- /dev/null
3214 +++ b/src/plugins/vbng/lib/buildreq.c
3215 @@ -0,0 +1,276 @@
3216 +/*
3217 + * $Id: buildreq.c,v 1.17 2010/02/04 10:27:09 aland Exp $
3218 + *
3219 + * Copyright (C) 1995,1997 Lars Fenneberg
3220 + *
3221 + * See the file COPYRIGHT for the respective terms and conditions.
3222 + * If the file is missing contact me at lf@elemental.net
3223 + * and I'll send you a copy.
3224 + *
3225 + */
3226 +
3227 +#include <config.h>
3228 +#include <includes.h>
3229 +#include <freeradius-client.h>
3230 +
3231 +unsigned char rc_get_id();
3232 +
3233 +/*
3234 + * Function: rc_buildreq
3235 + *
3236 + * Purpose: builds a skeleton RADIUS request using information from the
3237 + *         config file.
3238 + *
3239 + */
3240 +
3241 +void rc_buildreq(rc_handle const *rh, SEND_DATA *data, int code, char *server, unsigned short port,
3242 +                char *secret, int timeout, int retries)
3243 +{
3244 +       data->server = server;
3245 +       data->secret = secret;
3246 +       data->svc_port = port;
3247 +       data->seq_nbr = rc_get_id();
3248 +       data->timeout = timeout;
3249 +       data->retries = retries;
3250 +       data->code = code;
3251 +}
3252 +
3253 +/*
3254 + * Function: rc_get_id
3255 + *
3256 + * Purpose: generate random id
3257 + *
3258 + */
3259 +
3260 +unsigned char rc_get_id()
3261 +{
3262 +       return (unsigned char)(random() & UCHAR_MAX);
3263 +}
3264 +
3265 +/*
3266 + * Function: rc_aaa
3267 + *
3268 + * Purpose: Builds an authentication/accounting request for port id client_port
3269 + *         with the value_pairs send and submits it to a server
3270 + *
3271 + * Returns: received value_pairs in received, messages from the server in msg
3272 + *         and 0 on success, negative on failure as return value
3273 + *
3274 + */
3275 +
3276 +int rc_aaa(rc_handle *rh, uint32_t client_port, VALUE_PAIR *send, VALUE_PAIR **received,
3277 +    char *msg, int add_nas_port, int request_type)
3278 +{
3279 +       SEND_DATA       data;
3280 +       VALUE_PAIR      *adt_vp = NULL;
3281 +       int             result;
3282 +       int             i, skip_count;
3283 +       SERVER          *aaaserver;
3284 +       int             timeout = rc_conf_int(rh, "radius_timeout");
3285 +       int             retries = rc_conf_int(rh, "radius_retries");
3286 +       int             radius_deadtime = rc_conf_int(rh, "radius_deadtime");
3287 +       double          start_time = 0;
3288 +       double          now = 0;
3289 +       time_t          dtime;
3290 +
3291 +       if (request_type != PW_ACCOUNTING_REQUEST) {
3292 +               aaaserver = rc_conf_srv(rh, "authserver");
3293 +       } else {
3294 +               aaaserver = rc_conf_srv(rh, "acctserver");
3295 +       }
3296 +       if (aaaserver == NULL)
3297 +               return ERROR_RC;
3298 +
3299 +       data.send_pairs = send;
3300 +       data.receive_pairs = NULL;
3301 +
3302 +       if (add_nas_port != 0) {
3303 +               /*
3304 +                * Fill in NAS-Port
3305 +                */
3306 +               if (rc_avpair_add(rh, &(data.send_pairs), PW_NAS_PORT,
3307 +                   &client_port, 0, 0) == NULL)
3308 +                       return ERROR_RC;
3309 +       }
3310 +
3311 +       if (request_type == PW_ACCOUNTING_REQUEST) {
3312 +               /*
3313 +                * Fill in Acct-Delay-Time
3314 +                */
3315 +               dtime = 0;
3316 +               now = rc_getctime();
3317 +               adt_vp = rc_avpair_get(data.send_pairs, PW_ACCT_DELAY_TIME, 0);
3318 +               if (adt_vp == NULL) {
3319 +                       adt_vp = rc_avpair_add(rh, &(data.send_pairs),
3320 +                           PW_ACCT_DELAY_TIME, &dtime, 0, 0);
3321 +                       if (adt_vp == NULL)
3322 +                               return ERROR_RC;
3323 +                       start_time = now;
3324 +               } else {
3325 +                       start_time = now - adt_vp->lvalue;
3326 +               }
3327 +       }
3328 +
3329 +       skip_count = 0;
3330 +       result = ERROR_RC;
3331 +       for (i=0; (i < aaaserver->max) && (result != OK_RC) && (result != BADRESP_RC)
3332 +           ; i++, now = rc_getctime())
3333 +       {
3334 +               if (aaaserver->deadtime_ends[i] != -1 &&
3335 +                   aaaserver->deadtime_ends[i] > start_time) {
3336 +                       skip_count++;
3337 +                       continue;
3338 +               }
3339 +               if (data.receive_pairs != NULL) {
3340 +                       rc_avpair_free(data.receive_pairs);
3341 +                       data.receive_pairs = NULL;
3342 +               }
3343 +               rc_buildreq(rh, &data, request_type, aaaserver->name[i],
3344 +                   aaaserver->port[i], aaaserver->secret[i], timeout, retries);
3345 +
3346 +               if (request_type == PW_ACCOUNTING_REQUEST) {
3347 +                       dtime = now - start_time;
3348 +                       rc_avpair_assign(adt_vp, &dtime, 0);
3349 +               }
3350 +
3351 +               result = rc_send_server (rh, &data, msg);
3352 +               if (result == TIMEOUT_RC && radius_deadtime > 0)
3353 +                       aaaserver->deadtime_ends[i] = start_time + (double)radius_deadtime;
3354 +       }
3355 +       if (result == OK_RC || result == BADRESP_RC || skip_count == 0)
3356 +               goto exit;
3357 +
3358 +       result = ERROR_RC;
3359 +       for (i=0; (i < aaaserver->max) && (result != OK_RC) && (result != BADRESP_RC)
3360 +           ; i++)
3361 +       {
3362 +               if (aaaserver->deadtime_ends[i] == -1 ||
3363 +                   aaaserver->deadtime_ends[i] <= start_time) {
3364 +                       continue;
3365 +               }
3366 +               if (data.receive_pairs != NULL) {
3367 +                       rc_avpair_free(data.receive_pairs);
3368 +                       data.receive_pairs = NULL;
3369 +               }
3370 +               rc_buildreq(rh, &data, request_type, aaaserver->name[i],
3371 +                   aaaserver->port[i], aaaserver->secret[i], timeout, retries);
3372 +
3373 +               if (request_type == PW_ACCOUNTING_REQUEST) {
3374 +                       dtime = rc_getctime() - start_time;
3375 +                       rc_avpair_assign(adt_vp, &dtime, 0);
3376 +               }
3377 +
3378 +               result = rc_send_server (rh, &data, msg);
3379 +               if (result != TIMEOUT_RC)
3380 +                       aaaserver->deadtime_ends[i] = -1;
3381 +       }
3382 +
3383 +exit:
3384 +       if (request_type != PW_ACCOUNTING_REQUEST) {
3385 +               *received = data.receive_pairs;
3386 +       } else {
3387 +               rc_avpair_free(data.receive_pairs);
3388 +       }
3389 +
3390 +       return result;
3391 +}
3392 +
3393 +/*
3394 + * Function: rc_auth
3395 + *
3396 + * Purpose: Builds an authentication request for port id client_port
3397 + *          with the value_pairs send and submits it to a server
3398 + *
3399 + * Returns: received value_pairs in received, messages from the server in msg (if non-NULL),
3400 + *          and 0 on success, negative on failure as return value
3401 + *
3402 + */
3403 +
3404 +int rc_auth(rc_handle *rh, uint32_t client_port, VALUE_PAIR *send, VALUE_PAIR **received,
3405 +    char *msg)
3406 +{
3407 +
3408 +       return rc_aaa(rh, client_port, send, received, msg, 1, PW_ACCESS_REQUEST);
3409 +}
3410 +
3411 +/*
3412 + * Function: rc_auth_proxy
3413 + *
3414 + * Purpose: Builds an authentication request
3415 + *         with the value_pairs send and submits it to a server.
3416 + *         Works for a proxy; does not add IP address, and does
3417 + *         does not rely on config file.
3418 + *
3419 + * Returns: received value_pairs in received, messages from the server in msg (if non-NULL)
3420 + *         and 0 on success, negative on failure as return value
3421 + *
3422 + */
3423 +
3424 +int rc_auth_proxy(rc_handle *rh, VALUE_PAIR *send, VALUE_PAIR **received, char *msg)
3425 +{
3426 +
3427 +       return rc_aaa(rh, 0, send, received, msg, 0, PW_ACCESS_REQUEST);
3428 +}
3429 +
3430 +
3431 +/*
3432 + * Function: rc_acct
3433 + *
3434 + * Purpose: Builds an accounting request for port id client_port
3435 + *         with the value_pairs send
3436 + *
3437 + * Remarks: NAS-IP-Address, NAS-Port and Acct-Delay-Time get filled
3438 + *         in by this function, the rest has to be supplied.
3439 + */
3440 +
3441 +int rc_acct(rc_handle *rh, uint32_t client_port, VALUE_PAIR *send)
3442 +{
3443 +
3444 +       return rc_aaa(rh, client_port, send, NULL, NULL, 1, PW_ACCOUNTING_REQUEST);
3445 +}
3446 +
3447 +/*
3448 + * Function: rc_acct_proxy
3449 + *
3450 + * Purpose: Builds an accounting request with the value_pairs send
3451 + *
3452 + */
3453 +
3454 +int rc_acct_proxy(rc_handle *rh, VALUE_PAIR *send)
3455 +{
3456 +
3457 +       return rc_aaa(rh, 0, send, NULL, NULL, 0, PW_ACCOUNTING_REQUEST);
3458 +}
3459 +
3460 +/*
3461 + * Function: rc_check
3462 + *
3463 + * Purpose: ask the server hostname on the specified port for a
3464 + *         status message
3465 + *
3466 + */
3467 +
3468 +int rc_check(rc_handle *rh, char *host, char *secret, unsigned short port, char *msg)
3469 +{
3470 +       SEND_DATA       data;
3471 +       int             result;
3472 +       uint32_t                service_type;
3473 +       int             timeout = rc_conf_int(rh, "radius_timeout");
3474 +       int             retries = rc_conf_int(rh, "radius_retries");
3475 +
3476 +       data.send_pairs = data.receive_pairs = NULL;
3477 +
3478 +       /*
3479 +        * Fill in Service-Type
3480 +        */
3481 +
3482 +       service_type = PW_ADMINISTRATIVE;
3483 +       rc_avpair_add(rh, &(data.send_pairs), PW_SERVICE_TYPE, &service_type, 0, 0);
3484 +
3485 +       rc_buildreq(rh, &data, PW_STATUS_SERVER, host, port, secret, timeout, retries);
3486 +       result = rc_send_server (rh, &data, msg);
3487 +
3488 +       rc_avpair_free(data.receive_pairs);
3489 +
3490 +       return result;
3491 +}
3492 diff --git a/src/plugins/vbng/lib/clientid.c b/src/plugins/vbng/lib/clientid.c
3493 new file mode 100644
3494 index 00000000..6901a04b
3495 --- /dev/null
3496 +++ b/src/plugins/vbng/lib/clientid.c
3497 @@ -0,0 +1,146 @@
3498 +/*
3499 + * $Id: clientid.c,v 1.7 2007/07/11 17:29:29 cparker Exp $
3500 + *
3501 + * Copyright (C) 1995,1996,1997 Lars Fenneberg
3502 + *
3503 + * See the file COPYRIGHT for the respective terms and conditions.
3504 + * If the file is missing contact me at lf@elemental.net
3505 + * and I'll send you a copy.
3506 + *
3507 + */
3508 +
3509 +#include <config.h>
3510 +#include <includes.h>
3511 +#include <freeradius-client.h>
3512 +
3513 +struct map2id_s {
3514 +       char *name;
3515 +       uint32_t id;
3516 +
3517 +       struct map2id_s *next;
3518 +};
3519 +
3520 +/*
3521 + * Function: rc_read_mapfile
3522 + *
3523 + * Purpose: Read in the ttyname to port id map file
3524 + *
3525 + * Arguments: the file name of the map file
3526 + *
3527 + * Returns: zero on success, negative integer on failure
3528 + */
3529 +
3530 +int rc_read_mapfile(rc_handle *rh, char const *filename)
3531 +{
3532 +       char buffer[1024];
3533 +       FILE *mapfd;
3534 +       char *c, *name, *id, *q;
3535 +       struct map2id_s *p;
3536 +       int lnr = 0;
3537 +
3538 +        if ((mapfd = fopen(filename,"r")) == NULL)
3539 +        {
3540 +               rc_log(LOG_ERR,"rc_read_mapfile: can't read %s: %s", filename, strerror(errno));
3541 +               return -1;
3542 +       }
3543 +
3544 +#define SKIP(p) while(*p && isspace(*p)) p++;
3545 +
3546 +        while (fgets(buffer, sizeof(buffer), mapfd) != NULL)
3547 +        {
3548 +               lnr++;
3549 +
3550 +               q = buffer;
3551 +
3552 +                SKIP(q);
3553 +
3554 +                if ((*q == '\n') || (*q == '#') || (*q == '\0'))
3555 +                       continue;
3556 +
3557 +               if (( c = strchr(q, ' ')) || (c = strchr(q,'\t'))) {
3558 +
3559 +                       *c = '\0'; c++;
3560 +                       SKIP(c);
3561 +
3562 +                       name = q;
3563 +                       id = c;
3564 +
3565 +                       if ((p = (struct map2id_s *)malloc(sizeof(*p))) == NULL) {
3566 +                               rc_log(LOG_CRIT,"rc_read_mapfile: out of memory");
3567 +                               fclose(mapfd);
3568 +                               return -1;
3569 +                       }
3570 +
3571 +                       p->name = strdup(name);
3572 +                       p->id = atoi(id);
3573 +                       p->next = rh->map2id_list;
3574 +                       rh->map2id_list = p;
3575 +
3576 +               } else {
3577 +
3578 +                       rc_log(LOG_ERR, "rc_read_mapfile: malformed line in %s, line %d", filename, lnr);
3579 +                       fclose(mapfd);
3580 +                       return -1;
3581 +
3582 +               }
3583 +       }
3584 +
3585 +#undef SKIP
3586 +
3587 +       fclose(mapfd);
3588 +
3589 +       return 0;
3590 +}
3591 +
3592 +/*
3593 + * Function: rc_map2id
3594 + *
3595 + * Purpose: Map ttyname to port id
3596 + *
3597 + * Arguments: full pathname of the tty
3598 + *
3599 + * Returns: port id, zero if no entry found
3600 + */
3601 +
3602 +uint32_t rc_map2id(rc_handle const *rh, char const *name)
3603 +{
3604 +       struct map2id_s *p;
3605 +       char ttyname[PATH_MAX];
3606 +
3607 +       *ttyname = '\0';
3608 +       if (*name != '/')
3609 +               strcpy(ttyname, "/dev/");
3610 +
3611 +       strncat(ttyname, name, sizeof(ttyname)-strlen(ttyname)-1);
3612 +
3613 +       for(p = rh->map2id_list; p; p = p->next)
3614 +               if (!strcmp(ttyname, p->name)) return p->id;
3615 +
3616 +       rc_log(LOG_WARNING,"rc_map2id: can't find tty %s in map database", ttyname);
3617 +
3618 +       return 0;
3619 +}
3620 +
3621 +/*
3622 + * Function: rc_map2id_free
3623 + *
3624 + * Purpose: Free allocated map2id list
3625 + *
3626 + * Arguments: Radius Client handle
3627 + */
3628 +
3629 +void
3630 +rc_map2id_free(rc_handle *rh)
3631 +{
3632 +       struct map2id_s *p, *np;
3633 +
3634 +       if (rh->map2id_list == NULL)
3635 +               return;
3636 +
3637 +       for(p = rh->map2id_list; p != NULL; p = np) {
3638 +               np = p->next;
3639 +               free(p->name);
3640 +               free(p);
3641 +       }
3642 +       rh->map2id_list = NULL;
3643 +}
3644 diff --git a/src/plugins/vbng/lib/config.c b/src/plugins/vbng/lib/config.c
3645 new file mode 100644
3646 index 00000000..1db78608
3647 --- /dev/null
3648 +++ b/src/plugins/vbng/lib/config.c
3649 @@ -0,0 +1,925 @@
3650 +/*
3651 + * $Id: config.c,v 1.23 2010/04/28 14:26:15 aland Exp $
3652 + *
3653 + * Copyright (C) 1995,1996,1997 Lars Fenneberg
3654 + *
3655 + * Copyright 1992 Livingston Enterprises, Inc.
3656 + *
3657 + * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
3658 + * and Merit Network, Inc. All Rights Reserved
3659 + *
3660 + * See the file COPYRIGHT for the respective terms and conditions.
3661 + * If the file is missing contact me at lf@elemental.net
3662 + * and I'll send you a copy.
3663 + *
3664 + */
3665 +
3666 +#include <config.h>
3667 +#include <includes.h>
3668 +#include <freeradius-client.h>
3669 +#include <options.h>
3670 +
3671 +/*
3672 + * Function: find_option
3673 + *
3674 + * Purpose: find an option in the option list
3675 + *
3676 + * Returns: pointer to option on success, NULL otherwise
3677 + */
3678 +
3679 +static OPTION *find_option(rc_handle const *rh, char const *optname, unsigned int type)
3680 +{
3681 +       int     i;
3682 +
3683 +       /* there're so few options that a binary search seems not necessary */
3684 +       for (i = 0; i < NUM_OPTIONS; i++) {
3685 +               if (!strcmp(rh->config_options[i].name, optname) &&
3686 +                   (rh->config_options[i].type & type))
3687 +               {
3688 +                       return &rh->config_options[i];
3689 +               }
3690 +       }
3691 +
3692 +       return NULL;
3693 +}
3694 +
3695 +/*
3696 + * Function: set_option_...
3697 + *
3698 + * Purpose: set a specific option doing type conversions
3699 + *
3700 + * Returns: 0 on success, -1 on failure
3701 + */
3702 +
3703 +static int set_option_str(char const *filename, int line, OPTION *option, char const *p)
3704 +{
3705 +       if (p) {
3706 +               option->val = (void *) strdup(p);
3707 +               if (option->val == NULL) {
3708 +                       rc_log(LOG_CRIT, "read_config: out of memory");
3709 +                       return -1;
3710 +               }
3711 +       } else {
3712 +               option->val = NULL;
3713 +       }
3714 +
3715 +       return 0;
3716 +}
3717 +
3718 +static int set_option_int(char const *filename, int line, OPTION *option, char const *p)
3719 +{
3720 +       int *iptr;
3721 +
3722 +       if (p == NULL) {
3723 +               rc_log(LOG_ERR, "%s: line %d: bogus option value", filename, line);
3724 +               return -1;
3725 +       }
3726 +
3727 +       if ((iptr = malloc(sizeof(*iptr))) == NULL) {
3728 +               rc_log(LOG_CRIT, "read_config: out of memory");
3729 +               return -1;
3730 +       }
3731 +
3732 +       *iptr = atoi(p);
3733 +       option->val = (void *) iptr;
3734 +
3735 +       return 0;
3736 +}
3737 +
3738 +static int set_option_srv(char const *filename, int line, OPTION *option, char const *p)
3739 +{
3740 +       SERVER *serv;
3741 +       char *p_pointer;
3742 +       char *p_dupe;
3743 +       char *p_save;
3744 +       char *q;
3745 +       char *s;
3746 +       struct servent *svp;
3747 +
3748 +       p_dupe = strdup(p);
3749 +
3750 +       if (p_dupe == NULL) {
3751 +               rc_log(LOG_ERR, "%s: line %d: Invalid option or memory failure", filename, line);
3752 +               return -1;
3753 +       }
3754 +
3755 +       serv = (SERVER *) option->val;
3756 +       if (serv == NULL) {
3757 +               DEBUG(LOG_ERR, "option->val / server is NULL, allocating memory");
3758 +               serv = malloc(sizeof(*serv));
3759 +               if (serv == NULL) {
3760 +                       rc_log(LOG_CRIT, "read_config: out of memory");
3761 +                       free(p_dupe);
3762 +                       return -1;
3763 +               }
3764 +               memset(serv, 0, sizeof(*serv));
3765 +               serv->max = 0;
3766 +       }
3767 +
3768 +       p_pointer = strtok_r(p_dupe, ", \t", &p_save);
3769 +
3770 +       /* Check to see if we have 'servername:port' syntax */
3771 +       if ((q = strchr(p_pointer,':')) != NULL) {
3772 +               *q = '\0';
3773 +               q++;
3774 +
3775 +               /* Check to see if we have 'servername:port:secret' syntax */
3776 +               if((s = strchr(q,':')) != NULL) {
3777 +                       *s = '\0';
3778 +                       s++;
3779 +                       serv->secret[serv->max] = strdup(s);
3780 +                       if (serv->secret[serv->max] == NULL) {
3781 +                               rc_log(LOG_CRIT, "read_config: out of memory");
3782 +                               if (option->val == NULL) {
3783 +                                       free(p_dupe);
3784 +                                       free(serv);
3785 +                               }
3786 +                               return -1;
3787 +                       }
3788 +               }
3789 +       }
3790 +       if(q && strlen(q) > 0) {
3791 +               serv->port[serv->max] = atoi(q);
3792 +       } else {
3793 +               if (!strcmp(option->name,"authserver"))
3794 +                       if ((svp = getservbyname ("radius", "udp")) == NULL)
3795 +                               serv->port[serv->max] = PW_AUTH_UDP_PORT;
3796 +                       else
3797 +                               serv->port[serv->max] = ntohs ((unsigned int) svp->s_port);
3798 +               else if (!strcmp(option->name, "acctserver"))
3799 +                       if ((svp = getservbyname ("radacct", "udp")) == NULL)
3800 +                               serv->port[serv->max] = PW_ACCT_UDP_PORT;
3801 +                       else
3802 +                               serv->port[serv->max] = ntohs ((unsigned int) svp->s_port);
3803 +               else {
3804 +                       rc_log(LOG_ERR, "%s: line %d: no default port for %s", filename, line, option->name);
3805 +                       if (option->val == NULL) {
3806 +                               free(p_dupe);
3807 +                               free(serv);
3808 +                       }
3809 +                       return -1;
3810 +               }
3811 +       }
3812 +
3813 +       serv->name[serv->max] = strdup(p_pointer);
3814 +       if (serv->name[serv->max] == NULL) {
3815 +               rc_log(LOG_CRIT, "read_config: out of memory");
3816 +               if (option->val == NULL) {
3817 +                       free(p_dupe);
3818 +                       free(serv);
3819 +               }
3820 +               return -1;
3821 +       }
3822 +       free(p_dupe);
3823 +
3824 +       serv->deadtime_ends[serv->max] = -1;
3825 +       serv->max++;
3826 +
3827 +       if (option->val == NULL)
3828 +               option->val = (void *)serv;
3829 +
3830 +       return 0;
3831 +}
3832 +
3833 +static int set_option_auo(char const *filename, int line, OPTION *option, char const *p)
3834 +{
3835 +       int *iptr;
3836 +       char *p_dupe = NULL;
3837 +       char *p_pointer = NULL;
3838 +       char *p_save = NULL;
3839 +
3840 +       p_dupe = strdup(p);
3841 +
3842 +       if (p_dupe == NULL) {
3843 +               rc_log(LOG_WARNING, "%s: line %d: bogus option value", filename, line);
3844 +               return -1;
3845 +       }
3846 +
3847 +       if ((iptr = malloc(sizeof(iptr))) == NULL) {
3848 +                       rc_log(LOG_CRIT, "read_config: out of memory");
3849 +                       free(p_dupe);
3850 +                       return -1;
3851 +       }
3852 +
3853 +       *iptr = 0;
3854 +       /*if(strstr(p_dupe,", \t") != NULL) {*/
3855 +               p_pointer = strtok_r(p_dupe, ", \t", &p_save);
3856 +       /*}*/
3857 +
3858 +       if (!strncmp(p_pointer, "local", 5))
3859 +                       *iptr = AUTH_LOCAL_FST;
3860 +       else if (!strncmp(p_pointer, "radius", 6))
3861 +                       *iptr = AUTH_RADIUS_FST;
3862 +       else {
3863 +               rc_log(LOG_ERR,"%s: auth_order: unknown keyword: %s", filename, p);
3864 +               free(iptr);
3865 +               free(p_dupe);
3866 +               return -1;
3867 +       }
3868 +
3869 +       p_pointer = strtok_r(NULL, ", \t", &p_save);
3870 +
3871 +       if (p_pointer && (*p_pointer != '\0')) {
3872 +               if ((*iptr & AUTH_RADIUS_FST) && !strcmp(p_pointer, "local"))
3873 +                       *iptr = (*iptr) | AUTH_LOCAL_SND;
3874 +               else if ((*iptr & AUTH_LOCAL_FST) && !strcmp(p_pointer, "radius"))
3875 +                       *iptr = (*iptr) | AUTH_RADIUS_SND;
3876 +               else {
3877 +                       rc_log(LOG_ERR,"%s: auth_order: unknown or unexpected keyword: %s", filename, p);
3878 +                       free(iptr);
3879 +                       free(p_dupe);
3880 +                       return -1;
3881 +               }
3882 +       }
3883 +
3884 +       option->val = (void *) iptr;
3885 +
3886 +       free(p_dupe);
3887 +       return 0;
3888 +}
3889 +
3890 +
3891 +/* Function: rc_add_config
3892 + *
3893 + * Purpose: allow a config option to be added to rc_handle from inside a program
3894 + *
3895 + * Returns: 0 on success, -1 on failure
3896 + */
3897 +
3898 +int rc_add_config(rc_handle *rh, char const *option_name, char const *option_val, char const *source, int line)
3899 +{
3900 +       OPTION *option;
3901 +
3902 +       if ((option = find_option(rh, option_name, OT_ANY)) == NULL)
3903 +       {
3904 +               rc_log(LOG_ERR, "ERROR: unrecognized option: %s", option_name);
3905 +               return -1;
3906 +       }
3907 +
3908 +       if (option->status != ST_UNDEF)
3909 +       {
3910 +               rc_log(LOG_ERR, "ERROR: duplicate option: %s", option_name);
3911 +               return -1;
3912 +       }
3913 +
3914 +       switch (option->type) {
3915 +               case OT_STR:
3916 +                       if (set_option_str(source, line, option, option_val) < 0) {
3917 +                               return -1;
3918 +                       }
3919 +                       break;
3920 +               case OT_INT:
3921 +                       if (set_option_int(source, line, option, option_val) < 0) {
3922 +                               return -1;
3923 +                       }
3924 +                       break;
3925 +               case OT_SRV:
3926 +                       if (set_option_srv(source, line, option, option_val) < 0) {
3927 +                               return -1;
3928 +                       }
3929 +                       break;
3930 +               case OT_AUO:
3931 +                       if (set_option_auo(source, line, option, option_val) < 0) {
3932 +                               return -1;
3933 +                       }
3934 +                       break;
3935 +               default:
3936 +                       rc_log(LOG_CRIT, "rc_add_config: impossible case branch!");
3937 +                       abort();
3938 +       }
3939 +       return 0;
3940 +}
3941 +
3942 +/*
3943 + * Function: rc_config_init
3944 + *
3945 + * Purpose: initialize the configuration structure from an external program.  For use when not
3946 + * running a standalone client that reads from a config file.
3947 + *
3948 + * Returns: rc_handle on success, NULL on failure
3949 + */
3950 +
3951 +rc_handle *
3952 +rc_config_init(rc_handle *rh)
3953 +{
3954 +       int i;
3955 +       SERVER *authservers;
3956 +       SERVER *acctservers;
3957 +       OPTION *acct;
3958 +       OPTION *auth;
3959 +
3960 +        rh->config_options = malloc(sizeof(config_options_default));
3961 +        if (rh->config_options == NULL)
3962 +       {
3963 +                rc_log(LOG_CRIT, "rc_config_init: out of memory");
3964 +               rc_destroy(rh);
3965 +                return NULL;
3966 +        }
3967 +        memcpy(rh->config_options, &config_options_default, sizeof(config_options_default));
3968 +
3969 +       acct = find_option(rh, "acctserver", OT_ANY);
3970 +       auth = find_option(rh, "authserver", OT_ANY);
3971 +       authservers = malloc(sizeof(SERVER));
3972 +       acctservers = malloc(sizeof(SERVER));
3973 +
3974 +       if(authservers == NULL || acctservers == NULL)
3975 +       {
3976 +                rc_log(LOG_CRIT, "rc_config_init: error initializing server structs");
3977 +               rc_destroy(rh);
3978 +               if(authservers) free(authservers);
3979 +               if(acctservers) free(acctservers);
3980 +                return NULL;
3981 +       }
3982 +
3983 +
3984 +       authservers->max = 0;
3985 +       acctservers->max = 0;
3986 +
3987 +       for(i=0; i < SERVER_MAX; i++)
3988 +       {
3989 +               authservers->name[i] = NULL;
3990 +               authservers->secret[i] = NULL;
3991 +               acctservers->name[i] = NULL;
3992 +               acctservers->secret[i] = NULL;
3993 +       }
3994 +       acct->val = acctservers;
3995 +       auth->val = authservers;
3996 +       return rh;
3997 +}
3998 +
3999 +
4000 +/*
4001 + * Function: rc_read_config
4002 + *
4003 + * Purpose: read the global config file
4004 + *
4005 + * Returns: new rc_handle on success, NULL when failure
4006 + */
4007 +
4008 +rc_handle *
4009 +rc_read_config(char const *filename)
4010 +{
4011 +       FILE *configfd;
4012 +       char buffer[512], *p;
4013 +       OPTION *option;
4014 +       int line;
4015 +       size_t pos;
4016 +       rc_handle *rh;
4017 +
4018 +       srandom((unsigned int)(time(NULL)+getpid()));
4019 +
4020 +       rh = rc_new();
4021 +       if (rh == NULL)
4022 +               return NULL;
4023 +
4024 +        rh->config_options = malloc(sizeof(config_options_default));
4025 +        if (rh->config_options == NULL) {
4026 +                rc_log(LOG_CRIT, "rc_read_config: out of memory");
4027 +               rc_destroy(rh);
4028 +                return NULL;
4029 +        }
4030 +        memcpy(rh->config_options, &config_options_default, sizeof(config_options_default));
4031 +
4032 +       if ((configfd = fopen(filename,"r")) == NULL)
4033 +       {
4034 +               rc_log(LOG_ERR,"rc_read_config: can't open %s: %s", filename, strerror(errno));
4035 +               rc_destroy(rh);
4036 +               return NULL;
4037 +       }
4038 +
4039 +       line = 0;
4040 +       while ((fgets(buffer, sizeof(buffer), configfd) != NULL))
4041 +       {
4042 +               line++;
4043 +               p = buffer;
4044 +
4045 +               if ((*p == '\n') || (*p == '#') || (*p == '\0'))
4046 +                       continue;
4047 +
4048 +               p[strlen(p)-1] = '\0';
4049 +
4050 +
4051 +               if ((pos = strcspn(p, "\t ")) == 0) {
4052 +                       rc_log(LOG_ERR, "%s: line %d: bogus format: %s", filename, line, p);
4053 +                       fclose(configfd);
4054 +                       rc_destroy(rh);
4055 +                       return NULL;
4056 +               }
4057 +
4058 +               p[pos] = '\0';
4059 +
4060 +               if ((option = find_option(rh, p, OT_ANY)) == NULL) {
4061 +                       rc_log(LOG_ERR, "%s: line %d: unrecognized keyword: %s", filename, line, p);
4062 +                       fclose(configfd);
4063 +                       rc_destroy(rh);
4064 +                       return NULL;
4065 +               }
4066 +
4067 +               if (option->status != ST_UNDEF) {
4068 +                       rc_log(LOG_ERR, "%s: line %d: duplicate option line: %s", filename, line, p);
4069 +                       fclose(configfd);
4070 +                       rc_destroy(rh);
4071 +                       return NULL;
4072 +               }
4073 +
4074 +               p += pos+1;
4075 +               while (isspace(*p))
4076 +                       p++;
4077 +               pos = strlen(p) - 1;
4078 +               while(pos != 0 && isspace(p[pos]))
4079 +                       pos--;
4080 +               p[pos + 1] = '\0';
4081 +
4082 +               switch (option->type) {
4083 +                       case OT_STR:
4084 +                               if (set_option_str(filename, line, option, p) < 0) {
4085 +                                       fclose(configfd);
4086 +                                       rc_destroy(rh);
4087 +                                       return NULL;
4088 +                               }
4089 +                               break;
4090 +                       case OT_INT:
4091 +                               if (set_option_int(filename, line, option, p) < 0) {
4092 +                                       fclose(configfd);
4093 +                                       rc_destroy(rh);
4094 +                                       return NULL;
4095 +                               }
4096 +                               break;
4097 +                       case OT_SRV:
4098 +                               if (set_option_srv(filename, line, option, p) < 0) {
4099 +                                       fclose(configfd);
4100 +                                       rc_destroy(rh);
4101 +                                       return NULL;
4102 +                               }
4103 +                               break;
4104 +                       case OT_AUO:
4105 +                               if (set_option_auo(filename, line, option, p) < 0) {
4106 +                                       fclose(configfd);
4107 +                                       rc_destroy(rh);
4108 +                                       return NULL;
4109 +                               }
4110 +                               break;
4111 +                       default:
4112 +                               rc_log(LOG_CRIT, "rc_read_config: impossible case branch!");
4113 +                               abort();
4114 +               }
4115 +       }
4116 +       fclose(configfd);
4117 +
4118 +       if (test_config(rh, filename) == -1) {
4119 +               rc_destroy(rh);
4120 +               return NULL;
4121 +       }
4122 +       return rh;
4123 +}
4124 +
4125 +/*
4126 + * Function: rc_conf_str, rc_conf_int, rc_conf_src
4127 + *
4128 + * Purpose: get the value of a config option
4129 + *
4130 + * Returns: config option value
4131 + */
4132 +
4133 +char *rc_conf_str(rc_handle const *rh, char const *optname)
4134 +{
4135 +       OPTION *option;
4136 +
4137 +       option = find_option(rh, optname, OT_STR);
4138 +
4139 +       if (option != NULL) {
4140 +               return (char *)option->val;
4141 +       } else {
4142 +               rc_log(LOG_CRIT, "rc_conf_str: unkown config option requested: %s", optname);
4143 +               abort();
4144 +               return NULL;
4145 +       }
4146 +}
4147 +
4148 +int rc_conf_int(rc_handle const *rh, char const *optname)
4149 +{
4150 +       OPTION *option;
4151 +
4152 +       option = find_option(rh, optname, OT_INT|OT_AUO);
4153 +
4154 +       if (option != NULL) {
4155 +               if (option->val) {
4156 +                       return *((int *)option->val);
4157 +               } else {
4158 +                       rc_log(LOG_ERR, "rc_conf_int: config option %s was not set", optname);
4159 +                       return 0;
4160 +               }
4161 +       } else {
4162 +               rc_log(LOG_CRIT, "rc_conf_int: unkown config option requested: %s", optname);
4163 +               abort();
4164 +               return 0;
4165 +       }
4166 +}
4167 +
4168 +SERVER *rc_conf_srv(rc_handle const *rh, char const *optname)
4169 +{
4170 +       OPTION *option;
4171 +
4172 +       option = find_option(rh, optname, OT_SRV);
4173 +
4174 +       if (option != NULL) {
4175 +               return (SERVER *)option->val;
4176 +       } else {
4177 +               rc_log(LOG_CRIT, "rc_conf_srv: unkown config option requested: %s", optname);
4178 +               abort();
4179 +               return NULL;
4180 +       }
4181 +}
4182 +
4183 +/*
4184 + * Function: test_config
4185 + *
4186 + * Purpose: test the configuration the user supplied
4187 + *
4188 + * Returns: 0 on success, -1 when failure
4189 + */
4190 +
4191 +int test_config(rc_handle const *rh, char const *filename)
4192 +{
4193 +#if 0
4194 +       struct stat st;
4195 +       char        *file;
4196 +#endif
4197 +
4198 +       if (!(rc_conf_srv(rh, "authserver")->max))
4199 +       {
4200 +               rc_log(LOG_ERR,"%s: no authserver specified", filename);
4201 +               return -1;
4202 +       }
4203 +       if (!(rc_conf_srv(rh, "acctserver")->max))
4204 +       {
4205 +               rc_log(LOG_ERR,"%s: no acctserver specified", filename);
4206 +               return -1;
4207 +       }
4208 +       if (!rc_conf_str(rh, "servers"))
4209 +       {
4210 +               rc_log(LOG_ERR,"%s: no servers file specified", filename);
4211 +               return -1;
4212 +       }
4213 +       if (!rc_conf_str(rh, "dictionary"))
4214 +       {
4215 +               rc_log(LOG_ERR,"%s: no dictionary specified", filename);
4216 +               return -1;
4217 +       }
4218 +
4219 +       if (rc_conf_int(rh, "radius_timeout") <= 0)
4220 +       {
4221 +               rc_log(LOG_ERR,"%s: radius_timeout <= 0 is illegal", filename);
4222 +               return -1;
4223 +       }
4224 +       if (rc_conf_int(rh, "radius_retries") <= 0)
4225 +       {
4226 +               rc_log(LOG_ERR,"%s: radius_retries <= 0 is illegal", filename);
4227 +               return -1;
4228 +       }
4229 +       if (rc_conf_int(rh, "radius_deadtime") < 0)
4230 +       {
4231 +               rc_log(LOG_ERR,"%s: radius_deadtime is illegal", filename);
4232 +               return -1;
4233 +       }
4234 +#if 0
4235 +       file = rc_conf_str(rh, "login_local");
4236 +       if (stat(file, &st) == 0)
4237 +       {
4238 +               if (!S_ISREG(st.st_mode)) {
4239 +                       rc_log(LOG_ERR,"%s: not a regular file: %s", filename, file);
4240 +                       return -1;
4241 +               }
4242 +       } else {
4243 +               rc_log(LOG_ERR,"%s: file not found: %s", filename, file);
4244 +               return -1;
4245 +       }
4246 +       file = rc_conf_str(rh, "login_radius");
4247 +       if (stat(file, &st) == 0)
4248 +       {
4249 +               if (!S_ISREG(st.st_mode)) {
4250 +                       rc_log(LOG_ERR,"%s: not a regular file: %s", filename, file);
4251 +                       return -1;
4252 +               }
4253 +       } else {
4254 +               rc_log(LOG_ERR,"%s: file not found: %s", filename, file);
4255 +               return -1;
4256 +       }
4257 +#endif
4258 +
4259 +       if (rc_conf_int(rh, "login_tries") <= 0)
4260 +       {
4261 +               rc_log(LOG_ERR,"%s: login_tries <= 0 is illegal", filename);
4262 +               return -1;
4263 +       }
4264 +       if (rc_conf_str(rh, "seqfile") == NULL)
4265 +       {
4266 +               rc_log(LOG_ERR,"%s: seqfile not specified", filename);
4267 +               return -1;
4268 +       }
4269 +       if (rc_conf_int(rh, "login_timeout") <= 0)
4270 +       {
4271 +               rc_log(LOG_ERR,"%s: login_timeout <= 0 is illegal", filename);
4272 +               return -1;
4273 +       }
4274 +       if (rc_conf_str(rh, "mapfile") == NULL)
4275 +       {
4276 +               rc_log(LOG_ERR,"%s: mapfile not specified", filename);
4277 +               return -1;
4278 +       }
4279 +       if (rc_conf_str(rh, "nologin") == NULL)
4280 +       {
4281 +               rc_log(LOG_ERR,"%s: nologin not specified", filename);
4282 +               return -1;
4283 +       }
4284 +
4285 +       return 0;
4286 +}
4287 +
4288 +/*
4289 + * Function: rc_find_match
4290 + *
4291 + * Purpose: see if ip_addr is one of the ip addresses of hostname
4292 + *
4293 + * Returns: 0 on success, -1 when failure
4294 + *
4295 + */
4296 +
4297 +static int find_match (uint32_t *ip_addr, char const *hostname)
4298 +{
4299 +
4300 +       uint32_t           addr;
4301 +       char          **paddr;
4302 +       struct hostent *hp;
4303 +
4304 +       if (rc_good_ipaddr (hostname) == 0)
4305 +       {
4306 +               if (*ip_addr == ntohl(inet_addr (hostname)))
4307 +               {
4308 +                       return 0;
4309 +               }
4310 +               return -1;
4311 +       }
4312 +
4313 +       if ((hp = rc_gethostbyname(hostname)) == NULL)
4314 +       {
4315 +               return -1;
4316 +       }
4317 +
4318 +       for (paddr = hp->h_addr_list; *paddr; paddr++)
4319 +       {
4320 +               addr = ** (uint32_t **) paddr;
4321 +               if (ntohl(addr) == *ip_addr)
4322 +               {
4323 +                       return 0;
4324 +               }
4325 +       }
4326 +       return -1;
4327 +}
4328 +
4329 +/*
4330 + * Function: rc_ipaddr_local
4331 + *
4332 + * Purpose: checks if provided address is local address
4333 + *
4334 + * Returns: 0 if local, 1 if not local, -1 on failure
4335 + *
4336 + */
4337 +
4338 +static int
4339 +rc_ipaddr_local(uint32_t ip_addr)
4340 +{
4341 +       int temp_sock, res, serrno;
4342 +       struct sockaddr_in sin;
4343 +
4344 +       temp_sock = socket(AF_INET, SOCK_DGRAM, 0);
4345 +       if (temp_sock == -1)
4346 +               return -1;
4347 +       memset(&sin, '\0', sizeof(sin));
4348 +       sin.sin_family = AF_INET;
4349 +       sin.sin_addr.s_addr = htonl(ip_addr);
4350 +       sin.sin_port = htons(0);
4351 +       res = bind(temp_sock, (struct sockaddr *)&sin, sizeof(sin));
4352 +       serrno = errno;
4353 +       close(temp_sock);
4354 +       if (res == 0)
4355 +               return 0;
4356 +       if (serrno == EADDRNOTAVAIL)
4357 +               return 1;
4358 +       return -1;
4359 +}
4360 +
4361 +/*
4362 + * Function: rc_is_myname
4363 + *
4364 + * Purpose: check if provided name refers to ourselves
4365 + *
4366 + * Returns: 0 if yes, 1 if no and -1 on failure
4367 + *
4368 + */
4369 +
4370 +static int
4371 +rc_is_myname(char const *hostname)
4372 +{
4373 +       uint32_t        addr;
4374 +       char    **paddr;
4375 +       struct  hostent *hp;
4376 +       int     res;
4377 +
4378 +       if (rc_good_ipaddr(hostname) == 0)
4379 +               return rc_ipaddr_local(ntohl(inet_addr(hostname)));
4380 +
4381 +       if ((hp = rc_gethostbyname(hostname)) == NULL)
4382 +               return -1;
4383 +       for (paddr = hp->h_addr_list; *paddr; paddr++) {
4384 +               addr = **(uint32_t **)paddr;
4385 +               res = rc_ipaddr_local(ntohl(addr));
4386 +               if (res == 0 || res == -1)
4387 +                       return res;
4388 +       }
4389 +       return 1;
4390 +}
4391 +
4392 +/*
4393 + * Function: rc_find_server
4394 + *
4395 + * Purpose: locate a server in the rh config or if not found, check for a servers file
4396 + *
4397 + * Returns: 0 on success, -1 on failure
4398 + *
4399 + */
4400 +
4401 +int rc_find_server (rc_handle const *rh, char const *server_name, uint32_t *ip_addr, char *secret)
4402 +{
4403 +       int             i;
4404 +       size_t          len;
4405 +       int             result = 0;
4406 +       FILE           *clientfd;
4407 +       char           *h;
4408 +       char           *s;
4409 +       char            buffer[128];
4410 +       char            hostnm[AUTH_ID_LEN + 1];
4411 +       char           *buffer_save;
4412 +       char           *hostnm_save;
4413 +       SERVER         *authservers;
4414 +       SERVER         *acctservers;
4415 +
4416 +       /* Lookup the IP address of the radius server */
4417 +       if ((*ip_addr = rc_get_ipaddr (server_name)) == (uint32_t) 0)
4418 +               return -1;
4419 +
4420 +       /* Check to see if the server secret is defined in the rh config */
4421 +       if( (authservers = rc_conf_srv(rh, "authserver")) != NULL )
4422 +       {
4423 +               for( i = 0; i < authservers->max; i++ )
4424 +               {
4425 +                       if( (strncmp(server_name, authservers->name[i], strlen(server_name)) == 0) &&
4426 +                           (authservers->secret[i] != NULL) )
4427 +                       {
4428 +                               memset (secret, '\0', MAX_SECRET_LENGTH);
4429 +                               len = strlen (authservers->secret[i]);
4430 +                               if (len > MAX_SECRET_LENGTH)
4431 +                               {
4432 +                                       len = MAX_SECRET_LENGTH;
4433 +                               }
4434 +                               strncpy (secret, authservers->secret[i], (size_t) len);
4435 +                               secret[MAX_SECRET_LENGTH] = '\0';
4436 +                               return 0;
4437 +                       }
4438 +               }
4439 +       }
4440 +
4441 +       if( (acctservers = rc_conf_srv(rh, "acctserver")) != NULL )
4442 +       {
4443 +               for( i = 0; i < acctservers->max; i++ )
4444 +               {
4445 +                       if( (strncmp(server_name, acctservers->name[i], strlen(server_name)) == 0) &&
4446 +                           (acctservers->secret[i] != NULL) )
4447 +                       {
4448 +                               memset (secret, '\0', MAX_SECRET_LENGTH);
4449 +                               len = strlen (acctservers->secret[i]);
4450 +                               if (len > MAX_SECRET_LENGTH)
4451 +                               {
4452 +                                       len = MAX_SECRET_LENGTH;
4453 +                               }
4454 +                               strncpy (secret, acctservers->secret[i], (size_t) len);
4455 +                               secret[MAX_SECRET_LENGTH] = '\0';
4456 +                               return 0;
4457 +                       }
4458 +               }
4459 +       }
4460 +
4461 +       /* We didn't find it in the rh_config or the servername is too long so look for a
4462 +        * servers file to define the secret(s)
4463 +        */
4464 +
4465 +       if ((clientfd = fopen (rc_conf_str(rh, "servers"), "r")) == NULL)
4466 +       {
4467 +               rc_log(LOG_ERR, "rc_find_server: couldn't open file: %s: %s", strerror(errno), rc_conf_str(rh, "servers"));
4468 +               return -1;
4469 +       }
4470 +
4471 +       while (fgets (buffer, sizeof (buffer), clientfd) != NULL)
4472 +       {
4473 +               if (*buffer == '#')
4474 +                       continue;
4475 +
4476 +               if ((h = strtok_r(buffer, " \t\n", &buffer_save)) == NULL) /* first hostname */
4477 +                       continue;
4478 +
4479 +               memset (hostnm, '\0', AUTH_ID_LEN);
4480 +               len = strlen (h);
4481 +               if (len > AUTH_ID_LEN)
4482 +               {
4483 +                       len = AUTH_ID_LEN;
4484 +               }
4485 +               strncpy (hostnm, h, (size_t) len);
4486 +               hostnm[AUTH_ID_LEN] = '\0';
4487 +
4488 +               if ((s = strtok_r (NULL, " \t\n", &buffer_save)) == NULL) /* and secret field */
4489 +                       continue;
4490 +
4491 +               memset (secret, '\0', MAX_SECRET_LENGTH);
4492 +               len = strlen (s);
4493 +               if (len > MAX_SECRET_LENGTH)
4494 +               {
4495 +                       len = MAX_SECRET_LENGTH;
4496 +               }
4497 +               strncpy (secret, s, (size_t) len);
4498 +               secret[MAX_SECRET_LENGTH] = '\0';
4499 +
4500 +               if (!strchr (hostnm, '/')) /* If single name form */
4501 +               {
4502 +                       if (find_match (ip_addr, hostnm) == 0)
4503 +                       {
4504 +                               result++;
4505 +                               break;
4506 +                       }
4507 +               }
4508 +               else /* <name1>/<name2> "paired" form */
4509 +               {
4510 +                       strtok_r(hostnm, "/", &hostnm_save);
4511 +                       if (rc_is_myname(hostnm) == 0)
4512 +                       {            /* If we're the 1st name, target is 2nd */
4513 +                               if (find_match (ip_addr, hostnm_save) == 0)
4514 +                               {
4515 +                                       result++;
4516 +                                       break;
4517 +                               }
4518 +                       }
4519 +                       else    /* If we were 2nd name, target is 1st name */
4520 +                       {
4521 +                               if (find_match (ip_addr, hostnm) == 0)
4522 +                               {
4523 +                                       result++;
4524 +                                       break;
4525 +                               }
4526 +                       }
4527 +               }
4528 +       }
4529 +       fclose (clientfd);
4530 +       if (result == 0)
4531 +       {
4532 +               memset (buffer, '\0', sizeof (buffer));
4533 +               memset (secret, '\0', MAX_SECRET_LENGTH);
4534 +               rc_log(LOG_ERR, "rc_find_server: couldn't find RADIUS server %s in %s",
4535 +                        server_name, rc_conf_str(rh, "servers"));
4536 +               return -1;
4537 +       }
4538 +       return 0;
4539 +}
4540 +
4541 +/*
4542 + * Function: rc_config_free
4543 + *
4544 + * Purpose: Free allocated config values
4545 + *
4546 + * Arguments: Radius Client handle
4547 + */
4548 +
4549 +void
4550 +rc_config_free(rc_handle *rh)
4551 +{
4552 +       int i, j;
4553 +       SERVER *serv;
4554 +
4555 +       if (rh->config_options == NULL)
4556 +               return;
4557 +
4558 +       for (i = 0; i < NUM_OPTIONS; i++) {
4559 +               if (rh->config_options[i].val == NULL)
4560 +                       continue;
4561 +               if (rh->config_options[i].type == OT_SRV) {
4562 +                       serv = (SERVER *)rh->config_options[i].val;
4563 +                       for (j = 0; j < serv->max; j++){
4564 +                               free(serv->name[j]);
4565 +                               if(serv->secret[j]) free(serv->secret[j]);
4566 +                       }
4567 +                       free(serv);
4568 +               } else {
4569 +                       free(rh->config_options[i].val);
4570 +               }
4571 +       }
4572 +       free(rh->config_options);
4573 +       rh->config_options = NULL;
4574 +}
4575 diff --git a/src/plugins/vbng/lib/dict.c b/src/plugins/vbng/lib/dict.c
4576 new file mode 100644
4577 index 00000000..84dbba0e
4578 --- /dev/null
4579 +++ b/src/plugins/vbng/lib/dict.c
4580 @@ -0,0 +1,519 @@
4581 +/*
4582 + * $Id: dict.c,v 1.10 2007/07/11 17:29:29 cparker Exp $
4583 + *
4584 + * Copyright (C) 1995,1996,1997 Lars Fenneberg
4585 + *
4586 + * Copyright 1992 Livingston Enterprises, Inc.
4587 + *
4588 + * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
4589 + * and Merit Network, Inc. All Rights Reserved
4590 + *
4591 + * See the file COPYRIGHT for the respective terms and conditions.
4592 + * If the file is missing contact me at lf@elemental.net
4593 + * and I'll send you a copy.
4594 + *
4595 + */
4596 +
4597 +#include <config.h>
4598 +#include <includes.h>
4599 +#include <freeradius-client.h>
4600 +
4601 +/*
4602 + * Function: rc_read_dictionary
4603 + *
4604 + * Purpose: Initialize the dictionary.  Read all ATTRIBUTES into
4605 + *         the dictionary_attributes list.  Read all VALUES into
4606 + *         the dictionary_values list.
4607 + *
4608 + */
4609 +
4610 +int rc_read_dictionary (rc_handle *rh, char const *filename)
4611 +{
4612 +       FILE           *dictfd;
4613 +       char            dummystr[AUTH_ID_LEN];
4614 +       char            namestr[AUTH_ID_LEN];
4615 +       char            valstr[AUTH_ID_LEN];
4616 +       char            attrstr[AUTH_ID_LEN];
4617 +       char            typestr[AUTH_ID_LEN];
4618 +       char            optstr[AUTH_ID_LEN];
4619 +       char            *cp, *ifilename;
4620 +       int             line_no;
4621 +       DICT_ATTR      *attr;
4622 +       DICT_VALUE     *dval;
4623 +       DICT_VENDOR    *dvend;
4624 +       char            buffer[256];
4625 +       int             value;
4626 +       int             type;
4627 +       unsigned attr_vendorspec = 0;
4628 +
4629 +       if ((dictfd = fopen (filename, "r")) == NULL)
4630 +       {
4631 +               rc_log(LOG_ERR, "rc_read_dictionary: couldn't open dictionary %s: %s",
4632 +                               filename, strerror(errno));
4633 +               return -1;
4634 +       }
4635 +
4636 +       line_no = 0;
4637 +       while (fgets (buffer, sizeof (buffer), dictfd) != NULL)
4638 +       {
4639 +               line_no++;
4640 +
4641 +               /* Skip empty space */
4642 +               if (*buffer == '#' || *buffer == '\0' || *buffer == '\n' || \
4643 +                   *buffer == '\r')
4644 +               {
4645 +                       continue;
4646 +               }
4647 +
4648 +               /* Strip out comments */
4649 +               cp = strchr(buffer, '#');
4650 +               if (cp != NULL)
4651 +               {
4652 +                       *cp = '\0';
4653 +               }
4654 +
4655 +               if (strncmp (buffer, "ATTRIBUTE", 9) == 0)
4656 +               {
4657 +                       optstr[0] = '\0';
4658 +                       /* Read the ATTRIBUTE line */
4659 +                       if (sscanf (buffer, "%63s%63s%63s%63s%63s", dummystr, namestr,
4660 +                                   valstr, typestr, optstr) < 4)
4661 +                       {
4662 +                               rc_log(LOG_ERR, "rc_read_dictionary: invalid attribute on line %d of dictionary %s",
4663 +                                        line_no, filename);
4664 +                               fclose(dictfd);
4665 +                               return -1;
4666 +                       }
4667 +
4668 +                       /*
4669 +                        * Validate all entries
4670 +                        */
4671 +                       if (strlen (namestr) > NAME_LENGTH)
4672 +                       {
4673 +                               rc_log(LOG_ERR, "rc_read_dictionary: invalid name length on line %d of dictionary %s",
4674 +                                        line_no, filename);
4675 +                               fclose(dictfd);
4676 +                               return -1;
4677 +                       }
4678 +
4679 +                       if (!isdigit (*valstr))
4680 +                       {
4681 +                               rc_log(LOG_ERR,
4682 +                                "rc_read_dictionary: invalid value on line %d of dictionary %s",
4683 +                                        line_no, filename);
4684 +                               fclose(dictfd);
4685 +                               return -1;
4686 +                       }
4687 +                       value = atoi (valstr);
4688 +
4689 +                       if (strcmp (typestr, "string") == 0)
4690 +                       {
4691 +                               type = PW_TYPE_STRING;
4692 +                       }
4693 +                       else if (strcmp (typestr, "integer") == 0)
4694 +                       {
4695 +                               type = PW_TYPE_INTEGER;
4696 +                       }
4697 +                       else if (strcmp (typestr, "ipaddr") == 0)
4698 +                       {
4699 +                               type = PW_TYPE_IPADDR;
4700 +                       }
4701 +                       else if (strcmp (typestr, "ipv6addr") == 0)
4702 +                       {
4703 +                               type = PW_TYPE_IPV6ADDR;
4704 +                       }
4705 +                       else if (strcmp (typestr, "ipv6prefix") == 0)
4706 +                       {
4707 +                               type = PW_TYPE_IPV6PREFIX;
4708 +                       }
4709 +                       else if (strcmp (typestr, "date") == 0)
4710 +                       {
4711 +                               type = PW_TYPE_DATE;
4712 +                       }
4713 +                       else
4714 +                       {
4715 +                               rc_log(LOG_ERR,
4716 +                                 "rc_read_dictionary: invalid type on line %d of dictionary %s",
4717 +                                        line_no, filename);
4718 +                               fclose(dictfd);
4719 +                               return -1;
4720 +                       }
4721 +
4722 +                       dvend = NULL;
4723 +                       if (optstr[0] != '\0') {
4724 +                               char *cp1;
4725 +                               for (cp1 = optstr; cp1 != NULL; cp1 = cp) {
4726 +                                       cp = strchr(cp1, ',');
4727 +                                       if (cp != NULL) {
4728 +                                               *cp = '\0';
4729 +                                               cp++;
4730 +                                       }
4731 +                                       if (strncmp(cp1, "vendor=", 7) == 0)
4732 +                                               cp1 += 7;
4733 +                                       dvend = rc_dict_findvend(rh, cp1);
4734 +                                       if (dvend == NULL) {
4735 +                                               rc_log(LOG_ERR,
4736 +                                                "rc_read_dictionary: unknown Vendor-Id %s on line %d of dictionary %s",
4737 +                                                        cp1, line_no, filename);
4738 +                                               fclose(dictfd);
4739 +                                               return -1;
4740 +                                       }
4741 +                               }
4742 +                       }
4743 +
4744 +                       /* Create a new attribute for the list */
4745 +                       if ((attr = malloc (sizeof (DICT_ATTR))) == NULL)
4746 +                       {
4747 +                               rc_log(LOG_CRIT, "rc_read_dictionary: out of memory");
4748 +                               fclose(dictfd);
4749 +                               return -1;
4750 +                       }
4751 +                       strcpy (attr->name, namestr);
4752 +                       attr->value = value | (attr_vendorspec << 16);
4753 +                       attr->type = type;
4754 +
4755 +                       if (dvend != NULL) {
4756 +                               attr->value = value | (dvend->vendorpec << 16);
4757 +                       } else {
4758 +                               attr->value = value | (attr_vendorspec << 16);
4759 +                       }
4760 +
4761 +                       /* Insert it into the list */
4762 +                       attr->next = rh->dictionary_attributes;
4763 +                       rh->dictionary_attributes = attr;
4764 +               }
4765 +               else if (strncmp (buffer, "VALUE", 5) == 0)
4766 +               {
4767 +                       /* Read the VALUE line */
4768 +                       if (sscanf (buffer, "%63s%63s%63s%63s", dummystr, attrstr,
4769 +                                   namestr, valstr) != 4)
4770 +                       {
4771 +                               rc_log(LOG_ERR,
4772 +                          "rc_read_dictionary: invalid value entry on line %d of dictionary %s",
4773 +                                        line_no, filename);
4774 +                               fclose(dictfd);
4775 +                               return -1;
4776 +                       }
4777 +
4778 +                       /*
4779 +                        * Validate all entries
4780 +                        */
4781 +                       if (strlen (attrstr) > NAME_LENGTH)
4782 +                       {
4783 +                               rc_log(LOG_ERR,
4784 +                     "rc_read_dictionary: invalid attribute length on line %d of dictionary %s",
4785 +                                        line_no, filename);
4786 +                               fclose(dictfd);
4787 +                               return -1;
4788 +                       }
4789 +
4790 +                       if (strlen (namestr) > NAME_LENGTH)
4791 +                       {
4792 +                               rc_log(LOG_ERR,
4793 +                          "rc_read_dictionary: invalid name length on line %d of dictionary %s",
4794 +                                        line_no, filename);
4795 +                               fclose(dictfd);
4796 +                               return -1;
4797 +                       }
4798 +
4799 +                       if (!isdigit (*valstr))
4800 +                       {
4801 +                               rc_log(LOG_ERR,
4802 +                                "rc_read_dictionary: invalid value on line %d of dictionary %s",
4803 +                                        line_no, filename);
4804 +                               fclose(dictfd);
4805 +                               return -1;
4806 +                       }
4807 +                       value = atoi (valstr);
4808 +
4809 +                       /* Create a new VALUE entry for the list */
4810 +                       if ((dval = malloc (sizeof (DICT_VALUE))) == NULL)
4811 +                       {
4812 +                               rc_log(LOG_CRIT, "rc_read_dictionary: out of memory");
4813 +                               fclose(dictfd);
4814 +                               return -1;
4815 +                       }
4816 +                       strcpy (dval->attrname, attrstr);
4817 +                       strcpy (dval->name, namestr);
4818 +                       dval->value = value;
4819 +
4820 +                       /* Insert it into the list */
4821 +                       dval->next = rh->dictionary_values;
4822 +                       rh->dictionary_values = dval;
4823 +               }
4824 +                else if (strncmp (buffer, "$INCLUDE", 8) == 0)
4825 +                {
4826 +                       /* Read the $INCLUDE line */
4827 +                       if (sscanf (buffer, "%63s%63s", dummystr, namestr) != 2)
4828 +                       {
4829 +                               rc_log(LOG_ERR,
4830 +                                "rc_read_dictionary: invalid include entry on line %d of dictionary %s",
4831 +                                        line_no, filename);
4832 +                               fclose(dictfd);
4833 +                               return -1;
4834 +                       }
4835 +                       ifilename = namestr;
4836 +                       /* Append directory if necessary */
4837 +                       if (namestr[0] != '/') {
4838 +                               cp = strrchr(filename, '/');
4839 +                               if (cp != NULL) {
4840 +                                       ifilename = alloca(AUTH_ID_LEN);
4841 +                                       *cp = '\0';
4842 +                                       snprintf(ifilename, AUTH_ID_LEN, "%s/%s", filename, namestr);
4843 +                                       *cp = '/';
4844 +                               }
4845 +                       }
4846 +                       if (rc_read_dictionary(rh, ifilename) < 0)
4847 +                       {
4848 +                               fclose(dictfd);
4849 +                               return -1;
4850 +                       }
4851 +               }
4852 +               else if (strncmp (buffer, "END-VENDOR", 10) == 0)
4853 +               {
4854 +                       attr_vendorspec = 0;
4855 +               }
4856 +               else if (strncmp (buffer, "BEGIN-VENDOR", 12) == 0)
4857 +               {
4858 +                       DICT_VENDOR *v;
4859 +                       /* Read the vendor name */
4860 +                       if (sscanf (buffer+12, "%63s", dummystr) != 1)
4861 +                       {
4862 +                               rc_log(LOG_ERR,
4863 +                                "rc_read_dictionary: invalid Vendor-Id on line %d of dictionary %s",
4864 +                                        line_no, filename);
4865 +                               fclose(dictfd);
4866 +                               return -1;
4867 +                       }
4868 +
4869 +                       v = rc_dict_findvend(rh, dummystr);
4870 +                       if (v == NULL) {
4871 +                               rc_log(LOG_ERR,
4872 +                                "rc_read_dictionary: unknown Vendor %s on line %d of dictionary %s",
4873 +                                        dummystr, line_no, filename);
4874 +                               fclose(dictfd);
4875 +                               return -1;
4876 +                       }
4877 +
4878 +                       attr_vendorspec = v->vendorpec;
4879 +               }
4880 +               else if (strncmp (buffer, "VENDOR", 6) == 0)
4881 +               {
4882 +                       /* Read the VALUE line */
4883 +                       if (sscanf (buffer, "%63s%63s%63s", dummystr, attrstr, valstr) != 3)
4884 +                       {
4885 +                               rc_log(LOG_ERR,
4886 +                                "rc_read_dictionary: invalid Vendor-Id on line %d of dictionary %s",
4887 +                                        line_no, filename);
4888 +                               fclose(dictfd);
4889 +                               return -1;
4890 +                       }
4891 +
4892 +                       /* Validate all entries */
4893 +                       if (strlen (attrstr) > NAME_LENGTH)
4894 +                       {
4895 +                               rc_log(LOG_ERR,
4896 +                                "rc_read_dictionary: invalid attribute length on line %d of dictionary %s",
4897 +                                        line_no, filename);
4898 +                               fclose(dictfd);
4899 +                               return -1;
4900 +                       }
4901 +
4902 +                       if (!isdigit (*valstr))
4903 +                       {
4904 +                               rc_log(LOG_ERR,
4905 +                                "rc_read_dictionary: invalid Vendor-Id on line %d of dictionary %s",
4906 +                                        line_no, filename);
4907 +                               fclose(dictfd);
4908 +                               return -1;
4909 +                       }
4910 +                       value = atoi (valstr);
4911 +
4912 +                       /* Create a new VENDOR entry for the list */
4913 +                       dvend = malloc(sizeof(DICT_VENDOR));
4914 +                       if (dvend == NULL)
4915 +                       {
4916 +                               rc_log(LOG_CRIT, "rc_read_dictionary: out of memory");
4917 +                               fclose(dictfd);
4918 +                               return -1;
4919 +                       }
4920 +                       strcpy (dvend->vendorname, attrstr);
4921 +                       dvend->vendorpec = value;
4922 +
4923 +                       /* Insert it into the list */
4924 +                       dvend->next = rh->dictionary_vendors;
4925 +                       rh->dictionary_vendors = dvend;
4926 +                }
4927 +       }
4928 +       fclose (dictfd);
4929 +       return 0;
4930 +}
4931 +
4932 +/*
4933 + * Function: rc_dict_getattr
4934 + *
4935 + * Purpose: Return the full attribute structure based on the
4936 + *         attribute id number.
4937 + *
4938 + */
4939 +
4940 +DICT_ATTR *rc_dict_getattr (rc_handle const *rh, int attribute)
4941 +{
4942 +       DICT_ATTR      *attr;
4943 +
4944 +       attr = rh->dictionary_attributes;
4945 +       while (attr != NULL)
4946 +       {
4947 +               if (attr->value == attribute)
4948 +               {
4949 +                       return attr;
4950 +               }
4951 +               attr = attr->next;
4952 +       }
4953 +       return NULL;
4954 +}
4955 +
4956 +/*
4957 + * Function: rc_dict_findattr
4958 + *
4959 + * Purpose: Return the full attribute structure based on the
4960 + *         attribute name.
4961 + *
4962 + */
4963 +
4964 +DICT_ATTR *rc_dict_findattr (rc_handle const *rh, char const *attrname)
4965 +{
4966 +       DICT_ATTR      *attr;
4967 +
4968 +       attr = rh->dictionary_attributes;
4969 +       while (attr != NULL)
4970 +       {
4971 +               if (strcasecmp (attr->name, attrname) == 0)
4972 +               {
4973 +                       return attr;
4974 +               }
4975 +               attr = attr->next;
4976 +       }
4977 +       return NULL;
4978 +}
4979 +
4980 +
4981 +/*
4982 + * Function: rc_dict_findval
4983 + *
4984 + * Purpose: Return the full value structure based on the
4985 + *         value name.
4986 + *
4987 + */
4988 +
4989 +DICT_VALUE *rc_dict_findval (rc_handle const *rh, char const *valname)
4990 +{
4991 +       DICT_VALUE     *val;
4992 +
4993 +       val = rh->dictionary_values;
4994 +       while (val != NULL)
4995 +       {
4996 +               if (strcasecmp (val->name, valname) == 0)
4997 +               {
4998 +                       return val;
4999 +               }
5000 +               val = val->next;
5001 +       }
5002 +       return NULL;
5003 +}
5004 +
5005 +/*
5006 + * Function: rc_dict_findvend
5007 + *
5008 + * Purpose: Return the full vendor structure based on the
5009 + *          vendor name.
5010 + *
5011 + */
5012 +
5013 +DICT_VENDOR *
5014 +rc_dict_findvend(rc_handle const *rh, char const *vendorname)
5015 +{
5016 +       DICT_VENDOR     *vend;
5017 +
5018 +       for (vend = rh->dictionary_vendors; vend != NULL; vend = vend->next)
5019 +               if (strcasecmp(vend->vendorname, vendorname) == 0)
5020 +                       return vend;
5021 +       return NULL;
5022 +}
5023 +
5024 +/*
5025 + * Function: rc_dict_getvend
5026 + *
5027 + * Purpose: Return the full vendor structure based on the
5028 + *          vendor id number.
5029 + *
5030 + */
5031 +
5032 +DICT_VENDOR *
5033 +rc_dict_getvend (rc_handle const *rh, int vendorpec)
5034 +{
5035 +        DICT_VENDOR      *vend;
5036 +
5037 +       for (vend = rh->dictionary_vendors; vend != NULL; vend = vend->next)
5038 +               if (vend->vendorpec == vendorpec)
5039 +                       return vend;
5040 +       return NULL;
5041 +}
5042 +
5043 +/*
5044 + * Function: dict_getval
5045 + *
5046 + * Purpose: Return the full value structure based on the
5047 + *          actual value and the associated attribute name.
5048 + *
5049 + */
5050 +
5051 +DICT_VALUE *
5052 +rc_dict_getval (rc_handle const *rh, uint32_t value, char const *attrname)
5053 +{
5054 +       DICT_VALUE     *val;
5055 +
5056 +       val = rh->dictionary_values;
5057 +       while (val != NULL)
5058 +       {
5059 +               if (strcmp (val->attrname, attrname) == 0 &&
5060 +                               val->value == value)
5061 +               {
5062 +                       return val;
5063 +               }
5064 +               val = val->next;
5065 +       }
5066 +       return NULL;
5067 +}
5068 +
5069 +/*
5070 + * Function: rc_dict_free
5071 + *
5072 + * Purpose: Free allocated av lists
5073 + *
5074 + * Arguments: Radius Client handle
5075 + */
5076 +
5077 +void
5078 +rc_dict_free(rc_handle *rh)
5079 +{
5080 +       DICT_ATTR       *attr, *nattr;
5081 +       DICT_VALUE      *val, *nval;
5082 +       DICT_VENDOR     *vend, *nvend;
5083 +
5084 +       for (attr = rh->dictionary_attributes; attr != NULL; attr = nattr) {
5085 +               nattr = attr->next;
5086 +               free(attr);
5087 +       }
5088 +       for (val = rh->dictionary_values; val != NULL; val = nval) {
5089 +               nval = val->next;
5090 +               free(val);
5091 +       }
5092 +       for (vend = rh->dictionary_vendors; vend != NULL; vend = nvend) {
5093 +               nvend = vend->next;
5094 +               free(vend);
5095 +       }
5096 +       rh->dictionary_attributes = NULL;
5097 +       rh->dictionary_values = NULL;
5098 +       rh->dictionary_vendors = NULL;
5099 +}
5100 diff --git a/src/plugins/vbng/lib/env.c b/src/plugins/vbng/lib/env.c
5101 new file mode 100644
5102 index 00000000..03dccf91
5103 --- /dev/null
5104 +++ b/src/plugins/vbng/lib/env.c
5105 @@ -0,0 +1,147 @@
5106 +/*
5107 + * $Id: env.c,v 1.6 2007/06/21 18:07:23 cparker Exp $
5108 + *
5109 + * Copyright (C) 1995,1996,1997 Lars Fenneberg
5110 + *
5111 + * See the file COPYRIGHT for the respective terms and conditions.
5112 + * If the file is missing contact me at lf@elemental.net
5113 + * and I'll send you a copy.
5114 + *
5115 + */
5116 +
5117 +#include <config.h>
5118 +#include <includes.h>
5119 +#include <freeradius-client.h>
5120 +
5121 +/*
5122 + * Function: rc_new_env
5123 + *
5124 + * Purpose: allocate space for a new environment
5125 + *
5126 + */
5127 +
5128 +ENV *rc_new_env(int size)
5129 +{
5130 +       ENV *p;
5131 +
5132 +       if (size < 1)
5133 +               return NULL;
5134 +
5135 +       if ((p = malloc(sizeof(*p))) == NULL)
5136 +               return NULL;
5137 +
5138 +       if ((p->env = malloc(size * sizeof(char *))) == NULL)
5139 +       {
5140 +               rc_log(LOG_CRIT, "rc_new_env: out of memory");
5141 +               free(p);
5142 +               return NULL;
5143 +       }
5144 +
5145 +       p->env[0] = NULL;
5146 +
5147 +       p->size = 0;
5148 +       p->maxsize = size;
5149 +
5150 +       return p;
5151 +}
5152 +
5153 +/*
5154 + * Function: rc_free_env
5155 + *
5156 + * Purpose: free the space used by an env structure
5157 + *
5158 + */
5159 +
5160 +void rc_free_env(ENV *env)
5161 +{
5162 +       free(env->env);
5163 +       free(env);
5164 +}
5165 +
5166 +/*
5167 + * Function: rc_add_env
5168 + *
5169 + * Purpose: add an environment entry
5170 + *
5171 + */
5172 +
5173 +int rc_add_env(ENV *env, char const *name, char const *value)
5174 +{
5175 +       int i;
5176 +       size_t len;
5177 +       char *new_env;
5178 +
5179 +       for (i = 0; env->env[i] != NULL; i++)
5180 +       {
5181 +               if (strncmp(env->env[i], name, MAX(strchr(env->env[i], '=') - env->env[i], (int)strlen(name))) == 0)
5182 +                       break;
5183 +       }
5184 +
5185 +       if (env->env[i])
5186 +       {
5187 +               len = strlen(name)+strlen(value)+2;
5188 +               if ((new_env = realloc(env->env[i], len)) == NULL)
5189 +                       return -1;
5190 +
5191 +               env->env[i] = new_env;
5192 +
5193 +               snprintf(env->env[i], len, "%s=%s", name, value);
5194 +       } else {
5195 +               if (env->size == (env->maxsize-1)) {
5196 +                       rc_log(LOG_CRIT, "rc_add_env: not enough space for environment (increase ENV_SIZE)");
5197 +                       return -1;
5198 +               }
5199 +
5200 +               len = strlen(name)+strlen(value)+2;
5201 +               if ((env->env[env->size] = malloc(len)) == NULL) {
5202 +                       rc_log(LOG_CRIT, "rc_add_env: out of memory");
5203 +                       return -1;
5204 +               }
5205 +
5206 +               snprintf(env->env[env->size], len, "%s=%s", name, value);
5207 +
5208 +               env->size++;
5209 +
5210 +               env->env[env->size] = NULL;
5211 +       }
5212 +
5213 +       return 0;
5214 +}
5215 +
5216 +/*
5217 + * Function: rc_import_env
5218 + *
5219 + * Purpose: imports an array of null-terminated strings
5220 + *
5221 + */
5222 +
5223 +int rc_import_env(ENV *env, char const **import)
5224 +{
5225 +       char *es;
5226 +
5227 +       while (*import)
5228 +       {
5229 +               es = strchr(*import, '=');
5230 +
5231 +               if (!es)
5232 +               {
5233 +                       import++;
5234 +                       continue;
5235 +               }
5236 +
5237 +               /* ok, i grant thats not very clean... */
5238 +               *es = '\0';
5239 +
5240 +               if (rc_add_env(env, *import, es+1) < 0)
5241 +               {
5242 +                       *es = '=';
5243 +                       return -1;
5244 +               }
5245 +
5246 +               *es = '=';
5247 +
5248 +               import++;
5249 +       }
5250 +
5251 +       return 0;
5252 +}
5253 diff --git a/src/plugins/vbng/lib/ip_util.c b/src/plugins/vbng/lib/ip_util.c
5254 new file mode 100644
5255 index 00000000..d686a59e
5256 --- /dev/null
5257 +++ b/src/plugins/vbng/lib/ip_util.c
5258 @@ -0,0 +1,390 @@
5259 +/*
5260 + * $Id: ip_util.c,v 1.14 2010/03/17 18:57:01 aland Exp $
5261 + *
5262 + * Copyright (C) 1995,1996,1997 Lars Fenneberg
5263 + *
5264 + * Copyright 1992 Livingston Enterprises, Inc.
5265 + *
5266 + * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
5267 + * and Merit Network, Inc. All Rights Reserved
5268 + *
5269 + * See the file COPYRIGHT for the respective terms and conditions.
5270 + * If the file is missing contact me at lf@elemental.net
5271 + * and I'll send you a copy.
5272 + *
5273 + */
5274 +
5275 +#include <config.h>
5276 +#include <includes.h>
5277 +#include <freeradius-client.h>
5278 +
5279 +#define HOSTBUF_SIZE 1024
5280 +
5281 +#if !defined(SA_LEN)
5282 +#define SA_LEN(sa) \
5283 +  (((sa)->sa_family == AF_INET) ? \
5284 +    sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6))
5285 +#endif
5286 +
5287 +
5288 +static __thread size_t hostbuflen=HOSTBUF_SIZE;
5289 +static __thread        char    *tmphostbuf=NULL;
5290 +
5291 +/*
5292 + * Function: rc_gethostbyname
5293 + *
5294 + * Purpose: threadsafe replacement for gethostbyname.
5295 + *
5296 + * Returns: NULL on failure, hostent pointer on success
5297 + */
5298 +
5299 +struct hostent *rc_gethostbyname(char const *hostname)
5300 +{
5301 +       struct  hostent *hp;
5302 +#ifdef GETHOSTBYNAME_R
5303 +#if defined (GETHOSTBYNAMERSTYLE_SYSV) || defined (GETHOSTBYNAMERSTYLE_GNU)
5304 +       struct  hostent hostbuf;
5305 +       int     res;
5306 +       int     herr;
5307 +       
5308 +       if(!tmphostbuf) tmphostbuf = malloc(hostbuflen);
5309 +#endif
5310 +#endif
5311 +
5312 +#ifdef GETHOSTBYNAME_R
5313 +#if defined (GETHOSTBYNAMERSTYLE_GNU)
5314 +       while ((res = gethostbyname_r(hostname, &hostbuf, tmphostbuf, hostbuflen, &hp, &herr)) == ERANGE)
5315 +       {
5316 +               /* Enlarge the buffer */
5317 +               hostbuflen *= 2;
5318 +               tmphostbuf = realloc(tmphostbuf, hostbuflen);
5319 +       }
5320 +       if(res) return NULL;
5321 +#elif defined (GETHOSTBYNAMERSTYLE_SYSV)
5322 +       hp = gethostbyname_r(hostname, &hostbuf, tmphostbuf, hostbuflen, &herr);
5323 +#else
5324 +       hp = gethostbyname(hostname);
5325 +#endif
5326 +#else
5327 +       hp = gethostbyname(hostname);
5328 +#endif
5329 +
5330 +       if (hp == NULL) {
5331 +               return NULL;
5332 +       }
5333 +       return hp;
5334 +} 
5335 +
5336 +/*
5337 + * Function: rc_gethostbyname
5338 + *
5339 + * Purpose: threadsafe replacement for gethostbyname.
5340 + *
5341 + * Returns: NULL on failure, hostent pointer on success
5342 + */
5343 +
5344 +struct hostent *rc_gethostbyaddr(char const *addr, size_t length, int format)
5345 +{
5346 +       struct  hostent *hp;
5347 +#ifdef GETHOSTBYADDR_R
5348 +#if defined (GETHOSTBYADDRRSTYLE_SYSV) || defined (GETHOSTBYADDRRSTYLE_GNU)
5349 +       struct  hostent hostbuf;
5350 +       int     res;
5351 +       int     herr;
5352 +       
5353 +       if(!tmphostbuf) tmphostbuf = malloc(hostbuflen);
5354 +#endif
5355 +#endif
5356 +
5357 +#ifdef GETHOSTBYADDR_R
5358 +#if defined (GETHOSTBYADDRRSTYLE_GNU)
5359 +       while ((res = gethostbyaddr_r(addr, length, format, &hostbuf, tmphostbuf, hostbuflen, 
5360 +                                       &hp, &herr)) == ERANGE)
5361 +       {
5362 +               /* Enlarge the buffer */
5363 +               hostbuflen *= 2;
5364 +               tmphostbuf = realloc(tmphostbuf, hostbuflen);
5365 +       }
5366 +       if(res) return NULL;
5367 +#elif GETHOSTBYADDRSTYLE_SYSV
5368 +       hp = gethostbyaddr_r(addr, length, format, &hostbuf, tmphostbuf, hostbuflen, &herr);
5369 +#else
5370 +       hp = gethostbyaddr((char *)&addr, sizeof(struct in_addr), AF_INET);
5371 +#endif
5372 +#else
5373 +       hp = gethostbyaddr((char *)&addr, sizeof(struct in_addr), AF_INET);
5374 +#endif
5375 +
5376 +       if (hp == NULL) {
5377 +               return NULL;
5378 +       }
5379 +       return hp;
5380 +} 
5381 +
5382 +/*
5383 + * Function: rc_get_ipaddr
5384 + *
5385 + * Purpose: return an IP address in host long notation from a host
5386 + *          name or address in dot notation.
5387 + *
5388 + * Returns: 0 on failure
5389 + */
5390 +
5391 +uint32_t rc_get_ipaddr (char const *host)
5392 +{
5393 +       struct  hostent *hp;
5394 +
5395 +       if (rc_good_ipaddr (host) == 0)
5396 +       {
5397 +               return ntohl(inet_addr (host));
5398 +       }
5399 +       else if ((hp = rc_gethostbyname(host)) == NULL)
5400 +       {
5401 +               rc_log(LOG_ERR,"rc_get_ipaddr: couldn't resolve hostname: %s", host);
5402 +               return (uint32_t)0;
5403 +       }
5404 +       return ntohl((*(uint32_t *) hp->h_addr));
5405 +}
5406 +
5407 +/*
5408 + * Function: rc_good_ipaddr
5409 + *
5410 + * Purpose: check for valid IP address in standard dot notation.
5411 + *
5412 + * Returns: 0 on success, -1 when failure
5413 + *
5414 + */
5415 +
5416 +int rc_good_ipaddr (char const *addr)
5417 +{
5418 +       int             dot_count;
5419 +       int             digit_count;
5420 +
5421 +       if (addr == NULL)
5422 +               return -1;
5423 +
5424 +       dot_count = 0;
5425 +       digit_count = 0;
5426 +       while (*addr != '\0' && *addr != ' ')
5427 +       {
5428 +               if (*addr == '.')
5429 +               {
5430 +                       dot_count++;
5431 +                       digit_count = 0;
5432 +               }
5433 +               else if (!isdigit (*addr))
5434 +               {
5435 +                       dot_count = 5;
5436 +               }
5437 +               else
5438 +               {
5439 +                       digit_count++;
5440 +                       if (digit_count > 3)
5441 +                       {
5442 +                               dot_count = 5;
5443 +                       }
5444 +               }
5445 +               addr++;
5446 +       }
5447 +       if (dot_count != 3)
5448 +       {
5449 +               return -1;
5450 +       }
5451 +       else
5452 +       {
5453 +               return 0;
5454 +       }
5455 +}
5456 +
5457 +/*
5458 + * Function: rc_ip_hostname
5459 + *
5460 + * Purpose: Return a printable host name (or IP address in dot notation)
5461 + *         for the supplied IP address.
5462 + *
5463 + */
5464 +
5465 +char const *rc_ip_hostname (uint32_t h_ipaddr)
5466 +{
5467 +       struct hostent  *hp;
5468 +       uint32_t           n_ipaddr = htonl (h_ipaddr);
5469 +
5470 +       if ((hp = rc_gethostbyaddr ((char *) &n_ipaddr, sizeof (struct in_addr),
5471 +                           AF_INET)) == NULL) {
5472 +               rc_log(LOG_ERR,"rc_ip_hostname: couldn't look up host by addr: %08lX", h_ipaddr);
5473 +       }
5474 +
5475 +       return (hp == NULL) ? "unknown" : hp->h_name;
5476 +}
5477 +
5478 +/*
5479 + * Function: rc_getport
5480 + *
5481 + * Purpose: get the port number for the supplied request type
5482 + *
5483 + */
5484 +
5485 +unsigned short rc_getport(int type)
5486 +{
5487 +       struct servent *svp;
5488 +
5489 +       if ((svp = getservbyname ((type==AUTH)?"radius":"radacct", "udp")) == NULL)
5490 +       {
5491 +               return (type==AUTH) ? PW_AUTH_UDP_PORT : PW_ACCT_UDP_PORT;
5492 +       } else {
5493 +               return ntohs ((unsigned short) svp->s_port);
5494 +       }
5495 +}
5496 +
5497 +/*
5498 + * Function: rc_own_hostname
5499 + *
5500 + * Purpose: get the hostname of this machine
5501 + *
5502 + * Returns  -1 on failure, 0 on success
5503 + *
5504 + */
5505 +
5506 +int
5507 +rc_own_hostname(char *hostname, int len)
5508 +{
5509 +#ifdef HAVE_UNAME
5510 +       struct  utsname uts;
5511 +#endif
5512 +
5513 +#if defined(HAVE_UNAME)
5514 +       if (uname(&uts) < 0)
5515 +       {
5516 +               rc_log(LOG_ERR,"rc_own_hostname: couldn't get own hostname");
5517 +               return -1;
5518 +       }
5519 +       strncpy(hostname, uts.nodename, len);
5520 +#elif defined(HAVE_GETHOSTNAME)
5521 +       if (gethostname(hostname, len) < 0)
5522 +       {
5523 +               rc_log(LOG_ERR,"rc_own_hostname: couldn't get own hostname");
5524 +               return -1;
5525 +       }
5526 +#elif defined(HAVE_SYSINFO)
5527 +       if (sysinfo(SI_HOSTNAME, hostname, len) < 0)
5528 +       {
5529 +               rc_log(LOG_ERR,"rc_own_hostname: couldn't get own hostname");
5530 +               return -1;
5531 +       }
5532 +#else
5533 +       return -1;
5534 +#endif
5535 +
5536 +       return 0;
5537 +}
5538 +
5539 +/*
5540 + * Function: rc_own_ipaddress
5541 + *
5542 + * Purpose: get the IP address of this host in host order
5543 + *
5544 + * Returns: IP address on success, 0 on failure
5545 + *
5546 + */
5547 +
5548 +uint32_t rc_own_ipaddress(rc_handle *rh)
5549 +{
5550 +       char hostname[256];
5551 +
5552 +       if (!rh->this_host_ipaddr) {
5553 +               if (rc_conf_str(rh, "bindaddr") == NULL ||
5554 +                   strcmp(rc_conf_str(rh, "bindaddr"), "*") == 0) {
5555 +                       if (rc_own_hostname(hostname, sizeof(hostname)) < 0)
5556 +                               return 0;
5557 +               } else {
5558 +                       strncpy(hostname, rc_conf_str(rh, "bindaddr"), sizeof(hostname));
5559 +                       hostname[sizeof(hostname) - 1] = '\0';
5560 +               }
5561 +               if ((rh->this_host_ipaddr = rc_get_ipaddr (hostname)) == 0) {
5562 +                       rc_log(LOG_ERR, "rc_own_ipaddress: couldn't get own IP address");
5563 +                       return 0;
5564 +               }
5565 +       }
5566 +
5567 +       return rh->this_host_ipaddr;
5568 +}
5569 +
5570 +/*
5571 + * Function: rc_own_bind_ipaddress
5572 + *
5573 + * Purpose: get the IP address to be used as a source address
5574 + *          for sending requests in host order
5575 + *
5576 + * Returns: IP address
5577 + *
5578 + */
5579 +
5580 +uint32_t rc_own_bind_ipaddress(rc_handle *rh)
5581 +{
5582 +       char hostname[256];
5583 +       uint32_t rval;
5584 +
5585 +       if (rh->this_host_bind_ipaddr != NULL)
5586 +               return *rh->this_host_bind_ipaddr;
5587 +
5588 +       rh->this_host_bind_ipaddr = malloc(sizeof(*rh->this_host_bind_ipaddr));
5589 +       if (rh->this_host_bind_ipaddr == NULL)
5590 +               rc_log(LOG_CRIT, "rc_own_bind_ipaddress: out of memory");
5591 +       if (rc_conf_str(rh, "bindaddr") == NULL ||
5592 +           strcmp(rc_conf_str(rh, "bindaddr"), "*") == 0) {
5593 +               rval = INADDR_ANY;
5594 +       } else {
5595 +               strncpy(hostname, rc_conf_str(rh, "bindaddr"), sizeof(hostname));
5596 +               hostname[sizeof(hostname) - 1] = '\0';
5597 +               if ((rval = rc_get_ipaddr (hostname)) == 0) {
5598 +                       rc_log(LOG_ERR, "rc_own_ipaddress: couldn't get IP address from bindaddr");
5599 +                       rval = INADDR_ANY;
5600 +               }
5601 +       }
5602 +       if (rh->this_host_bind_ipaddr != NULL)
5603 +               *rh->this_host_bind_ipaddr = rval;
5604 +
5605 +       return rval;
5606 +}
5607 +
5608 +/*
5609 + * Function: rc_get_srcaddr
5610 + *
5611 + * Purpose: given remote address find local address which the
5612 + *          system will use as a source address for sending
5613 + *          datagrams to that remote address
5614 + *
5615 + * Returns: 0 in success, -1 on failure, address is filled into
5616 + *          the first argument.
5617 + *
5618 + */
5619 +int
5620 +rc_get_srcaddr(struct sockaddr *lia, struct sockaddr *ria)
5621 +{
5622 +       int temp_sock;
5623 +       socklen_t namelen;
5624 +
5625 +       temp_sock = socket(ria->sa_family, SOCK_DGRAM, 0);
5626 +       if (temp_sock == -1) {
5627 +               rc_log(LOG_ERR, "rc_get_srcaddr: socket: %s", strerror(errno));
5628 +               return -1;
5629 +       }
5630 +
5631 +       if (connect(temp_sock, ria, SA_LEN(ria)) != 0) {
5632 +               rc_log(LOG_ERR, "rc_get_srcaddr: connect: %s",
5633 +                   strerror(errno));
5634 +               close(temp_sock);
5635 +               return -1;
5636 +       }
5637 +
5638 +       namelen = SA_LEN(ria);
5639 +       if (getsockname(temp_sock, lia, &namelen) != 0) {
5640 +               rc_log(LOG_ERR, "rc_get_srcaddr: getsockname: %s",
5641 +                   strerror(errno));
5642 +               close(temp_sock);
5643 +               return -1;
5644 +       }
5645 +
5646 +       close(temp_sock);
5647 +       return 0;
5648 +}
5649 diff --git a/src/plugins/vbng/lib/libfreeradiusclient.a b/src/plugins/vbng/lib/libfreeradiusclient.a
5650 new file mode 100644
5651 index 0000000000000000000000000000000000000000..56c91fd880e9d435b62149ded2a0a9067cf8cbd6
5652 GIT binary patch
5653 literal 367122
5654 zcmeFa3w%`7)i-?3Ob7#kOt^><Q3f0^AcO<~5y568!3hNAE+`m6E+i6?m`nnAK`@Cj
5655 z##m{skG52>SG3yN)+$;rK@jw@7qwN<)@rS`@Ss((D)q+qUwf~0X3x%~(&v4C@ArO}
5656 z{Y&Po_1|l+z4qGs>~rSK*=vuOUe;J%eQw_gq2!cju$neML!tbMXHL~3EBiW*Gs|&$
5657 z4gJ^u4d*(J{68?zam@e2k2&sLM~?g7x8qjl%l`d8eZ~1#|7jCnbdKwP=krb){r_h4
5658 zm;U!EKH~H$y~+G<EH7QvTvJ=oSb4bvdUa*2w5Ecnva&LDXpU9Ov9zJFe*Ff;m6yll
5659 zm_W;`E6djq+*nywQM$IQp{k~~l6a64wN_1)Ry9_tjJnEorImFpBtwwUWfc`d)~s!)
5660 zZ;T1oR9RP1+Em%tQrW1gZ)qs2X)G;kYN}aXX8=%ZaH}iLJhafrtEq!F6F}8Qw%A#w
5661 zD{3ffY*KbJAFFSQnTFKXuQm#k7ix6XXis^4T~&?B)>LUtU5%=k*izP`=$bkMZ)|a5
5662 zl}$0DxN>enTUAYxOIW!Wu7oRU%40S4b!CmJ?}(#*E{kc~6;E2a0WD><)ErNs1>W}n
5663 zXz0e9^4!A^tA>|WZKx|-t6b*+@U-&X>iYVM(wYX3r4i_HH4UXy+$c=LfsCkMSC^DU
5664 zye?PS)Fc9{$T>+UsxNJ7ESK8q8!GF#*Z6>*m>6423LsijWz@`lw6>zMwoG|)?V2V%
5665 zs(HLsprab=RaO-W*Q&k;0q^U!udSF|T3%LL?$p+-YQ!lrw{UVXje-QbsIjcBsj9wl
5666 zt${6WK-W|nz^s}&cv?=|+<HAX_B10-nKVgFgcHv?bBdl4SN6T8sAQJUbulsO<T~d%
5667 z2~JSQ*;$dG3lv%4oa78~7B4IcKG+qFe-M8m+WK}N8owY=62Bn3Fg`2mAc<|6>2?%`
5668 zLj_yTh|dgx%8AbmM_cy>E?KcBIK0qtsE`sQa8K3Ek&7ZrB8wx7isPRzUKowPP#AwE
5669 zy7}#0&=ik_mlt;2AAS$?W28D7F9{cv#Gx}9zbYK6h<2on%29Y*cqfkeT}rW%Es4Ji
5670 z!AUldr+`T77ip3B{$ShVepU@}l~WwwJGcGKVB77;X#Ybreoy!|s$hRxcn6M@g6#{C
5671 zM;d}{U7)Ih@4gw`Ul^WBnMZ;HD#BUnGdt3e7H;nf-gIi3;}mzcDMgT5N^<#7T^ODh
5672 zjXzo3Ss0EI6D^KEx$78GaQG$?iI)HFNF<om_Iom*Dwx}gz$?;&ZLOLw3}?4o*$RCw
5673 z3ioT><LZ{3JuHms3&UA(eZSyMm!NAq=lP<oPX>xxpY*l9@p<zPwC!*DP)Elts$J0z
5674 zI5rv|5bd~8IkF;pW<TZGVEd2I#OUU|yHM#RD<aDyD<YRhO3{-j`-m>vek?XX)opqy
5675 z5`3@-B8$7C9i0tmR5X4|cnfq;7p{-Dg*Sm#g|-xiFNdj<$f&|Cv2X)2Z$>7tJdn45
5676 zjG?0!q0c+e=h04xsDiCW-C(;5)kW>cf;S!g;@C0tL>K%3uZ`V*B)Aj~f+vb}H4)D*
5677 z8)u0#cELB!p<7TgIJ^K|mj$m;B~z)A>ip-A1ecSJXmA{cdtta*ReOk9L-MLLTnm>5
5678 z+wOuA_;6|a)4{fHgN}3z4y(>=e?EBAjR2w@wc&Xs_=x_JYK^~Kh>9jf<A+P)Z_SOr
5679 z9f|+?@YE`Ge!z~&kf5P-Ce>4T_F5-+QxrO+vguSo>yvJ@bq_jquP@TM_*k?Y=4Q3M
5680 zkTh6)u_pj74`*Ze9B6vrOM5IW9PL<$9{YK6kHu2<Sf1*!_#>*fr01x+f^9Ur^w?#?
5681 z;J?Ci(54%wf;v?HIk}VO1>L<R;pNfJ`_;)(l>c;5e%He^@RjSMIGfsAKRb3zdG^qS
5682 zs-!NbPI)DS6Zp_H$iSIx<VNJ{aY|>2lAsgg&_EQ{{-$%cngn$nkR~7IKmXVm9Q3KA
5683 zbK2D?m>Rnz3JvJ2ce~)+t8k(fjKdfi3vT&Q$X^xCKIFmxRY(t^q(Nm3r{AM9b$cpN
5684 z$a6xq<peS&$&6szM<}T+;95IA<yvueR^@u_Z+$x}@(>NW%k&h1c{h7ca(;3ADLDHw
5685 zHyVE~8b6Z%k*-O}-HiE~%cC<cOUr*ckty?e779`MG)Uw>Z5D?mG`|<eU!o~~ZhS9I
5686 z@gGLxpX&L%_3diR2mOqR9P=5^;?ekPN+=TFr)rGEpNwLz97ZQ+R1Xb^MB}?3PDk6Q
5687 z7w6%qh$s;NhEa|-H(ndg2|idG?pJ~<$5e3oLO{wwP*W0r0~67RLR@kR3Xxm550@}K
5688 zT&PRt#rJ46bdGzIWAgyGvO0dim=~24F7GwXO{H|@uW!Z;i)I@uV~sVHxINKq1?~{l
5689 zy+Il7viY{Q47b)yQVS@(_xPW(90ykrqyTlI(~myPG_rSs^SJ?Hd_INw()1yq4=%X_
5690 zdFo2yPwPcDo4$bJR0Y1)OOdb1HX?nxphh|f=@m#1e1medE|ue-bFCChJ8)j27^_xw
5691 zAL#Y|3|w!NalMXQ1R<tB{wk3gKT33#rvFKFwx&NJI;81OiO$jVXGG^|`g5YEYWfSJ
5692 z3;N*0>E*b@L^b0oW}aqzidm|eG`AV%t<+4qdnK4^%>-Pswm~!f6cf`-rdx@e^_m&z
5693 zP6D$@GlSe>FxP5ku)7)BS~ZjHZUwVNGb7vvh~2E2F>WWA+cYy)F*`JKhGKSVW}IT~
5694 z(@d`WLzLO2nF-3aF3se-|ABh;I`sY5>2<5>gX~`0sFB)7-zJjjJE*zb2j8LAW;yAB
5695 zLSX5EE^ryt;beBdD?t!SU8&F?3OYy+oAkW#5KyBcJ)az+$urLZsR|sB0{xwgpMgFo
5696 zd~ZkD80dXgf81~=8+)If7$?1_5uJv*sYHL0(c>yGw+wXV+OqXd;DUsF;6j3Rn*#Hw
5697 z)~M1Mm{0gpO)t0{^leTCjSwPL`+7SWn?ch*^S*#;h586A%tl5K1)QgRflE&UsCBKR
5698 zyF8}L9z}gz_o^^(J*ETY6F}=R9jI6bI;6{1J`OrZ(^a2<&dXfYT;&8-WBBrz4pct{
5699 zox8M5O&0Kd=q04|0NIcppeh*{3t#}{O$}V+QZ;Hw1eUqu=v3Ft#cHsGHFJq#ax}AC
5700 z70H9j$)aaopwuN3wLqDvXO&_`=$vw;r%*E$sz?-it`<Fcfz>WGPYcwTdM-2VS)-(K
5701 zQ1nSit8qguR^4%p=0|`ZNW<}%tH)TN_Uq^vB|BYYL(U-O1~*XWeiNXsx52FUa<kq>
5702 z(+^E9xpbT^6I12$29vr#vwJs`<+-{xqLpQz!(OWT1SQns63yMv>V5@NuU6IW(n-V2
5703 zb&7Fy&h=_S3TS4FvL#D1ag~#;nHyA2NHZO#{Wq#=xF0(eL;ZN4XVgvZBcO+nf$n%Z
5704 zQ{594J=EO|`?4FW9d{^ECu#Io36jn%M(J!}lFo2Vo}55WPRJ?}7VL+jq10vRfg+G6
5705 zufT^Sni?p%+m_*s9#+Fy!<vNHC`4R{TZGuo#3^@!@NIQY`Gq<LPMyygq!`tz<c5Yb
5706 z<<zP(<z!PTQ>3<C3p0`>LzL&vP_qk*Eo80kw$pGu9zmX)K@_Et^x@8+;X{d88UY47
5707 zhJ{D0ZCdTP=aTypx#vn%rxE5V7R?JQu7F(V-@56VQHqU-V$Gf>MMu{-?o45Hp2ZeU
5708 zU>kI9QL^x?WcK`IHcIm&rO|cu>m0XOSZ(6$ZOHL&J-YF95^;CZC#4*-;|Xv#&BHhz
5709 zM%_kf81<tfq-TeDeeLzWHy*qZB4g(Gy1ly*-+JMHyAfk_J8}Dfq4)`^AL}mmU5(F0
5710 zeb})OND>;3OZk@y6@Hme8>*}6LC72QH$%u{wt?{s*$L(zT|8~;eH+tZFO9^p?)<c^
5711 zyU;OSDN^B;x*yDIQtBx#b#x<2xp|2q-6}dEL$x?%MV{_1=q|AZcalZ!<gxAo|JJur
5712 z&r&yUth)@AdBw;NP07U!$9v5nn>;3|O}|3U-AchCUto;Ylq5-N{i{-y-FnX;YR3sU
5713 zAJN5$2CH@`^=Jq=%xj2e)B%*kw5lgpnhMebTQGt`G``$N<)kG}P5XpydkOWZDeKYX
5714 zDeKYXDeF<0S@aC{X!4Zxm`qt`ka9{ial(B62kv4T7azEb;1(R_Q$Kv*E`a$sETx{v
5715 z7Ym;=Ej(50frZum*}~_NEqpH7r00@NdhSb1qESEw!7efgc9B7_i-rcf><!bPlRbkD
5716 zia~EA8}vr9%ia+Cj>{=z5BI3&kax}cPx0!%2-hdoW$z}}|L&JmXg1lX&TH=HW_3rr
5717 z>Xu+ssp>vYu1<Z+A}Kv2Y?kf^DCvuum#Z%d$K<*-jznBX-MJ7+HzJPfs{1Yf*3UNT
5718 ze4m%EdB4Z!cDssXy8jXU-+dYJ&Rm+oA3^mrIXB_6#~J+3UnWFzz!3a<n*3Y!Og2T$
5719 zWS^N6fLA?D$>$^&QWLW8Dr4$On#a_XF@c=kXD5C0)8t)5<`GJ%Z-h<>odUly=wBPO
5720 z>r2S|#K1o^=(`R2E`z?8<^WFa0C!a8pbUTJ$(aM(fxWX%#LZmT$;dbt5bh(G#CM;x
5721 zA&x(DTE;mU#kjHW6@&=pJ30{GdywnT%*dc@7i^%vCp#5leVFZ4Jc!u7q6yy_T(@`-
5722 zmFPFZDIPQdnf=cKfiIOP6413#k)YDwOY~<Ag8u2a`yJrb+l#aeR9bpD&LB@-;e!nW
5723 zkb43f0DI8sxz1Nkl9q)~*NM5V0H>c6Qtip^<ynK9ZZMuBhK^R|o}BCE4<i2+WdFx`
5724 zCy^<`dO7)neDLNeipX}HQ%_-;r5Vdm&G7iOt}_4-W<RsW;$%IzxQHW2+sH)a#GYob
5725 zs3JVcGtCEfl)*xHG+6d2l|8*L3lG4ftsF9LfxGxbGLGyY1M@I8@>TDQy#coRvbUZG
5726 zrDsS6zM!#w_>mNjH&_Vf8Y)#UOh}mXm6NFV^2qhmPpZpQ{zS**Cjc3rILh_bbruUL
5727 zUtH20T=2FVvPq;!yUrpZ&t?JFStz8bYteD&nlHMhdAgPeY3iDP9J&^WF0<f*<0!Z^
5728 zRl%jlQE*wRg3G!UoX2gu(`(~mA(vygP;#9WLN3Ik0!n@dH>Se;kU_`^`JbkoFgfUW
5729 zN{|y$zTs(ooPS3`PRQ>vq~x@g#HTdjN`^2Bgj|)d<L!;YY+%smG&({X6}-JMp;}W?
5730 zfjGu><_meD=c6S;id$&N&fhMac*b>>2q}Kig2IVwASk4Gi8Xd}(-PZFTJX!8u|S$(
5731 zH2>M-X#Ua^<#ruMxn)xBe9vtQg%n4T?aNZQZDA_6E!*DRZ3|Pm4H~<-ZDA_6bw5MC
5732 z&3+uiHv62s?Lz;NF^tQnHul1`oszUffx@(UgD!7-C)3g*(kQgFM->)E9<Pv~(1X3R
5733 zWS)>K5@*R%8->}JkQ4HHQ%)FhhU>_1*R8>)w6@G^ZJ%S?g}K%1%6URQ;mK{?wow>y
5734 z74(avPGW}v+QQ^d6OfR<XUON|Z%^az?eu7x5@Dm5zL<}G2i6I59fPRiYfL_qfX?BL
5735 zDC8rggp_`x8l-Q!5@JG1523rZZImG<u2+_5Lld92GpSF-m*Oj2w8TeudJb7Aq&UX!
5736 zG+nb@81Vv%3MoFI8ia1}oOJay+l9Ho^T-MzZ#CtFNqBC)km4@C1AW4X?@~_mkhA@y
5737 zhIPV2iaH)Q!RZH6oplE{+Eaj%Jf3R*%x0t~MzxTM&RH&<v)FUoav{ah0cY!hjp>2t
5738 zFwgY~uPhN#u09xdLdx9WI?KOfO%srk;U?{al#tRoTsMSFoYKoJ?>awb;Aeb<ZXu0p
5739 z!QO6j`r|CWCs9sFqg+?Fa?h~*tBG<#Cj43|el79*S}Lwe_@z|HI})d(kaDKFPHA^n
5740 zm3H?_DVyUR#7-H0eVseh&p{+0n9O7tR6A1*zn$Igj7%+JqS&Xj2y+_G%w_?>q@!J@
5741 zTFAsi151RFUN?1k?PKD2nz=JEi|^PdOro>Ogf!f-!*fR$Pg`i+j*Y^|Ozt{mLdt}$
5742 z<b;uP2y#NoFi>*B$Tih$sSFNrvzaHDcv~qG<^vv0W&y!I_C{Knkm6;f!*=f!ZvD!H
5743 z7rLJkDTKP8Zz6PocNv)9Q)LN}ZWr+GS{C%AMND>`OTSDc&B0UYZeJ**E>Q#r-Pdh8
5744 zILIgXP<AYYx;w}g!bxqLBqI9fN&0Hh%{|>ky1A#j$fBMq5`$B?N3@7YYWLVuDcwUq
5745 zCQ|D1?%fs(xsM^bP451MxO>4xsS0-g_S?PS{8R<If7R_?a6zhq-M{K~FSs;S!R}vm
5746 zpJfjmOgKl#zyC|;NWnL~f{TO{1sFd<n!39COLV>A>6$O3C~%zxLYlg|yHIq!=IL4>
5747 zq$qHmr9zszx_k9K*3pZ9<HMsAAu||CJ#xAiT$HL{cTaRLI6qav?#<3(drnW7D&+Wo
5748 zX{r=F%`3P_NKt@(6w=hy-TFM%vD(wMSjdk(XrYku5?E>%imo|c!9_wo?m<h0q~HB1
5749 zVFK84jWA{f$7Ae#F?JY!7NUeXQpi&nB4g)o7fxzOF`0_}q7wsHNGV0Sx(~YU1(!;}
5750 zA)Z~!g%nFj*U}Vrb-Py;?|<q!ah{NaJoO8O6!o~H6;iCncO&hk#Hakcy)L0!$f2I@
5751 zOS>!Tc5%Ft6>Lf<5;EIUw4%GB6$x83B|p<2_7ok5NH=r3Yw33Fv_&uwyFdC8AsMy!
5752 zb|IvU*`xt1R#WG8AHbqbq<qfwZubu&^E|g-Uq*$Kl6c1V<&Nvt+w>!szLD~7>XjB5
5753 zAht@mm$``VzAoWoBOh&fxw!Y?+nWA-9KlChUfTL=ZtDR)N-J&oTT!pi8G;*g*ZmZ~
5754 zoZ$C7x=AN~LUU8&gqphY+UAPN3G1g$DV;KDd~Ho#^ZN0t>zXI5s);o@rif;+EM~&$
5755 z^78KTlSNfhq3&``8=9QlTu(T$WTu=<k8NnEY|6!3J0S6zE-2XF6sxGHtOAW&K-6DT
5756 z@4<LeR?{pDr_m}a{VMPH^4gk8C4eg&bQtBJMVG@5P+rIQPj>Uq-#TZGKWn!C@})CM
5757 zrp;*a_kDQIGJh}@xVg)J#ZuqM>}8wh;BQ4yWc5e4p3(Y<zfYCF<_`b**|$~t$5r{h
5758 za)RSabJGJ4r?=g>c}^u5U-}*C{>ewSAN7~`#<@=~d-Njz9oO8m`C@-o40X)$zv0aG
5759 z@3?06l4k#(oqNs<%m|F|ubJ&XVY+|Kk&EV3`m+MD)en8(uYb{>y_8f3)~5%c@Pxpd
5760 z5McFzb-L1f(jQa$TNC<A{GUO8>ov36E&>%>6PV$zz1cq}Fx|h-cZU0<|5YdOX5a+>
5761 zFRpoW>$1PBUUts1$^LxbX!qWSw)+>};cvdfH*)Z_i>v*6oxnhUFc2zv+Mo62>~mpb
5762 zW~>CCeeVD>$e(d-VELlifr4e5XZZVE>)#N#BQUzvzjfo%i!WM6zI+`&=WpG3&zxn;
5763 z{BOHUFJ6*&iElK<VQFc7RaI%sDJ{NGFHUU0+PBj3>N2d)D{ZRAk}`VPvZ>~ZN(ia-
5764 zZdm))T<OHBYns$5vr=Ov8HQ0+J}nTVC6WmVS+rJJURl#pSxPGto75O{78YGlSXvla
5765 z6mj(1-nCkJX?+7N%X9c`@4CwMSP52Nw>qRg=*4VW)>v5)f}LumTy<Gp1r}7Ef5GC=
5766 z%>4Y&<lITQd7+7U`BU<y<eeQFzc$ufS2+W#9V;7a%E8jY*%>(3#!s0P8oxR;{=$i&
5767 z@l{Q+vhp?Kv5+%XSstrz98W9O>Q)=|HrH{jWI!pc;H;}xjnzvav79a8MP3i+ty=U9
5768 z=VhKvP*7X88VC3tUc)lZ3b?(w5z85Co7dJkyjoE^qRDASo%vI!3+kI!p{1quwH4HJ
5769 zO;jl#S#@nqQ_PuAUB9++f@;!)3onSwo6s_IUeSbZXXON(g6b5%qP`Am5UqFb)q+CZ
5770 zBh;sO6Q5VKlF@MD8mu*?GrG=6at+DiRehFiYAG*Oij)hI1l5{Vtl+~~;l%)?cwJ*n
5771 z41)y2a7m<OaZ%~KNbv$kEjC1tc-ENfT}zv2j4DNXaUw0$U0AeWNznpxV&gU_mp7GR
5772 zAg(HFs&p_^d6?<4-jYOWgVDWe-DqiTJ=XCyt-<2U^7>{q45$|;I;CstD=Ntuw4_0w
5773 zCg{<6@=qBS>8hm+&`-SzHzQ{)26s6YJvg%P0qZVH>&lw6ujqWENm!}U3sg&0)0<F?
5774 zMvCVr;m9yPjb{~?6eSf@mf(zolOaN_ttkgZ`e~tReWNVp<i)!%#ep3doVt^nbc@s~
5775 zSo)}0)r?h_x@bdXxr3z|r7aDKL7>h`HFt#QRH1gO_0Od(u`&!^8LzP`O4s5-hef>W
5776 zusqbMT#xmhrC9Ha(+~yLlvb71)H<>dgieqqM_)^{kH`{bxT=oU!m66onqjOBE>*LJ
5777 zn%<^NV$Y~GzpB^Cfocqp|Fo$|L$guORTZWmy{79<;CZYR$BKLyjswO49nRE;N%}Au
5778 zU3_^ntyESXFI9tq3~H`xZmL8X)v-z&&U%a@URn$HR5ZoZ$f2`;Dz{-3+|%5k$8J;Q
5779 z<)wA2%yrg@1>dp=))*^Z%W1+<Ok-tJb8Sq`E@w_e1<v_1XHE;{EMA4N-K?k4@l%==
5780 zm%lN8N^ahy+(~1s=~dtB4Auw7y<&mmuFrB$?$<kTGwvV4z=v_3`UyRfnRT5nl9}D=
5781 zpPLz~$;<{H$qYDDzL4eA+s1{NS;fFhfXNpN^%(fP%&f2a&dbcc$$wsEs59-n%$ys0
5782 z6=vpLmmbNS+S+?==6kOHX18zV)JSGtBr^vxkVTpEG6RKpr^CT(56(SYk9y~?Ff%)v
5783 z8KSCG-cy`+Djjv+e93#0^G@cxIhmn3l1KMSlun@!U2Y!bk^RFsPrX5wu)ipU{TF8L
5784 zaDBUB{>*OXN67ph6IGGsynif}fM1NWGW~Qbmm>M)shpMPclaSiH=J*OyW#u=svDks
5785 z7cbd<y&y+e@91|@H{IWTwU;X6chm^-$_wGwOH+jPj()uo!Q+MS>lG5hdPlz+tsbk0
5786 ze(JNQ_6|%I1~&lz1C4%B=LRquKUw&<6P-sSU%(mC!d%AX*{J+fLW^Wm>524!&+P$U
5787 z)&pMM1HP^Yd`l1btv%r1>jD1-aPq@_JQU@<-A5UJmT`6d0;3;HNM4?HsdE?D?-<YG
5788 zp{veYV1H&@9*wAT7MOV>ky|ozDqU;5DVDG3`UWC7N{Dv{$X9=aSWrPd%-{!n*_Fr?
5789 z=B*7%$wk=?<v~~JM7Fy7v@f2N{clGpp~fcWZ2DeCb2C=os#HXoNH$LWP6;ovJLYU~
5790 zheEYH-azy8e3x;N$J?JO{e+LC-;}?fagmq)?dn1Pc}t$o6H2e>gR-Bl1=6k!JV#T#
5791 zbZ!d%O#{aZaUMQ|1d-@~@Hrkn$G}a$wHY{#LD5gk{3y}E)c>i0)Adv2D|pJLY}3vk
5792 z^ngEQ;HI6Q8@OrbS!qy=MEXrTTMV4e6|v`5#-(56oxN`v@}{33HE`3OR}9?r!#@n1
5793 z`dsQA!{@o}x7h}6`t3>sH|^hU;KL35j~Y15F;eeaJ>Whb^kk1IAMOD^pK<XUim6m#
5794 z$eZK8){>X=CDw!dPYv8`@6!fu_WRogZua|812_BYRKC<vdriNwxS9w0aGU6$uaA0u
5795 zpljE!IgiFLCGrE|uaiO~wN4O6!C&I@kj4fjVp&x2^2RsGV>N=8@|Y4mb9g+RW#MVu
5796 zujg9$EUu);!Y^Z-?(Zmx{s%SdJ+Kyh8P{9J`GT+Jc2!w8v(Duf{u=AqXyNjzPpgGr
5797 z&h5I*!uPPAZ(I0bo)>mn_-N+o`b$adAHnuNqG1oei}~Fa{#({B{V#fC{(ae!mpjF`
5798 zEc^nl_k9aL#O?ar!sSQ4K3q=fy-CKKg+IV{O8Z3qefH;gOMVmcXIuCOtbdk;-^+Ry
5799 zTDZKXu+qX$;dZUHa5+z|u<)tOUvJ@G;db3(;SVx@r-k3h{EscXmhDmTTHtH(56!uh
5800 zp0ea~x!xBnd=K+)Sa^i}^R9(Q8UM_}FJxREB#S*u7?<m{;PTSVY1}`8pU-yYS@;#K
5801 z=UfZl%ko7QKAHLX7XC8(ZH0yJWxmG3vsr$pg@2#z`MHJvkp1$Qh09O7hb-LB{D&5P
5802 zCD-e6`@}!AQk>FB7B2HhzJ;sh+>oDP;lsGTVhg{5d3h~Q>fOQiv{~}^aeLzy{xa*o
5803 z#lqJxf2W1t#(M6x@QYPz9p@nnpUU`?7XA$DdCtN^?6+4fd^_`pEc^iTF1K6!Z~@mV
5804 zzfcMOb=EI0u?YSRmOsPN)4+C4vGCE%&$Mvq$9Wb$g8jV0!Z&cems$At7~g2&;~DR;
5805 z@Q0bd&BDc=?_0Ro^D_(o9_!y{;fvVMzq9aTjK6N-)0lt9!oSD*vHV9R@&6viXIOYE
5806 z^K&d*+O^ce^SHiB3l~2(TKG*|?==>F5BJxN7B2Sx)WWy1yxb2<yRKsVKP~y2n19K_
5807 zrM$ejBYI@skn5`8Wvu@TOOMPC8GNHD^4GC^wuQ^m`%xA?h4oIf@HOnWSr#t$TMI1w
5808 zw_NX~7XBjZm-}<E^FLYs8cSaMc7uhBf4*ViGJo!{aPiNNEL{BafQ5^HUSgc41vXK6
5809 z;)o$nZIC1{au7!UXLE**siZN&+ZpfA-xoywImYGX62bfOyfoaBpUL=C#>Gx~o-@b7
5810 zL#+Q&3ol^2*}{t%Z)Ke9q3<K|Dnh3vFVEZVHRP$xRcz<a44m}*n9tuw44mY@!p`1p
5811 z;3WT3o`0S(aFXA_^3NJL$)CvM?G*zj`PHoFkcG>2=kEqidgMBK)WAv4ORVQ}11I?k
5812 zt~Y~k)Jc|b8RtVST$UPy4V=ozi{N7nob<@~f2M(x{0^?Sz{20*@mgfyq-PS_f1!bs
5813 zp25s7GH{ZY`<_b;oa8&0FE?<Km-B0_fs=d_e+h0haFUnv?kWQ(`5&?TW&<bre%$X;
5814 zKgrVnUs(QTOMWG{_nQVz@*VVnbeDxU@+0;i8#vXwMM*o(qZWPxkLNv%%lRlTmp^Oa
5815 z@<z@9LytTYpep`m;AG-+ocW%Gf5iAdE&OEu((hw`kPiAkm+=e>FJpYLg|{(&iiQ7>
5816 z@zECkYsM!qE`FHJ{dJy&U&#1k3zs*LRv7xJsq*}y*1)M<N4VZ*3qO%M4QZo=Ph<Rg
5817 z3tz#wj<c4Sw>L3<yCwf!#=m3X`xuw;EB=3*@%vd`{PP))&;1rI_q#7z_;+-(oc9f!
5818 zPj!{^sezM=f6nql$Pgr|m*nNSS;)XielPwhonzo6PtP1F6&X0m|4E^av(msxK9}*!
5819 z44mZeAOn!rS@=-OL~65eSyy+jg+IXZ4_o*##$UJaU$LLxv2a;IH-yi7>6a_`yq;^}
5820 z+Zn&iz^T1*-H#bKnX;SZH(U6h7{AHFk23xv3m?z({4NW>fbl<BxZLj!;dw&ZC5xP<
5821 zFi!5Ep?R47R$$4??@KEUc`7r22T-MflODOg*Bdy=&u00Ufs?#k-!~dK$+xn6tAUfe
5822 zT;Dqloa8CC2BmEl{vqRcGA@4D&3-#z$dmrl*$;16^74C{kLMezlm2u0$Hm?TZnkTH
5823 zfs_1dmLFo^X1hWLPVzrz`3V+&jPXf~OS=wnyJ`%1rJu)tlO->|2Y%g<r+Vk`1L@lg
5824 zob*Wle#gK`zK!MO`aqcJho4&VkFxv&jEnv0bTT0wGUQ3mLhhFjEP46eau5k2QN8s4
5825 z5$n%3aMPZV22S!5_^0X985etU*q)_^Jdx#mp02Xw<@eHS4SCXkCF{T5z=?c{^=vh8
5826 zlHbqrw;DK+^1Wt<fs=gBAbcQw-@u8K??*o|aFV~C<sY-~F2?s5IFWK6`@DtAed((P
5827 zPWp$_k19xS7&wtfcpM(FaJg^%+`viCm8{3d=P_X<BKM8`4V?1!viuOnr61)@<x>rL
5828 zI>lGwpHi-Ylb-(kK=~{S&tts6!WS}LY~d}8FR<`$F@A}KA7Z@1!u#_N{A(?I7UM09
5829 zOM9Q<aT~XAc~ko~3$JGRpBp$s%0G`9IGu{?IrD&l6U40ZhJlm3`2R$nx5Uo(SkH6|
5830 z|BUfs3zs+DFJfHALjlhZt1NsjkGHiJ-o*IjJ>VNGoFe2?y1ECv-NJv(=XJaXe5-|L
5831 zusz@C0sppz4`=y1d%*9q@L#Zh?(G5pg@r%K*O7;Mz;|1CUvBS{J>b8#@B;Sdb3NcM
5832 zTliO5|EoRVJY3Y=&tHjDf3di_?`0P#{4}m##-Rf75n_U5P5G#W7cjrl!sju6pM}eP
5833 z)UPaD?kf&jxLlXh*iNxWu6H2|m+Ov`+q7XVUN6Nl)~JuwLN#JrlH3@*M4qc&63$(P
5834 zeNYsT+gw*$v!=3kgOl4>PkB^2KR4fF%bQ|T!H|NA%2my)u{TXsJ=7?=Y}Km9$`;}9
5835 z25ypM8Quz7jfmzfES#YW%RDM28}&N5<@IaVVy%ReTZfm>bMZDiUP8y~o~*XA8e0L;
5836 zUNQd@DFh|tN*O<*vw#ViZv>a|Bs@KLqoG+K03QPpO-$u+OYbmHJu)`wT@Xs6@lQCP
5837 z&IGBnik~kDFGrF!(>O4s^S@g@A7x3W-TvdPzkth6#L-MrzR(0gi~VxEkTJg9@uYWh
5838 z`^8_9A-o*R44ooF$NRYa8&-!&y&}6DM5_KPDAE!Qr|2W~AJr-KO8>0|X6vL9Ut@u9
5839 znUhEg*(+0ERDL`^(5>O?J7JXUx;j!|BzG%yEK;66c%OFp>yVSG{r9cXMWj5npYE6J
5840 z_J0$Yt&>Xb<N9wV#z?m8y~wjM5?{gt>YHEUznzdxW&i7Jzw{H?Pq!qt{SN`7`lX#9
5841 zReEodK4w}chS(~{y%0-P{)=h4{A7LbKBb%-f6e7R0VY&1d>c$5`vzl{o1CfV=)%=f
5842 z5$lrnGwZwxB9;G+vj4hRko-rt)>2;lN?)_=xrd7EDyL7!d0QX6Ps<$TJKJ^=-Z5Pl
5843 zS<lL;KKg26*H4eTQq`YbfDEMn(g*L;u3xXDsHr&KJ+ku8nwmc)MCthV$jbhTSG`l9
5844 z$O618c_Qz5@&)aA5{-Y1Jx?~jorAuJVtbLmV<cznc+wW8Hy~uw6KrwQ_BAvGn?V)j
5845 zzv=Da(usX$O5*?Z81?8uQb2p*w4DIK-~-FUS&`PgZrdMX2Xt0vErdI!9zG$l2M%@%
5846 z3O=yHfz18U;A49t9~GYOhMEs<`m}HCyPG~eEq2FaAyUelU_p7Tc^~-Br7pw^+_tXf
5847 z?8B#;d&cac41Zf!EWo<new;c|Y%8YCwZ3ntR8RAY<Gu4g!fq={DiS|GP~0&qdv1JV
5848 zc5(dttV1W__1nj&*9|j*?ae@GFQGtT{LjjDkJF%Fcge0@Y6G3agS_?%p5H|~T9JPf
5849 zo3>2EZdTM8#;z?|FAdg|dVi_xRUaKwbqmQLY(1k2=65NRRE9R>2HNH3Q*^qn+1RCw
5850 zwvx#2+H~%OeQ9AQHelBT)VV(`JfWhpr3xDqrA6a!MdNRD^o_PYk=D8S*cV@X@$qvb
5851 zo*K0YDRwBn8=l#HDC@3Go6zrtyQ7`6ebHdybMf5{at=O3gCpAdia$E$*=Xm@$KWS6
5852 z_LA&q`yZO;B>E42p}~Yi`#NYb^3^S2G7!ERJSqox^Emj5+TiWo)^SM|RK*^TcAP1_
5853 z)ZW#6uw!Q6@NQL^-cu>E2p;GtrD|h2#qrOg9p^+l*697=)TTX$wPo$^G{0Glje69a
5854 zLmjfGk&L3ZzST-5Ecl~Uh|@ylWp$^=LWG4zHBH0666-F9#c84Xs?gfXwe{HXuzUX6
5855 zvRc|<4+|^l))b4kplY0^M^z|!y~a>#q`eVCvDgNPkuWktbQ7(X7S-UvEO`%8mzsO%
5856 zBAS$@8PnJQ(#AZ!5*zdMGB@U--FR+5mF8|d>8ZBhNuz5<zX`ozXF!>#w+V85noH9M
5857 zy=4jSR>GT;I0ZUyllt|+RiFA7s5C_f5OBOd)b=Gils9_kodRAxv_24cpRV%CF#)~n
5858 zkETCvgLFXCM~TkT^goHt*7PSthcx{u(K(v_jOaW~e@^sNO@BdjfqIA-a9m=dnsF5~
5859 zPcuHnEY(b!`#j8BshM<_wuzz0<1meP{m~5X`lA`%^+z+j>yKu5*B{LccK-xzt(wVp
5860 z{|;u0W=7~;e>5}3y%yE!N3nsiirJxa&QQ!w&5TpbeVWO2x1!80&G4>2n#p(nfqM3;
5861 z$7oLAR@DdDfo;@C?W1oK$@Cr6T<(MKTm+bQ{kaoZdVo4GNF7RMXVHx;q12TMrC?YJ
5862 z<z0XJs9PG9MGr4j7WVg{Qh~l_6#`PV_tpFPXxiJ)he`|}8Qx|`eO-9UmvQMIrCi3!
5863 zKZDddGRmlOZFR<~zk${xC!?HRAJro#qoNXYNY#^3c`s-^ax$t8g3cR6OKCG!{~fd*
5864 zIT_VK=-H*^YrX)!PcMH;50DM%0jg5_(#@i3l%zYLjT$%z3vu0n38UP>Btfox2c^^_
5865 zzo{7)xnz;*ql{(lP<jBP8Qz9RGrSFtW|pfWw0+BID5~_#%P4iJHCmv|)U!%4BXkaL
5866 z!=srBRfM+TStEM#GFH3f2`x}#>fvp8bj}(jMceTF9MY<L$vLWfuhD!EO&LPtL$=|`
5867 zs9l0)E7`HgQ?eno%*F8!Q4!qz^nR<F?*Y(+q<4_<sZ-fcFQE>_5?ROhIg@oDX>^{9
5868 ze~|4EaFpxQ0|QZd0R0?x66K}Uw&BxHuXicgv|7@@q<ZOV09B`DZ&$JuxJV1!o{+sg
5869 zq2YEq(e&a@cLW*XC7cSB+-<+a^mqzw|1yFoN~h9?J3=)L6fGTa+|za=*T40?bs@!u
5870 z<wv{`<&HawY@rmQj|4k{hL)E(;&PK|aNN-}&?t?lt!s4L)5X4#@&YmC$(L_8pB~4a
5871 zR)+>tI;~s?c?&PBGw|9(Uj*&OE)KAD6n1gw>!gix=VNOUJkX#XHIqAM0=|o%b`Hay
5872 zid|ZTuL+74xp^q>;ycsnQgjcpm!KeON!z+}T{?vNV9;>N5#qNH^UAyeX0tBiYazA1
5873 zKq!%W2)VcETsNA4KLkuq3s4aXC2&&qYY!(I&rW2zIMa`@t}~NNLp#{s1r%KWbTPC)
5874 zN}P!9rE1`(Bz!^&oN8F8ad%=;4asHKB+BMUUD+t>F(XW792l<$s0x_lrfvYuX>{hQ
5875 z)AV`NqEBHzkMtUv%_M!ogu4x~+Vx1UA&Qb7=`}LaM_^E{kwK}4eXSn$&#oJJgE4mK
5876 zn<XW;;bPoFoF*@NpY~0W8U27zTF`MDe?pRfWcak_gpinXUdzwZE%&XXK|*_djKW?Y
5877 z7{tbQG>}l~U8o#Ol-o?_xj}l`=Cd}8o<!e}b5DW`$ib76`j5_(bw&qKZ^75&A>5Z7
5878 zeg;^_ZKqF4{2&3d$k!pEW|4N8MaY@gi!(>mnVi@EE1^D#amJC_-aF~auF1QI98V}E
5879 z-v{)WOCOZ{57O5Um3n8n9^CIjuYkG`=nW!B%>TUWmB{=e&7(8kPn7Qcj`zUD(-@rS
5880 ziDupA<|DKWec_pqFih9eW3_+5ZXy3OdqkwUv{{7g;Sk8d_5;`@!Rez2xU;X`OCiJC
5881 z(?M-S&@Xu}iT=h`4k(kE*h?ZPdr4%;UJ?WJUJ?Vn%^;M*LCIT743@nlPVnkgyA=$P
5882 zy(AL*LG(KPq~bv#Z$}8)1VU{gaZ>XB4WW!lY72;=iLD!OsY~qCfU8<^fuxNiPDzxa
5883 zO%+Z}lp}U{Vh;t{;UQ$O$Q=RJ*x_NMx#I+F>VTNBdQ*yUViSi^#@-I2jV&8gGfx*e
5884 zDxCv{cdQtbfiW?#H=$z_Cg3D98<y0paS1WK`NR0cUJo=R>hSY(ZZd?|2a*7c6=TN;
5885 ze3zesJt_1lq&}fRB?LDV@*cX!K|)+kA%DUUg(6$LT{!twDn$TKtpUzu0x`yfoa#Y~
5886 zg%m{yf3_3TQF1z)*(e_oj84cKJWE%IO}|Y*zi0A*2hB^?jE4yfJd@BZq^ufqvFQaX
5887 zC`u@jwPWQ8sJjIV?dtx)fG9)+xbCHve0iyb-Ai?=E5>TB<s)Lh-M4PLaO*s~kH-S}
5888 z<&QQ!p@c3FGSQS$F-q2-K}yKqdId|hhQud7+;*f-DS)}qiT+(K$`hKFOaIE~Nfr8B
5889 zG_B$a5k@^xwWe&5H2iRzw!J5*#hjttDO?$&IE#do8nvLUZYVn>>^Y`e2THRp@#(_Q
5890 zE#y`YS}5cv4Cyn}u1<8_=oMTfq*<_gltEGdoL6w+@0gT=I6>^{a#-YSKBhZIY!SuV
5891 za;|fcEw_<XZ02JhrvVFahn;q;_jZBgz05vNvt$V*jZ6{CcnK>^h<GmP<gC<z7p0&`
5892 zr7&842FT+3Qgoe=lRap;kn+?mb=OJ3kzT=tLXP&J#iuhVIx(}@o;>l(Md%hxw>^+l
5893 zS}aTg!O-_vN+<Hs9@RQG@wt>8E91D4`78J+oh`0Sl+@HR$oZUAsO|sIn2p{~IOSxp
5894 z3avO1@f2Y&XfL)RUM#4oTYaX^FakS5#tY}D%IZ*zC}%`yMBFJ2Qy3~x_@dA)h8$pA
5895 z_sdDOmYq&<QDWn3>dw`6QT=RKWn*I<#f?-p60S=m#eW>(2C7Q^8<t{+WuN~~Zs49Y
5896 z*MIlMK<L&*7a+u<KRs{{4!(!eAGtFyvRNauHFAC6(lo#SH}174@w1If6+IpF&o|yN
5897 zXHM}P2)X|HrHI?OG|<}m&$bEvYTqa~FsRi(B<8<hsc+OE|GBY;181HyCoOF}qC5^s
5898 zOY@Hnyof?erYo|F$ZLt54QlC|f&9R^6R2wc6~2*p>_|~3-%MZO?|08!(Ei8i;~e^+
5899 zs{PC8<E|B3eb{x~2)np&bz@mWwS!0R^a2S-UPPyruWgX9iz<@Y@x@*&Ene8vP*z^q
5900 zJ^CUCA5(o(Q-??~h=GVmk1B{w3;;!5Ypg3Ti&5+~FD#*Yl+PJGhC<|Mji|e<wxPOA
5901 z4H0NqSW&YYA>ID(3f!m~RMFhvg=(ajZ|Zjwiuu+(AR}5CtFQIqGL|+?EJcJzYDZaZ
5902 zUGv(16`fInGJ4J=@1p<AD2;foT7`It$!`8{g=vIE4b64sF&#Kgbyd&77*&0hWovbV
5903 zlVaQ@f(TNuMKT!!LPgXwBT4GuiYY?mc_H-F7(qRa<&G87k90O{aCFo}9q>{@B~~F|
5904 z5#s1|515D_w{(=mazr0&n24u*UNA&7ytaNFIguk?su-N~MiiYK$zc+`&Q|eEODibC
5905 zAYsQ5ClO7_*Ii#)N2QGziB<ItG$eYAjaXk}ghlk6tpXIHF;zNnBSqg!gdL;^iKSef
5906 za!P4gZA}?sFD3^|MB7)@mes9sRCGt`)ub?q)=z?oh<?UJA~|4UX{nmBOIMLgXq1=N
5907 z#TqgEix;lf=WS`Jnyo3jOhsd@DzB|?Lg>-s53Fc(ixE8WI3gw{h9)`6i<HQb5n*F<
5908 zLj%Tv5h9UFn4uBztE5D=tgT;7qZ_S3JkEq>J#4)Yw@})EE0PK#$>U!I<ofT2MASc%
5909 z;2LPhL@WU&aWd2`(7%oecz)*V0e@%en1&HNVNp-HYUx^wq@GA7Vl2+iyf5I}+gHLY
5910 z&dSJv%xy}NpRl3s8-0k!c%46z8EQ>yRHBHM$TF!8bOZMPy;y_#DV*((o?{AT*`kW~
5911 zdp|lPXQzrOND_W85|S-HC>a3P5C0VF&P#l!OJgmSH6we#X^f<jpV9+9qX)dO2YhZ1
5912 z_@W;0OM1Xp^?*0^fVcI4cLG;_V}Hq0{r~7e{`)=P_lO?;@*_{MALv1z!`b2`taAHZ
5913 z3`bvS^i?u>s^$x|+%VE@8{OsLK({Zr5YT)lbG3b)=r*Z)6C(=p^;X?7cz1$S9d2d3
5914 zY`lY9S&0TAouUuw-E({e@X}<a$elDwC3f1S20qxp@hXZ+Bu~HPiu^A%tft5z1}^<W
5915 z@_44|$!GG=C!8KTik^^x(+`}2pJ(8v{-uoLX9x9ua1=*M6^8s!@S>;I!0885!P|Pk
5916 zC1#E2r}K@{BZj=Gf3Ja?`kys$I>)76iLpd}pgt1(kA^(`Iwkla#>F0Fsq~>CZ`u<l
5917 z#Yl7r;a~LpfN{~Y9(k1RGvrM@2Mv4#<V4R$25z=1o6jrCKFyFntp{9QVI_O;YnGR2
5918 zo}@%LJ%<i*JLQ)*!E5k!mlBOhN`m)h`_zx+z^OPxB<74!pIY9$YUCL>)%zyfeU^ob
5919 zzts0<<Vn5DxsoDFUY=}}SolAgmq%uzCym=xX31}6KU7&bv)y9R?Pfh2E%|ZWE}B;<
5920 zNxfII{MR(>;iH+C=b$403&ww7$scC^K?|1{JC9koJg0in!hg^FuPpox=6`45x3m4P
5921 zSol)r|7_u3<4N(Lg$I~_*TVBz|A!WSGvl9H_;el*F87=G?QZ4=S-8Y5I@Q8Aaes}q
5922 zaEX07#lp*2Ugl4!H^y=jn@{j(*#3(xJsa3RRTeI>QX4INILmLe@Ez<Id4ezX9%Vak
5923 zwdD7(-@a?%^I5++Kht?CG20%s<ey;u|7qcL?V<FNh0Ar~O$+~k?RnqA|H}Lq7XEYQ
5924 zGq{|zcO?5c+rqbSyGB{~JIqhC@N>Cc5}QW!f5!StEO|fcrzfVAM7}TMRTe&g@g@t;
5925 zW_*){f6BZ(sTKVa8{k`(d^6ks9SfJ(yg#<^Uvj%1w(z@|-)G^Evi@Ft6nj>(o{)u~
5926 z$>n8U6#17JpK8g^Vm~af@ZWI1Uu5A!nXj<$$5~#s3zmAzbT>IyS@LurPic#V-@$g;
5927 zvGo4R?cHI?U&#DD7A~=c_FA}HpPsdFiP2@p%#->0@0Prr|DRa+?QH)5wpaWxUN_eX
5928 zTe$3zEc3C*i=J~W`6AXo$HE&~|56K=dL@RY=%2{)8!Y)4^VeCp*z<J@7khSCxYT>U
5929 zg=ezA<a#dlNdNuDl7EHe|6t*wKa0n&=;_7d@C*xof%Qzc@b5ETY~e2B^%gEMGdnE&
5930 zuiP)+vhX_A^8*W)-yI*c@O!ym_FK5<dEUZB&#M-m$^Md972+R>srUiQle^e-Rr4Ue
5931 zktKQhmt@Dfo5k%KY01ma;HMinUDu9qzf7@l)>B~MRPWtf@mvc}XFYaoJQ<(ME%|1a
5932 zzs$ma#JFtaC++<+<87Awcy`j)EnL2zY-5~?ljuCQ|3ORsZ>*=w!uzrxBxbhQlgIdP
5933 zEd8rk|A!VXzg&K9=$G#xRHPqXsH7zNuVMWI7#I7)?1wxHKU)`f<{CH;C6#lLfm2hj
5934 zX88&Wf1L4aE&L0{Z?|x1*H0~6-dFjJh0B_}g9c76k?+^C$W7WSF-o)fhFS0};s*=w
5935 zVtlrNll~mGUt+w8o~Ky8){rOv$h#gJEc|7bzs|y6XZ-6H{!hjw)*7)q1e8U;V|nU#
5936 zIv?ey_E#-EG8ues$Wxi`@Ho*cP7?QBa^CghFTFCZ<a&9Mg`dvz(y0bc_LT7;%4eMH
5937 zC;!Ns6eWf{)v<#0NNh8yx1I4)OOO0QzuM44=Y@PvZZUAuwUhN+W8p5_xy8b#G2Y3z
5938 z*e~~y_gVO#sc}e88hXeN+t|;~TKJvZzkjgwyv=&vv+(;F?@NtAlJOwVNroCYiONea
5939 zXEII)vPZ6GXIt`kSgg`AL!QVL?1w4~zl-shg&$#j1LNYiVXXf;3zzpnZZY(bo$~U^
5940 zb_?&#dhWJxxxW9{!UuD|-*4d}|B!`$o%`j{9`L;u{vg})R1f&G7Je<;^ZOp~KUnzJ
5941 zxZhv1@O8SooVP4o<p0aU<@wa#d%!=kaCu+wlOAv%{dj~#+0<V(-0$f<;F%UK_mKm8
5942 zz)!O9udv@v=>Z>U;ooKX(LLbfExdv4&+h@BY2h+IpKsw?$SFt?15f-T@(V2a;ac2T
5943 zV&U=}cDaR%e3^y6%6ck$z#G^fWDi{mrm~z|Qv_!<-fuW^{t8~t=ZB4lSb&Br4_SpY
5944 z*f?iyvvEF;{{2`ise`ZJr-%GpgkPc1EoP*ae;tj*46suF|D=#CP6+;_K9T-p_c{ek
5945 z*l)&Vi2xtzw*eX=1<cDKFj`YPxZmjc6xGAG6MDTFcoHLAx)G#GSJ(jKBx|N|U`VGe
5946 ze!S)LQI>Sd_h67JNqIJ3U?oe8*ipc=U49cA^nDUGlC)pSUx+-SZU2wr^Uf%$NGT_H
5947 zIS3o0JSo4H&sUMRWiLfWs{Y%Vqf0zXKbj#?|B>xtzdUcO2WIO8<a{kipN_NLa-c1H
5948 zEo5wr%H<EFPy7yIImVWy?-i-+U(XMg#7;VrD{T9}2F%t8$eG0j<-U+GO15k#uvGQm
5949 z%=JroQr92<cKvsz&<V(C;reABB#e?>|NSX2lKU%{mpwlSqhy!=39wZ5cct(jo%^=^
5950 zU93~u309?<G%+CE&DTfGCF&PDo<RoDcKLTgy2NCC@IIxS9O?HIp*<lGBS)BAg0^K3
5951 zA&W3;m^wLJzAI5wQPO^a-vp7$e+SrqQ5K}`px^YQJa>=UPtBgYs7UBs`gEKR^uhbI
5952 z?N4Pp2_IzpSF&>Y-H=WxyMFq*kgERZC}bf0QXjleyZ*|$776DPqLimT^@pbQ=afm4
5953 z6qtYJl&Kmy{+KTB<$BdS1&Y)$UD}UrELprT{`uoHFr%$+2M$tZv>l-|_QV!M%Ri6q
5954 z{+mC6%?!js(fz9Ye!bO5G=3m{MznQrKt<C)7?3@W(>PGS<>_)98AZp?$nQG*eAUf~
5955 zm>nvlNXIo?ZTz)MXfQd6{K!R-B@}RmVvl?P`*NZk^@ve&6$L6894_g&+L_yaEZFuI
5956 z3Lz#<QT|7&&XV$jQ3M{znj3%n@QK0Ug@`=Ux-W1+$5oTHIKA2N7>%xy_%U5z%+YB4
5957 zPvA<<K3E*QU~e@3gu)R9<jH8q^e~hS)2-<!p_nztqMfy_FB<>52HU#|5j$mAuq_*X
5958 z8-)nsx-1H3kv}0*9Dg~o3zZ>feqeSyZDO<|5_p(KL3ICa+MRKB$Mn2ov2cLnv@E-n
5959 zw4wCgoWl6CMnsq3aHuE@2TICUrgb>fz}ACq<m|n{wjYr)b~M?GKs(B^xt+DWd=fVX
5960 zy*fKy_?8p9q@)A2k#)+7gnina5}4dED*&rrH>`?u%t|ZnSQ048e_qwx<woMO(xSIT
5961 z_oqEUjaz#0q1hDchG;belmU^4sey;`@WJG$Bq44x=k-BeaCm{)|BDc4WpT8#F0k<M
5962 znP|W2HE}wP(V_duugyoJo%7t1_}^4kd)GeyjP-+~txpD`9akTXwjXQWe@T89MPj)`
5963 z#j;T`S<3N7<T||3*)lDZ9AITs(+q@S!J9L*w|9zsYN45nsDB~sDc`)hI;39W4j~u|
5964 zfR-9;L{D)6Lpe2d*fSjam4}KhSW>#M_~N25&d>2MjV3)zCu%-0A1o?Zo+1$QzZ7T1
5965 zpNO;K|FSqMX$Q`u>H_LXpD&;;Jn4b^fc3rs9|8P32YS6vzdWjkB)xR}6HV**Cz{sr
5966 zPc;3{Hk8WNw2ptGX&wJW(>nf%rd7~{shZaDPv{#GRx7xqD5@Ebf1(+Vf1;T*_cEBb
5967 zQZwmp1DI;faQqX^aQqX^aQqX^aQqX^aQqX^40c<ftyMGG?sZ_cXolmTXolmTXolmT
5968 zXolmTXolmTXolmTXolmTXeQsK<wtvUu#R50sy@i>wT&97ee`W2nZARX8_>8H|Kx07
5969 z=>d8zqu&kqAhY{l34&1SN`-C{bP!N-w5lkOe%5|uD23@d)QP6OP$%?jZ6?WZsFNT@
5970 zzLVAaTQ2=PrCQMY+bTvz5|friV!iKhsoH=u04Ijid%OEGICa<Rn{g3L@KZS4L3pvv
5971 z@y%cokuzq{!gh5}?VCZrwVvQ)lD(OC<AdG@bKDc<RT<)9^nv7VBlJW?o=Dm$Wn&Hc
5972 zNg^#T208OF{(l6`L$MgXKnK?#VS?#LM!<broIofX2#r27oXB5+{CBz7#Gy$6Aox}e
5973 z4{IQU@(3eA-X|Z?t5S}87JX7uEx^&;whZQ;LT+-;5(`gNBKROR@;pLxA~3*W@j#(8
5974 zkP65TM(#EWYphikic0N}LUJA@i_NZa+*zV4n-*5M=ac&>h3LbLlJ6;v7>dT2$z6ID
5975 zCXkT@43Cuec}9+9#B&Pm>H~ivp2bjv)yN;}F7Wj^Hq>33h@dglU8Y>ty^_jp|7Imu
5976 ze`zJ&IB0`i_d`8*n1|mCoPIqd{2F{BaL0_qFxZY<iiexXMQ3|uNoOB)19JWA@SWAm
5977 zxEmStQ(vN3i&g9^oNKFFno1oF)&?$cwV{Xx=`9*}dm5x912gP=KD%0EJWyv}%suXI
5978 zn~XwwY_%khtrp6ml#Q^u?s^$7Uc<?oLsgB+kKU-D@lVdU3ZL_RO}I>^2WXg{M!Et!
5979 zX{OWUT||ZnrPSwn*Q0yCpP>8v#T}(3IPg)TNZ%XmtkELb_p6?=KCl0eMQqRk83JBl
5980 z1QipYPjWzpzR3X@G7<q9`bj{B{t}QOQwL-SLSY~ygTg0J1c59L$beW1^vrPpG*A!&
5981 z6<T4S8Bl<NFX+$;gAzd!FvliBBw&`MuUkWsOC<#&z*ZN2irj!u6ckV)J2_;+NoK%<
5982 zp+;zglO@B7-jJl*j@^(5m@r%y|HgSI<)g)R*akc70=D_naT-puqb7vyhzO&S02M}I
5983 zbTTAE1V?%-K?#d^g)Gqspd~`iWk@gL6>gy?xL8Q<lGS~MuDV*F#2ByCJR#?J(8BJD
5984 z1YsG+*~HWquhe28WrD}5Z6UvrkP`A%hEgv{-od%QNfZ=PekY+w4%cwDci6$y3w%US
5985 z2qERYKbR%tz3SeX?xYbEXS;Ax0R%n0OzhyJ=)|ILA<I~o&spaPEw3QL)E(Cd^DRSA
5986 zXsMbEneQ2b0AebUN}=gyjFM6*%zOrQap9yLRNPKG82AexQw27d!PSeA7>e=^;~K6I
5987 zu?~c!TU$ygmW4}Diw&$0Q5%GmmpXglHRFxW$nMJKX|0J*d5uJ@>YI3YvOOWCDO)y$
5988 zZ6eanwxv6bfpl0Rd?(|*5EKBgu<~Og&RDzBkGRBGcF4an(3VXRJ3>Tc%i?~{RnD1V
5989 z4E^-e0_h{|%H?7Iy<TrD7V=#WS}x>!4C!-FxPK-Dg_LiTTJXy&T_lyh!@B%V%lhq7
5990 z!N(?OE9>IS-+NZf6Y_NrS}3aCPe8V!aR79#`YPgOOItjEi51*$YxyWcR0f(Y|0&Cz
5991 z$R?c3N9lK4{sqYUoDul^Z$}ouGW`jw%gZOMpE{*<%B1lK*V?>({OY>q36m$_89{Ax
5992 zMWr*Lxv4QF)4fpB25eK1>j^vfu7D*;NGdP@uiZ}-I{*!pfB}AdLHe>F0TO2bvLJPc
5993 z0!4Eu0MN<718@_@zQjCtqI<&m^ZZvVo%c*&e#^RP`Tn{)`~!3S&7rqm@((%^nz41p
5994 zaDT>|ffI|q5%??C+WWQzM*7BN2S%K;EN}_d=wEgR7VQr?(gw1c*6)wUntlJ;!0f<x
5995 z1FeBkKrdMebQIzZfFyy_-z=GX){p(`0|VdkH{SE}z##w0fop$q@s4TdPChp<a+<%X
5996 z%74<$!zcLHE%o<V>PtgsCLZP_E&b-lL$vn0POUMm^48clm9<o=#lVSmscLC(%@viU
5997 zF$oHgSOCrIo)f}qb#qm1*=j5p_Ew*#sE5`Zs|Bz4O|?#i7O1Xoj3H<*79Z=y<4wGr
5998 z9BrT#Ui7?5b?6oK*rWnr&DsW(P%t*82+hpT4^7UUl$#ftn3q2#Z%W?Tq48^D&2^PC
5999 zR#(<lHrAAbEyIfP85p7Cr%VcsUmY5M;l$ARDz$KVd_yC4xG0a+H)4kiJl(>AHCk2n
6000 z?<|K;4lAJ6bte|}CwxK6*C@_Gd2=JymDe_}t#fosk`@osf^O*>y#!t_dnZS$1=nzZ
6001 z^kVX|Znc<s60N?YYMN?R*Hu=8)PnDXfnEu6cM?PTdF_5_VkI&yZ=W&={h#P()py=H
6002 zXu?$_1J(UtWJ$TI7`CXu1-wqXp{ybwg98Vwy{E&O_A-5iPIjPC#h^&F*1xoBEk|-l
6003 zvfm4Q0E@|9)L&Dl7VInA%>~(X?$=>Nucy(>Q5Im(+Imb?UVC&i?UnBrma5Z4XR0;-
6004 z^)w=BougM$oi#d|0Aak$pC_{OXU?1!%2~Xsxh~eMNA372&5Fz4m_H>qZ&L20G1h37
6005 zIa@s*0%Nb?rfZ7aLaV#%qRg!8XdQK{e@<p-16EP*$;^uE%M6^4Rn`9MR2Ve5eOFIr
6006 zutvMpH&3mzUI|^*_@|^Eu_V@mpO+cxOgk?#=f+-<%)IN;BbifMd!L`V(sy5Gb!}!t
6007 zG_yLAxw5!#=G4N>yhvsaq|eLDMro|yF3j*<m|0zs*-)*7CPDYFR1N%9Tdn&pq;=m#
6008 zwC?*FtP!873Pv)}idl+e`BVqG<o*9^z_n-oPg(;`Pe{x);PMTS9){9Sb9SPKC#mpI
6009 z4>&#fApM(gq$E!n^Fb57gFqyCR5%@UD*ZEiz-RY>FX#cM$4062*8o@c@cn~4UgCQj
6010 zV?O7F)I6c6>kw$~8VH(yzM)B;CRUm2`ARC&rghatIpdNETXZ6G2H{`Uy2|q*8(+rq
6011 zeR0GiKrda&6v@-vBzme0`~(A!_kcfd;PgO7^!WK+mh{uu5d35VA8O#^4BXTcF>rbi
6012 zCwgiamv)gZN;ezwG_Q)hgy184O#Oc_<W2mbft!Ao`$)Uq(WDrO4raXz7#H~v2_eZE
6013 zT*@~6zs`{7r<6**m2q4C0RuPvENe$78xOxcKYUGT({`HuiwCeOk)3^*rb9ob38!~E
6014 z|Hk|P3*U-+Zc3z+lE@dZAIUaK#InhXmuE#JFHfo{BTwZf^t{D-&a&`*tn6G14>Mk5
6015 z;jb|+*HE$3Wn3Q62u?p_Q!3L3uU(ti9ywn`{wV9Y+>)Qg_(luAi1|(nmpFmaU!uR5
6016 z<>bkP;Qd+u4=g>hR`dZ2e~#^c!opjamuF+5znb;GV#zmhzyH<3Wi8?n3!le&zOZn)
6017 zZ|Tc+NxkQ=+z<=DmGO}l-pu-QEqpQCd5(qmV?1i%xvYP&h5v$aiswg3?38Cl@=mPa
6018 z<*ffIOJ06*id#4yi>q|2h07XhdC(~OWv!OI)>zhb+iQ)lV7>NQ<CR>mz1H~a>`!@4
6019 zC-r`l@%Jq|@09+v@DG^J;C#{ZAoKQG<B9Ayd#!OP%gb6=(Q_TkPqXyrGcV_#$agYs
6020 z&d)TzJ;QchYU$a<_;)S*S@zpcEPN;PzqD|9F8hLo%VQ^5Lne00S{~YRgp%O0_Tgl1
6021 zx8Ty>5et8r%P+O?SGZlP7$=rRRec*Qd8xP6z^QIYH(PikXMDrbFZX-*Som0$|CNQW
6022 zV*IZLZr;zlXW(T2Wh|eOrU~)SUdCk&ue5g);}Z>eD)URm&thEUWxg)7aG94bHuTWA
6023 zl2l>I@8Aqs+eCHJ|4{Ci8!SEh7{A59Nqzz2w;MRs`xyQy$r=dJ|5KK~&yc6QE4cI3
6024 zj#c1AUe<2!HRMS@-CIyH*Y;8w8OJZNJXJ@k<(cSfh90@cK(_OD11CL`xL-fE@Rf|q
6025 zO|94|<FXeI4ypGRZtv*^PNdv7%GzO(muInsEKmB$PPs2xXyBCh0^76P!d<qz(!#@x
6026 zU&gr9E6;jwG;kut&Tkty`SV5mQ~HI4%XSgJv+&{UhxaW!kMX{IBPjOBFD<f<yWqcL
6027 z`2tJ+HO7}&_}h$MZs99=ymc5jnHHi(A$`NZN%VS_|B->4_sI`1PJKe-^JV-~>N4a>
6028 z#SYf<XG5OKEZ~0mtAUfAAF%zj!3!mlrT_gb|AmF)r)rh_Y#bG*Dj(*0PquKm9!zIk
6029 z?3cB2=Ucd}?OkBu^K`Xp>lY$LkKmVD@@sh9%6_vVFZgAayxc$4^?<inxV#f|g@xk{
6030 z5S2DrxX8C#_;u{Jcn|ni3;%@s>l+p>_gmkxaFO3(;ooIDzt;o)BMX0w?fgj(`1$N_
6031 zGLMFcoYx0?z<F4yel&k|%3`}@Trum&eXos&Sb)r96BQ!kLhwy2SIbAicQF5~jf=8>
6032 zd*5tpt(Ltw%h*Qy%XiNHfA3nYPsG3Mcj<R#)y7&h1r-Ru$CamOLe@spvke*(GKPq!
6033 zG#dYe^Y9}`rD-<6ILVr692nARiyv=!dfrDmC*t2sQhu5Vf|mN_SiqQ^Cn6rR4dM(b
6034 zCvq2ZdAt7gTs|U#d=&qQo^md4i8&8(`3HF(kbEg8{G}jL_1`X@2=z{h`k58gE%i(P
6035 z)dRD2lI{lnA{n&Ck1cy`59P1nhcU9|n{-mL%hNob%Kp%JCGOoXk-cP+ZU5JR**dA@
6036 z9|zKB;(kkW-DT-MJXQVkQq)gPvg^MSSgQK_(L+C^mFhF`Vawi+EE^-~S}y;xm1(g~
6037 zPiwU{vHjA|bfk0Nw!aG)>CD5wnTq&9+<)*mlsu_lj?W+?Rrx=1#gnBVAElfef6wJD
6038 zF=v20@Ut?coWO^;yfsXnY$<OQkoHUYH$kN8|J&GqD_M}5LoSi>;#Yc(X}L(1ILhTe
6039 zP+a1}GDrE&ww<K2`NIAzXHs)$NZa+(v({AgALJhe*CF3bcKuEG!Lq5cv8A$6FWJ)T
6040 zutF+nT7Sw~tw~d-oH<eD9{*acT@NHIC{Sbp;(-oT`)~7FsLgM$hh^AryPw+9I2yk(
6041 zTn!-qX{>co`*BCH{wOEd_6Xb&?Ywv}7SYIt#KzhxtR)KPKOKK!_kU%zKObx_gYXuA
6042 zr1h$B*cWW4XfVa)i^Ah}(O8dmUg;~2f6@9$UNm^&vz_M!TVH>V7Dcso`J(MlZ<*=F
6043 ze0UWc8+zyEcRfTGhvLpyIPZh#j}-P0sW?bYiFVY6109R8)a=Q$&TG|H(9e%}cGM=M
6044 z*g<8<U7I!`v}fTH(ayy_><t|({4ZxWR#Xk6l}|a*)>r+}GoYgV>5|UswBSuI!phEN
6045 zSdLW~URe^a2#2ubYi|6*-G|dkI;ZD!7GV_?Huc{9moykVxWxT{Ru@Ip>L=K`@?jcJ
6046 zh4Bvy$GoGgE5^DjY~P(0j>3BA`?xrMQ2-eH*INs8wqW(wdwMNfwETr=YnQ8bAzw5&
6047 zFK^zl=-K<44@J-Z)7<z!f^A39+~W90hi@j2=JYD*oaqLypNa}2)RJT2CzU_ipN{!A
6048 zxdV%V<x%xhVeo)fY#u!@8lU-IG`{etxBvItj_-x(d*j^pH-qh8`GR&3*WK=I0}dtG
6049 z!S+9rpEvKN5n?PJLpSZ4>84X{>14q;RFqB?r3asi&;0E0oe^}+I7q=zUuTg|`n3F2
6050 z)s-dj{n7X<x)0qwR8ePPjt^eVK2(8KTPUZ>$9{{Vho36xKv$3u^;~CRKntD&!F~Rr
6051 zWJa`ejvEO+SQs9iYzA2tKGgF0v129i4-P*ngZ9t>6fKGGIdl}wRz_eg7@Z5n@eda-
6052 zq`kP~FGb_%4qm{BE#4y?MNaF{W3fS<gR?h(LX&yRkjVZb2a1mA^@@?@krjJrO<noX
6053 z_$yeaSK|Insiu;hh5loacoD`at!z}1HydjaH@_W-sPiw4&%d_t(E^-*T~REYqveTt
6054 zbOKJriaT0|h!gQiOgd@=Z<^`^+bD8Lv}0pV{`1lJhmX<eq8*DJ>if2?AD13%i{Z-(
6055 zmbGO^JKMtdQGY^BDBAu}tpCI6bd2xUCE(u>jpv+b=b~^yv;#G(jP|ZzyBmN-&#P}p
6056 zi3NG>UGY7^E!X2VNeQdmDBQdfm0&$$VYr%zsyN2KQk0K#3v}?QDzs|V!*HV$e+|Y|
6057 zNHtr20bLzMVXU;vd5C6TR7qC|(zPB(=qd>}pu{kAZ2`twVK^3iuqdl)_frAd9llX1
6058 zf~SIQ1#nC7fg=1bcBiLpX$!v>!i;oF_<bCLZPz0=|0C>6PfEG=NPPeLWhI^Wgf{_;
6059 zJVMq*9-~h>&r9M*u#~Zomw2{!tv@wd{%mB--eUKKBAh}u?S-{-%l~osrQmQXu61@`
6060 z(4@uowjRxhJ+3N=w}mNJ=r)7iV$e5&j&^8S+H#)qN;>aXO(54qq30hV$ao!kOZYSJ
6061 zFftn7r@Hsx$)6lMR@hlRxG;WDd#5dY1R_Q8cZ%}gEXv2y$W0DX2`0OS{HG%iQA11O
6062 z|5XzIh?jomKd+vf$Croak!u%KVGu4+mRAMeee+0g0G5n`dgn-RY-I>+ML19u%zbNJ
6063 z<Zw0410~oowK%@N^;lZ4{dH(p(2?MBlsgj4!n#(J{sZ`@Q0y5f01~{8?#Ymg5lhXx
6064 zDm?Eo%sfDr6@~*xg5#c5O6XL)1KkyAJ>~}6c0(Z2y4Q`MDaX#n*a&`gG|o#5-<Y;y
6065 zZ5HT);`m<0&W*p06}j<4>gnp^7za4hR7OO_-u4#0-l)z(Z#pcDzaDI-=zN$B>3lV2
6066 zLmD5Ej;|;sN+I+s?W~wij*z;L<#*vKwy!rvJ=aJR$l<TUUmq2Qm!K_^z?XEEgrllo
6067 zqSWVP;L{H~Av#xZ8bqn1RB4Rzn{r@K>(N0QPYOPGWB3Sis&+peC=5RM=fbmJ4|eW{
6068 z?>gpYMR6&}F`FBCgz8mF*pfs208l$*gde&J(<V-`3anZ_na<h<>W!6Bar-pLQ?@$s
6069 zqn*u|GfKjR!KaGypDxPpdYDdH44OhE-{Wc6z5ze+%OExfxH*s)d<>V+C4feAbiW??
6070 zQ12A)pG8k~VRF(4k8}(U7q{;1c1Q5H_!GtDpX2sKZVHMq%i*q|Bv|-{vzzAAP;u)Y
6071 z{Uz?l#bdB$dtXWX4Q2hz&PAgz6dwt1LR~mL6lkBF-WeI!XX2q-sAcH)oanA-Sz|@*
6072 zhO(x}t{60s<b61zA-iy>#A4p6LST=8Vei6m1;O^4Z~`BC1-+owoChDc+Eq4o<l#Oc
6073 zt@BoOyYu3RBb(pg`<)ke|2^yDC-e=^i_y*oA8vQ{#a}FNUW}mo-j22&z}*fSx%rE?
6074 zgD|7~+2HlR!K4*&_eM5<M#C%kRa$;oFzu1>`>-Y0POtAoJMItv16;J@k??19?8HP$
6075 zxeq=ajo%;Mp|b7|Z=z%Tk?>B%KcXfq%GX6>xU3*km!Hnd^Lc2KV{b;OLiRQddEyD*
6076 zfup)euwNqay}|Z3U{&xzOlHWWi7ohGS7-F?_NRk4-9^RV^1Nv0E#WkXVIcAv{%E`?
6077 z&pWYkGV*;TW^R2x2HX2lf8pM0suLSaex8a`tpp0O(>;`4orinj*Z^FO=zD-30XQ+v
6078 z4?dvXF+I>SWV%1rJiSls^2j5&tvGh*m!DG4IS*67#%S=nPXw>M3&`P@dESlgFUlkJ
6079 zhbkc)?O2ZMd*?h@9t)Sy{Eh4WYX_?_@)>#UVG=&Lgb-MVrRclp?oE}B(2cosXg1VS
6080 z%kKlj?bGKuZfA5WmE9dv)j>@Mn5WDM@KA54Fy{#+$?e&q?h&ntL<t<4jAHTEj7h~Z
6081 zBc%aqQi{fRcdPHvW(@ppC|lu!6+Pws73WG%dH;z#ZoXls%#FqIu5JZoV*KErT#`EA
6082 z-%of2jK1dKgTCiY3pLl3t*WgI#p**<HFXssfe|A>CtJR*KGay*P`e>i)mXnav>;Mg
6083 zym%p(3XN)-HmZ3X4k&7uYpg79p(4|iR0SPW1z#$sYpZF3iS;4%8nBcrudXa#gLjT$
6084 z%`_NQURl$E_nebWYOHK(sINnCf^{{qYP?$Bf{m;yLU?0tb*wt29wXj?-W`p@9>78H
6085 zS54K19x71E@PYQEwyUnb4sV~w%B!)%U<fwU)cs3MJ?fD*Xun`vEbJndqBFX6KvRAB
6086 zn#!2+yY2H;=y}yI)G2D8@8-s`x{CU>-IO%c*VZZ(^wUlv6@0be7kI`<7g;=&z&wz6
6087 z*NbSCCiWK!KN<v-s6VY2y?w6eKzJ7NIXHv5+X@6uzZy__RfQ86Gl>eT$De_*gr;fw
6088 z3?<?Cuzw*^>PQkUeFcGLC8Fx;)4BtQCfkVQY6IG=KKBsTC-4&G=+avD(XRnfWZ$)z
6089 zhBcXSz%ZO^>4U|u__>S}s9F#7d;c4l6P3;VjwIUB@8jnnq61R&J4$qxmiZ^q*_!@@
6090 z=#ZvAB|1mbpAoIY?)Lkf=&2h2g6IPE$hM#35);*otC)G3@hN7hX42eW!@QN6Nq2t-
6091 zrdl%rm#ozffcy1ROibrwx<5qDdd&=UJHTwx%pmu6FxP5kunK$7s+nx}5L9o`%n0{q
6092 z5W873W8A%9Zqv+I#q7|`8H(AdnQ@A_PcykLUCwuDW`eS<OEdW{ts&d1UpVY{tLlU7
6093 ze%q*#+DG3elIc6Bx!eceq1I-h@3#T#6Uas{_NQJXvojwBK`3>lLXQbLNDqbnd2J9-
6094 z1Eha`hew|24V%mne*%iT9Y_&)a&`;u_p^w1)u&H=`qgKe`s}4X)759+0VD}y`OV#c
6095 zt}8f<>Qar&%Dnvt(5M=j`7Kh;^frQh+Uy5Fs>bx!<+Dyb0f;_5vWC9`T9wZlL4w?#
6096 ztaTK4x<9q}LlCNXkn7BPmtJ(yW!_KJnRSFz`858)ZqWLq&H9MM15ST()_EY6vfgm)
6097 zX2|pjP#5$GEJ6m>Ya;~)oOJ~lrDwp|l*{xqqSGL|7}<kKM#&EuxcJv1Kky>5*h$BZ
6098 zjRThw=_)k?mr-l9X#+2Q%QJ1@B~)^-Zs)5Ym1(Ya)4=8QUJX6>b)NDKytEFLX=N*$
6099 zs9sH%kt_9J8n}w~64590!16ZG`h*@>@hi|FEnhhpvy(od2UcAOIxiiU9cSR`#h~>G
6100 zJ+PYkZkLv?sRX`Hzv12|KsNLVP?hQxs6K&f0Gvn`P91oWOVz0JVc;@%Gm0^Du{u-2
6101 zI_DC_<Y;EODv}44H;A5j14~^pQ45rrdR8fBgw82fdI~jDp^8MIhvG;md-4XZcBy$<
6102 zpvKg5nQ6}&C6$AsLm{osGHS8vhif$70zRA0MJzf-hu~3o?Li!s>{gKt>Ch8X-GO!P
6103 zy8v~)4Q9QUoAoxDerR&ZrQ>v&m@1#A9>EW6c8@_B?sWC}FSUIRd#UP^l{qag(cBHK
6104 z?k(s!t*YHsqfs;0DaO^z^=dW_Xl9GDB}+4Lm6NTR8&pn6GaaV=H>zs5A3GI8{n!h2
6105 zYol&*2Y?<%2KpxM#i#!O_)|1*kgq1te^BONk{x^j9IVS;pvn#oNLj^eH5btN$fPQ(
6106 zOVrXO$bXJkqShb_fI5RoU~qrTwWoq`{NrhA^p{Bi&FkvZ)Qx~YE_rEVsF<o#XAReK
6107 zy++b+LH=KgT(6OyZM{ZP3sjL_BMmdJRA#;-C45&V%)FA!)D62bQ6fD|I{m}(tBcA@
6108 z4;$n;Qiqm8SIh;X9MZc$*|uKF^)B#i>s>%S5h^XMb9xt0O-ivT5J?n^v_gY3m}byE
6109 zfe;4l;Hv?Q0Oq*6-Cv1%cQ-XmDROs{XG65G(A^zHxe)D->+U8Wj#S}q_K<)MJmUUd
6110 zjW4$Xw|Zeh0hlxyEjTF<`Z7bFhWjX0_C=*k(=QqH0k;|Q8h=^Qqfaj_MO2_asXGeL
6111 z>xHIf(wy8U(10R++n`rnLfXOc^(aTxHJVJ5)E|zagaAo+^=eEDLL!Z(Gm_F+`fx{+
6112 ze<(3ajihu2eYiQIY#f3GC71^I&EqUd&FWiLPtREDPD(oW44Pq5u<DmWcO2R3-@55)
6113 z&5j?e*!!*?N7n{7H%u>)A!$`TvAJ(>Gqo_<vhc|a$C(hoV5T(TbIzY|L<DnxAe0ty
6114 z+(jqhk=BG?iR5k}9$+Gm1)a$_ck>bT2S(>3WYAT4`G|8AK=wqMD<ts`nT~tO8qzyK
6115 zObIjLsr$dE`||jziYxwm-%G+{OAt^&Q3HleAq$(Vnn<EAvY0@EL4g<`Kq>@CUJwNW
6116 z8c?1w3f8Kv)M(wSwzjn{xB(*2x}mk!y0qH5McgWixB$O%X3qECdGp=_+u!e>-~D`&
6117 zd*(Z5&N*}D%yO4Ew-DkUWN|4QUtgJ)=avRLI238|R?hfELMw+VD~FhsI!Y{YZ+<yp
6118 zksMUa$u2VN=2GqhUviOhz%g>AH68ai1L->FFb;EKim7EC%f5YC!eXiho>QhOr)cNW
6119 zo<USD-pElmvY^C9QjR*@(Jv;{=2sp;@5~^T`-qvEHqc1_%YqxZMM_gQzPFNI8y+qa
6120 zodv|FyCcV{>W(=&&B3bDhp6XrryYS$B5+xL<%AD+(_6%sb3G4fbmaUR#2<w?ZHo{i
6121 zTbbyR*o`mjWGO!)T;a-PRHxEVy~DSg4^eb_zFw*Wkaq2IoKb9&dv?GbMN4-*&Yd0L
6122 zdg*biIKb}ePvgTmnxZRKw?vVnRmnwxe*M*;TVa%%t{5DLX9~ytyXSFA{a&i-Zu*kO
6123 z?SXX*D4!`l^dR;3{gNEGsD3`>VhGbC!kZ8_m`k{CeNEAsvhmh~jXM3dPCt0CQM3Oe
6124 zcEt0Nn){zTQl)HMgVK^-i_-5vw`PBrXQGsi>yiC0*rIj)J2v?ql4F&BR5E4b)hPTv
6125 zvUTAPzT*1Op;di&keraR@e5e?5l<y48@C|cmQHP$vhl$~Qtyu?{q$-rZV#jn;#uJn
6126 z%nD=qo9OPRlSog>#tks#Go_O-UDiux^BTiE+(Tg+WOCjWIOjDG&k5m$*eV@jsT<!p
6127 z(8!~k8ZO6~qjpyj>>lf`VWEc^y2qKr6<_o4;r4Xz;&R?_5F=fpjAlUh72+Do(ueY-
6128 zFjP$lF%oG(s}6U7yFW(a>5@Sgbo$69qt8%N_&_y<GfHWi#{IOD&%NC|+{y0dZe(ej
6129 z;02s{+Sigg%~jXTbh+4(i1EkJzkFUFnuj|r@HnZ?St)qVQXxElU#<P^@4H9CnM=8a
6130 zET)9CpLUX{Iqg&-#_>uM2TXP=1KDirZ=vZ95I?t7-mF#9K6*SUuHwOlhEc~KH-AkG
6131 zo`HY#xT${Tti=|%O9N|JYx2R(m%5b%c|-Hz6OMB_>L*jW^98BVEjZO`K|k$`<CQXw
6132 z-a@$5?yT-)V>bz{9KBg5A^1#?SJxMGT~!a`cE}^w9J_JXfyRBI!Cwv5vgx+siQf$S
6133 zhJ?q&t=B6Sx;L=4!}N;$z6f$yc)5E5UBc%qgoRZgrh%9MA|J$XAw1*Xl7_11W>q5$
6134 zSx<|TOj`7~wDPGS>|kS_J6#QghKp$dp^m9!gLd&o%f)`$iRpk|mmc9>!WBr|rO6%Y
6135 zaL;n@Brdy4$2Ikvo*jjj9ez4ND2ClJbi?5=q3C%^&$HznSILf|v`H1Y%pdYrlDRP}
6136 z#6hURH#MvxZiVRN^OcQxxIcIE=ncG_HZ)gfS-|JGAihS{+d}B!rKjYd)>nw4JR(vy
6137 z?mpO9G)__P9Bhp5h~K)Iba5YF`-F=%UDZVWdB0nhP)w3l*h*riRhY8Qh&tLp(!o6D
6138 z9H6+o9eiZF;-lJ7bh`OITZrz}@6>GWP~!1N#8{p^KY}NNTu)}%a=ZXwT?z6N^ojW-
6139 zN%x7HtyuKaPQE!kaum3CxHog_A8rtcE7R3|=?G<F1{~s5hkK&ij^4dIoGz~^x>LPR
6140 zCT4Q4JA(b6>-#p7@+wqbdFsY5)Z|ZH;v>BZP)jWuM<j4OfrF^fCAyG1gr(BI7^$Zb
6141 z!}X?AU*UMldQ4~0WrK=}TjQdFE&i)wDszWfviTZ&pU(69Zle)-ld13^T0ir3g3>_K
6142 z9LZ2qUhI%afjC_J=}f0mUV^7WFA<YdZL%$)gy$5Fu3u`kRs{0pCok?RVmb)Vuz&Q-
6143 z^wq7jg?^AwsIQm>9rOjo7<4M#af=Um@`i5XSRwo!4DB=@Ur*LlYg{ecRfExl;&WWj
6144 z_0}9-1O=82;8vrio077TmgiJ=o{OfNk;m=$lqzS8!Dc)1_1=e2y+w^6x+POr(awH-
6145 zd<$+R3j%aMi)^>6bw6e0AWOoVEh$aexc!he%a_BBJX<sK6|Lt;j>b6(FLTf2dKvxa
6146 z6k3U0<CRg~p-Tp0YR3zRw398?#}ly{W1bguF%cLS65nbuR-E}3b1e3wE0Q1G^rvfP
6147 zuJ(^KVcikL|41><A3==Q2;4aDC9qOm?Y9r{o%r^lU(mWy-45r=D|MxxtJ5b@THmNY
6148 z$vKO=e7Ae}QJW_3W%6tc1l<*3CBw)q2GO-sARavWD%UFLB~vJp4K1lOf;rAP{Ev@g
6149 zhIoRHo$GpZj{;v_8g+3)K)a!woY3W#bi6~wuS-RIkw+JJV!Hmv7uodzgMQKVEa<t^
6150 zXKyp$6+Xx9K8G9d;Nyn-@cX{(qi^!*u6qpnUW5L(LEryBZ~7d&yK|as#!TBIkL*a#
6151 z!eTdj4rMqU32o1(V!F8Kpm&Jw7`q2_Cw~v<&e#Jw9eY4$(B6mXT$=Y_c1cE;0kk1=
6152 zFOqtcA}A8ODk7D_tRFQ}cfD!!(aO$Llscvxl^RQ7aI9y)+Dy8K(nDo?di)AM&M=X3
6153 zj~5fwCeyuQw~NLm(<k^lMbiU~Y%-gb_wUKuP_yAD@oFN|+=;rk&!k!U_`6HfB0_Rg
6154 zeGyrrLYdK5HhWfyejVxlXn!fLkO98%;%+h9P7m~L;4Q6B@$Kg1ss0|)oE+qv#L2-%
6155 zF4ZU7-ikU0TT$ow8(`-d`(h8_0&Go1$LY!|L%9GA|6pfN4fi*~9+55l`8{qtvnOYs
6156 zHcU3V9?2zpQR9sA9i`nkn)bG3=TqL8*tUxC!&swgRF`pvX(|Rz@8~i=D?LM4$+PT*
6157 ze52ZmwV<P0PWYK@8{MbqpiYGha_J&vGO0Mr_ud&jIU3K7-Fv&1=C`m9(VL}yLf7Y<
6158 z7=U`ggb|L~&X30@KGYyfXW9W6<Nyi{K3r!8NcBQBL9|`-7b}tY#^(#kRp(K1rlO|{
6159 zd7lq~d{7`I?O93e_4z=OI(6{w#6pHVXok*<|Bq_Wp4lKFkQBbY5($VTK9G0@r1;_`
6160 zYXm}R(`=9sN#*t@kYAcW{{EG={EG#6M$RN3-*Seh15SSHT=5gXc)|y527QN+@Na_s
6161 zp}R_370Q`6%Eqo3S9$F?4dmSdrO{^5tDIh~NTcb~oQT4q5iJV*GqDJcNwhC_ljwj<
6162 zvf37xpd#1nT01w&nKt1D2|?5fpR9x^gqH$svlJ+Typy_bPboAm+Yb73v6%{fv=Xg?
6163 zpjRNm9zTIrV5PX@MmZ}G3BMsrKyESlkU&kS#vuP`^1UYs_*^ML0uiVh!s<(k(W|}?
6164 zousA+7-|aJdkI?Se6ax)CR=U6?+OdQDa8k|fP{j8Qy<qm&?;keDXP!X?yX4770`92
6165 zf<&AIoqD$wiMu?$a*&94*O>(p!A_QeL}<}i0rF!n6i5LQ2npAz0Ey@z+YlR5rRro`
6166 zpcM&xUoq$`cUzJ0{WulmMSfwo6^VM!nH9}KB9=%mNc0Ki6C}`escHx-{Ct#(f_%f*
6167 z8fZlV5l8Y?wjzN>q{1K(gydt8h)30oUP1y>*%!2;lw2yU=bbR9ohnU1+s=c;;6f7-
6168 z$Uk^ovp}LPi7Vb6Gvdvk>8Tb1;{u|NyBFvOgvWKJKo4SqAjAT;mLbS)CW7o1Vfknh
6169 zm`7}Ipg%iKu`Rt#fIrGP=!9}xkHn-#3yTSY(1B7MdXnFY6vQX^pa8NkzqO}tCFrk5
6170 z#o1xAQf#8scF+Em@%E$KW?|B{Aq5d+8%Rjgj8;v(ZKJBZ$SDJfo%m?%d_8Wg!o&(@
6171 zQV0^|Na2I4;_8jui$x*N_qI_s55=y{@|F}wxFr%}^8}p){sa?-H`Otbfb;|%^Bfs1
6172 zFdYP(mAGB+*@`?2bpdBsTwQIRH0MjNyh+%6Y78|Qm|iYMt(P+mP{~+Ud7~XU1qr{W
6173 zmVtz*gw8`h#e~<+S($ZxN`BwCT7m&1Xd+M8Jjpy^^QocPu4b2@MoyA5#V1Jqk{llt
6174 zRUpd+(jU!0YNgKza&-)&mgE12QtUxVeHvt$Cu=51s9~jLtw=Tcj37;=WpS>JS6T|C
6175 zC7!HlAfbkpmU>Dr^%+5$N=xIEW=nx{y@FFA85<iWh&`~(lv3>-ylm16Xuc<~6y$<<
6176 zZr|maf?%*FShj%$`-XOMmdMadw{ly7LT7@peT|s$if3UtNc^0GMm)O3Ya54xZ+QjF
6177 zKz^2{nR(?Y<ivIw(oumFcI_fYkS#HcNDc1nNd)Oz$8na-x>r5xN<sPsH|~$GR&k0J
6178 z6_GP7B|+-<xw(f;jjzB|m^!yTOr3h4khygA&Ic8|M93B&dQHf8Jg5ZZaCw+a1xtiP
6179 z^%KP5`(pBAbT@>LRGO)tUfqhMZ~iQp-zd(e<sHn&t9%53>?^MUh`fc8{6#E`q+kD8
6180 zs6T2*GWlIYKKz=^YK^PeEY0Kpe@^U#MQq8T##YEbql0D@7|GQFQxk&JUpv*VApuC<
6181 z=y8^Tgv}z;wp(D>zE|oXuy47hHcJ$~<3(c$NFy5Q>7ZTk4iu1X#LK!Hgx)0Qpws?P
6182 zD_V4_cuIkA7yQJfQ7=@8F*F8hlW6hSCPAftEXA=r^AQOEzs2KL+0TeMcn_7D0>(V%
6183 z^^=m9#QmRo%`hdtpG<*|zY$-PEZbdMqz7#GJ1@vL1qwLJvOuFp&;a+=fkwCxBaueY
6184 zFHlL1q7v|?M&VQVQ={-Idag!o)A_}6KA<PT;t;h%6L2$u{#t^8ilH8U=bnK|yyNxv
6185 z8Hf$&V`1<xc2-Yd!@ClYKOiuj5=f}`8x#XxzBi<m7YKQl2bEw9yxWIB?huH4MUVTC
6186 zdd_1k*Us|)pC$F5>G`1wq|wT|{Z@u|NCTm85WJ$%1g%WG30j%Z1g%V{Z=k05CqI0^
6187 zHrJ^JiEgc{j1)S#>&yme)Q5b7)<(xCMvz7oi7`PH2~AK%LK9Sx&;(T^R9DFVpC%ox
6188 zo17C~u7atn*HO!S37U#$DFHV`ldI^xO1t2>BJ(0SC%T4;=ZU{0wRvc4r#C9%RvHbW
6189 zrqQcP(qU<bu#nwr=uy9Qydt?6of3?1f3{d?FzaGTae^{X)AJ{FklFN*zZJ<r7{{HN
6190 zAXmk5A{q7J?IZxnpZV}Ef|0z<ho2`H9m!Zbuobqk%cRt0a;7?8E@X=jT_fbredrfL
6191 zLTv(Pp?YDj)Qky2F7+Xhs5Os+piyPMtOJeu2Aq*`bq_dW<0_tD3`GkaBUU7uZf%~!
6192 zeZvtIMOA2Ow%woLvyP{W_PL%fN>J(~nb;5GRFrN{uZ$$Q6$G=un!tv5mda!if;Qo{
6193 zK!~7C7(<Ns?K7;^4w6Kd=ZHYa$K|=L1GudRxUCELk?JGe(^f|?cRE`e!QAO=Wdw7l
6194 zvvu)Dy!qJgH?ao%|7~$BaceltJCDlT)kDq63Etst1;-QKBwPye$s-o_ZPFCfqGZ6y
6195 zi>n}b?iK0ehYjQhB%z!xdqF~)aN0^2$^r>fCrw`QT5YC8{nzG6JXJj<>b807vgshP
6196 zawbFRhZb=)k1tt~pd`Iemb4@kB(fgT!IMJ!NoOXN1jTe;2qX%U^?adbyBYGqP7MSS
6197 zB@<lVz9n92^Sm_$%NJbV(H(WHT?TrW2~!>y@;M*+n~)#+5XjFwDDL*`Zp#8{)!!fT
6198 z)=)4)qqZFywN25eZH-24uZ3k;u8=cv-H~7!A-Qk(gE+{6vO;I^Pp`JczbFM>@e6{)
6199 z5<kHZj_a0Fyw!i4*K8J2pJ3T$b9JG|)Ou#w==AAOlG!URieS~xM0K(u*XE<3{31ce
6200 zcu2%NDOaI7=+TV+H63>aEQN8!l(>UH;%VM>Z8=E93a#K=s5sdRymF8TVrE0=JnOT8
6201 zL|`);V(DF<4J0C*+3ePbt*AXYi5G0J4b>OeuD`%X5~^F?mZ?!&Wa21+nP-SgNih#F
6202 zNW!hOasi2ZJi>`2?(@)~1=6TG%e2iD0k)k2+f}EZil_sYkwqY38NDU~9eusVDglY6
6203 zCoZ)7PM-@TTAsMj@c;I?K%(J^%eE5^?c~Mi43Iej1)WIuRwQ72JEzX+K)<K-+;pO-
6204 zRoqCR5*|0Ivc=>^0+sQ&QKiES$rp=}u<J0-Cc(N!iX@J(^CcJDi7p>)9*TiPS2qdR
6205 z9!fA9{z)|Yx4+`9AQ75iA=7E%v2T)T)NbK#MSQy4JxRExv6&LB3T&Rl{=+S?uMVfq
6206 zW=f<EJpT|u<YXSUk%asNF+Ed)tHBGh1gkikDUk`_sTM(E0+NuQz=T263i?r`%%;*R
6207 zxZP_v(rp6Z)q~$l8qdXT{$zaHZAMAs+4Ds*@Yl;3&#PBRx>3%y7(5p~SDvrpB`G|=
6208 zwfXS~^)=zg`%ZYuY4d-D`-yUg19yLLtH<WY_3`iI`sI5$hj5)CZpZzHWaW>Na(W*k
6209 zdSP7BHh-?*xW?{r1o`%5rG0&8U)bS_4)wA1<NGt%y8tU_ESGKmuf@Loa_%XMn_hCZ
6210 zS6g;@ObZxzFi~M0V9$bf`O{?3IY-XCWe6XO<&4o4W3kTl{~xKG&#5VlO{p?i=zVtR
6211 z#|o0R`7yY>FZp}qj8Vnr=dFqY4u2iPb-z#VO#fZ(DfH*&G}PDS)YQ&d*f6&`hdw)B
6212 zIbzu0g*CMe%LmV|ZOEBj6QK?F4$D%1iEu2enVmC#&YXB5!y!LLQcNPJwmMQne@=FG
6213 zLgt*Rx+PVPW9<JwhwDfm6{gJ!hi23M1CBHMl1O#^#Z^mmYTlgM$ig9-Zm6xH52<UK
6214 zHwYA1Z#XCk#)*Sm6uD$cb-iW=Nhk@JTRo3p>grU}n#Dv?Z&x2^j|i<cFw`YkHhlrP
6215 zPN!;W=}dhvQnRR<C=$nCO0KJ#ThmZKc+SF_>RJ{-jl|+a^4Qr8H47tyYidvTYf4O{
6216 zv%0RXmYJx|Ud^;AWSC~rRU?{Iv0sUzi$9H4a;<c6`pE+^=p)$A4RsB63}pu!#s)jy
6217 z68igjIl=b3a<|^~m)pjT8RrC2+_dbJKw7XvcJPAD!M+v23&zq<9(unQ7}34>yz2%}
6218 zNC^aw35;-qXNNWrK5zr2&%2zdbC^1Zsj(y_7#hI;>-gX4{BKP#QV|?Zs(-h7UhpO7
6219 zoM7irCgE;cMcSWP=uN9DsB9A(_g&-V!Kk|-xHK@>9Wy~OWv2wwf=#R0lr?U}gp^?L
6220 zP-8_(U>K!;aK;8Jv(F#X%8bD-**PTaI>q_9^X0h5%f?LC64HX<TfPdOQ*nBjN?*c;
6221 zcACe6>P60RyMpIe1drYoJm6fu{)y4c*8cQ?D2aN%@ik)ox%=f4!48|rxMRq3KRG9O
6222 z>@6a9UfSQ4{7@t<*!~tOaM@~>eaP9RXs*<i?yg{m(3hcZgUQwN&Leyq8Se(4azmNZ
6223 zr{|Cj*Q@j%H+y>B#NEM;W68csV!OXFLToR%8_J01>PD9PtvheR3&D)nCQLlFVOdH_
6224 z@at9c2)!-kHKPByB3sd8Q&NMktx)arP|9l)#*G;nDh+lDbtQ?<u3*KFr$mlOZwiFw
6225 z1x9ucHU(%;rz;wFg?={pyb05%PcNR&)eZeLH0aQT;tAC$X~E}|36BOsUj{o|erG5*
6226 zkaz6d;PXx-c>C(WP?r>azAD5K@>7!3z=eO4(k}Scs{0B0V<2=3C7xTw`I`e3!H$<J
6227 zXI7+znnL-r&tDe&3&p{XRlAx(cajVCui~~?AIQFM!Yt*01%a$%r;>)7ly5$ELmYa6
6228 z4^sks3VybVq`Qi|E-=;yzf1s9WGTk$1NR4iyE-tM?cS$a<tjHYh&=3uZVB#i&Iyb>
6229 zy8Nee&RFy<<v+VJw2SO{H5e#%gC~X}!LJ$vece#+rqCUf`^YM8yypX(iGFAmNAB~1
6230 zc?+7RUv~P0^Mma}UAIJok=KF?s92X>q1I6EV7h9dUns|HcHg67I~uuhA9FW^-Vgr6
6231 ztq66aK)IhH@Rqzel>4MI?^!n#3H0q2ydl8(53RnR{x9c$cdWkuydkqgUo8uctq7#j
6232 zT%fm+RUc_zu(&Ql8^1=J%Hnfr<JzjZl}jRZ4s94)Ra5I!s?BYAho}0QORFo1sgl3y
6233 zzT^_hzsRYrs;{hB!ebucswnMbTU9TEjuTl>Q(w7YaebtcH**E&oP~?)s~r-VM}?MD
6234 z(U!OMBHQN|p|XE2an;n-)7K};!j<8|DQdLld7zf;@U5O*MPip#&xtH%Ym`w_izXLV
6235 z78aBhI8)CZKcRB+xs%VFNCeF(yw7lDZPg+wQMIt4T4|tBQx&6HE>tM*G+VWdl{4;C
6236 zE?yF;SzOEL{OU+0ZBwR{Xkn_(<WDMGJ8y11pQ@KfoMrV@m3m`e<yB=yNx}FDMP*K8
6237 zainUYWUA7%!^^_Ov=6WP#|=_nGryKL52lu=W2Fmd``d-p4*Pk|;s(lByX{u$-FB(U
6238 zi|5T#4YYXP!m9a(sD@e*q#Ai%4cW8Us2bJ9cOvb=tV=TQqN*iBYG_wxQl$4ub}CtP
6239 zJ?TP|ky*yh!b%RcY$c1SoYPQOIcM?0hD8)cm1<@q2cy}l8X^n4h*(@ZuV%iux87+W
6240 z-FYLZDsvY%&^FN2TI%<Vm5Ue7<vP~0y>hOrUPkk1y~EO+oCS*)Rp-=4s^(mjbMEAV
6241 zlALAZONw&hX5Ac`G07lqB{ex;y115fkZG4z*DZE<O+XFd8ypkxRNW;czH%WgE_CED
6242 zXZ><j@kLd27gg8kP@7UXi6&~p@AWz&Nr2wPxKbjuzDjk%NFARzi`u4s8L6ROiAa;)
6243 zpyDD{C~ulQw<=PlDzdmiH{`{2H4%zv>crCuCYBdfmJ}3Ep{`1?E)A-z=Pt<#jE%Rc
6244 zx2vA6{LS_#(KYi_Sv3&Q&fI35q{BF5Ed>P)AN5tssw-7TtfaUg-|$|3YQ5w{F0EWd
6245 zYfN6R(dN+HeO2#WNQ)*3t07M1qQ!HmEh5zL)cQ4ZBIG67^0|(ns=7!eFQwSzITSC-
6246 zSF{;4H{86cMKudAp(v%LVRgM~LN#3RqK9li^j7M@i3HRvQNxm|*Wx8q(MlzowURh?
6247 zz3NC52W$lO`Kr20D%FrsFJ|$ep=zw1&GD}KGkdMFaxT}<453BUi!f%go4C@ffylFp
6248 zCl)!vZ*ZA<l?%AjapR~Fq;UNB5*q5*HL4C&rA2dxSI((gNZytjI5hHzV=8rIs(!21
6249 zt7<vOoORWU7DsqUnX`<g&!g}?dvbZ^_`JN#;n~Bob2EqJ=8ec5kvl4L@S;dVZS}bM
6250 z)wQ(Y_#8@B)y-KjjxHVsj~JFYcz)*KbBAOOo~JtB;3ah=l*i%0)XFrXX`fX^C?d(y
6251 z#TVC_^Fehz+oi`9U8N<}a~PrS=|!6w0;R9VTo90gswLEd++$S_Qe!i<8AVFvvIuV@
6252 zkFkO~GWT7YxX3Xz3)PhcYRzNL&>_?&Y^ClibBD9Pd3LLwi(y*XL4wGOq>b3wn8;$a
6253 z-ma{TET)clY31Ddh>lc>$4kif%cZHDB^Ot!VQ&G=m)uqux>;w<Z0Z_R3ANDY0I5=Q
6254 z4Yd)|3muM)MN6DYHLIwxe#9`+Kd)-x!r4?Sl`pfQ>V)hPBZxc|G&xh2%&1fc-g2I&
6255 z;kkM?o=csOQ$zJ>m_7~ngNehop|+vET5-<ii?7O|L!3F>amhv=oK=X9pLlLjMbUUF
6256 zU#l+C)C{L5WuA%)&z@2+$-^pXr9pnG<aK}={ztMJ>K$CQh9wwLxT{JhuCHE7f@QFs
6257 zS~jJKq><q?cngDG0U#z8E}l<8UZn;+{-l6>X@IMx#yAQ~ndm9NWdtucPZLv%N@d2T
6258 zV58>Y<pr6hJH8t0mQ>ZNfm3xOH5Dn_X&zMBwB3KhLN(&)RRu;(=j`$0M`sQwpG|Xl
6259 zgYIvGM>MEZUSr;f?A&45!v<RYP+zxom+Lq8(kYI+yo-B$r*@$YbZIz|@LrOqeqVZK
6260 zdY5YhXQubKCU|CgW=qPM=>x7#ElAJ3BCQ~OWK+Ad(;o~5`vf|qk0h)heE{(gFO@kn
6261 zJ*3`#3zMvcB5yIDDX)d)T^%e;&%7dq$~2`;O3z);A$>qWdS(F%7k0cb7NDYhhxk#J
6262 zL5JE)@JP08x!est7))qfQIdNkTDrQ)K^M*cIfS%%4)Qg0f+NUR`3a67Uw$Vzf_!mr
6263 z9lRMEeU;Bc@f%+Tf_$xS9lR3+^W&!j%E!V(H@z)xouv0<li+fr%E}EoiJcY1JCkwz
6264 z*itSwBk07vxTP3^vhRB=H`kYbU7p|w>fOrYa)Nqu>I69bINdt(R61FG)wbg?B}Pyx
6265 zk@e$~;2f)o`1wI`BAjnbCBh>~@D+r2rFLH<A&0#+uS&vyQxg2vB=~QW;14IkpHG6n
6266 zoCJR@3I1jh{F5a3-X!>UN$@o4T8aG38%!j^k4}PTCBgX@or&b+CBa80!N(`TrzF8I
6267 zOoG=Y!5fm`YHrupquFzKt>s^=cnhU$T0PfCXo<EYJI~3UIQ}%6H;sj-eYxYUD>V->
6268 z+p8$Kbcwx^Feg+s^{H!hLStrMwHQsZCREoaYH_Y6?zokad<;ewU?iEYWA(a^R{_R~
6269 zjIzx2J|%fIpzlI>Gdivj*ckKTo|48L0Lhf=F<FxNEWCD5#}<9!JF#k1qt9lkV-~d=
6270 zAB^*;27I-F^L9YMcMHxVxV*?il;f<GJGgw}&49p<{i7J?xdnKC8D|*h^#Sm?25!oE
6271 z+rUpW_%mcGWH~1p_y7aXH1Glg?`_~q4ZM$mUu)ne8~E!6ZrY<ipF?~15HJ6Yq(447
6272 z%hb$vX3-z&JKDhe8hDj~_cQQ11MhF(jY)9+LIoeJ*W|w;34Wq137CHX{lU(W20qZh
6273 zs|?(<Gh*N-|E&gov>``*W|7jY_Y?#F(BMDS!1o#WAOjCdP_plNRgz18d}IjD@(0r&
6274 z>eb7@vkkn=z;g_|%8<`Gis+Az1qQz<|1twN<v(rUY$NQ!9`mq&gOX0WZOYQiw!fo+
6275 zoAP@l!ABZ6uUVjXfq@S(@P4wiW4&g79An_-_;7=P4>jbh<O<PY%emgbO*y|Y@L^OA
6276 zc7AN&!wvjv12_FJPL`Ui*X*ai6P%0j-z@s$<7<PzAElx92Lm_b!R@4qdHr3dXwDYg
6277 zZm;7Ees&elvwZYR!av61*W9!fQWE~@25$OcnSq=2T4ms7y{-}*{^7Bkj~fhrGtO@{
6278 z__<#9NWJb)!vBQD-$nR$CE<VF;@_pLp>6k)@PB3CW_{hxx*)fUS>K}s=lZh!3pAT^
6279 zg28XrH_O0HKW7`bIp2vmT4C!xfc;FQ+j%%P#=x2n{J?SLVdI&i066we8erkrWkZHf
6280 z6}Mut;uN<jyelF6%$|><^vS~?7o5j%KG<)}|0+9{4(`i*z#g5VUHXM!e#m49<22;l
6281 zDRRad{49S43#6l1pFF(}$@*Zjh4&P^+QJ_a`<GhyPSLx@!r3l9uGA+_?_DD28VesH
6282 z>w}+JIMz3tEc{NX*X<VGOYFJF!e0^oKUg^4Y1v}o?}|M;EgW(6hJ~Ld^V2^qe5~Lf
6283 zTX>74zqW9mOZW(gy=dQmNxHp--ze#x7QRl_D}62eH1Q8#5Agx{xF0pn!ujnJK8h{;
6284 z&l+~hE&OyI4CufPCXoNS#ML5;zew!7#KJ2@&N>S}Pwd%f;Zvo(Zn5y&Wx%-4!uf+p
6285 zd|<B~*!ij0^Q^_+TeCZeBk+GKeE+oguMvAbvG6~L{U`@Ha|BP5Gw}DMzjU*3j8mBw
6286 zzFzbWw(zGVJ=(%Mi+|3xaQrN*%)*Zs{wfRaBY3Ta4-|Zbh2J1{Vowy*cdYQ=VDVon
6287 z?ea?t$7US&TKJ>VzJIjvV?^&(3+FG9sYBuv_S`J?bhL2H3&&Wv{w^PVFU!LDz5ySD
6288 zEPS8TYpjLu61`_y_zJ<p7Jh>Cm&q1>fuzeU9P8BcEgTy+Txj8VXLFu~&k%bSTlg2c
6289 zy3WNGo-6#9TX>z|*I4+!#XrBW@ODz)M=YH07xA&p!dD9aix$3A(r;RLPtm*2!mkiJ
6290 z0}?NYlRrs1-NN4xImcOek)-=sIPN1)v+#Ce$7~C)lXR_xPnY<=!onK_zs|x-q+a)0
6291 zc$(mUwD8xpo1Lu|j{5w=!XFa;HVfY@>3tU7BK?zIbx{ZWjP*gfg;$IG<18HQ*U!S=
6292 z7e5TK@Bxy>4@jZ+R>7xP{FjN|*%p4P)Mv4U50m&@W8r<JzReb1E93u77XBZJhdV92
6293 zQ1IVd_>*Gi(-uBQ?D>m@<37tf7T#0*hItbHfj!?@{II8;)C2s`d%T6;E`A$e;m?TN
6294 z;TC>_q|dZ)$iLXae<$_5&cZtgj{7aJ6ZLw);>XSgn=KrE-f7_{iTqbB92;1?YvHgz
6295 zP5cdeK9Kh9YT-KsKgq(;uLoK97U|ccEPR64d6tF$QsiTw2iSAJ#O;L^|8C)5WZ|z$
6296 z`(A3{-%I*R3%^U^7Vn}%?+1e4ZSlV>=|?PlhQtqk@(DTf#GV%{{#T?u{%zs-KF(eX
6297 zhx~&UUM2F|i@%{4@{hLg%Y+}lApk$*WBvpV`_HoE6iIrTg`XqsGTXvCh<`8-L;e-w
6298 z=T#Q}8xkj1S@>Q_V`nDFIa%c2Y4QI-@CPltM$%7M_%^ZUc?*Ys{$}Cu&%Z1j{{PIv
6299 z-xB{Hv~Y|I?PVQ-deK8tb#%Az45=5^S>Vr>{xZVihkptz9R4}a!mp9|oNeK_{#<0?
6300 z_-<U(!gq-r{GJtdUL*G3YVltuetE&d!&0w*SolkVe{A8>jLtp_$9NK8L+F4#SZ}0T
6301 zIL5K#EWDSrV?PU@D)ky-;kfU7x`pF9@Cpk*P1=2f;M^Ugs><#M4gPe6=zo7SaK1l-
6302 z`aW&o%>Rm%*>2#>4}ZRB;LJZn`r}^=ocXbSd)vU7|2pBv{b9~#99vfJxA-rY${jFp
6303 zmOoI&yLQI?VV3i#@OLtB=5G?c#~3*CA1D4i-oTk3?bz4AnLkt7_Y?zXe$2DO44nC~
6304 zo*rf3%wH?^k2i4UzeMDR4V?KWNxYtC;eABT5(8&B4~m=y17|si=hX(z{M)5Jt~GGx
6305 zUm$+F#=w~$^Yo2^GaI}9Hu~eE)!@fHQpSH{;4J40vHuYZ$NaR#!bizC@MpoH_W>48
6306 z$14Uu>&5-bcMY8NV!rv<!hb39_geU01>Y|?^loRRbl^w8z{5<?G0M0f&U&+?9nZAz
6307 z8G_?^0p#Gfj7x;y#+Ms%xV{(CA0Jm5IP1kYyTQV-GaY{82KnfZn=Ssg#Lj0dTn(6{
6308 z=Xndqr|4c29P;rS%YPXBZ2ztF$H%7z&i2og{{M|72fxYeDmTY5o?IsU$6NTFg5$XW
6309 z_+Jnl&jny7w&N|f<a{aoQ!M;wiH{kALk{jYt*~(XcC^Wm!+zM!PN3sD17|<X7Wtbj
6310 zIry#VBNl(N@Ncp3-wOUG3;&zoFIn<2etu)&cuy^djiUqg#r=eH1c#sTd~T|RFO_zk
6311 zVc{PLUTxtQh#d`rLvID<M~i=>@c-PxKNkE~7T#IXcgq>_u|4fB3qMu#zHP|i@pHN0
6312 zA6q!a;e8f<gYX}lq1@@MLw3nHImp5vXT#_iZQ<=?{4W$7_OB87a}9nrVY1j!W8iE*
6313 z?yJ-rII~_U{FhsJUrAqS;4FvVG38^UfwPENlD@&fng1TC?_Cz2BJ<S47LN7F76WJb
6314 zJ-IW{@vMQf{Bjw`UNUgz-z)sD8aVS`ChLm#Ec`6W<Krs}Kd52npn<deKgh$hpy=U#
6315 z!SbWhF5N5~A9g*#z*){GBBzgmvmEr(K?ctJ%Q%ycJOgJ4>$EWj&iwZae~E!JG*{Z?
6316 zd;@3x<K>mjN&{zptfOiSocUi9{#pZPeymFyEgb#j8VgUCc(}#FQ^d~SSUBzjJZj)<
6317 z&$nXF4hvr;52)TWaJKWe(!bs}aF%nlJZSycz?mQSCB8Cn=6^!?4+xHaiai2SrJXrW
6318 z6pQqu?gq|sTIJQ%6D)kY;QcK8L%~lK9D1<_!6XZxF7>Uk<nX6s`KYt-Lcv#9_yWP#
6319 zS@Ktk{M#)4YlZ(li~l#m|2GTYBKTfQ&hJIew-!Hkne54pL<i=n*M)zeg?}&jP{HB1
6320 zpj_XLG5EQ?a;3c{7&y0=`fM7VOAOrPpKjpH|9lVnN5^anA0Q9#8w9uQS!M9E{3T*f
6321 zi-EKJts>_J3x8kmn=Sd+O9JBri)G)9q(45MFyye_TSf1m44m~I#V;$-@rs3?E%=+3
6322 zUhGZrjm5u8`0?sE+VLL2+e`lj{+!_Hg2QjP|DI#v)zZFWEj&}M3(75gnefjPob|FF
6323 zc8ebt894jlGqGoxg-@0jdRALFfAy4)b%Miw=)KOuFBf}SEgbh-?ziw?2>;_2jy)9L
6324 z6de9Mg<lS(V~>ST68vjR4t6s<O2${nSt9($S@?&7pKReBPtbY?2o67B@54D3j=c(3
6325 zTXJTIob?udncy2O{7%7dw&de}@$Cjbw>zGf|G~hy-JcUVPgr;=zXV6evlf1a;4fPE
6326 z9Kru);ZecgvG8XEe_wF;4STGdDDx6<>;`zc;ApRJMb2akU%@Z=(otc_!F}O~#s97F
6327 zH(LCUNdLOa!k-g-hb8BvOr_R&&B7}Lf5(#ZwaEF%;OF)#k@enw1LyX-M&!6Mf5H#H
6328 z6TE|k|4r}=!QoGAA((IBHL@<fz>?FxHz}uMu7&3bUTew0o;J%2ey-OBsn-<-&h@Gg
6329 zIoDeFuLZx!!l(6NYv_KDh2JOmuPyw5;J-C+)1F5Sob9>mWF_9&YT=W!H2x34T}pD5
6330 zum{fv20zQk_4PgjXZh)U=^q`3EPRyU?PZ>a{59Orbo8}w?A<e1aAsq@xc(hy;H<Y&
6331 z<ez2XO@g0m;lCD~zr)D~?72zoS!LnB7yJ$jKSi#ipE7U`wF_Aw9lH#i{rRBq|I5Ic
6332 zAMcBPV&Ke=`#x#1PGPak-$mqiF>vPpNaXi3aOU4de|!uvaOTI}Oj88sYO+6H7XQq)
6333 z@UH}4Xvx9eNfCpe+bdtLzt$Q!%g^mc|LAD3@N&U#u<%O+zg2Lw7xrMf$KYqZOGNLZ
6334 z2F`k0Mb1_W-!Ax{E&L<FUlkmBv8&q`7Jr}qTr0ZnvGB7656HR?e!fWXkl>JyZzN<{
6335 z_#jz_Pq%Qqe{!jXV`urFS@=&y&SndLOYqk${QXp2uWu~8PnyOD%Q_48j}?5hg;xuX
6336 zbtw3k3tndN?-9Jp!oL%|*225V_33&8=lIXnW;(YRILALegz&J1SBRWvEF9~cw+)=z
6337 zvPk5AXy7a#9|AdK;USqHd&+u~{lIo^5IKVkoaJN)f1!or{knM;jt}hIV&T6LIZs>o
6338 z8LXU+k1YHbf(K=ti1zwS#=~3-$2btSaD2LBu7%$t_eHO@@Xdn%-oRPqEM+BK2N^i~
6339 z=Ud!&wQxtq!`CdlyWn3KxKv4L_|Cvt{siIgF6&CPmzd-9H*n_1_;7}WUn+7YTKHvx
6340 zPq*-22wrdCY^OAnbA^Gk-u=S=QwvX(`?0rLcyGZs8#p)l0{Y|Q1p{aK1BCy53&)<6
6341 znX+zW8~IXlp^PV|TKFcxM_BkzWt<sp;d2Dfw{Y+mS@<Z@%}23?XUe>Au7!iY%);^h
6342 zNktNTriH&Kc2*_9Yb<=PjAM(E;B^*$t=PXT3EpVo+q4^;%Po8{HzpnHEgbwU7LNBx
6343 zHd^=}WIVai!ok1E!tp-ItrlLY&2jFsaPZ$};Wx_o{M#h>!xp|m<Zn)bZ?o`i5}!Mg
6344 z;4fM@=FL|u{8jPK>lP0Fw=Ep+le}x;AB#O7S~&O*TKMn8KLNS^Lw^L`-oif-J3A-A
6345 zkG61E;-_a4ytjp857E9!@WB>7OWG?h2|m)ov3?kv1TVC3yzd)Mf}d;QVe#kGB>4Fj
6346 z{<`$*SxNAD7JjbC|49;jsfB+p@z9V2UuEILWgfpQ2_CiZu{^=i(UJuJnT7Wg{+}no
6347 zZ?o{bWE{IQ3I2eEXNdj3OM*WtlQ*Au3LGfwfo*aIK2p;Ajdd*Njif(5s$^mXf0^75
6348 zy(9^~F$sQe61-P$tq1b=NWYbEQTKXf3RjGLEyD-9SGt@^<9AUuo~d#*ugSl}!f_q_
6349 zgoWcdrjuQN$s*dUiO!KaeO>^nu6kirc7*rR%T`<UWY4AzqZE+cP`j|^qH5atD_b$u
6350 zE!GVB%%bwLM^c`Gb&_^GkmQ{D2<Nfzxz)29=F=8L^A?i|MOV$9O*_lQWYaE8G3hGW
6351 ze_%dsHYO#IG6d3&y4A=gTO8VWVbLPmt<K4=rR}k@X`e0H9*ehb(pFS2sGL{Fo3#Bu
6352 zI5J5Fw-wqMBJ+j7`UyDN9cd0H?(+En<h*>DCf3OK!F;SohI6&20dw>dT)G`Y>Zp_T
6353 z9MU+m4D%R736}Z4md~TIiR%Aj^%qHbGo}f0mW%zloG=d5A5cCKiTt;JmFCzWjO;&d
6354 zBb1lRcxMt}Z2u7YGmm>jf1Bknlm|S63MDF!=k^zxLWP$hl)p%58ICwh9sA`uIP?KW
6355 z8fUI1WPwMWCD0y|aTR$s?{dmW<iGWey2S3``po|0Ar^Y!zbIk0OfK<Q4*z!?{EkPb
6356 z;(0ewMxydp4%H>@?2nTAZ1dhoa3cFF9@6|<^hsS;@qHrO{`(2DWpa^07w~`o{(?@$
6357 z^WIGviS+mQqb`B?W&d%L*!mwQERp^hqW@N_W7@ngCMo}eEVQui1+l5aF8?P&6WJdY
6358 z`_ay9KR=SP?SF$XmWg^2sgC1hbX_a+J8<a7`F+YrRQ{G)T|&YS#XVo4{AW_$V-Vsm
6359 zQr^Z<4tS6N#_aLubtxaR3ZVWde~^eo{<~287ZyhLANvyJ;a7gVZZ)wgagUVmZ0Wa>
6360 z32kQq?<`hgoGz*Q%(p%G7PPIOn<tU}FCw}e-jC6#_*m6j_GB;4$<#-#ocW|_{eQ%;
6361 zVJc_D(A<$4xv<0PqKRh(T)#%HbGp~Q(8uQmpZlqNMds7qIz63&X$9rQ(XR{2=>Nf~
6362 z;pP*=EekUaWjr-Bf6c)@k<$FN`--ElHuT+-n{m<_E;e!0*ULI)JRB@;+Tj+gKkHDq
6363 z=^2-~*Y1mSo*4b`BjyRO+Y<R(!HzViI6Bk0U}nLLf|&)go|%_%QX$=|dw9GXZkg(i
6364 z?bC4lo+0x#u)KB!>(f|XxM`c4@o->lpGeQOTOvn~?a=V9mQwCZ8QX`UjO({#JiI0B
6365 zZYz$KJA3}MVP1B|No!fPQ$97^^huBA$^lK^r)FHqkrjPC96fL->sij7x1s5~E*a|{
6366 zA%BIN)56WuLV0iQJX^iD6po&q8;+hgGTgMiNA&dzW{SPdX?br(&mQEVP2U~LSo;!*
6367 zy6n3H^grX;D_GW?ZQ+(lx#6b$p^T<J1l*G%O2`vOXFPoRJ%Rl7t8yb9G9HPf9h?`9
6368 zxCeI>rsg`)a$m6cx8=-(P5ZlKTzL*jY5Fb{ZaF(QqiHp1+P95lo=fPuS0cw|Je<C7
6369 zTVVaUxsguMmq}<k3k@A4d3kSorYe6&-^knY6cu-#<_LY9_jS^3gldZ3aP*sSG?Eq4
6370 znaxB+x3%>kZsa$ohok4_Mqds$uT0+`j;;*trz(@T-rXM_xGOwxhr7G!o&D^9%a>6p
6371 zqVo<FME5uC3{7tCls0PT<Y*_i?z6V@l|+hzaP#Tm=&D?jmd4UtlD3MZeMr*24G(-V
6372 z>~0NjZ42%V-`V!c!9$1q_Vw$Mw?)~is?;`vn37}_B+u$cS<UIHTFsI4AIOD2v^~n$
6373 z>10}SB#jXFhqh8eD0p>z6`WTvtvGt9puC{0IQrM}!sxS8x4z${Ao^lq^qKZwQ|yJJ
6374 zpJ^Yi+mf-ih}-MU;^_8_b<c4djHEPj!_j9l)_zLp=HB#gV)TP>bf?NIXfDhe5WOg?
6375 zF#2V9XHzZ};bUU-vvBmE(eVQm4+&rQcR~xB=VXPWuNSmjpY`|e$?e~@zxdqdiw0eG
6376 z;Csr<xT2B%7d&}@oc<(7>t;s7E%mwKmK8%D<L&7Rnm*~L1QxEJlN-Hg5XmZBe^K6!
6377 z!c%jdo#V4O&?%lm=)?t;&qzE(|1mKtk;Jz2Ar;X#{1#9$^S12S7X7&C*+4<`(>?2T
6378 z|3@_PT%nj)eBKsAf###Sij1}uBs*_Q^y4_`ZB>XSKR&p9xN&G4i0%zv_Q^<6G&kIw
6379 z(suw?CAv0i00DVhn!a^2u3^_^Jp2>4IQq9yZ5dbhrexCr!g~-gs;xNsZBg{uNbhh<
6380 z_frP8QH-K<tlL6OH?etQRw!d_FJdjqc({LI^rOO-hJ#z*=~B>sdqL9=#}!8Bay~CD
6381 zxid|SzBH+2en8ilBV!O1e2V^bOoXF_ru1jSTKYr85RSeWj^4zksyLw_2}en_mc(q$
6382 z1zFLetmc9NP5V=$MFTRfoJ}?K#=C;1gTahz?jl7+&GQ3f#zZb%knwzB^aEHUbs10P
6383 zS|)v0+;U!8QS_ZKxA04fWzQJjzkVY~|J!q{8fU`I_pyy=ws3S$c-@-~ZFyV5&DSfR
6384 z&kYalt{Nd@-DFY}zHB=;O<cRj%YQ`4FIu;6M`2c`ld<+gQqxj&U}8%oD|1rI%637W
6385 zpYd>~tZ>W9tS$wQQe~aTc(~h4tj<$R<!vc$+V1KKQ^78qzo)E;(QgzoY19u5PZzEG
6386 zwBe-YvaHag=ois8ZAOYJsd(B3Q>;<Pr0o9`L_hNLqgyi`*`2p#Yg-r1mr8s(m#Rm4
6387 zHTpS?A=DIIGS>2sm*Ohv`<EQo_Mm1?$ym!P^El=`Z;~X+d>~=wQ#x})!pz%>=lp{P
6388 z+T6!@NfwU2L8FecZ%5$?xs?8>FxoJv?HpF$au&}+%VyFb6lXx&c~r-6^v^oObkgaR
6389 zQ5gM~pP{7Fpwjj=4MGLYX9qHNMT=;Z`KawZ0@#$|Ij<>eU<#YS`P(U9wQ<{QvZt7e
6390 z7B`>QVP}y{)<rZ~mycw|n~71W(Q&wrEZg7EeNTTGN1E5DxTJ}=TXQ%o`cmFE^VS_|
6391 z_=wtT)XNR;?tNx2jcAVH|K_VS|DPI`hnw5+Qf6Uz-M&bF%!8x8h>Qt)LK{Bkv4u-y
6392 zbkzEzJB-}_grizq^akd6X5NNyvl@16+*`kdqsKl|qWx#Yk6%9?*S?OvM&2)sZsqBw
6393 zD7s5KSq)2(&f(~`ynW&5=NfF<9wP74Y6kOHc-^5$=2Wx3t!$Zyc$4~X!zUN)<;9Ob
6394 z-|5NjK>1W!3g*2+gX(e>Jv6LkJe)@B#jFcygzY6G?53;*l$-aa_-ky3$RJwG4H%ml
6395 zDI429QquIDo3XYXaWs7w$XI&|MJcUkrsTasi@nz~PRgea6K>WbXu!}iGuC}eF-8Lh
6396 zt2G7;?eCV!t{M<C9zKhR7x!Ev?M}U%R!=LlG9Sw)C7bEb`6%OSjyW1PCc;0;X&Gyq
6397 zXp9K+IITtus#RMdMKasN?4idFLIgYZPhTB66f=_-M|Whb<(KJYg#HI+^5&@n3Y%AC
6398 z6-67fn!Zadh)$!?`DSX?Ls@@idszP1aT)8bVC^l_$ow*PDc9q*&D{EJPf_UW`V_ZJ
6399 zqlo`Z{d7__7EdCrRIp&@S*lAEH8*Azv|OoH0sGruTw2gPZBTJ^cR|yZKv8sSam%vY
6400 z;+94|=@+h_nANT@nvzw}^tsIb%_&)h84nX&w7xO7D0<eQqV<#W#_uRh%Vh;>9Z=ld
6401 zJ*#-<6&x*mgx9^&(7EjdGE?GyTe$gh&ZI8W@E_&OiP7IPkoO8ZbT4&N>S=khXrPwq
6402 z!Lwcu9eL5ui=#Vt=7(7F&U_wHoSpoS2BjT}1FH>HO|s9gDouFQRt3$3Jw`eX6+C)?
6403 z%BiK!IJFA8@(_8kuq8hb-A0~h`w#on=x@5GK<=Kqw7<1k8BdjET^Me5_7#@6p^SC;
6404 zT)pULM)YK?<;^Ub^9xbFZH@{Yhn$_enZt(orHUUncc3erl$Og59XxpOo0og<>br)H
6405 zNLzF(4Mz8_Swo&I+!}5<ClJmkd^x(+q3-=gFg);Mikm@gog^Ng%26_<dvg%*)n&M4
6406 zxtq6dGv7GhK_Ri@tX$orDQbowYUpY$Pg%l+CQ~7f9KL1NwpBHa?(ga{K^AF>ySRC5
6407 z77rSIq+d11j~B%|Q?f{oH=jOAwjOF5M%yFuct`zbQgm1r$H3>bL{&!mBb4X2Q>j^!
6408 zDt~~KYx}~7(XaJBK}ysPPzh?0vGzjoV<I_w9!_RJ#@YdgDW_Jb;kX5A+b2{dz<WMa
6409 zvXL}ho3Zv8W=v4AwqH?(V)g28tZ$n>sVJb<-VrbtxP@6^8ba6Y%UF9I1?HO5DgO3m
6410 zti6J0y1oxb{}!I}@}%gq#dF$}Sh{=|K&w@{QXWejh0%AgZuI&`%On~x>vJbYKUPCe
6411 zQQmv1Aa(MBjO(`-eDfCOMOuo6X~^!RrU8<av2GEGq}6?eF=Wr%&^&%n(|$MOigzdg
6412 zTS^X+>>-cwJ-u-B!?1)=cqc8hIG(homa?oakMXUsaP$Lz_#*={*4|7)GM*Zr$May*
6413 zr>+{j!*jmYE5Pv1tsIBcS;^><ye$)3CT3+Skrn5+O;XKSNYl`#?qw^~_?EGD4fmv`
6414 zXL4yI99p!NT-cwuR0$fK_LRwdLrY9r@xLg`%uF&&FEg2v<sMHOUBYwzih-i()0B+$
6415 zZ*U{i-4ajwp9m;!KDHp^;T`)5&vf%6x9bY<!uxZwOKD#B>FPhXwGyZJxp~DPs!oPp
6416 zn1@@+DZq9>P20sjA6?-Mf(*4R4oA1DN$@GQQ#|WgiDqpZt|X9On(Jv5M(abpLgr=A
6417 z#Y$VtlHS^*N<>>K_`OvhO-XP=!4up7ZST_X;>E9C+Qc(Gp~j$mzCT3G`OJ_Vg~5YP
6418 zTOElnY@RU4T-dYyaUO5WK~t$#^2c|5z5be95?=O61+{U^^<bC)=`p)Wa=4}75MAFF
6419 zN59JZbRsQn^3|nTTN7m|$rGb{n!AyKDJ_?)Vf>ZeyD^M!+xjtvak?EeH9#xDjKVka
6420 zogLw(H-i%g?g_hl!Y$+bhsRKO*Uv9*8Jj(^r7){Y-j+$xw#P`m6W+Ov9i}b|!z~x-
6421 zsd-ZK9a%h!PFnX~WJs7hL&0Nwhi_8!qsMwvAzC+MZfx3rC}Z6PB!MoxJ4n1tjD8Vr
6422 zekhA;NxgHJ>YWW;X)(o)FnXqHPMV+9jldsxkxA>k%oNL6JqRFYp@R~?#1>tgQ<e@Z
6423 z?wMDxzaE~E)n)CQk++O!YwohAi|$8szc1tA6Dj-2aK=;5a0ke2_;}6t9U>2``Tpd{
6424 zJzP_|YSuRt*KN7vMpgB=@tN))(K3&wr|yZyPx3=*m@nGG%~xl!?cM;@(1~2Y)ngYt
6425 zqYUI0px>1FJE+q~!{*nH&YWE}H`DtbO{RQ<CJA40$+8h1%VFdxz9n_l^J<pIvL}$+
6426 zP<v4=eT2xcq3>MN&f4mWN7IL{5;4WpCx&kteN~4(cvL($lZD0b(YElTGiihQ>Y8Qr
6427 zH8;QJ7uQ4<WY*NuM`3E_`bPWyiY+&7YQYi99!_t9@~C5s?aB0m*|)#%+|0%E#Bi$h
6428 z=*-;Zed$|qUVF#dkMgm0^qo5>Q-Ae|BqS1-R9^Aqvi~c86qghf7EU>`h-CFCE}1ss
6429 z$4EF_`I0F`XBAf*-iFZ<P|4)b=M9SvFF}Q)?Z>|LnG34wy)ajwN>hx!o|;<vltg57
6430 zruu48CVvJoa{x8*l7X505vol3z+AQmERJMOE}u9tChnJ1)zw!g=t;Ic!nde~#s~WR
6431 z;o`bXB9|<znnS&%dTB$|!b~1FbSbl+N;&#!8wU=3jbU-!B?<Bocz)oj3XxyyS*BlK
6432 zk%u0sh7|r{6@8&hc#q64Lr_dVNalx3b~=U&!;T1jF|%&8c6d#_@+&)~deM?dO#Or}
6433 zzJ5vM@^>_9Xee4#wQ%0zx<%$#1ZTj>{~w?I_Eh6@Y;^P;l0BrtaJ3quVp%fVcNjOw
6434 zq5p%N8GUnyE_V7Zoa^+h&*|IX^j(zGcWzGKOEUY0NB5mHy6;q{@8F?B>NCe>_U~KY
6435 zzk`!SuLaNyNC)2y)USr|**iKM?U7Ev4RIn6Xs1s4r|yA}PPu71Pdz6Mrlj)MI0O1?
6436 z7fL}|(=1}p<XR@BphlV*Ne!iie#SXkmda^2;c^rUy?&-&OhmV1eqOVMR?xqboc1YW
6437 z=-f4DFx7^ygy})6KFR)CDLNI>r!M-GsZaU(w1!{La9s62p#G<*{~_A5U?_?0#443-
6438 z?Q_RdTD{=%dWZjPp-Y`~F52PC^Z2CcZ>}XWr0M-kchU5>O!v_AcT8t$`g^7aX!-}H
6439 zb2WW{>5-Z~$aH=N{i8a%oCxcLs}dzT5m1Q=ok(%_lX(~FM4Ee$5({)9<g&F(bfS|=
6440 zM06tEt)`siI?>e~Mu{~#(akNU#N|5C-A$pTe3MS}aJy4ty-xIYmk`?qofzo0P~s+?
6441 zI7KCH)rnJ8;vStCq!JJ6M7Dc3m3dSra+GabbRy5?4YaoFtqD5ZpxU5EhfQ2b?W12Z
6442 zDfBH|U1@_~ac#R$Q}RacX(4Vv6+>*ciXle1DHVDO&~CcLJLV3i;;QjG4&_KwTqWS@
6443 ztg||uIGhk=Q%a|kB19{jI`w8oD#KFO(x1|oLHe$ug#N%lsPkzLQbO@}9_7bT=g~~3
6444 z5N|VOcV(V#kwwnPcIzgPHHy96l|FmB^@?5NQKohE+g-(UCyh5Vt;4b1)l7HScni}y
6445 zG}~RnbT5rx%XFruujBrz!?fK`xwGX`e^!1`zw6x<NT0=Dz){TU7rxConyzBkXk*f6
6446 z|C?}aK>D1|h}KHe=Z>I3L@P?K<`36sMd|Z+v*z5R`5Tw%^Lb-e-5=5y<de)twfvfw
6447 z2;bqTUstAu*oL$as}z8@<2{y)p`z!xtVV@X`gC^>(ULe{1zMKQxj-cb=)??FB$q^f
6448 z1vw?@l`fm88LCV<vsI$E&Y7d+6zarWRU}Mu#!^vbPj32rm#e24YD_slG3~iXaSfoN
6449 zYl&NhAJ<rg(rTUNEo^)6aCpeo@tD4F3Yn{TzXxxo{sKe#OqZ+DlU<Tt?Xo%Qhgc)s
6450 z^jdc*4e8pRC8j+~O?&E0|J1weYQ0rZdPJ4aJzj}!a4#cabPcPlU|Lyxfa=kW5?cQ<
6451 zm+7?7mGqzAvvC4Lc+3bsN9hxE+8}rPD320OSLW@?{YsZzaV@2T?Pzw=WmgzvCm+>i
6452 znYSy)u`WAG=^gKJsk9a|iZuwS%IXr=DQ!RTN?hk_yN<PK!71ao4+Vcoz=`x(GACsm
6453 zvk_TK<lU5|1gDJS5+{i*3zg*UglMe`eaQ=b$$`nr<b58SO6wAnS*eh$#L47;!NEL$
6454 z1-sImuJUx+>CJhm$Eaov^6smB1YqwtCv(ER$94Jl^eTrEKc$w)QW?Kiv>5(#W%zo?
6455 z5B%IW{O5iH{9IY2oS1Tw@(yo}s=afPS0d#k!zC$dG7Rz-r<(78@5KXNT~iKxL<|&8
6456 zBgyct%-mPm_%zo;9nZ?y-L!^Y-|ELH_h~h2GKn<jnQ7$*0{ZjEdx>A!Pw4^t`D%Bo
6457 zi~NCH$Vi{UX+Bnv9jChGft5t3g_xaR9(G(k+%riBzWd;A;+-Q0FIz(S>}Ni*`Jbx-
6458 zk*UGT5U+I3&xMWi*aLjHWgTdBll!z}<>K=ux%YxO&n%{j6pj0@i_Bbdgd*PS!B>$J
6459 z_}fn82zThIZW+D<N18pJ8;Iut%@f>Mk>+P`;g^q4n0ff4PYD#9!qwx0c@pGHdn|>&
6460 znRTN?jl1dG&gAmC1&+IvDL!<2Eak}KLy|mB@S&T>&IR*OZrOTh8oFd|mE%Uv7r{Ay
6461 zMeC59E=n3TWfOmcD))Od<rg5{7s9LFuXObS^;F3+3b#|;(m<#;-Mu@CMhWw9Zz}FY
6462 zBJoX^+(D9`+gk`v<nJJI2#c)GJ=L8O?7%M(d5yM(IOdZyj_}n=F};EB<vvfjYjkd~
6463 z19eO<;|l6!cStd9?<!?)qfz*ED!eU5G+hpR61Xux(YaPcalLKMF63fvdag&J*n5wp
6464 z@ozb~8dTPEK;n>L4g5ocv`{&f>BKW|T8QV`LF{JtF|;qIzL&UgH(l0EBI&W%Nb=YR
6465 zt0Cnv=Ho*L)@Fo`mE`rg<354hACr6%k~Q;FJbUw@lTRZIb#e<TF`QZ4tyhy(!Ho~D
6466 z7_p#wx#K?bOO?EJ#c3*cqC1i&IrDJ4y1c1jF1}Qf`+yx>Uy#q)-^=KKS<1$nR-}0m
6467 z%k!FfxF76dS=dF+$>W*VJly@f49VRfa4vplo{Npxy%s&BwFWodx`Nbl=#;v76xU2u
6468 z7@^_h@Ol78S0UVQSF)a2(1ZQrJ@M)Nbfp@(Qd&uAumit(G|C)tkA=J*?wc$y`AF?a
6469 zK0zceqh5&a&0U9jBwx&rGJPgPgX5m!x-^jZj*Bs(JB%3P&SS3s&4^H=6UxjAW%lz-
6470 z8EMv(b+|*^UmRY6->)yE9`zSurpS<(pn-={rKzi(WlkSblD5~Kvdrm4%@tT>3<x|D
6471 zeWnVQrBX0mpW@3LM6T;ZuZ)vS9)`Hx^ZZ;MX9nq9Pa{p%-blk1&9d^9MS;~6u~P!e
6472 zE@e~95<F^Lu1i>BlP{G=oL^`js-KT@*{6<BmU+Gro?%oQKWy1gs`AP(s&GZX98$U9
6473 z85GOp2sf@^doCF0aOlu+RJfgzlHZpla0i_pCufexNj9Xit}BHn*_6*b_x%W-mwp7#
6474 z-XFnp0*zW+_gH&)*s;A-ESzy(QXvxCT=mI#IVeU;Cv(P75YjYpB{6pzOr*Lr;$c)>
6475 zynQFvN)HgAu9X4~uh$*7Qm?U@reml+Iqs(KiLpPgCVYmmoJnb(6Wp?xRH-vgW!BS3
6476 zp^uy8>~6ZA#)1B{4ykvU;-fz=Qaru=XPYU#&Ta5=2e1vxyyOrqK`*whAbIR=D?~h(
6477 z6l$07OrvMcOiVf~Wu%C5H(h+R%$%9AGiN3Y)^lSfCPPWaF3Id%Fsmh5A1L<h=XLmb
6478 zq?gBxy>2;==6l^z3Kcp{p$<Z)3hEqmn(i+bxKXHpp3+<zsMSiuIh`-8aP;@8^?MSZ
6479 zJ5I9BC>Fx=4v!EL1YfE)g@h|pHRWy^*^3&B7pGsk@C>_@)3`1{8m`jq_mw9wU-5tK
6480 zvZ&z3FIMXGK6N!u^Zlv;)V%w=t0Z0e8y9N@o!;+ae-oYl)(Z!n{?1Depu1S^_wHm;
6481 z#z#K?bANC*(J8p`qm`q~RRoRY>Trh#KBxORKVl`JCS5&SsFm-?xRvj(0=#4Bf3x&$
6482 z<lqf7`b*y!8)*>MHjWGYlm#DowZoFiRDjUx{2)a+Uy+-KyEO0ui#l0wZvjw3O-W@{
6483 zSh*A>qs*xC=JKlp$J39bys#>OXfPy+GiQ`(2ZgaZ+`>R5OG{#l8R*F^>JoV1f3wJ}
6484 zpSqz(Ho3Wh?-NP`L(=-0($ozomewawOmw`r!0_Kmn-sY5f0E`6I-gRT|CvPaphJC;
6485 z2c3<t)2Y;);im*b`ThiS0YycdE<(#8RpN`4el|-y{y1Y)N-Xf8UxKgMhUpTq*KG4i
6486 z(|J0>9qk8kW3FGej#zjLDjxI=coo4{ib(3^KL2{kxKn57F_W$#{oLy*_ese$ao)7-
6487 zuU;vChP{t)&y^2Tf`7is!?E%UDe!aorp$?wtFAu+p&UP#Yg(XlV`@6YXW^AgwXnpl
6488 zCVU<qz*mV9dwp@+5z4asXNAX_KD{b3Puq`>!#C)-MTYvOaZ%n&Rl(GjW_+n@+tI53
6489 z(?7LrQEL?*<JHpS3|hwU2hY+%kJA<880K_e3}8OxBt8%6ZmOiahH8d-F%UaLy%@lh
6490 z%MHZ>`2Hau{TI@WHeX(R_A)bD&oH|Kn1S+Hg!^(}3!Q=+*R0leDqjikmm>8&yT1h3
6491 zC_YA+H(clfQyuPGfyH!(^uM^{q8A2onbMw?2l{%*an59cPn_sD<7;RZ?Hc4~L)5Pu
6492 z$46+h2)A3Xn(Sa3<1d(c1V3gQ{);QJi>WQi1d5d@Za!6w?;zvwW~pO?eaM>Jk8%0>
6493 zPY|zydt}^|b+6#hxXh2gwAS4%w9LCK)EC%+_J?S_WCq%FuDfxwWg9g$2c#NYxIU%K
6494 zz*jP%T&j_28HKMp+&zKZlm08~w8*kRD3j!?D}P1C8kS1ew7f;#DC{H4%DnZ+CxL5O
6495 z=SrENbC-gcCxka;zo2V`ftf2)>N$qyep5WFaK8-v>wgig*F1Dl>x?vS11OQ9U`i%g
6496 z>)ktv33?hm)Zw-dPGheB;x?ncVYiGLaHQFdSe$!u@J^Ce$kGb=hGik&tn|Es8<jF$
6497 z#d#%8+`+)!|Jk^huz?9~AULb{|KqSRW)}|RD@nc=%zWpxR7C;ZE?6BqV|gR(TU5#$
6498 z+drfPzwAjO0`-G@{7b^$*LX}M`~Ax2JwUuc8e&)mFOB1Giw@Sg39g4%8n*CcQJRp`
6499 zuZdjUsta3w;N3v{YO=_Y31Var<2y$Pu1?%de>zzvh>^kA31Var6GVT01nl|(s9F?b
6500 zBZGJInT`SKiO6U#t)~P(tu9f=c;fQ8j5{{CCsmEUtB__(_=;yFKf^K)w<y>|dAYZv
6501 zpWkHn^Y;DO%XC+Xoy_Ch6u&+AB5~uIReTGDZdduOQ%2M2<0O__N8dSDx9l}94SBu!
6502 z)(dx$=|Ot!!}7G6kpE7lm5&dJkITF|viaXh9o$W2)PQOdF0*`Grk<)X-*~=^pQg$O
6503 zH}1MPpE38mAeRho+<ozYrJO<wj(X7WP*-N9gY3MGCfnTC;3e#xox8<$R}bYbTH@}$
6504 zn7l^SOJTp!`YiUE28(caZt!!Kj7#MLrH}rBA=xV3>sm1@L%!@jp6bPp7nkq4*l!n(
6505 z_Oo<$e7|6m6E#IO70?gigL?1N_V@5xC`D{(`+J!@3r6c{<ZL9<|Koae##OGxW+gq&
6506 z^uPI~QeW}u^f!Gv_1{O3W(hxhG7N(~8&ZRTVt}cScyRjb>UANNbJS>$qumyt-0L%c
6507 z>od38>BIl_;jZWU@ZWv-sC>&_PyA8CJ+j^BKKX(#=B=cTN!hFHc8_xVrg!TYOg}#T
6508 zD7S07E_6K}$Z|S%Je?rw5JFN|ryS!1(?@q4(~<8Nre+WeEsOcY>2|JL+|4C|p28J(
6509 z%b~3HDK2Mm0meHFpwhikX^S955JRVa#7Qp`b#sI19Xo<Ay|br<H*Cw0WNL9YPIiF}
6510 z^j1+nGQaC-N=7%55%OhpS0Ym(@@SF~(uT8)W4e)svDBZA^)#olg*}wzWMNNHLOSW4
6511 z5l@z4qK}^`C$K%l+AG^Vqo?*t|DMI&GCL0I$)Zk3^(sNvUX&2^@{y9vY^pLFq|0!L
6512 z-kzXTAM7Jylp!aZ9GS|eS;IVI=oJ7FO69p7^LyNQrn04<FC;*1+h439nVcLzBG@=d
6513 z4)i5*?kUmBU5bx9GVs)^E_a<kkBw*29f?7nDXIoB>IVC@WeM4$og#sgIVX@X=C9~D
6514 zT~&cTK9Z+$@;GOTTYfBZhCnyFXQ-GdVup#Ck{oU%$-EH;GbL#sd);KTdNY)$<{V|%
6515 zqkz$*)zLK`<JD3%NlY#2Z6bt0fK-e#Sz{Pa&z1^%?QzC1sd2to&8{aI1s%!L{4MA+
6516 zJCYZ;(&MEb!cfSrqH)%*>=`{djL*t;n5a$HF;z>w_Ussl;xz07^iw%M!9j>|jm`sw
6517 zcAavN!#!vg$gu(iokq76i5j2pCqmMF0CkWwkn22X7RajwQqqw4t<U$Mkk9&%P;n>B
6518 zk*-q)a=uq;CP<i<;_P+HT9JCdX9Nk&nh`1Aj+t==2ms%?PASN0Py7s!(9GgXJv)|r
6519 zjHMu<Q8OM{=@ck6HB9j|K%DDLv1Q@ndA4W7RFLpqz**&hhWsFV5(!xCI#WUV8cS`B
6520 zxRp7_(>M(z1a=_l<#eZ^PhKyt4)^-(AkjV{r_O0`m>Gz#ewwX*w*dWJO;D(U%<-UU
6521 zAo+)Cd~idQs~-w;YLv%V4syK*O#>N?DT~w#9%DJkH#}$>$TwrkBK4WaSniRu_~Jtw
6522 zh>dzX3QCm&+1rDrfgIsM<sk3!plKl05BEs}$pZO-&js=e4=VS_pt6h#PIHAk+JnkL
6523 z_V=J4(Ntw<Dzjb6ymrC!KN<}{!tLyzvR0&ad5$at2_I`lq}qH&kCd8fMtHotSN}4Q
6524 zaC5-fSOL1&X9HOuBM+$?eMXRI5Um)gKl+RypNo-*)NY><BpOdkL~4)E=#kP$QfEnZ
6525 z@|vy;BwAH7B6XtA2olY%8Fire|ItY)cGN+`D#+sm;)12ENFgqW5ux!fzpO_Zjwx-8
6526 zZ@N-6-ElFDNTCs3rvxOwT+avT1qpv^1Ce^uXM~^k`H)8%ekKDY1z)ijtm9irA0?Fy
6527 zIQgv>i(~Up?>G`m&}qnxlf!#|@e!7DduOTK1Z@Sh-1B(}0vT~iPD42O^(oO3{r}K`
6528 z?rZd9$kq`9@#q}H2of4KBa|ZWh!G_0(2Twjnt~}4rA|R-S#B#5FotGSSaQABoKrx;
6529 z5>*t2Kx=}@c$28Y#9(+B0S9eH7QzGyj4ZoOP=G;?oB<L#wKJd&gA_4>gaw)r$}s>C
6530 zBS_ej*u602cF(;Oa!9}!qo<waxwix)EK%--A<#-i?b_!`f5PXDX+{H?o1&RrrxIkI
6531 zKx}?_D^eSMMv&LVFe0_pXG~_tWPex$`I-k!0}0K%D5}WMqG_zRXU&D4l4&4+B9O@r
6532 zEb6m^gt;a=Fuw|MQ**p4OX13oyeiBDi7K!wOFiQkc-G7W2}3m_QY}6sNSLS@k@5|W
6533 zTd2nyJOu`4d*Ww-G!35O8GNnJ2ojpvjw!83`F6}o*7i{DIu#&Sd5)V3(zK((vja^{
6534 z>ur#Ci)m~}MJrOi9aEFp0ZjoXw-xkto*^Y5`*>BK3Y(ysOM+hSv6a9Vw|dZ2kT8o&
6535 z+ICGB-HUu1KtAI^Ghjo3C%gnCOmUqVh@WPUYX+=>hlmU0y&hNGz`?s|@$pkR2kD+y
6536 zoaHtXiPok3|6qYvX^a91(bT3szoxzvt?k6Xj!ylc>r;6Dq(jHWSpnvKo~iY@tw=xu
6537 z4bmX>@7(CFpF@1fG=Jv{8`6pdB+w`d(hxQzPS|cSKQC3Qp>iO{3lwzdy-XzfrD;A6
6538 z>GD>jMhi-%LE=ulX0+=NueJ<o`F0*3<a3ZvPAvoSKA#KZ6CP9o@*f^F4di*AsZ&9o
6539 z??KZ*R(a6WtAxC$oo5%wDe{nkuBAZYqhDk_$Y1(gAn*2|sUUZFP~5N%XVD!*b<m0v
6540 z<V+8$1c^2YI;#U-1Lb@5DFr!RAa0=2R@CwtK~-ra%BAXQ%zAR56=~S4n6+*Ge^@=h
6541 zGjR$?n8>Q9B(QM`Y&3&t%8!WM3Ix%&p3<2hp_E1dkWfRzJxDY>n^xg@1+D8kGeM$t
6542 zNgPPHgSdP*XbO!}>)AB}WSs|<fov8?^*jXbXCB`Sko!zNBphkMj?QZ5dY4`)SmN~d
6543 zDssCQ2QxsTF_khqKow|Lrk$uor6~MC!n3Y33la5{r*alZU*)n!FPMJib%0qQ(Kl!*
6544 z+1QGN@8!5@{6SF#J!Az)gt8Ka#HYgFncngzN3C>vQGEAlg%e-~i2(^Clo;DDP!I7j
6545 zeF(ZJUO=Wuw+cEdSGOY3-Wz6Szz$z2^=Mn^$I=*R_5gKzo2OoQu9Y*5qaYs@NHsJ<
6546 z;xVtuO3+jo@)AZ#f>r$uA{Qeuv4BKCQ`np<iZJXF1cg<eA4))?>k${a99%>YyyVA6
6547 z+&~&XQ%r$TPnv$P{TE-(s|?DK0d^_03<jV?ErU?`QXD~#NFXMzrET7TGc+mBD<Ut&
6548 zq2C;}BK04yUCTj2v1WvBoRRxYj5wr%UK5ppL=+!h9Jr`sK@-lOi_9<O+}^=YeOdvf
6549 zc>_h<q70?Ml5k>*XQEpO(2p|$tWK0AYP?mFw^q)Et$;Roww8k27|#u*I72X46ILUh
6550 zDM2;RDV`FgiS9(%JPEbMGbPZrTeQ64)w&#Hu)VHaf}x^|WVL!M<sk19DDff^1t)j~
6551 z%Rtr|1<P8I!k1KOr47>5P!<;j&~T@xp%kQ9urz7Gfl`n!sz4Wb!b(8GY-XD(*)W=n
6552 z1$nVw5+whql@H<q3Cj{)$YlvTY@y}=>D$oYfQBu^2J(DgAxM}<Tp$~TD?pEc?BhYn
6553 z+vQ0r2l<geiQ5|mAMpy7f&9>erhznN#kVYEZT1S5f`l>TQjn&s_{N5;Cp}qHKtcd5
6554 z*+H7J;@7m0wcV3d0TKe}79~hiRz+M8LKe7PXF5o;;PkkHFNyNEJtIm$e&9h<K|)r7
6555 zuKk5@ckG~pfUXZa33;>!O$B+Z2bJ3~(=NW0%_3VYIn#Y9ARqRinIIn*NJkn{cW1!P
6556 zxD|Z7__+J^U>V}6D+T$G2h9KpooqpAD^k7%arY@uo9jGTr6~1@5A~Aw2>8_>J}B~5
6557 z3c22gK>kXgfHR~uT`GT~=Y+Ti8&7uDLSL0LH95$)Jt(g6;tih)!}Y#b>S7<{v7VJB
6558 zAWxC^<msY%mXIwz1oC<hDgnvA2Iqqcz9!^XK7<PE-DDJ3vD7{4`5<nMF;*%X_9|TR
6559 z6X9Orm5RGrb+*)MhF?37Xdb@IklZrQ$XW3fo`tHs?QxZWM3qPus`4w(sJO+}_)gkA
6560 z)pAboDC=s;y4zzZ0r`*zRcbN*|4CAhnO<$<+z1wUfkFwSUn<Vx10pb0ba!+blizi-
6561 znQ1^rxil$HFT2FA{o>1&Cny(xFRel%qQ;AixN8Ei%n%l(ABhECxpI&YmC(+=3;$ud
6562 z9(v9gFI39M3R&nuacy(jky(}s%NkEgTwT%m9`{(vpAd4p2gT`r<j5@O!a*;x%Tt8(
6563 z<3CRDArX8S77PSqe8FRdL~o*z#1C^#opxjv3@6w7f`2BY-#z05>uv2E=P)dK7dyxK
6564 z!WRs(po=z-h60ea0_jN)sUGsS5ix?iS0K%Z)O>mEnixS|>OtiouNFv`Me2EvaTdsz
6565 zV;F6(qGkuYnw5b>b*L>sqAskI*85V=?q1ENf<#?3BT}diNd(#88C(Vub<t&!y2)dl
6566 z3i4M1(e3-mtw^BSqywbsfdorbsrg>d1EnD030hBqgxzdhX)97|JmX41no1L_Wkngp
6567 z(qa=NWU_`S2{cSeq#?lyH%>zZG@v!<1}aE2B`dA)8WyGyBS<Kxd$}OdLb@zca6Xj<
6568 zX}ToAGCI!S>G1|ngQ3rR-EJDlpwXMAw<1;T1?M!73k0IOiz{1^xY_3ed8^OowjzO8
6569 zraMs};Tv|q^aL$7J&~uTx5871T#^V99@7%-KHE>CZJZZ%B`CPfhwM^t2)d|x=!FET
6570 zLcIoNp_eH>Bz`IK32bad0?Mhdt@PWtMlD679+WJ8_%1)IjJraLFYb*_DE_0AdfgYL
6571 z*s<}wa+3trtzK}I+7*gtDFgRyQi^;Nzi2@@FuBfow&;~o9;}IOBE|E>ud8gH1gf@*
6572 zs;}gHxci~tMK^2jEL*LA1=|YfRS`p3cqt0dUdf_GAxJ1SxNTQJCs-3a>dBSPSuW?p
6573 zRl(+^N7$Khu?D8$B9QK_u36oRRGFYO6@Y|h&1hEvxih7pQCmQBJ(;B-F+>^M$poJt
6574 zV<%D&ME(W|nTNL%TnSv=BAPG+2AsS&@7X*Fx@9~|+|@sZp+`kyfS&f-^?y?GUY2u5
6575 zFX-qU=w!^#33Gy*C$_u<4medtz43BBtV%Es^@hqNy<3s+hwQl98Yl-P3GBc?yHi9T
6576 zF6M3CgfR~$-l&NW9U@5W5R_sbBs3?ErFW#jsok_VDhTrL9#jdkv+P^KV{v(0%f-to
6577 zgDkUP{CY0FU?~cwibh&lgA5r)l(r%T4aBHx;{T5qKLz4Zv3AbJ{VUT>c3S~J9M?2{
6578 zrPfYd12KF<8T2O4ZPRWO5<(L^3ab^CIyuu!)V~#pwVtRFkiRkc{3>e7Hj73SSmm1#
6579 zclYcP5eaJ#7oy-@C1uj+Ar$Qc*NXJ5p2czZy1GcSjq_Tx9AwJT+J1Th3^G+99cf5m
6580 zLwsVi>mDz@4B`Wx_-P;^kj0m^BIS#ZyJWvWtgiKfkA8dFiqsumoyu&xV8j%UB~G@@
6581 zl0rMnr^NLxa23T^fK;g`z8oYpQpYD#ZM(Khfmi*4e--j=51I<{T@Q+D*WK}@Y+XDd
6582 z=tuAJ_)8ezZ<`;lGUKh~<?`JAK{?}{S-hHTm&d!hcrBMdIm`#-*zexzT>n2_N;`!2
6583 z$mCTpyf5Z+YU(z5M1F^y@l+g-z-@j!|F+*&!SisNf0sODZj&=!lfXl0oB#jN_9lQ)
6584 z6xsiH_jD2(0!cW<3kM8>2RV@YOgMA`Q34?l6c|G?AtSlW%y3_lppFq2++{^&L0xs(
6585 zT~=LPUBnAK0Nr&(*Hv^^(G^$lL|_q5{_j=2*IiRHgRcMYua)UnpZe6RSFc`GSNBZ1
6586 z_$$c=$lZ_9nZN7Q`5)4=Lw>wx(lbDQ7O3-g(c`sO=**AX-l4S4Z=@CF0Xlz3XM-;B
6587 zI-i%rt;FNyHLt{VKCeA>{k#^{`Mj*zK=tc)k2?QB;yp~~N9oLK9-aR$%HL1tZ|Iyx
6588 z7u&XU?oMaDJg+MTQT|Xm`;zc^R^C9fFJFRqM%VRY+<1)J;Fs*C`3?Lzvk3=qFr6C-
6589 zHRT5DD{CWFf!u{d2KfgK=vN!8k1Xsrw?2|PCm0SHDn%x0gL87{R#wLI2ePV|Lb>&U
6590 za1j2*f^n6F7KMzQoWvR`ni?w%qhdbpGL%z^?SnmVU^k$PbKv!RhB0SRI1pM;(I``)
6591 za8<COzaxXSAj6b^``&~k91hk6BnafHKsCrP_C-MnL!n@U!+`x&q#Ue=Gt3TD9>#xl
6592 zQy|a;8|Oqq{VHpN0YL<JOY>x*5pyEJ+Hk*M{U|gXJpnlUs-qGOk`(ykbegl^r>;+1
6593 z=9?pDSe@3|U1t2@62p^Xrmaf*+r(n4=0MTJmKl*ttab+`S{)`>jcfCKKes+yYImx!
6594 zy4Y*2u1BoKoD`3BRXD}8@>f}N4_MuEtePC_^byvKwYNY{cst~D^jr+Di#TV56*>aY
6595 zOoYz&<eOu2UwvcxOzR2+BlZD6&+^=0ns#TaaT9!;1|N`f#U{uY>B%(@4#^&J^#zl@
6596 z{9}s8E=w`Lo;G^e{eh8xvD(`sfOhW+`*k3`W9)&%-76*txqRa2VH0OqnXp+6q)Y5_
6597 zI}a3}Z;!CMUDDrLV0UV^%EET8wbOvC5%6Z+ob?g=^v%bHjr!w!-@Ng&tS;47P1x!_
6598 zVTRRZtvz!1NYMSk@~xojZWAkgXE`?fUeoseVbriu)`SBomi6*-G<cgi0pvZ)R|$E9
6599 z?YGM9BX$?-Ix`&k-K<>e<`vK)NOuVjyCNk8%(JW)mfN6Bh<`TiBMv$t#UsGijB?6;
6600 zAMRCW&amII+Ijk-yLy#xw$`k$H(4#_Dp;>tb8_%=0e*s!zgV6FMjSBh>MMp%w9YJF
6601 zXOFTvl*7keE6VL&Q1NrZ%5ThSY~GC`alOYLF%eQHmf2n?{Jpsf601aOPnxT&b5>a$
6602 zHgz68a&rhBn^q2=p6zLitqyjlZaZ$YI&7b5Ee>1l%B@D*dyUn(JTm`|$b4(g){$1o
6603 zdmb2k-?B}1*Op<U@?NsOh4(RaE&F4n>;~wC?N<5`E0Pno2CuS;%Asf1w%lNWGs>-<
6604 z%X6$}%~iS9j^&;l^M!}(X6UUwR#&@|T?3{)v(yIXST9&dhOZu0Y+Yq{T5YB8vBD#)
6605 z_T|=)t@ia+9=6~&OYA*BJD37&kF{Y5M#-U+@`+UwCr+Guz3+azkKJv7HD*s_`iz-F
6606 zMn)oYud_0bSnZEkkFW3yF^^i+tLz(~k=XUOEw$0Ddo8<@XB5QL+80t%tp}E^1?+Xt
6607 z)=`kyvJ6f7r>A^d@k`BC$34*QUoSrpDYM=K57w+|wuac9fcDW+91mMPc8)b+EpRr&
6608 zlN2C*V61Af&ctzWa=G0JfMW(GpqnwV$J}Gp+SS&)O?FS~-^=#^bgO5N)&BK=f#bgx
6609 zow7E?lZFk({(Cp&bt~7?%e1@@FxFi7fEL`fc)Qj6fOREUVOk%gmZzjx_bnE~@RL-}
6610 zxh5okv3LYzy_34f8oPbe?n!{Wx!B$cMgL`ZdYh2-YRZuf)-@Ae1nA)<IQ-s7!R+5I
6611 z!E*aj$|1NOUwj1Q?@~vA+${9Hm5Niwe;1>7?n$*bp}xh~6ZfQ!m=1}z7u(g4x<3_F
6612 zy()@)mvZ0@NUU0dWz>w{rXH|IS`V&(5#8BJKQOTfZ2Z?^9DtvudM+?=Zh-#=tiNs1
6613 z`_M~}`Sv0lz4xWTWRYUMwFs--lve(Nr%#uMM_TEgekKG|E@b_23HHjXDYh4#`HQsI
6614 z;ba}aINzFf|6O)xdxo`VY55i4_s6VNm(PILg_x$_FXr7~z2EPL-QVgO<_G+hHS=(L
6615 zFPNSC!@E#x8!9VmaVj_bMWu6_DjI7H*!&Do1BeyDdLvxtuW5)h8U9dBLsJ-EgcJ%c
6616 z4*0_c>?aa#s%%^&6ozYpA>f6={yD+=Du1vMcZD;6oi8SPe`C0z9%~3S!k%@8%O)aT
6617 z1@L-N5Bh*M3Cync&#4FnjA@0%W#j!Ng+)_jenl89THH_{FvK2pe!LtS)xjpHT8Om*
6618 z2J5)x&^~NV72w$Js$gZ<KQ|D@Bp6gt+gMW}u3(s&Q(I9#4~44W+#olxA}pF%+fYB(
6619 zD?V_mG2Cwtwub{BHKEp;iu$VBfN|;NW!|y*`QCv!19I}b{qyn%<qgUk>g`t-j?@Q6
6620 z!d7a5reGx`E1D{6M#9y<-=G2BesjJ3CiVCBs}6-LD(CfUY-$JxD#Nf*CinxYbZo8$
6621 z$D+}$9g%vn0uAz42jMML4M>-31Z<@6C2nfxhrKt!Cu$7T21D3Fb`x}GeIu+V!qskT
6622 zQ7`rczTT>?qOpIl3iglzv%(GFyXxACxgqJo`bZswOQgwP*-#s)gN}Bza-W83U?<Ot
6623 z#>PN>NU>0C&!@AYhy4wW;UES~Lv5A6p}IPREunL6O+#HESNJM-(&dFEx%0=CjL(f*
6624 zg5<*L1tX;n)WBkHo>;Dkuz}ufjMP_ZZFfUi#t&|Vh?a#G3Lip`%?mU^+hKb^RJ$ku
6625 z{T}20kY9wn2<`fYDiO};w|e{#V<k{ghi!*$;qf85GDgd|qOnu`BIXSt7EYZyMHsN4
6626 zDHsmGFhUz3c$$p*3K+B0DY7d=VsPRpg*_{k$N+PLp(^NXG0cPY6%Yw9#6lG?8Hh0k
6627 z)-_cc5F0r9Lg9u+9Au0Ab+87;HDv&bVx^Gj1{XTq@Wa5GXM|+fV5T#;M7W6v=`X6q
6628 zz(pOP8GH!a2^xYb_cc}2$_+IUsBEaOHmbo{BI2rr?atyCI~F<uXCg6mK%dq&EPxKe
6629 zuBob6B(y^WRWvQ~i~bBzeHFElfFZWIlui(11HH<V4jRr4!4XGsP=!u#!&;0ap8H&w
6630 zx(0QjXT&6_j4x$)A?1>y;_*0%K`Brz-7m%-)P)QCm_~@bb78pQFaW)9F96dXIz?1c
6631 zFPcz?VJBTGqQmVi2u;J^*bp)ru_Ihu?7M0BWpsy(xpl(LqH9FME5Z#y;V!gMYHkcv
6632 zx`8jIKVb^{3_47d#QjfU>KB7Tm?(#V=ukgw=UV}7nIEp0Qybuc?e|l27Rvc%p0EWv
6633 z6s&?qgR({l8yrb6O`@Ot)fK^71A+;ZU~r+!fF1$^fu%Yd*rFA}D;QY8xirOu46ti%
6634 zxW*7I@%zR7h<^@tpCR1o`bzE%3V~8uSs!kymDjcUa6<(`3*`kvTqC_WZC1>IaVR5g
6635 z4vZq4Myq9fF2MN2J0L$4ZZ!PDQ=(r74M0ypWQeGwp{c}=7(XIHkR-;hoYt%BAR;Qk
6636 z=$M!hVUCrD#6*bI`r#T`l`l{I<>_L18X!*t4ZaEpL*%R@Dv8ubLV+qQGzV`p{TKJg
6637 zDyxHm+A5qGAbfF_4pvJa%WE!OZqPvynEN4M7yDr%5*-@>FAbsg&Ve3{G|I`ybvSHJ
6638 zs)Q;w4qJqA<Z|GWs-!B!_SuFQSPR8u34x$q)zELUP13t?DZopffyP|iAFP2e67z)-
6639 z!4XCA3$Jb(J9e12Z`qtkeK;a7?)?TuL@IxI{-B(^0XYNC*Dm^Sn@dj#4Ri4n!(5nU
6640 zp4q;Qy%uiOiy`kUybp%sdHfiYk#)0YOh)%L*7ywXO(}&LeXmO$myy?;=9$_qqi<n`
6641 z7xI8JCd0loeW8XFrW@s;q89bQF&*!r3p28=^Au)uZ?-_oigp>@$7W;|V&RF7T$ql!
6642 zDZ`iUxx`6al0MUsed$+$x;^j@53wf|*zq&8^=7nnP0E;zzBi$**QJfi7}DHkQbvL2
6643 zwRRap3N!Mc6=M|3p^nQSV{BZ;rRnI8i@+~<h~0|ZIzR)}0UEDME5te`WE@Vh?l2S9
6644 zB7RwkkI<HqzKexc*%#=0Jnp~`&*}{1Wy8NMgbzX7_1&ZlZ$(D;al&;*cgWgHygtag
6645 zBqOWY<9{{-o-_I&`3dD+kIzFB*)Mz~>@UuE(DE!uXg>HJiVvaZAU*L}Y$9E*FUDo8
6646 zH9hwx)HOEUGb3Yz>Cd>+ybR8Tzyx*Z>kXv89|Ep^w?AF|mu9TBthR}L4Uq@$#Dsqb
6647 zNuPM%C+NEgWA8eMJ#TZ$gp3`wXMej4FF@d02w_nSO2r>&PKxox$@m=n<7aZPmT9?v
6648 zBNdZl;UlU9hh@+MYb6hVFYQtEi!n+07XK-o!bj1<r&kFM%b;JmYk3xY!I9{&jP{9O
6649 z(4Y9hvL$!Oj4NX$d9Z95i65X^&g>Mc%91;m#)6Qt<hG#+aQdc6$>|0%J;qj0x$R>o
6650 z@bg|m#asn)P7?mWB=`uxQ4hZ`g7?askc59l61*Y_9!!ESNP>GIG!wP=df<!pQYi9H
6651 zZ0nQg*_Z_XZ4!K25**_<kv*>_!QTg5*a>qP9z17$0W#uQ6w+ee1k979y*A*;=RY+O
6652 z^C|GV5zc=ABIZxPdlSxoDk0`hzy~JLe@PPjA4%|%B={9c@Tw&Eyd?OdB>447@LQAM
6653 zn*bMnqu-i|c^~|6e-i$-B>0Xb_=`#KSCZiPhPy=ZgRfUZJKv=#MO;6?&M%YjQ{lQG
6654 z;)fPO{66SzfG5)Lez~EpEMZB8_q*<zk5+jA;F=J!W0!=qY~))}aW_Jbw16w0FvUCw
6655 z0Yyy4TO6e(TwT)RBfRf$o_6W0N|8s8iDK^LuvE<5irWf&I^(A3zE|EgxG>(gxhZka
6656 z?Iz{T8>EHx&dsX0wGhwS;3kHi?EwkQ$LD=@^0o>9<vB#`eUGXUZx^8?KJWpU9xTbn
6657 zHtsEqa4X!|Gg84fl8_;9+*u{m8G8eYJqS)xZr0pt=!Q!^1As7d-WG++4GgJo@%<`r
6658 ze1w^B;Ch6nFp>TM;t~(M^5WHcCH%wV7~!Y~uT`w4BLZ;X30{lq;D02X_4Gv&98W5I
6659 zRnK2FzGNH5z9jq)HGT;dIGTiChU-E&FdJW~%Jzp8{0s&EnS$ef3(S95!SO22IDF3|
6660 z4%CnLDU6R&@Us>Ca>Cg^dqrsjz8sPQ>QVg@Quyj>X;~8fMg{Mo)Vo#DgZ;ZjR%bk_
6661 z@YQ;AXz7RcoTKPzP;k|sHz~MR;XkI}Jr(>d!Z{A}AP<l46u#;=Fa5Sbw<n))_U8$y
6662 z#u%ya)pnICxayyEnw~t0`(G)1RnKb*ANvJu#p5%D-wV<l54;3M`_EPI?${Y{u>B8G
6663 zz1f5#U#)kD#y?E_;w1cO3Lovny78Ekgg;;5qqqYNfMZn>{;xH@kH*OZN%%W7{z}sS
6664 z*ChP6HGTo{4<+GyXi`I3HvD7%XA{nT=3AjWg|GT~q{hF2+Ql3Hp?;Omo5QgFM(UTV
6665 zlIUNf;HsUw6}-1%|1W9qv;GIkp1TRx?fH#@_f_;fui$u}&i;8z!TTt<jTORy`qlAr
6666 zkZ?R<(E|8~$JYw~B1p6T3+XpR%)dmi;l<;GqkeTBo}u796+H_H#}m5hD)@)TBMQGC
6667 zq`6)X-7=znb$$*hINnn+f0csgDmd<cjR)$%xr+H)6+B<TQ|Oiy`TZ6AbOpzI2i7x0
6668 z!3QXKK*3c%Jf`64_5Cdc$9qE7|G9$qQ}FKe$9>o@IHXR{_26v6(S9|~hbXuj4<$+P
6669 zr3$Xvvz~CS_b|ot?FwJ5cbkH%^}eI&DIxpcSNN(Pek6eHQuTCm{&q$Bp*!h0lkhk{
6670 zD7dQUGEEP^%xk*BSM90N_;*shAq{UNd|?tj>l9qI=hq6Z&L>|hxVp~ilm(7~gU8oe
6671 znKUjY9Q`mD{&8IWO2M-g{7(w5@?R&M=YcZPe^}x7QuOqq-^O9R>UbGWIO~~6dL}D;
6672 zRZoS2<GnW9zcC5^n1T;g_<Iyw_1n7&K1|_%N;unjCE1BPLgRt$8V>*1o_2J<h`6f1
6673 zmxALn9p(>HaFt(7IFGLqT33}Td^HZQ(fItvxn)WCe^B^1|4)X0cs#4{RsX-F;A$M+
6674 z&{>va|J2E(fqO0EfqobT|G2$-6nv0^x25}L<g5BGSMUObA5d^LuI^Is3l;vOgtI?a
6675 zl0P3;_^Ll&QE+uUrs2&49J-wn6+g0+*BDwq&~gBtB*-#e!fCj~;do8QL+5)1>f(nf
6676 zjcWrun7@|v=SkSX`Q1-AcJN^StF#U)5U7hkLby-EHxOQ;;ryDkat%L?9B`F}^ZNj5
6677 zG`u@q=NdJf9}zFq@J70Ruhj4@w4S&@!yhF5Yc-r7DR0nl{tfS)8qU8N-lF0AXkK_w
6678 z!@XG&*rwt9+iAM(5cd&ex?ocC1db|rT}stB_{(&Cq40F@zhj`nf%kfNaKFoxyWt9s
6679 z3%aC;tUMwhj`i{@L-AUG2jl!(dK}|;Fg}~s1LGy^;F}3A)^L1IiASkCIs8V7w+am(
6680 zM(wKB@K<PDU!&o_B|XbEd_VcES;Mzdhj2V_yDlI-ztZ^osa}o;=JWOO5sm*Ewf6}P
6681 z=Qp~)t>M?(5;&mY2g&}AHT)dXe?-Fv5&o5iS5v!0fIuGGe>3sgP&vlWq5F*t4Zn!^
6682 zT{WDapPs4VrBrWE4evs6!aFH&y>qDFd7~4?kCT7KX?kv>eksxLD@o5x4L_UsH5zUb
6683 zKdj*oll?0-oWDo7NyB$hyEbU}2(tek4d=LdP{S`EJD<>SUiZGB;k=#V>l(g~?0;Xw
6684 z`F*B`H5}J2czmbfA9I@g#Qnn0xlYsYrzxGS;qxe+ui^Y0XOxCdl;#){HQZ0*qFlpy
6685 z1B`%%XOaJ#G@P$r{BBWhR}bRfr15(bew&70L^$ukz<NHVetcNtPaytI4WCc^JsLiq
6686 z;_5XG=jS``YWOF_|3t&v)4X>f<+Gi4kUfJmyf4iIlQnz=>6xkFqlsUm;qxeclZK~L
6687 zdV_`!qyD`|!}(>CyEU9&`}ubb-$#1(Yxr1-tB*C@CO>?s;U~$D7U^TZO(R~WhOeV>
6688 zcczAaLFqmko=WM9HT)U!^JoqK2idPaug2^6`@}ER_}eIbm4<gAJ8L!kR?@#v!-Isk
6689 zX!yJ2hqW5c?>6P<-t4!ph_^-KKSlAsL&H~4y?@nk-Y)u04gWLs*GC%8^T>ZSd=UA~
6690 zL-n(r|K$GF@BxIMrQuu1&hs^VG3g(v;pvo~pySjp(>0v!snT$^=Nb*?dRJ@s9n}6?
6691 zH2f%~H*5H1WdBwTXZ`PKcr{%wzSZz2$Zt03V?Y0q@Gct8>!e;9&VI<%@Rj7Z5gN|@
6692 zQl#NWslTRacs|Wzl^V|Ny+OmDAw9Qi_(kOB-)Z=z<d;V@{5<0C(C{dwU)S(IP`&@r
6693 zaMsWBBKw*3f2;9Xe<$)E^H<P(*h|A%e?JXp{p$B1I4`mOaT=d@SedHftlzKUte@{k
6694 z+0Ki}PM&ue|A5MG()1LOpYPXjuJ<tw=X#&l@T;lbe`q-Cc~`^JDE+a9vwyzS@KVy>
6695 zhR)os(KKE<Yj^?mtNMKk`u{%^Z}}RZpT~~U@Br!Ibqd$Z@jqSTzeI63SHsy4{JLq@
6696 z!~W!#Ju}XJh-!KQ)L-{#IQQ=#HJq;>Z)iAwPxP6F&!+T$>5S7CT|z|5+S7c%c78<u
6697 zIZeU&ULFgarQqoQVU+Hp;K+X($#7hx;K=87z+eSO{-rdpUaH}IpD<m+ZED0!1xNjl
6698 zQasF6aMZt;__c(yAErVc9@i^;)bj!PYn{g5E7*qdM}?32zassQDmd!tNdDZR;K;v+
6699 z`kmk0i~dJ^6Y=+H^|mGd9M$yfrg8PHhVwW~Ma6Kie*7&g9+`x*AI6h@ex)yF(^naS
6700 zf1aj?=cQZ?zm@b4(ePem-x$KV-i=i61ci_F7KmC6=jFhdjs96rdgds6#E%m`Ps6XJ
6701 z^fh$mdQVWjtqP8=TnYd1Sg+vNwOy%y@7Hj?&)K8ksHZO~f#X#LM-~4fJ?;yD<@Y{<
6702 z3?Iie{+GmWPY>77Y}8*u1^A7-SPbLsVe)@Zg^w!ucbNRkUgV?Sj!}J=5TEsQqj6NC
6703 z;K=89-<B!38s~lmNB(I1fTLc+4-+0zaMZ)=v1JO5)P?l?vsJ@6NN?Bh4HUe;CY<}7
6704 z_l|l><M*S7h`Tj>3gLS-JVN+CH2u5*)z=!%&l~xBVe~VaxDx*1(UJVY{qlR#e};zd
6705 zBm7(q?~Trbqc7pyUVb;o1P$j6!fG^p0bPHu)$l(Pey@g)p?U0C4WCK)+X{|xyH{9g
6706 z7@sOQ#^<%fZ$tfz_S29SB|0iN^6w=6`5L~R@X-p6^==Vb;N1*_bDZ;abe_UT{rvrD
6707 ztHMW<o5;^=6&xX6SKO}P$Uj8<-)eX_`d;dO1xM<+Xe=Dt6dd*NdmQ<N-fTaQm)#ma
6708 zhrX}+tAe9`zK?ia!BIcIi0PjSj{KKtKKVewk$)e3&-9UkBcIp(#}pj-qr1Wf9A7Co
6709 z^1mVd7L8Yq|EGv=D>(A`zNV9cqyCHWOE5T2Q*h)Dqqyy<;K-j&{PPqX`ESy^m#5&!
6710 zf06hD6&(3DQh$|dcoc&O4nN^M9{HU-a}_>{4+^$nEKqQ)*MFMK;MX>@e{LmwwWgon
6711 z?Xy+G`Q1K$QuL$vu2gS4tKeAgOQioLO%K2G=N}3m#Vl+f90wE}^?X5kKGpEEy9>H;
6712 zT*C_q|Auh(8^2Si7tMb>Kk)D0@)aCi&-`M-*>7t}f0>5wC;SRc5AS?)t%mdWlE2dQ
6713 zc<2kO`!u|O@CP(JK=_|D{k$R0yBf~h+<dF)xsmjwVNk-se&hR)UWBtB?kE0*8r}wf
6714 z3<bvk4Zn!+p_+c)@n)We|AxkONYR5`T0n8qtl$_YlS%(g8Xh5hy@uaT_#K3Ed;8P)
6715 zeNDr8N3G8_d@b=i&=-@e$E0<5KMl_&+^^w<gfCKXoElERKRlWh9OIL}m*jUmalLnu
6716 zo<|fu>d7O&J+0uVr!UPvZz?!K{JqNw1xJ1f@jKD=2h}3P-<K39IP&@XwJQ`HugmAc
6717 zKRl`w9QoIg{^bge&<@Om;|2vsh`)#8_eZil{Cm!=8h<b8-=*LPtt9<>6&#^YiT{y;
6718 zBUC{AV+xMY0E*iTx_+`f{JYH_3Xc5Ch(AQZQ9s|0Pf&2=R}sHT!I9rc{To(r<nxA#
6719 z{DMUszZk+tiT{|!cXo6loX7jqG+y>AIO^eb{-+ww>xyqR{5Q0|vgrDcW}uz?z2Uip
6720 zbG`qidh<0r2Y)mK$7l^-OZYeiM?0J7IzCCkao%`=__H;<0)KP~M<wBG=Y6!OT&CdY
6721 zfBs$T^$L#d;=P&fQ1qic-_yKtug2%Ut9oAHqn#g+JufOa>NyK5frH<7$bRcV7q&Mw
6722 zKKIxA3Xb}(CjLPMNB#W#;fR7G|54(bw9evsJ@}&`IQaKMh@&2khb)bMIq`dF`1ORJ
6723 zOE~-g1@eEnhQCAjQVr+7N4r(iznApiso|&N9}U29ucn80F?v|xW4pT1e9P-iw$qCZ
6724 zhhx9ON573A{Rb2r_3%3Ia|K8K9mGGT;K)A+|L{1e;K+Z9_$jpBWdD!EAcZ4S!I6Kq
6725 z7g6|I8wE%G<EdTQ8h$s$?MMYjJ$HKH1CB8Yj(T|ge3^nH|8*~Xz%fO^k)MtZgkzS1
6726 zBmbVB0ygF-IP&?vsZPO>{}%C^6dd_!G!HCOaO5}if)6-u((qddU#H-xXEn`Z_Y#g~
6727 z<51*XZgwhs)W3)H@O=P}myZd5S<^F%?*ETzIKR{KTSY&vi+KKTPwQpY-;*x1T{Zl2
6728 z!h2}=b%dWwIJb-6nOUUa{Cl>5rspZrQ?KFg5gyX?@V+-2G@Rebd8eWW+j}P(2FHU6
6729 zj(*O`7O?S%rib6*`KpHVecET5p2?)=XcE3n>wWg~^~CQ$IQxw^-|=cVZ>KXt)AKvh
6730 z!}l?)hwtC2G(8W}ea=cv&r76dbrSyV8sF+I{kB=-^9DW-Y4{1M_ivh>^GMI%lkg8}
6731 z{F%i6RO9phKKuhd_Cp@sx12@yAMF1Xq^Bq0I)9MHe}wqMH9l|ubGe4|hCWwodiIf?
6732 zh9vwJjh}Iz^mA0>^X@<!H2e!}ARLb?I9}=s5QO6|3Xb#7_r(85!w1uR(w^2+=pWQ`
6733 z3H-z3ECokB{G4~7hCfDn$~Ale4n8;<H2gZkZ_w~9gx{y(4-)>AhTHVq=XDJ~oACEF
6734 zoHuPVX?@4>z|X(V(eR_BXN-pPbDx<Cj+fFCDWbVXwSuGHcq6yv8or6f%LWBUJ^c40
6735 zcPlvR`H=WeC^+)@d&yl2j{I|IT)eB`$nQ>eex%^YzmlH|(7KZSvy|{N6&&?6lAa3{
6736 z9QE+_g=K_e_~G?&J!ZmjmB!~?o~~8+*yZ^&F0NB>_4>X}!I7Wd2eli<FBKg5{QHNy
6737 z6dd^-`XU>y7aG2b@JAFJ_3-aTb|^UNIY9iEHGKW~s2$ef3XXbsJ+oiIQP0yCARF{4
6738 zIP!TNcud1PlmF9c-Hm=mJ^v*=U3fhX7`mP}1<TX;S6>L3a17P(-x5AX!}k+@sivQ|
6739 zuW3~H7_xgYkl@&;@%i1?_h@`!Eb#xN;MlJ27oisT`)ds!PWUbj=iNE}LO91Wzgzor
6740 z4d-`or_+4^`}3Eizl(-%C;V&;e~0isgmb<8?(STLkN(M{aWPuK+XHU)!`8xkhBUk%
6741 z;gdD|F2bh~&h_%U!CMp@=lL?B9mb1-qbb`k=-}9?;k*aU+k~@!o}+sIqv3}M|6Ien
6742 z=1Bd=H2u6O&DnIng7%}G6D8dksNiTP^CuI|_EeGnD>VE`!YehreXgvaM$^xm&iq2d
6743 z`JL(;6+PIGS5ZH1RdDRbT+;uDhL;k~_h)SXe8QjA>b;YmyM3tP{P!21EBeu%wPepp
6744 z1xI^sBmHf?kbr~Zg!h{1?G>=|{r;20&(ZLY2p_EB9r9%P5rnh;zmok|YB;|`zEaVH
6745 z_U|D3muvhCdcO8M4d-{sKcwj~EKml=GhT6W+LcFk{zb!Q5&oKnuP6LX!ns|e$et4#
6746 z&d(pa^fbi5{kx6yoUP#p2tQB5+vdyi7ZPql5?#aF-Aq+*950h4-S8_o@&{+hj2krk
6747 zJnEPA8qV=>w}u}e{&o%LcmMxO!O@;8$)5ixINEa_`7NcFB$#kQd?w*N6kM!xQY9}(
6748 z!I6J0@qG%8eEz$?DGH8!-sx{X;n*+enw>U$z;Ug{=l9;+t?+Ril~cd`M!``JKYw^g
6749 z!I6It@t@J~w+Y{^;HYP;2R`6<Rl!lui2edL{;lCR6aJxsqaOZ!!Vv{WJ^P4n()~Bb
6750 zXYY%p{xk(gJ-m+Urs2FUx`1%*N8YQUzrx3H&A%HNqu^-Il~nIU4Zoi75=}qv`B1Ci
6751 z7;km(504fF_dxouods+>q2V3qIp$l0b3BZ}AcErqjh{vQv}~EretU-OOjmI9+h6Iq
6752 zSvLj8_Vyeg%U_`2$mjLmSOrJ^O5zt2&VDW+dulZPW5mBk!~aG2Vh#5Ul=iI9^z-gI
6753 z_h~rqtMiPeXEN#8orM1{jek4w-_!WKNzY*o4^n%-({O%neiq$-vwxl@{vZX%uI0ab
6754 zy;Q+5PI#}LYQi}lN-XK0Yc%{9DH30*;ja;YrG^JmCI31NXMU@O^Y89{mIS|5!<SOM
6755 zcO=1ot>J%=<`}=x@CE1$IR2pF%zsG3Gl>7FhD$Am@q~smf2W3DP2=VHB=}1jPT^y`
6756 zk_3NK!|SNO-cEvlpy7Qnkl;9!1ph+AXG*&9UkyK-`sEu9XTCxAyBu#OPG)eVXn0TZ
6757 zb2|-Zex`<xCi^>U_)ePNPS<ee_t5a)rb>HyY53)Y_tkLb_tWr&be-k<dv5R7QoS)a
6758 z34er!znUfs6ePjNYxrVnZ&4C_vW8D3KbIxJXKMH$^21e0@EQ$oq4w4$!9yCJL2<hv
6759 z3BFvzdy)QCN${wK)8kfSO%i;)hCiMrE4VEQey4`7qxiok3BFasbE&@`OoIPe!=Ix#
6760 ze>@5PtcKr4`gbS6|EA$Dkw0J6@Ovpv_Gvit-`4P%RPTF9@Piu8f4B2V68xx!@1i*Q
6761 zG70{@hG&uAJbh#Xc|0=SPQy>6NnVDAUrX`dMZ=kYx`yu{JI~hepOOA^HJte=%J%{|
6762 zMbcv&qf0+&7d8j+GMO~q&~Sd9@Rz(;{$%3U(>jjz)Dcc*iTg+N5g)i_!vpyg3L<?U
6763 z`BlfgB3E)%exru(rSxAloY&8Jq#t$QzrEzol{!xI?JqQ(e_ydx!}<3H{CD}RpT9Rh
6764 ztnvAK?Ge-%=JRvijT+APQ~dX~%;$BrkrP@}2YUp-8D2pt&NVDG1!^mD!nnym4(!oT
6765 zVdTsS!PaRA<V5OggYyEli;SG62F%0K`8h)%iDe`fo0m^{Re?E?x&B~%bpvP>a>blE
6766 zO@a9_*|;@;R7I4giu$?mj(sY@DN&hZ!2Tlv&IVhIoXUo}I@l)7$f<|DUUFd57})Ct
6767 zUK2`c12z8YCfwcQ|L@@i1=vL#udJ_t1YX}V&hg7>{8|7*sel1GFWe{ves2hVy@K^n
6768 zc!_tVBjY^6X}U*9922^-6nmy{a=?o~LY+UgJl;+xYX6U|zktfq?J=a}Q9}0rj^;VW
6769 zx&7RZsgQv(g+0^cOOPP7!$pL|<r$s?LL&e7{heeKkYe<I8~DfN`TC9PNvvPDe+PZv
6770 zvjp<ggYD)s&O<D#yy0ibR9~8xIZx-#gN#J>*KCy~yan=%_TxON+rJbrT_={P9E+cz
6771 zo8~#0is$|eG7^=ad#Nn(B;PQQ0-bv!;EC+N;S*V4A(cb>JHS8P{>^~tI<ZLhGW>++
6772 zAM)gU>fGBQCsF;zr?Lo_$NDqjpI-m{fayB1<W#EvDs5ot+?`3v|7j&^fxjoxCKkQ?
6773 z6TnGie;(P-af<eLf`7XGF9C)+xt$=2<9FA~Gygpw!A@J*j(w1ksQedeWeKhO<I2BB
6774 z<yk+U&s)b*?3wFj^f(BJ>EpjImG7?kpWDynzW^bT|9s>>FI9;C!=IvXdG>2Zz_cm=
6775 zF^rne#3?Q~bo&$8jwK6zA<K8C{>SMAAFb&1<Jv1x{pA?gaPaRFWh%}bL+;d*(~#?x
6776 zM;@K=BxU(IXutrGGid0Lp@W2URl61Ai!bq*Zi`HK<C>e|8sR&&b}m{V-~xC@U3a5!
6777 zdf~LfvcjolrM~Fjea)Zr^+iWy`=T#L!`XI~uQjE2Um*LU<FdQw?>LC%e5-e4wiH2E
6778 z7q>3)`J&HXw)$jd%PvsvTQfB~>nTBrelDm_4HIQ|7e$}rqD9eN;gaGtHRdk(nI2{r
6779 z6BpEmF9NWz^)%m_g=TbWc6(W-vN*eaQFPqP<wcckikg@1E;lk;RzP)yE0>!_=IU=j
6780 z$J1D;_)&&0`p(h&GF#d}z6M5?3)2M3#$>kC1M#xT+}47u>YaP+>ao#r4Zh;&hk`IM
6781 zI_`6uDz%|fbfAx{Evh{2NM@F}Ec&8*j}&HhY<Xh?7}31LER43v-{EUs;xi(Hi=#_?
6782 zALnPDGtMwti?eNCYnSZ&9YxW7(i99CX$rD4Tb_sXHhj;wuXSd2_bT7TX9?$LuI`C7
6783 zH$T_+%2|ao3uhJ1F7!WJoq0|R(9wFR<@4=$S;;>xv_X5YAq#wm`h%_ntzO*@aA0k(
6784 zgSZCj)CS+7HUJ4bpMtuKr*TGMFBL_1hga+d03HZ+|Ni7js2bXnze8%qF|RaY^>DPG
6785 zyi^=LDY6coC$z6b6;SWCdRZ^{`q0lnq3asWFTxpzJ_Aa8ZB&J%`~@hYrs}mKnxn5n
6786 zKo>=imHJxGDPHsY!_ZOeuj1%`e9`^B=-Yz7dPgK}-0Dz4B;D8iY)R43w<G)WKfTfy
6787 zJxHE@b}f#NqUcE+A}}h-N{gbeM~@aoUxJ|mU8IZ;8+v_rN;bAp`UA%azNzYI8z2}c
6788 zjQXO_X0{YShG;GLO8V9p{dXZ=NMvd8>TO?i7X%{)^e+LI0S&GLWxD`e{W6HVE$o1N
6789 zaQVN5I<6!<Xyp(ioZs5{_%ohx=3`V!XbaCg{)`!(E7i4Ob&+Y!FWS-0MbRGId(a+;
6790 zLzo1dIK=BL#9?<O4%hCsFklWX=J;uTF(umh<84lS7Do>iN52-f<?ndf4f*JPX{y?f
6791 zAK$F7Ki-?aBl;$neL4kd5hY}gS3rF~5EP?;B1&YQV^rsG|KmLOoiF;OFM1TZ&=v%U
6792 zg1)VF;8tl<=ANO?XRhCo`RI->_d#>*D`!3HmS+;qSHpd+zV0+)JNj0?8h)iUVtm|D
6793 zj1OP)P8jb3?b7N2m4_prptAfOpbjiTSrkR>YhC>ixcRS^M!$Os`&GOs3(WM!L>kY;
6794 z%_mNV8>7!|&%$nr{wKPB8<xp@iNnyhdt9~+h!L&LPN|NjWQ)d9AV&9(YxN2sf5+-i
6795 z!|8?1-&W#&8%E@89}GyGe%g!aC(;E>^<tNU*#&Zf`uJa>B&L0<U%-n;c!21kqUdYB
6796 z=u09K90ZXb9!gUaM^#butn8?TUI2yBFMQFjxf`9>5N`SS9mbs*M&i4$R>fa%^(u-U
6797 z2OE6Rf0S;AK0jF${p)yW<&ke-Cc;68ufuCzIL^d@xB3_~v9+L}`GhC4<xY^7=QN*4
6798 z2`_3sVMnI=)|A2(?a;XBXLt?pz-vo)o;Zht9j9EF_nJ?bkqdpRKh11e1*N%FqOoIr
6799 z;bpR6I7t&<PHET%x_%1hxb{PRzUW(2Wy6V+C$EG$dG^6LiLvQsnCMhO^;+NVu|7}^
6800 z+CN_H)+H)w-gEL04g#95i=#&*A=c4{&IC&Sj%2ytL5(r->8uvMc^c<ch|Vmxzpc!c
6801 zOz^fZx?5EB7=9l0-7C69AUJ$xe0}m{41()}aR7?T4$qV#QAE*t+3HVm<#08Qx&Y0W
6802 zYkcKJYs%o?YP|9m?jDbBFnqhmJSflTb1?52+qb)rAdGK-U}O$`Ci0KVV2uO)y{|Z0
6803 z=Ytr}a(WsgEH3(Z;Dae)n^!IQJ1$#&Jp4>C&L=R~q$65EiqR+C?!+-`f-bvZZRvJ2
6804 z3TC5&W4;pc8cy@I7Wl4w7NSBcC$yJ}@r3+N#P5xKbWBRCA&Rl-PCr9X#;Q|8QACFu
6805 zkEP;|zfu1~5R9ny)b`+f`d{kWZ=4ymHEZ>&nJu^wb$T6L-)i7^#Mf}dz)(wO%S#E-
6806 zJ9HGNH=`qB6d-ss0eHjr3Ba2Z*B?w&Q(SprD!#8Yrhb851t_lk<OPGTH-JPx5@h${
6807 zCnvIh(6~&N|Hu#IuRnGEp(YsD)oYX1e`v}N<m2k`ROLHCeiGXc9fw&XS>9Wx$b0G(
6808 zd3T>8?>fkn^Rse4bL}TXV9fcVOSA3#lgbseCA%-+d^;0;R*b7PBf5*T_z?Y>1>;9d
6809 zaWL~RS`<yoY{A#t>NA|L6>1UP>{6f0Y{54p`qs?M_U3<D^rQ)E7#jjo^jk45*o1ks
6810 z5W+F=0EAHHqvNu@&Ci=7&dt2;XOM<@ptT)LV<~H{J^B6j-+%c^&po|Y!Vx|c-MRBn
6811 z)^As?gfioH`qoVF_%g@665VO+^fkX_`Obf9*SId{NOfEGXSUQpWh2^Vwp<10@%bk|
6812 z?jZd&qHVZqQS^;5Q0;KDXw7ufw`M@+E&C%M?n*PnBn`JzFufhT=a`rcU{FJOyqadN
6813 z9wf{kmz{O_nx(@%vfZt44_Mr4eB7Snzo>b)S(N!yo5JJc3QTY0Fx(UP;N~u?7;h<M
6814 zndmMb7V|ZKW`>6WcWIlG#W06<hawB1NRLBsqvx#OF@Nw$nHBB`D`8*su&?=`8TpU6
6815 zb1B@FGT3MxBd_o0VY!=M1ee1#KC|TxA=sI#Pk<mg4BQI0dtXIAJJ=PP2R#rCKp^oA
6816 zAT}GAcxfF5&T2u~D9Zfx^O>tg0qxKn_*lziUn|@&a|u|PWwu12_F^!u^(GN-&Vnj)
6817 zHMYlh?Q<BNe9eJdI$@EtX6|8W%^TlAHFY=+o%JiOKZdgtU7th5`l4fenXB)CB67L`
6818 z?HuHX&PN?0?&9)D2ZXQdjXuX^{nN4jPobIM=R<eFIe*8Yi*VROf7x&!8$IOCY&4z@
6819 zi6MN7{7tCt6#2^`-!)QL$8Lq%?}uE0wGMF_Z~LM<MG5r=Ln*Tu$|%WstU~xh-rs$X
6820 z_jhnthxd2K;6X^?)6mM3zH2|hpF-da(pTIvK$OPJBi$jF+P!*56c#_n!Rb(yutwU4
6821 z{Q|L!tCy**-B<r}`Q;EXMQiHq@pQW`77lLz3fK7HK7s>l^^U^mZoEHTRsxSZQei?V
6822 zY~E%1nxD4|hrScpi&4|}|6P6fCk&^mPt**Pq1sqGvjyKkSF~pQ5Z{`u+4v9==fDDN
6823 zsTWY_FYrj_IV&Lpry|khr!b`~r!!mdZDT8+5XH|8{}Z1s4WZiP(<KOb^y<#y=!wT{
6824 zQF#AR-|xAjw-+GPe4?N@dfb<J$==5bB}E#F%JOBH?P|$h30clfJLt@82}17|@rn}W
6825 zA}`#S`gRu_Mk0C~Zoz!bAD-}?|5fwOyq$+Ewc<SFG@r<$ig~G6xNCf#@l-Bm^1Uxk
6826 z`FKBqQ+`2FbpMFlNPC<w3o{>WGa@&9tYt^I52imp-HneCxj0E@w&0_An75JIvLgcb
6827 z5b`pD;Rciaqmav8lG%biP~6(sy{I(}oEGVRXa!a({a@6)%a(Y!wslD6%LkWyaq{FE
6828 zpV|DCx!`>uPsirMZ2kSgXXK=`dIF3eF;_v?i8{nM^0jWv#^K;RE*KX*k-2&S4xekE
6829 z!%?KnbmG1d)xx#q;5<@$6y}<bf3sF<+yfDH1Tx&`3WdAcV0#aBhMvLlMQfJ9bbAOM
6830 zr%^Y-xi2&e9x(0FyT*rClL@Ueca*c6wsR+e1sEMMopdM<$3EC60yRs{1=5>%oq8+_
6831 zYJo_lVB8CR&o*F1-k3Onr-Nus(fQvMuDOgN1y%PI`d|^jbC*~h@*MgAxmXTt)c{(p
6832 z@az|T(-(b47!p&yfu}gQKZNJ0xE8+|jK*hUMbYo!UU_`}r={|GFkwx~1;wpb`7T?1
6833 zAY9bEuplKeq_8z58`di@WbM^EmY*+qzSiO7f+Z!s)hENLA_eOdcyI<Y(M8!S-sTyr
6834 zsI^;B^YbM|*M5gLh>>6UqHhRt(QbSU<pjdfXE8;))K>>#Z~LEeKxD-{@2-f1Yy1sO
6835 zRj>*BPdaQ(A8gzRyQ7Djg7D4vPdV@^j5hK?`hs<VhDeyf|KY6bt8Wk*{|61RRNa5U
6836 zP$=@#dP3^e^<jU60!{OOYJb3*ImUk#m6hTDOMOz;PwQK3vEE+Xqcqr1U(vKk`s087
6837 z)b+`DX{x9SMt+i!y1r20nx8z@61BIkqVfM!Usa&GB2pXn!=|XUb^ojLfUmb#dd?sI
6838 zsRK?QZ=|m&@DrzmB>JiX6;){C|J-6--<)8573`+_6KB78|H=3hJM8|?wqXIiKYE9T
6839 zdGU8b-riNiyhZh}OKz~r+t7$(#@o>3tqasOG%fO0R|IP#P3Vmnetm<N;=|k6&=mGo
6840 zLy6vUSj6z=G|Y{JSSwTkGaBZ**M?!<Nd3I}h6VNBd4WX>;Bqlc)su(^HAU(J3mXHK
6841 z;XqYfDOkr&nKEe#s%;8XHq5OLE(VrtmQ;<~{Z>`^<>hXeH(1x$5DEq7)CRnj6`_E4
6842 z4*Z;|vZg1zqo<NM@bj!-c$hcP)C5(d90XS_4%W~0$|=hWzp#qHTu8k_<#79B(Ku|I
6843 ztc?B86u2f52!Zv&Am#__p^{i)?~r#vMaT=k*@CM08WqC_=lxjyp{Dsi${y^W*s<yz
6844 zF%rK04u-tJ+S<Te*q>P(3XjI%5At|y#pn|8;$GY1lqmUf>WE`Vd%!Qaf3wrEl@;}U
6845 z!r<~iJw%ifRazX!L`iG}ih6l`R7DzVgOwHG0QVt|94DS)>P;3<U?1+7?UzA=T^*^d
6846 za!kaj8}+${Cgr0R@07xEMP;QNfe<J`Y^D)o39M_p4b?P~jf=c(4P^}wscJOnVy0Zl
6847 z0l}0Zrx_YbdgFzS6ox_k^&$?B*vhaWFh{ucc|$N@gVn)6mBD$=`a#L#MF4Rq=|%4-
6848 zEalQpL>EzLu~AH|g&>g^49ex0geJS|OTIRvc9P{NbQ(cyx|s2`7x^S>d|n+&dqruD
6849 zp~r8mLz{%#ocUVLt1#=<Re<lI<GpS1hX?L)_~|YA^0z$js1v7t@%Q;|K1fTuxk-<S
6850 z%WcEs!LOkWk9<$0$CfEm+%0%KshDS_q{2*Pcx;ivMWNBAc{Y4Xu?0mcm};ll_=`4=
6851 zR3HfUzA-L=l(b114%ivF_+t@ah9Rv1J%EE|d7@2UvSi9DPX+R{5`Xz)$Uj5z2suT3
6852 z+D4k)0o1lbJA?sk^Uj8JI@0&G`{H)EYPUzZ-I3{dlJb`=AlgzsfpV6Vze2gYl)pyV
6853 zE9GxcmhUQV_btkK68{e6AyWPx<$@0I0lz#nG2xR5QzS}c!Xpy$HAd}H%vZs@t7J}^
6854 zxepRGGGUu&ZKF)I7m2V;WSDrZmhYEt*U20JiIp;^vsna*RWi}Vd<V2O%S3ncGf3PZ
6855 z6FtpFpve~kw>#fl1&IwZ=K_(qQzkAHi7hg5kx0lN=eEl+@yBM{WKOQIZHG+co5!G@
6856 z=fs<$jds5jebBw#Mr@??(XUV>c@s95`rvMCZ5DLpU4W(8*nyeYp=fs25)cr@t`ukr
6857 zJn|A~XW8TF`RIidWTjt>k%qrgGepdt**yT{xY)6j2uc-ln)u{xMQsXGTWW287FHmd
6858 zlhxt2^`KESr^6knoaBuNd!&K)f+!5^Aj@a;$OJ@`Psupv1&~GgjGjm&%QF^Wvoi7H
6859 z0Q?ih+fbbupZA2;$ueKKb!HqvRq_?x8Al%kIYn}gBOQK7)en^CgGkEK>=poo8Q#pQ
6860 zm8>$e8eyqEb1w2_uVmJUUJ)uYgD7{A^3}-cZgj>{-b~Yc29hEGGA$9^lt?j!E}4@m
6861 z;v`EZ(gdwL^eJjhv;PJPx`?jb50bF9K-y_%4Nif1NYtA(6xk#XLpcS?Vu`NE5$)R7
6862 z@v?G|yVX@JG&)}H@;gpKShlNU3H~*tPw4D88S!!{PpJWUg8^T>z&Hev+?KfzWc){I
6863 zk9<iv)C-YTnh6=Fp}5D>ads9=q*B*am*Jc$<qGV5s(Vf;;BvO<SUDSHIoousx({Tp
6864 z<Oe<jxv!L~&xa{GuiKnRwb5}d{?(G4Z93LqxNVc1;Ap^iNe7g4Ivr~k8J*6Uhx5CX
6865 z&qQYwDDt>&uv|AfowW*ZA2<?iPqWd~?tp+e0|3#-Lpn}3(LB+49cP$VqE?x>LUe1k
6866 zOk61vePv>%D3S+ys#s4+N56?plY|OY&m58HDRU}?o^di!C5oVdTUk$D$GIlDMG}Il
6867 zo~u=R<_T6`D0&QviugiLiEdmW)A)Yb({X}1Y09D6vGzvjP{Bp#39eVBmvDNtq;@(R
6868 zU3LaK%j|(0{F(T1W>XC$-vQ|?nS&QS5^-)iJ7}0*?28`fi2Q7vOcfD5k2R&)2jH_E
6869 z8Yrt6goVs(xExAtgIvWTi%?-hqhX3{!;5uzx(TmXW1wtL0<bVC9xoK%;3yvNDi&E%
6870 z@px7&vZcY7;>b68p~{rYF^;V5tVO0p(G)QbNyOGltJ0RG;6Ss!g(Bzr{UL(@VIjyk
6871 z|Fet}Nj8>DTOkUO<=ceiyJ6~<Hg0n*7g>a|<sw^Jz8x)>;^SzA6rXU#CsFMEOHeJd
6872 z_PgCAMC!f$SUEA!7^hp`bNNCf{(CO}J;{fTehGB6>jz~;M_c_cOsvniRWdF9^2IQ3
6873 z@Q5Z4Z%4iX04EgTCy=rI*=U6cKZJvkEajU#=)XQS5EW}YSQP3U42bNw{-WbT0Lw1w
6874 zuZRm>RCHWd<aXTyWxXI6<^eI0n-2l)T#WkzCI-H==78y1^B*xZsL)Xnjpm13=%`ZY
6875 zs8Z;^YN0lsvtWWZ@k7+q#^cu1Mrn6j5B4@Ra0LuwVPx9F7TRu=V^I-j4_j!Nuo5!S
6876 zp~6pTj|d`_dP<hUjXGqhr<77piBeL7l%<9ps)iS(hJ%iV7ZnXJDjHPzFN!@cNo}H=
6877 zQpHl!!u>VQ#73lkM`AsQ*aXpeso(X+8NO=^e5Bc(pp{+E0YG;25=5<;kd__21T~PT
6878 zpt7UULw$j7m@_C&F=718BTk075#RW7J|@f=$i;(_%%`O256Ha$!q1^zh<x)(>`pvn
6879 zawZyxhfL1m<VA>?vxWKV9$eAy8pHH+UcZoGUgaj{LnRgbGMXGLhljXOz<DwVa<Hz&
6880 zR?2FGh%6(Hf33q`@A8Eh%g2br;}PKZ^ZVx;=54rO!~>EGm86l26F49E7b<v|H=lr#
6881 zc>^gcU!q_)e0SF0Eb}ab&#7i!e{-@q4EB!T?Cy}=F+)(SqvjMhBO5YC$_&qZEZY|5
6882 z0(pQA3w-Eu@l8cn5_c(bJ@&BJ+(ncttiW7un}G&6){KV4Lz1dir_}9ovEYkNr7k`Z
6883 z@P89NU(r1s@U!6Wk-!<|#c}OfV5Idor=+givf>vh{mpVuNGXX{`DDo-w5k%g0m=2)
6884 z`_Se2u4!ljzLgVA=pSQ(%R%$+A_c1Xh(AX73dK0o`6=l<b+g<$uuR9SAGYIs$$|cN
6885 z`>P4c!o09D#V`i)o9{6!Cdt@<QT-^C%Da=|Iq&x*4EiMqX<y^#=E08=ID`txyFEw@
6886 z-2pj6{{kOQ055?GF@QrNu$E$pfq1>=<5`+H%#Ax?EabI^YaSkXyq#NKKSBoKhFoc1
6887 z<LBnVg9sd4$U-p*!*Jg<jPD$&i0%p?QP2@=n+v&vn}{1f+^djtD{}5;juYJ&u}dLe
6888 z4o9~;ZUp@25;upqFpj{dh#o%zJqwf|K<Yu#07G0EFECbPm>5R*S8Zs68eSL@r%Bwr
6889 z*tG%axkOio1mc$_QL}*542Uyi1ynl)I?~mT)!sq;Q;mp+-MXBaLqy_0T;uTZ3lhwY
6890 zyE{V!oTRM0bXX?fF%-9Y8+tB&;3jUvUscM|MaeMNdCtYc|K_|ASn_s+SdF82BxVif
6891 z{o@9sVuA1uaWNIZfDwmzr>7;Rf_%y_ehJQykq*ekjNT3CLr{Qn9QOSRdlZt*hs45;
6892 z%WWmW+}IZWFnBaEa7Bkl0e+Z&a!M37!8hhgTF)O73f3FuBOZLN;8|A?(=x|(Pk65A
6893 z0`CPAt{aXw1AIVeio@LQxdj+`_fuXT?{%KHf!R*GAA|Ni3}k4xm@M&QvYF>P<~bm|
6894 zE(s7*5Nr_WNGWh9tCxY|D0~YN-#C1iB;yEgZ1`v*!Q42Z8(2Gqt)0a}h=f5kAf$bb
6895 zpPL6SB{1gl3^TJh%u;-vfAY(-7~sz3*_nF8Z8RvrcjKSJj<INgGnsOsp=gm4FF4fL
6896 zm+oZ@bUO~hdFV{22w4N-3&vkvj+$jKpkduG)iB0kGtIAf;fARyXJ&pBOu7IU_g|re
6897 z$NBhSeiggy`++3umTRtWcu_e15M51BB_3wFIsY{9*H?t+(X(MAFO#|`?+g+gM{_?_
6898 zK*6!t;bXD0$6`mvI+uw*(z%ZNaq`C@43n<w@sU~Z+C8WdGQf-A%&DH`keKXgd-4*z
6899 zQX=TG@xuCsWP9W?3zt)qt<WAgO##i9;I+*YQYyes|3((kR~!R`ui)c9z;R-r0@m~W
6900 zp^wm1r4CRkt8ke(s|4biiZvLNan}4y7KvYiLCb$c%pnVwANWY)Qfz>kYjQ|oa*`8r
6901 zyWvLIhau+@3gNLyzPNEjY5{(j{l)DdiUs&#UaX}D$Qwu}f1r~dUP#kDmV=%VhdIg&
6902 z!E4O(=2BkXOco|H+i^7xx0`^Bo!<_Ad*x(cR6H#+gx|HxImJedXR*kU|E&mC-wvFF
6903 zJ#FuEYe&3S0vto>5{c`f<XC<LIJ2p2NQo+3F3cx<nTFp?ICQL|2kUw$ab3=U!n)9Q
6904 zsK*$%jJ*p9z{O#1+;}FWZss1ijfBDXlHd$}7$D+k0{$T6r@*+|JO~Szr9&uFKB0xg
6905 zP%Ix~Y9*8dQ#7~WI0oZl#+ef0*k#!DH12VLO*Zr0VQ&n?M<RSoCc)fz2i$JwJxf`6
6906 ze<NY=TO>G*f@l!OrNAGAeAy^0pfrkEL$Q2JqlQ4aAKNIWAT}y23&u8VnA<R?2eFs2
6907 zhPVrh>{EQW!-w0a`1bC+6O@%_rAx-(OcI>tbDv%U{6WZ<&Bp>t^O-di%R8+=!v;gS
6908 zAKQGVMG5<KfZKGMvwAqoF0}qeT0fZ^=k%mGtA}_pg_&~Q)<Zm<!n9)}dgpa%Be*MO
6909 zsU1uD=7&f)cDy}AYm;k2()b@DVZdJfV@N;yF{D5J7}A?RL_)*A{~?li_y|vRpu<n?
6910 z0^g4z)%_3&<Lg#QN)Y_8LU4K+nLB?p^Wz`Q?CMQ6^z_<C|7d3LM>Bu^qnS_sXy%7M
6911 zn%NOXS>kC&Z~O35F`Yr5d>X^Go?NBW#H>;-q<cYl0@{a%c#U{!4FzZ+a<z$1UGXTw
6912 z4|AT0-#fu`i6w>bd~%-rk`yuuL~gCKERpFtXPHw7zg#oSdhvZbQVVfS)ZmztconnE
6913 z9NG(}*;A}yhT|h?KC(zKuQzYOav5ZKp2flmVmnUz9s=7LZB{$OgICL?pvRfOhmz9M
6914 z&gDklV%|tt0iI1aovoxN;6r*oSP5{)UJLlx2z~_N!?~<8W$+re+;H`l0>4VZ!+h9$
6915 z32gbFZY$tYD2{DV@RYX|O#G?06)T_`XV&NdZax4tVwC5(3y|&rJFAgwHIWAir!+1A
6916 zv%#ZKI(A(;0$3AeM#{PkOW=X2vNCnc<3(_Rq=~zksUESm;d>ff!8=y?)QU?Xv5^Ww
6917 zdmMuv1%<E2)(bZ~5HM-$?p%^~t`F}_R>+&56hz#Te$e<CX@uZ%G~(JZt+$LoFvr1>
6918 z--B?KkBg2`4j<Yr+V7UbyQV6c&z=z$qFpWvCyE;+OIs?s4vD!L!&|JE6R6c1j`vww
6919 z!?CJ1=gA0&TV9cgc*m$e>c(=Te`2`>Ke5~$R4&=`KkTfBB_}3!@ZpXVNLQ<Ygsu4M
6920 zl-9VNg4#R6ER2(p8VZP?@8V8HO@PxEsjrG<oY?{_xKO|Z@v8DA;%my6r~h!jJbhh!
6921 zdD=%jZF@s511}Y2567$t-$_9bRBkNHr8VJUZB2OCSrd*H%){baTogIof(bbAzW0cu
6922 zzOXg`Px6j>*2zq|fE;u33lKN|>*32!AzUwxdmLSGG5OL-$xG7-5B{hGE=|j2`YX@N
6923 zV7|5P-DNWUwcuOp_AQgTzj4aT^ta-BS*%v3zjM;#Z-CHN4|A0D_r5R(pW*>x%#{fq
6924 z8;ipnWc54$f4ee?CvqNpCCoD^>$WUQgXhH;(B%wO!i*pebDXsrHJ9+EZafRaNPx(c
6925 z$9#~SYo3@Ir+Dl_(5to*x?3FP1nWuEd#aYI_P}EmS+2y&yx_;#vzqLYU&=x78{_e}
6926 z7wTcovL=AGvF`&u_6_*R<K1~jB5m;J4u3o@Wz@r*Z4JE;3it?@1*TGJ@Kr3-vao=J
6927 zm}kp04h-{M&vtCqzuQtBiCJ%X-i={7Gdn&-KLJ_N|L*X|XYN^GCgIL7$1f0^1U_na
6928 z5|{&?Qu_=6^Bk)VoBKcaS8wZSEcYYgC$_&r39SfOM}No))pA~KnPKa~i%xC5<H}z^
6929 z*o*}-x=g)D;vH!X;rJ9Y;o<<V@hcM)z7y~}9o!jnPNk@Px6Dsjw`W<hwFj!-@2GLR
6930 z8P%V3@Obrjmv~-3(WX<W#}&|cK}*;;{2J~WsYP5{6%tg56QFAmS{fy;dfh=Cj}VUE
6931 zm;I2AmlEi}@8drvTs#}_*tu@a_>EaQbUgH5%DM-ID`S=^xCrXa`8e@8oq#3Ba}Je+
6932 zFm&><O|xXaN5xU&0xlP$5&gc2bCP!}UeNbQT7ny9H3(7R=SdYhgZR{Ihl^nn2JggG
6933 zCBD0KbcmI}L^1YPTX@1_qddWd`&GVhueSIJbsxA8UvEtZO5xQkAwL^G%o{BHDT|{X
6934 zpP9xa95-XmbJ9c{fH5Q^6My*kZ^#utJM3gY(8CwL=b$z2w?4%Pw%vlio|fWoQM?RM
6935 zJUoBCTneyC{yxQ#JI^vFG2TT8PF7|w(~&*zyK=`b^dcp!A(<-At4i_r6#0PZ7}&L!
6936 zBX+yS6_+^TY5g5@x>vb6JeJ47JDzk+OFfEKIi*kE;jp?da7%c`xtcnD@5*hnT+7aw
6937 z<P`0EqYJnF)P*;=^-3=$^F+t@T?L(gW|$q#-Wi?Kt&B4>I+~r@WWlpbPqvYsJ_;aM
6938 zZjlHVWcaes${3bDJiVy1VWegP1^N+Bm~N9|qJY^ZB<;SyJu4NWK?uNvZ99;c-r2M=
6939 z($ksOzJsH42#`8ZGPS5PCNsE3_}Qyz7Ij9=Sv^5dE@XC05t`gOJBg}bLDku*BNa<@
6940 zfhD`qb+D+u8&qJ+Hedy(31%u=)4elTGXkDnpDro^^UuhEN-(?6=|!ErqG@NQIx66o
6941 zKag;Ia`pfvrw8tLc@7{>wl~KdeY!}dy4re@0%$ROKjJW`z5%CW1J0!y1t*(SibU^p
6942 z6A9;$m5SazWQ(BnRa=3bT+sd2F+%nEuKgb9_zS2e=t)do=$enoi<Bg+3;R(OM9xWv
6943 zNb1xE?a4jc%<qhe^7I+PXL+eczR;K-U1b6-A4vUgTxA-b?(4>Ys*4%M(gPr2NY20<
6944 zQsfv6yN!S*C^8tnN){@I$a>)m6hvU3b&&y#;ffU^5Jse%Wv5{cBT;}`Z`ExvZW-<N
6945 z3O2le8V=6HWFa-2l4F!4R67<egfFgR`!YuTc(iN^*Z}?!mR*9r$nPwCaj8>KbZ1OK
6946 zpBo8iNReU})I33LFg#OH6~(A2rgG48qff_pzbwZ<p*}-Kt6^Lo1HeF-6a%E!!_-jX
6947 zLOl7x8SD^;X_T?(?zFJLVENB5I`FWJb$71d1pkE7V=R!l2|nQ>B@WY=$|4s7U0dM6
6948 zNaBOZrZJhtyU7OAC}oi?NimL^lQ(nf1-Odg0YnzLPDzy6@t<6iX-r{JEjVSfUSt#j
6949 zylI7L_}PfwjuCzq`#Vqxi_H$?zmLQ%4phP-w*u7b7R)7J9-U32ghkh=nQT<LqkCq&
6950 z1v7QsuwE0#1UiFm7G2%b;&o5sYI-=;m9XeGcp8gqTo(JlZSXXz+d1*Cau&KqvG|+=
6951 z&0?ee;l#`=M*|5r(0Q#>s)WT`39^hvb2BHn^I@b=wsZQ5B>C5q7<eV0Q^o8GfP&P{
6952 zg>HKt4J2?2@b}huc#L72D@n%p$}#q?rX6{#p52O=Ea85>Nuo#5l}P`O(bb-Gu&vNS
6953 zw<0NVHS8CU(U_%k_=lUXk~-6f>#4ouu!D}{rm}bjExAo&CX43~ghPF5oCo4{O=ev^
6954 z99^?nRCP`ML0ujrFOK6Sr8$oBG8RYCQw<o^ERH4!Z7<u*sd+Au#rY02nZ@@V$glgD
6955 zjVO1Fn95?rfl67tLos6NW==iss4r!aYfS9v_)4d6rNbOuvsmP|qOK_kT0Sej<x}EY
6956 z9v3>?re8YEEMf61$B0s{oZAW)4sPR<4y%Mk=c%kwsyn)vs+mD&j0l$NT@zSzO_&yM
6957 z!Zfz#SFQ<cm1{!W{KzKUs+hp?-(3@U8^_aK<!l1)JO~5&X3Aw#0Ai6%NEGxRP(8;S
6958 z8wPHkNUEmO*<%ch8!TTDKhxn1isKxnyc2YW>6pcISoq*!8q-)jk03dqI2Cq@EJk98
6959 zoN9K7EVjfDWrgl1TW2{1r?QysK&33QJ#qkXD&!JbWP2o$Q>$Dei>h_;lV4{l(A6mz
6960 zH)a37H-c+m&qHsq$PJUd#VPhY5Lr~4Sr!)}rPMq>ojt}iMit4d6fylM)HtvV)G0%V
6961 zatWOiT=cjm{JUQ~64kVp^6qxjl(G1C2b#v>2)IecL%K!E?&srF;1#D}35%VnAk1ej
6962 zUrI-b{iR!qMYmMk<nkS{T}s@d@fo5VptHv)i0hzuPW**a=a|NHy$uD_yvv<tma&Lm
6963 z)Zigq#;KcKB8#^;&}0@LiYY7gxSw2Uxl?c|i(HKyrJRboL>9Rw2rw4aO5+D^e5F&k
6964 z(uI!tX)JQhXvdVzoLb=!r?7ZCL6XQRHU-9;+iWTMsX&9HtAs_a9Ab?XZFE^Iy1L^c
6965 zvVz!+PN}%+S@G|QB70XiG7&4@r8+A?Yj;pJZ#x#1vB-aWm)L^%f>XI5{<S$CrZJnv
6966 z3kX78Q#W&JhD&7eiWnlNHo8O>e-%UI)RQie#iwG3oZ`lTjnY{6lUw$8$0d_lJl9b_
6967 zjYVz?wrsM~vQn4GBDX~nIfcJ{#{;^CMQ)2Ea_Y}6kwtEcBy!4aSzK&!%ebRpY_izf
6968 zQ9qMKwPjPBmX*0g7P&2G$CS;S+Tapd<hDp6ryg^OEOJ{UkyCEV;%4OdmX&kM`Z(%m
6969 zv8cAJ+-cc#m&hWw1??zzT6VijWRcq<iJW@eC9=qEkwi|pEsI;-ze7>@r4x-MEcSHN
6970 zmvW1yxDeZZiwm(`54#Xs@V*PN_>lvZu$V?)g2M#JqU}I&>#TvKfa3&iU|D42Vmp{?
6971 z2BI7l?kDTwo`G9v7FAv4o8uc4=Tg?CI4izX+}zEjCOK}I#-;YS&|gXXrwh4_kWwCb
6972 zjNa7*L%)ng{*zAdFN<C1X8`D_vdx^DNhlCmtcoFWYK2SG?GP`g25>LgljttzF3P*t
6973 z?PV6*IGSg%RTVCzSGJWD>~R&b=qj4ciq3Epm9SXpKyefH^`x`a)y<--dnW7lJBs3h
6974 z>=&ef|3nW~zAU<mrm><~j-t4Uwu}@7=$vA}pS{E_5p`BOc=Sxi4{{SM%H>PH3}cOB
6975 zR~d`Ek+2LRu7uC=1*dYs4UVo-7H=a6bxqyODXswmlGXD0W-5SxD~t!2&ZU0mLNd?&
6976 zWQ9*Ulrl$zZ@%$J+?x1;Q@P;Fj;>M`_Yx#q!>JElB8vxOh@3LXlmyLwiVEy@bd_+a
6977 zFI`Bs#Qn@7g=ag8%UCQpWwYZ8PUV7q9bKg?p0DVdx|vg4LxR@ypaOjyT_s#<m<ze>
6978 zkP<5_b0}pjmce(OctBk&PA5qAE2my;?+~TnezN)rj{2!APIJ^xW04iguI7}hK5i86
6979 zrJ4^q7L>904L#$9?{_vVaSf8v%ntG#qB8_MixrtN3$AcCl9)rP02)Z*dKY?_#6LSw
6980 z35&-aC~hLVjcP7}@5Jx`C$o5!1Nm93BFHjUn43A#*|F5$hs4niR2px*Ki>GbncyO-
6981 z=rYHK5*8OaHo)(iIdQGSo6O=`mB$IwF>Er6Y(9ROw}h?T;PP0!k08P0#7>vT;zufv
6982 z6a2@J@C6==Y1An~A15-Mo|??!c`A<+ZYWG<Z%%ZImPANwbs^ci?q__MP2;w^x~H-3
6983 z^^T%xACl<CRNQD-MV`Oe>4C--n>n$?>8YtK?sT9M7WX(s!z(s(0^e+c2aFQ-1HO$z
6984 zLQ`2}^Wp2N6`RW_pFNUj<<gagzy<CgWU<2O-r4cqnawrjIYyMQ!(8vgtw9D;HJ8#k
6985 z@fBZZo$89Oa}!+gxx3}ND$#{;Gl5P4y9`g<>OyBFxB$FM4dcncV+`G_dk-=8)p~Lt
6986 zVzM{gPhFQ~*xop00@Sq$&{ZTQR`)fTh~dC;8z;IZvxqMN!UMjOV)1kbnk@6&&nGEZ
6987 zc+4l9@pV#y2Q4~9Ob~80Qex5vPK5e(ihNxs{1B$2%z?WH7O!@o*(@%ipM^thdzNwH
6988 zPx8lDw0`2$3xo<PCvJnk%fLfkk~#Gzp@PbZcVeirnDR-sUFz64mBl)$7^0WOuwvoV
6989 z&79&I5`;N>g>}M=%woM$V=0U52(bUbgkG7vIe}LmT$acylQ$>u%7e=ic_sea)p)a~
6990 zu-RiBugqeR{eYb@#qmmz{0?`-EV4zC$SF1nh%B;4B~j@uA=Z-TuA?)KE0%XSUY-3f
6991 z5|1l1mh&k7;4vF}w7X+(+$6e>*vIIcZ8RF4&c#jT#9`V6-MT2rez1K{x6Yd<cb10N
6992 z&^fMDUZPUR$-f=QoF7+8chOjC^B~fOE@GLx&12*{oyCq%bj6xVt)A`ptb|1+V7Dye
6993 z{``aE$PyM=Jp}faWxB09NbmEmeipls>k>Q-<*YsqrG&*#9BB5>sQui@2^7h{CV)Rt
6994 zcLLkbrGD)~y3upV!7J$uS3wrvAP5?}Ev~VgdDtz-qT<YLjx!a{#VdP;Jhqq4a1~1M
6995 zg^xx`)Wy1@1lQSSQnTKvD?wMrlkAmoS6Q8u;G*=?2AtkUtmVICa)Qo}r<Cei&Y)<*
6996 zU!CFsPLBV^OeZCBvd&5HYnz`oWk|c+Pu3E2$AOzErFcr*(@1<p79MLIEu}0z>Og)L
6997 zpLU?hEb_pD^$ZUrcNk8V%H7Y6q~IPpqX${O&ru$??BGhyc7|$c{OB!ptC3QBVt1i4
6998 z{5VRd7(9!(n&Yku`^m1)9s5djHD6Iy8^^v97TE~PXj-wkE9JYj#i?R`)+vl$PkFbx
6999 z)#(;-9~>Y`!g$t6iQ-x3B#7t#n~NE1$#5<#aUB{@iHqlcRC+v}q22LwlTJ$1Zk>~0
7000 z{^B}9Ze8(nhE7UU7jt+8r7Wgccj7hDyHxYnbcW?Pi;KI-kbvosMc!iqb;bXtqcaug
7001 zMQ1dW<%y26X?mbt1c3b2AU$m+0#~N<;g|2?sHJlwotx;ql+M@ESud}D5rQwW#Dl*D
7002 z(Z2$bx$b8*T_*VYq+b+Wrj&Ss<SA$i4XAB&*7?liA-<M)Tu$e+o>z$X8l8FI>U@sN
7003 zVbtZL>C7>t^WTGS?mR{YbdhO(lhFY_P5d1w{4;YSp{CqmePwN=DqyII+=W91`3DW?
7004 z2RocZ7WSK4AIY5)ge{c>r8YPxcWz~6JY`^FRrP@|?9LPZ0sWyxAtNWp(U22MuV`wl
7005 z;5`v@DzSy3a1|Jm1Aj7Y7;_ed1EB>KjgW#?!cI@H8`Q;|s0udpXBjgn5nj|72r*s-
7006 zyJvw6Uw?qwU;~Jt71XncXnk11p@zzNxRDr@g;W4@pyFUXoZ%;P(AX-n47V-=5F)v{
7007 zDG-o*-1Mug4F-fZ=oq;b78(LkEG-8aY9BEt608mP3)YXq)}jLehXIDw3mJ669$58g
7008 zEYuyT4}y`hC{+qdDzTLkl;!*cKneImB=L!o^(O4`(#dK&!CElFYHN?UVtvGFzt%o?
7009 z#poA{3hbVv>~&VV0}sGPG#-1B-PvAXr5}0WlNLKN@4|>xv(^5CRkzjZS8kPiE;3U*
7010 z){W)}_(P=Q%WdxicEq~U4u3Fw<N&L`-O283`L{M(S@sBPlAU8W-)DDjww^aOSqGPg
7011 z?T_r=UzKa!WbS#`S~TMIFI%oyZ{N7GW_0D1cAh=4{y&@TE9@Co+wxJ(xmKko8~z6A
7012 z$Z>mabF<YDwrcm-Gww!R=WViXw`}ihYw?K1x1?CsrX^d!l7FY<SY0<+O?Ic3F1-@a
7013 zTb9^+0RAFnLdhllt?(wReYw@)K*0qCw@)}eWAPopIJUSvCB?chM-;X@6<rpY(Qo7x
7014 z{fZ|}&$l0oSSJ^+?Kb4{i=nA6nsyjSPb@!Bl%H#b%Iz5ot>2rT^UOEPg8%xP)zRJx
7015 z?(Ae$AFv)+UcRn*_(bcVnUni2I3jYu%7C0EFZ_9xRd>MZ{JK@=wK|WmHZI>}y>G6v
7016 z{;(YWF5Ns}E!ty`v=(iGk372^d{aJo#_*9~-FM5Xq2^Z45xeK^ku#>_|5pqfWu=Gh
7017 zBIqdVdi-d{k3TrlZ~RvbFSh1kM_`VbR-V?<PYUAG>STMZ*?T@{wtj1tpIbKiid!$R
7018 zd(K8-1_VHkwJ^sXIq(8|q&<c+t&DPTcKPB%_B?x*JsYB9lGVeW0Owia-|SrLcPozA
7019 zBcB5EGq;N~if4mpwZ)H1H`zU{#rQE8Kia~_-Ecm<?1<gzDy(pjT|DFGFNhXDDO&uZ
7020 z=ZMw8)5}arwZ2(?09>%rJhHxQ^y-u}>!B3SX!8Yo?y#DbfbUx}VU!*Hc(dKJ=n1>0
7021 zXrL#jliew8-xbzr5JC24h@Qed)^6iSi+#N{*K@vUHA2@}H!Lf+dqP)rt+rNL_EzYu
7022 ztIMs&S9toGR-dr7z&-#Ge88G!ANZhov8OkL-QSIH^8)Ku&nCzyw;HR%R%W?%%?K;g
7023 z4j;sN?OW3Jq}eb|!R0n=)|BE&`<>NkkI1?|K~}dt(7(T1>=}fO{DWz4ht@ohVta3a
7024 z5-E2<-sZ*jTEIR?eH{`{FJ1-m3#s<@Z7q=e`C_{hq`ye@<eHFtSmgda)ec_)9(urI
7025 zmp@*#y7<`pKzU{9s?EcL`yk$5Sq%OF<d3NnW?0`DtBRo^6JW66bkJ^-Rqx3&ts~1J
7026 z)Gg~DFf>f-_o)*=+aIk1KB(fA1!&-|RC^U9wlBuPzbo|!$nPw+y^z=fmCvwVFv{<>
7027 z7F7fM(IQlFM;f;B1Cl)hO#2u(xqNfLb75!blX9zlxZ9)lxEIk&HTFaquxo|$ru_|1
7028 zVhF8mj(A`LClfa0^UJx^UlD0A8vTt8Fk{2!sv+2M&>t2jocj!aQR&>KipCn=P|(P&
7029 zX{Zb2hQbw<^KvI$URaVle{9M4+_>pF7cK{&rQTm%Q5URTBt)^Fq`zpAKU6V4;1ASS
7030 zu~OKE4HX#SnqbIZ(+~>#ar;Ssuu+tNt;GPYTU1{G`&u^oVLvx8%P;18&|g_m3){UJ
7031 zrIW@^^iL_A4hB#1FK7ye1O7R%AtKk{hy4Q$KM>~`)GV@sNi`MqRj_rizp|zR-Y4v@
7032 zj5NVke6^7}ko|M;V(GuQKVERc4YjaMT?n=oH7ddlL05mc$$-7n`Uk80wQy-MLVjVc
7033 zFl*e{u_drU8*I6Vdyj>{*G*wEc-&=<29XzTs;p@eZK$hgng{&>+adJ#<BL(CBO2j)
7034 zj9oLgK2YTaLnZN&qT=y}+-lCKn1iaRXJr+o<0qFCj-5DuszF;M(<RhTJ7B`4P}NxD
7035 zhwUN3aUr9+vbF&n==WF84TM7yHr$=+{9-@MkO7&E!74-UjtSO^>#ewM8p1^3fzqi{
7036 z#ur{DO8YCq;3{D+HYVIuU)c!Z;cske2sen9V=rL{!U_8ycIY#32R-3Wzh7L$u_r5V
7037 zuTK$I!k?jrNK++*5Ud~;H`E6VXb2V-oq;hS_7-e}s>L>ju<=}Fje((7Uxz(V1v^?c
7038 zH7qj3_JJT))-@W?Pa(0usW*a+LYpir9cY9q)Yx7eXaei~p?uj{viCxw*CO@*A9e2?
7039 zUsaX0kDrqp!j(W0z=91f5Hx^<1dt-22?V`pfFMP%#gGD#ki--~nkYnxF$#7^6s&`<
7040 zb#$D;hOy&V#<4OwMaPQRD;DIpp1s#PcW33^alZ4u|NQpnbMM*v+0R~k?X}D4XO&WG
7041 zjNYh<)M77>9yva$pgx8gbc91kEmmjhLHOT<VQ4%qR2>HyWOSJw#WfWbaIZ;4%4@BK
7042 z7t_?LF+&IAbzyN`ac(Ku!x+#E!=TGCo-n?bQaei;$TM(pMODfC`eDQ-gU@eRU^>K@
7043 z&P)_|@Z)1Jueh<gvA(=)7^_!NhQ=-}tDIlS`qM<Ep;%QW8e$lc2j_WqA|E$(R%Bvs
7044 zZsf@95!pGBVL7=Yb4KQji40lPK>kt3&o8eoud6JjWC_iP@pO1SWaNm*kol1z(}qQc
7045 zRG8&w2!;&#QLU*Pg3ha+&wXwtc*C;dMRYKZ16}G`V^CVLU{30_$|?e=|H)=`rFLcp
7046 z(-Te~VG|rqQipIqplyw{wbWVEXSpbiT8igkAbMprjpTq8l+x;kI+7hML0ID|G3cE2
7047 z7Ap}+H4a(58Iw+&J?TV}S66-}H3gDwY*-K*Zsbw5c0p^`cd-SN*UEN^V<~YaEGAy%
7048 zJeY)J)6$B{XoH$)L)Bn2!fuZAitFK)i<h)|&yFc_AZb^Xsne!TD5NE~UBjrIcKmq7
7049 zi)!c$$&BLC`dV6~Q5QAZCQxIL7|!E|PE%-LlWR$gFEdmfo0)Zw#*W9Uy`4B_KVp{<
7050 znyywuQ_?Pp!Ae$KOdfX|YOUr4$DK$kkx{_R4Rl*cRqcWjRPQ(-rRANbAa*%1H=y;-
7051 zSZUV}!CFA;7Ky1YU*a{A&bcEgP4eeel~gaJI%%pBKvpKd%Jt-_x2$H7t-iW(5!REk
7052 zl7<oh^|d9ml-bqEHWK?op4`R_ar=Iz*2`*XOF?ZJNgnw^HVXue%6T*g8f)!9Dz0BZ
7053 zI}3EOT~JUR&&@@4pK8oz)gC#56zBEHERuGIQ}0bHnmL)iEKvbZwRTmnvkMI$T^I{u
7054 zLSO)6I@H<*ncc#~!fBJ{Oq%E!611qP3HJJCQAZohzLtzqRkMVqpDD*Xw3rc0cLwXF
7055 zX_(#DmY0&lRNLF-C1mWy4J9;HWko7B>%J#WRG}Z{Mzxu-W=Dq6g}pD?5W6XRDoRTo
7056 zO`--_#e=;Inn$hR{VW{I(tgc!w)w+|7(R^b=*&qwXsJ@OhpQnI)5>nxw1Ab>HyB^u
7057 zB-8P|Yfg<ZO6*c=8{2*~HqeSh-Bl47-yRU5S==q~jwiD1(qVR~SQqK*G4y9vqG6ud
7058 z_fu;ZQMZvnC<oTSbRt{e@PNhydJ5y5j#TKYq7x?`70H@4ud%wJ(XQ=7MmCyM?yB68
7059 z**PP!M+{VJKF+8;xj5u6JJIu(X7~qp?HpcDr{qz}JH#;9KhuP?j7yRxr1iQuG$Ae0
7060 znmi#b>!MEiX*uVo<fn~Z)A_ixGeXz;UD8Gql%JMG6rxg*32EWuQ%94W1uSbCwv=%(
7061 zWVMDSrA01ErUK`8DoD#&ld?E1tH3ErROoRt%1|)x2gmfFvaAP{WjzYhijsE6RbxV`
7062 zH;!a{VI+Cp<=Ez@Wt^XspVn(lXi8e7tV>!i0`k+sC!{9jQDUM=6r>iU^*Yu>bErrT
7063 z*#_Yb{E;pfq5S!wiD{8F$wg^-N#}M+ix5JBsOghZjk_yxdr*fmlY%n&C{t%^C31dh
7064 zEoH;@2&POzJ0;ERl9ol~10x@oI<EslqT5-sAa#a9CZ>9GsIFwbz+%3YAFGo(k^6=^
7065 zbxlekweFcNrhDC*C#5D$?1<*$xx!xbJA-AzcCh!Fq?5X!tr1GD;5>8l#pIoC@+`xa
7066 z-<+U)7L|XP^UU|MsXX`Pw6sVlL}QVA^Z3+4;>w%dgYm9tYz)O8%U>jiu1|_PicGs8
7067 zZ!|xHY~Fp1$%{88XQaKI6goB(S00TJ&&#9VI+nMQ;@;Fm^CRi(C#c__rjCD}rq>HJ
7068 z$X-kfqeQ}h;gsxsxi=mmgbR3aLMZltb-UaUt{TP(AzV0&6G9%pjG^*ExQM6%9!*Vh
7069 z^pTHk&?im|E-&kw^@A{bHQ)ClY&ZFKzy#*Y+qY((6E=nM^{lFyzl7nw4C>8eRm~hF
7070 zte$?pV}~!CCep1M%Iz3J)+ca>jF9!B8VB#%0Rs^7_&F<;8<M9dJK%ixz5~v8`#Ru!
7071 zDZT^FcTXJrLK9EaUfFxZ3S2_bj94;=U7Y~GDFOaJ3GiH+^YP?wO~8LN0seFX{DlPg
7072 zKN8^YC%`{Rfd7;L??h8EUc2^BfWw=0Jbu3f_}>%Y!wK&}BVFDMlYLcw0{(H#m$!4o
7073 zzsl?c{1WEN%M&@&euPDg%WDX71O9Br<vD%fH!&{HvWt&|4UEe}=w^K<`I`xkXP;XV
7074 z;P|>xJpS(!;14ChA4`BglK{t8Y2wxUw*>gR3Ghz{M?cD=a`H`vpAztKQzc%#-4oz_
7075 z65xjuj(X(=ui1a0gYD5con1PolQ;!8N7VLcIJ=Tg#<Fu<23-`j=#lRAB03Oncd+b;
7076 zq+@$qK+b3RB3ylNoh`d?;ustxH`JL6BZ$}&P@D?WnR@%nBUBa6g$=1nPJ2<h-Bk<}
7077 zrISBCU!yYa8C2|C0vY8E&Iz8qO6Qrg$_|&*h)ri8a&}`cDH7(M)=*Nem~jr8BPTy}
7078 z#m<}tqlCHe>YgnT-#yDVCn2O9t|7`PF;Q>^ZO<v~8A$sJE>sszL--0MrR>END(9Xj
7079 zQIZ79buwaAo2z=zG<K?J<D$7-h^9}|VeC+#Vdaq%9q;G8HWUG*fa3)0s*#6)<5vXm
7080 zalRt_1pp}kKa_rguLVd!<1%h_y-!(sP;Vbjzp3yeIlW8agE;+#!t*%&EpJh8Z~BRz
7081 zSoaaMKEoUwx(I)~gX5S<@WqV7Za9R=p&!C(haaJ|@LzQBz7GD5BM0`Ec734mY|2B}
7082 z<;Zc{bub!40h@mGlX}N8F8vD*!X$?up|tSlIJj$vGZNqzJMx`FIqzzR@5;Z;;q##(
7083 z)lT1?Pr!f3!Cig+<lz0Oyy*X<gJ(MUEIyt^wmbe8I`{yGzk+eGo6L)g6&|HB2$wl>
7084 z-1&05;!8h1r*M(~QUW<YD!$0spHCgoF4sQu8JF?78A?*9clZ%Xi`|wxxGQH(0{jXk
7085 ze<_4hxJlu%j@;?Ui4aff-RAJ!@c_5w2xwP?e!_pr!CgK7>EQhxzMMiq&S4Io&Vv>B
7086 z;SN5+!LuCvj}AW2!9R6y%w5s*8wVfk;J-LH&b5R;ni~&&T>WP`_yC7r<=}lCyoqt?
7087 zcd`E^4nN}XuXFeurCiVZZ36xTKE;Hd?mQ}CT<YCzq|ouG!;cUq?X7cgjAg-JaOAl9
7088 zyy5U&IiD&1RFZ|TI|08dpK^(wJ1pJXpK-J+LO;=Gl7qYUpX<ossc9rFba3b|`>&M>
7089 z$Jj-<B7yuH6W|B)ySt))g!cyn7}xrXPiElQM@hSma`^5%nwkJFcj`sE&ZHkgjl+*n
7090 zTI4TraJSy;966W@b6Ef1I(%2o9S-h}lh>7;bu8y?hwsYyMDe#We|G}@9tU^p9RkBs
7091 z5c_|`az-((?LW@JT{*`(a$rvx4<|bO;e?AlOB7$mRb>MHQpIm0SqQ5gelDd&KAbTk
7092 zU;}+VK!U=R3HUcFemAzm9S)x^p9k_EQ2axf|5yUPxLZUv^cl?j*AwvHRr1F&e^&y&
7093 zI5rgdIR7>Q7Y-?)A6@&TF)sW{=I`(D-S+lZ{3XmE?C@RrV-)`y=9>$narCKB{B=;8
7094 zLaie|LTTyW^A-PQkSVNBz`xbuW1jYcK`7jlfd91O=Q01K1pE&ae*yEqNWf3wOM0+B
7095 z^jXLJ491a+&`;WXnBs3?eog}Z1c#6D_9gug3KQ^8SN!dk?kz~bU#9qSeP?X~{*{V<
7096 z4v&Y;3HbLa{te83I064>2Omkgi`|lgmssh8;to!qr8fa)9PQxU9ej*~AMW7pese72
7097 z=tp<IImN+Y|G%>SCpvPDa^$ad@Uaeld>SPvK+kdXlXk6g@bM0Q0Ke)AJ|49dejf*S
7098 z_g@7L?((NQ_y|YNHV1c)mtJFB))OjX!aEK>LWt<|rNhVgkFxRhB;Y4y7;(l9?tUka
7099 zahXTEd0rGce7D{+96tKxE$)}91pL(wA9~7tgo_gJuXOm3kL!O3n-lQ2ICu{6#6G`w
7100 z@WBrLkb@uN;M*A&JIH;IR~>%D;s4FSa~ynE0{nXicaP@_x>I2aFnd1zME}{0%XpCE
7101 zfm0m5dpxkx!QJtEor6zs<Ug(C%kjf=4&Rmkse`-nyY(QU6rjH=e<b6ge;Y^?#yb35
7102 zN=tk56kq0h)Zx4HeS?F$^ZhO*=La4?e{lHj`S`02?zZbo2cPKZxhH}AE_@3Jc5vlS
7103 zad20Dxq}xt@|QUHp$`6>gCFMLZ#j6DgCE1UjG&LZE^Tn|!yW!t4({sNWj`WOfE-uP
7104 zfe!A<AIrGz_p=?o+wW@~KGuiLypFAR_z}WooNRLVSRdNxhwwiR-<5x_gS+d%0}k%4
7105 z15Y~gp-(OA^OD1l5H9+>>EQ0XK7w!Y!ETtl!aphjJ}m)0KLL)mBf!o)HBFj#;|533
7106 z^Y}W5aKHzC5es1T13u;$0<LW$VEUj95(aVva-=LEtbqt3Up~T*V+I7l|HS7}7&8ch
7107 zKL}$}m}EBrF5jmvRJiOHW+?pce4bpQ@H$=xDiq$p*9Fc}_+XZ^O5qVsw<^4xjdZEP
7108 z#g3a4KAP*jRpDLP4u4d5F5}x2eh=&Ul)_V4{__fdjP3u5!e{X~aj&;yoLtLt-ckH}
7109 z*`6OMT*k-e3SY=_zE${4Zr4u=U%>Ou=XzwET*z{IDqOxx*<0bbABZqW;d6NWk5u?)
7110 z+>a9!UdVQvs_=nqx04kvcC1kNE|w$XQQCDH+hLXB-^uue3a{pVzf$35!cu#0Qux<w
7111 zw|f-6%vi_s9#MEP+y74r@5Sji6uzF@^`63ev3<T&_yWd%QFtFt%laYq`JUS==beIw
7112 z7#D{xg3CA)pDTj@iQ9Dy_p{)8+0KOuPvLPgSK-|luTc2DjMpptV8&M~Tt4qC9$7@6
7113 ziEN*16<_Y7+^F#D*=~0!d;r_$L525YeV$f$CflbIZ$+PZJbp41-oX8Su)<Gbxq}sc
7114 zCgZsZ|CaR`rSQM-_#ChB^SHee75+ZslNG*z@o5T|ua3(7AZhQpY`4=De=O@+p>X*O
7115 z>sbo_3)^j_!bR_9g<r<}TNQo<r+=sLBU#T!6uyA_MaH|dYce7f#9xHqH*vpwspM2x
7116 zy0=H+&oX}>9;YHl_M`hLd<vHzt?*XH3l#np<3$QTkn25F;jeRA))mnw!gzz?|BL0E
7117 zt8kg0;)X-yl<@cwUmSwJ%j02-lCzxo_bYro*Za1@|H}9$3V(;w;&4Oiy^;GjgV!y=
7118 zU*dYR6n-&}6S<!ye7UcXr}!T-zfj@bxZdRopTg<Y3SY<R7KIPvadoxA@8o{JS>exc
7119 z`W}T}$#Nc6_$;==c7^Zc^s5RVE&ZbKmE7Ll3O|a|$=v^9&-a+$UEz2x4B=3POTP?M
7120 zxEv21sqpSR9!^$x7N^S<zL?upr*NrP{1S-%)0r>l2ZD<}*C;thgFxX<h2PKX*n<j}
7121 z@6<n|aM9;gg^ND;Y5{`iBlXIDL+~9uev-I;!R3?r=?c$fxrZoR<WE<48u#N0g-_=B
7122 za)H8Se|Cey#XG|t3Ku&+rtsO^F8P{;wCgt3M?Q%z_+)O^k4nzn+`pYzU*V79ah0L)
7123 zag57xgzyWv-jRwg_ai4N{ASi?hQdXk(-kiIR4QEbaqpkvJY^xz$7aR<gxi0O!c%yj
7124 z-mGw+<=n0C(P%h@hZO!E_sb52zs&f13jdVt@P)#E%jrD|x3!YrSJqeTFLvvtaIsr|
7125 zg^S%rDO~I}LE#T@#Zwf{mzTXc3SY*0%W;S3DdV<Y@nzh~2jPW3gYA5w;){Lcv){rO
7126 z`8O%P$iG|RBL6{!i~Ls<F83MVRd_1Ti_aDQ6VETRP>~Hq&!IdXx^nvjf0M^&FNMo}
7127 z^h|}zx-&uHIjo1=FBbVS&QDYP6dvab6fWa@mBJ_UeE*HYWgWX!;WFOtQ+Nx@`Ln`B
7128 z&RYr>IUgx}Cy&o$=e{A<0g;oTaFOHQhXr5umwAdWz8?w|F5_gb!e#%uSmBqjozGMF
7129 zHH=@ZaFKtl!eu|bRpBE4Nrj7ix!(%&p}jY8y?;}DsduNs<qPfUd|^@Ke8%&Au)^g&
7130 z>{x}%I6PM4tj~0X%Q&2;@LJ|qF^=IRQ;wqE8pW4&vem))5<ckOr4A1J$ojd_!NEU+
7131 zeh4=>IQTNIZg+6-uLhaIR)x!R5sx@H<lM*mg=ZWba*pNs^1OqCFYEB@4i5fy=D+3O
7132 z;LCdczJr6G$;SKG!NHgH+;{H7g8u;X>BCVbU_1a%;`QxNh0A$gKgOlMp0ve1`K+{z
7133 zD_PGcIC7wmtmlOej(V@;dgZ>b$p0(LpYQM?N95NjT;#8CaLE6T<)6p6$j5sm2sbGH
7134 z1l}*)qwsRZA5?PWeX7?KznS@OD*nq{?+*&kwd#01_`bI2c`D;W92`UKV8)MjaCB`I
7135 z<EJWo9plRszM1h06#fI_8yy_=<}rSo!Ur*apMyi6gSfrVDO|4GzN_%H%-`eSSTf}P
7136 z#GyQK#6F)hf0%<q&urEw=48M=cO-gFcKFZ}?`<GdD10*Gs~w!Dy5Y+=%SE44nSZ0h
7137 z2UN!Rg9_is_^S@iOQezinS+D+N9Kq5el+TJ_37c@pgzj{K?;}m1}7+7?wg;+xU3I%
7138 z@OZ9JxLns*uJ8hGggieW_W6SKxmMNt3*&NsU-<I8!Rt!CxQhIz!sYqhj}$(SjkHJM
7139 zA2OcO-I&`P?_u4T&Bt}=3jZtPhcYgD%JsOhihmmKXY&<b?u!*GzC1r#uK3~-SDq7)
7140 zdTV%nyIk?bf9>54j;6}G@u-8t^y1w1uMY0=cRD!u2l06DVJr%w&l1LaDf}G9V_)#L
7141 z`~3?Tm*)gT&hHqX=g7g3nqzA7yrm8feV%9jr4G(rYf5Z%aMNDq|6bwZp!sQq%X_l#
7142 zFfQ{#u0MaQ@RRs>K8f$|OS^jVyy(ri$oZD}nGVjk^o{<x4vwnieB&sEFM~h|$2hnv
7143 zC+gsk^Ec+pmxV>2efc=@WW^uFcq!x3E^*;{j^dxp{3gX0udvrDJelotpTfm%+a38h
7144 z9@vNVe?{@vvz(6=U(Vycb#T~W73=w<gF}8c%kRWS6#M*%`SJl^!96|>JILWfj@(xm
7145 z;NYltB=g5JF7_0Ew8aX4h1<1U$(hS?)+&4@<E;vp<KWAbd~uB{UkMg{zT|q}P<*+r
7146 zDqlAheiBc<pA~-`<FStd+jSt1ad|F9?D-_?Ka3w%5PS?DKe^AVz@B$8UZnUV`FLV3
7147 z<DzE?*V~}@moi_TdlA04TD@Ay5#Ol4Q*!QSIS(rQEykZvxX=6h7ZS*SSK;E<^#=#%
7148 zCXqGh*;))f3Znm9&OAinmoYxf!O`Wi-pU7qVSiAT@_uKQ!^gVX#&Q}Nm;TD+cFCuU
7149 zMb13lKdx2$)0p4v;E4Xf>*Qq)j(#7-`}M0G9MPAd6onfd9Q^LQKl`nNBP!>QzjJW#
7150 zcQOAD4vwgtKejnI_~HuTS;ocw^0ni?IDAZzJo+KL<KU39n%AR`75+TqUn{&9&$piy
7151 zK2_%70j8Q@JjnIvK?(3Yg^MG~*$(cGw|Nc@(;v&nOG^|k&wJdW@ZQYdq42X9|H{EJ
7152 zK6l&Zct1Nh>RrtIeR^4f*nb1#!xern;}r`3neo*Qj`mLFde=KR>OF|Z^Q{gJJ$Eqw
7153 z5yoZw&*kyF-Qh!yd^cdH!^e1#FT{VZ@IE~Me|B&Tfg@P|&IeirWIj%0epd$ve?04d
7154 zfP<sni<p0igM;6T*MY+w9Q==%e}sdBe-Q6SMmae6xyYoD$GG&@EY{~##g}!YT;ZEp
7155 zPPM|HXS_klm-{}g3SYwYZgFt*`;kUVTIU=b{dE!Z-*Ry9<+<Ol9UOeQpOJcy6)5e!
7156 zmF4tT_&^>f;~gBPjG!Qe;~X6FbD3YP@S_=DqVN+LzeM43-TyWRN4w5Mr4;USaMZh;
7157 z<vg!&`L4x>jLSIuocrYqg=g`6{z2gvF#d~@FD^hc`2<JoDfm$ezn%4*>EN)ZyuViF
7158 z;Aoe8f1_UE;*InMg$w^-#-+WFu>Mae{5!^9RQM{M&#x%?;`{T51b8|gVx}N=_?g=~
7159 z(81AOd2eovgQLAZ6s8bWxVRy0RJhzXZ*g$Qm-qNKJ2>RacS{~(T<r6EZts%{|CI3;
7160 z6kf>l>SZNgyov5kfT!W%YzktZvE1G)2Z#RhKHz8vhyHoYKThGj89$40Br(ME*#0XN
7161 zU*ufp@Ub4A$L+e&!68Skhu`Vo;J?HCdzJjztj`M$?ygI3I5^t1i1}YRxV!HC?BL+9
7162 zW&Q!ZDM11D1iy`b2z?zKe7XNL&cVU|0AvcsIym_Eu>2AS2VbtkFLZG5pJM*`4i3J&
7163 zpSa$^!GDwaw>voaa^LWN2M7Oi=D+0N;EzSaDZJ_6;LH83Zyg+bc|UQlgM)t%pI08l
7164 zI}WjDCCkrraPWsR{}=~{e0e`{vV((fKBPw5G6x4=-cPJ{aPS*g{yGN-e;xf0u6A(n
7165 zFK7O}4i5g!AX9kU!NLDM^Z(}Hn0NA==qC;i{;SMSiBN(9%mRKMGAZmIF`Hmsf5ZG7
7166 z2M1r?Pt0?0h}f6UH&1qO@a4YPnGO#A2s!U|aPZ~*#LFEV{37Px<>0W-m-Iu}7BQPZ
7167 zf4NV#!@<GdZfV{}4i5S2SbkDpOMrdAm-iEUI5_w>Gyez&2VdS#9OvNRw=w@j2M1r?
7168 zPb_5|(**0)zI^;y?eHN-zC+cd__DsOcW|t4dAz^B!oeZGkgwxyc5v{QGXE9_2mgFN
7169 zUft&4;Qz?{CmbAnIlp_+!NK3a``uR@9DF%{{D*^s{}u0tK2!KqUQhQZd=KL({irYn
7170 zpMJ2L+;8j0IP47hRlJT2R`{iik5KqF#*b!P<S*sxCnqcZJIpUtcrwq=DuoYX{46D3
7171 ze9K;@aB;f2#gPMh9?0wMeGZQHPGR|59UOew|32a1;9tZ1?G6rpf0n<4aj}Ew^HTym
7172 zqdyg<Aol-=<sZVh$hn`dV~ke(NfA@r%U8IpFUKpqmH9IielO#57?*nGe$u%K@T(Lq
7173 zE@JO=aLj874>))dfsb>$UR1cp<L7;ahZ+A$;TeqYRk-+D?wV;ekai7b{s4u~W_*H!
7174 zLw|V>vCzSxzxWPcs_?0NU9L&t;;#BSg{QI|-cb0#jDN21{)~4X(7s(!#``FI7URb#
7175 z{2Io~74GwOuyY)|6ICVe7dJaN?2y9zD;0hq<1Z<^i1Cjdyc5aU4Pg|*huN+4S1t4V
7176 zIXL>|Ef6T=IXFbDXa30!4*7B)aH)fXe>3whb?_9z<^8ga4i5eu%>TW@w=({i!XIV)
7177 zMTPHR{38d4o^t>6M+Zl}Z!^Eg;gp~t_W7LgK??tg@zIQ9oxyr_2MSY|tZ;b_ZI;62
7178 zIkXam%X4T=3cr)jQ`R#sddf?RzjOFlS6_=j8_)ZLgG0~Rd>!L42M7P6zF>Ra(+&>4
7179 z+?V-_gM+_|`L8=T_#d+TcN`r28~f28h0hh9$Lq^ph5wH6<SbiG>@44jOLuU{FXj2X
7180 zuY*G$c`mb$gM)uJ^M@!ro#)S3g->EU&%q&Ij$4Wpo)V%=3TG(%(G-i<D*Wco7GLh*
7181 z(DP!hceR6~Ub%kQ;^5#v$^7*W4!&GJyw<_N|C#wWGcMz*0+|%<aQL`Xy&52ehaDW$
7182 z$vm%~Qg}7vFDhKtg&mAbz2YtK8^yn$<?K=Tn~bLnG-?I={k@E*GA{DP-|jGli|5*@
7183 zN=`o>mnSKF0pn*VyoK>{C10H8Ua0Vc_<q5yO3qy@=Wd0+!uVE&f6w^iO1|7b{)gfp
7184 z#CH5p;WA#oQ1}|=f2-t+Q`~(AS^JBf#hc?HjAQ;{{M=({-be?>__>wkk9BaDU*O>2
7185 z@5g#fV_fPLuaGA>e8_p5ehBj&9C8X-PL+eZ{6+@{|2*ceQn>Wr1qy$b`Rf(_3FFr=
7186 zF8YgC+WQrM6sI3meDP5Gmg1kn>30<W&ph6KP`LQs?LHV*itPvGK6-D3OTB{?em#sw
7187 z;b?`6_swG&??N0<Gth7fvmG3E7W)<}{3h0Wfx@3*ypD0Pr+BixSn)q*{#6Rk;q+#O
7188 z&*1beycPL!zx+vsi}%py9XV)k9=G>z4vzLN=Jfjtzn0UVDg04R@8+%OBi>2(J%WT%
7189 zfSn=#U(7pH;hi~sn8F8h`Uu{N{3zdVEl{{TFIDW|DO4|?etDG+j^nO#S<bl%zk%@^
7190 z6#i$%w>dcE%YC2i4i5QWGXHIbcZV?$hS-g?>lnrlb#TaUvo!B;2Z#JZ=8to5@a4Sb
7191 zSO*9HLFSh@IQa4%l{yCpU-m~ADm;zn?=24Q%K3wXLyoNfFDiUF%lSm%**t%{W>aAb
7192 zVxNhOAExjo#*bCF%)8SSF7slk!dLQr$txTj?P`M(6gD|H+I2beA8_zagm32Ku4f$_
7193 z{JWU{frGp9zi@Ey|G@k`3V($0E<=e#LG1G?<CzW)edIeQBODy^|H1qTjANeSIPC)Z
7194 zAxu_$`9ArX4j)6RjK}wR3crW(3mhEs<$3tal>8iIQrN8UqZz+b;WHS2O5qC`f0uD-
7195 z*EcW}h0h&6ca_0+EB-*v4CR<?vyMUZ-}kZUG=<A^%RLg{2P(Wc*~&RI0X{(CUT4c6
7196 zm;ldJ_*LBABNe^_gMz|Xg$qAV;qrcUK?1x`;SaNYiW1;+6n+IJ0fkc&;AINm%KQZi
7197 zZ!=QJDYL?bU$1a^ZgWWje1*af<?*mu;ceV6=PO+JEeh`)wu)Yo0KZD%-I#xE0{kY0
7198 zU&j33Ccy7jxV(3FUjqC=h4<tB-If4<O5yjgeV$E#zohW3Sez)lngD-G;S({zDf}}5
7199 z{-MI<`zE^*;9o1e8~6M73GlrNm-nhdxmGV(e+F^8_EEU-(-fY}?dp*LKTzSvv;0F7
7200 z-~$wXo~$Pc@LYwT!u%r>;Nulu#N#kO0X|vb$MCu|B>_HD;qu(eoCNq83h&SMA@7kU
7201 zNWTcaP~qpWJ~avOB?{lf<7BzQpJF?lt8n3;uW-4ac%j1kus-V*F8nJL{xIuvO#=J|
7202 zg+IsZ>MaTI`*^>K-3p5~cD#k}|7e`Wnf+#lHM#khIQZNp20xe+8jqM<%XRrx3YY7v
7203 zTNEzWhrdy{tp6iWAqB|BPo58#@5%_C#|^q%@!J>=vvR_h=k(<L9>L{#r`3ut&jsDA
7204 zaCsi4P2qXGK768Zxqmv2I|<o_(w!m{E>gH0*Lm6XXD=crle8uOE@rzxVs+(JCD{$|
7205 zotSMreP++AulKU+YLEauH+yvZWUgoE*^Sjzl?%(si?)zU>l;9Yyt49njq}OlN<|Gx
7206 zHSv;p^XkeMx66i?T9;lz&PV5yA6PCSDMz63^vl_#nwMQ#vuF{V6lYhH)7@<H-b+q*
7207 z$rlZaEnh$$yy129e;Xns07FB@y~xYs$O@i6g3CORG;SN?kT6dG-e%llBW--Vj>maW
7208 z4=*dmM<5u7G49Sy;B8#*7rcG|Lx`CF*dGqpAyb#Xhwo3vm^Q}KAb_!K02>w{HX`L;
7209 zQ-Vc*k&{RCc;%ZSR?Z$F+N9wkD)2OpYx|$qj|-@cloR-LF3+dQ0(<MYyyz<#l9p{P
7210 zmzR9muIKW1@VY9vu74qA#Owc;9<(K{F0@<pKMuj9UVi+|TS1tXi4x;x;-8)?;`0rg
7211 z>d3u>GUAnAGsl+rkk985mA{ZO;_1Jjvz3~|1)+ae`f2?)5f-ohGn;HdDQ{C9xxb-|
7212 zc=cZ$r~WkJ>iX{@EMEP;;reS;rb>E`B`DwJ0?MH9z8aXi{KLeFr~h`=U-}vL!&0vG
7213 ze}OQ_)OPy3l|Tw}cz<D2v9^jHJ18Sw`Qxs(C61JWyp?jYeTT~{nzw?>Yh20+{vDT3
7214 z5`ed>x%~D7>xa<4q)0sbz0LNM{W<K1B~jZCHdR#+Lifk_VNI37Drsz|bvNZV8Zq8_
7215 z?teT^gtcDRk2xK${v9{k@*|aST|ay?XV(mkNXU^0ZEf8Cj~p?=<P0A+W~4>V=yJ}a
7216 z!ef*Cm_(nxEF4SO`thH)%!!+5o_COUfHy1J{C@sP`Lpw9<<FcEJ@=FCq-(VKk;tCC
7217 zd!x<w=a|j++fbk^+LAmViz3nHN!xSVJ^~hPYKt~EjV4z5+Goiug{^nC{jzuOGfi0p
7218 zfiNleyNdKa1;lK*0<>*VuCV!YDV@Id3o>r{ADU1sf6deWxc=$q<N4xk{i(D=YzRF~
7219 zFFr%$12A`C^Jib*n!Xla=CmMokqqK>Y73G^0;badvmhoDGj~z1SrE$_gZOHQ1<~ym
7220 zY#L9V*a};l+NcT9)>e;{jkaEqN2%O4V;s?R&F)Zo)9rM=McH7rbcwEcJh}DUy}$hO
7221 z%lCijyM4fF3Jp7(AA4+P#%-%tQ_~9`i?$x06iqMqOY>tM#hZ-qHE)KZ10RpB`7x4y
7222 z0Y1-V?Ulam3Zp@b_gz7eA5LGJZ)$o3VD5JhqGg8oC{~im%}<Jzqs>pGuRWV=6>YsA
7223 z;veiw`O)TQY<^2?gvu8*mu5y=@^hlibLlrRYv=JqtXLm?(9g6ZKAL{h<LT#(AarLj
7224 z{iXLI?IH2H)s%{^`6OJ}dP^Rnt*xs`USKU_rWwXcxouOL-yu^y-Gnk$SF+gL)6*|L
7225 zgp5r#L&^WbW+)bQZMK5OLjs#!N?Fm?jy5x`X>Q6OQ4f$=spmhy5Zk6k6Tl{1nO*&e
7226 zX~Z*4hfoQ!t(V?(8@Qt>>KeZ3QW|=u`R2WSnK><wU_Kb)R=D}wIh+a?wzjqrO13jC
7227 z`u8I(Ilbw768(QT(jKtl{;xXWd$Ll3PUvQ8>evZIWIR1^+svSfGjLm%_oV?1ZOwqT
7228 zRRyEDfJSo`jb{2yjP6|Vle;YKTtrD8sEH<WQhL*awwtMfp%~}1Z73;hc?7HCHe7Qq
7229 zY_=Up%OEM;Fo|YC5iL_RiEa0tnwgG?@gPP=(Uj&N^0!jNi>`V1iwE*3vJHRH=6~{#
7230 z$bULHbLgCtqb<Dp{=+n=sV%+v(H~>;O^=&s%arY9(cxXq(wyGZKq^OD%XgfTe`@||
7231 z`KRX>pZ0_up;VO&+4Qw1Q469iO%d7@G~a)ON#*5CZhmIHxkpAiS!3FEb*45=Uh|}H
7232 zrbV>*A7*v@`qpUc#LnqgJ(hmy<D>sV>(`DcO?w-1rZoSut8026Z%WJJtSL?3HS{5V
7233 zVe|Lgl*W&yG`*L;_A1h)u=(9xmsYGVXff3nwlvv&&6{SX6f}SNC^f`m%j`^{31Zh|
7234 zXJ+DYehb<?f|;%j0hnqkF(5v$Y?*d9Vdn6c1X|Oerk!uoC?mbi^qtcDJ?kZAFe~UN
7235 z`e3{};A91DF-rignfWcpWj^+HMygpvnkUkFYL-?Sh!Gly^qZKo^XuI(eQfgQw(T54
7236 zRZnhR*|q&hG*z$J?WZ@LLYi`KMO)_NM4R4f?7pjB_N%945ztUZishjnx$BzR8sBS~
7237 znAvRh#5-3}rM9iK$ap)y0nwQ`QmDnS-4+B*+nIwspzS5<9ahzJ*3Rjqzm-n2+S_@h
7238 z8BVR}&w}Q!?8@hKrrUVC@{Q?OVAl&)Ao^?Pq&WF^l5O1@c5T!^ivo5op%!SYG!8b6
7239 zFk}3d(YE_ruCQbCG1HdZHZwF$mev1k8W$!><0sm3T!fZ`h6BddW;S--weOhP%!Y2!
7240 zmOSdUw#Ki%ej>N+>nFZ`q9QxJ&su7l=gpdd6(ZVFOr_px$c;9CyQ^DzpFEOt3OX9|
7241 z=QHUZlJHS<&6DA1^Nv$adxHC)(z$Jv<o$6V&y0$8@}gEAR?X(mjJ_oB!<ayOoR&zQ
7242 z(Wad|Q^WtOeq<k*qJw=%SX}$$&!iT$6q~vR<~M&6ZGO$_+0HB}1!GDJ8hVn^(8$Jr
7243 zos!#jTK=hI6Ix!$Rwf$QyLpc_`8j0ry$uJ*JSxtyz1{Q{*}L)cXv<2f)Xk6Td}@fB
7244 zpVdD9nMo0JaP*l;S-dspcd$2gSDlwXbLNSYC(N2T$r~_oc)k9?3v*@le2?53m(MS+
7245 z^Q;eO+AJPPj*^jHJhHZ~yrOccN0;)-y~X9#Wi@r<z1jJNvpP!jGAB=+SU9U7mg5bm
7246 zA3C7kn>4jx$ZYzXcA__7(s7fgN&@P5oZ+elr^UvVGR|2lYpP4?&ORzqTGLonR(*Iw
7247 zq^7pKIugr?45&YferSE%a+TGKOR6f%A|(yf)_IK$<&m1|2rdFf29!l=D%wjjQvSW1
7248 zYPuL0At%lA8y5Vkq<HNReMqauU(@B^m2Wt^_ScHXwMR`OnXn?VsC-dP-P!*^d##>y
7249 zfwb=I|5bZq_Wuu!_bdHbSzTJySXLhSPc-{?cARa-^pMFk82+nq(OA8(x@JjrBqnD-
7250 z{jZ6Nr%!u1G@}2lkX`h24EBR`)<pYld&LafAS}g^35O&<j98NWG;&fh4sX1qu-*7L
7251 z0i`_b1ieslC%8CI3Y(OvpwpVuDZ@tBBFY6jg;T<~rk7*|7(&X92{8f->6|>4u(YAL
7252 z%wp8=tTrTvaFT2{VY|t&n~2@y*^Rv=;^P3!OEUk-=0EJEgz-9O7wBOW=$vyXrA^a!
7253 zguna^9f#nY+Y5hn5;ive{aPS4z8moj8~*|EUN-(C;t?DF3Gpl&{~7Td8{dQYXdC|p
7254 z@w{&IM{V?xh}wj25=AzVWD;|1BH70mM$WK_6n_UL7T84Chqkpg(bXgxY$DAsryTpH
7255 zRk(*gf)cB3PEUU_CG58f!~6RGAZcrCPA?yxP3+rK;l6$?(bn6Xf&O`vxY{NLnZ#zB
7256 z7;F+-Y~l!$xW^{4{S8!Rt4$0wy0zIvuKx|y^Q4Dsr(XC<(+9o68_`H>qw5gm`1NQm
7257 z_rZ;5Z3cDa4TPnH(ShmcP^g`;oFYKcl?F|wgFJ)wv^~Dha11Y#)km_r*%1)#GOB<e
7258 zQ+t;&u@TVaD8!RVDoS(*Cn=nadd#)`?MbPp|4quJp79Pvt&G$XRBp9So%bQd?Z`<j
7259 zh0g*za#G8VB1sWbXKFcoFxiolTJZ?Qb9&BetngCjKS6Oja#9zhQ`xPSU-=5*Pn)Ms
7260 zNjd0{5=NEg3AU8*rxZ0ec}Az6<f9s6_|&=n=M?9}$)-y(ZO$nsk!2I7nj$$Qa<|AS
7261 zN-g%Gq9v5La^{&tUz<~E<P_LMnJE$_IeApn=#!H=-$(N-q0*IermN3F!^)zf>xgao
7262 z3@tX@d5%rLN9q01>2$G!qBNJQ@ZnCw-7DM(T~b8WX+D}_<K;fovGFP&@_T_3+TSP;
7263 z%BKYlS9SrI3%<C_>LpjL1%yum9&FQ2bP?9T?jUqW2~!|xJcdr_7RoxLxVYX+8jk`L
7264 zt)?huh7prA9%T>ZB4(Wky%7}I6DzU@(rl4Ee<uQ2rUzBk9b}`vf3JT4t<UDKcijSy
7265 z((of-T0(K?)rX3C{_hQi${#>QQ^Ng;)CIPTnB3l|M}mCV+uw*!P4<P<-ty7Oejxe1
7266 zjfE)I-y|bY2O$%Ge%~!rEVSXCWj5K*Ccofhf6iTQb2B-YlLI(+h0Q&Tb5{%~t@ZrF
7267 z*Fru8TdhiFNgHhLz^$Z3j66u(Yuenwuo{A`=ZGh*$}0~8<`01=OU!OBb?8_SC>)M1
7268 zmSE-|CHyfD(mpfmInK&zlgRxX87L*-6mXC~D`_SD&kS|({6YTo<i%T;kyeBIJCeco
7269 zkN1CqSaHx12szLS2`z40PE!0FlHngkFV<izO9)h(>7PJ5%dAsHrRiEFd>;@h)f<%-
7270 zuU<jolEQuIIpYorEo_0P|5P9I{3*VgZ;iVM)4&?nM2)6HMPIW-P~x8f|Ew6_L=Cf}
7271 zPVe@iUH*Tp)8TP#^hq^j{1+x_Cywv4d;X`7{D<QDVh}7|O}%I>KDf^5LA2LT@$uP_
7272 ztgEH>S|xIx?#AJ6HztMiFeq{d`6rs_oP9#ZeDpWSpPO_JZB6g|M8b0xd;b1rl{n&G
7273 zPW3p3K=AweH$a77q~@<Vl56wng9RKJ)`jO*Fi<DBI$>oX=5Q%Cl`<b9$u#!t3<z@O
7274 zQqIdZ#~<zm(%>M|%$=@eHn&03t>|DZHFFi$(Xj?CAi18uURIF9-6jrTo_`I##r|(v
7275 zD8$4qTt%AAq$xxp(6^EGH4`f-d<4Cc$Q9ZhA|+m+dhP6JjE!~^HOvnDJpuph7~e$W
7276 z^M}y!gO$HB#y8RU{L=#dxiP+p8vYP>_5ks3e}PJLoH@e{o&K=6;6v!K1!lt+%Xqj4
7277 zhHAe8#R##nf_JjMv0{=J-?J>G-2jNuVDTQbl9*9qdL-OGmW%O&kA(-h?Z?pKHd5?F
7278 znvS#p&cWIm3~X;bl^iZj!uLhbVlm;I7!L8j`wzs^Y&YUD5$V|rnLQmVd0i?Q9jgRW
7279 z<4248!xC5l6Kh{O+NO4@i3JsB*&MqE`nMLqx-|D!41te-!=B-yn2xCB&i|m6<*_2a
7280 zr6TyAH$<I7|1*=qLu0w{WVFlXCNJJ>dOxXN^++h46>*FOL*VP)FvNx}w2vJweF!s-
7281 zusO8C1TYFrbqfTYgOA4siEWe!%0SfRBC1`F&@fNlK<dT{{)xDB5QgI~bKr_Y6?2e#
7282 z452uRO$n#c>T2@vxdoHA*S;y_FYx8a2CXo&nzsJNei`)5R~)P@Fo%HttWn6P6pmp0
7283 znYbb7`Dexoo98k7)iHqbCxb-6-*_=e8v|*pjWmFCXhAuv?cp&+t;F*J0l_?Ox7;T!
7284 zCaSIL8ea~=ASqVYk5bn)s;+B-y2jE~CeOb%5YVwM>_bgm<J_e^R>=w7X@Qb`R<On=
7285 zUdioh9aH`(djJj1Da6cv4aqfTf2y6?pK53JXJUn|DRu-cfwU<8DEJ%k5|=Ui4rPiR
7286 zK2G!yY&Yysrg<|Em}_Z#m4g!Y1mK_M#N3SsHpCZ>G2>!Q_Qpeq{}r7+*szYb{>E=a
7287 z!>@cfDX;_Kn_wX5wC%ia0}XAyPJb8J$mYk=!G!x4DVjJz&zw-`yaksIZ1grnk73ol
7288 zq^}XnlVs?RK@ROvD5zw<5W96x%9D8KPXjphOMgNDw;4+%lF&KB4<w{b3nYYI_Jer0
7289 zq!=ZASPZ_}pD2|ik{){3_x$eufV7^ep|pe3y8AskXB<G6EHb^+)T0TalQE9cF?I6(
7290 zUMTIT)Um0P$(Ehci9)LlHb{3)_7Oq0Pswl=aSx$|Xde?HW|zY}@KSsFp|sRg;dSj6
7291 z$Q(_iZk+5ixhIloQX?&BzCXDqBxm#`IrzX>_fbY*4<oRX2<%A`!d6L0*taLiA4li3
7292 z`vvuOf|UJ@6w>biu7YZ$^Wtp(m;+54I~{)D<em}Jlmk0i6%FH{fRSn$BMyYPgPCJY
7293 zLCqEwXy?(3`k*%>Mns<xj=V^FdFX(=URO;pLi@(#BvGgIi`9W-e-=YkBAMwVsmcMA
7294 zWHTW5uvjjge;(@R_C!r{Qs<f$W_9v%jgW!O=lL`o@LBgk7m_p7q+S~)kg&lhaH2o!
7295 z04iXtcZ4Is07D#x5t*GzbXaC+Dhce-8POcp$yg!R;`Ge!2(Em%R1WS4N_bY2BLfqe
7296 zPHAVNkuk$2k)os6L{tNkqq)^ck`cx@WJ;2=McdUjcWg{MkjG`Sk%I0R@9NP`i=$)K
7297 zJ?20RwqvqAM5@#5e5s~+l-C~ey!>_mjl>D<0Th}TgJdStb^ynHZ<a)5zZLT6;6@U1
7298 zF(%|~SdY`DxM2{ZzBf~%W&tOd<V#dUlKgw($=}>TzU-Ig1@em|>ImB!2s>aOOC)8t
7299 zER%%z{qwydi8_ti(xK8@xUvamNkt2a#w1y+hPMP=%zMK-cuSBtNX4NO0zoHm^pqGR
7300 zQ9OWUS*PM+7{U>}rGgR_r<T5VYBzH`#Pd$$EkWxzdPM*gSxK>fn*SyY<!!P@=lPo?
7301 zbw;4X42doYpdyLh7C<v%f^AH?V}4+U)5S8eQm4Pm0@8y9o-R>oAa&WsW&gwZ(p29&
7302 zU82%z!)xUBR?rRwfp`)<D}bg;R0aaEEIsyL!fMCVFB-(MC&p|lQK{DVX8gdpU4!b1
7303 zBswI3I#}xlI<!W3khj#)5|zP2vMnd}|B(#D*y!^)+B<+|oS>SL<mGG<mof5be_#?{
7304 z73&L$UceA&V)s6Q8BUj|bcOE~iy5TNC>c}S#<XHI{WmTX&7AJPXqnV0cBa0*Xqm3U
7305 zfVz$`49IYV9uohKjZO7#S@shr9^(;dKpCFzb6cs3tCvYa+?P^cNmK@u;YlLOYfn5A
7306 zh$?iNZ35N0wZpojNy+r)ncu;hn&o?^vCv@iIFFZSc}r8iZTTiiy(**0n<de|w<88}
7307 zIPw|iej8)0Ua?71G7@R&muOOwEs3ROMTZ86IAN1rB`O8u%z^J%=AM{rYLleG!Rj+h
7308 zqWdvq8?W0WxiasQypfw^6v&VSCJT~`NMJGwVq<>frYO((lXwfBd<T7tgMH5NP%v0V
7309 zb}-NY)_gi|le|%Z9x_9Ki5@aRfOXVkR2)4<ZR)7Us1AB8=c$4la0u3tl4@m?_U{tC
7310 zvK`SDiv9nVbMK0=Xmm(QmO&au5`Cy0F($~yM4YglrBn*W8Ag)zv?F`@CQ1F7QBp#p
7311 zFSR3TB}Ck#%nEt+eK$!$M399fD$)#33zNNV3olJwVsBG)=o`%qdEvZYCB?DF7GCjQ
7312 z;%%}=7soeA>WyISpDEG5wIk{#h&W-<0@?AP@jezIq&RBH!NJ&IA2s6yj>_(fN=a09
7313 zUvxkuQJKTUk|`70Yn`gqjw4$H$u2RDlDd>>tS%SV0#b4ow<!f?O6i{?X=zxT0~T43
7314 zq*d;M6k7=XZx<x_;9jiG(Qy`<(Qy`<(Qy`<(H+LAI989zKPrx_qvFUqs)MYZY|@yl
7315 z5pl|m=uj?)2j!^P`2J$qCP~QwAT10MEoes+)AIvFv{usHgH4i>BSR`KQTZqa6V-?m
7316 zZKN_<+$1XX(twmoMJBN%D&pe|+nK!UspBn`YT)SN7^D>P<fZS+1IjFkKFd(D_q9K(
7317 zgJC-soGAs(D@;_8@6DE|D{E#4S>kznYoNpoiHg%~>;^dZnHWpA<|WP&*ABEqOH{tf
7318 z9KSUk3(k~+UFb$30<}h>uB?u&d6Sh8KX24m5={+c6-o4f0P1jl5aFy50cDm%D;bL4
7319 znvMl$O2N5-tl1KEWp!-LATA(pX;Nz>dU7DENTTxts6%TSIP21YQgk^-uZ%&~*0KN1
7320 zoFz`ZsYfL${<-7Zpku+AQt<Vlx>F_kcZMKq<|avf7$Zv5t+b=DI#xQpW2Lj>RXRPW
7321 z^!=dH*%Eato!(*gY~ccL1O;bE1Kx{45*1lAp<-6Hu`igtCnz;bqD$y%DFRIbiOO@H
7322 z@y#y<#VI=VTX&XmU?6LTL=O$1S+<_of7gzsVwpB3rE_9ZaydFCfM!T^d;oQ*>xhn}
7323 zbX`)qC?;h(N9P9642g=3sP$TqczG9UoE7~DDq~NJ`0RpZh*T|7&JSPX6S_BfE2n{)
7324 zFXvuzlQxY{Oynd=^AqvpgHoEmoR6L_=Iv#?mGcSBpUDTvawSc!T-7tK4~}*DdzdHJ
7325 z0OVj%j;-XXnp^>p6FoV(((+_)ExTsfFUw9?^YNHuk~f{K?)yKHw{o8XagZL`SYJ1k
7326 z9~>XLbo9vLkt2rCs{oBlhs>{T96GPEq26;THc?eMZ|MBe(vJKiMO3>&9eMR<)AvZS
7327 z1F~n{#4d%}^$lf}HN&#$Hmr$LO%$iGW?#z~ZZq(pe|^9yE3cq9HPMu{bShU_W1~Q;
7328 z8*IFxa#1<OsJkob%FF9Y$|@V{hm=-T(i8IpQ!kC1*H~HAFr>2D+)lHV+M=bX)JDte
7329 z>Z&0eHuU!4>jQMpska{<7wQr25vraO>hWH3Qs{L*X{ev<hwfb!9(ToAQ<|SW`IyjW
7330 zUikRXSo$3jK0Z7()QkS7gt{aR@k9G0O`}_$q1oZ<smPJxY>J;S2hnkJ$Bs`<4sBjl
7331 zL8*_alC!3qFgf(W$~!{c!|x>>nXx$3^{b?52NC~%-xPjrl_`C@kK(VbqNmrBlfDb}
7332 zrb^2iLWf)*+P@-nyC0qt?)gyY<5ky(x+RUUwTlYljg+ZI$S}y5I*#gJcTTtm#n<>r
7333 z1AU`G-}RyL_el4{{JO<M!{f(}A9?~c`k__hi1no3K=FrHq4bkJNkZayN<2gQFQLY7
7334 ze<(C+PH4lbq<(%Va(z<&{hp=r;|t%PJU?`OQbl-f=*^WRJ6sW3=Z7O`K<MRF;U0*D
7335 zr@H^)!cf0(gw&f%PZ#*1W5VMu+kNNc(5?RZhe8jX(-6Ae55E`wI`lP}B=o|n*NM0U
7336 zyraY8!hJ*Ed9R0dtO{Qrn)hCK^FyIM-u0mysg<D_?}a|~X!|q%wgI{L9O~Og(7|7<
7337 z439f0so%b#+mfyirJlFn2`6t0Ejxb2&`|2@l_&g-q9^YPj~yE7dOfFp2oEtSD4i0H
7338 zq-^-mX79HF$OCs%=Ic{V_=XaG%6lmbLuVf!>N2Mfq2Y=v2n@ZCzZ38``}|)^uUWH(
7339 z-e~as;`#+Obq#p3y12NeqN2FL!z(}DqLM0n9jLf;K}lsbrc~*oTA6$GmCMS(!zYU{
7340 z9gEFdE?&ce%KG93HT4a}^D3*$iurY@;>k1S*Ok;R@TiJhk5cuuC8gzfxyBU5<Z?=K
7341 zArgo;g*;3o(#y=W%IadMv7nBGOe3hGcwR|;xmQ(FJwIap8msFo=U11PMeq_vaZN2=
7342 ze)7uD7^!T2d4rp*AT{w)mYLyDt*ml>WrHITf><Wmp$>8ulvI~hm3#D|qsYYE+{lsH
7343 zBeHWM!*X&*=8Vi46B)9op|QGr{QUCj^18}WN|unq<7urNGIB&@$o$BVX~QBzD$Ey>
7344 zhSb*47n4dGYU=2VNp;kSKue<*X<b}VNiX}<Q2WvD+Ow%I7Mix3x4WRXX*QHJtyol2
7345 zJFK#do~tH$Lk-GTmCUb4@nOXz2n{5&HZG!0ZLBLUt*L5URPB}4R995aXKU4aWi^fS
7346 zsCi|Lix!<tVwCM^2o%>;m0_IJmp7nCE9kwqp$lpjl@B$I8ai!ie$mjy6N@Gd?XYSN
7347 zrG?hRdrZa9wx+JWw!GBCD!Z(vnmT#%jM~QPQtG&%x7)Sb4lxurCLqHuq^iw=?Nu5>
7348 zVZ5{-0<c?o$s%i}c3B0JC(bOk@8Ov!Ui33^m(*1@lo!`hEwDL_H8Tv^vQ?G!q+dPe
7349 zikUQ#b}})XE6R+NV<#6*GLia{#pQOGQe)~$&1|u+<P`^Rbk$QGXja3r;zhJKZ78o_
7350 zQcm@t{@Sy>Vw!~ugQ0-|jE=WmJIpIyR8v;&RS=9`r_PfJX)KIl=wBMc%gXIknmnVb
7351 zW(gTiy0E^!w1fzO0nrFn&{(|Qqj`jZ06Sodxo5^7Y$WpvBi43JaT#<633}5aVJ&T6
7352 zU!?NJrX(4n+`8<Dz*x<-W3{*%71)tt`k(@DE_%haH8i4a@6%|-;$tc<X{f0*gA0Of
7353 zDGaZmgJk-e5@ar`Ew3Z6sO?a*augeT7Snr=CG}{cdYRHIUQ8cwt11^0(#V}xRZ_js
7354 zv%OA(j=q0}xmsLNQdva{km<1E%KDnpF=L9^;ASq?E+{cNoAwzEN&8Y-)UehPqm*77
7355 zq-i{P#!|a5L22_6CfUgxSis07W|^xft*W8Lu-L50W+5Lrf~+6(mRTy1G9%J7xVo0!
7356 zUTwg#U$KZ5J$k3J*eo`+C1tcu7t@Bu7dFG~W`x}wX%=Oe8RG1GF)eJYZmch-GL;pk
7357 zJ*0MHZ7mHo8rNm@4VdVr#5}T2W38POWZbHn`Lx5aCNjrO#q-cAs!JAq8WXIlT>#rB
7358 zNf9zdjjIi}b%tr5*GP>VK8$SP9XD~}QIV`!^BSug8tuY8WMrdB<*v#dnVmBtd&EGs
7359 zpyQ~`zCc7<f7ywizcj-?xNGO|dOD!Psm&oEP%t;`^V2fUPny^*rRb8-#mTLmE=pO`
7360 zIrL(uE=14AX%#)l=M{oX;V`=~-;+9n<CC#9GV;@UtqB#RMXI}`^(siq$WIF&ms*h4
7361 zYodvoGM6VTQxlXqR+ZVFuuS}VpzqIIM)bu4W*O#SmLJTUkd|>#66t$>C_gQ-Cb^z!
7362 zCp9Oeg$qzSwT7ZpCX0SiF1HRcW9>XHEt0gtP^q2BN)%8$+52*Dy!?<o!tRh2iruGZ
7363 zmlwi;eVh=&k$s#H>hR@3OA5({qg5HY=b;ec^K}W88?rCmDU?nWf~VlyXN5d^@-<Ef
7364 znNij;BV^ys>yQx&MtA$HkbO6;JxHmL*RunLmiBP$FAuQb)hvu59r_Xw4?jEso}B>4
7365 zc~?9+m}Bv9T+NGzpPT@np8&5;fHx+<S0=zON`POL0N;`T|6Kz7al+9rMSLw+=J3mm
7366 z%hhkQ?hy7a<8mEY@UIz{E3$$o(}aZlS{~9Oe_zJsLSmH4BlIUcp8W?gUoPFPvvhA*
7367 z0>0VpXP3s?HQR#(IUcen3wqC6?Cxf0_klxYIoolMw0Y;mdsZT{xORIZf`c8l-Y3U)
7368 zP5PKXj+^8_MAE@=lncZ?V-bQJ5V~nPb%0uQ3?ZmF$qM#4=q`7aJBsa%s}q>r^r;jR
7369 zmOA*p4t|4!@8{rmF)s4uYR3}_pTp@L3a{bxrwYG-(@8WQ5Jdi^Ht8Lp@S7Q*sPNkv
7370 zKY?-Rhi?^1d$%|^Js%n1e{pbn<}$$l;ox|uROI~P;0HN)B^yNa?@D<HD;d}N{LR5#
7371 zeLB(gD+FY_`gCDj<o7i!I@VBl7UL&5a$NlvIQ$gi%6=Q)twKP(Slgw&s~sH2LxSJw
7372 z$iaA%2i)#=_^$m+c$W<MZhJ3uaJRizIk>C;A06Da|MLm(t~?pUZcC|tgnb!@KCYhm
7373 z4t^-*NqcLQoO2<B!UYb$H>HJtorBYR0|CC(!CiYEh|Zt@ecX9>B;%rgkzvsX5gdLW
7374 z!ld3y9X_I0Lm-749KPGXw>x~OmSfoT?PG<HV*E9Q=P~}V!cSm4!gs5ohTD&M4(|5j
7375 zN(XoCb0y<q2f4{~t;2Ww@l^+R?XyqVDh7SrdXHfo^3jyH*>3X`zMAq7svSA5J(oGS
7376 ztH1b`5c%7!81FtMe>CGyD!i80o!1n;mGKW0F5guDQRB={<KqU=r-<9zi*Y0)^pkOg
7377 zcZ?B$_obiU*-8#L2uC@5*FKXSydUvI&K3uE`|F1Ucod3LfIcq&Q3oGLc_P0X-}?f8
7378 zu!9dtfKN$)^DsC2DOQc7@n<k-i|XmocTarU&^uBl2z~^oF~<=Ep8&-uV2&W5n;0@_
7379 zv;_ftdiya5GG9f`-+3LB`6~EGUYE`N3@R=73tY)0mMHkUjN^D4LGTEV9~^HZ2;Q03
7380 zwGs;l_`}SvP&mpVoMkrw{}q<AO5yLZ{;djM$9y?n5PgO-Pu2;++Zex9$-&1Z5dLU4
7381 zfj)D%!?!6Mx6%-vvYUXvnDu#H;rp=sR}_8&^WRiB&O;F1v712t8?4Vq3O|F>pDSGU
7382 zXWuGZ-lzXb;TLef%O{P+ZXdJ$J$Wnm@vMJug%`1XaQu%Te7WT-^F#2VJZ|OP2f^>=
7383 z@>7)@^Gy(vd$Pi}vwbQQF2_%G3O|bZ_>wV#)O(*zdKW7EC)V>yh0o>o-lXs<mVb}J
7384 zcd^|bQTTl<|4$0Xu?2$o;1NB4!@TztUyj4@l}!ZU59R)q<5<DJW?m}i3qFkX?4@uk
7385 zmEPu2_$Ic)Fol1|_%RBX2QCX0zCYV-uEOz+7laChXEI)|@WG6)R`?^VPpiVC%)eIQ
7386 zGr3=GRQSD|zDwaRu-zV1cn;V5w8G_aWI6s9`@hZlM7W&btGN6T3UB80XoZ)soD&tE
7387 z#&YC*LFD5TO9*9(Z@#olIKIG)ApEs9>8()s@r<uicqXSWSNI}MZ&r93+h5*#l6sdh
7388 z{-okpa=kApd^+3V?+Sl|`JX9V=HU+tf0*k{;jQR{?`9$NRQPY%&Jl%QXX)M$g&)Ou
7389 zzQT`Te5%65=h7((7kw5eT=Z#FxYXOMaIvF28YAt!j(ImJKE7UsaF4=8{`(3)g4Z9p
7390 zcp>uXqNEA#c^r<fzGZv%;&~?gVwRh!aCy@HNQFy#CMf)BuJ=TRPht6|DO}#?kVk<;
7391 zpWV#6M)7?fhqo&H39k2fg}=$|m3Ku%{@2z#-d@F*eo5teg#Q%Vd7#3@N7iu0LE|b-
7392 z4Ko}*WJ!?YBaz>U?K4mDr*MJ!4vv1D%<VnP!6EBT<}Y?|@b_b-niPIG*L%6b>lwdE
7393 z;m<LCufm6M`Z0yey#1?#L(hI}&wn^L^n8N#{K&z<|AP6SIym^9IsLtZgFlVs{OsW1
7394 z-^qB2b6yO-JR+Cs;Nbt0ehB+HIQT2s{s%cY_-F8V%5-q>?_>Tz2M2#F>oZ#6vd+j;
7395 z<VHv0%eptk;Ulk(`{hIjhx}@mf2xCn|2p%_8JBUpfbtMlD}E!lt6AZ{Vf<2sw=sT|
7396 zlE1==_a0TaJmUC_BS)?UqKLfC0^RYG`5b#E#m+l<L{e@wNxS4FwnLorddQJ+J3!&*
7397 z^0*nqxX6(=-o)3S;PS}j97hiHm-Ec|4vu>N$nvX{e0db}B8Lw-XV4Gf3I|93wsJpi
7398 zR`@$mjKcpoIO>&ge-GoLzr4dHz5~H^<-g>}0WR|2ba0fpk^ApGC0`yH{lwv;UF+$G
7399 z@RNf>j@aGfiv^;mJaU?;aCy7z7{(z3zq47cyzD9XcE;ttoXCHO?OCtn3x2VZ{|n2x
7400 zO5q}Rqmm;pls&F+c|`V4jvUyhjeZF7?t$q48|J<1@R9d4r$15nE>3^RTWPPnyC!cw
7401 z0LRolmwpKHmH=c!A9I0)Hu(T3h#Yy5>@>!)!7q)|6$%&LLdLb6)rx-}r<)Xi2amTK
7402 z75*@<KMyPX7M^#nD0~yk`PjiBLau}S?BG~ZGg!{Se7y_V_}#+1Ova^M@&?&4ioY+X
7403 zqY6Ks({epc%bBP6YdJlix5Ah6=rszL^TF#CE{{~-$2gkft^?Z?F6+Q{2S=GlIsGDU
7404 zMIU)J?OliO%KuE^B7e7oL;i3x7(MS7C0|}m>&f|A|K180`SzQ-whvL}GUjFTR`i$G
7405 z)g~%AvJOvGxX7R5;E?}MPS4}5$d^ac&vf{R7J)$FYzK#&1Nfrmc?!RU@e3Fi`SQs7
7406 z9SZNp>)4A5m+PLp9Gs_?(dSzS$Go`3pmZL`^-I0eSpRGXhn(A)KgGcz=MLtdtnhy^
7407 zUZ?PL`8cQ5!6Bd3^X_$UP~T?$qY6KTkJH{z_)^BdbZ{&Iav$&~2Z!jj%-;`#n}XQk
7408 z0mgG29D1H^Se`fA!6B!d_eZ4)zn1ak3YYV`D;*s2<^J7W4i5Q~kV)Zrh0FETPZTc4
7409 zwaNUbjkN1rUO#&)ypG4!kqTeM_%wwd!uzLF72comN`)WI_!<Z2rP;LW3I|7fWxxCy
7410 z<FY>NVtc-=`0|`ca)uFS_h}Tpo$b~`;c|X)sDq;ppY7P+!2ylqdb1f9d&+Yt(;PnJ
7411 zjAA)69UPEc$0&Ai@N1c0=HP%t&l(2@|6%4gFfRJs!FImH;e#sId4Hq$^1RGL4j=OA
7412 z17aq$IXL88VPWq%2M7OX=D(%z3mJc#anW-R>$z9q5eTDj5Z_or62DhiPJe}W<?=@;
7413 zd=BHej7z<REWgm<qg}V~d_PI?<@uoHiZ9oHniVeBA1-%rRCxpI^BV_8z3<Tv;TFb4
7414 z&&{mo(+(fd8!YEJ2ZtOv4}IOi!O!6ITMiDsjKdEc9Q-Cuf2Z&tIsFrFMbE9QXIDG~
7415 zKmkd}m;G!nh0A_6lW~#r1k1@&{3Q@d;W)*Y=dBhve2AFH=|v6>ePkXjb#U-6;q*!e
7416 z2Y(HZhjk7P{tixGt?-{XeVv0t4kx`W4h}g5J?W3aoemDZjGwIz4*q=RKjPp<PhLc~
7417 zJ2?3FF#iR{#m@2$=$i_c_ccFMxV&5Wts@`xK7vIWf$Kq?z@KHir7B#m`=u+qJFn0C
7418 zDO~smDf|^QghKBG_yC39$ozo{U(fmvRk-j+DEuC_^Js-%#rV+*7yd+rw{m-rOMp*P
7419 z_|wdvkpMqg;VW35(-Yto3a?=KXDa*`?#HtfF8sv`@5TIO3ct~Im$zEs!f#Ue7T(V`
7420 zC%`u-yqVj3MFM=I!Vh45HYdQhD10I7b4LRF_X-z(09zB_k1AZwvz|zRKd10%++TlA
7421 zfWNBn0o>jl3YYJj{X^lxe^=pnUKZiQ1o)l2KL-seo(nPs?jEyW;6q7+^KL9S-Zmip
7422 zozC@OBTEeOBKV^K%*Bfg8pGu{uuS1{oOZRs<@o1$g-5WUA+SDDuN)8HIbj6BWq)0$
7423 zaM@3J+4W~HqE~NdOHb{Z?E;C_l~<KyH{gZDY<d%^#LJ#nPp=Kv)gS?SZgy__<Y>>(
7424 zvm2|cDi@YlolUtAQC2>$aei@Sbwv#cGVzjm^XkeMx68)+DK5RFuB3W?In`%NNXik2
7425 zw`(MuwDGb_YZfh{H;KLMYI+GUo8Bg*mjLO-7#3T;ptzzA@3Z}%ga}E2No5>~&^(Ul
7426 zSMg<B2@lU^VG8F7z}t0GZDawT5A~uX>X9*uG{Rx@1J27EAQQIo^$bbNmb+h)<~<w8
7427 z{BO(WQd!6x7D%)aseh}&rGDAwQGUGgwS2<ePbnttm-5rNyte<Pd_1nIH+8vKDVKLK
7428 z#HIY_yq-wD)GKM6Z^!GuFJ@WB=zeyK{(|nJzw}=XVOl0ioZBD&o_CvSzviAt9F3ve
7429 zpu_P`=Ow?QKi;2+r+?N`Q{4Lcp(ymlkka~JN?5%5_wbG89Ljft=C)F1y!!LFekqUo
7430 zacM-?e*<A!CPChivH17A)hbgZz26f@V<>m$IQ)Cwm%n2FyNMG||JpeA!`#>Uw-JW=
7431 zrJWQt;rcwgmFt8y71LF8evUHYmA~LPTjEG5$Xh8V+gG`~qInN<d5uds!FO_b>}TB2
7432 z#^vR?S;>?3OZq*E#IxTzwqF|)(f|9=Ps$^WfYUwIMFx+aZ8qN5b`$(-{gKwXgPb$j
7433 z7KuPP3V1FQrx?0^99G1uzi0|&P#C2uR7vt<THM%BS(RNgG-5)I-8gZJj2tn-V8e5A
7434 zId(>ub0!rYo8-qN`t<SnSjyIK{;|k#$TQnKddHv_eD4}xu+g$;%f9BoiXw+dBzZs<
7435 zaih%znWJ;tqD?P1j@`Aw`ido1varUPNVN43V*aBn+H8w|gjy(NY0>7#3tI~_lM7o5
7436 zGQ-i<hRlp;^IxOQpBvVi-TfNwBHy=%L|c&CQkXe9aOd6Fm%PPB$y;o0+phP;3$QD8
7437 z*Kdss_WhfGQvU4x<~Q<Z<<Fel{EP7fJg2NMrfaN4(cHEv<XC*|HAYQtbMv=_tyP)(
7438 z7PgjU_S!X)eCPhZwsUfG8|p4-{&8~iUz<N8x8G4}wsosZ%{+N-!=2R7Of<Atv}I-{
7439 z*?suF#>$PyP($ayQLlAcjt2id=!|G{16f9VlDAMIumM%Mvq1bclRMt@wd<)#WQJMB
7440 zH8Xh+rY@clP2bk%yC?qHaLT0IPbcNRm%ptOk#-%Fzvd}Ff6bocN$FEQh*F$rr+MII
7441 zt^O&yA>Wub+TwjzFvkx!z8o;}%{?*VHSWl5%U|<zDE*4I?~RvXDDU`o&L^MgRO7Cj
7442 zj4n^Cr{VUK5!%#7t!aqZ3dkAqVdNmX*C|w0i<iC~j-A(%ex7IYPa%Z+H`;8yqd$rX
7443 zXEMq2vs2%U=AX>te%ml-$;WYq>A)-`XcUv1=;qzg))kq_>Dwup9Mm46iZSlUs_aI-
7444 zaR7Bk#wk*7hibQyNN?A3M#B1-FKf6}Zra<JwGG*i;xDLUL`z;q#bevU@P15UZTmX%
7445 z8h321rX!hMJB*L#t&0$UKCp+Gugzaa&;8_Tn&#2w51sa{&0I$q`-^XCTRI%`EI(TM
7446 zip(>b!z~vXQmmPWMbCW_qKy0OJSuH93e0QzZPzoV6*M1=FY0qY$)FM~#bhm-Sy|M`
7447 zX!F|4u&JE<bq_`@NCmYt??`XD8MJesL`ma~+O8v}HX5ISm3lE^SBBN22Q?O~Ug~>|
7448 zM{mQrMh%|a{GK6G1FtG<{*dF%Pc%;oH=Z9;p3ShcmSzU&EmEcQgI3zpB+y8BdTr)j
7449 z^wzFBOwzUYxu5hhZRyZd^5dNmrJ*|*V@I_(z3DaEUX(Sqwf#-Q-+Ut0)Ix=$%@Z@y
7450 z*Iq$f*6^Q_(@@q9fhD@Y5)Fm$jovO#H-;J|?J?4t+M1tgJirt&^M-A+E4gBQ?x)d~
7451 ziKZ3ZnzNce+Bw{qE6<~77Da6t>>Q1tohQjUBjXp#3@x-YEOK9_x&1AsT>2l6-i9L1
7452 z=rB{yh*-0GZ}SuBYagWiiZv^}r2I$licbE+I4~+`{+QgdH$Rh~Uhpa_-nh!JqOCJ&
7453 z-_iVC^FJr0PkO(gxs2zoY1!alS#&3G^GA*6m?_LFDowcpZU#HGXB$4wHhF~FW_{SR
7454 zyj^!ytT$>X{;n4pZT`E7C^-h(StG)zT@>g|QF@h>zuDus3$H7$uc=yG9>HgQ@L30O
7455 z7EXLREQq0jfAOlCnuU?ZT2ml0@9YRXp;Mup(N%M}9&+~_uOL+)fhTB@Y1D#V;M>mv
7456 zmDiKA@}MRuFuBN7LYcN5;5#26GKD(0?fw<HF`1Eyx|&51$TL3O*-rE=7uzsWg1+mq
7457 zFfa}Kq4pZf=<Qqc%`j|AO6kKk31vV)d4sX67EfPqsitoPiPfor$<{8n(m9ijVj+v&
7458 z`?b0BKd*BT_5N2LtdrNAPLfPr$-m~oI{6Wt(im>19TO-jZnDGJo0A6}WOpBm7iq!(
7459 zy#G^Y)>z7nGi!5QVMj{LgLR7I!8+ypwN$b7L!9Dxuuk~_xb;Jv;&`x5`3bmvW+KJ$
7460 zV4dQ4uuk~}oIG=1JjL~3o#J}1PH{b0r??)hQ(O<$DXs_W6xV}witE8T#r0sF;(D-7
7461 zaXnb4xE`!i`Z^x0Q(O<$<Sg(!YQkpQ1lNOgitE8TCEMRfH0!}S#r0sF($0f*3VX0l
7462 ziFvS2aXeV3I3BE1Zaj%3{?{I?I~xzy$t1!H_uWAM=H{9iXb1Evr^5tuQPuT+Za;6I
7463 zZ17IzKgIla;oCD|9-Co1koP$R-#jrxDkFT&6(rGI_6c7L;T+!xILW%C!(CA0lCGOA
7464 z-=%jlAt_;u5F;g$TDF%EBPF#0FvsWLL$Do~sSAuzET<CjeQo?qaC+H0Mv+wC$Fu*Y
7465 z&r(Ca5oHs}zL8}Uos74&44X(Xv|gl8ElI*_{oeV0*PKlx$JEeuIHDXMiFm%n#~^MW
7466 zz3Dm@@h5Pu>vcUE@nqj7CLuA&x0bk@;>Hqrw&CG!qh2M*i0kHf6z>*z6i12u!C{Z$
7467 zM!oGxX{T4w`eDkYopBbH5*v3sil@!Phc&H7@wC$OC~jwRTG^i{9<luL9(1s3XL4G_
7468 z6pH5@fNy!F&Bv4Lqb+9vx^k<HSC$g~w7tHR5{3@eqqsS-PYJIiz+Ac-opzFsYK(=`
7469 z=KAMQF;2K1#nW7m;%TRvBJe1V_Y;krqO@WkDq1-uuAF%$VLghcxgN#S%1jY>6n{zN
7470 z<fP5_(L5`s(v{<S6i-`dSnw#`i`d4YB3f+vj6I4sQ2M~-)Ex0Bo>uh%^^f6RBHRf3
7471 z>NXd&LU>*LU@GAy*$Z4ae)9Y#%mV)}lIJ&JCvfNja$J1@K+@q4MCc7}X!%<F??Zbq
7472 zBPX=niKfL+tVG`a;O-A$ww@m_S^P=D^3AH=2cN(5P1d1}^r<xe=i{gmUW9(0KhV^V
7473 zD1~S3hMW!dr9D(%r2K)9j?fS44hB86VaqxF0r}Zbn_TOjlSzk4^o>+hk6?3ikPL0O
7474 z`J4d;q(9s=-cH&bW<B8s_y>f;k@aEZYH%@fA@eZuOk7V1`uOD*O3Z~MFDUXQ73oP@
7475 zq6i)P94=Mt!9o^6%Af7F4W|?a-FP4^c(!e`rEQ!vHYE}#r8TDIb8O4kam!D!Enm+q
7476 zKUKK4<)_(}uWjG*$Bnwi2XN4g6dL<qb2C<<<);19$;Bx(KeS;z8jkh_1<>wPYQev0
7477 z_w}L-+AGhs`WqXAc3&^;&N3F+EPR{1L6U(@yJLb5#L$*7n<M_l^XWd<pochX@Y5VQ
7478 z0@FhRMjL{EDL(u@Xp>~MBjKC`!EeD6%`wst3-fAC3B1@IRG6)EheCtkTJ0gEI2p<x
7479 zPKMowhN=yRkuPmBsbf?Oi8Dwp8#ORCX429a9vCDG28lp~|7Wo!QjPed;BUm^ymlD<
7480 z8FL>Y6BFn!GA8Xnc^R2W8_IHBdx7k~{59Gc*eXy7Gjl%@4pldlQM>#R)E<9WY=ofE
7481 zc=|YD!-HlxbLCy^=OxGh@Hcj+eSvMpy8>p`FQ#_9j~s-cf5=oOJWN#|T3k#n!*@Yu
7482 zW^wUSj+*SCA;U?{kF1(**EszY>ql^@If;0*e&V2FU{BG3YQlXJ1b<^L?Fk0;=d3~5
7483 z92qu-BB2d0tr#wEjDw96T?D_Aj|XQ5?cuRH=qrhQ$dO=-9b<Kqb!)>)>W*-|7mj3x
7484 zBZoQmkqhFfan%V1ve1S?zo3%%1DO;J%n8TD{Yf;&#S*<9n$Gq61&(6T#1HXD!Qc1;
7485 zJ$G{?9QyY25k(k@KR?soOKCFF%Al9Ax*~i}RgFT#&oT$aqn$XSL3^Zt5YqX+pQL42
7486 z1x<ywWHiF;2Vy-=GRL?*W$HV^Kb92yf9a(qBzt;@+;=&qLyZebPP|$J`(kWe$Rr4v
7487 zX@msXSR8K*vSZzXj(ghTY88rcP(Pek$E*Kvv=hP1)s!#}NzCyF>}ZZv_R{Fzj}l$b
7488 zN4BFUwCiY`86x-_d(i2D>F5cnqYHwLw%sx*5YVCHzo4pY$4_-S-o{Z&HvSOWcl=bp
7489 zeaBBVhvndP=y>e&-Bp0z0dPA$1BEEiqBoJ^|J%;T{`6#$L&o<<wC|I1ENl)!T!n&8
7490 zN5|d#Yb1;eTtGwb(!>l3V`Si=R#e=6|J0t7Oq~YKu=ZAIKQL^++v8hnp4gk0{zg1&
7491 zcqDz$6;8h8ed#0X+NW*DR|VZ-SAa!+y4gV$1ZtO)+LsuWW<sUueojo?TFSfAs%wo#
7492 zlQ@>UoO1utE*A$p(~~w7#5m^@XJ^2P9o1b*c+leOC=uubGaf|kGiHpz5H!rf*w+VT
7493 zI|xdg)2@mOrHX&o3wEF08;6lyXg=HUwnfb?1qU^^-_wmpY8y2ksd0(Ogp9ZSaS~6x
7494 zF9yHtj~6(We@77QJ}sc8eHoL`qhA20_VbSx3B61tDBN{=z)E{AR=DR`0i$PgEP75r
7495 z-nT49-fvg{?|=3GkDX7`m+#4qb<E*)598;WrgG2rj;8l*@1A-;$KQ1)IyJLCtm)ky
7496 z@zy+=j(B>B)9M4oOEtNjwyuO@ZmHY5oDO^wvs-GPhWDZD(bzbp?yVWtaW%cQE;Z8u
7497 zYkN*RAIE*!TQa+w?iZ5{Ps^?|YD&Txwc~wyfa}@$Fvqd<;W01ISur2VaKAjTgZt${
7498 z;-q@8IE;3^P#dSyLt?(B$^SIeC;!u6(@sQGpj&L(SGDy(O==I<ZmmZI2I=T}n!bZz
7499 z+Q`nON3#CxdU{kW+0hTRqk!?AeN?RN)_?TanBQk|WlrN{Tswe<$oLpQuSUcY@O%!>
7500 z(Lor-G4f9%(c1!OwnYDjA?xW!Qg_9O68&8O&64P|0VF4V48)!(%MU0;O&q-}21#{y
7501 z#2}6Zo0mA2E{7`KEQ!)0Vgh;GljyY!+15yEQ;aCldje>dL|+OZT-a|HIw~<!ln{Z|
7502 zxs;@SAIO?1(dQT<=YqReNkZzhrQ6j>iH_AymultPMdZ#`qS9K(n!ZU=q7e}#DjNCT
7503 zbcu={#L`L}%6bnBnp9N9(G@XBs=F=*X+ctlJhKD8NqlNAUpyiYR1zJ}S>$#1oK2FD
7504 zFFFu!Hs{O7LkW^-%;EPet;0vGo>Xl7{<5Sgyd{s69fhCz-$^=6B$WliPm`#q8_)M}
7505 zEz_3<#b!zLk^q_^(W@A;qh3<C#)uNVtsPNPPsNB5l}{{LiMs7gT;SrMV3EjrEC%UP
7506 z7phXpUTv?G6p?W$=Z3smFGUiUGnho6#IH<T!!4Y(B{4<xd_17c(0abaS-S(uEQ$UY
7507 zKt&Rb&_OT)x%iT3UxuvlBsD2Uv?XHyA<jw-C`D3gbPS5|ZS2ecNKaj=hy~6I1kaMF
7508 zyx(f|mehqYqC|hoQ2fy$pYy2+3etD~ts2+Fpldmb+d>F&T-H@_mI$IzKqp1*!~e(K
7509 zmjG5#WbJn62Dl+1347Qi!JwcJasgQcH5UQ|46=ny)DS`f8AF0uSQHTrDAy2$5l3`T
7510 z9Jg`TQO8kqlz<{Sir|8b&OgIAZnz>U_`AUSPSrWxmCC)&IPd@8|K2Oe?NeW!I(2I4
7511 z>gw+5bLe#rg+@=zbRiS@;UZ=RA(I%=ic74&&!~m@zaoCWC%!<))?Th@LW)2VU$8}D
7512 zzW8QCO)P1NMZ^S0o({>gSx*&VeU~+X57G^nZjsohzJ5ZAOwH)YVM4?S7aGZC5&bi~
7513 ziv9~M&8nEqxu<(lrVA<d$8>K<Y@N?2WIL>bC_qUeJ2Mo02>y~~+{?!}C$!~#rbPl_
7514 zTCD#|Z|NvVJ`769c9fH%j8n;V2eTwP!Ba3_xxwRIyKfOtL?$?kU6s_cS?S+$e!VGx
7515 z_6tPwB`;iJH8hGs!XkoPM;@i=>ftw?+i#rLw9|!L*raJCw#;V~(zkatO~_%m4Wbae
7516 zTMn{}qn@nELjK@EGlV?G5M3YRSZ+@~Mj5V~ncdIUynpXup69&MCTo5DUtxKWS(<dF
7517 zfRAzFPju$<%<?85qj#ooy}?{jI#XCgP?XNh;Z~XHwa#=Q#kMro$U=U?T)K}WCi`Nd
7518 zxUUxR=Xv4_gxujlGlV<=w_X%Te8Copoy90RPDm+HGwMwKuNW`8*(+hPkpJ+YX`=lQ
7519 zPy93?Pxqk7LQ09aR{I5Msvi#edWx4QMvyE9q)55=eq~*RWm#bJAL4WSD?Zw%sLg*5
7520 zCiFPxV=PzyZFiGD)5By_cas$*HTX2ErYYFWx25HS()4mUpr~qbk>l-=FQy94TTV{A
7521 ziWY0XkNDoJtYX1WxT8eViVsS(hUbHlXtgtp#ek+gXF66^fg{=&y3Z%Kmte+=ZQ6#0
7522 z2u?EgUJ0t1A2u*xU{NvTm{OOB@-;24D*;ox0L1X})PT6!3OGTVubB<!mb#KGPibAq
7523 zPB786O+95c@q^jd-4s|BO#d#BuxrD$XOGzML+~$w))USPR0T`nz|alUObB!h&I%-M
7524 z4dw=xt^W=lBu{h|<M+W&m~o$Ctez0)7T3=W^q$peT_9mXVCk$tLQNp`y~`%92`rj$
7525 z>-mAC_izj(%nB?m4fHr1SP;xQo0#U+q@T6q^ntgZ-4kvjZ@!HDQNHI)2rRp0F5;Un
7526 zOIPu%mBF0A8C!F1ngH-`D-Q#_(<MKZ?<l90x4T*Sw?m8gGg=;Q`CPDLZJ_nxiNR${
7527 z0vGQJo(adB_rulW$lzc&-8{B(J@RgH4-W`j7(5*47_12-UGdQHU?`9}A#hRLsV>ze
7528 zn1SCwu;;?ys9^hG`%97UwUt*O--GT*MU$h<hup(~1o-3Jw>~&<L!d)epaQkuGU9A_
7529 zK=mcu2KEP5?gIOp?%@%24+O^q60$aA2QCVx2U6jmGG*6or(C)6$m|gVE{r>=%j}ys
7530 zJh~*XJTB9n8Jsiy+}gmB2{XU1?H{ZQbeI*_0w<_Ah=gk|?b1=)roeYu8GN&Oo+Q~p
7531 zq;j^V9rslilDor79!j*WlN{5LyA{Lvqp@q#(f-V^J;(4F={uNYH<8Mx9b{A}PkHRk
7532 zO}YP?Hfi+Ph38B<XH-52!=t0;5RN>(!J{OdQS2uTWfhViGPTcB+($Oukg3$iUJ{i9
7533 z&J@XkoAS7(*%rf*rlU%p93Fl4m;!R$_CM@WvZTC(oMg%;Jn*Z=P9;k#s}>c(%b<31
7534 zhpj8M%4?gq`_^+U>3Nm3-APuLRKaf>e9Rf%Bz>=K(krStrWH&b6Q1ahaLOV3dBxkL
7535 z??{e({+S*oJs*2;!dG2eUgOl1ELvPh^U=@pI*IOSvWwXEdRbUFzj6_Vuxf(lE-Cd8
7536 zM%}8HDHnF^d{R|yYVJhe%ODLZ+7XPFnYUaC<C48*<?+PhcVVGoGBy#%@;6ztXfes4
7537 z?P?^VveNUf8pRXkqN3u3^ue)qmMBjD)Oo=|lsi!6ky2f5oQ3K{U~j9{18rZF%9*3(
7538 zbP^e3xtm0NR5{Dl*+u>stE$NttLKeS`5zRYl=CZVFd4upUlWIrMdh^^lwJ<ykrVa7
7539 z2?kxsGb5!o^EOHR$_?XB`Ic1umOFa%WYfK5weE`QB6w|FREF=ttH|%tLUKmApk^UA
7540 zP@(n!ss<o-%d7VCeNb{=8?zYgN&g9FlwLcjQNY)4b(T;+n;t2tzvz0bx+$guN;TJT
7541 zTY5e+$%|?ehm^dh+;@z)P+awre@PjTx&tXzSQW*ADmROAT3Oh{qZZ1;>4|hbNopUK
7542 z1nGIzb7n~e&;-f;NNwj?wkJ!{gj&HH5o$P7%=c)yTrGg;1Tnr%Fh`Z=K$FJKKlO7-
7543 z!hQdi-pHVOiLXnV6R^-L95hhR`=j$GjhQuOwBZ9&d)(DSZroH%g8!mlOmA$cW~+dk
7544 zSJgA98+puxGRn+>o`S+N9r!3!{+bmqZOjzD0AUvXY44Z|k^Jv_#`L$O*}gGpA6<7|
7545 z?5o!&roYFzaks!tBoH`!glEiI;LBrPJo|7Q_>{ahZd7vGHGwh7=?(FtlKZS{k(-=-
7546 zWy^5#u)0>c$?M&?i;_3FqmplRXX6+KP}n+oSU5R5oZM$rayqg?1RPI>6G`qJEL%N@
7547 zI6FD@8j{@*fZxe=@yKu`$*yY|SJHY%a-Z-{WPcg?Ux9$#$-%P|$0rAO?0or^-FW8*
7548 zIfq!5dPIa8)Wu!UIypEcaV&l(Bu-ZjEYrc0M)g2Y+u;=7<mB{~tyPuD{w3bUIU|`z
7549 zJ+y$E&tk|Jk2Gq#S)8W!aQSVQpZstj?rg8|#w2EgcQx~V2%6f?^v5|a`Qf;WTPLT(
7550 zLnox5Nya5A`A={jrKc~S*jISsp-e7BzQ?@1=m`1Te&`!+ztPlw<C1gYu4%2h0G>d-
7551 zE*Ogn{X`&<{}VnvNvoE;(Vx@{(hou>{I%5I45+x^6#1|70h*v>+dlz32a6U0db@kG
7552 zq}aYe&DW!Tw%EQwvE3v}i012)*kbzzrPga6qWKuj0GsJER9>;t8{B3Ozk$(t91Wiw
7553 z1D_iMUl0Rd2AuTSgQE&O<|BwiE0?~?R{YE-4>|9S!T&h(%L^|xe*k+f20x~osO7%N
7554 za^&TWY`1-nae3__4?@3)A?HWtmk0l{SF{c46Rp1F(<d6<4LG%fJpNX55M-0DhG_i5
7555 zm|vdDs`&@}<hzID$TK)K*8o31hMf5^aC&7Mt=wfXaPsLBjsMyhxN#?CEXj>kHLcEN
7556 z`Kzwjh2!!kjSA-%P8vIQ+L(gEg7B#PF@@gsx(P2<T5?BiFWOA8YDM5><TW-i7<UCt
7557 z*JL`kEc5(@Byd_y;9xG8G`Cu7qm-YxnbEh5a;JxEO>eRQcsKc+XswNPNpv5g>ZG4D
7558 z(ajls^r-Hnux?bX$nMSURid}Pkr@vgYv}2g7bs4Fj(C#g1=&Jo<71h_mLun@%|D0v
7559 z>G3FC)5VwE{1|dBH~7h3hwwjQ;9U*;DaLJmo;Ucr8T<!h@F!wCQ?T{#9RtrYaI-zn
7560 zG;p&$#n-Cc4r0s8)_)<(A^sltlXkcxhWy_d{AT++Yw(+TzHIQD?UPOgBG92H{-oSm
7561 z1E-IW1Q%P&luTDQ!GB}$XBhZnjMJ6eTsx=_&Vf;KFN6QMA&1t>BL7r8fTbXEvUSus
7562 zjd5Gf=?1^Kx(FNmW;=*4GLldHqU!~g9R9??DK_Nv2EXWexy3JXuC(y>tbctBId2;H
7563 z$%g!c2HwZO+sA8x(mo4Weh<d&_UUWjW;<MN$f0(iGz#L|h~%7tKdJ9^G5Ezswax#y
7564 zQSM2Gob3jlZs6iGLF%;$X%zlq@b^Mo^f?$qpRWymQ~!88!lyubHfc`-H``~qft%-@
7565 z_);J}&33!a;5W;?nQ@!{&KUep#^7&^!N1qQ&3gUaz|*0twA-hK{2=f{_@f}cn5ccs
7566 zc24KXh4d%>UHGGL3gb5aU;{VXlgy=1Ab$F=K=irEz_ScoJ}V>s0R}EU3<;;XLF9aC
7567 z$O#$vw+2pYY~h!$d!$}{c;0Nwle=B7Gy^xw%`kAY+&%_wmfN3k84qVcCkjIiep614
7568 zftzyZ^E3(~CsRkA0)xL7Fsbha25$BXH;<Bo?|Qr-^B>7?hd;5cDR)eQZ{>FD$T<aX
7569 zpaw*sYdr;GV@SpOs$Z?Y$RtSSdy#V%kJq6FKj}kXD^rjS?ZThN_!yn6>P7tj$#U{7
7570 zJdgF47seu|g87Rq{!f{|)WSL1#Ahp&Tg45$(&C@U^HhU{(`V2WeyI<h{=FH$*}|nA
7571 z@3rtJIsQ8fKb`g8Zs9VXUbOJ3T<#tVPhvT5S$K%?zgqZcmh--aFXi~B7XA{C*RL#`
7572 z<{%2+>4VokH*kNcfrd2c#}Jp>lJye&3m%M855YrR?g<wEZQNg{SokrHn?74rzcc?R
7573 zi$8~Py6>YP<*sHu&$aNUSRd18E6Jb5`d3-}U$C5&7JiE=&9~(*<-X0h>9dvO|DMky
7574 z(`PH;vss^qE&0FXa!sGD#D72c%S#qN-7`=yeYO(+bId2t-b7FO$dkgCmYh;<2k8gl
7575 z@5H$2vz6qpWqr~(UHEBDOrf`hi*HNWwk-Tr%xC&+CHXINJD5IO34fh&(`PH;Z!<3S
7576 z5cz*+-1ON>{Ngijm8EAZnNKX7EC^6AeYTRE8<_t#i(kH2e$c|j$Iw;_ujPJ`4aK6r
7577 zJYQ+S>4NX(_D{9&IPTYO7B0Ks%=-e;e=zG2viM~y&`=8(-*snLIDO+rVYG$c&h0kd
7578 z!e8Kan`Gf~KRMmPd$1hy{(|(sPnC*YDi*)2OD?i-@x^?ph5v)~iCFm6T<%>KF7x;w
7579 zEIfzXQ*7r;e@$V&S1tZ4x!iXw{B4eZXyJ#M|0@gso^jgKLqW<-W_{XNxZDqPwQ#ZR
7580 zf3k&N#__=xK0+7g<XQLyJU(R)tLP(N;}=={7jru=vhYWEJTJHKVH{s$;dgVp$j(+N
7581 z_s`r84_o{nF#fcKf6Q`rS@=1u=erg@h2?x`;prTg`zg`qCFZBSRulwZrD8BpW8w1r
7582 zNPHFve;Mm(`l6-t;&Gn$vMo7tS)Y*>ejnrFTTkRyu|9Jx{!^sCEc_GZUuogra6d*Y
7583 zyd%edW#RL=UbkDgd|~jgg>T?;|7hVIxm>xwlX}Ve_^%fK0gj9Bbm13$<o-@@(WeEs
7584 zx8PE47Ypye?R=7j?`2#z2#XwiL#Ki~*A`sl*IIH4xW4NxoIdoUaI1wM<8gSuh08qt
7585 zw1tydAPV~}{8t+GuB)Qwdal=37XNPU-(waod!{?Ez9MIkjB^YB2iJG3g-_&mo6I<|
7586 z$tg#wF0lAT&P4_;&xDD8wSm+5B|bQAHgMu!L(B-b894F3&hg*zQS>QP+^`#D;Ueb;
7587 z3xAyXJMaQt<jDO-FUF<a$~b>Ni(jr^qb>dqSpGx<r+V#Xe5!#{y%M?q&NFc0pT_-C
7588 zWZ=Xv&s8rpaN?JBt@t_<{iU66u=po&XKprdvz_l_T-s+G>$Ahc%NhUL!hg?rQUa7i
7589 z5IOR3URTCNPkCNx`&t$L5f;C+^B4oCcG$%Anqc5muNg8w8#wWI=ksE=ffN6&JpPLf
7590 zocLv(w2*PBS0<Nxv4zX~#_KIP&vCi8Sol2F^S729`BF`Mxl+5S`ZE8^7XMwW&xe-$
7591 z@0kBHi~nKfZ%Kj?M1Bu$heXDuzQUhj;qtxPPy^?oq2!J?a4K>+ms@1v^6B4l3ztvt
7592 zu40@H)L*~l^Js&`FYjsZw)o%TdOc#`)SfwvZ?o`67=PZtsoXr)|1HL)ePrMM-wgg#
7593 z@JsmIz^UAiSpL_RoB)rLPP~mn<PT>&+rX)v<+_|>;H08_6?hKgR1E3gl>{QpviRja
7594 zcBREH>xAV7PWqp~?Z4K-S25mT$(L{L{$TOH$ozk__~m22*9@G7usk39n}y4mJ80n4
7595 z4%c$KeP`e#N8XRLVu92wgo~W+22OJ1zH%tz)SlE1pRxWq7M{=7k*Ss(`97|~;=hmi
7596 zms<Ef##dRm_!M7b$(Qf$9<cCKo(FbXa`L#suUfcVZ{CO@=VJ?(kNLC>L_PnL=!N*B
7597 zki-vpWjz0x`z6!D`?H<{8JBVUB%gO@Sp3<{e}TbI{c;W0tJuJ4{L8wf+L9ypKWi<1
7598 zWj7xAHd=TK)@O@>Q@PsMDfYm{kpFvwpY(a3+hLo5lN`DJJ#XN|e=(Q4$H0mIBA(yh
7599 zWL(-=z9Ib7z=@Tf#Z&mfz)AEWZqIlUia_m8^O(#t9SoevC%N1n7XCNJPqOeh5{Pgr
7600 z<DzGf=fiOp-oX0IGjLP?aswy*w=#ddh3{nib_+ki_#X|NhK{@ke8Ip;zI<Qxu7R8S
7601 z*gkDLbG^F3h7|=F&#;oB!byxvJETiH82nUJZ*I4I12@OB__P)IpK-kw82lvXCYDof
7602 zl`CI4UT*M{d>Q`@7B1s|lYx``qb&dC81f%9_|5VEq=Azh@qPY`ft%z1MFS`PGkJdB
7603 z&A7Cue0KT1ft&sHje%4D%2$zX`QlC0A^BIb{H_*$KjXIV-B%g!!~CL;d~KO);bhyE
7604 z!W;{i_X|r5+|+-Sft&jO+Q3czI}M!p-{*4wXyNj)toUvv{pq|ogg**@xA?R8I{3YT
7605 z6aOy74gY%lvQ64SKIm=FxQttQ?{b30FZc5~20!)7VQ%Ni7CwcqPty&Y#!nqp8ey)1
7606 zlN`A&mKZqki*L#r#zp^&xW4Nx{1(O^wD4ycf6c<>x&6l${tfdVweTMpk0<32M4yhl
7607 zPUvRg-5DQb;k_BpvG9J3Pqgq6jGt@a;`4ohh0kLC%MF~yVW!d=&O!{Fx<tN*y^(Pl
7608 z5At02PR8kdFN;=^9<ul^;p^#B20u5M;(y-ae}nn=Sa=(rKi{$NUvuGqi-C(TTG9U?
7609 zpI@I?{DL30aPDsBNDTa#h5w%A$MJ$z$`!noh4<llnZ9mGq~Pr={?6QZonqiUEWD1}
7610 zCnE-K`n08T<+*2ni(hclr!DdK=KeB$+M0NdB}bmKiSJ@*pI$r<Oo+j6`m`na|3N1j
7611 zg6Y%N#7&>Jgilc1*uP-O7rfNMM>D_a)0X52Zu+z(d?)vNttChB6&5~=+ig`0{3;7C
7612 zXMO5p;MZCB93Ce(#K3Q{@JD!@+!h0ubC&vxr*fqcUtYX<kJWUJa{tJDD0n&()ZN_W
7613 z3dy(dJsiK=##!#y7B0_ux^ue7m*)>T7B2VK=UKSiSFW{ixvzQJ!exE<k%i0k@#p(&
7614 zB`2<?S60J?D}1(E9$jmco7Woc^40LS8qI;LcFy|$neSG)PVsPPwwImmt7wYN5e7ak
7615 z9HogIS`;DB{v_%`j%uF=h@ZqbpRS1MAkW7oE=L{)5{>D*^<T{&f+UhD=bs4vSM%p^
7616 z{(+K_k9YI=F8iJ&S?VwKm=q)bA!eK-8Tlyr<ahyaVh!+hPT0lAvXm#d9iNW`lJ)QA
7617 zU(ESMz8q)K;s@bgp6_%_mnAeEFT`K8@pCs{IMRD*ZW=!{H;VqUuVn==X$#G%f8%J=
7618 zH-hX#*0JWiS0f=>{yFJ7$7%e$AXfgHV&q@nU+2h{jC{1qx*mA6`tRZklH{lQ)4JWR
7619 z|2@ELnSh*aT>e~&7{TU!8fi90?CDuL(*xFtY4iR8Y|-@pmi3o@BK>KtXY0QU7|E1+
7620 zf>hxZIx!LU^LeCWzOJIj>qv-}|IXn$$7zz0kCIQ0f8qQVoAWm3w{giQ_?MiYu7_qg
7621 z!1?=F2~vOI{S-vB_Dfx)ISw%+wO=RvNq%WpYE!F=bdCyr_+B5pUt52QTPiBv;7FZC
7622 z_BV7zG+Oy|nnx>tPma#N$tuu_;>+&^p5NDW1nudSD4{hXzF&tA9zH~;{_DP9_n)A3
7623 zq2C-u=HPnN$=OPc_zY=ukkIw;oe95^2hbg>;g@h@W)7&l$hyot9P{Deak4tD%bbN{
7624 zO-@SR)tPfarSx5wxmX=HX0B4l&6(@f@s7+})$#t!ht=`1%x&uUbmkr$4ex-fGwF5&
7625 z-YFYaXC4AYo?_u7c133T_{gCr9UyA^FM04xC7x^`&k+0q{0gQ*bsUrE3?h!SkEk-_
7626 zbu~S-Z7b2Lik^=^T^L+bYR{Fm32;hz0J7%nP#JqyJ4IM)13(C>?n+X$@gtiH2>L(f
7627 z`z@Nox0b<&p+YN~#MOxbpKP>&P+fc2C!3~^t|k^uYoBbI);`%Zt$ng-`g`K<qv;=r
7628 z&epW{$)@RJgy+yj39AQ}BIGv(5%$TZBkYq+N8(-D?>ARRTDtTx&q5txpKLn9KG}4H
7629 zeX{8Y`()D*_Q|Fr9bDQnSf?XtF6|#$t0NiOC!3D2Pc|K4pKLn9KG}4HeX{9Dmb(Gf
7630 zdO}CoC!3ChTw4D>$L_cKs6N0B{v`la8?|yqP>UF}c8k`^xdO264^5|P87+UMWwhK(
7631 z4W--pX0=CB)3;EQaX)%~-7W>zGWdH)Ou8CBRP{EOfFP7qQRo3d+v~BNFo{NrDlOQ0
7632 zXe#C~RYGg+H%!x>->^@>noK<GH%vW54fF_%1w`kc6X-D$zf9f>vaNdi=)_GRJWvO|
7633 z_Ap$5IFl71sZ~{$xCv`TP~3zDkWMlUr(_b;GB_NCcL3$M-RPGBKg5N<iNArnBSCIA
7634 z;-)~;v<gFT9(Q)92flKrcZL(2P-nOj$P-z-KERVoo|4_oDd5+#`jgfaI4Yvss>_Z$
7635 zfH>hlYDt$O_^HXJrVVV^w4^IFhZ)>Kcg5q;_ELts(@W8AMI7rkg9%=#!4Vwm3&GGA
7636 z&OhQwW2ik<)3Z>Mg3jcnYSR+Dk?qC#sYJOPx<g$E=_YTFyJgvBOx9(<VSzMBf+vOw
7637 zLfQJmJynl6;MT*3?nBdQP+@~~2Bjt3O+!(W_Ym2OPzs5^KT#9%<jzY8q-9Eq1LNww
7638 zliMc-lDj37nf27p7+jf7V&a*A(40(Se8zWjwBh>kSW34@0Sg8N9Vp)FB!><`&tkr^
7639 z;+|lb$Om_8j>51y*~U*4fvB46j&Dzf?%OCc`AAIG=JZoMv+b~kpPr~K-KY8n>@mQp
7640 z$=jK1<J${kd($L-2a~6XLHv%sJTh3{NgJ5IepDASH{aPXa-Zf~cPCT%T@V%9_=t8j
7641 zjKQnw!>)g*JxT0N1it_DE!Ur5*r!*#J$?K6>EbFN!!J%7lke5kIy{W^HwDOCe5Mb1
7642 zeT?R08aBFxlyf(_X-_pDAk*!BMj^#yIjk-Unaby`mL)N{JcH3tMUf(YyC=Rt$ag$w
7643 zmXIPSx@F0?ID>Gz&TJuRRZRglb2ly7qG|tEGWuLN)njsrOf;d8eny<G%`!@=Ji==2
7644 zFHrv}Z<HqM2gT!*^6FyYRYMxb1DLpxj}P<lk9?GNwrkJH-hp<;#X0mn_5X~;%BaRE
7645 z)jGYHbX0a72f`2|6olDITE8orY*ke=Tr+=uNhxSFn_+mesg*{^DXOBpU{W$c20Xix
7646 zxNLaBL1VhrT>vW3&Fv6KJseljE;tYt61$P%!jfPqkz|OlWEN4u39w8!mFyUH4c5eE
7647 zkZr-r^7)>%H`A(<Wrb-WOn{}6oi(;GNC$1Vtg^JU8kRhLezF;+%-DIh>|j=_R56gP
7648 zKV?8_Ns-v}VydvFXo2G!&w?f}tu$X52J{TWjXP(0`sh$7{j{vXS=s3WvqM9&hhz^=
7649 z@4u*~wxZ;W1tk?FRb|D97F885JOlmJf5_nU{tMFkPa2rszf@V{>QB}XVdJ2(sy|E^
7650 zR8}nbS?26~D|>J<S6#6f_C;$-3yT+C$erS_aX)Rg&8vOsVy}S>lYI+3wC3W%`PDU4
7651 zOKmxh#tsYyR+BL@YE@-e%`>3LroUiCYcTp^K}E^@bOre>?y*vL!PEnpnrMQNP`0J#
7652 z+m2L5CWj1Wqm0`Amg*|s=$3SfvKEL4^(L8=t14Nbt$`Jx&m6C1VCxI(Af+6cp;%l}
7653 zL7Lc2CkDr&m<2<_EGnz0C8Mq-WVDP-hn<FlJ_S_67Z#Q-s)=GJ4L0)Tm6te`Fo9PJ
7654 zOJ{{Rr|<{u#Fl0h^L-Gg%xO~1V7aY!u^y^)7Q+5nX?f8CSm-NU1e0K@Th#c}Ed(Q*
7655 zWstm}qPDou8`(>0ilBnm^^mG8rl}ldFe`=%u}#QkrsBM|QiVE@4hx>z?jQ9Xo~2)i
7656 zesac*9({UxpXu{p!>?AK6#a+Ps#s`cXh>G};H<%Yt&@f347F&+(Y75%7s2ktfFM`n
7657 zbkNxZAgC3wvZ*yb`A|aK*V?KU42i`EbP@iaurWpI{Ct~H>ei-NO@6*@C|S=m6&3JW
7658 z)W+#aRr3(r29)$((>wuvU)2PpM}%bCM}qWeYXGv~ku*Be`$XcGG`Rz!XKaEIpM<_3
7659 zqTxeg;C!((<^rCanoS8!&v46*qO+eBpi3XMhJ0iG9^+I$^S#9(#)+S9+=Ra^Hx1!*
7660 zb11kBXu_#Y1Q(ek-(2&^b0EUo;O~C?QIMV${5mdA-8>>)aOomyX9~ndWlNxTra=5s
7661 z7R9sa2SMcA&GLt8*u&*pn=>u^L*^f2;m>p7`4%qU*2?Nx$~~F+iY$Klmblcy53&4<
7662 zEL_$yD=mB&#~UoXh~@m!!b2RFRjugxBG>mWi+?7^AGdJvXSChIZ^n9z!ft)=+WA!0
7663 z=WPrB6~{lY@F6Vcu!Xm0Imaw~yu`U4QZE@doh<wp%r7>*gnt;z7h6MuFJyg2SaRAi
7664 zF7NDwU&i8ei(mR_o`sA1nMw;^!SYvFcpt_i7S7dj%x}i&yj#S4w_E)3uIph7KhAL(
7665 z*HSO}7EHda5j@NVo8OF6xmR&}n%|5QehuU1H{*m~Fa2xj^Ek)NZ^nuLKITv3qv(^(
7666 z?bF-BWlzf>3!lLJr(5`CD1*XS3t!IqOttW0#xJn&zjFK+7M{!Tr4}xG9#&fT*DU{P
7667 z3%{J>;-N{};YQ{+za>}g&-mXhIZJhQolh<NcE)AC6#1K(PrgkTypH9c!0jsdTg-o=
7668 zg^y+a0T!OianqI*>HjRt8E5fJe=M?a;a_Iq=dqlP7GBEuO^lOz45^m*oyEU|<4+m5
7669 zxoX;G$&vNO0fV3Fb%5L91B+kQ5<gn}cW_*63{X2$xx<x~xF)JQVgEWfk>z(XaN^&@
7670 z{M`+l^eJKd492A$Ze)Cn!7pnAN-8jLlK&p_%eP#jXAjorLW_Si<BJ)Wa^*pdd|Pbe
7671 zvWH#d%e?ujC12J9Z&>obW<BYZ8U>OsYa5Eg=YR@Qt~}AnU|hzzJZSD`;rDQV4YhEw
7672 znL}<TDTo}wM_KqqJQ&AXct27MA>YD<e~N`a!g8j^z|XVr)vW*A7&zIeq+qw3v?0~Y
7673 zd_6DYTG~@(#*f(GwDELiAhpf&aj=Dp-2c+OULoxDDk(3@(z~{z?dLL*|KHlwMeS<$
7674 z88vAR{UFFV*RkgJHr<dwr%aA8@bLiMBp@u)2W9J#%8`47G{#TDk#HVfj5?02pFDsG
7675 z;x$7*L`depo1fOj(dz%NmY>7<2jXZ3$#3f=`pdBZnS?g;&tkBI&o@c4c_$$uTKmt!
7676 zy9^3JI`I%X<B!fiyZz?^vt<Hu{>UfpU#&zd3g3Cr^Z%L)`jeHxiaHg@A5H(c{H9OF
7677 z3F%K&vGuQuQGO}cTkZ$Jrh;8Q-B(2`e;JoA`Kf$b+uP;SeU>c~kn<}pKZhbluzBx9
7678 znvD_rKF&YWO0=TRt>BHO|J_mAkJcWx{=Wl8GNqm%Rp`$*GP14_T*{Z@(@2Px|07=L
7679 zoF*ChDEZ|0Jm<IAoF3jp-ZVw>2}<{sgqha_N=xVblPO{ZslPyPf{50B+oJS8Jy((Z
7680 zGA`Q!v(IsoeTehFM-d~~`bX29*v0Fn><Odts4TmDT4O~ke-qEY<B)C!yZqXkvT}1%
7681 z)j!))H7GP>&_K1R>R;beHMz#uAV-lou(R9M2^Wlyd_6rc^5e8;2@SoI(sLCNTd6{M
7682 zk<UM($eL}nXN4o@(PpMg<G0dT5jvt05N{R69;PG{>|c&aZVtg6&JUlrqco*wE=1Ms
7683 zaP#WEPpWx3uYTlzkkC&yr}WI>@~2@hRpk3;;?T1Bkq^1dWrOlA-?0;%kryJ*=SAKQ
7684 zZF?p)f-lo4^O|kT#zel*Iz;x*@yk(A{V;XNkGz`~X?%wGL))IE3Mn|W?UUV5YBk{+
7685 zY0j^>L)#QTmxF9Kl&%lY49^%JIToHCE(k~7nm#Qr@(uQ&J%KLGt3QJTHrXadD_xet
7686 z$>GRzN@!lg)0ww|9jz4K1bBwdqNWIq`KE|hm%N6Jndww`!(&QZ=(u9c^%^k}pP91y
7687 z1_;P&sL4zhJg+`CGkwgO<Fx;5E=BqfwUDT6q81Z1jHqQq<>X;E-6|4-NFGJja%3_^
7688 z)+2(1Ss*uoOj$z@QtIYsmLJV)D9D_vYJ`$Q@8ma>XZBPIuGyBdamObmrRzhlp<Ags
7689 zqS~5mksT>(&wzx;cEzv0@LaV!ND_31(6~_>?D8X@OSZf<+b;Vg^0s1DoKHalw;Fd~
7690 z{ff+ZjOe_`cBR7jhOxuOU%vARuu(;Wd6DNo8M%IBo0{^Gt!ozM5C5jRFIuRkM}1P}
7691 znip$3QEn+z<xhD$H?!y3F&Np;yQ(lrHB?HuhDO<%cNA~!?IYVP{q0sa69uN+zP;+D
7692 zk!@->qKKVi&}OTz1Y>=N%r&poTt=;yF0H1@qVA<`4!x%Cr8R~o4}Q{@&)2&A%<|yD
7693 zb;ph$*XJ8I_QB&osJ(E4)vwE>@ra#-Nxl1^w3IbhQ{69rjz%w?LgDkn7laFUsG8C!
7694 zRA-JVt3EyxJ+`L!`0?X0I_z8|MYc=xqr14TqBKg=ep2!ec0+butGZA7Y<+#=ywuQ(
7695 z#+ig&lA&#pZ$n4MM-CkQIPz`dw>=xbYuR^uUh(#_*FM7V$&18i_I)e#TG??GE5^uP
7696 zks0K(fkthbzk#wvUfpwj^ybOZ^>hYf7wHZ)4C+1&DkVb4BhQOA!SRvCyvX0Chl#^^
7697 zlHQ`IIz2;_oZEHJrRC8yv}64=wR!W|U1&coVGU-s9W@wT`{(RP>8aaPbt32e<b9x}
7698 zSu!7yIy$3l0F`6?C8>EBk1Zs1&OuTrJcFj9@sS^Re!*1!%{1_(to{b6_3F}(c~Epo
7699 zS^Ws$ycaO!5JJa4nZn~Iuf7K%`H?U38y=;raejoS_%+*V=H)evL<P?W_^#T=ny1Zv
7700 ziPW0qdG(hfQI}TVpCmm)mx+9r=V%DIIlu2md3D>|yvP`^ek22quMbL8J*J@@P(jOm
7701 zp#{mI5IJ>B=(9P<#DjE)-(LB;v^nP^Rgd5u&yxCioExNQ$x7EeniqLN)#Bhk)X9+x
7702 zD>`2L=VAPXj^sr?v`3$kQupognlnmMzSxGp7Z2y9oPtyEaLNTrQHmyI9!{CnXpOf{
7703 zYP@kfA5OupEQC+qRsx*~MHNn))=uy2Vdb-WXAho5@5L)hmY$vtUux-<rRj@G7FAX)
7704 zcgB{?b0!v5IpM`sI4*Z4)K=iH+zHn%aHf?kb|w|qIOkL@adJzFNjmK7Dz_75rQ|H(
7705 z^z`DQijyG@Z@SZaSD%i*sOe>u#Wm%^pvC+j`aPr;AFEbpg@2EW9r_F*NE3LI_evCZ
7706 zE;F8B{BP}LZdrE$#Hq4ct|l@rs6=a|-cM{GvPDqi_fw>0@IK;q)%}^ul-lZqw*Uq4
7707 z=d?<{f)1L_Xi#Lrs$jQI1q}8e68BQ0@bd%y5--6|iq<8l1gXLjdQ+m3k1el5(H=@B
7708 zZ+X?Ux8=1Rl9Px>Wldak6S68YX+IUim5bAMELsN1PF5SLh2m+GP0#97N&Az({7+0?
7709 zN_z6)nc!gh=$%Ar{9B?^HT|DNr)l~-qSH0~J<)wM{R7e2n*NdKVVXWhbPmm=*m>tt
7710 zBu__N6`8CfaVj!PN8(*FZ8}#+TDoM<bfJ#$mTVp2E!jH4Te5Y8w`A)GZ^_n?4(=I{
7711 zR;MFr?nFe^>IiSi))Ba<g`%5u<P;UTRYy)$k-K%IpNc%JBUvsz{Cz@4cuTg9gxqN;
7712 z=Q;fvKKWOw57Lr1Qzdm9-Ap9Yw@`Jt4{oErNyS*Cdykeu>cH02p`^ANP=r!fDzsQo
7713 z-cFq|Xasmw(n?8cqX$E3XPUs(xJXSSE=_hJQmHpGwL3l9R_djmpq}1qx+l@`nocKL
7714 ztD2fYbdtt<QE__cq@GA(+G;$LEVT~SbZ?@EIjxD69*V2#^mI~d7CFP(uDM^zZhMtK
7715 zJln1%T9@56LbNWs?bSr<vfI`Zt;=q^j%aOluWbX-dI-0@hUo4}kG9tmt%q~lU($)M
7716 zhjZKO$m(=9&M9cZuhVzMwYy+=3vQHlbI$~+8>n3oHN94*-Mn1jT7h=OlR)c2+s!94
7717 z8oHo%C4U303u;%|6;n)hJKAv7Zb3R|ecrTNSOJ+&C?(sKWdq--4Mt(}IWo5lQjzN6
7718 zQ_J840CWT43~M*jrDD{uYd71?r`bzK&ULAxnL08@Mf&K-c`8dbL{1kuliL-#q@rdh
7719 zGUd!ukqn(utmNeC$b6M04{~l6Ioa(NxKusOP-e>cg{jYlimMN@k}VK5VyVVzOkAep
7720 zVZ=Mq9Evxms!Q6HKZ>K`C6DcjH(hVEkL#p_2QCKQ8Ce_v)SY@udY~`0MBp|gs<+pH
7721 zzLdr!C3V$&@x91^dEgD<i|<8=iZ8wwO%F_}S3YToJ1x#ol3U>n>PBA{v^ayw3XsI6
7722 za<n)j2@GAGq&tx%iON=)+n+-+1EZ0q*mRspujKaU7{#e+Hc;yo_oH9jk6w-zKVAX`
7723 zH0?zwDT$c7BkH()=$FC@eZYqc#TadBiRkuG&4q*$a6Y<yD1k!HGRHlIBvVMIW|tt3
7724 zk=&uJ!J8p2FM3J(2^gv;y3^y9#Gi=I9<oowM+B#1IGQ4e)jfUuPiJpsX7{9%MF%9r
7725 zEy3>;cM#Q<=9Jz_WG=O{ga?^$H}AnCofE3CPd1k*3MbUmEJswTep2at#~nwt&7^^3
7726 z26y}sQuBI-Gp=UBQ;1APP<2<3T5w<v?vq8pXry&Rk*Ya#dTIoE<NF7n=^QW(@|cv{
7727 z7L}iDJoFJsC5U)p$vVSQox>f3QvGizNH#jz%l6YUp86>nUIj@%T>)xrIyrS?FESf@
7728 zE~Y37?&ejP0aRlzlE&8KY>_lJM`djF#I8rT(u<MPVIztUToy|?eN_P$Z9!4^P-I1u
7729 z=%E#-sMIPE^wZH(iygO`F0X+N4{^>K$*JYmwxStf!^4;A=n{^uOsC02f_Ez1*e4N#
7730 zM7*|S$fN#@N9@sZDL1AXEpeBkVeyF#POzv_?_K%dA@$`q{`aJMgKHh?(j?*y&`n4o
7731 zQ->Hf)P(-Xy&Va?{RBG02R2O|-840~X=+i^)IomggOGfsPNg}gfXYSV;;_<ZdJ;^x
7732 zXeK&MJbj-B{znhjxmWnfdyxEhGua)eL?1GE-T_Ylulc>HfX>V*ZniIlIMSPN3~ri8
7733 z#s>ZDM&bv^Ih_-i7-}B|zC`0KHf&t6ktSSBjJ{N2*laV%pz~@^)gyy|e%ZQu4;$5^
7734 z=KY7}p~_S9uC(e$g{9);hZs+rCNq=S)zlaRHM5>Mqc+#1CLBhKQ1+^(iO`0oRc}BZ
7735 z0}EgO_RINN!Gyc{D`eIa(SAAaPpw(vxNp+~mADO)y~b&U)z<sEBsH$|1q~x?Dp9lI
7736 zmfA(?$?;Q}w5UXSqe#Ksd>7u~sLAnDnH)1|(P0Mn^EF_~_>SQWadndMo;{begKE@g
7737 z)%Y!N&!p}MkzSx?`3-OAmw^o4wBBFm#t7y4{5w&Jv>C)Ixtlv+lIuwq&mSb+Ynx#Z
7738 z@fDPX5`osc;z)~-UjSXDkfMf*sZKu<?aDV){(CZa^Zh8QKNXeYHY;l!%9@RIU15KS
7739 zPXm5Y6uc04#K*m1aUt+5uAD;=QXZdZYX4h~+e_V@3PTtd0SfNs6?ps8zZ93FUM?-H
7740 zDD)?X<%m-fg=|{byO~OWUt!Gd$lqJtG5Y90`nbV8$t!FSEe0h7nQ*h*TD+mk5G&ys
7741 z;@&D_8gqNSxm49eUHqNFlzkGEQV;OlL8@rNbbPQ^=n%6|VsLZZ&wf^c>N8O~^Jrx`
7742 zltfSvtp<BK3{|UiO7l8`mL|d|9f1p?0bZ$lM_nZg;#MNb8+pG(QYoa<kUQNM^BbLm
7743 zzE`ES3ay_9P@(QLmu@p9R5Iai{wrkY4w~*h0@OV7AAm5j(?%n1sVXVk*Ivyot!YW~
7744 zIat&kNur~d3cUiTncvfGsElD$Vw=0^eqWRK5ILOnaN_>pksYqZVp)ekH#&ML9sANP
7745 zy9%A=yB^$mpa*x@<a%_wFKN}SLwpxHdP!~04S2cJ-t@_LeDa9L+$q^-?lQ{b=rYzL
7746 zyZ+K+?r^oQK&Ok`kzBrChlF2vN_A6-Ue-=a<2;FNx5eUWx6?16-G3PLt3Dm~55MLu
7747 zzG_nQxC4HYRes!Sev`Hy=lmCaAKdiA;9%1agA>}jiHWBtj!<91ww7;!6XjdrB>gRL
7748 z8~u%Oa?`JfQ~a-pQ&C9J7t~gj*+S&DLq7gmm%cu3-yWYckL-en2%c&!T#VO_^7U;e
7749 z?|b1ECwHN5iYc`-e=3Ymm~jj1ap2=*|EuFJ{^!KF<xNAo<3nI68dqX7SCj9Md-xgY
7750 ztKk#;TomnTd~J+qy8Q)lhJ0<@%m2*yMC0S-O#AcX-lihs+c#0=B)>3BHX@K(ppXBd
7751 za$o=ZWcnQX6e9`+PxVDmYCo?uG-s2t`g1+erc}=?T^fIWJ;2OnDVfbBP)3vx;_^8<
7752 z&`5>YK}LJ2jvkyy<_J)u(~Nvz9AdPSVjP-?bD&)-Vjae;_~u=Ikv-i1+M33h<DA|U
7753 zpf9pVG=W+;&PX4Sc>zZ(A5_5i#X=T(&<r8xF{Hn=mKa@hD7elHO*H?-)l3D~DG;*A
7754 zgU%CD1nMuXCFYAikFzv8h|D-AdyCMrx^SIoBB`7+2ApblOBF{%yaH{>B4nVKb4mOb
7755 ziJZY8+DynZO+H)LI0mNr`GlP2=WDga&bNwzjeJCTLf+v)(}aAUp?Ify>&h(>d&xtw
7756 z$l4;YqkeWF<uehTozuO;DyBB@5&bFTiym~IkW!59Pl-thuG6eP*RYHm`55ouK~A&w
7757 z5H2a%P(m_Bk)4f20);7jL@Nr}LY|s97YNzNP`tBp*UBvtd(USSGL;uJno(lw84cpo
7758 z{}nBR!@4)Cgs8L7Q>Q@4HeM++gcJpIOG-?1z=<cM6s#F_js4%|g-($|+p)&3Qz)c(
7759 ze<oQ|wn$7$0HZHhQ`KCTrCyyT3rX)JD4=7S3u-nFR<nS$z91o`_<)03Z7tLPZOtv0
7760 z;<eypA<y!l8A6JomVmRw-69cbTcb@|d%DkPu6wg7?;ou5H@@yd%BL@J&QeF{f5d6^
7761 zY3dUCHP)5*gq98_KB4uS5-gX&C$wmY_F2C|BGPEYXb1T|NqjcC&SW9)W!+jii?KyD
7762 zn6brH2E1draq_)Jnk?jOhP>={(NfMsTn@wu`Bx8`Cgi&wG(}37;}<Gqy$8vh>Xka5
7763 zdqkSqY;y7Bi>rl@G9u!f(3Z2gNAB`Q(KHz-(ivvQh+jNNlP-{U0^}*g1li4@K-*g=
7764 zP=T8Ae{CMuIp0szRCAVQ=ap1rjyJ%Xmt^xqDXBS2vy$d=H!S93v^v>5QA%pg(ySyI
7765 z+pl;XKV8UU4ABHOy;+kwEp)qe;3F;wLW*BBTm&)uON?GEQiyjJ1J$(uiv_a^WBB+}
7766 z23Ks}IOoiNDlf{wDdnOT@)75ckmVjUO~@4<G+D?x4{A0j*K^V)k7c@$PkGQZA)oc2
7767 z=|XN}D0<^d>K;F%keBiUHe4!%yn-PuOJcwC8HE&wj+#+oyM0C>#Y3)Ul$guUbD}IC
7768 zMB(>5g$snd#1lV5NKui*7i^K(wLYVeqM~M$nD|G+MMy|dQ8P;HLr-FXM|yQ=c4^XE
7769 zYjF4G<(gc|WQ7m;Lt0Z(%}>3WH#-M~Mf^b~(C&%o;b*XlS4i;+?m8DpONt{fK+<Nf
7770 zc{QLt1x-Q*C(%nY3OG+h&^jN|Y5s2(Cynx0n$_E8!Fn}{4JYC9i^pTmra^{-U$17J
7771 zN6%~Z1wx)nY7yqvEmNr6ii~1V?mn8G>70HQA0vER$46OGbJRP?9M+46MQ=XJ{O2(;
7772 z5#(l+-dxM^d-=GHk1z1i&M&?|PvLZF)gc@|gOAc(cK+XBNX99P{y%9^${A2wT{WPr
7773 zqPV<ve#wAlW}xPk)l~lz7TBxN9I*N{U_o(lb0MdRd?zc*BOUd@LNTcg<1fgo%}A9N
7774 zSJae~r784%ZABT93~N!0i`6NxkX<2WC|dwSO-z@R!weE=v;lJv#m1^YLaa7cg)1iL
7775 zvP$q`wIp_{KoVL(B0$%aR4pp2Bs*7riGWM1N=mAV=9kr0_b)ClgUK5(U{JvHQdz}<
7776 zL7H1fv>3HB5+us^Y6dYSRaF&KK4g={qoQ)n?H5W#QLAXYsX?tKHnRG-xBMm80hX{n
7777 zbjb+TmX*Pgi2PkeZd<u^cF);P9Du5Qfi$E90*h<Fm6}D=NKhSi1(GKOS_gO4o*5{;
7778 zKkmf#fi`%%(!Ms(p%m!)z>*pqvSwGGaqg=8*})9_>lIuW481seMBMcDW#_(FJ^NR|
7779 z+v4L<h8wv4vf$QuSCOANhvz&!<AUIYfz$~oGLU%xRp&kxoE;w@_;Mw90>_-g*AZjO
7780 z^(_wuQYM_9|EEAoFg<u?;L*$W1<DTxh8_-_nx!ON7}r;c3}!#%74$AuQWtcqdw5Q;
7781 zaL&Xzfs3=g2~B^$<m~Kz`)dPjg7?p^K0Cfe;I)<eP~3y=1VvMgA9jQ9L7x-fA92Ru
7782 zOM~qLDetA9IlHcI!|XG929jo7UwJ+_3*Q6d$yfYx^#ipdYF7i8LTx*Ygyc;CHRK9V
7783 z6R0JJ&$=#9Srh0GyyC$?WiWlq>ie<-ZAJ!`2WMRpn74K21A$ZG`nwaSfAgE*SHXLJ
7784 zgYS@GpG+BQQl_xTloHGyl~otfCK2qs#n2guy)k4GNf~3JS2v4_%IT|Aw&hf_sBmFr
7785 zZ51piRW4fW*)E%3R$K!+P35&P<fL;Jm6sJ&J2eZ-s=;4fQ#h}zVt!#6%uUU&a*E3<
7786 zt4kbc5CZq&qMC(HHQPY*`I%K4L_^t4jh#W&Mf34d?Q#eDTwGaEVwgv3YM2WqwaUtC
7787 z$|?$rbv23$%c>Wbl+1T3;GIFvGN-h>wt68z-{hAz%;p;dLx~HED(1ri)_;f1G_s)u
7788 zYgnHBDmoEqH?`jrWEG4I%W3;nNFobyo<X!lMT-ZP&Bx{}bYM+oIosAk>q^7IT9__?
7789 zOmVT1u|mUkTBVv1oZ`xg(y|4xELKxiSy8QK8;1>lG3ZpNk;5kH^k!`os%HylQDsHV
7790 zLQKsID;JdvP*#QpOgbk#dBBp<lgA8bHg^rc+}C73H}xh&sQDA4NgY-1E~+jmR$IT-
7791 zKqEm8k2chY4X>%$lO!xJ!G7~5qW~7$RPCWCy~u=hBnT%PVHo6#bSpODM^Y_HtgM({
7792 z-Nbquoes!Uys*ll?ddo*RI``klEK#Hq8LGgMrGA7N9WWOlM)c94Aa#VFDR+Oc~_<S
7793 z*f(Sbl+r6p=hNu6?6r}dG6zFg)rNWk=M8uEK;V^nXqQ3;4F&XEjiXOZ44=v>YHR9Y
7794 z2Yd5r_+UKIL0P7wG|E?w)<-8`r;=xnkapjzb|sB)xj-INg5+Y56jd$PCw{f6hqiJ@
7795 zgSD`5zBVx@Cm=VRVQ!5`Wr`2ofz&1<mBNroqZKtPFT*)rtuC>^DySo%FqKeMsgx?g
7796 zY_yzevqa@o-BY-@5)uq^j5SLN(XEtIom+a~RLiOWjZ^IC4-a&!sop87sVrlmi;>qG
7797 zC&~&RjOERz5m8aRXtAUFo+b`R(q~(t9&V~b3iXtT!qLoVJ2Fn#)S{hg3$*@%MKw6T
7798 z9G<agoWgh>8Rsi3Eh;OgF2L+tyr`)9LI*XXk;+E&*!msmtr|e-h#8os6EvGT$H~@R
7799 z5%nB(=~C)asI$0izN3~3INJ+LiWgQoVnh&%cqR-D`+Vp*HDsx$#cm@hhWVX3K^qY?
7800 zh6t%tHjfMss^LY&D&vFt3NRm50Lc{LAbl9D52wj^#f+p*`NBeKH98|}D^P3XLKUd?
7801 z#l-{`R?J(j3ZTgoy-wK|U098(p$TQ!nx-LXE;P&%ViLwk=We3@gRUrV3CSTli&TA_
7802 z#HgP>ZM{ni#G9ro!Kbg7O<@cZbO6pm8uo@Y$Xbk;K?6|%KAqJ$j3{ZZ=NDD^|7zQW
7803 zbg$E$7w{|SI4U`HU0iN*+LeLa<n+4uxJj*()5a#Jj!F)W!)q_KA0VIkA8g7WCjQI7
7804 z4pWATo%oh9?_4ZBN%pmIqmt9E35-cjZ-^h2+-F^j+~n*lTZWT|)wP<Cd?*ljCa!hz
7805 zuyAsAIJwWL<aF>N4}>XWh<Nws`8%v2xyTzgzqLxGdb~#%!X)~E5?98Blhf(~=Om|3
7806 zP3|);IeTt$T5fV`IGOJ1NLB|dZz&9-A7y`W4us_<Qkp!!&-T)Oq4Lc|JfHKay)w}6
7807 z8md!60Q#<rKRdb4l~kv?mT`BsPVR#?@#-)xu^0$i)kDrs%+ow$n$`1RE<^3ypn4WS
7808 zwLI#9=z-Y(Z?XwVZS3kV2$aHe)vx{u=+7_=M86fK&F^x@El27L-W0F+1*b^B<5o%D
7809 zPi)(g(c3SetP6VCJtCm@_Iq(50{CntT8L&VlK5iVoa`7)4EXVSI!XxW&Gb!DGF1$(
7810 z44R;LNzb?it7yPC+3zLOI5%xts<{9d?MsPP+fgy_@hoQ*jug}!fg?R+i6&=G47?}?
7811 zz90s^ECzmg416tcs;`{qYJLLt%NYEdV&L>JIa<B$ih(~81AjUOzAFa)Y7G3(G4OxH
7812 zzz@d2KaYWb69fM~2A+h8iP~A-9jJL5ykt``TDy@=FEtMN8JC*N!GBT={s&^<{bS%G
7813 zS^i{}ujYQpC!1l>^qIi?>zO|rycEbbPc(jd^A!!J4^*Pzg)#6|z^NVNVYuweygCN|
7814 z`WX1882FYL_+7xM+*E$Ht*$?)?;|nzW!22Ld|13>4H=9LJ9-sE^l463{^*eY9Zbs^
7815 ztbpk0g127Q_o_(13Y6E~>Rv;yMD<gGW~)|j86~SSl^rPE@Zh$E*T8)DgLR*GXW%bS
7816 zL3t}^e)!?vj`=G*^#n{W`yii|^7>Y(*@~Q&YWi^m-=YwpR-U}JwpWPy280**V3r#h
7817 z%4e+kD21M^s0AP*e0wfYzF*U~d$Q_;rgVSGPi>INyW0Ta-&txeIOyNj_~RiC3R`g1
7818 zuYL~R6|~sum3@kMWa!X_Lc!%cweck^hpxQl)%SYFiN6Q_M9!lIeu9BNW8ggve6NA0
7819 z8~A<$r@DxIng=ORea&m;7Yfz&?FCx+U5tAQq-Q$*1P>axDZf4ABA@b5=xOkq@@Zb9
7820 zK=RFcsW0Ier)#{FTVn9{HgNhLngYo=34g+0W8fzL8UsJs;J?AZ`xy8=F>qx$1bkGk
7821 z$^V+c-`9}ywt>?cMf5yu;HMgRH3>$b1Fi9ezrn!!8~DR9@aGIX%i#Z;ftzwZH1Gii
7822 z{}BVHYk}w^His$M#Anid4+7z4xwjd(S+B<p+-$cVcwIn2&Qp#$y_m4eJ=4I=dYu;o
7823 zFE?;g&npbvl(WvjL(ogw;edhDwN>!%4BX^z%aac2f11JH)xd`s_^FIbJMd*n`EmlA
7824 zYUiN_zu2H8`NIwTB1=wNq*1ukD7P2lqW|><KElB1b6^T2e<c2d|4sv^EsKIbYT)$V
7825 zQ1F)xoSKT8%Q;}-!vB$h=NNJl`Q04pLo$TFhk=I;e7J#|<(_HaIR^hZ25!oqZsDT;
7826 zJOdwP$cY$ux`F@7z|Ho#*}z3MvN<~}T+-gL@NZ$Dhk|@lMC~)$DED)VU*w#^1C02`
7827 z82n=mypw^~7&zU<N&Bnslo2O6=J<cw=tr}@U{isnMP^ZPxn>D|vS#zvmV(n9N`da5
7828 zDF{w;8HIH9>*KNxra7E~@YA_Of#x&{g3~!bVVFL6_*op!v2bc@3VHhA@sH#9WD7r=
7829 z<FhPW)*0MgYCcS69y%m3P4h#0{N<3s2y%W4-i{kp?!W~vrVc{rq7O<>h7>|`G6mvq
7830 zrzrg+?IUu|Wckv5f}hXxJM}dM!9U<a#%S2X+cJN?g`dLpnr7j%x!fWP7aN+T7Ea|;
7831 zxJVzoa{F-uue9(!d}7pD_*Uk>#=^x`_pdGd6W0Gh8)y9=weZ`yeV(=O?^&NeS@<g~
7832 z=YWOBaeMw~;a{=-vaXYUk?W|ruA^}!w&P`8C;a!b{8PDpf*)h~Vw+lU*<OB*#Xpht
7833 zn`7bo7&m<YkUrg+ugc=TiQC~)3%{D%&GZ34a^7RU>n;8hx!m7aINg6!kfYQ~_KG}d
7834 z@n6pK<MS4-jKo0BUJI9<t^Z-+e^8~uldgsT$Z^>SEc$HVeu?98BzOYrlVahy++W=-
7835 zJb~M@uZ7EbKE%Q|vp%COd@t)W*}}izemUR5#fOLK1AzLgp7k+(01z%=wIxSvv2L(%
7836 z@g;DJh0ER{8Sm0=vW@Bqi(jta;_F2C<@)`a#eWC4v#i5~|4pu!=}Um>CD;4!EIF5P
7837 zySd!1BIgz6lkNS2%O0mL7Qd|5dt3O&EPuX*ujlb|nT5-?!K*F&R^}Jm?4r+d=DXG6
7838 zr{`xBWL^<|*%SSQ#V_OjISVi5_S|FPUvc~V#lj!u`jR<93Q{gUdQ;(R3qPh|Z{aHZ
7839 ze`Y?pZV3J|_xoTjNAL`e=UBL0FJ(Wv@ULPy<RhDc;Nn|izJ<#cciAm1{0S^)g~dOF
7840 z<7+K^G1qIOg>T{Zxz)mVYxSImEIgar|1k^yp5-@MxXeeg@mloX%<}(i@s~6HzJ<%i
7841 z@-Hp?7u*g%TKG7Q%ls$h-o!Y*N>oAcwOnq03zxl&r(5_?Zilli{0$!eGb~*8K+3q5
7842 za>sJJEw=byVEJ-?C;Shvo>yD^Wc`G~Ef!v&Vdp*zf0yG=Sh(o(yoHNCuUWX1`+<dj
7843 z!S(ve!vDtY?{L3Ky#_O18w(ftvUgMXhj4w*xA+IJoC*t<aVgudMNWwIskitWxZULX
7844 zAp9G-+}kbw;XF@1YT@~;&odVO0GBJ9xJCYc=6loPpThC)Eqp%5+j03KC&2Q1S@;6R
7845 z`&&4@=b<pn!Y^d~b1nQ`?%!Wnc#v^fH;F!Se{vP`Q#0}qSLNPf$+?d8yxYK26sP`q
7846 z+`<bvZHI+F!}!aLOSxH$e`xW``uJ0eU*_`^zM&O4f_G+|>MQqdRK!UJPWsDp&r>Zq
7847 z(})>if`#|iu=5K;4y`M$<;JVA_*XIiMuVTqy+g*Wg%4mkk6UuCVmZ$k{8TTwZ+ykT
7848 zNxt~F+GpYN>Crou{2N*RQ45!Ka`yzyAnm-J`3GD0n~aAo{4b23W8q&hzR<u~1(mYQ
7849 zz^Q4(_u(1~mvzoBE&N1o=lczu<fkj?j`OsElYF@^ev5HAU-G$M{%-Nh`(KwB5$Hhe
7850 z|1tBoG;kUxWAR5J)xe2g)^8mRocK@R`J|_T6aVLYUiY`~iF}@pwD4asKHkE2Gk%VN
7851 zQ@MZVa?iJL8MoyYeu(F#B?eA<PG$TO11I?>@%g;Qz==PO%e~sbiC@{A#&M&86aS^m
7852 zf0uz1zwFI<*uaVZQ|AA@ffN68JWigo@YdWuZ!s?8U+!BD8~h}HHP`EV3zvB_J`qd^
7853 zluZ18V*UiiMZSDt*x$ls-6dOjM9$|dXNo1i9iL3+TKH*<7h3Y=d&4>lpUdrVizR0k
7854 z%lWN^uVDOP3*W-{?=AVVo_^E9%eY_OweV$(e_`SBJR-;s@}xa~&HN`>xIA~rweV+|
7855 zf1ZW!WBe)$7auiSEc^)bKV#u?zx}R-%YAix8yY40c_~dLGH+*CxO^ddriFjP^Un+m
7856 zm;2tO7A`*SZnp5dc%EsraOEEZdc9}iC-FFmOD668=e-O&Z4I1M9K{KPEL_H$Hi7K7
7857 z!<EcmZSl+gkjojT^Fp21qy)lMG5Bw>_@$k-5o7;6-Ol57t0m_>*5?BYmk(OMw&Z`z
7858 z^UpDhUmnt*K$8N3oY&uTxhFGD!-?8W?t=yx{InjJi$4ly8aR;?__{UD!j~{U*}`vP
7859 zTx^U;x$@1}CCpDaP4PVaI9D1t>DiIz|LZJV^#83<F7+3_Em7fj7QgJb*=z6<`A61s
7860 zpT$3y<$P`7mowfvRhJ|B%NnsG<1&7BasPHV_^Dp9pXUsNpNi^284*TV{5NvB=UVu0
7861 z7_YMMdl<jk!vDbd4HmwQ@dp?e{X4V%PsHH=v%ydLFJt`=T6kZcXTLY(kZ2yBPCPfD
7862 zlzSr&h_;MVJF_aFU_sB|r*c1I`B?@(wX=MLI>F*Uk>|~67Cx5o^DO)##)~ZZ@~P|+
7863 zgP+Lt_@i){fz$YWk>|s!4V?7f%<``_aN<9UDuHm5ffN7x%zr!Ma(>Bk#rq6?BKMFG
7864 zgr^Lg<aFct_c;rf>%l7)KA-ttV_eFW`}xl;T%O+s_+^#!Z%3|IvVoI6SF!x|jEnpR
7865 zp7+u%{3gavv+xYYCtJ9D1--z+KVtqm#zoJ|_`JBr;+OqtcUt`Yc-%f_@n<o<*TUtS
7866 z-Y+aU;@kCmgP(^ub)%C&g9AbI+|TXV!NTSFX-^B6_ZcU~z)!Jo@x7T913%5e<vGl7
7867 z3-7}1aF&G&f3Ah6alhonz$aPw6}nkqjYAXCK7!A&@Nc<)3uEA=7QT%2|3wVE%EAXS
7868 z|B@K^N(-0gPFGmCJP%oG;lkfw;qP$0HpIYhwD8w?a=keQeussh%l&e94E!MrZ)ANQ
7869 zje&2qa31!~GcoX;7Je1at1rdC_geUw+%Ip&!2e?5Gx+>E5Ci|v!oO$!Ph#L-S$JD+
7870 z|D!SR;}-rfw`ZV3({V0%(89N}{G=FodkYr}sGTi5kK3(>g$sW#3vbKg<fIsQmW5xz
7871 z{WvfNKHS1(opXkTf5!8`XbTtqJPVim>--pafrW47{+$&ApKIawaXZY9ftOqOsVskS
7872 z41Ae|%k$e67B2hDuCQ?7zskakxPR+o;MZBWSlGJ3!YgDxv2fwP&BC*}zwU~GKWO1w
7873 zc$_>E13#bF^|XGVQ-!PL%;t3y;jE%6d9{Vhx|F+3U1xb|qWF0k+iZW%$0Qg*)-5{b
7874 zKQE+i<*rpplbJ#ARUBVo;qsjDWeb=4){iV)RT@|t>m%~zK4`Fo%l*h?3zz$X$1Ggd
7875 zKR@3`byem3qMD*CY!DA+!6|hOK7h}vttc<Mu%vuBd{i5$!`NlD#=NxR>KaM;|Ie9q
7876 zI{J*7TE-nn6>|6}>qU-w`|c!8d*W$a=Lo>ZRbw=<iBAOLqjF@N%Rar680XVVXTtBZ
7877 zasqjXCU{tQXg^RS)6Tz*^UHZ78KiuPhd_|bfdcSR@=vpHDPN8`NGIBEzxH-PEJyNj
7878 zRDHWim|ebhG=$GIg^`aUR^$`|C)zy6iFGbB&ZUSE(hZu(3-A}M|I#LE#&j--`j13P
7879 z`O<$E0wWe#KY>(X8#Bggf01)3xTP+fRUP&)!;?JUN}A2P3<=TnA9jw;aqEftNcz+L
7880 zjFc<-M}XNfDMy4p(m*J(2A0iB`w(o5@_n36zm9XSIf)}~^WFd~n*RGQqTK%eQPQ6t
7881 z!P)xX56qSc$k~`hzyA9+9c#|}TO>p)KfOxl$mWbxKJ}$t{!_rBmH!-<pK2vqQD=9I
7882 z{BI0E0>YjDr2St6Pc;1}v;NZ0q(3cbZT;T{MmkA7L8`EPkUsvwnukPxIld3JX!)~8
7883 z==`+D-wcvZj-Mk@Xp^sm^P3paHg5m`VfOjIkn``dGD!VJ?lBP2+7I7Ssj#0Jsr{%e
7884 zCBL*QJ$|veNae_>RtKkzRlXICsypS(rjG~^*7L;L9W?C$u*;`qSG4lCjYa~3ycf~2
7885 z=IvKi+<(#h(|m8<+39}JwEi73c(6)1ZSYX-$~*mE_vL+n9yD>tQO6v7k=!1>w5N}c
7886 zyrEoD!>4WCr*myLrnA`Rta6MEN5~(3M7i@KAHcz_CdrMn?<qF{o=fK{=h`Z@6$S<M
7887 zEm}=AJ1;pEqJHN3q{H4Z<MadVKzs|b=)vwMm5{jX0<brA;i(e_Euw^Yb*6ZJD|O6O
7888 z-KW?B`)i0T$ZYC<QvJ+|55JBS%{hulrbqt+WU9t<zXF}+w3>$l!NE)LgAeN|PDv{6
7889 zI<3YNjM}RBS-Sf1V{QXVBL$8}=$FD=^$TS4t6-<cHb^9r0!QC$5+!HmDyZjTZaXR_
7890 zuwm6@Ub7wma2fvED1Q>()_jNde&6olZIlb2Hrl0zmzUnVH8M{%BovU}nPe`|anX}b
7891 zN{~7rCHM~5Qi<e8pXg+H+6?k+AD!r5l>bd{2c8Q7<s_hGQ||_?#Gye@92z8eM(yD^
7892 zpouN~)=gaiB>MK|$-;e-X^6j#VcS31H_D%q;v~X6J*uwVCA9U8&1(zw?R-F*4aW{l
7893 zlL=NPXL`^yA?GlpZFWj*uFuF+vqK+`r9jA89yCKp5vVO}N^Gvr$W*g~$aI}4LZ0j8
7894 zI!{OuNaCk#k=R_H(U#i}0F5Y|ChAvy<_cjQuSY!2sm1TVVBiqet^S#9LVOjiX5C^c
7895 zM}5D{=KnxzV}a0)rsaji(8TawsvGP${F~WtJrH*SltEcA3s^WY_q4HPFz2U?H^GL?
7896 z&oRUWD?>HPDqCp@Ote+jV%GcbFm=|{fRa~#Wy;J;Q`XlOR#w%dH-Y?G7LG2MMWz$E
7897 z($g2?*0#hctDujxn`CMBt+sFCtqC7l;TgtOcjli)*5Y7R2-eKVN}Oj2%g;*+D(gzV
7898 z(I*(&S`2$z=z`Il&$H~~*=Z}QAQoTm@fBqx-ZwM%?^*eg6WYCas^cz8b-N|C3a-cG
7899 zI2c2Q)(aHo(vPz71KT)k<7YzhDmQLS>*RDm+IEjJw?mv!14QCN^5yYpiGgM-GR+l;
7900 zx+<YdmcAm}vI6n|#YzY?yR#JeO;26P7SPu@iF(J_He$R>kjG2J&$k8RU3V-w-WAuw
7901 z>FTO%UNAD3kMv!keZNRay<_0?ooqDzu`zIe+987jGTg0U=|}nO@&P@^G&{AFekf8+
7902 zsicp5138F51e$88bp)3^pM=vTTJZBgQy?4{IuBPXAjGNN%-a#^Il^g8G6R1Uq$dP_
7903 zLc>l+J__EM<FdDw#yOQOp)V7}Pk$2RUP<IUO&Jk}>Vx7XeU>vm#=>u5e1e6C8JDZF
7904 z$iJ8Q=vf5?!C%)=M_on?{CbwNnA3${_FOKt@J5cWwD9v;&Ke7^Vf<<fm$7(*h07kz
7905 zTP&QMi&3~;AG~^9&G<tWKAPiCS@>j*zhL3C7N!u-@}wO;(6A#O`UD@(d>#2n2Xj31
7906 zv*grqT=vqF9CKD0Ve$W#<6{h*_~l*W1Oun>(~{!_22T9X;E%#=11J9J9AC&sI*|S{
7907 zj#pW@j91wsD*U66hr)J?f38BY*OYN-H`$Z-ehmCm3;%}Y9EyP-wQy#4zK?;M-}q5G
7908 zbYZ@h+<Bs>hqFM!Wo{uz#xG?z`~3<^M6mI6g=$`t|K~rWw;#&G#%)&YXYD$Ltn+47
7909 z`J6>nMHLHRXwk%!{Y;ibwsNwHD;F(-`DiDrqOztW3k$ve%E}~XDp?4dGi2fPza~)o
7910 zP@9=;Op<fx2Vt)I^?#)O1?dKYRtq@-@G(dohcH+D>U$h2N6tOmQK@heehClgsP}uT
7911 zM>Qpg*9>%<Kr;W`{2}CxR{vXpM+<iObltEq%6BXMAS5;!bj^8lz!R<g7IOPd=A{^|
7912 zBdL$<_L~AMTKV#A=$A-0gUw6xnvD_vW^T|PR-zSkDr4k-lJ(9eVMeg?{{m^z>i+~k
7913 zSCITve`*rD{&m1?nSh*wT)upRK^O&_m#(ML%KwPVmvKtv(^|$Z|5}zQdLpXA6)p79
7914 zezqy)%kd_#5pCz6z>BEUv>5MK^2zab&hIfWVZRfTbjc@iT6Ym<4O3?omp@q;`6%@l
7915 z_)!qi+D}~Sne9hwKFKdQVfML8veS4;zMUdQu=S6oJF)L!{SR;kT33=tyZi)T(aL|A
7916 z5)fpar(?~>Pm>3;c>4O!p3Q~^4<D#`{`F_GYw2c@LykJ;z#3%-=Y?^p6nlZZ664Uy
7917 zJ#ox}7ska$?tA5n7sdsT{blQ>7se$mDHxc#qco*wF5c744A01`+v$d<<Eid6Jj}&o
7918 z+4}h2eULdXlAD<q+LqstpP4g0azOK^Jl=AA-L`mSiElg*jBHPNeC&^n2T~LEq&z<3
7919 zd-Z#)@!hn9J>f{s4-<zs*1nos-!HSiRc`&b`1-=6`uxoJ`kKt(sD_Pwmfi7-x9Z0Q
7920 z2aQY0tuM&L&x*{n-1_;M-E%Xx0UXz`F7@->e{6L3G;B<q@rM^as-F~W+}5hTFqrFZ
7921 z%MCSVG!B{+boVxF9Q4lO^vvAI&c?>1(9ZhvGE?2gjNQ4Ro$kKK_Qu^Qp_km<8HYpL
7922 zbKRG68`h;gl(OQR$gakhT89pSw}X2)V^3&T!@4e~?7V7RuDdH7`4WYMLwnsl;f%&`
7923 z=*v+JkDb|mZ1&xxUV5(kVmPuF1%*S6Zeuv(MKGc&z1-`^{+R3T4o4bMU^w(5$c!(+
7924 zGpb?ru>G4>l~LwQC=iakh>{`IJsi&18;-mV-cb$fhCg&Px1M<VMbTgf*imjSnywE@
7925 zregmDrILR)=lJo+E8)=VP~h}u-a0Qr0tV;0e+@@=C@ua(T6`7yCLG$4>%N_f+GeA0
7926 zRQOG(mDa26`U}I6eW6#V{Oc~-^dn^->3$UX2K5iU>F&vRJ{;N^`o=w2U!FOP3*O!E
7927 zSk^V8m){i*?W0mNf{%@-Z1K77kuW-d>b{#wJ%X&^hSja+^*-SUF{I_9!jU7Yc;pRd
7928 z><%}qOUZdOXB(yV3x|&6x`&`m<F*!PcjSeHhR23ZIroB-lv>D>>wZZ^G$x<{LMUQi
7929 zxM5?*dtZ3`AlOy$yBl{VqwLU;aK_Gt)q(R<2kZl*6r2PFq~L^U9dhGhm3jFGzu8Y^
7930 zrp73<^RDk-|Bx6mqZLe*{@|6rXAnbrwBj4qwb|EdDEc&NjR#)U=FP8T75rI;bH|X}
7931 z!LbT%aqu7a5JNCp!PMa2-u}f8%}b8FpqqQ}pW`YQ#3;P|)%mA1pj<TUsNvroZ`$Bv
7932 zGLD8rujabnHNM2n?C!+-o%C?y&iJsquVHoY@*@{r75Or>Hy0zn5lQ_T8xzr?4Xd+z
7933 z72UijvM)Du1Oo@sJ0=Z#|Hs_O;l`b*bl!#zyL&J<#5e9ra1UX`4b1)cnLEM})yo(q
7934 z?mi@@>SA^_Y;1kctA9Nk#WYeedoex+&prF8BQ$6dQ2@HeUHtU3&!AkCbvPHpaeFGL
7935 zmqPoLx`P{cC%72atFw2m{B<8y2nNuRuuCJk&37mN=Htj-Dk}6PB)40W{lyz$_Xw4=
7936 zi>3^efV1=vriH!GDXp;)vk>%c(PM2qO2Ub>TPd4Kh3ux94Bzv{pD~~zJMjLE?|eXG
7937 zn#Kf9liiKm<7u?wB-)44(Oe@@ZlZ3<Z&%#b(`?BgO42P^GUNW|BI>Nj?bY{d-J*x6
7938 zmb(&;?sIn~kP3%KH#|1@hU2G<4o6;Y+}<*L^bL&1-=4VfK6iWM`EbG;N8b#Go`Xii
7939 zZ@un^$m_Z82S;CT+}YaQm+(#KP1L&mj@ffc!jZ4sgJC2zrnp}w{3-Mm&eVawd^zdb
7940 zaO5R-fB5KYm}t;piI__hFwXykftPUU*IyjR<cMh~d~`1gcDIKUUJHk|qo}>-uU>;3
7941 zm|FL#qQVK7IQQy_79~zvd3PmBLN+js#2k=-ITtNW6LrI5gARPq?-<I`$!Sz1W``Gf
7942 zrlkt*rK0v?D#rAT=|8c<X!mx^(mPu#frC*s3`?l-o3_DoPy!}kJ;PIpQd(GzS&Xw6
7943 z(Frd$Y)rjk<+P)bLn!{V!>9l8=pN(?<|gb4?Q-`-UTWOd^5|>OFJXHwM)2W=#}c1<
7944 z?X6RCG4XHLWoEkD6ZVE0$3mG6uV49z`(<QjpcSf!PTHHWJM8WX?TfU6wvj_rF?U;F
7945 zQZO(xDG$RS&wF8-8^INQQZO<zsWt_#PG`}p)A0G>3&MpvKBCM1`qHeFo~wy+!ZX5n
7946 zS^K7XW&6Xl`kARu<p3QYIg%UsD1wVuhmRW%2I~HPRycxFDe`Jw-|xf2-&}f87^ApD
7947 z<3~N*J^8~w31cD9Vd?laFQ%-aM*!pNempDX%FD5c%8z`OANfkHBl04D&5wMTSNB<t
7948 z(jc#HM@}C2mVP+CVa&GB@o?SyXXVu$*fz1Dre)5=HJ{b?6rE)qf@ML6h8gZBSM$20
7949 z?#JNxhWwFf(6eg7`1+Q45f|k6`hu3<=0ytJZ}S?a1oP_N{Wh;JPW9Y2&iKB&>kfQd
7950 z_ieE1P8>roMt0XV2FKTr95TEyFEVmq)fb;Mr1Z>jph$emnm?f$Yqq7VUJ6Td;grWa
7951 z-5s~KZOZC0#3I|nDSycAbgVRz+xFPOnLxBY;~Q!+)AHP-b>9c8M<3Y%8MK3D%{w(G
7952 zAb-mvJL1;1s%anDkIV%vk-4DNF`W;MGT!~`_`d(4n&sfOW5<uH_Ck#&Mh@jgT1ECt
7953 zom!zzGr3N0HN=k?-}hUt(N<lfS5c#h^-05qH|9r@PDhPy3mrfB5G01{J4M<;^ZMLQ
7954 zKS1vv4sKCkOOlSBZ21H9`QhM2sLXn-@gm>k;kA9_3oQ21nk@E$p>6eJJ4Cjx&BYn~
7955 zaoXB~%vM-JeVhuSWn_E(*wn_4gX$R;fEHkj&(vH2;fe$CQ2<<Z2hIYIyEO-G)OUO2
7956 zwY-K2Id$I!^HRp{&8z!3sE0`8i>*PVV_SfZuX!gg@)33j<TXr8t?6H%ny1#8FDO-J
7957 z9<QJL1F16em?DB}XZ{Fc?aUwYhVQC<J+I-?VBQOK-wk;$j8Qizp>26}A7Xg?*f4Px
7958 z#`srx_t8ld^iHDMRycLi=A5rj8I=`3tAzMBk7S1v{}E#BT_9ig68`Dlg+Q#m3xU{s
7959 z7g_{atWqOB%I*dATxV8`@SD&>-4eAJMI_Us-v_C;t+vRe^F7T8&clJ=giG)PbN&>k
7960 zBo&AI0D59e76VkAcQ3RUa|clM$Rcjw6(9qnz@cg%H_#x-q8g+1;Bu0Pw@q*&;N+xn
7961 z_|+oLQ6koO%qp()oihSCm{cOveWFXK3a9YV-TW}Jrxw>NbKDU`y3<h*>8&%|#(d73
7962 ze52@Y4#)9p3HLT4DbU@i<K8xoqwR_u_l|jlA+(!kMvBeId?V5xhOgZ_rb0qs!=aVx
7963 zPK|Oan?`L^<D&jZ?MUsa;`0zwjhn){PM{1F#2}ixxfu7XomAx}P~|9ST_=dHo#=h5
7964 zJ3+M(Qaclin;#>ZmdZkii-KGEBeduuPtCiC>AWuK!q_~^1=&#Qr?Pa_vK{Af2ssDL
7965 z-LMH|1%3<Ss{Oa2DpjXQXDyYCvUA(rJOv|O*LW$B6m)wmmG)4ZBi-dQks7yQvabKd
7966 zQvVam9QP6$G(D$Dg%F{Kkrdo@Wa_Dlyc_CL!8~1xh1shLbyhlxAcdDuRT7YsLldUa
7967 zCKEQ!baSV;!@R8@G9C($Rh?mE!$u8)R>~B&<7TUK&=a06g*gA_wi(*0f=7x?ch9tH
7968 zx_c%lyJr$)_e^VZ_ssbA>4}58xOfei=x?3DNj=n|Juq!#GfXlyYl@k%$+nwR<PFmH
7969 znDOmtpAC!;2a-98PHTr<IFgEJdm{?w4*uSoj(W>YCqo+eI~$vL5KZghhT2bcr+1!}
7970 zI9qKOg6XtS`#7X@HMjS4Gq(41mju{EH-w?^6MS7Tjz}`qOC+Z^+3F*Y_u}a)h=8p=
7971 zLbhN?@9WXY{;y;l#*ph22zf3;0jK7&EfO)M6>Rb4Xlg10!cAVgH!$`(A88Yf&|(Q4
7972 zE@Oo}i%)?OPHk{wd~MRk_>-48UDdJH*%;sJQm0qa+Bw(v={~eWhs-1_LymXt+({oh
7973 z^*k}Xcg8ZO*A@{XZ$Tlyk>&Qo2}J==4wGWP0g!xRl*A_jpe!b@^dT|Kcie}>hC&I>
7974 zD;6*05)Uf8ib=7|1_!&JGc<u8=mMI?<U>9rpM<nh*IUwlijb{6s6Y(Q6nW4TAr~_Q
7975 zpW9CQmMt6;i-iy;<e$B~vxR)u%ex$TTk!>Lp<LLUDJz*2gHmWUA)oTN3WSu;8seQA
7976 zh||sG|NfduF>dNQvxJoS658I(z4;v<0i|(oF7`Tj%8g8Z=|k<f%Sybin<8dH|LQ|x
7977 zK}Ou(L%bLX-0Ah^l)X%5c>Oea2$Nzu9H-N-89MH96(n<mj`!MnvXC>qwqAn9xr}3v
7978 z`HVt}QOtOUIz>LE9^p0j<QYsp>_M|%WbzF@o`4=0(V+uQ8~aS^ol%9;$nO<RN#DpO
7979 z0-VZ0p=WtLQLuu^&wNN;&z5*SQLv23Jw9}l$y~1|3dH8(b{{&(<XK)%6f9)&_dfJA
7980 zlkNRx@57|nV?(dXYn1mruBl>OK&;ui&Qu}K@H%G&+FU+sztQWQsY2fCF<uNtu}|0A
7981 z>xrqOm=u!>DC7~Va{$F^|3jRB_D>Req}SL}g`CUK{r~P%N;B{>=j4BXBJN6APo~Mc
7982 z*M_fG;y3BuykVWYkBl*O_oBI5w0_dB(0(R|dqZU^EqEzB<U{W;*~c3yQztPg7IDy~
7983 zyBMNH6$L<JnEbU5-NvNe39h)r3g-F#P^o58418eT6LPD^b-`XH#f&~?cp)$LhE9Qy
7984 z*LXwc5)7TEICj`)6!KdSn(dK1g!G)yjbj(_5p$7{)gCli$cw$ai&5^i9DB=SoT8h{
7985 z|4rp}#aaH6L&yg_=sY1GX|f8Dm{>@29ohHg$rthYo~!~Pt3BufA@A^@X+qxPK^I7I
7986 zfApXNA%F0o3&dRBulUs*`bo%J7}A@UCHB9XyVlq!swh0W)9BQwffS92Xj-2L-E3=7
7987 zWS7CJh?V*RZE1;s(w17(f-UPSY7`76*hH#{Q6nj0NKk{1m<Ulw>WhFe5g!qw{xPC4
7988 z8XrL=n)t)>&75!M_Uu-PfAA)|bIv#Co^$SF?%tU@XK(8LlEiH#=zU$Hem+UMobeWu
7989 zT$4z(lYCgAD)07DZ-gAnmhsw2ro~*$VxEx{VDSPapG+Z=EJggrG`ZhX!DFJEWtn>F
7990 zQ5?3#WP^7l1!yBl|1bq4o%-5FU#k;)ZLI$rQi$Ywg{r*)FP`g-(BWtG6zq`xqFnqZ
7991 zg;+j_lV(9>(oB+Nb`09GU#w+jBWAp7St$PTlt63%+7igx5XkDL0;eU%6RFUFX;V5d
7992 z&C;eo<0<-3%M*C_$PE3o(@z>9@>|ln3rMorQen1UYJ5St@v>huhK#d;r7qZrY_Y?u
7993 zv2sOA$`vhPHL!UrR0kEY>m4O?B&m)O@~Nk7G_Xhemh>Nz?19H79d@<oC^z3`TccJl
7994 zwrR;l*G95Y?x&HYLP$0#6yMvC<72@J9gFIF67|=Sd@h07NY*44+ex0Nknatw8X-f2
7995 z@$eXXnSMX6ink;N=98o$-@7d+n{6Ia`N@gNpyOYKa9yXSV~UDc1{pm`vIJv_LxYuz
7996 zgEzwBnTB2#YL1m)t?yB>4l@F=Ggx_czzr(DRgb(Ln2&wf=6_V2%X*sy{>MO-{GAt^
7997 zzx4d+Ie9&>bZ4%&zm#9rCtHW-OM?UXzW%OTO5Hs%Bkz9yYb*=iQt5&t@`7Pse{Yin
7998 zt;m!uiE0s#lBgD$epQZYDQ0R)rQTA>|H}I`sFhecKX@PC+4_n8aUIKo6@8oiyE=m2
7999 z;&4z?414mWT$sy$lMC}L`TfPPm=8LmZ#hSLb|J`v3yZxAJ726<CMV3MLQsS3`C{wk
8000 zoxvMXmPLg{!P;VH^a<sdmk*A_aI~157b7)tW<)-df>JR2Yf<zDt-)Sccp+?6Hq5nd
8001 z3_EjSF$}_BI8r<!$4Q0R^$p_w#s+a`Q~m7v&YgvZ0=@=1KP${Gi231-;b1=giVK*N
8002 z!UuH`Jran@Tqp{9^7|X6iRH$b4fPkU4a1LH!_eP%UvTjA@LIomRxl&qy!rYIuFw0`
8003 zYl7CBS~^>T^^5%F2dc9E(t}kQ|D5cGOh%Z69l}h_Hf6%FAZ+^qVH>k^aq8;TLci^0
8004 zr)B)(*7$?7=KT@;i3WLQ=7lq_d~DnBZ)mJ<qZXSoQRL@CRa5q?Om=dGC?$y?80h*x
8005 z1}W+0^$ZG%B7JVU@%A1kbmuyG%XV=2O4(R_nY@5|a~gFNZ@L}_`mF5l9UH+EhYO8~
8006 zJVJDl1RkZqLN==D)}C9jr+R-+Pj__HIGfNT45=&(BaKoTV`r)CAn*7eMNr9}>v)1c
8007 zPJojb?pk%1v#<TqXg_-=!l_%f*Bq39CX^Gtq#+_@kxkcJG-uA`S6$})w+JUEe$m7@
8008 zO^^YHF-}u4`bfG$J`EA&#Y->g{^N6#{l{gmaovA>&hZ;E{;NlizyJ6w(RIJ-i<U>y
8009 zy}xBY^Pwu)vz&W>50&lxE%~O%XH@e?s|)EK<yRix;Ab-N-s!SI`S|fyxcfa4u~)eF
8010 z%Q$Z@HfuR>IC3#r=FcS5C!a5bIzGmJMyogmh5v{;Do>U6`NoQ#8>_{>cB<lI`kP?q
8011 z$_IVZrb`5X9^M>sxebdlz&SbNDwJOGynM_Rma^%1R6Zcs5hcwPM{>c(jLuLntC5A3
8012 zB<5<ZgQK<>qs9N3g}jU3s1r6E^eKx_p2z?BhCCK1spmD7xA=6O@L7NKfk(86tFA$P
8013 z5@Zf_=pCF?v*n3np&03e_z>xVJYw#U4krc-?`Siz-KqZ<)jvZ8h+{bt>C*U+*yUrb
8014 zc?N%3`Gp4mQhDCOQGZtTM>8;yAwF60RYp&X;&&MQ7v=9W_!BDskimB-KV)#mPVwD%
8015 z`ombSO-BA1)xX8yyA^-M;1?^u%ivclzt`X`${(fr=+7GECmQ@E<?9Uooa%97z|emt
8016 zC_cl;k1FrRZb6=_-rYu?`d1qKUghsLIQ6eH_*cpg=@AE9OHA91{9AfrmyvH!{1YS3
8017 z`se?rqdu#tT#jEG`A_v6*8?a&Q*kch5NAKbe|I1ee^2>I24AiZYwHZo{dA@)4!1yZ
8018 z4U_vmLO<H&O!d3Z$aB12Z}juY&m#^FJ>Sa*iOWy)|05l=wmR~tH{R)Ob8zTk|K9H4
8019 zkiP>8CGB)@$cO6xZU=|_ppK^>D9(D|o#}o@UPYna<NlQN{{ubwvm+1v2NnOr;6)uQ
8020 zv-)E|yS&3aMsete3ida5e>Ujfp?Xep<bh{UXi3uyK2PyRWA`Dgf36D9A3jR#cJ!!<
8021 zNdF3>r&jC#0VDsR*8jr}4nOy*vZo9_MPq>Yzlu-`QI2EV9C_fws(-tKL;usNhyQcU
8022 za`Cyx0VDs3%KvEaKNUY@@Kd5!n&fv|aq53w>w*7Q4qQcq@;vVAM)}uOeonH^5?_ye
8023 za>7+S*27=OC~37L@9Mu-amq9H^?`A4cm9C6EfdFY`bqpHB`jX6IJ&!b`3RYAaQ5d1
8024 z4bJi89fPx99pTu~IJESC6iHeu^@KKH`)Rd#%}TKU5NCUmKUoNLiDm+NoH8{gwknT#
8025 zA?)Zd5&hQ}PMxK=+xLLquj5`b7$?;_G{}1SK&Q<=s`(+~Civi{Mqw(I|8VnT-f4A0
8026 zKl88C>jfB+m2DQRQvL1I`fJt-L;azRZ2ip_%<2@#o2w1A#hf&36dP|b<o`h@_&4kL
8027 z1PsZ_uB?DTuDuT5>F-X=mFHg}Cn}YHLQ|ZB*E!0MvB;Jm^J(i7a;{VRtH3zP$_~pp
8028 zi$VO5=6~EBgeu5leqPD{X7yj*HH#Ab$M1~wf1_Zq&vFVGrJ*z8W7RnJ>GM_*tCW8O
8029 zE-Xps#fRjZ`FMOq&X7)ogm_o;yBKIIyIV2irng7)e`gf1{Dj{WqEh{JX#L%wf~Y^-
8030 z4>LdO72VWc`^d6G^X~)WB<nwT>pR3>K0D4dK~Lg77PhQ?%n>TtA3Z0|-yI*4Z)^W=
8031 D0lJ|_
8032
8033 literal 0
8034 HcmV?d00001
8035
8036 diff --git a/src/plugins/vbng/lib/libfreeradiusclient.so b/src/plugins/vbng/lib/libfreeradiusclient.so
8037 new file mode 100644
8038 index 0000000000000000000000000000000000000000..2603f0181c7c43542e59d2907d5bf6c4b0730916
8039 GIT binary patch
8040 literal 216320
8041 zcmd4)dw3K@_6Lmjga89XI$YGKr~{4~5H*8DgMwzr1bTF$Q9w{&LkNjP0*T24K|zBv
8042 zqqO6&S;f_Lbr;>$MOSxO7ZFe)7f3)?3@C`O%4JvSAtD#$vLNLBe5$&W4w&cn{XNh7
8043 z$2&ZksdK98oKvSxojP^t=JD*ns04>Yu|A!YTNOgfhDc1NnUR^*$xJCqrjnsJ@qM-8
8044 z7G*oP=A4@de=2d-ucEjFf;_t5FY{{w;@2e-*01Y4iO(>9t$GPSvtEr^ug0ur{q8oK
8045 zV*NTL86^?F{8LDPpR<155{nkek0^^|SNt*Ek(?I&WLXV*k)PaegVR`V=}HNo{ril`
8046 z-}<%q-Hm!|-~aVv@x907*O8nxCO_-fRFi01Uod0uj=po8;#{5c(9yqt8!I)2x$ce4
8047 zYr1I3{xD_9!r#64WBa<{Pig9%sPxO!?(0(RgzN#O=LLP2O#gGWlKNWri|+ib(kc11
8048 z0o6*#;Y{6q_29mG=K7br4NzPc`rlN-eUzR_UXtL4G{@ubKK$K}zlr#>K9i7`jK5#u
8049 zZwmgbPXQ9s@K=Pt2k<u?e-GlX1b;K}SBk$f{P9zcze<r(l-cI*9Q;0lzxnuk41bT~
8050 zuL^(mPY3`T{-h1L&`j&*?=$%QHU6H(-*fm|j6du1JQ6Qh0DfOI)4#*-OZa;ke}6D>
8051 zul(`Irl*HKTzAJ`dkh<Yt+P|}1^3=@VQA#v-v93__y4B2Ywv9f4t{gXW#7KO{Yve<
8052 zBf~cK9(H&}-IWVkemF8_!TY~MUcq%eCj7X?F@N!-9>ctS_1pJ<ez523D_efJW@+YA
8053 zPsjdNxAwL3|90&cbr~P_ZSaoUTDbnfORnnk#Y-(etco4(dEUXFuIu~H>iA867`nbB
8054 zy*Yo}yrDNt`bWzT7f%@a`A(GaCw*M@(7rE9>VK_VH0^ZN``e7a4a@rJ*~(Die{++6
8055 zm;2srul-~0u?=g=Hc!1Xdwl7UcOF@&T(t1sgWts8ePLkFc>^DM^4lBcN9PB&?f-Yy
8056 z4I{I+e!qVHGhf_y-?NR;If*ZOJ{UXk{-yh>KlsnH^WJgS^}a3Tt-pLdUb$%MQ-7^_
8057 z=jy(x%YN5wg6Fd@CoSKkpSOF|-v)p6(1d=b%6{>u6D+f4(79QilwPg=#mc2S>umwH
8058 z-%mTh55u7RrSd5lSHFbcfdTeQ_(K>hzl49b1HSnk;9ux~{<;q6PwhZXX9xHTpc9u(
8059 zFIKW2^w7%!Y`@tZ=tu3K{FDyL7j=ODsDpOB-GTho9q4BaCaYi4zoP>>r_jb<DnFwG
8060 z`qy_r|BoHut2=1#jUBZ2nhx+S9nfFWLA$=}z^;DNLA&O5fd735^qV`tkMDqvuLJpq
8061 zcOd7O4)n0G1NxVBKqtKeIj`uTUqD`Q+3em*KG6Z+i5<{i*nvEM1;JmkxAQxYXLbkp
8062 z^&RM^yaPEe??C_SJCOg44&>k30iDk~kSDnV`Xf8Q|D^-`Z#%$$*MXehb|7b<1AX4x
8063 z0sfv2^m%s&_+STo8TYs>W3v73>OlTA9nkr-1N@2(@E>#_=a3HMS=vGQ0Ll-r$!#UC
8064 z??7*pJD`))ft}3lpnsQvQEw$lSvEm(yxL@ZO3(rRQHk)I_$0wMNy!~15uE4vnPrx*
8065 zW*~{rbd=-g*FtYe%95ug%vh11k3_#DDai~@@wpc;KN%+dCX@bQiB=vI@+T>oW-xjb
8066 z{P_8;$+wJwD?ZdaKby?*xiJY}Wy<rU&}WiT#sCu^uZf>*(pmDP#B<)_=V43Ev-GeF
8067 zdDL5(skaPKT2VTi^qZ<BqRea;<5!kXo+a^?obyb+BKSsDfhiB=V)>?<W%(quho1o^
8068 zzS`8!B@(S{!mp6$E{T|FmgoAWw{o8H@7K(N){oh)-FHjG?@hk1oBidAO1!22T_#`G
8069 ztr8zJ=^Qla)I=mgGx4vOdRSrx@m5%Qwb?H<nX(|)Ec}$1<ulDifT<=W$&^Q#C(Fge
8070 z;z?1Cm~^VfNPG{|9wI`Y=f<&pP5H}Ay<H}&DT7S>G82EPiT{U*-#uI+PMY|yO}<mi
8071 zMU2_~%BNPpo9*4og)cs5O#PJQOZZyQ<>xiC-*e4|z5%-Y9Kav@v6_oId~T3G%3zaD
8072 zwW;T;O#BK{o*Gl0xhDQ!mR*^4o^Il~wj=#zCgGkYzR7Cu2#GMwPT6nbmze!-jrWht
8073 z_SU>A%U^7^i~LEy#-wkOQ*JW*G5JYZ-dYRxwCwN^iMQHym)Wi~Q=ijhw(@{g-c<ZG
8074 zpv#YL%2~Zg!re`IxW*LiHT}alnXMc#<#Czglzxz(i%q>PnJVE!@<*vM<#CZ9KC~Nt
8075 zj+uOGO#K`;@qe@Q|Bx(q6JYUyT_h_PD^vEnOoaS-*=*MmE{O55{N!4sh5SB&Rt(er
8076 z|7_xGek<|pSAOQ3{j$s)N4XNMylvtCC=n{!!%rU}&n3#7v*al-^|RzDS?&U}U11ZS
8077 zY5H^1OqB?VQBGy3Ebm1*exjxxGEF;7lW65*lTMY{U#f}UW0g1Uf$MyJa!vg-nG9c%
8078 zXvJriuQ3hEY@YItS$@h{e!HvL-m~?u<mEjuvvgKoMKHfSn3t#I6&24aR`UE~bMmGY
8079 zmKQ!yToEiRADfd^QaY<}Z2r`eLYeo=Ie7(h@<|}Sr1%jOynS}wJtl>$lKhH_!V0Cl
8080 zAn$>~U|#VwrlwXFmrN@!e2D4%{Cxftl+G&3E1nf>O;?o9W*U_Wg2ginMbX)1`NidV
8081 zMdgJ8tSFo{Ew7@me0E{EEf?&HADCrFOcOlwWo6Jq%hBk98F>ZMXXF*-7ng{_mBH!O
8082 zZ(dn>>72O&Dku;V<>R*vTQI$_U<R|x3-hPt&CD+=Du#NBO3MmoDMesV0S*Phxn+fU
8083 zQ}aqn3zUjrdBOB@WoCW}A#yLDR#`@Luv9QFDSbdGDkv$ffbQ}N%gbk#vR;0$xO5gv
8084 z0aGfP2v$R&K|x^_^4S7GeP$WOk=d>KnN|33Ug0dEMXJn7=TDm^k|10Hf$=k|fb|Po
8085 z#hX=Dj-DtI)Iqj*W?3mrgrxHFW){vYD4Q#?gcue;_S4ey3i3+|6j?@6E)#l$X|#4#
8086 zMQOndbOI`rK0GULDszg<AXIr_MTJ6;qD)iRyTMYWthA&=DV_z>nH4M*mQq}nH@&nX
8087 zI4hq<QCKj$sJwJ0snNVD$_q%z0wrA`kJM1B5!ej`dSZoX#pq)Y$qxq0WkY9{&Mvf+
8088 zVCBw+SPEL%+LKl{fPzWAcovK@sN_$D)=1bym*tnEe=SDTh~OmJRu)80v&%~?TSvDH
8089 z3C>hz&ae<d0M?qFFAY}Oa}cU1Z&i>mDq4o}z)VpQnMLg=pn>fP(Du-i?YrC*nH^C)
8090 zOWIqobVgpeLhHten>tsjA6hRhwfav=VbedmsjVdKj-$Nz0V+YJFyf1aj;0kt(o$h7
8091 z!V|DjLEvmP#9%WCK#VdBgo^U~S<__ivlGp6VVY+f6X7sGu^_*qP?);e*+QG_PZSl@
8092 zsbh?}{PMY=RSZKNHY~5Aq9A`(5sg_4;@1A76UxgAmQ)DC6Rn0+ZB2%<P_`A-z5t=t
8093 z0vuf|%i+*!*_D=piESGnX#cE2_$2lN#!+h_xE|S&vn%YQ7aEycfeg!vQLVU0R4Ohl
8094 z2nstQB`CWh$eyMnn^j7nv@)o`krvJ@3(l>;a77wIn<@Cmf|>ahGnC>A*zjB>SO6-*
8095 znu7%>B2q;Kv%uit^5UQ{`kB)TOY-MpRF_bEw07o<3OO0jW0uTfi)g5&Mbl8Mq<CsM
8096 zTx*Um-A@B)1ILwN)D+qfqd4i<;IS}?ilWl;nZy-bS5bQ1jY`S1YfFk}RnEC~PR5Pb
8097 z-Z+%VAxd5$DCMIIr&d(RNf0R50;<toz`nS$;@X0e;=)-$Sz~m-KQb$C$aOa;R_dnK
8098 zlxJvbvMn{_y7X4;4cD1*0uPcp;h+3w%KFDMm2>|k{sOM8RA)0cLC_<GF73*96_Cue
8099 zINB+;@nm=;={f~1hw}f$e~OT*8L?e5<aOb%PjT^iScNJ>5a;mYfCl!M`GjS@Q{=PG
8100 zg`#{{Ww?loa0c_6-=cIEWt0i`75RzE-6mXlaWNv$PRc|R4qik!L3sc$KibzW@#_@d
8101 zI2SV40l8=4Gfn)Iv+&AFS#kPV_^VBP*;)8&O#Ga)@YkF8s<ZGnnD~Wf;cqhW)o0;v
8102 zG4U^+g}=?jFF6aJW#X5fg&%F=mz{;b!^E#V3xAi1SN_{xpBB7im&CIV?Vn{P9-XLI
8103 zF*Wm7+VJ)|H8#9`-*kfwpJrpwWW)Py`0Y0QT{iq~8{XV%5V<M4UE-H!gHXNo<Ferq
8104 z+P8jEZFp;K#LP4s-du8sIvF-RbzyxnZFtjUMV4m6TWcC-<l69-O%p%ChBudFL@QHl
8105 z`0fHDzoy&pJ#6?g8y>5t*3TRp9s|1dQ)R<jYj<WYwBhyE(uz`T!#`%jzi7i(+3-tj
8106 z_+B>rQX9UH4ZqBW?`y-awBgUU;cIO8unoV#hPU<@nB8Q<zho=F-G;x=hTm<&n@diS
8107 zYuNB9w(^H;_{lc>2^;<*8(!Jt5)f_YVv&+x&OI)XAih+j<X7?@mq-x*f=J1)lszty
8108 zAii9r<d<uYOC*S&B~tP$b&pFVh`09qh)CPx;*Ypz(NCo0SH>QfNU;2+A|<~v_qarY
8109 z_+N>X{L=QgM1pv8X)oa1JudM}{AD5~zb5Q)i3IVNi<JDDvd1M7#LJWbmFasVMEoBl
8110 zN_>~?afx5ze<M=zYt9~*ND$v&q~urC9+yZEKR~49*TOw6ks$tAk&<84dt4$x{1qZ4
8111 zzh2zq5((nnA|=0;>~V<%@h^*%{93xlB@)E{QKaP8vOO-5ApS~`l3y$LxI}{Zm`KU5
8112 znmsO&ApR<ml3yG4xI}{Zt3^tFHSKYU1o5dNCBL@saft-+b3{sh?cU=O3E~Hel>9RG
8113 zxI}_@YcH0FLwj8O5%yCcQu6D>9+yb4{52wFe(iOM1o4AS6n~sHe6bCmY{Q#dG$J>}
8114 zhQHQU-etpIXTzu3@Ymb$X*RsM)gy8<Y<Q2Ye5MWmoDHwp@YdcuvvX~DGh`99CfM-5
8115 zv(cGi!?%XG$e(V*r`yVx+3<xn{2UuT--fTU;cv9z7uxW7Hhi@WKi`Ib(T2athF@aC
8116 zFR<a4+VB}R{4yJUm<_+uhBvqPL~e}@f3vOp1{?ks8@|bgf6|8EZo?0^;dk5cBW!rX
8117 zhQHN@KV-w-X2YMb;WKS`<v%U~(f++QywipsX~QSm@L4u|iVZ)*hIiTUQ*HQE8-Ah<
8118 zpJv1RZ1@Ztex41VX~SpR@R|)j%7)Li;a{=gC)n_#ZTKlRyk^5sx8ZNM;md6J3LAco
8119 z4Ii=Lt8Dl?Z1{yXe87gUw&Cx$;a{}jpR(bX*zh?v{8AhKP8)ui4bQU=>$B2^&$W>F
8120 zt+C-lHv9$~{vI2?$%Y?e!*93Y@3rA~+wfy;c*BMtXTxiu@10t-^XcU-MT^t~I~$+C
8121 zvbE4UXT2=cl0M))m(p^j8{g{XnMe_y&dm7k7JRO}n6QIzlYn~@P9R((;O>Mw5nd+X
8122 z1i}pM<4Xj560E0pCR{DxBZL{U$EyUqpD>48yiCA*2|Ec-5%3Pe48h~M0^UNHp?5q}
8123 zz#kK4$Q@4;a2;WW+HseFR}*H49ZweUyM%iZRs{SOVU_TqGeBJV8euM>;=2X>5@CkQ
8124 z@g@O3OSm`T8Ua5|xDVlF0)B#UU&2cS{0QOm30DiaoG?S+c$I)3Bzz&^G67E|%n&v{
8125 zMZotHW{4Wk74SWT8Jfm31$;YUhK%tv0goiiP%-Wj@XdrTC7dkaA%q#~#T5Y$B78aF
8126 zL#NsP0fb$IcMJGp!u<(13Ai`m0fcJ=+@0_hgqI08fiOd^_!0r1{3qZm30DjF2w{ds
8127 z@hSoDCww*GG6C-;oJx3#fOimPs1wf>@D{=hapIW*{+KXBn0T6i>j*P+iMs^6nlM9<
8128 zc(Q=sCCtzxt_b)o!VEd$hkh3QPnb*M_-+BeM3^B)yh*^%5*|XhM!-)KX6O)KCg3Ls
8129 z4<)=rz>g44CtNMya>AV2<5dEFkT9p{c$t8w66O>fpCaJ<33KX==L+~9!kk*;nF79@
8130 zFsIabnt(?V=9C$C3HWBhoGRnV0v<w`Q)FBb@F2pR8smpfiT)>?NqDz_FDA^XFy18K
8131 z-h@XIt`Tr|!dZlu2{?f;r>gi80iS#qFsGt;wSbQh<`fjK67YV)qY0M@crRg2E%7M=
8132 z-a*(;I9I@12y=>wXA1aZ!kjANX#%bz%qb%767XumboKFM0l!O_E<UaZ_$|VB5k7QM
8133 z^gm&`^!RQ8zeM<M!c78xmhe4<YXtl>;W31l3HS-ZV+k)2@FRrB5v~?+Ibpi=c$I)3
8134 zBs`vQnSiGfo<MktfbS=KAK_d9-$R&FT|863w-aW_5Kj~ENWzl{y99hQ;mL%P1w4fC
8135 zuLvsw9z>WSW&F_pME?_>LU^};FD9H%xJkgh2~Q<lBjE0Y3kWY0a020JgqH~T<Uarx
8136 z60R2T5yC};s|38C@B@U)1iY6pC!qKg0q-DOOgLA-TL?c$I8(qM6P`ghO~7@8O9;CJ
8137 zyqfS#!pQ=Dm+&mYih$oDTuS)R3DN(A%Lwll@JoarBHSe4X9<@Rt`YFlgewRy6Yvv+
8138 zgM^m|_z}XDgsTNyPIxxqDgi%8_+i3j0-j2E4&f;RzMn8dk9e+t?;-pM;Y<M!c*ms_
8139 zRkvI@MEq*85pTYaxjxpJKjXB4Cp7(AEp(#i?DG)@eDk&p1G-Ia*<GYwj!`<fp0j?@
8140 zb?W6|kVI$@8&NFkr%#pj&#->&nNFI1NUJq&(;N-j<}<+*5L;yuOOnK7{j=#+jkpMO
8141 zl*+5M(1>570z}fk4JK*P5w9(CDMmIlZfN+L+|c>Z3YX&e@mzT}zX_p3w<(o9;=e*k
8142 zDL43gO#X3_Y-yS-;sM4x#!YZ+BE~7I9ycaieZNN2fArMoTSYLW-{}nKcc%FCQOQP6
8143 zXmDYcBkFUzG8bN>XSt9{)wA5JJdsUNyyLz1`t>v3ao(}x#%TIhpZ<xq;QI~Glpb`K
8144 zXtDHqn3ARk+_?eW=g#m&KNQdWOw*!?SEf>*df2@Zzn&Vy0dqrzS5YCLA4lml;|K5u
8145 z>Xla1P-7=h-cU;-@&~Ko_Yhd2z%#Od(GwoaudmCA{8tS}krmmg>2JH2l22pUy$rwn
8146 zsF6{~BM~+HHd00E!T)NFK6fTFkEp$-xl_cq%NtE}M{3kX-4hkX9}Bx*M7|b##$6?T
8147 zgYG$~G#zQh13o_Y1WjM>kNMmh+w0Vz0Hl2GDSmzZN_0#MElDf*{D@ag4u3&fMe22(
8148 zn`h!-k}hgEBw=WJ_M;(?b)aT)sNP}hfLgr6`ne&J&z*t}NLCl!fp{~Po1lf(JN=>c
8149 z38B5GE8mdq`4Ew(7F{gbszsr8P4A^emkS+F({30ll&(e=pxN4jb?m2!lf9F?lfA$4
8150 z=CMCDbP)BVMOuQrj72mQo94iMs1}Ve5cTONVL91KAevKy?#e}0My?hOx>JnQW3r39
8151 z_j&IR&eEb|-5Jb)SsgcCKHkz2I^j?wmy!l54bG;9RY2&58Z`KbItbV!>IA3)ZO&GV
8152 z?d<Ya4LlaGn!OTQP~vYPN^2XRN7Q6!iR?5jI?tWy*>XgkL`s@E7-sHs&oM3nxp<M;
8153 zAA$x{2^Fg0RUm~*(<3cv_#LFZ(V=e9bCF}}qL+ctV$0oCU>b;)pttcgh4)`!#Auxs
8154 zgF!Hr+<Z$rdD5Nmw&?U;mGDDshq{Q7s>RfYG@6ZmbfRGiu`w-L!It(m(g^qcNJ6k4
8155 zjhp0l!D_Zwyx+c~zQt5^c1QVJJIcq7$~m{A9{)*p)cyCV;Ztl!yRJHX)a<GZ=*oKw
8156 z<bGx>Qt{^y7Q)F`{xHB{zFZ8lY|qAQPt9sBX4uzNumdcr)W~mOMnaGAhfr7eRSep_
8157 zn50<jK9~dsZG03;Ra?zMPdN=0t%8X-<2Or|K8T1RN9V5?b)*h!<>>ZoS;Gie4iV!;
8158 zbTIg`w=;tiHBiW;Z9#kUFn}@#!xjbsnsfr?=eb?+^TF7t06A$YG@fM77GXX%v)K!E
8159 z#CM>xWJ_Wk8nFPnynW*-2U`_FaZ3m_d<OL-f0O5{@Kna*KbqQTvlqDFWbY~()q@U0
8160 zWfMc|QtI31`}Gab^n(sf->m6JJjaZE<R!{gx79~aJecU&XnbsCO1*<VDzSbdN_aM+
8161 z`qH)%ra%9Z{@kl?qDwyolG8PPs2g2&4Bn1@+-dXQ@OyCHJ~Rad{)+;dzRRnx(_$rV
8162 zmvOB?2i*NQIy7k?B7gnrE@&frGZ()ip)mmj9}!ZFEZQcd$kG2tKb8z<(}0?*lUQ2+
8163 z!KgnBhOpNZAPHxY69(@Tz25i|7B%61=1zdm>nnU-WiM!Gy1w1!?u-`DXj84w59c#;
8164 zGF$L{2K>IJ&vQd#@N1fW94*Y4kB0{}+w7H!LQp_~Y3$(_(RqQ`G`9<G-*X_K?_a}*
8165 zBm??BBaI?rJcKVt5p@NIa%jCHyfe7dxBvp@==-#&v$?mNzx|;`hgV&3IkG?0)HU_T
8166 zd|rpE5=(;a!MCeUT@n1t8W$81&|Ab@V??M8m^?J)49;nQ*s%!?)XQ{)Ybq~n?$<V6
8167 z;c9^I6s`$&l{62mO|kS13Vyvo4gXD&Hf}r8(z3cc0M9XK*{^poMhGpBbtilEQP?*b
8168 znG(>;Q~U@O;(g#6)^sx~9y`<~jvASXEZJ4D^Z+7RJ-!yx50$p)U`tCtKWJQq@?uyu
8169 z_fjvfLLORn&`1W>gElR9Q^&2dSLIO5T<jWKSE6IK6e-GD%zmVMqe*uYekI*iMsH9v
8170 zzWxCoCBv9aix<WdOD{(~O|P{?I)xIl%9EV0<p@~teTtC4*6n<1)l*Y->-7zZZY9`j
8171 zC0EFeiSFyC70xcg2uWmEsPBz-*FtrPu>~z>&YU^Ex&MYMtMCcN^;%6oSQ}4%v#JV~
8172 z;H%YQw<l<-Z?j&jAjeomi_t<mI%xx&v{-cuv}ODW<3Wo~Owl4cEAMDCS~Pqh8UQuv
8173 z``4nDV%&@dP-~0b6tT_z2SICWg^b%kDjB4LYqjVNkj3~3+KJRu8qq9gbG`8$Xh=I0
8174 zVO=zjY=fzO{bwzDix!=cZ1@g99FDwZV;GZ>1C{^vWAM_JM90+2`jM8$0^`Q$r`IL}
8175 z&-l{VVVbI5AG}8^IIY$0>tr-oxGZPTr8Sa<(wN2Opli14*R;i(o|<|zxd7`W(bq;m
8176 z%3&=3UdC6Rn&vG<)ouC_4lMe((|8UAAn?Ta(@3=C+s3>8BjiifqNNDk<}rTj>kdTc
8177 zD>;k?z7>)j&xW^L4UT~VgR@I=j{be~g~D(6Lk-S5qw~^b@f9e(W(2-4K#e#naGmiD
8178 zpujN0uim*%)9Z`{5Cke;uSJKuL9CxKg>9j)<FJmEI1=dBu92$o!CL#N;Y;8-#31+S
8179 z7=+YkAlA8b8rAfJU;j#r-tD|yPaL8}z0TDr3cp&5!Pjzoba+||ViXLGN1Iz(?)w$V
8180 zq58U1pWb8}Mn#x^;oSoTQxc;J8yGSi-eK#cM}YQ>kElh+3*Tn^1L>StN#_KP)kN42
8181 z+{f*@?^`7}DS#;y(TtF8bAh4=Sty?rCjeoiqnwaxw<*=P`x$MGO7utXb!L0E2-Y<Y
8182 zIGIH4MXfQh4oy)e+#kQ4o+OqY21(idIcSY{HJcc}4qs;S3R!H9RSeB`w-xM++*W_+
8183 z9Sfr#r^RMD$28x7_*e9raU+|_2%<iCF`a3&@`M)4b<m050+$l0Y3MX!PG82MT6F#i
8184 z#LAV86FoHur0XXN-@%kQe(dwfLUak{jwEyC^Nf2A5T1>wFXBcGeVU<$8yLc48Ih^Q
8185 z?(Z9j&2yJQL<}t#l|Zvg<+=;~<o0aT>uUEWN4BVud{kQ4$s3yIb|<Kj+d$V}FxEYI
8186 zWg6?m9)&5vq(djuH1)2g*hn?B`w$4ZLp2FnWFuC1!34#@*)!Esv#JZK_%U6l{iyv_
8187 z;8u}{(OXz&i90zu4g-08V(baw)VB0*l1|MKvX~yNPK%98fR|H!`;}Ulw3~L7p@qKg
8188 zq+J6Nk&S`a^h9;h7nC!Wczx_XOas&0X_$Rt*~zudi5jLU2-r`UqgMN$M9oo;)fMd%
8189 z!P#nD>*CPz>figWnT9~|0{AO`bez*4#ezh~lKh}wzt_nj!%0g+muay|%;HA1zu*fk
8190 z1j`DobEqrE_RUPoZPA7`R2tf_Z~XcJHQXX}e6;xmsxq~6AeQA&pW?$vRCp>@{}1Ft
8191 zp#_OgX^s;uyP>>brz%HpKQhz&;D;vG_rmhc)mziE4r%(B6XtxD6aBM04P>}9jogN4
8192 zP>ag$hl7^(01_@W@(uYfSVv2-jZ5%p$Z~WcuPzj1FxYe<n=a}GJ?rP@SG`z^3`Qx)
8193 zn-I%RuzIxMYtfMby;0M57)vk)phq%_`BD?0Usrq@he~9ls2}_cRhu^iqUZ@0V!y?F
8194 zPFe646l~~pF~!hgcOW)--{-!ny%@qK<FgT~Ytcz=XY&V*AcFQNaTS#VdVTyD8gA%@
8195 zef%NB^Xo^)jp5v)e~BFgF-eR=8ALE%^k?WqOR!I@Z_0v`yyQ3g0&iosIGB)g0@to$
8196 z-CA%$-vK8WaO^Wy3TKk7#C)A#BH6H3?pBDB)i!^RN!@!^EawD*b0=aOjF(IfNKN<w
8197 z7_S;Wj(J$vaaD$*hT{TyEEOvS{pcDF8sl>5HiF$la|U-&!*6zG`N|Y67IxPlpJO*o
8198 ziyRA{w^|HKz0sKY9hDUT8g`wb#l~X6&Sk6N+ebH}My_!}qAhDMx=oLF35H>$Mz2>F
8199 zzSEWDQCQ?M<Sb)6U526}o)*ibB1Eob#*<K|r$ybc8X8oJ(6sV^{++%H@&t{O&=xo?
8200 z{08Kr*%+wvQ&*84xN-vKs&XNI`6<%n-UsRpW}~WrW23k$kqb)<yTia>v6);{yTMrm
8201 z_zA#<lXl0rcM?>luE@sUILGkBg<&_Zwk%xicHl=1ze<J1Mr2I^?_+S;hlOBXy>ZUO
8202 zK<sUIHAs0sWCOfwL^H&^8_<tnHt}JaeOG8~&ShFblXu`czhi4QhT5WkqbWHBKQ(`8
8203 zjzeSTe-Qz~s1k$gLMM6z*BXQ3EiI6g<c-T@dNI?zW%@;?yU6s*NNZ79mH`&?0<q<y
8204 z8Ppp$vl7vkwhmwHP67-eH65!LbidJz?HpfhPG6sXqR3QI0*U}+4^GMU9AG(DHoA-Z
8205 zj{&F_+ZkisF3(2qDz-bIAHziKgW-6#h}{c)l6wk6&S^z3*COLB=z%+0VlkYI)B)_M
8206 z6mlyCo)UWp-#$FLxukXeGd}qbBVxba$nCJmZZI&WgMwHJCu7Nq1qEpA1iS&2KLHtF
8207 z)F+ptAaXl@h@J8^4k6aQBkFxVxATZPxXE}P2FHQB1l@;?DTf-aM;R~HJKk7!%P`oF
8208 z`s@C13Ru6>WV|1dgwaA-=DBmDGn26)U{nFbZ12TpJ>sPteRtc!VH~ocg<0Qn_&nq0
8209 zxNUW$KHX3w$2s;8@FK(JN3s7Bz0H_|-UQu!lLcKX@J}E&a8DBxpr;12Uqe>~OuB)I
8210 z_ag|~()?WYF`v5#tr<dx7W=c<%M@J{z*fKn&&Jh?3+tO*7+n~N6WCqG#d0Js8VHF(
8211 zC;B{gk^25K?gX^AsCJ_hJ2P?LFhh;410tG}%$|lDNPh<h7N%g5wNbEFw0IuOH{K20
8212 zO?#&0PbY2~+%9Y-h=}qcIuoqS_8Hf~O6WyyL<MFFcfnnYv6v52Rc<42!-nG=1~k^#
8213 z1WFwa&`6%x@{qpFZuWNbPQpr7Odzyz`VNi<e*BH2xOAtX+wI;P?d$f3)}0eg?9=P~
8214 z1uY0}tboD~--w7Jp!)V=jfBRe`9uHi6mT5(4@5NG5YYD;HIP0l*7s^H_MsTg7%4^o
8215 z+CO{9whmKW4$t`GY#6#eLtClkmrpC1n_uBw$s-DutidnZu>n7Y1?7cBKH&ZZz<3A-
8216 z15ZrX7r75RRq-#;1?r0V2&5ogG!1b^V(hmfNZQu_$b!9M>1XKMYJW&RURPDch2J(U
8217 zR>p;2gT5_O+2)N^ey@eLBSb>|1!uljAwWTs`qXClFt201cfn~|m-_2J0nWVnL$?Dq
8218 zqehzX%{6kO`2En$C)CyV5eY1JFM*hvzTDglUM`fP=^u*CU~Zk!e=%QHMa0KU*7wJT
8219 zCyDm?^!>19?q_x4Oa;X*Lme@VP`h`+C?hpqeZ3kvB-n;c%iiF`sX|QqKC)3=^bc}@
8220 zb~D+9eYxp$%qZl*)w9zuyx!U)m7ivYp4pKDa_Fg%{_GdTVVV-Wo=VlU*d+HPj4U4C
8221 zDIzeRj|mk!)tIb$17*Ad6TnncnWL`2>;jR7J7@PB-YGbDc(-7s_alTKE%8sV_15bD
8222 zR=ZJ1Q~y+_KJicBn?E<lmDZS@Mkew5Inptnz&jWE`G($E>|~FGrE9VCR~OPHA4iUn
8223 zMhwKnqF^Osy?8$AdOt#MDe-$jT#GFh)?_wR4r~NHvbl!$8w}D6V+WfMOHag+CcK{I
8224 zou(l(-b)ZkpEAMb9M~jd6muU#(()f)-`iTm7|6_9P!;=f!i^a>?LJ4CHZfLzEyNf@
8225 zF-&jt92nZRNVcOyJOYb{nElR?h4te{PK(?koZGg#F(K*8%>6><^2J^4b01^w3gj9?
8226 zk&0%R@-||m*_<O!hy8kur5Znq!j7iyLfwOyU5!*U*xH}wZXV)GY-8Y*YK#`W3=3<u
8227 zMO|}4X4RPi!MiiV$Nc&il~*>Wnf)FZc64?Rbwwwv=N;aKqhNmZ4weohYNJQ(2ih>O
8228 z;FsQpE)ZgJ>+E8#_tX_x4lOpuF?>MfCCx*Ms!6Y_cVQRO!&VR$9SOq+1TVt&+xf%0
8229 zSMHHi#<fuyK7c57agDm7Msw8p^>Iq`UfX^K_M<}Ir$qBoL#H~cPxYkn#?EUNGvsM(
8230 z#}p*4(j2udds^)~bTV0uyw76ME*ciso}G=^gE=p8^lADyELhg1a97lnKib8!Q_sfw
8231 z!o-G7V)x@SlwWZ2G``heb7i6xV11VZ2Y14$hWJK?r3f83g;O)<t1E6@nvl70ep;}*
8232 z`hKv>8HAvYGY!7ZX^K9sjj*Zj*vK=X6UpjRccOOaBo0xs)6~%8;B>4GG{*rO*%G`^
8233 zUD5McUBbegv|y6H8AN-MsPhcy;pEK{Rm4j$$$!8+^c@~)A0J?Nv=~?IM6b0k$03VN
8234 z3Zt1>7~f94E}nw2*7%S1)byM*?661Y^~B!IJSTPla-gj}C$xbZw1EwdrqJ#aRKOFn
8235 zQ447g)*2^5jo1ZB>N2eHPCdy{{)6xyQm*K&nhs|bo!5ob9H2HI)b@ee|FnUd&}mw2
8236 zywi``>+vlZCvE#vXb()l8YZ$e6L!GT??*9Y`p(Y0g_$E{=EG-aUdBvbdy4iHjf)0*
8237 z{tQL_9DkR%TOnXH*aaBJ&+$8eX+7T+JMn&f>o}jjeoXDR*!|t))9bq(<ysAURO7!9
8238 zgF+4Gu)lU9c2gstpbyt(05;+npD+w;rl{egz^?9(FU%?$*FRsuL&9aI>NDIvM9GaI
8239 zI!=BN)nmg+&q_6l|1E=<J;3^+1#avJdf`dGIt8_#?Dp_o(HVmmoaXVB`s9=N_I?Ea
8240 z(ee?kb+tIuidCdx2V}^qE}-lUeSeja0fN4T1!?+>!Jy?^IK$K6yCw}Aj&2${?8ICx
8241 znrEU_Kq_MM&iDZ}(G)c@04$*W-;SlJ2}fkqZRfsgbB)~h(f8vl&#ND3u97eczYdQM
8242 ztK@WGJdeU;<f*Ymr{a7Vp3L}?l;RbVM|beR;rxEdWs=|$ACEj?SGM&m_AhZ{0rKsS
8243 zCxGzOg#PF7VdBD;OCM;#r>=O=;n%nMhQ-xq7>asBryc5|6OarjzupqOlt;6Px5xSp
8244 z@(qj|@7sD%6jxVV$Nbve$=%i?pg$8jeKDuS;9P9V=s)DdiV}=0sVXci)bNF1Ar=YJ
8245 zAZWkBAl9p4?hI=Bi|lpNF0gykXk??dH#*v_XS?x}8amNg&rVgJT7br2&h5kbs37qP
8246 zILMa0Qoo@Sozz7ypaI_KENn=&sGq_vZ{yhJ!gCtxd1E;z{jqzycy;XEax2!@4JOSu
8247 zwf4_pTw1c`l%v~_b-p+c|0`wV-sj!GVZWOj@Nx54LMXfSP<=L~!_fqOY`xk_f1{25
8248 z^Q8YC=wpU;HgKB+n|NWq<Ob?I%}u{#+$8AIDS&-Amk2pbzm%=6NOEJ(w-R&bDlC}g
8249 z*6JFj&?HX{Vrhr*!d9HyoPyZc3uEjy8gSs2X>Mm_4Z98Tkqh>?3i9OWhkSb6JUYOd
8250 z`!q_%FNSgHag_KHCDiw~;-Df&Kb)-_;(!6AzGSJN;2==u2qO*14I?ww68~@D5wkgy
8251 z)$k~4E|xxJOq*g~MiFV}&EoziOD3w}r67QkYiuRUQL=fvnZHKnZ?mcJ9_Ft!^Zy|8
8252 zXWR0JF#km#T|0bj+A62e$9Mh$gm60yAI4FG@6t5%tl`ru2ge6PY<7m;6fzPpCC$!*
8253 zJm1;q?fn9c%a&vEUdS2HPg?qDWY!>=bp@`%Sw}H{2Ob_qTnxqTb^^9YFtzGNd@WoQ
8254 zx5(^*;bw^OH;jCJvMBO0iiqBi`ym;&%M-9S-u>*!8?-7=&`1|*#eRX<OFmKAxA|(*
8255 z?xIz~elaokiE3{BGtcoNY*!oT(_xz{_xxDT3q|((P0^=i`Hhuxv}jk1o?r>Ltgg1^
8256 z#bJknI03SVRvy%FCdL|S4>`|apQA1Ju%=6L`fpjLp8L0p1pTw{*IDtJreDYdo=c(l
8257 zT+6Jce~uRR!51XudE8Nbo2Gy4!}c<!pKN`D@c_N4+^#<lF*8pq4+?)w7mE%MM_$}#
8258 z5c&za#@Oc9=pQMM5!^x&xW==q^81NDG8mHO>0jX~c_i%F0_F?8=lL!}hg5Y%mjDjA
8259 zvFigH)-YtTaDUrf1txI7{mec7m)#7QJUh9$lgW~}zQKK+;oXCS5d@|VcLm2{ZIT;0
8260 ziCqO1MMEbO)G*B%anC)TEeH~~bG*>uNLtwEki^wUBoU%4SVxI$4oCJw>`vSd2vEvV
8261 zNNj3eWci`<C&PGGWr72yScbG;iIYXN0dul37#1j1sfPJZ9)?D#bkf+g>k=OY8*im^
8262 z3F(}Xbg1y(fR1$V$6<{iB7A=phzQRv)=rJa40yiim{ec%4tKVGmpgQ_vsWJv*IrNO
8263 z8S9*jj@JtMR%?!?mfh&@;Um<@9h4(>FPbsdYR|USbUE=A7#dO@e{4L$*&o*OwA$c!
8264 zq}v~gir&W2BHqo8-sSej7Ko_fM7M`0d!yqA`}Hl}P+dZ{{<%N)aGF2%xC|0}3n#fR
8265 z=K&io!QnK{aDp5U%u;+joWtaaY;P!jRrbQW(z5mOgR>Xrd9oUO7p9S!h#~yZ3;c~w
8266 z(XjZ@B3mlE#|J=S*uP$<MV}Bu0B-oOP;WqAO@wC)Rs0_eXSCbXV)O@FuA7Db&oC02
8267 z0O|*^*U^~iB-zGHbU%Lh1&hRKozat43>TlwIrJZ>FIugS9^BS)^{G5`A|}<r-VeYE
8268 zM`o>&(g+bmJ#`35_2G7sUI)d*_X2`E?BFU;w+J@BBlT`f<gBQ!S?sQ&6j9}vFW2Ez
8269 zBR({U!ejXTVC>tBGVGAQ0~^isSw!N6t@Z@vr>&+jp}f@kNTGEo94Ffy9;2UihK_R%
8270 zoT6tcjq>n(KTK<|c#HwU%JIDBdcotMF^1}-Ovi|b&2e~+iK`CSRq!^9PE(9~&{|m4
8271 z5X-8(3rBm5nLx5qEh^EndgC|#s^~IFAHM6&JKLtacQ(;?-^x9TBqI~U!r#b~0?yTj
8272 z19>Z<fR;G-IV}Im@s^|CN>kX52)Fh6#X+MMT5Q$aHRu-bO3!KI<!$4&)c6A0GkG<?
8273 zgn}h3$T8Er70^|Hnj4YWiUe;CV4x_50s`@=5C|CL=`8du61l9)62KcfKebw<MmXig
8274 zJ@_)-Lsj8-Z1E_r4SAtW9B0}BQgK@d6N(ys3({2G3YtH{-yx0lIS+seHs|0LWkKAy
8275 z2aFKzr+Py_W2HM5CEy<X(5+A3+v*{zV>wVmMH;Tzh@qeD`L9v@FVVAJb@4jy@qf4K
8276 z75lTcE#lp3<TaASogka*EUJ!X4d(U4Cr`ps12}|Dj^&;KgCXKZkJx|b84DNC=)*>)
8277 zQ<ye>`mCizoReZB5<^t_p<SPtHug5CscW)4oUlR%9EjfzK&LtS9^qNFf}^bm;|I}#
8278 zT!d0zpehc$8E*)^qSk^(g>O;C4I}JJq`?#Q$PRDxEeyC-HO#2Z_!Rajq6YY0WFw<F
8279 zN7M()GO%3bg0O<Ad4K3Qcul961zWM9$CLc-=*rN6M0Mdtni#e}Og3tGB@q7Tg}9bf
8280 zd(1b|kr{kTiqB~JAOti%LzhJkJpOTf5lTw`5PftoTBLqvT)|$6je~7rulAr31kd;b
8281 zC}#Cf>`@#k@k-PI2Rm^nT}JHue+6iDwL)0N;FCFO3$}^?{-AL^i3}jG*7zY>f#_)m
8282 zgWjpq41$jfuCcQIU`xs;KSrekV#xYvQ|Wi#A#BPD{h9Cm5Xx+cH;PhKP#McPP|hqQ
8283 z^Nr6)>NON<<B$Cx^m6@>24AN$*gS-6nCS)!>p>U%2omRX!9H}sw;R!KSQ4`r4jSV@
8284 z7ox^TgS2r!8reo)#v|f>o`^;!z_M(^E9};QK(G)&3^d%WhPhL%#k{y+`4cXqAzaC%
8285 zdBCS)xfYKg)6{=JZ;tkX;OA__$Im*}ACrIxPxbA{R2sC<&Q5`W&6=ZGi)CG{-2##o
8286 zdDuF>9$QjZqNSdi96gQ|hSpd|b&3_B7MpREF&e#SI}i^J(xSuN-c{VM&B5)b{t!!?
8287 z>wRa?f8rcTjZ6Xotgbr+^b_3dW-Bq8hsvvcy%7Xa5w?+RTmc<o-je%&XT<*BPYmB&
8288 zm^9ldjCZ1-FsLS(`f+khi}_WK8-1_1zsLEnjN=3W@hnCF$+(%f*O-i9j|oDHCO0RG
8289 z@*4K})D@Q@bG^K_Hxk$O_Ve1_d%U){433J%`8r5NYUaKQvr6y_{+1JdbOR`I;xu}J
8290 zHk#bo+){qVE$^V2*9CB$VZk~!#%grEkp?5O`Ct8WxEn;L!?9!X8TYzu&4$~8)#X7)
8291 zVh-f(kwElO4OcA0b*F7mCJ&>NA>VCq8*KfvpuUFBRUx+E>0EEXsEjKc!Cc(taKP1z
8292 zY#Q(}HUgR&%-J-ma(YE1m1O+DIt57ib>C+b`~_Y8p?QrH6gB)j7<#K7bKpFqyWl-y
8293 z)vXvRJp{XNetbg>bKe4|!|$|5N5U)-OaBA?L~O)s_%Xhc%+>H5RLLp0KAI_yqqB5h
8294 zsm6eJI;6Nm_Z@Va0yrT6-;c^xmNdY}6<o-p&AY)$)0=p6JN)H~;KO?(dRN#==uu6n
8295 zyd|JNsx_yZ;|Gx;w*C9^l5DZY4)yEX<*fP^D2f`Y_&-d<jL-WKDYiiV8gdV<OSSq^
8296 z+{Lc~OUQo{6lz8R#u`YD78Ri>4{PFiPVjpTLk(^JBYupp8-?Q4NFv4yO0J%Xa0A81
8297 zmTGYaP}Oo9W;-Ywo28yalul0|1Ic(|JAVrLuRy8RzSY<3t;R%d06A*xW}q0(48d>w
8298 zG9bk`0PmHvByVUv9syCCiY^!}NQ$WAY1ETp(03>Ve%IRg%_KiC*}BduREt8!DCktq
8299 zFXFZ?)@R(`$M}w39*F(*P-nU|S_b_H_8E6+`qxHpG#4Rv7hj|zv$6+VU9NxF*Oj|G
8300 z2PR@gZaxE1FYbq!>pj2zDQ+&xOMzmEr+?Nu_n$MA`kIOlb0d2#{RhU9@q<*c*!sK=
8301 z8De7xO>D-P55%rKg&(v|Djxd@#&u}dDo773X32fD``;6aji^OYaWIV>pd;IWZtR3%
8302 zOY47`E(D!$(l|hUVc=!pic0W?XdmpF2UV+{pctHdtj-af4wAD-va4kF;~SOZLLWQz
8303 zK7Rc&>btO>zUOQ+{eXqrn`vVwG)sv;Z1sES<3znr^QzW(n@31k9H+0#W?x|6Ob&|Y
8304 zL7(&aY0M1dcND+E2%4iPWmS3rm74!$LBjxHBlIhI&2<bYNVB<@hKRfARD!v^dZQqJ
8305 z(D;KzRz|5RtVmdA+kDFXgwwp)Ejrq1e25~jlGNx-^uaFUQ|MFOFl@d0JP%}!Z|8;r
8306 z&q`Y34HjC;5e}teUqnkW$9FF*`huIIl?rb(`>3{B_y>XQ8^uP@utPlSl^ej~{u0un
8307 zDyiGfdtlg}Ex141b^{1b-F1%nb%tZ$eTy<3*W|tv=d=2*l{63aQ{10)BO&etiHS`w
8308 zaVHk(iEg6>g2PHT)baq$7j+qzq4l1c$bn!FMBN1|*|n9I@_rJXRg#=+aqV%Pi;fCn
8309 zXDYJO{%tIWrp3M<?vmk2u;5V9OE_E8^iPd_(kgkK@)p~I<`B5~^?q)>liUWc*AJr~
8310 z@5zFw`bo=DW<WTT2{L;L-zxXe?{3YhYwHg=-yeevxJou=HB196{*{eZZoz5_y`+Zw
8311 zqgkOjK5Qq{tC643#As$_=md6MmLUDub-Wrh7Y93)xFazJGh*B)w@LP*e(j0NEf;N`
8312 zmtnC`c@1tqtKlb5o2J~Iw#Ut=EG;;{ZGYb^&o-ce*49?62Hq?KUzWcDKg6#l%j-|H
8313 zv`hp~%R6x$-cBaQ+4ch1UuevNiZ~LQBjB}Xl*!Au0!%_1TH?dSNTt^ZiSdL$OAg5d
8314 z6cCDzUnB>Ve<aDY=I>o=<^K;{EqR6i6_5U%T1&qR>r6I|TPo-zwT*}Y{0=|tQdX^j
8315 zY&hit_@5iG5&<XS2hvaC7hb}KV~lYb&}%ta(V4yqssiBU<HZ1SA_o|K1UdFfr4!X+
8316 z+5~@W9R4Dlv3XaJpEmo@8b|U50|o;J2gI#Iz~?nlw0AjDht*YX%|XnB{@)(ZXKJwd
8317 z<kp@Sb{<QA$lK;{)~}K6$bpg|RuFq>2MrgHh=H+t3N6CJAg(l$SP(ljxE*byh^F^~
8318 zlaO{j*QDhDEp%fTz1}AO7<0+>qmh84Znhl9x|!NUZknb*AQ+FNas#Ls-+UxTrM*6P
8319 z$l&daIv5x0U(NbV;L5ik<B(*m0k|JDV8&!{p^X8;$0p<$kK)Vbuf~YWM5I5}q~9hV
8320 zZ)vs4_Z%zViZ5!jO+K-|3s$R#vMirHavB*J=uzHs4$JfI^ra$mmvK2W6prch9Vi}4
8321 zA0T|kF5?ZVkocVvpJw70S@_o_{wkBulfa|+q93T6So&oqy3|A;m*@*j^aP1s$n^?J
8322 zpTs!fG~hK$ca!LYCi-Hag)B2A{(mOEw^{t8B!0+5H$x?&_@wsKKezBxfoBXVCZcNa
8323 zKk5|-YXNaH)~;e4H}4ewBK>gt{EJ)jKalya-qx=E$q%ghznA%Mw$I;T<;Ul6@Z!9^
8324 zeg5j!{0YC9|59sy#xLeS(wd(l^B;r!t$S3HT60gH5!`RG=ib_y%Tp-GR&LLAwdSso
8325 zxnX;5LTm04nY+-Q`(L=Km5`?;{seN{?A5m3l83M2G{Dnho1w$*)C6kS$Xx@O^m^k2
8326 zXvK!77*p_Te6k8inriP(Z~%0n@M*?-EXu_dt`Qd@LweA^m)kt3*j$aJFNKFUzFTV+
8327 zU#Eu0vv>?UDV_uVj~t2ezuaq$$FM!M2Cpj>2D=27AXxv!fjD6WP9bqWbNChNlTQK0
8328 zK>fe&x^mA|Jh>#ESlZFx>wCE*w{(|0dL7;kcYnbYms*?8lW{xFJkIy)UycOZTO8PC
8329 z#if~{eU|R3+=tsQPzwa(uF`R%-%qBDCm|DOZ8b7fh>uOUJ7e>1NicS>?T9jy15u?p
8330 zk<ZQf)iqtc$9$Psc^|^cgvSPWqy|e~;|!I}6DlrkLq9lzH>2#luDIZZTvVBZDwoBp
8331 zs19@e!2Fw9WLB^j>ta6xPsLPzCstD4hQync=tvnqq_W<kk1?JRL&(UT7epc_IKoAD
8332 zh3c>X{U3J3pZ`%f9DOE?iA&NeAsCx`9)98TZ*J``zxt>3>Jy_-EdC(As#*913{hNJ
8333 zVU6FzY`H@sme2tRhwHGkx7L77jXcfnJm*|mNF=3cJSe5vbsB7DLiug>&G-f@U8zLl
8334 zI&_Ux9s`__ni_c<RWQ!xVy$e&G^^eRm8(I;nkR?1<-LMDL&Miu`dEKdN-&ucG^3%=
8335 zbo`I_#XX2Yv<7n-vGo>?kL_(2fdgc=nib3v-62W45`$RcMO%qgXVY-9#B7$p#oH0q
8336 zG<;-*?2<>23n~7LeB%$m;fmf(^u;E>OF+$bH||5TmQU82g<9;TbP48>h>mn?|H}P5
8337 z@%{v{-oz?a(?9pZrom#t_cSSblvJ@qfz`J2D=El@Uol`0xQL2itBV->>GQAUV(Ylk
8338 zB7KX9JQyk69ZiYseC!U`kRJ~`@nN<D5Ld%epj95Rhk<1a?QHjZq>CHeTrSVg#oo*X
8339 zpzjqo+15L~!@jBH?I=DKlYRj>8r5g9yGO7K*w{U0v1?mDanHo$S9T6R{;x2<$Zr_5
8340 zZq$%kEd32Hb<}9=p>fhK6S42f|1ZNI%N9qn)nbO7#Pe79IAEPjr0^N5451s&bC6?A
8341 z6$>J8dkQ@y9OIMVUnMUSUlIIwz;wCmMVBAsdV4-akegs1;aaC$_wT}mPO85e?OB~k
8342 znxPY!*j?AuQBA8LEO_iPvZyQ!9MBR=_lB^$3R#LVsFfsKKdiuS#;}YUU0fVDW*%Ze
8343 zsveto<{h$7ZJM}0CKz8x#%U}QI+12FW<c8VPizo2;9{$J3bxD0K}pflpHZ4qK&D^c
8344 zHT?R@zODXGK8M_O`1Qe`a9({i{cH0@ZT?~S^>p59_<PicKgZcXS3GfyHOwyKA<>;k
8345 zso@pKH5OP}Wq$;sWhs7KNyJ(^CH^>>UtWc8h0jq+e6S>%fpddXhcH=c4qRY*_&+E-
8346 zp3R0gKVytU2IkGkNDf@=A7gSczCi=!{KC_64v*GNHrzW`BiLZ1C*-KIqIt2^mMOG}
8347 zUGZ;>X6Xwf&G1Ccf2lS;K`U@?qtPe_zxX5Q5V4;3;@JSSS3LGiKj)9lN6e4?4XeBG
8348 zo5}{|6kwlRT=Q$~A`$=J9-UM(foggXGPiaX56NLA?5um<H9Jf0^Pz>pR;6n&enPHr
8349 zLGnxr=fbgccLrLgH^KTWA%xAeGZ^Gk9RI-6xDRETj2Og5IphG5OKu{OTEq$FS%(q-
8350 z2O9pi(6SutAEJmU#t2qINE1OBIL6C3GsV*Xf@K^Jy0KS-VMrJCI%!O&_lrVs+j>EZ
8351 zUWlC%HM|Jr+V<-46wDaekGIDX2L+;2G(0yK^oQnTCRS$ftt^Ob5aKu^HIEIn`ui4R
8352 z*)r<n(OjOkb~auEgm?xUeQ;HS-H(4wmlgw(hx4KJx&8&G8EsX*f>TGMl6ZMEYZ-=o
8353 z(~cG$?Shd8FTAD9UD>s{@31m=@I0)TaP7RN^2m?%cuoXYXxhdD)-PDHXwf{>+8OlV
8354 zvP$!LVjhf6M3tSv%XwOWUU!2bC>V_6<qZ|H9e}xMfX$UEsD$@jB)!yg=wZ=Dda+0Q
8355 zgQoHM-vz;aZ3Km#68uGaLYj8+2@aNgVM*@)w|scc-HL&Eykdyp?4uNh1^Rn@qnvzg
8356 zf&)Q-ZSKn60Ha8=oX;`%O>9GJu}BRn1Y)n(z)~6`NdTw=@k~^NZ?8iMg@&j{QYFM!
8357 z+yUa7?2uO_p$z<3{tHfe4cBSx{ADmgbQ>P>#KyF`B0?^FB#9yKVw72P1(>nmP3RnU
8358 zdZz~1acsm_>DVakCi1@Hmh3`$k=Te7Sh?7&#U3-!d)V~Yh^|C)A~4Z6BLoM!g+#da
8359 zHqm_~`bVOZ+R*bL8cJ^^8cDNsBprSy5S2QJ#$@Bu$DoiFeV&cyKFvPk*BD#82pK8I
8360 zwk~p5?*AIZW8)BEyizZ2PFy3ZYN3-Z^{E38!>C*iji_s$uc3ymOCI4Kg3U+l8T0mp
8361 z(GNOa%c+N}n1fQ`+-M8Wr_!SDQ6%#^P@|D2oLG#;;?pY-2YAyo{XYC<rN*<+Ih>bQ
8362 zJKS;!BOlV>HNE&4kyiyS(A6tdfaD;FvF8J^_cDQL)t1oD7<i?ASibW}@-S4@5MeFF
8363 zm<$P_vHO0dF5>@)2Az?_|5a!07CzUAs#0guK+EvbH=d)jIf6|)of#Nw==0y)00H!f
8364 z0s+LfJSJ|M)w|NH9zm{YRzyes1kYOak!VF@#ECl4FCsMlf4XZi4=6^tG-9#K`GhdG
8365 z^s8YoR+Qf7ZRiNcHh;x0yf(Xa@`l#gQjPqTa>fd`Pvmp6ya_GeTo#DN*xk@B6$Pz+
8366 zJcMeKCTX|DPGHYvP^5;u|6j7jd`av7pFTRvu7%XXu4|w`;}u%yIeqj6vb1QsKJxty
8367 zcAX2o(ylLLhl%@!YWQ_p-&uD36!W9+New;PU)Z}*E|8Y7`(W${>hHr}mL{GKlK#KV
8368 z>&3mNFjGRcf{aux^gY!>E9Pi_6(VupI`WV-1@s4=l6r;3gLx32&Q}C_#>0Q*E;yF1
8369 z+qoH;g~5`Geq=r$HsNN0$^nE63S&S$S8Oq^%0y$e(0>lCVFGa`Cav4v6g95ryLC(#
8370 z|BbQ#EfI(5&z{7{d<!(iyd!NAH7z4m!-dH6b5;NPiJz&TS5kmz?k3xvqkp$%FiJCS
8371 zUI~g&FE)UKUEzUwr5VHHRd^K)2{APMu~A)rd;=n7sxLIC&(>yUY{G+qhmdW2uvAo5
8372 z!$&|3QA6eHVmJh%lB*seb7R~)q7()P6ikd7{<jcHbeid)c4@lEGu}t(s2F5sX*j5;
8373 z*NyA%J;ZS38}Xu|XVI%J^eX<c(!~24A@~MdIkOMw?;se^d}E9`tB7&lTh1zP5zTXN
8374 zbNHLb;eQ|+L()V?`2Q|S9i#J=_zSQ?p?3^S_A3nK2=s-!-L3og1E83AcQ#c#SB#;*
8375 z3>d6zI{}AI2!jsIUieEtuCpeA$cgJj_;w?l1g}L!E|OlHQ;ul@#_fMG70wg-Xr@~i
8376 z^L8A25}3m2nBb9=_%TtVopy~Wpc)mW?V6N|<`l3LjgllV?3MUGK|+GmL;TNzqOf8J
8377 zIvo1J!-`hCnGT`o-9E*y@NV%-F`CdxR1V6a#yzOf{8>BH-_hFU58I)pL5t0AwnKFz
8378 z>bLDsi--!fL)8N%_EO9qL06c%1@9l2S%~Htfj6Lo4C7m<0@-HQ9mHzdwx=*1Wn?2J
8379 zV2rin@+l;acZK&hZa_=LI(9Te({tig1b4p}ukx@C(W;33270;quvOTH8K!;>6G6o;
8380 zzF`HvU?03Rh(TxNUh`!q<R{;#g>Y5c52)chRfMdMBLr><UTDU((Y!Q6eVwKvE?MK=
8381 zIG&epm#-NI|J*Jg4YAixH9oWFH)gwF1~|x(>n!VmO><-1lE=2cB0_1+7KCE?55E>0
8382 zv3-I|G5!htY0+xAg2y{~UKGT+G+~N2gA#d*3uoE5DAYXCqL1poWAz}aGlY#+v7SFF
8383 zuK>jQK|y%2$RCL`roesr^`|5YJkO51QM<85f~x8DMnXBE69a<pK;LjDKCr^UYewrn
8384 zUgaP(O|w=fShixH@N0TyogPn*m}KL3(;BV>G0~4AHpjYLyk_GJdxsYqa1*liRaSVc
8385 zR%l_%cr@c3m|7rOWojW1T}Z)m7&E_)1l}}|L`}G;iN4fCO0#D6FX9&xC;<WCRjXK2
8386 zi+(^-fmjm!)~0|SB{HBVxs9<9IuK35nl{7|c$^cKhy^sRzxKncC8?19P!|+(|9!#N
8387 zES2C*2mv>`&^n7A0+mcSOC<sQGr^%8Jt8>>)qsOI`!u@4h}za`Fflb;4GFmT6oX70
8388 z9iJY9sNnKr^}B)-vHHMWJTL#lbfx)X@d|^`>BMX`=R3RwhwoCGtgu{a)v4=(ULydZ
8389 zMSwiP;jG-!TEhDwtD{`yc25n?);r-s!SU92(b?9IUQBl2*!(9UOMNvu?38geL}s|L
8390 zE9f$Ap@K2MufifU1ur*LqKdkq?Rf>`67>8;V9fO+oXtket2}n&L}B!MjXr;3>v$cb
8391 zpAuK;<-0y`c-zi0uyn+IJIn=%*aE?mL&gDACwCVZvoCO`%<7AQ=!;|$t^yxSaOn%c
8392 z*JAtntEd<2{3IM(bEEMTs95FTD)2lC_Yikn#cCtI#E)_QpCq3&^YRu)HArWY?z^(w
8393 z3YIhFsoX9u8#QmQUdanj%}uTI8F~|MmKmcT#oDx*lb62F)<V461UM{33n5XYW{!ui
8394 zDfEh4nEQ;)OQ<UDr?XI7L$AUP5=qhScq+R28j_Ie{RnkL&!LsCqRrL9zb^Pb8ResS
8395 z&{pfP3%i|yHP-Ogh*wzHdFb2K$ls{N1?yN-aI(f(x?l9?X`_}pMPFPD8PWyrpz#iH
8396 zRT+aSwJKbGs~jnozG$*v|F1CwhJz+P$Ix+wXs%wbXFDsOK=oVE1Z(O%`A5VF55kGa
8397 zc_5bl6*93aN*Z^9ym<MNI0)Hi{0(KXaVb{m&2JcgN9#qcw($jzgZJ!+ww=>-?5!lT
8398 z0oTx$o)P+J)v_AdC)>}u_UCu>Q}X`LbJ9W(XyHLKIwv&adLij9<1dhdgv)`u#Kb)Z
8399 z95vIEnh8#5^WW+J8^rcuzY-<vjobVOP{C5sY@e|JjmI|odfbSKrB6d8OJf^Quo-Vj
8400 zVO)jRw?wl<tIpF?@pRS|LXnvYk|{`{W&&$6CNio~Pu%b}W<!s%e%l@xuKi&52+lfL
8401 zeg9T*{l{iKm>poXoKF#Fae4hA2o{CrD+%6@`XMP_l*2$r{{e4cQGH(+_XsCa`Isoh
8402 z%bkgcF!f#8YWBB2yn8FrI1G)7_FV&I^rZ^h4RF3yg&VbEm|Hhes*UI?B7kvoYL2Bx
8403 z22z*STMIryi(8C0Q34d}(8lJsjft}SPwYOt>{*s?-ehD6Jnrf3kU1soC>hg`9iKsR
8404 zw?k`f_O&_%B8j88xEB@iK5K*@*oH#H7_QOqf{#q3G`zP+!*2ku?#LCt&$uVxH<+mo
8405 z47;Zwr4D??T_%1PyQ{?S%kFCN`)BtO@%y%WnfP7qt`WZ<x|{H8>k=IE0>P;iZ=Qg+
8406 z7iX}1EsWEz9};hLG_P*p<dS95P};m&yo*<klhF|TCLuJ0z&x!?hQZ+u{J0ARS^X=~
8407 zOzaF#CmydMB0mh6M0qc(JDdfZjlp7E1#Ox3#EVd;;a10_Dhgh*^^*s;0(`i6!`XoQ
8408 zhNphdUa!2(i^&~w%}=!Mn%;x{0^HRLS&}T|2q3R5!M4vtqWjVVntlln3TUBINqAdn
8409 ztn=s`7e@5(?ajY~{{zo)W1trO)S3iL^>jZMijg$u25muo1H{l9_4SybJT+^QbqtI9
8410 zAUqsZHd?v}Nh`vXe2hyVF9PP}LO1DKuVyQ_TWxvZTab^)=wIgiVl=-b%7<n7^{wTt
8411 z!P^7n!O0CysP?=qUi9i;GG5}$vEgh7wh{==4V^!{6HSf1Y`$V8!<Yx_<lAqfonK-O
8412 zBz+JVxEE^C_y%0WP^Q1>1(DYD72UAQNF*TpWS4QAgO4UcE~tzrR<W5*lX&NMT)ylx
8413 zB50L(_ly(o%_0fRTWQRAhP{U1F)f=f6~x=X2#8ZIJkE*Z9lp_~iWLB81Qwb=E&&EY
8414 z%)!Bg`L=TaQwS_U4${++T#BR`seo*uY3_M=C+=8xnP?RF^FhZF_w~k=5Cc);;`-)d
8415 z*>9dL=w7yuLVk%>Kzh8xYy_z2b)t@lK&m!5Nu|bEjv}1z#h4Lq_}XVQp{wB5A8*!o
8416 zh{B@e2cV!B5ftai-KFepE?v3HUS~W8H1-NI{0kaZq8Jr|L!R}`*$^rW1fIh@FIbFc
8417 zF$?jYj*3ChS@1GCy~xJO3rNP|ZlqHj9FJYUFdGhVy+d%da@nMzQntq)kL(oXD&H7>
8418 z-oto4#tp7`yG;3};pbJp0QwEtP+oWeIP?4%cSPq>e`%KfjPGgj2!c~QTjV71!3(lO
8419 zlbf%iK0*QaJZF628Ebr-3Xit{!+aUA&^&EZ>9b%5??5ZI1<OKDnEN532my`U7oj|O
8420 zBA%)hwO~Bh`|Jv2%08QnEWOU^0rVKUt21(?UtxEc{pCVuoYP;%4m3zyF*K@B3G-X(
8421 z>d$kgCVMv8d?`$wk*5bQXW4yxzkZ_j#O1Xoy9}(ui${vL7%(GEPjnCb(zB(wML-4U
8422 zd^|FN6Trdj2Q-2gR!zs)88cRDz0n)o`2QWi5y9^Wb3p8A%z!u^-hzFX(#l=1>#pF6
8423 zq!ylY*Q%aqkLc(%Orfba|CZ&}r3k-NKSns^wHq*@8&xzyu`L)BXF3R2F)-8j4=^Wu
8424 zRDK1OoBv}w{}S>2`(zD|koU6u{R<TneH38?53;^`USKE2n~;$AE%~y<=!ipO`9E0b
8425 zN5_ao%u$FJP5%Noctc|yNpRivF3?yT<D0&u`ED!jj$ZnvD0(mu`=^q~K09Wtl^qtG
8426 zs^NN)hL_uj+d|0H^v)raHfBkxFj~AAH=w5%kwo;`2k^5-oNYJ`8YihA1YfTN2IBOn
8427 z2G?x)PENxzJafJ<#-K4#?0(kstn=7n)M@N|3Fz>nUxOvkL{zfEjJEk6-2OMl1v5sj
8428 z+?lRlOYu>AEAUJjbF6;oya}k_KXExgOtkU;h(Y3OcOMk?$LGcEs{&zt#uI1<f~(*N
8429 zy#5X^^*FeZuZ_p(IHLZl^Beu~_B(({Zu~z5;%#I$d%Hl`o2h3$Na9Swl4OVR8??Au
8430 zF2uLe3{Uf}2Og3<oB0ITNhQjPM}_e80_ICVxYkVv_b+x4>>De1%f4|r!+MCZ-WZIc
8431 zZQ3fTZXC_HLTMb$iAHJc>bN5NfyU8^`d>di*f`pG=HIJdY#g05d+d;8vtKy>@fjxb
8432 z9q7NXRltxY6XR0)bv&o)$9v9D1#bg!>UDVB{4`$+(xk4q_mucPQ@b~%Ta#DM{5fY>
8433 zZRKaa=wNrWt1mh_F`AbIUz-SL=NuVZoI2;v4}KXP?Yv=h5}&ok7p^z>@G8=NzWy~p
8434 zj*dN({KKY?Y8_3n#XatQztM=^<*cpgiba*rQRDN}_OHF+E~jI2Z1D{{%UpPuOhavL
8435 zlBWUB*(5t^`)~4j8XVj3B-<v{^RZ)7|0A9{pW|a+?3t9mtMiWP8)`r9?m2|AeH};o
8436 zH+eS1p1EjH!&9SujtyS@Fqn8fn;lKw{<U7u;gPZBxAqy8wv^(ze2$G?eKQz&J++Qn
8437 zZ~u)bh^7p1JU{BR&#}p?*Mgzfvk}Suhf!u^ES$0Z#j0Xfc0&NKz7d>3)p5kzf3p|&
8438 zemomT#-17W_v3i|3d#)r1qtd=9DMmGdMY@R?I#eb=RYRGD}U<sd=3F_Ui0N7odkyZ
8439 z9N&2LdLhLpl;TIvQLm@o=h)#xYtz6S4c-c|QU>&@p5fKEc|Ilo=N@|TG^-DH82VAP
8440 z-?P=x)PKF#)8IMkh(}A@87AXRvE|n-%9{Iz*RzdW`#YEWSuN4$IOatMu<e`3^%$yp
8441 zW8tn-ue|IS3#9naVEve2kGkIeo4m1S)XaZo)-ZRl*K^G0I0R{GYdS;ks0#|Q<u~1Z
8442 z|F5nRVxf-DahNP>yFmdSu)xdn7N7rC<BB+n3-+688+wAb=a{#DLoD2Ba`N@tP|#wW
8443 z1OY6@-Ny9wC3M7d!FR82C(q;#cwV^S)aUzH!2L^%+34>+-P4~1T))IV_RM+Py5597
8444 z{lyj!dFs5aKXt_TK;QebNq1;Rj628w^Ck;8e~B>_e&SCDe?FHpmWx8&L%&KWeV_y8
8445 zeVz^sih(Z_J95~`mi7wI?tk3t`ON1yS^Kf6W=8`&mdjh)kmz-6i-nyFjy?30e%Q0w
8446 z2g|QT*5KOO9_Y|mIBh`wD>Lz4BE0`~lLOSxPs;fAG~NqU+mOt0>p9|Rf^SHy-O$Z(
8447 z2o^WQw|~u_@h&R%GOWb04VlT3O+##P_cuTL<_@r_C7aE#kD*iU_~00grUw|HYaC@C
8448 zu3ZDZ;B~|YbF527>SNC~A@0!HP2C(Y>u_4bW4})oOkhCAybfCOc_*)ab-%uutUQN7
8449 zxpyS(;1^!UF>=~KmjMnKrH9}aHbbVA+FE!a$lLkSg^A#VfwV~o>n4*;Y{{^uFTR37
8450 zgLbEHf4B2H+B9tf!(>x!T_UX&P22|VP}gwq?IAUJV%}?)+coI~C#lK8d*5D%=i)Fb
8451 zd;<plBsGe6{Tzetj&E~p=tdEaWW|;beW7JgmRJ8*ZCw}d@h@PHf4O4uUmbP&dT+Nc
8452 zj&JpP)<L3SOP>2#|J>*J?)c}m4c#5vx*hdw1?4{V_f0JH>OVT-US!m&j>FwP@%)I9
8453 zI^@}ZCH>l~f9%-qJ-!8w1|8M|zO)<c{1X^nxA{LE#3HE{ZpeFlGZ;JSyxq2VJ#}EU
8454 zd2%>{8gQ-K1S@YhIL^(|(SqY$k1Z_)CsaeB;qU?7;B%pAI_lW+8+Ly;_zZZ->=d$u
8455 zci3opS~hSqS#5?ZhI@wl@6k8Q@h5ochVFvkP&5r@2{B&nh4;8kq63y5o*XT1USYGa
8456 zvyJG4jj_eaPdql}xPA!i(~sQz(eWnKbNae%@N952=^xkDbUD5S@^!28!Ge#(miPEz
8457 z%a?<EaQt<Wr`u82ZL_C#6omQB=T9~}4(kn_x}u5bq|Mznc^w-(+w`uGRzJjsIchrH
8458 z<?J*b|34U(Z>=GKPsfaYms1~~REdM!c01z6B{4)DMXmQO<^IxEb6YezKKX-8#07r+
8459 z7~YzzWAf^|AJ+&&d$1jVp@at>2cGf{+xqZBURZJ8TH{hjQ(#!LSo%Ng$GbfvM_D;^
8460 z`Zo2+1ql2DI{v?tAH_NVi&m`kwa|e~<A1+F$P%j0)KKnW+&s;$!K?B@-`=K$cGu*@
8461 zf?YE4z)a=Y&sBL57WBnCUz(qmaR%N{=Jdw`!|_TMqx^Q>5Y+KTGXw8j=lk@=@_l-D
8462 zJGIbWyiX59-FKeiAGk@rps)OOzMOBPz6np@`J=;c99FC8!-td~Y>sig1VL~|;S)52
8463 z!Scgc+TaS~1xpha_EN*eVxhw~onL_W4f=YW5wBg7^7ygfPSG64L#Lb-S;y)@<7Lv=
8464 z8N3YjyBw=eSlBh#2QR8q-yh32Adc;NM%IH;{Elz@1HU%*R%0DhV@0HB5ucRTyXxDm
8465 zHg!dt#+z;WGM0FYf8YtTMXP0tK0}LgqDdLUu>X;CGg|bTrzQS(Q1nJG(0l21-l*?_
8466 zpCR|p;wH5>+J)57lX%15*sedvA42oQdgv&ZM7TkS7fZHVgJEG89o1K_TZo<i+WjdD
8467 z$GW?UmjNKrMX!sFO0M0{M>{XlTnbQ~Q83Xh%XPBK;UzM)MkkaD?Y<3V9IG>-rGa(&
8468 z7W|JVnIXLIQ605e3+;CrL!V}di?`c+w;G#7is2^Aqe24<BQ2Jb9K1G)EBlNz8-+0A
8469 zTcWu?<Nd%3$Da`i=fd%)kytqXXKmPq%FnTLg$KLjvIoDppvkqdxQTf>mNP+KmgO+w
8470 z5r(-^?8<c=_s_o5dGm~`L14sx1zes#t+=uxFIYUYu(UF$m|%Hfu)Mgi!UCri=1*e@
8471 zCBHH_y`r#uc44`aUr-P<laxVz4y`RO$SX(byqWoBMa3nBH@gb*XI&k15$C$H;%5BG
8472 zlIN5IcUNhVYi8lh((<{Aa!&rt{F48Ny?24Gs<{4u&)j>HocqYlgI5v)Tp)q)z99hu
8473 zh$avq0Y%<|q7X<R(U8O>1eB+O6crV$B4|{K)}qyxTD53vi>)Gms}>(ss#eiji?&sK
8474 z0lvuh`_1fg?@b8W{{L%z>-*O7taa|}J+t?oJ$v@N&Y3fJac%w5it<o(RZT^xss^G4
8475 z8aTUL(<95FRpm~Oi>qqNLye7>fsDjR43(EPmMtu6sG#tgiskbwYMMrcTIZYHFa{bT
8476 zy{x>vz4TT|HMNbQikjMGODaPRb!CexLQoJ9O;z=^HA^dM8bdi%H8@!rIflkhnLU3-
8477 z>G|XF@Yk{i+}YCNi@A5*(b7^0oN36qp`xZ7KeY0w(6XAch1C_I#@diBkQ42g@f7-+
8478 zTG+a-`m)gC`r4(T=|#n*vu1=07ww<DY@n%vw)xaoENUVPYiLw9tSC8rC!NWyssSq2
8479 zh8iks>l;}N>b0n{V$mh=252)1N-e6WYC`R`R;j+Cp{}+D23lU#Sc!USDyyzS4Oi4G
8480 zX{>BlPK?bLE?c~~qFzi71HoQZi!VD(23pv+=~Yu(GiYg9<D$x{nk6CV0H0}JRU_%N
8481 z<#Wnl>{4E}q@tm*oys_+;u>lfT~g7g?cUbr3*pMTURWvoBc>tC>dR`%YnPrPq^`EQ
8482 zI#P8wO#6mH$SP~9E32xXU)Io2wWMZLXdzl+StHu_!exyW5mUEMS30$6c!b2Mk9Oo~
8483 zx;h*pUbUh%IW=rUzpUnxn%d<xF*->56*{y`x_x^@rvBQan~gS8TR*52oeVmIR&+}$
8484 zQ0R#JMN8hk$3^vR%{O~SQH;jz^L|^t?eIHgY^D3@@^^@%`e&E3zcft+r5+UuuYh}e
8485 z7k_I#vdage+0b;5(4M%{$}62R^Z#Uz(y2wo#nZoA#OcaYI(7E&|3t#K@lTyTenRP-
8486 zZ`T2>Njuc(<P;ap9RKYSv^%!7BL=0)vWAG8H(pj((Uz_X-C{jD1ayhZDne|+p&V3k
8487 zUB6IG#frvIU1R;=NCXC=DYMQ#yOrP9mDM+3{5{2S+U6s4ORLa7pzDJx0IaLVcvc>&
8488 zxO7=rb%_0j;nMxOv_Ii%J$}ZN^K|)}0y(`@)UHDB^q;y*!6=LoqQM!A+ACixdg+2%
8489 zwS&{@L8Cj}MU38!wGE9Jc(uVXtkJGCO2yK;Ml&yw@(bN5_6?mzE~h|M=!&8fnMhj}
8490 zV^rfs@4T3MAmC?lcf`KY&#?dIW!w+pz6N&@;_k-I+j+Q)aX*Ajv+rU%X8_xi@5lD@
8491 zm$6B^9QS72PyPZj5Er$z?qgfmT=vkxL+8YpL3e+xNkU%Vn1L342U_#8!+Et<c6GUx
8492 z-7qA3nU%eCNOt*<Y|OSwMrEHfDtm^NJt%KzLugE>Z+1gpJVNK(Pfy&~Q<cg%Ut8B$
8493 zRa>K7PEY$ni_5C2m({Z=w4%qPro3Wt*|KW5Jti1>o`pK*)rxLm?UH2;A(5)vjZWvR
8494 zb$)GqxtULyf#s5l%a$X`al_Nnq2`yNz13ALYD9Zz%Y|<^rcXb2I$Ie=nA#;ZRhNUx
8495 zC}2d>=9o$@s;yaEwPaMNYH3|9+8L*Gi#RV_h=F`jC7!y2&d|)Ss;NS&uc)s_)`Y7t
8496 zCAyp~Q)Y4S&SjW->(WQ~=4+pYFLGoxf*d>4qY+~cQeny}`5+f$(wY!`(sJ}koMAOo
8497 zm|0v@zNY^#<Tun~Zv7w7v;JDIK|*JY357#wc~#Zb6-&yhO+jPmWO4GHbk3@!l`QQq
8498 zwM(jM=Ia&CDMDh>&64O83ZoC~sMk48#hPVKZCwS|B@wS`<Dad(q_r>Ue7Ue;`zT*l
8499 zS6#KJ4AV35WwxA%KefvDbPfgmxL}B^BNo*zt1jnCOsi;?X0eK%mR>JATF->diV6*I
8500 zV90ANE3cDfA_J}pt?JrEs5WUCZOfvIAzoOuM7+IqKSRCH<fDsC%<(H0RV}WnV0UBE
8501 zBCF4sG}AyD92!Bfa6)T~N+_>d#9pTit4t9Vjfo+vjyj3eP;n`RXnKK7Gl{4r)Ut|}
8502 z#jmCpxD9<xt>zF7G~9-wt%IFvqDXgYx;?Ir%gh1-U9?p+bLRBYv9o55x3Y)lHMG4g
8503 z^cUz;EHvwiB^C8nRUL;~1Wm&ufEi3JtePt<Gf5m{%`Q57)_5zcbjrB1XB9&<I{yZ1
8504 z{FLHBv+;B8bZhMRiKSB<ge}D>M%2dac4B=oni7g}$oBZ0p*}KhhA?=D6*zfqCCN0?
8505 zcJp`S)RZlC7C_%A>D%-%Gqi8l<=go6gyGxS+bxGP^@v$OVD$TTleDKtYu9SszeR0|
8506 z!Apj1Q(ipasK4yHvTIjwM^3aJWfk)sx}VOU9C>)!QoXFa0*_$6TeJ4;;K+&E^Sc#l
8507 zPfqK4fmeU0m2^8<Qqefyw8NMtg6VH<byG#C60=hJt24A9->SO#(b!0vs;;fQB($tf
8508 zGlUji7GiS-Q@Egdj@S=Vg!UMbeTcIMM`pwiNN@DQR6IsChoN+;&IE~IfnKENBa2w3
8509 zQ(R2wPA4}i(>yz&Jl!#Yk9KOPUt|gfgilT)rV-m)r)6mUoTZg4jO8_$=V=p9Dyy*)
8510 zeU`Rcb~s<pjN6$tPpDXEol{nC71h-vyv&-ktOj?rRkUo0HKU@=Iv2y?l-ee%xMESn
8511 zp2)Lmu~GQcS%WEG>-4JHMUB<5oud(Dt=llTNOg6O-i%E;d=Okv-_o)hu)VUS<siZ|
8512 zg#2!K4#H$?F50~gTZIuGK)4g(5rq6&(7vLj<uJk=gxqM7b7f1*0)zz{T3Yrnyb9?E
8513 zS0GG|v#b*c3lXMm1RcXoEiDHSu0UvEoBH-^TUw?fv^OIkgeS0f<0!%d*m+WjJ(dO7
8514 z$FdXQA?*3E@l^Z>o`23kn1g4abqEh2+=S4^cELRe3lJVeScz@Hm~mJK@QuYfgeR~L
8515 zI*9NH)<S7mV;sWzrxIZf)<U}xreQ5~0^weS1%B{j9aM+#2*RBR=U{D=hCM6?@DcC|
8516 zg!aQNE!z=RBHV{?H^RdR=j=tf6H%_;pu7y9fL;g-evfh?tVC#I7u8;bg$V6GKpw(5
8517 z2=^d7@+{;aOnVOcAgn|fPJ;dj=P-O8`XWp_2szl+vKJx$V=?UoloR20gu4-*KzIP*
8518 ziWgz$6ofCKTnKl+jB+D9^k?LU@Cd>K2v59%{1C2qwWTE|6?QoUxd^wv4tWUeH$aDQ
8519 z4#E?RN0`<D_CQ#GFzrp)3E?J$`w*T$Xkoui&Rd{EX#WHGB20T9@(}Wpz*3h_x73Pc
8520 z)isb{^P_?+q;UiHrdr5C-CM!r3Bj~UN&e;bI_s>A(f#wXdLdTx7b6U>Xla3|u&*+h
8521 zTpF}B|2&{Mh#$lFqG0kyS5Yu+z5Co?s4AESya;sFNZNqA5OhWGNo#B{`3Be6VA}QW
8522 z@xjn_p0UB4&2dG+@W%L}V8Qx?bAsz!?%m24EI?dQFlTHq1X}Qn4cf*2%YvI+<AYmV
8523 zQxT3O<&8>W&P7;+7+t2%kWFZHOG{^j&^N6l7^2GhVwrgcFVnj-#-vY+P0yF~u97}E
8524 z7@8cLK2y@WMfs;X>9k3sq<_rx_R3ovDeuJKPUTt=+^xn2_o&Md79nCLia+j@;uoQX
8525 z;MFJYmmz;2^ylCB#K?!OPO<02;8ELsTl@CZ0tZ4w7UZm3+tR`l;$rG?QgDy$+V69!
8526 zvRLO&dY+L#6@3*CX=eVLS??R&MZwT|PrW8bZ7~fO={JCW0q7eUF+SoaFzaQY{sSCk
8527 zf6$%?ZudqP>*pcR?*YB8KlsslRJbFr9O*Ah`f=FdJIlYowI^7)G+0*>tSkyHD1~WZ
8528 z{WhL8&hI)mSXmLQtJFl0YUSfT1ATA_`rh*yq00$p*+{=#?^z4GjMHve<VWczXb@zq
8529 zpGNT2fv*d~@6>Of+uh&QuD|R0p}Z#{rx1O7Env#Kj_qf&yEquy=s`)=$DI=lSNeiE
8530 zr~s$}0^L{^w2mMzF3RiZL482p5%ksHso%jXmHQocy9$njM^Iil<XJbgv^<4?@~)?T
8531 z*U?U!so%ypSbTlF3vNvnBkg&je?^-Zl$h=3A;?<?c}r2xG5!cCu5*pq(X&kSPmaJv
8532 zehO!OAfd$Xnh-%I_%DiqA&&mj5&h7Xtt~CLwf3KAf27-IG5e!)gN3e_+buk@IS&b^
8533 zw$t&EcDf4r9JsNi#ZUXdF4FI{*G?w|k9yqe+i#~6DUkj6vyit5V|E^3=VJW3h~I<w
8534 z+ZpNF9K?{M`{%C_Ux01L1&nXiKbHm5(2ui!W_!!RTwp5b@Xdl{!IRg!=KsNIaID{A
8535 zq%T1F0LY6eN7P<0g7n`Lg9qKN8{0M51Z@}A?@f?b*xb@G`@7pmG5g0Kw<`~gb|E^<
8536 zMd&z7q~nBa>iZexW6m<@boCn@Zzcw}xZU3N?XKHjG2|6vd<<dEa}@CD{ToHMUC;S+
8537 z=MwAYT8!3fGvpkAoDb;N-|i0+gA3dbw69i)w&NKP@do5o;(7GB->O$rFb6$Fq}7oY
8538 z7wwdZPIU$N-#(q4bUV=F@&xFU)V@BZeAK5J^3pITyonh^{q3A!s2q*ZOb90XU4@Yr
8539 zS?ouL3WtLuvcJ8b`hfp_^20tdu8d=UI~5J_3ZL%aAP60tX=ZwSc^7;~!Pi7Sj4!Rm
8540 zBa<^2jGm1k>4<)>5ML=)O1b~z{%T>H{%WGX9x<`jE%wi76T?mt7yW)S@-4vE!i!qx
8541 zi~d0RN%-aZ__I;cS5I}L@qX9%Q)5k`AUhNHzaYN^bMc{oY5(=?p`_edhzeltU5WHr
8542 zk#uy9NS_;_GIH`kxAQb|27-4c()S^qr{=}f^R!^doem$7njWhQPCwfK`of>Kw2b)f
8543 zeh~8&kNb}A7!O~DyfEIeeBN4Kv_Fda?Tp}ImwR^m!<Y6T`fV08J&d(SGhl1VX~(b2
8544 z{($joKbq3B7-XM=6F!ellKpQv_zSUS=|g_G=+CPVKL_!pjElAh_)86}WIEu9YyxKB
8545 z(wyXb2z+(z^3_K8CbYx%FYs+@m+$oXu|Bf`sBiFH2mdj8j!TT6dV~9V&vkK|<JTv+
8546 zUv>MiY|!>%d1r#&`t7OZtwwwr;!BVm(|+~5umPHz`I2t*rVWFPet9?e!r<FPzNnor
8547 zBXq5Dyy<KtJqx<+p!<q+(f%`9@6mp}IJi!^e%J1}VVVrvV<y&$CBMTw^Sk>$j1$Ur
8548 zb8x$!pU>9e7B&A{<Wt{OkZ<p6X}Od7PLB8$%GGLKRN-sKu_pVmWckDXXP<kX%*Ia7
8549 zLf#z6(+`ex`)2!{=Ero$p5#AI581TmXQ0~xI=mj$_T>CIw8kg1BSxBbo{0tB5zw8-
8550 z2)N@C$dPW<%zu%dgS9ok#*L{@`0sj8X>gC*g&9}~Gfq>P#;)|=M)1{v&sqP(_Qw;0
8551 zdt8^tvgz54Str~NKCa>Wvp!<|V2^86q+2P4ljADJ{RZi=rtj0bKZQSteK9XtA3qWO
8552 zDP|;`^T!U$rhC%uHw$b1(3AMEOiMOD0}-5oh&06WXq*^*N`vcsuHzAfOu0#44f+$H
8553 zZ(}d4bJlxkD_JGz5|h3e^d(Q>83ABpU%kH2?S<<LV^?D!`qQ(ZKLGl=*7K&Q|3~}1
8554 zNx^j<_x^9`M>$?(VxoBDKub#v^9QdB!?X++dR#pN=>`9TXGctr*2k1!XnHVbaxi?M
8555 z(}^LO@~S~U2lT^)e!c4g2sG<Prf)|23Z#c4=@&cGOg%5ZAL*NrUevli_4qhBx{knf
8556 zuvJY?^e<{N=1%sP7@G0Ua;Vif*%8lR>YkDH6w8gp1C|Zc$~psgKGOFgy_^x~XHHpf
8557 zO=53=(YV!$%Vfd+u@U@7!QY?!a<Tq4Bi{aFOUs`zZ;R=_CbY9|FGddTUnZQsgQ1>p
8558 zK;CvddrFe|<Z0$Hn@_P9c<Fzcc*a!ua!X4_YyZY-((R6p;}O$=<NND-3w&>Z?=A4X
8559 z1-`ey_ZIlx0^eKUdkcJTf$uHwy#>Cv!1osT|Fi`>M!R+L@~|-WB_fmdn)JRB4v=t&
8560 zgn1H<kZ`nwXGu6t!if@2mhfB&`G|qn+juv}%fbICI3DHcD~-=aa0N_Y?URQnc%-SX
8561 zH+GpYUGS2>hBT!2Y5>BkAbn*>I91X!1$WXvKWSd4=kVDHF2362bpZQnc!^pT_gnG8
8562 zD+hfwh<@g25uOi9JRiyF>u^X1BG%d@gnTZ<OV}-(wWqIw9wv0+ll7*OXgM7H_-LM&
8563 zlix{se6>yr)*`r*?@__e5W{>SI36MX|MJ==_1ISVW8xq2158S13HwMmT*3(w&X#bo
8564 zgiR7|lyIAb_el7Ng!?6YMZ)(aJSJg0AE@E#EMXrBhf6p?!r2lomas{}jS_B?@E!>t
8565 zk#N6+uSocwgvTU|A0+up*hj+Q5>AkCwuFl%Y?5%Jgxe&%N5V%W+%MrP622$lF$v=b
8566 zOa2n}k#M+#6C|81;bIA!B-|+BHVN;M@DU03OZbX}?@4$}!uTPQzl41x94_Gm31>^V
8567 zSi&X=H%hoo!h0lqM8f?Nz9Qj!5+0K<UO&`E{Y%(K!r>B5kZ`tyizRH5aHE9VB)mt$
8568 zM<m=Y;VTlpC*d&(<8!6_684dBxP%iVoGsyE37aI`DB(5<?~(8k3HM9*iiGb;cuc~0
8569 z{n8obm#~k7!zG*`;cN*POV}jgMhUk`Xi5|F`)()(ITbYD{oorLd=~P*xi}s<V-oqJ
8570 z->Cg>q?!IZR$lDqEB_mb?AP0oCm*={_Y&L6b3TCi?<E<Iw)Vr<tIPg(HPODj=*LI@
8571 zI}JIE$J(#m<1+pW(QV~9-#YylB3hBQwO{l*k5**=G169^@jvrr-+wG5hOn(X=M$_L
8572 zlK%>9E6@2v>%S5bL)=!Le4omX0;`wC(EX=iTY0U&iTqEcMCsbLH<9NY>=GsX524e@
8573 zbH1_s52ZxO+R9t#eBco!`LCe1_A~xxzC`@51PO6ld2MB^Ya8)j;uFV>8x_i#wQyNY
8574 z<Fe4O!TE#3gN85DSnitK;e*5ZgY)~D_|VXB?(p#N@JRg*m3DJx>w9EPmEuh1+vvcl
8575 zn#)?B<j^0~8>lU7Qe^San!(V2gr$sGwS@4Ov%J1EnHnVK*U;b7D?(pn5?3U~5XFFo
8576 z{_L?1{mv;S@u;&{iJ>KE=<i<Q&~I5}2+npEGwsq(*x}G0zT6P(^|v7u)X2Z`eusYN
8577 zMw9T$x7xGsK8JqY^@d)*&lZ`nfsudBQx5&k8%*jA-zvZGHHSWYi=i)%6&eE@`IFyp
8578 z=ywYJsMC~pEj+<2FKu-XfIvJdb|gH#Jx6jWdlCG^<x1!RQkN&;$H>`bC+uXP;wyAo
8579 z9RH%r?TN!@q)3b7hAN$bYyCw8KOxZuf?#|YnRzx)*0qd@v*YcXnWEyWLFU<r6!+vS
8580 z$#xFh&vR(3VY^KSaqAHzd<YST;yxaOz&?f*YTPI1A==_ML{{8!TGzG@5I#XT+5Q@W
8581 z<GvuAW|zbP{*rLW=Gn$^UlGo+{|sSqUlR`7=aJ?c!UgsR_>DVBxX_zU8cPu=@pd4Q
8582 z(#TY=4_e2$G&09KjM;hAGEgt@b|QbgS_!1m`ydfpQQJCi1*HWv(&+6;Rf4JlDJ#6k
8583 zNS3O&r)iyc1EqCP+{|~Sm#gl$j_L}quJ`hLh`2Ph6~QKNHU;!lbs*T{ok?~2sq27j
8584 z_g+AxzeaX?7ZMquk=@=ZA_FzD$6H5au=)vj_IkMmK5mHCZJ+l#rsS$y5cj0z`x}$C
8585 zC2U51X>rXgr2Q|dcsoJM{)l?q!Q$F>nDM(<+GH!<E=F9uy$_h56;8DSD*-T;RjFft
8586 z;>32aJbqX>KFo!lCk0aDb7>F{|9db#Z!|#7aL8duwEX-lL4N3_#U@w@72vWHMkGQF
8587 z`-k{R7-{^3PhAp55%wT&awL)_;Rxst+2@o24lXTQVcAm*{g*)qIG543{d3Bk%3MqA
8588 z9r(4UF@BD{m#Nd)4z^o<dI&*L#D4`~-h#Vq5Bmxa|I^T(k%ojMTH}Drz9=2Gwq1;0
8589 z&>bL>`BU~dbF#VSu@`0`KH26bb9>Pcz-e|KnaY>r7d}nO3jT*kj(wc);x7S*gE%G2
8590 zvX`*r1@=VBsXTzxz4ljl@MKr<bH4pn^6ya4c$+%J+srcgZBWMB{SlFJCe$pj&r{6C
8591 zt1U8D4FsFz<)aAueC;e*-c*p;7ic8M`)?xiG)owAhEYx*P*1hzE2`*ykpyKTM+;r3
8592 zk)B5AA}y!b$SKz>C6Ke4axRB{VS9;U@x1)x#jX-L(}`Rx`e+p{(NsBLeG1gtZ&+eo
8593 z9cvBV6L>1!5tZWE$`V!6Wi;&>4sFQlunhtVlwG54MWnGqo#b1>d@qf)L%rBx73DQ3
8594 znslJ|Rn}ai<_~w&>Mc|EK^XoGLFYzTYxWKFW!9aZB}bDYobnLh0(-qW3r`BYKY}v$
8595 zRf>(q^7cluy-_2|OINmkpgSbn`%@yDv@XeB?X*|xlr--w^q%%LIwj=Y2{HDyqJJqx
8596 zZ`Rr5c+08(bsAwk?x9lkjJsa_25{%kk%1b-mg)>4a3p=H=5<iC%cC+yNlZd)8VjN_
8597 z_DP)nj1SSOIfMZ*y}lA@gm`6~g)vNJ3;;TkC=0AI*eb6g%2KKfwze0DvTdpi_7dDW
8598 znZc5(u1p;Vv@6T1x{}wm)#}Q^I+)$%9nobPltlsiAiqp{M7%v7G2PBatQw;`14_rG
8599 zzbQnhnuE|#D?NtLDrUSNj-bY{wqGa8Z*bKZR@fPUGT55bn2sQJgD!n(!xBrKNi9bM
8600 z&Dc%iGnrKb(5`H428GhywKWQ<l6&jAwLRuBpCSt8pYZmmNd`KWtTb?_%2MNqT#fV|
8601 z=Todk_n>S&`VuY9fDU~zX!g*i8BgNh5Y@JsK=d=BH7JCdNOT}f*n@u>uS(dR@xuZf
8602 zSFzkur9>O>u(~_`eaKRinnCQ|dSXq_T~u-RHF|5NW%W8&%$E*7xD&E_t68o!_?_u>
8603 zAK3*SUcDB^5IxzN=y-%^Sq#zpt%>6AGJ>pLHwsZUvI|1lnCv<`L|qn(a=9St@{S;5
8604 zfb`-&AoHRNPl;vsY~8dbzPFm@!j{`!`9f6+mZtWoJX`m!iMP5`3LW$5^(#SU0lCjG
8605 zdA9DO(3zgC2efb%wz^z9!f2q?c|s7X^Vjw=((1e=R8%JpH4-VaqqI?{SE#^<E(6`D
8606 zSUUIC-D^=cHLSOq?%w*ZHNDjw74EI(LZ4m}g^328AIs!*_ly{{Oo*s-mo<XuQg0Vz
8607 zDN?p+_L(lbA2UN)pNpmZP!QVZ8Iw`eK3g37^y<c50T&Bl!J8w6l|pFgD8-4`QgkU2
8608 zuFJ?3Z<~hBW)yF4g1>f4p@%<Cho35xodNSw&A&%3y175j=KdmX)7&3tbN2_F=KeUv
8609 z6%*CX{c$$;)j&;i|LqNs^$5_cGRYtptrE(+KUK5f0tjZpDhQ^r5<XSaQ3(j<uo^H6
8610 z=(dKf>;-CACjz=tJzT1J2D4!=`T{llh&t#V=mn~jgEg5^=>@9P2-K+b0#(`vH0$bi
8611 zRiX<}A?QVgpcfT_Ui1sA+ZdYc9V)a%*t=32T&npcN1=D9Pyj=NG1)sb*?6K_zjvtL
8612 z8lYMCw5x&1+%XFE5x=BCZl^&$V*Y!CSzc%%|FJA24e}B5|5YTzkC@?6W_Y083}cHN
8613 zlO2n@5^kctVRi?F^<$P5mufx^i8{M)m>oCsXS}Y-Y2i&o^}wXp7b)nn&9L<iyQ(^%
8614 zraE-$y+BQ$-{SQ7*}9Xr^dS8<lKc25TIs2Ud+XP0vUOMP(&=MTaPE}u%iS8^2)tK7
8615 z7XR#ldqPvTm<If|>VbR55KU-J6zzd86e700m9a!l2QplDAYaEey<V$@iGA23u}rQe
8616 zC@~HHRj;OdwjO2!pA)~v@?n=aTugUt*9j{-HhzK;(cG|lwjN<GyF;jS=ktUhx}o>I
8617 z1wP{4&811-2K;#MC79!b74==Da{i1u;B7yvat_0=yzS>yPA&*}+sc(Q9wBe61ab~T
8618 zB5(V1mBX)8dE57?oL=DLZQrYM9)mpI_5-TlPY}o3s)T2F^mIU$;8(yNT!OcKHdBY3
8619 z{!dHrxabl*E_Mmdb@w&U#94Q9u^r#uV%x)|R$xd1i}@6^w3OYOfy@3mN^5!Sy$o#o
8620 zE=DHXtBHl|_lOnRONp)XRsvJrTk-4ieugNI_ci?5=x-At)<-=&pP-}(;cmeFdVOzy
8621 zd@EuCT;JPfeII~|mVJB!e**{jdxCIsfa`nv3&LpuuJ7$H35Nn)-`igi&IxdRZ+}fV
8622 z9N_xi{)TWt-~;^HCkYoOrjy1}L`o95zPFV|rY8D4KwKJ`lgRbG?NKj+dO>0*^2aMK
8623 z2rCo0zPDw4pUCySE$jP4uJ3JG-zOd;nXK;<xxTk$eV@qnz1>m03D)(AT;JPiiq_ba
8624 z$o0J~>-$8m@9lo-N>Fc4<oe$3uaTXJT;JORG_pI9>w9~kM)o9feQys|Tfwt8k?VU~
8625 z*7u2A-`lzBGsHb<1-ZVrxB2z@-fm_g16<$Rw-dAiT;JPwu()=B>w9|_dqJ-6e}uSr
8626 zn-!SE3Z>e~Tu?EVRjFe=V9~Ky-*YAJ)hl_O)Wb=_N?xzreItqy72q<=XIAb3u3vqT
8627 zl{-07NFxjCRI`fqU-Sm~xQg~KcpIP<n1LUE88f#7xr7(~18{PHt7!kCZZJSvfU9VK
8628 zc?EvqIndW%@c`hQ09Voe#r*5Ra0jlU{YyRsTo9N@Ih9F}vp2w1w7=>k;`dt}%_^EY
8629 z#M{i$|28PoR5G&(aFMH0HXz38P*rZJRHGEvfvO`ZXi8$8^n%-eo}xyHWb@Be87RM%
8630 zH~>F>S#T$E!R?m?cOn`6^E3+=YQ4eQsSl{9`sXW_CXownf0@Y9LKkYJrx7X(ZX>5$
8631 zvv9$E3FTZ4JB0m96fKd+1-HLS<Z!|5mj$<By+l)S!Tn26>*}R(bj`0dcoK@zId;MA
8632 zujYsOnzldEG;PT0Qi@)~-B}M{ZZ__;GfV_KBrClG`xM=j-IpUVWB&XG-~!eFq<41x
8633 z21%}OuEMXSO&^ce2XHMS(gTp-sosDj_b-5V9jI|i=o+s<##$-NE`0!IGM*ip_DF<w
8634 zN0fGlmN1iSJJ`^y%u4~Qo_eAnW05{R1xc!z{{+yD^OBx~{)ExFdm(;QPv(`7iltT`
8635 zAJE?Wkm}yLXL)D}g=JCe=}7Il$WqzV<!3-b+OIU)4ZhfuuBEXV#4Z)&Y9e)(>O)6+
8636 zkw|q-y`}n6zrh_bX3@YQcKEn3F6v9=euR8`*C1&#XnHRK@N)ul0Q?z1R#-TA*its;
8637 z6RYq$)9tf7*;pd2hLAq2(6@z(Le=EKobZlD^a)D%RMLJW5^#8<nyJFzS1?=OL`nWV
8638 zl4pStnRvGDULFr3uY1s5ttOi4Bq4hqWPPs{<S#(h86Hd{z~Qn(R^R6&^$1dLF{!G=
8639 z>g(wE8KQq4VY2#WoMG~yuxBIj)N!QMcdR6G0di7g<!RN{-DTKN4$*fyCM#CoNx~5T
8640 zM`zS7jRrgQT@VvLI41tqm>i~?cr{e#ut0LK`tFM1y*SF7^D~L>g1mBmDM*OOV}c9-
8641 zlJ#dnSO}=2OaTho6o6eC8?J7pFCZ7wg56eTI(@T>o!McL^rcjbYNi`&N3SB(6+>os
8642 z?XFdH^d&&)lb6sZcLM40JVjL-uRplF*EPt`mWM=W9{N&sbGZQiF_K;ZOYd6&oCIL?
8643 zc?3{_P=^tr>VHPcHxS(utGM1T0JxmMegMA&khN5(`N1J8VmY0Ji;Zlobl}AJLysqf
8644 z1Qh!E5F-2MQO#v+=KU$ufLYH9=~R)1>bClBlSmquCzR2^`MUo0L=B9Lt(@0{lC=d}
8645 z4+OD~1|PsSsIEFJ$<mjg6S>i`?N#hVUO|Cq%pcI0y}AIYaj;8(<$Nvt^C3Pb;Y?i^
8646 zi-<Llv*U!_9M}hPcARi8!9na_&&Tchl+fU3pbBsIuZD~R&O0Gl4c?59ci`MXTadaD
8647 zccMjTNE3c|yI)j8o<PVuc+xZE6;Si`f2;=o79sD1e}|n3^56%6^G+H%<gW;LCvR7|
8648 z_8sy1j}NRtKZ2lJa3@-X2K^g9f72+TAzy%=xBG9(`X!pA$9f$Gk-0YaQgW`{_Pyq_
8649 zAo)MdwcXLVw)?y0+U>pA!jo0hM8Y-rvE?1tP*j39<{g(8m5g^>8%W|kK-kQIy_^Hb
8650 zeZlxNFMIJgGY9sXcU+9m@p29vXXe0O^Nx%01>O%R$IO9!oCD(>7ZXZ+@{WthR3GQS
8651 zc*jL#j!)ikT@304J~lkO<KkMS(#JWl^N!0`L1{7v_Qk&A@*N|Y%z=FysJzU9eVI(@
8652 zsG7jK-Y4(4_{?#WFZLamPu_7|3F_@WdB;U$r%&E-5!vmNcU(mF_~acI+w5Ln>^m->
8653 zyyM~#icea8^NtITzhTX|W){+G-f<DMyyhJji)(vZzvCK-xOn?v5CvF^R6B7c0LHQ^
8654 zb!@W}+X1mOr>&>E@gtr_f|t|Xcr)Ggq9&~P$aHrXl7pm?>24DKW5!BOxJ?DY;=2T1
8655 zop8IJCt1Ev&?^YyNhVps9g5l7Rto-t#!9$T{RLQRUrYg9`nk6I9LVUPXHR1U#O!Gd
8656 zE!D9Cl3ims$?IeVsc-N;{B)j-Xw}67uW%YtBcge!X2y1*5~>U57T2TiNkd1J&Uo%6
8657 zP9H9P&ol`6DI{m0M=Z3`C&fhn(M0>2EIX8Chx+7YS?L=j{X(#PBy2-7I1BjeUCbF*
8658 z*Udsx1saIO(+ygmHp=Wzl}GFp0`!&oQq6OrRyUeSji835(6IXhF=Bc=5`#b{Mu%Cj
8659 zz)AEls+a}bC+WxGF}zgs!$>nCiz#w9M0U}GUNMb#nCJi!YV@phSOw4P^)q)n0|-vS
8660 z#WQ!Be<0A%6e?b_0q8QIJu^_4)n@_2Rfk*6839k}Rfy={BfS?}=Z6IP14!u#qdY9s
8661 z%d}BuViuBtxm9k4n(p%AL;N{j_wl>5IK<D@CexX8Ei{ok5vYo0CzC}GsWZ8O05f@z
8662 znM@XHCzI9RnMwLFG28~|^$^5Mg{AiueYYU~MTuXFRLtJSSm|d;>YYeE+A0;5ojz4k
8663 zDbtH;V1+HW;;r-wNw^OQeN6(UgcOQVI{niaHa;12RB4HcpA#!CAjPE**9pUF2wE@k
8664 zbW)x<20_X=={I6ytLyzSG|}|5yDhmo4+pbq(!M36=Sz}m9)>jITTS$>!?1l99u}sW
8665 zm@*3;Xj(;srB={ib^%L&O+?U|8N7`hyM8Y5^nVt26@I6=_}Az0Hr=#0Ck6Iy_H?~D
8666 zDX{M)nB@%W-WOGtGms~Itg@U@*ZVh>-2vHnar-SoS+nuO+jou1cBTk^Jw@o#3(>rN
8667 zH)PRbyuF8&wW|k*?GIo-8MZMOGsAWfG{fa=FWL<f=@DfMisxUDVP{PMk?d57+ktV@
8668 zw)>)btoX&{czBXe5eZi^x<6w*30DvvpeeB3MQ>?oe>NbyUSjsSc-QZwh)>WEyc-D0
8669 zJ{Q~eOoCMJ{fzV4uQEmUxr{|=ypP|A7|+=t@h#m?kWb<KheYw)NN&fiN8rU1A`nqP
8670 zoSqp3KE4?>k-(Wj;1g38uv&rRFW}csI6(LW;p7C)3<6&ePD|j-An+yOPy%NLfv*VX
8671 zByeUB_?mDyfir`^H-rlkKEQ9_B;i6oX9fYhRRB`r=gc6WG&0rCnE@WRFlCOPeNVun
8672 zo&)s)KW7Gkc=ZyHN<U`?0b6ftsq=GY5C~|b(a)JdAgK4AtnhPY5J*+mB3S3=%plM~
8673 z?ErG6pEH9%M?G|{_j6_tNK@}4*yQKTAkb4Whb?~23<CYslR&onIWq|K*T_ykX9j@*
8674 z8rkjV%pfpOBYXUu83YEa&%m?S&zV7Bh}LbNpEH9%uKEaZPg()a3<BHY^vod8%t9t`
8675 zW)QfYpq0RxLEsJ+*G}NfAh3&dlZ^V~=<CJPJWL2!i&Q)KH~_}7Ds^m&6Dzx462lun
8676 zpm)C{=F%YgnOS0<cAH{&P_XBlh)w!6+`z-gu4zrkHQ9q1y-I!+1g_-ifZfT@z&kw2
8677 z7XXe+z7f>%$u7kBQucxd%37(9qRAli{0I?AnanGW%jo3bj(Z?6;TPZu-bUe8!Wobf
8678 zY-Y5}sQm~)U6@46^AhAFckhIlxX#onxyNgO6JA1Y$vsJkxC@bxyqs??5?SKU0ciFl
8679 zEAAcUnf%dE7(Jmk$v!rD?k4;RMY$3>5&rZEz@CIHlzWWiwv|X@jRmNMCBU$JEA7>1
8680 z{CRD9MTa;&(@Gg}IgkX-v{FWz#>1Ib$|%AfaLht-N7BSqL7&d4vz{aUkMNUv9yPY&
8681 z@q8t94ndVL8YHQ6SsGUYj|5CT|L<BgzN}BZfSesoIsXb!tA-sW_rgr6^R7ZnC-cxU
8682 z^&&oCN#H}v)CCOyt%Mo)NiCx(?Sx#y3ok=_asnS(rY_n5I4yw>EmO;RLMIwD)Jd)A
8683 z7|#aHhnA^}&jlQg=R?cXC9?n*Buu27O4i-p1U|G(t*Su$eycMdT6%5j;I)}$=eI%W
8684 zwfV5Ai+&QBdY)o7eokUi=PJIiu>1ok?tI-+vizxFOT9oNIetEgOr57$!jQv7e3w3;
8685 zo|-yeQAPiYBq$R(TIfQJ^fW>jX*tD4PPt|&fgH{Sy67j7sY?`#=jW5i)GCoPoyf(a
8686 zk5=IlO_c-I3{dM<#uDp#SZnYm;Aw1&&eosQYW<9p?R2X{8?w^P)}PcG#kIJxL!IQy
8687 ztv{)k#@eA??68U!YEU%kK>w?(xkk+&&d};DQ!NmNtv{yyJGp%WeVKLFXUWl|2zSw2
8688 ze^S@0o8UWs?Tl9`?TvnJ{Yl-Z5#{HmnA9KW-q`kY>rd(?txK|h2c6<-os#C~i^9}v
8689 zbV|s-lPTAV{-yM(%{rSLe>wHPP9v<xION^6o^jVJ?l;c772fX}`Xpl9hk$qE<5SmA
8690 z4f64+Yv^AY%SWQFq3m6)j->541$ks9lXr^d?TChBcs1UwJG666VS6;ZQ#5a8fO4ui
8691 z(6~oOII1<MbE_^ytksbO9r<dh`vb_rJ&0YSyNnFnPhxN@ljqBN^hCgYHPd!MQ%^s#
8692 zbsGuXB=xW|bI_3Edc98>zb4%h=oZ&Y>&6{0alKfAZcibnxL!uhr66;y)N1~l9NH)=
8693 zqiU|Cnx<eY4aZ;ziqE1<cMpKwzR|b_sat&3Xy!2^LWQb02QisNNK7bvpL{FGN8J(%
8694 zBf2FNvL-_F=hq;XId%IyO7I|(5{fiiHxx0UXg$)bj_g6bb_fpJaWx`(c0s|^6Y5#O
8695 z-3G&C>IoLC+lM-umc^fOVYc~13HU<zLk57fVK2Re`2z{8-ZP=5dRhCIDhFd$M>rfJ
8696 zG<+HKki;yyC}0Z6VrL5YV$##Y0n^>H{m?|cqJ?Ew6Moge%c#*I#UOhidH<r}K7HrU
8697 z$I9+aJ);1;!hu;#_Q_tm4lKS6P*e{gR{@jpDCbv{(}(s96|p2}hA<2-)$B%3*slr8
8698 z+CFTN|HSO1zgE8w?elmypt_WOSjcYO@eGe6h039@)j$Vg!Kabeh}6Mu8f(J5cL0w<
8699 zHR%0Bd0d^+o*E1R)duL#>g?DPD7zRnfIZA4qHAeFjV=W`=wei@8c1ESXKeMLL6khG
8700 zgGTqP9>}pl4ekx}Zt`lAYxGaOfqu%G(de`+JpFqI=y^rR4c9^3YQ|F#K7{+Oze4(u
8701 zZ;&3!2Ji`hVgT0QdjP#EEFlG!nHhM8GKA02t4R3-fSU+B0^nHy;SYtn7p#)Y=ln-j
8702 z#phzZvMQX5#j1^Gx<lDn)QzPUShkqJQWso8!9$SrG38|e=+_7Gt`WjqBM%EcNb_tx
8703 zNU77XrhrmfONVYMwVZdWqvhF<p|z|7kVh@8p)6GTIFm6pBj`)r_JYImLx<&81jzCR
8704 z0Bi7gs8la({4WIcz$avxh3JlbL7?ScDFkjK)>1#~hwUrcU<Dx3s>~xmxf>#EJB2OT
8705 zVY{ozVY}C1dlrB$L3oc)7iyar+hX14D0xDX_fg4_w@?t3OwVzY^cI_JkfJX&>Uk%(
8706 zu^`e)E+#-FuP0mnZmEV+WcfLWQMFigvtn5x)8e+ivFav|HEe`Po&_?~8tJOKH4ZU2
8707 zeO2QvXt*0dHGC8LfI{J`)%rl~=GQ?t<R&Ejl8SJTT~0p$4+FRzz=(YSQu||0bSD5S
8708 zSsQ<oNQqeSx&4$vZ!H0-F4vC;uv||92yYh-$C514G`qnH;KTS9_-6P5A-G7~4^JAb
8709 zk+0d%aH2~Uz<W$LH_^p%Wq-_sQWv|3zUUq%83+qjHC2P7w)#M@)YYf2?sMlDu3qGt
8710 zs|m1+^e}7fFBGvy^416L16R#&p;zk1SB`%n6gL2Ul-^VNm%jr&6KFrZ9rZ8l!QKEm
8711 zpesecPGOw}qBFUI*}w5QoYS*)=gBpL{s*>Ge>M1?lWPX(4)0BNcn3i~pdQ_W(&(W<
8712 z;9f>yZ?U8DY+VQL^{}FYZvgkx#1Av?{J|jqC&}ODK!mM}NY-1Q-k~l_k!(7}zY#r7
8713 zRCliL5*;)I+pe^IH0s&98O+?RsQ%96W+a;~^u5o3o`)V~knXqt@lP1Rv-K!6)BWHP
8714 zjwIN12>d0M^Zl=M`kt0GgL+ch2ZH}@?Euc7)ITZxa)=wqLE&E<6guQm71rOs&q1PR
8715 z>lUb@H_(0vgIGUB@&Hc6lt!lyMK8fAM%H*F;yTKzY?+t>k9!-@!}0*U0^ocCe*~}^
8716 zKzN)`Uu;|~ZtLN1*06Kao#hyI+E)uj7b6x=Wz|{=WzYQxWwGaejR1S@lK`wS?5*w>
8717 zK9o*hDqa1UeC!PhSlTlw{cWKN(FlFibD+qh<UC5vqeLSueu9w_ZvqT(>QhJB1(bGH
8718 z2cZD7zWSx2W$V$qpB}xh02OeI;0C{2>%f+Nu5eDJ4pY>_9iZhA#2)}f5hF)@25i|d
8719 z02UhE3joIY0F3K|pEEf%bR=w{gxRh~koAyNh`)F^fJ*^f4<I~W^0~~|+UwqNk5Lsp
8720 znL^bU?*sc}<UXQ11V09r5&Z!i1u%vaxpl%1W%Q-yyZTYrpChf$2mp5jm_~q4tQrA?
8721 zuNRh0(u3#$46ln>!)qX9*uz3_3kbrSN{!%M5o(l=1J-__I?D20>RQWO*|FWi%s31m
8722 zC%}$vNdcug^gn~3VJ`}^M&67?K8Qh3gCi%J>>);9|3o&X250CRd<n8m4I2Cy^BTiR
8723 z^4G$N`HsF+g*vYzH0prnk&aE4Lu>%tTsq_%P(K79+_l7zJ|<;d#qmVt!Z2O7?)_%X
8724 zF?-NwgFuT5|A5~8c>Zxfx;;EEjHqLMscLlt^P<<js<VLpUlXABhDL$t%xq-;mGBj!
8725 zPf}N^PI$aEgfq|ypcqmHU>$+k0PZ0$8Nf3H3IQA?FbqH+Oy$FUN=?rHBdRx0bv%EC
8726 z?wFH=Fx63*@63tYdO)}3xw;30ee;A569;`wh6={MTeW@XLAbH6!T-p0gKo>e5l&RU
8727 zzSMAaDfMStE<J-(Y|GsynN(OqUuuH79aL@G^I5q<2Nr$36w#wt>ro4dMh}DUW)9j9
8728 zFA&Z;+OS0Bb%qY~!#6>p{ZNeoKtJpYAiPD$%>X;gzgFG`t+9H+V$r^C73AxQ;q$_P
8729 z@kd|kcp0<c#BeSpb7FV}0P9SyXgW?dRC}n+4%Isi6z?N`H%SwH_~?~@0&vfn0JwVk
8730 ziU9ZDpK})a7BY@VNBTBkBeDSuD8vTQTmYD4o?J72jD`-MT%$|BP4YX+{Jv0WT_B64
8731 z_Y?tOD;xsAOw!&GQkhzqqKXmkm9(%2VooT239H4-a>QIlfJWR2z{>x(&~x@x2V%~?
8732 z)<j*7n@{pxXB$&|0GgW(4R+$5Ttmks?KD+r<zK^L4A<u%deji9JWzPuhkk5Qto+VX
8733 z3`Cm0wxS8$<Iv>C&?p!k3W=Oej-2rH7@BB$p_7i*kSHoUtzj-CnbvTd_QI!8c;kfz
8734 z|A5BOW7Y)WTtEZft*&Fev-S5G3xMO+WCCpcwEzsyKq>nc@}#OK9G;sUp2r-XH_4;h
8735 z)1$%zT79YR>I;W2ZJgvah5+*_1At?|Wjs~r3Ol9KHZ#?5+COaN&y%!7q)pOkv*NZM
8736 z)qMmS!x1y^>)92$5OJCOWx|vWrb`Ty8cM17(Ngadf-DehjFoET@0X-7lI}H0SSZjZ
8737 zbZ14M$dMs{`aY#eW~zLVJZz#VH`mnfnY3t|U4z1|5`xiS4rLh6H1f62#ce&P%haYj
8738 zM7G1W3FicG4tq)vj)B7t#imRvF&a!K*#bc>1d_i}5c=s>lePHZ?z;^SSDc*D&p~0W
8739 z{40f?L+iZ}RjpxrCBBM6ouP$7Uuz}wo{01RBSz3CQ9=1jOHH=q?a?*1QP@9r6v9f0
8740 zwQS`#3Nf`AVTiec%iksO%b?91iPr<88B47E7lq&o5Nt675f^eb<*?#Vd)S4KDLIPH
8741 zafsh|<aeB8bYNBfLi5FRziW{5-9o@l<~1W&&z|WlrZU%BtE^sDev1%Z2Ms=VG%%$a
8742 zE$wm#l0uo<1QF$^$u!rhj#?=z-)X`$K!G9E2Kb?fpgYdg@iWy}amSOA)(`Wq)xu-?
8743 zLHgXZ1Wp^`d!w+)(r!t(`&2@&`*#l-Ygoh16;kbbvjx$<P%Q}S^F1R(9IPzj3qOgW
8744 z>Ci2<&R0a7FjD7EZ^9xEFvKkKuvcPL_-m{RCt}3cw-UcfR6w!CrH0Lu4p*0?N)TO=
8745 z9|*#dJlaak;ZwD|UWlpX3o%-5m-tzT$J(8b-M#j$3G!5)iz&UX51VJ<0Z^Hz@;$5x
8746 zd=K4WH{YvG;Ctu}_Y$1A){7}U?v56riTBwU?r?Xs2$k^3H1E=8B=SxTxJsN2W~H-{
8747 zFYiv*sEK@ByGSz<nph0Qj)T$DmC!^!{=FWQap{C6J%BjgorjkG4gv2j<*L;Aj3li{
8748 zP2|JeWYETE5Sqwmw0Qs$@(4{%z9U#tR$pFySy@BHA{@kGO}Yk|@$OVq`U=GHPW@Pw
8749 zJ_a-KPJKX?4uUw|sn4rPw?P@+>6ezi1+lzS-&d335%Nx7IcW-n@lL<1)cJHJRk<e3
8750 zLKN?eVWq_&<emC=RqAZ8>$Dv(<nm7arz&;6VoAMMm7aj+yi@<CO8L(kyi@O2*34|!
8751 z37e@b=Pmtj0_H7!+e1D6jrjIor`riTQONH+OCo;#MIh7f*yCe2*Xgq);;&_5duK@`
8752 zM9-424~=C;cEW8s&@a{#ZU%f1x4jZSJuI*O+$D9$AUK@QeD31wjry=$KJ&SY&wTFU
8753 zyNi*@KJ&SY?>%CLzNK*p*7^14E`I&Fi(h~4;(rYZ{M;oEVgt<5^9dZ-8|H_}iTZ`U
8754 z@8f-l3G#)$&wTEp|D(ibj<X0J0FTccXA$HJecu;1ASNxy7y3SPoJEi?^nK<yiy&X<
8755 z`^<3`LB7!U=?}^Zf*(+hInE*}oiuWsMG{}=`{X!_B)-u1$#E7*!<d~%odETMBuw)y
8756 zU%WaAq%w(Jpie$`N#YBApKSF@;tPGBeD0ETjAXLaFNrVoeX`Xr34NmF>!`SEczqII
8757 z==;)CM<AP$_(C5W2J1kuC5f+YeR7;d5?|>1<T#5YzR>r{aTZB@q3@I9ERy&_-zUde
8758 zB=Lp5Pd;}^;tPFWuF60@Pg==*q3_$4xEcAS`I=eCAYbVFZYO93`9j}!2a9Xt?@0hh
8759 zK6l|pym*@xsC|fPYae1Pt5U~uYm|<a7y5p4oCUvp@#`;NG}TmxO5UFby3^)~`u%yJ
8760 z2mjVH$oJ=go+N~1N~ImO<Rs*G4Um*X{cbyP#2z3)zS~YTy9k38a!ZWtBD@wUsif)9
8761 zxD+phubK>V1TRj6*dLrn>A|PaQWG{2_5^pMnI~LL*be@JG}jOg1oKF9E#c(gS%fze
8762 z?ik!en(GLs1^KsG3D*<O3@#>o1L08ceA3*=_L>uXjPifT#ui4y)Td%}H1ETM7agKv
8763 zd><ZMz_&D3a0Y+MXc{}1OL*bm5T6_*dvFmy%1I0IeR!~ZI7%D}@_l%)Vh!M&Am4`v
8764 z7e5L(+==fzf=hk}xF9%@aw@r=-y7un@L<)S5HIh;<8A7Ib1RUn--pNB?<2yz4-cNF
8765 zm`xI2T?gl?e*(6W22h-QnUlo#;X(N_Cy8%+gYz^Czs&iJa{7RJYH+@yib;GQ9xM|%
8766 zTIfQJ^fW@{%N!%8T(j`Y9DeC<-iHU5C>Ae?@27%QB8Tt8gYspLVZB6C@yi@;Akgl|
8767 z5^GmlYw*Ls)7Tw4@56)D)1j`W{mP*YS?Tjoslf{si;_N#aD_giBE!5V57wwl(JLDJ
8768 z)QLWPPac#bGK_uXh>WCFv|NLtsRt(UJ$bNE^M|`?%PrF{+VP%TYr)M2T4NrO!HwzZ
8769 z&yu4_5stTifM0nreI3NQ{|H=OOl#1*m_Eo@^J4lZpu$^j{;*wTavI=T$sX37fWc7S
8770 z-)d0vt_(0%^R6_!q)nwGW<CY?c8%2ej*IYWyqo47$s7#tNX?sh8*JygQRjAXgyY6&
8771 zZZ|SFE0ddbJ!Z4+?TF~k&AOg3Bm-Cj@F$?^#?88(G33CTYxBBXOMVhDrX1B#$<;=(
8772 zc@M8uJ{BRHLR{X%v*8+*r~Cw<6*8~YM+0=H!dCKHow(JLA8f_R2U}qz_TmRyh@f?>
8773 zOnyS;+M!iiNKXA~d`DEJ9Z}Qn(0OI91c#>wRd8Pe4pZ(PnnM@1hZL4|@6p4Yo2OV9
8774 zx^JTP(Vv2K<ELPrZ+;H~I7$IjN+ogcM^S6)cgmTyJcVRls`-2j$XNlCO091j2mH9f
8775 znRb3L@J6TzZkF&J;Mw}s_wV$6w)4j0p+a3FzOs5kr{4v<ub=z|?=%73(`Pa>{%LQ#
8776 zfzkUgsU5}j=O@KVcjR^FYLzSwX1rAMQB1oA@Lj{mAEN9xLDIl<O4crR%S0q<MKt%;
8777 zQoiN@*`p$c7T~33zKdcE<~;VXNdO)K@FszK0jSBK7(%wsg>4^NyBg0u0h*-`2sFzz
8778 z1jy3qY=`CSsg#e4MYwR1!?Fnkn&o{0WNADHMB)2{{4p4z2E;Ig%In8ROC{P7Nb{7?
8779 z><7&c42^p$Hsyv_Ok+kU0up}Oiuve0CdCTh97FS`Rx}43nw$q?Xrc<FISN?)pQC{<
8780 zrM(Xess1}><e{4Rrgi||u3bv#A1Kwpm+2Xo(s^r9$EJENWe+eE_B7R_Q~w5ZAbV>=
8781 zd<n{#%bIOqPM;F1D=)KDV?G35i;M^T8S#13P0^C2glhet{4nWPND3io@KFHc3H%*E
8782 zC4ii9!to-^L`Q4DFQ4S}<J+R1sA}%%*(F4UthepGQG&rE5Pb(F4FvE<0zCnwVMNZ^
8783 zE7Wg0B8O6BL%1Kmo{EPHhrL2^6cj~}#*EkMjGK_!S5m)5>iH(s?L)&1FOh@=aL+Zu
8784 zX7pXH^<4wzPlU$K!V<5Q=mw<f83SxXr`T^&#iO?W#F&ibCgo_9gcm745K5NA>wfuu
8785 zlVXME2u(-i<w7+W`&l`SF}zWisf)=0#YA%+0-gZJ)_9wvXn!uD)T6B5bs|CkVK-=1
8786 z^Xv}dNsrQ#Dv&;~nGH{qpEVPSx=VSKbk(zvs^5M-MnAi1w&O_}{RhyY9Cp=jn0gC-
8787 zhQ1G(2JJKl=s6MeHKHFAeVmeq%mvDUS^bvd@~?=Fqp07}4PPhPfyDb*i1p{gA@v8V
8788 zPn3ZdAFQs-udKkUx<Axwbmz)paj>j9TMg&%H5rBA74h9vwH`C6!F%af7XWwwz-RzD
8789 z7YJntcBjpowCm7;#Ai8XZ55(A`s{mmQ&K#7xJx0x8p2Vv4p!o|lLRLcl0d-S@HaE7
8790 zs{lMf;Bo+eXP!HRdWhty-IczBZzkZ_gz(A4$Bu7UgE-VXOpzjeF`L<3gd}?&fEfS=
8791 z0LZylq@O9$*F;O?_I-sWGn_r{PShN)OcPitO+8F`?5U?v9((E=2(S-*nu32LEay0;
8792 zLMwEdH=7Pxq)qX(SU<W0F7WD0^;fS`Jk9nm2s29PWdo4N^Xt)S9LlGaNWM^%s3kxp
8793 zZUT@qT?DtIgn#Syl{b0J=R6T@MzF9;gy|rwXQ*24<ngGJ$6uX1TwFPX-=CqCwnoAK
8794 zegWcWpTcrZi(6x@wt69pc$`tQ+R8+A#cjO_d0XLb;wkKn{?v-I333Z0bsjAEZ<EU2
8795 z2xi2&JK-NmD!UthN^Gv=-6yHkX>_Ypt&?j_JQQ-Rz8uQHiLLPKLeEZTzM+@yY2Qyw
8796 z>8$WaLc>mHxyWn)?`Ux$^4`{p_e6yEr5KtQgeG5iYAbdd`D{XLPS6U!bMTbb3V#v9
8797 z)ge`vQ5mkiQLgwVeKZR=Jxx|&HhC#wu9lD@UP#?Why>G_9(Ni{I6sEw0--U3{ib`J
8798 zvR@QKv$hpY@_i1?ni!h9TG5n5<lGTM^K>g3J3{ke49#b)XbuPsy-K?;1~hS27O*=y
8799 zH}?9*L{mjE8g?y=slWV(uB0q!MOhFvCY_-`FQ!3x2`U;R#5@oO1_9LT9rmDlMfRmE
8800 zfUZP@UI4kQk$gm`<}3EWTST!uMDbG12SJ$4iG(5Oi^elb&q?O%F9p@iQF_uL*feYO
8801 zF80w4>Yzxv-3WrDs*aF^DM*7NbRh&~bAF=p-9~JogPj1@cOvC1)2X@hF$Ja$O&a|l
8802 zpy5i4G`wh-3m}gsG(NJzsoR33LepqW!UFc^Gf5R9SSP6kS`N#4b|)D$LmV{ES%7h{
8803 z7R6T~D!h@XE_sMWdy%M~EQdH7>s|&{Jz3VN7Xvl3F^xU~RL{nGG2@Sbg|C*}IRzhx
8804 ze4#%-3PkHdFb&m@U^<!yf;ng%2<BQjcL)<Jg&me2$rSo%v-fWFc+Bk8Zna0q`a(}$
8805 zs(Cwd$kG#l-P(i&3t?fdi`9J^zXEu{v%<!%!W!8fCQzT~N<J(JTuSg#&GRx)U!16Z
8806 zqG+nS!Jegu?oad@<qhII=nUz!T?@0TaRL8K3%qC%b~O!S2A?a6a&JAl>I@I@V|vYw
8807 zv43?R)b}xc%H-#u?yIK_#}(%d1ImH(k9P3lx*FV15Z8tKLKo&Z@lj0wQsb9Zz<uzn
8808 zN`0m3LEa4Xj2|-jYt@X>xUoT0&nU9b*QJZjD2BQI+!+HCXB01kNzW*b1IQUBl+KL8
8809 zOh!#7%~|kp&Vrv7BH;Q`yIh02KnkbAgBAneRQP-XoC@CvAm@m%I8))Z^k~=G=u}wi
8810 zS;D~;7j)B?8sl0`!PN5^%Hz!E-;{TeP)79B!#TYMGoO>}TrpPf7a|Vi*w^zbit3H{
8811 z>?M%!rX;R|PjC#Qukl2U;pAL^A(a=rQD3Uq^_9b2LT--hybO1&zfwl{X-oilJq=j{
8812 z(~L`VDKS%z1=GCljt>|D4ls716@FP5u7x&d8wMOkxC+A}Cn;7qN$f{~t3{xh?dci6
8813 z*PRh7@T3(^7Y42!wiyPqcGw{aw;-oSO@bQ5Y>e^NhOv{2Q$t+4Kypw>5M3kD4<Pyj
8814 z6RkH3Tj3ieWiL{E=`k%BFF99X33{ibKZ*1#lP)PoCFM^@IU~Yp6~syHypH&AKSACD
8815 zQsuCVaWFuHAD47KBltl?2+L#-vBIB9Dhqs{No`f&p;oxJ)F!*!=Y_-!x%+-<Okov-
8816 zg@#>e_$)!#p?oSiVo)o%Ax2O^b1cWfn3SvxZ6cLtg+Gspp5jD9bFaHVa;8Uf6!c^0
8817 z;H5`FJ@m1M&?DVh7!?!X<MH;d-RR#^*aJN8IuFFj!ZaK4yj1hcA?e?qcd>uF1kP-_
8818 z&*xq2!N*qu=Ob1KxB(1TRe`)3A6y%GUjoe<KtU#X-o;GDCj=%r@e-&1I_RQyBdSrW
8819 zy7zp+wGUi8nsrPq)qBx(0aP+ie_nD?simMD&ZYZQ(HTnUOTFRxVOO+VuHD}OkzTv^
8820 zTnd0|_wxYcTqG>Ab~ob;R@&?iycliFv>JO=!r*u%6We2|&<Cfw`ThVs^qR98S2S9x
8821 zgZnk;K^;f%k>DF5bOCr&7xzch;RD2PVb*T}c!<Eu01g4L^j!UI;n_)^H1{}UrPl)~
8822 zH2}CM$tS?|0Bni_v@qWDlJx*pq1QH`bDXXUA(P9q{zAk@7An*I2xW48_G60T`s@V)
8823 zT%V1vh0J+E?yS$)Kg_h9lLFYuahZls+cEZf-TfZW3V>!V3l9FC!v6_en^O<;4cJ)#
8824 z(0pMqoGSfLXoeYP?C*6Ib`!NKp@dfJCIVFJQL1&Ijap`5XNMvR5rjfLL?Ji>pO89i
8825 zK_{nwx$a<2vyt`&GnfouSRDX<H#7%8&MT7BH>Lo($K@^y<P<RjOiSq}g){^$)hDix
8826 z9my*xkdp6oB>$e0Qx+I4T1(bmh9!_Sf@{Z+&`hOB+ufl%ByrvNcL*^4JxD0vPx?|`
8827 zcLk~F-`-0Bu%d?(pnuN=kaLExIM1eZpYLi~i#*w4rb+TT=Goi*Ye*}kG%abBBk4{`
8828 zx}qIP(okZJL#cNO=^jcw>GJjv9e+=O)bS%na^HGLexx1A=((Vyc9~w78uIFA0!z8v
8829 z4U|Yvo&<jFGED^NGPhCUWMOeU*$kkkx=eP|WvI8q7I7K3`vph$mze=|AJhPV_FW7h
8830 zXRhQFYhQUd5M!0_Ez-K#G`@sLX&&a09*^^4BSDD^oc6)dtH7!6KsE-Bc?(SWy8syy
8831 z(jww`a_m4W+#pH4kaWIDl82DG$X@plr<~zCgme%{R|u(gaQ(#Y6-ni2w#%f-;yLYp
8832 zOJAl*<J(FpH!1hGqC6_2k5#Z(Xk_&@2m<t5)(=3hN1q|q$k!9$A_eXnkX9$;`jrN7
8833 z)jXz`j5q~ujyPAt;AX@raC5|YA9%L@*2)Oz)rj<e`?bKIK)@Bi`{?z@C^zw!fcKr+
8834 z3F!v!woH~#qqVq;fu5lUuru6z@yIW`&KN*N&Tvx`PQXX-^-9V@MB+LOcT?lt$9uvd
8835 zRwI5V1PrbR@GO9wkwP^RmPS9yzH^%HJEwcyMN%JJ;?w$b;Q^@PMZ&TI1K<$k$n_7-
8836 z*kH$Qo+gtPooP?<(P!rBPpt}W7ry8Ke-5~{iCe6Zm(s*DbrE+8;ZdzWqMJ9M{`8_{
8837 zrZ#Z`<_lTnhJmke76U(vtIXM&-@SG3ax*HQ=O(9n>%QfEa1P#ix&og9@o>IPIxN{F
8838 zJK4;2cLep|JxKcsM1y|}p!;$Fw*n{zkaJX6O0>0PR*cel#Nn(0_aY-r&+A4D!ZqAk
8839 z5Y2_3abp-VJWEpPoK+@O+_)shjiE@ve4*sjtYC{EQ8V5QX7ke4Z5465ly^6GEfjIP
8840 zl=ohOW1Vw1lJ&V8<G9U;ckp91ZZ`abchWU#tg{;`*&;M{BfNAK?qrM5xG}Ie@8GLy
8841 zoO2FH+>2`5`T!mQ;|{*A#(e>)yyO0+#yXp_lJ%ynu{;cf$ATp5V?oB=4N14+PPPb*
8842 zbvAS*>kVCFUqyz`>8uGAJA1drT?ty=ac<Xm=R~r&UyXYm+4Bw_Qsei4fp^NN@jTOs
8843 zcf!8$cOZs$!l&bILclxtg&IEtvUn#vJ<i$Z6#SbSzZpf~oqF!L&q2vM_!l*P3n+P~
8844 z6prP~%$~TDEkfg+{Z%Q$#t#Mo?}U%W{}M^O6P_FQCPeTKzM;k*L)5=;CtHNZc0fiv
8845 zXw9P!TC?uR1!!G`?p;nl*^y-SRXH`!E#JIe>43Kp|Cj&hNm$PgU+=3*h}~D!-T}ew
8846 z?x4~;rZWEDIUv{@b3m{!dO)!3m<qsOE#L7C_%#Ov`%Vxx2L$`RAZ!i@_Qf0!?29=d
8847 z*k=w$(+33mz9GFiAlP@3usI+YJEn-31A?(*iikNN7(1qjm;-{bW9mgXojD*F@4*fM
8848 zF$V-YJErsj!Oo5;eL%3YV@e+o?ChA*2LwAirt|^9*fI4cq?rSPv15w+$IJo2&W<U4
8849 zKrnVpT?uu}0m0ZYMZ_Esj2%-%%mKmJF-6225R4sDTY;DZf}I^x`hZ~UnEK4c9aH*%
8850 zV4oZi?28@{?29=d*cWp^aCFDie|<nO|MkZo{nsC}V=6@-b}|}Tc1^2rqc`!OK`F03
8851 z?8K`NJMlgPKk#_<VJBXF*ooJL7+<P$*ohr`*hwHWAF}+<<3V0>;*OgkF~Gx45^tk$
8852 zE5O4}5}O(AGN)et7@$6zRyJz|yYmQOzuv4B?D0Q<1Kg|?>`6lC!NX31%RNAn`13Aq
8853 z&7NTS^<gK$k9vB*!^2L3ADcXR*h%mcigE=y5&o3>wLF0>lzWWiwv{vp!gB$NFmsZe
8854 zp9iCdlFHXn<O#q@i#Je<z(T@HNN)%FpesqL)GOyeJmD(B9Rt^p=3>&MSsfa*Af<i}
8855 zG_jZ|ZtdMx;xlCNC@m}TXYh%nIQ>*GIgzKpC&g>BG_2DpHQs(60y^sRLf-<UwJnqb
8856 zo|8v-FnQ4jJSUsIYWjfZ<j7t%a&#h%KGfn+$~io8wln{lDP;<!o8y#I&SkV6_&MAq
8857 zW$Mc?RY`y!bf!#W{G7mE#H38G1ial!+5j$sVz#6efO!ipo6z)MGo{Sn$(vowezcT}
8858 zlF>WsL#0y|oCDAtDxFfs+Bb(vr!1U-cyp+9%A$(^n?t2j%I^Ve4wX)+_z<u;R61pG
8859 zKa7Oo&YTyfEExjW94ehsNp~}cN~ctvh4}rJpXakoO-*Oc`V8sR3?BH0gOWg+s{hrd
8860 zFwg=T0~dF0Dyz0qGug7aO^mwZ<W|t8y^W}NdoCh6=yP3C&QnxRpD>*=S6x7<`Y`B}
8861 z*b}BxVo#V(nWtH}kFA_?`haC>%6!G5=@X_?%0v$5s3{9IVosP&i9KODrChU6!TTvk
8862 zpX-vcMA0nzgz1zjk;9i1DX}L^r(B|`xR32KuxkIJrF1pQ3DaDirmuu<&OWx3Y92$Q
8863 zX=yx78#4Gx2S3a5@C9dTH<~Qt*U(>eKZHcZpRRmn-u+ELnY+*mRCgX=o5?Cr-Pt2`
8864 z!#CUdjY0Pwd0<yr>`Z&;(_uA8%QL5V`(6C{s9?q-3K~vtR{S(AvoM9Y7Tna)Ny^+u
8865 zMTTn~FvZo$R;UztxMZi*Sn&4bPAf!^*~++&g7u&Js7(>U<D-Igk`X-K5v-GY@V{Er
8866 zM7DgZ7x#vFrqGYvJYY7H`?U<7$un9!x*cZD)UhnB75V_G#;^9Up}D^XOK)yelZc-0
8867 zn#606*z;v%gLrl%S=F$4{94UqWqgf^liI6I@-*@=CfOU+TqhaL_d1&EWTW|G)VxP7
8868 zE%s|_(Zf&hHyWIceAMFvv$sLCsiwE0)uh4hJw77YTg<!%HB)ct-o}z@eLG68L7{&;
8869 zO8>T@M@2se89w&a88Lh2cz$r^ldz3@5Z%V=vyB>V(oZuLw{rCSrHNpN(z8>lPGtGB
8870 z9)ioLYh7%~Sw-Mfn_aYD-%5DJbuO|Z&k=~}#ZMnRLv_XRkC{xx4b>p`A$o?cV63jV
8871 zp}OKak+#zT@P-PQ`@6a$R}X@$H~s!yMaS={9sgbJV_DiO-_uRQ3jLYte5!{6^$&;X
8872 z(-@{tW0*b{ro(JI39d|z;r!7#CAgwFCAf6CbxvLvYa0dRsZ^nQy3a4&)ZIOYtlH0h
8873 z=_Y;8ZuF;Lx>*gzw;tAnR%k7`ervdHjd1<eaE&*K<m!2D6gCp}iG<Bec*aOL5|Qvs
8874 zjD%-&zD9z;bIJ6_7=4~I(t2^;AE&39Zk~+Nm4%4=M!*_?R3?+V7URCj27%Ry&T9^^
8875 z@6-bky|_yAtYoa4J914$ucU-bUC}Fbtgh&lrlM(~oZ-+&&82i_N%4UT2rkt;0@mxN
8876 zJEFOyU9udg?u<13(?oTJ%w>JF0PPR=)1-|n@PhAAioSr=`2bPf{N_=?A(sKw4f8^x
8877 z*8&}=TjWJr{jGb}4#E<BK9SJn`uUYwK%`0|T-=vYwTFNXo?VUvT*ymb)6i*{=DdZa
8878 z9H4t$4SoZ1Yw*%G^jAdaZ;sMy@IsCmgYOc0dK|BZK|e^JMX-Yt#(O~o6#JVr`Yd_$
8879 zx5bMpNR1K11eUt~1USRPP)kQalv^+9?l87b;aR|H{NlyjQ1fCg?}<f*FNow6G((W^
8880 zRkD@$p(JD=VT?(@D--Z~-Pyk|JdlAWKWnYLlS11Ev=<2ND$=^_QC41tl#HpDNvhU@
8881 zsrf@Cl?vqDBFHcx4;oUhJ3o>g^6n>ymA5yB@tH`bR^H1JUj!NNNIV{B<n<9loP+pG
8882 z)FMi%@^pFDJrFGq9x4sxm#n+j-sBmIXGwUFmiI&9q*f({6MqBHzE-~z+PR>uFtjfF
8883 z5KW$I<$W5X!quX}P_4p-2c`P*;ujl;>i<XtQ2k&`JRP2OxfbygB%a0kx5zZbntGaI
8884 zS$T_Mc=(r4G(}rIE{VynpP}I^v;4~?z7qMNU*ODt*hV<*I*C753Zj}H0ath@k~*vc
8885 z@KXTu0Sw;;ApT4K-Z|nC{QeY?1v`Zs^`)<o`;ap7kNC;`nIv6`3|Z&~{Ob3&$e82(
8886 zK}mlbJqIt<{0Fp!Z~$Z8pO|qM0115dH3+~e0K<C$i2stmca9j2U$q9${EGn85jY#b
8887 zrvOHs2Y~)P`0gb}GCCN2v8Nizlg~!f<7YW)0dLcV1~s6sa?;#FnqBz$Icf3&LPJ+y
8888 zg>;q%`sDSJ_;rZ?p@~-o*ljD(Y=OTO@>5%&c7h+qkRA~UXyUEgs-}EhDCu78GpGaI
8889 zYjma2n{L#_#N$<J-Z+US`4Ayzlb9S6KQTtk>KHMXiI{w?$nK~&;=d`@vX$w^b!!aA
8890 z?ZVO47k9<v_HZ<}{9j1C_QheG<?NG~n@nlo4F7`%R^b*Ty@Wal`!P|tbRDXOJIY7)
8891 z=FbrPjD8UWe-mCAmMr|!aW<LXL0Zxk5O_wijr|~uqL`tG(t>XSFosDZDD)Vx5fnTa
8892 z^P3SAJ`I4*Aiv6Jg(jmfwbQlH$)FKLR<11+n_+I_>xj*JSrprj*oVL%DY=fqcgIkl
8893 zxjz{W{h*%OEf8t<o9tkW1U?kjbG--koNhaEE&Mw<9?~4|0xzoPVa^86Sda9l(I^F<
8894 z3Vdus6<%FG?BbIJ*Ve*uob2ByIZXwu9&^=TArbx=;0Dl#?*ecOf$ac(4Zv9AN5bQB
8895 zwEK-~3;2p@ZY%FvN&Pv>_6tO#%({!>56=+DdqM~v1HsFNK)QzIAl8RR91xPHK$7>O
8896 zAP0eb5uvy80~ee8jSq2IlPoc47Wz`nC7q%DbR@mWVq6Gd#s&Zl01f~cUI`%nOa9(D
8897 zVikU;UL}Kbu84Aa1vTSl)PNqG?*~n8p`<&5vu@sz!Fh1CBxi^wE=P|)fm!SEIRWa?
8898 zbt6ni4GP*ajig4oYef{>w_{7MJ2LFRK>dV*y-+$bB2~VXThWHmj4d&(8PkPXXv_#^
8899 z;+gdGbe1plG*1{Sm1D+-u)n20r}keEIujcAo0Lp)PWqM;{dEML_5+~Yp>0wJYyzsM
8900 zgj#mo)tGVVDdAU~621j=-1`9HE-`tnLy?tVHFkk@zCiq~*8uP!@;w4c0ES)*AOk=p
8901 zfWghehptm!^TAlm3NL157t_GTxNQlIaUT%&(;7Fovrw?>XY-|R<^4=7GzO*Kg&dJ!
8902 zjLA3a@L{|Yo4|3Bk(iJPHHXzd8*04!;#kPZ)HHX)0R%ihVnQ!3T4n<>7#E}07luW~
8903 z`I4VWN%KpD<_&0;S0+dqX7gdx5mk-JLpLz}mqK}03MG4#MW<56XhWye+B_el4G%z}
8904 zgBfoc`wOED%Z!mX_rn;<C{>Q=EL50$@PWp}U9g85qUcgqwUM(Z;&M-+>6Fmr48bq1
8905 zMgN9}Cb@dqIC3+3w_|9V*a6Pf!-d2-;a7PYzlV4s`X`mImyfRNfa@dYhG~2<@X<v+
8906 ztnDRV3{Cn{XR1rFfhoKMX*Yo=JP*KQ1f~Ia4}g`IE<9{**MOLn?>icYp;Z#-6_1+)
8907 zZFdajJ?}E|V|+tfc3}+5(bg=TPs36hlRf_df;DX)vhr5N#PfU<C*Hr*WK9<@Hu2(0
8908 zb&f0Lbr6~(py57E^3n}M63<CQqr`LGlOGemS>jRsdE9=)i+Sy7mDfe$C|2(Ln7kw(
8909 zYuIX7w@wm<8W|Y$ZtV)gUymg3^#FDN7z<#;j{*D$z~HNe1BTOA9q5OX-h*~`=WsHp
8910 z83k>rMv_18_83*mzz0>tEW5=ltScBHf0t0Qox#P|2+CRplhf`wxy5FpXtTG5@qx%5
8911 zp`K+lM4@(MqAY(v(yJ_#ew%Ou3iTRdwgVXafp9=4eT@hGaMGJXkpYEjOEr@Gc~*_#
8912 zq5X%0FIp)3=O)D|RGd(nLgoE7rcm{Uv30>lMGKbuo)9~ors)a}wKkhIjE{DbC7WoS
8913 z)^tOuPax@e6gKQe<4xFt;wJ%E3}A3S;c)7-81%zQZ;DR_6u&LiNb={65nd`b41Cez
8914 z7qlt<SfP|U?Jj7$b($Y7x;1fIGV<@Pr(9Eo=^mK}spbVerO)cFpG!5PJZI^LBi;40
8915 zsjq<NRSFla^Rm$qUZyA7PK&qlu81M}qBW7zlURAT3K82*_wKs1j--d2)|U5R4AHpO
8916 zM6X4No)IECY-MYrBfE^>Sb1;95M9@r=y-(aL=4e`t%)Lkww{+%Yh*IJS6dV5KW1QR
8917 zULPT1>Ar4Fr2jqj|Do<p;G?RpKk)bFPKK9-Asf3u2!ybhjj&~75m1vrK-m&phLD9s
8918 zvXM-}9yCEktChGf7!a#<!M&{(wc14sF4fwK)~#BhTD8?uwc6JD|9<Z>^Cn<xYyZE`
8919 z|39D1<Syr)d+xdCo^$Sb_q`{9X1Xwq9u>iYtov0bR_-zvCO!fRQepU16as2=0j-S$
8920 z3WR{J)<Bf6s}zv7gIip75FSGA4_uIsML=HL2l9{$@(&S^b@!+daLE$qr!L5(6eZni
8921 z>Fw+TIjBXoB%MVOkPr2NoaTaD69M^hAIRk{$eswu&-y?HU62n)KpyEc_RC$6M<O5}
8922 z=>vJM3vvKf8CSL%`#?QAhD*P2LFPq3&X0u5`M?Dk#<wOC$~xtp0a)>M%1c>i$q&Qk
8923 z{NM#U>1K)7$(Z%Z9yl5U*y0?UG1tqHFP2As*V?@5gs8;kIfzcKl_B%w%K<H&;RflJ
8924 z+{wK3l^dm-6L%$?9{GIQCV92Jj(Pe-&61qKS7|S1jixJ6k!9Ii?dhq|uJmFq0Fd-z
8925 z_Ax;(=4B+T0tTe-)$QU<y9@1|Z085%e<!#=V&v6Gd<N)wNaQ@On|z$@T1X<s@{s>q
8926 zfG2ZEtHPG2kq#V#K^;OD_T~1)C|d(GvtJG8A3%QWo8f#3L-c)-pzXZ#NJBe+>hUw9
8927 zFUa&uQR=xy_FBL##Ss{9ehSn-%YMLq8nno5MF4PeTd|!9ZY#da1h*B>Ad%?}szxw{
8928 z^78{UJnpulFQD314A#w!h3pd+0UwWQ;>@;U8@kEO*31<-2!NtTN+ljKHbWQlSte6v
8929 z>&!4_=IhKjWOC2Y8TzHEV`XdQmtL$ZCIhNiRd{iO8Ui`+OhYe4&8^lGM<dv-z~pX*
8930 z2Vyz9dQU??f64_Kb|yQ%UuTMuxn4KKcybH$7`gBHb!5L#Xh7-f*|XU<=2UKewyDjJ
8931 zmnHC|b<1VI_<_a<;mTd2%ju_j)06~)oZJmA_!D$F;m_CQbUF${@EErozm<DX*K^mj
8932 zTGboQND4`pm7D9D%?lKib``I^SIftg85)KTMQ*9iaEtZqanSY|IQLn4;M-kYMU7Ju
8933 zp!D3Sx+}0vlgRCy33T7;YF8A|Zuk9)#N)R+;A+<%(XQoR_V<RX-F3R167utOe^&1A
8934 zH4G=~J_RFX=cq1caA(TrI<ty`l-#ap<+Ax}1T`srsIhWS(6Gcl09u$<ouV+wRh}L$
8935 zpE6yS*8$!dH`Wh*^n!Hb>@Gm5OQ$cWONjE)>91XvPG1aPIz1#Wou<o3+e@;&bxH;l
8936 zkNuI%%+|ep;#DKT6|yYt6MiIp!VjTcX8j!62@M!Lx%FBT*ZauBYq(L@Auk^?{*h-p
8937 za6E!M_q|6Y`jyusCr|(W#nXe@r;(p6pLYJStlxSA@|VT~`zIcnpM%KHfxY-t;!59z
8938 z93q5&mASK!Q>N)N508|<G<6o=M816Pc@E@@o;SA^|A?mSZxUYgyu5WbuQ}L%m-$=K
8939 zUhTpEA+O55#=P8ve<Ab9HzKsN1EPIfhvLQKNZT{TFULdCGQ?O302yMufC+{e??6IX
8940 zrUSZ7f@+F`3}WI0K+!TiOK@7IKQlqgG^iIE^*6eSu}m@|=W))3;0wOg&nlRRHYw{B
8941 z#t{bbJkdqOi&2*cG}-f!*v3RY5_^fbNH=MKh*HYbWemo7aBO)F@N$r=H4tW7e(Vyl
8942 zpLjXYCy0)*)c2U+K>fP`B<Z<Mw_^;1AA7Ngn+Pb<lLIJ8&w3_E&-F;;+^3st*7T?=
8943 za-C>Amj^GN(bXRzZJ#Ah0k(N>BR%gW{ABZ4@Q(sZ5v!+vh@TVpu;01#WCm|w5=@Fl
8944 z)3e32Noa5~%B%L!k3`}0(~-Llx#?#k@hB7LAn_&>?MR55Ff2yo&(xUoGO+A7Jr8nN
8945 zze8OafE3h`zEH1tUN=y!gvuSIAs9ga1XYUvR&JIqXSkhbkaYPJJVru(c<o?{LC+}r
8946 zls~y@v|u_L74TvXca%7X!{vNkg|6j%?Pr4X^@b#w@^i9oGekAD>@@KR+i|{ZY=h){
8947 zox%j?>l`F<&elyL=Zls{E{`p``dm`cCO$G$TuLOAn){g`6^D>e(ss3OlWC|3it#4`
8948 ziqwB@+Ks$fw>t?5D|d%hO&3FKW&@Zk+k*0&bU8PqHM*R_4c{QVA^oWaqKV(?YW$`y
8949 zzZ&JcLgi-3<;LqZN!&kG)!v>1Tb1V#-pNkZV8s4v2#b}wSeFy~-$Laf?C0ugZV^Xk
8950 z$PtCHhqu6&X)wA!vn5!B+XLkwKfGACR$-Bb6+n-MZKreujPf9z-5M0@E_b;L#a*hL
8951 zmjaH1!7O)Tc*2F@ry2vVw7;#(m7c*po4K7@c6pslV9qghUfj4rHcGlK*Y$LlPEhqy
8952 z<>kKUYFOB(Ap|hjNHfV<s_LQM5KGkZMTC5X20By-f1xYL@+%EOGofLYzoWru$bY23
8953 z^mgr|dlk1aiBkH+CY2|`BVUPdN~{KxK0~6;NS|Sn&akTq(7qs5clCIvD|x+g%2W+0
8954 zJ%G}Iek`~1#cW*&<0U`#t^>wkpD!4h-i*bQ4g-9lJd!i#9FzJv%E!v{D?0>3&{KA5
8955 zOpKLI>2+mtA8=*%D-t>ODNnn~tpPml_cChbVZ%i0#8MELIEvIni<HADlDY-zehnTG
8956 zU!d;SU~-|kwZZdX*^i@epFF<4e|pPa8-Tk4@l86*USw|RNS3#Blnp^KzXMY3GIJA#
8957 z=WV;p-0G3=XM2&ksUq28YO%SgV$mOg{%w4dEvCxMy&awx?6Pt3@U8Goc*`z33;+2|
8958 zIBYMx5C8ccn7Z%=43pnM>lT{l&<@(X@GjVAeg{u3<5O$+9a3$V@!k!7J;GCV8~DL*
8959 z!k6|Uo`vE)5K;0Th=u0HjiHa1H2{L&A?rP5(ddz1&pf-#!~ggu{L?O*i<bOG$J-0d
8960 ztsBD@l`RKV{3cy&FXUV1`HlW#nR)1K(zW)YZNSiuFP<Ze-$mvIm}GeaOxb79zWgS<
8961 zZ7)m(B7T!Dvu3~+d97y>ar)Q36$UZxbF}4a<=@ov{}9;A&#S{g<2SiOBdYssppkcI
8962 zME$!vG<?T<#;v?V!~cJChekiw9U4yf4h=^=(^lT0;kfS5a9nq2IIcT19M>Hh&fn=W
8963 zkB{RsZ5`Jg8jd_Rr|!^jTz6<V?mILb_Z=FJ`wk7qeTRnQzC**&&$N|yXgK<rw(<@Q
8964 zM?ce6-l5^>XWGg;H1LAnVo=#7@6d4EcWB_Hui-m19Q{mNd54DMzC*)t-=X2S@6d4E
8965 zcW5~7J2V{qOj~(}h7)mzhNJJ$aKd+JIIcT19M>Hh&fXQEJRaBY{^L6|s-Y^P<%4YH
8966 zsp?TeE4u#rgn!KRc_@-6{A2Ri3!eLdCNZHC{%nyz7=7?QQJuDrJ^MAb<I`VbSG|R#
8967 zI&B|Y=|x(dwvS!?4$|theQecHq}6Hr*y?<&Ms?agwx$bdb=p3*_EDs>lX%)bcFj+b
8968 zR;TS_>v)(}owkpy{}sxgw32z+-sg}8pTjPb-vS9fhmTwtC{NADuCUpSJT)I%VSk9U
8969 zIyE2bJ~bcfJ~bbErfkAf^PdsVI5b%t8?Z^DJT)I%sqygCeC%qOQK#l(-KXYbt7Q|O
8970 znxBoP1Ldjt*flnXCr{1C)@wXGH6QCfH6OcHLh;o64nWH}<A~j-<_{x3XftRtr{-fD
8971 z_+SMI`=x<Ru?F*0Y3x}xhccK?e~qoNNzUM!1f&~m;vd2T>Ovn-pM!ZH$^+^s;1<~$
8972 z7Ke<tVLOt7cVrBgN6Q;zQXX7wkdM<&AV30J4C50}J?aUlx1hlZJS*!dVgn?bkn92I
8973 za6S~&Q^d9-tYI`M9(BC-rBIVE!cFAy+TlE2>-pk!{DL!y=qiE0BYB@AV#L|NVU+qf
8974 zfbe7QV(BPGZR_l5NZQL%<Wu(QWQf;ZI$A#Q<{a7hpEsk0&ms5l#9jc$kjW!?ucCdf
8975 zgpd;eAgU04>|HdQsYHLSL_g&_IN<yOc#S-H(TKe2qDvz9A@XAjIc@l?fKf`5TiP_Z
8976 zlJt{D^5#Xn-)1Oyvr0pS`(ml=>pIz&=N9zUAJd2i?5hCzalD_zzCj|m5c#o}_U&u5
8977 z>C5NDl6eD(;C}mCz<uvAJ+f5xc)#rNdG^Q$7o!1tjJ_448%+e?lL(d}KlZi0Jz|V%
8978 zbUtS=dQ9KQ1|y}Gfgi@trSPozv3Iq?IFBbgM>5q5eCm9&yo2L?WG5E0bqeRb^t(9B
8979 zGLG5N8vu+5%BD$YF`KHgA8nfCrDTlJwVNl&XCaN%wVNm1L*O)ByJgaHX2<E;Ehkpt
8980 zLP7d=P_-ZZOq|6^nZ4mQWWUSoc#h#$%t|4eKvAo^9a;I*q=}ramzYf<@FeoG{~aV5
8981 z&bEEx4n^|Tj7c1L22o9vcc^4C`4#{tX0csX0kZS&L{yw>X^-X@8q1HJHyXUldKy)q
8982 z119TnBu?0e#P^Xn35l`y>K0X6*tT#waLK?<!yaH8kYtYmD35aTb1$&jC3Y2&PC<Dc
8983 zQ6%fiR)xabaqlJ{kl5Kk!6yvmP-kRlpk##z_lMixBbGB!cPS}44T<}SZjOfB>K1=*
8984 z$8AKa9u+y6Buyo8_`FGy*7A)`lA?Es;#6JtRTSm&b{M|xDI*tiVmI~x&qR6BTqgV9
8985 zh5VFSjRcOk{1k`a*M;F_vXSt)vr+#lzT@zSnL$$C-$MD+Cp4N%FdW{i!4-|7sdslP
8986 zwAY~gGF6U~p;O<}#e53hBN}{59M~BxUcFzn02}ZI!c9JFtdH`C&nU<a@Z#-alJlz8
8987 zl5G0Txe~(K30(Hu+zUxI4Za&}`astiHuda@oVZL*T-13AL1^MWXdn{KTOp9hd8;J0
8988 zp&Br9-g>SL&zr<&zy>O`c%|Ya2H!OX-y_7A*%u#G6VAAX@nyGyh=(-T;~b#RW*8{z
8989 zT9ilMgT$psOl6`AiIqr<{j&yt0Q?OrS7$b5H7AWhLnQHRmvIj$`qFH?wC!9l+sd^-
8990 z=VqYC($BH%o#g#ipqyIXr9giIl&errw4M0HG5r&*u~+F@JxAEVvxYK0ne6?AuFeK>
8991 z`%b=IL$dY*63rzs?q2lp2Mt8lKBaq*c--t5J6lUbp9yd=Y)Xojt^tZ-YXlUaS_AE2
8992 znU={e^lMF--Upt~m{sr_!|*csI|*Ob2Yzb^erp(BCNu9N{+d4UcZJ~33&YFgCc;mh
8993 zt+mxJ!H8c2mO|fwr6AWw=wjK_-)Jz-$WaA`J-wWfG1k<ct!ngKVp)DQU$Qn@{OW#H
8994 z#U<7uR|B4mDH&KU)tWW!eckwVG@d$ItEzXAS*kHP+1Avb>T>pQO=J&GAFqdpI0DrJ
8995 z<c-2HZIo6UvY%d^VLy+Uer8xxAJyg5A#bX3d$Q!k%imK2!AYBQ!=p{Zyi+>$XrFV@
8996 zLWKhH$JHxEi&|%peQ*IMoHP<i&F4BpYDzRlXE7AAURoSA@6U4e^wRNq0$;7Ex9diH
8997 zTIX)nNUk?ISy|RppBDWdsJO>W{SG<f42Dg8Sl5%7mkcpr&Es0KsCGZp<y5;j=tV-7
8998 z`CukNB-QTCx|rZ2RWY^nw0Y+%?pg3zr<LkVEHYE;bcTqk4I;_=Q$wl)dYY<Z+NBzH
8999 zFdD*lq}wPRaT<B)GtN@^Yfb)3Yb2k-VLu`5$WGmSoTkOz^?LwHuk{JzwQ`dHa5@L@
9000 zTBXzVbJ_TQE}W5kTm@dLPM_m(jqTJBwo4MU8~3ur_AXkCnM6b{%XhkrzTY^lFH5)X
9001 zYUGt8`HDmsi}6l>Sz|>%@-stP*5AsL5i_J|Rq3&BYrqunf)b+ip^O6OSs(-ttBk)u
9002 z;n<;Z*}LX|$<on0YSZysiXN5Q{IPVK_b|VhjaB{+$SVpzkrc*ZHH`ik4e_K)vS1nW
9003 zl1HCP9&KR$LAF=<A0t04M^ljnLZ_YP&a87~tb9iO`rXD*Up}LL{cdNnU>C6Q8<*fI
9004 zGyyS>42Tt(fS`D=&^%V9zkIApkqK<|`(uHL^~L_#p2_*S3g3Q@+e{Xkr?2#vPhTlC
9005 z(Zl{SdRSlrX#L{tA`?LKFDfvRK=FcIunt)G#m>CQ1os9^E-=BgxNGfMCZJfzFd_qr
9006 z{bfM0z{DfP+qQKRIODZu55itv#m=4wPR7pmXa*euulad;BsON>BzEQv$IiU}Dt2}f
9007 zoB;2mbcwwS9r!L^8AeOU;{MQi!Us^>8N+`b=N=5x@;VRkpX1!j!gyyZb1Ba6nVap%
9008 zz3jQs^3_n$*Q3l6{V@Q%(dN}qLx48sV!*~STJ*9n96R&5VrM>A?9Atio%vj`GoLGV
9009 z=5xi)e6HA;&lNlKxngHNckImPj-C13u`{1LcII=(&V26Jna>?N^SNVZK6mWQ=Z>BE
9010 z+_5vCJ9g%C$IkGmsV*=}J>A6Tj-C13u`{1LcIL~JPmEPhH}Sb+XLwz<>**#w9Xs=d
9011 zV`n~B?9Atio%z05?5v-Roq6X$`kc`{7*F`=CWHScPdABnJ>A3!Ki$M}J>A6lS5G&I
9012 z8OiXM`{5$7)nB4SK3pWWRvJI~aFN(Gd`5|SxJaz);UclFhl|9XLm2aLkyzWF1A8VP
9013 zE)wg0xJazmmbm1@MPl6#7l{o&T%-k<lAEF3FR<gXcLPrxy@$A5Cat(fn4ZS;oVWwj
9014 zS9wf##g((Xfa#wOoXYe}roHw+o0<8{%(s<Ey$5M&VrT1EX8-BGMv;tV>Nji2SZ4Um
9015 zT5K_hFn!--)qsUAW10R{>!=jsmf*+lie>s&uSdCxW%{eQ<xsIqe>GLUie>t15}`Fz
9016 zEYn}R5b5l}>P=QlkXErwzw5~%{`xAEKWPn7u}spSVww60AXHE42_Sfr6}yqKOuWfz
9017 z8=9$Drg@W9f5s2Yo2>fF_c5I*n=qESgLuZF3EyNz5@jqCZ?aN&7|ZmpmKhbx^t)r3
9018 z{%YBTvCQX*N5(SoCMyn4#xn6HD}{${ig}ZjB4MqBVk~nApru>H5z9H#PXGxbAMpeb
9019 zf5Y!FKN9vb1Dm2A&ES!bVi0$tcsL);pz_uUy!2zA&sAXml69{#bv}*22tIV-LKcFC
9020 zAE0<7uN;ZZ+fg8*VZmfXQ*4$=Ml{7{KTDU&<Ssy2g9tl_$WHJ>0@aOL_IyIgr#?un
9021 zK1v=9lJ{ASXb<9~&p%GVAgmN#lCvkUe`7ZPPMrAIyGDW%b^2)nu^)zCl1g$X5nS}_
9022 z*fu7E{biDD(X(^gSb6j*i(cT|@55_*g0<Pqik|J;(y}ikTHNP^;sc;=9Co5@aKp-U
9023 z`CBOeOqO#8%i0e7@&fHR+_Sv}zw)_(X%}kv4*(wz630nD&Pu;Qmw$$GE9Fl7+RNp@
9024 zbon5RfggKUGU7F(<x#HX9M~lwcC>u?$#OFEeP&<5g148G_EkU7!!C~;_8F1GK9jJI
9025 z0agwBtkAFvcc20v4x8tkFfe(+JT0IrY&bH1)Z>ujj_UbG=at@ZG6Y5jVAGe@tAROa
9026 zUL3`sC6@Fb=n6UN@w}>P_p<NDb@^`DIY-?R8g(y6?L3J1<tlP%58*Fic0IE<F?$Hv
9027 z^yG_F<2X=gO{7$>(k11p0$9(3*_re(s-`@I;KY+iynsXoS4Nixrl9d-U;Y!2Fljfc
9028 zoF5`Dfv(m-@K@x={?<DN=o|uN?$H2n^yFu*>F`oiXZ5YkCIva)(`~rr0jKO-Fg;qd
9029 zV0QQ+XCZjtYQ2V|K%4=*T9ne-bvYLipLSwI>?&P8h71`$53TIy$jird`9@;J2X~iZ
9030 zD>8ZmX4QU<%l=-_I+knamlUGZ{ScFPC}A(K($iBtnf!W7V_C)R(hGm$ILWJWKwD{l
9031 z(Un}3d@n3X>Z!)K>?s(JJ=sc|bg}H);-K>tgdX^w$bqNlX-FkAkCKqLr=am{T}}bu
9032 z$KDl(ec)&r`F)#(-v%jT+d43gBdqxd+00eC5m+TZ52EW4@);NJ6X#g@d<&V(dl>n&
9033 zGc<fA$b4Io8Gi7BoTt#^Aac50uo!Uou@RAQP@VKACUR@CM>o;I35?-H#9$_kLDgC4
9034 ze^MqAk06nohlJ>Pe#?}Xz~kq1D=Z)Rv7_woVt|vrK;7_1kT{CO$xOV1L<15zztv6h
9035 zF%C`!6%<zXkMYm__~cCMTMFecjoN3(xs2#Y&izPa^##i&eK|?Gaik!>tmhLL)1KC3
9036 z6oU-DuYshj$J!mGTgo|}`Vr?iRc@$Lbj6=FJ@&4TVP2>4x<;za<clC@y0jc)ZCYM1
9037 zX=~<o-6~nPVqi<{vd2q*I8W}fRl4L+jHhpdybr0G#@jInhjalTuR-N0Ru3VcbA|3<
9038 zspcn@KNjud59%Hv)SRjJG}z8qpgYl?0|MnNSwGUVG>!?*QZW)ao=a47GfV3^J-osI
9039 z)@^h3SPML4UEf~Q?$$t*Ej~(9@t0FgBx(C~HI?Iyp=vAbkS^!M{aBUj#Ynv?KWRr@
9040 z{r~<e`cF^L1CaCRbLfpo*MoeNZpxRC{&-~M1EQw#Mb7p~YNB<^i5M$C_AXwJlM{WC
9041 zoahEHNKN#-&_w5*LlZDxB6th+nY|i|nfUk7m74f6*Tk#z%*QbCeH*BWFOw6$8USkI
9042 z%Ve<VeB^WP(mj}or@fDyc(p_|SZIl!X3s=gPX4pNBbVr3nBe3OdK{R4tD78e^0(?b
9043 z8q{ULgL$>5SZUX}h}ooyr32z7DD62H(C)7S`cMN=G9J`GSeR+frE)f;n&!PO>{!{S
9044 zRUyfk?SlDI!%UW3nPFhkOEipH;IBhGabwX6;9jgN#)ann3XE}DLp@%+bB^3D<$*cV
9045 zTEqEkk<XJ)jA)P;`u`Y$aRUXR(dNMhPtUxx^EB2~5a^2`N1(<ANqlTW+TFTtE$VKQ
9046 zb&RY5g4d1Hp3}7*sC_1)mfp^3KyIbIreV$l%;6A>l^*qN#jHzFo*t(&*CLaat}|R<
9047 zR92FWR$8VmCL(&LT&`_sJJpS-(1j>{p}S_et0t{MXV}I0rVBX>2Sc;ap<(1Kj42||
9048 zM(zU5F@8ljLgQm5vUC)^^cX*^xBR?Wz{uSI8M!N9<ZghB+!daMdE__#O}pq@Xvc5t
9049 z1BE7j7XN}h(*(zgPDLHRvHL=ywuD86CU%EMG8dV{b&08k=2%~Bsy)jbP8%W*rxm>g
9050 zhVvVDS|K0W#;^ZryT}~JOIladjb8Xox~OO*{_&f%t?)5OHowW$;XvNN$%Q76H|Sd1
9051 z3SdL#wZ1<T9-j)*C4!d>(w(dMHcSiYhE#~z|3#4Qt0Hqg=Uz-qKUz~q2hS#BTB1LN
9052 zLe;^uXilCEo<$#ES_RLd`7(7KJc~XRBi6yQXueEc2hXB;@Jt8KqE`?`1<#`2BOVnz
9053 zi{Z=EP4Fy+FH<+cvzQq8&?a~mGnL(WZ9X=2RSd6WB6#*aWa?t>XGRClVrqy@2hZ?O
9054 zUu1OfEap>!>EKz+c4E`PvzQZDlZ>amV7_CP62TDrDg4_JlSTwOcowsi<mlj8%o)t+
9055 z;91OSW_0i@hA&e$!Lt~?OdY|q9`x`~4BtO%f@d*&nL2`J&!g;Th?77<obk?ckg*~C
9056 ztPT`LJ1FX>Zq|$bC(2dY8@*7LcLAdlJtUNlw_^E1cHh;Gd?CAU7a0}J7qa_qWYUV}
9057 z3)y|WWSJA4&GJwHZYvu)*Z^8_lmrgF|7IjuN>XI$o2C>mWN$#X(TgZ4P7Sa+G1KFL
9058 zF!~Do=)-E!7A7)$SnYj)`U#^0JOloU0f`afWE8~*fK7~`5|8HzBr)O+BonN}aVYnc
9059 zuv~NlE=e9*D$z+CS}Gw|WfM=y4kF5y4K78}@^9x45&4`vbe=pFb@p(x0AbGM$KLf@
9060 zKo1PcN<we>F|6oidYSUL#bEVBgTYYzIfJ42PX#V28#`mChKd0P_<^SZ_<@^<OCBEi
9061 zK5z|`Tj~s=PW}l-HRLG_+|DAT=-JaTv=Y0DY_b-Sg^pol$FR#JHtX?N0OsBTDH*;V
9062 z#jDWzga#yrSK{Y7<c9Nb*<(nISf!iHQuIRggIsuOUJ?wd@$yQh`7X7kgZU<x9k5U%
9063 z`9e6;66d<*$DaNrJIq7X@7P5q68@i}iw(MqGTlW7yO11-7LVMj8lxjx9c$F}8n^<$
9064 zN_a*hl|qrij%BnuvrR!9t<G#SnaWea{KkHN%sb!_FMIa0m`a_EQhvpdvBnBm_ro*u
9065 zT2~B*@F^AhE2wgL9Ypti86=6H=f-?P73&LM2l2VDgLt=d0e|ak^x+)@YJ8V68Rd9O
9066 zpfG*=nDIGx;@4yQIB)&<=C$~KBVR(1^KCTfm(qo#<=oBmXu1N96@9KV`~#-qQRs|d
9067 z63gf${QLvoSaNWH<^3ZoB_i*KNJgizvY%dw(;<$IYb837E0G)bIKp@rfX>*)>(NwR
9068 zxQRQ?g&UvK0LcCvh4&~Xsekqs<oiiW;s5jJC~;^h{OU4`1B90UueadWaSky38Po9&
9069 zErtJcriVDR6#l<4o#N0^`2WuIc!!q4{|~0K9a;+i7fjD^-ovl|pG?p8(^B{?o0(Jn
9070 zv=n|@W)}NtDf}LpDfiP-`0<!+{9EOxrSSXg>B!Xi?`K9^3O_A{Ut0=4ErnlO3O_A{
9071 zUt0=4ErnlO3O_A{KiMuqS+}2-!au}bh|CT@Ed{W&0AQz|mcl>5z80Bl{j?PRi88at
9072 zPfOvSBr~`9X({|C%FMlfS_*%ry%2aF^3ziI^<@@6ErmbFUV?spW(}a0_g~#lYI*-I
9073 z4$`5P_ut5*<xtD}dpTUkp_ccDw7i9!&*22da6(D86eyN*DrISvDTS7=28Rd8%Pg|0
9074 z(^TQ{?S~+C@q;sf#_NE?@k0uj9Lv(7O!nJ@^;#HzLL5kU=COF>m1u4`PoX@16w_Yk
9075 zdX}d!?Klq8qnVC#f=s8fyLjg+rpFLXf^!Yqj=c!wQ=FwNPh)z96+_Sy03wGo%8JJ;
9076 z4`(EtzmI*N(;qD_qz%E9M=ZdE9ZY+j+n`+&E@Iko?jy{_OvgF7gpqF)jdx}-eF@8x
9077 zogIX^l<6VPGc5l$(<eB!Okc)yinEe1mviBdclHzi6}4b?wy}8$>VS6Q*?HhA&eP*=
9078 zmQ^#6w45dQNvtI69VdtB)$>puFJEJyShWc0Ax<tvlURKX(pWc`t;Cw&B0b*uE7P^Z
9079 zV3D#Dc~K*AO$yR8oKuLWt_e6Fa{dm+CD!vS<dasCx~M@Kd=9%zdJB*~rvwGb@_=^Y
9080 z3Y*>d83jqKuos{iM3(6E0c}4+V~P5Jwx1U@63>)Pcu`{+@r(oX;>3VW68$d_pi<+J
9081 zNLS0uXoXZ?)KGY;WfNZ1xRH3|MUBKYHizfuDc8h$jfWRC67>OX)pV_d;zf-kXeuR^
9082 zBbG9;P37kxKae`q9MDc|cmQmbuxA?B6l;+C>EJj^Vh!fWV>}(4(`gNvhm4rODHnT@
9083 z9J-f2%LLX9&4UJ1Rl}?y;~@gx)RRyyeoZ(&X49L>c0(_bNvemTPsFg4tKJ&IQ`%AL
9084 zly*NLRZlc7(n&ngxQJjw=_5rI#o>3D6?Y5T#j)=pJYShqMx27L)E>$+;VM6rj~h>t
9085 zj~gG#D=0~2sym*Mh>~hnw1>L;BHW!k;XU*Va5L%)-i!s-u0v081U`XpfU(E#(bjew
9086 zYWcBuRe=Q~<RRbjBrE5q@HF@e(($a=iQFjMJ2sJA_z;;CvYih;;s;xP`LU<R0CsdE
9087 zsuuqY_WuoCKOF2C!)TRv41AC5F>r435o#q010s+4<`<jhH?sL(`Zn+9Zl3ytuBNw%
9088 z3T)nqIG3ZPPD%R&<@P-CIc2A!k6R{w@Qz?Gb|hnn^O$-Oy^Rb8HzLcSuX+L-@!D!U
9089 z51ykPOF>H47_y-??BY*J=2a+u43MKQM&bw(sd*YGM-O)k$r3RhK&P+Jb##Y@qf5yS
9090 zRUdy5=$5<w)f%W2K)E3xYka#dUxD)RTXbeMGU-?8OcOHeRSP>8y+(`jhvZPn6U2J0
9091 z@wd2f>~rII!i9q`8Ubk<$A(B8sn2Lg(x(PMW^-|-y@4XTk<5Nx1GQkG^JDMY3VkG*
9092 z-AHB+e-d(bfdnVB?_l<4FbZ}fxjpLV6f`{CvzfV0=9=5_4o8{&IkWJ)TiDN+$V_;Z
9093 z4cF~PS2(i1Wx~BgtFs?%nfL?Nwh~eI0mR$?ir!VW|3PGbNMKpJ1KCMcxM%rJfQp`b
9094 zwoJT@bwRfLE9xfvl-YJ3(?>U3C!9sR9Xi{YLS?e*a=_vfum0ga0&0=b2T*m{Q%F3D
9095 z!~;y+kHjG)Qd@KjZac_KDJ{5oMj?hRky!uH7wa9J2J7br>xic{*4ap;#$BNZ_*Yot
9096 zuT(H0TA%r~!CFORr1e6B^$uc9(Jj6L>-c1D=<vA+V;Mirl}T66*~gJA)cCM?IMOx<
9097 z?ko*NcVkSboa=kCmA=4LIXj|qo|RtVsyr*AGS^CP)0KAuZI`N~zTuTy@D&F(xA?5|
9098 z%^K(j0J>gdz!FKnQkVY(<v$FSa}7hbtn}e}GM+{C>+WiMGH~;S&{le$hItt<Uq--S
9099 zRWkUPex?iJ1o$1HsYf_B{adceyuOuJ=*qW&n@@h%D=>YpF8>hat*Sh#=aMZ~QrR-1
9100 znf|^D;M%?bM&QzyUZLiY!+Rv6Z#6u!phm-xy>BWQ4xSI8+2Yd!d|tzloc>t(ATvZx
9101 zwD5*i3TOI{8kqdz@!~Ky48LNv=n-N;1O)gs%~jbPSqW+=Xya#V5V}&<2@K5IFPpL^
9102 zHDai!kI;C8Cz+L8^v^=*Ck1hD!YlV9=jmCTex*j^1q`3)4nn11DQgB1JDsU=UdtMP
9103 zx4X-<!^HXlHP*eld~vATn+Isk_yIMe?-^JddK|ydfIJ{?|EUW=qyL8DWvCzhArj{?
9104 zaTtkPkVyShLk~bl<R3+SsXdd^kwdzW!WsR3n(?6T3Ef~M8l;-OCaTsDQ7etN7u$a$
9105 zN!C@0)~O+q6Hq5l)Bc0?2S7l2ya57=k3cMl5HSZlq$0;k&DFIuQREusC0Zne$T^X>
9106 zLfZrE*%}T6$dA42c660NBR#-oUt^y|U&R_~9{O62dNp7x{WM*^80CD7j47|s<!7S&
9107 zf^hlxHM+bG<(Vz642kEnZmq0yP=#xZoH+w92Nr-Idlw%po>2>1lnT25`vTfB<e8OJ
9108 zn^jYO0k@uBy**YUz}5WsQe@Mdg+!Ysw~NuDPM1z@3AS4HI0^e1+UC*|yi$_||3QB2
9109 zOuID!GhdIo%;%6e8;R4HSc1eBBvN<jCftc}1wgIge*QQt9S}8j0lUtXU4IwQQ-8zN
9110 zFhzFy5%Sa6=^>5bc{H+T+wYkU$33q*EM|foHY1UGG@?TpyE6SwpK-OKJ5~L&a!A7q
9111 z>~p%jZgV*hj4#qa^leg0bcVCS8N^W%EA^MUi|$Y%B#7t!t@J?}{xVcm0Xs!5-%7n!
9112 z7x$_b45HCdq4S)TgKd|+#O5CJaShh2>9cpe3LH6~p%vuxew1?MzoDV-K=HG(4_>im
9113 zPubS^tZP(Tsa;~|&%6&1xpj%PCj5zGO||eFEmpmrB0>AJj~R@l^}mgq{TYm;^}n6T
9114 zJagFD^I)F2>puCid~RF*8Uxp3I8%8)0v-GgoKRq{Xbh^h^UTrY!QrFH$=BMUqtS_f
9115 zw)5$cd>a$z9m-U}1E7cB{wqaZ7ZCD0<i)&a@Q>diujcK=KYoXNTCfd+;CGN;<Yl0U
9116 z-=Qbv{S*KA9eQ%!yQt-N*yRQ0`2)!p+XdCA<#*6JyU+vy^ERV^-{^Dld7)aK7L(_*
9117 z3(Qjw2CetxnTH`HJf8m&2!0md;qnO%1yq9kCO&BwSddVD6JNIr_$Um16Q8p~hp+K4
9118 zh<tOXTs>u>z+AQRylLl~1L4EffpBx>3eSMZn+^*3jXA~Yhe`5UACJUFUqvm)4OCIf
9119 zY%KuQa&mE#YC5FG_VJ~59#7OdI;P&J`lcXa2~j%$<K>N_p6sPaMqWRXK^sqQBP+c9
9120 zsB}C|zdh>T_tCo!M#_kvcsZylZjk??y74cn8Wfd#=llw3UkcLRlbE!80g^uVZ6xD;
9121 zyj{{e?=MIXvHGpXKNib3(F&DkmCV~#zha~X<W%PIj<75uoxc~Q(Yv6I?E!tqZtr>y
9122 z;4x<b&K|(z_p!iZs^KTt171Wn`IpEpVr~3Iz|w|n>@sE(*$rQk9(RUj=bI?lhHrl;
9123 z0hrXddR_iL%5Dyo_lF+X0vNuc*@_Elm`_pvV-3@R+NH$czf#xQV23rp;RFnDUIkb@
9124 zlL^hBgI{k+!c6?**ISwpkAM7n7bY6nwYs1=yw;IXAyJqB02#p6J@7CSKfdvD*8a69
9125 zh_4a_@ztUbg&35KOiN+#9!D5_QW&D<ya+P-Q5d35V$$kIVThW01j+b*6o#mIpCCQN
9126 zawrTej%Jias64A=-nJYHLln3r^I909=6?sJF?{QmN4<56F_T!vFFccFk|#htlgn7j
9127 z_=Sg0yvIy+;itb;$NsoeP#MDzh^LIj;`|T_nU7@%#8bx5q(V_9Q4HW**#&zv%O|3m
9128 zAA8rmXdYjMS2EcJOu~@&cS!euZZ_Eayl(I!w2o>p2OLQti|oBjz5t<2xJG7AK{oaU
9129 zC=(n+_|9rTS1_|$XLkJ>8SEKl&5T3HAYdRf550s)4Y#o0IUN`%*2%Z*R^4rZ?0_I5
9130 z!}w7<kbIT-)yPTa4zLDL`s|W>b)x~O;RhiasFOi*a3vhv{8vD$TwW!l^*hK8l0HZY
9131 zd9?af#J@U;X#umvuOWM5C_DdkOnW?#)a^kfKJi?p&0he|&}k^X3H3uKA@MUNQjqBX
9132 z2B2h<FZQqj;`(fIHe=PY$;AMWO@74$o1E}lKn+XZLtxAL0ZPgMJREC!3x4Hs+7o8p
9133 z6s}b@m@KY2d;R0O%3O4}cbx|QC2WGQ*z1|R0r(X^){`H9Lv{ou+}^kXwJ_d;_Y%=2
9134 zj=$+mxY~$dZKf!VS_1HE_o|-9segE{+}}Brji|a6z(bpmc$$eSBtAsK8n!?;;bf(t
9135 z3liMHq2R$r@1+0&pJ8XZfabb^pofOTDW72_zoJ33JWvD46}AT8QV9B4BW@?@*`J^)
9136 zj65Zzh3o`7&7Tx2{KNeTc4EKy!5HsYD>il}iXe143D40x$P)hi*n(J|xQiM95NIa;
9137 zW4>RKE&Q>uthSML`iEd=04!Q(ql%N5jWL+8ENr_ti7nzrTg6FPsO&!-38+~#aa3<?
9138 zGC<;wGWg?@fWHu@D-uHeMiEP*!~(;Z6oQxK$u0s=J5Un<dNA*q_N<|1WMskYA=jKV
9139 zl-LGe)MZ-<HluJu!a(UmBY=iRg$VV4cf*j?Tw->(D?0>oJWdX7gd1CNQUtz{Q^E+)
9140 zVw5Wjd@0Ckwh;a37!Ay~{icFk%w~?{=a`E@yJtwxNx(7IRA5J@(P89lKhBi}V0yT-
9141 zSwqR*@tGDAO@28haBf1l0P^%dk{z#2Au@C8jK`QxKwr@^L3vSJiw(`Sl(D!-8SC$w
9142 zVzlvxWo&?vv3Mh62};HiLqZ}ECPj)|vXQZYp?;+-4Kgw|I5dk<=|hW?QY4Zgdcvh>
9143 z4GlrWDu^jkt|%jV5+fu8@)6k}LNG>zTXE`eJ>4y6ZaKkBQchfAI2u`(*rbktln{A&
9144 zY=xv6k9NqB0^t@FmjsPtgVXJ0gH3~UBT`%^<HPG@LM&t=u^&q(hDksS#67TxVVxKT
9145 zQ!<wk7BPxM6SPofWDz!B5e1Ny>~H}#Ueh4?|2y$i(uZeMxiy?oX%Jkg(juiVHY|N{
9146 zM*8|2>GLb;qe^q6%9LUSvni)Y>&OIP;EYK*N_2CNlBVPc*T2oI!Y2;P0~8#G?^0}(
9147 zz6h=l4ntFzhD6H8Q1|Q(bIHMQQ_)9MBXIW>)Ub4nQq8YAX()ASUm5KyW2r_c$MhAE
9148 zvEkV!i=fsb3Z%@8i!A!@#UXOuaf;pWob%pK&$|`_N14TFV-}6(ij<DHuyph{(&0DK
9149 zfwzNG&cgaI-l)L@nSl43Xf&j}bu3wllhRTl3pvPWufZYurI-yd+H0sRC%h~l<{}Xc
9150 z9j-}~;@3wj8S&#hha7^DnIN0%HLMCpQ3zAqGCDd8q_kyfSnd#W(X}pZI#zcf$#B^&
9151 zSgu%DJld<!A{ie>-bdIcglV9#PYlz|?4+=CF-v{qQk5C5T8t;NuaIULA<YgijU3mC
9152 zncP>^=CT1|X$G9Ca%y;qOv}`&Ipl>*$9v19Zl1xGG>my+MkzMtYc~LO1(B*EVqq4#
9153 zhK8{exk!^TFw-?SSuiWC&1dVjm<e)ePArT89%e+^aMxRm{5Ow<9M617GP*c9%sr*t
9154 zPl;TWRPLvSi?F!}XVl6ri73E|EB)UpceDN+v;LwZy^$ER)?&>vj8pcYe`sAv3rc@g
9155 zF9zwax|S1&jt{T+1nv?N)taT3s!V{yksMl*GCL4Bv?LPczhBYrH9IVXOU~qQ7d?=Y
9156 zueGAXs|IeUT+8kirX&w5T076KRSU%}c_CM=YgI=GqibnXpwe`2TE6I*>Xpq}<CyAN
9157 zIvmo|g+uCEYZF7nNG%l6-K6kn<SN%BLeDar;aUok_nBr{XSvpdtO>1i3VM!fMFGv^
9158 zu(%Uzt}6@vO>qGuJ2kv$r@6Y9(>2}It1Ori)(}|zZk9)kGC$0DdO%@ifZ2%vq$;4e
9159 zlA!=B3TF|rGRt_DCRhW_R+?*$h6U@?nm#FViE>TPjVOY^%?lSmJ%lr~82`O#?z;(%
9160 zT)O`k8;QQgTA60pXte?5hFH#@JP$Qct@=Tc>slG;kl`L;4EIoDsfQiA?6|GessW2R
9161 zEXxR6=sCmeV2?l}>Dn2<97hU|Uc_Ok!7efc5wT~%4#6x)Y$)C0l7>Az`WhEDN@g$g
9162 zADCyYI=O0So?Qm`IOf>^LvU%HUBH=PgC!R(W!`LAvdxmt32TqZF71(Pia8pZXT9~G
9163 zdW=P$CNZJ+uxVEP!Za&`m~RYVLEn{KXckwIvY<2FY>QZ;ILaMbqF@URuvxLlauvE1
9164 zBn)vV3&Q61)gSZJ+MORcxe@)HOkU(9$%w%zAvmelBj9j+H`EmfDR$9?o=e;VhP8Gh
9165 zia@hKw+pF}g?+U`SwsPp$fAe>>E$mD7ybWPjVQ(NP2&-6`yUQixePO7Ra%A+sR~U^
9166 z#6ovPtdwdA>6sCjUJHKyS6ZJ@F3A8aU4J97$T9|DvXC1(2`&MqesR@)RUE=4=D?92
9167 zBIa0wKVIY47M^<m;@4SMaDqC=tz<yzSMLGz4uFzu^h$UK(09@0xYq);irfsi!zj5%
9168 z8%zl+E^Y=wVZ3Q!Jv80um>FS4%Dq5%J|Y$vbdVXbveO0OwL-Im)7cRPay=DA7Qq>a
9169 zD2SqQpA|0p|MQyr+NL|?Nr$|0ElAjqS%cKl9UN)XzqS$An2zI-Q(hvCd8DwLUAS3v
9170 z(%^^9yK6yQt)khZBUgZH>rD^P6=PwR7T#r7)7&yS&Sf+i2h?^F`)@6YuD*37eL`3k
9171 zrHMbrq{2N{n_MhCl{nTV4=<4{vlOzGxpiA~*CLej1t%N`F{CMdS0fC2c<J;B8NkH5
9172 zwG#||NIL;l<O+1vL6zjY2#~H{L3r$H9Y!uY$k4x9bP>yq`im>@e-(KDe=D*XVk{)V
9173 z$Z337{BYR@OtijMRMU+rLcI+P<D*CoQWB~|i-TPv%GjpS{OEQlvPQCz9p;)YDKD^p
9174 zN&w+jGqy3ph(2teOM)aU<C$9eQ;fH6%v{K?Ne!z@&L87k?u#mNLR|sP|K03Lz4eus
9175 z<dSgFh4fI*#F!{ZtcileDYe#LNr(w<U?V7l8{ue1JUVejFx2I^&|W4nQY$8zt&IwF
9176 zgf>S54e!DcYnRhvLe=QJ&vm$PB-}VQQV9;Da7FHrzEX-@F-%GkFRB>fK$cr4S2m^Z
9177 z{6nQGSqWWw!|b|5Z){)TN^=v^N9CB1haAIKUSEk6=Hs|AhF&n?#87X2xBnTD>Mb*3
9178 z@npH1^&t`pH>4NQ1LGfDTRK9(_y_xE7VOJ)@k^>gcsVLSIMvk-fHMA}{UQmdeI3fC
9179 z(Y2xVloz>tpm8G$s38B9tMlJ4u*e0)D*?t4z^d+N)=)T-7~&(;V1(|9iPT-Onj07*
9180 z4ON`cI2?X|mpJ*u>IU!ARTtjl)e23B<N=jyNXh*71J?1C$Z_|*<YC4gZFEPBd)(nQ
9181 zit}oQUl^m-FJ>5iMnwm>8%8jU#=|Ap31L)}vqUX+<R7w0t}NJ@9Ol|U#jHUtY=9r^
9182 zVn4D&`Yu{17q!ZVxhH10Yhq3?70P9ESsPx>*MvizxYmQzyD1Tq)PS=f9*a+Fv+ch_
9183 z<=Xgg?(mn@-qxB`-&EDmUR{&5VaBw;v?&=4^-b*?GS)P;XRWRewpnfvm1(G7owcT_
9184 z>R9-x2316(W8vC1w&Bui2-sTPUf)pNTC*;*3S?QqjV(28nK)F9WPM`|QlP&rSY2IH
9185 zi!=_vp#S>jP%(}!s<Z~i0hQX;nwr+i>iYJ!jH-tE8VLY*2sm8rfJL>#fdJ3Fx$GIo
9186 zQZnq)3egbEIc4_5HKnDc-3#)II>hi^XXj$EDd<TXQgLG`{?3}eXpJ-W>Pg*?i0E2T
9187 z-zzqhTw5bftQB!i;f12P9RF+263qv$z)4Bl=j``wzvR5q8e}}aUZ0qHboXasf#*c~
9188 zV8tVzi34wTMmuZ7+7dCaP^@(lSCrO>c;~>HAO1x&9}+{#iNe_+Vx2_M?xcv=^0S<?
9189 z#M+}8nNzR2*ysC^!uFUmS~TnwrA|<+_e`+g60ciM&>1MczwK~O#oKEt3M!_G9M3rW
9190 zt{?6eOL|3nuk-u-m38807Vr;n3Ktv{@rO%h0*ODk0KYN4$Rvr_E~mDv#VM<}QN$FA
9191 z_2nYET&#C8MRcLqSniDLUg;e9czO29EYCPdSGkn8)&Jj>HzgGH)k@x^SWJd2fMBFU
9192 za?uuSt#4YBt14VV=@vzoNd31`Sw+-J5(~Kyf*JKqGbxLze@$3TYiko_UeZXqR13=P
9193 z^SD!yA2Hf?5}y+rgU(d1N4#M>LF`2D=sbG$(%Fy^;d5#!Gy8pa-{jogu1X43$wudF
9194 zuMoe$8;opme`l{u7b5+=&hizdrNyOyvMJRAonEJ>`}OTvqRx|MJ6YXgP*9YWd(xA{
9195 z%zgWv+=5cCHv`f-$m<mookM7}yig`<ne1Y+1gY}FPL8uOi+zht&fy-S_Z{|~CF1ri
9196 zL|Qz?p921{XHmhQ+t2FpL_xM*1_M0S=x-uhn5h3mef@{Jtfr~sSg|^u^k9(~k%3P8
9197 z+R6*CAt9A%EeuFUiVsC2MG6u`W3WB&6lk#W#ZNn@b*#_N5ly`!F;ldsI7ttSq@yWC
9198 zJw>BL>|tl{{HvVbgWsNAPO4|Z5NC8jg>wd`>6~87+aM=#JJNNW!wgTVEgGFd=Vqtd
9199 zNki!w<tR;a_A^O<^ur4lPQP1ha1x<DTK7HRWQpNU;XNz&<j<Ts(@D)2ZM9<P&QV!P
9200 znRvXITi&MWv3QvDo7$=4n;dD$zR~PA)dcJDbsI0YdCaP8ZK=fk)HGGM)wFihv>Hip
9201 zDU#J2gEejID_hiBuB~bcHs~eZ-c*m7Rpl+s4W_uQxoT}qP{XiXt$deAndDcPNf<<`
9202 zDQN|nmiSaROjlM{x2jxy6aK?ahOO@L3@IkbXgy$ylsTocfCV)!jTIW1A_Y^RKtiN|
9203 za`F|WIQ6Vb16nO&rAtYk!~c-vaZqwFhLGJt5!(xC8&Bm@?j$lv1$IW)iYyU*Ap6I+
9204 zet1(+K@o)6_GQBGikM7s#(t4jF3zBC8-3U_ExCBb<r$@DILI@_7N<BnQ9hvy`4z-D
9205 zp@b>Q@&xKh@jQQ8`LlpO=Zavtm<nR<+g2-{vr0sNrx)e6uiW<(abCNPE27&zEdJKn
9206 zB`&geiglh0yFe;a5F~t}dm9Nk*Df!G#{IIh-0PWw{6DNh5y)Iwu$#z4d}bDKT`nO%
9207 zw2l@%ytIJ&5JU2bQ+q!aCFL_uMeB_uGp?41+BBYF2gJ&t7<fQ@VRgOsNPfrmEAF}o
9208 zsE%|}FJEULeMH3U2la!%%5zG@;9iZl*7qBU9}h+p(d6%W+lc#1>wrviOc&Y*M2vIP
9209 zNy-4DYgeHBCm`MyKeC<LiVBc$Rc9u$AJ~~IDwZ#JUc|ylC<y>;Unfn{v-bW@WFG7+
9210 z0qC*=DEZv3ZU3tnaHw>_r1lP2iBGnY|2KJ$BK_OV#C4Om&>JNVZFcq{^F8mO(xQSH
9211 z&S`M7IPFhtX73Msga0<Y%j48~W+aPl{1+E=9(C@^SW#M0QBk~xV|LzgPW%$)uEy&V
9212 zPfHRW@;HY?OxG<=>c&b>)<E%$6%;pb^W@m*>BFrKmEsj1CxzD3zTDeSytb9}ec$68
9213 zK<4SKUC8YBl*4<HEG_pzSDv|gWrz5cy<a@J^+30C5m@lqR?f%{Pv)JaXG;#$dBzT2
9214 zf*!5~hivhl?MO5Ij@JV$9`PsHuS{O<DGV1L_2OJE>fMEqFIje_XP>xdn<tNSe=6td
9215 zVjKRaxXE_P#gkTvXU4!&uBe*T_&MsI*aGTp@oNFxV&4{^McOmX79$Udk2{^i&ggDu
9216 z6RIBE%E^4jLyiBvt(4?vJhgS*0a%&yW|poL(N5yy7m1)#DC*#g#vj1g;Z({AyI!(s
9217 zzkL`@pX}sZ|Ips)Nlk*&QvOm6#HSZxxj&~0)sISQpMWz%FXL(t>%YIP7rz_%bIZ2g
9218 z6_Zzc#w2%$!gA>#9Fa!kx^Lnj=>5=tx7jf!BEl{lv$N{61Bw7vMx?T%rLz9t8xX0A
9219 zwQ)dNsaB{{V-vuKusR1oXcJ|0IADz%qU=X#KPAlpG`4OJ!|;{nAncGv+JmrCcX_!~
9220 z=X=VuI)6;qzbUE^i94O-in~sRu-d*Z-!DoRh`PhYrQ0joPZlwUOGW<@(Xuo9)GNe0
9221 zTb#r?k?fghi-AW)3-r2JMKR3j5^D~NA(^5sQw%K>6+16SO>jSI5<IzhEZL|+(RLI?
9222 zXR>Gl7VzAx7yh#1OtJD13fu7tA6uN@*<sr+t*8(!<@_DYUsSH7ZYjb}>fIS*XPh%}
9223 z(O>WLdYolm`)|u<<=<UX^fb480J~+I^mpHoYI3hsnQvI-rL*#}og9FB>wsjjQ|@HL
9224 z4VvKWbS9rXS*$<YEtUnHQt@MJKUPT$6mbXsm9On~rgl5Y`7_r(wJ>j?NXDSb#gLMU
9225 zf+CSzd!(SK5#7BZHR&z((e?%TGers1q7ct@(tbT;Q>`B8<br(2&iovv@c^FIbb(#o
9226 ze#co^;@jIiSvK;?<)^OndO?>E2Rl9Kwp0{CJZOU#rWp250{j|x?NN^i@wRnzL$~uT
9227 zo)`i%oF!7r?-G}8gDTx_cijb~t26n#p1+{+N@)cS+s?j~1*Kwm`AewlU+%0FH*EtW
9228 zfbD0URFHqSYl{GVvCLfPae~Z!w$({N-9ND<@rW)t*e~raF{(@S?@cNw+KpF?($eA=
9229 z8=6fpy@`V!zgYC&e<pV6V4-MnQr3y2^7f7!+B?MReMMqp3TnnZEN<P}<qX`OKQsGT
9230 z@egS3fy?e|U$%oYAY%84_RO7PdY33J7Z>A+c6V(n7sXv-Fy`eiR=Mcfwr~3mGN@eq
9231 zxHD7y)b7d>k9T@9?SuDY`yS&Q!1gH9sRO+~+2T-W4vM1%=jSgFtDLU$MeG3)EEI9&
9232 zV#Yq_LXpj3eRs1|w14p8HOwokyGu*gT$q3N`_7>C;-mxZD=N;cYHwe&7kly&5qDHP
9233 zOsn%3QQPI*kI}-!i|bS`&kLvAGcQR@ICKye@}8}ffkU2sGm*J%E6I4(Q~uC`XS+qh
9234 z0c_YRL|w33%m9KY@!l31t9>4fuVkl43<`gFyQu7{5F>Vq)<fdg)=tsjbcwb5og(p9
9235 zh6mz$Ujq~WCRx9e9u-EwS$flZNMvz8km4C{i#7NGc~5TIul58-qG*?I*i<fEubm>T
9236 zP@F*`k3^Njyx+P>GU0<L%Ai+VxruW7MpT!WyMN}-7op@go19v-f6ektg^-FDyoat8
9237 z>q?$N(F2=lH(&DZL;Cj3Z1=La9AfqGCNAeMq6(4jmiS(YqN4a@6WQ^dD5tj=xz}ax
9238 z?x;d6I=V2gvmZ3`I{RNjwoCdHcSjNV3lhogQHPxhaql)K<)xYm?3GH3LEUSc=pxO8
9239 zdO+K|qYib8xWm{KO%a<47q4x8>`TwgBtX5sk(|EO2NmHJuSj35*H?bfGcNhGA`uI(
9240 z5OdrgMlwi_+$V?if|n5<`%K><{1XQ#==-p9KjKvEF01g2#}3JctL(v(>Hf`b>ECQ$
9241 z!y&%^aATD9Um3d0NOF{^t7>kltzTpIO4^3OaJjZh(lnV}l(tjNG<%^6oiTP#!5m}l
9242 zfYn$#BxwWXwutHQR)}rQCJAX{2QlF4)#wty|JEcnw*>2(n;6C9hDHXGRLkSqN8AJ#
9243 z>JVnu?3~bdXy+8}6e(j&HQ6;mvspq5TGyRb+PeP6;%+IrM654_KUTQ%s&)~#)0wqx
9244 z)>Fl^ozXL$9$43VC|k~2XN_}@h&_7ngY8cH+DYxA?tpVpH0~1_<)R$s7E*q(%{BIE
9245 zr;~DzbC)>7DTFO*5R;t}Sc1U5ZUik;#3HD`-M2C_^n}$b-tFAyyyx7xDob2qA8^V8
9246 z`QQ3{<yFqbkFLwFJ0GTSO_P(n+ga(fBbqp~J4;mIfgHkr^iyYdceiK`Li;2-J$s34
9247 zT(7uZIE80pS#7!;%er?n7u4^(nPOnCXmt{wJ>?9PUal1CpS>lEVP1p1RJZ*P&z?B@
9248 z`jSs8u(I}UrmJw+TeuFuA7lM{#UySne&=-(ix;+6WE8E;SWvnm$N6Eq_;S<EK{Lv7
9249 zG3=*QAnlRP!^JsS*j+j88^oQqXRQ63W%aN9LL@l*=<15v!{VOK@}6#(x_9l&tT(}w
9250 z_5<{HMQaLfDHM%|MbaVBm?Dx2#V$CwZ^NA3)mb7Q<qU1y2i3B%7eCof$^!_go(5|V
9251 z^1hI}kZ-|IIYn<5RjlCON*MguAa2HlUU1U*+s&W5LaFZtRu(K^BpIATAvdJkGgLzU
9252 zibPD**$14YZgD$0AG2)M%4;S%Ma~qaDj*V>Vne1=F?FI-@tLW_Kr+Go;HEz~7djiA
9253 zO^}zhVx&`x{~P6ZQ<k`6TbEO@7h@QJf#5%rBRHmL{+!YaGqQ<4)A@t4qP_V4(N?I-
9254 z#8vEZnzNwdii2|8kIHdBg>j4i;53ZY-#Z;n)w%Z3tCr0=9~-p$y`EY2L1#^V-MJ`#
9255 zc{9S)7rnoGckv^*OvXWbG83Id-^(k-U?7kZHRpi%xpj0q%<mfLYtaH9M(o&Hju=;|
9256 z7+8z_yt5CJc1}5ME$mo21L!bn@%&kiA24haHX+^OS5~lly|~762qF(xqc$i8l#6wR
9257 zFxA0#*|&4I?|{!?kN~lN8FcmCArh&>ZRaUgt&FT1bO2L*$0lyiZ1GkU1{x)v+00GY
9258 zJ&?@H0qngA5W6=?7xPFI!5`byh5Cb0&i;qCBYVXrY^-eY=O}o0$UY!ze--5fSAtdd
9259 zc;I;!6`#N0<F^6x%Pn2I3+i9S68PmN^41pjMU_-AO0WRqDbd;@W}j&CWZU9sC&I`=
9260 zyeO^Zolzw~cb_<XD*E{4div5&Mmdb@?w2O=$tdpF-`FI*g4@u0g*a%HUn4fwqWHay
9261 zG`~0aNd1wGT!}aM5O%@d4Gb@TxW<!_g!#dxlcR%v;LLl9EUI%#l?3lZ&f{DD3;q-B
9262 zhlPJ<ce@9#i?I24Qjc{S6yY}w8UA;>y??i{v#RT>f+5RRFHIJ;wri*Me{`84WQ1TN
9263 zB8`x-Ca5r$2PD#tytzr+k#{}zz|xgJ5}Qi4WQo{A^`&qGOIE(`6lB3E)Va?cgoBWi
9264 zQ{|-idfs96kuAO0+h8e*rl3eX438ekQ#~_jP_TL+1^0Izy=vXUiw>@wCH`b#FHwLm
9265 z9)9YaBZlC&9(#=}TSR*n;0+pLxeU2X#R?Ikl#QnrDn+?RMiCe)S+}sXSp0tLekkU{
9266 zp6T%&kSEWAVSxX>EgQc`MIxZVDS<C`a%<-Kl&VZr2gL~pJk+8N%X+z!*)67*W2Z$u
9267 z(Vqbj5@9GQlE}&=uF0gNj8{5#Y?I5d+lGRXgp58cYK~$E<L%atEGKU^ca)FFu+9^9
9268 zkZ$NBGQROM^cbr7xqY}EVLIoiNa^)V7zmA+RkYwpadv)tyIc)o{Z4G(&|9%*5|{5R
9269 zr?-CHtoQDsMevBnw#mifoWq>?b?U&(La_t<5qVBwH&)zHjARTpao37x5fSuaHwsiU
9270 zp^Qh1vP18RvkyCubVDihici2W@dq0}+qdB-AK#}f`~<+Ho=#`~3eVVN@d5x}BHP}z
9271 zx(4!sj^~H>KpGA$Ed3Z6Ufo%X7$A0L2>9dL=v62bNBASJ@GQUJ-{rfzyFLA|#&4JF
9272 z{k?Cp-v2{CH_~DKubkfFM0e_20`0;22BjHXey-FF#?M8@xU;fc2XC-WjSmZMgnU@0
9273 zjn_)>us@4jUmq60cxhczrM$cz4*CD97>~Mku6jiOaA%P=x&z5@tS3YU(1jdWK)AF^
9274 zNE;EKq}sT!AU0Ax$#BsHS`kfv`uH0pcb4r`w3QaLzv=7{F(qfh2jo7<7QqrR3`;q-
9275 z*Qxy*mfai;=2SWlM8LI`;A+$%k#=~{CDP#Gf;M85hqo;}Uo@8N!Ij9v_%APV*NPEG
9276 z#TqBGlozU22UBKs<WIi2bQD(FjWQ^I7?J-Cy{nMlwT+wM!&YXebEYWjh1ZF~-*z&9
9277 zdW+2s=&N$A-)v_txEaKHi+o3YKXY>6aP42{+}j~G?Q}YzwSu3)%XOweNBvU<bgs3J
9278 zX2F{~gz&;ng!u2tb8<v{2`(n!*(VsX!z&!ZDX4Q!a*~{^>(K56T*Ad}6z)3HR8IHU
9279 zSnj>pV-_Ox)WeWc6T-i{3rewp3Zr-h@OO1m54>m}E$F_>xlTl9_GF87aKq^74A{4K
9280 z;su?bRup8d^^6-@abwQ|9bzL~h!xKIWh>i7N9GD=LVJd@8`?>RV)+OYkHuSs{%hm>
9281 zjTY;1jkDFz9Nub%4f4h|maENO`1}bLm)b%`uDM771yE(Hz8=rj$jkH)YrRM0B`<><
9282 zX-czsQ-m09CyV%_p5{bnGQ?we7dT%dqaDNP{MB@^&|x_5bWY+h#K2R*%IksLW4-?G
9283 z*cz$0j^Rak<NuY%e;A~ey6bDqg8Mj6ShIm0N>zZ^(4|iBGNcudmMlAV_wI^X*RN@l
9284 z*9Hk((@+D4%FST1TF)4jiJ38VsZmY_ItLXd$^OiyKUmY+Sl`TTI&kYAN$OXfA2OO*
9285 zlC6W@fUj?^3i7fn`VWl^#YW!|x_(VlB|%Ue?v!2e0<bENlq#wAF4JmnynX09PBO&d
9286 z9h;J{yHm!T-;$ZVo%<_B@tUBAQ9GD<$V&^In|S&;E!?vwV<QUV>l|pGDQfq5(vn1f
9287 z{<e$c66h2Jp4V@?>-YH!Dh?ie%DLQ`b+Dqqb4F7A%7bkczi{@-aIh_|+J<ZUQsam}
9288 zT1U@#Wck_H0YVS81bH>~!j%UdZn6K|$xXpO0YJs#+v)p*7*LYG;5XPCr8vprfo=Ol
9289 z!%;E)C^p^%5NqKmNfor<(NIsn>%^8q^|Z%6dWI7?W8oQMQ|2c*%Z}8PW}o<SJM`E-
9290 zXn*XIUXT|v@5ZwdndVUMwK1aD-Z6+xOxcR<+<*fqGb_5gdn$0gA+G$Y=Cc49po&ZH
9291 zx_tXx?FH@IQE(cWI->-sQ+dU0S{G6!WMN+U6%0fqJ6(5+W+!F$_B#>6#??%xe6v`+
9292 zf5ly5B7%1dmwj@R^B3p#o21ga3RC8>+VT4@mEPB0SXOIQMq~BV@E*d*Zb;H0UIeI9
9293 zvJ&kv54{udwv&_hNySTdc~U^k<$&{8d;c9_#~z(HMpJx!+FgX3r30A{tw1gevtF@w
9294 zB1T~zoF)qFBm~0S+r?YfAtwdGBAjRV>p3w2mlIYy=hW}z8MHM8Jr1r6)MT}16lG)`
9295 z$tcP?HS48<qJk_3I|Tfq&ZKANJ6X&X6|7lNarcQjlYz{hd|cE<^Q?l>;tJ<s*<@w@
9296 zN~asgVE8S<H%tFFW&Gc_3~=Zq2{pU%O?KLyp1%|TuT$zAWDj>1mFjF!M(K@3h&&Y(
9297 zAp+AQJJ^l?xcYNqHpss*8|3Ucaps8?kK||P^QX1q<@}lXAgAZXqP8scqXw9P!6TT#
9298 zVeWQ-GNT9xYO-F+o`jxr^0H5y)m>EdtJ0z(@jNycuM{o8={;w9*6h7!&Nven^1GbU
9299 zx>GAobuM0sSQeB?fR4)q&rX|LwG~_;6LBf6s3;%V<y=8Io|9R%hzsSX7Tgihze}_g
9300 zmVD-X&O>N7<;}`lc*R{k+yDrkDH5LX34oW2Ef<?A&k2yqK%lv{HW0J|#ft*1HI>x?
9301 zK4vyhRac3}(*@e<np=Z>MlE;IfsV?C_8Kc#SKk(>Yi<h$R@XOG2kKjReg!8;Yjdzt
9302 z0+p4OE(l%OT2ob1-%%6b1=Tid$^5c;fq8S5&aoO4#)jsmH7W83c7aIhDx0bsYTziC
9303 z^7ba`@0#iq0t9O7@d&$S*_*sZ8(4!AK_U8a_J>uBX$J`2SlKeUzB<q*AwXt;0D-FZ
9304 zR)93LH#S)+`W?^_W2+sFa;AYJ)y?gzK}Ddsp_)8`2{gDGa8Ag|s%vhn$!ZH$R;|ri
9305 zR5oXER>$1M^RtezTv@Pu(z0!8ZmO}=q1Zq*7)@&@$Iu?E3$(O0Z`dd)Y^-cuThpqR
9306 zsI0C6=T&uEM^&H&6C%$y1*$89m9oY9*7_iLi)mXvXTh@hfyHx*Pe=P!#ayt0$D#1U
9307 z^H7*lPA3Y%vp{_{Cgb$w^G|ml07hLUNRp`ADlu!TE8A);%&W$r+E#_g2Yr%GH5DAc
9308 z6==YY!fIQKO;%NNyPUFy$~A41tw3XQbq&YH2lgwO0&UG4Ze=Ti=$a**5e%}b6)eZM
9309 zwZ5j!f|LcCD%&&z>NnNU=a4uM=dWztsHC$^^2Ws$IoS|xQlzE)<l+VMBN|E)*s`^w
9310 zzN$v<gRBl&$o-jXaG=2g0T3lMOKoZll|k^HKlQ8IgEhKoOHCDM#-eF~OQNM0s|rKq
9311 znv#MHPFB^`fK!2vU?oJ&NLg@Gpb<yFc}%Saf>yJk9^xI4l7<Fr1GSa)4VDohigTN#
9312 z4%8~<kP=Ba7b&TiOQEf`!wNLjY#=H~^Ry}MH7}=_D@aZ_d8VigQ7#vzTE*3F-i1c3
9313 z7_V1&0RO9V&=LM&()lk}{hOlxO~tgXYscUevjcMGNl<%Jds_|KNZFOxusk6$r<5&A
9314 znVXZ7GBtBbW_HTt?3`)Y)3WnYG8%*JO*KVpYMN?V>#LBhY^|y*f~%b|ZAwbUnv{%1
9315 zlT$Kk7Z=aPujF3_R#FfSY;$V{RtWTq1!h;b1*PP1<<HP;S&e1g-lAl`t!7=IX?3ex
9316 z5ZXASEHEeMT_P7^CY6oM5OMBgiFwJI*2<PTD3S(9BpNMgYpJZlijjzLwh_~eAz+<`
9317 z3OMtvO;wda&OKXHHnh}n<u9qOU!x_XwYt59OFr1#fR=5O1ANA(1Z`?>bm1cM#unDJ
9318 zv^QbhO58P-1ZiunB8IA#jaDsmLmLODR42h3n%7f#Kyg8&0Gy+G2sBac)Hb)EyUJj5
9319 zJryM0iW1PZ5>cQM?`fs>U9!5NvS}^xN;^YPC~_^j@+^2DAj27f)m*M@0pGk8BPw39
9320 z!HiY9^sKJr^*wm+4b9L_fM{=N0fl%&i&?YSPI5qK0Q~}h7C1n1IcS3*H5G`VV!@eV
9321 z5G@aXV+t_7CJ9|DSq>yk<QibvMgk*U-$-37b1F%IrkeG#1Z_A47^s@(Ky4$f$A&g2
9322 zE=!$IhIG`{NGPf`Z7BnaH;QE{E(5|^Dxr_(EL(bN;M94iBQGuPl0|b%17(ZKPFjG3
9323 zR9-c$(2!7A7y=<6Z=i^J9&;<3G}TtOp|qo|k`uIsb_dfZ5iOoGw{-qeE7%;YY|xc5
9324 zE`-_SY$-L~TGP_7F@UL1QqWurt&Zxdj@s5{DMK8d>Q*W?3<eEcoRzGEgwep5A-C2*
9325 z*FxR`0g{J}T2o+CO>48oleSWpT+<@uQ%(v-hJ~{>AWbo*u5E)F$LaGHT5XC!0BMCI
9326 z(cBp5kSpG5tCVwsGUYu;6R6!6xH8(}5QaoZjzJ>pWUjWdu^vMqQJ~a}S<5zhf~ljr
9327 zmHb!gj3y3fq>ymUU@Vfm#P621#+pVfI<>eVg0*TK^XAT7%;|$m9;m8pz}nQfFbWs|
9328 zNetvP9JwPvYfU4xo1771f_M={^ZF*Yt5(xSUUTZ?f3ln=#2l9fIrMZeQ<Ydzk}L2Y
9329 zG&WE}3dysYY9l6!3=9i1PgKEXj2lwd6l|^pEkW33NWRswUiuY*I(Um5k&z?N&E?!+
9330 zkr7yCwOBILzA_J435^%%Ing+}9mt)mxHNacqWR_X=c2qx#&APHSIxvzPM-sD0F&f;
9331 zfJX~L0&)$)2x4@4{^SZ+vh?)%fW~UW92=#j7LpVjtO9bgmQJsBg+QA0!ceSE3u3i3
9332 zX*ry;LM4{WKTWT#mdZBed||<87t5t`F#5)3cw1ERzz6<M#;dg?XQXioHbTJKTNP_t
9333 zg3x^^kv?TDoNBm;@U6)o-oOG;0Yj-nfl0bq5OtVTdg)R%n_>=z<!yEK!8$qLQt#`*
9334 z1R>CFoO1P62H9~V`p0c*Ynk3y1FuHz3YuuD=M~Rg8jzl-O3qoj^mKyNx53VWe6X=C
9335 z*bJ3swJ9YVK_n%P<CRolxdSZB-TEdlUdm>z<Vom=CMm+~l9=jBs2BQTa<=5)IZ76}
9336 z*aMk$X?S$TkwU9+lWgH00`RhhB!v5JsceOzS<|RG1~#@Zd<1)C2OA`J8`qi{12}vw
9337 z47vr%0Mx;!b)lqU1=W?S>C>ZjJ!v;f2Ua>XnV?p(LJ9}RN<j2oTVK;qO^dCC$Aue)
9338 z$d#ilB!Lv<4N~d1Q}bh?>unF@5gHew4;!hphTat!D~UZ{qcW{60XQ4dD^`9b@hH2a
9339 zo9K-ce1+P|_J*KUrxp`@c(ADj^CDLdY%!d9cw^02pzW>jfdEIVB{jNSWsQ|VXkV#T
9340 z8#x#{AFa(`QHxT}5=iw%oVY(r4jJ}bQ6ihdwt$muHRLCn2b<RhS_3&%=uPTsc!k0C
9341 zHsrt>7(~4pgsujyq;s_zw4zOJIqLgxPCC}G2<O1a(C1aD$)QxPo6Qs&HJfcMSfqsK
9342 z)XEH-gfh9B5`>*FLPctLw&=-_Ixc8vdFi&(?9tN#pP>%n=(|Tu#z?PAbA|?3P6PJi
9343 zsG_vADPyVmtx%fL5C#n4RA`1&V%ujBELyy@cu^VYgiEH_+M?RCS#xtJNI-OL6p22f
9344 z-DC`)+Q!gQVyew70*RKa`X>0ha)C(WtUJ`}RC!R+HIybg8@;s337HIZji88|Qm}Zk
9345 z)x;)L4d5=YD<#2=E6OFSLxt3jR7utCjg1>Qd0a*CC%9>C;})-81|#To5eq19l8OMN
9346 z5t_*OU+F}|Jr<o#%PKv5^dV=2?bH?)#MOhyyu3hLTU8~uz+Cmv8L)~_wlx6=xQw(D
9347 zvm^^RxTdH-S`nD%Mm>CCv$nYvD+s$!Qr8r6x0FMmxTSmnxJZchn1Rz>2)Qy`1z?-3
9348 z3pTb$0e}P0SXosEf~2fK1gTa+;vpAtD|W%HZS>Hqn>mpT0x%$9E_#An*t_To%x)7F
9349 zPZ$Ne3n=apH7<h~;v#ynXm4aq9ag_w3t(XfoLj_a0zvquZaM3Sbn4|LA*;5<Y`WKk
9350 zQtJ9tYt0(98?MAG!DZGv0-(fey}@_74^*oVD2YnyW*G3+TI`hqxE_Ts8p54ut;a9!
9351 z=B_fNS@j@0XrTh0QXAw2ekB~}7HR4lt7{sd-QiI}zG}D<<P{RDwxPYPPUq!%Wmrmi
9352 zaag@{*+7$Y$eWcaY@(;81cV|euX9+i+gSLzxV~005B^>iA_##7*_sTLn@DWLF)?z(
9353 z5UgSq{I6gYCO`@}{?o`c*U}V$SlO0c!n-0Rig?gS%4CF!opM9ifQTDr2-2gjCBboB
9354 zgXJ0ANXTG^w2@fxRe+M+vL5WIYOHL7yU`IKU0_>)j8PYUAY*}=syY~w`ZbU~$%`sd
9355 z3kXK<*mL9BHdr1^mb{k5N;(-B5TNCNB*7?0xDG+Oz`}V`Plm4o*9g_LcKRAXxH>R*
9356 zX}Jq}Sqpp&?!73nU|f))7VH6N`GIV%E(y0UrZTHTfX#(uDRgif*R8c0-rHKMi4p*B
9357 zn>ZKGnK!Sv>=Y|rU1qRy^ncr0W|9kak=MfO$@Hs1bP@g?+i<CASQ^5$#3bFgmVOOf
9358 zrx{!eLb#Tjq#M_1Ujx_a2A8|x>0hH^`SBW-e~pF}$7@(|OvA-`Y`vi|E;GqtxR%0?
9359 zZJlkBBXp6P4wLJ_p$rYE65(Hio)@q9v8|;hxlCTV#_g9@&j+0*)2s_UR;y*w2E7DS
9360 zXu`jy14FcJoo14&a9xNW+gfgtr)cz~|FqpEw_BG2&?NUq0Gb?Lm|!rP<Xl~(Fq+&Y
9361 zVL+2KqfmefPx$xPVVrJ;VH#ri&v%AfsMN9T%8%3Tp|8=d!n7+7v2BS-8b*=!isP_t
9362 z$?@1$vHMuIEjb?BDs~^swk5}7+p*Gnz2--TrrBd<?>6a=bs6~fc&8CnGZI;7G8;oe
9363 zm%Y1Nr_G3n(WK3IWMh;0$ko`Sy`kw}Y?2Fgk!))+4PiKwY<I(%jA4dtnfVUMff?<V
9364 z&}gH-+-)*<ho*9|Nxl+->)F|9GKN*aZy3cl2J(ZV?K=5DxX2_A=^~GnvpWu#TlpEN
9365 z|FbMZr)%|pVSzf6xmp*Zi<@-vm2gp(=IadoA5bP~=8Zj=xw$tCW|C%x!15iPM#K#3
9366 zB_)dB@NZvca`Fu?4X<o#iQ&=S5JQ%jq+yJ(+P3XB8N&rMHA%w*_F&TIhM0u5CUaeg
9367 zBTG#3J8n3W33Ki=lQis-w3v+H9cbyh7A0I?K9RsMgH-D4unA0m_js%B-OgjX1?1Q1
9368 z_K2n<CM?w^IVdy}XPU_g5A;lvGzJBtWRhmN+t!)aYY8$E1t^m=Di~0Gd2yF6xKIB_
9369 zE0Z*>z>0g1QNWLD_@9N_nWU@T_l{}ztcHIp+|DG;SkT|TPLsJhye>@Ag@4~y;x}^~
9370 zWA)-zBK0w4MqQwzJ;$5l|EIPu0h6k@+P*U&n`lsQCpsW5aX~~7+`%O-zf1RY_lR+3
9371 znqd|gna!C20TGCKV$iseVAPm=jmEe{P0$$Q7R78DqY<NtCPpR37-KZS#N9;yQ(f<S
9372 z>P}TP_~rTkc^;^@&OKY5I#svsz18=wS;mMnfN3qHrH1Dk+2UhOjK=hr79fp@Q<cmk
9373 zbfZ~3VTH40S_hlJl3`?%(!8Xtb5rG2%UE&KKoemq99L;LevFKi7+tlD6;78`NfRMw
9374 z%`zV=oDqbNkP$8OvBDEq+Ix09!<;@w8lzoS#>$`21!)1&{-RmbM93(Ybug?f*Pt8M
9375 zqLdXq;awn^wM4k04+Zlv!EpH=3T9)1;aWWutc?kVYxPiYR!lHltFJ=@o^`<?d|{Kp
9376 zq2SXhm?xwHS^g5Hb%pVwu3xLJEFl$CCAEZUU112R>j~9WOGpJ($t=ROt}v<_pyO@T
9377 zRUrHjq<H3pg87(W7>Q6Y8xsthoycn;%-;?uCCLdt4N}}y3Yrh}nm@THBBTQ8N5ZtO
9378 z(EA$bI8${M2+g<Bt@<3{HuwT)+%M`nS_Sij-vg;SIVU0h8)z~EY*@z1$0<hQk+523
9379 zWQDF6js71UVM`<$gj+&aRZ=9RM$@Qli8bmM#?7m*rFu#kU14&De$Da)rH!u!Csl_3
9380 zRSj&0P=10^{*(0>AzL6z2|~IhTz+HPp|jWNCfq`G*N2LNmCS`uaH~^9I8+rigo+w`
9381 zk67OoK*j~(NOx9T6LvfJ_fWY!;o(Xu5T;b!6sS4^{JdO}P!fJcSC0)p1pJ*Ny#V-<
9382 zk|+m_Npc_1W9n0e@CcR45uT`|%t?Tqjud(j^zXl5h6*L0L#ZIeL#bRS71%l(w$9h4
9383 z)f0YRo&F@|&8Mx+pZV6V`IGn)x^^_uqn|l0Lf0jYR)hP0Iv_j7T%i!V&aI<zr>Tye
9384 z%hZWo+fdVNSgA^a{PtM}CnJ)<!9|kK6}fiU746<#+aL7EC=8hSC}k`WUaO=W;RswA
9385 z#;14c`i2VT3Dbh%Ifm;0q=LCW15z+DF--@{i71C8|Gal+*NuvNzN+MOJqB<oRIEZd
9386 zJn2c!PR8#3@z4@USLvYzJVX*3DQ6L1aT}x@i-zQzIAmfOhJ=FTia0$Aol&D#@CCx-
9387 zlvGc6(k8o(f|FG+M|iN33ey0oQ|@Q_4c=?>EEL%aKvIs7cfUn3;VIy<DaRV~SY!$N
9388 zRbAlJSRDF{vSbK(?_TmNR748Il4J$YN>x-KT&1KOq4`;b`4cAzzh)`&uEFTV36A~>
9389 zr3eyUiENS6|4qwrSc^44zd<SMJ;LkV&?n@bI-7W`(LiLNh3d0Z-vsq$kwttZXyWRc
9390 z<*a-o#Yjxk#*u7^wU1Mr#D}`puUXED`3}7Kv*N6=9kFHKnlgWq{0U`je&*?ePD(1i
9391 z43D~CP^N6c#Yzg2?l?#-K`Eyw!sQ@sAv4LcWPGTMb36P@l7*0<SMs^McfVzi1}6re
9392 zH!@1easkv1NqUD35l>jZR2}Rw4zju$WXVhQ4B#Cc+7|)Yl!HER<P=Dj2~amOS(+R)
9393 zK~jIn?!$(R_l>Us*KH`pKf-?~sh)5nNOlae_P%2z{9pj%=8fiQ^bH6ON)|3E(ZIWD
9394 zqOWWn4nB=il7(=Cl5$k_rX%@^SZ4=GC<ss0-m53P2P7G)8<(<DrP}L90q*2Tp9SQ-
9395 zXIXX--i<?LZI7e!A16xa&glihZE@O&EMmeI<=G-C6oc!RvO<+I2@>uA?PWgd^Ghm~
9396 zvp6ADirjk<{n?2A_m=v4Ia@!D1EQbnL`J$gnNcz?yf=T>YrN`i1!R0919>bukR57f
9397 zv{ukAbNx+t6G+38g~_T%maZN=wnP$pe|XZ*L$u3&O&xj%t}#NfnRF$LQFA0yBHjHz
9398 zHVnzNC}kuNQjv7W%S-7T^Q=tt-6|8INQ((T>}BIS@%!*u1UD>Y_b~g*MCSi&M4(KZ
9399 zi%Ka?WX1JphVYRzA1iE$w3zTOX};G{Va&^xSz#)g#t?H*l^M190NbOb%p6HBKYEdT
9400 zn*$%%VDZ&g{8zBJNh(7~1Jy}iFihAhGoWu!a`u=KD;*%p;)IZSA`g|SO029^z5*fJ
9401 zCqZ~*DJvWg(n3Ox18ET<^G#+FLU$`(tg^y9k$aGYOc`;Q33I0QWnXoPl~yG#sw%PK
9402 zf}11kQ$DfF%DEtl-LC>N!Ne{h2TD0mtZ+z6)0k_|s<s^AOU`O_i4~@y=v!K1g*_{F
9403 z37MJYz_Y^CEcY%eTj}&Hjbnw$D~&^^YQag56O61M2zgO19ZSfr6RxoJbqoZfAY6U}
9404 zBFhs_7fePo>WF`+IasTvHMF(NhRYnu?<lz~PH)%|Mn5s#6E+6W#i~|=1aJ$=2T=}6
9405 zhK0{teI{dW^NLoz8Vq7u;kj<OEO3X_Oc++PXQ0n#HJJ#Tyyh8{EDimjoMVdk!Bb#6
9406 zCOJ_~c$S;t*9ZPnj!cnzyF9cMdd#`okCo38$)H#08S)^e#^;H~gG`)^%EO!$PDhbJ
9407 z#OtLw>cG<d{C4mdC#LFTO3+rHNAAKrvA?fK>OS9~L}omnZv~vWTt`QE364WwL|G0B
9408 zD{fTf38^X?JdP=zvxX*1C#)VkV~@ZwGH||&MZ)KiNW2h>gwI!=Nc~9ghRgxFFfI_z
9409 zQBpl&D@gW|hP8_wBjIHO7%Le)R0Z>dElO%2q#0v0Ut;Z2$4Hnq8s6z*OKC~g$Aq(0
9410 zR~;eE*o%JFE^>^7X`|tzwId-=RKXl|UFb-De8|!Xmf=ZXGV){j+qp#2IVzncToiIw
9411 zQcTv!%8R!9plzhwqO?=%(qw#zRN9POp<fQcm(;@o;i9dqLxbfq@IT9Z=P3BP3g!u?
9412 z>vNkr!b?H2S;5-Fj*;+*0gSBm!4-)Bq4O?wqm<sgtlnh_o#3kX!e*U;Ee98(l!YJR
9413 z9Q8IAHXuh=Zys(VC2O9IfVnM|bUWbB9BJf8dvtr0Vv(?0Nx6#w*?dv&_sBMQQ2kew
9414 zTgV2W2bY&vb?!IP{dL-+M!J6nw%y3?Tf$C|pzjV;Hw+}R>e}DP_J4i^+uumYMnh*7
9415 zt#b`-d>*6^QG%0I7l%ea4qL-9`Y)H0^n_-G6q>B3$!VHx^}g;$kxv^nuQG(Gym~dv
9416 zt2-fZ7#?$)#nf+s|A4Z*IgowxRrF1n$fmFzMw)G5Lkx}aV@qO7ww+*&p2%wEKZuy?
9417 zyQ1IlAz(QgrDQ3cd0#U=^D%mQXHD<gFym_(-@`P{!R6xbF#P`Lh9Tilq<3|)Z~`%N
9418 zTc)Z%{AU?M$T`JQnc-}trLqx>rlm5bjHjhCs?0r0^&{1aaL`WVZU$S&E->9hyq}KA
9419 z2Es|23O!XNHqMRR2DWT>?VAQB44p6*81`c|?7=g}H<6_yUD&DNZr96m(7V0b%Y{C`
9420 zMM}zWihJIX2>%U|1n}<vEMu(-BRz7KT7jIs5~b`=BTRMuI@k4#j#v;X1H`CUYNYFh
9421 zH`4V&jdZ<G{jR?(aI=+ea;)1Xv&NBMmCPYbwMSyZ-sWr|jD)Es3S*>+LX9+0sF5ZL
9422 zHPS?(`c2#(nXx;{=#?Xx#%mhoE9r488A7U-P;CeuC_?87l+}?dt&k_YVkA!&^vL;T
9423 z%}2{htWtes^j-vsOHs;H=(mmo{B^KMQ&xNw#PUNN<t!Fa^e>M^CcRO<u>&w6p6br~
9424 z>!c;Dehy^0+$6khASbK$IPy<L0jocA<VS?e>XVNAn2<TPQmX~yh41VQkh&eEwD}Ie
9425 zA34$kfWL60M*(Rz5-c`vkxJE{3wW&~5wg{0Y9wZp&4nB>+gqJX587Ux93C`0k}>R|
9426 zW8p>YwCwZ9qq3`Su+a;G$cC~h(zSm0BR3biV12d5B15UUdgcgHnYJiBT%NgAxOwBV
9427 zMtlfaf|Uj{gneTAf+@m2F*N3g>z^qlKS^R2<i38nAb)#`1lqSjx^IVc-xleWGM?>`
9428 ziN*{J-<*)mp!2N>*$g`0n2^n&^KEgb;NE(k4EmGHKgSaE08d5lK+BHh)AT#T_J3=C
9429 zn<q0ao3ZP=Q{GKV<oH1CWeGprtg!Dq%~I0*&SrBwk-_#|td@9wlrvPQ$7hO-NS`Nu
9430 zKB~gd*+PfV8H8LjOJ}W&bQUGaCi))<&v!mo%u}DoYz?akVn;5zC$~Qd=|Uu&p;RH1
9431 z3a&+WLp1i&sMK;T@_=3q)^Z`zt}DM<Uf+$@MQZI%fCoB~pBAG%a}vrsKGxL_En2E?
9432 z)KY!Bmg<|fRNwlgu+E>X2-o%D*?vbXpljShny?!rqyE9=zWOmZN(FM}Bjn;daz~n%
9433 zAw6m?xR~`>#C&AI<#UZnmg5AlDj7c_Q!_S5G<x-Wn3kDw*-XDxQup~}oNSDYleeJe
9434 z4J3}uZg!))L^C<hMJ%s%;v<0?7iuaN2$?Ig(5j+|22IZbAv4ynF?EJ&eijIs#fFW!
9435 zw1;COWM&&SKTh<Ot(PE~(+7QH^Fj985Ax=e+Mf4yTB@%yo+ZAUGL!h~gyidr%r{4)
9436 zPuLNX?Nn6Me#j8AALRBhyJ5J-H$%v75H9w@UXF{9y&znb;`M(tVHya#KpK?vk14T2
9437 z=ZDJg$w!zQ!EC}TG@;DR3LBx^Y)UnpEOWEM#wa(Nw7)i~fsjp7UcX^?dC}g)qdBrZ
9438 z2$6UmT#cjTj$NMlJQb2O!glA!;hN`tSakQCf;A7v4q3!?IX(DyrYzNu(4M$gaTv<z
9439 za>8edouqx9c>H)DY9CFM$m+#sikTzN7$}k;o5__`>W?J*)sVP-Q!e;SF&D^l?LZe;
9440 zrT&Nu?1aw%$SonlsY+@jJRGD!$+D^vEA5W&EI?j>i#Eb9IxfPC)7n`1p5t2!_%lZW
9441 z3W}YSB~Lh4NezT_&psPr?Ka0qNXwRyHRnfgJC6=Ab`ojAR#jh5NXzyi8f%M`F-u5`
9442 zmXSvMl9psg0wHx8!P*jQR40tSj%`4ggHoP)5Hfnz$$1GeH4ZY*9$BH+B1`Bj1~dKk
9443 zu+*#;>j<fEglI2F1I8aXR@-p1V<%+)43l%fg2XVB;>-uzgV#gP-&J3MP(CkE{*z~5
9444 zg!_PG;#nxMc9dfzoH2lrwW}N>;nf2eS$oYf68>!fBWnpBznfdQfTK}bA6YvBH<}}l
9445 zG#P?vYBWzs$BnLhiM1~{MnXDn8CiSQF%r^o%gEZhj**a#TSnF<XnXU72ZB_cteQo9
9446 zhGQfALMklz5^Fa)M#8%WFtYZrV<dcj03&NJJ4V9v2IhQ;wJPnAJRvv8+BUN`-Z2vH
9447 z3zB7IZHi+gWVc&J<hT~>dH!ZgrYl0`wh_!~rZX>uk;(ABc3qZ`on>WNV}FS(;XbJd
9448 ziV@V<iLwwSd`5$sC1kv<5!T*vjEwU(8kH;|BWq<@W30qMjS#?aG;$ou*doj4k*od9
9449 zsgaH8;eGM~Y|KKLS|O6eZFUkNCNlF>NK6OUo{aAZZE*OCuY}ZXV)MTkCp5~$6ODxQ
9450 z!)mPLN<ErejtMJtM$S}h==IvewS;VYS(J{@YUCt$D@;8fMwkglYpLKfO=uu>$Zr!3
9451 zaMF`t5Yna%2F-Dj5=KILU>Rwg6M!%h(w}&E>B{%h;bn!+q()kuhBre<Ps-t?BeW`_
9452 ze(Psoz|GTvS0J3BPjHHaGxdp$Ii<38i(@3bbpRu4&pF0Qel)5ddBRteR7Xh5X0b7A
9453 z#so?Jaq3O48mS{ZAEY!pY2R|}gmgE}PMT{%usR7tnPn*7(<U?!vI!;=vg*8hu+~6G
9454 zM=c|3H>%qWgmlp|vgRBP7QmsywRHGMRo_UMcDPm@zS%Jn(z5ZRw#1tAqp?!o)41%s
9455 zB)miemm^I3F-!emSIat<@Ikm{{Fqf@&G`}BmSsF>$y~J&U#E^_2q$aPbM%R(jU@4P
9456 z%9dd)?p9KckZ#4U6x(6@Jm&-9Q%b6*4_Q^7A*3sELy7tGZRM(`SB#Kw5k8_^!Nl=Z
9457 zSpF7Dx$++u-0Sq2B6qaN!l=p|MM%|=-CWghYzLHECVl&@9*lj3etwa82$*H_=%f-W
9458 z)F6{I;f`s(O3Fq!rpYB%s6kfvgehf{gZONKk`uPDW<-wg3rZ>yz66p<=t7CL@%nVB
9459 zNH|4F1;X<|va+mwQyGhdUASFu8CknfpHvhH|2BZp4^!B(JX>~}wk$_jP*R5Q7A55f
9460 z?^RNUkU@|uCBoCRO*z6^CDjq0p`;vxv2Z9mAxFsOi+VyfUy_pWM;e?u!iSZVBYZ_k
9461 z!I^`>nyC%U63$UlBO!ZPZs=5(SUFVNlO;R?B-4}G5?lFGP|MP+{6eMc2^$fOAx3)l
9462 z>JsaGyj7NG1y4Q`8Q+9IMsv%2tS}bBN64_0`6^`*w+6`ikdO^Gt*ecMp_XAt=V|!%
9463 z7>1t7Dd!%-4-k6!G0y69S)p0U2tpbXQ9@={S(K4y29=4dFo#4Rp^J#v^&`S0_#e#+
9464 zO?<u}NmLOg=+{xE39?Cl!m?y_)v%9u9;fNRZWW<0cY{RzG^}>2^#;PFO3Dy&L`s9N
9465 zI+qo?WY(haj)5%mF<M{Kl*|w^HOqXgumOXT^Ok9nrb2jC5W<_GnHuC0lJG4Y+DdMl
9466 zNtl)<V<q{=m%_*d7oAkf5j9|VQLUss;cyHu`H98y5-X#02CAn?j+{!v$j^^A(G84k
9467 zwM-H|56>r8x-KJRFUccQo)CWEI)d<CB^4Qd=CcSgkJ$tv5pvK==M%E4A`fYq<DBe8
9468 ziqQF4cRZZo%r2Qsr#dvA8A9i$jyF0df}vBv5a7w^J`G;ck1tv1Y|3vZ6)0xUai)p&
9469 z9P{*jv{|-6y?LuOAFM5W-s<F_&GJM#fu@+FpNJ(`;wLy8j6pflObM$8W2+RYWAzjn
9470 ztj(!_XPokQV8zJ=Pw^>7mgrp^X6$9K9}E50aqPBe3rM|PTaYE>F9HTO+0PlOCwKI8
9471 z7&1j}Nim0C(8h#6w)1(S)<UL;wT-ayfi}EAxchM1NHf!Wf0J<NA!R8LJ`R#ye|mBW
9472 z1?Q_^p77F?V7|oKeU6bZZ6W+=6)ilhf?2|}VEFSW3Z4i-b0tUIq{=dcblb4?;V_++
9473 zYZ1aLoh0E6O3D+`v)I++v0$e!(jA1(hXn~SeGxXoCC(rr-4iat{{ff%DDuFLTaRO}
9474 zs-^<ruo0Fu-rp2_Mg{YPLm?>BHep&<*t68djW=@MC!{kHc*3-<u(PS_dG)K7kP1XS
9475 zVOm$X1f{N*Ro5&+Dv)(AVOm%C8dK^bcU5u*VOlVJY5PB5{6FeMhH!`mI!8!dk)b^b
9476 z-219jVL!mBO3D#VQxbn3u8Ff(D5b{$W`L#BX(62dDa#{k#k-eQlKYCv1$Y0c`V?i!
9477 z5^hvdBjLY5vX@${(FggpnD4<#2+#vFaETvP{aI?-L4PHZtpzMP(vJWiaU{Z*K&nnA
9478 zmqsHbV^KyPoqT$0>*y4e(!Yd9C@JWvO*Q5@ZA^}hIaJ-u5uT!?4B;QtUXJijO3Dzn
9479 zX<LF7!-d%JbA@jF$;<?IUZsLF({gyS+Id9CFv|*vVJ)dg#hU@?tZ;1sGYq^$ld*Sx
9480 z2dl?Ru^;3%l#y=w6%M_rEEz)Xt&_Z87v%jH(Woo5aY59`!bXeFgib2(`4~8IJjyMT
9481 z<&|&8`OGruQtkxE4@#DY&)Pz{LPRdS$#xGC-~mm9VC_woA1O<LkWx{X4ne1HVsNYj
9482 z%M+R^f%P8b$y!azg2GXDK*|(S1vn9<Jz=u;o?|3jg8d<uk+qrIsz$=Rk_v=vAX!<~
9483 z9#Y0e!k-Ud^rtzt>_^(Nyh3$27i(F*#FqWRF%q&Z#=CrpwcF8Nxid$2A4r3e1^E&y
9484 zucYFVFR{j8h&178+T1)LBVjGGwn!Osgy(}K_nJ>FvBIE<4Z?K%!X*pi_kE3DmQdrE
9485 z6bR|JaZVm7!GqcAT$V6xG+f)zDAmg1gOECn1$hP(Sg4Iz2v<Czg;}(~T##SK5Hb;r
9486 z(OH@nG%k#UG%h#d2-!ncmbHg8Bn^b=kc7*s(BU&ehwJF*6`HYiguevI_;E&wwSzTd
9487 z>j)3gj9s|2#7c+bBRt#jRh3xbNRTBlA!B0=v&Qhq@{o|Rv5c%Sb44Q|BW4->5&seV
9488 z+D=29q2LXU<V!Ii9N^_AG_0^GGHU1+M_HMVmGhuqh|5Z>(6|WuM(@F((w<DRgb(15
9489 zc>-Kp;rCpjxXx`9|3pT0_)^LQHXN0QBZKCmjO}U(dBU?Od1h)xuG+Y)#2U5B5c0#t
9490 zL-QdRS(k(?d2)9^N;)SzLx*y+d^y<<EN=QfT?DQ7qm=t$pSjI4RpjN6l=t~9N7s^c
9491 zBh;8z{oxQv_u-H%RtRY{#l1QIBER_?h5@rTN@>Dwm73u5$}`vShfF?G<m!XA_Jz$<
9492 z3rL!ZL(<EHoT5_PetW5yteddySb}{Cjj+vWE%sA4pC>ZZLYBZ1r<RqlC@<OD&u`Nu
9493 zICd?{Ej2l0(`qH=Yrq`2K=$=Ta^fjSb8Ql7T*wkMZV=|fT~Kb)aWZeIlW5Pl5-V;p
9494 z53Z9bM<bEea0<Q!swKnssFdM8Z#2Wn^kpcNxnaff5^FRQ*=xW<w?i<M$t2y4Lz4G|
9495 zJmICd{cfk?`&GK0kkZ!4N`mBygl|1`jvH--Wsd;i8z7nYHWR-Gnp^;GT*}ISQjER}
9496 zq5eGeQ_P%^!o_JQn5E#m>T8jZuGq61YqSt~st~HLrTX<yKh(TqcF68kB@(F47zvl1
9497 zA9;~9H(jW5wR&84H6WGB+Q*Ms8(7XlDQC64N~|nXRT;t?(tN%$-z_=C&@1Oc@L=O?
9498 zsHC?ts%BOiRpea&nIZBc#f9<)EY`15kAr(V$r$VIVJId02wziDBjMjbGVw2zSlj3r
9499 z{kDhd^Hl$eO4Somq0L9uocbV01?ZTsy6OnOuB5#06g|i&OQ6_iiGOaw=Za(!ZSM#m
9500 z@g;l!yFkt8CjN!)43+o9v+^3A@Wx)>PW_Wqf1Z$HGE;=F#}DPQl)Do?$XSVyp4h?7
9501 z+MjiMs(zY+HZ3EK_$4jLl_z0ZFdW%OLc<N}T9HmnRVRvse4nVCoC&XST<ZXTp`;9<
9502 zYfx|ptQ{V7q7>bP&Z&AjwVUd$4?PHy?Lg=}$>}C^y6ZySbu=?k&1DE(gX;)ybzF>r
9503 zYj7|H_QRPa&MCs5E2)7_{aHIESf*SA?ysm+hVW{T1|{-pCswXizF@K%3M+h1vvk5B
9504 zG>V}R61Pb6Etf)qN-fxe8Yrwz4lSJxd~J%h5t!NyAJsFghNg-Eo=3?aa8%O&Np$TD
9505 zALwhOIW)t#R3|;7e3zbr8uyW<pr<w>mcw+@X`Ya8pOi%x;ZfkSleKRy)Rm<!zGqS{
9506 z9thLA!b@XcSL`V$_x5sAxy-YK<FJz>IuBCrT-Rp8tCW-@d<y$HZJSwp7gU)r328GP
9507 zoX}`3jm}qH4TL=@qqQa0N{*56J4&i0q#u!WC)@OpHZwzbiYm&{9NU^|W1>4`GK6E5
9508 zl=Bnf9GF>((sUy6D(3>BbD=JDp^o1CQ60@N^3H`|N}~%uPPw4iX&MB0k|WWDYaQvw
9509 zfOJKMB_Umi<>?rR@ikx7$<)%hpnVCYq50w48^>lS&%puDBt(C@_CkU1|0t=Buni=W
9510 zqJ<J`cREJG9}Hk*?I(_r@TUV9{T9%>V^lCt*rKEyA^oufh_&xKMnd{y8Cm<WV<b#_
9511 z7hde-AW%@j;H2^Y-w9e^<Yhfc$cEY8VvUg(M#6M6!%w|_70oN5td^INUk^;BhUWi$
9512 z-s6##o6o}cj$HuO$a#vEZc17A)vU)cw*#<1$nSMZYYCTPqnr(kuZtfq-3DCZ5@AkB
9513 z!Ax}!4oy>*455<>CKv9;b}Yd<uNn#`pp4z(4SB*_ygpClJ7_Cl;!<rxf$&El*^sfe
9514 z-Z2tBt)wg=-*^=dH;rDUf_XxkF@pILYd?34gtR0HMwm7l4&2aaEsfr->gxz;+4xbb
9515 zemtm*wS;^fmt|y)u0$^MO3=X%wMwoL(zu*Esp!vYF+=Ed2N`)SxYw#wkbYGB53t00
9516 zD8?0r)aQz{Ho?x@PwNic0^vOD6pVWi3g#);uDTit&jQKl%9mKX+A$J-eE=hCe{hV1
9517 z&ktZ^?LUr@@S_2Ytg&&C8{cf%Xw{V^Y*tboA=_eFmerQ=?WPiOLbk;+vi4i2k&tb%
9518 zjI6!u7zx=H%gCB*S&&<7*{4-kEn%yY>Iu^=lh<5;;R?q{$hH_iYD=s=>lg{y7R$)m
9519 z`;L*2ZLy53xt0Ypa@ew2Y}s5@-$2N=81=KXWmh^zLbk;+vi5t&NXWKWM%F%bjD&29
9520 zWn|5@EV!226*{J=t_)$5l5%X(R~(7n{@Rh~*S{Qz9_*ppf^&oiDk(#Ff|7ECStSMQ
9521 ztOYQ`JdtZoLON%{P+JO}2s)U$*fVk+M3~k!E21k1DRrfS6?zcN-ITgagI7nXVH$(F
9522 zk$|6eB!4l}gF`Enr9fD(n>urZEg+dl6-umq*D(^_HGq+|ryQg2$H%b0Jy>E_Ie!5U
9523 zf14#IL&DQla|6Blz9ad@{s~1}D@%sZDQcvmvmF=V50n(_(R>`bpF}B65<1=W)P1`u
9524 z3X<&iP{1AeqKMEbs-vRssiI(_y#k7EL@9TjH*OJJ=J{OmWT58dnsVee%PX$=A>IIg
9525 z-cY{^gxg|sr%j^G3+5^Kp6bdG@;&)RSH8p=Ey&WySO0hDcvp30C^Zs(MOssXL;EXB
9526 zfpEblTN4WADR`9X$`Nw=ux$-%XE;W}&!vp!ORUkANV6wG!0nvQP-?!a4?1xL4qc)w
9527 z1;RT(ig#itn5W=Xsw+pxm(tm0vqlS%)?5l5SE{ZIrEYa3zw6iG&@;+XAbi7ZZ6*8%
9528 zNVb8jwQXg!Mx3Jh$5efu@b9X=j*tp%n^|+}gHhZA%PZA`0^yB#@GrL_!{03?*g?93
9529 z?j+499L2`e?*q8rk)8oO0@~$-*#Ow2qzvJ8N(v^jnXvq(dXOVbbcbS*a4<-+bGE9)
9530 z3b!xH1K)>n{6!Vbh0Yg4=YyHxX}I&Yx|Jc^QGHmo=3G|BslhDaq%<EZ*E&8zx-T8H
9531 z=3II^T|=EE{47XiK319>AK}GmK31-Ce1tcp`B=H#@ew|f=3~XBLYC3|hl*x)L4O~l
9532 z{hsm1TbO2bY`fE4N8K*X>b?q{E~kRgFdjjks6EiLyu`{0+5>sQCM9JE=c#D_@)9d&
9533 zIX=dLyA0(4J0abdCrryr?;|LTNNnZu0}R?nb?{~sYD^o$=rq#OuazsqfVt=dYmjGP
9534 z=C3H@XMCS)Q)hgiH*$_-cTdvs6wCxZi+TQC9jq>VuE<=w5;iy)R40d&{OB1PW5wh$
9535 zG(Sy!UFFR~zOpjW*B0GoM0MA}MUxK1-_y`!3GY!-k?<iUWqn^8kOmy{(HY-oiri@N
9536 zS;`YmC1YRG+$;JlYcW!v(^;TEI2PMx<emoM)X`R6tUYobEB)J9qCL;Db|I)`R#xh_
9537 zPqVVN2GlYuE8iZ#TFLEq)$Kgt{xB?OJHja`5A!9~Xh9e^uRcrlH5!#1Ap;@)uZ>0}
9538 zTZ%+w?Rl}NWJ{5#tUWIlmGFTmJCnZ3%~HZ@jY<O{<6!!&R->{H;x1Rjg!ITVvPPGL
9539 zk&qF!jDApeMdYTTG~<f6Tcg@|2_UzP8#dw>9UCM1tTrr|L@!6S-imU9d<Jma-B<9h
9540 zYS@hJ$E2$J?_HH_Ke{v=yMJm>22zt^Qg^|P$5DPVDL+L2LOQ<#+otV`q1o(;W!EwA
9541 zhR@eE1g##0QYL&tCal>w#P00Xe$Nm(?dSN)lf}?_p3_eFn394X;h`6mB|~^Cnk=);
9542 zX=o|CIC4|<OW<a3WLZh6W=Kc27Vd=fnXGA)AzTTPjNzNk^IOY<*E%^uhO#WjSTb-?
9543 zW#^*pD^bchDEy(m&lKxmpC@vbrFSR7R&1x3&m;b<2$IQXiky-DyV2%{np$qt3<;7b
9544 zWXbtjeobkliL@ykAU;zp#y(GEzr=qxU-%wV%Q!a-HqR2=iaZ?BC#aSj;X)-9370D=
9545 zOUQ90gNNhDjl!(&Q9Ts2pfnLAZd2vKnuA83SC(8jc!NHD4BStvu^!)_gp-KV9Ar-k
9546 z;@?x_8DGskIP|b%A*2(7lHTQ|-{82j7N{csda%k4EZ<sEz=U<WPF#T+_QCaFiRQD<
9547 z6w7CyCz8+qZ_Z@Y@+)mr(4iqqkk79}dWfzNBXg6_6l=H76PdqgV~VpC&KW*a%ocgL
9548 zd`hjPs5`zuS_{jM>Z!Ouc+w6wZRAu)crr*vSGb|$PtfsCl*UowT~t|}pN!Z=l#Is#
9549 zSu{)l+|!YKsYxIlt1Jb=#URDK3<dKPY*$@%glS#j)9FJYFi!<@gl8!!L&z0P<fOR*
9550 z+^bcpK==!g;;jh<^Ax;Sb=483b%m|D2m<%0V2<!UC1nU7R#Gs^*5lC2%2FWQ30pto
9551 ztqBG56dVpg8AXI?U14i}597mBFh@8-Ng2W&loYgvn_Z7nmIC3H*dQctdb(-}E4SfR
9552 zuB^mXE`bwTP}#|<EKgWeQh|^vMgQe7{VM|fv!SF<m1PKD8*IIh^Xy3YU4*MbB5YPt
9553 z<|}|VDJeLu^3CoyyZzi(V@KnYZX+elO@&z*;b&oQ2*1iIq{l#d0;P}$chCoxjr=O>
9554 zd?nQ{1N@SbGKBmXt6Xp2f(KbYMJXgc8r)(yBa_jN0=NmzR71B}UN2$gAT<~y&E1H<
9555 z3wi^i;2dZm<l{fNcqVj@<{Aj^RX4MQ>@}J1!`=!`Z9hc@JgS+H`6HU(p8sYDXK0{u
9556 zC&O}4J;)HQP*M<s-4MI!u0sjg{gJ8gc;wA&mp_Dj6R}8r*K3M7*Bp(uFhvZF*riK`
9557 z@CRTwY{c9QA-P957-5i}e|2$~L>b10fiUX)Eb_gT@w{>g-DRA`z<Ys#GSN3tCi*tc
9558 zM8+}mj330zLa}@C66WC&bc<;F_u}R3D|Ba>I31NEw2w1{OuRB5D@;LSnwXPEnbG%|
9559 z{;k*9Dwtt>7IXKvDhP1MwQ${e0oORB)Zr*49BYFa^b{Oya!fZ>WMXDYz7SF_lG+6%
9560 z?Lw4M`#i`&TAdtR;zYyw!qC_g?p<gH2SGP{e#|d`@jFpgC(}wyL8iB%Q9qN<(3s=S
9561 z=Cp{-X@Si>kwBAOBJt~T%pHlK@9FzEU5s&wx+ds}J#g?4$8=RiCQd(MjF57X?&6_S
9562 zo$4?X$aJhS^^GgBates@3lKu5O!)j3S7S=r2Bkb)+4K9BX|uf1dpf?tNGrn`vYs>K
9563 zH{ga`0o(@ofFluZ@*Epn3v)Uh?xxk7mN3U=BR^!a2qR5No}Z)>38_q)M^!vO2^S%?
9564 zM}iOz05`y>(F~?=0DQ7RcRE_@2H5n7uIZ7%G(G5ezE;-hI<#~d0_O(ip%Go-kHfwg
9565 z_%$UWHzn}lPAmz3txLnq(}2HqBtN}3;1J)=Cc}bo?*SVpHZPc`;P$#pqMq>6DP8#z
9566 zYkN6H!nD!w0wVNQ-;qa4axp?kGv>l3t48-wqjiL7qv7L}R}muj7QP%cPf%SsLh6c4
9567 zo|C|Rgh~|%f2gE7!n;9=UzSlYqk@Gj;2BEF5jH5P;P>Onp_I=;=^m%$Y{11z$`PKY
9568 zq`+23DCOIt^yN;=D!{9ilp|z}Bx`*|7l%?l3+sI6hiD;u7RO|oC43Gf+aIib=oqPv
9569 z<t%{t%98mm;Qfw7MbA4DkSnkho2*N+0wF)jCVmqB9bDE=*0$HH!C?AN0`+;SpQ9FY
9570 zg#S#b&zD%+M%CvCY0>x*j^xm2mPX%DqeVit!syDDSfho=BOZFo3vC&V4?^t|sy;(S
9571 z{2gy(%+{b`8Es&J@O&lJ5nck4tRk0}SSdNa8vyTdB*F)k6r}QW9HL>fmM8wEiq(h8
9572 zg9qB5Oj83j-KokO2<dL@l8QeYe?-L!gfA*7NB9?zY@V|Aj$<Tze*hzE{J52@90+&B
9573 z<$=}chL1(RftnZ8LWa6VLom|+zxSjDCp|k38A2T|;i&8%N`|oVGKl6TKk+NhsPEU?
9574 zIP_j+7Wz3x{R}SbYjEfUWhoGzq@)aCkCJkPXM<#e#~SY(Mb>9I2%M?9GL*W=k^I)q
9575 z#34E-b1osBi}b=8NZqB13xtn>Wc_CC1;<GE?f^#LulsQHCn}iv6W|+;^bf$d9m!X;
9576 z4u_~H_G9}5*LkB+N)QN(N~$NE4U%mkYs(#@?*i5DqbzyC1|`)IQlU|wFR|v-2M-4h
9577 zfR3Y3ZsNsAKC8S1X;pX+z~_qW#GzY#>VGh|g)D*RD<JK@epMjkrM(R@YcHs|0%3>V
9578 zFs&mz8zd|1_r}Z6@exY1apN#ZP($n$XaDl#WLQuvt3Cu5=#+X7(px6O_UW--eHmLK
9579 zk**Av7i*M12(w#oHBk!_bF^)-dpzW7s_YP1s3`VpR7l^bS_*`ZsCn~ri?wGRBjLC8
9580 zvOY)n9gyPP!XM%`t6+w3o|5Vad2`g9_Ih#nGRNlk`A2Zji5(b3cq@ocR5d|ol4V=4
9581 z4CqV}cf`R>bmjqIISOU`h8?+%1XpApCJPlsI+H&_eOR>=2pipv3c?~twvSljZx&@$
9582 z>qnOA`D8*i^AhrooLm7CUY=5)FR^yJ`cX$ni^h*|vHA+yvXu&E2v1j1j^5woNQAd4
9583 zDMLt$kuxjXjP0YcR4x!=S9222=~0mUIZ6>E9HXn=I>PNhvbtE~`(z@I#;N`%sy<Kn
9584 zqLOA2Qc*mlyzC*jyo#1^19ZvBV&%dTDq2v`ag9g@Z<Z?(Wh!_Ns^!Ms{Wn+~sPlOv
9585 z!GV?pJGD)x5f*VwqzLDLWMj|Ta>qz@emPoM@`O!FswbpE8++EA`rzbAGt_D3IpT?`
9586 zKSxa+AjymGs!F}6P<@$5g)FILvPv!-Tw>)25G7`WN2d9xgyr!7wJ1f7Fb9%cfekH@
9587 zpXCYwK8_bT!s~HJ5{2+*APr9X?p;=5?NOzgGZJg>J8{BEI=qZHj%%?3XcbDC#|VF+
9588 zq<TV{vHi&!EkxE!UxbdUQOb;8JuGm7T(q2Wf`Sp<G~0~^N)!pV(sgkoAy?#slVy)A
9589 zE3x*vV<hC4GA$!(Yp{+PmaMvb>5yU5!*{OI9e1gpC)`f0)DhAF8%fsagN#r@8n%oG
9590 zqZXmjERF6AkL9ie;VvK<UD*<Av=F&{aSlSeOhcR@<QsydV?ss2xV{7mRyjq4G%q*y
9591 zFJ7t*1K1Xk<E6E%1qd@PsD!73B!jN1#0q1Zis`l*n!3>UV72~7`1~*DJ0b74i0><x
9592 zvhufT>%5t}h<~r12_q})V#7$BipI(y8obH!Em)9f5Z(dOP`TJ2VZMRu8xdZ9hxc@C
9593 zeul6GBo+5Nf_8rBOcT0$3OPc)CQ)8rOABqzDB(3q;%uo_8xU*8FCELhwc~Sy>}zxV
9594 zQjf!TIyR;NgPacdKOGx$fpLnQtnWwj*Q1PGF!?-@O^qQ-Fk;w@4)_<d<nu%<g)D(3
9595 zzQAn-x+7-E=ZRPfSprK;?&r1R3xr#5Vf)@pP2u*zQ8+pQrA+mNjVjnD^Ezv@mD(dz
9596 zO)G$jI9i8NmRv*cw#PQhTb&%aS)NGZEQBe(eoBTTA-_{9QiPX+Tet|XP*N~h*5DA|
9597 zS0&LQ{H2p3d_qYDLcYu@9(*3%-~<UT!3Bw&1PH$ZlGVl9LynP<uTrv%ti9kE3I8-e
9598 zBWrvP9$6UB;kVS`JmHsBeH|fPG=Ahutd$%iAzieLto_b064FJ>$lANgm?v~?2u?bD
9599 z0oWv!$}9w2=16{Gvzh<amIq^yEPUzM@MO@u*J^x4<$8p*rvmF|;L{xSt&x%Zp(8P7
9600 zFFBHL_&^-WDocinzTrr|6mJ#ODofCApT*pJ2(Q=3<;(|9L6{D%T|wv3z3l;HKoWjV
9601 zNp*xpknBKUt;I0{1;swfk|$)dWmFJSq0L6toO<$YLVcF%c^gEge?lrW>a!)*ocds=
9602 z;UpO1o(%~OAwQ&QBjGzl!RfBqgbd}NM1FeBN?KcZFNGIs<Th&pUVl6V3+5Y=#Cy8c
9603 zAK_6T9hNK@wtDb_k*f#qwJ6!STrNmf4<3JBGJfRBGq2ct?6fgsCXD=8{&wDBds}Y5
9604 z+wL`cj9VlxKc|u_oc@OZ_j7Bl8Gx%C>0ZE*x`4?{1iZkJZUy|<k@m#dw-u$FWC*#z
9605 zOfCiZmd`&cSL5FSPtw_?k?*7Yo+GUT9I9h6OE^MF`CS2<l$0gx0ZFcRlbRBT+f$B_
9606 zkn^qFvmxZnGB{Z*vO{sZYo6Zr$}R)EOGz2R`;?R?d=R9;Nx!J`6Y?4m#%kBiB3!Jb
9607 z>^A{FaHJj4bv@df*{cEHbR=H;v})I7R{`=_lB};spi|D&e#$Nd{JA4N3Fuz5n>iT$
9608 z<Q5kBYe4!~do#Z^!hWKLKSOxB_R~TM&T`c5bc}>QQAX1#ucCIChC5RSxK>GL`~vW4
9609 zl)Fj~95!Z*3>$wW?J=%bhEb)y8HuRNP##7+OM4=}6p#=2<<3JjdZ1N%BEJZbtA62n
9610 z7o=mgbMkzG$#?Y%*I#jzkEnz+4?Xb%?VSAmfTLa5_XeD=r0n^Ce^yfM>wpJq%xejc
9611 z(3mfkn75&JwPPf7PbZcLBfr+YhxSA*_agHhhO!a;4zF{BR4M)&aX{iflK60qe=Xr`
9612 zkZ%2Nr&2QmFG}|M?<eA&jp$xx@*cnHt!486$nTsmeTT7!SD3oTo4K1_-{TteEZ`xU
9613 zJ+-xf-*cqr0D1i?0Xz+<a)TyR?IVCSnku!&0lG`)+Ur27c6l)zu)&e~0Dq{Y459lz
9614 zeB+Zi%AKh4;DeA`!X<?XFV!47S5oIb)c&bCmM45qNoOcT3fYNz7u3$yw96CrDJes^
9615 zL}h!#F5g)9j522ZWE_R9j7OoAB?lqDm@W$@LVo+)u0mMbZG_btx!$1qlU045uun;i
9616 zgx4!6M|iW68forFO3D-dTS<*$v8VHED5akWxy{oq_gHh@bKRyfqW9xeeU^|e%W{wK
9617 zeC4Vm{4z*`lZES&5^HRm+;$^$&1_&ZCujp2Y5}iyBto{rt}$7A+cAzn=eTAD%T9K9
9618 zvo@eWNdL?dkl6WJps&N#UV-s<+lC8-7lCVd(wo?|UWpEW3x|vy;^#tkzEO_tGwj4{
9619 zsAMo9+nh3}eG70j+RRRrI}L2qk2M@Qb^vV&mv19-V}lA(J?Wb#OC*75QxceFX*2TB
9620 zm5TWO!(qu%S)q^Lea8|hZ)tOC3E6FqnZ4(X*M`P}Gg<?BiXAMmU?;N2K3T*<MUA1N
9621 zMuvgi8wm#$G4+PX8cD)YV%>RKpn*rw2+1EpX5dIo*nZIwnh!37YcS|ipI9e62%BCd
9622 zAcRvvva>2{{PK1rv8aBoPP}=-Ta;8F+)gdl5$*_*{5Za+#0m}C>Cw+rzCiFsHIOBw
9623 zp+U*n;RCGqz`v`S92S1P)n_u}+IN6FY=g|6glxfp=FnigIon_{vJ1*xQSOe?w>}Tc
9624 zlKCk4MB^gVFGb1c5WYO`+IK<!5|rPlVDCfFc|9~1`u9cY>z@X~2`DotXQ8|W<quKb
9625 zkMcp3eo=|<S3V=^XTjfIl#5U<MY#gy7f||YxDq@a?VF8qPKEY93p%%Xa&zimEAS7-
9626 zQg9oT+oR-HJbZs1!tuvZ{to3UD1H6|usr-DO5U8Df%V;N%)Xr{E6E=P`I#t>Md|a;
9627 z2K`!;o6~;-_-;da2g-X;K7jIPC?7@1_W1Un!;+FO?yf?+hE!<ZVVGTyM9E(l%|X2t
9628 zWe-Z<-dmu*f$1bW(sFd8d>-XA?&$CoEQH)*lsBXNF3P)5K8Vs2Pc8(#lAO=KC#Ji}
9629 zD5s)445iOM68`UkavaKiQ2P7@jH8t-k@wu-y)Q11jzH<l-wL_sQBH^aN|bz*Og+AQ
9630 zHO9fGP;zrDHwF0oZz7-GM)@Af4^aC2>oIONqI?VG`zU?>hmm(rp!_XLzQ)<--xJ%l
9631 z4n%nf$|F(w{F6pm3SZ-SC+d82rO)qw#JLvyXQFIG$qy_0^8DQM3E(>g<>vJ8E6%>Y
9632 ziy-g&&rc-#{QNX;`!@E7|5bCJe+Bryfbs&A{BEz$e>;xfiIQK--H5u+&#%~Sy{$d6
9633 z4NAV*&*$d{HTeoEem#^Q<MjD^kcYRTT#J(P<o&2WgwmJi7hSeMevU@TFU9!${!8T(
9634 z<ST!h>Az0im)~);rR<B+f5n*3&-YF7jZX8nvmA?1`uybM8<R5NqnyuAJ*&XC8YSO@
9635 z<n!}2Kkw5%o&xceJU%~vggyoH*&!$ouQ0#yN8`Mw*o}FLxAA@bmH3ubIN$T({A)P=
9636 zQ}o}nC^w?y%K-czZu|E6tL>4<8$RUZueg2wXTkR(O5QsD2zCD_%)UJD`~L*z@wM=m
9637 z?eO{k4nF>7m_P631(nawACVk`{y709e?j8&^TEj}7+?OLbf5q0Al#1f0hB*S>F+@W
9638 zS&Jiqjz)Pr%A9fx1Ybh+LX;Py<R-j<+)2WH6o;Tahoj`a3ZI`_#QBu?D)i&MD0x17
9639 z26bPaH@6SPaXzj6Eb6DA<YQo8{t@*5EUdHqtA3xK7uc7B|0a~Y-uEw(efdvNA0!)e
9640 z6D&v4?1O~3ca%OTSsNLygOb6?BbX)!>e(VWe3vxE;z7xfWX0GReP}Z3(=qz6WcqF~
9641 z`tW4kJ~8@;WJ8p`WwK^+jDKXZHcH<r`NMTF{;iW&qx4TDH(@VNT53=-Dw%#?nqu*w
9642 zWSeBh^EJVNLCLns2~qm!3iL5aCd$8EGAl~oKA9b*?~tsE(sxYOycqLyrzF`Bqwky~
9643 zFURP+B(q<O(Z?pSzd=bP8H90AvTKZ8=#eBT^Vd}1A6J1sz5;#sfNoazgOfKu_79k=
9644 zimD`xzeG$%SD0^Rm>Bv-FApbzKI0$(slQ_dS0yf<#t-vnrq?R@q`03CON4IpukiF-
9645 zQ05Qw>f1t(wQFq!x=HUC|3ek%zY@Cfr)H)A`Qzo#bAk<hhH0Sub=x9&Q_7hB4}@;`
9646 z*PLn@e+K>`5|9}Gr-W|!FK@Pt+%0NuPZ|1(HcLMZdJY7AJ?Pw!dpzjt=2=GWp|1sf
9647 zcDtqD3O(k>*hc@Tvn*jD=;k&~RkCx!&(mzgY3wqg$Nc|V1^ODH50QBTXBjPTDbwAW
9648 zpU3a2py%oe^!tS_?}XNQV>bN%NtwP&!p&LK{}|}p-$lB4Mj30@a~0?&-sSjU-k1Tq
9649 zLXPVBYngvkvf^<tqIkDV567c99P?+8od1kne;ylErib(7PC`%QvmgHaZ}!m`J^s9B
9650 zZU<B);rw~3&~fEu6zZS3JsP7gFVkhVxx%teg~SCF_)8V&_f?=j4*hG-wTe%Kesfze
9651 z=8yTo`nHni{6Ok7tQWSB<!Ow6Yz6uO73k(QSTQ|wD$viVK)+b%HE2t^xJl@4w74Vp
9652 zm-UQH*3GcA&*9LcpkIEeCGf?KPm=#aOJ5BB4WO^ZJiImNua)Vjq>7J(9`ncCW;Jo{
9653 zX|l}wOMaWb-9WFw`n%tflYKy6GshA(f__+;j!LRH75te)ERlN%>niZKSD>E<J?qfk
9654 zBVgmg3jAw?J}NR^ZiJp0$n#0ib4LX|X8)0i&)Sk@{FLOS`Fn<XF0%F0ZIQfGLC?qJ
9655 zUtk&Emb&@dTIT6(<%e$m`fyB{Zh6xGn@u&byfwF<jh}0-wA@^_n$2xxI<AZO-TD^L
9656 z<>_Pj?-E=VoCEs0FIxHuwn)sUhK-)fao(ASJXu|)gDF**&D&*u^t)M?m_Kv7Cg#7n
9657 zogJe;3q3uZR(`TAl9xeW3wi-`bKZ;TG28ZHbn||-7~SkWGXAeW)G8i{em9qAhQ4m4
9658 zr6VnpdeGNgX6eh}kJ+^p)4#X^-E2WO`qv(76}*amF&l?tdcI#F-)@JV8B465Z@`~*
9659 zpwIT^VRP9U)Bg(iYc945_Cde@y8{2#a{D2sXM6?v)G~c!G8^+7AA=oJfxn>w-E6fn
9660 zaqEGC>1glr3jANIK>rT)VByw@emA=*js6YLzpvz(`THgLF`vvte120w|HcaR5wfr`
9661 z`qyK;n02c88(pSboc@15q1U7dz=uIkrppp;fd9u=&~qmE*L}_MbDcc50{@Z<^i|N4
9662 zOtE_SSnMj$*I#bw++dg)5zmwBD(JrpdPbpLldZbMY^N}BTXTUWd<gne74(>Q;u`+U
9663 zC6<x<px*)g@-Ko8J*QSUpAM06S<VNXh%ikg+m-1MP8FX4|624fuSlm=;5Yj^jQ({v
9664 z|C)8D`7^h33_a<v^=8mJD(E?1=%eKNZjpDr{G|%~*FgUaT!<jt$+tn@fca!kYd-lw
9665 z1wFs6KsTSQjLi?#74l)M(2f88x_9pi{D)ScpIm`HrviORnJ(i!Ya4nE;=B^{QQrJ%
9666 zKDB82WmKc(uamqnf95e{ti9{Ne>oNoyqx}31^#y{(EkiQ>!IhH)@<@l1^(gkShJkB
9667 zhg-%Ez(2Z7M<rF5_v{(|8jRnyICg~4Yf^lK=EZrj_O?RLik#)#66>En&_`kXu7si$
9668 z74(?5)y4FG7kbuQWEJrI`vB;Zur6wW{zoh5d9ech1EJSIHeHO7p=jc>9{SC^Z~pcM
9669 zeGSGh*S%B9bjy?e|0M9QyVg>7M!tOx^c9y{`lle&D)jMb1;B0P@fF_B{CowwS3!Tx
9670 zm#qSxcW$o0|6}m4#d&Zq*nP4B|LYa#=G_h^ZatU}cZHs<L0^mcCj)xY+}q#Rzo4yc
9671 zVza!={iI`RizlC$%NL7DOKWfI-1ffy*4|=&XR*1XyQ{TNI9j@kb33}{G<6hP`n!Ak
9672 zicJd^CC%NPJsqw6tt}I$O`Se9&Qxq`?`khL_4YO`F1B{{_byJ_dYd|1i!BQ}I~R*c
9673 zs#X-v{sF9W7PNP?^tPTYJ~nr>i+FpBz}BvX@_%1zS4&@O@50tzsq{7%dzzZ(7dyo9
9674 zq_4lXsi#K{Pi*e)>g(_6?e3X)VA8a(r>PyhZSAccEzLcPr3GDW?Q_f8`itE?{q5ad
9675 z#lGH!i8$SY`o#9W-lmC@#GZ0AE$Ft?sg|*`slR!i@u9t^simd2*wNkG)R7iw@9MV#
9676 z2f-qA_Z3@O+nN@1^d~Lt&Hds=drxsee|v|Z{?49x-F^LY7PKWOJ6gMvj&9>@XLncs
9677 zyuL(^O+0wYq$vjUwJ$Mvs(7(~XUkM!%FI0W*b`4ZUPAoY+L@;uS3K_2W2JX(R};7N
9678 zbr<I~b+vS~CdFgVICbVJCmtgl$Ddj#9(Mx7PB^w!NcmHap@QR2KJDn4Cl^oq>}PYw
9679 z<%{{5N1uG0Q7b`jZt5>K&znDE#_=bgc=R#F$rBHnI3;QClDKvCclS8*<cY@3Vpr=q
9680 zNniV1>7M4!roNPzIW7vjdU_>pZK2Ax-qzMYn+c%FwU&j_@g@bDoBCRtJ43U*txYXO
9681 z+wT%i>8SqpPETFaobKNKffkCz*52N(?sC_fEE#xIGNh}eyVE1~_jXB+MTovv#S`<V
9682 zNG5RHNwCeR%QwxDe(CFP>0aPDV=}F?M|_kKwa|o8(!!=+(d0^(j4xB2E0J$+N!t6G
9683 z`uhVnTH3ufh=3g;)F%By{WxGk*WQ)1HFx!Q3~ZJWUeG@;Ij6V1-wURA(bL`%uybf@
9684 zf;0_eDYmvW^*5Pjw6scZcFVjWb5WnCyrX?iuXN`r$4)Ku2tS)`Vv~sB^2k|i;!*4!
9685 zs9yAz$GDwAlJYENvPK5kKt_|<W@eGZF19tbr`kOwan?_inF}GeHqAU>2<2=uxhXl*
9686 zB$J<MkI7VVZlTN(QWZ|7qsiKNp`%UB&E-igJh;F#ZJ@uR(ImGSk4AeL%P=z0Fp1vX
9687 z*3#tVf*dhXm{X3^KxO4&-QPVw61{T6I-7dh+9gTF(A@6s7R-O9D&{BmcP8!K&3>ww
9688 zdAq-RpdBM1Wckm`=cXUJWHJeO?5LGfMr+xm8}bs#va2l%!tvgHPFHb`na=Ix+}hWd
9689 z7~cmf?`-W1=885Gn1O7jon}y#r+G2i-_chlnBI1rGRZe}$kgH}nDH=-gxhBQKrzE)
9690 zGQgi5#3%*(WWMYwCr$ZeCg;4~zH%sxuN__Dku;>UdtqxhX_gPkbQB&D{mt`Qo9CO!
9691 zxV5vVf3ckD2D)A>&XrS+83;1v6q9}#kg1gI?@kR0v{c-Yl$UA91U5Yf9*8qSPrpBh
9692 znr1eY2fT^9WUtArt}sz-cFQ^1c7_|`a>DIsZT4KZOma?dHo-PBI{eIeLh6#kliOQt
9693 zQgv47HyMCMIZrJz3zqi2?&d=dDfaa>H+8kSI87^ei;QJV$;ef+q>+4UUf9;_pC5#?
9694 zCFz_Wo_>r|Ev+3*17-`E!+XX0!pf(`@(3_zoJbe9MjBS;kFpnwbNc#hcPBmF9bWgE
9695 z!Q|SFtZfUMA^I2h$(d=OJ5$PWvgvD90PGPn8<*QC1f+YvoXdKX{$|Msb7Y`R$0mn`
9696 zNs@L`OzmAVxAZ4%-LftW6xkGTCk&G+ktt6MwYQZ|uEmoU7HhFeKBl9ouTPf9b34Nj
9697 zq@65}TRUZ$`O74Eck}#k0yiE?)B-2XJeEGY%POxZ^Ng&FySuuAyhk#`R%GSXMs%&=
9698 z&S!a9(Db!+_ja28G4pLXt))9;71ZtZgp>MgdzU?@p$(F+&5N4MxwWaIeTjFXlG#S$
9699 z9LzOh&$QG{)}o_-aZhV;j#+!Ts2r5aqw)zsT3l(tXaeoeX{Kvr#e!iiwa)o{vRFzc
9700 z_AT!0Z<-@zf3Gd)5p{L<w@#efwP0d-?XtgcmuvHy`sO7QTNZbTq%9?D%SYr~)+guv
9701 z0hOX0>y^Q61b}*E{XelhQA`v#ac;L%`&$>u{}Q=&Vd^d~g(kMn!`0F}naQ*!y!LRv
9702 z3|gzlUPD=N;<K7X#xNS|qO$C1Q)hd#c-P%;4BNxW#IhQ>wCj}XEupo}Suj_WG<D6D
9703 zBuBNqtIa5|hvv-bZC%J(hphLB&FBS_bR8iy@iO$kEzR=}b87&%V;ultf~Od_N0d5I
9704 z&^sT0+)a7zt75ql2XNa-pW9P`xgRdKFw{QxU$NW~Hx`UtqeE_omj8A{IYUZAr+x0z
9705 zV#(jNf<3|Q3s#d81j)-I)PL^hVtF(K=s)eSG|zWFO38EI7falpl4tPNNBU0(S_JTz
9706 zp>cm0OU9A*DbMzs`=CbtXd^6t+(*W8r3tS58Tp;$pD({iXr_ts*rfc&{bnq82Azem
9707 zmHz9KN?M-#(pav;eJ9F{0${n!ljr_5mgJ*6{b&74o;>%tv6L4h5BT%-ncMAY|M|R=
9708 zrQEg}@aMPxtB_|tyn3BwXSr^>0pc2eQm^skxxa$t#Z(Ld-~P>>Jon+TJlVS`>BsN;
9709 zkRJra+^;v|d27(;_v`lxo1syj`}$7!g!1b|c55Rq|IFY2R{k-OF;fKPxi2j93GF{C
9710 zvZntj&;5k6KB2r}OUrZL;cUpymgDKansi0*Yx2*GJ=*8~#C4G0V3f-r`<?M;9-lAA
9711 z()PKJam|ZmvGV+8k^P_YEdS-n>wd=#mVYB1vsKMs%KzJ!f4RnTzHE!xoLFo%!BNy?
9712 zP88>jE}G%<l-VXQ^2d43*4+HX`cRQK?Vm&fO3LH0pB^>5=8xql$XlxWe>LpS@WvnI
9713 z$hlhu`KMpE98Yc_r!9T?eJjX+`*F*8(YQ^^A5ua7fPYx|Z|t*adGkqC!|BKGmv+Nf
9714 za=SNwS*<R98ORT`k|awHuz@?`j{}cTp42ld$lo){X2c4)@1Fki<;~t9=1!XL8T@{r
9715 r-4pPt<+giWTvjt<SJ=k`l0Ai5EB~1H%u92Ah}mC<-<j;N8UOz;XHns_
9716
9717 literal 0
9718 HcmV?d00001
9719
9720 diff --git a/src/plugins/vbng/lib/log.c b/src/plugins/vbng/lib/log.c
9721 new file mode 100644
9722 index 00000000..09b01a2e
9723 --- /dev/null
9724 +++ b/src/plugins/vbng/lib/log.c
9725 @@ -0,0 +1,57 @@
9726 +/*
9727 + * $Id: log.c,v 1.5 2007/06/21 18:07:23 cparker Exp $
9728 + *
9729 + * Copyright (C) 1995,1996,1997 Lars Fenneberg
9730 + *
9731 + * See the file COPYRIGHT for the respective terms and conditions.
9732 + * If the file is missing contact me at lf@elemental.net
9733 + * and I'll send you a copy.
9734 + *
9735 + */
9736 +
9737 +#include <config.h>
9738 +#include <includes.h>
9739 +#include <freeradius-client.h>
9740 +
9741 +/*
9742 + * Function: rc_openlog
9743 + *
9744 + * Purpose: open log
9745 + *
9746 + * Arguments: identification string
9747 + *
9748 + * Returns: nothing
9749 + *
9750 + */
9751 +
9752 +void rc_openlog(char const *ident)
9753 +{
9754 +#ifndef _MSC_VER /* TODO: Fix me */
9755 +       openlog(ident, LOG_PID, RC_LOG_FACILITY);
9756 +#endif
9757 +}
9758 +
9759 +/*
9760 + * Function: rc_log
9761 + *
9762 + * Purpose: log information
9763 + *
9764 + * Arguments: priority (just like syslog), rest like printf
9765 + *
9766 + * Returns: nothing
9767 + *
9768 + */
9769 +
9770 +void rc_log(int prio, char const *format, ...)
9771 +{
9772 +       char buff[1024];
9773 +       va_list ap;
9774 +
9775 +       va_start(ap,format);
9776 +    vsnprintf(buff, sizeof(buff), format, ap);
9777 +    va_end(ap);
9778 +
9779 +#ifndef _MSC_VER /* TODO: Fix me */
9780 +       syslog(prio, "%s", buff);
9781 +#endif
9782 +}
9783 diff --git a/src/plugins/vbng/lib/md5.c b/src/plugins/vbng/lib/md5.c
9784 new file mode 100644
9785 index 00000000..2344fb9c
9786 --- /dev/null
9787 +++ b/src/plugins/vbng/lib/md5.c
9788 @@ -0,0 +1,251 @@
9789 +#include "md5.h"
9790 +
9791 +/*     The below was retrieved from
9792 + *     http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/crypto/md5.c?rev=1.1
9793 + *     with the following changes:
9794 + *     #includes commented out.
9795 + *     Support context->count as uint32_t[2] instead of uint64_t
9796 + *     u_int* to uint*
9797 + */
9798 +
9799 +/*
9800 + * This code implements the MD5 message-digest algorithm.
9801 + * The algorithm is due to Ron Rivest. This code was
9802 + * written by Colin Plumb in 1993, no copyright is claimed.
9803 + * This code is in the public domain; do with it what you wish.
9804 + *
9805 + * Equivalent code is available from RSA Data Security, Inc.
9806 + * This code has been tested against that, and is equivalent,
9807 + * except that you don't need to include two pages of legalese
9808 + * with every copy.
9809 + *
9810 + * To compute the message digest of a chunk of bytes, declare an
9811 + * MD5Context structure, pass it to MD5Init, call MD5Update as
9812 + * needed on buffers full of bytes, and then call MD5Final, which
9813 + * will fill a supplied 16-byte array with the digest.
9814 + */
9815 +
9816 +/*#include <sys/param.h>*/
9817 +/*#include <sys/systm.h>*/
9818 +/*#include <crypto/md5.h>*/
9819 +
9820 +#define PUT_64BIT_LE(cp, value) do {                           \
9821 +       (cp)[7] = (value)[1] >> 24;                                     \
9822 +       (cp)[6] = (value)[1] >> 16;                                     \
9823 +       (cp)[5] = (value)[1] >> 8;                                      \
9824 +       (cp)[4] = (value)[1];                                           \
9825 +       (cp)[3] = (value)[0] >> 24;                                     \
9826 +       (cp)[2] = (value)[0] >> 16;                                     \
9827 +       (cp)[1] = (value)[0] >> 8;                                      \
9828 +       (cp)[0] = (value)[0]; } while (0)
9829 +
9830 +#define PUT_32BIT_LE(cp, value) do {                                   \
9831 +       (cp)[3] = (value) >> 24;                                        \
9832 +       (cp)[2] = (value) >> 16;                                        \
9833 +       (cp)[1] = (value) >> 8;                                         \
9834 +       (cp)[0] = (value); } while (0)
9835 +
9836 +static uint8_t PADDING[MD5_BLOCK_LENGTH] = {
9837 +       0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9838 +       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9839 +       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
9840 +};
9841 +
9842 +/*
9843 + * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
9844 + * initialization constants.
9845 + */
9846 +void
9847 +MD5Init(MD5_CTX *ctx)
9848 +{
9849 +       ctx->count[0] = 0;
9850 +       ctx->count[1] = 0;
9851 +       ctx->state[0] = 0x67452301;
9852 +       ctx->state[1] = 0xefcdab89;
9853 +       ctx->state[2] = 0x98badcfe;
9854 +       ctx->state[3] = 0x10325476;
9855 +}
9856 +
9857 +/*
9858 + * Update context to reflect the concatenation of another buffer full
9859 + * of bytes.
9860 + */
9861 +void
9862 +MD5Update(MD5_CTX *ctx, uint8_t const *input, size_t len)
9863 +{
9864 +       size_t have, need;
9865 +
9866 +       /* Check how many bytes we already have and how many more we need. */
9867 +       have = (size_t)((ctx->count[0] >> 3) & (MD5_BLOCK_LENGTH - 1));
9868 +       need = MD5_BLOCK_LENGTH - have;
9869 +
9870 +       /* Update bitcount */
9871 +/*     ctx->count += (uint64_t)len << 3;*/
9872 +       if ((ctx->count[0] += ((uint32_t)len << 3)) < (uint32_t)len) {
9873 +       /* Overflowed ctx->count[0] */
9874 +               ctx->count[1]++;
9875 +       }
9876 +       ctx->count[1] += ((uint32_t)len >> 29);
9877 +
9878 +
9879 +
9880 +       if (len >= need) {
9881 +               if (have != 0) {
9882 +                       memcpy(ctx->buffer + have, input, need);
9883 +                       MD5Transform(ctx->state, ctx->buffer);
9884 +                       input += need;
9885 +                       len -= need;
9886 +                       have = 0;
9887 +               }
9888 +
9889 +               /* Process data in MD5_BLOCK_LENGTH-byte chunks. */
9890 +               while (len >= MD5_BLOCK_LENGTH) {
9891 +                       MD5Transform(ctx->state, input);
9892 +                       input += MD5_BLOCK_LENGTH;
9893 +                       len -= MD5_BLOCK_LENGTH;
9894 +               }
9895 +       }
9896 +
9897 +       /* Handle any remaining bytes of data. */
9898 +       if (len != 0)
9899 +               memcpy(ctx->buffer + have, input, len);
9900 +}
9901 +
9902 +/*
9903 + * Final wrapup - pad to 64-byte boundary with the bit pattern
9904 + * 1 0* (64-bit count of bits processed, MSB-first)
9905 + */
9906 +void
9907 +MD5Final(unsigned char digest[MD5_DIGEST_LENGTH], MD5_CTX *ctx)
9908 +{
9909 +       uint8_t count[8];
9910 +       size_t padlen;
9911 +       int i;
9912 +
9913 +       /* Convert count to 8 bytes in little endian order. */
9914 +       PUT_64BIT_LE(count, ctx->count);
9915 +
9916 +       /* Pad out to 56 mod 64. */
9917 +       padlen = MD5_BLOCK_LENGTH -
9918 +           ((ctx->count[0] >> 3) & (MD5_BLOCK_LENGTH - 1));
9919 +       if (padlen < 1 + 8)
9920 +               padlen += MD5_BLOCK_LENGTH;
9921 +       MD5Update(ctx, PADDING, padlen - 8);            /* padlen - 8 <= 64 */
9922 +       MD5Update(ctx, count, 8);
9923 +
9924 +       if (digest != NULL) {
9925 +               for (i = 0; i < 4; i++)
9926 +                       PUT_32BIT_LE(digest + i * 4, ctx->state[i]);
9927 +       }
9928 +       memset(ctx, 0, sizeof(*ctx));   /* in case it's sensitive */
9929 +}
9930 +
9931 +
9932 +/* The four core functions - F1 is optimized somewhat */
9933 +
9934 +/* #define F1(x, y, z) (x & y | ~x & z) */
9935 +#define F1(x, y, z) (z ^ (x & (y ^ z)))
9936 +#define F2(x, y, z) F1(z, x, y)
9937 +#define F3(x, y, z) (x ^ y ^ z)
9938 +#define F4(x, y, z) (y ^ (x | ~z))
9939 +
9940 +/* This is the central step in the MD5 algorithm. */
9941 +#define MD5STEP(f, w, x, y, z, data, s) \
9942 +       ( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
9943 +
9944 +/*
9945 + * The core of the MD5 algorithm, this alters an existing MD5 hash to
9946 + * reflect the addition of 16 longwords of new data.  MD5Update blocks
9947 + * the data and converts bytes into longwords for this routine.
9948 + */
9949 +void
9950 +MD5Transform(uint32_t state[4], uint8_t const block[MD5_BLOCK_LENGTH])
9951 +{
9952 +       uint32_t a, b, c, d, in[MD5_BLOCK_LENGTH / 4];
9953 +
9954 +       for (a = 0; a < MD5_BLOCK_LENGTH / 4; a++) {
9955 +               in[a] = (uint32_t)(
9956 +                   (uint32_t)(block[a * 4 + 0]) |
9957 +                   (uint32_t)(block[a * 4 + 1]) <<  8 |
9958 +                   (uint32_t)(block[a * 4 + 2]) << 16 |
9959 +                   (uint32_t)(block[a * 4 + 3]) << 24);
9960 +       }
9961 +
9962 +       a = state[0];
9963 +       b = state[1];
9964 +       c = state[2];
9965 +       d = state[3];
9966 +
9967 +       MD5STEP(F1, a, b, c, d, in[ 0] + 0xd76aa478,  7);
9968 +       MD5STEP(F1, d, a, b, c, in[ 1] + 0xe8c7b756, 12);
9969 +       MD5STEP(F1, c, d, a, b, in[ 2] + 0x242070db, 17);
9970 +       MD5STEP(F1, b, c, d, a, in[ 3] + 0xc1bdceee, 22);
9971 +       MD5STEP(F1, a, b, c, d, in[ 4] + 0xf57c0faf,  7);
9972 +       MD5STEP(F1, d, a, b, c, in[ 5] + 0x4787c62a, 12);
9973 +       MD5STEP(F1, c, d, a, b, in[ 6] + 0xa8304613, 17);
9974 +       MD5STEP(F1, b, c, d, a, in[ 7] + 0xfd469501, 22);
9975 +       MD5STEP(F1, a, b, c, d, in[ 8] + 0x698098d8,  7);
9976 +       MD5STEP(F1, d, a, b, c, in[ 9] + 0x8b44f7af, 12);
9977 +       MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
9978 +       MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
9979 +       MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122,  7);
9980 +       MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
9981 +       MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
9982 +       MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
9983 +
9984 +       MD5STEP(F2, a, b, c, d, in[ 1] + 0xf61e2562,  5);
9985 +       MD5STEP(F2, d, a, b, c, in[ 6] + 0xc040b340,  9);
9986 +       MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
9987 +       MD5STEP(F2, b, c, d, a, in[ 0] + 0xe9b6c7aa, 20);
9988 +       MD5STEP(F2, a, b, c, d, in[ 5] + 0xd62f105d,  5);
9989 +       MD5STEP(F2, d, a, b, c, in[10] + 0x02441453,  9);
9990 +       MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
9991 +       MD5STEP(F2, b, c, d, a, in[ 4] + 0xe7d3fbc8, 20);
9992 +       MD5STEP(F2, a, b, c, d, in[ 9] + 0x21e1cde6,  5);
9993 +       MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6,  9);
9994 +       MD5STEP(F2, c, d, a, b, in[ 3] + 0xf4d50d87, 14);
9995 +       MD5STEP(F2, b, c, d, a, in[ 8] + 0x455a14ed, 20);
9996 +       MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905,  5);
9997 +       MD5STEP(F2, d, a, b, c, in[ 2] + 0xfcefa3f8,  9);
9998 +       MD5STEP(F2, c, d, a, b, in[ 7] + 0x676f02d9, 14);
9999 +       MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
10000 +
10001 +       MD5STEP(F3, a, b, c, d, in[ 5] + 0xfffa3942,  4);
10002 +       MD5STEP(F3, d, a, b, c, in[ 8] + 0x8771f681, 11);
10003 +       MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
10004 +       MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
10005 +       MD5STEP(F3, a, b, c, d, in[ 1] + 0xa4beea44,  4);
10006 +       MD5STEP(F3, d, a, b, c, in[ 4] + 0x4bdecfa9, 11);
10007 +       MD5STEP(F3, c, d, a, b, in[ 7] + 0xf6bb4b60, 16);
10008 +       MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
10009 +       MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6,  4);
10010 +       MD5STEP(F3, d, a, b, c, in[ 0] + 0xeaa127fa, 11);
10011 +       MD5STEP(F3, c, d, a, b, in[ 3] + 0xd4ef3085, 16);
10012 +       MD5STEP(F3, b, c, d, a, in[ 6] + 0x04881d05, 23);
10013 +       MD5STEP(F3, a, b, c, d, in[ 9] + 0xd9d4d039,  4);
10014 +       MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
10015 +       MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
10016 +       MD5STEP(F3, b, c, d, a, in[2 ] + 0xc4ac5665, 23);
10017 +
10018 +       MD5STEP(F4, a, b, c, d, in[ 0] + 0xf4292244,  6);
10019 +       MD5STEP(F4, d, a, b, c, in[7 ] + 0x432aff97, 10);
10020 +       MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
10021 +       MD5STEP(F4, b, c, d, a, in[5 ] + 0xfc93a039, 21);
10022 +       MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3,  6);
10023 +       MD5STEP(F4, d, a, b, c, in[3 ] + 0x8f0ccc92, 10);
10024 +       MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
10025 +       MD5STEP(F4, b, c, d, a, in[1 ] + 0x85845dd1, 21);
10026 +       MD5STEP(F4, a, b, c, d, in[8 ] + 0x6fa87e4f,  6);
10027 +       MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
10028 +       MD5STEP(F4, c, d, a, b, in[6 ] + 0xa3014314, 15);
10029 +       MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
10030 +       MD5STEP(F4, a, b, c, d, in[4 ] + 0xf7537e82,  6);
10031 +       MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
10032 +       MD5STEP(F4, c, d, a, b, in[2 ] + 0x2ad7d2bb, 15);
10033 +       MD5STEP(F4, b, c, d, a, in[9 ] + 0xeb86d391, 21);
10034 +
10035 +       state[0] += a;
10036 +       state[1] += b;
10037 +       state[2] += c;
10038 +       state[3] += d;
10039 +}
10040 diff --git a/src/plugins/vbng/lib/md5.h b/src/plugins/vbng/lib/md5.h
10041 new file mode 100644
10042 index 00000000..fcbaf91f
10043 --- /dev/null
10044 +++ b/src/plugins/vbng/lib/md5.h
10045 @@ -0,0 +1,86 @@
10046 +/*
10047 + * md5.h        Structures and prototypes for md5.
10048 + *
10049 + * Version:     $Id: md5.h,v 1.2 2007/06/21 18:07:24 cparker Exp $
10050 + * License:    BSD, but largely derived from a public domain source.
10051 + *
10052 + */
10053 +
10054 +#ifndef _RCRAD_MD5_H
10055 +#define _RCRAD_MD5_H
10056 +
10057 +#include "config.h"
10058 +
10059 +#ifdef HAVE_NETTLE
10060 +
10061 +#include <nettle/md5-compat.h>
10062 +
10063 +#else
10064 +
10065 +#ifdef HAVE_INTTYPES_H
10066 +#include <inttypes.h>
10067 +#endif
10068 +
10069 +#ifdef HAVE_SYS_TYPES_H
10070 +#include <sys/types.h>
10071 +#endif
10072 +
10073 +#ifdef HAVE_STDINT_H
10074 +#include <stdint.h>
10075 +#endif
10076 +
10077 +#include <string.h>
10078 +/*
10079 + *  FreeRADIUS Client defines to ensure globally unique MD5 function names,
10080 + *  so that we don't pick up vendor-specific broken MD5 libraries.
10081 + */
10082 +#define MD5_CTX                librad_MD5_CTX
10083 +#define MD5Init                librad_MD5Init
10084 +#define MD5Update      librad_MD5Update
10085 +#define MD5Final       librad_MD5Final
10086 +#define MD5Transform   librad_MD5Transform
10087 +
10088 +/*  The below was retrieved from
10089 + *  http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/crypto/md5.h?rev=1.1
10090 + *  With the following changes: uint64_t => uint32_t[2]
10091 + *  Commented out #include <sys/cdefs.h>
10092 + *  Commented out the __BEGIN and __END _DECLS, and the __attributes.
10093 + */
10094 +
10095 +/*
10096 + * This code implements the MD5 message-digest algorithm.
10097 + * The algorithm is due to Ron Rivest.  This code was
10098 + * written by Colin Plumb in 1993, no copyright is claimed.
10099 + * This code is in the public domain; do with it what you wish.
10100 + *
10101 + * Equivalent code is available from RSA Data Security, Inc.
10102 + * This code has been tested against that, and is equivalent,
10103 + * except that you don't need to include two pages of legalese
10104 + * with every copy.
10105 + */
10106 +
10107 +#define        MD5_BLOCK_LENGTH                64
10108 +#define        MD5_DIGEST_LENGTH               16
10109 +
10110 +typedef struct MD5Context {
10111 +       uint32_t state[4];                      /* state */
10112 +       uint32_t count[2];                      /* number of bits, mod 2^64 */
10113 +       uint8_t buffer[MD5_BLOCK_LENGTH];       /* input buffer */
10114 +} MD5_CTX;
10115 +
10116 +/* include <sys/cdefs.h> */
10117 +
10118 +/* __BEGIN_DECLS */
10119 +void    MD5Init(MD5_CTX *);
10120 +void    MD5Update(MD5_CTX *, uint8_t const *, size_t)
10121 +/*             __attribute__((__bounded__(__string__,2,3)))*/;
10122 +void    MD5Final(uint8_t [MD5_DIGEST_LENGTH], MD5_CTX *)
10123 +/*             __attribute__((__bounded__(__minbytes__,1,MD5_DIGEST_LENGTH)))*/;
10124 +void    MD5Transform(uint32_t [4], uint8_t const [MD5_BLOCK_LENGTH])
10125 +/*             __attribute__((__bounded__(__minbytes__,1,4)))*/
10126 +/*             __attribute__((__bounded__(__minbytes__,2,MD5_BLOCK_LENGTH)))*/;
10127 +/* __END_DECLS */
10128 +
10129 +#endif /* HAVE_NETTLE */
10130 +
10131 +#endif /* _RCRAD_MD5_H */
10132 diff --git a/src/plugins/vbng/lib/options.h b/src/plugins/vbng/lib/options.h
10133 new file mode 100644
10134 index 00000000..05b66dfd
10135 --- /dev/null
10136 +++ b/src/plugins/vbng/lib/options.h
10137 @@ -0,0 +1,57 @@
10138 +/*
10139 + * $Id: options.h,v 1.6 2008/03/05 16:35:20 cparker Exp $
10140 + *
10141 + * Copyright (C) 1996 Lars Fenneberg
10142 + *
10143 + * See the file COPYRIGHT for the respective terms and conditions.
10144 + * If the file is missing contact me at lf@elemental.net
10145 + * and I'll send you a copy.
10146 + *
10147 + */
10148 +
10149 +#define OPTION_LEN     64
10150 +
10151 +/* ids for different option types */
10152 +#define OT_STR         (1<<0)    /* string */
10153 +#define OT_INT         (1<<1)    /* integer */
10154 +#define OT_SRV         (1<<2)    /* server list */
10155 +#define OT_AUO         (1<<3)    /* authentication order */
10156 +
10157 +#define OT_ANY         ((unsigned int)~0) /* used internally */
10158 +
10159 +/* status types */
10160 +#define ST_UNDEF       (1<<0)    /* option is undefined */
10161 +
10162 +typedef struct _option {
10163 +       char name[OPTION_LEN];    /* name of the option */
10164 +       int type, status;         /* type and status    */
10165 +       void *val;                /* pointer to option value */
10166 +} OPTION;
10167 +
10168 +static OPTION config_options_default[] = {
10169 +/* internally used options */
10170 +{"config_file",                OT_STR, ST_UNDEF, NULL},
10171 +/* General options */
10172 +{"auth_order",         OT_AUO, ST_UNDEF, NULL},
10173 +{"login_tries",                OT_INT, ST_UNDEF, NULL},
10174 +{"login_timeout",      OT_INT, ST_UNDEF, NULL},
10175 +{"nologin",            OT_STR, ST_UNDEF, NULL},
10176 +{"issue",              OT_STR, ST_UNDEF, NULL},
10177 +/* RADIUS specific options */
10178 +{"authserver",         OT_SRV, ST_UNDEF, NULL},
10179 +{"acctserver",         OT_SRV, ST_UNDEF, NULL},
10180 +{"servers",            OT_STR, ST_UNDEF, NULL},
10181 +{"dictionary",         OT_STR, ST_UNDEF, NULL},
10182 +{"login_radius",       OT_STR, ST_UNDEF, NULL},
10183 +{"seqfile",            OT_STR, ST_UNDEF, NULL},
10184 +{"mapfile",            OT_STR, ST_UNDEF, NULL},
10185 +{"default_realm",      OT_STR, ST_UNDEF, NULL},
10186 +{"radius_timeout",     OT_INT, ST_UNDEF, NULL},
10187 +{"radius_retries",     OT_INT, ST_UNDEF, NULL},
10188 +{"radius_deadtime",    OT_INT, ST_UNDEF, NULL},
10189 +{"bindaddr",           OT_STR, ST_UNDEF, NULL},
10190 +/* local options */
10191 +{"login_local",                OT_STR, ST_UNDEF, NULL},
10192 +};
10193 +
10194 +#define        NUM_OPTIONS     ((sizeof(config_options_default))/(sizeof(config_options_default[0])))
10195 diff --git a/src/plugins/vbng/lib/rc-md5.c b/src/plugins/vbng/lib/rc-md5.c
10196 new file mode 100644
10197 index 00000000..be9fbcbd
10198 --- /dev/null
10199 +++ b/src/plugins/vbng/lib/rc-md5.c
10200 @@ -0,0 +1,24 @@
10201 +/* MD5 message-digest algorithm */
10202 +
10203 +/* This file is licensed under the BSD License, but is largely derived from
10204 + * public domain source code
10205 + */
10206 +
10207 +/*
10208 + *  FORCE MD5 TO USE OUR MD5 HEADER FILE!
10209 + *
10210 + *  If we don't do this, it might pick up the systems broken MD5.
10211 + *  - Alan DeKok <aland@ox.org>
10212 + */
10213 +#include "rc-md5.h"
10214 +
10215 +void rc_md5_calc(unsigned char *output, unsigned char const *input,
10216 +                    size_t inlen)
10217 +{
10218 +       MD5_CTX context;
10219 +
10220 +       MD5Init(&context);
10221 +       MD5Update(&context, input, inlen);
10222 +       MD5Final(output, &context);
10223 +}
10224 +
10225 diff --git a/src/plugins/vbng/lib/rc-md5.h b/src/plugins/vbng/lib/rc-md5.h
10226 new file mode 100644
10227 index 00000000..a30f16d3
10228 --- /dev/null
10229 +++ b/src/plugins/vbng/lib/rc-md5.h
10230 @@ -0,0 +1,27 @@
10231 +/*
10232 + * md5.h        Structures and prototypes for md5.
10233 + *
10234 + * Version:     $Id: md5.h,v 1.2 2007/06/21 18:07:24 cparker Exp $
10235 + * License:    BSD
10236 + *
10237 + */
10238 +
10239 +#ifndef _RC_MD5_H
10240 +#define _RC_MD5_H
10241 +
10242 +#include "config.h"
10243 +
10244 +#ifdef HAVE_NETTLE
10245 +
10246 +#include <nettle/md5-compat.h>
10247 +
10248 +#else
10249 +
10250 +#include "md5.h"
10251 +
10252 +#endif /* HAVE_NETTLE */
10253 +
10254 +void rc_md5_calc(unsigned char *output, unsigned char const *input,
10255 +                    size_t inputlen);
10256 +
10257 +#endif /* _RC_MD5_H */
10258 diff --git a/src/plugins/vbng/lib/sendserver.c b/src/plugins/vbng/lib/sendserver.c
10259 new file mode 100644
10260 index 00000000..bfdd9a26
10261 --- /dev/null
10262 +++ b/src/plugins/vbng/lib/sendserver.c
10263 @@ -0,0 +1,631 @@
10264 +/*
10265 + * $Id: sendserver.c,v 1.30 2010/06/15 09:22:52 aland Exp $
10266 + *
10267 + * Copyright (C) 1995,1996,1997 Lars Fenneberg
10268 + *
10269 + * Copyright 1992 Livingston Enterprises, Inc.
10270 + *
10271 + * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
10272 + * and Merit Network, Inc. All Rights Reserved
10273 + *
10274 + * See the file COPYRIGHT for the respective terms and conditions.
10275 + * If the file is missing contact me at lf@elemental.net
10276 + * and I'll send you a copy.
10277 + *
10278 + */
10279 +
10280 +#include <poll.h>
10281 +
10282 +#include <config.h>
10283 +#include <includes.h>
10284 +#include <freeradius-client.h>
10285 +#include <pathnames.h>
10286 +
10287 +#define        SA(p)   ((struct sockaddr *)(p))
10288 +
10289 +static void rc_random_vector (unsigned char *);
10290 +static int rc_check_reply (AUTH_HDR *, int, char const *, unsigned char const *, unsigned char);
10291 +
10292 +/*
10293 + * Function: rc_pack_list
10294 + *
10295 + * Purpose: Packs an attribute value pair list into a buffer.
10296 + *
10297 + * Returns: Number of octets packed.
10298 + *
10299 + */
10300 +
10301 +static int rc_pack_list (VALUE_PAIR *vp, char *secret, AUTH_HDR *auth)
10302 +{
10303 +       int             length, i, pc, padded_length;
10304 +       int             total_length = 0;
10305 +       size_t                  secretlen;
10306 +       uint32_t           lvalue, vendor;
10307 +       unsigned char   passbuf[MAX(AUTH_PASS_LEN, CHAP_VALUE_LENGTH)];
10308 +       unsigned char   md5buf[256];
10309 +       unsigned char   *buf, *vector, *vsa_length_ptr;
10310 +
10311 +       buf = auth->data;
10312 +
10313 +       while (vp != NULL)
10314 +       {
10315 +               vsa_length_ptr = NULL;
10316 +               if (VENDOR(vp->attribute) != 0) {
10317 +                       *buf++ = PW_VENDOR_SPECIFIC;
10318 +                       vsa_length_ptr = buf;
10319 +                       *buf++ = 6;
10320 +                       vendor = htonl(VENDOR(vp->attribute));
10321 +                       memcpy(buf, &vendor, sizeof(uint32_t));
10322 +                       buf += 4;
10323 +                       total_length += 6;
10324 +               }
10325 +               *buf++ = (vp->attribute & 0xff);
10326 +
10327 +               switch (vp->attribute)
10328 +               {
10329 +                case PW_USER_PASSWORD:
10330 +
10331 +                 /* Encrypt the password */
10332 +
10333 +                 /* Chop off password at AUTH_PASS_LEN */
10334 +                 length = vp->lvalue;
10335 +                 if (length > AUTH_PASS_LEN)
10336 +                       length = AUTH_PASS_LEN;
10337 +
10338 +                 /* Calculate the padded length */
10339 +                 padded_length = (length+(AUTH_VECTOR_LEN-1)) & ~(AUTH_VECTOR_LEN-1);
10340 +
10341 +                 /* Record the attribute length */
10342 +                 *buf++ = padded_length + 2;
10343 +                 if (vsa_length_ptr != NULL) *vsa_length_ptr += padded_length + 2;
10344 +
10345 +                 /* Pad the password with zeros */
10346 +                 memset ((char *) passbuf, '\0', AUTH_PASS_LEN);
10347 +                 memcpy ((char *) passbuf, vp->strvalue, (size_t) length);
10348 +
10349 +                 secretlen = strlen (secret);
10350 +                 vector = (unsigned char *)auth->vector;
10351 +                 for(i = 0; i < padded_length; i += AUTH_VECTOR_LEN)
10352 +                 {
10353 +                       /* Calculate the MD5 digest*/
10354 +                       strcpy ((char *) md5buf, secret);
10355 +                       memcpy ((char *) md5buf + secretlen, vector,
10356 +                                 AUTH_VECTOR_LEN);
10357 +                       rc_md5_calc (buf, md5buf, secretlen + AUTH_VECTOR_LEN);
10358 +
10359 +                       /* Remeber the start of the digest */
10360 +                       vector = buf;
10361 +
10362 +                       /* Xor the password into the MD5 digest */
10363 +                       for (pc = i; pc < (i + AUTH_VECTOR_LEN); pc++)
10364 +                       {
10365 +                               *buf++ ^= passbuf[pc];
10366 +                       }
10367 +                 }
10368 +
10369 +                 total_length += padded_length + 2;
10370 +
10371 +                 break;
10372 +#if 0
10373 +                case PW_CHAP_PASSWORD:
10374 +
10375 +                 *buf++ = CHAP_VALUE_LENGTH + 2;
10376 +                 if (vsa_length_ptr != NULL) *vsa_length_ptr += CHAP_VALUE_LENGTH + 2;
10377 +
10378 +                 /* Encrypt the Password */
10379 +                 length = vp->lvalue;
10380 +                 if (length > CHAP_VALUE_LENGTH)
10381 +                 {
10382 +                       length = CHAP_VALUE_LENGTH;
10383 +                 }
10384 +                 memset ((char *) passbuf, '\0', CHAP_VALUE_LENGTH);
10385 +                 memcpy ((char *) passbuf, vp->strvalue, (size_t) length);
10386 +
10387 +                 /* Calculate the MD5 Digest */
10388 +                 secretlen = strlen (secret);
10389 +                 strcpy ((char *) md5buf, secret);
10390 +                 memcpy ((char *) md5buf + secretlen, (char *) auth->vector,
10391 +                         AUTH_VECTOR_LEN);
10392 +                 rc_md5_calc (buf, md5buf, secretlen + AUTH_VECTOR_LEN);
10393 +
10394 +                 /* Xor the password into the MD5 digest */
10395 +                 for (i = 0; i < CHAP_VALUE_LENGTH; i++)
10396 +                 {
10397 +                       *buf++ ^= passbuf[i];
10398 +                 }
10399 +                 total_length += CHAP_VALUE_LENGTH + 2;
10400 +
10401 +                 break;
10402 +#endif
10403 +                default:
10404 +                 switch (vp->type)
10405 +                 {
10406 +                   case PW_TYPE_STRING:
10407 +                       length = vp->lvalue;
10408 +                       *buf++ = length + 2;
10409 +                       if (vsa_length_ptr != NULL) *vsa_length_ptr += length + 2;
10410 +                       memcpy (buf, vp->strvalue, (size_t) length);
10411 +                       buf += length;
10412 +                       total_length += length + 2;
10413 +                       break;
10414 +
10415 +                   case PW_TYPE_IPV6ADDR:
10416 +                       length = 16;
10417 +                       if (vsa_length_ptr != NULL) *vsa_length_ptr += length + 2;
10418 +                       memcpy (buf, vp->strvalue, (size_t) length);
10419 +                       buf += length;
10420 +                       total_length += length + 2;
10421 +                       break;
10422 +
10423 +                   case PW_TYPE_IPV6PREFIX:
10424 +                       length = vp->lvalue;
10425 +                       if (vsa_length_ptr != NULL) *vsa_length_ptr += length + 2;
10426 +                       memcpy (buf, vp->strvalue, (size_t) length);
10427 +                       buf += length;
10428 +                       total_length += length + 2;
10429 +                       break;
10430 +
10431 +                   case PW_TYPE_INTEGER:
10432 +                   case PW_TYPE_IPADDR:
10433 +                   case PW_TYPE_DATE:
10434 +                       *buf++ = sizeof (uint32_t) + 2;
10435 +                       if (vsa_length_ptr != NULL) *vsa_length_ptr += sizeof(uint32_t) + 2;
10436 +                       lvalue = htonl (vp->lvalue);
10437 +                       memcpy (buf, (char *) &lvalue, sizeof (uint32_t));
10438 +                       buf += sizeof (uint32_t);
10439 +                       total_length += sizeof (uint32_t) + 2;
10440 +                       break;
10441 +
10442 +                   default:
10443 +                       break;
10444 +                 }
10445 +                 break;
10446 +               }
10447 +               vp = vp->next;
10448 +       }
10449 +       return total_length;
10450 +}
10451 +
10452 +/* Function strappend
10453 + *
10454 + * Purpose: appends a string to the provided buffer
10455 + */
10456 +static void strappend(char *dest, unsigned max_size, int *pos, const char *src)
10457 +{
10458 +       unsigned len = strlen(src) + 1;
10459 +
10460 +       if (*pos == -1)
10461 +               return;
10462 +
10463 +       if (len + *pos > max_size) {
10464 +               *pos = -1;
10465 +               return;
10466 +       }
10467 +
10468 +       memcpy(&dest[*pos], src, len);
10469 +       *pos += len-1;
10470 +       return;
10471 +}
10472 +
10473 +/*
10474 + * Function: rc_send_server
10475 + *
10476 + * Purpose: send a request to a RADIUS server and wait for the reply
10477 + *
10478 + */
10479 +
10480 +int rc_send_server (rc_handle *rh, SEND_DATA *data, char *msg)
10481 +{
10482 +       int             sockfd;
10483 +       struct sockaddr_in sinlocal;
10484 +       struct sockaddr_in sinremote;
10485 +       AUTH_HDR       *auth, *recv_auth;
10486 +       uint32_t           auth_ipaddr, nas_ipaddr;
10487 +       char           *server_name;    /* Name of server to query */
10488 +       socklen_t       salen;
10489 +       int             result = 0;
10490 +       int             total_length;
10491 +       int             length, pos;
10492 +       int             retry_max;
10493 +       size_t                  secretlen;
10494 +       char            secret[MAX_SECRET_LENGTH + 1];
10495 +       unsigned char   vector[AUTH_VECTOR_LEN];
10496 +       char            recv_buffer[BUFFER_LEN];
10497 +       char            send_buffer[BUFFER_LEN];
10498 +       int             retries;
10499 +       VALUE_PAIR      *vp;
10500 +       struct pollfd   pfd;
10501 +       double          start_time, timeout;
10502 +
10503 +       server_name = data->server;
10504 +       if (server_name == NULL || server_name[0] == '\0')
10505 +               return ERROR_RC;
10506 +
10507 +       if ((vp = rc_avpair_get(data->send_pairs, PW_SERVICE_TYPE, 0)) && \
10508 +           (vp->lvalue == PW_ADMINISTRATIVE))
10509 +       {
10510 +               strcpy(secret, MGMT_POLL_SECRET);
10511 +               if ((auth_ipaddr = rc_get_ipaddr(server_name)) == 0)
10512 +                       return ERROR_RC;
10513 +       }
10514 +       else
10515 +       {
10516 +               if(data->secret != NULL)
10517 +               {
10518 +                       strncpy(secret, data->secret, MAX_SECRET_LENGTH);
10519 +               }
10520 +               /*
10521 +               else
10522 +               {
10523 +               */
10524 +               if (rc_find_server (rh, server_name, &auth_ipaddr, secret) != 0)
10525 +               {
10526 +                       rc_log(LOG_ERR, "rc_send_server: unable to find server: %s", server_name);
10527 +                       return ERROR_RC;
10528 +               }
10529 +               /*}*/
10530 +       }
10531 +
10532 +       DEBUG(LOG_ERR, "DEBUG: rc_send_server: creating socket to: %s", server_name);
10533 +
10534 +       sockfd = socket (AF_INET, SOCK_DGRAM, 0);
10535 +       if (sockfd < 0)
10536 +       {
10537 +               memset (secret, '\0', sizeof (secret));
10538 +               rc_log(LOG_ERR, "rc_send_server: socket: %s", strerror(errno));
10539 +               return ERROR_RC;
10540 +       }
10541 +
10542 +       memset((char *)&sinlocal, '\0', sizeof(sinlocal));
10543 +       sinlocal.sin_family = AF_INET;
10544 +       sinlocal.sin_addr.s_addr = htonl(rc_own_bind_ipaddress(rh));
10545 +       sinlocal.sin_port = htons((unsigned short) 0);
10546 +       if (bind(sockfd, SA(&sinlocal), sizeof(sinlocal)) < 0)
10547 +       {
10548 +               close (sockfd);
10549 +               memset (secret, '\0', sizeof (secret));
10550 +               rc_log(LOG_ERR, "rc_send_server: bind: %s: %s", server_name, strerror(errno));
10551 +               return ERROR_RC;
10552 +       }
10553 +
10554 +       retry_max = data->retries;      /* Max. numbers to try for reply */
10555 +       retries = 0;                    /* Init retry cnt for blocking call */
10556 +
10557 +       memset ((char *)&sinremote, '\0', sizeof(sinremote));
10558 +       sinremote.sin_family = AF_INET;
10559 +       sinremote.sin_addr.s_addr = htonl (auth_ipaddr);
10560 +       sinremote.sin_port = htons ((unsigned short) data->svc_port);
10561 +
10562 +       /*
10563 +        * Fill in NAS-IP-Address (if needed)
10564 +        */
10565 +       if (rc_avpair_get(data->send_pairs, PW_NAS_IP_ADDRESS, 0) == NULL) {
10566 +               if (sinlocal.sin_addr.s_addr == htonl(INADDR_ANY)) {
10567 +                       if (rc_get_srcaddr(SA(&sinlocal), SA(&sinremote)) != 0) {
10568 +                               close (sockfd);
10569 +                               memset (secret, '\0', sizeof (secret));
10570 +                               return ERROR_RC;
10571 +                       }
10572 +               }
10573 +               nas_ipaddr = ntohl(sinlocal.sin_addr.s_addr);
10574 +               rc_avpair_add(rh, &(data->send_pairs), PW_NAS_IP_ADDRESS,
10575 +                   &nas_ipaddr, 0, 0);
10576 +       }
10577 +
10578 +       /* Build a request */
10579 +       auth = (AUTH_HDR *) send_buffer;
10580 +       auth->code = data->code;
10581 +       auth->id = data->seq_nbr;
10582 +
10583 +       if (data->code == PW_ACCOUNTING_REQUEST)
10584 +       {
10585 +               total_length = rc_pack_list(data->send_pairs, secret, auth) + AUTH_HDR_LEN;
10586 +
10587 +               auth->length = htons ((unsigned short) total_length);
10588 +
10589 +               memset((char *) auth->vector, 0, AUTH_VECTOR_LEN);
10590 +               secretlen = strlen (secret);
10591 +               memcpy ((char *) auth + total_length, secret, secretlen);
10592 +               rc_md5_calc (vector, (unsigned char *) auth, total_length + secretlen);
10593 +               memcpy ((char *) auth->vector, (char *) vector, AUTH_VECTOR_LEN);
10594 +       }
10595 +       else
10596 +       {
10597 +               rc_random_vector (vector);
10598 +               memcpy ((char *) auth->vector, (char *) vector, AUTH_VECTOR_LEN);
10599 +
10600 +               total_length = rc_pack_list(data->send_pairs, secret, auth) + AUTH_HDR_LEN;
10601 +
10602 +               auth->length = htons ((unsigned short) total_length);
10603 +       }
10604 +
10605 +       DEBUG(LOG_ERR, "DEBUG: local %s : 0, remote %s : %u\n", 
10606 +               inet_ntoa(sinlocal.sin_addr),
10607 +               inet_ntoa(sinremote.sin_addr), data->svc_port);
10608 +
10609 +       for (;;)
10610 +       {
10611 +               sendto (sockfd, (char *) auth, (unsigned int) total_length, (int) 0,
10612 +                       SA(&sinremote), sizeof (struct sockaddr_in));
10613 +
10614 +               pfd.fd = sockfd;
10615 +               pfd.events = POLLIN;
10616 +               pfd.revents = 0;
10617 +               start_time = rc_getctime();
10618 +               for (timeout = data->timeout; timeout > 0;
10619 +                   timeout -= rc_getctime() - start_time) {
10620 +                       result = poll(&pfd, 1, timeout * 1000);
10621 +                       if (result != -1 || errno != EINTR)
10622 +                               break;
10623 +               }
10624 +               if (result == -1)
10625 +               {
10626 +                       rc_log(LOG_ERR, "rc_send_server: poll: %s", strerror(errno));
10627 +                       memset (secret, '\0', sizeof (secret));
10628 +                       close (sockfd);
10629 +                       return ERROR_RC;
10630 +               }
10631 +               if (result == 1 && (pfd.revents & POLLIN) != 0)
10632 +                       break;
10633 +
10634 +               /*
10635 +                * Timed out waiting for response.  Retry "retry_max" times
10636 +                * before giving up.  If retry_max = 0, don't retry at all.
10637 +                */
10638 +               if (retries++ >= retry_max)
10639 +               {
10640 +                       rc_log(LOG_ERR,
10641 +                               "rc_send_server: no reply from RADIUS server %s:%u, %s",
10642 +                                rc_ip_hostname (auth_ipaddr), data->svc_port, inet_ntoa(sinremote.sin_addr));
10643 +                       close (sockfd);
10644 +                       memset (secret, '\0', sizeof (secret));
10645 +                       return TIMEOUT_RC;
10646 +               }
10647 +       }
10648 +       salen = sizeof(sinremote);
10649 +       length = recvfrom (sockfd, (char *) recv_buffer,
10650 +                          (int) sizeof (recv_buffer),
10651 +                          (int) 0, SA(&sinremote), &salen);
10652 +
10653 +       if (length <= 0)
10654 +       {
10655 +               rc_log(LOG_ERR, "rc_send_server: recvfrom: %s:%d: %s", server_name,\
10656 +                        data->svc_port, strerror(errno));
10657 +               close (sockfd);
10658 +               memset (secret, '\0', sizeof (secret));
10659 +               return ERROR_RC;
10660 +       }
10661 +
10662 +       recv_auth = (AUTH_HDR *)recv_buffer;
10663 +
10664 +       if (length < AUTH_HDR_LEN || length < ntohs(recv_auth->length)) {
10665 +               rc_log(LOG_ERR, "rc_send_server: recvfrom: %s:%d: reply is too short",
10666 +                   server_name, data->svc_port);
10667 +               close(sockfd);
10668 +               memset(secret, '\0', sizeof(secret));
10669 +               return ERROR_RC;
10670 +       }
10671 +
10672 +       result = rc_check_reply (recv_auth, BUFFER_LEN, secret, vector, data->seq_nbr);
10673 +
10674 +       length = ntohs(recv_auth->length)  - AUTH_HDR_LEN;
10675 +       if (length > 0) {
10676 +               data->receive_pairs = rc_avpair_gen(rh, NULL, recv_auth->data,
10677 +                   length, 0);
10678 +       } else {
10679 +               data->receive_pairs = NULL;
10680 +       }
10681 +
10682 +       close (sockfd);
10683 +       memset (secret, '\0', sizeof (secret));
10684 +
10685 +       if (result != OK_RC) return result;
10686 +
10687 +       if (msg) {
10688 +               *msg = '\0';
10689 +               pos = 0;
10690 +               vp = data->receive_pairs;
10691 +               while (vp)
10692 +               {
10693 +                       if ((vp = rc_avpair_get(vp, PW_REPLY_MESSAGE, 0)))
10694 +                       {
10695 +                               strappend(msg, PW_MAX_MSG_SIZE, &pos, vp->strvalue);
10696 +                               strappend(msg, PW_MAX_MSG_SIZE, &pos, "\n");
10697 +                               vp = vp->next;
10698 +                       }
10699 +               }
10700 +       }
10701 +
10702 +       if ((recv_auth->code == PW_ACCESS_ACCEPT) ||
10703 +               (recv_auth->code == PW_PASSWORD_ACK) ||
10704 +               (recv_auth->code == PW_ACCOUNTING_RESPONSE))
10705 +       {
10706 +               result = OK_RC;
10707 +       }
10708 +       else if ((recv_auth->code == PW_ACCESS_REJECT) ||
10709 +               (recv_auth->code == PW_PASSWORD_REJECT))
10710 +       {
10711 +               result = REJECT_RC;
10712 +       }
10713 +       else
10714 +       {
10715 +               result = BADRESP_RC;
10716 +       }
10717 +
10718 +       return result;
10719 +}
10720 +
10721 +/*
10722 + * Function: rc_check_reply
10723 + *
10724 + * Purpose: verify items in returned packet.
10725 + *
10726 + * Returns:    OK_RC       -- upon success,
10727 + *             BADRESP_RC  -- if anything looks funny.
10728 + *
10729 + */
10730 +
10731 +static int rc_check_reply (AUTH_HDR *auth, int bufferlen, char const *secret, unsigned char const *vector, uint8_t seq_nbr)
10732 +{
10733 +       int             secretlen;
10734 +       int             totallen;
10735 +       unsigned char   calc_digest[AUTH_VECTOR_LEN];
10736 +       unsigned char   reply_digest[AUTH_VECTOR_LEN];
10737 +#ifdef DIGEST_DEBUG
10738 +       uint8_t         *ptr;
10739 +#endif
10740 +
10741 +       totallen = ntohs (auth->length);
10742 +       secretlen = (int)strlen (secret);
10743 +
10744 +       /* Do sanity checks on packet length */
10745 +       if ((totallen < 20) || (totallen > 4096))
10746 +       {
10747 +               rc_log(LOG_ERR, "rc_check_reply: received RADIUS server response with invalid length");
10748 +               return BADRESP_RC;
10749 +       }
10750 +
10751 +       /* Verify buffer space, should never trigger with current buffer size and check above */
10752 +       if ((totallen + secretlen) > bufferlen)
10753 +       {
10754 +               rc_log(LOG_ERR, "rc_check_reply: not enough buffer space to verify RADIUS server response");
10755 +               return BADRESP_RC;
10756 +       }
10757 +
10758 +       /* Verify that id (seq. number) matches what we sent */
10759 +       if (auth->id != seq_nbr)
10760 +       {
10761 +               rc_log(LOG_ERR, "rc_check_reply: received non-matching id in RADIUS server response");
10762 +               return BADRESP_RC;
10763 +       }
10764 +
10765 +       /* Verify the reply digest */
10766 +       memcpy ((char *) reply_digest, (char *) auth->vector, AUTH_VECTOR_LEN);
10767 +       memcpy ((char *) auth->vector, (char *) vector, AUTH_VECTOR_LEN);
10768 +       memcpy ((char *) auth + totallen, secret, secretlen);
10769 +#ifdef DIGEST_DEBUG
10770 +        rc_log(LOG_ERR, "Calculating digest on:");
10771 +        for (ptr = (u_char *)auth; ptr < ((u_char *)auth) + totallen + secretlen; ptr += 32) {
10772 +                char buf[65];
10773 +                int i;
10774 +
10775 +                buf[0] = '\0';
10776 +                for (i = 0; i < 32; i++) {
10777 +                        if (ptr + i >= ((u_char *)auth) + totallen + secretlen)
10778 +                                break;
10779 +                        sprintf(buf + i * 2, "%.2X", ptr[i]);
10780 +                }
10781 +                rc_log(LOG_ERR, "  %s", buf);
10782 +        }
10783 +#endif
10784 +       rc_md5_calc (calc_digest, (unsigned char *) auth, totallen + secretlen);
10785 +#ifdef DIGEST_DEBUG
10786 +       rc_log(LOG_ERR, "Calculated digest is:");
10787 +        for (ptr = (u_char *)calc_digest; ptr < ((u_char *)calc_digest) + 16; ptr += 32) {
10788 +                char buf[65];
10789 +                int i;
10790 +
10791 +                buf[0] = '\0';
10792 +                for (i = 0; i < 32; i++) {
10793 +                        if (ptr + i >= ((u_char *)calc_digest) + 16)
10794 +                                break;
10795 +                        sprintf(buf + i * 2, "%.2X", ptr[i]);
10796 +                }
10797 +                rc_log(LOG_ERR, "  %s", buf);
10798 +        }
10799 +       rc_log(LOG_ERR, "Reply digest is:");
10800 +        for (ptr = (u_char *)reply_digest; ptr < ((u_char *)reply_digest) + 16; ptr += 32) {
10801 +                char buf[65];
10802 +                int i;
10803 +
10804 +                buf[0] = '\0';
10805 +                for (i = 0; i < 32; i++) {
10806 +                        if (ptr + i >= ((u_char *)reply_digest) + 16)
10807 +                                break;
10808 +                        sprintf(buf + i * 2, "%.2X", ptr[i]);
10809 +                }
10810 +                rc_log(LOG_ERR, "  %s", buf);
10811 +        }
10812 +#endif
10813 +
10814 +       if (memcmp ((char *) reply_digest, (char *) calc_digest,
10815 +                   AUTH_VECTOR_LEN) != 0)
10816 +       {
10817 +#ifdef RADIUS_116
10818 +               /* the original Livingston radiusd v1.16 seems to have
10819 +                  a bug in digest calculation with accounting requests,
10820 +                  authentication request are ok. i looked at the code
10821 +                  but couldn't find any bugs. any help to get this
10822 +                  kludge out are welcome. preferably i want to
10823 +                  reproduce the calculation bug here to be compatible
10824 +                  to stock Livingston radiusd v1.16.   -lf, 03/14/96
10825 +                */
10826 +               if (auth->code == PW_ACCOUNTING_RESPONSE)
10827 +                       return OK_RC;
10828 +#endif
10829 +               rc_log(LOG_ERR, "rc_check_reply: received invalid reply digest from RADIUS server");
10830 +               return BADRESP_RC;
10831 +       }
10832 +
10833 +       return OK_RC;
10834 +
10835 +}
10836 +
10837 +/*
10838 + * Function: rc_random_vector
10839 + *
10840 + * Purpose: generates a random vector of AUTH_VECTOR_LEN octets.
10841 + *
10842 + * Returns: the vector (call by reference)
10843 + *
10844 + */
10845 +
10846 +static void rc_random_vector (unsigned char *vector)
10847 +{
10848 +       int             randno;
10849 +       int             i;
10850 +#if defined(HAVE_GETENTROPY)
10851 +       if (getentropy(vector, AUTH_VECTOR_LEN) >= 0) {
10852 +               return;
10853 +       } /* else fall through */
10854 +#elif defined(HAVE_DEV_URANDOM)
10855 +       int             fd;
10856 +
10857 +/* well, I added this to increase the security for user passwords.
10858 +   we use /dev/urandom here, as /dev/random might block and we don't
10859 +   need that much randomness. BTW, great idea, Ted!     -lf, 03/18/95  */
10860 +
10861 +       if ((fd = open(_PATH_DEV_URANDOM, O_RDONLY)) >= 0)
10862 +       {
10863 +               unsigned char *pos;
10864 +               int readcount;
10865 +
10866 +               i = AUTH_VECTOR_LEN;
10867 +               pos = vector;
10868 +               while (i > 0)
10869 +               {
10870 +                       readcount = read(fd, (char *)pos, i);
10871 +                       if (readcount >= 0) {
10872 +                               pos += readcount;
10873 +                               i -= readcount;
10874 +                       } else {
10875 +                               if (errno != EINTR && errno != EAGAIN)
10876 +                                       goto fallback;
10877 +                       }
10878 +               }
10879 +
10880 +               close(fd);
10881 +               return;
10882 +       } /* else fall through */
10883 +#endif
10884 + fallback:
10885 +       for (i = 0; i < AUTH_VECTOR_LEN;)
10886 +       {
10887 +               randno = random ();
10888 +               memcpy ((char *) vector, (char *) &randno, sizeof (int));
10889 +               vector += sizeof (int);
10890 +               i += sizeof (int);
10891 +       }
10892 +
10893 +       return;
10894 +}
10895 diff --git a/src/plugins/vbng/lib/util.c b/src/plugins/vbng/lib/util.c
10896 new file mode 100644
10897 index 00000000..aa7c057d
10898 --- /dev/null
10899 +++ b/src/plugins/vbng/lib/util.c
10900 @@ -0,0 +1,347 @@
10901 +/*
10902 + * $Id: util.c,v 1.10 2010/02/04 10:31:41 aland Exp $
10903 + *
10904 + * Copyright (c) 1998 The NetBSD Foundation, Inc.
10905 + *
10906 + * Copyright (C) 1995,1996,1997 Lars Fenneberg
10907 + *
10908 + * Copyright 1992 Livingston Enterprises, Inc.
10909 + *
10910 + * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
10911 + * and Merit Network, Inc. All Rights Reserved
10912 + *
10913 + * See the file COPYRIGHT for the respective terms and conditions.
10914 + * If the file is missing contact me at lf@elemental.net
10915 + * and I'll send you a copy.
10916 + *
10917 + */
10918 +
10919 +#include <sys/time.h>
10920 +
10921 +#include <config.h>
10922 +#include <includes.h>
10923 +#include <freeradius-client.h>
10924 +
10925 +#define        RC_BUFSIZ       1024
10926 +
10927 +/*
10928 + * Function: rc_str2tm
10929 + *
10930 + * Purpose: Turns printable string into correct tm struct entries.
10931 + *
10932 + */
10933 +
10934 +static char const * months[] =
10935 +               {
10936 +                       "Jan", "Feb", "Mar", "Apr", "May", "Jun",
10937 +                       "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
10938 +               };
10939 +
10940 +void rc_str2tm (char const *valstr, struct tm *tm)
10941 +{
10942 +       int             i;
10943 +
10944 +       /* Get the month */
10945 +       for (i = 0; i < 12; i++)
10946 +       {
10947 +               if (strncmp (months[i], valstr, 3) == 0)
10948 +               {
10949 +                       tm->tm_mon = i;
10950 +                       i = 13;
10951 +               }
10952 +       }
10953 +
10954 +       /* Get the Day */
10955 +       tm->tm_mday = atoi (&valstr[4]);
10956 +
10957 +       /* Now the year */
10958 +       tm->tm_year = atoi (&valstr[7]) - 1900;
10959 +}
10960 +
10961 +/*
10962 + * Function: rc_getifname
10963 + *
10964 + * Purpose: get the network interface name associated with this tty
10965 + *
10966 + */
10967 +
10968 +char *rc_getifname(rc_handle *rh, char const *tty)
10969 +{
10970 +#if defined(BSD4_4) || defined(linux)
10971 +       int             fd;
10972 +
10973 +       if ((fd = open(tty, O_RDWR|O_NDELAY)) < 0) {
10974 +               rc_log(LOG_ERR, "rc_getifname: can't open %s: %s", tty, strerror(errno));
10975 +               return NULL;
10976 +       }
10977 +#endif
10978 +
10979 +#ifdef BSD4_4
10980 +       strcpy(rh->ifname,ttyname(fd));
10981 +       if (strlen(rh->ifname) < 1) {
10982 +               rc_log(LOG_ERR, "rc_getifname: can't get attached interface of %s: %s", tty, strerror(errno));
10983 +               close(fd);
10984 +               return NULL;
10985 +       }
10986 +#elif linux
10987 +       if (ioctl(fd, SIOCGIFNAME, rh->ifname) < 0) {
10988 +               rc_log(LOG_ERR, "rc_getifname: can't ioctl %s: %s", tty, strerror(errno));
10989 +               close(fd);
10990 +               return NULL;
10991 +       }
10992 +#else
10993 +       return NULL;
10994 +#endif
10995 +
10996 +#if defined(BSD4_4) || defined(linux)
10997 +       close(fd);
10998 +       return rh->ifname;
10999 +#endif
11000 +}
11001 +
11002 +/*
11003 + * Function: rc_getstr
11004 + *
11005 + * Purpose: Reads in a string from the user (with or witout echo)
11006 + *
11007 + */
11008 +#ifndef _MSC_VER
11009 +char *rc_getstr (rc_handle *rh, char const *prompt, int do_echo)
11010 +{
11011 +       int             in, out;
11012 +       char           *p;
11013 +       struct termios  term_old, term_new;
11014 +       int             is_term, flags, old_flags;
11015 +       char            c;
11016 +       int             flushed = 0;
11017 +       sigset_t        newset;
11018 +       sigset_t        oldset;
11019 +
11020 +       in = fileno(stdin);
11021 +       out = fileno(stdout);
11022 +
11023 +       (void) sigemptyset (&newset);
11024 +       (void) sigaddset (&newset, SIGINT);
11025 +       (void) sigaddset (&newset, SIGTSTP);
11026 +       (void) sigaddset (&newset, SIGQUIT);
11027 +
11028 +       (void) sigprocmask (SIG_BLOCK, &newset, &oldset);
11029 +
11030 +       if ((is_term = isatty(in)))
11031 +       {
11032 +
11033 +               (void) tcgetattr (in, &term_old);
11034 +               term_new = term_old;
11035 +               if (do_echo)
11036 +                       term_new.c_lflag |= ECHO;
11037 +               else
11038 +                       term_new.c_lflag &= ~ECHO;
11039 +
11040 +               if (tcsetattr (in, TCSAFLUSH, &term_new) == 0)
11041 +                       flushed = 1;
11042 +
11043 +       }
11044 +       else
11045 +       {
11046 +               is_term = 0;
11047 +               if ((flags = fcntl(in, F_GETFL, 0)) >= 0) {
11048 +                       old_flags = flags;
11049 +                       flags |= O_NONBLOCK;
11050 +
11051 +                       fcntl(in, F_SETFL, flags);
11052 +
11053 +                       while (read(in, &c, 1) > 0)
11054 +                               /* nothing */;
11055 +
11056 +                       fcntl(in, F_SETFL, old_flags);
11057 +
11058 +                       flushed = 1;
11059 +               }
11060 +       }
11061 +
11062 +       (void)write(out, prompt, strlen(prompt));
11063 +
11064 +       /* well, this looks ugly, but it handles the following end of line
11065 +          markers: \r \r\0 \r\n \n \n\r, at least at a second pass */
11066 +
11067 +       p = rh->buf;
11068 +       for (;;)
11069 +       {
11070 +               if (read(in, &c, 1) <= 0)
11071 +                       return NULL;
11072 +
11073 +               if (!flushed && ((c == '\0') || (c == '\r') || (c == '\n'))) {
11074 +                       flushed = 1;
11075 +                       continue;
11076 +               }
11077 +
11078 +               if ((c == '\r') || (c == '\n'))
11079 +                       break;
11080 +
11081 +               flushed = 1;
11082 +
11083 +               if (p < rh->buf + GETSTR_LENGTH)
11084 +               {
11085 +                       if (do_echo && !is_term)
11086 +                               (void)write(out, &c, 1);
11087 +                       *p++ = c;
11088 +               }
11089 +       }
11090 +
11091 +       *p = '\0';
11092 +
11093 +       if (!do_echo || !is_term) (void)write(out, "\r\n", 2);
11094 +
11095 +       if (is_term)
11096 +               tcsetattr (in, TCSAFLUSH, &term_old);
11097 +       else {
11098 +               if ((flags = fcntl(in, F_GETFL, 0)) >= 0) {
11099 +                       old_flags = flags;
11100 +                       flags |= O_NONBLOCK;
11101 +
11102 +                       fcntl(in, F_SETFL, flags);
11103 +
11104 +                       while (read(in, &c, 1) > 0)
11105 +                               /* nothing */;
11106 +
11107 +                       fcntl(in, F_SETFL, old_flags);
11108 +               }
11109 +       }
11110 +
11111 +       (void) sigprocmask (SIG_SETMASK, &oldset, NULL);
11112 +
11113 +       return rh->buf;
11114 +}
11115 +#endif
11116 +void rc_mdelay(int msecs)
11117 +{
11118 +       struct timeval tv;
11119 +
11120 +       tv.tv_sec = (int) msecs / 1000;
11121 +       tv.tv_usec = (msecs % 1000) * 1000;
11122 +
11123 +       select(0, NULL, NULL, NULL, &tv);
11124 +}
11125 +
11126 +/*
11127 + * Function: rc_mksid
11128 + *
11129 + * Purpose: generate a quite unique string
11130 + *
11131 + * Remarks: not that unique at all...
11132 + *
11133 + */
11134 +
11135 +char *
11136 +rc_mksid (rc_handle *rh)
11137 +{
11138 +  snprintf (rh->buf1, sizeof(rh->buf1), "%08lX%04X", (unsigned long int) time (NULL), (unsigned int) getpid ());
11139 +  return rh->buf1;
11140 +}
11141 +
11142 +/*
11143 + * Function: rc_new
11144 + *
11145 + * Purpose: Initialises new Radius Client handle
11146 + *
11147 + */
11148 +
11149 +rc_handle *
11150 +rc_new(void)
11151 +{
11152 +       rc_handle *rh;
11153 +
11154 +       rh = malloc(sizeof(*rh));
11155 +       if (rh == NULL) {
11156 +                rc_log(LOG_CRIT, "rc_new: out of memory");
11157 +                return NULL;
11158 +        }
11159 +       memset(rh, 0, sizeof(*rh));
11160 +       return rh;
11161 +}
11162 +
11163 +/*
11164 + * Function: rc_destroy
11165 + *
11166 + * Purpose: Destroys Radius Client handle reclaiming all memory
11167 + *
11168 + */
11169 +
11170 +void
11171 +rc_destroy(rc_handle *rh)
11172 +{
11173 +
11174 +       rc_map2id_free(rh);
11175 +       rc_dict_free(rh);
11176 +       rc_config_free(rh);
11177 +       if (rh->this_host_bind_ipaddr != NULL)
11178 +               free(rh->this_host_bind_ipaddr);
11179 +       free(rh);
11180 +}
11181 +
11182 +/*
11183 + * Function: rc_fgetln
11184 + *
11185 + * Purpose: Get next line from the stream.
11186 + *
11187 + */
11188 +
11189 +char *
11190 +rc_fgetln(FILE *fp, size_t *len)
11191 +{
11192 +       static char *buf = NULL;
11193 +       static size_t bufsiz = 0;
11194 +       char *ptr;
11195 +
11196 +       if (buf == NULL) {
11197 +               bufsiz = RC_BUFSIZ;
11198 +               if ((buf = malloc(bufsiz)) == NULL)
11199 +                       return NULL;
11200 +       }
11201 +
11202 +       if (fgets(buf, (int)bufsiz, fp) == NULL)
11203 +               return NULL;
11204 +       *len = 0;
11205 +
11206 +       while ((ptr = strchr(&buf[*len], '\n')) == NULL) {
11207 +               size_t nbufsiz = bufsiz + RC_BUFSIZ;
11208 +               char *nbuf = realloc(buf, nbufsiz);
11209 +
11210 +               if (nbuf == NULL) {
11211 +                       int oerrno = errno;
11212 +                       free(buf);
11213 +                       errno = oerrno;
11214 +                       buf = NULL;
11215 +                       return NULL;
11216 +               } else
11217 +                       buf = nbuf;
11218 +
11219 +               *len = bufsiz;
11220 +               if (fgets(&buf[bufsiz], RC_BUFSIZ, fp) == NULL)
11221 +                       return buf;
11222 +
11223 +               bufsiz = nbufsiz;
11224 +       }
11225 +
11226 +       *len = (ptr - buf) + 1;
11227 +       return buf;
11228 +}
11229 +
11230 +/*
11231 + * Function: rc_getctime
11232 + *
11233 + * Purpose: Get current time (seconds since epoch) expressed as
11234 + * double-precision floating point number.
11235 + *
11236 + */
11237 +
11238 +double
11239 +rc_getctime(void)
11240 +{
11241 +    struct timeval timev;
11242 +
11243 +    if (gettimeofday(&timev, NULL) == -1)
11244 +        return -1;
11245 +
11246 +    return timev.tv_sec + ((double)timev.tv_usec) / 1000000.0;
11247 +}
11248 diff --git a/src/plugins/vbng/vbng.api b/src/plugins/vbng/vbng.api
11249 new file mode 100644
11250 index 00000000..eba9a10f
11251 --- /dev/null
11252 +++ b/src/plugins/vbng/vbng.api
11253 @@ -0,0 +1,50 @@
11254 +/*
11255 + * Copyright (c) 2017 Intel Corp and/or its affiliates.
11256 + * Licensed under the Apache License, Version 2.0 (the "License");
11257 + * you may not use this file except in compliance with the License.
11258 + * You may obtain a copy of the License at:
11259 + *
11260 + *     http://www.apache.org/licenses/LICENSE-2.0
11261 + *
11262 + * Unless required by applicable law or agreed to in writing, software
11263 + * distributed under the License is distributed on an "AS IS" BASIS,
11264 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11265 + * See the License for the specific language governing permissions and
11266 + * limitations under the License.
11267 + */
11268 +
11269 +/** \brief vBNG DHCP config add / del request
11270 +    @param client_index - opaque cookie to identify the sender
11271 +    @param context - sender context, to match reply w/ request
11272 +    @param rx_vrf_id - Rx/interface vrf id
11273 +    @param server_vrf_id - server vrf id
11274 +    @param is_add - add the config if non-zero, else delete
11275 +    @param remote_addr[] - DHCP server address
11276 +    @param local_addr[] - Local Address which could reach DHCP server
11277 +*/
11278 +define vbng_dhcp4_config
11279 +{
11280 +  u32 client_index;
11281 +  u32 context;
11282 +  u32 rx_vrf_id;
11283 +  u32 server_vrf_id;
11284 +  u8 is_add;
11285 +  u8 remote_addr[16];
11286 +  u8 local_addr[16];
11287 +};
11288 +
11289 +/** \brief vBNG DHCP config response
11290 +    @param context - sender context, to match reply w/ request
11291 +    @param retval - return code for the request
11292 +*/
11293 +define vbng_dhcp4_config_reply
11294 +{
11295 +  u32 context;
11296 +  i32 retval;
11297 +};
11298 +
11299 +/*
11300 + * Local Variables:
11301 + * eval: (c-set-style "gnu")
11302 + * End:
11303 + */
11304 diff --git a/src/plugins/vbng/vbng_aaa.c b/src/plugins/vbng/vbng_aaa.c
11305 new file mode 100644
11306 index 00000000..5e8861f7
11307 --- /dev/null
11308 +++ b/src/plugins/vbng/vbng_aaa.c
11309 @@ -0,0 +1,71 @@
11310 +/*
11311 + * Copyright (c) 2017 Intel and/or its affiliates.
11312 + *
11313 + * Licensed under the Apache License, Version 2.0 (the "License");
11314 + * you may not use this file except in compliance with the License.
11315 + * You may obtain a copy of the License at:
11316 + *
11317 + *     http://www.apache.org/licenses/LICENSE-2.0
11318 + *
11319 + * Unless required by applicable law or agreed to in writing, software
11320 + * distributed under the License is distributed on an "AS IS" BASIS,
11321 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11322 + * See the License for the specific language governing permissions and
11323 + * limitations under the License.
11324 + */
11325 +
11326 +#include <ctype.h>
11327 +#include <stdio.h>
11328 +#include <stdlib.h>
11329 +#include <string.h>
11330 +#include <unistd.h>
11331 +
11332 +#include <vbng/include/freeradius-client.h>
11333 +#include <vbng/vbng_aaa.h>
11334 +
11335 +int
11336 +process(void *rh, VALUE_PAIR *send, int nas_port)
11337 +{
11338 +    VALUE_PAIR *received = NULL;
11339 +    char msg[PW_MAX_MSG_SIZE];
11340 +    int retval;
11341 +
11342 +    retval = rc_auth(rh, nas_port, send, &received, msg);
11343 +    if (retval == OK_RC && received != NULL) {
11344 +        rc_avpair_free(received);
11345 +    }
11346 +
11347 +    return retval;
11348 +}
11349 +
11350 +int
11351 +vbng_auth(vbng_dhcp4_main_t *dm, int argc, char **argv)
11352 +{
11353 +    int i, nas_port = dm->config.nas_port;
11354 +    char *rc_conf = (char *)dm->config.config_file;
11355 +    VALUE_PAIR *send, **vp;
11356 +    void *rh;
11357 +
11358 +    if ((rh = rc_read_config(rc_conf)) == NULL) {
11359 +        fprintf(stderr, "error opening radius configuration file\n");
11360 +        return (1);
11361 +    }
11362 +
11363 +    if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary")) != 0) {
11364 +        fprintf(stderr, "error reading radius dictionary\n");
11365 +        return (2);
11366 +    }
11367 +
11368 +    send = NULL;
11369 +    vp = &send;
11370 +    for (i = 0; i < argc; i++) {
11371 +        if (rc_avpair_parse(rh, argv[i], vp) < 0) {
11372 +            fprintf(stderr, "%s: can't parse AV pair\n", argv[i]);
11373 +            return (3);
11374 +        }
11375 +        vp = &send->next;
11376 +    }
11377 +
11378 +    return process(rh, send, nas_port);
11379 +}
11380 +
11381 diff --git a/src/plugins/vbng/vbng_aaa.h b/src/plugins/vbng/vbng_aaa.h
11382 new file mode 100644
11383 index 00000000..411a7533
11384 --- /dev/null
11385 +++ b/src/plugins/vbng/vbng_aaa.h
11386 @@ -0,0 +1,34 @@
11387 +/*
11388 + * vbng_aaa.h - vBNG FreeRADIUS client commons.
11389 + *
11390 + * Copyright (c) 2017 Intel and/or its affiliates.
11391 + * Licensed under the Apache License, Version 2.0 (the "License");
11392 + * you may not use this file except in compliance with the License.
11393 + * You may obtain a copy of the License at:
11394 + *
11395 + *     http://www.apache.org/licenses/LICENSE-2.0
11396 + *
11397 + * Unless required by applicable law or agreed to in writing, software
11398 + * distributed under the License is distributed on an "AS IS" BASIS,
11399 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11400 + * See the License for the specific language governing permissions and
11401 + * limitations under the License.
11402 + */
11403 +#ifndef _VBNG_AAA_H_
11404 +#define _VBNG_AAA_H_
11405 +
11406 +#include <vbng/vbng_dhcp4.h>
11407 +
11408 +/* Common configuration for RADIUS client */
11409 +#define AAA_DEFAULT_NAS_PORT   5060
11410 +#define AAA_DEFAULT_CONFIG_FILE        "/etc/vpp/vbng-aaa.cfg"
11411 +
11412 +#define BUF_LEN                4096
11413 +
11414 +/* String template for the vAAA attributes */
11415 +#define STR_TPL_ATTR_DHCP_AGENT_CIRCUIT_ID "DHCP-Agent-Circuit-Id=%c"
11416 +#define STR_TPL_ATTR_DHCP_AGENT_REMOTE_ID "DHCP-Agent-Remote-Id=%c"
11417 +
11418 +int vbng_auth(vbng_dhcp4_main_t *dm, int argc, char **argv);
11419 +
11420 +#endif /* _VBNG_AAA_H_ */
11421 diff --git a/src/plugins/vbng/vbng_all_api_h.h b/src/plugins/vbng/vbng_all_api_h.h
11422 new file mode 100644
11423 index 00000000..3f744275
11424 --- /dev/null
11425 +++ b/src/plugins/vbng/vbng_all_api_h.h
11426 @@ -0,0 +1,18 @@
11427 +/*
11428 + * vbng_all_api_h.h - skeleton vpp engine plug-in api #include file
11429 + *
11430 + * Copyright (c) 2017 Intel and/or its affiliates.
11431 + * Licensed under the Apache License, Version 2.0 (the "License");
11432 + * you may not use this file except in compliance with the License.
11433 + * You may obtain a copy of the License at:
11434 + *
11435 + *     http://www.apache.org/licenses/LICENSE-2.0
11436 + *
11437 + * Unless required by applicable law or agreed to in writing, software
11438 + * distributed under the License is distributed on an "AS IS" BASIS,
11439 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11440 + * See the License for the specific language governing permissions and
11441 + * limitations under the License.
11442 + */
11443 +
11444 +#include <vbng/vbng.api.h>
11445 diff --git a/src/plugins/vbng/vbng_api.c b/src/plugins/vbng/vbng_api.c
11446 new file mode 100644
11447 index 00000000..4080f775
11448 --- /dev/null
11449 +++ b/src/plugins/vbng/vbng_api.c
11450 @@ -0,0 +1,123 @@
11451 +/*
11452 + *------------------------------------------------------------------
11453 + * vbng_api.c - vbng api
11454 + *
11455 + * Copyright (c) 2017 Intel Corp and/or its affiliates.
11456 + * Licensed under the Apache License, Version 2.0 (the "License");
11457 + * you may not use this file except in compliance with the License.
11458 + * You may obtain a copy of the License at:
11459 + *
11460 + *     http://www.apache.org/licenses/LICENSE-2.0
11461 + *
11462 + * Unless required by applicable law or agreed to in writing, software
11463 + * distributed under the License is distributed on an "AS IS" BASIS,
11464 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11465 + * See the License for the specific language governing permissions and
11466 + * limitations under the License.
11467 + *------------------------------------------------------------------
11468 + */
11469 +
11470 +#include <vnet/vnet.h>
11471 +#include <vlibmemory/api.h>
11472 +
11473 +#include <vnet/interface.h>
11474 +#include <vnet/api_errno.h>
11475 +#include <vnet/dhcp/dhcp_proxy.h>
11476 +#include <vnet/dhcp/client.h>
11477 +#include <vnet/fib/fib_table.h>
11478 +
11479 +#include <vbng/vbng_msg_enum.h>
11480 +
11481 +#define vl_typedefs            /* define message structures */
11482 +#include <vbng/vbng_all_api_h.h>
11483 +#undef vl_typedefs
11484 +
11485 +#define vl_endianfun           /* define message structures */
11486 +#include <vbng/vbng_all_api_h.h>
11487 +#undef vl_endianfun
11488 +
11489 +/* instantiate all the print functions we know about */
11490 +#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
11491 +#define vl_printfun
11492 +#include <vbng/vbng_all_api_h.h>
11493 +#undef vl_printfun
11494 +
11495 +#include <vlibapi/api_helper_macros.h>
11496 +
11497 +#define foreach_vpe_api_msg                       \
11498 +_(VBNG_DHCP4_CONFIG,vbng_dhcp4_config)
11499 +
11500 +static void vl_api_vbng_dhcp4_config_t_handler
11501 +  (vl_api_vbng_dhcp4_config_t * mp)
11502 +{
11503 +  vl_api_vbng_dhcp4_config_reply_t *rmp;
11504 +  ip46_address_t src, server;
11505 +  int rv = -1;
11506 +
11507 +  ip46_address_reset (&src);
11508 +  ip46_address_reset (&server);
11509 +
11510 +  clib_memcpy (&src.ip4, mp->local_addr, sizeof (src.ip4));
11511 +  clib_memcpy (&server.ip4, mp->remote_addr, sizeof (server.ip4));
11512 +
11513 +  rv = dhcp4_proxy_set_server (&server,
11514 +                  &src,
11515 +                                  (u32) ntohl (mp->rx_vrf_id),
11516 +                                  (u32) ntohl (mp->server_vrf_id),
11517 +                                  (int) (mp->is_add == 0));
11518 +
11519 +
11520 +  REPLY_MACRO (VL_API_VBNG_DHCP4_CONFIG_REPLY);
11521 +}
11522 +
11523 +/*
11524 + * vbng_api_hookup
11525 + * Add vpe's API message handlers to the table.
11526 + * vlib has alread mapped shared memory and
11527 + * added the client registration handlers.
11528 + * See .../vlib-api/vlibmemory/memclnt_vlib.c:memclnt_process()
11529 + */
11530 +#define vl_msg_name_crc_list
11531 +#include <vbng/vbng_all_api_h.h>
11532 +#undef vl_msg_name_crc_list
11533 +
11534 +static void
11535 +setup_message_id_table (api_main_t * am)
11536 +{
11537 +#define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id);
11538 +  foreach_vl_msg_name_crc_vbng;
11539 +#undef _
11540 +}
11541 +
11542 +static clib_error_t *
11543 +vbng_api_hookup (vlib_main_t * vm)
11544 +{
11545 +  api_main_t *am = &api_main;
11546 +
11547 +#define _(N,n)                                                  \
11548 +    vl_msg_api_set_handlers(VL_API_##N, #n,                     \
11549 +                           vl_api_##n##_t_handler,              \
11550 +                           vl_noop_handler,                     \
11551 +                           vl_api_##n##_t_endian,               \
11552 +                           vl_api_##n##_t_print,                \
11553 +                           sizeof(vl_api_##n##_t), 1);
11554 +  foreach_vpe_api_msg;
11555 +#undef _
11556 +
11557 +  /*
11558 +   * Set up the (msg_name, crc, message-id) table
11559 +   */
11560 +  setup_message_id_table (am);
11561 +
11562 +  return 0;
11563 +}
11564 +
11565 +VLIB_API_INIT_FUNCTION (vbng_api_hookup);
11566 +
11567 +/*
11568 + * fd.io coding-style-patch-verification: ON
11569 + *
11570 + * Local Variables:
11571 + * eval: (c-set-style "gnu")
11572 + * End:
11573 + */
11574 diff --git a/src/plugins/vbng/vbng_dhcp4.c b/src/plugins/vbng/vbng_dhcp4.c
11575 new file mode 100644
11576 index 00000000..ed79df42
11577 --- /dev/null
11578 +++ b/src/plugins/vbng/vbng_dhcp4.c
11579 @@ -0,0 +1,160 @@
11580 +/*
11581 + * vbng_dhcp4.c: common dhcp v4 processing
11582 + *
11583 + * Copyright (c) 2017 Intel Corp and/or its affiliates and others.
11584 + * Licensed under the Apache License, Version 2.0 (the "License");
11585 + * you may not use this file except in compliance with the License.
11586 + * You may obtain a copy of the License at:
11587 + *
11588 + *     http://www.apache.org/licenses/LICENSE-2.0
11589 + *
11590 + * Unless required by applicable law or agreed to in writing, software
11591 + * distributed under the License is distributed on an "AS IS" BASIS,
11592 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11593 + * See the License for the specific language governing permissions and
11594 + * limitations under the License.
11595 + */
11596 +
11597 +#include <vnet/fib/fib_table.h>
11598 +#include <vnet/mfib/mfib_table.h>
11599 +
11600 +#include <vbng/vbng_dhcp4.h>
11601 +
11602 +/**
11603 + * @brief Shard 4/6 instance of DHCP main
11604 + */
11605 +vbng_dhcp4_main_t vbng_dhcp4_main;
11606 +
11607 +void
11608 +vbng_dhcp4_walk (vbng_dhcp4_walk_fn_t fn,
11609 +                 void *ctx)
11610 +{
11611 +  vbng_dhcp4_main_t *vdm = &vbng_dhcp4_main;
11612 +  dhcp_proxy_t * server;
11613 +  u32 server_index, i;
11614 +
11615 +  vec_foreach_index (i, vdm->dhcp_server_index_by_rx_fib_index)
11616 +  {
11617 +      server_index = vdm->dhcp_server_index_by_rx_fib_index[i];
11618 +      if (~0 == server_index)
11619 +          continue;
11620 +
11621 +      server = pool_elt_at_index (vdm->dhcp4_servers, server_index);
11622 +
11623 +      if (!fn(server, ctx))
11624 +          break;
11625 +    }
11626 +}
11627 +
11628 +static u32
11629 +dhcp_proxy_server_find (dhcp_proxy_t *proxy,
11630 +                        fib_protocol_t proto,
11631 +                        ip46_address_t *addr,
11632 +                        u32 server_table_id)
11633 +{
11634 +    dhcp_server_t *server;
11635 +    u32 ii, fib_index;
11636 +
11637 +    vec_foreach_index(ii, proxy->dhcp_servers)
11638 +    {
11639 +        server = &proxy->dhcp_servers[ii];
11640 +        fib_index = fib_table_find(proto, server_table_id);
11641 +
11642 +        if (ip46_address_is_equal(&server->dhcp_server,
11643 +                                  addr) &&
11644 +            (server->server_fib_index == fib_index))
11645 +        {
11646 +            return (ii);
11647 +        }
11648 +    }
11649 +    return (~0);
11650 +}
11651 +
11652 +int
11653 +vbng_dhcp4_server_del (fib_protocol_t proto,
11654 +                       u32 rx_fib_index,
11655 +                       ip46_address_t *addr,
11656 +                       u32 server_table_id)
11657 +{
11658 +  vbng_dhcp4_main_t *vdm = &vbng_dhcp4_main;
11659 +  dhcp_proxy_t *proxy = 0;
11660 +
11661 +  proxy = vbng_dhcp4_get_server(vdm, rx_fib_index);
11662 +
11663 +  if (NULL != proxy)
11664 +  {
11665 +      dhcp_server_t *server;
11666 +      u32 index;
11667 +
11668 +      index = dhcp_proxy_server_find(proxy, proto, addr, server_table_id);
11669 +
11670 +      if (~0 != index)
11671 +      {
11672 +          server = &proxy->dhcp_servers[index];
11673 +          fib_table_unlock (server->server_fib_index, proto);
11674 +
11675 +          vec_del1(proxy->dhcp_servers, index);
11676 +
11677 +          if (0 == vec_len(proxy->dhcp_servers))
11678 +          {
11679 +              /* no servers left, delete the proxy config */
11680 +              vdm->dhcp_server_index_by_rx_fib_index[rx_fib_index] = ~0;
11681 +              vec_free(proxy->dhcp_servers);
11682 +              pool_put (vdm->dhcp4_servers, proxy);
11683 +              return (1);
11684 +          }
11685 +      }
11686 +  }
11687 +
11688 +  /* the proxy still exists */
11689 +  return (0);
11690 +}
11691 +
11692 +int
11693 +vbng_dhcp4_server_add (fib_protocol_t proto,
11694 +                       ip46_address_t *addr,
11695 +                       ip46_address_t *src_address,
11696 +                       u32 rx_fib_index,
11697 +                       u32 server_table_id)
11698 +{
11699 +  vbng_dhcp4_main_t *vdm = &vbng_dhcp4_main;
11700 +  dhcp_proxy_t * proxy = 0;
11701 +  int new = 0;
11702 +
11703 +  proxy = vbng_dhcp4_get_server(vdm, rx_fib_index);
11704 +
11705 +  if (NULL == proxy)
11706 +  {
11707 +      vec_validate_init_empty(vdm->dhcp_server_index_by_rx_fib_index,
11708 +                              rx_fib_index,
11709 +                              ~0);
11710 +
11711 +      pool_get (vdm->dhcp4_servers, proxy);
11712 +      memset (proxy, 0, sizeof (*proxy));
11713 +      new = 1;
11714 +
11715 +      vdm->dhcp_server_index_by_rx_fib_index[rx_fib_index] =
11716 +          proxy - vdm->dhcp4_servers;
11717 +
11718 +      proxy->dhcp_src_address = *src_address;
11719 +      proxy->rx_fib_index = rx_fib_index;
11720 +  }
11721 +  else
11722 +  {
11723 +      if (~0 != dhcp_proxy_server_find(proxy, proto, addr, server_table_id))
11724 +      {
11725 +          return (new);
11726 +      }
11727 +  }
11728 +
11729 +  dhcp_server_t server = {
11730 +      .dhcp_server = *addr,
11731 +      .server_fib_index = fib_table_find_or_create_and_lock(proto,
11732 +                                                            server_table_id),
11733 +  };
11734 +
11735 +  vec_add1(proxy->dhcp_servers, server);
11736 +
11737 +  return (new);
11738 +}
11739 +
11740 diff --git a/src/plugins/vbng/vbng_dhcp4.h b/src/plugins/vbng/vbng_dhcp4.h
11741 new file mode 100644
11742 index 00000000..2f41575f
11743 --- /dev/null
11744 +++ b/src/plugins/vbng/vbng_dhcp4.h
11745 @@ -0,0 +1,139 @@
11746 +/*
11747 + * vbng_dhcp4.h: DHCP v4 common functions/types
11748 + *
11749 + * Copyright (c) 2017 Intel Corp and/or its affiliates and others.
11750 + * Licensed under the Apache License, Version 2.0 (the "License");
11751 + * you may not use this file except in compliance with the License.
11752 + * You may obtain a copy of the License at:
11753 + *
11754 + *     http://www.apache.org/licenses/LICENSE-2.0
11755 + *
11756 + * Unless required by applicable law or agreed to in writing, software
11757 + * distributed under the License is distributed on an "AS IS" BASIS,
11758 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11759 + * See the License for the specific language governing permissions and
11760 + * limitations under the License.
11761 + */
11762 +
11763 +#ifndef _VBNG_DHCP4_H_
11764 +#define _VBNG_DHCP4_H_
11765 +
11766 +#include <vnet/vnet.h>
11767 +#include <vnet/dhcp/dhcp_proxy.h>
11768 +#include <vnet/dhcp/dhcp4_packet.h>
11769 +#include <vnet/ethernet/ethernet.h>
11770 +#include <vnet/ip/ip.h>
11771 +#include <vnet/ip/ip4.h>
11772 +#include <vnet/ip/ip4_packet.h>
11773 +#include <vnet/pg/pg.h>
11774 +#include <vnet/ip/format.h>
11775 +#include <vnet/udp/udp.h>
11776 +
11777 +typedef enum {
11778 +#define vbng_dhcp4_error(n,s) VBNG_DHCP4_ERROR_##n,
11779 +#include <vbng/vbng_dhcp4_err.def>
11780 +#undef vbng_dhcp4_error
11781 +  VBNG_DHCP4_N_ERROR,
11782 +} vbng_dhcp4_error_t;
11783 +
11784 +#define VBNG_AAA_DISABLED      0
11785 +#define VBNG_AAA_ENABLED       1
11786 +
11787 +typedef struct {
11788 +  int is_enabled;
11789 +  u32 nas_port; /* AAA server port */
11790 +  u8 *config_file; /* Radius Client config file path */
11791 +} vbng_aaa_config_t;
11792 +
11793 +/**
11794 + * @brief Global configuration for the vBNG plugin.
11795 + */
11796 +typedef struct {
11797 +  /* Pool of DHCP servers */
11798 +  dhcp_proxy_t *dhcp4_servers;
11799 +
11800 +  /* Pool of selected DHCP server. Zero is the default server */
11801 +  u32 * dhcp_server_index_by_rx_fib_index;
11802 +
11803 +  /* to drop pkts in server-to-client direction */
11804 +  u32 error_drop_node_index;
11805 +
11806 +  /* Configuration for the AAA client */
11807 +  vbng_aaa_config_t config;
11808 +
11809 +  /* convenience */
11810 +  vlib_main_t * vlib_main;
11811 +  vnet_main_t * vnet_main;
11812 +} vbng_dhcp4_main_t;
11813 +
11814 +extern vbng_dhcp4_main_t vbng_dhcp4_main;
11815 +
11816 +/**
11817 + * @brief Add a new DHCP proxy server configuration.
11818 + * @return 1 is the config is new,
11819 + *         0 otherwise (implying a modify of an existing)
11820 + */
11821 +int vbng_dhcp4_server_add(fib_protocol_t proto,
11822 +                          ip46_address_t *addr,
11823 +                          ip46_address_t *src_address,
11824 +                          u32 rx_fib_iindex,
11825 +                          u32 server_table_id);
11826 +
11827 +/**
11828 + * @brief Delete a DHCP proxy config
11829 + * @return 1 if the proxy is deleted, 0 otherwise
11830 + */
11831 +int vbng_dhcp4_server_del(fib_protocol_t proto,
11832 +                          u32 rx_fib_index,
11833 +                          ip46_address_t *addr,
11834 +                          u32 server_table_id);
11835 +
11836 +u32
11837 +dhcp_proxy_rx_table_get_table_id (fib_protocol_t proto,
11838 +                                  u32 fib_index);
11839 +
11840 +/**
11841 + * @brief Callback function invoked for each DHCP proxy entry
11842 + *  return 0 to break the walk, non-zero otherwise.
11843 + */
11844 +typedef int (*vbng_dhcp4_walk_fn_t)(dhcp_proxy_t *server,
11845 +                                    void *ctx);
11846 +
11847 +/**
11848 + * @brief Walk/Visit each vBNG DHCP server configurations
11849 + */
11850 +void vbng_dhcp4_walk(vbng_dhcp4_walk_fn_t fn,
11851 +                     void *ctx);
11852 +
11853 +/**
11854 + * @brief Get the DHCP proxy server data for the FIB index
11855 + */
11856 +static inline dhcp_proxy_t *
11857 +vbng_dhcp4_get_server(vbng_dhcp4_main_t *vm,
11858 +                     u32 rx_fib_index)
11859 +{
11860 +       dhcp_proxy_t *s = NULL;
11861 +
11862 +       if (vec_len(vm->dhcp_server_index_by_rx_fib_index) > rx_fib_index &&
11863 +           vm->dhcp_server_index_by_rx_fib_index[rx_fib_index] != ~0)
11864 +       {
11865 +               s = pool_elt_at_index (
11866 +                   vm->dhcp4_servers,
11867 +                   vm->dhcp_server_index_by_rx_fib_index[rx_fib_index]);
11868 +       }
11869 +
11870 +       return (s);
11871 +}
11872 +
11873 +int vbng_dhcp4_set_server(ip46_address_t *addr,
11874 +                          ip46_address_t *src_addr,
11875 +                          u32 rx_table_id,
11876 +                          u32 server_table_id,
11877 +                          int is_del);
11878 +
11879 +#define DHCP_PACKET_OPTION_82          82
11880 +#define DHCP_PACKET_OPTION82_SUB1      1
11881 +#define DHCP_PACKET_OPTION82_SUB2      2
11882 +#define DHCP_PACKET_OPTION82_SUB5      5
11883 +
11884 +#endif /* _VBNG_DHCP4_H_ */
11885 diff --git a/src/plugins/vbng/vbng_dhcp4_err.def b/src/plugins/vbng/vbng_dhcp4_err.def
11886 new file mode 100644
11887 index 00000000..23f2d0d2
11888 --- /dev/null
11889 +++ b/src/plugins/vbng/vbng_dhcp4_err.def
11890 @@ -0,0 +1,29 @@
11891 +/*
11892 + * vbng_dhcp4_err.def: VBNG DHCP4 Errors
11893 + *
11894 + * Copyright (c) 2017 Intel Corp and/or its affiliates and others.
11895 + * Licensed under the Apache License, Version 2.0 (the "License");
11896 + * you may not use this file except in compliance with the License.
11897 + * You may obtain a copy of the License at:
11898 + *
11899 + *     http://www.apache.org/licenses/LICENSE-2.0
11900 + *
11901 + * Unless required by applicable law or agreed to in writing, software
11902 + * distributed under the License is distributed on an "AS IS" BASIS,
11903 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11904 + * See the License for the specific language governing permissions and
11905 + * limitations under the License.
11906 + */
11907 +
11908 +vbng_dhcp4_error (NONE, "no error")
11909 +vbng_dhcp4_error (NO_SERVER, "no dhcp server configured")
11910 +vbng_dhcp4_error (RELAY_TO_SERVER, "DHCP packets relayed to the server")
11911 +vbng_dhcp4_error (RELAY_TO_CLIENT, "DHCP packets relayed to clients")
11912 +vbng_dhcp4_error (NO_INTERFACE_ADDRESS, "DHCP no interface address")
11913 +vbng_dhcp4_error (BAD_YIADDR, "DHCP packets with bad your_ip_address fields")
11914 +vbng_dhcp4_error (BAD_SVR_FIB_OR_ADDRESS, "DHCP packets not from DHCP server or server FIB.")
11915 +vbng_dhcp4_error (PKT_TOO_BIG, "DHCP packets which are too big.")
11916 +vbng_dhcp4_error (AAA_FAILURE, "DHCP packets failed to pass the AAA check.")
11917 +vbng_dhcp4_error (NO_OPTION_82, "DHCP option 82 missing")
11918 +vbng_dhcp4_error (BAD_OPTION_82_ITF, "Bad DHCP option 82 interface value")
11919 +vbng_dhcp4_error (BAD_OPTION_82_ADDR, "Bad DHCP option 82 address value")
11920 diff --git a/src/plugins/vbng/vbng_dhcp4_node.c b/src/plugins/vbng/vbng_dhcp4_node.c
11921 new file mode 100644
11922 index 00000000..205959bf
11923 --- /dev/null
11924 +++ b/src/plugins/vbng/vbng_dhcp4_node.c
11925 @@ -0,0 +1,1024 @@
11926 +/*
11927 + * proxy_node.c: dhcp proxy node processing
11928 + *
11929 + * Copyright (c) 2013 Cisco and/or its affiliates and others.
11930 + * Licensed under the Apache License, Version 2.0 (the "License");
11931 + * you may not use this file except in compliance with the License.
11932 + * You may obtain a copy of the License at:
11933 + *
11934 + *     http://www.apache.org/licenses/LICENSE-2.0
11935 + *
11936 + * Unless required by applicable law or agreed to in writing, software
11937 + * distributed under the License is distributed on an "AS IS" BASIS,
11938 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11939 + * See the License for the specific language governing permissions and
11940 + * limitations under the License.
11941 + */
11942 +
11943 +#include <vlib/vlib.h>
11944 +#include <vnet/pg/pg.h>
11945 +#include <vnet/fib/ip4_fib.h>
11946 +#include <vnet/dhcp/client.h>
11947 +#include <vnet/plugin/plugin.h>
11948 +#include <vpp/app/version.h>
11949 +
11950 +#include <vbng/vbng_dhcp4.h>
11951 +#include <vbng/vbng_aaa.h>
11952 +
11953 +static char * vbng_dhcp4_error_strings[] = {
11954 +#define vbng_dhcp4_error(n,s) s,
11955 +#include <vbng/vbng_dhcp4_err.def>
11956 +#undef vbng_dhcp4_error
11957 +};
11958 +
11959 +#define foreach_vbng_dhcp4_to_server_input_next \
11960 +  _ (DROP, "error-drop")                       \
11961 +  _ (LOOKUP, "ip4-lookup")                     \
11962 +  _ (SEND_TO_CLIENT, "vbng-dhcp-to-client")
11963 +
11964 +typedef enum {
11965 +#define _(s,n) VBNG_DHCP4_TO_SERVER_INPUT_NEXT_##s,
11966 +  foreach_vbng_dhcp4_to_server_input_next
11967 +#undef _
11968 +  VBNG_DHCP4_TO_SERVER_INPUT_N_NEXT,
11969 +} vbng_dhcp4_to_server_input_next_t;
11970 +
11971 +typedef struct {
11972 +  /* 0 => to server, 1 => to client */
11973 +  int which;
11974 +  ip4_address_t trace_ip4_address;
11975 +  u32 error;
11976 +  u32 sw_if_index;
11977 +  u32 original_sw_if_index;
11978 +} dhcp_proxy_trace_t;
11979 +
11980 +#define VPP_DHCP_OPTION82_SUB1_SIZE   6
11981 +#define VPP_DHCP_OPTION82_SUB5_SIZE   6
11982 +#define VPP_DHCP_OPTION82_VSS_SIZE    12
11983 +#define VPP_DHCP_OPTION82_SIZE (VPP_DHCP_OPTION82_SUB1_SIZE + \
11984 +                                VPP_DHCP_OPTION82_SUB5_SIZE + \
11985 +                                VPP_DHCP_OPTION82_VSS_SIZE +3)
11986 +
11987 +static vlib_node_registration_t vbng_dhcp4_to_server_node;
11988 +static vlib_node_registration_t vbng_dhcp4_to_client_node;
11989 +
11990 +static u8 *
11991 +format_dhcp_proxy_trace (u8 * s, va_list * args)
11992 +{
11993 +  CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
11994 +  CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
11995 +  dhcp_proxy_trace_t * t = va_arg (*args, dhcp_proxy_trace_t *);
11996
11997 +  if (t->which == 0)
11998 +    s = format (s, "DHCP proxy: sent to server %U\n",
11999 +                format_ip4_address, &t->trace_ip4_address, t->error);
12000 +  else
12001 +    s = format (s, "DHCP proxy: broadcast to client from %U\n",
12002 +                format_ip4_address, &t->trace_ip4_address);
12003 +
12004 +  if (t->error != (u32)~0)
12005 +    s = format (s, "  error: %s\n", vbng_dhcp4_error_strings[t->error]);
12006 +
12007 +  s = format (s, "  original_sw_if_index: %d, sw_if_index: %d\n",
12008 +              t->original_sw_if_index, t->sw_if_index);
12009 +  
12010 +  return s;
12011 +}
12012 +
12013 +static u8 *
12014 +format_dhcp_proxy_header_with_length (u8 * s, va_list * args)
12015 +{
12016 +  dhcp_header_t * h = va_arg (*args, dhcp_header_t *);
12017 +  u32 max_header_bytes = va_arg (*args, u32);
12018 +  u32 header_bytes;
12019 +
12020 +  header_bytes = sizeof (h[0]);
12021 +  if (max_header_bytes != 0 && header_bytes > max_header_bytes)
12022 +    return format (s, "dhcp header truncated");
12023 +
12024 +  s = format (s, "DHCP Proxy");
12025 +
12026 +  return s;
12027 +}
12028 +
12029 +static uword
12030 +vbng_dhcp_to_server_input (vlib_main_t * vm,
12031 +                           vlib_node_runtime_t * node,
12032 +                           vlib_frame_t * from_frame)
12033 +{
12034 +  u32 n_left_from, next_index, * from, * to_next;
12035 +  vbng_dhcp4_main_t *dm = &vbng_dhcp4_main;
12036 +  from = vlib_frame_vector_args (from_frame);
12037 +  n_left_from = from_frame->n_vectors;
12038 +  u32 pkts_to_server=0, pkts_to_client=0, pkts_no_server=0;
12039 +  u32 pkts_no_interface_address=0;
12040 +  u32 pkts_too_big=0, pkts_aaa_fail = 0;
12041 +  ip4_main_t * im = &ip4_main;
12042 +
12043 +  next_index = node->cached_next_index;
12044 +
12045 +  while (n_left_from > 0)
12046 +    {
12047 +      u32 n_left_to_next;
12048 +
12049 +      vlib_get_next_frame (vm, node, next_index,
12050 +                          to_next, n_left_to_next);
12051 +
12052 +      while (n_left_from > 0 && n_left_to_next > 0)
12053 +       {
12054 +         u32 bi0;
12055 +         vlib_buffer_t * b0;
12056 +          udp_header_t * u0;
12057 +         dhcp_header_t * h0;
12058 +          ip4_header_t * ip0;
12059 +         u32 next0;
12060 +          u32 old0, new0;
12061 +          ip_csum_t sum0;
12062 +          u32 error0 = (u32) ~0;
12063 +          u32 sw_if_index = 0;
12064 +          u32 original_sw_if_index = 0;
12065 +          u8  *end = NULL;
12066 +          u32 fib_index;
12067 +          dhcp_proxy_t *proxy;
12068 +          dhcp_server_t *server;
12069 +          u32 rx_sw_if_index;
12070 +          dhcp_option_t *o;
12071 +          u32 len = 0;
12072 +          vlib_buffer_free_list_t *fl;
12073 +          u8 is_discover = 0;
12074 +
12075 +         bi0 = from[0];
12076 +         from += 1;
12077 +         n_left_from -= 1;
12078 +
12079 +         b0 = vlib_get_buffer (vm, bi0);
12080 +
12081 +          h0 = vlib_buffer_get_current (b0);
12082 +
12083 +          /* 
12084 +           * udp_local hands us the DHCP header, need udp hdr, 
12085 +           * ip hdr to relay to server
12086 +           */
12087 +          vlib_buffer_advance (b0, -(sizeof(*u0)));
12088 +         u0 = vlib_buffer_get_current (b0);
12089 +
12090 +          /* This blows. Return traffic has src_port = 67, dst_port = 67 */
12091 +          if (u0->src_port == clib_net_to_host_u16(UDP_DST_PORT_dhcp_to_server))
12092 +            {
12093 +              vlib_buffer_advance (b0, sizeof(*u0));
12094 +              next0 = VBNG_DHCP4_TO_SERVER_INPUT_NEXT_SEND_TO_CLIENT;
12095 +              error0 = 0;
12096 +              pkts_to_client++;
12097 +              goto do_enqueue;
12098 +            }
12099 +
12100 +          rx_sw_if_index = vnet_buffer(b0)->sw_if_index[VLIB_RX];
12101 +
12102 +          fib_index = im->fib_index_by_sw_if_index [rx_sw_if_index];
12103 +          proxy = vbng_dhcp4_get_server(dm, fib_index);
12104 +
12105 +          if (PREDICT_FALSE (NULL == proxy))
12106 +            {
12107 +              error0 = VBNG_DHCP4_ERROR_NO_SERVER;
12108 +              next0 = VBNG_DHCP4_TO_SERVER_INPUT_NEXT_DROP;
12109 +              pkts_no_server++;
12110 +              goto do_trace;
12111 +            }
12112 +
12113 +          server = &proxy->dhcp_servers[0];
12114 +          vlib_buffer_advance (b0, -(sizeof(*ip0)));
12115 +          ip0 = vlib_buffer_get_current (b0);
12116 +
12117 +          /* disable UDP checksum */
12118 +          u0->checksum = 0;
12119 +          sum0 = ip0->checksum;
12120 +          old0 = ip0->dst_address.as_u32;
12121 +          new0 = server->dhcp_server.ip4.as_u32;
12122 +          ip0->dst_address.as_u32 = server->dhcp_server.ip4.as_u32;
12123 +          sum0 = ip_csum_update (sum0, old0, new0, 
12124 +                                ip4_header_t /* structure */, 
12125 +                                dst_address /* changed member */);
12126 +          ip0->checksum = ip_csum_fold (sum0);
12127 +
12128 +          sum0 = ip0->checksum;
12129 +          old0 = ip0->src_address.as_u32;
12130 +          new0 = proxy->dhcp_src_address.ip4.as_u32;
12131 +          ip0->src_address.as_u32 = new0;
12132 +          sum0 = ip_csum_update (sum0, old0, new0, 
12133 +                                ip4_header_t /* structure */, 
12134 +                                src_address /* changed member */);
12135 +          ip0->checksum = ip_csum_fold (sum0);
12136 +
12137 +          /* Send to DHCP server via the configured FIB */
12138 +          vnet_buffer(b0)->sw_if_index[VLIB_TX] =
12139 +            server->server_fib_index;
12140 +
12141 +          h0->gateway_ip_address.as_u32 = proxy->dhcp_src_address.ip4.as_u32;
12142 +          pkts_to_server++;
12143 +
12144 +          o = (dhcp_option_t *) h0->options;
12145 +              
12146 +          fib_index = im->fib_index_by_sw_if_index 
12147 +              [vnet_buffer(b0)->sw_if_index[VLIB_RX]];
12148 +
12149 +          end = b0->data + b0->current_data + b0->current_length;
12150 +          /* TLVs are not performance-friendly... */
12151 +          while  (o->option != 0xFF /* end of options */ && (u8 *)o < end) 
12152 +            {
12153 +              if (DHCP_PACKET_OPTION_MSG_TYPE == o->option)
12154 +                {
12155 +                  if (DHCP_PACKET_DISCOVER == o->data[0])
12156 +                    {
12157 +                      is_discover = 1;
12158 +                    }
12159 +                }
12160 +
12161 +             if (DHCP_PACKET_OPTION_82 == o->option) {
12162 +                /* For Demo purpose only */
12163 +                if (dm->config.is_enabled) {
12164 +                  int i = 0, num_kvs = 0, retval = 0;
12165 +                  char *kv_pairs[1];
12166 +                  char key_string[32];
12167 +
12168 +                  if (DHCP_PACKET_OPTION82_SUB1 == o->data[0]) {
12169 +                      sprintf(key_string,  STR_TPL_ATTR_DHCP_AGENT_CIRCUIT_ID, o->data[2]);
12170 +                      for (i = 1; i < o->data[1]; i++) {
12171 +                          sprintf(key_string, "%s%c", key_string, o->data[2 + i]);
12172 +                      }
12173 +                  }
12174 +
12175 +                  if (DHCP_PACKET_OPTION82_SUB2 == o->data[0]) {
12176 +                      sprintf(key_string, STR_TPL_ATTR_DHCP_AGENT_REMOTE_ID, o->data[2]);
12177 +                      for (i = 1; i < o->data[1]; i++) {
12178 +                          sprintf(key_string, "%s%c", key_string, o->data[2 + i]);
12179 +                      }
12180 +                  }
12181 +
12182 +                  kv_pairs[num_kvs] = key_string;
12183 +                  num_kvs++;
12184 +
12185 +                 retval = vbng_auth(dm, num_kvs, kv_pairs);
12186 +                 if (retval) {
12187 +                    if (retval == 1 /* TIMEOUT_RC */) {
12188 +                        dm->config.is_enabled = VBNG_AAA_DISABLED;
12189 +                    }
12190 +                    error0 = VBNG_DHCP4_ERROR_AAA_FAILURE;
12191 +                    next0 = VBNG_DHCP4_TO_SERVER_INPUT_NEXT_DROP;
12192 +                    pkts_aaa_fail++;
12193 +                    goto do_trace;
12194 +                 }
12195 +               }
12196 +
12197 +                fl = vlib_buffer_get_free_list (vm, b0->free_list_index);
12198 +                if (((u8 *)o - (u8 *)b0->data + (VPP_DHCP_OPTION82_SUB1_SIZE + VPP_DHCP_OPTION82_SUB5_SIZE))
12199 +                    > fl->n_data_bytes)
12200 +                {
12201 +                    next0 = VBNG_DHCP4_TO_SERVER_INPUT_NEXT_DROP;
12202 +                    pkts_too_big++;
12203 +                    goto do_trace;
12204 +                }
12205 +
12206 +                /* Begin to appending new sub-options */
12207 +                {
12208 +                    vnet_main_t *vnm = vnet_get_main();   
12209 +                    u16 old_l0, new_l0, orig_len = 0;
12210 +                    ip4_address_t _ia0, * ia0 = &_ia0;
12211 +                    vnet_sw_interface_t *swif;
12212 +                    sw_if_index = 0;
12213 +                    original_sw_if_index = 0;
12214 +                        
12215 +                    original_sw_if_index = sw_if_index = 
12216 +                        vnet_buffer(b0)->sw_if_index[VLIB_RX];
12217 +                    swif = vnet_get_sw_interface (vnm, sw_if_index);
12218 +                    if (swif->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED)
12219 +                        sw_if_index = swif->unnumbered_sw_if_index;
12220 +                        
12221 +                    /* 
12222 +                     * Get the first ip4 address on the [client-side] 
12223 +                     * RX interface, if not unnumbered. otherwise use
12224 +                     * the loopback interface's ip address.
12225 +                     */
12226 +                    ia0 = ip4_interface_first_address(&ip4_main, sw_if_index, 0);
12227 +                        
12228 +                    if (ia0 == 0)
12229 +                    {
12230 +                        error0 = VBNG_DHCP4_ERROR_NO_INTERFACE_ADDRESS;
12231 +                        next0 = VBNG_DHCP4_TO_SERVER_INPUT_NEXT_DROP;
12232 +                        pkts_no_interface_address++;
12233 +                        goto do_trace;
12234 +                    }
12235 +
12236 +                    orig_len = o->length;
12237 +                    o->data[orig_len + 0] = 1;   /* suboption 1, circuit ID (=FIB id) */
12238 +                    o->data[orig_len + 1] = 4;   /* length of suboption */
12239 +                    o->data[orig_len + 2] = (original_sw_if_index >> 24) & 0xFF;
12240 +                    o->data[orig_len + 3] = (original_sw_if_index >> 16) & 0xFF;
12241 +                    o->data[orig_len + 4] = (original_sw_if_index >> 8)  & 0xFF;
12242 +                    o->data[orig_len + 5] = (original_sw_if_index >> 0)  & 0xFF;
12243 +                    o->data[orig_len + 6] = 5; /* suboption 5 (client RX intfc address) */
12244 +                    o->data[orig_len + 7] = 4; /* length 4 */
12245 +                    o->data[orig_len + 8] = ia0->as_u8[0];
12246 +                    o->data[orig_len + 9] = ia0->as_u8[1];
12247 +                    o->data[orig_len + 10] = ia0->as_u8[2];
12248 +                    o->data[orig_len + 11] = ia0->as_u8[3];
12249 +                    o->data[orig_len + 12] = 0xFF;
12250 +                    o->length += 12;   /* 12 octets appended*/
12251 +
12252 +                    len = o->length + 3;
12253 +                    b0->current_length += len;
12254 +                    /* Fix IP header length and checksum */
12255 +                    old_l0 = ip0->length;
12256 +                    new_l0 = clib_net_to_host_u16 (old_l0);
12257 +                    new_l0 += len;
12258 +                    new_l0 = clib_host_to_net_u16 (new_l0);
12259 +                    ip0->length = new_l0;
12260 +                    sum0 = ip0->checksum;
12261 +                    sum0 = ip_csum_update (sum0, old_l0, new_l0, ip4_header_t,
12262 +                                           length /* changed member */);
12263 +                    ip0->checksum = ip_csum_fold (sum0);
12264 +      
12265 +                    /* Fix UDP length */
12266 +                    new_l0 = clib_net_to_host_u16 (u0->length);
12267 +                    new_l0 += len;
12268 +                    u0->length = clib_host_to_net_u16 (new_l0);
12269 +                }
12270 +              }
12271 +
12272 +              o = (dhcp_option_t *) (((uword) o) + (o->length + 2));
12273 +          }
12274 +
12275 +          next0 = VBNG_DHCP4_TO_SERVER_INPUT_NEXT_LOOKUP;
12276 +
12277 +          /*
12278 +           * If we have multiple servers configured and this is the
12279 +           * client's discover message, then send copies to each of
12280 +           * those servers
12281 +           */
12282 +          if (is_discover && vec_len(proxy->dhcp_servers) > 1)
12283 +          {
12284 +              u32 ii;
12285 +
12286 +              for (ii = 1; ii < vec_len(proxy->dhcp_servers); ii++)
12287 +              {
12288 +                  vlib_buffer_t *c0;
12289 +                  u32 ci0;
12290 +              
12291 +                  c0 = vlib_buffer_copy(vm, b0);
12292 +                  ci0 = vlib_get_buffer_index(vm, c0);
12293 +                  server = &proxy->dhcp_servers[ii];
12294 +
12295 +                  ip0 = vlib_buffer_get_current (c0);
12296 +
12297 +                  sum0 = ip0->checksum;
12298 +                  old0 = ip0->dst_address.as_u32;
12299 +                  new0 = server->dhcp_server.ip4.as_u32;
12300 +                  ip0->dst_address.as_u32 = server->dhcp_server.ip4.as_u32;
12301 +                  sum0 = ip_csum_update (sum0, old0, new0, 
12302 +                                         ip4_header_t /* structure */, 
12303 +                                         dst_address /* changed member */);
12304 +                  ip0->checksum = ip_csum_fold (sum0);
12305 +
12306 +                  to_next[0] = ci0;
12307 +                  to_next += 1;
12308 +                  n_left_to_next -= 1;
12309 +
12310 +                  vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
12311 +                                                   to_next, n_left_to_next,
12312 +                                                   ci0, next0);
12313 +
12314 +                  if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED)) 
12315 +                  {
12316 +                      dhcp_proxy_trace_t *tr;
12317 +
12318 +                      tr = vlib_add_trace (vm, node, c0, sizeof (*tr));
12319 +                      tr->which = 0; /* to server */
12320 +                      tr->error = error0;
12321 +                      tr->original_sw_if_index = original_sw_if_index;
12322 +                      tr->sw_if_index = sw_if_index;
12323 +                      if (next0 == VBNG_DHCP4_TO_SERVER_INPUT_NEXT_LOOKUP)
12324 +                          tr->trace_ip4_address.as_u32 = server->dhcp_server.ip4.as_u32;
12325 +                  }
12326 +
12327 +                  if (PREDICT_FALSE(0 == n_left_to_next))
12328 +                  {
12329 +                      vlib_put_next_frame (vm, node, next_index,
12330 +                                           n_left_to_next);
12331 +                      vlib_get_next_frame (vm, node, next_index,
12332 +                                           to_next, n_left_to_next);
12333 +                  }
12334 +              }
12335 +          }
12336 +        do_trace:
12337 +          if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED)) 
12338 +            {
12339 +               dhcp_proxy_trace_t *tr = vlib_add_trace (vm, node, 
12340 +                                                        b0, sizeof (*tr));
12341 +               tr->which = 0; /* to server */
12342 +               tr->error = error0;
12343 +               tr->original_sw_if_index = original_sw_if_index;
12344 +               tr->sw_if_index = sw_if_index;
12345 +               if (next0 == VBNG_DHCP4_TO_SERVER_INPUT_NEXT_LOOKUP)
12346 +                 tr->trace_ip4_address.as_u32 =
12347 +                     proxy->dhcp_servers[0].dhcp_server.ip4.as_u32;
12348 +            }
12349 +
12350 +        do_enqueue:
12351 +         to_next[0] = bi0;
12352 +         to_next += 1;
12353 +         n_left_to_next -= 1;
12354 +
12355 +         vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
12356 +                                          to_next, n_left_to_next,
12357 +                                          bi0, next0);
12358 +       }
12359 +
12360 +      vlib_put_next_frame (vm, node, next_index, n_left_to_next);
12361 +    }
12362 +
12363 +  vlib_node_increment_counter (vm, vbng_dhcp4_to_server_node.index,
12364 +                               VBNG_DHCP4_ERROR_RELAY_TO_CLIENT,
12365 +                               pkts_to_client);
12366 +  vlib_node_increment_counter (vm, vbng_dhcp4_to_server_node.index,
12367 +                               VBNG_DHCP4_ERROR_RELAY_TO_SERVER,
12368 +                               pkts_to_server);
12369 +  vlib_node_increment_counter (vm, vbng_dhcp4_to_server_node.index,
12370 +                               VBNG_DHCP4_ERROR_NO_SERVER,
12371 +                               pkts_no_server);
12372 +  vlib_node_increment_counter (vm, vbng_dhcp4_to_server_node.index,
12373 +                               VBNG_DHCP4_ERROR_NO_INTERFACE_ADDRESS,
12374 +                               pkts_no_interface_address);
12375 + vlib_node_increment_counter (vm, vbng_dhcp4_to_server_node.index,
12376 +                              VBNG_DHCP4_ERROR_PKT_TOO_BIG,
12377 +                              pkts_too_big);
12378 + vlib_node_increment_counter (vm, vbng_dhcp4_to_server_node.index,
12379 +                              VBNG_DHCP4_ERROR_AAA_FAILURE,
12380 +                              pkts_aaa_fail);
12381 +  return from_frame->n_vectors;
12382 +}
12383 +
12384 +VLIB_REGISTER_NODE (vbng_dhcp4_to_server_node, static) = {
12385 +  .function = vbng_dhcp_to_server_input,
12386 +  .name = "vbng-dhcp-to-server",
12387 +  /* Takes a vector of packets. */
12388 +  .vector_size = sizeof (u32),
12389 +
12390 +  .n_errors = VBNG_DHCP4_N_ERROR,
12391 +  .error_strings = vbng_dhcp4_error_strings,
12392 +
12393 +  .n_next_nodes = VBNG_DHCP4_TO_SERVER_INPUT_N_NEXT,
12394 +  .next_nodes = {
12395 +#define _(s,n) [VBNG_DHCP4_TO_SERVER_INPUT_NEXT_##s] = n,
12396 +    foreach_vbng_dhcp4_to_server_input_next
12397 +#undef _
12398 +  },
12399 +
12400 +  .format_buffer = format_dhcp_proxy_header_with_length,
12401 +  .format_trace = format_dhcp_proxy_trace,
12402 +};
12403 +
12404 +static uword
12405 +vbng_dhcp_to_client_input (vlib_main_t * vm,
12406 +                           vlib_node_runtime_t * node,
12407 +                           vlib_frame_t * from_frame)
12408 +{
12409 +  u32 n_left_from, * from;
12410 +  ethernet_main_t *em = ethernet_get_main (vm);
12411 +  vbng_dhcp4_main_t *dm = &vbng_dhcp4_main;
12412 +  vnet_main_t * vnm = vnet_get_main();
12413 +  ip4_main_t * im = &ip4_main;
12414 +
12415 +  from = vlib_frame_vector_args (from_frame);
12416 +  n_left_from = from_frame->n_vectors;
12417 +
12418 +  while (n_left_from > 0)
12419 +    {
12420 +      u32 bi0;
12421 +      vlib_buffer_t * b0;
12422 +      udp_header_t * u0;
12423 +      dhcp_header_t * h0;
12424 +      ip4_header_t * ip0 = 0;
12425 +      ip4_address_t * ia0 = 0;
12426 +      u32 old0, new0;
12427 +      ip_csum_t sum0;
12428 +      ethernet_interface_t *ei0;
12429 +      ethernet_header_t *mac0;
12430 +      vnet_hw_interface_t *hi0;
12431 +      vlib_frame_t *f0;
12432 +      u32 * to_next0;
12433 +      u32 sw_if_index = ~0;
12434 +      vnet_sw_interface_t *si0;
12435 +      u32 error0 = (u32)~0;
12436 +      vnet_sw_interface_t *swif;
12437 +      u32 fib_index;
12438 +      dhcp_proxy_t *proxy;
12439 +      dhcp_server_t *server;
12440 +      u32 original_sw_if_index = (u32) ~0;
12441 +      ip4_address_t relay_addr = {
12442 +          .as_u32 = 0,
12443 +      };
12444 +
12445 +      bi0 = from[0];
12446 +      from += 1;
12447 +      n_left_from -= 1;
12448 +
12449 +      b0 = vlib_get_buffer (vm, bi0);
12450 +      h0 = vlib_buffer_get_current (b0);
12451 +
12452 +      /* 
12453 +       * udp_local hands us the DHCP header, need udp hdr, 
12454 +       * ip hdr to relay to client
12455 +       */
12456 +      vlib_buffer_advance (b0, -(sizeof(*u0)));
12457 +      u0 = vlib_buffer_get_current (b0);
12458 +
12459 +      vlib_buffer_advance (b0, -(sizeof(*ip0)));
12460 +      ip0 = vlib_buffer_get_current (b0);
12461 +
12462 +      {
12463 +          dhcp_option_t *o = (dhcp_option_t *) h0->options;
12464 +          dhcp_option_t *sub;
12465 +              
12466 +          /* Parse through TLVs looking for option 82.
12467 +             The circuit-ID is the FIB number we need
12468 +             to track down the client-facing interface */
12469 +
12470 +          while (o->option != 0xFF /* end of options */ &&
12471 +                 (u8 *) o < (b0->data + b0->current_data + b0->current_length))
12472 +            {
12473 +              if (o->option == 82)
12474 +                {
12475 +                    sub = (dhcp_option_t *) &o->data[0];
12476 +                    while (sub->option != 0xFF /* end of options */ &&
12477 +                           (u8 *) sub < (u8 *)(o + o->length)) {
12478 +                        /* If this is one of ours, it will have
12479 +                           total length 12, circuit-id suboption type,
12480 +                           and the sw_if_index */
12481 +                        if (sub->option == 1 && sub->length == 4)
12482 +                          {
12483 +                            sw_if_index = ((sub->data[0] << 24) |
12484 +                                           (sub->data[1] << 16) |
12485 +                                           (sub->data[2] << 8)  |
12486 +                                           (sub->data[3]));
12487 +                          }
12488 +                        else if (sub->option == 5 && sub->length == 4)
12489 +                          {
12490 +                              relay_addr.as_u8[0] = sub->data[0];
12491 +                              relay_addr.as_u8[1] = sub->data[1];
12492 +                              relay_addr.as_u8[2] = sub->data[2];
12493 +                              relay_addr.as_u8[3] = sub->data[3];
12494 +                          }
12495 +                        sub = (dhcp_option_t *) 
12496 +                          (((uword) sub) + (sub->length + 2));
12497 +                    }
12498 +
12499 +                }
12500 +              o = (dhcp_option_t *) (((uword) o) + (o->length + 2));
12501 +            }
12502 +        }
12503 +
12504 +      if (sw_if_index == (u32)~0)
12505 +        {
12506 +          error0 = VBNG_DHCP4_ERROR_NO_OPTION_82;
12507 +          
12508 +        drop_packet:
12509 +          vlib_node_increment_counter (vm, vbng_dhcp4_to_client_node.index,
12510 +                                       error0, 1);
12511 +          f0 = vlib_get_frame_to_node (vm, dm->error_drop_node_index);
12512 +          to_next0 = vlib_frame_vector_args (f0);
12513 +          to_next0[0] = bi0;
12514 +          f0->n_vectors = 1;
12515 +          vlib_put_frame_to_node (vm, dm->error_drop_node_index, f0);
12516 +          goto do_trace;
12517 +        }
12518 +      
12519 +      if (relay_addr.as_u32 == 0)
12520 +        {
12521 +          error0 = VBNG_DHCP4_ERROR_BAD_OPTION_82_ADDR;
12522 +          goto drop_packet;
12523 +        }
12524 +
12525 +      if (sw_if_index >= vec_len (im->fib_index_by_sw_if_index))
12526 +        {
12527 +          error0 = VBNG_DHCP4_ERROR_BAD_OPTION_82_ITF;
12528 +          goto drop_packet;
12529 +        }
12530 +
12531 +      fib_index = im->fib_index_by_sw_if_index [sw_if_index];
12532 +      proxy = vbng_dhcp4_get_server(dm, fib_index);
12533 +
12534 +      if (PREDICT_FALSE (NULL == proxy))
12535 +        {
12536 +          error0 = VBNG_DHCP4_ERROR_NO_SERVER;
12537 +          goto drop_packet;
12538 +        }
12539 +      
12540 +      vec_foreach(server, proxy->dhcp_servers)
12541 +        {
12542 +          if (ip0->src_address.as_u32 == server->dhcp_server.ip4.as_u32)
12543 +            {
12544 +              goto server_found;
12545 +            }
12546 +        }
12547 +
12548 +      error0 = VBNG_DHCP4_ERROR_BAD_SVR_FIB_OR_ADDRESS;
12549 +      goto drop_packet;
12550 +
12551 +    server_found:
12552 +      vnet_buffer (b0)->sw_if_index[VLIB_TX] = sw_if_index;
12553 +
12554 +      swif = vnet_get_sw_interface (vnm, sw_if_index);
12555 +      original_sw_if_index = sw_if_index;
12556 +      if (swif->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED)
12557 +          sw_if_index = swif->unnumbered_sw_if_index;
12558 +
12559 +      ia0 = ip4_interface_first_address (&ip4_main, sw_if_index, 0);
12560 +      if (ia0 == 0)
12561 +        {
12562 +          error0 = VBNG_DHCP4_ERROR_NO_INTERFACE_ADDRESS;
12563 +          goto drop_packet;
12564 +        }
12565 +
12566 +      if (relay_addr.as_u32 != ia0->as_u32)
12567 +        {             
12568 +          error0 = VBNG_DHCP4_ERROR_BAD_YIADDR;
12569 +          goto drop_packet;
12570 +        }
12571 +
12572 +      u0->checksum = 0;
12573 +      u0->dst_port = clib_net_to_host_u16 (UDP_DST_PORT_dhcp_to_client);
12574 +      sum0 = ip0->checksum;
12575 +      old0 = ip0->dst_address.as_u32;
12576 +      new0 = 0xFFFFFFFF;
12577 +      ip0->dst_address.as_u32 = new0;
12578 +      sum0 = ip_csum_update (sum0, old0, new0, 
12579 +                            ip4_header_t /* structure */, 
12580 +                            dst_address /* offset of changed member */);
12581 +      ip0->checksum = ip_csum_fold (sum0);
12582 +
12583 +      sum0 = ip0->checksum;
12584 +      old0 = ip0->src_address.as_u32;
12585 +      new0 = ia0->as_u32;
12586 +      ip0->src_address.as_u32 = new0;
12587 +      sum0 = ip_csum_update (sum0, old0, new0, 
12588 +                            ip4_header_t /* structure */, 
12589 +                            src_address /* offset of changed member */);
12590 +      ip0->checksum = ip_csum_fold (sum0);
12591 +
12592 +      vlib_buffer_advance (b0, -(sizeof(ethernet_header_t)));
12593 +      si0 = vnet_get_sw_interface (vnm, original_sw_if_index);
12594 +      if (si0->type == VNET_SW_INTERFACE_TYPE_SUB)
12595 +         vlib_buffer_advance (b0, -4 /* space for VLAN tag */);
12596 +
12597 +      mac0 = vlib_buffer_get_current (b0);
12598 +
12599 +      hi0 = vnet_get_sup_hw_interface (vnm, original_sw_if_index);
12600 +      ei0 = pool_elt_at_index (em->interfaces, hi0->hw_instance);
12601 +      clib_memcpy (mac0->src_address, ei0->address, sizeof (ei0->address));
12602 +      memset (mac0->dst_address, 0xff, sizeof (mac0->dst_address));
12603 +      mac0->type = (si0->type == VNET_SW_INTERFACE_TYPE_SUB) ?
12604 +       clib_net_to_host_u16(0x8100) : clib_net_to_host_u16 (0x0800);
12605 +
12606 +      if (si0->type == VNET_SW_INTERFACE_TYPE_SUB)
12607 +       {
12608 +         u32 * vlan_tag = (u32 *)(mac0+1);
12609 +         u32 tmp;
12610 +         tmp = (si0->sub.id << 16) | 0x0800;
12611 +         *vlan_tag = clib_host_to_net_u32 (tmp);
12612 +       }
12613 +
12614 +      /* $$$ This needs to be rewritten, for sure */
12615 +      f0 = vlib_get_frame_to_node (vm, hi0->output_node_index);
12616 +      to_next0 = vlib_frame_vector_args (f0);
12617 +      to_next0[0] = bi0;
12618 +      f0->n_vectors = 1;
12619 +      vlib_put_frame_to_node (vm, hi0->output_node_index, f0);
12620 +
12621 +    do_trace:
12622 +      if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED)) 
12623 +        {
12624 +          dhcp_proxy_trace_t *tr = vlib_add_trace (vm, node, 
12625 +                                                   b0, sizeof (*tr));
12626 +          tr->which = 1; /* to client */
12627 +          tr->trace_ip4_address.as_u32 = ia0 ? ia0->as_u32 : 0;
12628 +          tr->error = error0;
12629 +          tr->original_sw_if_index = original_sw_if_index;
12630 +          tr->sw_if_index = sw_if_index;
12631 +        }
12632 +    }
12633 +  return from_frame->n_vectors;
12634 +}
12635 +
12636 +VLIB_REGISTER_NODE (vbng_dhcp4_to_client_node, static) = {
12637 +  .function = vbng_dhcp_to_client_input,
12638 +  .name = "vbng-dhcp-to-client",
12639 +  /* Takes a vector of packets. */
12640 +  .vector_size = sizeof (u32),
12641 +
12642 +  .n_errors = VBNG_DHCP4_N_ERROR,
12643 +  .error_strings = vbng_dhcp4_error_strings,
12644 +  .format_buffer = format_dhcp_proxy_header_with_length,
12645 +  .format_trace = format_dhcp_proxy_trace,
12646 +};
12647 +
12648 +static clib_error_t *
12649 +vbng_dhcp4_proxy_init (vlib_main_t * vm)
12650 +{
12651 +  vbng_dhcp4_main_t *dm = &vbng_dhcp4_main;
12652 +  vlib_node_t * error_drop_node;
12653 +
12654 +  error_drop_node = vlib_get_node_by_name (vm, (u8 *) "error-drop");
12655 +  dm->error_drop_node_index = error_drop_node->index;
12656 +
12657 +  udp_register_dst_port (vm, UDP_DST_PORT_dhcp_to_client, 
12658 +                         vbng_dhcp4_to_client_node.index, 1 /* is_ip4 */);
12659 +
12660 +  udp_register_dst_port (vm, UDP_DST_PORT_dhcp_to_server, 
12661 +                         vbng_dhcp4_to_server_node.index, 1 /* is_ip4 */);
12662 +
12663 +  dm->vlib_main = vm;
12664 +  dm->vnet_main = vnet_get_main();
12665 +
12666 +  return 0;
12667 +}
12668 +
12669 +/* *INDENT-OFF* */
12670 +VLIB_INIT_FUNCTION (vbng_dhcp4_proxy_init);
12671 +/* *INDENT-ON* */
12672 +
12673 +int
12674 +vbng_dhcp4_set_server (ip46_address_t *addr,
12675 +                       ip46_address_t *src_addr,
12676 +                       u32 rx_table_id,
12677 +                       u32 server_table_id, 
12678 +                       int is_del)
12679 +{
12680 +  u32 rx_fib_index = 0;
12681 +  int rc = 0;
12682 +
12683 +  const fib_prefix_t all_1s =
12684 +  {
12685 +      .fp_len = 32,
12686 +      .fp_addr.ip4.as_u32 = 0xffffffff,
12687 +      .fp_proto = FIB_PROTOCOL_IP4,
12688 +  };
12689 +
12690 +  if (ip46_address_is_zero(addr))
12691 +    return VNET_API_ERROR_INVALID_DST_ADDRESS;
12692 +  
12693 +  if (ip46_address_is_zero(src_addr))
12694 +    return VNET_API_ERROR_INVALID_SRC_ADDRESS;
12695 +
12696 +  rx_fib_index = fib_table_find_or_create_and_lock(FIB_PROTOCOL_IP4,
12697 +                                                   rx_table_id);
12698 +
12699 +  if (is_del)
12700 +    {
12701 +      if (vbng_dhcp4_server_del (FIB_PROTOCOL_IP4, rx_fib_index,
12702 +                                 addr, server_table_id))
12703 +      {
12704 +          fib_table_entry_special_remove(rx_fib_index,
12705 +                                         &all_1s,
12706 +                                         FIB_SOURCE_DHCP);
12707 +          fib_table_unlock (rx_fib_index, FIB_PROTOCOL_IP4);
12708 +      }
12709 +    }
12710 +  else
12711 +  {
12712 +      if (vbng_dhcp4_server_add (FIB_PROTOCOL_IP4,
12713 +                                 addr, src_addr,
12714 +                                 rx_fib_index, server_table_id))
12715 +      {
12716 +          fib_table_entry_special_add(rx_fib_index,
12717 +                                      &all_1s,
12718 +                                      FIB_SOURCE_DHCP,
12719 +                                      FIB_ENTRY_FLAG_LOCAL);
12720 +          fib_table_lock (rx_fib_index, FIB_PROTOCOL_IP4);
12721 +      }
12722 +  }
12723 +  fib_table_unlock (rx_fib_index, FIB_PROTOCOL_IP4);
12724 +
12725 +  return (rc);
12726 +}
12727 +
12728 +static clib_error_t *
12729 +dhcp4_proxy_set_command_fn (vlib_main_t * vm,
12730 +                            unformat_input_t * input,
12731 +                            vlib_cli_command_t * cmd)
12732 +{
12733 +  ip46_address_t server_addr, src_addr;
12734 +  u32 server_table_id = 0, rx_table_id = 0;
12735 +  int is_del = 0;
12736 +  int set_src = 0, set_server = 0;
12737 +
12738 +  memset(&server_addr, 0, sizeof(server_addr));
12739 +  memset(&src_addr, 0, sizeof(src_addr));
12740 +
12741 +  while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) 
12742 +    {
12743 +      if (unformat (input, "remote %U", 
12744 +                    unformat_ip4_address, &server_addr.ip4)) 
12745 +        set_server = 1;
12746 +      else if (unformat (input, "server-fib-id %d", &server_table_id))
12747 +        ;
12748 +      else if (unformat (input, "rx-fib-id %d", &rx_table_id))
12749 +        ;
12750 +      else if (unformat(input, "local %U", 
12751 +                       unformat_ip4_address, &src_addr.ip4))
12752 +        set_src = 1;
12753 +      else if (unformat (input, "delete") ||
12754 +               unformat (input, "del"))
12755 +        is_del = 1;
12756 +      else
12757 +        break;
12758 +    }
12759 +
12760 +  if (is_del || (set_server && set_src))
12761 +    {
12762 +      int rv;
12763 +
12764 +      rv = vbng_dhcp4_set_server (&server_addr, &src_addr, rx_table_id, 
12765 +                                   server_table_id, is_del);
12766 +      switch (rv)
12767 +        {
12768 +        case 0:
12769 +          return 0;
12770 +
12771 +        case VNET_API_ERROR_INVALID_DST_ADDRESS:
12772 +          return clib_error_return (0, "Invalid remote address");
12773 +          
12774 +        case VNET_API_ERROR_INVALID_SRC_ADDRESS:
12775 +          return clib_error_return (0, "Invalid local address");
12776 +
12777 +        case VNET_API_ERROR_NO_SUCH_ENTRY:
12778 +          return clib_error_return 
12779 +            (0, "Fib id %d: no per-fib DHCP server configured", rx_table_id);
12780 +
12781 +        default:
12782 +          return clib_error_return (0, "BUG: rv %d", rv);
12783 +        }
12784 +    }
12785 +  else
12786 +    return clib_error_return (0, "parse error`%U'",
12787 +                              format_unformat_error, input);
12788 +}
12789 +
12790 +VLIB_CLI_COMMAND (vbng_dhcp4_set_command, static) = {
12791 +  .path = "set vbng dhcp4",
12792 +  .short_help = "set vbng dhcp4 [del] remote <ip-addr> local <ip-addr> [server-fib-id <n>] [rx-fib-id <n>]",
12793 +  .function = dhcp4_proxy_set_command_fn,
12794 +};
12795 +
12796 +static u8 *
12797 +format_dhcp4_proxy_server (u8 * s, va_list * args)
12798 +{
12799 +  dhcp_proxy_t *proxy = va_arg (*args, dhcp_proxy_t *);
12800 +  ip4_fib_t * rx_fib, * server_fib;
12801 +  dhcp_server_t *server;
12802 +
12803 +  if (proxy == 0)
12804 +    {
12805 +        s = format (s, "%=14s%=16s%s", "RX FIB", "Src Address", 
12806 +                    "Servers FIB,Address");
12807 +      return s;
12808 +    }
12809 +
12810 +  rx_fib = ip4_fib_get(proxy->rx_fib_index);
12811 +
12812 +  s = format (s, "%=14u%=16U",
12813 +              rx_fib->table_id,
12814 +              format_ip46_address, &proxy->dhcp_src_address, IP46_TYPE_ANY);
12815 +
12816 +  vec_foreach(server, proxy->dhcp_servers)
12817 +  {
12818 +      server_fib = ip4_fib_get(server->server_fib_index);
12819 +      s = format (s, "%u,%U  ",
12820 +                  server_fib->table_id,
12821 +                  format_ip46_address, &server->dhcp_server, IP46_TYPE_ANY);
12822 +  }
12823 +  return s;
12824 +}
12825 +
12826 +static int
12827 +dhcp4_proxy_show_walk (dhcp_proxy_t *server,
12828 +                       void *ctx)
12829 +{
12830 +    vlib_main_t * vm = ctx;
12831 +
12832 +    vlib_cli_output (vm, "%U", format_dhcp4_proxy_server, server);
12833 +
12834 +    return (1);
12835 +}
12836 +
12837 +static clib_error_t *
12838 +vbng_dhcp4_show_command_fn (vlib_main_t * vm,
12839 +                            unformat_input_t * input,
12840 +                            vlib_cli_command_t * cmd)
12841 +{
12842 +  vlib_cli_output (vm, "%U", format_dhcp4_proxy_server, NULL /* header line */);
12843 +
12844 +  vbng_dhcp4_walk(dhcp4_proxy_show_walk, vm);
12845 +
12846 +  return (NULL);
12847 +}
12848 +
12849 +VLIB_CLI_COMMAND (vbng_dhcp4_show_command, static) = {
12850 +  .path = "show vbng dhcp4",
12851 +  .short_help = "Display vbng DHCP4 configuration info",
12852 +  .function = vbng_dhcp4_show_command_fn,
12853 +};
12854 +
12855 +static clib_error_t *
12856 +vbng_aaa_set_command_fn (vlib_main_t * vm,
12857 +                         unformat_input_t * input,
12858 +                         vlib_cli_command_t * cmd)
12859 +{
12860 +       vbng_dhcp4_main_t *dm = &vbng_dhcp4_main;
12861 +       u8 *config_file = NULL;
12862 +       u32 nas_port  = 0;
12863 +       int set_config = 0, is_del = 0;
12864 +
12865 +       while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) {
12866 +               if (unformat (input, "nas-port %d", &nas_port))
12867 +                       ;
12868 +               else if (unformat (input, "config %v", &config_file))
12869 +                       set_config = 1;
12870 +               else if (unformat (input, "delete") ||
12871 +                   unformat (input, "del"))
12872 +                       is_del = 1;
12873 +               else
12874 +                       break;
12875 +       }
12876 +
12877 +       if (!is_del && set_config) {
12878 +               if (dm->config.is_enabled == VBNG_AAA_ENABLED) {
12879 +                       return 0;
12880 +               }
12881 +
12882 +               if (nas_port) {
12883 +                       dm->config.nas_port = nas_port;
12884 +               } else {
12885 +                       dm->config.nas_port = AAA_DEFAULT_NAS_PORT;
12886 +               }
12887 +               dm->config.config_file = config_file;
12888 +               dm->config.is_enabled = VBNG_AAA_ENABLED;
12889 +       } else if (is_del) {
12890 +               if (dm->config.is_enabled == VBNG_AAA_DISABLED) {
12891 +                       return 0;
12892 +               }
12893 +
12894 +               vec_free (dm->config.config_file);
12895 +               dm->config.config_file = format(0, "%s",  AAA_DEFAULT_CONFIG_FILE);
12896 +               dm->config.nas_port = AAA_DEFAULT_NAS_PORT;
12897 +               dm->config.is_enabled = VBNG_AAA_DISABLED;
12898 +       } else {
12899 +               return clib_error_return (0, "parse error`%U'",
12900 +                   format_unformat_error, input);
12901 +       }
12902 +
12903 +       return 0;
12904 +}
12905 +
12906 +VLIB_CLI_COMMAND (vbng_aaa_set_command, static) = {
12907 +       .path = "set vbng aaa",
12908 +       .short_help = "set vbng aaa [del] config <file> [nas-port <n>]",
12909 +       .function = vbng_aaa_set_command_fn,
12910 +};
12911 +
12912 +static u8 *
12913 +format_vbng_aaa_config(u8 *s, va_list *args)
12914 +{
12915 +       vbng_dhcp4_main_t *dm = &vbng_dhcp4_main;
12916 +
12917 +       s = format(s, "%=8s %=8s %s\n", "Enabled",
12918 +                  "NAS Port", "Config File");
12919 +
12920 +       s = format(s, "%=8s %=8d %v\n",
12921 +               dm->config.is_enabled ? "True" : "False",
12922 +               dm->config.nas_port,
12923 +               dm->config.config_file);
12924 +
12925 +       return s;
12926 +}
12927 +
12928 +static clib_error_t *
12929 +vbng_aaa_show_command_fn (vlib_main_t * vm,
12930 +                          unformat_input_t * input,
12931 +                          vlib_cli_command_t * cmd)
12932 +{
12933 +  vlib_cli_output (vm, "%U", format_vbng_aaa_config, NULL);
12934 +
12935 +  return (NULL);
12936 +}
12937 +
12938 +VLIB_CLI_COMMAND (vbng_aaa_show_command, static) = {
12939 +       .path = "show vbng aaa",
12940 +       .short_help = "Display vbng AAA configuration info",
12941 +       .function = vbng_aaa_show_command_fn,
12942 +};
12943 +
12944 +/* *INDENT-OFF* */
12945 +VLIB_PLUGIN_REGISTER () = {
12946 +       .version = VPP_BUILD_VER,
12947 +       .description = "DHCP V4 Proxy With Radius Client",
12948 +};
12949 +/* *INDENT-ON* */
12950 diff --git a/src/plugins/vbng/vbng_msg_enum.h b/src/plugins/vbng/vbng_msg_enum.h
12951 new file mode 100644
12952 index 00000000..1dc1357f
12953 --- /dev/null
12954 +++ b/src/plugins/vbng/vbng_msg_enum.h
12955 @@ -0,0 +1,31 @@
12956 +/*
12957 + * vbng_msg_enum.h - vpp engine plug-in message enumeration
12958 + *
12959 + * Copyright (c) 2017 Intel and/or its affiliates.
12960 + * Licensed under the Apache License, Version 2.0 (the "License");
12961 + * you may not use this file except in compliance with the License.
12962 + * You may obtain a copy of the License at:
12963 + *
12964 + *     http://www.apache.org/licenses/LICENSE-2.0
12965 + *
12966 + * Unless required by applicable law or agreed to in writing, software
12967 + * distributed under the License is distributed on an "AS IS" BASIS,
12968 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12969 + * See the License for the specific language governing permissions and
12970 + * limitations under the License.
12971 + */
12972 +#ifndef _VBNG_MSG_ENUM_H_
12973 +#define _VBNG_MSG_ENUM_H_
12974 +
12975 +#include <vppinfra/byte_order.h>
12976 +
12977 +#define vl_msg_id(n,h) n,
12978 +typedef enum
12979 +{
12980 +#include <vbng/vbng_all_api_h.h>
12981 +  /* We'll want to know how many messages IDs we need... */
12982 +  VL_MSG_FIRST_AVAILABLE,
12983 +} vl_msg_id_t;
12984 +#undef vl_msg_id
12985 +
12986 +#endif /* _VBNG_MSG_ENUM_H_ */
12987 diff --git a/src/vnet.am b/src/vnet.am
12988 index 9e099f33..7c107f0f 100644
12989 --- a/src/vnet.am
12990 +++ b/src/vnet.am
12991 @@ -682,31 +682,31 @@ endif
12992  ########################################
12993  # DHCP client
12994  ########################################
12995 -libvnet_la_SOURCES +=                          \
12996 - vnet/dhcp/client.c                            \
12997 - vnet/dhcp/client.h                            \
12998 - vnet/dhcp/dhcp_api.c
12999 -
13000 -nobase_include_HEADERS +=                      \
13001 - vnet/dhcp/client.h                            \
13002 - vnet/dhcp/dhcp.api.h
13003 -
13004 -API_FILES += vnet/dhcp/dhcp.api
13005 +#libvnet_la_SOURCES +=                         \
13006 +# vnet/dhcp/client.c                           \
13007 +# vnet/dhcp/client.h                           \
13008 +# vnet/dhcp/dhcp_api.c
13009 +#
13010 +#nobase_include_HEADERS +=                     \
13011 +# vnet/dhcp/client.h                           \
13012 +# vnet/dhcp/dhcp.api.h
13013 +#
13014 +#API_FILES += vnet/dhcp/dhcp.api
13015  
13016  ########################################
13017  # DHCP proxy
13018  ########################################
13019 -libvnet_la_SOURCES +=                          \
13020 - vnet/dhcp/dhcp6_proxy_node.c                   \
13021 - vnet/dhcp/dhcp4_proxy_node.c                  \
13022 - vnet/dhcp/dhcp_proxy.c
13023 -
13024 -nobase_include_HEADERS +=                      \
13025 - vnet/dhcp/dhcp4_packet.h                      \
13026 - vnet/dhcp/dhcp6_packet.h                      \
13027 - vnet/dhcp/dhcp_proxy.h                                \
13028 - vnet/dhcp/dhcp6_proxy_error.def                \
13029 - vnet/dhcp/dhcp4_proxy_error.def
13030 +#libvnet_la_SOURCES +=                         \
13031 +# vnet/dhcp/dhcp6_proxy_node.c                   \
13032 +# vnet/dhcp/dhcp4_proxy_node.c                 \
13033 +# vnet/dhcp/dhcp_proxy.c
13034 +#
13035 +#nobase_include_HEADERS +=                     \
13036 +# vnet/dhcp/dhcp4_packet.h                     \
13037 +# vnet/dhcp/dhcp6_packet.h                     \
13038 +# vnet/dhcp/dhcp_proxy.h                               \
13039 +# vnet/dhcp/dhcp6_proxy_error.def                \
13040 +# vnet/dhcp/dhcp4_proxy_error.def
13041  
13042  ########################################
13043  # ipv6 segment routing
13044 diff --git a/src/vpp-api/java/Makefile.am b/src/vpp-api/java/Makefile.am
13045 index f18e0c24..cadaa8d9 100644
13046 --- a/src/vpp-api/java/Makefile.am
13047 +++ b/src/vpp-api/java/Makefile.am
13048 @@ -149,6 +149,26 @@ jvpp-snat/io_fd_vpp_jvpp_snat_JVppSnatImpl.h: $(jvpp_registry_ok) $(jvpp_snat_js
13049  endif
13050  
13051  #
13052 +# VBNG Plugin
13053 +#
13054 +if ENABLE_VBNG_PLUGIN
13055 +noinst_LTLIBRARIES += libjvpp_vbng.la
13056 +libjvpp_vbng_la_SOURCES = jvpp-vbng/jvpp_vbng.c
13057 +libjvpp_vbng_la_CPPFLAGS = -Ijvpp-vbng
13058 +libjvpp_vbng_la_LIBADD = $(JVPP_LIBS)
13059 +libjvpp_vbng_la_DEPENDENCIES = libjvpp_common.la
13060 +
13061 +BUILT_SOURCES += jvpp-vbng/io_fd_vpp_jvpp_vbng_JVppVbngImpl.h
13062 +JAR_FILES += jvpp-vbng-$(PACKAGE_VERSION).jar
13063 +CLEANDIRS += jvpp-vbng/target
13064 +
13065 +jvpp_vbng_json_files = @top_builddir@/plugins/vbng/vbng.api.json
13066 +
13067 +jvpp-vbng/io_fd_vpp_jvpp_vbng_JVppVbngImpl.h: $(jvpp_registry_ok) $(jvpp_vbng_json_files)
13068 +       $(call japigen,vbng,JVppVbngImpl)
13069 +endif
13070 +
13071 +#
13072  # iOAM Trace Plugin
13073  #
13074  if ENABLE_IOAM_PLUGIN
13075 diff --git a/src/vpp-api/java/jvpp-vbng/jvpp_vbng.c b/src/vpp-api/java/jvpp-vbng/jvpp_vbng.c
13076 new file mode 100644
13077 index 00000000..b722a500
13078 --- /dev/null
13079 +++ b/src/vpp-api/java/jvpp-vbng/jvpp_vbng.c
13080 @@ -0,0 +1,108 @@
13081 +/*
13082 + * Copyright (c) 2017 Intel Corp and/or its affiliates.
13083 + *
13084 + * Licensed under the Apache License, Version 2.0 (the "License");
13085 + * you may not use this file except in compliance with the License.
13086 + * You may obtain a copy of the License at:
13087 + *
13088 + *     http://www.apache.org/licenses/LICENSE-2.0
13089 + *
13090 + * Unless required by applicable law or agreed to in writing, software
13091 + * distributed under the License is distributed on an "AS IS" BASIS,
13092 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13093 + * See the License for the specific language governing permissions and
13094 + * limitations under the License.
13095 + */
13096 +
13097 +#include <vnet/vnet.h>
13098 +
13099 +#include <vbng/vbng_msg_enum.h>
13100 +#define vl_typedefs             /* define message structures */
13101 +#include <vbng/vbng_all_api_h.h>
13102 +#undef vl_typedefs
13103 +
13104 +#include <vnet/api_errno.h>
13105 +#include <vlibapi/api.h>
13106 +#include <vlibmemory/api.h>
13107 +
13108 +#if VPPJNI_DEBUG == 1
13109 +  #define DEBUG_LOG(...) clib_warning(__VA_ARGS__)
13110 +#else
13111 +  #define DEBUG_LOG(...)
13112 +#endif
13113 +
13114 +#include <jvpp-common/jvpp_common.h>
13115 +
13116 +#include "jvpp-vbng/io_fd_vpp_jvpp_vbng_JVppVbngImpl.h"
13117 +#include "jvpp_vbng.h"
13118 +#include "jvpp-vbng/jvpp_vbng_gen.h"
13119 +
13120 +/*
13121 + * Class:     io_fd_vpp_jvpp_vbng_JVppVbngImpl
13122 + * Method:    init0
13123 + * Signature: (JI)V
13124 + */
13125 +JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_vbng_JVppVbngImpl_init0
13126 +  (JNIEnv *env, jclass clazz, jobject callback, jlong queue_address, jint my_client_index) {
13127 +  vbng_main_t * plugin_main = &vbng_main;
13128 +  clib_warning ("Java_io_fd_vpp_jvpp_vbng_JVppVbngImpl_init0");
13129 +
13130 +  plugin_main->my_client_index = my_client_index;
13131 +  plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address;
13132 +
13133 +  plugin_main->callbackObject = (*env)->NewGlobalRef(env, callback);
13134 +  plugin_main->callbackClass = (jclass)(*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, callback));
13135 +
13136 +  // verify API has not changed since jar generation
13137 +  #define _(N)             \
13138 +      get_message_id(env, #N);
13139 +      foreach_supported_api_message;
13140 +  #undef _
13141 +
13142 +  #define _(N,n)                                  \
13143 +      vl_msg_api_set_handlers(get_message_id(env, #N), #n,     \
13144 +              vl_api_##n##_t_handler,             \
13145 +              vl_noop_handler,                    \
13146 +              vl_noop_handler,                    \
13147 +              vl_noop_handler,                    \
13148 +              sizeof(vl_api_##n##_t), 1);
13149 +      foreach_api_reply_handler;
13150 +  #undef _
13151 +}
13152 +
13153 +JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_vbng_JVppVbngImpl_close0
13154 +(JNIEnv *env, jclass clazz) {
13155 +  vbng_main_t * plugin_main = &vbng_main;
13156 +
13157 +    // cleanup:
13158 +    (*env)->DeleteGlobalRef(env, plugin_main->callbackClass);
13159 +    (*env)->DeleteGlobalRef(env, plugin_main->callbackObject);
13160 +
13161 +    plugin_main->callbackClass = NULL;
13162 +    plugin_main->callbackObject = NULL;
13163 +}
13164 +
13165 +/* Attach thread to JVM and cache class references when initiating JVPP VES */
13166 +jint JNI_OnLoad(JavaVM *vm, void *reserved) {
13167 +    JNIEnv* env;
13168 +
13169 +    if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) {
13170 +        return JNI_EVERSION;
13171 +    }
13172 +
13173 +    if (cache_class_references(env) != 0) {
13174 +        clib_warning ("Failed to cache class references\n");
13175 +        return JNI_ERR;
13176 +    }
13177 +
13178 +    return JNI_VERSION_1_8;
13179 +}
13180 +
13181 +/* Clean up cached references when disposing JVPP VES */
13182 +void JNI_OnUnload(JavaVM *vm, void *reserved) {
13183 +    JNIEnv* env;
13184 +    if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) {
13185 +        return;
13186 +    }
13187 +    delete_class_references(env);
13188 +}
13189 diff --git a/src/vpp-api/java/jvpp-vbng/jvpp_vbng.h b/src/vpp-api/java/jvpp-vbng/jvpp_vbng.h
13190 new file mode 100644
13191 index 00000000..62b4cda5
13192 --- /dev/null
13193 +++ b/src/vpp-api/java/jvpp-vbng/jvpp_vbng.h
13194 @@ -0,0 +1,42 @@
13195 +/*
13196 + * Copyright (c) 2017 Intel Corp and/or its affiliates.
13197 + *
13198 + * Licensed under the Apache License, Version 2.0 (the "License");
13199 + * you may not use this file except in compliance with the License.
13200 + * You may obtain a copy of the License at:
13201 + *
13202 + *     http://www.apache.org/licenses/LICENSE-2.0
13203 + *
13204 + * Unless required by applicable law or agreed to in writing, software
13205 + * distributed under the License is distributed on an "AS IS" BASIS,
13206 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13207 + * See the License for the specific language governing permissions and
13208 + * limitations under the License.
13209 + */
13210 +#ifndef __included_jvpp_vbng_h__
13211 +#define __included_jvpp_vbng_h__
13212 +
13213 +#include <vnet/vnet.h>
13214 +#include <vnet/ip/ip.h>
13215 +#include <vnet/api_errno.h>
13216 +#include <vlibapi/api.h>
13217 +#include <vlibmemory/api.h>
13218 +#include <jni.h>
13219 +
13220 +/* Global state for JVPP-VES */
13221 +typedef struct {
13222 +    /* Pointer to shared memory queue */
13223 +    unix_shared_memory_queue_t * vl_input_queue;
13224 +
13225 +    /* VPP api client index */
13226 +    u32 my_client_index;
13227 +
13228 +    /* Callback object and class references enabling asynchronous Java calls */
13229 +    jobject callbackObject;
13230 +    jclass callbackClass;
13231 +
13232 +} vbng_main_t;
13233 +
13234 +vbng_main_t vbng_main __attribute__((aligned (64)));
13235 +
13236 +#endif /* __included_jvpp_vbng_h__ */
13237 -- 
13238 2.12.2.windows.2
13239