-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathatom.xml
419 lines (223 loc) · 421 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>b1ue0cean's blog</title>
<subtitle>welcome to my world -- sharing CTF & ML skills</subtitle>
<link href="http://example.com/atom.xml" rel="self"/>
<link href="http://example.com/"/>
<updated>2023-04-16T13:28:56.444Z</updated>
<id>http://example.com/</id>
<author>
<name>b1ue0cean</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>codeql</title>
<link href="http://example.com/2023/08/16/codeql/"/>
<id>http://example.com/2023/08/16/codeql/</id>
<published>2023-08-15T17:27:35.000Z</published>
<updated>2023-04-16T13:28:56.444Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="a2c7befa838da940349825de11d328db1ead567ed0254f45a2fc84bdf82c798b">5f150fc1eeab9453022f4799ab7a0d1cd6ffd42bf3cd0d0ef0e5185a0bbc2b8b77441041306a46cf9818b1242854ba45faaed221c54d5361de325e9221ef7e19ecf0ac9f2284b69d545d917ab66d8f67f15823d0a561ba0d7895dcb17115c2755b0ed582dd9b0c3e16a6cbd01a26e23b833a49ce74c4fc0eae313885b72350f772c439fe840f58bf568c2d262106f41044a9d0b39a7fcfc497982e1e40f3e13cc43f3fe5482f3d89d1c43b3cb3d64b725542cc38910d008860aa5aa54f66491322747c989ef06228748c5b9697cb0e24f4dce820bb93dd30f3baf469e92f43191c465f126066eef42c55d942e60df5a96d2cb536f1dc9435380c8d9bad87b25cee27ef9e27a3632db9a8bf9570315917b589fcb32fab9e10938a8b4574539074a0a2535d34316e88e3ebcf9a6d79b898c5aca9bea78d915310e40b3643324edac2b5d54c83c8a071b597e3724e8295a8fb5d770c86c01b4814275947b5097e6d34bc9e84671600095c5ddb5ff21662dc73a19541e3cc20c53e453a2941b4d3c47e89c66772ced1276e0bfc6d4ebab1e7fc893ba1fc2a4d81e4d963964696f34fe5ea1ba5de3f276fa5afaaab76dc3a6cea2a6368650cded88684fdea9a70923b015a27899d85b386ca98dedf9c323c3e32a78a3f3e04a362a15e57e0acbb9bb4a8bdb9354b93bc83336bbaf0e8acbc70dd50a375d49cc0b1cec3be0a55514e41d7f6568ab24d5281e484045030630c2340eda8d27380b64ea66dc02313d817ad88075433780cfc91e6c8de00e3c15ac0845deec2cc0116ced882719e12ba4cb37dd64f0301c1e07ea2a4d71eeeac420336963ee0dbd29551e5630520dea17b4ed0b713f738c6410d9f399382d6b588d522fbb87f6416b10bd5dd381c86633498ecaace924254a603707d7a273e80b89b0265b3fe01e313869251e95523720912e8f16119b213dd623b6ea199378b442fa5a84a4a623a8cc1c9966e7b2087434a73a844b889ccbba2da8596e9cb3677a7f89e0cb4605efd5daefa5018ac7f6cd3d22197d38eccf473428718b3c839788fa5bb51f98573ada4ad6d2148670107c260ff16cc56a909faf43a166f48b70f6e89ba1023f63c2cf5f630a8a45b5db3de47313a707fea17caa3967aabbcefcdf6e6672f115abbcc47d3b24099ff5e98f0f26088608fdb1c5fbc50c8d52b68bef925808687a5f0d76b5618de09de9351c632b7e9ee2cc855836d8c65df4b17e17227893b31242c91f46a692aa283969f97077d39324b7ad13742988be60353800f911ca103ad72cd0e24a27599237dcdda93231cf0d2f1fd3d8aca5c0e97e038e46d17c593dab757d854e74e937fc0f6a49c1137b3244d45b9db1792169e86f4c17f71245feb00c42a811c8c7be4e5fc597f2b57879833e07120802b0122dd101e03616722eeb9cc585aa7f7e97161e06a11c24ef4f640d3fa2c30f5e71b44357c969c5980a5acf5e2058ee687b8924fed8137ccb9a6f5f253c3d2b6154348856aa5aa8122b0453d60144ccc8092bf75e40a9f345802cba39563196dd2a584edba0af1ea1cc37d48e0edd067e4da35fa0d14c7278a715ed89691b3ad2390aff831ebb891cb88c8b1885e518d3af4cb17840728c422253dea355a430111c695274bedc5e037ca8dd86ddee7af30addf59dc571a5f349a3f2be836a6f2550b96632a18df9707834462e9a2240542acd4ae82b983a21b3b67e83f8843a44625863e3d52693ebec1420ca778aa72d5260eb7ccd811bb12ba1540bf250d8461d04a9a485063850b8d3ee406767b10420a61295526e6937af9e447791462b4ab6479f3486b59a7532d57397c50c1cd47ecd2e12e4bdd116c55ce4f757045d897d2334eed36c8ef75612048a55c0a45118de6cf7d522bb0c8b006539bb8fbc59fdb0f7abdee0640486ea76cd12b66480b8c0c5bbb43b09c74a2271ac5b74e537714897611b8c78719a35dbc76c9ae5e5eab5363137ee3a9bbe35b60663aced4834ff3167ee2703145d6e5c440a974c1857de4e1c946af6e0ee2b2efdd916f2c35299fbff4cb30975476ade7d4e14e59589c28f5b7ac9013d4407220076ca42bc5e0aae97770ec34118386cdd4e2d81f671cacf1964a22205bbe29d09348bba9eb5b140db06019bda5b0dcd074c09b7bf236f3f3e034cc7b339e1b491123b31430753303102b475b44f86070ec4ebb196b92a4915e700d3f9c992c7efffa407a5906dfc745890111bd89413c3689e58efe65f0b92e4248b233274878fc5fabf7f5f8e49cb594fbbc86222f981ac0be6661e02aedbbcdc8ef75ca4af6d6b165ebfd8934e3ea63cc187edfaaa8de7897dfd3eaaf3cb8f53a1e40ab2eef1b2cdab55714c391347e4832f03f228e1d97be2a39aeaec5011efd480d5e713dea03071ead9966382ca4818a9288921cfc1c4bb20675cc023f673524b3bd1722794181800b13f2f2a35ad2d4c90a7f50bed5e375cb6d38ad05252934414342f2c001eafb007c4c10e1de66316c61355e8e4eb23bd6bd6adb6eaf7e90e2dbf5f23352fa32f864cac9dc2eda4d32221b3324698e293aa0fe5ee3d5f778fcbdb1bbe084b42a37f64510d0b8e61bafbb9a1e558a97353776ea9aa1374810fae5fbf63e5e36f1671f5e9e22499315006af0c91480583ab758b800ba6b38de33e43ebad6ee0fe11cba8989f8d8dfc2db1bd5e66e3338c9ab44bb8794be918c94c4a81340e23400a35413cdc3d276d55a083a84ca36a152b7365641cdfddc5f45a7e56e09b2158f87e8dae268bc889712e978bc4680b3e7cf34700c162c288eaa488e13b1757d1d614f92bf51550f92568180964357337361af5d6d0d0cac17694b862ac410539b4ce85a802cd2bfe9c5792d937d2cae7f6a46128422b7b36d9fa22b39e7261eda3dcf7dbce4d1a1b034de7596ca463c1c7c9e030c78a3ed8a3acd284430ec42b58e967f1d9ea509e693c33ad3f2e4ecf51501e2a1c3d838fe28f4e39f433da28868a5bc0900d14aa393c67e9ddd48ba309724f19a87cdc9a3b6f4f72cec428a6f2b8e01af53ea8d41049de3f32dd8e091ad924186b3a07dd6400c132554e101305d3a4858f33679af32156873d4ec1d5b4b26cfaaa711f0ed17c09ff6376cfb93c30eb4c702b428b560d27869c10508301cec07cb40a34ba638f367c85d16f62a0725091e3773c4e606d034e4585838a59cc246bbb887881de59220fd7b28cafce5634e2443667e50be7ece15012de8b627c7f2282181ec9acee794d6eed71f9fa139c83ef2e482209ab7351f66ed01fc7f01b432bf4dec01ce89db83cb9857b408e8cd438388b3b9f39877879f7db542f232faa4b7ee7ffacaf368e4fd5ddf3102a8b04799a197e0b9fef03eb13e75b19071ba2b67f1240179ae32432982024de5f9249ae7d47bcf4b518f79c7e963ef4434910daec627f4670be2b5faf57c72a55fbfd25e0dfceb4f6bf97282775e72e27189b61845348ea4cc2a63f6351d0deddb27e1aeb74269e491287e17c14f8beda7f5a8decc38bb9c1ac35c36277aeb8dcda646d23c30329749bcb57adc203f11727f71df09beda1fc01a178a5fdc97e8bd773d297def826342fe3a45748a7f8578e6bfa6d2d47733e043a6e18fa941e04a00c2db4c48024bbf584854d3c8c03cdc730a05f9d579a0d2eda5b7673ff2620ac030573018c6ff3f6a003bc62bc4c95eeb9c88642c0b805a92070a9fc4dc4d931bef02b161f6f8343ae28c6b14dbd172c03d3487725cd4d828a4c91af6ed01a28659f1caabad4ec8ea9341e9a47df3ac7937f7fcdd8bee6da1e8a2ec074cd4df236800c893764d5f09d0578e786471d3eecabc9c56f082a8ac76e60e03ee606cd2f6c709984255398aa293495df15a5a576c28a5932c2e1e611a1a1b852a68c297251f18041ca44e67456e4654efdbfb67cfa45669e56b9c8ac13fbdd09266e5eea151ae4dd1a5fc153fc4e19d655f193265362d9683338c4407733858f9f0ee50fd0ce143676babc6f49faf2ad6726019fb34c173133b9cdac5672d6f9fa11a0117dfb2ee8784464640254a738473faea79cb7fd52adb61a780e5c0a252b99770c510f46e9fa9e51444f7b200b61d72c5ec5b8aeacedf3d1e462371922a8677e8639af158fa3e0ce3969f0a890b5ac08985cbbfbaa1947a8cd97e5b23404f6ff4a5f60eb616f0af5e0f63acc0b25529847f4c19f4f656a8289a5abf6170ad94f5f73f8e264ae761b596dac89ea5f63a719a97cda936dc40fdea76aa6d843e0c9179c9a55e07027f21d30cbfeb1b08a843a8fd49702581c538b839fc4b23df2581c2b25b2b1515e69667e938c664b71abd6d8e37ebc693594936a0b361f0fb5ff048b9d513cadf18dfa3a848d83a527bbfb4599e2cedba97d9d701d3d23bf7612457483640a976e69eb2a2d85fd5c9dbd103e2ff67f0a2e9777fa3dc4aeb1b19bae6e26b3250c4ae2e3f5d8f937d86ddb0253f60c165747a56279195976eb6e2763c90780c11797a0b1ee1b82da45363d771d2376c304ed595efcaf6f36912756a1330c35cf73513d25172bd9a799ebe3fe51bc02c797a29cfd9058ae9577540c4dbad337d7b233d119ab096b86ef1c37dc6937324e95a763e0b61cf03817562ed3ef606bbacd754850c90ce1c6331f140d58b16bd3ed8b4ce3b3dd37933b1c3102a9d1c910392d45a34e9f7008053cb7ac1154aaa5519c221eefc9bee58515d009a7511e866aad9964fe0fa7aa7990550b828d2e29e8cdd21a4c71ae10813040365a12d4edd9cc8e7bcaa80013a64a726b3e681bd414c3d18b8e9c26f859e85895129d7ade5440f19f5e0025bed9f0821b3d617118fb33226ec4af9634966cc9b6b4998b5eef19313aa93999a37b2be7c0a993d97dc15eba5d649e99f3ec30d003ed7a7e002f45aca0c29683c173da328103f3828e372ca38677ab6112d11c7954dfcafb207743c569e21a5512df73de2905e2842b45804f04e553a926f0ee087b8e328331e60cc4c60d7c74d4b269f26743acc525681724a58d9a2a19179be4659d4daa896185c3f2e399ce003c894d67c5ec5b30b40052512222279574ffdf5d31b2365d78e7a447be77935642b18da7987e15ff78e83a12ff1a8614b37abcd89dd3f9d5841aa7a4fb3cf844b7cb0e9b4228f0a8855dd5ca5766dc57ebfc651ce1b8daff7300025e0bcaa66e42ea4804751f691773256db3107a34604c25930360c67a171f4ea0cebc448edd52d6e797cd2ba89f7b125d47610ba6dd3427eb7bdcf7ac645b0d255a0c0cf6735368ebd001849292e6d475d30d358a1402b7e1139d70b895b9713d4f2a454243fc1741a564df44b44d37b47e71c7a8e5e8078a81bd163d5c0d4a1b081d6c3ede83cbe3b334f39c2e5758036d7840cef98d2e7541aee760d392038ec27399082efa6c491de2b4a44e71bb5b0a4748d2ff4a2828bed0a43e7c9933cbc60278263539fee0aeea054165b76164100999b235b03f053dd83cb34901685e5686a1449570ded951c456869f4f163dba63d52747331d17151bca64e3b5070c0234bfc252da38d6e9ca8f231c6014819832bb701a9266e29f15c8c301e6c0c613e22208031a915ac8f95fa40c231951b05f967d8db9ee56c328b3d0818b32ddd7826485f7c695d3ea00232f57d4cd00b9644fcaf1dc4e29617d3c9eee3e4f2309f89e7cb43f665d3ec086d30a1952f5fadb2e6117c71a61454662f5b5da046165d2cb56d432914b34aa81603ab214f610b515386a2d66afff26b91d4b1c22fb31e2c2f46727fe1cbd7376173bb92ab0f6d7c570b74884ef8fbffddfb1ec495ae09470731d4349ddd022bb81d352693708a1d1271a07b1bc5f2503ecf48916790501688f4c5ae008109c006702ca58cb9f1dcecfe8e285a5a31422169c3dbad97e8a04d4c06e5f60368de08b8e4006d3b7856a5c121b6a99769e99189c7cf283b2d0e2717b88a404283bca3ee2c81a7e5bbcd0b4dece71a5eed68ff0f1e6ebf615399e649c84d874ea4f255be4598f99908c71adaacf9922192ce1318d153d407f0c8b681a4e5dcb3c79528e7c15a010b8cd622d90d34a05db88009262972d76f3933b41184d20a3ef783f3a97255d3fafb8e3ff15c8b3865cb6f3e497f9cb89e66600dbe7a258a7e4d9aaad10c9865a7fa5f0fcf2ec32717d930352ad93034747ddff03ae372a179b70b7217cd9531d4c38afbf385113ebf5252dbc677ac1c01a9f6d8341d5adebb04c3ce8cc243591edb3414fbf0d05c63576700fc0e266d9ad4e73c9ca4a8b8298aff7b984b3d9452f440c82ea76222085fa46e60db83ca3e5bbcbfda1924cf87d0bcbd7aaf45eb2d9cef1520cc95184dd278283a9b46194d963d9f08d080481bb343ac8f53b7d7e06867e51e41f561cf8e06b6efe9d5ffd6dd61cecb7d1398c4a70f32aae51cbc7f4ca59e537f4747afd4dc769f3634088662c30eb0488532faae0c062d25da4e78a3397366cb7b9c82981c6ce7f54eb25691f61daa29b484473011c6c29482c58637b8813509e98a506f7c5dd663c5c4d1b600e538cd734508cd9aa212f70cbcfb0ab05b6be1d2ad69a865d3596d60f87e4e664fb766a4fe8326de80312e73e7146613a46c36481dc54154929479e30b6dcd8b9b3833d9f2412993c38be4bbd3534ec38501229186cfbadc5be0e3368ebe7014f670bafb855f97694638745df0c271e740a2fc4bd7b42ff2675e7effae693240221c14ca66b58958465144f283aa85db7b26e484e3cc6a110b7825a841140c0f20f9ea5800edf11e441dfe3cf8b84f896a11a7137702d14bf807ed8f056b5aa062f331802ddbb4b87b79b4dad54dd7e9540e48062ae03ab67a7b8fba9764c6a00f7e3c534bbd966aff07c6b3de7a77b3c8ff0cdb36738f8c1011db0f3be948d725b8810da8a0637688f9839c164707ede2d40cdf3163ecc9954b22bcedbbbc03557682cbb5c91be9064a4d47299d5bf3f73988251447ceb5716163f0f95e540de4ca618036eece6d355c2cae1a771e9a07892e7ef74d35e4fb4c4a789268e80543712c19c9819cdcfdc619afadcc08630b94e971c9def46039ad92e2324ff7084dc736dce6fcf772969b0ffdeec0f85c0dca7dbbb982fa8ad8ce0305661301bca2494c65093943e1b0aca56f6dc8703c622fac6b16e5a6a202442d188277ab8dc9c523ddd9528e42cb0ab1fee100a9a0cead7005a42daea26612e41b3e111aef925297f7ff2349c010f2f7b81909069fe8289341df78c463b9e9d7511884d63b3666c7e8cb9b13f9b6716c550f72e73ff2ab9099e6f3625f9978cd11f28e8d7e07199a9e461172a27b79e2b9c7acecb81ded390c10e6fd041e27b6650fddcfe2ef3952cd8f38b8a7d830c742930de723c09442c2ecd44e278665017f5509d0faf74a5ecc03c70877593779d0d043117fd839ae361df6fbe769e4f8bc47518998353ba0b9cc9e51fe37283f43cd9a9e2c44b2265994c16b4a0914891e9e1db797368fd6b8e6fd89b458ea15ebd870d68bed6ef11e3f0bebadf713a1964d13c98e72a6d920c24c3c5ee61d2226b5b0d6efc560eac246ae30076d6880f543daf61af028cf281f94054e6649481b53e523ecd59070be593ac039337000541f6dc2a504bee99b4dd84c35327f93528bd17dbadedf5001e12cad7ee64a76fabf514a56f4d31d46fce1de42c0eb86fe1585544f693f3811f32040237437444a229cfac4d49ff186b7abf7b7e38fa6dc19a7a470003fff2be42e48410551e6868c7568b716324e669b077bb58113662be7a7dfd525ce13878735047fede54297f8bbe682a222fc2f2592742251e4353a816ace39d70ce73983f630edbeb259189f76cb5eaed7c60100a24651f0cca14633ea68a77cc453256f0b2de1673d72776bfeee6b7a68f15f89d54196b65e7d592a9e464804a5cd28ea174090a8c62913ce7a860807449da97d1dc6ee5b2769e9769dab53ec2a51ec10e387109ab070b701abd97525648b8f632171528500b8dc361bdeec0c79636490bf3e402540f8a8c41e79772db832e3a0f6959e3f723131791c5cab7800485f43fa5b61ac59978faae9c25178472970ed5c9704babc67034f728feae9fa1e378572d0fddaa69800be6125e76be2ff73411dd38254c8a88ed4b43f0bb093c4466f6c823d66de7ec28b03d811bb9c0411b4d3c11955fe7efb6ca297a2809e14ac16230e79a7fd59d39d6b26f4f95e093df35492076a5c0e3db4d109f7f6ae09fde8b1b51e8029cd2032c4d796b104e548ece63e13899ae34caa43f483e2572d220910870e22b248fbed26191aaa2a691ed1b86a92c2ad728130ee8593e196f3eede27991151f7895847bf84022047af124addaf82e3da9cdda15a7490bd0a2c099a34cc4962ea26f3d43df337ae3ccc60a23cc5e1a68a43888dd71e1af13f1c8df8045919fe028b3c2db88e08c8e5df3cd4f5e8d0e20260ac14efa09f43a359595e6ee1bcecbba6ea18aecc42fccbc0555aa52da4f8edba0dd571c595cee496d812aa0bdfc13f352126ab3c71ee6531d66da36a629ac1dbc3967cd11cfd5d6dd67f83e9b264698331dd4adb4c067fe97e8eddb897287c5144f7c3b0668287f866e22409ff2771d6fe8e0f792969c33b70eee0ed87203fce767d9b17f38f748050bb3ae2d610a270b181a854a8fa88986a2781d2c220fca488d13d29c32a3b642484ac4a1300edb20f9b17ed5a1390da3f7c58c2dd04a91496d45f4e158ca621770d9e64451f83199afd19b40ba7ec1a4b598cb77f4dc2d9b56f08a6b1efc2ef6d2bf6fbfe301ffbea9bdee93353117b22c4c45169618ecfeb99ca0951d3c49977e5115f78c343b1538f4bdf72f9f3ee4583b06e06774d9d9441f29f11390637548c49cf5f00048d8d5f2493dd9a1de217b124df09c0e7872f4de7e74f7081fe309d3144c96b3dde099eabf6074359824ef2140230ba133585dfdbd4c5c19e08260b102b63ba85acd06489c218d634b877810a30e9f0f45dbe5c70b7bae1a13f763abfacde0eb8adcef9114b7e59ed911bf571677c70716c73e3a8da2330673a3b41d6973fd83a1dfdf85b465a5cc16a2eeb82b22b7575c75e23e42556d841203a17e40b6224957be77bc95dfb60ebeff7b73a5b1e6b7884b606f36f46f05a4a3ab70bd314340f41610d8d3cb3cb5abf51da2dd5d37b31c4a62d610877313b95f9a57e422ddeedf4111f8daedd40159a84f73017f399cb016441c78cdbefac4b1a2429ec8227c19efa347e008c07772042bbc1fd173a8cba23d2177c7fcb9d64bee69c5ee68a42e087c46f512f91029555ced9cc9d38070aa86f653f694e4f5a7c84ab864a2616fd58b73803522d7eaafc64773173731a581be1103e7d1e7a271ae88c4abfaee63148687c7c6b5f7f1269f7716ac574d4fbfad826d24c665d399edccde6ff9e4af0ad62d28f1814b9e53f0b3a5b9c2c42ece1fa471c9f54d3e6c89bb67b22b019fc51145fd7baf811c38ee6b45fabfa68f9f1ae06ffdd7b529d541f7a0c362ae0cc4ab121b4775e9dea811618684661e2699e8ba65c4db5ab7e85c9e0d162598f1b33ec12909ab4caa750b1d5b08c7916e79b98875d9e61c5ff9fefd6361606cb55602b33f5aed63852ed16a16038184aafadfc43356b25cd7c817e9c4d0de89e83f062fbb08394f02d4e68638e5b1663f1b8c7858330d80163e90a6c6c73b559653cc63fea0de25c8825370c7f69a427e564d3ac0426633a9d7cd935148d7d51f284706b0265d0b7daae5f0e4ce59868c5279dae85bf64042bd2de679c7ceb50200dea357e67b604c39b1d39eb1d6d8b2f60a0ed9f4070a5fa39da216b13fcb7d0ee485b201f71d8da21fb1be2ed6dfeb480dcbabd0ae346cfb17e5d2fb38d3ac1713a6e8d1a4dda17eb6d3c8769b93f8c5e6110701abe8f2e0edc040ccf12d68b36a17bcf7f0ff37debf9ef3dcac9b5433cd30524b00a8586c7eec394c7f1789b9e199108c2571f78cb3cf78fff26552fca5293ae47f1fbe635ade7eea82cf4455c0546023b7558c6f697ff19f63bcad6bd1035bfbfded1ea875b98875be5d8360cefafc11061a2a6e113bb8c81661ef3d51909ae45d9134ab94a6c7f31d26b42537b86728b0fd49386f44eac19a74263f1c8b3675829f844f9da186b954e9091294b10cc47ad7cbc56128fe8de2aa50bbe6c26cc1a062f75aac407c90c67c82d3df50897ea43836255d27a849ce623749a9d6f8614948e357254bdb326aace943f01ca98dd824f39d30c1105e37b9a15e70619f3e184a61d735fb8d359407afa62763ffa7ae328276fce5b7f513556e53ea31fc6fed039aac80db8b70381a6cc8f95d483130ddb0c49e2ae151af82e0d17c9a931128904d0064f8eba32825a23b153f0ea7e32df538ef662c6402311b7633e98ef6a1cd692c7402386d2654036efde012a6e8b736eff12e88de4b75b578828333af9a049c28da922335dfc5a6764340c491e0f8f6484377a4c353c9a3731cf17cf4dc01059affa0510c132e0d2f80559b1315c8146cb11897635ccdc8ae3b9f36e3189ffe8d9dc570ba035a35400522638cac28d9c102cf49a7534188ff4f4564d930bc7be318e97f026c2a617f8ba093e22e12bad1bb749ed3f186c218c69148acaa9df84ca080ab04325b6ac9daedaa256c8194398f1bbf96267fb9f2861dafe208c9311a2bf3aea3af96125ccc1441d412a76b408ad1a4d63a5080ff1f922267260ca98a3214ff344dccda4284be15975cbe19eab578408386d8c512c735d85de24415120a11316121749d40f2cc064a03254e99d433d9701a9c721a585adaf0897a7fb21f1aed9d7a702e034219d4ac12f1336c3a534b7152559df914ae863a9ba0e8c2a5a59df192eec270d2ac9322cee93e7f37fc1193bca093d06e67a35145ac9cb24af96a61c2e32239fdef9025b5d89c58fe9fab29f87158c937fc3af32828e8efe841b60a09f971f1342bee9573731a47dba6905302308bb0039f5dd141de8fdf410d4f9665d9b664eaca9cb51c15992d6561ab71dbc1c45787b814711339fb2d7e8e2667b9b92c069805e73b559d1560b2004e49cec86c1fd1efb388ea31297a61f2efdfe7adfc3fceef4102d13b1bfa13ff46f4ea91e71b0d1d47d3282655fa933a1189e677bb2f6908d348b2f409f574a27a53c7413d82b82d04646d9f868bc4eca0f4b68ad68e121092f839bd59ce756cdeb7636a42648b5c7169333fb5ab8096a085831ef07ebb1423a6470283fd37fd81f9823ee572cc2127ef053aa517a17908153cba06a1f61d68adb96bf6713b4768ad388ce0f326b9edee968be85248fa448248c32ee5b1f815ccfd21c86ff2384383b85e8d940336257aa222603b1d00d7445e3009c6ed15ab93722116a2e526bc34f11c8a5c31a70ce11640b22497df69c2e923d21ddf59a2cae028a7d0d02d6407aa51048dbde08f4878174db2b912c136b9c653586e844ae83249a9e2e20eb607023369dec576d48b365bc63d9faa44e0a79c2b0e5c2239674ac96cf257284ea327d0e4f98409c50f42e9bb8849f4af3a711be28dec0273eaa360dad01d39e266ef5e55a1ad47269fe4dceb6753368f98daff012610bdba7de606cf3b36e05e1d878e56e2e8a82949fc40a8281daefeb7f6ec5730278c291163c44335bc0920ee933726648f1ac04138bc647603c21abc4405a92909a2816a0a1d6124f7c63499d93b46df41a7a70fd50f07fabec3a3ecab477c2ac1c62eb099378e650c060863fb1cfaf1757d380e43c2ccd29e95d6e627bc2c01cac33e0f12de945ea6eaa440733107a8f57c8f8311c192178ef66d7900e2604fbc22dcfe682ba83abd6ef0b08f526ec5c7ae6e4eb4707f8ecd8c3f0fbd8c883e52e6f51f9d940ac9ddbc8c68e670e7f6bc0aba9d242f3561ea49b75e5d2ba04a609dd030f36f44f928de28414a90cf0159c74cca6e259544b7f9a8cb4ed7cc7c6452439f033c71eef4587f9e3067f35846c2087218125910f337599f115659cd9fafd92991169eb81a8d14a117157c1c49788cbcc63861f0788467d7ee344d46a6cc97c6c46f68238c6329527c2b125871665dc9613f3d48c057a913db841ff5253377506dc6df834e1cd1c373fcee1dacf00610962101b70a2e588e4db0318dae16b5d14eb941bb198e5f1d25e23a3d1295c26ec11c0c497444c06ae6dbc2f236ec511ad4b0cc7ee64f63b0c594c4e7c96204dcd080ea6c48a601ff9f561f888bbf01eebacf8c821c1ce95ffbef55e788db95b8d01ece66c098fd95ac087ba9847f3d22e047597650814b6b52362a7f6b5d0a7fb511abe6dab3806fbf5e045dc91181d2ab280a6b5ad845d68335dea1693329410515301ecc0632160efd6eaf5ac9470bf7946af5f0ae9f68464aef360145f83ae02224595ed5b163e64eb5ec254d6166d7ad162386dab2530986dc8fb4a8a85ae83d1b5e220993e023b4a7e4a26a0256fceecd3d4e7909aa9702e652674dd5b6afc603263c34ac088281bbd3624f1611692318b163424e5ec50e8080f980e053f92d2da6bbbc051b5ddef14cbbb4cbff76510c09160441d25316a283b4d0bfa67aee60f44cef8d5b26516d72da9ce712bba50b2574cb54e08794c4bd67f9acd5f147a13f1c581d0708cdd9d7b28173d66a12f89dd02fad47d20a81e32f32841923a2a82a4696af494a96420765c00be59b64ddb5f7f5c649a37167f14690ff771c46235c68e37aabff7acfd528328f7ee0fc2ce50ed161cbb3478e6b1f51e3256339b20dbefec1d7912342bdaa17f751c04009300d18c0eb0d6336275d80902541b63cb39c18d302af954adb23aacad174ffa39a6ac1ff80ac03b2e34c81b7dac3ef9930b989d91847005ccb4a4612f903e424d746be0c8f4249804abea638d32b9050d6bfb1b78edcf6fbd59c87951ec28d680778fc2c7de3df93af7e5b0ed1180d6709b4ca0b27e55f284cb74be6ed345f78d14deae23f15decabc15515480bb93de1190d3b26dbc388a2b239778d44fca735c4ae3da05cc7c4c4e07cb7d65e984687f527a682cd98a955c9b21265389a2342e0e596806faebbcefc95033db8883e69c17d89bbe1bb73e64c99f57071257ce655957c0d299eb75d1006832fc4506667eeae322f7849f48ae8080738d6edbfbb321b29d71d0f4ef8be7557fd2c514c2316c4cf76c36c58c39a33f92bfaed7a3da31624059961e7c9f665ca932b2a411803b292d9648ea98c125fb27e9fe6ceb7dea8362b1a40ee7a1936ee1845b8f86c8920673c0c25dc78f2074b479edbb0c7b3a9e90849785b007d3f1d2c30629578c99dfb1ffe69279c0e901c57229e14d96ecef010ae642e6cb5bdfdac7433fe95b52063aea5670ce57902e754c672d7cc15217fbf983b86078242e2f9835ec9bf31de05aa804a1135c5833268ae770ee2c57b49d09b667a9da160e3f92342529b49bca9f9f7cc53c9813cfc84ea46abb5298bff62fd201fb8861320a7d43729dc0a329fdb05eae844f5d7bea9371827705f6f25c262d6ef83904ecd7827b00a2c1344667d1c0e4543b56f3c30719fb18b120f28aeff67ff70ffe84f915c722b5a0ddef798761234635737fb6b4f6618df33dba390f888eca319b109f6c60314e20454db3b2ff67f11d14ee0f41d370d1610d3ebed08bedb67d5977bf94329273adcf3dd0da24665d9fcd76f91e9909b43b48cbd6f253daca4728b7e961fce7a726ee106ab3f5329b72a885a8fde59901daf295bbea5b56c36144b500767c60e30825a620b201705f48d0d8182baa8f5599253572a44df7229a3592f6d1946879d8d4ee94c0f04d97d44b734a605e446bf6d26560fbb16731cf704a560f6d9938523c3c70b74aa20080e23467c4198cb85c5ff20385bf0bfa199aa724049ab254aef6cbe7ea9d5206773f98f5c302e67839a61b61ed1d3c7dba2815516d6ffccafe5a6bdb15b8b137351b162db491db91c0b4f45789b6f38ff6e7516a1c9ff261c1b537a073de8006090a18f42b7173769b2ac9f14e65a9934468c064f44f4c1515d6ad062a374ef54663506a09044c89adeb897457e4f088246a05119c169a25718ec3f0a9adfd5a34ec04729bf97b4fad1715d2175c5fc8612eb5e92fb9d4cd1cfbbbe201fa0655831771213b97a2101285ef24ac10f83821f5ed3510393a6ec1362d84031ccebff093fcccff507e076da5f93d4cd851d697363d243d133cfd44500c5b40ac358d597d2918f0a5af5b9650720f9f42822cd287508c6ee406bdba4614bf61e2870ad1deef0e0e5f2cbb705d8055f84160f4f8328500eb2317247a881333a36e586b726a0dfbe45cd7431fee511f7ccee7b24fefafc611d9acb979ef595d3b483f7ac99c3aa83e120f974653b9c5867b67d778aa9cb8aedaf00a8c73afcdea6034f8b5fb7ddac770a0add2ba2052114d40644ef78f4274c190422498bee23b6dba5b7e6285b2eb12a8e25ec206818fc9f1cd0ca38a649b4e86fd7ad3f21129813a53c4a9f397c251ea021cdb532d6c6acd753f0a3434e52af912290c016cfa63f138ddec9e085a4e8e50c190cd7a71d48da0f025a568071eb1b2d8fa12fb3116996ff6b83ba1cdd36d0b4fbdd15f00ebe4111da853d8e35a50fb31cf74d5be6e22319223ff651652711ace18b7944f5b8d57bf61092c3e92dc3e6ffbc84209ee50dc30e03b673233e2e1e8591a2b75ee00c4e9b22069fcf4c84e8ca2b568ef1590f6fff8aef7392964d3a84ced67cf9eda536d0e615afab3992dfe88310b4438a31af3b5a9b9170182f9517247be4fc45d20231cfab05a9e5b275cac60835d92e0b18cfffdb8506dafa16a1bf7e263eb7132b9613cfc002fa112681074615cd6249faf4285f3c029c85cb884fdf2159dda468f4ca16676af6c824b5721c819dc88163d22d65642e3c128d6fcaf13896d8c172757dc07b3d6537a61954942b1b57e74c4281a916708ffada1b865c167338dd436e96007ad77bbc5f2ea22e074aea55c740552191a31e845cd115f49f30a7dd7cddc139d6ba43b5a6629a63f6cc7991666276e7e08b1e377864bf1a121ae6cde69e070e281a8971aaf17df36b2cd816b37d25acc82d32852b8640b8e1cc0d7dded67ecb53a8ff00018766784d078cf1221cc5a3c9d4f5a51160d6a2c8865055f4a7542bc179a0d237d0cada1e621e58c7f14735b08e53e9ec03dfb076f919f35d5a2de502e4d9d7a2935ed07baf7029788ad93abca68dd995175492482f285f018639406c54e7d4b66c21106554708eb2699812c8b2685cca46faba57a87e8d962684a67e9197a91184069bbd36e6501d6adb401d919fd3a23adf903bc993a8f64c82db205155ddc2751236ab3f47aea9606c322358c4ef6652d837ed42e87d69cc1053452ec79b6895e3bfd5ed44725a15c45bb04a6a734f8a899ccff13a97ce46181f7327fc2d5aedf44a7ba7a6df77330b9dc50b2e09dbde5cdf51b9929f001700ddf764a1eda261f8f49264ea8163f486a8b80b2c0289e28aa325a430744af0924a5dc4468527c1f27bbe508849faeeb1c62ef1ac8c077a9ce3226ac682055c089a55f565f037562a26ca6d622b73929dca8e4fd98c820a0f863c6089075c81497829916825f0892af60957394a2c73ec586168719e0199e8ab7384976d000a6700d8faba9326ab01df7fc8ebfb1c3ae42d001aaa09121327f9f6d2bb2c689619a0b951876d1e90afcb521a6795a54437decd41f6bf02f094b3b5e0d72120e2db7f9f40dd73877bcac31f7dcc2d9e14580b7553f11cc85eec9a6adbb7acfbc84203032376bacaf29c1e5ff1d534ef72490372051edb3a01c9b2129687a7625380a87f470c4267505bf5520f1caaf56ccfd974f0c8728b1222f367408b7bdbc3078fd7fef2e23c795a8446482dc2f46de1f32a5b90e398cae890bc03b36147c17411f3ff17e4d2b707049a49711e7f3f17a148952d2f64463316b0b4efc65c804e273891ead45ae94544e991139ae91445715479e7ffc5bcb96142e7a92feaf11ef135360bc9cd4636995548fa2fda424e15954d913376b1dcd5e752de87845f38c11811f6857a7cfbcc6ab765c2c59c03edd17cac14876190cb8193d9e6a5b4177d9d6bfa423bf4729a1f3efc7f3c86adc8593a08eabd0bdad617c493350afbee1f5132374800657d164f38fb111aa322f12cea7ec2946de6a362d353badcc62e59bcacfaec9f0eab0767efa19ffe2d08d5df0bf2ad87bee90266cbab0e2f7eb9f812a6f5561dd8adf7c27eef6199050cab47991608b07300d26e1b06558abb3e2a51b31cfdfb776217d7d8495d366b34bf3bd13e1ea96463e950fa2ccf978ad9c8ac4c7e0dfd35ca29da44d4b265ccaf9ca350e139883e1658a10f9c9667d224d3b44652be7d83c64682f965b4e8fcf6a4a1de3e18bf188589b2a70b5849da131010b697aa724c9888690f4d7d5829caf5db3977aaa702f059820780e9ad5005f0aa5bdb2d8b9cab02a9b5c3fe0f6445f96dd4ba8e382979136e1bbf0e744d41ed49e33c71790783fcbd8ecbc73b71486adb8c464eedf8b046911806d054c55d1527ca018f076d7c9f68db0a0c40c4a1e0957dde9ef91abe2b4037e4939868c60cccb2f37d0745b1117704db349fcb674e40b32250d0450df7db05ee44b7ca4a1a2b6d5e39f5c5caf20d7bfdaa402ec8ea2f832466d1757ea910f56985af7769bdb3710ded8f3c57ff12805d76831a389aa4db7bc867595f630452b2e4a5d9e88ef1171045f1786caec4c5709775d5339ebc7aff8a215f3bfb5a65e491c7effde2af29d52046ce18573565e969dbdde21f21ef317d1aecd813a3ce1e10e4504cd5835a04a5df6a20cbd725863884d953a9d2025b260f0174602b3a346b5821857e478eeb2774cd335e9834b390708c6af32ad5fc5888541318c95afbedce6d3c798d527fdb1a296e5d95c43a7cad9e0df3e08365c9934926f2b4d5a9d6114c789dd69e397f9c8db0a1d264863d07d68de63c40ec227cb1b8a30751d050af48f1c65f6b47828f2b5cb1c73546ed14977777ce6ca9b15830b1c357c3a6638834f58f44b9386ddd9e8cd609585b1250038fb90536e7a0b7104aa4969ab81622803aa1b98e253a3fe88ecf58245cb7f3ed47b9429b3eee9b469f1687b402f8ab307c3c55f4e2c035d8d60f8654ffbbc175c6afa27c45af1fc0d72274493f09eaf2c4f7eee725f5327621667f90f9cd44bd8649aa9998ddf1645748b0973a43e70d99ff8ee2807b6ad7c4b198443e87acebbb46b796ec06abad2836ed681ba6f728bba8774422001fbd3b56842238c8ab2758308e1c54c19e23d7682b87b60772616b48aeb8e43a104d60405ce3ce68ce3034b486e462e4761ea7173e87365f628379e46ab23d3e490fcde48a48ebab8c3caa605c22ca43ffc639f47a6e3e80d411ba71f0030aa98a8fd76420329d348dbdc1f81e783dfab7efda063a4cc6845e910e01ae9fe9f07ddc13473c5b934157ac24083f358eb20a9703754360927845056b8f11761a6d655420c660a01d2a209c02304910c8078ae4e7743629cd096becdf07032773f01171bc3ebbadf79180dd3a5b27133490345b1928741579a4c78c437843129c2f0c22a5674e45c4aba23a292ca29cb1643d964747f117554af2081af4c91fe9ddc8f54e415e5cfbe7e0d8852f4459253d8cc4b094879ca7a142a7cd37646081b36abe0f9766a53e326296772ec5d4c5aac257ed382cea141ccebd8654e987a2b0a48b6e9e15b94a11cd49463021e6f17799c684c9d377a6361b99739fe8037218d44126f246de315b761be90359187bdeef80fd72aadcd542903a94d3aa7e19ee909ace1781ba927e3e33ddfc0a3da735a8ec0385aeca2558fef6faf029d0a28f56aa505f6ee6e1fd1c203a51d11a0d4e53eff863ac70c13df157071f9a33a84757994a869f3d325f09d5365fa884420eca8549edf3834b15eebe47f7355a6421d1cadf73b76ebefc9a09a1df389d43d7131dd738db79379758ce1093b82a7e66c83d46777da9af01330a2e52598a0ba1431f31546f4af170df3373189dc918481387b542c6cc65ec84682f0db981fc42ff11d8989103b7b5e5c25c4d135b27a0beda8c89fb93c0bd67127abad3e01166595452be37c85d5c3cab0d42258f5e0a81190415ce135249b07caaed49dce78765593a8215e408dcce12e42a480196249618df4273d7f0d1e2355a5c1c0eb8dcfa92f5ab38f073e4f009b97e74187043154161137f2ebf8baeefb47c16a79f7bba51718b8f6dc517d9c4645f5146257d3f1822aba2ec1fdb8dbbcb54b100c052448b0649d444f6fde819f300c3811c4c2741a19572db8d96bcd1bf0fac8e51637f25a207762c47dcbc62833fde8955efd9ac9a093d28d4f1bf1e7c39e54f42a0e98e5f1d1be5e8c28f663de9ea1a8053bc9d9e9ef57bb2552b86ae5b41e2846b85f79ce781cb1a48d19632792bb644c47a7ac7cdeabc72e5f3e47ddc4464aaaa894fc2240bf02049403cb44a7152e68d3216ee71bbf5f4c1764a90073c514551ad653f6517ec42dbacded325d0cdd340071bb7f2885ce6d85c10bae51ecac300f8e591d390df4a3afce285c66b6174f573f24e017bca3a9b84b9c544dc2c7e04db6af9f28aed4a3dc931d5ebb5844720e9dabb61ebe797bcf71ae736f5497f1bb36e64f7c13407ca7bbc33f8d54aed3a09a37236919cb4a5dabd67ca5a09b0419ec192be1b5f10646abc8d2db9591831cc7a442773f3c1b161debf4479377581def2a4254b20d5f992622f8e68d52934a24c10e5e0da1ac70a4d1b2ccf394b1448241b4b157a6cc594d8b830d519d6bddede47c7d0663576800b22bec8675bf52f559f0115e8017fa9557bcf1b5fa8eb724fc998aabf4ef87dca12663cba1f9ca4d48b6b549da6fcf8d230dad5a863fffc0b5415136331c7a6efd197babdf9ab1776ba55c959d2f39ea4ce8730374f98c2bb4bf48fda4b3b1fb09d6cc0262ab7a1f56dfee3edca7c53e18451cb928b20e88f25a252b5be6735e778e53c00657ae6c00e20abef600f6754ea500628c679b1c5d9fb74dc8afd2321f869e2c21d98232b342f3d1558f7141484adf9d734f16a7d6abd34b1e51354d377eb231593943e5ffb14128e7b7dcedf4dcfa5b22e743ba7387856e09a676f8b99e6537946d61d2ccefb07f03202f323fe12c11f463c6ed522fa622e43418fe35207ac25fcc71bc2e82b5f244c63f9e19bfecead13c2aeccb6e14c90ee33c3145d0b9fd5ec8b4ee68f092d45808e840fa69f43b7aa180280abdf92fe7a13872d591945583d5741a9b2302ab55230fd2237117860fc04937c0c60babae31088512ce1b5b34192293d89c82984ab31776e19df319da553ec18bf80e0df01c302d9b384ccdc41aa06341d4f0cc899e485cba0508ba6d7bd5f80ea32ca69bb6576a237116c1d0e8158d8694a6c5ea10e32f4250ed654182bf038f4c16dcd57f3769be96f78d8719be90ac6533fae126c490715ba495a12d2af83092ff709f42097525f6de05fb7e8b33c716c365c39e8b7f071cd7f06043ebdfdc1f19de49a94690303ee1f5a2f98b0e37216a411e57514258cd6661ddbad9fd62df421718c640763e011a025ba59d9e42a1f05d3800b654230e3ecfec09046091dbb1cc7f2f57c1779dd51edaee6811efc82e3a26024a091250a44f14cc228888389460188df1958ca83afc7f2f1d6914df42d355f435854b0e19806e3bac7dca214c515b529124560fe5264332afdf30d60ceb11f3cced6708f7f5f500f7cb88d36b704ed5272727b33c166a4f8cf4d689019d03b316b59b3375a47afe0f33a1bb59fd03f09181c9f9669d68d943e03a4a01fc526f6875300350cc176c034ac2d19cc5ea2661909c37fffe65da176291bbfff51f4095393558c5fb695f777b53db1307705c6d3d0460e98779781c7a2b5dfc6c84a1eeb8a946b43e05fc3132aa6f7e132111214ac7346c4697a02c1850da08956fb0c2ca4694930945f64edb5606afd267a64f96f2604bb6615d7f6cf1e080ca0d0e266ab245a1ce8d5a2c2d7a9c2f6093d994f79eb3eb7b635a08342ce4c15c8a6430142ad72955652fbb171dd61545ab4f8efcaaccf7fdea5c3509e2abb617337f5be64ee5f890a83cfe26fee067db14d3d5613898864d0701b7127df7f2d13540f16c2337bd520f735dba1e7b125a0b9623d260892dbe1b4e2ba6d0bdd1405869867051ec4650bc1687598f9b5e083171a569f3104ca72b601e753c8c63233398e5d9f6a4e7a1945526f4e48cb9dbbe343a1f69de010a60427c8289ef0303f11a8208cc59cb6ca7251432d85e68bef4aad7c1f9d8302642600c7aac2f6ea703780784e7cea2040f4b770530097ccc8567d802c58462a15f91e196e0b294dcd5ded4c27d965f8db93a481775dfd9287cbd1ae043c6b4e671cc356f5a362b73ed3c44d8dc77d41c003db23d956ddee242f27ec2b64113cf1f327e88e134e36aa734a75cdb6ce12e7c60b4a06f2f3986aac5f8c5d32113e124d3029ff195097122dc7178d7f65b68018335568e3ad8e052a269b764570fab1a17bbd7b58bc802ac2936804a38a1e423a54b50f79670f91d907bd962df275d0733eaac1fa1453901d2b6cb509d9346d1cf6224ca15b84ea83500c88ed5c97604242bd30d2cf985e899efccb8f7ae220708e51e1ef671dab73b79fc5c78293782f188e8155ebbeea6152757d028196e58a17c26bbebb0ce4083c7882e725c6fdd807914b9b380612b6ccabbbb10ea64f259d71b71f8e663c52e733307615a02c1aee8d50ab508c05df898a0a23ebfd459045b4e2efafb24a13038e08e48e5ca7285b6f6d189282cf4c4f4b12e9c3fec489a85b91f894fc8bdac00420ae5dc591a07556aaed8e252afb9b269c3684b22e31d0f669e69fbeddde3a0befb4324a6acf5396a4894b9f3d199c173b3b44936079ba378e391ff2509a6d0f902d3e4d0b676dff659a2703136010acea4e6d506d23daf29226d9c452f05d393d8ff9639dc9660ec8416e05d5dd7567e6bb2f1ab22c03934a89d1d608e3aaeed499771e2801f5bbffcea28a96bebe67918fb83c9116e6af1dd1a0a8cfa38892c606172b02ad92d47d7bfccf09ebe126b810b32b91105b9a8a4f619d13781cd75e2d508daea4d954783c988ae0eb325f63b8b9932282c4b259f4c4e4f9e5363be1e473db0cce330b3a43f08d4e400d32f3297acb6755cacf63c729fd4be49659ff7f15b96e0c3f4c40b8afca175f69a89cfed393890963c45c39829a78d4b0a8327a7aad7d55fbc14f81cc8df8ea5317c8bebaedcabd979df727dcf5a16c98841e6928896ccc1723a4bc2a99fccd2c071a626ae87f05e99e61279b59fb542856df9e566796e466e0971a6f46aded1f72bc1ea3008923d1bd8a13840c5c10618c39436aeb01c08aee9253fc34a53f59bed6a7e635b6b072c78c0f0784dc4919daf6df49c276cbb723718970f9a199cabf3e9e5b44fa29893425990592d6b2e67f693ce3f6f39983f0d7fbb82415635af35347df04fbe953d047c2068ff4148b23fb24dab5c941736f4618423e5983ec9433dfa2cc729ccde7f90918f5cc52919f795a69ee44a897f0d17b2fbc055270773b5c8ef1d4a5a6b810c52d6a6e0b060df06f9a78e738227b6313dd149a74cdb552dac3872a6c7ce60f9e091c72a7c1c59e9d136ee0184ca5874743a10b1307990471a43ccd097fd22b2130b388ac32003e18aed2fc49e78076b9f06acd16b5832c51ea89bf9b8b846b9ca2055fbe1f7ada56bfb5fa183a48f03e42dba7cc5363222ecca0590fd473efbd3c53503a80b926583135dc886f53643220889606d2d431d613dc04c3bdc84c285df9fa0f4cd9cda7d4066926d46429e83bfc4c13d7acbb8da21b607bca0d923d8f2d2864dc2de1f7c896a252172f7ebbc9852142d1b356720bfa6cd9a480a8e593abfc5b5151db904678003b1c185e3940cc0504e7c895ed330a3959c520d2d7c95888bea1de2052b79b1dade58ab1eb510b05612bb70cce209e8b2e75b9b8464726712d1e19ee32e7b7d4c86737d615c6e14471fb8dff568e77fc1ad4a284fbdbb777cdc52da06728aeb762c3bb95d632c87e091b2bf712c12b01992e1c5772cdc6dd017b77bcf2adc5cacd6a6c39b9f373791f0ccc9d67d6455a67f5b639e89c2254cb667037ef1efcc8f68268b13dffdf3e60e1511a1ef8117835cbd98d5e8e26c56552b35b873a9891969f6913985e920d82d995e776090dde8aebcb4575ab28ee8069ce28de04316cb6066d3d38604316635384f28f8e65a5145597892d14721680c2ae07839d7e6d0c2e1b298d054345ed27a84e1de06a87a48a3d8b03c1dc74e3148dab7e59a2f4a1004600577e0bfe1fc11674f5a7de3ceb37ce4588cc8fb9d0118abb1ec444528b5b32159b766c31bb17456829de2f99c0a03d5336b68ca7e29cdbb5fb8e081e6d85bd6a955bb2025709a7a2123eec74461d905f6947a0a2ccde5e209e1e620a74887315b2888f2aeb03f96622c640024b04520d6f2f12565becb362f78b839dc0d23560f6d16651f46d41964cc70676fb72e50685a219b7d249c0f4516184fde02afe2891e69323a0412fb1ae49db4e032a44f1ed99dd694f0689aa8e76ca56fa8834c85868d93e55222f365ada95abcfda9739e2312ff2b14cb3ac880509fa57cc313ed124a76248a951631b4ab1a077a4ec383175269c0459e4e85ef4a4a63cbf7af9e44dac6c774bf6154c8fdf27f956720d2c1e4a9b3ef8a189a1dd23cce4719e49f52a4e0eda894b3883ad64cf0030004b59186a204689b310be9d1988913ee2089c1e3ef7725fd3d897d2b4342bf622b77cde36870eac145e06f8726e90a10da872ab10b51ab78aabe06330023e4457be06e70be8297060daad4badbcbdf711d00fc8b5f2ce4fac91ad2635a19bf2fccc10c140d7a7a8cc9c00c7d029723dce1e7f482e73b2e96db7fc733e2d4cd4c30f9554d06f7a3fd6f006e1a140f2a206821918335a9f7b1a548478d109866fdd9be3f6aa773f18228bfe14e93d995fa3f25d1c784ccd2490b6e1c1cbab29ca691923015aee86df9c13152d6785e4df25ae8a0de77b43424429442157facc9cf1e233c7f2fcc3f490e749dffd27f780388cec0688ea0d3dad72f4625b49cf2fb9bb22af955c1a9695ae100af7f3c97dcfc4496a026f7a77ffd1dd0f07883bf3e1e9bd4d8d53d28cfd434fdff79140a2cb3996ebbd41cdb252c65037851c0ff345d252818dcdded5df20f7fca56de1e775fb83b9dfb7f611ed73265c60c05d9bdac939e35b43d8bf0641c7e7ab444fa81bcaa01814b47cbe3cd27c816c5b1b831e77eb86db7a526c590b79bc1b99ed54231eafab40caa7f9bed9ff4d2ccfc95f9af38e7abee4e8ee0c0363677f912e87673047d7e9bb4cf55954649784d39d92c16f022cb4ab4da4b7d8b3d666610fb619dcb7d654cb51a3307b4242cdc8e40364aeab3bccf4650481440d6fdd5dda8e3faf0412e7c3a04ad9c84b0b280d9b71f689ff8b6c6455b2dbcd9deab7780bdb6101afa89c53f9daf12b027247246ddb47ef98489e35fd856c46c3e13159ddc9dd8ef0177282deb19eee386b03b21195b35d1089d192a8e332ca1df9509f19cc739be9b9692839871691003da8f32d85040de00e3778253eabdecc9b4c6c05499c41153737acad4c3699f1a4ee6679a1350c9783d07815904c7d19ac2d5f92cc6ab4c6a6108d79348d8213ed0100c7b6a0d6c4add9f339b07b5f9acaae33578d426e9732a32f8360918aca7a656775ba409646ea2c7bfa13d2f4a243ba77b6001159e1f55a82a6199eca416895e27fc5ecd675e0d142142b2cddcdeb4e6db76b7fc5d7d2bb77e67267959f01de6cb5f9fe8b19737f7babcce2c8d2118dc9c0987db6ebe6b4f0c9188b8b0d6d3c0e511056502a64b2a3d2da686075d90f00a90f8a3730bb95393fdf0ac44312ba03055785dafa0ec9022c5a697fef54034d3b9ca30637a4eca264038cf825ea543cd99ae5a0568b25cad2d128eb41e089e99c528d51efa748e5e507c31e8d0492c8a1df2ea85c546ef847732d3abe2585ae3308cfec8e9e547258f51de10b666a668abbe333559209d12227ac0cda6d0d26e419740675d63cf13b74cfded49d3d56482aa2c0cc0213126c461441c47bf4a740aa9703e2f8525827aad228c03e8d694a5dc1b9acc578787c494ae2e6d0b5a2fccb43d97cc7bb585bb6cb0bc4d3ba07b031a969a9e20fb8d3de58ad4f4fea891ea8d3218635112c57b1e29a5be601b7101b440a441fe7c3ea74abb7b5e6074c91e7e8d9d78053753b97a9e0561a239c5e8d0aa19eb53c248f6c2fc67dd2bea5ca562f498ff4883648485cef10815a0a14bd26a541c629ac059af61d0b0aa2eb15dc640a79ece834e5281ecc67ec7b0e46cbebf61bfa5af1bd1b7a5731194f5e63d6342b982d9a2aadfa10536308403e6c61522b53e546b4726afc20f3e078fbf3aefbac83581cd0e8d83f3878fb62da19716744272442467daf8274bd703d35c6a9e8298d4df46bb59c682db0a7bcb9218377bc29c7a3910b950ebc6dbfe79844854a6fa02a193f2604bfa3b01a2bc0cff7129fd8cfc0782ee0d9c03caacf0f11d2ae38bfe3996ffd700d5f2e94da379d5c09c2574fd6b5f2cada83448084f443e6667cc9594d0dcb26289a45f0fdafdbdb2c8f98feebe0ece78819478cac331086f1ab9d7f9814efecf41adceb0ba95a07ffb8e52f6058c6ac5c50b7c8a45ee00a78ebd2e857833de8ace01be70aabc78d93680b490b604914d940e5c493cd0eb374d749b1ebe21d45ec61663e0d695202df5376a91d90cd3e294bb998d58668326cdcce6b8406ccd12b6a5e5d57443a3090d802bb609aa315a8797366fa64d9e1c9a404500f63054cae34aba527721b975194ffe383c8cff2c8c5fa307cb4c4713c1b47df28154a610ffe8df57031c0bd2931523e0a8cbdf209bb3356e9c007bdd5cf4cf7fd3030dab5d6b7a7fae884df9465223f3855536a0947cc6fcae222ea848e75686de7a81c69d5e8584bea80eb219af7b53a62587e191c461e903418101ee89132273af56369f70f1e55379b3e35552a7b3906ec209fa4d36cbb962152b8c664fc4c72ce9a14a1749df1ec2e059d4d3492dfa9ba8cdcd1642f7a89bd9f35b110383d243109bad74a1ae1e2099c61c982fa026f25778ed8bb8d5319016e059b3d4d845b6c149de6cb8ec259f8a68f6fdcd94115567a0b691a0e3a96ada703e766b3e346b5a10b78e6a4711ad6bfe4aeaca0912407bdb88df39a2e738277bd3937793d615997328050ea2ca1df22e432af7a41de76aeed87c0d964d10bfcc2d57855aa4c23af109eefc4fdac7a3a3fb8534498e663ba92ef379b1d5f9638ade0665332fb745ea3a3553669484df01733b5bdd52ad9c08e6ad6a12565cd8e1a4656eb36908bca287f14f5470a4a936c1310083b0b31f89c08ad2e459e0048cee78f4bc7f7befc9994280732a718e69b04e2044e0dd88183d9715dc9e3e3cc8486f614d57b4a74890045db2d3339c2f48aed64534b9dbb3855cdb417c2fefbbda5d3ca872bb4941417d5e33b9f6d0a3603fb9a7916beaeede8a4e11ac6a878610dd0ec3ea7bc980bfaf559e06c3910dac4737a4f123c76745869fe53dd59f9cebe25ea6c854db4dc5db1a3ff2c61e4ad364dbe2d3c6f439f939b2ab093fd8e8b00240a23aabf75b7ea4214fc73b6c01225bda9a7914c2ec7a40ad3c5b25fe5e9173cec0c42e40384eaaf7dd44712d97994087e0587da219a42c5fa17fb5230d212647f40680a38231446dbb3964220913530ec3f575537ba08956b8738dbe477c49190c4f1c6102436d21c88bcd0d1474d562fd6393b3655cdaf518ebc2bdc13be0ec8154014c5c47524cb712baed049ad4dd85b5423f2d6cbd35adc8cca8c8c8e1f0bacae143ef0e81a368d63467197c224812433e86208d60c74c1bcda062ca3fd47ae7753d796bfdfadc313a54c5154f9d522ba9b814394430fcf3c9791afed4c34bc2aa00f586c1deb88d2b23b68767d26227d38a95d0f3fe152bde9c6c5fe98cdb1112d17d664ce61d58ede9e5527882af568c5574aff89bdea385faa677df2c48dfd8109982b99338a4c588c92c746e8f4d4a0d6736230e03aa4177171dafc07457bbccd048743dba81a9ef17b1854bf3f1d5878b9caaeb9635b863a75433515faeaabe23b481bbf81799087c1414f52fdcac5bd596cfa6d66e6703faf70abf54ee2a2967be99f53332f909952c591dcb5bb4cfda5ece0a668b6002a2d7a753a40c8f8f84cdaa9eae5f3ee68643bfdb130beb9a1ba31f343bca511eaef747a2ebcf991769fbcc11c2256e37fc29ed128a2c09efae522b888949189bc7ea0335982df0ce2e43c14c54e784da40f5465229d1d6a0aaaa14cab4449adb475f7d019dddca1adbfa97af410ba8b348ba441b7674f3e955c392ec3ea8733b84a5efba777e62ec2045853cab246c8a1beed9250401925f3d6543f2c78e2cd25c0a5e255e21da6484608d2ee9727ed88a342fed94db53312834e964db42d6b8575395ee16ca1eb9a52a3942b39f4c49c9e26098e9298262d5ab8e4ee0d222a01ae779532adffe737e46ff7fee680d174c1762c80acd1888c420e0acfce11c8cd4feedd260535319722545a0799349b99571a29b3f9e7de474f86530e652a10d282fc3ca42f2c8b25a21ec314cddee918f158032bb6e8c421fac8a19f7c30c231b29af849cdbaa4b8178531f623e1193d719110d3a2c25db2ecc7b9394965d4eed4bb071bc7040159307d88c1b6eaebc7831c5ea6f95f3b4f5a57ff7e90ab50a57976cb0588f3ba9b409c9918f60ccb9af92d4a3c2ab06c53bc0cdf846ddc4a9dc282fff5e3123bab7d2792e1107d27a3c1613fbbce557d905c473345898cc7c5848b86c6087c482222f29bf326589f5043aa5a1760b6a2bd1f3760bcea9a9da4ecbc5340477bc0f55b8e6ba0b75dd1566af8eceb89cd2b7085a996ee3ce355860806a5155f616767694493c22f64e9e6791ca8c3cc731639fa57a1624785857e6caeac389bd23bf320babcbe8788dd88f02e3e88429af121d77c2a4b6e75500c57fd2cccce9c413af4684a75156e69cd9d38cb155f495ca8bf81cbefb02ab8a9d4c175848ed0e99d5f8a2bd1f4ab9b682c34156a4162fe6a7898e62a1cee9c34cbb44cd197e4688d89db0620637484efe9b8e1527484f0079393340c1ef3332bda4885da0064aefce93a970fb6386bad4e7fc246b08b3fdd29277d35a02c506c08808496fd86f9e8a5697f55df5a2f38d62f01ef9d8e7820c85cd721cf0f556764158e65bde073766ec97546bd31a251dbd0d4c0f33becc5736d66e04832656617f5ae3f3ec827ef31c28e2e974891e3463eb911e0a8b0a619e16420f457b452b6430ecb9524f48afd6d51d22b2649aa9c8012338810e05df482447dfe01052d827eaedd7d76e679eba4c46cabeb4b04410585d1b8d34786cf4d9775889c60c5b58753a587faf9b6fad4fdffab286cf7dc9cae30dde7efc5ff07e7e3fde98710413e14d28bc5bff95b715813b3ef59267c17323be6ddc8bd600c6461e25d8353cf958ee09461d9a615f9cefa50f3ce3f7a9994b598de5bc2d790cc859e4ac88739ca9ee8372daa265b3faa932332a4a533e1bab38e084b20bc61b9ab4b5b7db8238bf86becb43d545069ba72625f4266a3216d16004f53b7f2064de694da1f7e2974972ff36f5d9b34c84f13681c5e14abc783d0a45b126a17c16f13d85a98bd6f91d79a7644346f4600d0124eb5e3a36fd56a39e9c31197b7c0aaad67de260357e20124c706ebc42eb64dd96d5987392ee76d16b211c49393d8ecb6d018847dedb7ae59c626666ddcfce7cfbda2f28a176489a4616b5898b3e686a733873e372afed6bf233a7d43fedc46981b225a0eb20d065e9cc6e93c4382cce8fae2217321731bd2e3e7cf8b391238e5965b00043d0182bed630a11b820d60018d6e09ac99f3f3e8f4ca075a159c969da9b5bdc3aa2f6b57e3c19e40dfa46662111a2aea2bfeb54c9df5415265ae841676687e1f14d6e26718c337cd573fde576bcbe1e0a06b46f9b6cf3248bf6f24dc653f39d784c0964edc83a63d3d4451ae2d3cd44d6d81afb6ee9d67cebd2e2fab5a22a2b45d9e10df1296e444a5db7dca89dacb3cf5aa8da106ec0b48885d88b15177dd0cf65b72b45662265f77aa4d07527f22f4df1a35a25a1666710416c18abb6ab63d8b713fdb5e982d178545631990dd88258751c0d092cb16ef1051ef02b446501ff10e24db9862bbba845001cf92d48f20d1d55cc3940ae8e5123854a5162f607be1bc77c325d2a611a90c9bdf863e970001c6a2c877d066beefd1f2d9bab110ff1f277345a78d7263e3f4234b3fa0e4de7b0cb3e75306564ce5b0ffc508ece78c1d31c4d886644ab434d584b8f912d58d40ff4299cb30769dbca3aa2915bc88bef49fcd833382c6ad5c383f43a722f8e1fe23925af01bd90d634329026a85f6feeccd4c24620ca4dcb7a3cce7dab361df3bd49356b6c2facc11a145912accf836ccc5dedf2b6eccfbe02eb08c672c5301b2cc74903fd88148bd8e7abef5b155101b017a64084a00f6efa6fb590488787f2ba3ef4bd6e7219ac81a0c1d370802aef045d584e4c3b128e09f18a58aa590e12a801edfe249b3d3cd60efa26a286780c9b2827fcf001f293830d0ae948c6d6fa170c0831d9d4ffbeed6ce6c99ebf3db2a852dfc8bc09b970f25f5dd3a01ba2561b95425877d30cd669e9d738b2b58ffedd1186f3a582e00c89bf59d3432162ac814fc6187efea38aca20ae60dc40853e4b792d3eae5fafcccf18eeb97eea662294c2e333c311b7d88cba7069ea276475e24b638b02ab6d0c70a720f9b306a7f1669d2abf069bd7ae2b552d3aca61db3eb8f4ff3f36019a4899d8c0f25afe875a43817d32b0ee05278ada3b86de5ef19145f2d7c8bf9b820bed684b84cef585e53f43e0a7efd465b1a31a302687076abf689d8cdb8866c51dba6b31e67620d11f488c5e5b1c51ebe28b09a594ad1185c3106c7e923990e0f1762e7e50a98687bfc2e44934e98750f822bf0bcde8ceab90b74cd918a9db6b4761e5aa9f150d865f78a4d5018e07de90a600c306ffac541989632ff6c18ec5c47f03c4b47d1ab53be937911ad6413bd87041fd3144ac7bacb9f3999e775eb9d6f0d35f417a9629d5ef4deabd3d40c6f2fa7b97c1559726e08426b51648a392fbc142f804910ec735f428bde4736c5b22837425980e6c210fa27bfbe9eca1de387af853e25c08312f198e95db262bad8c757d3af577e49cd8bb7ef15ac89e9475047a6c0934c69276b78e1c44a996af22e8d0c8673e406ba15f82f8635c61e1d2446c65f4717e430cc45220b7685666f050387ce1d03a9ffe1640b4e6ac0859d37c4472ed30de43d2ec232d05cd5abff6446ac7f580ef29c2374b30e868ef40ec8d80eb0dd3423c3cd2179d1d2113ce687aafbd377f2654ff609faf6b62f718b9031df3b67f3b7c992fde6989d885dd36b6d835edce14e256a3b7fb4daa046d5ef02de890ffaa835165240396ccbc01b7e1c2586f50198f189f808eb1dd72c9845d8aa51be42c5bd508fa219db719f65ae04db522c8aab4bcb958e08ff67f8d3850282357771a8dbfc2db9c294a6d67e55aa472bf8aefedd393d4575b283b8bba75b02335f7b7a2faa898e5690207425df36962116653ec1195b31cbc54ed7f1acc1aef86cb744c2a9429ec74c97347ca6706e6824ace31b2038aca0e3c617c28d1a1bc26d3687a20c1d7661d70624cdf23d2b56c85e4ec136c73f1a0072bbf896eca1892daedb54db339e4e78171f6424d7cd297dadcfe84d8be2807acb07ee91a87c6683f94d598974eb0076876434c4c588998362e9b134f81a89c4b115db287189db955197b4f300b8bbfd20ae272ec5c9f71fd450b574320d92dbc672a6aeadfc77dad808d36d77f0ada0b7393525250a33664512929ac18cc547e2c46b68f380a56e1614094cacb33f243b9dd6ad5b25b74fb9316967e2f2358542638d2f1001215937bbe99bc8b476bf71bfc6aa56939fd14cd12da0ce53341861ff7dcfefa1ead432cb38ed4e4fb71766d25a3a0e03ce04abdf625ee25472a4c90ffc855ccf9d7c2d69c6c0b688c188dc3791433dc662aa6e027c73f33dadca90217bc73440f8e4ef1f87adb82dbbbec2a03ef4d404e5041920c904cda2d19dedf95d56bdea4c619348a443b9043c0902567eebe757b8e1fc02a544b312aa1ed040d969baaf61c08f82568dda7f250e3f8a22f9a55c11d19c025279d5e6fb8eb257a96e40fb955c2e750876a71d1711bd3ac1fffacb792c528157ebaf82904285c8c54524769240ea43911090f55a47c6717bcac518b7a04c1a47ec7f022bc95ed365831a94c7ee52221b592033ccf05184ceb9e4eeca48968f571e3b93d84f81fdafe4658e50d0eaa553c0c151f776b116fbf325038a69c1786bcab120233dbb68fce5ff0a7b7c815201d10839563e19c46d7f56920bb19c269fb558b0a33e3a79aaf344b979b9660178f5723202e032ca67be53a5a89972e45467f765e5f92f755e6bf6d7a50c2895558bdfd7915e707c4a77e10a2039f5b033f5828d5960b0a3ec93b6fdf57185ac17716128a47f15db1136dc7bb61ce4765947aeb447ab808bfdd46508a3787ae8b0fddead478b1b8187edcfdf46d525b3f6de1c11ab048ba431dccd4b8c8d90ffd06f7ac06b5efd9d5c08a578beefcd02177ebad26cb9e3ebf2f149806f3dfc593377447f7cbc0aa1d52bb103b38e2fddfa9075f2e7e4e0e178aca0beb9f1d5216702b64e6b0704ce649a8f0188b0d2201f0d0100222834bea922a150e05e25f06437a495946c5ab6bb701106c0ea710fc507c0d9c41c8567f8c719b633ec295d22ced79790920dd718f20c225af03dbf00edaeafea9fb33fff54d9cde3f55f5d6af63a90ff4ce2b6421fb938d358ed8cd11c0b0d56421079f9a727f1bcab81516757b74486abd18823b14fbedfd67c882a669d1633abb756a592504c28712be748003f8cf7e60dc26be61fb66d3317be72ec3a96eb86a56b4cf538e699c3354f4cac8a32de57c39f839391098ea5c2dea2e8b8a5fde5aa981ed1e49805939df0aee3247ada7f93c0054a8bdf87372d3595802988d3b40230a4cc25184a2710a2e72262bc1d04077a56f181fbd3d50ce9ed92419048b1995a03c0c3323e08938f342acc50fac1047b54fce7f71d37a9d6e53dd288bd0f52ed873506d337901c44cd0a548e3a6b02bdf528aeb4db6af4d382e34e744c6cc24294e66aa075cdc71faf29d9a280c21da31051fe5201c80eb3e0295800d77dcf3b958486a57b695dd55cab629d4e6b03d09c49e21cd30319424b632ec18d7ae1589fbe2f2ce40a3894dfe19d0fa4a5664e0ea22e8af89ec11bb6dc14d4f9c4b16f48a6b41ba6dd04789e9953d3e46daa1803ed860bcb06f79d5cf76dc9d5d5fb50555d16f3403ebf58322ed9a74afefebcad8bb98319edf4151174cf220ad102b6167dfc1486b4406a1231d5de8ca21cb801c9fdaf580a5db995d836b5fecb03a3761667643b3df9c40a033b8dda8c23f08ef13c72df633eba5865cf1cbd2eb0e8b45ee37d18c2d503f0ba547c4deb932544cb07f455eb003b61549f1cfe798b94aeab94c9134ce23eb3ef8c1906f3d10b6ee6460e06db9972b9092fe00987bbd26f6a30f88801fdfeb4028a486e59068707eda38a5df7ed67f23d49e0ac45308e0d5d17f6c8e4b8baadee64ffb69adb2ac9c62be67ac717f6b17eb61ed1d000ed4a177780e00c2d35672ba84b7401963a090d5acfe68bf3c44c7e080710cc91649d0287e22a493171406950c0ecede62d0fb08e3beac5f90eb15e4701bfad61fbc808cd8d71e03c69e6490257c63a64652c71abbb4d98e35d83bdfe1c8bbba2934d795c456863cfc50089b6eff0fb56225fc7fafead42c815d39d37169a1ce30d8fe3af78bb027ba1f1e259fd8be8650e848fe079eb006a3c90cf7bb38e28ffcdb66cbb8359b030d146ec690c8241243172bd5bd83ec07575a6654d3ed833500eab3bc45587b0a8f43e95c68686b5794a33ca4856a187b3072adfb9c923c51a77a31c281fcae257eb22b67e518d9d619d916abe85c990c6e7dac11fbee3ce9296ae5ebe28d4567e197d21641b269af66861c367d63fc883b789a2ec1beb2fb34b7761359a2090cefa3f387910933e7631ef133ef4dcebf88666f1eeacd80471096cc9f28667082efb7f42e55629e10d7a989413e4a98a1ce1453440e616972c4ae6c296adf77dab175243e9ef838114a2dee549a2a1cf450fd0760149f81d8e1f24be92552969a301ad4dbc9860e0322a4b2b611b5427b6ea95d33e1490c8a0510bc73fdd7a9e5750e2447d34eac2d7609ad2469276f330639d0324a2d3e9adb6a436578334051155a4416ec34475fa2efd9908959f970277a3868d8232464c06dce69be8f5b722acc35cf19d6a9c3a2ce892cf320d424ed4373783cd22576740ecde3985cfa2e61ddbcded39be0eee718aaa04aa2747567d09bf9ab7313085a815d570acc10735a7c7fc5d30a9d160c07ea9a0a403a8e7156372ff1dceef779c341c13f23408fc746e0bd0b108712f66af2542ca8b9dd34ac0601c4a445a0ac7e395cbf600fbe829f2e17aade44cbfd0c5dae6abb129d0f7a9b774b44bd2df0ce8f9161d006fef996ddb1eab5bca01198db4ec64a84ff78ebdbd64d0ab5a727cc84a1f765377705be4e4d0065363af44cd1ef06a7f21fc9bc1287729c6ebd692b7a5166be43eec4bb6ad70c98c9413b23bdda5f4b1dabd97715cd9563772c6248f87fb0f10559ebd27f8f926a57eea094eef487f587858005c90e69de942885473a00ae8d05c4b11a7025894db558e583742b71907287ef63d95c052854e1441c13747e98589c7de866844eb688bc66c77dab2c5cb8430b4a31ad0a64084cf27197fb362577dff992e9b2858039308e993f1c8d8766a43b03b12f52d87e5f38a8052c187e78075e155d4fb7980196fd7acf6fcfc6df445f6c2db68c35bb2b5b190f13725dbb532ae024b1b2212daeac9780c02c5b62550cbc6e5e313fd5f9e16cf2b64eb9b5af0ccdbd36e1e6c4730ad19dc1db83bc7f06113f53ffda743ea57abb13dca5f33ecffd530f00851f1e5601b616aff5cfeec8ea54b451818e66bbd0077b9b95b32a1ac423d4e4c0cb1e3e794a8ced2c234d58a204c3f0a03d4c0dccbb02043496b7342958c61d3b6d2df5eb67c6352a96297a1ca11e0cc3072fe99d8a361251b7333ae6e0d58119e722042c122e9068555379824472407b1e60c61525cba4989ee0d1cd998f1b3bf489e5162d8b2e524ee2d0a9394c6a939805e921ce9ded0d22a7af9471c7879c8eb222ec6f9f7ebd2931b02c721104fc7790acc14e433a335c06b73644d8d8629543539d23d54b3739040da936dc365b083fb857007e453d658c5b7f6dc2876781f45b4624d7530b17f4aaabfcbcaa2bdd6922ad53bde2582f57b1068a5896d4eb323b92f93bbf15f97c7fe5dfe39d764da53e50595eaa86d44a921b1883066f1663e4f4030ed000a95e92f264b51f306b7bfbaf5f8520f0dcabf6c5b68b611693dfb6aa558f86b016c1638e7ef21077227968c7e94e247ba6dd6e9372c572f3f61dba78f7257df16c0191f5929118a8b95b5eb14fc0838a4daf828596df93639d93d202a32a5a233e5439bbc7463a8a0cfbb64b2843fd0c0cba313d661fa768a05e992fb9f6f44039031d307265e247a14f7e6cc773e794383d958b313bf7ebd83e8e06aa98ceb2b471a18c962fa6cdb98408a3d2d2702aa0242d6c6f68abfd764e361a5d02f5970d4d8ae431ab0c5f4ac32e71e0278d5af69610b6113552a7de55c02b20e4376d3e1537393db5c4d6c87bdd83dd7c4d1d1fa8e572af482d56651de31cd1ce6513b132300aa24f5e2dead0ba9ed689092cfa413c2e6803d49590c9023edf0856dcf2c006c0b0b5b1e4ccf2932bc35a59d8d62e9fb49755933e829b6ffb92df40a92e39c31726dc915d4baad3d02f17ccb37c6926f6b286bd5a93b433a13726aebe4e0ef378362b55093b882ad454411d70b891992bc87f63f19865e09737c98ac304e3e56f3d794db8f602cab81971cad5b81378b25de17a36bfd202fcd11fd00e6b9e800b32475b6c9740ec706545e60a82a58b706ec1e386433802efe67f45eaffd327e2ef6b685d46f4093b2fe94c7cb58bf25c93a3f2f3d09a5fd12ccc08d373254dea5bf19ca1dab0606c02dfc893ae6df27bdc62e4fd0767e9ebc70a9c4ec17453b89a5594e681fa7f64b5cbc8048759dd57ae8cebdd3b340bb3c9efcfa2287bb5c8d68a8aed3e301c4a242ee14bca5b4f23d78b4bc1f8226f97a84b27abcfea50520f51fbd0692b3cb2f63fcbccaf2129cfc6e3ec6837e00416a90ced09e5a62ae629a91df419f8acc3b335e04e887d3fbcf9bdada5f9c8b7dbc975ab0a18226e5e2db1580df6b563cec5765c96671e050e50ca53e24a419f5076a29c216a385f7b2c96f280b3caec4b49ede932180b795f3bc0a1bc0d4b2d5ddfd417d051d162301f70c6c0ca683eb611657940449472c673b7817751463e087ba65db80e0ee87c22d4674a4a8490de829b12034db7d1c98be6676f27e61914c0a215bae49fe34371b93ba756a6084a782c080ec1c0b5fa0d0f79630d03a3d9ebef8441320ebb9ff36810b581608280eb305df213fa378938e7e0b8c75f66821146f38ee0f1c2f796fe1db2b950b8c0b4bfb6b1ab9bc0c1ac2dd6d548a605860d2bc5c7e2f9cc6f12c483a0e68cc39f02621ac8a0f3113cbf2d8795baa3d9671aa1d177d947dcdf5dd381e15204c763ef7d715bd65746756f4150f822c8d6f568eb1fd7947a0041ffa9fb0eed980621f8f3a0d91af0fb8f7f3a6be99080c5f0e7f0d3141860779cba4536b940d4b06b87dc324da137b5158ccbbb734d95c6e033ae7ea37d4e429794d4eca50be30527fcf7995ad1ee8d9d91e2139261b684a2691a04cc699e3e82a24b018f9efbbc9d65b5ed7846ffe18980b9a6bb814746557941f97f9a5a202c784662afc735c88aada21e20c7d4b0dc2d380e15093a675151d623700f4f4af4c9c8fc8b4144b98f5b760f410a7e3d34fe5d934f005d0216da30c542ea6fc1420a05bed7438de0ef1f308644758c04561e29de0253d6930569ce9c5e874201b15a3dfe655da67b5b679ecc9f6e49614c594b524c814555a7c0253b89c18c33e71ed968a4cb448af5e9026124796064777c62cb32d46c08665f92fb1960690dbd939905cb1bad51f0d10ab762174748a6b960313c07d3cd92726679b8731211ab135f9bf829879671654212c699dd79020293c50342cc523f69d082484487d2355088ba43c844a4e28c75395e230e42e41ec570cd9b67697b95662aafad2094e0c49fcdfade49cb746a3b8f4ba21c0a730c6eff02e019bd60fbf5aad7edc69d6960ffbc0fe78f400cec2f9dbb4a2af4fe3ad8ff446833859b9614ec6219f0ed86e4ab2a001eb7a273fd426cdfe2a321ea9c8bf57caeb2c355d2f6559461fcd841bc35764afd527ba198f2f832bbed3bebfb5ea73894f45cbe07a49cd86100bd733c56a2a9d7220fbd0be045a0d0371ce04ef2f79d40980a66746f7494f6ea333450087ae60cfafadb07b88c40cf7ae1a0f97a6a96619ef47a286a15c069438bf3062fdec2df7e10c6ffd3acbdc5777966eb6905459da819b3f7f1b613975a7943fe6b0893487c76bf53928b7fdb72799ebebd14ce7903b56f39b699e639e739cc228e822808c97a2457351b21181cab2e7659096eadfdbe47eb6af9f58ed4b1c735acb2c5efaac04150b307f997b83f36d3a432c59aba211b2fe6a4fe90c5801f09535a69456d82781ccdfdc52f4c7556739824213b7d5d7b6a9ef9665b5c6694382ae208b73e0c1c7b45baf8924c2190aa16b6dc4b6fbfa61390c314b772b7b9254a83575256af7a2f04abc4cf7746d7a3224ffcafb223c137c819dd48d16cc94a6dddcb9e701f9beec4297af7ca07c412e6557792cb1b79be032fcea69cbd3c3ccedb6f041887f77262b2f107646216984f107f008662d2c906fccc287f1e2688a69b2b515651e005a1697f44e6c4586733a7460474747bf439191f948cf000acba26d9d531becbdbe6aeecb328dec1f046b221a98a7b942bf1616ff9581c535a188a33cece07e7a526f3075dd17c826b5c32ebbfcf65e3b96f8ffd609521d89dfa7bab3c08680399d22bcf94dda794bc9ccc04f46d2bd2aaac817f8551e184dd4e7764f473118d376365748a117cfa549b47ce2ec3f428b32c9f98b1443728d5addd6783b4ad5b61382100c90f2db15adec53ed3daf3b2cfeaaaa5fabd45581b60ec296146a07736e6ada898215d86edb7c192a1c5c0437d68191c07efb436f2bb7f5dbdc96c56c0d902a8e985a6f958638ca54d9f1f09ad4f60ac184281fe4cb6b05fe850ab74c99970ec1d20af6fdb4113a7187bb967fec62e4a594d77d25aecc441615a69ee16a2321618b89f619c02887e2b61f8442906cbbcc21de5d10425da09c45f757842d179ef6591216871e35221f544139853ea4b13f992ca23ef8f809ec3f5cd8a401aaae577b2e691c0670c36aaf3f30bf7c2cc3a7329c0acf38178ca9dad5c5cb95f6a0330c5951c89ac7b38930dc7648cb52c20814dcb606192cb72ab3e5206cb16511bf686f33023d49919cd19041b2c3cbd74a08e8dea9ac82b54b7052ef12b3c437ef710bfcad95f057e22d9b9951becb39f00752b89e83f1d6be27c62774f5c2a03a8ecff3c378f40c3e837428aa9e4b51c99c91ae0516d4731743effa97b446d00605c76930ae3f9ab3536322fc7d2989f005fef3eac186c847d1596e68e6e7f511662667ebafa77411d16076457b93f317b8cb5fa22cb880d360b50ba5172efcebc6f26cc92541a514c32d380b688b479bef5cf50e046b6702305468fb7c14b050cb09fe571c80c4b49e9590cc165ad16b473551addf28f69e2dbe5e36da1ddb4ed66771423ad6a6e4b6211b33f7ac2eaa2bdcb6ad28f7a051f88dfa3d760a84dbfa3fd96d6d20d13cf10f0f4b03a10a78447949090245ebf4566d4466e4e3f31882cc409506aa1180b113a717b973e13c860ef33f2c622f5fc50e38686a9c772228bed6bcc7960d904064cb97180a87ab18e41173eaf8583d7a8562ec5accc4d076afb3d33f39d76cc3e6cf1cb68c173d3a43d58bfb80c46c7d35a285d18c5b61417eb926636ebc00c214aed6b3212bdaf07356ec0ffae3a16ba6d1c36f16d279be92cff9347c31d6b0d90963c0ca3b93ab5fc123a48e437511b86903b7f66df37080b1018c4019e31988d272f41c753e2ac1aea81d72cea9211497403cc1fbd78d502a014645c8c79c606904d7cf790fe5adbe6cef513763e558a91cff11bc90384002f68aaec45e1512193f8664550341858a02dedc1d83c608dfe8927292019314f5755a22ed2d473112c273799df286646d037253ee722fc7acd2d78300770612fc6acd9f3173c8f561b188a2d4eeced0384aad65f32d92d1a21c9eb219e2a87f2097e182b1395832a1ca05fbd47b3df8651b9f3d277440454c90bb157d0a2ea1f614637a96baaf674ebd81022aa0607eb696a80d242c7eed26bde258469b8e4028bdb4ca6c6db299a88a64de7357075f80636e136296f4cf3cd4b3dab55dc48951433e2710d687cf1143d50d6ef983304237e23456657499c7f44a85a5bf863632aa3fa65b64dc7797c33b822b1ce56eea8e0d64f7e884fbf49e9805c9333534e3344cd4e5b29d21fc46d8af626297fdfe4632d52ba4b8b179e18a419a269be44f63101c61b243523367dea0cc9246fe3859ed2df55458f6fd604bc492a243c78045ce079b8a451a59e4a32bd619336e08160e32ec806a59794aa9917cf04337213608e58e238180c509ce35bb532281b76503b7336b4837951e4ff01712ce0debeb460fcbf12416e8e4e17e3cb3a11b71b71e75a9fd469b731f5e19c3ac384902f61e410387d30588e4f8d22b10e6cb820c3d40779b33eafb3b7f56e54829771e13840fbb48fd4bc9907cad7ef6f39642287d8eb56be64447a6c65ae4d853993c82acbfc304b3f060ba33a6a302356ef8bceb4cf42edf10b0aff2108e565563cae65d4e98e10572d831a8b469cf63d0ef8542dcee3083980e3c68601c38d4b1520e2960d74e3d69d1e0c85fe06eddeab074f122721e490f0fe356ba104544204f727ae1673ab49bfa92c0e588238eedf936cc6adaa6cdb69d206d7dda524953383bcc937ae1bfec9dfd1377be160746844a559f164795b7e65b7136987942df9de55857a62f1e5cb704c9b9721fd0c2600aaa3774382f614b77d568b09d1e4eb58eb6831bddb790e9f5695f8fbb15d00c3b4a2197ae1e016797eaaa711afe4a73894f77df222402d62c46ff2d4867d3d90ed515057fa724e9e91cd88c57b08acab4f4e79d112c481ca10755bc218cdf7b8733b77f6244d48957bb0d41a9e08b38b27a6c00fc65c22020b43098f4fb23dbff20561ff91a6ca741ce96ea8507d9659c1195dcabaa44f3813b90781d76da8264ea027f43b16ebf62e824f16447930132ffe8f657a88a4a4ee08ef81196a272aa975739d2988a33095c810fd4069780dfb27d05c806e690b0d3354df704fb332e15a7b1130a7264440ab363ce121adf95a97821e42fa9e14ff2dc0b04678ac615a1e51629dc21d19b0020af4d9bc41aaa7b71926fcf300b8a938babf907fe8405e84c6a25a38a2b237505d3067a21b727fd6090fde0fd82d222b05844167d8949a2b6a1e95915377de9131a02177c5db2e9a572ee4f3ab7a7e785ac3bc5156796f2de989bf841df727b7bda0de57f2b8b9ae28ae0f4c0dc07bb45c5cd438d65e688e2c7fbb50b9664c01083e8c6d8858c8c772077b30b24265397d5ce0ab11c3c8449f9d0e8031ae45f666258f707e929418fe2906452c94479f8793d07e4e29396a06483fc3e81e85858ed7700b73160f263732959586618c95fd2665433fc8ef92cfd39163ee35633d3097774531fda99d5a4381a8d6502bc567f71ece1dfb87343108732f071ea371d4bd7e0126be6413952ae691f678d07c655b9a50ecd6a0ec5ba8a59bc57d2b8c37a02a05dabdf6f3bc0d3f983eab1c570d9bb89f1333cbf7c9fd73d93efad7d4fc528ee22ab10efac39c02f1b6997abc20c480b6e400204d3dbd3bef1a9d32eb77a8004b8314122c3cce66596c21b983ed4086cd0196f2c6234b433c27216f9a5433b7468dc960780eaced11ff00be01905b50dbdd985fe41927938e41b27de4c3d0c6649086d432efc139cfedf31f05d3e0ed596364e811a4edf546ec0752f37819213f2faea0b66e9057732a70a1d4325178a01046a005d83030f2baf9bb473f7c2618c7f148fa7989812b0eedc202390e0af5d7ac3ec053e90a1dedfa0485e783893b3d1976d54021c72622cc857f0a28f9fd86962d4da2d0bd3812d2c0423dda4ee195330e7d2b8ce51aeec34fcd6458d7ac1f84185eb9b02787698ec69851a82557556397ef542f0408091ae20ac2f6d64abbb78532e56790602866c61a9a920607dee45d4bb32d0ccaa10ab8672778365fa7c2013ced7d04bac63f0b15ddec01e6dffc168ac9d57365de751a6915744f71e0a53045e2bcad3f9e668bdb805690ed353d7cc24a60bb80dd18c46849505c5491b93672bd39150a3d45473ac5166bddb9af12e5de4230a0676e98132af060a4adf6a50bf4d62493e228f9f71b1cd777f3f69d914a52fa3b60443087cc60132d3790da14fb3093f9b384123380c4a3d3c22a0c0eea3bd5f094c53a974c875d2decc6cd21f57d52189d33ae56bb0ccc9e1f938c6fd65ab9fcf2862d486a9eec9dd996b3181b41e5463894639e9694782f460bc9682a8d9f77715a6bf4e2b8880a3c20fb3edaaadf334d417f4d0f9de983f628a27d6288c1286d917538aa1cd6e12d348ee8f221c2366ebc449f360a22ca199cb8c5b52cd73b4ce431a4030116ab78abf9ae7c5a80af19fee36e34fe0c6e56ed129c45f838bf26df87a49ad54ae01f9b955443d7e198c9049eae65eb20135fd5b6d93bc5af467db29371a6a5d6d10a542a809896183c738156732cb98448406a443d12cf8a8671bc7772adaa339d3838c644cad3fcd8e67812464ffa9bcf8b59e59d146d562df5358a2c2ccddda2639f422f5fc169b09240044546a3a8d9e65ef8ca132c37a2ff2f8c32e0de6df9bc24a29455934d3d208ab463c4e303c984f0f5f495ca5bc720733d61d8e25cb76b6453a87b7bae97f25617764d34045385c3d855f8700fb1bcc336825e40472f4b100cbfc53439e6688918e174609d6c7fe8f71b6d1d6631113411db4859fd099828990cb3aad505c815bb41a820c0729c474e017bd6a70f9623182d3ddf3d50ee6138ab03fdec9fb5c00b5a8adbd7cbb6586d6abfb86c38f7eb5144d1e6a17ce73229c2ce24b673eb067354897f5480df0bc7badcc6f5fbff44cb87446a43c6dda203f4d3933ce1926cfc8eb5f8550dab04b086faba2251ab526b5ea23e973b3aaaf3376b65484a844f23376188d5f7b24c0dd35e478c138fe26bd17547356385304ce91fe6031c3c40c196a0fe886964b06e666ba4d2048478149369bd4fe033c6819d0f9d2b1602533ee1d657d18ff1123ec78e329d1cb615b16dbadccd2fa0873d39e517a16b602a5dc009a076a18ff408fb97ce25ad88c90a5d9645e199a6604ba5d918f49b1c241660521f6f102df7defc4f927552a27be092045335fcf21e2cb44fcd77464f062c38be81a04b2cf7023421c7bdb8c5444fd8dbf02edb03a99b4ab1af9fefb82d14a5d90e00558757ba822075e2e67fb3935e7b706075bcfe94fd097cd806e5569c2a52f3c033ca8d85ba0325297f0c72fa5955fbd40e1dd39e5358943e6908126ed8c161b15c4ee5f24cca1fbf55e65a3969aaecdba60338ca59fa2d7d9e68f7d9910008b2a5dc86158edf455c44611b89a518aef489cbca62300836afe3f2f6c007b67bbb3f94793ac4f4ce898728f3c6017a11fda25adee538c6a8d52679695942300065f9786d2217be31c0d2026f1a5fd89e9db09d1e9f14247fddaf2c8f9d2a4fdf06e808b771ee7851e62a05e4ea31d430c4f93da7b55b31776e14fb14674261b870b702fcbe1cd96beb99bf5254a01e7260332d5c1bcca94a53644823b9e666fde62a4b45c5c28201d4ded8b2d801e552300b1b64394be939f1b4941231e6cf4d28eddbcbbc7e9833defe1c2e85e250da6df4fd1bf1d9bb70c26d3ee18501c09b3e68b39ec53e4a4ca0290f27fb88cec9ba785e6a854125d8c6e2444d1e562174667f8a6e7832c77a3109c7f6d5a438c7d964c65895722146b0beeb778c19f135e1f2df78b25bc5d50388beb1006a7f005160341b24614bf9a51ced013d5df519e01022c4a31176259b89e58cd35ac232deae590c8f77ecad67b6f4786caf04d545ca0507881e690aced7fe97fa07e4b7bc756032297a8c4b077b10c75a1bde62f6a26994dccdb8298c50322c428082e7064a1816f33f5d69d593d7edfe405bafb60947d6d9b4c3692de3bc9e0f96ae6d791982d7da0e9c6c76da2da5c36d9e54987d16f7052199f05cfa676c0591797520c164f1f9042caae738f9e9bf5c2c53fc4a558920c3b6983223eb3b058ca78fa4e6d98eb4a253ce7e637f3f764ae1247df6db8d50c189937ca8c11870a55c6806414105a37302162df471b1e064c94a1e8c4e0bde066a2c6b9c1663f31ad04bf69e2f905cca2ddb99f05426931cf60e0a5f905683f7e6f5dc205ca1849a27a46753288d57f7bd771ab83758b32cfb7b202cfe94f38f4726d644a5853285abf81b567e72af53aad4d062ca23480ebe255d8042bf63e80b1d31f8d7eeae034667f890a18701b02004ba25c412979b46ee532227033bf15640907e24bae8b543b9866e862953b8fc2dc4086b6af738a0a9ee9835edab5543c52381c6553951f6f9f8e256448364ca2a9dd6dbaaae91999eee7f172d14506fcd54ad215fc43a01449bab96627d4bb0c0b319b1269140801d477b326438f368e892c8fbb8bb16ae549fa2cc439a79b7d6d292c20ff07274c41437251181f3bbb3a31943798bb3a41a9cccd8328a30ab4cb62676c1335cd159b2571db1392849d2e367e85fb4d9daad1d67251ff410ffea85f2a4d3aea265cc1d2dca8bc52ce0431d5b8701c6d128b02c967cb5d69164c049fcae9e2d30eeca73e1e82b4f559dfbdd9868abae29110f84e2401f67df0653c522f1ee4227a533edbb807ac459b7127a3bcd898ac15124f145b87e24058e355cfe925e8a39990c1c3f5c34af434039b9f2ff36539b224182eb28d37cc8ae8c853654abcc1b93fc87d37954944644aa58c515277c4771d0377497bb522096b0a762941a9a0464ac6b54f7b12feed4e587003eb86dfb63d9f48f10fa176862083ec146dc4f9cc73bcb4b31b019f34693adb98723836f86a694e8bea236c5cf21c3e54806886e66960a7af29ec12f0d3d736bcb63d732a2d024bf90f6b626d5d53dd9b83eea852089645f5b81289d923b526f3c3a67e2cf9a6b12a7d1736e00d2c50cf899d2d42a7f19caeb66d8859d50e668c44fa7fa76e7935cd7d57e23fa8781beb639256594d182ad7563e3a98a0bd466bf9bfeb4c0afdb7aa9a88b31565b1011fc4e1dd5f942e51652a6d29417a89b27bdf281cffc7f1f438ab64815b3d497dd97d3d73ec028657cd078ec4d973ac9c9e2336b1d2004a742fce9bbbfab10f5cb1818f57b7974f003973ffca1b6a8a5a66084d2e9faeb2ae8129fa7c33705d69c3d9b61fc54e4432f45e59b1a9c21876399333b1c5b7adfa46648958ea730c4d7719530c98cb6c335bdbe68b126a2d0fa2733c976d2669c44a1a9adde3410300559568de26093e01f320a3f0651223c7a096f2dc32bae98f56d3a3689799d7ea33482f69f6e6831c7f3f5257871514d935a1659585a15e66dd9aa5fab34dc5d8b8b0ba1fb8a1cbbc37ed9a1d4e743b7306bf7311f721a968f8d29472d815d5cc35d10f2f9ce92ef95625167f04fba57268e67711a2a945b4081a03d13b2e8b98d84e96946bb19a7595cf78fdf129f11796360cf42055a7b612b11bf35b90cddd048510bb56ff4ce622fcaee0d06f9ee3e7b35600f7acb70ac1dd0125bd178adf230b34b574491e4bbaff0e91f17bd2aad8ddfd373d4af7af0e0e45d6e44f24ee6137de38591bce67f7d537ce74ce2c41bea4735f6802a9b6760e517979cb2e43899db0bd62d0f03a33fa213691481ccba7678e1c2f97a667b3b3ecbf4e425e8eed331f749a2d1e6210b66b9bffe3f6917faf1b1b7bb0d26e40d64558aa24515b8aeb5c1e71c987546036ef10ebd3bc0d2558c19486a078ad1f5881ba8959e7500e805f75231432de8ce6b427f62b06df3758440612991e0ac05c8ca43f87c49154475ec221e1fceba7d33d7d79106489e0ef3bfef55c6eb95b2a546674cc271aaff9e9c9bc26aa99c9c2a1d723fed7920ea561608103ea9f45a97bb8cd169f472c12165bb9edccd2921d2f7863b172fdf3ec51bb95ff682f01383e6e46576d90e8ab0902f6d76168c4be356d986d00e6d0b9b4d41cbaefe648af46058d377c5675d555943302c1df5f83c3b7c859fe7cc4db6df72de6a71f095a62bb23851bd5dc1d8d91d68341a6366d5eaf9131d7af39b158374f0f0716b7ceab1abe635697ef030daa19b8a4d7fca457e2c73654b443c86b4b1b3894dd094a23e8a61fa043a2e97e2936a9e6b6ab62aeb7bde3950e9dbed3491e114d2b549645ecda921e6965dcb276b7a1fb8387760b3aa4c9605bf5f3b31ed2239f8221c8253380df1aaf425319812bf97b02ccf610db0b9ca2d1ab9d831105250b66517e5ed133b65ae3cb6638331f780598b1e40581029fa9a4939ce692b6bc95be6a8cd3ba3f879afbbb6d1ef9e36e8aa5f6b803e186a3b5c613595f31fce1dbb6440ffa04898a01909bd7e50cf781030716ba46f2c2731b3c6d76b92e86055ccaf050960bf3e15049b76f591a7aa41371a07d75f8cbb90ce07ca0bb09f7e1824c62962b8edac5ede68750819666e47932f4476d25b6477ea104bc18c8c34c66d02e147e2d891315b3be53944e99cbe23b5502745ba4e0989a9d23251eaeaef433b4d742e1244ccf0d46d5475c60b1d3275797ee8899dc8f7aa2b1ddb6336ea157741138f8862859e4fa64ee41262044153f1c7f17aaa6e73d7d1d57201eb7ef852256d2bdb4d37e0689261d2776651a0aba926c49019961eb4b3eea1abb8f2e297782bc46355c45a8fc16ccd9c7bf7552bbfb2dc6046d07658b38173015b5e74a13150d9efcae181b79a7b9d06102679219984a50fce39a166e93b0174bcf4e9ae6c694c0a08bfa1b0740d4136dfe25dcdbee97e17a73d6c11feb163b8bfc804e91bd9eb895906a017ea153a76792a2cc9a99826739650da7960726c9ea77f369ba718f2d003df1d2e65486d50e21cf081c24db1ddacb034cce4ed9df7d5e196218d6f50f9e9e4849497800402c19eb1b3f4032fcbac53236d4c961dd758b1dd610e7eda3fe94b312ca1dd98edcd8256f190bf90a76b02a8d6b11dd4f81f33362a8e45ec23eba014d47db18c0fd25976ff8a4a31c58e8a694087338b83c9e1957b75c284e69d75ca3c5cac0758fb1e88f9f4ff7618df5a61af61315345c24232d3563d944e97bb8baaacfe028c62b23014faab05c9571093244</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
<category term="安全研究" scheme="http://example.com/categories/%E5%AE%89%E5%85%A8%E7%A0%94%E7%A9%B6/"/>
<category term="codeQl" scheme="http://example.com/tags/codeQl/"/>
</entry>
<entry>
<title>悬赏计划</title>
<link href="http://example.com/2023/07/08/%E6%82%AC%E8%B5%8F%E8%AE%A1%E5%88%92/"/>
<id>http://example.com/2023/07/08/%E6%82%AC%E8%B5%8F%E8%AE%A1%E5%88%92/</id>
<published>2023-07-08T14:13:54.000Z</published>
<updated>2023-07-08T14:44:46.162Z</updated>
<content type="html"><![CDATA[<p>悬赏计划</p><span id="more"></span><h1 id="悬赏计划"><a href="#悬赏计划" class="headerlink" title="悬赏计划"></a>悬赏计划</h1><blockquote><p>号外 号外<br>由于暑假正在赶来(也许更多的中国的暑假),暑假的日期是宝贵的,我们现在想推出一个非常有趣的活动<br>活动的主题在于利用假期的时间学习更多的知识让自己变得更强<br>除了积极参加比赛并且复现以外,我们也考虑到了一些同学的基础并不是很牢固,进行一些wargame的练习也是一个不错的途径</p><p>我们规定了以下的平台来进行奖励的发放<br>Dreamhack<br>pwn.college<br>Cryptohack<br>Root.Me<br>pwnable.tw<br>pwnable.kr<br>….</p><p>注意:1.以上的平台仅做参考,会不时进行添加 2.希望各位自觉按照自己的水平进行学习而不是一味追求如何去拿到奖品,我们会根据实际的情况进行筛选</p><p>这个活动的日期从2023.7.7到2023.9.4 您将拥有接近2个月的时间去进行参加<br>这个活动的面向范围是全体成员 根据自己的需要进行<br>关于奖品有周边的奖励,线下比赛的名额优先安排等等</p></blockquote><p>空白👴发布了一个悬赏,正好打算入门二进制的我开始玩玩吧 目前打算一天一到两题</p><h1 id="pwnable-tw"><a href="#pwnable-tw" class="headerlink" title="pwnable.tw"></a>pwnable.tw</h1>]]></content>
<summary type="html"><p>悬赏计划</p></summary>
<category term="悬赏计划" scheme="http://example.com/categories/%E6%82%AC%E8%B5%8F%E8%AE%A1%E5%88%92/"/>
<category term="悬赏计划" scheme="http://example.com/tags/%E6%82%AC%E8%B5%8F%E8%AE%A1%E5%88%92/"/>
</entry>
<entry>
<title>cs254 week1</title>
<link href="http://example.com/2023/07/04/cs254-week1/"/>
<id>http://example.com/2023/07/04/cs254-week1/</id>
<published>2023-07-04T07:58:06.000Z</published>
<updated>2023-07-08T15:13:49.287Z</updated>
<content type="html"><![CDATA[<p>cs254</p><span id="more"></span><h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>之前关注过的老师的一门课,资源公开了,正好暑假实习研究方向相似,特来学习</p><blockquote><p><a href="https://www.cs.ucr.edu/~zhiyunq/teaching/cs254/readings.html">https://www.cs.ucr.edu/~zhiyunq/teaching/cs254/readings.html</a></p></blockquote><p><a href="https://tai-e.pascal-lab.net/pa8.html#_2-1-%E5%88%86%E6%9E%90%E8%8C%83%E5%9B%B4">https://tai-e.pascal-lab.net/pa8.html#_2-1-%E5%88%86%E6%9E%90%E8%8C%83%E5%9B%B4</a></p><h1 id="论文阅读"><a href="#论文阅读" class="headerlink" title="论文阅读"></a>论文阅读</h1><h2 id="A-Look-Back-at-“Security-Problems-in-the-TCP-IP-Protocol-Suite”"><a href="#A-Look-Back-at-“Security-Problems-in-the-TCP-IP-Protocol-Suite”" class="headerlink" title="A Look Back at “Security Problems in the TCP/IP Protocol Suite”"></a>A Look Back at “Security Problems in the TCP/IP Protocol Suite”</h2><p>这是一篇发表于2004年的论文</p><h3 id="Abstract"><a href="#Abstract" class="headerlink" title="Abstract"></a>Abstract</h3><p>论文一开始,作者说他大约十五年前写了一篇关于TCP/IP协议套件中安全问题的论文。那是他尤其关注协议级别方面的问题,而不是实现上缺陷。他的这篇论文回顾了当年的那篇论文,看看他的关注点和预测哪些是准确的,哪些是错误的,以及哪些危险尚未发生,这是一篇原始论文的再版,并附加了评论。</p><p>这里补充一点关于RFC的知识</p><p>什么是RFC</p><blockquote><p>RFC(Request for Comments)是一系列以数字编号形式发表的技术文档,用于描述互联网相关协议、方法和标准。RFC文档起源于20世纪70年代初的ARPANET项目,目的是为网络研究社区提供一种协作和标准化的方式。如今,RFC文档仍然是互联网工程任务组(IETF)的主要产出之一。</p><p>每个RFC文档都通过一个公开的、透明的、社区驱动的过程进行制定和发布。RFC文档经过许多轮的讨论和审查,由专家和社区成员共同撰写和审核。一份RFC文档可以包含协议规范、协议扩展、协议实现经验、网络架构、安全考虑等内容。</p><p>RFC文档编号通常以”RFC”开头,后面跟着一个数字。例如,RFC 2616是描述HTTP协议的文档,RFC 793是描述TCP协议的文档。RFC文档可以在IETF的网站(<a href="https://www.ietf.org/rfc/%EF%BC%89%E4%B8%8A%E6%89%BE%E5%88%B0%E5%B9%B6%E5%85%8D%E8%B4%B9%E8%8E%B7%E5%8F%96%E3%80%82">https://www.ietf.org/rfc/)上找到并免费获取。</a></p><p>RFC文档在互联网标准化过程中起着重要的作用。它们提供了一个公开的、共享的知识库,供开发者、工程师和研究人员参考和实施互联网协议和技术。通过RFC文档,各方可以就协议的设计、实现和应用进行交流和合作,并推动互联网的发展和创新。</p></blockquote><h3 id="TCP-Sequence-Number-Prediction"><a href="#TCP-Sequence-Number-Prediction" class="headerlink" title="TCP Sequence Number Prediction"></a>TCP Sequence Number Prediction</h3><p>正常的TCP连接建立序列包括3次握手。客户端选择并传输初始序列号ISNC,服务器确认并发送自己的序列号ISNS,客户端确认。在这三个消息之后,可以进行数据传输。交换可以如下所示:</p><p><img src="/2023/07/04/cs254-week1/Users\10190\AppData\Roaming\Typora\typora-user-images\image-20230704161843216.png" alt="image-20230704161843216"></p><p>也就是说,为了进行对话,C必须首先听到ISNS,即一个或多个随机数。但是,假设有一种方法让入侵者X预测ISNS。在这种情况下,它可以发送以下序列来冒充受信任的主机T:</p><p><img src="/2023/07/04/cs254-week1/Users\10190\AppData\Roaming\Typora\typora-user-images\image-20230704162057849.png" alt="image-20230704162057849"></p><p>即使消息S→T没有发送给X,X也能够知道其内容,因此可以发送数据。如果X在允许命令执行的连接上执行此攻击,则可以执行恶意命令。</p>]]></content>
<summary type="html"><p>cs254</p></summary>
<category term="course" scheme="http://example.com/categories/course/"/>
<category term="course" scheme="http://example.com/tags/course/"/>
</entry>
<entry>
<title>跟run哥一起学fuzz03</title>
<link href="http://example.com/2023/07/03/fuzz%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB003/"/>
<id>http://example.com/2023/07/03/fuzz%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB003/</id>
<published>2023-07-03T08:51:25.000Z</published>
<updated>2023-07-08T15:15:11.982Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="11b1adf8204bf859ad56b70f7677c8d4752662994c15a9c23c0b7df4c12150c1">cb320da6677537a61c4c8a60c50f744c482ff6da6ed0aadc6be741b7df5f88e8</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
</entry>
<entry>
<title>CodegateCTF2023 n³</title>
<link href="http://example.com/2023/06/17/CodegateCTF2023/"/>
<id>http://example.com/2023/06/17/CodegateCTF2023/</id>
<published>2023-06-17T06:28:06.000Z</published>
<updated>2023-07-08T15:16:38.413Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="018ff19478f325698a8d49d9406f354deb7607be342c6d9234706ce41c217252">cb320da6677537a61c4c8a60c50f744c43ab617d1c17ddc1b619891298520af2f1ea46866e4996f587b978765c76cb3e3b71b2fd8089477c815eef066660388bfc3cde288246e0a80b2dfd71ca439fb10e154c05c2b07281845def783be4396a62e156d21de12687504aa9c023b5b7c0d597bcc4bbe535ab076300a48fa079cbdff0cc68b75012e0bd336ee6ae85b2a72d2b50ce14d82ba185eda4a7f86c7bc4529d68bd8720a4776abc7315106877d234f4b9bc3b898acea45203658d4765b372ee26c0cc30e33e8251dc8efc63a4b88d50562bdbc4c31bcdc4020c902e1686937cf86d3930caeaabd7a1b66677fd803c6e2d430dbe6cb75d2a29583c1135a3109783fca6b9f1d5f195d3908959c50001bfef90b150d982107fb1e1b4c76553afdcde5fcd5ec746794ce746179b20a5f2e296f46ec5337bd5c41d82787cadd89ee28ba42378e6f12ad3fea332d28af048d40d9c1534d6107a63bb3167278bd601a8bebf730a4bc86902ea058d30e9404a1496c45376594081e08dad26acb304d17eab4d630aa3bd3cc123791ab8eff64072fa81b33c2acff8cc28e7ad9a9f823d2a0b26cfe83feab31284bf63b345f618d1606518254bd76c7c064ef66fec9a3297f5963ba60151b436aafae8fa638909b2ab5b2df998113f2353dcb53e6d8c70e858996a19039f379c073578eaff9c97c2008d597e3abb26706c4480b7b9ca911d4585207d6692a96f69b8f5eeef6f3eb6667cf57a0f85b7222236e318b84d24e6b8f173fc52dd11f1ab9368c1e5931ed646e061884e2a37d3427822db8b2245c03151d68126cfbfd534ad80eb1553fd57d093d06cb6f50a25484816a7b8068da2124c0715c5a6b23b3eaacaa5260f3832e02de4aed267c831a5c5acd26772cc79a0f9ff5c264bd180e88fb9a9aa05f8ec186563c57abddcead2e3aaa8fcbeb0cfd32732a5d8de99d57ca2b7d8b08a3f9a5bb2bf491a589816dfe9a55a1daf08c660542df3a188d64bedd5eabe768754f711ca648476ebbdfa4d83d99295995cfa8ad2d7b0a09a260425097431f94a9f131e15ead528eb173d3d13f8615d6c3db96c89db044da4359e1c6f5f2a7d6709093a8f502d389af6146fab306cf4345e45b90913d9f204c85d5e65ae7d893377ee7b64b47c495da92fb41e59a158d62034c8faab4dbe1249ca3a91e08bd749079991355078f2fa1c008e656b7b029c3715cd832057c0c3819a37fabd5c2952422eab7f9ab187404c60b80c121bfa7a4c132c6e6b6e0b07986240fa13ab1e534c96b1dc87691e447067c028f94627e2a84546369bb578e4e2a1c1a6a40579ff983214460fd5e93205caeaf6082b95498f4128f918c080df0e756aad7506922fdaf4a0270e8d96fdb540054ae695a7bc4a5ae37580784e1504a760a91b3fc7a02a47e70306c570c2c7b42486475f55f7ab41998a1fddd9c56f0c860d1acd41d49f40210cc06676f7cd60cede78f198dec62f7e6245d0c84d6bbafbc06e5dc4b348d1dd76b80f5593bee06777463863afeae70205879abdbc75fca0624b3e72611e461a442e3f94067d7e35b9f3432a9d55503083260dad6606af189eb4ef6e4cf90bbecd0b8343561e78f47672b8d3413ae34cdc10f9bdca40acc23abe032d799f93b874b73e0c1e52d130ec47bd1f95a287e9b3146fb4b38f9e10ff46e3b7c5bbcd06e68e03bf6656b71b5c420c1aa81ee2e23c759c8ac3bf217c23712083355b279810753b4c1d733f78c3ee7e1d0a8bf2b6c3a123851312ec5d53d7ebd5dfa8fd451d74b06f5bab61e6c161f22e2ac24d7486a0382c6177f93eace41ac9a41e94742589e45814b720445bc7fd8eb861334e922b0170bf9ce56cc3a1752c974b0975e370e5893f3a7ba328a2c58a5a648de55196e4c22f53b63540890469092a94ebe0d5d8157750842b0dc86935110df05d306395b34d5057118b983e849634c16be5ed04a40b0ce2bff804107cb0680aefea3d7b45c06c5d7270d32a912bc10521d13060efc0676e1445345b063f6e2c1125cd3a74a5bd80933e1fb001af04ae4fc01150637cf499b1297424a1519d4acff20bcfcf29d1db37d412a2183bdce6054c88f7b6dec7e8904ce043d146771750577ab5e2a49226413a7248ba73e49b590adf3bef05577afa111c96d07fa239c15a02b87d200125eb27faf128f9a8f8a2756351a43afd649a7534451da64818c2eac5fbc312391e442cd0e92ea7b6ff7350ea46f2209f15d8c9a70c368bf0523d1c103b17fa8a91dc25e5252a2ab3beb3b8b64a43e3b21f9f4b1585971ee287ba1014439695eab1f13300f571e289cd65ce4515a0631a741dc6f15f07a2d0ad508f707cfc668fa7168254b1b68331068f6cca08d436e0f151e512d73c68ea33062c924021e33dbb65cb8475b37563d4a69d03345b0d833cf1b09025436d97b0436a36b3754e686cebf0d3b27e666015ce2d292f698ade370774105ddc415b7e0d6b8178efa9f16d4a15395c03d7a8535a4dfba3ee2b37a82c96612bfdfb31c09efee9540a43f24f7a2822df1c44bc5e6b40630a2c5c740aa49aabf1f596eb51729c1e3dd355d1882fce160ae1eea402c9b090495f657028256587b622249f610d3cebb40ced715b770ed2be341305ba7f32199ed51932b8488e80522848f4b1d66ce1289bc95f83f91150efd18483a59bd520d6beb05420150c84e7a8e258e41f9534e4500a1e738513e07f2d70cf3bd9026770bda537c398bdf762f1b2d12fd1f6ee2cfd65e198898a98f3b6d8c1536452c421b9c910bfb30a7c2dbea4dab764342e1b09b38a24aaa35861c6a4c74d705898b700f5879efe575e7bff5cb427df84cc9045d15431dd813bff2ce014e06526ccc3d28122f29b46b5f4cbe8b7c1f826a5132362232d3b795a8909237b8885e66308ef677d63bda6f89fac4a66a9ec45e3d765e72a8dc1f34e249b5d5fae37aeb9da7e25126ebc91d573473dfdbbe53d602e151b7f5f820e65f8faa7c08ea38fc6f3913c199a3b8993a46203295a42642d3207bb9104979c87d0a9abd8e8e7b0c51138b85f76d338dbd50d16598b9d53b733ffac32408a0a016bb92c15f03cedbcd7181710ace6859fb3db10faf2889675acb3f8dbb2ab79782aceca46c40c9e20630083695d1ca62948668a40a4adb5677570efe0b9ffa4a46b731e3c13b23791024d9c7d717c69f5801703e797b7d8fbf4f590185d8277af0a9340f7498b18c57a7accbe40a403406cb050ece6009169ae240c7cef005eb01bc6e20d1a08f58c79fed84b6eab7d8343a0a98913059a96b0c897aed28e87aedfb617d7432d8b5dcc7560f4b44509b4ca2ca9eb7e1d74c9de23c42b11ad1a9fea44dad214b6dcfba76ab93eddec7b84dd42e9a56ab2fcd0b5d0e67c0535f509aeae75c3b6588fdcfbf273e4da3bf60b2c3e19dd62dd73c7cb117c74a840a352297476a453ae48dd79cfbc5d60cc59fd9db8c8875daddb8ff6fdeb4147fb53aab10f2e1a4b90732c82e69f6e659efb6ddd438ea042b1c28fa609252417b23c124a66a8e263ee88d2779e70f4a5a93c97a36ad025e6bcf90a47aeef37b8842a004c0cd682435e5b30e9c6cd9efa7d841a0b66fde33fb2bad6b5bae5cf6dd3c913be4559472e5e166501b1b9df84382b8eb80b3279116e18c4d6bdb700d288be913a703f3d707acb192d825af3c9582ceccfaae8aa01f0a69ea1db40ae1183563c22dff0c0a52ac3796bf80753ed1dab90e017b0cf8e2c36b1f29b7ec31b41f1f6b23284bd853d0d5d270a1fcabd218046f0ae5ccc376581a40165798a2179cc395dcbd2d15a75303a612722be35227215c24f244620a192856e25bd6488a64ad104e2c0a75ce5e28821b8b3cba0610edb3eec68403e99c2e48fa06698d8ae82bf4aa11b</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
</entry>
<entry>
<title>跟run哥一起学fuzz01 Large Language Models are Edge-Case Fuzzers</title>
<link href="http://example.com/2023/06/15/fuzz%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB01/"/>
<id>http://example.com/2023/06/15/fuzz%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB01/</id>
<published>2023-06-14T17:08:41.000Z</published>
<updated>2023-07-08T15:13:18.566Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="982a1ed7652d52b13e988383c0a5f7eab613b7cda1d1904f231f1aabac334f16">cb320da6677537a61c4c8a60c50f744c767e2354033aea88b06de084bdce480abcab044a7cfa479dfeed3bb27f6654ee48a0a8ef9090a76abd96eec2f5787cc91d0a2a1bf6e2f1a5f42abd534d0838b04548851137f3861a22f919f99d2dcc1649fa7511d07f431cb6133676083e7e7cfaff139e36bb4fdae033e7b4c633b312c2c3c3ac3709c50fca7f8bba5735d6a332d556a132c1a5abeba5f04109d6b03816cef7afa34c34981bda0f64f4782fe6c56eaab70a2dd2fced4d8937ab876a203192b5f8072d54d792383e5cf2dd06af919cfef3b1965a16b9cfc221949269d1c68190bc6fc89e7d315e566929fd004d05418629776250ac1bb616307793cc4d328ff9c5efd0728944e740fba434516aca17de4f69b9433af270abdc51187915a9cf651e7be3ed32d12e0461f30e35ada74edd0760d46dfca77b4ae74fc02dd0c2795022e5001328f9b86903460c03bc81bc83980a3f910dc8552225929dc1ffcff2dfd2ffede1c8a3898c056a755d25e29d41f1482c8b521932cae01dbd9ee6c9d34707210dd747aabd6ead73883ace8a9da890c4ba84ae6837957fd339f88f034ff5109d0253d72a485e110a3be55a8a4085495acb52ae9ebb6e0b6a0c12f26dbd3ac02c91b6bd91053bab3674cf2fb50845aec93a1085419aea57c95f44cac84505d635db69ea364554ea98ecb462856353d8dc92f3a4b6781d3a522c5cb0b9793ebce5535ec5170be3a733c11c5a6343aa05e974dbbb81a4e42888a27de2f5ae24f7b375683f5fb6ed9b3f30b46f772a159bda2aa173fb220d1def55f89ede8675016c9031197dc1615786d3b1f27e0cf2a9864ff78ca14a4de16d74931c25252aee3fa5551497f08008ec82b8cb6975f05fe52558fa6890e23933959bffdca9969d757ed6d8a061a7242aa32ca5313207ce3735b87d32e0821c5551c6e4758181824865ab29b2f840feb39732c26fbe8ae4ee6dffd9ff78d757d79945c4ed466e9518d69e09d2557d62a8b55cd59a2567c86f9a58f18f3c55f30885c1dd5311dcd70edd0ad4c3149e337704ade60ea1ec6c5a246068155851b927542cdb263bf52b6095b78df2865ac6ac5ceffa3ab7d9d23a9f9192847183a602923bce5f587f1fd98ca5b8ee47d58df384064caf478de36112f36d7c0afbc8752101f00beedf517f91bf60db6f68e724e2a8887e0e5465ca92f6873d783575f7a3f5888b4d53404ec21822822b20a2b7b9f5e519e0ec1e7a39bb49e1c247bbefc1d68f189706cca2f0470d46d1c70623b2c1671f46ee7b5a29fc859d3b1e937871f9fcbb3982ca1c0529cb4da3af3a97bb7ea414e1269133598f8788155902f1bf6dc49ae0e2a39327b768fa236f07c19670397a139adeef6405dc4fa3d4d54bc8cdb7b6b6abb3f5d043ff71e40bf0ea3e1f68935a2d1a941b5de9b9b3828df80dc532c600f9227032b7e94d6a719d58e7e2af3609fb56d736ca9dd9b5aa27cc850034a9da741d876092e65f01d4e20b1c807f50abe245569f97e2bf83aab0bbe6d5dc047d2dcb08490fcb91d32dddc0688302a3de05181a5a2650855700809a0f50dab687fe52a1fc0676a8ef1b965fcb444d1e7ae857b12ccff46c6c6bec5978842ccf89d9c9b70ae6bb0d6a7a198e491525bdc4a8e1e340a34098c0fd30414b6e31cae34bb25318c7fbf1c990357d52e93ba51391eb33f8369fc9551ced567a88529df2d9834826d494f8e2dc9a8d86b5bbf149a45368575304c1d7ee31d9a3a7cb529698b963e0378e1e6ac03400fc97109b2247963a0985b3791be55cddecb6f62da2a03f3c803165df2f68c81da53f3220c67e0937923f0778ecad76bf6a7c8b911bd123345efa6d0ecd63b23ee79eb68e982ec629447cf499546654aebd80838f290a3569c38e5585945787a81a69cf4a463a45f15e20d5eac40fc039716c77f71cdf4748aca60eebb7e241819a29e5b968cd24a12e1741c223291d275b0c5a1ff4f1a021d345dfcd2ede2a85cbd4df0a9588cafc01e9bac183e17218176584e0a59db718a58332218173ce897000997fbaf66ca450a128e86d97b6f380680eb5ae74b00565036a2189ffa84aa210aab53746d18c1d2ecbd8f1c3b355b0c6447bfbf696cdf56c4ab9b9adc373959a395c682ca6acee28063469343ffd78f1dd1432f1f1ef1bf8afa5e7799e64b7546e424c48b55aca59a8e0b8c7fcb85c76c1e71465c867f6c57d4a677224e6b5521a1dab708d50c998965e8a9d5eefa08c103bfcee8ec8eaef927f5d13433876c726df9340dedc3a26a2de4644cb08329ffd122a28c328ae9ff5865c4141f581ab96c86916a0e3751149c1410d96d838bd968568a1f151b9b938174aa1a054470bab567107f56c326f93de938db843ce44684b53b32bdc5c115f0646609e1385e52502070900ec0d268dfeae15c4d5cda8595f39ec95eb1464ba410f8df9b86f03d913abbd280d7b1a2328c7e627a831c3142b46130c817de7080621bfca7cdd6a0727cc8cc0a1e6e6a78db9219bb29c40e191ca7e0efc418a58add85394a1d5327aafbb839c335abcec254797c601857709a2ded4e4e3c5e5b4eba94d4d1f17063fd496e0084747dca854cfbe6f11a893493917ef3b64747afaa95ec7803e07f87e4607a4d2008583b8ef07055cf3da27d13f8657b7a6b91deb4ceea3df0583255f4853e8c1a004b115ab18b3b89b532bfdae469a0ce107850cbaae6aa4bcb171f544fe114ecd7d2417e2a0c279d1f2c79ddef11030fae339cf001c2acb83f1ae8130fb52e2ca3fe88b7fbc291cfad376e147c5da6c16bdc528b98499c77463a8fd957119c432c5c57fdcf2e2e8d5fc3a5445add9574c25cae763d37ee3090c8cc88dd103e61e0c1e267395d7621f56b592f14288af368c77cacf53d4dc305fb14b17f14e8ed11567eb323c21ae0951939d29a493cf3b4a25dba87dffead549176e8cfe7c9d0252d88c4ad215b17c30bf96e0a03cca70c1172eb255fdf17f561ddccd2a04735a11f0e59cf4ee24cb4d808cc9501d22fcffa5f949abfa74bbfe5cc03091348b690e1f80ca705afaed52f2ce534ed16f178043100edcffc97f1287c1aeb1d381092d0d2e35dced6ccabe33e6436bf4ce0a3c12136cc5d0f004a041f6eed9f2d3c005cd05b849f7dcd29294d9065d4d806676ce25106f47b68e2e2bda2104a03fdb4ba353289ddfcc63dcc4cfdc94deac71dabbcf799bd5d4a8e3da280794ad9552188bab47ff41d59f902aa1f06d26c80ad68c50001af4ee9114deff9ee52b37d4e62f65c9286bc5802a12e22a47137898dd9932d6effc778601f075f61c31135cf2e80c173d839802c152d0c35cc975729d30963b6363d50e66d0865c6fced692136d4a851c507bef217613986ff2ff82dc5d557b245f2b087b16cc205a0d30af2717ef524cd0fb706e72eda4506861358930feba5fb303dba5610784b792ab9efa1436a0e105255ce0cefeb89841dd32f8fddb69bf7d334c98736ce80e9413a529a62293bc564e98f199be6325cd10433607659ff3003721e2815267ba07bec92b90d8947b63ef8e4ecae8605487039b307037efdf57e74e88f8add1682c288c085d0a2ca48542bb1b3ca2463ee3aa16cf277749bdf84e5f27cc8f30017e5f9bffbc93da9471c2b49d2829feb33bd3f5335c36fdc396ff230314a762b252ace0182ec842af24637feb9a9811df8d8bc7d6d2c9f682059dfbeab5a96be64ecd54e3d46a72330502751704fd3b10efda26df2c5a477fb944652d3bca4b29a076563614180b5bcb47e5253c0af72677b6ae73e4da1b47fac59787a02d1034b623ffa31e67d0cac7b74e0c65f9f82f59e317d32f1351d747b9b0d6b5ecc96dd5b13b0431947b85deb898822cdaa344851ee258c3c8d8cd5e82966d54d9f4b216c2acc2408da1eba79ea329c58a9680826c773c0d7d9dc0da30a54fdbce24e0118236a1b77088c4cf70baf5e3ff975c87095ba5bf84d24b92897e362dcd7e81b6d992510e3018684cfad2fe68d13faca8192f2f0e35f565ea2c4c82e3b14d2ede8aece78ebf4b0ab10a502e582e2c1f219ea25c59133b6a9354972d262f75ea22f37eef771a31e5930513e78040307f316a7d2e1a4a3bc4fe3ee88a64b2fc823d6733f536a468b6b9e526ba5645edc86f1ab1063771a01e8bde269f5636daa4cb12da1a0a3d620be352b537474a0167321f8e25b9d8a38b70afe59a248190ecd95315969cb8f073fc15dc7ea5dde725bf1e05a91f1da62a633e2cbbae60dbe08225d0208d4eaa81c840e108902f51e86fb91180ba2ef68cef1e91ad688979c4839c11b7d88e862becbca48533a4fa4d20fe25874e6d452d64ad196a77e38840ecaea367ab2d7a970ca8718f8787c286ee78e63634646177ab8f7e2fd34b47e976bece6c7cfd26443e411bf526d7a34e322af90bedbe430d7aade48eca34021a58bf4141dccf9431d6547338185806202ff48c368e43b40c01324f3d65675056e36d70b5c65cf7987a01576c558b4d7daf922205fc79a20804e1825b2b2b6f3039408ace90dba9ea9f2e1c7f52c059e6957e63397570c34b81b973fa6531d2858c152ad18b68ced2e58b68cd85ea0a849350137cda861bb8727e62b3f66177247233e05a204f6d2e124dde1d485b184247619014994a2649a25b1308ef82ee6891fc7a64505899476642aae3b9ac081c5c3a98ec5cd3aaf3f8ac047ff1982e7702061558431b5353575eae7198831f83278cfbe57b9fb99ff43dd37253b15471de6e828719b159068001243d4c1e9424d4eb548aa06df4edb0f831ba7178acf4d71bd4e43d7fb7882bdf4b29579f4bd0e1cbba78de29653a99c089f71f76b05346ab16b246ed3dab9709257c556d251b7512de858c2910ac84b20b647a2cc34c427619fe9fc746677085f3b32974364f8e1078ca79285c77fdfa252959c7f48f712e5c7345829618bbcf9e8fd5efb86dc8c55a36f21420d5ec09e9b2933944bf61acb18bb140667f0a7146a91974fd385a4cfe85a28505e551a556f0969fc3ea930e1515879982caa2be5986a5f5b7f3fb666be4dfa970295787b3f989d4849217ffba170206fba67576426bc9e26309056010f81321611ac962a7b76fa559124bcaa352e8e20159de1f1aa320e337321c534f5ff44d90891bb8029f7318c4c1ffdf3ab910dad6e84ee74033578e342ef6d008d061bdc96569ffa5a5d43d8ba6a4a02cef6731033650fdf185ba4f005e34b4cc35dee0ba5ae29c615712050b140a78c7de7e9aeb002bcfd3544edd28f0edc71f043680bb673319deb3766d47fd23d6b48b4e2ac960add2013e1f2c99c3e17b561782821c12efc24195635d3479e0ba563534c6deeaa7cfe84559e61bcb9e0f924b4df653475fc5969366501514de92eac77917faacc680b233ea79bc1c117e788ded7449f7b73d65bb6d54d884baca143d06d9227da40376f52d2ca0bb21ab2a6a38fca3b1d96b4af7dc5b4d10ac24ecaa36bbb3708ce89aed3602600a991c84542ed2161ae20d2f5522b5cc803c8c618438d27315e4cde1b21f9517ee80a2f5c3f057d558e7502dd19c0921faa0ff0347e0c20ac101bf10b4051cd2daccb03e0c216fa308454c4d278d1e9c6e417bf5a5c927d04ad7b8914eea61330a8becacdd079843486c54c10de29ebfc0b6d4774f39ecb560be575e96ea716807aad67b354559f91c8d04fcf9238d3f38b6c397d31dbcd3a11f67b635b516452b03cb2cbafc4167fb079e777b4e5e0611d6b1fa8084060a5794b6bcd714d72eeeb4611ccdc99f65986214b408b3d903c3934ed1bb95875e287fa6bbca7c535a659717901429ecb3c28ab6ae2bdccaca6cc9d5959e9c5fac1be792b15707428e0048aa28978bdcb9931d9a1d853afba0c0a54e2d03c192630aac996972ed88653593dc325fcc83b8f7335be016a440d3f969cc833429c23f3758285796a60e4b7acd00a80c11d716c75ec4b6e9496bdb9d7653517e1154537c0cc292d0ef7b15236e19b4528aeebb768ec3594ca8f32f19fd9a5435289bd5cc6e6283c5da30c7bc408517021a9bee6f10c44d6f9c23272f4a56d736443c08fb6766b9c0c48b2e9e82d53c6f509c17f3313a92cabe8cd858e80d4068a9eaf3fc67580b7454a6a56b99ec39cbb73c46986d290831f258d32038a32f60687fc57ef4ff5ae377116a17712dfdcd3e2c454a757ca220322bbcf0b52854661199a2990b3e741d586cf39cfae9d233ccf1213dc87b88dcb0ebba59064544b8fefb44801a30a526190ed459cad293d3d51a10fc7b7e33c335c71f021f290819be85e8bb27711006fe2114951fb6826cd46040af534029626c04990a348b46bea1cc7fa1c9a7bf34caa40a1e495bc0170605821fd9bc6875501ee04c0aee628d9afcb75e2eb4b5b93c76f4be019f2b0fc516a2ad4f332fc5b6ed014b8e0cf82c6c4d85fd1aaed129a4539c2af25e1a6bc53429f8261ef4da91da0b668787c4f8abb652bfa409eb2a1701aa5b59c265dc6bd3ed0fd6b5e493bcbcc447dd7ce352b85847d62f1008a241ce45aea946b82a09268799c9556a304eb485efc9adbccec80f62a2cc4e27aef009116d40e8526cd38d24cd60d1ca69f64cca2646d1604da9a40fdb9d95c54179e133a1cdfb05e5e907c04e905c0b20fb5ff4493349763ddad5024c000e2e9dd32faeabd5e2d2c3dce623505d52edf11c890250a49c00005706d88a3d5a22505370f3f254cae98017d81c6bb38880f09aa49ff58763f4a071c1940044abe8127a1e2df67179728986a209174bac5118765f3d9c696400f1d097e6cc5e1d37eb4b9b63d8746618b597277c13e135732f53944bde90bce2431936eae6258689d15377f5a30836fd664fe12077a4de651803e23f6f2b169db934e929bcdb28087b9728d934ee2cbeb4f8ed9ce222dc912dab6ffbe97c0696c384861e9f57f1c036d4a4934035ef42ee0d3c24845f8a2ee61aa643f117ba847fc875af40c9b8395471e7cee234b7364a540556b81a974142c6b3cc24b194bd153dd36d0debc40d859cb924d75faf44b3b0967b23843c1334469b5f2fcd47a14cf935304339f234ea4aff967759841aca8dbd01b834304f7309ee49305f85b8c37aada0501218e338266e97f60b44c1992c393477bc31c97262b54e97be8ca574b0d5ee6ff06ee8e602fcf869f2a6c1169bf91fbc68f4dba03299ee2cc64737e88436e1ab02a9fc27fdc9fe795b9b0f3d9c368e3ce5e1f83a9ac6f42a32b4c221e919bd6783b01886ae64b926bad436de9fef060506287274dbd433c7d930ba66cb264cbc893e62c2cee979c9cd0639feb163317e8179ab5555ac8fc425c086c3419719849efad9ab3b7e093315f5d01c660ab657bfcc412a205218ad9f3871f45d1a75820c244920a5d5f8a48aa21263ade5c527d2e513fc06b4f920a555fbbe070f822c9e22b310728b3e934db4fcb626f973889d1afdb9a1403889e348bd8b0f8c633126e942b6103ff2b1c49c998b989772d784f108dd9ceed2539b175ad8b4a31d7a7f892b387a2cd2cad09f1e259ec71cf22bd3b699131cb38c3c7108771c9649c1cea72518b47c7aa2979eac9c431e7cff3432f488c069b6d6cc70b6f3161bcc296dc44876e9baf4024571cbc79b7812660f8225505edb88bcf0b5ffcd82c1b1b2b0865b1f1e30c6d164f27c6650cbef37cc50610c71abd7e159d419cc360ccc28cc47bda6f750b2ccf7110c0932cc615e4edb2b20765398b0b15905a53fd84ef739e44ebb644b46e9e0d11c9240d7e51727eeecc24bbe581ef507da11fd7dcc784cfe3ad3b7bbdeebf1059b87fa1743445dcc0c6986eb939754a96da88e3f16a2d76b6c09429a06d5a3cd8950de557f1525a7db3f1ecfad4bead013c1f48d5ab037b7fc860273109e9e083a4e8a4b8665d626560fa2296b9081494d3ddbcb2e880a36179d9f4b146c8a7df7028345170f564d3a428bbe2e970578593a68dea36297feb273f258282a489643c61824d9b68104f1d177a8ba8632ccaa7d995b776bf55ec75da43b3db6e4b353eabf7ab4c3919ecd7eb7528cdc8005001275060bc9e175811469a57e6227c3415493bd6c065e50ec36d9f04e4689c1ef917e5ae84d8915687f48dc2e480d7da1bef9686a7dcffd6d4d753d2c03827d38356583529a0653a6724cd9d24328eca9e25801649010b14360164de0dcda574a1e53f8e21ec15b96f6967e124532bad36a558cba0a3261175387dc09c04575942d166073da607e5887561c978e1793fa1fe045d7e9b0d7e693e852fab4b33c271fa3b960ae9f067f2b31907779dc157d648f230171ecb2036db8f319220136fdf12cbd32883c4e2bcae9760725888dda0d61d0b9df3ac7c206b1074c87bc03cc223ed5077224c9f50176227d0885052514bb032f22a96880ff52ccc25776745af2f314c38c51d9c5a16803f512d09d1305f88814998e661cdd438855589f67bff95ff1b6dd1b39bd0412d12f877e6afa47b2986a2f25ce0a655e909af2d6c838fad238944ae60d4e3acfcf70f1a7fc8740d2d0d88d2588ef189090bc2694ba9088dcf80da3df0029a7081b877c1e5696b43884e4e7ef1339b2ba1e41541bb882da58fed990b08c5d7cff7c</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
<category term="跟run哥一起学fuzz" scheme="http://example.com/categories/%E8%B7%9Frun%E5%93%A5%E4%B8%80%E8%B5%B7%E5%AD%A6fuzz/"/>
<category term="论文阅读" scheme="http://example.com/tags/%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB/"/>
</entry>
<entry>
<title>六月份学习计划</title>
<link href="http://example.com/2023/06/09/%E5%85%AD%E6%9C%88%E4%BB%BD%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/"/>
<id>http://example.com/2023/06/09/%E5%85%AD%E6%9C%88%E4%BB%BD%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/</id>
<published>2023-06-09T05:18:32.000Z</published>
<updated>2023-06-13T15:44:03.496Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="2652655e775bdd4f4b3b90661e87ddd7879471d099fca87f72d584b25ab35609">cb320da6677537a61c4c8a60c50f744ca4f762fb8705010db9046ea5ce31496548934f21a74ffd01fbc65f90c1e05249d95800c0c8a8d73644a05b3fc646f9e55c92686c8ce37b2df2cc164d87b8d87e82bb3d27fc7d3984ae8848dd3b7c8d13f75c937188b9561f732af33b8e1d2f0ea73766aec2cae7910b71e0e99154b8247ec5de0e2f3a485b3318889b033cdd61a9acab2fd61fb18c65fcaa9f6ecbeef9edf36c1c55500a72148563a66e1c049acaa4e599b4cd45b4ec72b53aeac02432c4268f862efa04fbe61189cb6a005ec14263eb54471e5e20a01a26197f3b2149395573fe947b1cbb599c620156697708317d71db79f6cde537519e033f4a11cfe409bdd647bd0c4418affb8e8d9bbe21fc2ea4c5341ff425036d7bb0f23177aff46dd0d82078dd214d8581f8422f9070463b2841129c847c28554bbd5864bf53</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
<category term="学习计划" scheme="http://example.com/categories/%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/"/>
<category term="学习计划" scheme="http://example.com/tags/%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/"/>
</entry>
<entry>
<title>跟run哥一起学fuzz00-AFLNET</title>
<link href="http://example.com/2023/06/05/FUZZ%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB00/"/>
<id>http://example.com/2023/06/05/FUZZ%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB00/</id>
<published>2023-06-05T11:08:23.000Z</published>
<updated>2023-07-08T15:14:44.925Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="d95619e3751802b8b2370c285352c1f7d87b9c256c527de2481abac2eba3b89b">cb320da6677537a61c4c8a60c50f744c819c908c6bdb5a2f25e6b4b42cd8b239129ca8d0241a69958fb9980b1eee44fdf772c2c666e3bdb4ca43a9a09ea3222743be2d8a9341031083ad24b3bc4dd817d337ff7f6ac2d8250d1322d3d30f69c7f79718c7e0e9854eb14656a0d004b1afb196ed554720be3eba7a0079ca4dd6460acbf2a201a118d01fa56284a6e7cdca97e056d5dc609a8a2bfb53311ef98c6e839057729438c5a43e7ff30056779a77f9b07fc708e18072375232594abab2a204d1c45c987ef11321e622de301d107eea691ccaa4c7a5facb5882c6965a82080aaa2ec07bfddecd4227d99a03eb428d5bfcb1b2573d4318927de88291ae04612b26341406737cf0cdd9b228efeba047635601747144598cc7ffe0d5856aa13879b5b9eaf701c031502207e1092e514d9b655721fa157252ea51f80db4c18a70e00b1d07879c90f35c399e467d94b9897ce48dcb522c1c387d75ca5377715c0a4d42326c4f20c3244f7198ab95aece86d3cacb3bff866775d21f8bbff190a91f91e506947aafe48ef020c6f9f8cb81239a83630c641324d67a8e72167af7b5874540348dfe8c5ef6f6188f6e0089decb13981778a1d1f0264f5ad6d6041fb94189bd29337dc55b483e2057383e8586ddfe369c8f89a6bff4c2ecfabfcf7793a17f36ceb6ab34f2c9e7c847ff7e3b6edf5a1c87b22837645ae55c654f795b45e86d062c92efe394545909f26f93103f8fd92beaaf52d30f19c92a174fba1297a7d0d2806ad91a0ef9177f380b6e09e217283dbddd696cc35e3d8547f92faf48bfc78faccf4fb13382d3eba5bfc35d7b35c973d62537b3d58101bb7610c4e531ecfd32647a570e24b57a088223a7f1478d6e9b58ee2eda47b1f46920c607d2385755b7e751bd66115b40e33033f8bbab035e46d3282c791a4ff2fc768c6cb224af6a9fb9bb1b2239cad7359e39228e4bdcf2588e88c76bc9799ad0960951457ad856e6df2895bfebbc37bf66eb65051f7320fdb88191c6f5fb9f378b8851246bd47f1b756365db50b3178505326e79a3e406e47370ada28a466b0aa9d16865f7f123ca060496888b225db3750bd4afa7f218af27744703c6fbcce45356c8c6b2767c3b3b99f69cc6f6a8e3dd9084e67192246c7927383308436ce9baa354bf72ebd1078cfdff7927659426629e9b875f0af3fcc94c7c7a2aad18e2510b775e648bd27709f3fbf521f5b3634774022de54803975c5d65f6bb5f68f64035b7db4c695359503fec45a53399cc2ccf7b4bed22977bc8f183bead187c94cb6af49ae83f32415632882529228dd1b672140d3208e6ded85d5f9a6a312c6d641399988326e623f3c4904b5207c2218ee73a8d31cf5127ce5bab6efafed38e86ea7293077064a4ebac03737a963ca291b3f84d207280c02fb3d9ea6a3e05e08eccfc127ddf799542a59eceae07ef9d3d685e7c39f6ebe31e20ef44ae92a924d2d4dbff502730e830a4b7575237c06d0b177aac7b8da4e31751b951426063bb5152f32155e65405d6d9aa2d115b2facb072aee2c8212ba6d73e3da6cca7745cd297d7be4d0e1d48a7787de6c5ee9f2a44dee1d370ede72b149579a09c370b7610decacb7a5334f306cf8868439b8fe7a048c79ad367c6933b958f4b398846d87688118ff31e59f528f3851a9574b65c10c8a04c98cf6793f0d705f2ccbf12828b5f75d69418ef095430303e251f476b08abc04cc878a9400d82d40c160c41068c8c9ddc0fe0e7155f71c108f08c7c8739b45665e9b516a691486bca46f06bd73d899d02f2f2b364c8827e62acef45e5cf1f623c0fc10eb92f3576e3ab544d96cd9d121fbd8c0ada78e05c0953a7cee788e1a41ef63d4ea1fdf2ff2a3f84f32b5f7b8d8e7663096d4e466cea5ebfae6454fc445147d89d4b46e777b23da4da84ceb40f6f43bc4f5731eb099f5a8af7d28c812f08f85211ea7dcd566c6d9ac494e827e0396c1af466343596f49a97e36275a00553493e0a58a16d6477897597d063092ca9e9c808b92b28b5348569123a1791e3c11603cf3289b80736fa892b0611005a98a32cd82dd27f53a3b2a426afed39b445abc1f8e2badd380864d89334210207d24da723cdc322c0e1220c04e962a6f3f32206ea4f841dad7c4f292c6b6bfc5df8f2a8f13829f2707727bfc39de8360e4a248c6c4be2f5e5f9359cc7f13bace6c4f587db677efa1f0f73e4ab7b677d0dbd174c86fcdfd9d6bbbc9b277471a4b94f4f795a84331541704050261cfa7091692079a5f5c9a5d984c7c219c902d854e92e459a2cee0dfc928669d1d21813373885738515b6c8a1a4c30b7ad2e0cd271fca9d4bc2b7a3c674e81da4df410b3359e4da947b60cb0d947a5602ba835e42c23bda1e52df4c90d601ede0f7614dfb5ade7b2bb71e9daa4e0e05a85fccd74b861ec78fd3aba7c027cb778be4efc3069cd51be4315aec85fce6882f0cdae0bf6862935e5574cb96891538740871a19a00880c0c6a69eacd54b3fbfe0a91794d96286cce6227c2d6416d7860fe3f8e531ccb970a27c398e910267157f678337e52f183bb0f09cfc20e79ed74e26ba4919899217db125f5768b026602f5b3845d580699bf221cb29eafbd41b464542be1f16e635c114f36e6e8d7466b7b0f942559e1b7e48b8fcbeba1a1efec9f0939006b21133ae7ad9e91fa12b2940fef95bc1c1805685765ad782d886138c18f807e61adf9c5221be4774619f6c8319e0ec4bed5d15478dbeed8e21417e7546a28e7fa3ee0edfe461bdf36519b657462966d1a209c52fc25c82d82bb1af8898b609b8ec6f2e9e5648c076315e3094d8d7db2ea5ae5fa3c93e8666173a9c917c5a27bfdccebe317313e2e90c6c6664394a58b572729e594a46a8d3b1d595c584614b3161e33d4f72bc5a6b9d5ccb1db873b2df999a05c1cf654a257a55fbb0b6cb77425481fcba22de391a3f58a01650fe2c17516f0d58b53bc4da884c87e55222067c8221a5d4fd92192d29dd1531012cdde389b2a269f33fba160f20f29218260472e5ed190585a9ce6bd2597c2a8c17dd1d8219c7a4901d9d4b58f0824efc918bd36c303356481fa017104e8304c9532b6090f49d1e8f684f3eac76d781a480015dff83b5e1fc3ef96e92280ee147619d23e8af93e6d239bd809210e2d42025cf767cd3badfcae43cfc300adff1e4974a1f02a9312a5c8ada7632a95970072e4978986434f70bf1f45b6185b3ac8aac5e506fa3199480d1179646e33432e559605941898e977f94cb6afb4a250896cd321d50996fedb67b0178392fc6eea5749eb6e701ddbb10d6422bed1ff3d1bd6452c2c38df3060208f5f638bcf4d7585c94b3df7ab321bb2f1998b9fcd4940642b8927b31c774ad73e6f21b4d6e345e275dcde5013f69c23548d502e050b007e75136689313cc39c44dc941a7cb1746fa6376c3710853f1ef1bac91062678b0e93d8beac8fb0e734f089cc012f383b0313fbf68784d224d12d5cc1599e85e24676c23d5a4f6a6f718808ed6465b3d046c594774070ebf4f840ee54b0aa682d2899ee839ce8929f1e90e0dbb078d7b3a6f0b9135e453e36a56025146061db58cf777523539eaf67c37c57b547f99abd7e85419e72d113fe781cc12e459ca084e47255db4b6496bd7f059a0a2072a52dac6a3f1f46f006eccbb94d42b47ec229809b01f6808bcafd086eef0c6af501f60e3e91d1d3d1f09c49d4c73e6b9aa945e0f6831fc7406640bbf66dc311f18ad733fe1ebd2b78065e731d6e662b39729e30cabb17f7147c173b9dcb6be290f6a2b5fcee120f815f1d62a0d643a004082c78d46120719fb23534cd5885892fc672688468ae6803f20319be6bd584b9d7ed538c57a45d0c5f80d3eb73d10cdfa7591150e1c780f02bb92b642342f3e5f53b8b1bfce2f1cfae7a8c83466965673c1dda4c8843d3947e4d6a31f2ca6f19cac4c679f94eff5f58016f44e13c01fd3ab1b68093edde2fd5c3b7b6cf5908676aedf1d4d528b8d5071580b52598d8972ae35c715ceeecaf1324369d333969197280453c9e5fbb44365425dbbc4483066ce39008855ea53a2070e43c7b54073391984ff33d4ddbaf7e185d96596e66ec2f6b89990477f76672a65a9ed9d36636d35d814842c6bae07998336d2367e8ecff38986d20e981a579291c15e858e85c1870a1eb08b3b030fc71c2711df634de3f92d3556632d56fdb92d94a858d837989bc3f0d25413bb444d68e5cd0ab5d3d6b22a97809ce88bb4ec42bfa9d31d6b36fdb3deb6c8e05ac3c5507509aeba1532298972a4ca08fdd172959a33f99fc3b790da124c53dbec7b89fd14f70b6e58030861c68dd995de01d82ec1dbde97f954eef7030d5226905bed794d8a6ca8d43655e91ada4737d6e429c97d939112b185c6576727e6aada5c27b6efa0b048ad869d247f0b50769a10fa7c26f1b3129c516349d08ad645d6afe721ec345fb7fdd106fff735a7e6646c68916e66bb61cfe003a0e9a4b72bfc0960a957dac8064def811a9c2567adc90c5ef4ec44a1e3d4dc23f7a6ae00a9383215af04ef432428f12111ba6fb63c354d6d4e28c175a0a7e474f7213f66769241d7123f910cda93e963dadb24b5bd3b08f280531a4ec3faa4d36d81299f2a2b2068e859ab4168d2fe4177e7171fc8b23c05f651df3763976905022764872b0ce6b408ca49913abcc2d83ad57eed8abf7be2644612db9f08fdaaa309eac16750716d1db383ed5d50fc55dd9fad26a38a116dc31ee4fcb8e63715cf3ed995b4277839cd0e03b2317aabef6c3433d8f6b30988b652b9d1190e763b4ad3afbd94e4ef894aaa0c69209ff264dbf520aa9d30f67707a7a3a71719072c4a57f0f26d4082530503aec74bb7f1fff1732b70f5f301443a352da868fe5082df7e3a00eaf8f1020397975fd1a9cc6945ef8e4ce6853aa190ae0627c01a9d577f470079ffde1c553de690624f7b69c0789f5e30f2be81b717c27f94b96ad9516e81d6a446cfc3f3be1019501bb95eaa1b056457976ffca444c69d6b2975f90b5efe6cd7fe2d7162757227f21bc618e4fcfdc99e7eb5eab908dbc1df36b6ed209a728dfb457125bf37e9ee9a820ad3f3cff9bc7b27e207a8a5573b8e9d245c9d27fca6c1a36a818c51e2baf0901986a1112ccf2219bee1a6462a2cb9dd075d288c03bf5a1c2237689d9b1e50c695e22967062fe3071c9030278a80de6de70312312832d838171554d9635de9f9fb8294ca8c878d98fd6d9a1ccd765defdda02f8b905f399b7436b4c0d24bac88abfae7311cb03203ca5f7cbc01647a302fb0d46dbb058035c1b9c6e4efbf1144947f87917efccbe564fe72d6b1328f18026b67c7d55c264d2e1e6470f9b813df7340294f2ac3a678562e75a135340b644e9f0a1df04e358a5ff2819e9c642e4ce048dbbb857ed26cb95d870b95e5fe91695c380e068ff035f37727ec986ba3eb5c1e4ad4465cb09cdd12ee80e1e7cb8b5dba6c359cca609c59d2686e42a1b3e9b98d87faf314fbcbae85c9c08f8fbe759a71e7aade694a2809288e2708067b80b313831e7c7cc33e18b75f433335f76cd5eae96006d068e917a4be7200a294b5fac92c36e8a3e155e07df21432ba57209753fc30cbcded7a994f5afbd15b617afc9bbdce66559af9a45e14161136c11ed5c4f6fbba94050d0de4a25b0ae2f4e164a90457c94fef434007fde01a41e0477c7732ed2f9368f2d31db26844a6ce67e0d09cec772ea6f390446231e9f794ed6854e33e21d3f31f858bd44529b6eae41ca89c9a95c758cd180c8cdc65bd6ec99f407cb18d4b3d3b073e725808bf18595bd2b668fffea8021355ab55545a6c86ba790907a11a73cef36fa4795947a9e5712b661ea6451fa44014851dd35eeb08e36e21ee4ec545f3d32dd19ff87248fb7f8010858502b26d554438e5f7f9917bebe88b58f57a89f8acf7b000ea176e03656205be5f7729dc141062dff1e940421c1a27bd2d4e1d9f0a4a20aba8c94dafd9c8b7aa0224abfbc249ae558dc9e5cb9fec7bc471c87f766d260570e8306b43a98b85877433bbb196e07d3b3c8d3faeb3f62ea97049a0b1c404ef0acb50ee8e0d7840515a935c21a4e87c21878cf21ca1297f2969ea62f2cc118ee23287b006456cb9d2432f10f5fe5c0197c7bf96880e82ad1cc4a4230f2a80f43b27fa821195b3b648459094bdcf6f4a9acd77cdfb56fb114995ac2bb59b44930a80b310ee8f62c054bf9d7a6bb5199e6d732f302b139f795bf657b29e3b4e1f0196f904d727efdd92f88a0be4509ddf0577ff7edba2b8720797dcde51d28bf3b4694058da3d6c1d8d011c195932dacb20e9f21d4d2726958e9a33d2c3bf931caa85995a9abb3b0c629b8c44b98ba9ab1a2e441292527de533ae09308d74f2367252fbf1350f41aacf1b94a8726ff4aa7f6c9eed37e05147c6f92523037fce410f24a08e919db67a72af17d8ccac8379c35e19a0beda4b4a2b38cf7c600742ba19a054b18269daebf52507b2a46a58dd57b83482313749f854bdf711f49a4be2b9539d297d84c36431fadb6baf4ed745ed02f2246373285e767cf837e4a22916e13834ded43ac244af746dd432372cbb3a8208d38a80944092bfa90f36f3c7577f69f480b1b1639015c8bdae8352558cd9da7fde7ace8dd50b80c690e23ab89c18db52dcf3bf881fdae5dafce4f458461132a7682c6bb44daed4f959edb8640c6d93cd92cd98f2c54d747c81a7bd308c7d31396edb0f0b1a35c4647534b7c277e25ca97b5cde4fdbd10c50f11a7f31fcd2ad58419fc63caee1fa09ad07683d9f9a73d1da342fdc9f0b51a97d38f1dfaa812369f24364523bfd4eeac3f72649a04457526e9299b014af1c40c795c1361840b3c9c729753c3b7f4a7f37d361fc095f081e8497681c0efde7aeedbfbb0b53c3f1598d5fff5a2655b47ebcebe3b0b46b3f7163c36ed7bdb08c77b9596a7221cce11b7f16a826bf8eed4b01da1d0ee180106a81588bc7e3a04a03ca2fc02c9f034de750a5a32fa3f87116fcb4965a748c31f0930b85ca9fe0e1974830cd9d6a5998885e21820b4e2c05c21c2df450ab57d51d6aba3e1e67f92dc4ad4cac5adf424b1b3300492f130386a711df5c35e94a362a5ae6c19e965e8fc5540242822e51423b6ca83bcbddcb66d70b549f875135062b64019316b13118320ee18a8699b7d443669392a4babd58b197e6c4c4312531b798524a0ffc219936ced9e5e26dafb6694586d4af705f6ac297245545414c26f1b83d9a921f4d989f403789306a0f040564003891c33a4e85164876f2378a5ea0f24a178fd86eaa711dbf98e45900ec66b391f1e28666351de5cae676073aea8d73f6e476f86da4712721a4b11fc4de6ad83ec2fd1a5d9a42769f69ffb02ae16b70c30fe3c8fbb944a6be6029673c82f7d3b674df014bb92c106d8818a7c7f8634439a55ace10dbb6851f3bb52557ca4397e82cdea0db7d6a16a0af643cb6f3ac198fb0977c5b1a32e8f71eb5e3f5f73407dd248cf9bcac918a05a373b22607bf4653b844cb755d6e13e311e0e65a8bc46a8ef76994a92fd2c9b8310018824394eec94ca46feb6935c13621feed7c5f7927c60014a7a16ab6aaa2bf970ef95595accb82cd6e3ecf1ff97e8701720af08ae9f68298b94cc8357da9816da8aacfb425ff0b4a9d5640c357dfc2e779ed002025d61dda7843553ec49561d686564c7dc0430ec541eaabc1b65cab158c037aed5e3b9ed999134ac0eca162295ff727d6c0a099554b535bcd96a232dbe47d680a56d05d4527ca03a13eef75bacd4d606332159d2cb336a9df7991e3e010f0357889c772d1be6bab6e5c419f0473978b783e8de7afaeca8a658650e6a43675c6a65fe1406166b4624d024b67b0fbc7a1c841778becd8bc822d0da777f1b7d70320d510c1c0333200d4575eb489f678dcde7f3da8b5021a6bf5a601eecf551e6c1e567c936c7b2e015b53f740c6dcc59054824ca4e7215aed374985fefb58d9817c9f37b0aa840e1e7902e2f72bf18258981a5c1fc91738fc477d1aae0161d421a776632cc5189222cdd1e0cb9a185e3af438278c36d1d61a43a6583d1d70e5da28535bc67fb98088bd46bc4e102ae02a64d1f2954e898d3115eb5a7b1fee6c08501591f0d30a6037bba12400c57ad9ff997cbf155e821f21f5088f1f304e8cdca34249a2eea86559e66dbf3304a32e316ec2622d8371f72bbc8adab6bf1cf3205ee8b5d38cabcb66c90a956c187af5de3ddc5a1edb6ccb172619f3deb0321053af9e4a48e1856026ec99bf678cd6a2f961fc684fe7b06fc0d944f7ab33df8754a92397cf992948a8abd1beba63f8e34eaa43da940be272613990088e47b7efc74afa4573d870488da57af8e4eb5ccb4c79f5d8f7550b6c949ebf45496fad1dc473f9174cf48f91491af0a2633fdff5ae734ef9ee8b18112bba9ca5f8006b0e8ba758fbfe2514d7897936bbd16de00f9b2eea4fa48451e8ab4c7392ac825d34b13938d8faacc54339cf64a477c9e7299ebc583a8754caf4d448342ee89687a1c2392da84442f75a3865b7ef1926d8c8265e0c6efe38684cef951e078c9ab2fcfa777040d0603b939e874a6c24f149b8523372e47556c2f81c21dca10ecf031b3f66803f21ff773ae187a4374345368f57fc74c592561af65d737b41369859d4adfd53a3d5423fb297a62d1cd41b98613636fd20fa0f1c215b4cd1cbcd02ff7bdada306398564fd9e2a24164bb88a1a69c457e4cd9540cdbda867d7d9359eb02679a6f0da376a8b2f29933a4ec355edd2c6f969a49acdbcf17591cdb47e2dcf048ec3e7c7e759c11d201597b81bd2799dd838af41f9c308ace1286866df135bc167b967ff0257d73d7a718224f7761486aae61109185a780f99cce1026373ac373100fbe8c760119fadba1a24547f2d7095119e9172a69d901bcdb587e31494b8a61bfe52adaaf54c7f60f74e845cc8b13d22605fcc3e24f79628c37db026b0636f88c70a51f21837c8c374930e2be2c18f20eccfb05e4fdd659c769a94a571a26533ec7e9e2fcc8ea775f2cf13acf88ea483e1d56f914121721b5b019cf551ea59ffe75afc2cd265fbcdd77fa643d0e7a39395d389aaca84d3730fb0c76ba7cdde5f77e712563a3069a8d65b698a2eb827abbd278603ff8abdaba3fb14b0568479569617203d1d195667b2e9414ef1019e66739244366f100f0fff42070a23f344a1556823df3ab8747e0bfbd09f40cdafe4a4a50774eac10f570f65db99855ce89e697cf8d04568bb44e4f0b363b1269012eaacc602806e407242215d1179fb4f8fdd11b7d99a2143c93014de41ba9fba1aa6b74d2e6a12eb093e4978d423d7bf5ffc4bfd3b57e3d0331ce97b70df45e0501f3fbcf67363bdb8615fbea9555647d22b2b49757b2d92a42ff94b50071d564323ec2277ad9137998fa377ad1bced44b9374e567b69b3e39193374d147b42bb9f79aaf15b92a5774bfec08134c7b223f41edbb16483906976a3866e32363ba0c957256cf4bb983d4acb11f6235f18c7f2c889c119a0146639527dda07ce85c3d91d8aa49dcaaef064bbb35f6eb8fe7acc905fabfa225a143aa8462caa10001f9795d65d07ad4003eab45109b9e94fd0001398c6db4db5160484980e34b9ff37d4f18320568f2a0858f91f6e4459365e294d16505a2928f39ffeeb7790c5da5a631b0466d5860062037e01c84ce5c0e15a29f0df96d4b692ad32cdb79ad84b0fa4948e4c6bb49f961fe451f0394dca50b9d6c82e4cc0ca348b85ceb023fc43799b6872f9819210e578637608360ac7358573f6bcf90ea22cd46aa9bb8068156ca3686b940a037d6d12dcc7046777fd3cab8ea953488c7b348196707e992b21a66ddb034c0e89c1c4d5469de63abcb58b8dd1cb797098c91449a7c27497575c76fd5741daa9cd557e4ed7cea353836f9efea0f073d7f049bf402f5b6b80142a8c40af65ed80ea0e13050b15e71fbe2ecfac56685b31d98d1719d631d08ae4cb1e7ac8ab63fa5a453eef58d2ad969f2484e726879d3d2dc9de74d2a0bb4bddd565a7710b1a7e2b6ad7fd9ac3e40c64d62fa86200102bc96216c1fd12da357516003c27d87c6276952ef215007b998036dcf77c870a0022f03d396c0d7c43847abfc7792d070b2c4eb22f1447ec0d416d76ac2d2491dfe6e149410de1121e5c7febe5cb80f745b554ad67f625f3f53d9afd52113d674b00721406a6e251326b18ec7070c69460a22460989229c7a90b6308493e7622470b28a6d6e25a38a4ddd906ca19c317a2ce9ca78202ff0c471e538b7f54747fdaad4161c08393231814251241d544226bec88922cc58f4707c351ebe1574aa01d67773a26fbae3b0e49f522b4f85b6f3af521ae8aa49268e428100ef186f5eafbe71516ae2fe3879b20d9195509698d7114b68e21a0fb1d11189ec21577c9e89cd5b35bda669e5c163a54a64eab5978fa78a3d520d3eccce52490a76837acfe343e39b5cd3af4a8b6ea71bebee692c087bb50a2b87f0e95f373f0b8aa01e7b71659f07160edb8f4ec10edb1a915bdf47f3a684eba6df255fb2bf643081fea06d2e0840ea89321062aa18e7d686c332c54c388d93bdae13a879f61c4b6835c5c993faa8afada2e468e6b81abcde2408122775a185acb7a0f3522882a1639141a060bae04b662b09164ff46de14dd1dcca4344ffbcdf9cc709a720bc03f1c5536848aacdf1b32eaaf30952799d12fe76fc50b662b48b03f35e886bd8be5dd3edb80e5148d25b8ae1c3ddf37a25dc389082a1b85d6bd0577bd54a01f21fe517b0ec03404c3d39d254398b61bfe7f88ce2ecea6390b9fc141aea4ddc25587f8066171d4fa98ee5d6d255e62da940b3dbfadeaba01ae48c3d0bfb65320e124c08622abc067ed30760325ee07543ac1841ce120a650e07df1a8a3a0a3501f25e6d306cc572a5d3cdcfd6161b3637401dadd2893eda07f29eae8a1f5687579339728878fd00b1080253baad821139dfebb9f8b70fa4487518908cf9dc60477f2641067c3142f77a5c4656003e82bf5ef64bbd521a85b6abed621f22fd61568214442f38d74f83027d177b5e545e95d02ce060a84230009f9eb90ba99273767a854d9bdce91de245e32aca618324e6e5110d8ae5ec06503168c79fe40c7c08f89e4469f7e7d7b771f5a7c9c2c9558a411a5fa4e09714cb4f3315e14de00cf8a8c7dd13a0ec190ab0f5b2702e9bd6366b855540a8f95b1d44e1d5fef8fda84b8be369d1fd85fe36a7e95565bd2cfcc872742ed318e7f7a9480b8c1b340832bf1083efb54c1c12251ab54816ceb24efe3133fe4f0fbdf3139f9f3b3e3fca7aa5a37ca120e4373236f8227b41532de13f6022bf02edcb8ae24408d348ba345ce879cf5501dd2d0c99b451633e42f5a056fe102836276fda1a2f8822daa1b52145af5d2512c280b10000fc827896087a93eec17ef34130bc8da622a66219fdf3096cdc2b53ab78de7a242abe6be1c692569bed7f539159d00209a7b6068ff2958905ce2bfd249b0975dd284a92e0d3d9fc899ff468734094c8dd2e9cdc944a4e910889d5d01116c3530bf14fe105adde64ec6bceea685f1c80349093c41889f945a1b41ec459c01e7bcae5592b80a1d8d8f249b6d0619def8a22bd0105f6f3e31225095b97bca661ed4afe8f17f838119b37fbbac8f723c61d1bf2f3defa22f289639ac58e0a8ebe71b7e733ee0fe5a0444310b1e18733000b7770131fba56d3e46d9e6b05a21a3b6a6e2341ee374f6df48a27aff874b8a311bd5cf968f45ddc6ed0218af71791625780f3cbf459b5747754f1a527205404490257d7ad86e2ba82fe5a3456d971c7033f2ecf7b4df1d44f036627084446cd0733795b93af609e68e6b15d7cd07c76aed7873131390b0721ff8e3c5b682568f5e8c0859bb7132983a2352a17d119ad076c2a2e99f55c3575d1c39fcb960e856aa8f72ca419914025aa252a92dc627d4678aab7c3d333ee54cbae003cb32315d088739cef16fa1143ef649c6ec28c378f354774fa3632640a0a59ee1b775fd927f3bd2f02de507762804a3dfd3fc2c1dcc3bcfbbdd3ca21525792ee1e4079af37377795e497ee17eb44d179de64db1ce31587c00ee75df2885ff90ed7c5bdb55dd04e65e2d36b76bcb831f3d4b3b738212e8b57d154a81801190a76b9f31bfa0f70ba2411d0ca7ac69b4fa9564528e8dd04c319284c1055011336ebfa3b142972e23ce56cafa96c1bf77586a39c13fea7f96c7855949dedf7b76e098c1ceb1b07665cf3f41d43675d1938684bb9ca28770ab9cc411ddfcc4c205fe9e69384776b4436deed056025697f8da34d5320204da1a59d7ac431ca352c300d69a894a49bfde0dcd0d9d32134920ca7ba2298779b0a766eecc288f4050eb3aaf8af9e079b0d268473ca4fae0c2a4e6498ac9a5263ccdb252058480a9977aa5a2cdc8060d63277a5dc5f8e3ec7100e588f4d6c1dcb4ad639ae37abdce06525f962d4e4fd77f8b9f5ba752d7f52d8e129241453e71db81e83a5ba6264b546c301d0334ba146201726907feeb566193e3bde5e2e55fb8229df2558152974d917b5eae4907b952f51b12d3f8da7b5cc77c28cc23ef7c4e534c7bab2e5fbb5f291d2671fb6bdccdeb0d14c53fd3cfb5f54a8da18830fa83ba53ccdc3717319791a818d9df93463c9e8ef0c1bd92b686a0d7b4e60e66758adaec8261030dbc9da82643205a218868c9268087c666929bf32da9e9c3ace341eb6bddfb79bf1da319dd0e6771a84caeb0614251d5b9e5bc82a94f13a5bc405c6e11a1169c7582885ec2988340e2bc58c810b9744aac9db8066b99d6ca486e714328d7b490417a0f73e076d4be4c701416fab7000d402aa6f0cff56437f13b62c384651b73ca340c090fcda26f5acbf05f3148518ed0bf790192941ae93a236535c8b295631c0f4cc9b3b305475dda8fd2672c64e1124b272cc54b7f458c304fe26596a5c6d7abfb7c0ecc75bb963aa42e694734b48b0977e32550c6433c5ca1bff17c2bb28b368f6bf7b2bce2e63a56c82ed800939501e8c413a29487047e301a2aa8e6ee0383354ce955e76af2a1bfb55a5a22443bdd6dd7e49ee195bc702ea7328c934ffbca712c300d43a981b223d1fccac7c6d5abcb8c21012edd6982b0b4cac9e7a4b40400022eba0c884c8163ed3eb94a15f8988700be7e8e3a14b127a51ec19f9f76dac40ac9095c208ce7821646a5efa1104a2da0234e4780eb8d3e8b39a9c78ec114a5869bad20564fd99d97edcd7e8b360d58a80db1fc47a7e144f658b5beb062d4ce66355aab070cf64f1e357c7fadcfdcb5692983d92360575c129081fe8108c2f9322826daf4d9bc19d89cc4012f9b8cbb811a2cae99de4ae4afcfe8c7d37e45a9903beb8c0525ec52c235e9c27b48e2513e4292bb4b007d799618dce18a7877b03a29fac6b04da73be111dd1d1baba0bebfa20b04b036a8ab9abd87cfb6ec0da86e25daca8c00a85274bbdaaadef620a14e5323612c35921d4bb92a2b1db4d29c1f247a9e6ceaf20ff79af564aa0dc3f0ac06568752d237246857eb2151a2de83c5629e29687e276fb39c9a6b5b0d97cbbb24d3854b87e54305a9ea2a3381f0b964311f0baac404e3b2a9de980f25aa07fe355f1dc4b97254f0300ea0693f7fcbbc62beeab5527679d099c19a83f8b12d820d73df89129c8e0468b28d7ebd7a68b0e40cde9b41105f37d09eff04619f32e8da8c9f0c898d0ac7be00505d96cbe14d3adf5c97fe376b139942a48bb24e7f8ec72f7e37a914b7f257e8f924e824c270b6647d22221afb6d6c4dc872b0b6b0187c063deb3375e7f1b948ed8d838a4e62367214d63630b40d821354901a91f4010d3b9f4195a63883f658f19772d0e612ded4ecb057afd4b4b4eba976e2d1fb496225d44942f4ba0a2853d59b1494529b4755ec0e7f32ca98bd1c631e5c8ede06a5b1f2a5973377095612a4fe5560e974dc414ce5c23873f1bbdfd02f92d8c64d3d0f1f31d06fb5fde1592eee99fb6fd865a39962119d5fcb7675f182aeb3c10c9e7681bc465a134a8468e530046d44b1133950af7245ba32f1aa932849ecb9fd2a3b26da7a729e148814e56fb0cc273596f11ec49718fd96f87ce9a4f00c3e7b4d381fc3e267d856b8315f66240058005f70485f7fe5a97f742f4e8fd6374a8ff713d2fda0698b93fc0007fe28e6b5df7dc182b2e2fe1758c048002bdf78ec1fddc58bd57cb7c22fdfa042f3ed5e15a3b7c54bf9c34da5f483a2504142bb173ad9398cc618ba6f136a7f533d86fdcc5487b93041859ce151e6d0acb37f5dc77f6ea3f6464eeaf90b55b12a3f48484ef0e9cb7e817d1f5054f6388caebe0f888d9a28a12ef679c397c0e39a0ae5ec301bb73b310babb5329c6bd1c9fdb3bd4d8bf52d94f71752c80725c0947ce56d45121be18de2030c01fe6f8b291ff694db6ccb0c437159045358b2aeeecc64e21e7f452a2dd46950d40227919a6d58a8d76247819b277be81c6637563d4ca1051a4319a4420481c5b24f38621aa70085540cb23822fb4ca48ebed2d8cc476a283882778b2e309bc47585803b83e08685cd5d3494e221b688cd2ae0b4d2fbc51c49b9f461ada3347042e8fbc07732ea7c5ab3ae472413118b50f21365ef9dca84500ea267eea4e6c021546f6b861072e8cf70e0775617ff7679559590ae3a69d683030bde85013fe9fdab0733f65d08342d6495207b45873a36563353b55e5cce1232ca4dcce9cb0c30da0cad8e8936dcf14d8a26ecc9e08245268b2073a627a4087fc3cb155c51617249a9c511e697f9e8997024628aad317d2e86def6f2d5dc8351f36b0a447bdbd37016505806fbf0c5c8d912b0e9398fac63028b01837e3d598bcb1b455f1e1dca051f8eccdb78970651da7dacf369624ec1b6c3e48323cfb35ab74b7a2a8afd1c5b6f88757f9481c10a34f5a78a285f22e15167c5dfabf6dddb4fd760dc7a9c7f0220086105ec0b92e112f97a2b5be7b25a8ac63bbd9cdfd536d5e2d189aee4a94d7a685c3f09c8a5008bca6d1f9963ca1dbada691651176a9a77a4c3211ea5a102e00895feac7ba0ec43b04462711cfc2f1c80a50b1f9a657582e66f78b6b29f16930620ebed80a5ebbae78806a192c13f68aee8d6818d647da557788c8c640dcd480af7cc15205dcb748a423b345b5a0c948f1781ed432ec988b4f0b9ae55db098a135e34f8192bee44bf730ed4e580060b51c0bc8a8543596e5d4f3cf967e1f1a086876b3b9ab3e6ef93b61e3c83f8d27a2af005cd40494b3f2fff63608f8e1e8cbc13642fc36781bb3fa358b9ab03c4166d2743b13d39b61912dc634bddfe0d24270e62e900ec52d5708087625724d62f0f3544696ab67e02fa9b193be714fb2b124bf102fcc2316106988e80ef3f8e82e6ce915d238cd44ed6b9fc31eb1bf6d12de77d0137d8f5446f8c3e23bb33073e535e6bd2f6e487ddba93f834202d3b2425f1e82858e143ee8ed92c6ef9d1b84f5b905f1f856a5a687041eb6a356827955df48f7fe5e276fa0f77c4623bb27bf9d86dbf5d6f83eb0f3387b61135f19c518f0019225c91f6519d120da2971ff040554ed3bb7da33e93ff6fb1f4027a1d5876f32f2a685bdcf6fa4eedbed9c102d01fd321361601a5b64f2d4c0e26edc80c2923a042e077d57a726a13f196e4777b1be03715db281e79bfb641771a015acd9deba70b39daa35f6de4bb62d30257a0c5023fdc4288020c5c9cd04e0d85e110999</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
<category term="FUZZ" scheme="http://example.com/categories/FUZZ/"/>
<category term="FUZZ" scheme="http://example.com/tags/FUZZ/"/>
</entry>
<entry>
<title>FUZZ101</title>
<link href="http://example.com/2023/05/31/FUZZ101/"/>
<id>http://example.com/2023/05/31/FUZZ101/</id>
<published>2023-05-31T11:07:34.000Z</published>
<updated>2023-06-13T15:42:28.270Z</updated>
<content type="html"><![CDATA[<p>记录学习FUZZ101的学习过程 最近在期末 可能没什么时间更</p><span id="more"></span><h1 id="FUZZ101学习"><a href="#FUZZ101学习" class="headerlink" title="FUZZ101学习"></a>FUZZ101学习</h1><p>搭建fuzz</p><figure class="highlight reasonml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"># 相关依赖</span><br><span class="line">sudo apt-get update</span><br><span class="line">sudo apt-get install -y build-essential python3-dev automake git flex bison libglib2.<span class="number">0</span>-dev libpixman-<span class="number">1</span>-dev python3-setuptools</span><br><span class="line">sudo apt-get install -y lld-<span class="number">11</span> llvm-<span class="number">11</span> llvm-<span class="number">11</span>-dev clang-<span class="number">11</span><span class="operator"> || </span>sudo apt-get install -y lld llvm llvm-dev clang </span><br><span class="line">sudo apt-get install -y gcc-<span class="constructor">$(<span class="params">gcc</span> --<span class="params">version</span>|<span class="params">head</span> -<span class="params">n1</span>|<span class="params">sed</span> '<span class="params">s</span><span class="operator">/</span>.<span class="operator">*</span> <span class="operator">/</span><span class="operator">/</span>'|<span class="params">sed</span> '<span class="params">s</span><span class="operator">/</span>\..<span class="operator">*</span><span class="operator">/</span><span class="operator">/</span>')</span>-plugin-dev libstdc++-<span class="constructor">$(<span class="params">gcc</span> --<span class="params">version</span>|<span class="params">head</span> -<span class="params">n1</span>|<span class="params">sed</span> '<span class="params">s</span><span class="operator">/</span>.<span class="operator">*</span> <span class="operator">/</span><span class="operator">/</span>'|<span class="params">sed</span> '<span class="params">s</span><span class="operator">/</span>\..<span class="operator">*</span><span class="operator">/</span><span class="operator">/</span>')</span>-dev</span><br><span class="line"></span><br><span class="line"># 搭建 Fuzz</span><br><span class="line">cd $HOME</span><br><span class="line">git clone https:<span class="comment">//github.com/AFLplusplus/AFLplusplus && cd AFLplusplus</span></span><br><span class="line">export LLVM_CONFIG=<span class="string">"llvm-config-11"</span></span><br><span class="line">make distrib</span><br><span class="line">sudo make install</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">CC=/home/godrun/AFLplusplus/afl-clang-fast CXX=/home/godrun/AFLplusplus/afl-clang-fast++ ./configure --prefix=<span class="string">"/home/godrun/fuzz/fuzzing_xpdf/install/"</span></span><br><span class="line">make</span><br></pre></td></tr></table></figure><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">afl-fuzz -i <span class="regexp">/home/g</span>odrun<span class="regexp">/fuzz/</span>fuzzing_xpdf<span class="regexp">/pdf_examples/</span> -o <span class="regexp">/home/g</span>odrun<span class="regexp">/fuzz/</span>fuzzing_xpdf<span class="regexp">/out/</span> -s <span class="number">123</span> -- <span class="regexp">/home/g</span>odrun<span class="regexp">/fuzz/</span>fuzzing_xpdf<span class="regexp">/install/</span>bin<span class="regexp">/pdftotext @@ /</span>home<span class="regexp">/godrun/</span>fuzz<span class="regexp">/fuzzing_xpdf/</span>output</span><br></pre></td></tr></table></figure><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="regexp">/home/g</span>odrun<span class="regexp">/fuzz/</span>fuzzing_xpdf<span class="regexp">/install/</span>bin<span class="regexp">/pdftotext '/</span>home<span class="regexp">/godrun/</span>fuzz<span class="regexp">/fuzzing_xpdf/</span>out<span class="regexp">/default/</span>crashes<span class="regexp">/id:000000,sig:11,src:002563+002547,time:1577559,execs:1079596,op:splice,rep:8' /</span>home<span class="regexp">/godrun/</span>fuzz<span class="regexp">/fuzzing_xpdf/</span>output</span><br></pre></td></tr></table></figure><h1 id="FUZZ相关文章"><a href="#FUZZ相关文章" class="headerlink" title="FUZZ相关文章"></a>FUZZ相关文章</h1><p><a href="https://zhuanlan.zhihu.com/p/446308018">论文阅读] 02.清华张超老师Fuzzing总结 - GreyOne: Discover Vulnerabilities with Data Flow Sensitive Fuzzing - 知乎 (zhihu.com)</a></p>]]></content>
<summary type="html"><p>记录学习FUZZ101的学习过程 最近在期末 可能没什么时间更</p></summary>
<category term="FUZZ" scheme="http://example.com/categories/FUZZ/"/>
<category term="FUZZ" scheme="http://example.com/tags/FUZZ/"/>
</entry>
<entry>
<title>ESP32-DEVELOP</title>
<link href="http://example.com/2023/05/30/ESP32-DEVELOP/"/>
<id>http://example.com/2023/05/30/ESP32-DEVELOP/</id>
<published>2023-05-30T14:23:01.000Z</published>
<updated>2023-06-13T15:44:51.490Z</updated>
<content type="html"><![CDATA[<p>30分,水一个报告</p><span id="more"></span><h1 id="实验报告"><a href="#实验报告" class="headerlink" title="实验报告"></a>实验报告</h1><h2 id="心率采集信息价值"><a href="#心率采集信息价值" class="headerlink" title="心率采集信息价值"></a>心率采集信息价值</h2><p>心率采集是一种常见的生理指标监测方法,通过测量心脏每分钟搏动的次数来评估一个人的心脏功能状况。心率采集信息具有重要的价值,对于医学、运动科学和健康管理等领域都具有广泛的应用。以下是对心率采集信息价值的准确、科学的介绍。</p><p>首先,心率采集信息能够提供关于心脏健康状况的重要线索。正常的心率范围是60到100次/分钟,超出这个范围可能意味着心脏存在问题。通过监测心率的变化,医生可以判断是否存在心律不齐、心肌缺血、心肌梗死等心脏疾病,并及时采取相应的治疗措施。此外,心率变异性(HRV)分析也可以提供关于心脏健康状况的有价值信息。HRV指的是心率在不同时间点上的变化程度,较高的HRV通常与较好的心血管健康相关,而较低的HRV可能与心脏疾病风险增加有关。</p><p>其次,心率采集信息在运动科学中具有重要的应用。心率是评估运动强度和耐力的重要指标之一。通过监测运动时的心率变化,可以了解个体的心肺功能状况、运动耐力水平以及运动适应性。运动员、教练员和健身爱好者可以根据心率信息调整训练强度和持续时间,以实现更好的训练效果。此外,心率采集信息还可以用于监测运动后的恢复情况,有助于判断身体对运动的适应程度和疲劳程度,为合理安排训练计划提供依据。</p><p>此外,心率采集信息在健康管理中也具有重要作用。心率的变化可以反映人体对不同情绪、压力和环境的反应。通过监测日常生活中的心率变化,可以评估个体的应激水平和情绪状态。这对于识别和管理压力、焦虑和抑郁等心理健康问题具有帮助</p><h2 id="设备"><a href="#设备" class="headerlink" title="设备"></a>设备</h2><img src="/2023/05/30/ESP32-DEVELOP/Users\10190\Documents\Tencent Files\1019076587\FileRecv\MobileFile\IMG_20230606_132505.jpg" alt="IMG_20230606_132505" style="zoom: 50%;"><p>IDE: Thonny</p><p>硬件: ESP32 、240x240 屏幕 、 USB数据线 、杜邦线-10cm母对母、MAX30102传感器</p><p>固件:</p><p><a href="https://micropython.org/download/esp32/">https://micropython.org/download/esp32/</a></p><img src="/2023/05/30/ESP32-DEVELOP/Users\10190\AppData\Roaming\Typora\typora-user-images\image-20230530222745282.png" alt="image-20230530222745282" style="zoom: 50%;"><h3 id="MAX30102传感器"><a href="#MAX30102传感器" class="headerlink" title="MAX30102传感器"></a>MAX30102传感器</h3><h4 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h4><p>MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。</p><p>它集成了一个红光LED和一个红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。</p><p>MAX30102采用一个1.8V电源和一个独立的5.0V用于内部LED的电源,应用于可穿戴设备进行心率和血氧采集检测,佩戴于手指点耳垂和手腕处。</p><p>标准的I2C兼容的通信接口可以将采集到的数值传输给Arduino、KL25Z、STM32、STC51等单片机进行心率和血氧计算。</p><p>此外,该芯片还可以通过软件关断模块,待机电流接近为零,实现电源始终维持供电状态。</p><h4 id="工作原理"><a href="#工作原理" class="headerlink" title="工作原理"></a>工作原理</h4><p>光溶积法:利用人体组织在血管搏动时造成透光率不同来进行脉搏和血氧饱和度测量</p><p>光源:采用对动脉血中痒合血红蛋白(HbO2)和血红蛋白(Hb)有选择性的特定波长的发光二极管</p><p>透光率转化为电信号:动脉搏动充血容积变化导致这束光的透光率发送改变,此时由光电变换接收经人体组织反射光线,转变为电信号并将其放大输出。</p><p><img src="https://www.guyuehome.com/Uploads/Editor/202301/3d7d0042f67440f891fa561ef5c7f92f.png" alt="在这里插入图片描述"></p><h4 id="电路解析"><a href="#电路解析" class="headerlink" title="电路解析"></a>电路解析</h4><p><strong>主要参数</strong>:</p><table><thead><tr><th>产品名称</th><th>MAX30102 心率模块</th></tr></thead><tbody><tr><td>LED峰值波长器</td><td>660nm/880nm</td></tr><tr><td>LED供电电压</td><td>3.3 ~ 5V</td></tr><tr><td>检测信号类型</td><td>光反射信号(PPG)</td></tr><tr><td>输出信号接口</td><td>I2C接口</td></tr><tr><td>通信接口电压</td><td>1.8 ~ 3.3V ~ 5V(可选)</td></tr></tbody></table><img src="https://www.guyuehome.com/Uploads/Editor/202301/5469a719be8447bc8734c1209340b93f.png" alt="在这里插入图片描述" style="zoom:50%;"><img src="https://www.guyuehome.com/Uploads/Editor/202301/170b842e11f14309ba168db090bb7e86.png" alt="在这里插入图片描述" style="zoom: 67%;"><p><img src="https://www.guyuehome.com/Uploads/Editor/202301/e0fbaa2b8a6942cb939ca0a139a12225.png" alt="在这里插入图片描述"></p><p>引脚说明<br>| 名称 | 管教定义 |<br>| ——- | —————————————————— |<br>| VIN | 电源输入 1.6V-5.5V |<br>| 3位焊盘 | 选择总线的上拉电平,取决于引脚主控电压可选1.8v或者3.3v |<br>| SDA | IIC-SDA |<br>| SCL | IIC-SCL |<br>| GND | 地 |<br>| INT | INT 低电平有效中断(漏极开路)MAX30102 的中断引脚 |<br>| IRD | IR_DRV IR LED阴极和LED驱动器连接点 一般不接 |<br>| RD | R_DRV 红色LED阴极和LED驱动器连接点 一般不接 |</p><h3 id="ESP32开发板"><a href="#ESP32开发板" class="headerlink" title="ESP32开发板"></a>ESP32开发板</h3><p>ESP32开发板是专为ESP32芯片设计的硬件平台,用于简化和加速基于ESP32的应用程序开发。它是一种集成了ESP32芯片、外围电路和连接器的单板电脑。</p><p>ESP32开发板具有丰富的硬件资源,包括数字和模拟GPIO引脚、UART、SPI、I2C接口、PWM输出以及ADC和DAC等功能。它还配备了Wi-Fi和蓝牙天线,使得无线通信变得更加方便。</p><p>ESP32开发板具有广泛的应用领域。由于其强大的无线通信功能,它常被用于物联网(IoT)应用开发,如智能家居、传感器网络、远程监控等。同时,其丰富的硬件接口和高性能处理器也使其成为机器人、自动化系统、嵌入式设备和工业控制等领域的理想选择。</p><p>ESP32开发板的优点还包括低功耗、高性价比和易于使用。它能够在低功耗模式下运行,适用于长时间运行的应用。此外,ESP32开发板的价格相对较低,对于学习和原型开发非常友好。其易于使用的开发环境和丰富的社区支持也为开发者提供了更多便利。</p><p>总之,ESP32开发板是一种功能强大且易于使用的硬件平台,为开发者提供了丰富的资源和灵活性,促进了基于ESP32芯片的应用程序开发和创新。</p><h2 id="电路连接"><a href="#电路连接" class="headerlink" title="电路连接"></a>电路连接</h2><p><img src="https://doc.itprojects.cn/0006.zhishi.esp32/02.doc/assets/1672988334039.png" alt="1672988334039"></p><h2 id="检测心率"><a href="#检测心率" class="headerlink" title="检测心率"></a>检测心率</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> machine <span class="keyword">import</span> sleep, SoftI2C, Pin, Timer</span><br><span class="line"><span class="keyword">from</span> utime <span class="keyword">import</span> ticks_diff, ticks_us</span><br><span class="line"><span class="keyword">from</span> max30102 <span class="keyword">import</span> MAX30102, MAX30105_PULSE_AMP_MEDIUM</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">BEATS = <span class="number">0</span> <span class="comment"># 存储心率</span></span><br><span class="line">FINGER_FLAG = <span class="literal">False</span> <span class="comment"># 默认表示未检测到手指</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">display_info</span>(<span class="params">t</span>):</span><br><span class="line"> <span class="comment"># 如果没有检测到手指,那么就不显示</span></span><br><span class="line"> <span class="keyword">if</span> FINGER_FLAG <span class="keyword">is</span> <span class="literal">False</span>:</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'心率: '</span>, BEATS)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> <span class="keyword">global</span> BEATS, FINGER_FLAG <span class="comment"># 如果需要对全局变量修改,则需要global声明</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 创建I2C对象(检测MAX30102)</span></span><br><span class="line"> i2c = SoftI2C(sda=Pin(<span class="number">15</span>), scl=Pin(<span class="number">2</span>), freq=<span class="number">400000</span>) <span class="comment"># Fast: 400kHz, slow: 100kHz</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 创建传感器对象</span></span><br><span class="line"> sensor = MAX30102(i2c=i2c)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 检测是否有传感器</span></span><br><span class="line"> <span class="keyword">if</span> sensor.i2c_address <span class="keyword">not</span> <span class="keyword">in</span> i2c.scan():</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"没有找到传感器"</span>)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">elif</span> <span class="keyword">not</span> (sensor.check_part_id()):</span><br><span class="line"> <span class="comment"># 检查传感器是否兼容</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"检测到的I2C设备不是MAX30102或者MAX30105"</span>)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"传感器已识别到"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"使用默认配置设置传感器"</span>)</span><br><span class="line"> sensor.setup_sensor()</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 对传感器进行设定</span></span><br><span class="line"> sensor.set_sample_rate(<span class="number">400</span>)</span><br><span class="line"> sensor.set_fifo_average(<span class="number">8</span>)</span><br><span class="line"> sensor.set_active_leds_amplitude(MAX30105_PULSE_AMP_MEDIUM)</span><br><span class="line"></span><br><span class="line"> t_start = ticks_us() <span class="comment"># Starting time of the acquisition</span></span><br><span class="line"></span><br><span class="line"> MAX_HISTORY = <span class="number">32</span></span><br><span class="line"> history = []</span><br><span class="line"> beats_history = []</span><br><span class="line"> beat = <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> sensor.check()</span><br><span class="line"> <span class="keyword">if</span> sensor.available():</span><br><span class="line"> <span class="comment"># FIFO 先进先出,从队列中取数据。都是整形int</span></span><br><span class="line"> red_reading = sensor.pop_red_from_storage()</span><br><span class="line"> ir_reading = sensor.pop_ir_from_storage()</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> red_reading < <span class="number">1000</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'No finger'</span>)</span><br><span class="line"> FINGER_FLAG = <span class="literal">False</span> <span class="comment"># 表示没有放手指</span></span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> FINGER_FLAG = <span class="literal">True</span> <span class="comment"># 表示手指已放</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 计算心率</span></span><br><span class="line"> history.append(red_reading)</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 为了防止列表过大,这里取列表的后32个元素</span></span><br><span class="line"> history = history[-MAX_HISTORY:]</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 提取必要数据</span></span><br><span class="line"> minima, maxima = <span class="built_in">min</span>(history), <span class="built_in">max</span>(history)</span><br><span class="line"> threshold_on = (minima + maxima * <span class="number">3</span>) // <span class="number">4</span> <span class="comment"># 3/4</span></span><br><span class="line"> threshold_off = (minima + maxima) // <span class="number">2</span> <span class="comment"># 1/2</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> beat <span class="keyword">and</span> red_reading > threshold_on:</span><br><span class="line"> beat = <span class="literal">True</span> </span><br><span class="line"> t_us = ticks_diff(ticks_us(), t_start)</span><br><span class="line"> t_s = t_us/<span class="number">1000000</span></span><br><span class="line"> f = <span class="number">1</span>/t_s</span><br><span class="line"> bpm = f * <span class="number">60</span></span><br><span class="line"> <span class="keyword">if</span> bpm < <span class="number">500</span>:</span><br><span class="line"> t_start = ticks_us()</span><br><span class="line"> beats_history.append(bpm) </span><br><span class="line"> beats_history = beats_history[-MAX_HISTORY:] <span class="comment"># 只保留最大30个元素数据</span></span><br><span class="line"> BEATS = <span class="built_in">round</span>(<span class="built_in">sum</span>(beats_history)/<span class="built_in">len</span>(beats_history), <span class="number">2</span>) <span class="comment"># 四舍五入</span></span><br><span class="line"> <span class="keyword">if</span> beat <span class="keyword">and</span> red_reading < threshold_off:</span><br><span class="line"> beat = <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> <span class="comment"># 1. 创建定时器</span></span><br><span class="line"> timer = Timer(<span class="number">1</span>)</span><br><span class="line"> <span class="comment"># 2. 设置定时器的回调函数,每1秒钟调用1次display_info函数(用来显示数据)</span></span><br><span class="line"> timer.init(period=<span class="number">1000</span>, mode=Timer.PERIODIC, callback=display_info)</span><br><span class="line"> <span class="comment"># 3. 调用主程序,用来检测数据</span></span><br><span class="line"> main()</span><br></pre></td></tr></table></figure><h3 id="代码解释"><a href="#代码解释" class="headerlink" title="代码解释"></a>代码解释</h3><p>该代码段主要通过与MAX30102传感器进行通信来检测心率。它使用了Python的machine模块中的一些功能,如定时器和I2C通信。MAX30102传感器是一种可穿戴式生物传感器,能够通过皮肤来检测心率。</p><p>代码的主要逻辑是在一个无限循环中不断检测传感器读数,并进行相关的心率计算。首先,代码会初始化I2C对象和传感器对象,以便与MAX30102传感器进行通信。然后,它会检查传感器是否被正确连接,并设置传感器的一些配置参数,如采样率和活跃LED的幅度。</p><p>在主循环中,代码会检查传感器是否有可用的数据。如果有可用数据,它会从传感器的缓存中读取红光和红外光的读数。然后,代码会判断读数是否超过一个阈值,以确定是否有手指放置在传感器上。如果读数低于阈值,则表示没有检测到手指;反之,表示手指已放置。</p><p>接下来,代码会将红光读数存储到一个历史列表中,并通过保留列表的最后32个元素来控制列表的长度。然后,代码会计算历史列表中的最小值和最大值,并根据这些值计算出心率的阈值。</p><p>代码会检查当前的心跳状态,并根据红光读数和阈值的比较来确定是否有心跳事件发生。如果检测到心跳开始,则计算心跳的频率和心率,并将计算结果添加到心率历史列表中。心率历史列表的长度被限制在最大30个元素,以保持数据的有效性。最后,代码会通过定时器每秒调用一次<code>display_info</code>函数来显示心率。</p><h2 id="检测血氧、温度"><a href="#检测血氧、温度" class="headerlink" title="检测血氧、温度"></a>检测血氧、温度</h2><h3 id="检测血氧值代码模块"><a href="#检测血氧值代码模块" class="headerlink" title="检测血氧值代码模块"></a>检测血氧值代码模块</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -*-coding:utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 25 samples per second (in algorithm.h)</span></span><br><span class="line">SAMPLE_FREQ = <span class="number">25</span></span><br><span class="line"><span class="comment"># taking moving average of 4 samples when calculating HR</span></span><br><span class="line"><span class="comment"># in algorithm.h, "DONOT CHANGE" comment is attached</span></span><br><span class="line">MA_SIZE = <span class="number">4</span></span><br><span class="line"><span class="comment"># sampling frequency * 4 (in algorithm.h)</span></span><br><span class="line">BUFFER_SIZE = <span class="number">100</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># this assumes ir_data and red_data as np.array</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">calc_hr_and_spo2</span>(<span class="params">ir_data, red_data</span>):</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> By detecting peaks of PPG cycle and corresponding AC/DC</span></span><br><span class="line"><span class="string"> of red/infra-red signal, the an_ratio for the SPO2 is computed.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="comment"># get dc mean</span></span><br><span class="line"> ir_mean = <span class="built_in">int</span>(<span class="built_in">sum</span>(ir_data) / <span class="built_in">len</span>(ir_data))</span><br><span class="line"></span><br><span class="line"> <span class="comment"># remove DC mean and inver signal</span></span><br><span class="line"> <span class="comment"># this lets peak detecter detect valley</span></span><br><span class="line"> x = [ir_mean - x <span class="keyword">for</span> x <span class="keyword">in</span> ir_data]</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 4 point moving average</span></span><br><span class="line"> <span class="comment"># x is np.array with int values, so automatically casted to int</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(x) - MA_SIZE):</span><br><span class="line"> x[i] = <span class="built_in">sum</span>(x[i:i + MA_SIZE]) / MA_SIZE</span><br><span class="line"></span><br><span class="line"> <span class="comment"># calculate threshold</span></span><br><span class="line"> n_th = <span class="built_in">int</span>(<span class="built_in">sum</span>(x) / <span class="built_in">len</span>(x))</span><br><span class="line"> n_th = <span class="number">30</span> <span class="keyword">if</span> n_th < <span class="number">30</span> <span class="keyword">else</span> n_th <span class="comment"># min allowed</span></span><br><span class="line"> n_th = <span class="number">60</span> <span class="keyword">if</span> n_th > <span class="number">60</span> <span class="keyword">else</span> n_th <span class="comment"># max allowed</span></span><br><span class="line"></span><br><span class="line"> ir_valley_locs, n_peaks = find_peaks(x, BUFFER_SIZE, n_th, <span class="number">4</span>, <span class="number">15</span>)</span><br><span class="line"> <span class="comment"># print(ir_valley_locs[:n_peaks], ",", end="")</span></span><br><span class="line"> peak_interval_sum = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> n_peaks >= <span class="number">2</span>:</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, n_peaks):</span><br><span class="line"> peak_interval_sum += (ir_valley_locs[i] - ir_valley_locs[i - <span class="number">1</span>])</span><br><span class="line"> peak_interval_sum = <span class="built_in">int</span>(peak_interval_sum / (n_peaks - <span class="number">1</span>))</span><br><span class="line"> hr = <span class="built_in">int</span>(SAMPLE_FREQ * <span class="number">60</span> / peak_interval_sum)</span><br><span class="line"> hr_valid = <span class="literal">True</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> hr = -<span class="number">999</span> <span class="comment"># unable to calculate because # of peaks are too small</span></span><br><span class="line"> hr_valid = <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># ---------spo2---------</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># find precise min near ir_valley_locs (???)</span></span><br><span class="line"> exact_ir_valley_locs_count = n_peaks</span><br><span class="line"></span><br><span class="line"> <span class="comment"># find ir-red DC and ir-red AC for SPO2 calibration ratio</span></span><br><span class="line"> <span class="comment"># find AC/DC maximum of raw</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># <span class="doctag">FIXME:</span> needed??</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(exact_ir_valley_locs_count):</span><br><span class="line"> <span class="keyword">if</span> ir_valley_locs[i] > BUFFER_SIZE:</span><br><span class="line"> spo2 = -<span class="number">999</span> <span class="comment"># do not use SPO2 since valley loc is out of range</span></span><br><span class="line"> spo2_valid = <span class="literal">False</span></span><br><span class="line"> <span class="keyword">return</span> hr, hr_valid, spo2, spo2_valid</span><br><span class="line"></span><br><span class="line"> i_ratio_count = <span class="number">0</span></span><br><span class="line"> ratio = []</span><br><span class="line"></span><br><span class="line"> <span class="comment"># find max between two valley locations</span></span><br><span class="line"> <span class="comment"># and use ratio between AC component of Ir and Red DC component of Ir and Red for SpO2</span></span><br><span class="line"> red_dc_max_index = -<span class="number">1</span></span><br><span class="line"> ir_dc_max_index = -<span class="number">1</span></span><br><span class="line"> <span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(exact_ir_valley_locs_count - <span class="number">1</span>):</span><br><span class="line"> red_dc_max = -<span class="number">16777216</span></span><br><span class="line"> ir_dc_max = -<span class="number">16777216</span></span><br><span class="line"> <span class="keyword">if</span> ir_valley_locs[k + <span class="number">1</span>] - ir_valley_locs[k] > <span class="number">3</span>:</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(ir_valley_locs[k], ir_valley_locs[k + <span class="number">1</span>]):</span><br><span class="line"> <span class="keyword">if</span> ir_data[i] > ir_dc_max:</span><br><span class="line"> ir_dc_max = ir_data[i]</span><br><span class="line"> ir_dc_max_index = i</span><br><span class="line"> <span class="keyword">if</span> red_data[i] > red_dc_max:</span><br><span class="line"> red_dc_max = red_data[i]</span><br><span class="line"> red_dc_max_index = i</span><br><span class="line"></span><br><span class="line"> red_ac = <span class="built_in">int</span>((red_data[ir_valley_locs[k + <span class="number">1</span>]] - red_data[ir_valley_locs[k]]) * (red_dc_max_index - ir_valley_locs[k]))</span><br><span class="line"> red_ac = red_data[ir_valley_locs[k]] + <span class="built_in">int</span>(red_ac / (ir_valley_locs[k + <span class="number">1</span>] - ir_valley_locs[k]))</span><br><span class="line"> red_ac = red_data[red_dc_max_index] - red_ac <span class="comment"># subtract linear DC components from raw</span></span><br><span class="line"></span><br><span class="line"> ir_ac = <span class="built_in">int</span>((ir_data[ir_valley_locs[k + <span class="number">1</span>]] - ir_data[ir_valley_locs[k]]) * (ir_dc_max_index - ir_valley_locs[k]))</span><br><span class="line"> ir_ac = ir_data[ir_valley_locs[k]] + <span class="built_in">int</span>(ir_ac / (ir_valley_locs[k + <span class="number">1</span>] - ir_valley_locs[k]))</span><br><span class="line"> ir_ac = ir_data[ir_dc_max_index] - ir_ac <span class="comment"># subtract linear DC components from raw</span></span><br><span class="line"></span><br><span class="line"> nume = red_ac * ir_dc_max</span><br><span class="line"> denom = ir_ac * red_dc_max</span><br><span class="line"> <span class="keyword">if</span> (denom > <span class="number">0</span> <span class="keyword">and</span> i_ratio_count < <span class="number">5</span>) <span class="keyword">and</span> nume != <span class="number">0</span>:</span><br><span class="line"> <span class="comment"># original cpp implementation uses overflow intentionally.</span></span><br><span class="line"> <span class="comment"># but at 64-bit OS, Pyhthon 3.X uses 64-bit int and nume*100/denom does not trigger overflow</span></span><br><span class="line"> <span class="comment"># so using bit operation ( &0xffffffff ) is needed</span></span><br><span class="line"> ratio.append(<span class="built_in">int</span>(((nume * <span class="number">100</span>) & <span class="number">0xffffffff</span>) / denom))</span><br><span class="line"> i_ratio_count += <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># choose median value since PPG signal may vary from beat to beat</span></span><br><span class="line"> ratio = <span class="built_in">sorted</span>(ratio) <span class="comment"># sort to ascending order</span></span><br><span class="line"> mid_index = <span class="built_in">int</span>(i_ratio_count / <span class="number">2</span>)</span><br><span class="line"></span><br><span class="line"> ratio_ave = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> mid_index > <span class="number">1</span>:</span><br><span class="line"> ratio_ave = <span class="built_in">int</span>((ratio[mid_index - <span class="number">1</span>] + ratio[mid_index]) / <span class="number">2</span>)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(ratio) != <span class="number">0</span>:</span><br><span class="line"> ratio_ave = ratio[mid_index]</span><br><span class="line"></span><br><span class="line"> <span class="comment"># why 184?</span></span><br><span class="line"> <span class="comment"># print("ratio average: ", ratio_ave)</span></span><br><span class="line"> <span class="keyword">if</span> ratio_ave > <span class="number">2</span> <span class="keyword">and</span> ratio_ave < <span class="number">184</span>:</span><br><span class="line"> <span class="comment"># -45.060 * ratioAverage * ratioAverage / 10000 + 30.354 * ratioAverage / 100 + 94.845</span></span><br><span class="line"> spo2 = -<span class="number">45.060</span> * (ratio_ave ** <span class="number">2</span>) / <span class="number">10000.0</span> + <span class="number">30.054</span> * ratio_ave / <span class="number">100.0</span> + <span class="number">94.845</span></span><br><span class="line"> spo2_valid = <span class="literal">True</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> spo2 = -<span class="number">999</span></span><br><span class="line"> spo2_valid = <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> hr - <span class="number">20</span>, hr_valid, spo2, spo2_valid</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">find_peaks</span>(<span class="params">x, size, min_height, min_dist, max_num</span>):</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Find at most MAX_NUM peaks above MIN_HEIGHT separated by at least MIN_DISTANCE</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> ir_valley_locs, n_peaks = find_peaks_above_min_height(x, size, min_height, max_num)</span><br><span class="line"> ir_valley_locs, n_peaks = remove_close_peaks(n_peaks, ir_valley_locs, x, min_dist)</span><br><span class="line"></span><br><span class="line"> n_peaks = <span class="built_in">min</span>([n_peaks, max_num])</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> ir_valley_locs, n_peaks</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">find_peaks_above_min_height</span>(<span class="params">x, size, min_height, max_num</span>):</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Find all peaks above MIN_HEIGHT</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"></span><br><span class="line"> i = <span class="number">0</span></span><br><span class="line"> n_peaks = <span class="number">0</span></span><br><span class="line"> ir_valley_locs = [] <span class="comment"># [0 for i in range(max_num)]</span></span><br><span class="line"> <span class="keyword">while</span> i < size - <span class="number">1</span>:</span><br><span class="line"> <span class="keyword">if</span> x[i] > min_height <span class="keyword">and</span> x[i] > x[i - <span class="number">1</span>]: <span class="comment"># find the left edge of potential peaks</span></span><br><span class="line"> n_width = <span class="number">1</span></span><br><span class="line"> <span class="comment"># original condition i+n_width < size may cause IndexError</span></span><br><span class="line"> <span class="comment"># so I changed the condition to i+n_width < size - 1</span></span><br><span class="line"> <span class="keyword">while</span> i + n_width < size - <span class="number">1</span> <span class="keyword">and</span> x[i] == x[i + n_width]: <span class="comment"># find flat peaks</span></span><br><span class="line"> n_width += <span class="number">1</span></span><br><span class="line"> <span class="keyword">if</span> x[i] > x[i + n_width] <span class="keyword">and</span> n_peaks < max_num: <span class="comment"># find the right edge of peaks</span></span><br><span class="line"> <span class="comment"># ir_valley_locs[n_peaks] = i</span></span><br><span class="line"> ir_valley_locs.append(i)</span><br><span class="line"> n_peaks += <span class="number">1</span> <span class="comment"># original uses post increment</span></span><br><span class="line"> i += n_width + <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> i += n_width</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> i += <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> ir_valley_locs, n_peaks</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">remove_close_peaks</span>(<span class="params">n_peaks, ir_valley_locs, x, min_dist</span>):</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Remove peaks separated by less than MIN_DISTANCE</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># should be equal to maxim_sort_indices_descend</span></span><br><span class="line"> <span class="comment"># order peaks from large to small</span></span><br><span class="line"> <span class="comment"># should ignore index:0</span></span><br><span class="line"> sorted_indices = <span class="built_in">sorted</span>(ir_valley_locs, key=<span class="keyword">lambda</span> i: x[i])</span><br><span class="line"> sorted_indices.reverse()</span><br><span class="line"></span><br><span class="line"> <span class="comment"># this "for" loop expression does not check finish condition</span></span><br><span class="line"> <span class="comment"># for i in range(-1, n_peaks):</span></span><br><span class="line"> i = -<span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> i < n_peaks:</span><br><span class="line"> old_n_peaks = n_peaks</span><br><span class="line"> n_peaks = i + <span class="number">1</span></span><br><span class="line"> <span class="comment"># this "for" loop expression does not check finish condition</span></span><br><span class="line"> <span class="comment"># for j in (i + 1, old_n_peaks):</span></span><br><span class="line"> j = i + <span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> j < old_n_peaks:</span><br><span class="line"> n_dist = (sorted_indices[j] - sorted_indices[i]) <span class="keyword">if</span> i != -<span class="number">1</span> <span class="keyword">else</span> (sorted_indices[j] + <span class="number">1</span>) <span class="comment"># lag-zero peak of autocorr is at index -1</span></span><br><span class="line"> <span class="keyword">if</span> n_dist > min_dist <span class="keyword">or</span> n_dist < -<span class="number">1</span> * min_dist:</span><br><span class="line"> sorted_indices[n_peaks] = sorted_indices[j]</span><br><span class="line"> n_peaks += <span class="number">1</span> <span class="comment"># original uses post increment</span></span><br><span class="line"> j += <span class="number">1</span></span><br><span class="line"> i += <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> sorted_indices[:n_peaks] = <span class="built_in">sorted</span>(sorted_indices[:n_peaks])</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> sorted_indices, n_peaks</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line"> hr, hrb, sp, spb = calc_hr_and_spo2([<span class="number">12853</span>, <span class="number">15573</span>, <span class="number">15580</span>, <span class="number">15586</span>, <span class="number">15587</span>, <span class="number">15567</span>, <span class="number">15520</span>, <span class="number">15480</span>, <span class="number">15464</span>, <span class="number">15460</span>, <span class="number">15462</span>, <span class="number">15466</span>, <span class="number">15473</span>, <span class="number">15479</span>, <span class="number">15485</span>, <span class="number">15490</span>, <span class="number">15495</span>, <span class="number">15503</span>, <span class="number">15512</span>, <span class="number">15518</span>, <span class="number">15521</span>, <span class="number">15521</span>, <span class="number">15518</span>, <span class="number">15517</span>, <span class="number">15522</span>, <span class="number">15527</span>, <span class="number">15536</span>, <span class="number">15547</span>, <span class="number">15558</span>, <span class="number">15568</span>, <span class="number">15577</span>, <span class="number">15587</span>, <span class="number">15594</span>, <span class="number">15604</span>, <span class="number">15610</span>, <span class="number">15616</span>, <span class="number">15620</span>, <span class="number">15624</span>, <span class="number">15625</span>, <span class="number">15615</span>, <span class="number">15576</span>, <span class="number">15531</span>, <span class="number">15508</span>, <span class="number">15500</span>, <span class="number">15502</span>, <span class="number">15509</span>, <span class="number">15516</span>, <span class="number">15523</span>, <span class="number">15528</span>, <span class="number">15533</span>, <span class="number">15538</span>, <span class="number">15547</span>, <span class="number">15556</span>, <span class="number">15564</span>, <span class="number">15564</span>, <span class="number">15560</span>, <span class="number">15556</span>, <span class="number">15556</span>, <span class="number">15559</span>, <span class="number">15564</span>, <span class="number">15570</span>, <span class="number">15579</span>, <span class="number">15588</span>, <span class="number">15599</span>, <span class="number">15610</span>, <span class="number">15619</span>, <span class="number">15628</span>, <span class="number">15635</span>, <span class="number">15642</span>, <span class="number">15649</span>, <span class="number">15655</span>, <span class="number">15662</span>, <span class="number">15669</span>, <span class="number">15672</span>, <span class="number">15661</span>, <span class="number">15621</span>, <span class="number">15571</span>, <span class="number">15546</span>, <span class="number">15537</span>, <span class="number">15538</span>, <span class="number">15545</span>, <span class="number">15553</span>, <span class="number">15560</span>, <span class="number">15565</span>, <span class="number">15570</span>, <span class="number">15577</span>, <span class="number">15585</span>, <span class="number">15593</span>, <span class="number">15600</span>, <span class="number">15601</span>, <span class="number">15597</span>, <span class="number">15592</span>, <span class="number">15591</span>, <span class="number">15594</span>, <span class="number">15600</span>, <span class="number">15608</span>, <span class="number">15617</span>, <span class="number">15626</span>, <span class="number">15633</span>, <span class="number">15640</span>], [<span class="number">12258</span>, <span class="number">14318</span>, <span class="number">14322</span>, <span class="number">14324</span>, <span class="number">14326</span>, <span class="number">14317</span>, <span class="number">14299</span>, <span class="number">14284</span>, <span class="number">14280</span>, <span class="number">14279</span>, <span class="number">14280</span>, <span class="number">14283</span>, <span class="number">14285</span>, <span class="number">14288</span>, <span class="number">14292</span>, <span class="number">14294</span>, <span class="number">14297</span>, <span class="number">14299</span>, <span class="number">14302</span>, <span class="number">14304</span>, <span class="number">14305</span>, <span class="number">14305</span>, <span class="number">14304</span>, <span class="number">14304</span>, <span class="number">14306</span>, <span class="number">14308</span>, <span class="number">14311</span>, <span class="number">14316</span>, <span class="number">14321</span>, <span class="number">14325</span>, <span class="number">14329</span>, <span class="number">14333</span>, <span class="number">14329</span>, <span class="number">14329</span>, <span class="number">14332</span>, <span class="number">14335</span>, <span class="number">14336</span>, <span class="number">14338</span>, <span class="number">14338</span>, <span class="number">14333</span>, <span class="number">14315</span>, <span class="number">14295</span>, <span class="number">14286</span>, <span class="number">14283</span>, <span class="number">14285</span>, <span class="number">14288</span>, <span class="number">14292</span>, <span class="number">14295</span>, <span class="number">14297</span>, <span class="number">14298</span>, <span class="number">14301</span>, <span class="number">14305</span>, <span class="number">14309</span>, <span class="number">14312</span>, <span class="number">14312</span>, <span class="number">14310</span>, <span class="number">14308</span>, <span class="number">14308</span>, <span class="number">14309</span>, <span class="number">14312</span>, <span class="number">14315</span>, <span class="number">14318</span>, <span class="number">14322</span>, <span class="number">14327</span>, <span class="number">14332</span>, <span class="number">14336</span>, <span class="number">14341</span>, <span class="number">14344</span>, <span class="number">14347</span>, <span class="number">14350</span>, <span class="number">14351</span>, <span class="number">14354</span>, <span class="number">14357</span>, <span class="number">14359</span>, <span class="number">14353</span>, <span class="number">14335</span>, <span class="number">14313</span>, <span class="number">14304</span>, <span class="number">14300</span>, <span class="number">14302</span>, <span class="number">14305</span>, <span class="number">14309</span>, <span class="number">14312</span>, <span class="number">14314</span>, <span class="number">14316</span>, <span class="number">14319</span>, <span class="number">14323</span>, <span class="number">14326</span>, <span class="number">14329</span>, <span class="number">14329</span>, <span class="number">14326</span>, <span class="number">14325</span>, <span class="number">14324</span>, <span class="number">14326</span>, <span class="number">14328</span>, <span class="number">14332</span>, <span class="number">14336</span>, <span class="number">14341</span>, <span class="number">14345</span>, <span class="number">14349</span>])</span><br><span class="line"></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"hr detected:"</span>, hrb)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"sp detected:"</span>, spb)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (hrb == <span class="literal">True</span> <span class="keyword">and</span> hr != -<span class="number">999</span>):</span><br><span class="line"> hr2 = <span class="built_in">int</span>(hr)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"Heart Rate : "</span>, hr2)</span><br><span class="line"> <span class="keyword">if</span> (spb == <span class="literal">True</span> <span class="keyword">and</span> sp != -<span class="number">999</span>):</span><br><span class="line"> sp2 = <span class="built_in">int</span>(sp)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"SPO2 : "</span>, sp2)</span><br></pre></td></tr></table></figure><h4 id="代码解释-1"><a href="#代码解释-1" class="headerlink" title="代码解释"></a>代码解释</h4><p>这段代码实现了计算心率(Heart Rate)和血氧饱和度(SpO2)的算法。它接受红外(IR)信号和红色(Red)信号作为输入,通过检测心率周期的峰值和对应的红外和红色信号的交流/直流成分,计算出血氧饱和度的比值(SPO2)。以下是代码的主要步骤:</p><ol><li>计算红外信号的直流均值。</li><li>对红外信号进行去直流均值并翻转信号,以便检测谷值。</li><li>使用4点移动平均对信号进行平滑处理。</li><li>计算阈值,阈值的值为信号的平均值,限制在30和60之间。</li><li>使用峰值检测算法找到红外信号的谷值位置。</li><li>计算心率,通过计算峰值之间的间隔时间来估算心率。</li><li>寻找与红外信号谷值位置相邻的最大值,以及计算红色信号的直流和交流成分,用于血氧饱和度校准比率的计算。</li><li>计算血氧饱和度的值,使用血氧饱和度校准比率和峰值比率的公式计算。</li><li>返回心率、心率有效性、血氧饱和度和血氧饱和度有效性。</li></ol><h3 id="血氧和温度检测代码"><a href="#血氧和温度检测代码" class="headerlink" title="血氧和温度检测代码"></a>血氧和温度检测代码</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> machine <span class="keyword">import</span> sleep, SoftI2C, Pin, Timer</span><br><span class="line"><span class="keyword">from</span> utime <span class="keyword">import</span> ticks_diff, ticks_us</span><br><span class="line"><span class="keyword">from</span> max30102 <span class="keyword">import</span> MAX30102, MAX30105_PULSE_AMP_MEDIUM</span><br><span class="line"><span class="keyword">from</span> hrcalc <span class="keyword">import</span> calc_hr_and_spo2</span><br><span class="line"></span><br><span class="line">BEATS = <span class="number">0</span> <span class="comment"># 存储心率</span></span><br><span class="line">FINGER_FLAG = <span class="literal">False</span> <span class="comment"># 默认表示未检测到手指</span></span><br><span class="line">SPO2 = <span class="number">0</span> <span class="comment"># 存储血氧</span></span><br><span class="line">TEMPERATURE = <span class="number">0</span> <span class="comment"># 存储温度</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">display_info</span>(<span class="params">t</span>):</span><br><span class="line"> <span class="comment"># 如果没有检测到手指,那么就不显示</span></span><br><span class="line"> <span class="keyword">if</span> FINGER_FLAG <span class="keyword">is</span> <span class="literal">False</span>:</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'心率: '</span>, BEATS, <span class="string">" 血氧:"</span>, SPO2, <span class="string">" 温度:"</span>, TEMPERATURE)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> <span class="keyword">global</span> BEATS, FINGER_FLAG, SPO2, TEMPERATURE <span class="comment"># 如果需要对全局变量修改,则需要global声明</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 创建I2C对象(检测MAX30102)</span></span><br><span class="line"> i2c = SoftI2C(sda=Pin(<span class="number">15</span>), scl=Pin(<span class="number">2</span>), freq=<span class="number">400000</span>) <span class="comment"># Fast: 400kHz, slow: 100kHz</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 创建传感器对象</span></span><br><span class="line"> sensor = MAX30102(i2c=i2c)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 检测是否有传感器</span></span><br><span class="line"> <span class="keyword">if</span> sensor.i2c_address <span class="keyword">not</span> <span class="keyword">in</span> i2c.scan():</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"没有找到传感器"</span>)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">elif</span> <span class="keyword">not</span> (sensor.check_part_id()):</span><br><span class="line"> <span class="comment"># 检查传感器是否兼容</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"检测到的I2C设备不是MAX30102或者MAX30105"</span>)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"传感器已识别到"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 配置</span></span><br><span class="line"> sensor.setup_sensor()</span><br><span class="line"> sensor.set_sample_rate(<span class="number">400</span>)</span><br><span class="line"> sensor.set_fifo_average(<span class="number">8</span>)</span><br><span class="line"> sensor.set_active_leds_amplitude(MAX30105_PULSE_AMP_MEDIUM)</span><br><span class="line"></span><br><span class="line"> t_start = ticks_us() <span class="comment"># Starting time of the acquisition</span></span><br><span class="line"></span><br><span class="line"> MAX_HISTORY = <span class="number">32</span></span><br><span class="line"> history = []</span><br><span class="line"> beats_history = []</span><br><span class="line"> beat = <span class="literal">False</span></span><br><span class="line"> red_list = []</span><br><span class="line"> ir_list = []</span><br><span class="line"></span><br><span class="line"> <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> sensor.check()</span><br><span class="line"> <span class="keyword">if</span> sensor.available():</span><br><span class="line"> <span class="comment"># FIFO 先进先出,从队列中取数据。都是整形int</span></span><br><span class="line"> red_reading = sensor.pop_red_from_storage()</span><br><span class="line"> ir_reading = sensor.pop_ir_from_storage()</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> red_reading < <span class="number">1000</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'No finger'</span>)</span><br><span class="line"> FINGER_FLAG = <span class="literal">False</span> <span class="comment"># 表示没有放手指</span></span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> FINGER_FLAG = <span class="literal">True</span> <span class="comment"># 表示手指已放</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 计算心率</span></span><br><span class="line"> history.append(red_reading)</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 为了防止列表过大,这里取列表的后32个元素</span></span><br><span class="line"> history = history[-MAX_HISTORY:]</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 提取必要数据</span></span><br><span class="line"> minima, maxima = <span class="built_in">min</span>(history), <span class="built_in">max</span>(history)</span><br><span class="line"> threshold_on = (minima + maxima * <span class="number">3</span>) // <span class="number">4</span> <span class="comment"># 3/4</span></span><br><span class="line"> threshold_off = (minima + maxima) // <span class="number">2</span> <span class="comment"># 1/2</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> beat <span class="keyword">and</span> red_reading > threshold_on:</span><br><span class="line"> beat = <span class="literal">True</span> </span><br><span class="line"> t_us = ticks_diff(ticks_us(), t_start)</span><br><span class="line"> t_s = t_us/<span class="number">1000000</span></span><br><span class="line"> f = <span class="number">1</span>/t_s</span><br><span class="line"> bpm = f * <span class="number">60</span></span><br><span class="line"> <span class="keyword">if</span> bpm < <span class="number">500</span>:</span><br><span class="line"> t_start = ticks_us()</span><br><span class="line"> beats_history.append(bpm) </span><br><span class="line"> beats_history = beats_history[-MAX_HISTORY:] <span class="comment"># 只保留最大30个元素数据</span></span><br><span class="line"> BEATS = <span class="built_in">round</span>(<span class="built_in">sum</span>(beats_history)/<span class="built_in">len</span>(beats_history), <span class="number">2</span>) <span class="comment"># 四舍五入</span></span><br><span class="line"> <span class="keyword">if</span> beat <span class="keyword">and</span> red_reading < threshold_off:</span><br><span class="line"> beat = <span class="literal">False</span></span><br><span class="line"> <span class="comment"># 计算血氧</span></span><br><span class="line"> red_list.append(red_reading)</span><br><span class="line"> ir_list.append(ir_reading)</span><br><span class="line"> <span class="comment"># 最多 只保留最新的100个</span></span><br><span class="line"> red_list = red_list[-<span class="number">100</span>:]</span><br><span class="line"> ir_list = ir_list[-<span class="number">100</span>:]</span><br><span class="line"> <span class="comment"># 计算血氧值</span></span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(red_list) == <span class="number">100</span> <span class="keyword">and</span> <span class="built_in">len</span>(ir_list) == <span class="number">100</span>:</span><br><span class="line"> hr, hrb, sp, spb = calc_hr_and_spo2(red_list, ir_list)</span><br><span class="line"> <span class="keyword">if</span> hrb <span class="keyword">is</span> <span class="literal">True</span> <span class="keyword">and</span> spb <span class="keyword">is</span> <span class="literal">True</span>:</span><br><span class="line"> <span class="keyword">if</span> sp != -<span class="number">999</span>:</span><br><span class="line"> SPO2 = <span class="built_in">int</span>(sp)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 计算温度</span></span><br><span class="line"> TEMPERATURE = sensor.read_temperature()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> <span class="comment"># 1. 创建定时器</span></span><br><span class="line"> timer = Timer(<span class="number">1</span>)</span><br><span class="line"> <span class="comment"># 2. 设置定时器的回调函数,每1秒钟调用1次display_info函数(用来显示数据)</span></span><br><span class="line"> timer.init(period=<span class="number">1000</span>, mode=Timer.PERIODIC, callback=display_info)</span><br><span class="line"> <span class="comment"># 3. 调用主程序,用来检测数据</span></span><br><span class="line"> main()</span><br></pre></td></tr></table></figure><h3 id="代码解释-2"><a href="#代码解释-2" class="headerlink" title="代码解释"></a>代码解释</h3><p>代码的主要逻辑是在一个无限循环中不断检测传感器读数,并进行相关的计算。首先,代码会初始化I2C对象和传感器对象,以便与MAX30102传感器进行通信。然后,它会检查传感器是否被正确连接,并设置传感器的一些配置参数,如采样率和活跃LED的幅度。</p><p>在主循环中,代码会检查传感器是否有可用的数据。如果有可用数据,它会从传感器的缓存中读取红光和红外光的读数,并判断是否有手指放置在传感器上。如果没有检测到手指,代码会继续下一次循环;否则,会进行心率和血氧的计算。</p><p>对于心率的计算,代码会将红光读数存储到一个历史列表中,并通过保留列表的最后32个元素来控制列表的长度。然后,代码会计算历史列表中的最小值和最大值,并根据这些值计算出心率的阈值。通过比较当前读数和阈值,代码可以检测到心跳的开始和结束,并计算出心率值。</p><p>对于血氧的计算,代码会将红光和红外光的读数存储到相应的列表中,并限制列表的长度为最新的100个元素。然后,代码会调用<code>calc_hr_and_spo2</code>函数来计算血氧值。如果计算成功,将血氧值存储在SPO2变量中。</p><p>对于温度的读取,代码使用传感器的<code>read_temperature</code>方法获取环境温度,并将其存储在TEMPERATURE变量中。</p><p>最后,通过定时器每秒调用一次<code>display_info</code>函数,将心率、血氧和温度显示出来。</p><h2 id="OLED屏幕驱动"><a href="#OLED屏幕驱动" class="headerlink" title="OLED屏幕驱动"></a>OLED屏幕驱动<img src="/2023/05/30/ESP32-DEVELOP/Users\10190\AppData\Roaming\Typora\typora-user-images\image-20230606133118700.png" alt="image-20230606133118700" style="zoom:50%;"></h2><p><img src="https://doc.itprojects.cn/0006.zhishi.esp32/02.doc/assets/1673072933980.png" alt="1673072933980"></p><h3 id="代码实现"><a href="#代码实现" class="headerlink" title="代码实现"></a>代码实现</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> machine <span class="keyword">import</span> sleep, SoftI2C, Pin, Timer</span><br><span class="line"><span class="keyword">from</span> utime <span class="keyword">import</span> ticks_diff, ticks_us</span><br><span class="line"><span class="keyword">from</span> max30102 <span class="keyword">import</span> MAX30102, MAX30105_PULSE_AMP_MEDIUM</span><br><span class="line"><span class="keyword">from</span> hrcalc <span class="keyword">import</span> calc_hr_and_spo2</span><br><span class="line"><span class="comment"># ------------ 添加新代码 -----------</span></span><br><span class="line"><span class="keyword">import</span> ssd1306</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">BEATS = <span class="number">0</span> <span class="comment"># 存储心率</span></span><br><span class="line">FINGER_FLAG = <span class="literal">False</span> <span class="comment"># 默认表示未检测到手指</span></span><br><span class="line">SPO2 = <span class="number">0</span> <span class="comment"># 存储血氧</span></span><br><span class="line">TEMPERATURE = <span class="number">0</span> <span class="comment"># 存储温度</span></span><br><span class="line">HREAT_LIST = [] <span class="comment"># 存储心率的最新30次数据</span></span><br><span class="line">SPO2_LIST = [] <span class="comment"># 存储血氧的最新10次数据</span></span><br><span class="line">TEMP_LIST = [] <span class="comment"># 存储温度的最新10次数据</span></span><br><span class="line"><span class="comment"># ------------ 添加新代码 -----------</span></span><br><span class="line">OLED = <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># ------------ 添加新代码 -----------</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">create_oled</span>():</span><br><span class="line"> <span class="keyword">global</span> OLED</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 创建I2C对象(驱动屏幕)</span></span><br><span class="line"> i2c_oled = SoftI2C(scl=Pin(<span class="number">12</span>), sda=Pin(<span class="number">13</span>))</span><br><span class="line"> <span class="comment"># 宽度高度</span></span><br><span class="line"> oled_width = <span class="number">128</span></span><br><span class="line"> oled_height = <span class="number">64</span></span><br><span class="line"> <span class="comment"># 创建oled屏幕对象</span></span><br><span class="line"> OLED = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c_oled)</span><br><span class="line"></span><br><span class="line"> OLED.fill(<span class="number">0</span>)</span><br><span class="line"> OLED.text(<span class="string">'Put your finger'</span>, <span class="number">0</span>, <span class="number">30</span>)</span><br><span class="line"> OLED.show()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">display_info</span>(<span class="params">t</span>):</span><br><span class="line"> <span class="comment"># ------------ 修改代码 -----------</span></span><br><span class="line"> <span class="keyword">global</span> HREAT_LIST, SPO2_LIST, TEMP_LIST, OLED, BEATS, SPO2, TEMPERATURE</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 如果没有检测到手指,那么就不显示</span></span><br><span class="line"> <span class="keyword">if</span> FINGER_FLAG <span class="keyword">is</span> <span class="literal">False</span>:</span><br><span class="line"> HREAT_LIST.clear()</span><br><span class="line"> SPO2_LIST.clear()</span><br><span class="line"> TEMP_LIST.clear()</span><br><span class="line"> <span class="comment"># ------------ 添加新代码 -----------</span></span><br><span class="line"> BEATS = SPO2 = TEMPERATURE = <span class="number">0</span></span><br><span class="line"> OLED.fill(<span class="number">0</span>)</span><br><span class="line"> OLED.text(<span class="string">'Put your finger'</span>, <span class="number">0</span>, <span class="number">30</span>) <span class="comment"># OLED屏幕显示 放手指</span></span><br><span class="line"> OLED.show()</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># ------------ 修改代码 将下方代码注释 -----------</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> print('心率: ', BEATS, " 血氧:", SPO2, " 温度:", TEMPERATURE)</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> if len(HREAT_LIST) < 30:</span></span><br><span class="line"><span class="string"> HREAT_LIST.append(BEATS)</span></span><br><span class="line"><span class="string"> HREAT_LIST = HREAT_LIST[-30:] # 保证列表最多30个元素</span></span><br><span class="line"><span class="string"> print("正在检测【心率】...", 30 - len(HREAT_LIST))</span></span><br><span class="line"><span class="string"> elif len(SPO2_LIST) < 10:</span></span><br><span class="line"><span class="string"> SPO2_LIST.append(SPO2)</span></span><br><span class="line"><span class="string"> SPO2_LIST = SPO2_LIST[-10:] # 保证列表最多10个元素</span></span><br><span class="line"><span class="string"> print("正在检测【血氧】...", 10 - len(SPO2_LIST))</span></span><br><span class="line"><span class="string"> elif len(TEMP_LIST) < 10:</span></span><br><span class="line"><span class="string"> TEMP_LIST.append(TEMPERATURE)</span></span><br><span class="line"><span class="string"> TEMP_LIST = TEMP_LIST[-10:] # 保证列表最多10个元素</span></span><br><span class="line"><span class="string"> print("正在检测【温度】...", 10 - len(TEMP_LIST))</span></span><br><span class="line"><span class="string"> else:</span></span><br><span class="line"><span class="string"> print("----------已完成检测----------")</span></span><br><span class="line"><span class="string"> print('心率: ', sum(HREAT_LIST[20:])/len(HREAT_LIST[20:]), " 血氧:", sum(SPO2_LIST[5:])/len(SPO2_LIST[5:]), " 温度:", sum(TEMP_LIST[5:])/len(TEMP_LIST[5:]))</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># ------------ 添加新代码 -----------</span></span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(HREAT_LIST) < <span class="number">30</span>:</span><br><span class="line"> bmp_str = <span class="string">'BPM :%3d'</span> % <span class="built_in">int</span>(BEATS)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> bmp_str = <span class="string">'BPM :%3d'</span> % <span class="built_in">int</span>(<span class="built_in">sum</span>(HREAT_LIST[<span class="number">20</span>:])/<span class="built_in">len</span>(HREAT_LIST[<span class="number">20</span>:]))</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(SPO2_LIST) < <span class="number">10</span>:</span><br><span class="line"> spo2_str = <span class="string">'SPO2:%3d'</span> % <span class="built_in">int</span>(SPO2)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> spo2_str = <span class="string">'SPO2:%3d'</span> % <span class="built_in">int</span>(<span class="built_in">sum</span>(SPO2_LIST[<span class="number">5</span>:])/<span class="built_in">len</span>(SPO2_LIST[<span class="number">5</span>:]))</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(TEMP_LIST) < <span class="number">10</span>:</span><br><span class="line"> temp_str = <span class="string">'TEMP:%3d'</span> % <span class="built_in">int</span>(TEMPERATURE)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> temp_str = <span class="string">'TEMP:%3d'</span> % <span class="built_in">int</span>(<span class="built_in">sum</span>(TEMP_LIST[<span class="number">5</span>:])/<span class="built_in">len</span>(TEMP_LIST[<span class="number">5</span>:]))</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(HREAT_LIST) < <span class="number">30</span>:</span><br><span class="line"> HREAT_LIST.append(BEATS)</span><br><span class="line"> HREAT_LIST = HREAT_LIST[-<span class="number">30</span>:] <span class="comment"># 保证列表最多30个元素</span></span><br><span class="line"> bmp_str += <span class="string">" <-- %d"</span> % (<span class="number">30</span> - <span class="built_in">len</span>(HREAT_LIST))</span><br><span class="line"> <span class="keyword">elif</span> <span class="built_in">len</span>(SPO2_LIST) < <span class="number">10</span>:</span><br><span class="line"> SPO2_LIST.append(SPO2)</span><br><span class="line"> SPO2_LIST = SPO2_LIST[-<span class="number">10</span>:] <span class="comment"># 保证列表最多10个元素</span></span><br><span class="line"> spo2_str += <span class="string">" <-- %d"</span> % (<span class="number">10</span> - <span class="built_in">len</span>(SPO2_LIST))</span><br><span class="line"> <span class="keyword">elif</span> <span class="built_in">len</span>(TEMP_LIST) < <span class="number">10</span>:</span><br><span class="line"> TEMP_LIST.append(TEMPERATURE)</span><br><span class="line"> TEMP_LIST = TEMP_LIST[-<span class="number">10</span>:] <span class="comment"># 保证列表最多10个元素</span></span><br><span class="line"> temp_str += <span class="string">" <-- %d"</span> % (<span class="number">10</span> - <span class="built_in">len</span>(TEMP_LIST))</span><br><span class="line"> </span><br><span class="line"> OLED.fill(<span class="number">0</span>)</span><br><span class="line"> OLED.text(bmp_str, <span class="number">0</span>, <span class="number">10</span>)</span><br><span class="line"> OLED.text(spo2_str, <span class="number">0</span>, <span class="number">30</span>)</span><br><span class="line"> OLED.text(temp_str, <span class="number">0</span>, <span class="number">50</span>)</span><br><span class="line"> OLED.show()</span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line"> <span class="keyword">global</span> BEATS, FINGER_FLAG, SPO2, TEMPERATURE <span class="comment"># 如果需要对全局变量修改,则需要global声明</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 创建I2C对象(检测MAX30102)</span></span><br><span class="line"> i2c = SoftI2C(sda=Pin(<span class="number">15</span>), scl=Pin(<span class="number">2</span>), freq=<span class="number">400000</span>) <span class="comment"># Fast: 400kHz, slow: 100kHz</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 创建传感器对象</span></span><br><span class="line"> sensor = MAX30102(i2c=i2c)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 检测是否有传感器</span></span><br><span class="line"> <span class="keyword">if</span> sensor.i2c_address <span class="keyword">not</span> <span class="keyword">in</span> i2c.scan():</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"没有找到传感器"</span>)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">elif</span> <span class="keyword">not</span> (sensor.check_part_id()):</span><br><span class="line"> <span class="comment"># 检查传感器是否兼容</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"检测到的I2C设备不是MAX30102或者MAX30105"</span>)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"传感器已识别到"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 配置</span></span><br><span class="line"> sensor.setup_sensor()</span><br><span class="line"> sensor.set_sample_rate(<span class="number">400</span>)</span><br><span class="line"> sensor.set_fifo_average(<span class="number">8</span>)</span><br><span class="line"> sensor.set_active_leds_amplitude(MAX30105_PULSE_AMP_MEDIUM)</span><br><span class="line"></span><br><span class="line"> t_start = ticks_us() <span class="comment"># Starting time of the acquisition</span></span><br><span class="line"></span><br><span class="line"> MAX_HISTORY = <span class="number">32</span></span><br><span class="line"> history = []</span><br><span class="line"> beats_history = []</span><br><span class="line"> beat = <span class="literal">False</span></span><br><span class="line"> red_list = []</span><br><span class="line"> ir_list = []</span><br><span class="line"></span><br><span class="line"> <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> sensor.check()</span><br><span class="line"> <span class="keyword">if</span> sensor.available():</span><br><span class="line"> <span class="comment"># FIFO 先进先出,从队列中取数据。都是整形int</span></span><br><span class="line"> red_reading = sensor.pop_red_from_storage()</span><br><span class="line"> ir_reading = sensor.pop_ir_from_storage()</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> red_reading < <span class="number">1000</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'No finger'</span>)</span><br><span class="line"> FINGER_FLAG = <span class="literal">False</span> <span class="comment"># 表示没有放手指</span></span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> FINGER_FLAG = <span class="literal">True</span> <span class="comment"># 表示手指已放</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># ------------ 修改代码 -----------</span></span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(HREAT_LIST) < <span class="number">30</span>:</span><br><span class="line"> <span class="comment"># 计算心率</span></span><br><span class="line"> history.append(red_reading)</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 为了防止列表过大,这里取列表的后32个元素</span></span><br><span class="line"> history = history[-MAX_HISTORY:]</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 提取必要数据</span></span><br><span class="line"> minima, maxima = <span class="built_in">min</span>(history), <span class="built_in">max</span>(history)</span><br><span class="line"> threshold_on = (minima + maxima * <span class="number">3</span>) // <span class="number">4</span> <span class="comment"># 3/4</span></span><br><span class="line"> threshold_off = (minima + maxima) // <span class="number">2</span> <span class="comment"># 1/2</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> beat <span class="keyword">and</span> red_reading > threshold_on:</span><br><span class="line"> beat = <span class="literal">True</span> </span><br><span class="line"> t_us = ticks_diff(ticks_us(), t_start)</span><br><span class="line"> t_s = t_us/<span class="number">1000000</span></span><br><span class="line"> f = <span class="number">1</span>/t_s</span><br><span class="line"> bpm = f * <span class="number">60</span></span><br><span class="line"> <span class="keyword">if</span> bpm < <span class="number">500</span>:</span><br><span class="line"> t_start = ticks_us()</span><br><span class="line"> beats_history.append(bpm) </span><br><span class="line"> beats_history = beats_history[-MAX_HISTORY:] <span class="comment"># 只保留最大30个元素数据</span></span><br><span class="line"> BEATS = <span class="built_in">round</span>(<span class="built_in">sum</span>(beats_history)/<span class="built_in">len</span>(beats_history), <span class="number">2</span>) <span class="comment"># 四舍五入</span></span><br><span class="line"> <span class="keyword">if</span> beat <span class="keyword">and</span> red_reading < threshold_off:</span><br><span class="line"> beat = <span class="literal">False</span></span><br><span class="line"> <span class="comment"># ------------ 修改代码 -----------</span></span><br><span class="line"> <span class="keyword">elif</span> <span class="built_in">len</span>(SPO2_LIST) < <span class="number">10</span>:</span><br><span class="line"> <span class="comment"># 计算血氧</span></span><br><span class="line"> red_list.append(red_reading)</span><br><span class="line"> ir_list.append(ir_reading)</span><br><span class="line"> <span class="comment"># 最多 只保留最新的100个</span></span><br><span class="line"> red_list = red_list[-<span class="number">100</span>:]</span><br><span class="line"> ir_list = ir_list[-<span class="number">100</span>:]</span><br><span class="line"> <span class="comment"># 计算血氧值</span></span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(red_list) == <span class="number">100</span> <span class="keyword">and</span> <span class="built_in">len</span>(ir_list) == <span class="number">100</span>:</span><br><span class="line"> hr, hrb, sp, spb = calc_hr_and_spo2(red_list, ir_list)</span><br><span class="line"> <span class="keyword">if</span> hrb <span class="keyword">is</span> <span class="literal">True</span> <span class="keyword">and</span> spb <span class="keyword">is</span> <span class="literal">True</span>:</span><br><span class="line"> <span class="keyword">if</span> sp != -<span class="number">999</span>:</span><br><span class="line"> SPO2 = <span class="built_in">int</span>(sp)</span><br><span class="line"> <span class="comment"># ------------ 修改代码 -----------</span></span><br><span class="line"> <span class="keyword">elif</span> <span class="built_in">len</span>(TEMP_LIST) < <span class="number">10</span>:</span><br><span class="line"> <span class="comment"># 计算温度</span></span><br><span class="line"> TEMPERATURE = sensor.read_temperature()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> <span class="comment"># 1. 创建定时器</span></span><br><span class="line"> timer = Timer(<span class="number">1</span>)</span><br><span class="line"> <span class="comment"># 2. 设置定时器的回调函数,每1秒钟调用1次display_info函数(用来显示数据)</span></span><br><span class="line"> timer.init(period=<span class="number">1000</span>, mode=Timer.PERIODIC, callback=display_info)</span><br><span class="line"> <span class="comment"># ------------ 添加新代码 -----------</span></span><br><span class="line"> <span class="comment"># 3. 创建OLED屏幕</span></span><br><span class="line"> create_oled()</span><br><span class="line"> <span class="comment"># 4. 调用主程序,用来检测数据</span></span><br><span class="line"> main()</span><br></pre></td></tr></table></figure><h2 id="实验总结和感悟"><a href="#实验总结和感悟" class="headerlink" title="实验总结和感悟"></a>实验总结和感悟</h2><p>在我使用ESP32开发板和MAX30102传感器设计的可穿戴设备的实验中,我成功地实现了心率、血氧和温度的测量功能。以下是我对这次实验的心得体会。</p><p>首先,我深刻认识到了传感器在物联网和可穿戴设备领域的重要性。MAX30102传感器能够准确测量心率和血氧水平。通过与ESP32开发板的结合,我能够实时获取传感器采集到的数据,并进行处理和展示。这使我对传感器的原理和工作方式有了更深入的理解。</p><p>其次,我学会了如何使用ESP32开发板进行数据采集和处理。ESP32是一款功能强大的微控制器,具有丰富的通信接口和处理能力。通过编写适当的代码,我能够将传感器的数据读取到ESP32上,并使用串口或者其他通信方式将数据传输到计算机或移动设备上。这为数据的后续处理和分析提供了便利。</p><p>在实验过程中,我遇到了一些挑战。首先是传感器的校准和信号处理。传感器的准确性和稳定性对于测量结果至关重要。我花了一些时间研究和调整代码,确保测量结果的准确性。</p>]]></content>
<summary type="html"><p>30分,水一个报告</p></summary>
<category term="BIN" scheme="http://example.com/categories/BIN/"/>
<category term="BIN" scheme="http://example.com/tags/BIN/"/>
</entry>
<entry>
<title>智能交互实训进展记录</title>
<link href="http://example.com/2023/05/29/%E5%AE%9E%E8%AE%AD%E4%BB%A3%E7%A0%81%E7%97%9B%E8%8B%A6%E5%9C%B0%E8%B7%91/"/>
<id>http://example.com/2023/05/29/%E5%AE%9E%E8%AE%AD%E4%BB%A3%E7%A0%81%E7%97%9B%E8%8B%A6%E5%9C%B0%E8%B7%91/</id>
<published>2023-05-29T10:13:12.000Z</published>
<updated>2023-06-20T19:05:01.349Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="45fd92bf0f019649e6de761a7a2ec6b32668c0e4f1d4d380876be92bf8d94e47">cb320da6677537a61c4c8a60c50f744c58ea1e4b3ec8c3281a07935dbbda50415a9ba4b107755e5400ccd744eefd324ff3ffb9d9996a84652afca8d9ebb4208baaa8ba9436f08e64aa9ab86a77b4438368a8b56a6c05f433fbab743cf18a01257f766ea4272df748cbc84d329ecc0dc455af1755f08703a9bc17a3da3a3395d56463442db9175862f11374e3e129a30964d3a500bd8d07f2d688a1fcd68a4d3e6f385d1931421d34d73485f56a2a1d57fb03b11cff8a8eb52385a9af048eb21aded8669f3d60ab947317bde5fc1eb69da28e8b2d58c2a1720ef8641835c225a6c2db3f84fd59b44aa15cdf0a6c4937343938fb1601d66e10468498dab09d91523de1f6e277a59ca02ce276e6fa6325e435702353f1474ce3efe77a1ab1ce92ae5a25af824881b3dd42d38b2bb5371c4b4e35ce4da688b9958bd5467c875edb85cdae61b498aed46391f4063f40996b796815f7b2119f4dcaaae1a4b6b5ae16daef151db4d9fb06635f7cb89654f676e3e3d80f63c04161be3bab510965de0ce6ab305c2f3e6b9d41267066ec70549a778e25006bc305e1b353526abb9a07a9e8ca35f31deb16671704a16e7b6ec49fba64010fbb792665547074a195adbaf7d2d0d2e3fb556d6449c5b7b99771781a6fe1037d3ca3abdc79a131f606ad7ae397fdd3c3442bca920f20341486913c472be81b57cafcd3c370f7e27f53ad7ab589834e4e2de0d28ef0e8069af4989227fe2d70b44a30b0c47b4fec4588fb92e0980ceb0bbf311c7df5e28008c421c88f6c62b278887a22501fafa4f78c76f5bc0de6d6355e9e105430e2d6e0bef9ef9c615743daacd6347978bd517da3a1ccd2b1c361a893e1b11a943df59794c8b8afe1b264974cac756b82f79cbba454ba23894a19d849e5b6e038f9bba1abeb2fb5778537b00514726a5af765b4095e0a042c73ed25301080222586a6400f1a0448d23504c0fd1080664e3ea6855fc70e92b8d743afefff72c9fabd49325a330cbdf354166d94b40d719b036e7f473c4919254b646906e7415931f579044028020f2d1030c6e1cb7dbfa0f3eabc1f1953e2f36bc09165e37652d685eb7d446c23b82d4e9b0b42a4cbc67cba9e4942669b6d584af27bd30b137842a38c8ff2238a38aa9590f85f647c159dc62ec5de03a32d2d5441c1297e47c250f0317e247cca44151e1f86a3743a13025b722c8c7b59427366266384246703ef23d7b9f70e9d564a7594680061b1db5bc9595f6219006864d7e70287cf42f3d554f5f46d0da2296d8edc020c1eead52dc3e1058138e0e52ae16082f7a2c4c10d6b8af9b24bfee0cbbaf86ad29e733314670ba553d3356d4c34b4a5b981a49501ad0e7dea6e905f5ef32c76daf4ffa154899a92d73d8e75aaef40adc37b1f955e22c2dc8482cb1bed7d022632b4348d063b57d537a8222efc4ca95ce04ab2987e7cfbc6b084dc0045c7c3c4a02719b4759ee261a81a1699e3baf361be2380ae197a2bc4e31367b75eabc4a8fdb2f650e6dc49d68774156d17d04187382316cbf31474618b38bf5c0c2913f3db7e52ddcde5810d0a8156a5ce414d56b77bab93ba371ff7aadfc680a9983e580b916b1d70b09a2cf4e86e90bd168e9bf3f3c2409d13c62c5f053ac60e1181f0f18fb1dcb06d14d6f92f1c538ff8edadb7c738876fe201efea23e3b9a9075a64df7dc0f828fd6bd8a5f59269895adc388deca69df7ec9c781840d566ee51a9c1c2bcdb66cc49362ddb139233a1d306be9dc646af9c8d837fd635e1aae7dc1a0369d89f056bb3908d763025feebabf292e5cd76ca0f0cfa06ef10ecabebe49079f9dfe38fa335ce6aa93f30d423e357f1ec705c17aa40b35a0cf1ba6167a477f6d0d891e12f0dca6767c070d7a57ef079258ace78316d7e2e5b831f6370d2ee636a92d04b0830bd07c45a5852b8a798fb1409ac98bfeb203ecadd3aa004ea202296d7223cde91462e06618c1b29e48cd266de476d3f537cf42bcf74cef4aa22fd6a64ceda26bf80e91d5ff4a3f137d9df129286417f6dce758420dcce360ccf54464c9df53534d4390e67353beace4e2e973d0f1aa9642cfb97d8284fded109915e61030717becfc7fe90749b407ca8373034fb2f32478ed9920e50eb880233b05e8885b8845a4694a82694e6ac4f2e19fb3a4eca86e785a67425d1a78eed22d3f2209c4d7b4bf7a9b2d6f07f5b4d489f058710eeb76503f164ff745a64ec9448686685088f6f5c7cfa221e2723da42ecfcc3323d5a31e1a624842223cfbdf2e3888d1d7f62daf6be58540fe6c2641cabef7a3282d96dd7a4b65247fba55dcf50702aa7de15f9a901a9275148c1c7f8f14f2b73ca6dd7193b68efbebdb6e3ef2df6e2d5fa38a23ee11df0527a01616650e12e5f32b2abe2c9ce1390d2a6be669072cdaa3b15a6cdaa4178139e65ca6ac9c7769ec6b2f19e2a74846aac0e1b94e5f4b1a71fb2a4da06f0b8be4a6c6b50b0cab7904777a01bc90497ca5ac63c68cbdfbfd9695efa7ca7a2ee448ca81fd0fb4501159c5e690797910d209a771180ccec1a2c9c6689e9adaac6ce0d06dd82b1c2515b12684d5a2318161e1394c2a23f4f5e600e207bd9aa8bdfbfc8d022b45fa9951b6325be8539bc7e81e397f3380aa7eb6b86161bc11faaa630ac6cd2887e96d291392b09b0ad6ada8083580afc9610f468326e82321d813c579e69f3e0f34068c6e928fe2f74b3c856128ed70bb0eaa3d2fc444ea7115ef1cf3d9283c218bb4aa7a4239ead425a53f540af4c5bb72d65fd7432f65b53ca017eb455690d2eec9171b5bea93f3a4da5e1e8ee463bbdf410f7acf00ea03c0c7b6b96e9e54f27d032376d0de503a91012d347af7fb9d415b2962dc0c7bb25d9881f0a8dd679db22ab86ae5e84918b693491a48822a331c8efd54688b88ad7783318dcec4364d8351416c68cbf9e262dcf09152bbd82e248d346a6637578e60a92942c744e1807a324606c92c5d54f19ab0015fd197fac4de3cb0ba0dd32b1ff1ca76dde5b730a5db5bc5c24e676aa1de6e7825202b43fc0e7cc459e557a96935f9e7c0deda8527c95fa9239f999ae091b24067e84aa5b36450a47cdcb6b2f815a5bfb0d001500ebc40c0bd4bc71fbbcfce3f5568d2c3cb83877e4fee8b22b76964f265e0dcfe6ad2ae1304b47cec1ecba24aeeeffb9bfad52e8ff9c001bcdfda74f4e868c3b614130b1039982f618981c53ab1d415189845a13fc24c47ae0dd823c8a03a5f731d8be450f641c8461e03f382d1ab84705604044ca47afbae0a101e6c7695c779e7208b539ad2471f73a6aacedc1399a8ef27da3de5dbc83ad1c86b931dbd81d57fd2c9f5e26c854344c462e91b00794709c5db6adefa42dc8844b8174f115f3a47d6e756454a620deea9b0e5cc6c06f8d2fcbc8d1de8f1c899dd02730c94ad05e9b96049863fb0e33087b0b0ae563e6f58a5da297426ebf1c53f67e25db9073a4401ee4899bfd9caec6b17e179505e3523349749dc74c34d648b0662245d47478d51363b74c964ab5f579b43a197cb491d8414caa3e165e2e904b088d22f0241f601433c72df5387c9f8276b882da6d46d32b788ce41a9867c1e1e2c65663cd1a8262d9101e43e9aa5e0bbf62debec4fac0ad6fc536228d7ecf1531efcab22cfd6fc33dd0797cb9adb5f9c4bc8a35d8aa2d41a5c27570b5cf5e3a6614770093d1d0f56d81be612ac955f3b6fda8c9ab8b3618d3dc0a1f643ba7c5d5d67e4d57384ee25af21c45bdd240d9f7142e5ea8b548f87b11814692e03a2ad62b329fd2ba0a584fb3a7a28fb171a2770b5b399e4ef85c38f6864fe9830b64422579d22a4da194faaa58095f06ceb0a2bce15b8a0bc4002393bb7d428ca07121420930861a6f8a946625591deeffdf5af90a8e55f3e522ed871e791022e49005766af500a0a1fd68a58433b2005518cf1ca3294b546a1acd252a845beb8b9b71527cf29c075e8990e71759b4ea90065b7aabb07c41dad421f827c551e22dee00ff8b5cf454f8547baf61e947a8ca2d71413dcdbc57071064322eb835b48112101d65f567309e5211b706299a4b23a51c493782cda1c4a0f9c20f6ea3742d8a34e710bb643e25177948a1f25a60eb1262ed800a77ef7b1a9c9e8f976af02bfe25d548ac89b141829ce00bc69fde234343f30491534b34083cbd7d01c10710470a72482538692d48e5e7b95098d09c77d892fcfd2b387c7f60af2f98eeb213a4de8579d5cb82008ca7adae557aa2e95a4269bbac6e2f3c2d032be3b24cf4ca6d566aed99ba4f8c9f4e70399c935ba9c5f2c463cc48e2fe567647757919b778623296980637e1b4d404cdfe49859051c9ba6143cbed596868093b53f136ab2cb00fad56d3827231c695a0291c5b1b6d8b0420c5b1bde0d51e91251a34eb341c86147c92cd80f58d7229cfcd3a20add32eacf2b354d06c2d823f4d9d9f3d9485304d94c3e369a9474e8d61d8d3a2e281f51b747145865475b41448812470d4a9109bc4d660b34a45daef0c8df4a4bd6278a54212dbde798e91a562f0d6e184adfb9bba051fd20af2b7b9a09beb713ed168689f7be5d28f2bb4889a6dd318bb80cbfd271074321b911ed24f7b752082f21f8c9900885b01742d9853af5d94d7d8d29bdddcb92cb5259f4a8c12f60111a0992187447f5ef4ef88b799d9f2ad6fb6eba80d8e4ec5079e239829876c8bd749ddd84e05cd6f6dc8846bf2dafaf9a3fbaf0d4efea9d457acda7b040d77f13fd96da6bbfb077353e4002d084863a9a69146eacd703db8d8cca1a1871aa25ea2fcab3b33cb0e17d8816b42eafbd73cb9ea916d2ed0b971af7f8502f1462dc40dd5bb7a6fcdd859c03a2e36013e191f19be023b7e32ee63e5ccf4016d87a9b53b8ec6ccd9b434a9eb5c34a84819bf97c4d709abf66e7f1203aef0e1e1a7d0bd875952a95485443bed1d639db018c50d6fca56ae1cdc93ef8e085b06ad112a6de09d4cb1e4215c60e56b73c2337434d509c567be0448bf6bf910ca50cb6f2ae6c0a4e9525ca8fca5767ec35d9adad27595f6dd2b883d39af92f127b5383826fb102092cdda4c9e87f84d6f24f08398a934edd9328b7a966f820d217e81cf126e239d6affbe7cf1e738b8f4609edff5b654e196bb78787af122aea01164bee0d5b20f89866139daab912887be6bf938c6fb26a90709ea508653dc762c7d0c4fd6783bab37359838b3d80bd134533811333e25f010e4a665622ea0ab22890c154d1d601f4978a556eb7db0b486e7a374604681dee00fb54fb946a344963859940699e6e2813f247a2a0749c95bef7d5eabc76ec73f5afeb2eb4465ac00cb6504e3aa80ead8f44e5c8195ae797ab29871bcc891060861f7d9fa7d8662371b996cb24ed91b8c88e0604206c7e38e0b6d82c899fd6f598d4adb6a230b79e4c334f834239d1827e0543d43722ec67059b536f6eb09a31493660b592ebabf99b09417af684594e627f33fb1dd30edd6c1b12dd08ad6fdd79d5ee36c156c751fb5fe4aebd4ff786e1a05d7b38695ad13a925f532a3f36bef52430933f7e8c8089dfe93feae8fdc701d1fd9a28597a75bdc82a6f617bb19711c70f9fef43b415ce692c28f0d46f55a17f757ee4a4584c0d764998cbda74291a26c698efe01d10531d655c44c7f29b1643d9c144ba4dc21c3e21cedd2d2652b5a8610cd71ccc43df30b41616eb4d3b0d5ea6fdf6d8c7a21c8c8d5689c99c02aa5e5afe20ba793c2680cd4a326ef44ac0d738a34124ec94f5289550325b543d44fc7a10b481f61506cc3afc8b4d053bd5f95c26b95aee290f823ea58acd225c5799db4b5c0d30cbb35aa3c1c42a8454773cd6f4b174256817bef2fab9715e9c143bb7d0068c56645a1a3d2b9eadd5ba8a8047570477def4ffb452756b6d063142d3594d457aadcece4949b209c5478527588725b8ab3583b824094769eb66eff231a99ae078828cb79740c4355e820680e475a85d570638cf7b2b1304b2c84fa7a53adc19508ae493c50dd82bb06daa6946c274ede22990dcb793f34161d249191f4acc180a62daef79b712b1ceacfe0c929c67a126458008ad9d43c3704e51ad067d6bed96b155f42c4c154cc617409430f253ec7476fc9c9a3c820c4729b6b755d9597f25de413d67c9c30fbe3463763f9aa7816940cf4472c16775ce6f911184bdaec193302f1a7dbe56275deb1261f864175610c0b509b823808d38a4b3c4efdaaccfa52b061874c21c18fc0b57d216d50b849686b89cc1e868576edbd53264260ae2980d9a243d8dbe29f3249833cd92703d5006dabbf9eb47db0dde40e2d554ae34932742ae03b221c66f713d2d32a26a262f9d1ec9eac9fa7e8a9e894d5e8219c1da47c56f08f91dcb4010c7c3387edd18c5d8890be5aa543ba6e943b33792d22494070d88b98dcd9c46e554057bee7620ec8818ca5443a6b9c388f920f96a0cd3a0f4f99c802558a2037f5c1ee7838cd0516e6bbf7485cefed909869b03f359584455674c88785f3d3457845024eade48384b22cb8f84eed1243e069106d6a4caf4a0d1a98da5f98805e635dd6896befa384cf20c07a1120102b50c6766456791dcd765b121a0d69b0cb717aeacaa91e8b75e00081fbca6b541eb3227a8179bc82c736e2ed3d2dd51d0c06c2d0c670e5e4731035b3e6d0c4a138be810ecc934ee2b7931f4bc295593f4e2857cc5e1886e7dada02b25eb1055ea72224b03486a6506bceb1104448d9c4f5b4ab64d81d3d438cd791a01ff4778eafe6960e4e3eebed46b0e0c7c9d380147aa78d41dcff4216bdc438f754434045bcb13b05db843766bf97dc4167ebead9446bc5d4317c05449d27e5358135b6c1c56e024240dcd7de1ff9a053e88dc328d387af0e522da417f545730ad25795d240986b061c94c098ea7d63306510167bc812ca623c944e3b0b0cbd25943e661d5224733431bcfdc77d49ecc783ac4a3da57e8cdaf780cca9be9a7165110d85b986920a8609bb7cad3ed9ef09227f23001a8c23a337d8a6648595b043c4a3761f9db96ebfda75ea328d0b161221e7a76027dc7127bd81d228a305f8344cc1f94d338e5923a8b4d271f27d5c8ee07d2016771fc898676a66077bf13a6b8f844e42da58f07f3ceffdd0c6348b436582bbd7609fd66308a1975adde3ff5ec7f6fa0c42fb054c703da044e36017e842bc340638588c1858a38f40ac40e81532b3c5c3836ad6cb916b9664fc105a69a2869eaade082c8d762db166cfc4b1baa248b06e59f550a4b9c69d213baacecebf09eae395924da4d8b12721f37e3774b868861ccb43a55fee414985ff8476bae0f48b5830a0d6ea6bb209d2e0a0fe6530e3b84915d9a307a73f7efffd9a8d9a064147c494a6f7ca256f90c31fdcf1658c416d3d2c5a5867f396149cb80ddddc34bae3cc71b331fc2e528b47057f1b0e74eac9c8a88714f5e31d8f6f0cd419bd122f2d0fa194cec139e65ae5596e2502723df2ab64537e6bc1fa76971cd037ff5ee6e5b1bb90eae7ad65790b9cdff27b90643f87e3399fbc8871fbcf297cb21f491beaa3a696e8b565f7f050b8803e7338a2cb46345bbf31121079dbf89f3e0e60cc82a01b93ce4a211de038dfb0bbcb41100c1f3497cd56caaac3fcec21ff66280e5e70ab15fb3287768023831f30891be843b622b8044f2d4a2441ccdffd919436ea63cc9b46fc7ee34468d951bc122863a8d0ef9d513b104d0b88636c9644003590997b1039187449a95bd9727af2fc95209e6a9bc182dc7f55de2855f59589b47954d6fe63e6e13559f7df79443196cdb8ffe518daf160f669becc750fd9d113e5dd907d958fdd130ce68f8e37c438d4521ce15b8c2a357759ab2dc636b297d90c06cdd0b78932c57c69b4f17dcc4f60459965dc285c2bbb3b370219f986a5a76eaf5f64c9da30fae9ae1c78c85272bec977d928d4417845beee7f3db2c41c4bfa4c19979c01e5e0969e69ee3275e19cac50d377db3b17e333cc52b897e975ddb8b655f56c0811d7e9dd4595cae1d5b81ea659dcc53bb930f7005abdd768aeb3b5f1d4343e67b5d8f40b38d5b8ef32e95c9d3a77b3d07250856acb7a3c8c8e137cfc224d79b3425f45fed8ff72adc9f31b7de7201e54f04a265f5ec6d4af2de3bde4d5e85d51f887adb33f2cf5d0f1fa14ce56e26661bbe37a353c5b8ea7967e92796698387953cd6afc2fa34ff512fedd4888cb4b2fec4ff28560a592a269d573b28fc0d8337d1f938cb090df58aad6b3c126fc1074dfd4afd3caa943c614a27082ace5e485eeeb09dcd66ec83fdfddbbbb26a8dbbcb69fcdb262f3c789a25f4e6232a09b43ff0b9f0d81a2e55afd3d4813798b9cbcf60bb75d992ca135b809c33c3b10a67c3f2d36f0a965d3f9078e439c7582f0720ed8e6913c479a1ee53ddc25471f2e8a0e8b0a5e1c107603604f169b00e50ff6a2aac704f4016d2f63f23a704086c3888a94b5779ec03963a34b24e309af6f52e0e123229c273b66956bca50b69662566cad9623996eb5073b1996e335d1f60e02a1cc2a47c9d82b8e0f3fd1162310876675abb14e90cc663d9978433734ba528506b1a4a6b803172c4a9fe3f29f68627574113afe76114f1705a225e4fee2cef458c3b7efb12e405dadcd43f6a1abb4a3b91d9a4aa81b4ba19e65f918386d75b52cc7c5cbc9332268c984648fb3c2714f1f51eb2636be6e209ea4b01f3f6bd63cd78cf5e523f5cb3e047ef9408b22621182650261cec51fae1b202cc0b835dbc9793bf408a9425d6e723b70f08d1571d7cae7a5528df5ce456d0ff44bfade6f0e0e7c90a9f60d37383b2c4d3f401b2faf3dd8159befc9a20f583b4057de13cc87cf92929b3a402533519fde2fc0a26f46f3da8ea469a5087502f9b291013dcd6f1cdb40cc10514460da40fb87b9b5a798836574ee5bf43b468c97bb806c6392ed82d8f40fe523cbe7e425f90e6c0ac4ed17d156c6e42ae6d67df267c3447cd29461a7ebbc13289e40a91ebdd14ee399295f018c4be4b2fb8b778cedfd2aa8cca2a66553fa8fb4db06aa51f2a3093989a6e9e961b287249e2ea2bae0df30cfa7dd1d1fd0d664f07d323ab149bba007b75b853cc839bcd73dd1cfa9e3946ef7144992ec63429213ca2a2e2896fb4a165e525ec005b0e26d52ff7a2f326358d0c9f5a33376ae0a96a21125562fd0f8d7d23646aa84dae28d1045c7a6fb5f05e00ccff6df49c4e3e33b8364daf54f8ca3e92589ee1c0ebc53eab6b386f86c1909deee982407d604c27704a61742328a48cb7e6b6889e9ef83fb1b86b3e6853e2dffbf0bd416c6b19e8f804d417368f444bc76b5ed90b1eb597eaa93417206706e629f3a8ab0937251474854b5ee6cddd7a819d7c66d983040eafca02988be92beff425b270ca1f6b66ae8108436485e05310d5b5b3b0ce7cd138d424c8487499177f077025cc5090d19f43269d82d4c8931d3f2a37f39a878720acc7ad99b13145b2f4877dc36940aeb8d95c5468f0caa17260b76452082409d67a5f5c4f3cb7cd05c0cee1dc039e06d99f44a8e68a4b60a155e1882e8859c318ea3e21330ed8a1067e0dd2ddc0dec92c660515d35bf5523b1d912cefbe0ee2c397dc13b7ca1d5b9ba496a6b0ab00071918ad316b078e44138166d04c202ee2685e7997cb39300b1bba17b501fda452dbea228cdb8c9e5e621e4fad13ffada2350f362bc7dfbbfeb51628e0895842724907e1fa2e3ad8985ba1c1b3bc588d03902941ee51bdb4a583c634d3545dec52c3e98607877992fba2a3b743e41d2d7bd2056a0509fa88fc48ba229bf67c7df7e2765948259c6ebb2c66359f1fb3a2f08d1b271f48044ad6ddded164cb64c3658c13557b7c49024ba5c2a2fa9eedfbf5162fcd933ca0c186cce793f9ad08220e5605cc7c8496226bcf562532c7a63a84930e371b6dd6f2c899926dbdee5e2cabf9ea829fba179d99121c0951559c929b1d40a0cd23b13872087a6dfc451ffa907345361766c79c46772496c4130dc8f7c8b2d705dbe2e3eca3a4af0499115749dac5573587e610d5274edc38009e11fe7896f1149ed005dfc68a25e6f4170d8400fb9c5330b2ec70762a16c40a0cf175965fcf1110db567f9a123d4bddaf501747f1edd52e001ea9d99380e74d4971a9a6124f38646b327f05a762abd7123bffe939b06526e65e561b7ebf865a9a9cd874b7b8046cd02b15332a0f0c2208f3987a4c90541a4630a4517ded31b61cf620f489934cf630c6901ded5620f221038848255cd0209c433b5f6e859453abae639a7ef5926121916c2b82c0b6dd84e22766ac6dcbe9e7f24d5f959e7ef6f6d180928d97743ca200a622323f946f3c844cb74c31319d2d2d0045797d23ea02e101d6243b371c116ba4991b9035b241e097c2b3b2d5153e03f95b165b3fd51725da289bff50ff716a84eadd34caa3ba3512e32895c7441724be6f64cc157604ee073f3c03413086e8d7ea2a32b967ac544159dd5e18bcfa4799cd80a07b3decc11b1a918a991d78278b3677c2fc8c416d29dfcdba9a60a513c49b67b326ee4392705399b1649f37fcb2759fa39819752be64ef3221077b08327500a5951c696fc07a40ae2bc50fb2ac21cd1b2153ccbb8c1c590f101a200d301679514859c32d93a6b2ceab8ef627366ee5b2ac302dcf14a7dd7a94c29733f13c2dc539743179c432489ad407f563b1ee7d36f9da6c746fb436d680d348469222392965f1fdcdda8e83a1ca5e3329ab770c0cf06f979c239024922aee588c1a3018f143c7dc51d53d91681154959e059bc688370ed70ab5e6ad7cb33a4e011447a1cd8a8f52fdaa4f221797e451c14eb9a36c95916d983774687422ba3db06b10f731a549fdf5c8ef1b64c7cf33bfcef0a9f72e2ba4c4fb9c2c00f11c49cfb15833e1672b182c8084516064fdcf431e4da41ad36e86c55a77d69ee2d49ad24d181e2896107142010d2e84ec9c918e22d3098c82f9eae027eafd0ac0cbdd6a251441ba519cf316cd5d84b9131671a1fbde76be0a74f3088f50b6da86e935a7a2a5805065c3ab1eae1bcd06e3fc519413aafcccfe3a0ca4ab39746e2ab227306fd20ca8a56c8bdde3a3c1c312b3827997a12a47bab5855cf0e26c24cb518ca9d501669331ddce9ab19934445baf000b041669984b1e674d2ce9c5465a31cae368a327850c14d9abc8bd8f588643cd16a81972b972f0a674590fef1a850cbc742467763ec1ac5550e65ef00f40544008b43f348b06f1c4e2c215e12edad3acc9898092078a3bee5f8d31e7b4562b9552a843af9b9cb863b9fe36c5a69eac6e505a88648935cb0503a1b00f4111ca8386f0ce80f86983716eceda190fe228bd23d01c429e533c7795ddc3bd91251272f8190d0f0f6b2483118faf9b02f32c2e8ac4b17139223ce6b8454176b41ea83fab0faaa1d5a00a8c74e2d56289eb644bce9bf2dd2e46cbcac4020507296911c67462cc81df670dca3a40822b28d5b89eb347817016171bff69e47a4d382c8914450864a73ce722df39e56e422796417c140d33380ba20cd90c716951523d89b8fdd9e8f88c5d216c300c2bb851a8a17a3add761521f86aa460c3ba8f8426317aae948202e78b7f8a09284e2222ffc2ba122628d7c3f8e096f7a1d79168df387416fc30a04129bfd3daeadb9d6f4f3c6d5f5a0ef01158133d02d3154a934b1ec06c52b24b6c429857ee406286a7adb7bda4c19c4a953650a87cfcdc88db4597096695da21d4c46ac73fda1efec4c078f6defef6dbe84638fb9446e8d33fde76a0b6582696c8462216e80ddf3ec3d1ee36ac79e620917736fceb25b759ec1ff403e49e008f1954a9f2726920ee20efe85981b380550efd1c5289e06acd065fcbea8a775f4f1e79e69a5afdbecb36cf03372c1b8b1dd44bd33f3c34a20e430a794a436b1b02f7c60b4de05740f40232cb4be8d78585641355206edc0e6343264b0275c458be930e5e551d9d149fcaa08d2c646ba0f3ec2f44083b76b07a3effb8d289773e029522a218c554403f08c96d2de55fda251284a071d12d7303bca4d2a6dfede1b081da2f6a972b9b29b230f00e73ad0217f66b99955b63f4105e4bef12289dec5a1efed89e86acefe839ef41aeed288a31f8859645d4e3ea2a02bcde819a6369819f9802ad40bf1900d6c750b7409cc112f8b1df375360e1003ee2dcfa01ac2f37143ad69236d8b82e5c19c3a69f6a8d1f8305ab651ebf56acbc75b85b1be62c02678739b30adbcedeb56b656d540971bd67d6b9c8eb7434084d7926588e155f7e91e9432e59a33b0e1d58cbbebcfd23a09ce3d4fcf73b5a58e247266aa79ff580317f883cb68fb7cf7def744096c0b3a1432079d7c276b703dc6a7c8429f6d822ee6d1c547ad1a3949683eea670016e03c9012ee6fdcf5d2f7f191199cdc12548f950333d63b038b0578b7bb898dc33325c339566e0b7aed414fa39d181167e2fb00f68f2574b1636024c6dc432b23c8175ef5635d6b7a4424181dec144b27121b0e2c56d68438d8f3e9afbf3a04188552246f5c45d29ba7df3287627ff7c97cf5699ade7663fb0969fbfe9a1bc01058ec04b577106face29180fa19815e657be7a771146ca5ccc5891def843ed2a15c7d5657f7a7fbd961dd96ec6548d7145446dff51e4eeadf30ce5398e8947cdd4a87301131f531ed2628fea5b3509bddd8fd9dbb7cb4e1abba1087b3a0d3fe2d3451a951bfcb3a425f29652a83b2b7a322d4c5d3de1a509e7795c85fefd9357341d98836d9cbea27983b887cb18f1325a6dc300144ba08e18c794f624989d750db079c25c7bf331165804eebeca661271bb43989337594c5c0f87ee2de407c36639e3238fd28feb6e9d8f2519e0217a6f75f4322930e8e27d56db4502cfc23b9f8b8ba639ae3e8cc05c6da92b50439920bd2c221ee2bc8414291eed0c9fe0b129c8a93a094b8089f484f3377873c7a61722ab11c2fb6a99f5e7dba6bc3d1350a6516884c6bf819f379e39f66839f2a6c2dbcbfe22514cf07cb1678ac1bff7a933d756dc16b01587c9b00b7f1de80fd58551ea429bbdafa21b601b81c755952db8cfbface14c50a04102d415d924e5416b36183e729560d3fe031a8da935e6a3197259ef6a53e9aeae341d9461e8ce94de720e95fd2590d49cf5df19d77a24de5656352ed57af803bd2cf56ea2e6884d196447f0326a18abb93eaa759871ccb081ae90ec064542d24f857a330b74706328001e8ca0ae5fd0748d8adcb98eca8a9e14119943079f9cd02a6d0dcbf957eaa2272a02cd2942364526cbde74514c72fb9b456fc8ffa76fdee44fc1e447725c7ade248ed9ba2a2adacfef0350a141a9de2703c9367194bcb178adc466379e9fc33151a3c7cbd3fea2a44c6e60efa16a4219ccee8122526286edd15cf2299f991552bb5307464af08d3db02837ce1e8ee67a4aa5da557560aaa57332bbad66c24000d5330660d1f5ded527c9a47c33a62243497109450e71d4a6f7ac786eaa2b2599361e06dd401fa891657ef7d1809e17ac143db65e79761f3e598c13a8e0f421402e3a1d86e6471efbf48f74217d40a0ad9a4ac0b1d7ca4bb7d031a0e3af711621208b5dc01c34ddfdae834dcbe7bcb699cca0a72f816b78b4c8cd1717ae7c9a20ff8a87bb60408ba46b0855445d844bd6d17b05ea00803d6281ec468642ae5247baf002c6b5713b6ee8343478cbb8bfc39d918506f616787097df20716aa54ca476c238846b0264ffaf72f944f55d50ef15bb0b675098ca054300c9c6252140da23008a52df28928ccbc60ef633ff6844708c01157ff1f7ed9b025d13d2f5a6dedc67936b8789006adef891dec8d038a7782a943c52155bad35b11d301eba0bb57ffca296aa01e63240730060db9cc3fa3cecd27b317e3723d637fdb09385048aefda896d6ed19e9830ec75325ebed298645b167b23b331f2b8a4e5dd146b2e7e9c3cdc7a3ea38a50bd5dd964a7c37caf423a8e5753d97101983c61186fc3e06df4bdf4ba122ff685b328eca91c416aa73eecc43896593b13aaed831e2a5544b2e82ba09ebcb768b6e05dbf98915a37bb5d9c21b05633c4f5ef16f9f649a380fa52e0262419dd93d85802a0be4726be82e23e4ab6f54642415264adb3ca295d7e15017df6371a1cd6b94e521641af28c1cb01ffe62a94e98536b26c9db30f7d658fa1ce3bb4953c62bc927e53cce34a44ef47914b5167c6e5652b96dcaf52b1ca3365586137eed23d1ad49705feef430bdf10aabe7174c1b8bdd28d40ef74ee9bbbeb86189b21f68ea4583af40777afdf732c6ab080f60764b44616d2f7bf83404270dff27536e798e6894c45513c40dca22bb5d48118b8a56cdfde61fb6cdd8a16e65b994bf973a5bbbe327286e494e8d035fca02494d39d57b78e72b5076d3e656ccc74aa1fe0780cec6fa1ccdc3d8dda4065b56cb1d45fdcabe004a53c560a17b72b5a39bfc25892c5d1d22b0d6d9884b1ef38180eaf6ce2983f09aab3f952f869a1ecc3ed0cdbf677ead8fa4788b7627cdeea58428a7b60c96cb496cf1b4706f31a771f21543912c071e21f360778e6f2a000ac629df204ca25377a07a40efcd35bc73517308c56f154bf4ac06b0bb42d44e85d3975dee3606abb969dfd321c7803a47db956ceb774fb5be47c116387433dca93dc5d9c7c84a17c8d7dbf2b85dac3c4bd5d5ce77e7c8ee4c186038f2bf93c5967cf2b3e357218185890c1dd06ffb944953c4caa9ab3c5aa36418d26d27d7c26b827ff4c4d03987d2d73a5990fc98e93bf5dd3654087c12b0975391a8de85a99851192284f41931840bdefca1473a9977af2c2f287b5d16635dd92c6a0d52805e0a0a68492261b66ec9e7eb4b65da8027cd282b501b1405302785335a6134e06e65f90bbf7a5a40f23123c28ef25966566e57e882a5ee5ecd237c1f6fc5f15ecafd6e3ee77b79e3227e42b0f5bc7820fb06aa75b25ddf36f80b230716f7d25496213701d5786071978f54eb27b0879120bbcbdf95e6b7f6d41e6eebeac4d06df033a2d3eeeaff98c4f8a7c2021178b4563698d40481e7c320f231dcb7245fe651800fb4166e6caeebf0d38f1e398699dc0cfc59918c732b6fb9bb379d797bb1a7dc2d7f889133c6e8a53326cf09279bd5b244c2a98702e50e492c1b1bc7db8de89a5ee199b27f3a7c1f589a7a218da360cacad2b1a390670568dc3146ff04226c4a8c815843c85e2fbec3a1d78e258cafccf0ac7c903ba86f4c447919ed1207c7fa0b57b81b8a5802729b117768a497bce95552e0d56258cf3497bde9204f52423a2fd67cf25b8644192c9a837eb3c05169a1033ec627488655a1311c8202d83e6815b085cc0439d4bff368c44fa2d433d2fe603dfeb61c59e0a600826709c8406e384075dda643c416d66739ef0f950b3ff8e7784f8e2e7457c0f8382b44bdad7a54278fe1aeefd45d21a9431eb99ab4aee5560b1475021de61765c0e492ba8a01efb8c423f71532a282f97aa9602c0d178bf0a537872d3cf8655e578cfd5da6f15137014bb9c5daf00e106c45754902690e04f674b3692a736cdf47ff530f9588143b7270a9514b1cb0c37022e52b79e4d214034be6891e624b9dfa0466ecbdf725fd2fd20ebab7590cb650b7e7e91a44c43a4b17f21c86c658205b72bcbe229dc8995cb9465533c875ff5a577b3db838c2f920716dd21cbb5960468cffa792074709d18367198d3797838e787e9c4e293b59010bfef5552d8d40d2f772b4cf181b663a383325c70f7c9f1ecd0abff883c3ad6db787a103d1ccc4b92c86b4b2671cf0ab8ddb6b06827528885b48ccb2a8872148081acae66712108c7b1c18d4f4a0fddf97718cc9d4e51e2cf84e8e47a9e9e5c5b155de5226f101dcd4e451ec1df2edcf44e49b19f326f733edcec8e501d7e9776875db6c397800d76cf81fde6850d69453db141f4b995da169ac989a1456b04c23b049ec17e0ee1fa437c3d8c92de4630765f16488c6c43ee908646d5dc3ad1191dd42ba9aeb363ef155cffb8c83fe07cc1f6d8b276e96f1ebe730c37521a0a4fc5f722219571bb0bf656d192a00eb117febf34b9192f2a8c5251108e20381ca57f5e8bfee7db59ff3ea9eb8fbf3e84520153b400aed7cf2c0cfaec396a55a32b8953854ae8f767a4a748e17b2bf7aa64b456b9b64e02ae33d2be9f975e7d61644302c0d804d1e840f08e9895afe7ef1d2029197eaa83c4111136560d15b0383f2572aa6060e4a342529991ebec148a962f3764d14380ff6a96ef7eb9d26311fdabeb79db96089825fc7ce374d1073f7fa538768cc06e9fb9fad29e4827fcf3650942d3d8757390ef0b0f37bad27574b78f1906fccaef9d8657472822a71f20e8be32528cb4e184411402840974a5ae6ab0642d1eec1023676a0e574d0448ade280070a236aa012b3c2a1f025d4e510a5c74424b45b804511d5e4510c5e58aba5ef728eaf488b770c0c91275515c8bba280e8d667d11f94b90a9744b4b6abaf919f5db63b3ff65d93123a603a0c2fea57373fd2e399301777981585cf80370a49bd17c64a153edd99ff4b35a7ad05b5df9200ff2a069bf02560b212d8e4e294efba922b96822eb840157fd7f94998c45c5da28bc4bc9e4169bca8292f82da42a7b59b05bf1e3b7b92666f2c7abb349f0dceccea2c8a0df7812747d886b76a10b0a1d9e10a47012ae803585317693d5b94af88181ce3fcfe2daa25b7667af3de8b46fa4d769e33f49acc48cb6e8c876f730d174ba08490622c63c295a63d8ec405979673a55575f3661a4aca01dde7179386507cdca3e23b841e68f647f1773e8fbd6b9559289cc490a291aa9db4e1232d90218140fb187240943f72cf03c8a41389f63afd0510a3f09571e21165aa75cc1f95f147cfc9deecf56f447883701bdfecbb4c0467c54921a91bbb052b3351c1b15df75d1e6b18d37f63c130ba46eb6cec01c62b3478b71be3b34cb1e6bd002294ee760da1e05630fe1faeda0731413b930abba584107f43c254353d1fca91a67ed0adc550183e02d19d562878b83f1cb8b74050979dd4a0186c9da9d9235f6fdffd67e20809fa3f4a1c0ba3a73cbd6cf8cc6402e04c3c08b2533b6a38167ab5bec8c0280b409a96af7dd2d5e10a6cf5f5c591c0367d17ed7ec449d66077b70965da8459e78a59d642fcde138f4e20f7034c33ff8601b8aa20e48bbbbc356dd00a479a3a36132bdc407095f202e1a9c9b18a4e6db6ade084575677387f2171db945e48384126ec548c728058d8ec61c8a52f6a9a894af20c8f51a506f0fc8e90a050e5015bf0324c281edfe02c85ca05951306d344e4e204cff6bdf160c3ebfde16d912fd176f05eb0bb00e3242e1adca8f0db8231f1111a2597abd8e3a667be2e2dd8f590e654d8446e82138e71b5e729db17f94250e17ee6496aa3fe2cf84d8b4304ac7278219448f31e3cc25219a01316c4f5cc2a85c7abbb647ce9368742576fe794e9d845afb42ac57af7f125b41fe928fe5712b99c1a10e30f8777827a1e6954607c0526c8a2be621ec9675b3e231152e74db3c1874800b6f579260b0aaf805c25895255d56f4117fdd5f0f7030fd07b4584f7d0b6dca00f388603acc89d82a6a92f091225f51371d14f38d9d22c132eb1a9d6bb14afce438b1845eb625ac8539f2cc06fdb429e89665d5de098b7c5b7923b12b4fac6c2686dbd0243f68d1c97f02a309c9e606cba5c11de7dcc62f9872638b4865c08332c8e0fc01110a54914478964dbe632a475dd6f1d21995ff10c05855036269131e31a9abea2ee870b9bd74c1d5d3741e1f6872001ff38f0e6d4ee263b58b368ad2ea0bab2db6b34c5997abbb358b3b6f87a76a87977c70f31490dcf88f866e92f18a3d322f47b82d5fba62a121c5e1bd3c7ddcab9ae4a12669bc9f9dfecdac39e01a1c7fdbc7e3bc190357e2276fa20ad3aade0942e6c14e357758964ff41b3e86f0ccdaec1aa52ac863dfee030a25287fc09e425e95ac7a3ea1d8350dd3f33b6c8e49cada6252826867085e092629fcf6c64d170380af41ba59badaee3b99160deda27caf15ad21b96e6d3f917cb8e01cbcbff09bb41dc2b8da322c590805d2def87ffad5ae3e786bea245812be6ced2476c2563dfb26a500ff0340c4414e9b9d8e01d14f1bce82144ae48a34f73929223dd3dd0b468b54ab9400596d33b7134e01741f62c9223d48459696385887404abf595205676cb8933ef505ab1004528354a10ed75f43c28b6338df8b92c24f7252054c85130eebe286e40f87a3d201e096327b7b16ce125addce5c711d4c01eebf78ae77a22ea605e0e7a2bf413267b9b6f1ead87cd60161aba2ef6757240944ca97a559411ee7c8941291ebe05e4060abcf86845bf4aa5051010a6a565e7adc7a0dfff1deda13b34ee8338c088e7007e59866c0c22f90f1be466e9f2d5856c871f50055bf2321e23383e01ad3d2ad609b03a922296205e4d106dc5d357ebcedc89ff7f563716156dedfca2e53567dd2cab20eb0105f0290c4ccc1a693603b0e81785bbb01a4271bf04212cee6105eafb675cd203635e35407e1cad10e13223e6f8f8ff0b820d2e4c2dab91f87f167a9ee37eec3c0fb797b504678d5d84eba1cc588dabd39b29af34e07293a993b94f40686d619d74b88d7c0382b08af0653ca2852a84b5c5017533f426bc36334ddd0eca9c64e682e870e4e4229f0e221dadc9ef30e0544096f0f7937321567e25b2feee21ed673af7730c9d8a0de15acf73ca5b9737d98ebabda0390db035fe964ddfb40d4e4294bab659331c276860736eec7f1bdad635305cd80c4dc7943c4fda67230a8a2b487be648cec3ecd15f17b2765fdd8f80b2ddd696adbcdf608ddb7b24ada4a7ddba15d6cf18d4f041b361f6fe4ed9bc78072045386a93da80b9612432211ac47f3fedf20b9d1c44026453e47224f1a9922854e3d8c9c65578a2af4d4413f9a797ca14babdd55aee89181dacc5a553282f58466feff2fc07e07a627967f226664797be283e50a3c22e24c4df0e3d49c97f03c44c49e8cc56d60dae7886a1e54f239c931b1fee4fc724f81931062cabc5fcf1f1fad8001b2efd3af354653aceb77fe4cd00f5c4a2dee3cb8e14520ffa42c46d8d113067b56ab547460f656b968270e315b15ab2021a2481b1444fc5817f3b2e26bb8e8dec236cddfcaf4615e4cf4cd0b0ae33d0f1f2f1a8db6b0c653794d6c428d63aa6990d69f6408e98c3570dd8f5e4817ac8f17c7c24994d613edf042c8610dbeb8ea918245876c6d4154d842c2a6a04d31206d3be6bb7e98a8df4a734040457ddca0ac4566fb343687787d6032f670ca64342bb62805bb98a74114cf30c885c193b181a3f699109184ff90d15551c067b18d6a9961a86af5a3aeb64875a19c202e3de957c29346a026f6929c59b08a940bbe6de5c808ef989fffa50498f1224b2d252d0c80200c97ab64a7ac4fccbafef4adff654961652904c27086e0cda4888ea4226c103266670dedb8bc42c29b7fb3194e1851c8372d9b16bd02d2d168ab0235a2a4347963b4f2b67aa347b48308d0e1c53309af9d2af19298f69c48f3d81408cb301580552020b82894b1aeff5b0799a82a1733f31c0a6f5781e6a0bec21bce1f7ff3b1ee036176ad09e991738f5d0c2d853ab61948e5ee217e394b8cd89fde0a976a98b38bba237af5809157bd2a9196b20a702ef7f02a5051ef42a7b6602d6345ef8377d9abaeb95e2b86cde482ad6747f726720ceb38464c3592cccda599652b3ca58ed8ebfbd5f783f07fdc6f44337f325f7042f9aa685a2ff95457b2c150621f8a2676b2c953aa2b527cfe0fc7e744b84e7fe790acf622d71ebcde262c619ec9d591d2615ac1880bcb48d87f4102bddb6b13716c884fe51ab0ab8f97abb7a76bbcd36dd0f0d8774ad227ea7b2b8dd43ac42061c6c0919a638210d1c90bb093ed9f5150b96b0cc874f4500676db4a91b4c8b580919b9fb3dca16a62e6dc6c6a006f1c6637b7cec91844ba3f37561e5097845b5f967aa58b6130882aa28b46cab518b289a60b8d071940710c7d888bc153d1806db49393796545207dbd82d7d14629b72fb32e7dbfc3f618afaa872c360720361466a98db67a2477e29a7dc551c32d59444953025526231d5a17a18a306740d6a12c749110f6a06e8b8b14544563c70447375f4f62d0020d5da42e2b1d94b62ba01ae8c2c7f52c93c212594516e4c6907d9bd9b3a9078a1398a198e820366540eac3b44925c5bd4e5ef7dc45710eab795810c0ca278bc2e8e9cc8bf182f449ac1ccbfb5c1f1ea8e23f6a50667d7bc2787f89164e78ba20073fb5311bc099ec2706d20313514a8ed3d383f9e9249f67d8cf7e0a2410eb4a8acb5ccbab66d97189e9209b5beba247ab9a30cb350f9922e34e9dda6cb7bf5d5ca95e6c9685808ed1e44aae54adb9a4ab41655c8fa05d8e9b482131fd9d7e85018f1e0995b7e3a1145f0e07226d5047cf09848bbc0f2795aee248b6a1134a1b719b3d2fa767d65439fde0b6c0521a43b7da7dbd1036490ddc31c59d0fa47aeb601a06b7b9675f9f75726a80285d342bc5b29ed69adf24fe6c468369fc207019dcc6502328dc8ca04f827bc011980780ed7c08b2c1c0db8c941b8ec6d7fc0632383944a9fa2cef3f9bcc72bad9e3e96cf75a239048b5350c48aaabcbf5503506d184fca1ae1aff87edcf7c0098f3920bc98ade9b7d20005603c575c2e7c4d20980e5b6ce2685a65b44f6631e3d549273e21f49c786ecbc82464228133a42ea8125bb12d3b9f8e23a5c338c28bba971ee1ffd25fdf7ee7fb7b5868d9fdeffd9e97c4723dd0e7edb725654973cef095baa0106a3a0f38669cf758c6b8969f0d3165c1556a20ab8b8014b7d6038d7abc76a89c6bf90ece3961d644e0431ffa09ab6a7431a442e4e94324d30c6f298fe17afc1cbc168966a0f20fd3583358d99cfeef2dcf7697063c691e70ef9821e28caca94f65a44ac0068834f29eb0d65d4006888c8bbcba9fd0ef3d93ac413890150dd54a1e0833ff8eb6451199bbce8b5dd4b5ef59215fde4878d02409004046310f9cccf7bfd4cfc5f8a9258d8e36608ae7de01c8bc04be15e54d0ef822cce2da81c9020a3de3fadeeb39e0e6cb128bd1ec3f3b8c76a89c289a2b4e56392f80446718e6842fe4fca5fa6ffd21bb348a8b7e77706eabc69e6be42e1b9d762de5dddaa7e5f6f01afa06f5c85f0d3f70c865abc1356cda45246ebed3f65d860880eddf8408fee640af80f5e31b9868180d488696baacfd171e0d7472c5bb1e36828819f9f16b649f22b8e4506e93ff3c45bac6a1e969e663bbff1b1960645e0425c47b2945bccbaccbc50a35b12e779d86d02949f112cb90e4896a832bc6abcaf4aa286950ad8cfc08f8a547f7ed37f318c3029b04cdf83347c10efbb1517323ec9aff85ca5b7a6119b5fd8e219fdb76f726330ad7fba095771ed80b31ab65009a52d13a7e2b84487a6cc82210a2ca71fad311a898dd23a51e9ca6e5c92dc74d621fa779df65f965e31c662dc22a93d837494c706a3d9f40edde3f4e1ed77b916bb7664b8ebf6e12ef89839aee22ca7fa1b7e8e2418900ab6d8c5e697299869b0e5ace75808f0c9e9d5f1f60a3aa16c54a5c6555cca5793e9f10612e7e63ee77c3a88ee917d157cea82738509859bb5416a8e119d2cce95705a93003a20849c023897a597a9cbd480b2cde94ac5c68a51dbb8a448edbd9b0b57ddebe337e1d55933adc5010c7f69ecb625ea4fbbde4e1399e02acbd9c83ee946e6a39c2dbea439b0b2ed055c6ebe32bcf2e336a593089507c7ccb70a10a18d2d9328528c7974cdf6b0d2105aaf239efcfeb418bab8397836939337929f0c8a8bdcba90414abbadfe4b33d5661ea0a0698cb8968dde6fca068519d69f56af5db6d7b19d9e4588e96c9456d4695eb1eabb13fd18435a9525208422d5794c9a40e906a6ac95a300e46cc85a21c44e15bf294617f306d2dae40511912f786101b3cf6d9caa53a9a39433d24406efb8c816043e3c8844c3f4382b7d940f4bbb94cf0bf532385636104fd77ef6e508d8256eecbac9315a7735340abff7d52935430c5aea522be8299227386749c95fbe7cb015e0cab9de412219a60fe67cfc903edf8e6efc9be59cfeea1ffbc16fbd653d299aa6f9860e9b38820d6cfc63757254bc8801563e5002d327833dfcb5aaa574943794d570b84b1e85b0927c14b2231ab5cf7b0d76c71066b10a99683dd4a705b774aa4a912967ab837c5a23837a671c2aab2dc82475cc445f3d7134f7adc9b77ea73d78e3eb8f599c5db2238469edb089ed16245ef69c221df8d56d4403c44ca68433e156cb8857f93c368b162b2e1c908c4e20ec0f59710f9b08416478788677652ed232398363f9bbd8aab53d06b8d3a0dbc2ddc9f89f933a03eda2ae0c2a7ba19a5760852dbae2d7b0b2ea35385cdfd5258155d95a05466c9fc5202dcb9c8e094318060129270c428b2f8cf4ca8d48c412b3e48ee157ce4711e89b44e3b6f1afe757889b62a04d7be64d2fba085ecc48fdd771a392ec6ea67d959c059487d4290786cb5b42807d0ff908c42aa7a284b3125683f2e5a0d9b0d1f5db52f06464ce69d7977aa7660c5d17617fd9fd307be2a6ddb259eaa489ead0cf2fa3e7f211edf972bb96acbb617ed50ea4206dc0b32bf6b58be86c315e1e3d94c62f12d99b5d7d07f8cca24ca7aa3d07c9d604f87ef10f5caef3f473a957ac0a09a75c12c14e6c44c96ac31e4b92cd122478f4c97d57458dc7258d7d6e610af37696c6f9b3720efec39d6913c8a21da256f8a7db4f4eee1e5ba09d64843c31884a34369aeea4d6e81d01119c05ff2450efec20c6a701e660129186556af63443441370e7c2b853ea907fa5b35be48801cd7a5915e48a7ba750b9ca4ef18b49672b4d559a0ec824d96c9ed7114de798ecca674eb9d838763c1c328c965a21bea92cd356659654df3cc498ed6861afb2b5e12ccdb9644ecd50e63c8187648c3fc78e90605d383050d06c698b4bfaaadc640a9d1b587e16d3ceaa08ddd19cdc9aa581cf5a4cbdd72716dab15410f69ccbcee135b7bb046f5116574cce639e01a4531af3c5b5014167d2c54565e0285579e76dfa1e4c767ff098f9f2bf0fac3d98f2566197533be2b1db5c41318c64a892c018a79fe75417ee69f46f85b2b11ed4e587ad73a7487b96a31ec88d3d4225562c47705dd49a37b793a45094d2667df55604aeca838c828807be44cbe7d2425319c7658b8881f28993b77df6a626e1f18de27cec4eb3faa3f4315561df3294a648dcf52a5a156f3baa527f363f79af12b026434094aa534ba543a02812448dacbc081d556ef647839b47b113d08852630a339a4477da0fbd58f5ca2d42fa4d1b58a46965a88f69ff902cc0e98876bb58849c36d1479c9b0438f24f1bf4ac541d85559e7e713ced8f62266aa0ae34734c767062da1f4479af6727f2fba8e0fd199c79638abc3d4753b1f5f53aa2861e569d1c66480877d0ce627f6dd85cae9e5367cae8f4b0e7a118081d34eb0b0907ae7bcf2859f282937a17c6123b500ba5d3290996e93ea508f492e891a8a031995e0fc1531e4736082058914a4216e7573f72b90eb1612f722395b0385f049e8c8a5cb9550e1599c01f998157ed07a4ac8d1c1497c6fef14b3fd750fc521950178d03ba77ecee585a8386b892e9338908be4d77d4fe6e723078eba2c46aad556912c0de557f41ba973bb1ba27ca1c5cd16bbceee75967122561dc48f3ff66545e0c258d726b7e0dff09633621aa71e479d3faa127a298f658902d7f71191b679f431140350a5aafebd3a1f9d0c4964c0f627641dbaa5871c6883161a40730fa3b73dc887893a60a81ca45f340668c4ce6a481915512e42ca2bd211f72842f19b2ccfd7439f98f14ff858aff9d4ecd6521fcbbdf6ce83220a954f8427a4b23636e7427616dd18d13a55636d6fe150e778590b960a1957a56291c00499fb67cb33a07d04b4a28c5b56f995c1c640c11381f678bdf310d618056bd0e5ec1618f00115b1b90697144e107263ab4140a893a0798762e77ceb637cfeb59971cdcdbf117bee6e938611186ee776d319c59844bb6448f3f367b9cc570f265e103d1e12917168f7d33a75dd14b8fcc14e8aa97bbeead6810b8f828b99589453f7c7cbc3f5a096ba08de317fa0b28e8a1dd4e78e8bf56cd5a9148fed0940b509ec6b70b6db8067f02018ce02cdaeb2cff95811986a3b1a9603dfdd7d808d1267d10c0e5b07866accd305e36a87a8f52880d1b1a34d7b604196987126c62d7c427310ed24a35d17386a2335ad73ff25826c699e54e3ed4b393611ac8b42acf657107592c4bc2e56733892738112883dd9b4a04f7d4a071fe7c727449dd5e9bc62bbfb8247836c117b28d98158ec86455962f1b616e857141f170f270f72107ea6443bba653445da344c9056c95dfdddbfb27a3ccf2a2df3756e166b9149a1a44c9021a270b8db8a6df16a8c68e80446bdfbb198ebae2d3dd32f78e839d61a466060c1c637c1029158c154dce4390898f8c7bec74d681e88f27a0d9af8bd1739fc66c72db2d81a5a992f2debed4c0ecc62e9e289a41530d2f6dee94a821465fc503947d5e7c7cc3a17f62db6ed4ae4a68ae112c33fcc9cf1fdcc2cf654fe0d9cb1b00f1ef5451fe25a56e6d25ddfeb25a41059c72cf4c9151b801f8e16bdc30b302e2cfffa9364fb4020379dbf63c4522ae1cc88263494aac5d8ea1abae4a5899fefddc3a9d98f65e441ac6bec66a45420941a7aebb06fb6dd6bff71fe746548542d8ea15fd414d1b3b9eab9ce21fa641e57d61588fa8b1e61265c1c9947aaf600692d6cbf85a758804d84bba5fc67acb9c07d0f63a406023cb90335dadce79ea5ce714492343198fc92d316cf7d7e6c6adbda94b5aabdcfd5e42d8be54d588f75ffbafb2ba2c55f6a2475bee445f80a722c370000b254da4895f51361dff1819901c247c16174ea698ce331bafaf0280aed024044032b5bde30ff6a70eca7adad144defa86d1e8370f1012f5743c54700a6594856727454e1d277ee98826e8a66ac08dfe6a3410f41b6a428a192c18ce3e794831c8fd38bc43f6fddc78507194dda1a0b56ed8eb9e9883dd527bbcb973f102bff77ad3ede3d3ed74410f391219677890d68e0b1de4605c7b159350e8890ea9d13e63647e2740cc997331febc601d0f9a927cd74c1f7c03a8ebedc309bd98c3b618b9cda72953f628e26d2cd8c7f3392181aafb790bd7f85a24d7b7e3549f430e39d4f5482fcb3f74332f5fd66cc1943e35ff15d799ba3868585922d00e79c0819ece439b2a59e2fa236c82fc22d86f60222e48f7c18d78df01d2722c858ecda03f511dd3ceceda3872aa3c65b048d49c5024f772d933d9d71712a65792a4934d78fcb9ca3aae0eada2315bf84b5954cf6627952a22db10ce73f0adcb7504c744a43a53ba67b81e862bac739915a007dfd749de3782bc4104c70280031d8cf417149ba0a33b7b9d5ac8ce9dd68d76906576938eab30edf860849da6a657979cc5d727bea695855ac06515c44ac1097785adf7a65c7845277fc85e9637821dc52dd30fff99d317680b9adca818df1a2d30aab5b8061b29f0960afe456c7d3ba8bf63d705a9c7fa742c499ea7e637e880e3c05ddc46f540bd1810bcfb8ca3b0c2a1e85b424937b478dcd506400e67af22d970b21d663ed212e055d85dd3317f94f080e362f5270038f90eaf6fb17a56fda57e0936e3d11e31121b365d6b721d15830587dc0b68fd60b1a0178e56fd04929cd0942475bae8332a29f2f4967759c3bd4642345f5d8cfe934dc0f5fbf07f24f86bb944594759a1c2968a91093fa368e6928121ce99de5a295c4dad7a784f40c26db01d4116b92ac6beaa6f6bf5e7d194a1314bbcb01a954ffb01780bcf95246193cdea906157ee56c44fa258d31093b94094552bc1dad35e2f943506f0eb7e472894a7265d9c3129d69970b1454d398af10bed1027030b31817452d81ce95e38f542343076d80676f8ba904696a6d332d6b24fee02ab41d1b21047424ea784b99d9343797a3cbc3e9e2aabf76d45ff05fd346587075d8720c031a57cec38bbc149f55237adf8e806f37a809739bbe8c76c6ceb1277508544628ba278169207733602ceb78878ada8ee5f1a3fe6634b7ce897cea10e2ea96c7fa938dbb0085601a4418c169df588ffad6115972f435671163100542a4ce05108993ebfaa478d5496fb2b2d0ad41176881558765b61f4a7d49d8cf772bb50e740b027c17a5c2b1362d097a7931cd47669074690a4b93a5d1a8451f6f669bd4b9d42a9540c39d19a43f6976b9e61621b285f7f01399c168306637754e931d8ed52f7e699b2abf7aeb19f2ca9b4fc6b293e6c0023173184be1004dd76beed454deb29d759287995bce0132ca9cfe82add934aaea4778c3390a8efde7744305cfa124695d2c2720e36560981ad591244fac3022d4f0febb88ad6cee88adacb3293b0ea1593edbf7cc317ec9920e1c6ffcbaeb0ea3d01ca374d9176be64c80917a22c0f93b406f0797ccfad219c52bef0f1ee1b607faf47031f673d90d0333279725a92b4f0573f6061da9b766576625813a96926e85e0c32e8f6c2fd3666a98a1079d6142b6f432af351d091ca771240ad55a412208e8c7065a416d7d9a576945f698d39975f0f930f295703a9b5f173c8ef81bb4b2f6bdb085f21bd7573edcc6097131df53b209bd84e9c25a84ce0692bbc0338cea73d253d69b74803a7ebbc9a66594fe6dffefb490820d95166426cdad30ec33c28da9367819f22fcc3fbdf24daef0a5843f1c421a2f9d43996ef382cf250f087048fb6e87298b1797b610804e672ec1d73904de93d9a7a8e41e9d01a6eba4d925144ea1729f78c11883f90f77f5a5d4e1834bd57c5fdb322c372b3f4269731b8eaf6ce00743fc269531fc3dcf87017f6344a0dbe81fa9c8d4dee0270fd524b2e3c26d18b68e7519750d8912c7cd11390ca69fe16f2c49c57201c2121856485b5ecb6354e2299f4c61784c1d896f66e7a510cceca5f8da9413349585b29498f89761e2ecda4657987f2cf885b1d51b9d5dad4fd7eb5dca51965e874e1bfd3976e1f0c83982bd4686654cd78a33c635568a23b9ca191dbfaf82c9a42a3fbf6055edfe96007c7e625780f0bd9b35ad2e587ed417f1cb306d4e11bbfb4c0f989d85298b93235361ceb879035cd629df292917f46d8bf05d52034de24a07bc7da7a65b126de994df918dbfadcae5f2b2e7f03960224dcea71f79df5bb54624b583c190d19f5f66b2ef256997e93d19cb5965e08631729810ef32a94282da2ca7adee2f67d9ea64ec89e429ca6b69c20bac13ad4eff2021b1f3a976c1078c0f769e730e75f366720b1a6cdd5c96f89529a4a789f067c74d8583469d00250ed950c33cc2a8fdb826befb8e1fb893ee05b798f8e61e0fbc8e5244024cc6a16d3bb027f5b00d65a995ed4fcae71f2497d9c30d0be46782722499b4759697eaaa026d29e554018aa031e8e959414625c5e7678da1c585283a6a84ad05e919c0d256508bfac1c7c832077956729352e5f5208ad07d940b2bcb7acec95ba5ec523f4b6714b7eef7c4413ee07bbe697ed2496bb3d4f0131d581c9b93b52a6984edee14f3e1791ea551d2fe0bf9292951abc49e0cac1086d45aa9ce4b3c5a33d9be878da35b0a7be1b1739e115fad53f35116427c3ee33deba3794fd203e439be2b06f0a1e681acf7925bb6d97b5af0dbfb9463fb2ee9a4201cb4b85313aa66d0ea7648f677abd37a8c13491172cb3c7914553e18752007ef551b0484da54b73d6b93e1ee68852194b6511964271711608b61f53218ce6e826928a71d094d182b1c2fb4fbf3e6436d146300deed6ddd4cf89d2e5dfcf61b5b5978431eb17a0f9b6330e9506ce5daa629d4611d87c10aaa5ef362bf38d356c48d0596a1c2d576c5900d15a165e80c0b529c2032cd3e5e536aec63be6b92689306a5478d7f624f3a1858ccdbf37cdc653956d734f2cb1c08135fd7e8a86b355959dc1ddcf45c9124d2f23f4edae1304fe7a0e51e35203475b34fd93ebb4fa8793b3ba0f08da2b2079d516c701c0816feccc97a11a3b24d7e31eaf06ad72d35f2e204cf52c069baaeb4d9d05bf9800c40f37d58fbe776eee1134996121ffc01c40907dbe18133b1337b32a9a3ca34ae40a9150b953c0565901dc9109388388e34d70c13d65370639201bfc7a17647957d5e846c744db6f5c9ec6fb03740c3bd7019baeec2d1788b431b2da02466e88167f1515fe352e7c566bdeb318ed34d1e08f780ef1dab98e2a8639d6f24056719c85b10a2fd570b4f8677adb4a5948253075a963b645156820767d321cc633aad88f993953515126b52f6876dbbdc90be5b0082c9838567e762b383c2928d9e1683b74fd54cc9230d53162441c917e0226ef3d74fc82f917e12dd19c0cd3c1d227d3e71d70738ad79ac684e731b8373afd60a11b0bb05f882855fb7319c5402b502116247355dedac80bdd095309d42cf6b5bddbfb92502bbcb6b0dd1d0fd96a69d39b70d46adde1a7c9f4c711d4068334d0f0c0361e2b7be163ccde6250b7d143ab01d1efc0babb4768e5571d2c1e61f556cf4bf78092ca97fbbfc84aa6f90885c65047999c84b682c8590396bea72a047ea1bd1af26ed267c4991085a69bebed46f19995d439c6951e190a50a5faa46a5569d36706cf032f01172623425e980b05f16b34d4a7555983b471560bae48eddf71679bb5c62b0a0409d37969253a5b94704ae1d872d73826ea7451e59271ae78501afd709c03d28ef559e460f0dd7ba5fb916601e271b68bb9d97b30c71d9b60dd4ae7538b32a94a9d955dd8b9a7489dfcbdcb3b996030ec47b7c09d0743b6e0667e5c3dda8b92611f7751e877a211bf4239e6c2c3b2519189c080db2ddeed95856c240c6f87282736469e1a4dd631443662259524b58de844775ff5c3954d29997e0e5b4c7475b459b5f1c5306e23af120eff20eb4ab32867cf7d571359c082da7f0b35afcf328901ed150f9a7af692da6ac2f26fd5d9eaf9c988d67229c06e3817010c81eaa8e229621335cb491aff6dd0043bd926366d944e2c900947b86ab12bb41d59283697ea9e89e613ddedfcfc8cca2daf7826aa77a376a3594a6253cd493f0b281ee94730c4ab93c0bcd13cf27c1045ef37889f5f4a8146153f1bb559c6299f6ac1317e5f4f10a6d48e62774ec349ca51a2453c86db8b15d67c5babe5550d71a4bfe7d2c15d71bc329b53ca1d68e5f2e8d37303c12439c20e81e752afb60ba399420b5bced5c2263ab83296a15e2b6ac58f6b0fe5b894289fe7e7541e7c98d4fa91ddd9dbca984b435e3ff58ad7a48b2920676d96fa94dffc4c27a4eeb4de20dc8c6a0b1df803143d7a2eefabf7d57050e5816fe46664b51cf5d9bf8af41d74d27079c42b1321ce7d77a63939cd78857bcf5ff6153fdfbea1d24876dc4b289c745c9fe13ebc75d003573393c2e7ed573fb558613ce96b84421ace322eab315e0dc890721c85dae8c5fa764d251d01270f32498b9d806dfd46ea247fbf18a0bac67c62af666463cac73ed654b16c4ed7ad9f344c64f70a6ef17c62d5c54545fc97a96a978c8a59f798bb44e7a5ce5e8321b2a9944b92f4c9f806964c37a95dc4ad23b67bfe3db371f8d0e2909e1ad3bebbb9fd80f6c75459f175b551d8ddb01d5f3a9f0ce35760faabd70c352c5c1004b89444cf822f4276bee4af3a1bacb18d00582e9ae003f662a2753b6c766fec51fe4920c7f1c0b87231bbbfa8b57510484e9b966de2c698d39f388eca58174af164639d45d64c572025fedeb0696d92a765acc4bedf382dd7478cd63b59cbbf80032e92bd5b116148882213d87ef93337dd1ec08519307f7da92a0fcac0810be4e1c40d88c741dbc94257e00163755e107906a29379e5b2b06a61aabbc89b4b6137ed6d2e13cbcb594a6f0533e8199d45cfa17cefc07a5c260bba495aca8053375b3ce277c1411b7f31fa8d25a79ff5d692797046812c4500e60cef592f4a06555d731b3d3474e3d59e880bcb8e79870cab7a24114fa630618e3e864c5f70be012271d465ff34f30afa4bd011d0fbd0afa1acb1b77cce7549000ee848da1f837a90104de9f7c07140296ddea0f08f95812e2ea5877ded855acf705770ff10139fdd879920129950307ba6a3644d0340e5fb0d84e7a8503aa6be8dafc304d25f32e6257ecb26d4b4723aa543bc6eb047a0d0a8bb36c2912fdc6f0428719d0c9dac072e7dc461adf9c315a3ce8e8c4b2523c322b098f521739bd2709e22ec9e7a26e1c46fc47270d53fa8ee452e5079bcb43fea4a68a552491b92107d1400480cc108f3b06d29377cfe66688c8f7c945df03c9979071e1840507fcbbdbc2f374c62c9e362b0b72fe2fb9d7638e74be7e4879c2d92b602159c4094979050460b604c53e005e60cf2f9d1043267cf1468709767e1daa9cc186135e2259a715a511382220a8c785edef38e168ed5e6c9d1d205c1f0990123c83477a2b15d19180a0fb5de5e736eb607ce887c33a621b04d829a7160385799d5dabd07101960af2316ff74f2422e0ad2a2b4b84d83c7899cd84d7fe801f4b68a2f7be5b98861a02707f4eb020068913e24d39a83cdd0a4c2196320396400672ec1ed154474ba9ce919c2cdb73ba05e85fa49d73c84a853791fa1f1b831af982ddfd94017aefc5dbe1b3e34b90b39dced3b6276280d93338ffd33e58d8e719c94ebdc91278c9f2dfd9ce1c13bc802439b2667476d5af415952a36ee420aa287fa1996658a2a5f61eee2e0d62e84d8072b21d8a2cea107fa57abe566e21e4da0572dfaba4597618c3d250d3b681d7bf82a34580c50a80ba154749dabbcab46e02a8fe68719ea8e283284cc2856203026cd09f26b833a8751fcc03815747db7eb0b8590e620da186a7dbc536a4ce9f1eb22d664dc20875e7865785722e422f6259f4bec71808fdffd74829d8ca9801173b82b86739e8b5e3febd6cd4f2ee50da2b57a45b4439451e40ff0071a40a3e4e4403c533d2dcbe3e8227e16cc8b377faebd3b982a2d3d5d95373cf2496553573db2c345e844ee32b2d8de61852875520ce514235a739f11c670f583e31f257f645a2f20d2a721699af6c5f44443ec95c7a561f6926511df7f24df5468f831b17c453424023eef12669ef6a5e29fa72a75d2ff0b46a0922dc9dda9d2f277314e780616a3363505ddd5b22bdf361c25c98c6940d9415f632977910be3d8f6a574c1992a92bf2177bb24582dd046362be65d78c8028c67ed793b92ba289988d7f8c5ff50a278f0105a9bcf091fb62c353badfb731faf2ad1ca73a479434289d587579231aedd178fb9133c6a5db3b6306d122ebfafbf0a13dec7a8bf60204d55bc2175333a9f2d3feccd1d41cad83b13909f926204a06f0657528e2bb16a0ff64b4ad9e14a4fb81f957f6f2550419e10b85b1b197aa65836437a21842b5fef7940d4e6286377c2288ee1f36be12a664fe851b8c4902007d27c1c2c3a7636e2966ab97c9ac0e1ad152ab7c5fc424ca5273d0225c07e6019cdd08ed3e2f0d353e2086832e05b719f07e27da3071091bc5dfc915714cec75f8681ae3d39b0e2cf994220863db85eec6e5e71b6f0b8174e5499b0a357991c962d45044bf268a2946ff5999669733d73fd5cde7d61bb5d503f7f22b7722411724573f87cf7ca012409d52e8920a2448ea4f6a5e2542ae18082bc0d5c4c9743a901c14d9c4278a6fa2b7415766404fc6ec08f1fc85f4b6941e2e2d6636abfa3afb020229cab8aaa8cbc98e6e6c5b1b1c3812c322c45b08234ddde7ab705ed7545cc8dbc88726a23ebc717b7226496fa9fd73158e010f9a6eac14b46200cd14655539788708e40c876bebc59ff7ade8637113a37403df2e7be72b8c7fc5159ac7a17e25ff10131ece2f52a44bad024b514a8ac9802b055d2c4f6742068fd7ffae80bf9ee287b90f1750438f865de68ac12940eba66df42fc1e5959c9ce1a4d54f1e43cbf92eaef58bae2959354d0d28a487b3aa03e33f8ab7cf8f6c18dbe580fb6e7d05582be29828613c513520199dc3cbc12e33f16f02c0cfe9d86873111450e81154156223bb6bc475ef2f6cfbc62e490be2446fa7dc90169baea76288e3ea1d660f5d245a0a71e141829d08f76dcf94bc4f98dec3f4e9308336a6ec8b5e42309083905c448fbcb06cd344b555bcd7748ad78e89e5a64f01148920f6846983478be24c689b03679810567220b9aadb945eebec019ec8daefacbe14a99e4b3d1a59a7bae9c5d8adfe92511543e963110ab331b6b3604c7ff2f509f295c5dc4aa0e40f380c6cecaf82398fddeb3baef0881bf979e8ce18e4b9aebf76e14d61382320a574b78c9d4d488318a426ae802791045428fd65fc1000e05823b880da156a66287d55b28e6b95f60b70aec950b295d67108fb06acea1d26c5fb0dc405cc13eba072469eabbc91cec9e4dba5d6a534869a09973091410e259157486f3e879cabdbf337ab22a47f528f0da750f324d352c31190efedfa6b2a9cb399b62910a8e6d33854758b298b317e0285c5a14703e356431fcd6409756e3a29a7cd78840566afa78992a2feac91546b657765dc08e147f2cbb9233dbe9d4471b0cbe778117a1c01214dc32fa0838551510e68b44117e5a683d751814b3c3dc4f83833b5c4ae7e32fb5aa453098664368e257b2e154b41101315f5a148e4766f43d790e23c957c77b61f94253dafa9dfbb9fff283098e52b9ae66b9e1ddd5a815cda44d387da083df8c2672cec6cc18584f157e35584735e5dcc049a69648912d0a01b2635fb58dabe7fdb59bfa5e08fe264d92fcff3301479c36578efe9456acc18c933f2f25669b0a2273a98d25b40ef17db22de9e12940856ec84db71a6b2ed497d25ed6f6ba2638d6a4ac7c8bc4345fa1222a8d8183102f301dc1dda14270349e34af7aec928834fd4fa808c7c53f87cb33b8b5c97ad1f167b2a85933911afc37612820fc1266f38d309aa8102b910c350a65e91bc6b1076baebdac12039976cc09324bec1247997b0031ef00ddd9b5d3e7fccf6bf7f7f93736da9c9081cb18f4ea80f525c264b36e60ea7578b73064249972e85b3059dcd69c99a819826a692199753bd46fec790dd1b31e879863b9476f733a3b5cc97decfec6edfbe03e9b2a4f13ab74a444e99e48f889d676b20b728c7f54c6d95a54ef6e8c3edd3dd6f79c0ada32c1633393f950f193ccfadd33e1fd1f3200004cfcacc5974ddd6e893eb8cccb81f8865c81612ee91d73720b44eda01cd817d08343e58941c1ed337105637e0c4c3cc9cc6763b9df1ba734f18d8a2d27fe567777cd432640653a2bb8d234aa0f0abf12dc4e70d9298ea12ad93d5af7bf696d86368a0ba4fa30ba3ac9857010305024ab8152de67e35e49469e494da0c49ab5163172b7b8f0d84c888230322a848da6a53c8cb645b72aa06aecccf5a7456b50781b25ce43839642e1dd560a4ad8c33f5356d682986904160f04243de120e93e46eabb0363e90575d70c9127b2748942c528366f7a4d0399428a82df31dbe44446e0fc180d9f8ee0c4ed03490570f1daa2f769f03daa3fee4d3a1475e49a4c2d755653e44d30423fbac8e88c7c5c6645966a1684715726b4553aa1814423a94dbead82624762e19d7522523b73758de7539eea3a0474c12b9c6484188effb3049cfd770deeaf186ffae1a87541283df265579d14baa8079e2f32fcee1adb02d9a3d6378b4eaf0ff67edfb02b66e30d46f99651099e07264a198fb2989d96e2b3cae391857b13150a89aab7d48ea89cb8a77a8f1afc967fe9f2a88ef492c31180a858e30a2cefafed1f2143776b263edeb492900619db5df0aa18960018328b8a481406da5a83752b5009fafce047a7a1f34c9dcf81d4486c6fd844d45f8ae5df44eda25c38e55cb9a7e9535e6028a84ab14f999e33b148492ab223c10c41b718e60e64a014b3a63177c459d85d023bed840d009aaa90d9b12b35070d4949a12ec3b889c27143a18fea6d68e7588b7a1afeb8e29a3b279457fb6962d3ff1150f520c6d4594866d9a6714cd4573cb95e89252efc4f0b3b0c6adb4ddbf83545e6ce13f8d0c8601d35773608120cfba566f2d54bd8cd1307cff86200c545731dcc23ec485d535059d219940f7feed89d6676ff7129c71d0e06f88b3212549b27973a94f664c153cd538e7cf51b838c3ee129c04395b435f6491931d1e43061fb4f266282247bdd1868646faf47de6c4603e8e5894b051c387d732698d401cb43caf91f4e278766f58edb2203876e1c59f0897a99dd24540ccf9d68684889fb1b3a5a89ad221ae83d03f92b7f9fea9645c27301e05b45371588701860d8eb56fd6be6f1a6aa70f7a56ea63188a6564832b982a5b17f8510d39c0bcfaabdaa00d6a2cecbd7ac689c04dd58d4be05bed11af70cb1eeac51188de8487f648ff0ea0e8880a5240883640f4b2fda43bf7b512b82ad224e5e8503f88fec1b0106cc2df72776dfc916d8e7c8979d369147186e1125c458099b9fdd403f3088c00a942f424e0500f076c9864b09965a2f76f0e0d1e5afeff39864298c1a4e93f2bd966b78bb5f7e824625fbf9f5efe21525c769eaa278b6a2823c4f7a4fecd524dd6079a516ae9bbac23243a232db0339cf929260345899d1d938667b0e837990847b6c463e3307cefb2f613282173edbd013abca064c4240f1f6613322837b8a2d053a694207552337d18aff2727db092235be3f3c6a127b1f7e5f1d329839d6382a83d03db2ca93c8d0dcb28f5f4ca1086f2ae8f2c4dcce06075226b49e6471aae1f8d736588f115d6e1d3eaf61d7e049184b21e1dbd3617010a749ecf01a4bae5e2c4b9fd1d26ec409134e154867930591fad814cfa78356ed6bfbc989e5f99646b0456ad32d4ee836f79df10ec49b4a4bb03f53cd65dde7b18440a7d3ac78c6352998c729b94d53a47838b520674be49cb75a239aff09253afffbd18cf0720a91aaef2d3c9d90acdef4d1b555ea0a9eac4c27b88874afa00d8973e9952eafbd93038e296d2a58ee27bce8caa74dcc0a02cc0d7e876f1d98a16fd4f04d8ec6f1cbc61d2d36dc9406a004c2e064758d2af3faa87da76e1e92f48513380fe60fe2aae27c96f47c896e0164ba8a33e48af0bd4e7a8533b9cd7a058b6963bdffe022b567cac6814e1202a805a5ead8502892000e389944c39017f4b762bac7643ee062d93c85da3c7d067c62ed320e83ba64a39c8704765bd597fd5bd9043ba220c6812bf7a3e8c9b5ceb43c6d472a7896f5a2542dd16668ee3babe7c68175a8647f9c86c005847962513f281c5a382764064427539d3dc53b44a463a6411629e9422907b68ae98489b54d3570dc6ca1a92ad4251dc7fcba7b298eecd9483027ca58d9ec4f496befd8b8d2f466e1c2ce89941078d95a89ac1cbe6934670b6596dede3939be15afddc0504be45c09affe1648562e8ce3481bcde177a69b067d4701e4c7f772c827586439a59cc0cc70c66024460cea003988be8af04168133e84e101511845b4552f11008a970607668142bdc04a8a1c040f8e9ff1b29779db25774cfc401cf5824d2719303465c384cbd8d2b11b800aaa4185a7e8d8a4753c3cc0812e8b31f88cc96b2ff68df4f6068e393fb0133f7cbaad03f4e31997eff7b8d1efdc9405082b9949d51886681526bbcc26ad4103322d2c23ed2f6e5197ecb2c15de4e036cbb0f4ba0da43ac97194befceff5041f09c4bf793d4645500bfeccebaa9befb2516d44c801ebe90d86c8b56d6870c8e49e7738feadb2556714ef15d7822cae9dd0a621704d0f260c8e1caa2ac648621513abc9cf80fda8ec5fc43490cb17141d696906269b8f234726d337163481fcf6439e8b6c83ead0e46269fdb3dbaee9c04cc25bb50a7de81271bdaef76a37c749d457d5493464dce3f7612ce4617a25bd9b7fc0e94d67a39ceebd4060c288ddcb0fb46abef54ad655e837fbb6e93dfa5b89c1bc2826db775f1b7e55048209244119a2d8af2c67e70ff8fe3a59ab0f856d28de5f469dc7045b35bc5cab8b668f8f12b0be0abbc7b67460137c741db7bf764008e18ba5ccb511f9bf0a9ed217bb292688bfd785dd6058909a2d4d710c2deaebe744304d8bcd0ec76b9bbd0daf890e45e4cd575cc35f27050c513289dcc240dcf6f1ad7f90f35b2d5886a23df58c2fb5f82344ad0f5a2d3a6f65085f8a205d7630411913db76af4ba9dd05a84310c78a398fa4e99d444a0fdf174d64dcb46a022dfd5ade831d6021c065d75c649a9d2f7177a106366ddcce6cc420597f3d925ecb26cc2454c3f384f9fdf666a48f1f7c1eedbdf4fa89099e3bc38f73e8caa6e48bacc8948ba1b89e4615fe8ee0c3337797de5535fd499fad273ddd5a1a53b45949fe7f4be2b6cd412adb85d4f902c5c2a17cca9cf0faa1df87f2155b3048f5cacb01f6808316e9266678c607d6bc8804b458014703954480be711fbe7b8f43f7cb94b3767a0a09dd51ae16fcc78f14662a013be488127672b158aebb8c11ff8204eeb4879c82b0534e7d147378dbb9ab0f790cb0694b97833efb3af6804f6fa68cef831c4da151a20ad965caa8a34d36107a2d1f94020a9f966d1bfb895bb02dc538c85b8eae3d482f255efa6acd1459abf268d7509de83aa244146e597cae00245d953335ff5985296f7ba8dd6b3bbc5a4140a236d35f87233e478b8d40d861c8878c1ba1a8f226d3466fb2171811c3fdb9d9661eebac7a840da1b510aa74b46fa0aab0e97984c44630fbb5d1b6fc5133bd25d58b422f5d11b6321947181744575dbe8a1e77c7e38cde1301702a4970676df95618dec771bf88781ce28ef41ee80cbcb59e2704e1449f6ef66fce09b1197141881096e3591577b877f59bed9037c57bab3624773980ffd0538e15ef7b15763d0561daaefe35ef75e52ff983683cd5a02d156941baad03c8a0b3504904d655529b56aa0d461c2c51046e3b10e14f0b223a52de66722d450de4fcfbd32955d6c0c34013cb16c68eec35759edd4d042ff80587668cad449f1c6339385c98eb5fff1668730855a7f3929e9a1d3277f2e77504137a1cccd333c43d3875094dfe9cabde95befdf22a91716cadc038c21e7ee1794c04308df035658440884f62c88cf58b0b73e75b30ac934693300dac6a8048358ba2c972f9d4be99c2fafd5499e38a9b4688b4147824e5163e1ca30d9f61134452262cf0b7997db97062e98179de155b4194b98e1293a3bd710f2d4bbf710a28ddac735ca8817e006e30e531fe334d401c57229bf6dff3c4d6e327de6a9d2b4e21fff58f5c067d69b8c2e8c81b488aaf7913a4e2c26d1c4f2ac79f96c13491389e06f65e992cb5511b3d101619b84467979533aeb750a955ae563fe42d0c75d32cef25ac5013c53654b5980f476f6aaefe4e2a0a6ac5d9652dd022eb1e786d91e9e7444d8d09ff94fef3e2253071adb3b4cba38e98a67dcd129aa4f1b0669aa9ca8b34f25b135b11c1d72067085dd33fcafce769d3454c3fdf1e5a875479c8e03f44ced592cd983017cde0e3064527525a083796d710dfb7d2be64a1b7e063cdabd54e94cb8f4130487813b4be2c8dea8ced001c459e73162a0e1deb71736d15731bfe63f5796fa27d64bb6901579009257ca92247ac7a76d501652a71c41b22f0e17711a39b58df746b1cb74a95c4db76ce1edb35659eca21eb1d64a321ead1c33c4e3c496a5b9cda7fc2275105e8f13c3ab4d3953b51aa05add10a05589365871cfb3cc761864f32c8fd833168f661dfed2638b5807ba80d6fddb18d0351a902f751c8d2f2bc5efcf9d4d444141bca44ca456343331f9f2f662c9849f3f01b3baf08d1797cbb64c905ed6f30c94a304098c7a09bb4158a3e619a81fc84342dc52d9271fe4349a5dedfc5bf0135f2210505fff22b77a1fd0ef08ad2e6c0a7d46d2005b10998d9b4f815b6e33dc85cdda2ca26e054f9423e60324b19dabeb8423b37305476eccf859cea5f6a84c24bd3217555a3b239f411be022373dacdd65a51f8faf41a51959eb0358a0738cec988369ffa94a41d0393042ef0c3b089c04c1ab4892e4793840abc06f8a7439710381fef02678980dd0b82fdc361866e8f1ee5d2bbaf1d1bf6d6b4725e329c570f6aa95f0b4bb95ccc72e69fc6634458964cb1e3ca84fdfd07d9f7acc8c069d2d0999cdda96f2ce5a12609f8cf5e4340e3f72035bf51ff60435f377e07b1c45646bf034277b873ee04d297d9112cba6e467069b3a92b3fd602bb003a671dc6442bcca62ecfb818c2f0c683d465ea11c05973f24137ffdf273f3925314737fba1bb0280383078e19bc18b6bb60be318fc5cef3c5475c023d4f0ff5ba2fb0fe90710c355258e9cb973a87931f8c401fc932ce80133d136e65ef8775e447fe4730aca5902f3c21f9fc16c90e117746ffcccd1faf7c8554e9c90cf7b53784d9e07a6d70afa614563b1a4dd878170c1523bcedf8a027c7a21340ab4e0b0d3aa59ac4147c03b1baf81993a90670a5a4eb4194fef0a145ebf2dca21be4b71ce6035a30dc908b7b6ce6de5d77b00b896bfebc475c5b65188f7cbbc31ed4c6e096b95c401d85854d5ee52ab2a0868a33e1f6f3bcf377e1b7269d3e8723490d787ee23e67f70b473550dc50cb6c7beb5aff8a0c3771115617d199aa2b8528ed6708b687227b7e843ea37c79f58fbdb38bd2261eb655af14fd25355616be965e6399d8b2ef9e15b0db57b903ecd48239c255c215040967d5885a1e5b8907c7d75ef2dcfe2c45668d286c5330b63d6c8220a546331b4a26e6f584e7e47e5a713cbe623fcdb8167f0a53c081ead1f938cd6d1b8b5fb95effcfa0098b6e132c725f2d5b55f706f69fcffb217053907d34b8b80f0954b5f3137cff59c0755b47634f287fa2dae27df229d6f509e0c0838f12d632d3ce404cd3abd92a21e7d312c0b7acb2d83501cd15482086fdfdbb39ba7cae9c1939fd2baac2a032a52075c9446aabc4dda856871be33c498880f79c90cbe982e42aab70a89908b93fd80605fc1e20b353c623ba987694477913f699eb858b083aedfce449e27ea28d73a47dfbbd98158631810c9066d8c9ba3d5380694e9f34c890816e9a843fd83b1e19cfb7d809b9041c781e90c984af00f054973d5988f29bf23b3f3e196bd2dd4e5cb457e23d7f273329880f86c1ea3c374267824bf07dcf23fbc728f274aef8416df17ee36a151e2f86110f65226a81016e581043890e4331e491677e577c310d72cf53db32b7bfc48c7f03221eec4bc06e66afe62a185e73cc49f0e46a960c420e2c291de6fdba718452c4770a562d29da32d153fbc416eaca34adb93115a778d7511abb630043f6759d9514f168516d76daf02bfc9a06fe983285ec387451b25a72bac6c60de87c2ef95a78870d86dd4b830ae39b5ffb327898d68e1cc491ab504b95f85bddf727a47a6c8b84dad9a5971042283d1b49b2a157f3263e7c1fc26e978e7ea6cc5452defd12e8aa212ec11c4452cded54cc24ece79d6296982c85669e4dd077bae6c5d9cd9f8669918c25d13a8eafdc40469eaf513fef111a993964c911bdce9a4ced33d126495f6174a95b2852733f0abc694c628687f0d64f32f7c7f12a23211181ccc7c13293d4ec2d2f2abfcdcb73af6cc6ba6a5b18341dde8654b75b095e99f2a83f47275bc3dd15609c729d00218e3237dcc1ba5b36082cff01edfcf1e3a89461689882124d9ec8eba1ea562e0c5f6106cf1774f4a3008cb6a5a08a472888d1b9e915f812c413cdf776b5d50aab611aacb68d9aa7697ff8b7ba0bbbe05cd15a3f968064aecd88de91b1ee88ccd5c74d3609d2256451666b6986ff446fb5a9201618546ed559dc931fff0b01fc24eb10ef855db9ffac29cf38a63144c14ac15e707bb4fb31614f8f165cd0ce9d64d92e00e412bce7c5bb813d3ffefc4a4907214b26bf0cbc9f3f4ddf6fa68662804f8b9b2c01b185194cec40ccbdf9b423e9796d9481a37bb4297f5cc872ce9fdacbe4be4e42ab30dd640b4e3180b9add39a34b890b49763a317e677ee88d4bdbce30deb79ff909e03225d6940fe6090d11da78b2bbd0c855acf493f4eb6fcd84b9155f2a446d65806f3c217eb07f271373c05e099cd8f5d02bb2fb3191bc781351cac493b549dad585716fb9eb7826e5b1b676647fa9b71c210187c68f10573274f0c40224d8d0f8915bd8d9c38befe2943b2b86a3ba513c869237e7c6d8c458423f2fb7642d7029fafa553da61ef51375bc1b898dd459b3f2bf0c07ef7dbb04cbd0b9df144c99076f5a53718a70e1da400e80e29db53382df5051041d399e526f3121efd4706521995f372270c118e75154763e0e8e9cda2991a82dbdbf052e7f58b885456ae6f7b6925bb98d86ced02e5075548ace344c8078c1cb71ff93f1b13d527e9426130d82fee734cde2294408135df921e4cef18d9ded36bf63db65552ae239c9d1dc057bc159ed8f453d36e905971404209056bb1aa9e741d5afad6dffa820e560de42b07dff3f95e655e68bb022b7913b1572b1199ad812257984fa30cfcd41fd4ba849ce7a2f9fdd551c82586a3f10afd052cc9a6cb29d1873fa1c94bc3ac1044d07549ec9fff87abf087151c73f0c0c22f7fa712c00c36d1e662ecfe341f38e4ee7ed61a75c0885b300a05cd9cdd52800a14382adc0cdfb60effb237c6750aae30d56f55395d60bfd2f4c577aedd727153ef55f196b055a650a3bb344f106c6f6635dce0eb0f5e6108f6d32819b1ee4bb05705687ab82250a33ea0b972f8a0372a0c2357e50422218daa59c6519e7969adb29688a2e49f2842087f0f390afcf26b32d6b9f742d927fcc8fcdb4dc173e95092bd8e3b7d22c6ec7a78bcd15852cc928dbd33ebb110563b3686324c5be17ff8f35c704e5f0aaf5916b716b0dd3aed18db185608584830402889edb0b8cf7e99a528d4d1ac36fa0df3f3cf6981cd10a9a359a857b6bcd2e6a6a4cefdb410a40491017e3f7f803a080ce99430d203b949c4849b5bf128eb29ab9e42b2c9c702800bdd0da653f25cc906abb4340e321b40e475fe047bb66c5e7897b867019124bf86e283327590108810af73a6aae731a2b7f125e005472213da13712a54d268762c8a81e50a194897e89288797f603bdef4572a2a6cf91e7b1dc61ab52d50f9e2b0a13d43f6c8f7a9a718e6fd7eac7b35df779abb0e3d0fb0132887d630abf3803d461b2a7b281fd81d0ebc9dc2fecdecaa0c143de4ddb69232407aaba63a8e50951222247a3afe8ac602fdb8337d53e5b2b16098376ac00c794f6ddb1c671d6dd86e5e1fe82e13d08b16362f988f9c33be8d496cae529850b60edb449c2e70aca5da17213b19d2dc875d54c558d716af6e17a6fa7491ca7274d156344b327e34c18a77793650d7bc130f20641788071c711b29240b59331a59af13757a8d0d79a0635d157a80362df012b24db287c84cfc04d0a200270c2e62cb028b63f004864a5d9813cfda7abadf0a30307a7d1b5faa11d48e424e60450c238cbd7581cbdc75961a997712389ca4c3a9dc2755f01c7085d23ac42f4494b0a22bdd5936d33e0204a94d6cebff9d820dd1b855e228a36aae1f61aa230299f45e258376d0ebfff7818da09483af22c9572cd2d99255d56808eac8fcaed1c0514a15a144eac9b69fc3db61b233c6cd8be0107bee98a0488502de054b45de806c47d9bab1d35d0fbd45cfdc82e8e2bae365c7906e2181c56effb0c8b11b252d0ae3028bebc7fc40b52d8e35ad456464b2b9fad0bec305243de6ca1f8531899758979c134b336786537916a48f4cc33fb88f09fccd9bab4669fba63e43108f2c133191c2ce205a8eab15fbda18d3d272da17c4398f392595e6e01537b8361831b73ea7a8a4aa5d73543c6724b05b40e6d81a327d8fa10fe080d6d1fdfc37f732f6bf8a1701a52d93c3606dbb91980177fdf9923c27df1eaf1a3e4951fcb643e3336ce230109d2949f65e206f3912481e74ebe9cc6f9ec3fd0294b189704776cb847623d2a699d8f7424bf196cdcff407a5382a6e3593dc99769179e461f8456d7098ac0b223cd1da1c1858f93bb15ed976293c48d8eb9c881f0f891240d542e086e37ef2825e8cad047574ee252a93e975ec0af2352a8946d7ca2664116a30283c19dc1e65ab5d3264b7215c3faa0b5c9147debb39f998772b6f6c93da87e4ed75ab7f77e8e0160293d73a09c3e4e9d4e97910a58f83016addd5b24fdfa5f50522b17afe84eedb470e3b25dd8e58fae61167f87d98695eb09084b2aac461939e5b5dbfade91b6cef301270d405f1889cc282da42ca654de9ba4acdbeb6ba5c9e57c625db3688f512a96bf4cdeb58f49b364c3d35607ce1a2e19f0cf6772b93f4b234a279d1b02cd10df9bb993745818669c2d4dfed48a9240dab3f70dfa71fdd670b11c85fff63dbede5ef7de5882a2b7d47608c5c4e2439e3be578659a1fd5adc21279d97f01b476229b64f24be4170de34eda88f1be283896461388149f9cd0196a92bff97873dd8864dac262ca85d68d0fab80fefcb06eda323f9162731a3aa042def157dc21b6fc8ab0816b512d9931001103d193d8cd0ff32045ed165ce25a0e6ab17961e788f11d3ba34f197cf83d739d1fd9bad3538783b4a918fe40e3ffdc86a5680a95068cbe58865d4fe1e19a69f95ad23baf5bbb9fb9124781e729c92b11b9b5418cecdd850a139905a774c3b5fa5b569cd51bd8ff9e511e2c53b3586e50ad54a8f3496c0ceecf437397bcb380ef77ee1766c48e456190c57ced7adbfd7a072856d4b732f8e6a69f6976143b2382eacd8884d0b1520173c229b4c40fa2d82d8fe463ad5279a8602d3a8ff7081c8121c8ba4243a552f47a3235ce9364948dbadab0e43ac2e9f704ac342e92a4f0c1be0268c38585ba3c2f4dfab6fcff05a69a29d166ffa97fd3f8501315a23c22e6def3f1990c651deb0095839a0614ec4c3407b5babc2abf441bb5326aef8baf838b5f9cbe696a3f02d6446f17f4b40fe39334ed93aac43bfcccb8e4ebab2e42cc0453c97948c8127c6f71b304f7e83bc20d064475a901a9c347e13db46f8431a605c838614023cdea25cb24e743e6523981480e9fa7f2cf97239b2203fd90f45a5b5eeaee32b68b691725b70e0be3c0c4a6c0a8a22a9524d7de4f069bb93a342f4145815ae80c9b8594dd5103d7a68d403d13426b16ab8507db00e5f6df1c18aa281e031c565885367f9d1b29ebe1f81829f7670ea33c9bd3e4c687fe2ddf4e170c128acfed914f177d687d5ce9593e84c671977b12a6d4e0533401da19aa9dbee1044a530646f8b7854a5728f007d13f09b5e19e51e5dee927461fe37477ca2562a94abbeb56a9b8994f055a1ff8c3b15c9256958a91a0ebb04e7f16984895cc49ccf69285946cf45bb7ad78130865ca2d99c0212966f92648850a546dfe0576e6c02c2fca266552ec0149f0013798df69a3125cec8d31af79fd0c93ee82d5a94161b6122293bdd728a538e044f9ea4cb7109b9d4ccc7a8f77d24b34025b3d2114b6cab4f572a51b4242165999656cf792ba2147bac79e427c608a875387345fcc96b9e83801340de9045bfd062ddd12c7bb857017461e093181209b0183d57b901e934f207f2ee8eca42dbaae1355af55c0ac4fa4c3d35c0f5f5f4c2d91e346214dc5a827beac198a939c6e429fb8337f013b3a1a315279688ded1945523b3f605fc618c32419f735ed2ea888a6ab10ae501be0434e1d2a6129837c052766d1a69bfaf9457ec26d47ae41535577e06e086e50656eef0a27f7fbb7b7a8105e6ff8f32d80d813ea10a203533027d07d6a95c6e276248f583fa1f924ac185bbbbc04dfa2e1865b2d6e1275071e495010b9256f4c2f292308b3eda826be4eada368604cb9f22736f6e6f0684fed6f7f5ba5f430042e6c9452a1e53a90d3b1411773dbc85867f3411e9d3a6d6a150ba7f7fe13e144620abf3e02c37c53c6f26932a5cf2e9bd5a4cc995e38adc0ccf2e2c3632501af24b1231c6790c35328bddb5c7f6f47cd4cd468f9d2e5fbbe2ab3e9bfb19a2649967acdfd28b3cf53d659aa8044a806cd30ba9d71e9e2cdd77405ae3151d6100d5d428f1a4125be9acd53a277a7c38179621a2a27daab6da6bac06eaabc6d53654077fc57d0cb9c0b2fdac3dbe0cfe4ba82e203516136a2d5ffd023212c72b04f767c832650b97013eb42e6aabf565ebbe821283d32cec01a5a3f101c8f47f4e7e983502df83654a6781285d415d71cc1505ad9b8745591fc90c07bc46ae597cedd088b1d6c314ceba9bd1a99d0162f7dcca4a32008e3eff8b233ab3d7da22688f3ba4b3cad86988ac0d63c85371e258e551550501e20f492b7d86e9e4ea5b316e133a97dbe14d89a8f13c2bfd84f040f18cc9f1ce8ea09ba5f653e5f492988656fba906020a81140dfe3a5bea25a0441d446dade24dff5d87bd7773e3ee4be7b8469e0c0e1d27f510b412c85a80fe835ff0d3798df3fb74bfc33f90d7a3e7bd4ba93a307c4f34a08138e0935281e18779604ac65041e58302ccdf3cd1fd984968ac7084ffb4ac18dcd8769b8e871ddc02df6e39074490e41db5d102a0c9b97426faf5cd864dfcee373ba0aa34fe82f3f9d68b5a4a571b538567e18fadc07803e69488d5f12af9c8058d724743bb55c67b1f7d83497d66575f880d0ebf3467db8fa2f8464c988e275421c4a68eff51fca34f9242e5bb90bd3dc0f09e2b13876737debd494ed09fbad3b7205baeabf451a0c2587ee80fd47fd892111ab7884a810de1a79c5bb6be397ab9af537ce527bc4b657819921b4529991aa99e4fe9fb312fc2f92d84ef3019ba19d563f09239ee5ef9950e43d5aa93a5bc22d648d8216ed21d40a92431141cbabb3a42d06b2112375ce4b8f2dd9ed50c4ec2b359a618d30220d96da3e1a6e844fe25a8536cf7fe1487a6937a11ce3827137ca99fdf61f234348b77df6e1198c70dd4f911a3e3a9a2e7dbd9ad8bfe615defa4b190ea1a28738f34ae24e3e61fc316f74dd600eb6e8662209bdb5dbb8c64f5e2e7b43ea7475b15913accae4b2cb1fb6676f83c8d6830e5ad79ac84886346af08978a0d3763dd766be5826401d6cc8b7f577ae150797cf652f1fb5e1218f369e24811cef7c4c006a2a35fc4a44773778ed16ccc04dccda4cbfc24964b55762739071b42ba97caa45162c04f807fd9298088992c3947c4ec60f168a7a6f2db10aa403fa846ff1b77234e0edbf6f0c397c6eaffd9cbfe25901bf81bd7adb401dc93e48456ee99b037a300f45ef08a85ae254cac6e0f669dcfccc6b1797779d78d1e5ef165c0b84165eb4e0f7a2dc6ee66ed0bbb5f766d017dfa096b14c55ead801349544adc1c680ed91ae542b5786259279a9836ea581bbc2c2fa723646b441907e8be7189152b00458e4fd4836ca18304dfcbcc5afa68918e20676b50e1d8ea021cbe1aea3d757034c4176f9cca9fae2cb425b5c8b92e8b26385ebf26b2c96bc34734371b98f2e959f10cfbfb4b4524b68d200f295f2ff478501e2219811810607e48e2f5ed556ddadf98aa6ca1587877aba7c58600763af2de9c64e9eac2d14ebb7620d3515f5f67283c6abb07aeda5b8667a73d6877b77cccdff6760c9b231a6599d9cdb65cc9cc4db2db402b314454d75c6b9248da19b0ad854053edce86bd5f5be1657534f9eb92fae8653363204d0a54bda2bc7d61e65a5677d0af9a9dec01183089601dab985ee44ebffaba2f14d9b89b0e16dfe1b25de3f7d209e9adf9da68b5b992a866ae6c8b53b315fd8cdd792ced6685dfa3821e1781139167f27709c132fa88bb0e7f5bcdce4636acb804139b462fc66490768fcfd20ead8a25dedee84734738e7d047692a2615aed9b785c1504496e3948f5336d057cfe6f962b4bb18e572b2c594353695843d473dd3e3644d278cccf295cd4dac45fd7ad6a0968d8768e33391cc38cfcfa542337d9184dc2e213cee112ef2ebd9b2e3f6a1f7c7a881dd233f6bb9ad0be6ce2c0002d25435e63617961180e7f9f865078606f80a79bd689b5303511903b410cb4c60abee3a153019ab1c92514ea05cfbc808828272f727ae7ab407cc4ead16dd64f46001c1c308506d669e00064f75b732ca8c8920fd7ddafe46ae46385535b508579bd5aae1b98ee4d4453792a897c4291396db2a461d43912c2396212980cfa13ea112a601b33202480a1138a1feaa2a7221e40dbe37bfcc97b4e8d5b39ba7428763d55feac8e4b0ef81311e24614781ac1a9dacb8ad29db53d324a1ed05ea293679b0f3de92ff95878fe7b0746853e29dcea81ffd7e2b7b08c78db8c2afe1a7f9e861704a63926b53a57db5556486de3e945b8fdef5c8953034ad353a5ee0c92f9da0a745b4baa30ea7927d43570ca59b329842d2e5788b09a677c53602194b6e739b5af63d945a62b0e08bb86c897a352d2385d6755af0617f948cc3339b8ccce2c04999b217d857bb491f927ddd91b9c31f0ea6bb263bd80353c59b31dd82bdb4b4cdb1a7750c81e43d151ec755786772aeed23b195de8b9738771a1f7aef2d24a3eb0ae1cf66f304990fcd213297ed9caa692251e59651e54d9f9b025684c6184e4e2ca49659e815411c940ea828ac69eafbb53e152ab3f8fdc08affcb14a50b9e2b652effbba5f3bc835abc6227e24536ff4309284bdb32e2b76d70d6eaceefcf90916bb6c0a6358013e0c2d1ba26ffc4cb0e84f4e2f43e3a545dfed93cd346684ad62f6c417716f47a818f0cc4936aafc34880e2641289cf0fa9d19c8714605151be3b8b3178a7368ca9b46b051330cea7ac002678f3383a3d6d1c34bdd5b2368eb31ec1e2f1ed5f7b53d9bfe4e8aab6c1b2d087c5925871db9dd7f718f7cf7650a6a0e78e137ff51f6a6533a2d30cc36364a0a4f26f6751f4ca467e6d8dd63db8af8454d3cab46a5e950bfa5dd6d5db162ec2d002d7184ded6382a25b4ad4d3c52964cdb3c0849104083524f5dd8d9d1adf70b46b7066ca5af58e3b0f2e23c8e670ccad5930561f7421b9bb23dcaace674cb9b9a251639110166eda13bf52a651a19fc38ea8cb44fd1b1de95d0a9468dfa524d1e998b63b388f056e607fbc5be79b7ee236fb34e0dcebc8d91fe451f12c4a9b8c1ef57327431a77d8f05624eaa9d290a10f046af61f0e1d888424e469ba81f3939fe623bd00e0777b9f80d07e1dd7ff716ad49aa2c4a3ac82b8f93632a8659bdc2769f8c65550052d93e2f0bb44edcaa07286012417742fb86684afe93d879dc0de58f857c3a8ecbe4ab264b5a70932bfbec1301707f2093a19d35b6e08757eb8ac94f6381249a3a4c8a634d87b56851948f70902d733b19be1e2e82ae604faefae109e51abf6c02c1e5834508207bdbd909c4beff624580ef54fa22be25167ca6bf32c22aa5d22f96e45ee66d08bd12e3ac38ca6cc18d71690a3d4fab50e0c939f9eb8f8e928d52b2aba5e1e460cb60cb8d75c6c336c4108cedf257f4a9b1dd675f02effb1d78104fdc8eddb88dc562dc20c2e252ba7aaa48a321454bad4a0b12611a54adc39cfbe18b02e9a820098ce34edd7a8ae7dbfb8874202ef65bdd73d442b54d23f6544d1ce74a2eac42078bb0e5901e0fb05390c7cfe87992caa93154260b4d184e4340720f2715abd35f802346e238953202c6656d59702c5a1f401c8cb613c33d8bd99cd0916593f8af50536730a9ad67ff7cc68645a3a4092dad0f76d3880fea1e44bd6a05cc0c97e8938af005e557b175311312cbfde4f7c6ddced2dd59e0e0c4b30179700236109acdf27b6869a9e2f5e24a4c1b824e48fea9acd017896acb0f36a0b69d819495f9ba3a03025aa0db72a7d0ad0ced3cd099ba5a48e58e968751277d3704616a1f6c8752674ece65d3567d0fea131ce5d908bbe5dd5e5296a243361b4eb54f26afa2ef57b92ddcae691babf3d6e3004d1c729ca8483c544d598164985f37b6b847b8f8b9aa5df39963d910c9eafe948f43eec4268bc5b17cca82f31712cc18c1ae3f74b609107e27ce3596a0ff07daf4e787875b72ce08b6566c3f6626a7e7005879a1af719d8c81ab2606bda86f5dfa67429e3b12d932e1087bfaeb4e4de4e67555f124dfe87ac32ff30ebca568b29cdd942f7a33923b6cf089ef583be54ef5457b44763d7302d7836011992a258b89531c36c3224f824db8844ba1a35c91ce6f1a703870fbdea1e2529fd70c63230d2eb7a19ba4b9f35d3c9c9fb85b5b82b513650ec2a7567db9addc16f19a1c53f2bc103c45544711663ef4bb87b4a7cdf08558e59892a327af5cabd390aac8f05833e73231dfbbc6283c4482da923aa5ec2bd0eb92ed446d648642225d38b5f7e434179625f06cde476a69ff928af24cb485ac8fcbf649c3c4aac4be7baf340d771301deed60c08ffc608ee10df1eaba74eedbbce6781f6194c88e0adb4067d4a568f00773424610b164eee861489d4d0cf1e130fbf2dca065806e89a7c4e20adf8f0b497c47c7f7b33a0816f03e7a11f4f0fab074cb64337b099270d71b78a7a3bf63ed623567fa47763c32d3d7b718b6a5ebb98b7ed9151444d3e436620701506c2af74d719f4d7535bedb79f7c074aec932798910b368db52b48d2eba159e5650ebfda9bc4cca1c3a4cde07ed58d02dfa71f2e25b1bae75bf8d98c1dcd590e581494c1930e5955be11e46516bb98d61ac555ed307dae8aee9376a2b729e07fc3c69b5397dbad1321f54ba7f68ef064f17dafdaa5f2fee7923f4f383332fdff093f625e5cb6786212c0eeb588ac78c16c8d1a630e20267a2f651945bc4df2757f5e0fb76a9800a1868b2e68f7c0127138277d44def83043752b02a9c3a5fa00e94462e6cb24968a92abce9c06c5ecaf42ee1f61755e5332bd4f69240ff316b64134f53b7dff2f743089b1d882d59a5d0313db46b8c22270573e66444822eade7accf92ca740c169e0e0ee394b1464c96339f93fd6edc55e673fb2f2736543d5b6da1d43010ddb71e5c61f449e6b7d48beeca8943f6f314cd9e7be10c527c56e09b5c6fcc6f08fa59cb227099655890a9bc4fafee35c399efa5960de8aa0d6ad393298ca8723e28287c053f850239808061e70184d9d5cd02cfe30181485b5a94d6035f101f450a290bc40cf50a6f678dbd002d09b6823bd626d4f8f06ba679dc4b9e2c8989cae4b640499f57ee47a4ff0c24cdc30ab6f69278a2418ae1ff382a047fd7f187fa1e67d17b964c320d4c4fa0c6754e64691fc72b89045da3b61c2cfa7ae700388ae2d5ad048778fd79fd0d12c8f87863d049f27047848c9cac7a7c76c87cf363ab8c48ec3acf7609c9ecc77ffa1097fd79f2c2b0a30e5de42efaeb5c0788418639c0210860c91e985abd6ff18606315ff4b9020f8636c6cebd8a32873e834e291eb1e0a7e1112540157d6f90fe562a4e4f575e4cebd7ea9f5d11ad8f489bf8799ad9a0726f5e7ab0923e797a0a036f8e512965bfff43d6731736ebe7557f0e7822fe735af938ec6e056ed52dbf9295ac3bef96b37cb5e7829e9295a6ad35533da6aa23f429a9cb7fcf78ec44dc0aa95aede8b50d9d764a314b58e58cc1475c7b1386418d2a83ac801fbbe23f42f1db1822d594b9a61a1af821a337cd475f18778641e9e78928efa724afcf575b70bd2e4d2977141e434bb8937368522600ad218b086884bc3cfbbed88cd2e088e000c8923ed21a572d6f5b8b29187fb6fb7312a815509f0a13a34997cdeb080064f59c598bcb9a51c5c8dee74cd893d226d8df7081fee23c5f9eda1c3baaafe913b6e3d0711cef5ad6db6ec2ae62521832dd234348fa00899e26d4431e8a1f352752a0edf31116e3888fc5aed0acad093186d7f7ea937c8f018887e7d61faa663f646f92fc48c380f29be69a50e13bdabb49aa659e63147a2448291988db16402377864dabe49c85409fcd6472019c6edcdef7051e739b4e7dfffb9ec5a55d6f490af5ca978d52112099eb75fbb2fae90a6f0e1ccda274a8084197b5873baa2639f8760b923842caea8dd48d5f47501060af81f71a4eee07fdb94f46056af7c1baa04be002b9557007432867be6f08694382ab4014e884c8475a0ecdce931ea784e01576e40a24112cd3c838d78c480abfcdd4ac1aa30a29c2b591d9152062dcd8946977e7fcf22121c3c42f52f060f7d30db310d1bb314d50f5763e382bc6c66473bae6276b2735c2b78953fd4181f13a74e7d5659e1eba6f73a560ba9f0551a0fd5b485d0b69142232b5431e4937f03ef905efec12a9901a804e3ec26d3ae9fbbc26e1b2dfec0afee267f707e53a3377273fec476be21cf08dbdb704f7c883b0072152477e435a19325e2fa493b5ce1e692aa12dcba84910bee3884559b45968de1afa0ca7bddd95337e9ac65fc977bd6f776eb96e368f29e1a429e342dae3f63599393bc5e9429dfd527369b5ff4a59a2050c5d4cebf32f513a0104711276ceb3b99e94d728b0e52a79f97d9d2f72ad7014fcc52e1c030e5d3187302604477bfea294050698829538e1eb4f4d474d11240dbfe3d12e0ecffaf5410e3a30b9e6e3bcb371ade99322e77f94d646f3810486405a9881661c6ca0bf4ab372f519e2acc21d67dcf7a022b59448d7848bdfcbbe16f0e761b2a462aafcfba6b37df4a63bec99022174157f36046450edad2588b8e25e0bbc00d2ae9b07892c93f339322d5ac4bbb449c6644ba7bff2985423d43dc49cd51b8905cf85fd8e71be7a66130601f2fe31fecefeb3d9ec9de5d3c29e40c0553772063cb737ae99a6b8a7496dd8cf292c9f1a82f25eb605b3fa94bb136404571686ba93b41717c1f95c889a360533c1413682f58d1316c44d576df9586f765f4ba2aa6fbff2c1b6fe606e146b326fa2f1d5a943a078d124a3ec10d3b1a0f1e4ad79d9d9ca4e4b564ecd6e8ee33e5f50d6d3b16c436087b5de1595eade62503b3812af61f3a4bda359af6907f8d72dc4f6caffcd42188dc1c48a7024257d7997b3c9975c1dd4275fc9e284aa1e5616b6b113f405da2ccb60f43a744879494805767b7e6e1128a9910673cbf2d2fe71b0b22c3921cb4a45d94acb4844759a50c1855f2c6af9087a514b80deb89c7c25071f2eb21be243a27eb3a14c9c3919380ade1566168adc7b258ed6ec1bb0d666427b9ef672f50ba3eae8fe1b3855dcab23db085e1efdd1a1efa28386f02f3c5bd2ea45e6167e4b1146892cda3f0d8234e763bd36785de089f31eb043d9e2cb11fcf3db9aae0973c2ceab5d4cfb0c60ab5e456c73f9a6f1c30dda56acad9a07fbf14d77a94af2e0e6b7f4f4fb7f083ff4801296e56eebb63698cf4c6be359a72e2c40b687baad09c5e3138a6198ba93f5e18800f9c86e713f7e55f7ad15ba5114081191cb05bcee4013688cb3887fad300eae66e4c4e03eaef7f57806e9e4a85a695a48fa68977e8bdb59cffc5631030cc51ce96d0c33c81a34578e87b0dbcb6d9b548250048a569bacfd564af74950ad3427031c584fd98e5a33f27313226538bae49867e394ac146ad28416266b49d642b50e1f39ab119e8a751f50b6ebff68d6aa0d023b58a44b62df238e7629444b21947d455d7c023f7136e54c1ae0b9951ae8696f67e9e0f2f4573f3e2c02bf4bc08e5de32d9055613983666be33e209d9241e2999ba95dffd3ed6728dfc1baef7017b5e016c2e74b6bfa5753a2258fe7ace0018d9596038544ce4df77842339610337596c69a879950edae41ddb03073c235dd0498fcab84b736f0a51129db64f1a1abea121ee7e749864e3c9aa72f17be081a117ddab5ae39dc08f1674986da98d1724098ab6d8578ac3fae5a1b89fe64bfb333983d48406731afeb6cd143499aab139eb93c1c3b1afe188b4eb63d03d96038f15047af11942fa369dc0c77cb6b9fa01e5ca04a751e34f2b505d95a14dd6e947a06eaef58c5e0f392c02d2ca53c6c482f03cb81351fedf9fb17b8c8db0cf54a6e795e69608ec03beb2c701f69b696f16959dff8423a35dc58c74a62a189cdafe13120cae50e7009228d0af8af9da2cfd817f47c4f047777d95b3a97a92361555034c244f6fe8221187067f5c9ca9e378c0f29b742c0321fbcb87138f55faf943a417027ff55e42708cd1b68c71c33a4e1a18694ecc2052cea8efad2d3ccf0227a05ac5e0351683ddefa004973df785d4bfaabfe5a1ec6899821afc7ff8c6e8a89a6dacb23c5dee82fda4cebfd2897947aa8b1b25b4143d2176d0cb57dfab95c353c9852e0cd07048338ad3cbd2a05cc895a5c729ed68a1c717cde9ac2deb691e8b354cb02a68cf6bf973a0a01e9d8b2059c98a5259b65ba57885a747e5a5fb4c2ae741700d699de7f17b80afa2ea78240ec8ae91a1dc6f44b3dbc6fa360aea135a80683209d9bdcec8ceca1d2dd0840c1187ba11f658e7ff4f7e41ab793f07a08bd7b5fd5fd387ca5bf7db28576c641511459c24a5443f8967af7073e11a342883f228d78f3e2c80e2b1e3f4cdcbb1b1daf615d4e732034d0b39ceccd06aa4611327dcd55c805f48d1de6cc3898f5e9c6cee87c0adafd0b397d743e30a198ce846350ffc4bc66734082bf318a27b2d142b127db170063011861b7eaf17d59004b9e6f74f8b5950136d6655b909a95a38f6503d7c7caee790eab06a79b270a2d143ac815e0fab983aaa810a1e302154dc2ff3a1e0585cc75540c7d5a3a03bc7d9f1be17983588d8ab54c3208a907b18ffd3126618c47190f1ec505b814919459de6dcd8db2e95ee967171aedfd89a204f813096fee4e53b10a008d6067141aaabb1220c8b71107eebfeb662947edf6dd7c937e71dfd44246582f8f027dfbf060677cfa257b7ca4ba1eab0a2bf4597334217c0be4760ca946bceb8b30c8658a1405a7d05557e1781ada3f1f4c329433a07a829aeb8db0f13a3501520480ab11f237e3248e0f4706ace638361266cfd24bb7a9c245ac74c75b1311ccf65c4f5f616b6c339b4a5d05bafef0f5ef4ac3d554a739eebc956374f207f9062bcea1062dc58d8bed3917e1033983b052b4bc2355095b0d6a437764865c7a12004a61ee98ad5ea97037c68d23cfc78159179ed9d24ef2ee1163623c3dca684e3233ad4e8f15e190ef383ac74735ea6f6faa3aeffe442abe9d96eb346b4980970c81b86fe84d18b3eb96de4155bcb00545b8972775fcdc3f6acec7917f5212aa9e85e38c43fe583233b62e37c15691ceed35324cf6067a8262d213e7086b86d1c9537f5ceaec3dbc9f1235e64472783d8bd47c8c310bc4d6e400c46ebb6692e6c1c797c67de3d7cc6c6a52eabb935070014d0f601b1a988c1228d19f7b8af4641067647f46e900de3d499ae10ef0dd1b175beffe3f452dae00e8220869d2610d0fe5b226d7120d8fcb4658434915ba54db0577f697faed57b2b52d4f632fbbca528fdd734331e21af03342fc4326eda064dd1a9a202e3c0596a23e0ff19a35b1792ba2480f5661d74977193802751b7f73d75fe2cf371f1b02e7268392b14cc0b7952e288ffb72c1c40798e4f976e1e7959818ded196c3a8009981e9a074ee1036a9d3b5c9730b659776ad2869f380ff6906b80ae5d3dbc2fa56cd792693a2bbb073960938ae74b5b940564202c3a79a562a7cc9317054c41729ad5d812b2a2e86401af3703bfb68299678c5b46aa08dabf8c8d9c57f6f1f39bf0352f86071465d0f024845a281b58d6282aa128697b72fe4f9e76ec9f869ea707598365bd0ffd427a2668653ba727b27225f5a5880e60edff6794c9867530e9b25163131d09e59112985a83e3a0aea11428dbca8c81228ecea46c38feda65b2179cf4bfbee36ca93fd95fc8c99ec9995f65db66423c72e4750828bea467826959ec4b8ab6411f401b8a214b660320c7ea6d980d42f95f489386b83116e47a87e611459c40081355e981fdf0d7a55007942be797d0c49980f8291bc7ad076a591ba7c9952d3ede74b374ffa12bc5edf3e56634d726ef1509414f5bf46d39447fdc107e6403921709e999e1d1a6682a79f22bea68162698974cbb095914d01e8e0b552a2729d3d3b3a12752c37abdf2c5fe46602e024cd6a98a2576426eb8d76b93a29b56e8fb5fccb95c4be00dd2a744ad5b387a33bd6cc77bbc9d11a78f1c1ad51cefe4a286dd4ca84cb8ac750dac006b05e4e961f1ec63b39cce97fcd4649aec90a0d94d483acde7399c1e0bb20fcd56f17cdb2fc01d910546fbbd4534c0dd15017e507a2bc99d5da54e306d696f46da5b2ed2d93dedcaf190fbe1249ea7a97c3064be9bc262641724858515b85bd7e54f904a46b288bb16a0501216980cfad982c440820e1b96e2bbba8580b3f6bceb20c0f9ab13fd048465caad18cdf56b64757e4c107a3c8f2a51182e6a2998bc5645ae686f8b1b1dd0bbaebdb855b4b7dcd92e76c5bd9426a0b2df5911fa73cc611a619aa035b13e21c006dc3d825deda7f6668736ffdd812d5d0215066708f9ad71d68bf7b7460f7a6f83dff3b3ca7c59834f89f61f05f6cd3e84f287578d9449febaa41195d11d92be827059486cc9e4a8480dcac16634bfc9297ec0aaef3aa5895fb59a076de2edff6362e3772097e8b9f0c19aed71688903370dc80ff471a5d39586322e9a9c893c93b993b49de016256eae56675443d746d0682243f48e2a524c7db12850096e63ed264b74a0d6217c4efae6cabd32abc932fb2c2d227249bdad0d3e5afe97374901441b88496df6ce456623fdf5295769a4721fbeceba095edb81e0f93eb7446b61c6149f1df75474ad53612b6aefcb3402eafd1dc03401fe52d8c9b0431ccdb53acca43f0937434feab3cf6ef398c19f47c8bd390b1d20ca0ee5e4f6d7d3c1ccd9b53724ac810df99d43b80dd87dd7de5a6a915d1f53a2bd6f07d7e9592468229775db3da9a6da5dfb5d1cf7c1da9e1c6468caeb1f4bd9214dc04b94026f4444195971faaad3c629166be13934dfb050ba2fd6963228c4b51b0deedcee521a54aea6f6333481d01c9ffd63e6d113f6a9075a833f69984637b0de599bb6c5df456457a668038729926c17fa9e0f32aedaccddd57c6c0153689805298117e7eafbaa0f3d2f516b5a08f9e939a8bb86c7015f3a5700d74c7c735a5908a4c7a7a514f77f780ae884c6a08c317ddafcc21555af44243cac2f31f468fab3bf5adae9162890626731d1159d3407b93b1e3d40cd74042d6f4181e4c448fb8d3cb75804c9793ac7bea95c4e5140ad0a9ac60dc253735568dc8f91f8a02e0158f1766b41cabdd9df435da360f34ee8342e66d1f21bc55c1ff576246f7a3c773c3d0cf0e21a8e12f01578ab5caf1c1b7d61550ca309eb7171df9dfb1bdc9cf63093dfe2430572019897c9a12c3273346ebea4a878d02ba6923579875fa8dd7a7fc9b48f60718c1188299f385d1a7ba0ae7bdebdfd2894386bdcf9201404f1a85f16b1e25986ac56e5b57fe32fb01e2d87df791f079d24d375f291084ec126af6c08327279978745ff7077ab089961e8cfc404526b623b5bb9c24271a8073702d0f31e52a3035d849b70cfc8da7f2d37625836d0b1cea609fd41d37eb4d5271f1c31c0f5b8fb5218612a0d3dc3a6d7eee87bcc6f0fe41c5cb403f1976c4ab6b59063cea57990b03d4ce10f42148f03e1319eb18e22bffcc0121e2463c7e424351e8f447ed72dfd338d215d20459da69dd7e2b5284abf9dfc263535ac5c214bb84c00bbfd1e60ab0d16c53acff580565ea7a3a4c4c4f73d690167bdb6624f843c3f1fb057a8595b30a1e561a3b048c83f63c46bfa37c36f432c37985e21f2292a6adfc21e140c0acf534090b05217b7e267ea71634b05d108a23bbf7ebc7dca0cf4579344e76ddf8f1ac2b8e0f4f6d5093e0168e1cec992c804e5709be98076c4d2b88adb575e8ce74203721c1ffc040901685de299b34787dedb620c874c1df5fbd0bc4ecfc3eb399aff2145b606a36d0b54f8e13fca380f2febf917e97ea01655852d5c598bc976320790c1c6d83d73fb6f6fd4d1964a36b208cfaa6a42f22d63beb3565876b8ceac98af6f98679b2006e6f3befc86073fd10e0090eb4a3911355a35fd94880e29a2a9240991d4e65250bd06742a2ea2a480d6cc0db49a3ce40f73c4d898740acafdff21d3488752ddba5bb9c62b715d6530d67677d314e088792958fc8baf0e0944851106cdc8e77bd885f0e1bb095833d1ffc160759c830f65d0a48c85decf0ab652f371e4d3383a756da24e97b29b28198926d14a7080274efa23a3a95b7c683592b1fe63db1ad30fb8362878dc70c6952eca2e2c16438a03be1131b0518778b82a75f312c8131d6624e20fb60114ec5e980b50f7d863ae764f6599a049bd1ae8a53247e27e2edbb4b50ece133aa4a54859c440d8a4e20db015ec44b330b24130b604bb5084a1afe399f4e4ec60080fcc36ccb5f3ebc145a1b99448cf2cfeafc85ad265aa5da2788a010841d02a6a9edecaffb481e6b9bf558a7d316c5360704bbba308bb74b50d292a46bf99d9c90613730cf93515e6950bfc48bae806223aa0dc8fbe60315dee287ec3dba9a1f6fe9123e58396f89fc011585eb2ce06c1941c3cb6b5c04019e6d3e701e1216dd2c2a29a97b1d26e05b64582c82abad5753e9890d690fe88ad11e559cf0822bb5438cd1065408699d2428fa83c87e2ba97ec0df73ae831acb7bdb5068b38688e687143d5740f3cef647c4d23cffa55629ef65fff76fa3213d98f1f0eb2f19fefc84900854a56635c8a40f8bacbdd8479d664348f65e5efda7786925c7cc7696e5a759197b20641d71dbe7e9f7307a875fee107cd22641a831a035b32d447daba30229fc78b38971ed703f2c3b8e82c0d509ce6caab20372cb9bdb3de9606ed13ea1767bf66b1e7b89fcf8abfd9d540c0d864645191fca9646d8ae18d2c1f50b4f1a2e3f064b447ee0098c02a4b0dc465e33ae832d5a7397d66e74f398da5ea5cee4d039ba424ee325e7d8814a86e6e131bfb30aa4b771222ea808651b53019ca6048e0511aa5214df619acf8cc11ab3eff64aece901e7671f5b26e17ee4a53d2014192063d817def2411e97c787de32faf9a131761d1ed7c577591514c017c0188f9fdd6053eed00eedc2f75219f2754aed082b6524e82cb43b15262fc73c9d098c905177f59b78650b767f0cc9327fdd2310dd9aeb41a621131e1c76a20e2a8639f7c28d8b28daf2610e68f64ff9a3acd0b2287d6acd19fc5799958db453e5d152b7a0c61c81fc8e7852cd6bd24c3af3deb2c55a5f3d6af4d47062f8d2ff349f5794b0c56782f3864b6ad093e044c4fa495c1e090b3e0b8722479e86d130f79ce3613c31d82f666a2a9ceda8f2704406e2572e5fe989059dabbf30e9bee362435a15c4212c5eb6348bff7070c29bb25cc3b5d8689dcc5d4d435312cebe2af31df90b4382e9b5f37768301cf0b72b628876eff936ddbb48181f7f7b2705e6a32a7a646c1acf20767eb6df2eaaf3daf76d9beef852b6e591f92807cb5e399fab36626f8c86559f9cec9981d638fca6ebb824afb6ad67899613c73e64663c9ea87415c32391ae103fdf022e4b1b120d65574627f892b1a43c7bf77adf5f0f9d4e6b3d924b3e9f85a26982f1a006e98a67ae2678c4418bc66ff0fc6ac3e29455604942e2ac84d2406c346d122749adeefb976615d849d153cced54a71c65b78eaedfe484558de24a0e4f978cd6b9bc551e10953a412f343d4ec40eee5a046a3ccda0d679b06a03fc8ec93465ee8813ffad7407a00d4a13bda7066150b15cf61fa3d21d3451fc9e560f0f55c09c7c17f8b5f3873287cdb6b48473ccfdfb5f3815e28c67943588c78b672b4f2b76404bf24e8e205aa7a3f3ece640ff1e13472e3266aa672152068a65654f6e0b8dabf2afa16e00b2ebd05793a818e7184c6229d709d48563a88c7c4eb6c173d5b3ba6046828931fbf30fc2c191ca9c6923b31410d2af27e2414a81e18825dc20523223599567a4e2af4e332503e930c21def54091cbf1aac1d38554680b026345d936f9975a4bee76dec53f367b69d05bd887a8079692d598afb6f5fdb7938f194747f9ed6f5e5ceac3300f9f70a9d3222f246cfd42d3c098fa1510ab49702ad7f51dd7958d8122214c7c332206b84f3eb41f6885308546b8ba8c4cb93cd419fafe33e175a00bef7adacfdc92b7c0c6d217d4dd5dac5787e689320592eb49408414d00c0cfc43c69e17673e52fc6852da84f21eecd05b449cae3dd4a1e46c86c21b35d063bb550d55d7366bafa6feec892e9ca42921e5b4290c5a7c7c6deda4271c12292f3fd709c4d81030a1a773ca95a4e7538f962aaa4aee76b7f3e32273c5b5abdeb49bff4921ab73bc16328a4254be7bb42f05e4a6bc559af8c40837054159094da2047f0bf830ff1baaac2ef234adf5c4a18da0d3bddb4c43672f3b1d88a2b845d14c345629a6c52cae21d97547f5a36d20096fd25e6379ba829700b7e194642c54cd6a87510dd750a4cb587bec25bdb499c79df20e1c17b998ef7e525d311015a05574fb7854332df6bbf68c144bc98d7e55ee0476ed728f67ffe2aafd7e202be531bb2c27acc6513b62f0d16a78fafb315b3704d0622f002a4777368a5f25526bda5a17077e7c76d923e3b6d90506c423c0bfa3b4fa611c0863b0dd4f1a733107895218c0c72a73de4729670134e5fa545424a123016bc5edf15982888c3bb0463d4df6c3bbfff23ab72c53b91f8029794a8bc50ee270e07c7f5117991a71e74fb87aa0d6220c6efef58f14ce869ec366d64ecd9fac34da814f6f778ed9f41c65f0443738252eecc670e432042b5ab8873f2c2d8b628478ada0a8b671d66147f3bb6b5f9be4277a1872c102f7e607e3b69eed542a053f79f9c1f5f096f0a27dc6bd379b2c6b69d9415afd6572d313291f2b5cf23ef9199d0d412ecaea77b4b817c375d9a2a3814c634364c8e65ac4769b44da84ab1fa48052c01b2e1d13646ecf4aa8bc89144cfca72e3e85732e263cc14a53b2d123b4c7ded963c2157a6a13d7c1ee067c7d924e33dd386fff05f436bfb021df8b2bf448f745a90cccae58e5d62b88ea34f970618e0d96d2a8316ed9b5492905725b44a20beaef4daf4b213485cd08a4279ef6a0fe70fb19e8ac73228663642f259bdd3b4ca31ae890577d9b690d9ea6a4d7d289f012b41f3691d5cdded3223ed440ac6bd6ffd82ce3170c41c4cb9a045161e5b929c58d69b313225363bd78c6408563682531955ec312249a3aa3ac5b64aaffc9bbb66abd966f7424831f68a5f0518674cbc609a13078829399d7d5b2a644f2ff5fa66fb98c4c7da47c191aa0a122e331cae57038b02e064e9cc020e9af0a5b176778e9bffb79154f35f58b945f8a4508a26c44f02937fe2896d346e2fd571a7d0bd8dd17b0949d5fd92e41f78ea78ce902afc22428b1b0b511e4e7bb4dcbbbb870d450d967a7df50c97f239ee60fe41725381581b780be5fdf3c498939cc22f7545fa497b68124171063eb340c31b2ff90627af1983652bac15a484e3daac6e5674b47a74f5eeeffd09f4d0e72fba4902dd58453441519035162dc3b7aed4b96f77f7952d5d144e492fba0cac7d2e404ae4881ce243043092cf2d9ce1413e4e232412a884a2b8ad6dc187bdb7480015ae10055dd0eceb598def5aef9a18254dd287487ada1d18a95c8129cc03b59454607e55f2f87e5e495729d5f7c7001917951c6c2bee569a03c0a09310fb695b68a58dd5dc4958faf5dfd3a0b77c67c80d60faa2ae4fc1dade7e99968cf973e3914a64a29ba490d4ca4d2cd428c9261c2d039badc00c2f1f4e49db1d40af37364996f6b5216bc6f1954872fe3fe78ac1af1e3e93ff7cbc2a9db7668bbdee61f4958ffe4537b02ab367df578a307734691f2d3348ad17ac0a723c99ef468b2c34ec0db6ebae24aab5efc4d01000b6186678080c89b2783966259f759f11b09d65a86c89eda3f1376610c7ecfd7a38e01f8344b0986408a05b7d0623a4820e8bc4b75d648290a309b1fe8a6f23abf59ae593957d971ecffacaf2ce34e3ea64aed418536c314f62b293934b7d084dd4ab51a46030ec369da61a1b013ddd36dd5a56cd34838f610b8f727f57e59922364f305b08db99082518eafbdde09fd1c8ddbdf2872d2a90bf3e22991069b0c53c8835f26b0e8e815a0d43a49c48f3a28f21c8b83d213617dba9d7ff7e980cc4c3c3a3e8f164bfbfb37c97af36790402ea81f16fe8cd9a35055d22664ea5680f1ee57e7e178db1245259f1cc23cd8989f6191d04382e20ef0b4ce7b99141f56ce288372e4675c40a6ff0bed390307b10b8bfb0c6294b7cb3e9f37eebe053ccb868cb95b6c5d5a4f23e0e974c7ecc0171daa5070cdc36ccc694982ea99ff7f5768efe5e23835867ecc250abd764dbd44ced90220ccde66ef8e4711c64fa6fa3edabb385eabc01a43b7cf56ae5b3fbff813b969ca6bf2dc6b9cf92c48e113d29e4425039690628bfff12fc677e931fe16a872115646ca02ecb8910733436525006f80c5af5cf45e3fa2c18832af90c49136d52423b5c89ed0ce7eb954aac7c26c11290d79b9ae340503b578cce15771d99f2132ac3df44e4eecc5b373213dfa2f0921a326218f881e1e2881c43f6e68e0e9e4d1eaba72755a0f35278179ca6f6e00305da26af42185284c68c992d82d2f199b79b27427dc2bf348b0785180c36903cd321bb18e1cd03ae1b24b292aebefbdbcf231dcf7144b98714aa152c20bb92ad8270026aeb10704e881fe3fa38a441cb3d33f17f568ff31a1053c34adf7b13e94d15e9ab3f328a2cbec8a18804d2a25360d56f2f2268e1cf62135e8b22fd03bcbb8ab2862e0543c360dc8712a7c29afb00b86bfb6e5c609b8666f5ef25da5bf25640545885ff64fd9e5d777037d248a3d59d43d85c4d643d5ecf9cb02916df6969e1d7812b49577a1bc1f3c8809d62d943bdfba3b3bea7522a888d7007b611e694c95bb2a5d7d923a152d845dd53c9d8e714f5ec9644c47706513137fd5fe3f38b8e78909cb97c49eb930ee44b8f36e8d6a8f673176de86eab6f4839867cc1224a108487fe78fada928c54abb480a70825af7eb88e1fca3058f0e3e2fadaa3ce4af7bea0a7e94aa49aaf08282ecf85fa24edf4792ba028219ac6103d8fe8ea62f6df070af79059d10aec33d59c8e154237547eaf3134309da9983214560d161bf644702b8050</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
<category term="实训" scheme="http://example.com/categories/%E5%AE%9E%E8%AE%AD/"/>
<category term="实训" scheme="http://example.com/tags/%E5%AE%9E%E8%AE%AD/"/>
</entry>
<entry>
<title>AFLNET论文阅读</title>
<link href="http://example.com/2023/05/18/AFLNET%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB/"/>
<id>http://example.com/2023/05/18/AFLNET%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB/</id>
<published>2023-05-18T07:24:22.000Z</published>
<updated>2023-05-18T07:24:22.927Z</updated>
</entry>
<entry>
<title>机器学习实训</title>
<link href="http://example.com/2023/05/17/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%AE%9E%E8%AE%AD/"/>
<id>http://example.com/2023/05/17/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%AE%9E%E8%AE%AD/</id>
<published>2023-05-17T13:07:57.000Z</published>
<updated>2023-06-14T08:34:51.860Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="16ad329de7fc03281389a7a1bad6d9fd053e761abf6b568298ef765c849bdc1b">cb320da6677537a61c4c8a60c50f744cde71b5ec81002599fcf1532600fa357ab0211aeeea3f1645e4d6d382ad2d1452f0baa171bdff5177fb7150b121c4e0705f47f07cd2eb215cc68ffe3fc63c53b295fd1f7ebf392b383219c64d040895189e0e2846b03fc477277ecb2f5d3ca2c22d3374bfe5be63478a1da3966cc58e5ae26f95cf608cfad91dbeac1f19cd2aebb350dd53abcedb42a265546cdcc211b7ba69528b60061def0b851229ad0fc2bcee739d975b63384ade21e9ac3e53e76ed24bc363bbe3aa0b7b8c883e6e7dc710418a96df23e9f2dfb7b2d34cce3aa17b74deba04af31ad6609a93afc7d40ab175587eb628d4a8eee283935137c4d2ad576e32908712e71a94f6c3c0b1e3edc415a41f5ebe7cad686646d2001ad4cafd3089235a9a3dbc28f366e083f4ea041f4aee41c790a09e2f2c835c155617fa04295ff5741db3c3a14099a41e9b3dd1e40cee5275a28369f34504d01f0039d7acd4af32a4c5954522e9ed0b41df89d753cf09876d57f1bfd8ee7ae91365a594c6351e07d04d6b3e4a92bcbb99503ebc51bcf90ff3a188e5e08e1707cffb4e4954aaac60b026ed26b6f079e72497cd837c689977599960f53fa86097e90f79ad30b37beea1e54bb3dfeb472731213cb8d8fc4759a41a9fa04b1f260ccbdb3b8ad5c9da45f67c03b1c1dffebc48c66ab45a20ab8e09ea10fb1914929be7d6935244c7d0357279f046818e687ec956f88e007398602fe9ead6bf3b43664a891e4f067a132e0e1759f154a0e966a8ea8bc6a9d8e6cc79998017ba4023c18e53c676a8626c844c4ee46f30ef7fc18b7620ef6087d3c116554e39e6f48b55de87998a22faab440e2ce784747311936cc9f93887cb3a18e37a10f9a3593755fddde3152c6b999ec882e20ef8e8df7155527e769982cc49d213280826052cf264279e4dec260078d0d206d2046460fe85eb39fdd2ec8c6a2fd2d84698612991e72a1b0961c71146c6c35618382073084fd951e2d3cb323c9c30ee1b739bb8e2aae5c2f03ee6e33425fabb1f87628d8d2e8c3698ff370850479338f114702ada031232a7ee5b6439f4edbd22b6f127cfa50be35a5cccd6372dba319a015830e19a56f04c756854cdbe165618122e40eaa9839a178c5208e4b956077af8866453a21b8182398ada60b80bac04399a120b2ea88f5d82c7100927bdc31eef4b937f205d4ddaebfc7b34ccefddabb3b5b78b9f3d3c4e8ac338c634f19e6caf1fb0f1c26d361851c750053c7ed4c89a1bc35ffa3c749489cc71bc0e615a9359f26685eacb1a087551493a008d6362b01de7eae33afc711079a6adbca8f29eafb222f2c65649a28ec3f6221f479f7218c6a8894b903fd24fa4e998d30ddb84a0da4b6b3a24958bb433567cef0e210d5d987d21dd0f46c3e7c596e1c5525fda6547fa07632cec951996f05b544af762ee11b2292d2af33bd0dba892a33b4933b83603a3e1fea40a0699612f9615d64e3676624c4f5686914e1bf390316cb7fc49396df7b905553fb050da3b647be53dfc1ed3c57eed5f0cf741ec3621f4b774b542aca00d94b29235c54babb129ddee421b2b4127af5899ed25f4c3a7536ad6a4a9924cc11373ff081fcfffd72b48e44d87e7655c5b0a4306cc86708231d7a50db8fd1ee377d0ff639a583e4bc019ee683fd5fe889d6dda7973740c85d6c8307055d1a68146844139ff2ad637ee417a24dee93c1505f479fcda76d5bcb105fd7258c4577d799a924b024816417c8a171425a4894ee96bc6c27875058c5601bcc818e43519ab2e7979d6d28501ac5a451d488c5bd0c6bcc709f273aaeb2fb6991ff40de2583e8bd209fda41645a557ec08c8366b8b8d53246fe030e5d22809bacd1e2d73b301f4fad886f797ed5a75d978b8052cd2d46c4bfdbbacdc770ef5869ec2a049426c39e86c0571c097feeb094e7f11872cd520711adec36204050cde6e35a578d0d61879f74aa1ce9442fa02d707dfed8feb5fee0dadc1ce4f154b46a7b848193f5980b2a4417974d9578ec33f15ed50fa6fb49b51a78a2eacf3b76f53769afa28b6c0c9c515ccb3dea7617e6037de6699776d714a6</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
<category term="大作业" scheme="http://example.com/categories/%E5%A4%A7%E4%BD%9C%E4%B8%9A/"/>
<category term="机器学习实训" scheme="http://example.com/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%AE%9E%E8%AE%AD/"/>
</entry>
<entry>
<title>SwinFormer相关知识学习</title>
<link href="http://example.com/2023/05/09/SwinFormer/"/>
<id>http://example.com/2023/05/09/SwinFormer/</id>
<published>2023-05-09T12:01:00.000Z</published>
<updated>2023-05-16T08:21:16.279Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="6cf2a8ffa7775e82c8491c696dd41074290932ed70cda3457a080894c8e7efad">cb320da6677537a61c4c8a60c50f744c55cc386c767f36cf2c2dfcfdf9d95d4a5e0979049da582b81413c14aa5e64bf60df5fbccf3b91b4aa1babe2322314fa88409b4aeacc29466fbcd986807bb5a860dd15ea3d8b00c296da3f0f9b62de5eb7c2920b27a93ad30df8f9e2ce1d74f7dc028caffdb8d6d5cbe15600b29ad3b77c1428ff45970b4572a95a426820a3a81ef09bdc70fdebc358874972b1243eaac792006259e80001a970e9846cff8540670a935e99559214a748f41e39e6d6fcbed58fcc14ccae1a05edabe78b38321b349880dd2f100a3ad0c25521393d658930d2ddf2e2c7392ef9b73bdc3d84e6989125c7247681a6baf9f9a3df513a63fb3011be29b178ecf8f273bda337be812135e2fc411cc13df8c508d1439dcf675216c077028383f5691fc7613eb9d8a34f05739139ef989289035dfc017ddf32d673193244bb8ee15e81286451fa6bbdbed2388f53df2c1a93c47c7bf1655e7ed79437e3a678d29ae9b7a602b25bde4d5822277a3e2fe8af99362f704108db467aabf5c0a24196712a38c557a2ecc6424e881adedba66ef09bdb8f96fad0c00276ad7bba7ded213474f44050518b265e76bd18ef430e278d759f7452ef2402a85ad0843476c9b8deadc0a7f505794d0cb3643bf3acf732c4d037469ea7f2363e3de5a87ed5abe1fb5a6d7184783d10292debbb6df7be7c6bde1d29b0301e97f9e90f5be82f5a5619bf630475d49c887a4d4dec9909fca4ff6913554b7eeb5c65657b6a32f13297c70d61c907ddff124fcc46c13a9a2619099b2dbeb3f91ba23f7cd412876f728c38bc5766d3de35eb5e183bdc4d5e42e64a361db8a6938fd205db0752a243f9414793617dfa73f2b0d13ed585d6ad5eb87cfd309f7d97f4ee670690eace8ab320f749a6a33c4c2d028e68b381b9fb40a5ff0b434eaf26e3c4933c424c64387be630f0f95f44534866e7e562efe1f1e1b8779040b659f61441f3b1dc96815c3417d97be87c7cf46f4a3abbdeb911ae2578c97370f2760c2419bd16069377babd356c80e9b17514e3dd74661bba8e939b2e7de41941908aa446dcdef0536d61d95d18c83ed49688cf7dd29ca74742e14701201d5280ac94c960e88d22e13b032ca8e347406e111c6a65c97a41c90437b3f520919f2035fb39adc7df01c1d5f0d65408e9e84857fd0fbeeb71bd9dd08ca01e2ef4dd455361cf685655bcdc59c023f9ca6b049885dcfe7c506a84a54490fc017fb6e3bcdb815389636726e3f8d64396c2f9b421a5d62f2802fce16840c80b31f19c3bbbb63cb1171e414ce9f8f7b752df9cfc190c35f0e4ae77e68a065ba72953236848767d0792d81ae3a0820f9c2297680351acfcc4a714b2a42236f901d09f52a8b277bd78133f88da27c4659c08a913875c2467918bd2e31757fed0bbd811d369e9646fa42fbf577</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
<category term="机器学习视觉" scheme="http://example.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%A7%86%E8%A7%89/"/>
<category term="SwinFormer" scheme="http://example.com/tags/SwinFormer/"/>
</entry>
<entry>
<title>VIT及VIT如何优化到EfficientFormer</title>
<link href="http://example.com/2023/05/09/VIT/"/>
<id>http://example.com/2023/05/09/VIT/</id>
<published>2023-05-09T11:33:45.000Z</published>
<updated>2023-05-09T12:00:41.602Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="bfa127cc13c948e9335ee626b6e3b811bfb1c0ddb3a1953d9226023cf7bf45be">cb320da6677537a61c4c8a60c50f744c329cb791a1cfec2fa0cbd0eda0bf712b868a1e6fc1c45fb5c4d43bcd548ab3032ca18557421444be622c31eb040d4d31ebabe694ecd3042fcffc3f249721d00a25ebd090028f2d90c34bea0886ec51497529f516b158259a9ee6657e27ec2db7c55d13e8f95ccd6c4d7efc7629c27cbc841d711786505aed1f13b19e0cdb472f6bca1afd238a365ebac0f3fb24b68689a911d781d16498a2d31457f7f3270cf6c9d7a6e907d2ac17f9be564e4402515a933815d744f656b45e530b388730ced35fe31fe68393729353eff6f00b580c392785bda9d1cc86a024582b72ac3804f1a59769ea7f396bdc3d91d8b8ef381e8040ab2e3ca48597fc5ba298a0564f005c095f2628cb19533cc3cb964206879016762ec3c9579604fb1fbca2f2b08b264ca563b8356a4c83a4a162cde4987861483ffcf9fa4ccf3748965472fb86295b84754de4749ac89e6d269b7e69ddbea985670dbb21a9ff70a504afa87d839cd44700501de1df4331fb6b925e275121b7c6ca6efeb0b7f0fbb566bbf39a43b1e120992b5772906271aec011cd7c9e892df6984e2f31d153001d0ccb45ee3c03eb384f6f6615800a143fd0d144985a4a2fcfd9728977de4f19cb032a097368eacfd2894ae623252b4b87e7a8b731bd540c4e106003fab007a154b6b227ed0190651a623497823e72ab31f7613f42ff061f23a51075494d390eccbdb195a425dfc3ee70520f996e8f64a4099505a5a8695e109035fcfb24ea88bd18135dcb3f6bc3f93aa71e60aa17e9084f5d8bde91fcc52b55d13c6640d83fd5adecc384cc2a45669fbf14b249eaafd3fe7278a2db523a4c865c01edef608d9eefc0690179112ed670b533726822f4af4d8c090780753ee1f6f2447605d283b3e54e5bbbff5d16e4843d3f2a93eefa83a45664c6b69a89d659f6c2b3a56ac7551600bc4e27ab4a9336bfb40e43b6daf19b4cfed7003198d76e81cce2e7c541ac47f6447163056f9fd64bd48b4854800504f5850962bc2a6a364c86044e2f09362e19fde982dc515911d5184623c473d662c345d8944641e60b9d220f90ba09bd3e269ff7b356ca17c3bfca4660f97381e4981988f36683325d063e8ad6097de6460ad91a19c4361178d8ce8f740e2a7ab395ec666998adb18333b112239a05ce786553c16e37039753312c6ca3aa1cc7de0fbeabfeb65f9adeb9223f2a950f93331f35fb188425b7f6f2921e4fd85fc9422a05d808533d808bc0762d52c5b85d53b443ed08f3bd838a80ff0ddc52d9e862a2b417fa598a032db7c668b0a3bd37bfb0529f63b58daddee2645d72f01fe888ff3652edf160b46d7168b7cd4ea07f08257ad9dd26557fb5ea6f95b270a5a18eca2ba8453d001fdd6f86b01fa79d2062c4466919e89b270b165adff82cf92697e68405152da358a35c7e2f39c6f5398855fe33200f00f169319d3379f8740d890ebd3c9f72c3f3dab9e9158a516e8d6ee4d56b9f226dfe844ea784e1b15f3673032aac00e70869e87e9ef106d8dc84a3343c94bb9fddcecdec1dff21a47b00e8517dd1cb7109005c1d478abdcfcc67e8fa83f6643412f23ed2ae86e3fbf73f33e2f7e781992f08b77308e9a3a821f760c83021cfb6d718cc25798937ae1c882a9527952b2e4d8545bbbc7e2d37d6436d36b2652cbb8a308f1fd8aafbebafafa32afd51414a4ac9b487cc44420180254bfce93ae1a58a11ba55b2cca21f3ffdfc00e18c4d349ad8d97b0e056dc51b4fe7c51cc92599dbaf73f01e73202524b1887b2e85c5906082b1ba49b8bbd6c1f044b3f75844a0d86f6440f0d67a8c0326fe28b246077bcf77abb0016f0b1d43a330c969c45c4fbe92e747bda001c64d84bdf6cf20aca86426af959da7f4952c9f02f912d2904be84679fd5597aa5a3d3f1b64d6cbf09da91eeb099d039c8707e1a1f18f38ccf4241e95b285d4cdf9c66cbaa1fc0f2698d3881e65e8da2f65cfda1105f47eebd3d9ca4e24e7c24938541d6a0165e947127716feaf2e48cbb5a52fc15c32308d1226235558a52aeca750ec3c706c8a77ca3a36e3a444b95c917159edcf52b79b62352c7906e5a61144f6e82875a02a0b7f32b2dedc3e3f375f884df63c5bf0e329a227c6ec7403c4cdbc8ff2c8f3f17477d44703231b39e44c43c280b63a029e98af5130e8903c2d1a6d92d34dccea810dc0e2f5f06447c1bbc7d24afa5d18de5277eb7a39a894cf2b3bdb93e1d51acd3731d68a2e78e98fb00ce4347657ff2792df94ea2862455c5e38b9a7b8118196303ec1384e6773f5f8af8c3b3022c95b483b10b09eeec6ac9e59729bf3d3b99800a160aece1297ffc9498e96aed9e9a8f68b8a4f3d122ef22b7ea68d2ba70668f6f43e0a42f63b10e9d649dd8ad35a4884bd0f43b2795abab842a4ce9d720b623ae7d6c9b91e178c28d6e74c5f506428a94a21269ef832e3b917c4ba886d2a50b49d023d333ccff342f8ef3ffa86c445a17d2871d07e3ffc0c9ff12049627f5d3acdfcd35ffb2ca9acd419e2aaa968f5d2bb0135cbea2e00332ff6ed88e56e996c80edc33c47f1d3a8c329c5db24917cbccab5c77a455a4b9281b1c61b58dfc2d210fca7445aa8b01726cb21882c8f5cf9cdff5a60d55455554bc70d99b3ad86585329027aa42179be68b91a9170efeb5fe52f6f35ed9f1c2d733fe5bf9cac158a920297d4a0b58d6d0d360139833ba33c952ec657cc5120feb553ab021db173c9e94d4a5b954bc1c27476b62f8ef195d0d97ea11f35a3ab9421f92643fa81dcc13abfc7c65d3a79c81c04697a982b0572f7ce4264558b9e6d14b148dee270da51ae1680ab0d1503c4e45d8fdcfe263095badb1f76d897a33389bf4bcc3e7facd6bdf0866c3785dccadfb5aecebe24ddedeb5b0ba1bd64704bc411540c40acd88eb3c3ae0df35d194a001f52affe7547de7b69835cd32faf0f54186bc2dfc50b9788eff498bd5c2e843150418b0010d92cf976d6486dec9bc9e81799ba991260a12a2ed4414d6831fc2484c7ff74472f9df8d9a71fe525a75a348d58ed84821685c43b7748715a71290225ed55aa9430342e0dc093d4ebb8b8b32ecc107ab70b348986420aea44b3189819197fb0ed3e5f2ece5f1b45085ca6c5471c1c965c8d7fa3093ed92fff3d0e8997d4bd4cdd1bfbc7748868f634b2ec5d69a85ac4983e05614ddb4b540562c6200ddb485108a9ef08b5a5d1d1b311fc0bf51453c39139c11da0c29ba8045ef8371f1a7a6f502dfe645cc6329848448f0235a7961d53e9da27648ab659765f87f2b7e0f04a4277029a424869eeaca98f1d73db9b3b8c06fc4621a190893af07b44f7c628a394df82dfbaef46983554ea7de0c5a1e2ad06111fd37a57312dc1b218ee0becf101019ed84ac202cbc01e400dbea654795902c3b76bad858052d195137978b742dd0e771d7ccbb132fdf7e08149c69919deabe60dab0eac3e24688946c063234400c49b0a24542e2f315f0e1f5063c5d0d47d97d1f03885ca1ec5472d74baab8c7dfaf1a7028c4b51f429ad5ef1661338ec21be40905903568194e7aa8882c930f98e9c07ca4c65e84e14ff63c797ad85c1d6eb4c0f6a21d92d9cd1fe184b0050af6aedb57db1c04df17d7ac2c1149008982d2e6f9d1c160bf36a3a3b2d9a148fc816c4e42ea829c4cbca36d2181097d6e62c991356b8dae12295a829f39be4c71f1d60a124</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
<category term="机器学习视觉" scheme="http://example.com/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%A7%86%E8%A7%89/"/>
<category term="VIT" scheme="http://example.com/tags/VIT/"/>
</entry>
<entry>
<title>包管理反向依赖查询相关知识杂谈</title>
<link href="http://example.com/2023/05/08/%E5%8C%85%E7%AE%A1%E7%90%86%E5%8F%8D%E5%90%91%E4%BE%9D%E8%B5%96%E6%9F%A5%E8%AF%A2%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86%E6%9D%82%E8%B0%88/"/>
<id>http://example.com/2023/05/08/%E5%8C%85%E7%AE%A1%E7%90%86%E5%8F%8D%E5%90%91%E4%BE%9D%E8%B5%96%E6%9F%A5%E8%AF%A2%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86%E6%9D%82%E8%B0%88/</id>
<published>2023-05-08T11:14:13.000Z</published>
<updated>2023-05-16T08:15:01.161Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="b5aba9359c9a174037d30e1ee8f995cace8cb40a485a3c2b01b3ee566018e826">cb320da6677537a61c4c8a60c50f744cd836ec1690daa048fccd34b0dbb53354dfecefc8906c95f75ecb0a514b83ac1bd8d954946709124cc145b2f36e0f74324b378e68b519363c0b3a6c25e304fae9d9ffe850912562c67f519c2ec76c140d5d76af29c216b81d11db0a8f5f7e82899e5d07cf473b3b40bc9fae09a00a98b728a4181e297bc667cd47ebbd191985fdc74b1c61c6b21f750df2521b799a202943cfe04964b00d8928e0868fb00f05ffda3f9a8ccd9c7f1426fa867c2880ffb83c5a837cf294b2b42c8d295801bab8eb523bebe13bef407028f55d6b5abd25470c0b6ebb2c5120e259b618c2d37f63ac9ef91bf9ed93439e62c88e8517d42ef69e86cf7c8cb22dd8985e426e4caadabb3f0aaf9526845bdd75ec4af7b101c55898eff3253242e01bfec949c4e29904569527abbd5e62681d5da4aba19899c2de4627a1eaf4790a6710126d72c9b62a6bf0b009776fa34a78ba1d0121b712b7722eabd6e434488cebefb895cc87b609a919c75fbf5a19d2c44cbf951cca92ebfd5d1536356b7c2ebb3e6ed7b63f8fde3654ce3c1ace16b1e565eaa2a3ed286d5a97d666d46499e474b38c526f911583934c69860e49199213d2bd46a36dea6e59bd08952fb3553265b20c674fb6db310ee44ce8229a35936eb494dbd8e4aceb84732cd06f849933ce4d1ace245b924d116cdafabb47096f2fbe680134be7718d9ac6c5ce07429f6ea7a4ca76964970ed4c5fe61e6e264a0e25dc95a797893f1f6198ebe0dd73830baea34bad15bcdb71e6daf78d7827f6f05cbfdb7eb7d29a89d1d406e7388d4c4e201ffc9b7aa7738af1a672c096d3166772db1b0ebec8cbb7052bc6b6fd0f150c79bdbe0a861841f9670cd4b5aba965df03b463a27af95e5ddf1ccda3fc7ed078d9bd72d7db89602cb2d31ca753f8b44cc89488f067ac8f21be5298c6bb3969d73ec12e4c2e82d45cf865e6aaef6f99743e80f34a48da7bd47415fbf27fef0644d139aaca8443153f33698be460d538dd61b4bbede390775066b54e4fc57af321e8cea2b5fa8bcb47c2a38e447d71ff5b971d31e19991f5bbb677407c2f984812761362ddae93b282066e139b94a7c3427333425767d0ee15a38f1e59c187723e6aa60e84c5f0023ecb30383e156e87117a788529f91e6ed4b727ee5c3e2325973aab7370d76b5660d3be550c4b92623194514c6ed085e7f197d9da96123920d1674e891fb4eeac6973da85166b4dc2b0b6b531fe7ad24394186a8c5f07c33509da8a3bb53090f31833cbdee60e35b2f8ad4dc6587438461f9608664c18f2c8fb0037e391a731314bb7efd6c705a37d15093f7c37045ff2be820c5c3000ef6e5ffef7d628d7476f7303a479795162960664eaf0ab08a695d9c5ab799daedce82673e981bc2931ee316f1a8974855cff73626a0688910aa171221eee9e11e092980ed95cd31e9d44059d8880247bba6e0fa4904492815158c4ce8d7cc15e225c28d446ceb19f05ab9c4fbb727c69421068cfa474d1d4c0c454cea78cc7ad3a8fbb889fa8d4664815e19674974dc1eaebdcb190f1c5ca6f8146583ac323cc6f2b257310b0a830603641457cc515afcf405f776cf782052da4ba07391261f8846be3fa657b3a1b6a888a2032edbbc0ad3578c2c93832f6157ff8587b17363e72efe1124d6fad8c12116af1ee4940a6ae118df73562913785550ccf0eb605194dbd1a2ca71e0b7f252f42d5ff3e2d74fd2fb615cd2c443adf952b705cf22ff80e89279bb7360ea73fe490617ba4d7e823910d110da90b24b52416da38f61d629b715b416ea25be3ae11f21c5202adb5917d448ffae459d68faa6992ca29927763d8c65535faa1b8c7daf5541dc64e8fc5c2efb73ee18e116a57844ad84258ff371562290b7b3d740e076bfaca83451124afa20e5b8d47ba188858bc2a7fd92199be9eebc7618894ec0e86dfbc0a02b73a81bc0f8ff55a669de602910a1cb0e2066ef9512b029a6e257ff699016777f9b27e0b81b7639646455a60c8fe93d786f5bd3faa568cec2701d25c448fdaf1f42e51b2de8c84770dbd08862d6536d1e31233f7be072fe45c65e92548192f68cbb0642e8becf7ba42bd1b0edd2c238502ffab4dc74626ccf03bbc52d8693b0ef96b73990a72600d0e2ae4b8f3d7e88bf1a4349afeb10af65e36e5ddb426989227f2322633087e43212430de1ffbc77a791fe7f864f127206d06eef8c0eb7e5a5642fc2dba06b1ad791d019f936d842815fbfad9f9be3e8deae398b53cfc912c24fdb6e55c08158dcb4e8e11ad7f518c90db6ecfe01ec15b3022ff5db30e4f3fa4ba265e4799bce9ef369f2752f7dfe1779c8696df9b576c8734750d89f4f79e17c8e362ff5dd4864c325c8dde4ba89fa516b41666ec15ccea6ceee35c64919785c1a3e149e7bdf3edfc287716aec95166dff4699015cfbaadbfa5fa8ad7b3b4a965f3fdd88da551a5cb4811a155345d65ad0f3f0e641caa9c2f70ba448f41bca701cf6d3c22d3f1f3aba7b6743b7ef4ffcd966cec6cc6875c3bf870e80782572896e4428bfb2e27a78498e91c55fed40630fe96351178cc56b826bb70dca11326f8427ba37f4b03195d3371166c608966cee9d011fa196249c2caa8580bf71ec2c532a47aa3623fe0e20d820ebe2c671c6ab7b1d098fd3d536a083600fe0d3ab39efb082d999a7a2040838375239a436314f160a767b17624a29091d02f7ac6650bbcc79feed26344800a3af90b137ec36156a0f1b8b15e47c091b7a20a99b0ea7748bc7d9d5e6c23c4e29d98b284ef18c0d05819b444273fc498f46a3e542fedbee0fd289e56364ba94a290b57358962c56f2ece52123424685c394bd744eb9e1c8c1d7f0d7c7144c3d54178f4969c6c3aa240f69a4f503381b8ec965576d9b0e7aa68646ee70a7560103b0083cd18d0ed9d1335296b95c11cdc6706c5378d94b926e000fbe36d4e440f40747b88ae6feed691cc6847a247851c751abffe86ef216ecf17365e73802e71c0c53c46be353a01d1e915aab11a73befcfda7969d425c039c6de83eb311853313796e62e03d7e21a9efc1ddcd536a0e718e6b5153a17fcafcddd5d03c44e3f1fd48bfc066dc445517b617e54ce836141212fa7f427c4c008c8559834503d15032da30309bb6ae9fb4bfc08fd1aad72d62300b54a440e1c9ca31f3395b580a13c341c12a84853615a53c800c7ca8ef65b433e77993e9ce9d7c00fb8876d41c1f258dde4ccada5dc6a7bf4c3370878ddaf182bf22b7f19db4c556fdd1fdcae58ab7c52641efa01b7c1359fae545bf82cc1c188e1402b8775c7fb213488eb92ac54bf28e2e4475357e3eb087d2461566966dd6545b0dee43e5787d2df117a12ea845fe6d04e65daba132a591b010a9516f7e003d074a2d35af3a668e1e93fea2eedbb92aee29b28222fb0d06befb58bbb8d85ec7fea1cb26e5a2fc8fea535db29e4d9f57685a3e4edf156f6323ef3cc75d60801f6efa9cf11ebc6a5e29eaf8cda73f0d6b8a12941ab6068f66854b51fd40d7c2c01dadb68dbf5097c6cd86b6f96cfee37c3fae13d396265ef9e4793e9bf12d8c53f2089ae308cd4f79283e2275365422e3ef00323858a93c2750ed6375f3fadbbb498c1684e1bf7be604501c49a8bb83401a2738906ae92111cfc07916c031e0d508f8887b5ba75ff5cf96e98616b951967c5087b4d1baf35f3f588c6458c51894ac428134bf862346a0cbfbfc28cbcb09c02b84e2df9414e6bd72cc1d74ab39475080d07c59781661a47f05ce9afe12bf22426dfb48d79beaf8ee3623f716721f872e21fc5b110f11ccebd464f93295e5e10b959c8d25b545a025e30ffbe1f3e84c9206c8ef8c4c6ed1d6b1cd559277b66b67441388a8b5647aa291c64a7ba06f541d93b92dec07bec7353df12d1066e72de56e9e4d281a6f24af508d90192a459b9dc040b4621a25f6f6d90298aa7151c98db7e5c986d6d633bd1e320d38d12cb328d0ac937ee288a07aa24778c2044ea0d9f31f305b24b02759f337d6e7c172154e6a2705ea4039540256c17b9b7ab93a4b17242ffe06a41fd9e062c279e83168cdb68a8a8234d0044a38b30b7717c59d886886d19ea5e44b3ad3fe135d1</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
<category term="安全杂谈" scheme="http://example.com/categories/%E5%AE%89%E5%85%A8%E6%9D%82%E8%B0%88/"/>
<category term="安全杂谈" scheme="http://example.com/tags/%E5%AE%89%E5%85%A8%E6%9D%82%E8%B0%88/"/>
</entry>
<entry>
<title>yolov7 and DeepSort解读&智能多媒体通信及其产业化技术课设</title>
<link href="http://example.com/2023/05/08/DeepSort/"/>
<id>http://example.com/2023/05/08/DeepSort/</id>
<published>2023-05-08T08:45:00.000Z</published>
<updated>2023-05-16T08:20:28.231Z</updated>
<content type="html"><![CDATA[<p>一切的一切都要从一个课设说起</p><span id="more"></span><h2 id="target"><a href="#target" class="headerlink" title="target"></a>target</h2><blockquote><p>多目标跟踪算法研究</p><p>(1)原始数据:原始数据为一段路端或车端的视频序列,视频序列中包括多个车辆目标和行人目标。</p><p>(2)功能描述:可利用现有的跟踪算法,对该视频图像序列的车辆进行跟踪,输出并显示每帧目标在图像中的位置信息(左上角坐标和右下角坐标)、类别(目标是行人还是车辆)和对应的ID号。</p><p>(3)编程语言:Matlab, C/C++,或Python。</p><p>(4)难度:难</p><p>(5)环境:CPU或GPU</p><p>参考和对比文献:Wojke N, Bewley A, Paulus D. Simple online and realtime tracking with a deep association metric[C]//2017 IEEE International Conference on Image Processing (ICIP). IEEE, 2017: 3645-3649.</p></blockquote><h2 id="solution"><a href="#solution" class="headerlink" title="solution"></a>solution</h2><p>直接github上找个colab跑一下就行了,但但但但但是,害是要去了解一下原理滴</p><p>这里copy一下答辩的ppt(没错</p><h2 id="PPT"><a href="#PPT" class="headerlink" title="PPT"></a>PPT</h2><h3 id="Why-YOLOv7?"><a href="#Why-YOLOv7?" class="headerlink" title="Why YOLOv7?"></a>Why YOLOv7?</h3><img src="/2023/05/08/DeepSort/image-20230516161700072.png" alt="image-20230516161700072" style="zoom:67%;"><p>YOLOv7 同时在速度和正确率上超过了所有已知的目标检测器。</p><p>与性能最好的 SWIN-L Cascade-Mask R-CNN模型相比,YOLOv7 以显著提高的速度(快 509%)实现了 2% 的准确度提升</p><img src="/2023/05/08/DeepSort/image-20230516161718506.png" alt="image-20230516161718506" style="zoom:67%;"><p>YOLOv7 在速度和准确率方面通杀了YOLOR、YOLOX、Scaled-YOLOv4、YOLOv5等目标检测算法。</p><h3 id="Why-Deep-Sort?"><a href="#Why-Deep-Sort?" class="headerlink" title="Why Deep Sort?"></a>Why Deep Sort?</h3><p><img src="/2023/05/08/DeepSort/image-20230516161745723.png" alt="image-20230516161745723"></p><p>Deep SORT算法是对SORT的多目标追踪算法的扩展,它利用appearance信息来提高追踪性能,尤其是在目标被遮挡时。实验结果表明,该算法扩展可以将身份切换数量减少45%,并在高帧率下实现了总体竞争性能。</p><h3 id="Deep-Sort原理"><a href="#Deep-Sort原理" class="headerlink" title="Deep Sort原理"></a>Deep Sort原理</h3><h4 id="Deep-Sort的步骤"><a href="#Deep-Sort的步骤" class="headerlink" title="Deep Sort的步骤"></a>Deep Sort的步骤</h4><p>1.检测器得到 t 时间的 detection bbox,更新track set</p><p>2.经过卡尔曼滤波器预测 t + 1 时的prediction bbox</p><p>3.检测器得到 t + 1的detection</p><p>4.使用匈牙利算法配对 t + 1的detection和prediction的bbox,更新track set</p><p>总结为:</p><p>1.目标检测器</p><p>2.追踪</p><p>3.匹配</p><h4 id="追踪的原理"><a href="#追踪的原理" class="headerlink" title="追踪的原理"></a>追踪的原理</h4><p><img src="/2023/05/08/DeepSort/image-20230516161920777.png" alt="image-20230516161920777"></p><h4 id="匹配的原理"><a href="#匹配的原理" class="headerlink" title="匹配的原理"></a>匹配的原理</h4><p><img src="/2023/05/08/DeepSort/image-20230516161932207.png" alt="image-20230516161932207"></p><p><img src="/2023/05/08/DeepSort/image-20230516161941982.png" alt="image-20230516161941982"></p><h4 id="匹配级联"><a href="#匹配级联" class="headerlink" title="匹配级联"></a>匹配级联</h4><p><img src="/2023/05/08/DeepSort/image-20230516161951627.png" alt="image-20230516161951627"></p>]]></content>
<summary type="html"><p>一切的一切都要从一个课设说起</p></summary>
<category term="论文阅读" scheme="http://example.com/categories/%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB/"/>
<category term="论文阅读" scheme="http://example.com/tags/%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB/"/>
</entry>
<entry>
<title>EfficientFormer -- Vision Transformers at MobileNet Speed 论文阅读</title>
<link href="http://example.com/2023/05/08/%E8%A7%86%E9%A2%91%E6%81%A2%E5%A4%8D%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB1/"/>
<id>http://example.com/2023/05/08/%E8%A7%86%E9%A2%91%E6%81%A2%E5%A4%8D%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB1/</id>
<published>2023-05-08T06:14:43.000Z</published>
<updated>2023-05-16T08:20:55.946Z</updated>
<content type="html"><![CDATA[<p>实训要中期检查了 嘟嘟嘟 Northeastern University 发的,看看</p><span id="more"></span><h2 id="Abstract"><a href="#Abstract" class="headerlink" title="Abstract"></a>Abstract</h2><p>由于众多的参数和模型(如注意力机制掺杂在里面),导致VIR(Vision Transformers)模型会慢于轻量级的卷积网络。因此,实时的部署是十分有挑战性的。</p><p>最近有些想要通过网络架构搜索(network architecture search)或用MobileNet block混合设计减少VIT的计算复杂度的尝试,但推理速度仍不能令人满意。</p><p>(ok 看到这里 肯定要去补一下 MobileNet 分开写就是了</p><p>大概意思就是一点点给模型”瘦身”, 重点是学习一下如何瘦身的。</p><p>然后大致介绍了一下自己提出的 fastest model, EfficientFormer-L1, 79.2% top-1 accuracy on ImageNet-1K with only 1.6 ms inference latency on iPhone 12 (compiled with CoreML), which runs as fast as MobileNetV2×1.4 (1.6 ms, 74.7% top-1), and our largest model, EfficientFormer-L7, obtains 83.3% accuracy with only 7.0 ms latency。</p><h2 id="Introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h2><p>为了减少 transformer 的延迟&计算时间,有一些方法已经被提出</p><ul><li>some efforts consider designing new architectures or operations by changing the linear layers with convolutional layers (CONV)</li><li>combining self-attention with MobileNet blocks</li><li>introducing sparse attention to reduce the computational cost</li><li>efforts leverage network searching algorithm or pruning to improve efficiency</li></ul><p>然后介绍论文中接下来了自己干了些什么事</p><ul><li>重新审视了 VIT 和一些变体的设计原理通过延迟分析(latency analysis),使用 iPhone12作为测试平台,CoreML as the compiler</li><li>通过分析,证实了VIR中一些无效的设计和操作,并且提出了新的 dimension-consistent design paradigm for vision transformers</li><li>提出了一个简单仍有效的 latency-driven slimming method 来获得新的一类模型,EfficientFormers</li></ul><h2 id="Related-Work"><a href="#Related-Work" class="headerlink" title="Related Work"></a>Related Work</h2><p>这里就不写了</p><h2 id="On-Device-Latency-Analysis-of-Vision-Transformers"><a href="#On-Device-Latency-Analysis-of-Vision-Transformers" class="headerlink" title="On-Device Latency Analysis of Vision Transformers"></a>On-Device Latency Analysis of Vision Transformers</h2><p>然后介绍了四个发现</p><ol><li><p><strong>Patch embedding with large kernel and stride is a speed bottleneck on mobile devices</strong></p><p>我们在下图中比较了具有large kernel and stride的Patch embedding模型(即 DeiT-S 和 PoolForm-S24)和没有它的模型(即 LeViT-256和 EfficientForm) ,表明Patch embedding反而是移动设备上的速度瓶颈。</p></li></ol><img src="/2023/05/08/%E8%A7%86%E9%A2%91%E6%81%A2%E5%A4%8D%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB1/image-20230508153203227.png" alt="image-20230508153203227" style="zoom:67%;"><p> 这图刚看上去可能有点不清晰,横向的长度代表耗费的 Latency , 主要是那两个长的蓝色条,代表了Patch embedding是有很大消耗的</p><ol start="2"><li><strong>Consistent feature dimension is important for the choice of token mixer. MHSA is not necessarily a speed bottleneck.</strong></li></ol><p> 比较了两种token mixers,pooling and MHSA</p><ul><li><p>通过比较 PoolFormer-s24 和 LeViT-256 ,我们观察到重塑操作是 LeViT-256的瓶颈</p></li><li><p>发现如果维度一致且不需要reshape,MHSA 不会给手机带来显著的开销。虽然计算量大得多,但拥有一致的3D 特征的 DeiT-Small可以达到与新的 ViT 变体(即 LeViT-256)相当的速度。</p></li></ul><p>于是作者提出了一个 dimension-consistent network,同时具有4D 特征实现和3D MHSA,但效率低下的频繁reshape操作被消除。</p><ol start="3"><li><strong>CONV-BN is more latency-favorable than LN (GN)-Linear and the accuracy drawback is generally acceptable</strong></li></ol><img src="/2023/05/08/%E8%A7%86%E9%A2%91%E6%81%A2%E5%A4%8D%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB1/image-20230508160307970.png" alt="image-20230508160307970" style="zoom: 80%;"><p><strong>CONV-BN is more latency favorable</strong> because BN can <strong>be folded into the preceding convolution for inference speedup</strong>, while dynamic normalizations, such as LN and GN, still collects running statistics at the inference phase, thus contributing to latency</p><ol start="4"><li><strong>The latency of nonlinearity is hardware and compiler dependent</strong></li></ol><p> We conclude that nonlinearity should be determined on a case-by-case basis given specific hardware and compiler at hand.</p><p>意思是不同的硬件可能用不同的线性层性能比较好,这要视硬件而定</p><h2 id="Design-of-EfficientFormer"><a href="#Design-of-EfficientFormer" class="headerlink" title="Design of EfficientFormer"></a>Design of EfficientFormer</h2><p>晚上回来看</p><h2 id="知识补充"><a href="#知识补充" class="headerlink" title="知识补充"></a>知识补充</h2><p>图像这块确实没了解过多少</p><h3 id="patch-embedding"><a href="#patch-embedding" class="headerlink" title="patch embedding"></a>patch embedding</h3><p><a href="https://www.pinecone.io/learn/vision-transformers/">https://www.pinecone.io/learn/vision-transformers/</a></p>]]></content>
<summary type="html"><p>实训要中期检查了 嘟嘟嘟 Northeastern University 发的,看看</p></summary>
<category term="论文阅读" scheme="http://example.com/categories/%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB/"/>
<category term="论文阅读" scheme="http://example.com/tags/%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB/"/>
</entry>
<entry>
<title>软件所二面</title>
<link href="http://example.com/2023/04/26/%E8%BD%AF%E4%BB%B6%E6%89%80%E4%BA%8C%E9%9D%A2/"/>
<id>http://example.com/2023/04/26/%E8%BD%AF%E4%BB%B6%E6%89%80%E4%BA%8C%E9%9D%A2/</id>
<published>2023-04-26T09:30:25.000Z</published>
<updated>2023-06-13T15:46:00.466Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="e5df96af143e989c1b19d22e84a8bca41e1f0b36c8cb394fbab278876d347a73">cb320da6677537a61c4c8a60c50f744c52ee21eca0f198ee0d97cf115eb3602d920537383d48a7b799f5b650e7fe604dac90635a0123eca713929cf6863bf33368eb739903e0cd8961c7ba759e645dd87f027f98eac174791214be4c6fb79e5fdffc50a2d03039272dc54f3cdbf6ad80d00b1ce56d79defbbc9ba6db2fd707ea15bf37ad9d1a9b89d5f24e39883691c3d750ce6789287dc04bc01717288f19935cc3e335692c7796d0bc3e5459a8d4b2e110e31d2551d32c5450c3c7412715636f2acd38c286479fb94c8bd7c38ef020de6d7b25ab975a574750325ba1938015c1de6e212b3cd8b83675a8cc4af3106736307d0d02599959410f5e22fb29d7b91d6e16d6df982d210f2751a3cc091cdbec806f552675f01d8ca676bd9e87780f4557467a71446ff5bdcb44d3fd85fb55436a4a2983d245d59ca17f55b3536fc088f53127cfe771c083e12ecd60eeaecfa12842f19dfee87cd3a5a564b7b5fa293dbc734b664cb941214dea7266353c71b3359544928712e2f53979a2522eada7b6de485258d4225d55a61af91748fccb4ecc56228445540944693d1da56eeccb7c9d6c6899ea5105f52f80ce0f3a4941cc3070ea4bd08a4c5c101083349aa325cfc3f350b59743ee328d1144d1bd243528e772a1265d1981dbd69369e85ea4cb71ac7d630df0a12b05ca65a3dd153611d64651db4c5b3dad9697324da01889fdd8b473f7979ecbf275e0c7172ffbe287256da03fc24b3fa2d7f07603e1fecebd7d57e6eab45460ff4e779d826371eb8ffe30c4067ca63853406370da15b191c22f9d175a09a090dda47ea24fc2d7e592ea10d20d6aa93b2c00b2d3f3a74db1537df798ada38d821d009279808fbdd00dbc99e4c3acaa43416d8ae0da466631d0fa87e40e083887d339e54f1bc7215df4b9c8b170ad21d746e65eef1fe73c2cb67627e94132485cf631f386c21c61210047d8f52166328269c4118b69825667dd145de21e7c2ec06df922a329e41d79b70e240a1907e96fed13bd9ae948c460544af0a6a77bcec28d3faf3a0aa653856fc25079b6a4a3a1a6def0cfd26550b891468f1aebe92031239433d1825ddeaa8034ffda520ae6961e4ce4d718769fd58686c1ab2305a8de96318926a827c91ee7d6bfb28b70998b053a15976db17e36274ccc77868cc958cc736203c2db4c15f915296f9554fbdc8dfbe3f8162b01b6c39fb794fe28dded534d523b40d07b2ef184442af48f0933e6f30c8ed9404a155acfc26879d4df26f9a09e725374a33a91a52b8076f928afd2e446a6cb0dc3a5cc53731824a291462b2c56bc6ed3606118ca1d341235cff3216362bc3fad5f8dd2febf6d93a44d06e62de83f14d35ef4a8234bc6c5f5391b9dfba3350f4dcc134c6452ed69324f0ebd93a8d2617d79a2e6546aae05b1e78d81593ef756d4a58502e4b2d0679fb33d5b2c9f25a241130ebfddf6979921fbf52b6a0dfbf1e3fa76b7aa09cb18b3740a841387d21264186949650be02b8348a6675c45e2a5143fe6fbbb431ce96c10908cca383b1c1154b1db9865c5c0f01df2450763c004e1c9394a252b8077a521dba4fd0892feb0f0037cf041101d040414b678743d23b6500a4deb37c5cd1fdef4c058d5b7a6e74b6c0a3a8f2f307c3ac1c6fcaf6f6f312d987c1d46899ac8e8903499395e5191180002112a6f435a0e86d8a610ccc9a30d29cbc2b034dade55db49ba2175e9831c3a5952936e3f1a879d3b98f344ef508cd86080abdc05ad9924c93664c21a9f1fcd269dc787eedd9d18f684eaaead5b12d2bc5ae34428e65c4345ea5e9ee3199dbf555919275f64a1b1135ea620315a31d134afdcd84861af17d4ef11e080734ce886cb8dfbc1189ae477f1ffdf9b77eab93d30686cf37a61d690d1883f9ac4c82fb70483f9257ed571bd071db2e58c813a625e079257f65d0e9b49f65cfe3ea31af98d7b78715da741cfbdda4a63b23f34f66218df60dbf91e0a3e816a8917292fc372d92ec677e3d40a48f376ac81c096328d769d2fa42c64a3a7ce950409ba8f5e1560ac87d236b38f08a951c7c35ca8f8e2a6834cb5152fddde467b5951b3f5004264fd0a2107f6b2a8c8fcdfcba803eff05928411b3b88dfed4abbf74f380a66d18067bee9dfaecab97251d44d9950c72326fea370a51e9e6212ec7b3b1a87836bce678ad97154667dae832cdf9313a1815916b847f37222d584ff09e9472c5275dc7767ec8522b7831e8b99f3c64db90db9a503ba5ebe8abbdd2f532bc82c2bf93eac3db68ae0d7717a106229facb0cff5001b94f7222d90b5f7f96670d8721bfd9aba29f032af05d27e84068ba08d581fc3927accb18d0e18b1518a971a62f8b696d73ea5180e0f45c6526bacd5ff4ec1b189c047207c8d0b9f29eb2e0dfc2396392167fd6393d36c7b99bff2e8bac7883895542ffd5964b7272ac1e1739e3bdd41ad4c1e19958f4a4fe788aacfb9be79e8ed7837719e567b2244e3db3cdcd3327539775653a3fadf34d934bce09c5b601a4d96c567dab1a8239cee2359d80fb71fa005ef513bcb71f30b45072428ec4e00498efd84edc06180b32d2d7a78c2d99e3442f600c05ed8036025e9c550bbf17d3f06efa062c4dd053474c7813bc9ff058524f9df808602d242fdc714b0d761c5bd311721c2a5518a6b0a23ffa9a21d119c56685155f2d918c0a2f9bb8639201ca21fc4921bc3e2be5e3ed1257115e249949c5a1d36705e636603de3ac9c7662602b5acf79e5cdecbb075576e1d33906f096e6f9f01ea6b2f81c63040073846265096f31e65f260dcef1cadc263405e3bc1fb2ba233472eb706daf74828e99a13ccbdaf323ea901cef9b06e1ef5ae6ca70a1d2ed5ddc3216b9fb71007a38d7d2f2adceb408ed83b98a0e67bff7d84c06d25900cf1f594fa8345bec6dc4735eae28068e3e81baa5f0702ee8688a0e23d57f5dd7c42764284ba525de8f37fd1d5e2f004ab0b8fb4e79b0ba9c7a57978399d4ec29931c1ac4a3804ad47312cb515944c2b36bd1bc06952a956366ff9d219286e125ef17bb8c016ad483525faf19be7429461992137b1c9212f4677572e2477dcf19a495331b6c5cea5f7b5367c9065c2613dff09746e38437aac7c01a14d62a68ea404d04f9ee7913cb9d0a18ce59c961b2ae58948d1aa2ba7b0d880d82e61c627f6a2392a63bae775121aa9f570e68ccfd84760dd6be866ae50aa620c2e3f98d683f1ba108bd263a5a601abaa422adb49df7cbb26ce57c2c935c9d55038ce61d206ef7108e631fc43b369f4d99726e68b002d52f64607583b4ea15157767010bebc166a6ab45d0e7871671239c840f9acbf1159ab107b351e9be7b7e533d4ce61b6d795124e94a31f83be65b54dd1ab5caa5c1746dacdb1f0014f8a246d27c98635616d61a3a13614edd9d45b053d6ab48e5741b3695d7517f3b76c8d8b24d888af7e4488df163fae7e79da1d54badddddfdc0bfc37c7ee71b64447461a60c09a2880d1f5169714512b4a78a71ea9f13296d646ffa6e0d0042d15daf86a300ed7e0c23b9adfba1d69dacc3f065a635eb8986990a0d745e705dddc1681e7aeae52e328fe0c0b501fab089263b77e672ff1e00fa263310a106ddd8509193615c2944a7a6ad01b2662ca5d59ae7facffe60d05029e2e4b192187dc149ba2d1921cea16beecf5da631c80a44eb3b3acbf410c054ae8ad3000bbb8e982a6a8a74cd53565ffce41c12b722c2a59ba1800410a7f732aaad1ff2fde104930ac8dfefb6b523fad71be985b5fb7663d6e0aa2e35149689dec6e521d557e5ebc42e3dc099359550e396ce1401a80503d29144592368afc71e459228cd6af247ec5206b515031988876309eab54f668515cc55a923536c50d10cb9d0dec0620de012f1f67ebeba3c3e866f70c8ce985fd3fcd9dfdfa35b5a9aabaf0b743f9a00fca45f03ceaa0fc27eb03a94af9248dbc31a3c3899a02e0f166b8013611c27e9acfd433f0f2cbb0f8157b1cd508bcf39678f85962a6aabe3306d5d020c8a83f08ef25880f70d276bc0d9eade192a467c5b24ec9f4d6e6d7a4450287525e5d3325d91d287a26cc61825911837ef08576eae6aa45e439292f8eda05edff109342065d224c6921d59e10a0dcb8d04f27226f4b6890d76f0afaa8e42aafa34d3e24d9d9cd96924774fcb823bc6a534020fc31926d93d56d879a090926db12ceb90a0f080a99953f69b5964b903c554938c84cf386eca56614ac90b02e105901c3f4e140f99397b158ebcd58cb81dae2a978b961b285ff9d8555b6c12de7e6d5d108f3837e3bf5d30ebb727d9f0fd98cc8b760f2bc289d044b0635bd0f0cac740e3a6087938518ff4ed662f31a06a5b4c8f6f9b1c3073ef49d17e6fd0f1f84369af18718bd4d2dc591103edd29d4d26bb9572c26d75a0636e009cb70e0f62ecdfbf70132f4f394afb770062fefca1bcd5c6e550d442f921a203ae7fe94376e9d39b284a0cfaa3947def66d9450149a165dfe4ee81a7265b9daf10574666736ddb970eac41cbbea2624bb7644eb25c07216e61e29a9d9e0b7aa2009454afc6baf3b9f2750c26ccec720c6b9066622bc71ec73cd01621ee605daed1e30bde15038559ff12bc2a4e6db9996011060ba7b462a5322c75c3dd66c1d0fbd7fd5fbc73f029f690aa861e34e7d99d861ac0566b3bc9419d6009628a8be8ee7aedceb9e19baf5fa132d6066e420b5fd31b0b005ce62932c0d4df176f5a916a29b6c8a0a18824135d749f68f447f0fd49b1714f9bba9eb73892ae5c3e5c5d4f1d35693c678237f5b81a24c97632dff350cb9b072909c80264f7b64edd9aa689909f8f23919c5acef78903d934cda1a48bfa0009e8b3ee5ea47857153827b0f6558d602a1ae022b569d4148c72de7c8c18e61323503401917d3fed54e5a0e7d67afe9f40495eff30cdbe046c62d3dc30561a3976cbff21aaf3912fff64fe6230d2251ee1e1d3a52fb34e79ed33d412a8d49c9bd62721b5152472be7fb542b62db080c555fcf49d82549e5e19ee99d78eb1446cbf0d2c2621d59f31ba75178f458b30d918959ada712cf2823a5fcfdc1233b05e8b7fd1863c67a6844f81b54596904908b70f5c136797e75ca3f638837a6a59540c1aae7387e61ad1f6b398f6b6d94039833c2614279b60a172ca7dc4e917ab61c8ca254aac560ee675de9607ed61b9c3f2be1621b5d80edf3585c290833faa853d70aa5d57b8c9248df34a805888066fa61fbacec04650acad1fc3e396ca40c922da84a972decf12f81e6c1bc73d0f99e35322df2c0fd7d53e3a714aa4df70114b789edc0a452fd99445126fdbcaad2e6913aa8462e70c2a44967e15166722e813557ca26919202af056d30f716196897749c75549b89b56dbf20f942a6b0eb2399fcf109345bbaae8ddef35a2565bd204ca1e00a6f9e2eeacf5de314dedc26a213e385533325b961554a8be95821a3602875273f7d716c1b3a988b057d49c4fa46d1a60a949de2953ea30bd2e5015c497c80b0ad559304ce0b2d5b748e972e5d35fbe3f230b059563ff7be881b02d15db2ff4fe6f7371714f7fd8a2fa6d1ea6248dc9dde2f08a6e1159134db5199ec5928e953f0c988a61d5395eb2df46435d140cc6c6bf104f27180a681c4544e3dab1fa1d90a37213184c68adc97c49d27b51a1e5227e531dec6d4b784c0ef6aa36b4fedab752d8118923936c81c0c43d6aaaa5cc66f3ea1fd910d25b5e0c955c5306589792960bb8a77aea2178d9386861390b0f5438b36685e6455a09e38939dedb33d42b8ef6b4a2f7ad6ae338b465f7b1e4c258c86baf214fd6dc55ceb662fe951f11f4df62640a15d9780840cf035f48c50c2accf069f25c3307e8e2dc756cbd1318c7be854c267bb27d39b49deb25f6645741fd38ff82eb3d3ba2e3617df377d9783ec8b5db14f61595e3c7635472e3a7b3b5c976f99a06bf1fcf7549dbfc7e90bd7e64bcbdeb0ffd5a0e61b6b79c421176c0a8c9f780cf4daf7c10e6d4d2118f96fe7fed0229e5915a20104f7909671a2982627a5e8c6fa559ee3b0590ceff7b07ffe8382cf73a42777a89136089c5f135028a08e5b1ecd2f7928743199599880d59671b3e74e17440323cb0c8bf5f70141acaf11acbb24ad072fb3f8d5e6fd83795f1b80c2343bf46fff0da467e493e27dd21999003d6da05d83898df4338dc40e1af4df56615ab4d74ecda4ae09236486b33ee9e0321eba7de6e09f56e139e20a84cd249eef2a65aa38e8adf5d63b794daf25b2ccca1ec70617ffcf41ed18e038733d5b4ba5fb235e3d7d0442f99bab92a1ff4b506f9bd0be52110398712a6b3db31850bf92f8a8ec30b4ea24768b6412f26b64e642a0435c35a33fac969f35072b8fbff1524595ce1e01b49201b5229501610559133dbfea385765e8a4468599a4f1818215b56eedadbd437c8b05df2ae9de6cb08e42d99ce001474470a2714bb1497959ca0ec1e87b40e9201d7071c34ae18f4f9d5ae999369bcb9e254b6e5e23de03f4370bf71e0c0341b1695654a9ccacb5c2fe25784b3c0815b27ba8746c0d2285ae9ae8788b379d99d760d7d6ac51daf667f830f3f844a0f9a59aa566f1885517f85855681b50837214e2ab2284f3d31ad26d2e26b64e8dcfda537807bd5667c0ec6ce59b05e38c419634f143da2d6ce761d36e2fd91d12199d31df0f80481214594e57289b98a3db98f9cca77cdcd84f29d95f0681ec69ebc8f0b73b2fb1cc2b01660b68c2d6217b9145bde9af1d2316a368811b491298214b0afbdb35992e05d1020dbac7b22a5293ec86d5af3395c5e9a22be212f7326f768de09b588771f13917ccc9cd9fc772f43fcf5093e6025f3f72df38cbcb405ea6d67cbce21a6a015ddfaaa9db76b54e63f2ab59b8a5eb16992ae1057da9d4f06048767f354dbe7969a40af7a87a12cd74b5530733c20e3ea45aab8850bc403e68186f4f083781efd8512a0ff77d669f202b7514d1f4e60146c7a5eef13c567e9b4822472b17eea63d113c6eac7ccf1481ca2115ea9cfdc5c00e6af6d50691c3b8889f2ed4e0090a04bd705d768274614b047e1da9fe76742cdf4d849f9af101b0e953da6196eada5ca78c39b94f04574387a880cb8c84fcbf9e38e7147023bb5a05645a3d3446826149c0f852827b26c6f75e32324625cb71cf752813c4852c7c3fb73024f44a3027c144b6dc96890120f61bcace32c2407a9d960a0f822ea8a36e76bb703c422c0541699eeee2970aaeab58ae1f273fda7577988bea83953482bb2c2983bc80c4dd17899d98bcd56928cf915d5a30a5717836e2b90a3df3e78f2ccca04d750bed11935be44413ceea1adf80cae0eb6df85fd1421c2616581069c5adeff037ae51e9c6811e5227eb1ea3b55706b26aa9634ed8be04eba3ac74d99b370bdf4b371813ad92709d31f0b8bf0bfba1ad5dc5d669e031c55adefda68020389252746ad018c233ef3b2a099937542ff35c47c9c08606c72777d1641e895e11a9537d74c671e1cd7f4f9fe950a8ef07f029f836933ff4ff5a17b22465b9d38c54be46d53fe6330b6e30c01fd33ea941198c223f325c099e487129154e7ca9b786824844b30f02c0073f300057918a11238230854c43da586a5316e36c281d760090ce86c501533291b8c5505ba2dcc5c71061d339f7a31443b720e5948a469afd84d3acca47af71a0e459aad66b500e5fa2f892dffd52fbe0b0c5fedf4124a816a3deccaadc86a89bad225244680c4ff6bf085eda3f88b80cbf4de801886fd021fb110424c0db0b7b3a6b95f8d8e1193ccb2b784e2534faff1d7b2e2df3dc3bfa910e37d4401396de3754419cb8d3c273204fec9c9379d3665579b4966240b9d330849d5ab816dfdf0471d49e57dc1feadfcde28f06be4db7bdf9aef5af33a0df4e32f39b7d782317ee264183b23ffd6208d744f5f0f98346b3a996d32b53f0c3d262344ea29782c8800f4ee7ca5c1d7f3cc9d2a8e073d7946a4c2e9e4ada7eccba4fa28f6831f3aaa164f1f426f61fdf39ef3b9bd91a1a489ab5131946710b45e8c54cd1d10dfba778ead0977f365b205037b875f8ff2a7c8f6403ab6ee5827fc3e72c63792a213d4d5772fd987d802671f74583409c3be0b4ff7ec2e5fc13533bed41b4ab2a921f831d009fb879887213a32d0e68abf1ff474b927ce1baaa1f51a551276259b5938a74c0b94675e5ae7b6d648b4863b5a9daab165a9f3056dd375df1b923859b4badcb1ae5cf27ee6cc78d6c9c79532bcf7017e4fadcdc4d5d20168207fb3a061dfe9832084e5fadc6065749df487f9f0f41a49046a5a536cf1bde63e0f28559d7b63517415f1a9a68e5fa2777486e98b9adaff87f16608b657fed13b2d097fc86f2fb08da319cf2d2f5bbf123647459332d457de3c5bde758d7d7fd5e995ff14f782be17d8a532fc9090c21549ff7c2a640f24f105730874f2c8dfada72fafe960c10accfd4deab103935f14d937f746f785e4c128b374f31e9556c4c77355f2a45241fdf03905aa3053a66e50a7867701e3f566c69146790e869dce7fe714d7853cc029c449f8d35c9e347eb575ed6d7808ba99a9f989b5d10ee7ca16c4a6d4b99286aaf8276afd3ccbc991a6978c5a70c908533a57d92b60942b8ce642c4f5ad4475a1a4f76693649e413f46860816e2faaa70edded2efbade9685198a55817ef46b7eb11a37a9ccc39349fce5616b2806570d2a0544410f192a877e2a42adf2f8137f2b6ffe3659a65645b737eaa732c0939e263bf38e139efc4b79e11097e9059c855e6598f4376346476a8b03bfbbb2c597e3cf2f73d5da6487ae2298ef7bc78d50467742898b82a2980de982d85c0441bcd6187ffb335731c10fd0e4541f66d83d8d7be3559cf1fedbd2566a5156c1834211bfa9cfc8997eba7dcd41b7761e8d5fa0378b0dad4bfc332d14aed565f1ebbe34ebdc456745b5a9b6523b57e382221e7bce7efdb9ff4b6eab801bcdde9396a83ff58af9be3c78f035ba03dc225bcb85ba403e623ba1a19ea0943d188d36688949de484e4d7d73d3d10bc857b47ffedcc5b1fbd08114f637c181df109b5f5720ee34ff9bd6d56ac96c19cbe78237a0ce2b6b58597ce2c985d6af2a69475eccdc10a91a9cbb9cc5df11f7ec0383486e2844e8621d526cdfcb46b486584821ed556cc1c7b834593d5fc4682ab16049937eb83ff7ce6d8a71fae588f8cb82278c2195450b52a16fa45fa4fb54a22193bdf8b1e9159150617385eaccdcefbe09747abe6bd3e150e6cc390d8437701cd5c21ce66861608cca51f5e5e541e796396ba73280bf881ab210ecb7c82062390ddf94a4b802fea138508ed2e58a2ab15a9363a458751d7079cda40186fb9457580478eed08f5ed074b899d2ed4611d2aa255b7eb3155f29cae4de37d41353b9f1644d4d9e80ebbd3f80d589c2b8bbd1c8051faf8abe892235f68ed4887b9f3054b4314e36651ea25c45eac734f467f2684188662663fdb723fc26496d9c39aa773ef78321d162a443c62617f5d8038ac2e93b1d8ac84a5ab78ec1290c1c46a3fbcbc5b2abedda648b86a94ffa06d6b03154e30467d47735891223b927af93351f4572052e89e13aa90164b4f759b2da37aa415a782acc0a714754cd37efebbfaa389239c495f10dc02c3c1b0f5c697341b33125c6f1299b39948e9abd8059a03ba3d9e2c433dd9d1906a972af3311d0ec75073ea3996bab2054dc453e7452076eb9dc31ddb8ebc2bb6c9ffd4837732e4dc1cff425114d5e747637034d4918e6d705d2fef73d9072986590bb2b27356fa881dba1e57c02e0a92d53d4dc7762160e59974bf0ed11842410b55a95a4e0f37f84f35644a5c503c8714873037160713901a7ac2188b8abbf622b98e79f3586cb093fed54a0bc7c5a20af2510a5e7d373c172814943c4f7fb1efa0e18667a0bd616be0aec97df7327283627d8aa73d9b35b13033809b06eaad5c12ddbfc088819849348f58c191cb8edce853eec51e27d6a6030652141ae77b235b07c3ecb6458487275b15979f8cccc1471e832a7669c3a7e5b8d840407b9b9a93de17c052661dc4391252cacd5ed08a0e38054b7894c753842d90a0b53b721d4e44a47a710705e684543e726940a5b15e33457d3bcb73adda85fe536e1a0ad93132450014590b578da8e993598124842e43e1f41ac3c51ae799d1b79c8ed067ecd8c9f6bebc35168d2b21876392edb582bd61d91af31105cd207def217701305459e7cdffefe54858e77f57c86f8684e0ba7284251a5a97b5077632621cdf775827aeb8cd27fdf012cc39fa7f323b3079ae5c4a002ebfe8ddd89e1660e7cece6045338bc0a4f9d3626adc15d93b7c7ef3efbf5c9bfc98f92b074b41f3632dbf56e9bb5eb69a92eb61bcd2b44ca5924f362486937e8b8a51a4c5b7af7d5c8928f3beb8fa0aeebe39b80e83b4c1996215cdbcc4344c688d622a8defd9835e896759615dc5ddcf42426d33f67a6a29d183a5399cb5120114fea0d5c62ac9b8fe79947ac20a6fa493eb620b0a87b50eaffe206442e6f5feeeecf1a057d2a821505df7c333974e40d00ab1d41bde3cfe744cc2b6da31a3b52e42fcd8ed60c4944e8ec8162a6df872952523285c3b162578ecccabff457d3c970b0cec5a801fbf1d611f953c2ea35ca9e3e9df058dabb35e294d1452caed045c53195fff89a086c8982ce656efae2b19d06d10eb5e3b32e71b05867f01c49eef64fb0742cf8da5a44b8b0f11101358d790708c50508bee9df3c30f39adb8ec2252a2ea436f2918e96acc4a41c9e0e8c2e97cfc5116855512d8aa1f30d4cd1efa04e7152674f13ad782a8c0264bf1a8b7b947f9d5ba562980bcb2fb3cd892e37a5ff5e69cb3f7bf42aef28f2be41fe076ccf2ca0a7f94553754d1a3f59c6def6b0f4b89c77eebc2214513b67c3db7998cffac313ca3d2f18f6922174cc9d1d7f4e2bb59e1e216a66814d2b02c3338e10ccab73116b77fcdeb85760f736b99cab6a0eab8974944fdd22c20edf9fa9b020f43d8826852e43db225b6cfd4acda5b65219ddc6045c1d9e4ce34cb6bc9ad73be24cf5a0dfbbcb10bc785abe5865ea4ad0934bf236fe45a0c58e930c096bd3b19c34b62f7dcbe538e4051bba7133c984ad957bef68e754a911d9372784e8c4757616a4af543011461a998ad8158f46ab7ac1e19401a9d8e20da95df35904b9660fe4fbbcb54d9284271bc0bfb6fb6a93840f3c47217c5aac2f4acbd13dd5c2cd5a94bc6cc1e32b374f18441996ca5e111d9516bb4c9005dee2c7ea62ece41ad275e361837ea05ea34106eb86a0d7698a5bd5ace891081116f66e6c932e604ac189ade044816853141c73081cc6af04a80842c329f16f9249a0e8f66f48df321bcb870ea35700e019422bfad9d41fa9a6a56138787ace524c7d93e5472201518aa5fb6fdd0baea5edeefa32e315bbda7c92901e9109f15dfa2141a9fa5b3aa6ed382f57cb9bfa6db6ac60a06846366945a51c8c638f147e2e42158f4a7de62187a02c127e7f9934ede6dc23443887d9c8e830c25f92a8301d0b401ae69e07e45589f0a9a2f9bc84096d4074cd66de68a02b8bda3e28749ed2a364fa0d4c52542a8ab6365baf793a68ac14215f822867bc0682ba13b27df52a0043207fcab45641b545ed69a2c9b9851fbd0b403552b50f84cdce562b952b9f7d3a6ca5f76020b4c68e2460ee79b40aba93dcbda65be60cb270f5e5dd7f1b18af86da756542d84d62627eaf1584af48378b37cd3d78f295e0a1bc744711f77e48374d818856b891712948e8a517ba2366e7f97783972b4aac1a2cb6ebd842375a7b6ac90be53d0b7d710c0d4a946e51ed6acd07690bf61a35d402d5ec3aea175fac991a179d5d99551fb26565a8d3c79cb8ed94bc33751563d18ffcb7e5d439bb05c7be1f218a59f02e10f8a2bf73a48c1c515e221de2d3a98fdf07bf0de3929baba3257ab15000769d408ace1f0724e41f3007a56415f94a597dc3fde7cfc94d16ad3e637a83759ecb69c6647620d8858e78624daff545ca57e676691071494c4ff98de01354bda68c727718013c0b03b78c1bcca124bd81bc49028327b0d94e3d7a407c234b07eb7a2fe50b0273ce930943494b6a61cab5133c352e7112848cf216105fc2ce0c7a7efd217c1a80f0c48c622a7acd707533f5c4849dcf337891fe35e4155ed76dcaeefac2b0c4ed850ef1882692583a0a6c10f128fed394218c8fbb74be8ee796a35dbdfedfbe848c49da700bbde8b10db02fdced40621eb9037cb51bbabf29843aa173eee9ee424de952430482e6d0a6a8f042037d6478e59666bbea74b26aeed61766ec23ba69c921c2cced8e705233954f8611f3df842aaf3a307361344c0db07d2dcf185b49f7ff099b7932614042ea1cbed1f64a673737c1cf86d7f3368ec6ea01a652c7718eba0e3afc7d3ea99b4db47b992306519b0ef3fe2ede60548df627df498e046b4171a64baaa08db68be10e0aa6d309b7abfee15ce4f0d82ddb031213d4b3e1f22966cd62158baca41337e849502c84cddfa37d68f0237d7d283cf3cc94c5d0ecff856946cda270d317f6ef089391e09ae3538840d9bebc4e2ee0fe88dd23a5ad52bea9b29314fe69df3f1c285759651f48be2330af13bff88b52168772860e938fca1934a41ae16809d4a13db465dda376a615e298b784291326e1ea221098e3f5f0f039d357cfcb7d194bbfe150f59c185d74db9843d25bc481911d0443b5196ba707c2dd2d3e5ed0aaf3b84a0ecc46ea83437fe5d9ca12529d9d4c0945a525b6f689b63ec743b3f0d72155c03d0afe6a423491fba224bdfc6b01b31366afd10b7539cc7b6d579ba7095ee3098669d8ad7c3ae67b4deb793aa07cbaeae257a28b577cd03a5ea2b4e518fbec7e733cdfadb39c3d77ffe4311cd946399013cc9bb4b084459beda3e32bb6928d2c15066776b20483c6ba1239db168f459398b5f3654f140334421abe1fd5af706af7ea2c498689cf647248aaf12c1e8c56f486a0062833d4fc355835e760ceebfdb4c906070708ff53d8d98d1171f5f2220e45a3579e8f642f476923fa9e7fe18e6e453e7294a264643e00a8d65a4004d0e620388a63f2c35b869d597ba700e405c59fd297a32d008b8c0dcebdb68ff586a24798a51375c65340c4eabbc13122f0fd7cccf700a967c0a10244fc32336a3446266cbbc6e40fc8e2df3ad1bb0e12b8ea22cdf3ee5b573cc375528fbb4063ba7d922b7339596b0d02c888a95f9f46bce5ceed441e617b6b6b2f75b712307f257afe31ff2bd2170158ef0e430ad4c974ff7e659ee063bd4a12e8037f37d867e49864a163571489810155788a7626650cfd238b9f915fd943074cbc3c2708b930bbc4988b3700f2b29fb010f19e3048831ada195a354b660c4865be5b68a163704f1594301a73f533939a1f6e50d8987004090eb75a1888562d10ce1ab7bb0d9917b4cedb44742dfdd1e66b08647dd4afc0d8f714c8364c61a29088bcdadae8cd6c67a2dc34f63e10f06ff32b4da91c092105a3857acd132c8998fbad603ec57fb3b12c377f817857e95b0628b60761a32e8cdd8ed9d1ccae0aa5380c278ddf0f98c25993305ff7451d0c897e4a701487b06b1ddadfa8cd1376870b766df718ed010340db093a9951d8a74ad31f0388c805af3e8859e94fe1e862074ffdbb3df8749c7541f9378b0759fdb80dc3dd9339b4f527eb0ec1d38259e4f3a0b17ec8f5d16e12bbfca4a190c4ae463e13f92dfd351acc56b5021fd9b4c56d646a4ce107be4027d2117958be6e323b8c76f1dc58c95dbcf387a1e7c5382d91d7650111e54ca32a09f74e6fff35003ded4826b48f9db6ae1906b89d687891992842947ddf32730b8834929a69118369a717c0dcd2fd6be66002651446677ea4e66a04822636551cf580dacd9bdd5453db75a203c0a2a37bc2fdaa541fb5834285843ac826def5c5b7447e3180ad7dcbe0228a4a82cad2b08271db18e80c7f9baee09a4972937bd2bb62d65f56fc4259d4165b5f5649a7eb0ccdf11b402b961a7363fc8c8d5b006fb673cc09386337335451df56ea4990cc10510e19d9138e6df75f3b3195dfc19d08556a87b423f33fc66a592450f1198f243a2d26f6901692438e4b8ac7c3697ffed4d09b91702b88608cd9081d9059b6867e560ece4f4259425ed6ed06b45e969f6b47df54fd4afda216b337a395c3331b90e69735259863f4a4ac53a103f87fb7211b8d7934e871d376c38dac5e7f7ef9c3b6f89a86b52b102f277c03fb71838c906db1dd882d1439a668caba5f14807365090e1651d21ad157f9977ef937ba3354a023959671f74f747b5edd6cc6b4cdfadf2dd46e5e4ec48f2e0f3ff7bc8b0955f04f8c498fd37d4a47e8cd305ea854630667fbcb1477a11b96c6801b3bd160c587623fdd5e83d2848ec6d1b4c650efe0b92a7d0bc57bccab7b77debc2da470805b4e7754620de5b2e570258fa8fb7ad3cab30f12c060f536e4cae99cfb8ab8a262cb4f07ae6a1ba24bfdbc3346062f865ef52c5c22d7f1c76ad16c12cb0454b7dc28334e9654358f66ae9243cf8931f5d2742e57c58a1a278b01571728acfff3772cbc3706be02d4ee42304285768a1b69dab7509d66536dd20ab287a18ff95024bc038121fbe8a97d67587180e5bf004f4e8061efc49fcb09a5e2fb149e815a20b005872ebdd769c0fd1e224be486cb776e7a232246b477db8eb033df6b6f27f9e5de4f46b4aacf24a7f38da2e08cb7d96995ca4f2b3a3422f4b16aaae71f52e711893d3551c364a4d0d67347a76ce5237a65d367f40e32c54e7eaf4749ff6cd895a3c471cb169511f8551991c8116e5d59cb812db386b74a86a94ee5908013c81e14e358ec3720b24499c27c95dae3492440823117b1e7f3ffe861c463687f3f1cc8942439e68ae3d28f5d1fd1e32a02030be523c3fdc41951756bf1c477c1d13ea97c79da544a17e376eae669ebabe8f0e27e7878aed278ecbae34c04c8f5e85ba5f42626000d70c547d758e81be2b57c02151c92471b9a50b18e75fdb76b3b66381d5214577f7189046f90dc1bc63eac2eaf4669b749a17c22da1fd1ec7ad69a4333826c03b1bb98b5464fc46084d3e4d562f8b518a83e3efaa58ef3caa163b27f613ffa7dd2bb2aeed191964dcdcc7abc61d425c885fc18ac05991bb457bfbf92159d9fd122fd0cf42513c4ad416b60a360c866343f43b077003e872a4eff3a593bef317ac3a4fe18bd764fe5de15bcb0a1a569776dfff87e9b33e99a9a508536941d9ecca4e2efc0ec6e4e6d6dc05968a3c1bdd35dd9192249e0e0bad7b9f7656877f1ca4f28ef7479578dec9457d361abe6cd4a36d38d6fd7e092feec293a93af7d24fabcc778429a760c1fcfb5ce97b534f645e9cae6cd1d55c7a6870023d824e2963a4372422ef0eb5df2d638a412915f242cc2557b041b84e90122e2bed73a77f994c131daa91f7cc68e695d0d84a99bf9fc11892ea980b436fc8e83615007fe91e05d96c8645d4c0d18e7520afbb643f43c5d8c34f77aa10e6f24e9a8e73e6c7f31a60dafe848f314af987573a79269082b14119edb9e0fd5772791b08f49af4e5edc735de884605ec85c566664ba89b503bc7921751295593f760137c313018547d69db296171de98669519b8fc36cebc656ace0db7534bbdeccb9214831a2dae7268b9f968173b74656fafc1139747faee321c911352ebd2c60ff8acdea3241109bbba10a40ffdee4f64d1ddf787cf625ede971b299a58953846acfb73a3d9099c80aafe116cb3aaca534a32260e8cb7d312c4a75ca0732ec8cee63e6f0ffe03cc63edf5681c6fb852f8dfc958b7b894685714df39249202eea29e0445b3f72af33e9633f4c5723adb3f37ba2a154907ecd6f8ba9d986814c6128e77c1b1a2a5eab94f4d5db743aaae540a984cb24235c8e636987d12c385c3f3f460c416afbe752024213968abb26ddb5259ae8a5811685026a26ed12031e39864a0d4b9c010465bc487759cb4b3fc035ca54456602e98d86a3f609c7b22cdb8b1b78370a7955b057fb95e67df8a67cbe8c66332238af33c5b025c5c92ec6dc4b92f3fcd9b66daf488519cc5732a42a6d59426db623a4fd61d1d2e519e618c29b453ccce1c0fafcfe2e924531ed6deae18357f77ed4711ea40c95e69ae14c7c7a109140515b45a41e8e53813684b66ccb7295a31accafb464f63cdcba8dfc2e8d8865516abd6018b76817d9dc17bed7659a2770b86e0cff7ed6b860afba392955272e1f8b0c680e086f7d32342a388d329c1f17e78dcda3564a943a1169d703147af514576805f6ea196cb136a5bc784159e0a3b4be80161a043d52f7d1e60f964bce69ab48203336a69c6dc6f7421e4535d26fb3428edaad734dd52a1d2aa13c93d598826e0cebfc2290e8cb867d07eadc60915976f7a67b4911edeb4006c6d5090c5cc931cf2ede41e12ecbe8a94bc6de895d30b20b7cd5d1e757a8ff04dc6df63a6e0418a58b129d8714b7e9d31fa0433bae44f114c3599bd3351142b2328c423389fad9271dbb16451b494e511b49c6279d5107ae558bdd372b9ce05bc951c6d8742ff0f946e5715638b095cec5cddc64ca6ef1f30bce6c7c3c12733da1ab5d3756fbfe799eb1f56d8f184a3d1503ba0a7e6133f27acc26f9946b91d088b13488716cdbe690e45476ba86fcfce6e32fed6fc7ebb145ba7a1ddc8c6ec24fe639dc959de06f21ff78dda2fe3927a9911ce8f927edc11efd889f8099fd809f52ca671e302690923b7677b4facc70c33049428b790c7a34aa338a364a5d6aae15dc1b5e263f7561d6b1c4c4acfc917724d0fe896a2bd7d5cb2222808b907780cad8496478fb543a2c3411b8224c1f292b1d08e4c1492bd0314453cc73db8aee8d678d9c6dd099b245ced2b55c862fcd4b7ebbddbb54345ad353d9f39aa1ef4e484fc2fee26ec5afd4424ac4d7bb5eb6808502b5e7afbea7fd5ceb050ad474d5064698644a9f20cc84996f3d5817dba1a6c9368d52b774474ab2da909fa58b7585b78228e633620bde35b55506f5714e4ddb257265ca4e9395b173e72085e743762d275621f7b604b8be2afb959a9e7f647c0092d3c1b759b7265eabb176ef34ca3acb68737054a4883eb2f57685007fde03ced82920e0ca72e72643a6558c8abc88776905377d62f51adefd0e86839805b8e20b52b6bc479732bb5861830de59538325e636ec926b2f1d61109f803cea261e48161d2b6730e1ce4719ecbe6918b7804d273268920e11fdd8d0d81c1cf70ae98f7f375862c20aa10072aa77c076d315b93b2c71e7225cd5fdc26744ba5ccd7ed0f13e25e058bfed3b27b453549e5b63b9163fc47999a552ea238887d4f494f63ce51da7f13c630d879481d0001317a0a298af3ff4c4c0806be84e97e915fda14775bd857671094fe3b2882ceea3e4de9e3349c6021a5b25abdc52ffbd727c7a5fb7de1db7efe9a2e42fc292e92b489a14d487519466f1ab051cb4f40a19d7bd5952f91635a8035e64acca6161fb83ce7f9f33d514201b34328c57bf61cd56e47ecaeda8a20526eb24b8ff58c78277163bda9463673f723044d9f74bc028f81538c01f92e7014f87a9fa7a0062e9f4e5d2f62a62e31baad30d0a8926da595f460a14bf3ac4e6f3c8a81c65e533c4683cd21528715eb616f07daa9f29b7c2963defc0b617188b1eddc285ab47d6b209833ba0a4d52f49111cad7cd66cce4033b2c9739afb2dba3ab7b993d6c24788b9115e55d76d715e7f625e1d3ee4a0573ccbd1d7e79fce6ffdcd31a4b43ea0502576e8d403dc31c6ce4eb5e28232353c4a0d7d0dc301c9856cfe452bcb2a6f594455c2be72a210275eb96d42aeb703faf8e1f21d03f59df2720613cae9eb48e7eedb8b344d250962df4e90023fafe48660e3c502bda81aee3e8831db800479c3ed6b6218367bcf3d15c57c996bee29e143a22e0fddb2553394a5795f16fe89f6f082729c64d8aebe493aa449e7affc83e33cca008fc8103401cff35d65b4465036233bd9d6736b8f62518f7d7d54d98e560dd43460384a100a1085003904b8ec8f3da89fa6e3c493ab95197858ceb24f25784fb2dea79784492c645111610f9d0b17df7f5ca33b3a65f12aca04458746b9a8009d123277b2184352fee4bd5b238ca95530735953c0d87342debd85d9f21e8517b5b71ad95139f68bb3b104109e08bff120c63cd24f8f4e5873d04f3223f81157e92fa545a20e30b605329e2d7bf17600d55f99cd79e419d0f4f74b64c40aa762fd079d0de8e1aa8b9707c7ff5d78d61624c8b864d45c82861acae78521f423caf7b12ea4379f5dd5dea67d415d073847f765dd05b0d013c371743bf0d0bfe8ffb57fe5b3062710adcccac0ac037dda39ccc396625d646b43f7505662574668e669f0b000cbd295ac9670ea5be90524f310ec998e42cdc30ca0a7724f454738f811550f85f8b8d5bf1eed9f36a0ee93bfb99fec9434e62d05c75dc326f70f1bf796aeb6a1d94f21357a7afa862e87c8829f543581136547238aeedd20082b05f76a6ab52e2823a9b7de7bda47f5ac1db20900e49f1fc7260fd1adedec8c3a925c84b8b72e49caa3972d98d5d76547bbdd54985a81b7c75e3c6319a836415d010e45d193d776aa63b3f9ceb4ffb8b6f4e19c9aaa24d57caaad1db9770465c8d2a0f04c44a34e4b96d80318124e23b039763bebc1cf39342de31c030a8b46a7cf2e11421bc40e9c27b371e0e9e1ba6a89b86acf39c924101838ede05324ae6619e10794c53268681dee2e12b141e200649f574786ba7588d7c070e9c86041c864b194a941abc694e220800fd1f91c38b930c1651677ff34675709789b5148f07b1c47105e8c523510457776e2bb7da95b6014a2b74cffbe42ca727a5a1d34630e74924031648e83e69a3e8a5f3708bc7cc546e49e608a3b7d46213d3f28fa7d9750815c1aed67e2cc69388559c8e1e4f3aefa2de76f9a7f543c368836339706cbdda4853dbd5503ad0dcae1485583c333ee5227a8a0375d0cadcc69f056ff6006e54516d19578e7e27e06089ea6eddb8ff77e69433e330ed2c2185c8406472ed540111225c0e8afa6761f6866174822afc375843c687adea8427c5521ea27dd6706fb4954e7bb7e68bcc4dc04c36e61bd020d99f4eb067283e93ecfb1ab62784a6503c1c588a4eaa293a7d1bb74cb881e4d2c10d6c79f9e5ff98eed8717bea19e58682312ec2a8c1e58a517e6172b1fe92fa72ddff09c43cc6cffa8de002518a00b960dcbe553c5d3b96fbe8f0862bf7f8607f790e1e5d9735138fb867f06b554e165162c818cb4e13afed44b7d5648fc9cdddfa30a77662957a056a80c9992367dbf97cde8c59ac41936576c230f7ddea69c8ba82e1f9ede45fc2e6ce750e46390fc3082b09cd884ac8560aea4b3f3aa7c724d7bb4d95748711b44302c1342be8fba480ffab961d2b191612ab6b3aa69a4b8989eeca7c1ac1ff0cfd13b78f2663f57e65ef161aa95a0f8b57cd0f0e820e7dd4956f2240e6179b820e0e2bf94f97c58c77677eca9157633aa6b13cdae7604e89d77be1628cd164d001463735bde8a8a91b32f417a30272ff9a9ad230a7d8f0f20707ba10eb585f2f1aa367c07d9415b9573b4d26e268d449109481f92b6b31176a719cdda45425bc862afaec082ae0a3643eda4cc92f62f9d4e372f37639fc0511773403369b2b0d2d1144213950239865f102451b96f6dd83703ddf91e0a8db3c07bc62cb8ce9e5f6cf4c793c173a60ae052484a4929f048fe1a4a0bbf9a05ccad111fb2d581ddd1a9368e90784c1db1ab8eb2e41de628c6c56fe1bb8b5815cbf6a2fdd2f3fc3a16173670b437440b5a1546bcfd58ddd6b4e1a19f8095ba4029e5c318e0a911909b5ee2bfb4d71b7c75bb82b787674ec4cd1c219ae47e86b5d9da5ca188ae5623f3aa60600f2a18fe0a34b24c13bbd985d308c8d1444198012976a00e3260fb870a543e9828a6959ddc7dec91db4a7a055f4da8235c671f7601f88cd8278143df9024eb6d7c45f3feef4be5a55e04bc36b6419c5e539a9121cb5b254d3101ab5691a02d6f18f19c9621ac7f0abfcfac2defd25580a956cd86f985d4289e609292a9107ef45cb3b90f9465853cdeb1e2a81f2a91aec89277ef1d3c0df822d9aa0b686131179ae06506dae7c616d1fb42812b641ab9cea7e30a54ff80c7a0270e5e497457f63c1ede9fe6a82770dc3046460991b7eac106148c9bd3aeab1c21dfb8545f9ad5d5b555f93cf5395f9ac27045d21a23781a64e052f7098c4a56d4c29924c6fe0a598227e4d98c0e0a4862e8a1241e9da5dfe5e6ec3bb3f87614b6904fb0c901c371486356a2347ac9090386cf137c5579c0106dd1d4d30b907442613f937d0470810639c3cba3fb5813f687bec06a7d5981eacacb89ce5289de13cf043117fd62af2904753e24071783d9c1a92f5e26d5ead18258b03d15eac6ba971e3d87d2092d8d92bfa3ec68c898ed72ae83a5cc62442aa537b0600b6879f70c9d94dea8c59a031464022cc7ac39ce9137d0b19c638477172f8ea9204214778ab6f99ddff99c06692c223d08df582baa4d28846b0a1247ab2e09f3ba563fb23ab4e3a3fb4b8728e1ee8fea59b835f101f4ac5f216a4b0e3c241051ca4897a1015325d0b22a8b82c8ab32d4f55a0fc3ad58a06eef541fac5cdb1d4c1524a913c105c3d343f0998f992be751c94191143836680f2ce4311eb6d5a12b3ada4b8e498091e5759cb31d04ca96fdf03024be4096f000e94962f26cba57e267a312feb51dfe9bcc2f7bb972a843c6493b733cb4be8d60ae351eaaaaca79801cf1828d9180bb717870a73ee9635d44a2998630c025681e965bd94b7cde2297ba0ac55f49996fbc322fcacd2ad6b3eb8ccbda0f388366c33e9e29d5700e3a0f0f3524c3da861808ec79bbc1df3f8537289378930aa1e1900d95746c54ce114b86da619300e3bb35825d7bc5b2c89f959c8d23e0115255ef891200da913986869f281cbc444dbea082bc4a0c44ce649155d215410e57b2c9b0db2962663d290ebca7ffd1b796d4097281b4bfb1c7efb261a471f7e18c383f1ebf16c4aeec039e815ba6e707c595bf901ea1d5629d6e0a8637709f1e166333a15e3dadbf77bc1c7860257732e57c3a8b8c84b5fa3ee6a57e7c9a67c1d08a11cd8be8ac9a2695f962bfcb8ec263c8b1366f30d4f1fcc0016bebd3e4b694b96d9fa4bcf92a9e87ab53b76a078900de6d8a5762bc1187479f49e3a521f287e8074f8e9fb5e741f8f10c63d997b4c4c52f24f043c174afac64160ee1272a29a09cecdc0b71194e6bab71dbc8e60b352e1d7817dd20ce91cafa73bff7b0e95c9a5cb037a099b8f7da63d9867d32ca26dae5e1f6ace4fa58a399e0060fc373f689eb2fa980b759837a8f2ab877dbc3ce1bd9bbb7161a206c988e4ba6e970ee6eda114319ec24b43ad2edbe8cc0e82f88a4b0e7ffd3738e2d391211c3dc1ecc48fc35678e156daff109d228035027cfe99ce4245e7031e7db025268e18fc0e05e1cf41f9aed8cdad38a6c79731da4ee7ca15d96562e5d22957e2922d5da0346b2d8f01f94bf7022d6b815d44bf6d8ce7a2e72e93ab632f84498480a4c7d3bd1344552a1a6925ff0a2232cc95911ddee7f5c97876c5f3f79b1add1edba528d93700acbfb2dc5197d206b44c78f52d84a3a274c05751a7f2d8e568b606bba2a51f90baeee2b5d631184efc4b96601ea37792299ddd489eccd4cf1919cf006961dd8adf9406880d4beb163f0945777c29157a9c8b902b800c066ee36d46cf3b3c4e27083fe9e2dfc825ca925df34a6205e5aaffe22a592409b75ecf293fe175673b6e6cde652b885a35cbd8fe7f2d45ab88f4c08618446828191ee89dff6c1c098d8a8739c52aaaee4535684c27aecce90be8ae8b033fbe09a17b3285fa36efc79ee6175b4f7fffdb2dd97152ebe56fdd6e2b3deef147972842a58f1ccf458d303388617875ed4e10360d809f02ceb1a8f6781f441440c690051c39ef3e91fe9c9980505010609031b4e32e6b08bb8b3ffc46f3202015c9ec3f8cf158c205696e4d04d58ba7df5495edd43d282b2ef96a3a197b1327285fb769e2ce9c114023b9770cd18c90c3a67edb4399e87f31e10071bea05550dd786c957a82f1d6ba4ff5d7ba3edf3a99dfb7ac83ebfa2f627ce2c94396232473ec1b03ba42577854e155ef22821cacc5866dcdad22544a1c871d87a2ed7f3dd968c2bb9e1b368b6865bde1b88c0c75a30d6d25a98e7e26a99e884f597672383f9287caeb107e8797e716a417922284a8e2a13f9e4be81153663c8cda75ad674eff8a104161887fb17204183fc4756d344644d5b2e69e951b3b801bc75a708c8a8bf5dd0677408c4b533113db4c809786561920256d700ff95495bf079b9477e61dca7b1f6bd8d3e35ad0978ecd74668785a6703a3451612217964b618ca8a94865ecc01b6d4b267e2e8010e7a360b2a74f485751c69a26534127fad83ed1985d2ae7e01dc41fb02de8efc18239e45e8c6a384c656e83d18d5c2e5957f911ef027b4a9c247b264c5981de39fce6a24d5aff22557f707e95d6914118a117c3fe34c1b43a5dfe1f868a34ad189b013c3ee6a3afc8e039ea0d45b443e30240e4cc20dd6d0e584e83b7b35768b840aae32d89b7075f50db99b5151c6bce6b58bf14411da9b58fb740a527c6949ccd3303ff5cb2ae51ecaf189d8958482e061af77d3770b856229cd5281a1a9a2b05183111e726c31ac068b2f57db013b0feaa46745653cf9e65701b4e9ebbb8761395d423aaf16cc8cf36df94b2c1d2a5f356e0f7dda85688844b48cfd371aae104784dd0a49c55fce4bee48bf42ff28c694db71329b504118a852ba61ceea2f27f34610c6ef9dc415f6de0cf998badc7c22d27a0c4db5020e9fc71b86bb23aa72b7ef1b94ddce87e5ff2c736514f531d7425f64b0379c306448e674f66a25928b6917fc94e33ce993bcffb897eeb57ae21843825da3a058599ae9b7d987e4a59ee8c507019188224d3ac19d3f592dc30a26c8c66f096fbffe62561aae78ce4771f7df195370248b0402620edd6001297b0998f2e921e187c27ce39ffa28155abcaebb8fddd7df7c109e2a334cfae3c63e13005b5bce482906b070e15062a929dc9dfe543fabd73c6a365d583d65c7a2f114ed8e3d8d1748d13ffb4e0a2c3879d015c99d3b7ecc8deaa7d2f7d022f11238f00cbc793d9c5ce6d6d3b2a4f425e0be650c7fd4c9f933cdc77b7a6b29427e180c5f61102a5f80e6f67c7dfe003877aa729fbe7b57f02efa1bad6198cf0188b6f1ba449102df5b589a7f5601ea12a1652fb2edcae6db9bd688ccbe412a271d4135f040ffd613abc84936335a07b3d97b841a3d0675384dd17da5010495daa6cedf689f1adffce5b3d9b72a792d05fb2d639059681bc83db8fb2beec4312c440dbc80150bbca1dff64c325d0f12e78b1ca92cad172c36bb49c1c75f4ce47d23eff5fa1113f33b7a423cd82b4cac71cec4515bd8c524b39e646b880d39a9f9dde2f0652f657f04995985a449b267f0cc73f8240227b3e20fb18dbbfb475700f301a13fbd1d9cd85fb3d1a83796727e4df3a27606681ffb71dc6eb95ab6986bd0b500b6cb6543d4560312d273a9a723f6ac869f343ca7bf1db23371dadb2d162d9cde4d12299d5e771ca86d881b21c6cfd4028b8ab29ff55acd62eb9bae58905e1fc843737bc3f147a042ce737bb1ba6088f8b1c023f2768572df4781b3401d5cc719e2dd1714110dcb01c67b5da8f4165061b6bddf4090d6ab27bdf315a6d8205903eb86f5dc4ce5a5feb07b34aebdf06dae8ffbf66a4c7aa28952e4bc5d9c08a09cdfda1f5df6816eb1c0ec09fa19c538b285e81059cb872798426ec8880d6fb37f6214c62005d134077e2c6f01bd74e1123a2875d703d3ed23cca0f2aba487039d63c8559ef8674f7cdfb24e4237e46f518899dfb357cec5afd624c1f414b2132644c461a8e15ffdff723fd70cd03933fb2fd41d36a3aef54e1d89533e145c813c00d60230d0113ea7d6ee157be65efae9fe93b6a439640b28cea0d28b8c8f25516ecfb5673c5c4e42a6d88fa451f9457303f5eecae4e14236bf1ed2bcf3a5cdb36a48f300f44183555b69dc99365f220b9dc5101a90a24648a732b50d64d8e3abf25ef1b1de8387cfe253e6c529fea0d4e6d88cb3bfd4bbe1b3f93655c29bc7f1038749117e2eef8e46ecea7e30e16927e856146b574dadbfb986e65d460792fb7a005d1c93f062e4acac38a84fd8403a489db42958707c6f19aaa701e501773f81a970732171032f5abe4cfba32726344f292d80ea1f0efa1f09746ec7dc8f8cce00b9ecb962452a76d96c2afad9e8c3d403bcbad598ca317c35996e801e64e18536bb475248f3b9f3e3bd22f0c57b40cb55e55fd2dd9d3f3ccb69521e3043fb14a96671813922d5f14d2c4999e0473e21dca3677875873f1104804f92e10a1c102192bba37438409916eff1bca9b780560cf6c353fdcf5187867aabc82da18a0da313a60b25fbc22c4aed70e4728e1ca9568c08a4453fd7682d4a94660716c5c8a37925654b396cdce1b93b2ed64b8d20f09567b5bcf69e733a198a606f3ada51019fc92929581206191fe706d16c24713b7b3c33caf68ce851f5ee897d31379fef29226010e57dc37ef2d5c745883ad510d34b69b20009ecb4e85d32216e5612dde8f8fd6c7c633f4a19c47bfb2952d0c3dd71186a63b8dd2f912a9ef3828a50800e49fe06f672a334399a1a99ccdd22b1cb664afc1bd00e3f76c22b7180b97fb22d2f27cd69ee4c10d73e9bb2e3bbd627163ef283342eced0552a6669f460d742ff707ffbf2b8623ebeea272f410aace2bcc097af7f11757de8b01c5ac725e04c7c7cef82642a77242647d1266ee9bdc4b2e2486afef03dc3010a29a636f41800a99d128f51b9f7fc0dc92688bac5146b03b608747d44099923be15af3c1dc8e0daab7325f65abe967b64fef13089b0f508f3b4ef72b861aa4679beae5cadd029eadddd9799b696778a4bb85bea1a0e4421c830996a15e7afab819356be460996a2a2c00844fbad0cc47144aeaf9273a1e1ec0583f65bafd77ed670ec479e988878ec8d7f0fbae4cf19c2ebb1122fac844383368213aff7cffc9d6a1b42441fcde570bfb83e64b639ee9b2ed4a28fdb5fac93658d704bea16d9c8cd74bf06dcc678cebafe87109d8e28726214737a22e514eba5edb8f82f38a549ccab88fa93f4a638dd8038f224e296e9bb863d09506f9913f5806cda2f2309e08ed72d857741c26defe19e7c40d29bd54a728b7f547e84554805b320f31f4c9dda368793c3017bd34ff889d5640a4a11ced17964708404e0c059f4b5573ceea95997f04443f00a9c76fa60f00d221e4f2df06ea65af48e8a30b7f8566cb796b0ec8ecd4b45486776513c218dae6f977f7a2233f71444ac4546cb82ce9023acc9cbbdbd0dfb3dbc389d266ecbb1d67c6d1fb89256909a9769eee551da467c72cc3811ecd72f003438aeb8d135a166bdca3bec981ecadf0db8551c7fc1d5dfcc216bba4f947c0945f956c901acb2a868d9ff68bb3d4cacd71d0afbe84caff917433f948cfe6c853636316231902c376e959c5d1d3076e5dc090f892263e614f6bd8d1e5235f762f2f6a3317234c1e1362c9ca9aaaf9c0b5b9936b9ed8c5a5fbc529d209d281f65cfc1777fa99cb35307ebae9130f858e7629bed3da42dfdade9f059dd81a0ea996f5a562fb888b2cc66c641e79bc6db41ecd9d23a295cfaee9676740f90e9719ed50a4687bdd7a56c7f265d67be3f9c256a307f9ab8093c0b06e094126b51e191d7487e72f31a2dc38bb761a53a041d6f0bb7e80d285be26f99671bf92e5c8a5478b5380248121b3bd321bd1ea2f91e87a5247da209e733992deeb09112ec4b9add719a82651f05e658f7df1f166926b6b0d05e54a79fd26d3ca6497c8a963f347bca4c1156e892bb277968773baa35877845f97f65ea6af4f5690375de3729745d9bab4f70bd49b0795c83311dbd02c78403356f33b417f80b424a584154ed31206a440a9e49482ac3ce0c9e17f117d6e79eded7f67585349fcd19800066d519b30906342d1da0c72bfad89f999371cb9e757e56b637c435ebb7986eeb040da462d4d6319a48661f16746d7b17c43b1d40902a498a30e0f6807baa4b2969ae7eab5447f121ecbccba1cb63fe009e33545eddf074cef28623641204178bee898e12a33b0831b19134537dff6c14465dd5b8f0516824f9230fbbcef1f9a7cf7c5d9e978d27804908aba08dd998482df9eaef372ede59456effe80016511cfc83524114d54855b2b2acb7e8acc205991d78696d8c2b4a7e4458ccfa3d058b866b346f91b2445879f1951d972365d0452429b0970413dcca6d1f5f1be5604338d22d976c378309d2187c086d74eefc91409ea68a23728a60c82b310d507beaf970af61a052908d8ac64c30a7f929ef0561902bd90a0417ac19fab66b000baee54bb90e70182473b8cb2209b928c707c2fba2a371f9ed9fb6b5d326d1c04806547066b3d878a4ba93916810478b1d8c37af8a68721a513aa96d2d91a42602eab8232c7cff1228f656d4d13658ec9443e09138db8e772f1a86f39919432d38afea009f69a7aa10e25a0785fd07d77592099986ef0de018e2c1e68b39cdfddecba8f275f4b76ba88d45e90fdbbb4686344d9d8c7406649175ff0c9fb66dcda890e6ec877935ae43dc7da2505f96f76137d7acf1a3d18d5775cb829653f46336309c33f79b01e3645643f9253a4ac229125e04628f1eafd9f839a2e81b9228b2f8bf970f4e0ceb34a685123693b69e6d9d135a3734f50fd9ae30c52bd7083ddfea6d0fa01c63d344aedb8921445ef952fb89aa75e7144932eee2e3ffeaca5fe64e403b38c3e7b6241ead730215c4de43b423712ab3cb2134db42d8ac90480c3a50b21212762f8be4c021a90542da846335b7eefe8e7f6de27be53857df99b39ad7e8f33957e324099bf33c48d21675de32e57ccb0b9f17e66b8c1ed1f11aeaec71ec13f60de00a071fad9129ebb04fd07482f09045fdda6e22e09cea166739527dba8ccfe1d00e307ec6d027bcaa95d316c0689c31cd57e01c299a4076032b3e875a820e83dcb328e985c38e04df3daf8462cdbf4d94fcfc5689ac9d996aa4a55197cf48ea59c2223a02b7719922d67bd72ec2830117044051b0ecbf5e1e42bfb0d15cd3acd7ffaaf9b1b2ee7c42ba3b8779ee783ac1df5ebca00fd8a6a5ae2b680380c522f6814e754904f7f9bfe224a5e9391da358d21d5f443188bf49093eb5a51850b9ff58e973c7ddc9e939c638e19e72ab9a7cb6040875b045ac0f3d91e6e8ed1a6280ff138b0ba5d23d4f409838e941fce4a999b451f784bda3d059d26e79437731d8d9595a58211bc2facb2cb36e1d1d7aba526467b2c1fd20070320c712fd87fce4b4acded2f112e3adcc97c9af4ea5816cecbf996ef8d5d4028c005321a83655c858cea9aec8080431e923bef7048270994ec2277038bb81df7dc49e1c84f79b9c7ce6ae05490da2a54255ab19bb19a6390b4a2ead0c99936a9cc7b9b0d8751ad8e5e5faab520b215dc0395a6f5152ac2e4d573f4fe8f40076eb8b91fa736c2406406fe1838e91433a2f877784dcae820b34a77206f92cc8286cc90ef06d980eb3ce8d3d50d20b838550a589d0e897904ee5387d233aa98b8601e7977b90fee471668df830dffc20f403387961d1ab196a3143c024b363108a5c5142109bb51ef715ee2f7ee09141c6176b5ef24508d7502682cb0b518028a1ff8885bd7e5d8d692f7aba6fa7e66ca7acaf23ec1c623eea98a241eb418e4110627d3aeeaeb457682a3f4a4fcd75632c105a9ec2913f93355f9b4e3e57fb6463697a4a114fa491768bc25a1821591385216aae41389976823705ac5d1ca154284ca07bf902350a88e22cfc3140baf57b594ef025ef0ed784efd43160a962cfcbaf22cafea623176112310e0142e08f08315ced70a76992a8c3ce3503b83b81e28ac6a6a4064e9d8882a81f0fb3874e8fc918caca2c7fd3e77a441dcb1d467414a653a98ecff0e10231be6dedcb8a19ed51d955693b79f9c30e714234bb8b75db9a2e2c2ffcc1333a5707ad43b0cb28e0a3556009c0cc753acac78eb7f7177beb40947b563cca687007a4b0942d0157e6a9c52c2d568ae3717465a770644813710778b6583e5500ce49c80856c404d8769817c79552c844bafff8c1a3576bee72fc737a1b13e4c14775d0b0edc6946e182cd0c13be227914094fad779dcf765322dfdd97bb6d208619b8bf83d7723ea41b1cc7133207bed6cd3e90652897eb5282f4b2f9d29277086d1dc52cb27e6b9ebd6cf26a8bcee75dcc198b9aecf3bc4c6be967e28539891719cbfe1c789cd1896a017ea51a35a99507fde14b9b4269c1f02b8823a7e07c3bb8caf010a04693fefef0422a7450803aad1be6a43a1ad1024da4094fad0c20dada820eaf45c903de6ea22fe6166d19141f989c93551c338e3623e82ccdc83bb4102013fabaa94a88d1e1bbbac37395e503c878175ea8ee55f84f2b01a723ea93dbe91c973b8d89777edee10208f9e2b3283e929f255159543b69eb7832c1e0d73b3e497c0277a69ac281dc261475272bfdf64b5d2a94cd8caeed294298bc64b97f1c2e91945d27b26b3d4333543c86973490b2578fcbe5b46c5a572ea4ac5d5f4c068b179dff533eef12893dd97edeff9d9dba75293eb54053153ec39ab828b9aa78d9ab973509e530cd97d3e8a4a3605237f07f261e54db8a9fe01987efe5283e0ad8afc098b526391282716e1034d0fca85f8fcb64f62cdc39594a9e4e39762e93aa85ea60b1743f59972ab07c5df5192a4ed067a4959f4a6dad2d13c1c6f1a2aff870333e69f60b6eb4c122fb4e4d256975904e7c1eddea63d582c4e16b5d819e7a4e39b9831282ba5aa38f36408c0a77153fcd6954507a75ec709031159f0f1ba7ddf07922639fc12fe8a181a7f1d52f23a48b9aa3e5d4fd8e70072860c75da431cc0a80c7bd3772f3d35247e76578b315dffbc9c682e660473fbf559d61cea089aaf428aaceb98946086759fd089ff0a933d0ddcf45d062fc59a9a37bff2c2ac991bcf102f3845d20e0fb0869684588df351bf0c1aae5e31495b6e2c521851749771447efff39f39600f5eee6231f49316f540138ce38ead527a681ba87143c26b5fd31fa2584e58c7b96b058f2af668293cba1e359641a09e1e3823a5023f8e5f2e98b10ab1defd8fdfd75ba960395f008a6df6c5a22acc40ae3cb45e62d66fe402886cd8630d7cc1d332d731e15de8eb39ba8e1a9ae33ddc246188cdb4624405c18c2a42883652169dcbebe29bec9699cc0fd93fcff6b4ef9d638ae8eccf73ea12027b89d493250c7a6ef6c3e1e7b2bcc288e5bc19758a2aa81d9158455e53c8ceca9b86a6ab7129a8fbea147ca07ea9c7bcda92b8aab8c368d4bb81ab30700b00848a787c81d0907706ba9d87aefd68924d950f16df1dc686c67e1d0339d89115c12fdf81e324a937c84dc9f63f341ba6c11ab7a979805b629363baf3c49d4964da25ce95f53cba9f0e1a919346f1f7fabc896d01c851ea6e93d124b3d8d8f559aa9150e5c938bd5b83bbfc939e4bd22459a611f0ca21ce01ef4dd0d197acfa5da3da26a7004723bb2b59726d134c25d6add665cf08381de5804964b6e37727c3404c7132308f4f5c99fbf74c72f488cc55f8ee9c4d32159348cfb2f563ba60d59e3d1d71988dea7e9b759455db195674e2edddc35017048f8cfc449eeaea9ba08283bfed00c7f91929b540f9294862d71e7be80a7f2557e25f50f1eddda48b86ca4a653c8d1da40e2fed4e6aa4184279a5c876e579fabd45ee0a8ecffa0f0f02f930fd2e02dc09a4888ea09a9ac0b6293151054f8c8abfa097c28f345f943e1df84bc58809192f6a3265248ca04a4d0bf4230858bede48ca521a6f22e8ba16593032b9dadf184496cc8b45314500b9c0ea7e426c51ab2d6a9052f5cf46c4ff3c617a5d0da4e96ba72299206e2ec49ae59f8641d32d9e354d503e9eadb4090c1ad69fd7fa49be88ffc9bdea45d2709604946e2f9cb6eb91278a7580d55fcadbfccb3ebd2e14b2e020bfe32c09559bc90b50303c4aef8bec0aae902ca3a1cdc4b45d3fb073fd791dd144f5d9a74b318076d1ac0600d971b6962c46e8807bdf93f485fad68a37ddb36d03fecb5f26249c1f6541ac8b8c9c2e82df1aeae72c198b136cccb83edca734ac90cb3b6aa2d6f36f34bc83bb8de761b1988ad066ebfd85e6e679a118dcb4874b3cd3d97787b88bef651523eebcd4d45c705621c73b1eec4cf84849222fc3745ff88a2040e398554c1b8a286716d73663a5ca2012defa8a96c88f09dadd0e60e68939fe2a4aa2935404102bc253aee90435e7c2cc040cbb71ea40dac7964ccdee4a0e8e17a962ba4666f517336ecac4f3d3b03e4dab33f9961c782131f2bf87f9acbeba0fa6c75cec6e9ecf5da766662ab8e3a6f1d4eaea15de72652e4aca0b73fd83b452d6f13f29ef66b8de47bfc7d96d20ac6273a2124c891f58a8d15d72ffd449b6ed8c97f0ec914e2938338331fc79bb9c50b6cdfe19281186ce296d0db962a0cf20fb08155b0caef073af1788d8bda9db44d65af1bb932b5b8ac76896977a231ea47076e91d1f27b1c045d4cb9eff712d3daf6870421aa306ebf28d0b8144f41e21919ce3b61822e00b79c0a5ba5b0b17ea8d9c10cd061519c0b2cb58178668458a881b57309fbad04b90b6ee46960c5221475a5dae066515ee9c66db4fc1a79b1638dec665764112e5f0b682524bdf69c3a8620c4aefde674f2ebbdff558ab2a4a57239426fbb15552aac39528c7d003621c704a090073c3f5c50fd81d220f88b38f763c601c37d72e67f2d4358a1f53de050deaacbfd46ae24f06188e3e206aff84ad827c656d960e11bba0c103f3103f2a1ef99fd79a2b9f39b8c6b7cc791ad11dafda7183799b639d1aceaa2c8bc0da021906679bf3cc3462e39bdbcc433a5481fa5a6f72a819bb67b3c940c1d67a3f5e6ee277c69bfbfe0bc40037c3243375ebc2f88fbcf11b73ba8fcb6cccf81a54cdc7af00f4aa11273a293286ef1e454a2900cb3049f04604608a9fd5e79e417a23e5468509c16b0d1cb04e8cf2730083592e13c6ce55639520a588f9ac8d87aec8addcc66fecfe00254a99554837f0f470a6957cbe82cc1905f7947c172685c27d2e197263bc16dd4a1fd1724ca2a663089989b15a1ed82ecc72147a9ed69d5fde8d86d9aca93e5ff28f365a08cb05b2d208a9a382d15f6e60b7cd11780379b9ab4fdd224c97862328c9805126a41a7d0a77345b35f01f815ff0d6667affc331e46e248d7ce8a094b24f2f3e00e56d945addd82f9538134dd94e13fe36eafdaed6358ded0bd8444ea65c97e66ac1ac192f986a035e1b845663f9a6fce08149069e0b10d13a9b622186b9d653b8d0ee603417014d53c9e30d07355618887b3ac819433abd0828f34393251304c26d24084951efee2692738daa80b41117f97c2b69ee15d6071671d7e78802ae832b378945ee3d5f822d469cf9cafeb24f7f6b14d66486e30baa3ffac7090ad23ad9a1f53fd830c55f57346e5d843f649dc294a6daca6502489530b2a91a4934a568f89cec69c98875821a8943d289605fcbd027c50028994f355ebe659bd0541b7960497f34b24c4a27cfcc297d3bb359fc14251ab9832ade13622456a175f18f7ffbfb07aa019ce87fe0e9b42bd9fe4eeefea5256abca2694137ec508f3610cd51f61a14df0a95d6601151536925ad1dc5bb35457015aba98e66d47985e30d2ec6155b6d24eb5367e120ae71b6c1a0a09e4b3a11d688280d22451f3db20fba7f2b15b89cfe6dbba0160fda6506d929aaf5b1507fd5e3268ab940ca6088b62665283c24f37c506230e3c7ac8e7ad79e8ffe68a7955dd9c71a3b1ba26e8610d31873dd86e190c7b7eb994b698d61d0d8950b5c15f05438aeae3717316905249d4ffcad6bb7f865ad391085aee3d6d3008529a481782ad44d2b52652b8c3c3fbdf491653959cd8d09cc246670628fb5bba9af3afe8bfb95a58014f3a7e6105eb4a696da08bd46e81318e6c37c3e0ee4e5cbf29a5ded728496284eaf874a5d2aeb19d3432a3f212c412acf19ca5116429c4481476e38cdb57f7168037acff65748e6f159f772488f5236df97a0acb07f806131618cd35686492098662208aaa86fea820baf5108b06e6d24b4b986a925f8206057ad1a53596ec824bc1e378627a36baa1032ea4a8f4b883f25ebc3c8195f48685da6aeb367295c66bc2fbd4fb0162cee1901611f1230bea8e945e84f1363ae3bd44e74b2f417adc969fee5239184cda32b9192697a8f407da90c4fd84d5a646095d756807659683cd20581cb25482a6c5c90d9f56ba0ded9cc8957e4ed1fab61a5d6fa5e256f485256ea89c76009dadb55351aad6a0eb70419c0c5c17829b2db6d7dc7afa6c385dc91fd7b08b3f2b279753637dd852bd52695b262153e06883834bb58bf9f867ec07d96c724603abaceb93b472f29b2e5063748252449ceabd31c7983602d8ac372755c9c457cc922f9b770f234bd17c3c76fe01a5fa9518d55b4a50856830f3ec82297a2ce2ae2cb8ba2c95562056a821292eab3c204bc1b95ee9a65dc8b0cd1b61e711519a8d83e07a6dc9960ec6d6c0c523aa05278fcba1f674439117da972a3bf93214cc7f454cdafd1157a54925f343fd1953731d1fe2fd6941f8d33143e2beec3c35512f1930652b5553a286db61de26b07c81fd31c74a1ee3dc0501ed3e8f9692843645f6a6a66d038d9bb73b40bceeba5d9b8b8c7ad23984c4e7f73f7dc4a3753a10f025c4a8cf87cd5f25a1bd61973f696e1daddc922341d7bdf49b7c48c6dbe41a23cd0dcdb4b036b7c096ea5a3240c5b2136186fc08d9f89cb1fd79b92444f074a11d8514b4e522caab0a468690a980defe8b04a6c701166fbf9f0570956230759092f2e8c856570e5afe2386d48b4d2d913cb5dae1ee6a50024e5f72aa38a9d688ea77e998f5aaf2d6305d106d8d108702f9a6c9eb9302552850046a231669ea3767994e16ef57943109f332c091be4b6e7b5a4d12c1ebd852898776ee7f61033aaff6080a01ae03a48058dffbfcbe9fd1ee2762c4e6de81b0c123fadf52390a5da3c48b13d83e1f7479c7973b72ed5d00a813172db982a52b8bb888096df70b63f3d583c08798d8f22d652576f07aa07ee55cd10f5501f5d48f2281ce01e82bf38a2b4f85352849b64d657caf1b290e4b8688d798a4d2328fcd25acfa16251eca789e150262627d8fc4509729666f49937b3c15bdf71e660f9718b28618fcddd3961501dc06da50f2da3f1947c57727d3688084aae63e7b314661063247978d7e6f33ce1e4800980ec2f636124ec739b477a462b30e555610ba8d2377065de96165e42464a272e5d372113c670a8f2733ee316c05a47349809eb702f6eca9dbbc21bcba14f55207ee997743cee3bb04d9ad90ea29ef93e6d7dd5b66e96ab1a803054e696383db8167b611a9d38c1933c45cb83b3130876a1532d8bd69244178e1760112b460a425e0dad47d9dcd5f4bbece1b02df021747e046ac7fcecfe748c216611e5d6c78ff6eee6b9fbb95c463ce7b913acbb0997cd317f3349c67d150f930830de90d53984f69f0c27215b06ca1dd63aae520f585f0d663ce5881fe2056df41a29fd24a9de4bd20cae571c04d0199d0abd6d792256bc405fad39574158fddca80e7b830c34203cdba7290af4de78cdee31ed871815306ad9a255c3228521ffcb4f97c754d7beb876edce38a80be13656253ef4efe16d9b626ac397bf3ebb27bf5786c83c2e15f1e1c4219e7d95375e201d5ee953814e5c5494540ead6dce4996768277f2dcf897256492e9762b8dee5190b438dd61bb4b3a5b208e2080ccb7e6f9e9741880050beadaf729b7c2f7ab551f6173f1d619439a61e6442c4034c429667a49f53828250c7e2b15d8ad19d7e411679c88c9a21085b65dcaabde590a62304d895acd2d925de766f377f2e79b500d16edaaa4902554aa161c851e10cbacd3d6dbd86939169fa2982fcddfb3900dc34a6e4ce5438f5976b7259613b3ae90960b0941e3af8e86fda1d218d6e27ce4cdeb8e586fc14855f580c875a507dc01d3374becaed1dfa4f54a88c993a33df4fc21502ec84f2555ebaf088a34e98b00a966e1624f3f545b4c904be40c407094ffa88db8399ee823256cfb238cc915bb5b25ec623f6c971e0352fc6cc17411e2fd711a931d2fe8d7fdd23ca575fd8b51ef349da2a116f0dda155a0999d637328ca5b2ef48bf9d31248a9c7dac839c604226935834c6f6105dbaaec73e42e5800d3832ab4bf338bdb4435e7d578db6725e296e5994f4200ca1337aa30ba694aee756efaf3f0a7ecbcd669788b991c85d23706556ed1268f8cf2b5f416098bd603e91f7050601ae610996876e3b199e59daa098ea9366e9aefb6a3b4d7467059817a76bb9fe4636f7db2247bc1576f5b1c89e2b0c06240060cef09c660f334fc3c5c6c7e2af71bebec45f59110c1228445c448b391047a8318024f699b72e4caf7cdab334c49e9e79d3c61dc2f5f6cf622bc82a4d7f2ed39bd14d47de15741ff1919c8eb182ca241ae6366c8bf0fc0cca7ddd3d3c9567494a2f17d0c0de5c07b28026a625ba9ea7448605b467303dabe96bbfc37eab2219abe5d03b8211660d45a08eb41691da1d952b5a80e766d773139b221461b7107fd8b00e629501fc15a2ad26b4a7e08975d8334b8b82f41258914bffc90362ff2305d5b6a29e002b1afb51dbf8f4dea849cf143e9648f7893a338f591e253739eb444039327b8f28d5c0147557d370995c045612046e06d1a1cf5520e7c660f78c178deebf54f1597840c17c34b55359fa914e42bde47f588c733e68d8f912c834be8ff389d7b698910dd2c4700d5bfd0e151a7c9095e66c18638fcc2d4ecfa6d33d0ca5649853205535e3b96089c3719442a621abbee7bf925425637e349b7ea5f32e498adedbc3e5c06e0ceb5beed3a1d19dbaf4c4b18c72c568aba78b0f435da48321178e5243034aa5fb1cd10662538ca9c85a2a79c683dfc300ec1dc00a249ab4bad123d0d420a1c834c844b6b20c3d611feb833c9db0fb59b83d978e0a74aacb4fccac7ce556688c6515dd92492ed196d46e83ba19be5d92c8e5df6b16de0e9cb716096aa5897bb74480559d006f3b22a17a7d5ba2c18320cb0ac9517ce7c7675ac283d350252ae15aedbd7d0c0b97ed5dff600ae2f79db8930a397cb7dcd5a7d98a8db4bbd80fd9f19103a76f8e96295692b0e5ed530766518834c8b321cb3ae780fd3beca77c8ff12c75e48c448b8db44a704efb78f208e8f3183d78258328ea197799f1844da320d87f49f917c35fb8efc1e4e803c41aa9d61e8e242a97db0355f012d692459aff673715d65792d3db066ece7505415977ccd9dde4a3a866774a38c318b2081c21694e5813c7873e90f74ddbc48eb4ecc983cf5605a93e2f707b51143491b0dce52c5b4e301307aa2b3049ea377bdc9e4c25789aeef128302f5b320b6b64bd48281aa04fc0968171156149824df3c433dc33517110f2aa4d37df23e03fa1f17004468f8a700e66954e661f65272f3c30d3cf119e8f98721f3a2b8d6474398c572a05b09b51f006c2c3eba2414ed1e58ec4952a9690ae7b72b74327a219b3f774c64a36d2720b1a6e7f7826e9aa099ee7303dbfa272975ce1d851c343854d5fc02698afed73cf3fb6b9af6677f95c020c418c177d4bbf442fdd0fca1cc6cff957c8e470f3d574ba32e94eb732f7057a32e20b6ac9ee65353cb32fd6c2a5c79f24375eeca4e9b316c6be0c92a0dd6e17e7eadbfd28998ac529d2e8b0ff3694b2fe32962d2a78afc1444a3f9b34d31d3316ba327e73671bb2cf4ccf0ff5785cb4fb1508e8add570c3cf3911936fc3baf0e731c3b52e034e79293c06f8e2c6c55ddab22600e8249733e7e6a63e5390f48dd2ec8acc6d568b79ef35a365055d984969ee512b18e624b15971c136a167bf1c287e76ff5f0930c6d9b9f65e332c41f5bd15b8f566c2aa2e8d2f25032113b111a4ffc667f4b56f3860aa8b8a523f8b3d6c458d8f6b7a178d8a4fffae57b755f87832f5b302e8af60ad0f2ca8ab55edcdb4ea0da887ac62f47af9706aecddc07c611e82930ea64ac9666c10cebc96dc82652b2f11ac716b6c1ba329850117d27b6b83648850f7cbde2f511d1590ffb5f58daa8fa174562095a57dcc7e7a0a1d5cd96fc9b982d8fae76de8eba27f9c0b5063f2b20e886ceed994baac96f9b937325fca46f60236f3707a150f3b60bb6f77a6aa4b851f5fe9db2e75519114e489d6671d1e0d392455549c92a5123da324d6b95c1cca6a701e11c7ce5219c05aa87600d8c49060b8b6f791394c7565554b9cbb1757677dc6301eb6681f4351cda05a4425ca75fa8829d0fcf232637394749b6d56597f78c125d3835bfed5c96ea1ac83671932f0c74113157fb767e05bb54776972d5708fbc87e2c05f5ade1be98c9d9f6e60cf820eb669efb168e9a3056d0c5839c685258511707496530bc239230be76b033c974e6adfee55a8a8f2556f2e3fbc00ce710607e3103227084f392a8adc561e894a878f1b21699b5ec487737ea4b9af0227a42b70157d296ae714e6fa9006742c2e12a7cba0470f7746ab386073d9812b72c56f38a6742298f6ddcc4bf78d4bcd7858a06f392b45facc8cbac9d23edf0c9064158a52ecfd7fff967688a57881a00bd478ce3be20ecae5d8f3fa93de8678e14367833fa61f61817ae110972bd9f937cae8b560cf7d479d39442f33615c664cc9ec1c7c524b33c814049724de801f85f965e424dacc07e7b635fe266e3a826642b0bce2d9b6c98097bd0f27425a07e080a3f6fa46c87bedfb95bed2745ad095886305be812099563970aab387c976e7153198ffc4824eac1fef105fdb440af0cd11dfb3bb8834e8795457b6d26a3fc0a6e3e6563c8c5f27c95c480bd46a02f7dafade40d1760161b641427698f55ce7613c68cb6d9d90563f949d38bfa6f3de117ae9e413f61301b01180c8343a93984156c2f4336cc8e1e93e7fba21bff70112fd55ce58d79e87bc285daa6aa9bb4515f7fb2281f0cce1b488169c7c848f125390bd4e31535feb343a3f4a6871b3d106640b3f4d8cbc53f59f0f55c2d48f38dbfb244c160d8a916386859fabae5ab98c188f823e705057ac41eb34e633e53a491980ae924a769c8ffc134138854eb480c693c9b0c2affefd0fdf8992d53b55227be88d7dd61866b1f6c206e3c5e35b4060e97d22c48821c24b357c81a97ebaacc21c513db8120c0fc07d8180f53aa03343c1660fbd9ba77a76ec899c7badd5c2853dd3d3166a24189cd938bf98012876386663893f1e572c2f384d1280307edfad940c73b9f468dedc7ebc2a35bdbafe3592ef16b835a77a3ba26c30d5fe4b3fc1c7b68a3fbbfcf10f511013c3495fd80f639fe605ea1c10af65b5ffdbe90be68436496871acad47c99ae646ee6aa25735bd855e98c805f5acb9c6dd88b22f63dedf84cfc6658f9d1083cdfa25e284188ba454495dfeeda4279b90bd897dacf8fe141fca11042faed0a54b6aa27da0b6a718d5a2a5e042a55a06eb6fbe2934978bcdff6b79b5cac0c7ac74db62c6967acf74bca54d9f6cd0f2f6763868c9c291064fc0a2f4b7f526ff282b86162e618c1d85c5b94a9f3374c931e4c252b8ed5fca4c2493b3938acb9613d10bc8e2b6f313c11ec822ac25b30cdd8c105b3fd87ba73644b7b92844ae2275dc40678be0cc5f121480bf9dd568b5bff9409fd75af2876a529123a2838d2fc7e7fc4b4746518696241f5756f895fe9d88633324d92d09d7ee61f48b595e75bfa55aea93072f17698a0e7a2e7b19a3a2185ff243a9436a055a0741d386299fc79d7426e484a08c47786d84b1997a233a6469fa929d4356be2d1f32d33b8dd8ef35b57bb26e154ffd003cbf03b8e2438350cca7ee193b675f831d1a5fc7e3290046022847879d3f967071c5a26217fdb6b1332c38b7c3da3096010cab0e7194c7c8e4aa819af148e5217177f96cc829ea4e9746b7782a212fda2144c3e1bd0641f29e90f6a460d95623a1865a726e154a0e716bc4eef5b08064cc0aceed74449d74fb22f3f6b0f775ff8fcef34f1e8a7374d0a0dbfb29aadef464bef5a3206316409501993864ee70dfb3dd93c90669a4a15e494643f1d00176a4ba0ba5da6c8ff6cb31a29ed8376e06f5ffd2aa7d754919ea6672de1865b33474a64998c33967f06bde38c2594e590451feebab5476802bcce33c68bb407443f8865de42bb4f5547f425e40e681f5f114bac9d72f8a3737b0396b26479b44d6404c4cbfb59d3224d4c50413bdbf88c589b7f860245da404a0d9a93382994b1d4d37baa00d3a03842a6857d266362ebf063b8a4ab45ee9b2282fd690a0142eed256f515c94f0694b309605dd8869578755c07dfb1d0c519b2800d4536c70cd3c22865ed19aeb0f2e9fcf0b7ba80a40ea85c887aef4e40670377773e52f9b817b3639207f35fa4ae04373e6436f2f2b70cdc30f8056325f13d8d03447e3f63bd65ec94d18e80be44710cc8f527e55ae06aa225d77706a5c0ee3931ee51f6b439edf4b7ac6c260985b54d6829b0f923ef0929aa4d139a466ee3b9e5fbe0c4cd663fedadf83667aa4c0dd9965369a3b963af3acaa9eac19d9fa3bfdadfaf7a2d611167759592ac32a1b76f9bdd4edd147f77359922a12a2c55b460d3006289de0a83be82e260218ac5e2a7a05719a8fc3106d4c4ba054d2729a49c230bdf16b36da0e10d32cbddec005c93038744a30807b9fbe5166ff06d08051b5cd8c9cc3f28b589eb6985dda68af0bcdc42830812eef2211445172a3cd90a7d1482424ab256f13a0b0d0ae993d9d6b2522602ca61c9e80866f89166500c002293aa24ab8fe7008625e8442b6ba916a116bbbed97a99f9d9d4763107821e37fd6584b1454597d9c61f68451cdd0b37b209a55230e85d2817d77134a9ce724dd5162cd57f2acbf76ca81456bdcb55ccfc2766fa1fa6152e80787fa2a27ce7c5f31c56cf4991a816ed8da58fa37c9501887b6421ea6c8877947a27cf71f84babb39e6262d96cf38c05153894ccc877d1fc13e74e9154738935e0df23e75339cb53ab6f098595dab80cd05ae39699c99e5fc9a48e9b921687bc898f886795eb3a2690b4bf3bb88dacb54bf5b9e874606ab7f1bf9a0c1afae79743f2d593bc6681f0266017ac929770b120448f0c4941ac77876906e24f8e9d0d86c71f0b99fbc144f3bf0bdf2e0e63bee1a9299903a04c304cec3f88979710cf99c04ed641e8cce918818fcb154e329d02864627fd190532a97e59a9927e6061df05412d21afd2dca3f99b54fa6cebd9e48a9d559d00c54c45e68f9b21b2d71c474a08b19e07fa2c651c615e080229a591516df78a4a33d1144743a5a44f1515182f92062f9493927fe18664f1c52cd7ca3ea7ae37ae7d42c4597e1d756491d51a7df9c140560bb45a8afbe53efb1c73c55a2f8a40dc2bb408388ec57e4f0bf3391eb159e8a3794dfe6c30f56afbf6700d2157dcca86b133f7a4e09d16f4982013cc2fe13b4d731c8878629bbc94c20991849c50505009c7f4c1978f6720db490cd62922508aa2b09f5cd29582eae9e98dd9479ac885d1554a33ea397aa20df06effbc909023f3cbb7f89870546687dd47a29299eb65f589b895f91d4b0f562f0a3e35026b1b8a7e0e6ea6777efa01035aa0bbb58d247fb851a6525a8ace4fb15987df24867d03ef27a316d300ca9ff4d599b2558e77cf871245b62b467bda33891985c91306534b2e188581cd1fc25ec93a7799345f49816815d77099a00682a4efacad1ea7b37ceaa9c7ea0d81df6e49a644cbc20e63b8004176d9f0b5af6d5804a789c2a54ad6934de7f61c8f41f9400e175306755938be3f24cd5671a56dc7ede9e1e8677b8ff3bbe510c1809e64bc7f1a7ac5c4a6c0f6777989dd0a68f86ab9b90ceaae7a8c4411a53214f0e5c995d8cec56629385f98ff61d734d469b30d682482ed1303b4512e727936caa6342fc65199f79907c60e18104916c62c4923321515014be8d5be06999587b80332a7ecddba97bef652827795c3a78d300a1a485aebce93dc4804596dd2f05a7ad8bc0186266b3218003d969a75abe7ae47d678e9dfa01ad35d761e04dc01ebdfe869643e3cf7a2a97d9dc89b756b583a33aeaf9291ef79b4a81cc1d07d40c31e24bc5ac0c6d3342206d5f18e22dfc1c3848bff18dbcba99131b9eb36c76704841a47298abb53f05f0cf9521eae96ce0c4e8ff6f70cb01cb24e29940e84bdb5f09ea8e631f9a36ba2a29d6171fed7f20d4d608efd76cdd8d96f9fbad37e465557289bdb2ed298297ea76a40b6af1a4fce2669916fb5b360056ebf539b1b4d7429b43d720d949d0ce3ce08be539de79658d0adfb9585b09d5d100a27e6a3b207439b1160dcf78941781fae1c48c4b70ed101c0a867c6f81cdd82b04e2d1b82c636221306b7125f479c406028f366a66bd3f908fac48c73b391b4f6e658e011761a347eafc24280fd7747e9d79f9da2fde0f2b0fab1963b231dc066470b3ea146431d3e3f5f84314df80e45aa380cbaaa50ae73ebbb4da07b9c6376c8493f550acfaa13f672328c1adf713c4ed54257a0a8684e43d66b06311c05fedb593223147fbc1a8499a3799d1edae1b43ec632a4acc6aaebbfc1877b85cc0124b17c5c3ff473c829a3c8305fe46c916506a5a224bf0c1a40e9479cff3fa5d9f96d4dc0760db2c49ee22586b76fe965b72c9b786c12c6b107d7767c3f57d9077294279065f39c1df3f6c461a459c00ca7a0699131d3212b2a70e2f002b10b81ceaaf0c8816e75fdca645b4ceaf6baf2ed2dfe64a897a74fec0db17701ee7ce1d5e70e6417f432a427add364a39f55d145e722a5be1d2d85fd184fe80866ae1b9a842df65729b755aae98de6d3ef75264d61113972e147c36c37c6b6fed80eb44ded3cd8cc470dda17bb6aecbf9c68d5e7689030d7e4847fb3a5ce04da9291d9a8553f802cbac09de861b3501eb9e576868dacec5f9e349e0d77c2c6b1308d91b6ba49d90fa3642b4027fc23c719a7857df82bf0ac363a6cd5da782d5b0b6c88a9f4c216b6dbda1f8329f7a6ad8d37fb3ac0548437346a9c220a02058dcafda6fb494fb3eff51e7af6c47660aa0bf2e2dfab527c4f3305834218f9d3ae1ecfebce6e93da89ccff02c541a73d2579a3d34fec2d8053bd739290794364a4f0598bc0b0dbe20bea2421dde7d25996409199b48082fb45b07037e88b8183a0488a85af184c390c3d285c80f79e236190d697fd4bac807e9e62d633cf5085e124e30bcfd61b6e49e525719cafd15482f8b680ced50b97599c498924058bc44560d7f4576ed33f15ae26c41f19d1b9323ee234929865b80e9eab16971bfca8a77f32ed3e1e7c5b69075721f4e22a3a33ab1526c66414c246e0ec55082875844b19eef8e83830f2c8ce5cf718c3ff82028c7e83790a9e54ff21bc7fd630f5cd172d5a35ddf6f6f4e0a7d16738b35ff931a45ef41a9fe75ec027c0253ed43ea1ca52e4c72dd95ebdc71dcb20069af7127b1b6ec5677f050f49330e535cb9d057895bed40fbb57adb07686b3f4825bf45660a8d27ff4c421a7f934ce960724dc37171973379a0ce3f61c61079a396985036c359a61234d45e7e7f408baa9c66a7110f24b56b471751458babc7f7ecf748250a44aad531b9b08207b6ba70d0b3c50afaac9e53d469411811155f637450c283b705a617d16f581a150cbcf334904d1e7ac249d21929d0f5d38a071803631d772507532f6fd0686e51769a4240daffcad52aa2c5c3d7243a3d1792ae08b3fb1f78542fb09417d8180fb37938e26ddc377049288a39e4ff8688dbc3c8dce0332e93c06183e692dfb5b6f036b87f91067b6a4edfe1f1fbeb20cf534b192b758eec98edf87afdc4290732ae5f31eb07360b124388c354707755e325bf3ea9620212f310a340d64c0af52b50b54cf094e2db2178354f541ca2bd0fdd10b19afc2ae3a01d01766d40618aae235f16e56bcc0432ed471901b8c2b536575704bcf49cb0dad144dd493debce625cc588c4c62a80f34ea4f00c45210f81e8eab94f45889a2bfae06bc5fed9e4c174c0ceb5af910766ed614536854b055d1dfe6990183184701758191f988aeb6dd402bfa38988140795a065e420bb785b83a98ed06c5acd64f07ffe48fb8d53f768e33248d2542d9da6b4e36e44c7faa3408acea22a553e0885252a43a5721b1efbdc2f979e07ed340c4aae18004b8f77b1cc6285e224c5313dff1938607e8b0efb42d207ba810369e734c3c5ad4085ee462a93f0b113ad9d0aa7ff044c17d1b5a288d461c255513b5322d8e20cc7dfebd041a5ce4434c80bebe9eda502471f66a7f5d1965a224b742e60eecbe48a28934127730295e7f79834d71bd6b6fa924b15529b062e6c936025fe212ec967c616de6da2cb155d5d161344aa3120cf8218badafc673f568e3b4ea191e99ca3d8f29b30ee22e5f566b114e00c0da1a05ea700063ee4a9c511011944a8a48737bfcb584e840dff96b69480180730de7f21114c205ab0b518d68efd3aa460912eb3c6044600c9350d200c9c2f5791a088e9753dc92cea6d10ab28fb3fbe92b0c9ba297c9aabd08b229b6d6bb9497d7e66d172b1268ca18918c5f4013220ac7d012f273a85053f27abbc7d7aa42cf1196986aa01ea7febc8ed88d5dde730df78eb38535c64d7e28c35c5f77dda0ac4e5a4f48e1c537b17b0d838c91f309cbb2fe590e60cfb3c0486e1f745882961465c115b3e80c3e52f3fe050e0ccd2baa442440d86edd55aab0fa890dce597b17ddb49437a94d69c523082f7a986125857e93477d1dd4d0a42e5a42404fa9df231656ce02cd57778b8c24d1213a912b2f72c172fde1926b56ea38cd4db8236a9967c5a9439ca396094cd4855c381506a0bd2c5427eb014f350414fe0748a6fc3e632ded28515ebd7379b6c15bef14eb9e03468fd255dfa7b56d1750c1ea49a029a19682ce0c0cf8a4d3e8b5b2140f1b0c72f180e7a2ef7954c6a0b0218f27bf9223bb98d26dc02079bcbfb83d2d83192b8c456d0f4638ed4b09415ba77c1c88c7ceac5f6d76a9674146b0c34b5c9c6a8c71e387622c3fa34ba284b631bc1b0eef19990ce175e0906538d9816083e9cc3e125de6fafad480ef32018c95d5c2cc48a73b26a8afcfaa4a0e9921376d5e139956f631f4f09476ffe02e5138207da7189012ef17c3f34a50dc9e4cf1032c78c77b79a709561f0a6b1b7044cb36d3384f643ac0b2b7f74dd00b12e05c94f2c9c72432689aec9f5b9aedd8e7bfad984ad2ff4c72878f131d79455b6f811b1ec1f8588c0288b9f69747c5ee6efcf7ed646429122655f159a8e2d649f9ce1db84c5aa1aa4a9a51176e3c1f004d9e99ffbb6fbf8851bc2dd1aed095ac02d5c1b5d42b4b6e42f45f112acc13be77d4da284217292df37c0d258ff4797b612548a66fe8c3f98748f13464b256ce5c3d7d36fe43d9703845ea1dfb9169e5c502a6f7772dfb46fc08e24c30502a4e54392dc768597b7162c2e1f425b0a13e5e4abba78d02b023b6314db0468f4cb46295a3bd6faa58f3abfdede10a9b49697ba516bcf5f097bb8169c4ad7b172871e9df746fbeb03a97d43957d389bc3e732478451ad95f128b727eb920a6163bf6aa27ee2fed993a95b5c5be151c00144eae886796b667effa350d42f1bc11a9abc40a4e791a4048ddd6eee90b22795c81dddb7dd61cef73bcbe62c9c9201ae9790179bfcc019909548b1bc4f21e74e82183f51a931b454fa6ceeb74a28f3deb2d47cf8b0956a1dcf39af203eb0a146b33ed3cf229f09b3c1acb10c854d1ba9126e8fdc5bcaf252b681ebbc2721914cecc381f062b4506140044f76ed069ac262e78b04f6a8b0ea3883ecdc2155269a7ff20d5b015fd2153a238c59e2f828d4255faf6925737fbbec59af41b1bf4ec5994b4630af842cb8817987346a8b28a82aa741ed3411427431485f52a5906ce2326200a085ca6c7dea0801d5c9db6658df2d64637d343838a58398387994659c2f763426e5141409dc051f764b93a3dbe6a9bedb1bac1e31aa2c8eddf6a7311bb4b164b1b602c30076dee04871abc313790eb0843293a144a64d5791d74cd3823e8356f813e4e874c43df15517dd87991a1f05622efe1fb7cb504ba0972ed0f0eb4886f210eb71f20738fbc043932653baa64034a5a60e3cd30393031ebe7c7935130d130ea07c0115ef59e0b1d84d915b4dea028561ee64ab14aefd9cb0567a08f89c27f43f0196a23a087efaccbcfba7ff1a719fbd4e3250a0c1e1b0cf84191bc5f4f9f20c8a6ca5c5f48b10011d3f637c43427db387e5e449b63a0a78f3b96a8e145d52eb92a34042b2875347e0fde4ab6dff47941677a8b5ebb2e81c78c2243bf35fb3b4ce3f77e2226ff73c5ac6821cafba4051881a349a0b975affc6ff3fd73b69be54fd8e30cbc7ec67d0ec323d542fe5441fa8ce15646bf99f5ab866dd674f09fb6e82a4e0127b2c4199c261434635961d5436af4365b7eacd37878efc241597b551684a40e3e97160ca0df7354245b0818660aeb64f9be11b119ccef5d8f7825b65605d7e4c9ab527f8725c55e7844224d8c384384bbe4ea53aa8ed1571fd7f3f48cf154f26e2a4a1cee8fdca7c739b8716a9d63f5d6723b01f98ee9cf2dca30e34fba22845489f9d8af645f2fa33239025b26d8b8500f21b23e4e2a203a60b72df26ae348c2e6e20e74ee1a6b7ad958fdd5d7495961c46e440b3d7336a873b36553fa77a00d83dddf833c7c1cb8453214ac4ef336c87ed85c04c263d315326eed5c062a9876d7ae07b41617819eb03b7a925aacfb7c8991c08028d5a65af709afa13e691d609e2cfedd6f727d8e27a301ca633437f8a359e5dde721aefd1a19ec975856fe01bff00db970f43440b8929b9f5ffbd5ec9d6a5acdb8064c430579a12ec15486a4f027b4767d2c886cb519029fb94f27964d967a04d01fa7060bd60b202231b0c63c010b9a97184d0e9fed57485f049d52d51789d0af4eb106eb64e09413a94d9e531983adfded4e272650e21fd3809c89273bfaade781e3fe47d8f5271b2fc4936c203eabc4d7cace34809be4accb98170f95a7fdf25600503624373a47432724f6a782b62b1b9bdde8216b3323df4d04bffe4fe98cdbe95318bcec06bae7dd69c61a7953ef38b43f0dbed7f5536a23764e1df2c9fcafe344fbc4548110252f94127c5c0911ca477bd0070fa933e7c05cf9323afcd3daa1b1636b9941b32af7bd4a3111fa0f550fd849d5f2a06e88fd808da8aa340b47894b7eaf0a98f42733d7269bd6d1ec0e87644be353ce3b27185ebcba607764d5ee020e692a8d6faccf2ecb74c02e82fc2f606cf43297f704a91428138d147e2ef6a273484222e66d579a8d10e466dc7dbcc93ebc65679c4be544494feaa8bfa83cf3cfe5a8f67038303ed3aee7314c0f723978928f432b28ee8f7ef881e1638f8487b2851aa37ea483cfd791acac63ec92836a1c972bd04a1ee13bd049e62a93ec25f7ef41e88c1b2000cb277db6d784da43c6687dab0731b9745deaf379fae7ecd0a6fde7d0a0024e29086adae038e8b07606cfbcb26bbba171d11b04591f65e1522c58261276d2e579f14d0dba8074d06c51047abb48e98e6e26cda6320e7b1df93ea46dbc078fb94be448216761e3812b52de788b6629ba5461a2dc319d3b8abb8001d4ae3ceb04e6463582635f1b5cc28aa057acbb316486029a2c218be230a61dec2b82effdaec61cb0a5a730d1acc58c60b75d57d1f2056fd5a84a5c130ad4ae67f2f556a249c7cf712dc29cf5ecbcb430b4367e2f66459a347d1efa8620b5dba1943d1d69054fee43265af16925bddce4394051b6f215e61ef087b82fe08535e6793e860d9510363b3486750d74e4abdf43828e07f702d9446aa70f19a909db89bfa2473d723295e0cd88456f1a5437ddd22423517c89d9a6838be615b9fff475f22276f4628b843c437b616d304d4b9ffaab9392fe35ca660d3f564bff3e08314ce39cd79e0cd0c8fa4f0164b322bf2e5dc047793ca0c1f49cd63d596d807b20e7a41895375549cdc76272b8e8e67534f070dd8c7ee3c0b4c2a785d38a444c23aeab699b1f33e6dbfcfdb7ff4f660bf95d18156cd9dea4bd33f4cf9b50be1f377f9aa86b051beb6971566ef50af911f9aac94688862e0101bf231fab6b2eb79521d45211ffce6e1cdc01f680cb0b339313e626f0982d216a08492599a435148b6d9ac3c837a25bfdc5e8af0f0c9807897e9a9d8cdf7f6b35d977f44586efe7d33976e3ac5bd44b7f97b74f4ba456a46f288d36da5b27ae05b2b4a1fed2cdfc73b3fa617a6cb07c0983b2a8e2777c92ca2a0a1f2ed139c8d4f9b88085d7bf1ee2133a1c109484099795fa8a802bccb3012ae261557f658f5fb09236ea36f9b76e56298bff762fa8314b18c91e2f93bbeb254cdf123387194553ee267c91436be1cfb81664c157ee3217653bc91b0af2b72d116f8dc5280cd91e14be281c791007ed3c13582dcb889d10724681e61255cbda9c6d8091ce755b0f10f2e49737268d3798630a93033e188aa48530e91a19380be0be279dd6f46f3b4eea532c093fae2b6bbe0a724710d5fc977bfd1dfed22368a7d9cf31f76034e7a452485c9ebaf0246f5dccbf2549295f7942911c84a42a2d7c73f6d7b64360580aff587ab21f27c5c0154fa63e652350efe4d0b6b6349bfe42c8d4acff23bf45947c02d46f8e9900326817b801b77661e2e31ac1af7e5a2f2d01b8397bc12e7ed8118c371d774b119cc8e9e82dc847799ae66684200af0e97554d8623d821c74b55656f8c09bcdd1af45d6a236561381122bea366bdcc8d995f5d9f67b923a07bfcc662027b3845cd0c5bf75b1303f6d1bcef4272b09935b6649993976105c03fcdbebb803dc47c098dd7f57aa069b1f81061d9330872b2cf52de98ea36dbc65c7636007e0d059b8a4b00a053dde9afac48f820ecc81efee31f6b20d0c22ef925d3378f55285796efc7f788896d99cf32cef0dde7678503eea6d65fcbabfc9f007fea8fc6e99b6d628225992b55082117d4e2d7706f648bd40ea62eb59a279668a47ba9e18b370501dd059ac1131c3b3d471fa4c42705ca0f82fda8044efd059ac31900e24ccfeb6b3c4366cb925a56a3ce0a195618cd76fa614b2ff70495809e76942c150bb62be6e28943b8ffb6ac3261dacbdc555b71b1bc2e3a43b03e66dc07a9c78cfbafaad0e6a5b1f5eaa486d5e91ac5bfff3974ee78996eb8e59f53f990799a56a4f7599db5a17f6b0cf00ae30d9608c7b9254bf2b1bdf4a278ae126b55e18afd63ef2bfeeee281882774680c6a520ba7259b4d95dc4f7ce7d8cd1b19e4f3d46ee52022392fac60a2b7e3d7289d5774593e45502223cec06974dc34b5520771f90e619f4b8308c6fda98516e721a37414cf70b237c16b7763b69c59415ca5278186709be28112afce319a00ddb48e902afe13c09b3229bda5fbd0c176b6f856b502462a5f830d1d6908197d1739a06a902389c92f6ff1e0236f4b44de40dc2389783608b1e8b34896c56babe9b504c9e2c7ac6e98fd1242575bf48cf78911e4b4fb866404dc8137d640cdb9b5f0be04957a29b005804eec878b77259519220940ff156957138ca402ee023d98225494629dc6f3bbc8e2d1dabaa1e9b4f480edd76c52cc3801b6a3cfbbd09983a57b08303b002fe54bd316eb41dd4bdf7c8403b1ab01bc7168482faed4e0ed4cde6c916fe1ecf2b0218dac0d99a8c86179f8a48a7f628d378daec1e5be08f0b8cbf056f5e7691a87d2d4568ad3f09d7fa1493ac9661ff7aba7116a62d1c9c7ec19266512728b7f2c6c930150b83ba84cb2d4d5aaf9906dba47bd03612b9ecd8b38cb9d42448a30c22fb593555172c62ff0b468a4bd0297ada31d61768fbfd3de98d57461b76fe7c93ea82154e572a87b891bea23987408aceacb5500bcb7916e24e0b255251b9dcfcd8c24a8082ff76d62c9f885dc6a771ffea94882855881317ab3ce14653e51635c1b926dfe68a3fc3fa14f378b5617</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
<category term="面试" scheme="http://example.com/categories/%E9%9D%A2%E8%AF%95/"/>
<category term="面试" scheme="http://example.com/tags/%E9%9D%A2%E8%AF%95/"/>
</entry>
<entry>
<title>5月份学习计划</title>
<link href="http://example.com/2023/04/22/5%E6%9C%88%E4%BB%BD%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/"/>
<id>http://example.com/2023/04/22/5%E6%9C%88%E4%BB%BD%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/</id>
<published>2023-04-22T02:19:53.000Z</published>
<updated>2023-05-29T04:40:46.236Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="029a897678d51578dd050ce80e6ae2d45fb95b6694e48d95bc3dbc3942417ba9">cb320da6677537a61c4c8a60c50f744c4fef3b3281af307f341a1931670fb6e3f038d6455b0bab82af6b7561bc9f83213bea2dc604b9ca19e90e8c6f0aff3fdbc834b2a289a4509d83bc772f9a037c8d34bece12c1cfff83106ce26fdd4e190cafab35ebe0bc227e092b7ee18a775811f5c908ad6136e8aa265d5437cc02226b808b9b98d9ada32a9561ec4bbc8ce81277926eeab416be85fb68f8e5208aba95dfb64a8d1e8b8fac87dc79ce8b1cd23c584169a8b6659cda0b0eb42f808889b29148ba248066a0a236e75dcd2dd2f20dbc1a521cc7121d81088282d7b327703c10642f7460aecca4dfdfd19769a176f87cba51f947a6d44f3dfa62079c3ad8eb1d3e07f591ab5d86d982b032d51a381adc06c487e0f0585dde27e95b7c79dfebf36057062af66b8257b470a40193d02c21caa97e12005bfb4984d15f2993a06fcce9d8d89b8bba7b390eaa177def42508f10af8596de450acb0a980acc64787cd68238d22554024f6a0777e78d1470603ddff761436f6f8dc1de445921d0f98860200684be608093673f1cc9af414ff6256844e87ff743e01c5b736e3a8bc2cc301d1efd9a08c610292f1b5bb8e61283a8f07fa02390a0887b61cdd226ad88a4107341b99a9edb63b928cc0a7b74a48093d9829e2a3e47a16a9cd1153663493ffa5dcec62bdc3e0e91e84f661bbffc2c3b2312063d021df2253118bb740b628e8221954c6f83222494a10920d153ef29754e9ae262111a7f0f4a8cc3b8e5b5ffd360e0cc74b4969252ad719626fda132b86b54a7699efd7a0e7d3230a8fd9ecfa4d39b7a71c37ab06dabe3707a400a06d33f6392a92302c8883514aa46e08c8ff7bdb64d196afb88d9694bdfa5f12142bb22c89ddc28b06ced70001337f5a98b8df94000aa29c98bd1f680d850c460fb842ce1cbd75ff7db860a8f35d3124fe8267bb4b8c1423df2e3c7ad4bbbbd30cca6e9a56cee83b833e665498aefea858010737baa017df4b0b4522eba51f66fa62959cc4f21eb32666d4a2b04750ea0d53580f85136d003adcf8a95d56a9478a0f9260736fadbc7ac8ff8136cf0842fbd939f235305ef616a5fbb60f2da2ad1dd7632eef3907b5e85bbf464d2d41f69f6eefa10b673d0d298b154f344094cb37fe89c0e74597f565907737106be3aeb9fac90b3c23817e50cb602c262a991198f4c6de446a788404dccf7d200bf245374c57352a0737e895a34af3d50c4097aa28fcc2cabc57fd1f9eade785c2f603b61c9cece42d32e4f82cf3b381d9f4bc08045aa2f21dcf24358272f606f9d03b2edc81aa7ea89d3776744d88fa2324a13d5dd48200843a924869eb18036a90dd471dd5d50171c8c00ddb823a09da1b71d1cf5e3c65b5d0936f4ceb9d76263d6a6e146873fa5658d10670453e49b333f7274e32330e159efd2246b40d628f91d4b32232261f0209162dbacc64bdde6baeb851379db56540d3e21c42b84c9b013952573df179a6ac063fe67609005f6e0cd10088ee7f5c1d93a00e35ffda0fdb28c0c88ce4d73893c6c31219bb12a15e18ec848f98df3304aaf69a329cee2554fe602e977b8fe2a6860a1602d462022595e76258f05d893dc928163423d979a36b5ccac10c155de0dd2407e1ba5bc4b18e8e016947333159e07b10451d9de05d9d1c10844c38e3584e7b21104fddb7cdb2400b2f0f01b2d38627e1d212eab62e49f965c35a5c88e5c70294146357690795341cada066284b3e74afe46b37d78df8025bcc31474f1fa52fecfe43e68be406d201e5d9c48fd76b749b83a8cefa71e8fead48970dbc18d47fe0a88c1879e72d034887829d9a1a821e95526e381193cf43cb43eab815913c429ca822b20028eeb505ef2c45981ea369bdcc010808da935f325902aa9545d43e0dba6a139c6d3e6f75c24512a3b8916a2e4b72755e05d41af61d65c54717f52a4c6ac133aca12f7102c01d679ca693d7067e736e45f10ebb906712cce0050f4730b77b37769a2fc1fe8f4de732c76e55f1ad4e5002762f8e6c0c6f3fd95df0ef10fcaba810757ce02704f0164bbf84c3a934e2b91e170c7c3f3a11dd346143ad4ca83008fbcbd4b277732526d75a1fa3bcfa96fef14a2d324ff15d953358ada19228fe1de18c3fc2c7e977dc39309b1e528e0743cc492dd573934b44509d25b47277f495fd927a738d23a38a4e902438319e8d6fe6038542a310e1b400e734496e94cad859b6c140b706ee8c7ed5ae9dbb7f04de1db91296e51e20fa0704052e0349cdafdefa30d033509921a0665e0244652b4d5fecf10f0acc34a574d45e0d88bb59acf67fa6a38fbc7f8746fa25ee6e730d96b477190e1ef3c90e886e92300ab564158e111cef6caa38fbaf1119055b5fd7cadf11f4ffc7905af733444da512f24de07e52cca727e093eec9532564535e8ad73bf071c3cf018e48fec54fefa265a43cd22c43b4db378ae783fc0b0544aa89f0132a70766</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-default"> <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span> </label> </div> </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">Here's something encrypted, password is required to continue reading.</summary>
</entry>
</feed>