/
maml.ipynb
861 lines (861 loc) · 201 KB
/
maml.ipynb
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
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
},
"colab": {
"name": "maml.ipynb",
"provenance": [],
"collapsed_sections": []
},
"accelerator": "TPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "0YFgt88qsZkn"
},
"source": [
"# MAML Tutorial with JAX\n",
"\n",
"Eric Jang\n",
"\n",
"Blog post: https://blog.evjang.com/2019/02/maml-jax.html\n",
"\n",
"\n",
"21 Feb 2019\n",
"\n",
"Pedagogical tutorial for implementing Model-Agnostic Meta-Learning with JAX's awesome `grad` and `vmap` and `jit` operators.\n",
"\n",
"### Overview\n",
"\n",
"In this notebook we'll go through:\n",
"\n",
"- how to take gradients, gradients of gradients.\n",
"- how to fit a sinusoid function with a neural network (and do auto-batching with vmap)\n",
"- how to implement MAML and check its numerics\n",
"- how to implement MAML for sinusoid task (single-task objective, batching task instances).\n",
"- extending MAML to handle batching at the task-level\n",
"\n",
"## Installing Dependencies\n",
"\n",
"Download/clone the git repository and install dependencies.\n",
"\n",
"```\n",
"git clone https://github.com/ericjang/maml-jax.git\n",
"cd maml-jax\n",
"pip install -r requirements.txt\n",
"```\n",
"\n",
"You will also need to compile Jax/Jaxlib from source:\n",
"\n",
"```\n",
"git clone https://github.com/google/jax\n",
"cd jax\n",
"python build/build.py # optionally add --enable_cuda \n",
"pip install -e build # install jaxlib (includes XLA)\n",
"pip install -e . # install jax\n",
"```"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Xwru49MFsZko"
},
"source": [
"# import jax.numpy (almost-drop-in for numpy) and gradient operators.\n",
"import jax.numpy as np\n",
"from jax import grad"
],
"execution_count": 2,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "TRkSHUM4sZkp"
},
"source": [
"## Gradients of Gradients\n",
"\n",
"JAX makes it easy to compute gradients of python functions. Here, we thrice-differentiate $e^x$ and $x^2$"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "VI8EcmTMsZkp",
"outputId": "90f89341-0e03-4c15-c391-ca85c11f193b"
},
"source": [
"f = lambda x : np.exp(x)\n",
"g = lambda x : np.square(x)\n",
"print(grad(f)(1.)) # = e^{1}\n",
"print(grad(grad(f))(1.))\n",
"print(grad(grad(grad(f)))(1.))\n",
"\n",
"print(grad(g)(2.)) # 2x = 4\n",
"print(grad(grad(g))(2.)) # x = 2\n",
"print(grad(grad(grad(g)))(2.)) # x = 0"
],
"execution_count": 22,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"2.7182817\n",
"2.7182817\n",
"2.7182817\n",
"4.0\n",
"2.0\n",
"0.0\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mUSrRkXxsZkq"
},
"source": [
"## Sinusoid Regression and vmap\n",
"\n",
"To get you familiar with JAX syntax first, we'll optimize neural network params with fixed inputs on a mean-squared error loss to $f_\\theta(x) = sin(x)$."
]
},
{
"cell_type": "code",
"metadata": {
"id": "PZorDFKlsZkq"
},
"source": [
"from jax import vmap # for auto-vectorizing functions\n",
"from functools import partial # for use with vmap\n",
"from jax import jit # for compiling functions for speedup\n",
"from jax import random # for initializing network parameters\n",
"\n",
"from jax.example_libraries import stax # neural network library\n",
"from jax.example_libraries.stax import Conv, Dense, MaxPool, Relu, Flatten, LogSoftmax # neural network layers\n",
"import matplotlib.pyplot as plt # visualization"
],
"execution_count": 4,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "rudgtAmmsZkq"
},
"source": [
"# Use stax to set up network initialization and evaluation functions\n",
"net_init, net_apply = stax.serial(\n",
" Dense(40), Relu,\n",
" Dense(40), Relu,\n",
" Dense(1)\n",
")\n",
"in_shape = (-1, 1,)\n",
"rng = random.PRNGKey(0)\n",
"out_shape, net_params = net_init(rng, in_shape)"
],
"execution_count": 5,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "39zwRvXRsZkq"
},
"source": [
"def loss(params, inputs, targets):\n",
" # Computes average loss for the batch\n",
" predictions = net_apply(params, inputs)\n",
" return np.mean((targets - predictions)**2)"
],
"execution_count": 6,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"id": "gd3MqJMCsZkr",
"outputId": "4014ecc2-3024-4705-fde7-19f8a88aa509"
},
"source": [
"# batch the inference across K=100\n",
"xrange_inputs = np.linspace(-5,5,100).reshape((100, 1)) # (k, 1)\n",
"targets = np.sin(xrange_inputs)\n",
"predictions = vmap(partial(net_apply, net_params))(xrange_inputs)\n",
"losses = vmap(partial(loss, net_params))(xrange_inputs, targets) # per-input loss\n",
"plt.plot(xrange_inputs, predictions, label='prediction')\n",
"plt.plot(xrange_inputs, losses, label='loss')\n",
"plt.plot(xrange_inputs, targets, label='target')\n",
"plt.legend()"
],
"execution_count": 7,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7febac9f33d0>"
]
},
"metadata": {},
"execution_count": 7
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "AUrhuTYJsZkr"
},
"source": [
"import numpy as onp\n",
"from jax.example_libraries import optimizers\n",
"from jax.tree_util import tree_map # Element-wise manipulation of collections of numpy arrays "
],
"execution_count": 8,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "O9n5l-a1sZkr"
},
"source": [
"opt_init, opt_update, get_params = optimizers.adam(step_size=1e-2)\n",
"opt_state = opt_init(net_params)\n",
"\n",
"# Define a compiled update step\n",
"@jit\n",
"def step(i, opt_state, x1, y1):\n",
" p = get_params(opt_state)\n",
" g = grad(loss)(p, x1, y1)\n",
" return opt_update(i, g, opt_state)\n",
"\n",
"for i in range(100):\n",
" opt_state = step(i, opt_state, xrange_inputs, targets)\n",
"net_params = get_params(opt_state)"
],
"execution_count": 9,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"id": "D15Vsj_XsZks",
"outputId": "b98a380e-5d37-4168-f5bc-9234a9d3fe62"
},
"source": [
"# batch the inference across K=100\n",
"targets = np.sin(xrange_inputs)\n",
"predictions = vmap(partial(net_apply, net_params))(xrange_inputs)\n",
"losses = vmap(partial(loss, net_params))(xrange_inputs, targets) # per-input loss\n",
"plt.plot(xrange_inputs, predictions, label='prediction')\n",
"plt.plot(xrange_inputs, losses, label='loss')\n",
"plt.plot(xrange_inputs, targets, label='target')\n",
"plt.legend()"
],
"execution_count": 10,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7febaa316cd0>"
]
},
"metadata": {},
"execution_count": 10
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3hUVf7H8feZyaQXSIMAgSSQAimE0LtIERCQKlLswFrQFVddLKtbdEVw9ecqFhQFBKQJgnSkSC8BQ00ILSGEmpCE9Ew5vz8mUtxQM8lNJuf1PPMkuXPn3k+Sme+ce+bec4SUEkVRFMX+6bQOoCiKolQOVfAVRVFqCFXwFUVRaghV8BVFUWoIVfAVRVFqCAetA9yMr6+vDAoK0jqGoihKtbJ3794MKaVfWfdV2YIfFBREfHy81jEURVGqFSFE6s3uU106iqIoNYQq+IqiKDWEKviKoig1RJXtw1cUxX4YjUbOnDlDUVGR1lHshrOzMw0aNMBgMNzxY1TBVxSlwp05cwYPDw+CgoIQQmgdp9qTUpKZmcmZM2cIDg6+48epLh1FUSpcUVERPj4+qtjbiBACHx+fuz5iUgVfUZRKoYq9bd3L39PuCn5esYnJq5NIycjXOoqiKEqVYncFv6DYxIztKXywOknrKIqi2KlNmzbRr18/AJYtW8akSZNuum52djaff/751Z/Pnj3L0KFDKzxjWeyu4Pt7OvNM18asOnSe3acuax1HUZRqxGw23/VjBgwYwMSJE296/x8Lfr169Vi0aNE95Ssvuyv4AGM7h1DX05n3VhzBYlEzeimKAikpKURERDBq1CiaNm3K0KFDKSgoICgoiL/+9a/ExcWxcOFC1q5dS/v27YmLi2PYsGHk5eUBsHr1aiIiIoiLi2Px4sVXtztjxgzGjx8PwIULFxg0aBDNmzenefPmbN++nYkTJ3LixAliY2N59dVXSUlJISoqCrB+mP3kk08SHR1NixYt2Lhx49VtDh48mN69exMaGsprr71mk7+BXZ6W6eKo59UHwvnLwv0s23+WgS3qax1JUZRS//j5MEfOXrHpNpvV8+Sd/pG3Xe/o0aNMnz6djh078tRTT11tefv4+LBv3z4yMjIYPHgwv/zyC25ubnzwwQd89NFHvPbaa4wdO5YNGzbQpEkThg8fXub2X3zxRbp27cqSJUswm83k5eUxadIkDh06REJCAmB94/nd1KlTEUJw8OBBkpKS6NWrF8nJyQAkJCTw22+/4eTkRHh4OC+88AKBgYHl+jvZZQsfYFCL+kTV92Ty6iSKjHd/mKYoiv0JDAykY8eOAIwePZqtW7cCXC3gO3fu5MiRI3Ts2JHY2FhmzpxJamoqSUlJBAcHExoaihCC0aNHl7n9DRs28OyzzwKg1+vx8vK6ZZ6tW7de3VZERASNGjW6WvC7d++Ol5cXzs7ONGvWjNTUm46JdsfssoUPoNMJ3uzbjBFf72T61lM8362J1pEURYE7aolXlD+eyvj7z25uboD1gqaePXvyww8/3LDe763zyuTk5HT1e71ej8lkKvc27baFD9C+sQ+9mtXh843HuZRbrHUcRVE0dvr0aXbs2AHA3Llz6dSp0w33t2vXjm3btnH8+HEA8vPzSU5OJiIigpSUFE6cOAHwP28Iv+vevTtffPEFYP0AOCcnBw8PD3Jzc8tcv3PnzsyZMweA5ORkTp8+TXh4ePl/0Zuw64IPMLFPBMUmCx+tS9Y6iqIoGgsPD2fq1Kk0bdqUrKysq90vv/Pz82PGjBmMGDGCmJgY2rdvT1JSEs7OzkybNo0HH3yQuLg4/P39y9z+J598wsaNG4mOjqZly5YcOXIEHx8fOnbsSFRUFK+++uoN6z/33HNYLBaio6MZPnw4M2bMuKFlb2tCyqp5FkurVq2krSZA+cfPh5m5PYVVf+5CeF0Pm2xTUZQ7l5iYSNOmTTXNkJKSQr9+/Th06JCmOWyprL+rEGKvlLJVWevbfQsf4M/dQ3F3cuC9lYlaR1EURdFMjSj4tVwdebF7KJuTL7Hp6EWt4yiKooGgoCC7at3fixpR8AEeax9EkI8r/16ZiMls0TqOoihKpasxBd/RQcfEPhEkX8hjfnya1nEURVEqXY0p+AAPRNalTZA3H69LJrfIqHUcRVGUSlWjCr4Qgrf6NSUjr4QvNp3QOo6iKEqlqlEFHyCmQS0GtajPN1tPcSarQOs4iqJUEnd3d60jaK7GFXyAVx8IRwCTVx/VOoqiKEqlqZEFv14tF8Z2DmHZ/rMkpGVrHUdRlEokpeTVV18lKiqK6Oho5s+fD8C5c+fo0qULsbGxREVFsWXLFsxmM0888cTVdT/++GON05eP3Q6edjvP3NeYeXvSeHf5ERY+017Nt6kolWXVRDh/0LbbrBsNfW4+69T1Fi9eTEJCAvv37ycjI4PWrVvTpUsX5s6dywMPPMCbb76J2WymoKCAhIQE0tPTr56/n51dvRuINbKFD+Du5MBfeoURn5rFqkPntY6jKEol2bp1KyNGjECv11OnTh26du3Knj17aN26Nd999x1///vfOXjwIB4eHoSEhHDy5EleeOEFVq9ejaenp9bxy8UmLXwhxLdAP+CilDKqjPsF8AnQFygAnpBS7rPFvsvj4VaBzNiWwqRVSXRv6o+Tg17rSIpi/+6wJV7ZunTpwubNm1mxYgVPPPEEL7/8Mo899hj79+9nzZo1fPnllyxYsIBvv/1W66j3zFYt/BlA71vc3wcILb2NA76w0X7LRa8TvPlgU05fLmDm9hSt4yiKUgk6d+7M/PnzMZvNXLp0ic2bN9OmTRtSU1OpU6cOY8eOZcyYMVdnwLJYLAwZMoR3332Xffs0b6eWi01a+FLKzUKIoFus8hAwS1qH5twphKglhAiQUp6zxf7vhpSSAlMBmYWZeDh60CXMj/vC/fh0w3GGtgzE282xsiMpSqXJLc4jJfsc7oZaOOvc0ekE/h5ONeozrEGDBrFjxw6aN2+OEILJkydTt25dZs6cyZQpUzAYDLi7uzNr1izS09N58sknsVisw7G8//77Gqcvn8r60LY+cP14BmdKl1VKwU/LTWPVqVWsTVlL6pVUisxFV+/zdvamvm8wJZneTF7nzqSBHSsjkqJUKKPZwrbjGew7c47NZ1eTVryLEt150F+biEOaHbEYa+NqjqZb/QcZGt2CNsHedlv8f5+MXAjBlClTmDJlyg33P/744zz++OP/87jq3qq/XpU6S0cIMQ5rlw8NGzYs9/YOZRxiyp4p7Lto/YfF+cfxcPjD+Lj44OPsQ05xDsezj3Ms6xiOfutYnrWB/F96Mj5uDOHeFTfrjKJUpPM5RYz9YQ3Hihfj4HkQoTPi6hBIHUMcvs718XPxx0gueaYMLhadJrVgA6uzf2HFmoa08HyEb4ePVJ9n2anKKvjpwPXTrTcoXXYDKeU0YBpYJ0C5151lF2Xz39/+y6LkRfi6+DKh5QT6BPUhwD3gpo/Zd+4ojy38Pzanb2Lr2V8YFzOOMTFjMOgM9xpDUSrd1mMXGL/iU0xeK3F109M3eAAjmz5MM59mN31MRmEGi5OXMfPgDxwwTabHrM3MGfweDWuVPauTUn1V1mmZy4DHhFU7IKei+u9Tr6TS/6f+LD62mNHNRrNs4DKeinrqlsUeIC4gnOdi/kLO0ddo6duNz/d/zqgVoziedbwiYiqKzf13807GrX8Kc+2ltK7ThpWDf+bdTn+/ZbEH8HXxZVzzp9gwYjld/UeSpdtD/yUDWJK0ppKSK5XFJgVfCPEDsAMIF0KcEUI8LYR4RgjxTOkqK4GTwHHga+A5W+y3LIEegfQJ7sP8fvN5rfVruDve+fgZT3UMpr6nD2ePDeI/XT/iQsEFRq0cxa5zuyoqrqLYxHu/rOWrYy/h6JzJ39u9x7d9vqCuW9272oaT3onP+rzO32K/xlxSm7d3vsp/93xXQYkVLdSIOW3vxtKEdP48L4EpQ2Po2syJP637E6lXUpnSdQrdG3av9DyKcjsTVy5k+flJOOs9mNv/W8K8Q8q9zT2p5xmzcgIW10P0CXyESd1eRyfuvX1YFea0tUdqTttyGtC8Hs0Da/Hh2qO4O3gzo/cMmvo05eVNL/PT8Z+0jqcoN3hl5fcsv/geHg51WDZ4nk2KPUDrRnVZMuwrnAo6syptHs+sfp2q2jhU7pwq+H8ghOBvDzblwpVipm0+iZeTF1/3/Jq2ddvy9ra32XB6g9YRFQWAT7etZfWFj/DSBbPy4R+o53F3XTi3E+LryarRH+FZ/AA7Lq7ktfVTbv+gKio7O5vPP/+8wvfz008/ceTIkQrfz71SBb8MrYK8eTA6gK9+PcmFK0W4Glz55P5PiPSJZOKWiRzOPKx1RKWGW564n6+O/g0nfFg85BtqO3tVyH78PJxZPuo93Eraszr9e97bUj2HFbjbgi+lvHqx1d1QBb+a+mvvCMwWyZQ11jHzXRxc+LT7p9R2qs349eM5l1fpFwkrCgAHzqXx+vYX0QkdM/tOo46bT4Xur7abE8tHfIyzMZIfTvwfX+xeVqH7qwgTJ07kxIkTxMbGMmHCBLp3705cXBzR0dEsXboUgJSUFMLDw3nssceIiooiLS2Nf/3rX4SHh9OpUydGjBjBhx9+CMCJEyfo3bs3LVu2pHPnziQlJbF9+3aWLVvGq6++SmxsLCdOVL1Z9arUhVdVSUMfV57oGMTXW07yZMcgIut54eviy9TuU3l01aOM3zCe2X1n4+LgonVUpQbJLy7hyRUvgj6XDzp9QVQd2/TZ346vuxtLh33Fg4tG8vnhf9E1OJpmfsH3tK0Pdn9A0uUkm+aL8I7gr23+etP7J02axKFDh0hISMBkMlFQUICnpycZGRm0a9eOAQMGAHDs2DFmzpxJu3bt2LNnDz/++CP79+/HaDQSFxdHy5YtARg3bhxffvkloaGh7Nq1i+eee44NGzYwYMAA+vXrx9ChQ236+9mKauHfwvPdmlDLxcB7KxKvfmDVpHYTpnSdQnJWMv+J/4/GCZWa5tEf36PEcJzRoX+hT2jbSt13PS8vPrrvQ6SEsatewmg2Vur+bUVKyRtvvEFMTAw9evQgPT2dCxcuANCoUSPatWsHwLZt23jooYdwdnbGw8OD/v37A9YhGrZv386wYcOIjY3lT3/6E+fOVY8jftXCvwUvFwMv9QjjnWWHWZ94kR7N6gDQqX4nnoh8ghmHZ9ChXgfub3i/xkmVmuDDX1eSXLKEJq5d+GunUZpk6Na4Kd0Pv8CGrClMWPcen/X++11v41Yt8cowZ84cLl26xN69ezEYDAQFBVFUZB1fy83N7baPt1gs1KpVi4SEhIqOanOqhX8bI9s2JMTPjX+vSsRovvYhzostXqSpd1Pe3v42F/IvaJhQqQl2p6Yx4/i/ccKPWQ99oGmWKX1H41bUlV8v/MiK479omuVOeXh4kJtrHTguJycHf39/DAYDGzduJDU1tczHdOzYkZ9//pmioiLy8vJYvnw5AJ6engQHB7Nw4ULAesSwf//+/9lPVaQK/m0Y9Dre6NOUk5fymbvr9HXLDUzuMpkScwlvbH0Di7z7T/QV5U4Ulph5bs0bCH0e/73/Izyd7vzq8Yrg6KDj8z5vYymqx9vb/k5OcY6mee6Ej48PHTt2JCoqioSEBOLj44mOjmbWrFlERESU+ZjWrVszYMAAYmJi6NOnD9HR0Xh5Wc+GmjNnDtOnT6d58+ZERkZe/eD3kUceYcqUKbRo0aJKfmiLlLJK3lq2bCmrCovFIkdM2yFj/7FGZheU3HDfoqOLZNSMKLng6AKN0in27umF38moGVHyrY2faB3lBq8uXSkjv4uRz6/5623XPXLkSCUksr3c3FwppZT5+fmyZcuWcu/evRonulFZf1cgXt6krqoW/h0QwjozVnahkakbbxxMbXDoYFrXbc3Hez8mozBDo4SKvVp56BQ7sr/GS9+Qt7s8q3WcG/ytVw8ccu/j13Mr2HF2h9ZxKsS4ceOIjY0lLi6OIUOGEBcXp3WkclEF/w5F1vNiaFwDZmxL4XRmwdXlQgj+1u5vFJmKmLxnsoYJFXuTmVfMG5umoHPI5f+6v1flhur2cDbwl9bjsZT4MPHXdyg0FWodyebmzp1LQkICSUlJvP7661rHKTdV8O/CKw+Eo9cJPlh94znEwV7BjI0ey6pTq9ievl2jdIq9eemnZZjct9K70RBaBcRqHadMI9s0wb9kNJdLzvHZvltfySrVWDw2dS9/T1Xw70IdT2f+1DWEFQfPsTf18g33PR39NEGeQfxr578oMhXdZAuKcmd2nbrE3vyvcXfw5u+dXtE6zk3pdYL3eg+kJLsVsxNnk3ql7DNenJ2dyczMVEXfRqSUZGZm4uzsfFePU+fh36VxXUL4Yfdp/rk8kSXPdkCns87/6ah35K12bzFm7RhmJ85mTPQYjZMq1ZWUktfXzkDvfI432n6Am+H254ZrqUNjX9rWGsVvloNM3v0hU3t8+j/rNGjQgDNnznDp0iUNEtonZ2dnGjRocFePUQX/Lrk6OvBKr3BeXXSAnw+c5aHY+lfvaxvQlvsC7+Obg98wqMkgfFwqdowTxT79+NtJLuiX0NAlgv5N+mgd5478+b44Rizoxmbdanae20m7gHY33G8wGAgOvrehGBTbUV0692BIXAOaBXgyefVRiozmG+6b0HICRaYivtj/hUbplOqs2GRm0o4v0Bly+XfXNxFCaB3pjrRs5E0ztwfRmb2ZsmcKZov59g9SKp0q+PdApxO89WBT0rML+XbbqRvuC/EKYVjYMBYlL+Jk9kmNEirV1dTN8RS5bqCV7/20qFM1P6i9mT91Dif/XG+Ss5JZcnyJ1nGUMqiCf486NPGlR9M6fL7xBBl5xTfc92zss7g4uPDR3o80SqdUR0VGMzOSvkQnJO92fU3rOHetV2RdAgxtcTY34bPfPqPAWHD7BymVShX8cni9bwRFRjMfr0u+Ybm3szdjosfw65lf2XN+j0bplOrm2907sbjupWeDIdR3r3/7B1Qxep1gTKcQLqf1ILMok3lH52kdSfkDVfDLobGfO6PbNeKH3adJvnDjgEmjmo7Cz8WPqQlT1aloyh2ZlTgNHY682fE5raPcs2GtGuBOKLWI5ttD35JXkqd1JOU6quCX04vdQ3FzcuDfKxNvWO7s4MzT0U+z98Jedp/frVE6pbpYemQP+YZ9tPMZiLeLt9Zx7pmrowOj2zXk7Kmu5BTn8H3i91pHUq6jCn45ebs58uL9oWw6eonNyTeeYzw0bCj+rv6qla/c1id7P0Oanfn7fdW3df+7x9sHoTc2JMChNbMOz6oWo2nWFKrg28BjHRrR0NuVf69MxGy5Vtid9E6Mix7Hbxd/Y8c5+xxcSim/baf3ccmyj2Zu/annUX1b97/z93Tmodh6nD7ZiXxjPjMOz9A6klJKFXwbcHLQM7FPBEnnc1kYn3bDfYNCBxHgFqBa+cpNvbfjE6TJlbc6jdM6is2M7RJCUX4dQlw6MidxDtlF2VpHUlAF32b6RNWlVaPafLg2mbxi09XljnpHxsaM5cClA2w7u03DhEpVdODiIdKK9hEgHiCmfl2t49hMWB0Puob5cfpkBwpNhcxNmqt1JAVV8G1GCMFb/ZqRkVfMl5tunOlmYOOB1HGtw/SD0zVKp1RV7+/4HGl2YnzLx7WOYnPjuoRwOdubcI/2zEmcQ74xX+tINZ4q+DYUG1iLAc3r8fWWk5zNvjY2uEFv4PHIx4m/EE/Cxeo38bFSMU7lnOJQ1lZcirrQLzpE6zg216GxD00DPLl0piNXSq6w8OhCrSPVeKrg29hrvcORwJQ1R29YPiR0CF5OXkw/pFr5itWHu75ESj1PRj6KXlc9xsy5G0IIxnUJJvWsL+Geccw8MpNic/HtH6hUGFXwbaxBbVfGdApmyW/pHDhz7YMqV4MroyJGsSltE8ezjt9iC0pNcD7/PFvOrUHktuXxdtFax6kw/WLqUdfTmZLMbmQUZrD0+FKtI9VoquBXgGfva4yvuyPvLk+84cycEREjcHFw4bvD32mYTqkKPt83HYuU9A8agZuT/Y5SbtDreLJjEAeO+xLqFcm3h77FZDHd/oFKhbBJwRdC9BZCHBVCHBdCTCzj/ieEEJeEEAmlN7ueHcTD2cCEnmHsTrnMmsPnry6v5VyLIaFDWHlyJWfzzmqYUNFSTnEOy04uwXQlluc6t9Y6ToUb0bYh7k4GXPJ7kJ6XzvrT67WOVGOVu+ALIfTAVKAP0AwYIYRoVsaq86WUsaW3b8q736pueKtAQv3deX9VEiUmy9Xlj0daz8aYnThbq2iKxuYmzsdMMe28B9OgtqvWcSqcp7OB4a0D2Xm4LvXcApl1ZJbWkWosW7Tw2wDHpZQnpZQlwDzgIRtst1pz0Ot488GmpGYWMGtHytXldd3q0iuoF4uPLVYDS9VARrORWYfnYMoLZXynzlrHqTRPdgwCdASInhy4dECdraYRWxT8+sD1l5eeKV32R0OEEAeEEIuEEIFlbUgIMU4IES+EiLeHuS/vC/enS5gfn244TnZBydXljzV7jHxjvpokogZanbKaPNNl6ul60bJRba3jVJoGtV3pGx1A/MHGeDh6qla+RirrQ9ufgSApZQywDphZ1kpSymlSylZSylZ+fn6VFK1ivdm3KblFRj5Zf+zqskjfSOL845iTOEdNBVeDSCn54rfvMBf780zrvtVm+kJbGds5mLwiPeGuvVh/ej1puWm3f5BiU7Yo+OnA9S32BqXLrpJSZkopfz8B9xugpQ32Wy2E1/VgeOuGfL8jlVMZ1640fLTZo6TnpbMhbYOG6ZTKFH8hnrT8YzjmdaV/8+o3wUl5xTSoRdtgbxKTotEJHXMS52gdqcaxRcHfA4QKIYKFEI7AI8Cy61cQQgRc9+MA4MbB4+3cyz3DcHLQ8cGqpKvLugV2o757fb4/osYLrym+SvgOaXJjRORAnA16reNoYlyXEM5nORHl1ZXFxxZzpeSK1pFqlHIXfCmlCRgPrMFayBdIKQ8LIf4phBhQutqLQojDQoj9wIvAE+Xdb3Xi5+HEM10bs/rwefakXAZAr9Mzqukofrv4G4cyDmmcUKloaVfS2HVhK6bsdjzeLkzrOJrpFu5PiJ8b59NaU2gqVBdiVTKb9OFLKVdKKcOklI2llO+VLntbSrms9PvXpZSRUsrmUspuUsqkW2/R/ozpHEIdTyfeXXHtYqxBTQbhZnBTh7Y1wPdH5oIUdAl4iLpezlrH0YxOJxjbOYRjabVo7BHJvKR5WKTl9g9UbEJdaVtJXBz1vNIrnP1p2Sw/cA4Ad0d3BjQewJqUNWQWZmqcUKkoBcYCFh9bgvFKNM92itU6juYGtaiPj5sj8konTueeZmv6Vq0j1Riq4FeiwXENaBrgyQerkyg2Wc/OeSTiEYwWI4uPLdY4nVJRlh7/mWJLPmEuD9CiYc05FfNmnA16HmsfxP6kQGo7+fBD0g9aR6oxVMGvRHqd4M2+TTmTVcjsnacBCPEKoV1AO+Yfna/GGLFDUkq+2T8bc1EAL3d5QOs4Vcbodg1xcnDEV3Zla/pWUq+kah2pRlAFv5J1CvWlQ2Mfvth0gsISayt/RMQILhRc4Ne0XzVOp9ha/Pl4Lhan4Gu5n65h9nFtiS34uDsxtGUDDiVG4iAcmJc0T+tINYIq+BqY0DOMjLxiZu+0tmq6NuhKgFuAOrS1Q/+3ZwbS7MKL7R6ucRda3c7TnYIxGt1o6NSOn47/RIGxQOtIdk8VfA20DvKmc6gvX/56gvxiE3qdnofDH2bX+V2cyD5x+w0o1cL5/PMcuLwV56L2DIwJ0jpOlRPi506PpnVIOdWCPGMeK06t0DqS3VMFXyMv9QgjM7+EWTusrfwhoUNw1DmqQ1s78tmeuSAsPBb5CA569VIry7guIeRk18PPMYgFRxfcMH+EYnvqWaiRlo1q0zXMj2mbT5BXbKK2c216BfVi+cnl6tDWDpgsJlal/gQF4Yxpb/9j3t+rVo1q0zywNvkZbUi6nMTBjINaR7JrquBraELPMLIKjMzYdgqAh8MfJs+Yx+qU1RonU8rr5+T1lJBFxzr9cXW03xmtyksIwbjOIVw4F4mTzoX5R+drHcmuqYKvodjAWnSP8OfrLae4UmQk1i+WJrWasODoAq2jKeU0LWE2FqMnr3YaqHWUKu+ByDo08KqFc3Fr1qSsIac4R+tIdksVfI291COMnEIjM7alIITg4fCHOZx5mMMZh7WOptyjU9mnOVOcQH39fTT299I6TpXnoNfxdKdgzqbFUmwuVuPrVCBV8DUW3cCLns3q8PWWk+QUGukX0g8XBxcWJi/UOppyj/6zYyZS6nim5Uito1QbD7cKxF00xIMmLExeqD68rSCq4FcBL/UIJbfIxPStp/Bw9KBvcF9WnlpJbkmu1tGUu1RiLmHrhZU4FkfxUFRZUzsrZXFzcmBUu0ZknI0j5UoKu8/v1jqSXVIFvwqIrOdF78i6fLv1FNkFJQwLH0ahqZCfT/ysdTTlLn1/YDlmkUffRoPR69SFVnfjiQ5ByPwYDMKNH5N/1DqOXVIFv4p4qWcoecUmvt5ykkifSCJ9Ill0bJE6tK1m5h5ZiKXEm5c6Pah1lGqnjqczA2KCKM5qwS+nf+Fy0WWtI9kdVfCriIi6njwYE8CMbSlczi9hSNgQjmUdU+clVyMnslK4aDpEiPP9+LrX3DHvy2Nsl2AKM1tjtBjVEW4FUAW/CnmpeygFRjPTNp+kb3BfXBxc+PGYOrStLj7ZNRspdTwd+7DWUaqtiLqedGwUia44iAVH1Ye3tqYKfhUSWseD/jH1mLUjhcJiB/oG92XVqVXkleRpHU25DaPZyJbzq3AoiqR/ZITWcaq1sZ1DyM9szencVOIvxGsdx66ogl/FvNg9lKLSVv6Q0CEUmgpZeWql1rGU2/gpeR0mcYWu9fqpD2vLqXOoLyEuHRAWF/XhrY2pgl/FNPF3Z2BsfWbtSMHfqQlhtcNUt0418N2BH7AYvXixfT+to1R71uEWIijOjmVNylqyi7K1jmQ3VMGvgl7oHorRLPnq11MMDRvKkcwjHMk8onUs5SbO5NQR778AACAASURBVJ4hrXA//nShsZ+n1nHswoDm9fA0dsIkjfx8Un14ayuq4FdBwb5uDGpRnzm7Umnj2wNnvbM6tK3Cpsb/gARGRw7TOordcHTQ8WSbDpgLA/khUZ2ebCv2WfBNJVonKLcX7w/FZJF8v/0ivYJ6sfLUSjVschVkspj4Je1nKAjnkbhorePYlVFtGiFy25KWd1Kdnmwj9lfws1Lg87aQVL1nz2no48rQuAbM3X2argEPkmfMY13qOq1jKX+wMXULRTKL2NoP4OakhkG2JS9XAwPDHkRaHJl9WI0gawv2V/A96oGjOywdD1fOaZ2mXMbf3wSLRbL5gAdBnkEsPrZY60jKH3ydMA+LyZ0/teqvdRS79EznZpiuxLDu9Gryjflax6n27K/gOzjC0G/BVARL/gQWi9aJ7lmgtysPtw5kfnwa3Rv0Z9/FfZzMOal1LKVURmEGiTk7cS5qS8fG/lrHsUuB3q609umDSRaz9Fj1PmqvCuyv4AP4hkLv9+HUr7DjM63TlMvz3ZoAcDq1GQ7CgSXHlmicSPnd7EM/grDQL/ghdOrc+wozoXMPzMX+fHeghsyGdfJXSFxeIZu2z4IPEPc4NO0P6/8JaXu0TnPP6tdy4ZHWDVm27wpt6nRi2YllGM1GrWPVeFJKFiX/iCk/mCfbtNE6jl2La+RNgOjK+eJkEjOOah2nYiWvgTnDYPNksJhtvnn7LfhCQP//gmc9mPUQHK2+88Q+160xOp2gJKs1l4sus+nMJq0j1Xh7zu8hx3SOBg73EeTrpnUcu/d86+FIi57/2zVb6ygV5/ASmDcS/JvC6CWg09t8F/Zb8AFcveHptdYunnkjYPfXWie6JwFeLoxs05DNB7zxdfZX5+RXAdP3z0OanXk0Rl1ZWxkGxoThVBLDzkvrKDYVax3Htixma21a9BQ0aA2PLwM3nwrZlU3OIxNC9AY+AfTAN1LKSX+43wmYBbQEMoHhUsoUW+z7tjzqwpMrYdHTsPIVSNkCnf8CAc3vfZsFlyHrlPUsoCtnIe8CFOdabyV51qMLhPUd2tENnDytNzcfcPMHd39w9QEXb3D2Av3t/w3P3deYH3afxtPUge1nl3Iu7xwB7gH3/jso9yynOIedFzZhyW3FwNhgrePUCDqdYGCTQSw48zbT9i7jhbZ2cpHb8fWw7h24cBAad4fh31trRgUpd8EXQuiBqUBP4AywRwixTEp5/VgATwNZUsomQohHgA+A4eXd9x1zdINH5sCvk2Hn53BkKTS+H6IfhrpR4BtuPbvndxYLFGTAlXTISoXMY5B5AjKOweUTUJh14/aF7lpRN7hYC760WN+5S/KtbwS3OqXMxRvc64C7X+nXOuDmV3rzBVdf/F1qMa6lF1/91hjnxvDTiZ94tvmzt//dpQRzCRgLoKQAjIVgKgRjkfWr2WjNaTFd+12EDvQGcHAGByfr38/RzXq6q6Ob9b4abNnx5Vgw0ta3D57ONftvcUcsFpDm0j7p36+YFdbXidBbG0bi9h96v9ypHwtmf8y8pB/vvOBLaX1uW0xgKr72/C/MhvxLkHfR+jU/w/q1IBOKcqy34lzra8dstObXG0DvZH1duNSy9iC4+oB7XWvD0iPA+tWznvWrwfV/fy9jIaTvhVNb4PgvkB4PtRpZzyxsNgh0FdvpIsp7ybIQoj3wdynlA6U/vw4gpXz/unXWlK6zQwjhAJwH/OQtdt6qVSsZH18BQ6MW5UD8t7Djc8i/aF2mc7AWXWkB5LV/9PU864NPY/BpAt6NwTvYusyzvvWffrt/lNlY+qS6CHmXoPCy9Y2jIPPGJ17eResRwy2uqh1Ttw5pBgOrskzo9I6lL5zSJ5bZBBajdX+mIusTDBtflq5zsD6Z9Qbr9zoH6wtXCOubxS1J64uwLL8fGd1u3Zuud30x0d14/y1dt63f/45SXns+yBtzDPUUGC2S+TkSZ4Oeq8WLsorW9Y+/PocoXf2Pj71ZVnFjvpu51ev5Dorqbd2w/T/8XhZLaYEssRZYs9H6XJR3cGq00F17Lv3P7dpz62O9iW89dCzPgkaUNqyk5VpRt5hKXwOmO983WBszbr7WOuBSy3rk7ehubfDoHa35zEYwF1sbS0XZ1iP9gkzIPV92g05nACcP63ZMRVB8xfr19983oLm10dn6aet+bEQIsVdK2aqs+2zRpVMfSLvu5zNA25utI6U0CSFyAB8g4w9BxwHjABo2bGiDaGVw9oJOE6D9C9bW+vmDcOGQ9R3/9xeekzt4NrC+U9cKtBb58h5m6Q3gGWC93YnivGstjvwM6xOsKIfNB45TK/MIuwJOszO4FR10HteKkxDWJ5lOb32SGpzBwcX61eBaenOx3hxcrEc1esdrLyq4ti1zibVFZCqyvvkU51m7q4yFpbeC617YpmsvPGmm7MIH1sJws+J4ffH4YwG+1ZvA79vUlR5ZlW5DWsrYTlmR/rit6/x+tHNd5iPmXI7m/caATF8cG4ffOtMN2xHXtnM1oyzjsWVkvXr/nb5x3+SNx2Zu8v/R6UtbwY7W56He4drzS+itjSKhu/b7XC3WpUeY0lz6JmG6tsxivPactJgZZCzgu6IDfOPsw7/8w6/9j37ft9Df2BDRl74eROlrwtHV+tx39rzWvermZ11+r2RpIzH3XOntvPVr0ZVrXb0GZ2sPgLMn+EdCow7WN5ZKVqWuBZdSTgOmgbWFX6E70zuAX7j1Fj20Qnd1T5zcrTfvG/uIIyOLeWbyOpx4l8W+AXTo+qFGAWumuVv+ibxyEMfwKegebK11nBonCPCdPYolDqm80PNj/D3KUahtRQhrIXf2tNaTKswWHUbpQOB1PzcoXVbmOqVdOl5YP7xV7pKPuxNPdGhCweVY1qduIKso6/YPUmyiyFTEqpSVmHKjGNlKzWqllSeihyMMOUzatEzrKNWOLQr+HiBUCBEshHAEHgH++J9YBjxe+v1QYMOt+u+VWxvbOQRDfjtM0sjykxVzRZ7yv9alrqPEkk9Dw32E1vHQOk6NNSKqDw7SnV/O/EyR0fYXJ9mzchd8KaUJGA+sARKBBVLKw0KIfwohBpSuNh3wEUIcB14GJpZ3vzVZbTdHnmzTvnSscDXRc2WZfXghlhIfRjXvpnWUGs2gN3B/g75YXA7x/e7DWsepVmxyDpCUcqWUMkxK2VhK+V7psrellMtKvy+SUg6TUjaRUraRUqoRwMppTKcQ9HltScs7pcYKrwQpOSkcyfoNS05rBjRvoHWcGu+5liMRwsL0hIVYLKrBc6fs+0pbO+blauDRmIFIiyPT98/TOo7dW5i8GKSOLvX6UNvN8fYPUCpU49qNaeQWyRXDNtYnXtA6TrWhCn419kyXZoj8WDalr1VjhVcgo8XI4uSfMOaF80TbclyhrdjUUzHD0Ttd4pNta7WOUm2ogl+NeTobeChkEBaKmf7bT1rHsVubz2wmz5SFt6Uz7UK8tY6jlOod/ACOwoXjhevZn5atdZxqQRX8au61br2gpA5zj6gp4CrK94cWYDF68FjzBxC2uFpVsQlXgyt9Q/pi8DzI55sPaR2nWlAFv5rzdHGkvX9f8sVJlh2pgKEoarjz+efZe2kHliutGNaykdZxlD94JGIY6IxsPLOGtMs3H45EsVIF3w683e1RkHr+b9ccraPYnUVHlwCSDnX64ONuu/FOFNto5tOMEM9QDLX28N22FK3jVHmq4NuBBp5+hLq156JlOztOVu+J26sSs8XM/KRFmPKb8HRbNYxCVSSE4JGmw9A5pzN//3ZyCtVscLeiCr6d+HPb0QiHAt7duFDrKHZj+9ntZBsvUtvcmXYhFTMhhVJ+D4Y8iKPOCZP7Tn7YfVrrOFWaKvh2onNge7wc6nKy+Bd2n7qsdRy78E3CPCwmN/7UaoCapLwK83T0pHfwAzjXSuDb7UmUmO5wSOQaSBV8O6ETOkZHDsfB7RSTftmsdZxqL6Mwg98yt+FQ0JrhrdSsVlXd0LChWEQxWezh5/1ntY5TZamCb0eGhg9Eh57DuWvZfiLj9g9Qburb/QuQmBnYZHDpJCdKVRbrF0uIVwge/nv5estJNb7UTaiCb0d8XXy5L7AbjrX28dG6I+pJf48s0sKPyT9iKQjhhc4dtI6j3AEhBEPDhmJ0SCE5K5ltx9Xo62VRBd/ODA8fBvp8EjK3sv2EetLfi/WntlMgLxJXuze+6lTMaqN/SH8cdY54+u9l2hY1PmNZVMG3M+3qtaOeWz3c/eL5aF2yauXfg0/jv0eaXJnY5Q4nylaqhFrOtegZ1BO9xz42H0vn6PlcrSNVOarg2xmd0DE0bChmp2PsO5fM5mOqL/9unLlygVMFO6mj70RkPV+t4yh36eGwhymRBbjWPsjXqpX/P1TBt0ODQgehFw5419nLx6qVf1c+2DoLhIXnW47WOopyD1r4t6BJrSb41NvL0oR0Llwp0jpSlaIKvh3ydfGlR6Pu6DzjSThziU1HL2kdqVowmU1sPr8cJ2M4g6JitY6j3AMhBMPChpFtPol0TGPG9hStI1UpquDbqeHhwymy5FEnIEn15d+hr/aswqK/zEONh6hRMaux/o374+LgQnDwAebsTCW/2KR1pCpDFXw71apOK4K9gqlddy8H03NYn3hR60hV3tzEeWD24OWOg7WOopSDh6MHfYL7cFns5kpJHgvi07SOVGWogm+nhBA8HPYw6YVJ1K9zWbXyb+PXE8nkiIO09O6Nm6M6FbO6ezjsYUosRTQJTmL61lOYzGq4BVAF3671b9wfZ70zYU0OceTcFdYcVnN/3sx/ds4C4PVOT2gbRLGJSN9Imvk0A88dnMkqYNWh81pHqhJUwbdjXk5e9A7uzeErGwny0/F/vyRjsahW/h+lZV3hZNF6AhxbEO7bUOs4io2MiBjBhaJU6gecZdpmNdwCqIJv9x6JeIRCUyHtYk6SdD6X1YdVS+eP3ts0H+GQx/Nxj2sdRbGh3kG98XLyIiDQ+jnWLjWKrCr49i7SJ5IYvxgO5q6isb8rH69Lxqxa+VflF5vYdnEpLtRlQPh9WsdRbMjZwZnBoYM5nreL2p75fLHphNaRNKcKfg0wMmIkp3NT6ds6l2MX81hxUM2K9bvPtm0E51QGNxmOTqiXg70ZHj4ci7QQ0zSRX5MvsTe1Zrfy1TO8BujVqBc+zj6cKF5DWB13PvlFtfIBzBbJguR5COnE+NaPaB1HqQD13evTNbArp4rX4+OuZ8qaozW6L18V/BrAoDcwLHwYW9O38Fhnd05cyleTRABL9idR7LSPdn69cHd01zqOUkFGhI8gqziL7q3OsvPk5Ro9dLIq+DXEsLBh6IWedMt6Iup68Mn6YzX+3OSp8T8gdCZeaf+U1lGUCtSuXjuCPIM4bVpHvVrOTFlbc1v5quDXEP6u/vRs1JOlx3/iufsDOZWRz9KEmtvK351yiYtiAw1dYgjzbqJ1HKUC6YSOkU1HcjjzEIPbG9mfls0vNfTKc1Xwa5CRTUeSa8wl37CTyHqefLL+GMYa2sqfvGUBOkMOf249RusoSiV4qPFDeDh6kG5ZS7CvG5NWJVJsMmsdq9KVq+ALIbyFEOuEEMdKv9a+yXpmIURC6W1Zefap3LtY/1hi/GL4PvF7XurRmNOXC1iyL13rWJXudGY+R/KX46mvR4+grlrHUSqBq8GVoWFD2ZC2nud7enPiUj6frj+udaxKV94W/kRgvZQyFFhf+nNZCqWUsaW3AeXcp1IOjzV7jLTcNHRuiTRv4MV/N9S8Vv7kTavQu5zhiajH1KmYNcjIiJEIBKdK1jAkrgFf/HqCQ+k5WseqVOV9tj8EzCz9fiYwsJzbUypY94bdqe9en1lHZvFSzzDOZBWyaO8ZrWNVmpwCI5vO/4gBd0ZHqVExa5K6bnXp1agXi48t5pUHGuHt5siriw7UqAZPeQt+HSnl71fxnAfq3GQ9ZyFEvBBipxDipm8KQohxpevFX7qkJu2oCA46B0Y1HcW+i/vw9b5Ai4a1+GzDcUpMNeNJ/8W2XeB2mH7BQ3BxcNE6jlLJHm32KHnGPNanL+e9gVEknrtSo67AvW3BF0L8IoQ4VMbtoevXk9bznG52rlMjKWUrYCTwf0KIxmWtJKWcJqVsJaVs5efnd7e/i3KHBocOxt3gzvdHvuflnmGkZxfWiDHDi01m5ifPRYeOF1qpcXNqomi/aFr4t2B24mzub+pL/+b1+HTDsRoz4fltC76UsoeUMqqM21LgghAiAKD0a5nnOkkp00u/ngQ2AS1s9hsod83N4MbQsKGsTV1LSN0SWjWqzdSNxyky2vdZCz/EJ2J03Ukb/+74uaoGRU31ZOSTpOelsyZlDf8YEImns4FXF+2vEdellLdLZxnwe1PpcWDpH1cQQtQWQjiVfu8LdASOlHO/SjmNajoKIQSzjszi5Z5hnMspYt7u01rHqjAWi+TL32YhdEYmtn9W6ziKhroGdqWxV2OmH5pObVcD/3gokgNncvhm6ymto1W48hb8SUBPIcQxoEfpzwghWgkhvildpykQL4TYD2wEJkkpVcHXWF23ugxoPIAfj/1IWD1oG+zN55tO2G0rf+XhFPKcNtHUswNNaqsLrWoyndDxVPRTHMs6xpb0LTwYHcADkXX4aF0yJy7laR2vQpWr4EspM6WU3aWUoaVdP5dLl8dLKceUfr9dShktpWxe+nW6LYIr5fdU1FMYLUbmJM1hQs8wLuYWM3eXfbbyP9o5C6Ev5PUOz2kdRakC+gT3IcAtgOkHpyOE4F8Do3Ax6Hlt0QG7HlhQnYRcgzXybESvRr2YlzSPZg0MdGjsw+ebTlBYYl+t/B0nz3NBrCXQJYYWdZprHUepAgw6A49HPs6+i/vYd2Ef/h7OvNO/GXtTs/hum/127aiCX8ONiR5DnjGPeUnzmNAzjIy8YmbvTNU6lk29v2UOOsMVXmun+u6VawaHDqa2U22mH7J2OgxqUZ/uEf5MWXOUUxn5GqerGKrg13Dh3uF0adCF2UdmE1nfmc6hvnz56wkKSkxaR7OJo+ezOVHyM76GxnQN7Kh1HKUKcXFwYXSz0Ww+s5nDGYcRQvDvwdE4Oeh4deF+u+zaUQVfYWz0WLKKs1hwdAEv9QgjM7+Emdvto5X/j42z0DlmMqHV8wghtI6jVDEjI0bi5eTF1ISpANTxdObt/pHEp2Yxc3uKtuEqgCr4CrH+sXSs15Hph6YTUc+R+8L9mLb5BHnF1buVn56dy4H8RdTSN6Z/aA+t4yhVkLujO09EPsGW9C0cuHQAgCFx9ekW7sfkNUmk2FnXjir4CgDjW4wnuzib2Udm81KPMLIKjNW+hfP2hu8QhiwmtHxBte6VmxoZMZLaTrX5POFzAIQQvD84BoNex2uLDmCxo64dVfAVAKJ8o+gW2I2Zh2cS7C/oHuHPtM0nyS0yah3tnmQW5LM7awGeNGFQxP1ax1GqMFeDK09GPcm2s9v47eJvANT1cuZv/ZqxO+Uys3akaJrPllTBV656PvZ5co25zDw8kwk9w8gpNPLdthStY92TdzZ8Aw45PB87XrXuldsaHj4cb2dvpv429eqyYS0b0DXMjw9WHyU10z66dlTBV64K9w6nd1BvZifOJsDbRK9mdfh6y0lyCqtXKz+7MI/NF+fjagljZPPuWsdRqgFXgytjosew6/wutqVvA37v2onGQSfspmtHFXzlBs/GPkuJuYQv93/JSz3CyC0yMb2ajTHyxob/IvW5PBP9gtZRlGpkePhwGrg34MP4DzFbrBcf1qvlwlv9mrLr1GVm76r+Z66pgq/cIMQrhKFhQ1mYvBAn10v0iarLd1tPkV1QonW0O5Kee44tlxbhWtKKJ1qq6QuVO+eod2RCywkczz7OT8d/urr84VaBdAnzY9KqJE5nFmiYsPxUwVf+x/Oxz+Pq4MqU+Cm81COMvBIT32ypHq38NzZ9gJSS8S1eVH33yl3r2agnsX6xfJbwGQVGa3EXQjBpcDQ6IXjtx/3VumtHFXzlf9R2rs0zzZ9hW/o2LpoS6BsdwHfbTnE5v2q38g9eOsi+y+txLezGyLhYreMo1ZAQgldav0JGYQbfHf7u6vJ6tVx468Gm7Dx5mTnVeBhxVfCVMo2IGEEjz0ZMiZ/C+G7BFBjNfL3lpNaxbkpKyd+2vI/F5M5zLcah16nWvXJvmvs154GgB5hxaAZn885eXT68dSCdQ315f2UiaZerZ9eOKvhKmQx6A39p+RdO5Zxiz+Wf6R9Tj5nbU8jIK9Y6WpmWnVjGidyDOOf2ZUTrUK3jKNXcX1r+BSEE7+16D+vsraVdO0Ni0AnBX388cHV5daIKvnJT9wXeR+f6nfks4TMe6eBOkdFcJSd8vlx0mfd2foCpoBHPthyJk4Ne60hKNRfgHsDzsc+z+cxmfjn9y9Xl9Wu58Ebfpmw/kcncati1owq+clNCCP7W7m8AzEr+D0Pi6vP9jtQqdzj79pZ/U2AqINzhSZ7sGKJ1HMVOjGo6igjvCN7f9T65JdcmOR/RJpBOTXz594pEzmRVrdfC7aiCr9xSgHsAf477M9vObqN501PodPDh2qNax7pqQ+oWfj27Bv2V7nw1/EHVd6/YjIPOgXfav0NGYQaf/vbp1eW/X5AFMPHHg9Wqa0cVfOW2Hgl/hBi/GL469BEj23uzNOEsh9JztI5FgbGAib++g7nYj//0epk6ns5aR1LsTJRvFCMiRjAvaR57zu+5ujzQ25XX+zZl6/GMatW1owq+clt6nZ5/tP8HecY8LjjOoZarA++vStS8ZfPoTxMpsGTQp+4L9Iior2kWxX79Oe7PNPRsyOtbXien+FpDZ2SbhnRo7FOtunZUwVfuSJPaTZgQN4HN6Rvp3DKZbccz+TX5kmZ5Jiz/luSCjYQ4PMTkfgM1y6HYP1eDKx90/oDMwkz+seMfVxs6Op3ggyExSOD1xdWja0cVfOWOPdrsUbo26Mq2y9/RoE4Gf1t6SJNJUj7csI11F6fiJcJY+Mjbqt9eqXCRvpG8EPcC61LXseT4kqvLA71deb1PBFuOZTB/T5qGCe+MKvjKHRNC8G7Hd/Fx8cGx3lzO5GTx3orESs3wzdZkvk1+F4PewLyBn+LkYKjU/Ss11xORT9A2oC2Tdk/i6OVrJy6MatuIdiHevLsikbPZhRomvD1V8JW7Usu5FpO7TOZy8QXCopbxw+5TbEy6WCn7nrX9JB/u+yd6lzN80PVdGnjWq5T9KgqATuh4v9P7eDh68Pz657lYYH3e63SCyUOaY7ZIJlbxrh1V8JW71sK/Ba+3eZ2zJfuoE7yC137cT1YFj7Mzd9dp3t3xMQav/YyPfZFeQWqOWqXy+bn6MbX7VK6UXGH8+vFXB1hr6OPKxD4RbE6+xML4MxqnvDlV8JV7MjxiOGOjx1LgvJ08l5W8umg/5goaRXBBfBrvbPwaJ99NDAkdxriYMRWyH0W5ExHeEXzY9UOOZh3lr1v+enXs/EfbNaJtsDf/Wn6EczlVs2tHFXzlnr3Q4gUGNhmIg88v/Hp+CR+sTrL5Pn7ce4Y3132Hc92ldKrXmbfavaGGPVY016VBFya2mcimtE28tvk1jGajtWtnaAwmi6yyZ+2ogq/cMyEEb7d/m26B3XCu+zMzEj9n7q4Um23/p9/O8MaG/+JcbyGt67bhP/d9iIPOwWbbV5TyGBExgldavcLa1LWM32Dt3mnk48Zfe4ez6eglFu6tel07quAr5WLQGfjovo8Y0mQITr6b+Nfut1l3JL1c25RSMmvHKSZuehdH/1X0bPgAX/b8HFeDq41SK4ptPB75OP/s8E92ntvJ2HVjySzM5LH2QbQJsnbtnM8puqftVtTRgSr4Srk56Bx4p8M7PBM9HgfP3/jz5rGMm/czl3LvfijlYpOZ8QvX8n7Cixi8tzE8bCQf3jcZR71jBSRXlPIbFDqIj7p+RFJmEoOWDmJD2nomD43BaLbwxpK769rJK8njg90f8O7Odyska7kKvhBimBDisBDCIoRodYv1egshjgohjgshJpZnn0rVJITg+bg/8V6Hybi6ZrO96C3u//Y1Pll/+LaF32S2cPxiHkv3n6bXt//k1/yJuLpd4p8d/sWb7SaiE6pdolRt3Rt1Z36/+QS4BzBh0wS+OPJPnuvux4akiyzed/sjXiklK0+uZMBPA5iTOAcAi7TYPKcoz6GDEKIpYAG+Al6RUsaXsY4eSAZ6AmeAPcAIKeWRW227VatWMj7+fzanVAPZRdm8s3USG9JXYDG5Y77SglY+PXkgtAUlZkmR0czl/BJSMws4fTmf1Jw0pMcuDLXi0TnkEenVnk97vYefq5/Wv4qi3BWjxcg3B79h2v5pALgYY8m92JZ1zz1OXS+X/1k/ozCDNSlr+PnEzxzOPEwzn2a81fYtov2i7zmDEGKvlLLMBni5Cv51O9jEzQt+e+DvUsoHSn9+HUBK+f6ttqkKfvUXfz6erxJmsvvCFiyYsZR4YzF6I41e6IQjrq5ZYMigmAwEOuJ8O/BY1Ai6NeyszsRRqrW03DTmJc3jx+TF5Jvy0EsXovzDaFKrCQCZhZlcLLxI0uUkLNJCWO0whocPZ0joEPS68k3go3XBHwr0llKOKf35UaCtlHJ8GeuOA8YBNGzYsGVqamq5synayyrKYvmJFew6t5fMootcLDhPsbmYQI9AAj0DCasdRr+QftR1q6t1VEWxqQJjAW+tm8OKo3sIC8zjijkdndDh6+KLj7MPkb6R9A3uS+NajW22z1sV/Nue4yaE+AUo65X4ppRyaXnDXU9KOQ2YBtYWvi23rWintnNtHo0czaORo7WOoiiVytXgypTeY0hNjeT44TzWTeiCv4bzNtz20zApZQ8pZVQZtzst9ulA4HU/NyhdpiiKYvf0pRdkFRnNvLHkkKYXZFXG6Q97gFAhRLAQwhF4BFhWCftVFEWpEhr7ufNKr3B+SbzA/AI4xgAABKxJREFU0oSzmuUo72mZg4QQZ4D2wAohxJrS5fWEECsBpJQmYDywBkgEFkgpD5cvtqIoSvXyVKdg4hrW4p1lh7mYe28XZJWXTT60rQjqLB1FUezN8Yt59P3vFrqG+THt0ZYVcjbarT60VVe0KIqiVJIm/u78pWcY645cYNn+yu/aUQVfURSlEo3pHEKL0q6dexl+pDxUwVcURalEep1gytAYCkrMvPVT5Q6jrAq+oihKJWvi78HLPcNYc/gCyw+cq7T9qoKvKIqigTGdgmkeWIu3lx4iI69yunZUwVcURdGAg17Hh0NjyC828/bSQ5WyT1XwFUVRNBJax4OXeoay8uB5lh+o+LN2VMFXFEXR0LjOIcQ08OLtpYfJrOCuHVXwFUVRNOSg1zFlaHPyiky8vaxiByFQBV9RFEVj4XU9+HOPUFYcOMfKgxV31o4q+IqiKFXAn7qEEF3fi7/9dIjL+SUVsg9V8BVFUaoAB72OKcNiuFJk5J0K6tq57QQoiqIoSuWIqOvJhJ5hFBktWCwSnc62g6upgq8oilKFPHdfkwrbturSURRFqSFUwVcURakhVMFXFEWpIVTBVxRFqSFUwVcURakhVMFXFEWpIVTBVxRF+f/27ufVqjKM4vh3YUKDigYGgfdiTi8ZBCKBgyIjLC86VhKkaYGCEaV/QmAODCKaBAkSpASBqEHTQvMXqCkipkmR4iBnIi4He19wcBW87Xe/nfuuz+jsvc9gPRxYvLybfXYjUvgREY3QmO9TfBKSbgJ/1M6xAMuAW7VDjCwztyEzT4YVtl+Y78L/tvAnlaQTtlfXzjGmzNyGzDz5sqUTEdGIFH5ERCNS+MP7qnaACjJzGzLzhMsefkREI7LCj4hoRAo/IqIRKfyCJO2UZEnLamcpTdJnkn6XdFbSIUnP185UgqT1ki5Kuizpk9p5SpM0LelnSeclnZO0vXamsUhaIumUpB9rZxlKCr8QSdPA28C12llGcgx42fYrwCXg08p5BidpCfAF8A4wA2yWNFM3VXH3gJ22Z4DXgA8amHnOduBC7RBDSuGX8znwMdDEXXHbR23f6w9/AaZq5ilkDXDZ9hXbd4EDwKbKmYqy/Zftk/3nO3QFuLxuqvIkTQEbgK9rZxlSCr8ASZuAG7bP1M5SyfvA4dohClgOXH/o+E8aKL85kl4CXgV+rZtkFHvpFmz3awcZUl5ivkCSfgJenOfSbmAX3XbOovK4mW3/0H9nN902wP4xs0VZkp4Bvgd22P63dp6SJM0C/9j+TdIbtfMMKYW/QLbfmu+8pFXASuCMJOi2Nk5KWmP77xEjDu5RM8+RtA2YBdZ5cT7gcQOYfuh4qj+3qElaSlf2+20frJ1nBGuBjZLeBZ4GnpP0re33Kuf6z/LgVWGSrgKrbU/aP+49EUnrgT3A67Zv1s5TgqSn6G5Ir6Mr+uPAFtvnqgYrSN2q5Rvgtu0dtfOMrV/hf2R7tnaWIWQPP4ayD3gWOCbptKQvawcaWn9T+kPgCN3Ny+8Wc9n31gJbgTf73/V0v/KNCZQVfkREI7LCj4hoRAo/IqIRKfyIiEak8CMiGpHCj4hoRAo/IqIRKfyIiEY8AK4KAkRYrENuAAAAAElFTkSuQmCC\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "OMgxkk_dsZks"
},
"source": [
"## MAML: Optimizing for Generalization\n",
"\n",
"Suppose task loss function $\\mathcal{L}$ is defined with respect to model parameters $\\theta$, input features $X$, input labels $Y$. MAML optimizes the following:\n",
"\n",
"$\\mathcal{L}(\\theta - \\nabla \\mathcal{L}(\\theta, x_1, y_1), x_2, y_2)$\n",
"\n",
"$x_1, y_1$ and $x_2, y_2$ are identically distributed from $X, Y$. Therefore, MAML objective can be thought of as a differentiable cross-validation error (w.r.t. $x_2, y_2$) for a model that learns (via a single gradient descent step) from $x_1, y_1$. Minimizing cross-validation error provides an inductive bias on generalization.\n",
"\n",
"The following toy example checks MAML numerics via parameter $x$ and input $y$."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "pymQq77BsZks",
"outputId": "09cb6383-d836-4641-b78d-5918ce51f5f4"
},
"source": [
"# gradients of gradients test for MAML\n",
"# check numerics\n",
"g = lambda x, y : np.square(x) + y\n",
"x0 = 2.\n",
"y0 = 1.\n",
"print('grad(g)(x0) = {}'.format(grad(g)(x0, y0))) # 2x = 4\n",
"print('x0 - grad(g)(x0) = {}'.format(x0 - grad(g)(x0, y0))) # x - 2x = -2\n",
"def maml_objective(x, y):\n",
" return g(x - grad(g)(x, y), y)\n",
"print('maml_objective(x,y)={}'.format(maml_objective(x0, y0))) # x**2 + 1 = 5\n",
"print('x0 - maml_objective(x,y) = {}'.format(x0 - grad(maml_objective)(x0, y0))) # x - (2x)"
],
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"grad(g)(x0) = 4.0\n",
"x0 - grad(g)(x0) = -2.0\n",
"maml_objective(x,y)=5.0\n",
"x0 - maml_objective(x,y) = -2.0\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Y6OX6-H1sZkt"
},
"source": [
"## Sinusoid Task + MAML\n",
"\n",
"\n",
"Now let's re-implement the Sinusoidal regression task from Chelsea Finn's [MAML paper](https://arxiv.org/abs/1703.03400).\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "4yXU8pw6sZkt"
},
"source": [
"alpha = .1\n",
"def inner_update(p, x1, y1):\n",
" grads = grad(loss)(p, x1, y1)\n",
" inner_sgd_fn = lambda g, state: (state - alpha*g)\n",
" return tree_map(inner_sgd_fn, grads, p)\n",
"\n",
"def maml_loss(p, x1, y1, x2, y2):\n",
" p2 = inner_update(p, x1, y1)\n",
" return loss(p2, x2, y2)"
],
"execution_count": 12,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "PWsbhcrZsZkt",
"outputId": "25f349ae-9e91-4c56-d849-e44992955563"
},
"source": [
"x1 = xrange_inputs\n",
"y1 = targets\n",
"x2 = np.array([0.])\n",
"y2 = np.array([0.])\n",
"maml_loss(net_params, x1, y1, x2, y2)"
],
"execution_count": 13,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"DeviceArray(0.00022761, dtype=float32)"
]
},
"metadata": {},
"execution_count": 13
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "K3gEZ_ncsZku"
},
"source": [
"Let's try minimizing the MAML loss (without batching across multiple tasks, which we will do in the next section)\n"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "NkEve_B2sZku",
"outputId": "12780ec2-09d0-4861-9f85-bde5d33f80c4"
},
"source": [
"opt_init, opt_update, get_params = optimizers.adam(step_size=1e-3) # this LR seems to be better than 1e-2 and 1e-4\n",
"out_shape, net_params = net_init(rng,in_shape)\n",
"opt_state = opt_init(net_params)\n",
"\n",
"@jit\n",
"def step(i, opt_state, x1, y1, x2, y2):\n",
" p = get_params(opt_state)\n",
" g = grad(maml_loss)(p, x1, y1, x2, y2)\n",
" l = maml_loss(p, x1, y1, x2, y2)\n",
" return opt_update(i, g, opt_state), l\n",
"K=20\n",
"\n",
"np_maml_loss = []\n",
"\n",
"# Adam optimization\n",
"for i in range(20000):\n",
" # define the task\n",
" A = onp.random.uniform(low=0.1, high=.5)\n",
" phase = onp.random.uniform(low=0., high=np.pi)\n",
" # meta-training inner split (K examples)\n",
" x1 = onp.random.uniform(low=-5., high=5., size=(K,1))\n",
" y1 = A * onp.sin(x1 + phase)\n",
" # meta-training outer split (1 example). Like cross-validating with respect to one example.\n",
" x2 = onp.random.uniform(low=-5., high=5.)\n",
" y2 = A * onp.sin(x2 + phase)\n",
" opt_state, l = step(i, opt_state, x1, y1, x2, y2)\n",
" np_maml_loss.append(l)\n",
" if i % 1000 == 0:\n",
" print(i)\n",
"net_params = get_params(opt_state)"
],
"execution_count": 14,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0\n",
"1000\n",
"2000\n",
"3000\n",
"4000\n",
"5000\n",
"6000\n",
"7000\n",
"8000\n",
"9000\n",
"10000\n",
"11000\n",
"12000\n",
"13000\n",
"14000\n",
"15000\n",
"16000\n",
"17000\n",
"18000\n",
"19000\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"id": "Ghwf_dDesZku",
"outputId": "bbff3c44-3e50-49d8-e157-a8d95f9311c0"
},
"source": [
"# batch the inference across K=100\n",
"targets = np.sin(xrange_inputs)\n",
"predictions = vmap(partial(net_apply, net_params))(xrange_inputs)\n",
"plt.plot(xrange_inputs, predictions, label='pre-update predictions')\n",
"plt.plot(xrange_inputs, targets, label='target')\n",
"\n",
"x1 = onp.random.uniform(low=-5., high=5., size=(K,1))\n",
"y1 = 1. * onp.sin(x1 + 0.)\n",
"\n",
"for i in range(1,5):\n",
" net_params = inner_update(net_params, x1, y1)\n",
" predictions = vmap(partial(net_apply, net_params))(xrange_inputs)\n",
" plt.plot(xrange_inputs, predictions, label='{}-shot predictions'.format(i))\n",
"plt.legend()"
],
"execution_count": 15,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7feba9b52690>"
]
},
"metadata": {},
"execution_count": 15
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOydeVxU1fvH33cWZtj3RQUEdxCGHTHctbTcstS00tRvi+3LV9PMrb5lmX3LMm3Psl9+c6m0zMxdzA03VFRUVFRQkH0ZGGa7vz+uosgisqkw79eLFzD33Oc8dxiee+5zzvk8giiKWLBgwYKFpo/sdjtgwYIFCxYaB0vAt2DBgoVmgiXgW7BgwUIzwRLwLViwYKGZYAn4FixYsNBMUNxuB6rCzc1N9PPzu91uWLBgwcJdxf79+7NEUXSv7NgdG/D9/PzYt2/f7XbDggULFu4qBEE4V9UxS0rHggULFpoJloBvwYIFC80ES8C3YMGChWbCHZvDrwyDwUBqaio6ne52u2KhiaBWq/H29kapVN5uVyxYaHDuqoCfmpqKvb09fn5+CIJwu92xcJcjiiLZ2dmkpqbi7+9/u92xYKHBuatSOjqdDldXV0uwt1AvCIKAq6ur5YnRQrOhXgK+IAjfCYJwWRCExCqOC4IgfCoIQrIgCIcFQQivQ1+1d9SChRuwfJ4sNCfqK6XzPfAZsKSK4/cD7a98dQE+v/LdggULjUhybjLbUrfhrHbG284bH3sfvGy9LDe+ZkK9BHxRFOMEQfCrpslQYIkoie/vFgTBSRCEFqIoXqqP/muMaAaTQfoyG0CQg9IG5HfVVEY57OzsKCoqqvJ4Xl4eS5cu5bnnnmtEr8qTkpLCoEGDSExMZN++fSxZsoRPP/20yvZz5sxh2rRpZb/fc8897Ny5szFcbZIYTAbWpaxjZdLPHMg6XOG4u7U7kV6RRHtF06VFF3zsfW6DlxYag8aKdK2AC9f9nnrltXIBXxCEp4GnAXx9feuvd4MOirOgOAdEU8XjcitQO4Kdh/RzHTGZTMjl8jrbqQ/y8vJYtGhRgwR8o9GIQnFrH6HIyEgiIyOrbXNjwLcE+9phMptYe2IFiw58QqqxiNYGA/8uKGKQVotOEEhTKEhR2bDf0529F3fx19m/APC286Zry66MDRyLn6Pf7b0IC/XKHTVpK4riV6IoRoqiGOnuXqkUxK1h1EP2acg8DtosUDmAow+4tAX3TuDaDuxbgtJaOp5xDPJTpSeASkhJSaFTp0489thjBAQEMHz4cIqLiwFJCmLKlCmEh4ezYsUK1q9fT9euXQkPD2fEiBGVjsK3bt3KoEGDyn5/4YUX+P7778vsvf766wQHBxMdHU1ycjIAZ8+epWvXrgQHBzN9+vSyc4uKiujbty/h4eEEBwezevVqAKZOncrp06cJDQ1l8uTJAMybN4+oqCg0Gg2zZs2q9Frt7Ox49dVX6dy5M3379iUzMxOAXr168corrxAZGcknn3zC/v376dmzJxEREfTv359Ll6R7+P79+wkJCSEkJISFCxdWes1FRUWMHz+e4OBgNBoNv/zyC1OnTqWkpITQ0FAee+yxMl9AWlUzefJkgoKCCA4OZtmyZWU2e/XqxfDhw8v+PlcruU2dOpXAwEA0Gg2TJk2q9FqbGqIosiX5D0b8rwfT4t/FVpvDQpk3f3R4inEDv8HtmV14P/orXfq9zyNtB/PBmWNsTjrMasGXqQHjaOfcjjVn1jD6z9Fsu7Dtdl+OhXqksUb4acD1z4neV16rNW/9cZRjFwuqbmA2grEUEKVRu1wJlFTdXjQT6CpnVmwmlOSCsz+o7Co0O3HiBN9++y2xsbFMmDCBRYsWlQUSV1dXDhw4QFZWFg899BAbN27E1taWuXPn8tFHHzFz5sxbukZHR0eOHDnCkiVLeOWVV1izZg0vv/wyzz77LGPHji0XSNVqNb/99hsODg5kZWURExPDkCFDeP/990lMTCQhIQGA9evXc+rUKeLj4xFFkSFDhhAXF0ePHj3K9a3VaomMjOTjjz/m7bff5q233uKzzz4DQK/Xs2/fPgwGAz179mT16tW4u7uzbNky3nzzTb777jvGjx/PZ599Ro8ePcpuNDfyn//8p+waAXJzc3n44Yf57LPPyvy9nl9//ZWEhAQOHTpEVlYWUVFRZX4fPHiQo0eP0rJlS2JjY9mxYwcBAQH89ttvJCUlIQgCeXl5t/T+343subSHT/e8x+H807Q2GJhnF8B9/f+DzCuofEOPTtCml/Rzv7cQ9n1Hm92f0+b8fh4b+CGXot7g5a2v8OLmF3k+9Hme0jyFTLijxocWakFj/QV/B8ZeWa0TA+Q3XP5elAK9UQeCcCVHbwXcZFJKkIHaXhr5C3LITgZtZoVmPj4+xMbGAvD444/zzz//lB175JFHANi9ezfHjh0jNjaW0NBQfvjhB86dq1LPqEpGjx5d9n3Xrl0A7Nixo+z1MWPGXLtqUWTatGloNBr69etHWloaGRkZFWyuX7+e9evXExYWRnh4OElJSZw6dapCO5lMVnY9VV3niRMnSExM5N577yU0NJR33nmH1NRU8vLyyMvLKwvG1/t5PRs3buT5558v+93Z2bna9+Off/5h9OjRyOVyPD096dmzJ3v37gUgOjoab29vZDIZoaGhpKSk4OjoiFqt5l//+he//vorNjY21dq/m8kuyea1ra/x5PonSc8+yaxCI7/d+x0DRv1WMdjfiI0L9JgEz+4En2hY/TwtNr7Nkr6fM7DNQD5L+Iz/7P4PlvrXdz/1MsIXBOF/QC/ATRCEVGAWoAQQRfELYC3wAJAMFAPj69rnrMGdKz9g1ENmEti6gb2XFMhvFfcOkHtOSu8YdeDgLd08qLiM7/rfbW1tASn43nvvvfzvf/8r13bPnj0888wzALz99tu4uLhgNpvLjt+4Hvx621X9fJWffvqJzMxM9u/fj1KpxM/Pr9L15aIo8sYbb5T5UVOqus7OnTuX3YyucjtG0iqVquxnuVxeNr8QHx/Ppk2bWLlyJZ999hmbN29udN8amr9T/ubd3e9SVJrPSzl5jHXWoBq3WJqTuhXsPWHMbxD3IWx9D3XeBeY8uhxPG0++TfyWFrYteFrzdMNchIVGoV5G+KIojhZFsYUoikpRFL1FUfxWFMUvrgR7RInnRVFsK4pisCiKDad7rLACz0BwaFm7YA8gU4BLG7D1kHL7hdceRs6fP18W4JYuXUq3bt0qnB4TE8OOHTvK8u5arZaTJ0/SpUsXEhISSEhIYMiQIbRu3Zpjx45RWlpKXl4emzZtKmfnao562bJldO3aFYDY2Fh+/vlnQAryV8nPz8fDwwOlUsmWLVvKnijs7e0pLCwsa9e/f3++++67sjmFtLQ0Ll++XOEazGYzK1eurPY6O3bsSGZmZtn7YTAYOHr0KE5OTjg5OZU9FVzv5/Xce++95dJSubm5ACiVSgyGivMo3bt3Z9myZZhMJjIzM4mLiyM6OrpS2yDNEeTn5/PAAw/w8ccfc+jQoSrb3o0UG4qZtn0ak7ZNogUKlqem8ZT/YFRjVt96sL+KTA69psDD38C5HQgrxvKyZiKD2gxiwcEF/HH6j/q9CAuNStNMysnq4cFFEKSbho0rFGVAkRQUO3bsyMKFCwkICCA3N5dnn322wqnu7u58//33jB49Go1GQ9euXUlKSqrQzsfHh5EjRxIUFMTIkSMJCwsrdzw3NxeNRsMnn3zCxx9/DMAnn3zCwoULCQ4OJi3t2jTIY489xr59+wgODmbJkiV06tQJkOYVYmNjCQoKYvLkydx33308+uijZRO/w4cPL3dDuIqtrS3x8fEEBQWxefPmSucfrKysWLlyJVOmTCEkJITQ0NCyFTWLFy/m+eefJzQ0tMpUwPTp08nNzSUoKIiQkBC2bNkCwNNPP41GoymbtL3KsGHD0Gg0hISE0KdPHz744AO8vLwqtQ1QWFjIoEGD0Gg0dOvWjY8++qjKtncbp3JPMerPUaw5s4ZnPbvxU9J+2rXtD4M/rZ9lxsHDYcinkLwR4Zd/8XaXmUR7RTNzx0z2XNpTd/sWbgvCnZqXi4yMFG8sgHL8+HECAgIa1xFRhNyzoMsnJV9g0IjHSUysdENxvXK1AIybm1uD91UZN1vf35S4LZ+rOvDH6T94e9fb2CptmdtmBF3WzgC/bvDoclCq67ez3V/AuikQ+S8K7pvN2LVjyS3NZcXgFXjY1PIpwkKDIgjCflEUK1373CRH+Cajof4mmAQBnPzAyhYKLko3AAsWbgMms4mP9n3EtH+mEeQWxMpen9Jl0wdSCnPUT/Uf7AFiJsI9L8K+b3E4uYH/9vovJcYS3tj+BiZzJXtaLNzRNLmAb9TrybpwnuL8epw4lMnA2R+/1j4kblkJ1020NhQpKSm3bXQPNJvR/d1Cob6QFza/wOKjixnVcRRf9V2E25+vS8uPR/wAKvuG67zvLPCOht9foq0J3oh+g/j0eL4+8nXD9WmhQWhyAV+uVKKytqEwJwt9SXF9Ggan1tKqnYI6bSGwYOGWKDYU8+T6J9l9cTczYmbwZsybKLf/F87vgkHzwbVtwzogV8Lw76Tvy5/gwdYDGNRmEJ8f+px96Za603cTTS7gC4KAg7sHCqUVeRnpmIyV75qtFWoHaeVOcRaU5NefXQsWqsBoNjJp2ySScpKY33s+IzuOhLNx0tLJ0MdBM6JxHHHygQe/gIwjCJtmMz1mOr72vkzZPoVcXW7j+GChzjS5gA8gk8tx8myBKIrkZaQj1mcKxqEFKKwh7xyYjPVn14KFGxBFkXd2v8P2tO1Mj5lOT5+eoC+G1S9Io/oHPmhchzoOgKinYM+X2GYkMa/nPHJ1uUzfMd2yKesuoUkGfACFlRWOHp4YdDoKsivumK01ggycW0sibIUX68+uBQs38G3it/xy6heeCn6KER2ujOS3/1cabAz6WFpI0Nj0nSFtaFzzMp0c2zEpchJxqXEsOVaVMrqFO4kmG/AB1LZ22Do5U1JQQHFB/aRg8vLyWPT14iupnWzQa+vF7o2sWrWKY8eONYhtC3c+O9N28umBT7nf/35eDHtRejHzJOz4BDSPgH+P6g00FGpHuH8upB+BPV8wutNo+vr2Zf6B+SRmNfxyZQt1o8kFfNEsUpitw2iQlozZubhiZWNDYVYm+nooZXdVbhh7L5ApIf9CtUs1RVEsJ59QUywBv/mSrk1nyvYptHVqy+yusyVZC1GEtf8GKxu4753b62DAEOgwALbMQchP5a173sLD2oNJ2yZRqK+4ic/CnUOTC/hmk4iu2EB+Zglms4ggCDh5eCFTKMjPuITJWLe8e5nccHgEr76zkL7DxhIeFlJOkjglJYWOHTsyduxYgoKCuHDhAv/5z3/o2LEj3bp1Y/To0Xz44YcAnD59mgEDBhAREUH37t1JSkpi586d/P7770yePJnQ0FBOnz5d5/fFwt2BwWRg0rZJ6E16Pur1ETbKK4JvR1ZKk7V9Z9ZeNqG+EAR4YB4gwt9v4KhyZG6PuaRr03lr11uWfP4dzN1b6umvqdJj5Q3IAVeziNFgwiwTEJQyZAi4imaMpaWYZTJkVlYIlalnegXD/e9X2+31csNGg4Hi1EQc1HKyZB7ExHZjyJAhAJw6dYoffviBmJgY9u7dyy+//MKhQ4cwGAyEh4cTEREBSDICX3zxBe3bt2fPnj0899xzbN68mSFDhjBo0CCGDx9e57fKwt3Dxwc+5lDmIeb1nIe/o7/0okEHG2dByzCIqLPuYP3g5AvdXoUt78KFvYT6RPFi2IvMPzCfaK9oaTWRhTuOuzfgV4NMJiBXyDAZzQhGEblCQCbIkCuVmAx6TAYDCmXdK1uJwLR5XxK3dRMyhVU5SeLWrVsTExMDSJLGQ4cORa1Wo1arGTx4MCBtbtq5cycjRlxbWldaWlpnvyzcney5tIcfj/3IqI6jGOA34NqBvd9Iez+GfSmJm90pxDwH8V/Dhpkwfi3jg8azN30vH+z9gFCPUDo4d7jdHlq4gbs34N9kJC4TRbTZOnRaAw5u1qhtlcgBbVYmxfl5OHp6YW1Xt92JP/30E5nZuezfuhalUYvfPQ+WSRJflRCuDrPZjJOTU6XFPiw0L4r0RczcMZPWDq15LfK1awd0+dLKnLZ9wL/77XOwMlR2krLmn/+GU+uRdejPu93eZcQfI5i0bRI/D/z5WkrKwh1Bk8vhX0UQBOxd1ChVcgqzdRj00iSuvasbVmprCi5nYKjFaPp6ueEySWIXX7bs2FtlkZPY2Fj++OMPdDodRUVFrFmzBgAHBwf8/f1ZsWIFIE3wXpXwvVHW2ELT5r/7/0t6cTrvxL6DtcL62oGdn0FJjpS7vxMJf0KSEt/4FphNuFq78n7390nJT2HOnjm32zsLN9BkAz6AIBNwcLNGkAnkXy7BbDIjCAKOnl7I5HLyMi5hNt2aANT1csMJCQmSJHFYJEtWbaBTO/8rZRXLExUVxZAhQ9BoNNx///0EBwfj6OgISE8J3377LSEhIXTu3Lls4nfUqFHMmzePsLAwy6RtE2dH2g5WnlzJE4FPEOoReu1AUSbsWgidh0n5+zsRuRL6zIDLR+HwcgCiW0TzTMgzrD692qKff4fRLOSRDaUmcjOKUVrJcPK0QRAE9LoSci+mYWVtjZNXy0qrSN0SJr1UBN3aWdqYdQNFRUXY2dlRXFxMjx49+OqrrwgPD69bnxbqhdspj2wwGRj02yCsFdYsG7wMlfxa5S7+miLlyJ+PB7d2t8W/GmE2w9e9pVrQLx4AuQKj2ciT65/kWPYxlg9ajp+j3+32stnQ7OSRb0SpkuPgosZQaqIoRxqBW6mtsXdzp7S4GG1uTt07kVuBrbv0+G2ouN7/6aefJjQ0lPDwcB5++GFLsLcAwF8pf3FRe5F/R/67fLAvugz7v4fQ0Xd2sAdJTbbnFGkHcOIvAChkCuZ2n4tKrmLStkmUmiyLEe4EmkXAB1DbKbFxsKKkSE9JoR4Aa3sHrO0dKMrNQaetBzlgOw9AkCpk3cDSpUtJSEggKSmJN954o+59WbjrEUWRxYmLae/cnm6tbighuXuRlB7s9lrlJ99oy2xGpy2itLhhdn7flA4DwCMQ/vmoTD7c09aTd7u9y4ncE3wQ38i6PxYq5e5dpVMLbJ1UGPVmCnN0yJUyrNQKHNzcMepLKbicgcJbhUKprH0HcqVUErE4G+xbSPV1LViogu1p20nOS2ZOtznlU4q6fNj7LQQOrVb6uDg/j+3/W0Ly3l2UarWIohlBkOEd0JkOMd1o3+UebJ2cG+FKkEb53V6DX5+EE2shYBAAPbx7MD5oPIsTFxPpFcn9/vc3jj8WKqXZjPDhinSymxq5QkZBZom0Tl8mw9GzBSKQfzkdUayjsqadByCCth4F2yw0SRYnLsbL1osB/gPKH9j7DZQWQPfKR/dmk4kDa1fz3SvPcCxuE23Co+gybAQ9x/yLLsNGoM3PY9N3n/P1CxM4Fb+zEa7kCp2HgbOftIz0urnBF8NeJNQ9lNk7Z5OSn9J4/lioQLMa4QPI5DIcPazJvVRMfmYJTp42KJRKHN09ycu4RFF2NvZu7rXvQKGSJm6Ls8Des34KqltochzOPMy+jH28HvU6Stl1T5WGEtj9ObTtCy1CKpx39uA+tv3fd2Snnqe1Joze457GtZVPuTaxj4wh68I51n/5KX989D73PvMCwb3va+hLkoqnd3sV/ngZzmyFtr0BUMqUzOs5jxF/jODf2/7Nj/f/aFmff5toViP8qyiUchzc1Bj1JgqzdYiiiNrODhtHR7T5eXXP59t5gmgGbVb9OGyhybE4cTEOVg483P7h8gcO/p/0dHjD6D7rwjl+mTOTX9+fjcloYMikN3l42tsVgv1V3HxaM2L6u/gGh7D+i0/Z98evDXUp5QkZLaUzt/+33Mtetl681/09TuWeYsaOGRa9ndtEswz4ACobJbZOKkqLDRQXSJO49i5uKFUqCjIvVymyNmHCBDw8PAgKCqrauNIaVA7SP+51hZ79/PzIyqr5TWDr1q3s3Nk4j+Tjxo1j5cqVADz55JPVKnXe6NcXX3zBkiUWPfSacrHoIpvOb2Jkx5HlR7pmE+xcAN5R0DoWAG1eLhu+/owlk1/k0qkT9BzzL8b9dxHto7redCmxUq1m2JSZdIjpxrb/+46LJ4835GVJKFQQ8yykbK+gddWtVTdejXiV9efW89XhrxreFwsVaLYBH8DGwQq1rRJtXimlxQYpn+/hhWg2U5CZUekoZNy4caxbt+7mxu08pALTJbUv/1bXgG+spTLoN998Q2BgYJXHb/Rr4sSJjB07tlZ9NUdWnlyJIAiM7HCDwNjJv6WljV1fQBRF9v3xK9+98jSJWzYQ2n8gEz75ishBw5Arar6wQK5Q0v/Zl1Gq1BzZvKGer6QKwseC0gb2fFHh0LjO4xjUZhCfJXzG5vObG8cfC2U064B/VX5BYSWnIEvS0FdYWWHv6kZpcTEllRRN6dGjBy4uLtXa1Wq1DHxoFCH3jiYooivLfv657NiCBQsIDw8nODiYpKQkAHJycnjwwQfRaDTExMRw+PBhUlJS+OKLL/j4448JDQ1l+/bt5fqYPXs2Y8aMoWvXrrRv356vv/4akIJx9+7dGTJkCIGBgZhMJiZPnkxUVBQajYYvv/wSkJYEvvDCC3Ts2JF+/fpx+fLlMtu9evXi6qa3devWER4eTkhICH379q3Ur9mzZ5fJPSckJBATE4NGo2HYsGHk5uaW2ZwyZQrR0dF06NCh7HqOHj1KdHQ0oaGhaDQaTp06VfM/4F2IwWzg11O/0r1Vd1rYtSh/cM8X4NCKQvcYVrwznW3/9x3eAUE88eEi+ox/BhsHx1r1aaW2pkNMN07s2o6hHmpC3BRrZ6lIy+EVFdKagiAw+57ZBLsFM3X7VE7mnmx4fyyUcdfOKM6Nn0tSTlK92BJFMOpNtEtuz8xe07F2cKS0WEthdhZW1jYorG5teeW6deto2bIlfy7/AfIvkK+4Ngns5ubGgQMHWLRoER9++CHffPMNs2bNIiwsjFWrVrF582bGjh1LQkICEydOxM7OjkmTJlXaz+HDh9m9ezdarZawsDAGDhwIwIEDB0hMTMTf35+vvvoKR0dH9u7dS2lpKbGxsdx3330cPHiQEydOcOzYMTIyMggMDGTChAnl7GdmZvLUU08RFxeHv78/OTk5uLi4VPBr06ZNZeeMHTuWBQsW0LNnT2bOnMlbb73F/PnzAemJIz4+nrVr1/LWW2+xceNGvvjiC15++WUee+wx9Ho9pluUurjb2HJ+C9m67IrywZePw9ltJPs/y99TX8FkNNJ/4st07tWv7rvAgaDe/Ti6bSMn9+ygc8++dbZ3U7pMhP2Lpc1jPcp/flVyFfN7z2fUmlG8tPkl/jfwfzirG2n5aDOnWY/wryIIoFDKEM0iBVklADi4eyLIZLVaqhkcHMyGDRuY8tZctscfwlFhKDv20EMPARAREUFKSgoA//zzD2PGjAGgT58+ZGdnU1BQcNN+hg4dirW1NW5ubvTu3Zv4+HgAoqOj8feXtNTXr1/PkiVLCA0NpUuXLmRnZ3Pq1Cni4uIYPXo0crmcli1b0qdPnwr2d+/eTY8ePcps3ezJJj8/n7y8PHr27AnAE088QVxcXLXX3rVrV+bMmcPcuXM5d+4c1tbWFew2JVacXEEL2xbEtowtf2DPlxwvbMnvfx3F0bMFY+Z+QlDve+sl2AO06tQZJ68WJG5tpLSORydo01vaT2AyVDxs48H83vPJLM5k0rZJGMwV21iof+7aEf6U6Cn1brO4QE9Rro7ifD22Tioc3D3IS79EUW4O9i5uVZ534cKFMo37iRMnMnHiRA4cOMDatWuZPu8z+u7Yw8z3PgFApZK2z8vl8lrn2K9yYzC4+vv10syiKLJgwQL69+9fru3atWvr1HdtqOzaH330Ubp06cKff/7JAw88wJdfflnpzacpcK7gHLsv7eaF0BeQX69rX5JLUtx6/kpri3dAEMOmzkKpUtdr34IgENTrXv75eQl56Zdw8mpx85PqSsyzsHQkHFsNwRUL+WjcNcy+ZzbT/pnG3Pi5TI+Z3vA+NXMsI/zrsLZXSpO4+aXodUbUtnZY2zugzc1FX1JS5Xk+Pj4kJCSUpWEuXryIjY0Njz/+OJNfn8KBI0nSuvwq6N69Oz/99BMg5eDd3NxwcHC4qUTy6tWr0el0ZGdns3XrVqKioiq06d+/P59//jkGgzSCOnnyJFqtlh49erBs2TJMJhOXLl1iy5YtFc6NiYkhLi6Os2fPAtJcA1Qt3ezo6Iizs3NZfv7HH38sG+1XxZkzZ2jTpg0vvfQSQ4cO5fDhw9W2v5tZeXIlckHOQ+0fKvf6yeUfsva8Py39/Rg2pf6D/VUCe/RBEGQc3baxQexXoN29knRyJZO3VxncdjDjOo9j2YllrDi5onH8asZYAv51CIKAncuVnbhZOswmM/ZubsiVSvIzMzCbTIwePZquXbty4sQJvL29+fbbbyvYOXLkSNlE5FvvzGH6pJcluYUqmD17Nvv370ej0TB16lR++OEHAAYPHsxvv/1W6aQtgEajoXfv3sTExDBjxgxatmxZoc2TTz5JYGAg4eHhBAUF8cwzz2A0Ghk2bBjt27cnMDCQsWPH0rVr1wrnuru789VXX/HQQw8REhLCI488clO/fvjhByZPnoxGoyEhIYGZM6vXcV++fDlBQUGEhoaSmJjYZFf76E16ViWvoo9vH9xtrs3pFFzO4K+/DtLCCR6a+QFKdcMEe5BqQbQOCePots2YzY0wVyKTQdRTkLq30nKkV3kl/BViW8UyZ/cc9qXvq7KdhXpAFMU78isiIkK8kWPHjlV4rSHQ64xiRkq+mJehFc1ms1haXCxeSj4p5mWk186grkAU0w6Ioja73nycNWuWOG/evHqz15xpjM/VmtNrxKDvg8QdaTvKv/7uv8X5jwwQ8+MWN7gPoiiKSTvjxA9HDhTPJuxvlP5EbbYovu0uimteq7ZZfmm+OOjXQWL3/3UX0wrTGse3JgqwT6wirlpG+JWgVMmxc1JRWmJEV2TAytoaW2dnSu3XSSUAACAASURBVAoLaqdGaGUHclW1o3wLTZvlJ5bjY+9DTIuYstcunTpB0qEkIjxycOg6ulH8aBsZg9rOniNbGmny1sYFOj8oFUfRV/2/42DlwKd9PsVoNvLS5pcoNhQ3jn/NDEvArwJrByus1AoKc0sx6k3YObmgsLKiIPPyLVfJQhAkFU19UaVa+bVh9uzZVS7XtHBnkZybzIHLBxjRYQQyQfqXE0WRLYsXYavQE31fb2mHaiOgUCoJ7N6b5PhdFFeyz6RBiBgvicEd/a3aZv6O/nzQ8wNO5Z1i+o7pFvmFBsAS8KtAEATsXdXIBK4s1RRwcPfAZDRSlFOLkbqNCyBYRvnNkJWnVqKUKRnabmjZayd2xnHp9Gli3VOw6jKhmrPrn6A+92E2GTm+fWvjdOgbA24dpTX5N6Fbq268FvEaG85t4MvDXza8b82MJhnwzTpdvYwO5AoZ9m7WGA1mivJKsVJbY+PoRHFBfrWrdio3pgS1g1QRq64SzBbuGkqMJfye/Dv9WvfDRS3tYzDq9cQt/R4PWz2dg9uCe4dG9cnd1w+vdh04svnvxhlFCwJEjLsyeZt40+ZjA8cyuM1gFiYsZNO5TTdtb6HmNLmAby4tpfT0aYzXSQXUBZW1Amt7K0oK9ZQWG7BzcUWuVFKQmYHZfIuB28ZN0tfRNdKjtIXbzrqz6yg0FJbTzTm0YS2FWZn0cD2BLHLcbfEruPd9ZKeeJz25kaQNQkZJ81g1GOULgsCse2YR7BbMG/+8QXJucsP710xocgFfsLJC7uSEMTMTU379BFY7J5Wkt5OtQzSDg7sHRoPh1mvhquyl2rdaS1qnubDy5EraOLYhwjMCAH1JMXt+W46vh5LWriIEDrktfnW8pwcKlYojm/9unA7LJm+Xgf7mE7JX5ResFda8vv11S03ceqJeAr4gCAMEQTghCEKyIAhTKzk+ThCETEEQEq58PVkf/VbhC8oWLZBZW6NPS8NcD2JRgkyqlJWWlkqvnr0Ii4ik98DBzJ8/H/0t2Pfz9yerRAR9oVSv9CZY5JHvbpJykjicdZgRHUaU7YLet2YVJYUFdLc7CJpRkpT2bUBlY0PHmO4k7dyOXneL6cnaEjZGmrxN+rNGzT1sPHgn9h1O5Z7io30fNbBzzYM6B3xBEOTAQuB+IBAYLQhCZdq6y0RRDL3y9U1d+63WJ5kMpa8vgkyG/vx5xDpKGMDVoik2zJr2Dnt3HWT37t18/9NP7N3xD+KtpHau5HEpvvnTgUUe+e5m+YnlqOQqBreVZDeKC/LZ/+dvtG/fAi9VLoQ9flv9C+5zHwZdCSd2VdzU1yC0jgUnX0j4qcandPfuzuMBj7M0aSnbLmxrQOeaB/Uxwo8GkkVRPCOKoh74GRh6k3MaHJlSidLHF9FgQJ+aWi+TU/5tfYmKjkKbV4qNtR2BgZ1JTU2l6IbUjlarZeDAgYSEhBAUFMSyZcvKji34/EvCBzxOcJeeJB2XClJY5JGbnjyy1qDlzzN/MsBvAI4qSdY4ftUKDLpSYl1Pg2cQtNDcVh9bdgzApZUPRzY1UlpHJpMqYp3ZCvmpNT7t1YhX6ejckRk7ZpBZbKkVXRfqQzytFXDhut9TgS6VtHtYEIQewEngVVEUL9zYQBCEp4GnAXx9favtNH3OHEqP31weWTQaMJfqEayUyJTVyxyrAjrhNW1alccl/XwVBr2JxIMnOHT4MIs+mY82PxeVjS1WV5Qey+SR/5QeXfOvm0twc3PjwO7tLJo/jw8/eJ9vFv9gkUdugvLIf575k2JjMSM6jgCgIOsyCev/JDA6HNf8jyFmzm32UPo8B/e5j20/fkvW+RTcfP0avtOQUbBtLhz6uYJsclVYya34oMcHjFwzknf3vMv83vMb2MmmS2NN2v4B+ImiqAE2AD9U1kgUxa9EUYwURTHS3b0OhcSvR6FEUCgQ9QbEeggmMrkMudrIuKceY87bc2nl549coST/cjomk5RCKZNHnjKF7du34+h4rXDFQw89BGpHIkI6k3L2NGCRR25q8siiKLL8xHI6OndE4yaN4ncul9IY9/iVgCCH4BG308UyAnv0Qa5QcLixJm9d2kipnYSlUiGKGtLGqQ0TQyay6fwmy1LNOlAfI/w04PpKyt5XXitDFMXrl6V8A3xQ106rG4nfiGg2oz9zBlFvwKptG2Sq2u9qNBgMjHr0EUaPepT7eg9ErzNTqDcwZMgQBEHGcy+8wLPPPntNHnn6dPr27VsmIqZSqUAmR27tiFGvK1fz9laxyCPfmRzJOsKJ3BPMiJmBIAhknjvL0bjNRA58EIez86D9fVIJzDsAGwdH2kV15XjcFno8Ov6Wi/3UitBHYfXzcCEefCtLBlTOE52fYN3Zdby7512iW0Rjb2XfgE42TepjhL8XaC8Igr8gCFbAKOD36xsIgnC9+PYQoBGqKV/X/5VJXAQwXLhwa5Os1yGKIv/6178ICAhgyrTJKFVyCrN1tG7dlvjdu9nw+yrGjHqkvDzy5MkcOHCgojG1g/Rdl2+RR25i8sgrTq7AWmHNA/4PABC39HvUNrZ0CfGEwksQemu6OboiA+eOZnNw/Xm2/F8Sqz46wNrPD5OVWlQv/gb37Y9OW8Sp+MZZEUbgUKnm7S1M3gIoZUpm3zObbF028/db0jq1oc4jfFEUjYIgvAD8DciB70RRPCoIwttIqm2/Ay8JgjAEMAI5wLi69nuryKysUHp7oz93DkNaGkpv71uuJrRjxw5+/PFHgoODCQsLAxGmvDqdAQPux8nTAX1JCUU52Rw4epxp06cjk8lQKpV8/vnnFY0pbZCkFnKYPXs2EyZMQKPRYGNjU04eefjw4axevZoFCxbQvXv3ciauyiNnZWWVySOfPFl+I82TTz5JSkoK4eHhiKKIu7s7q1atYtiwYWzevJnAwEB8fX1vKo9sNpvx8PBgw4YNFfy6nh9++IGJEydSXFxMmzZtWLx4cbXv6fLly/nxxx9RKpV4eXkx7Rae3O5ECvQFrDu7jkFtB2FnZcf5xEOkJOynx+MTUJ/8FdRO0GFAtTbMJjNpJ/I4tS+DtJO5FGRdW/qrtlPi5GHNxeQ8lr0bT8A9LegypA22jrV/avXtrMHR04sjm/4moFuvWtupMSp7Kegf/Q3un3tLS1OD3IJ4tNOj/N/x/2Ngm4GEe4Y3oKNND+FOFSiKjIwUr64Uucrx48cJCAiok13D5csYL19G6dUChZtrnWyBNPoqyC7B1lGFtYOCnNQLiKKIi7cPcvlN7qcFl6AoHTw7SxuyboHZs2dXO6FroebUx+fqKj8d/4n3499n2aBlBDh34qc3X6O4IJ8J732A4pPOED4WBn5Y6bk5l7QcjUvj1L4MSgoNKNVyfAJc8PRzwMPPATdvO9S2SgB0WgP7/krhyJZU1LZKHns7Bit17cdve35bzj8/L2HC/C9xbtGq1nZqzJmtsGQoDF8MQQ/dtPn1FBuKGbZ6GCqFipWDV2J1i/87TR1BEPaLohhZ2bEmt9MWIFeXi6mK3LjC3R25vT2GjHRM2lpIHd+A2u5alSyTQcTR0wuzyUTB5cs3Xwpqc6Vwc3Funf2wcPu5Olkb7BZMoGsgSTvjyDiTTLdHxqA4/TeYSqVVKjdw/mg2qz4+wP/e2kPi9jRatndiwDNBTJjXjfufCSa8f2u8OzqXBXsAta2SbsPb8+CrYRQX6Dm8ucKit1uic69+CDIZRzavr5OdGuPXHey84MitV7myUdowPWY6Z/PP8s2RBt3S0+RocgG/1FjKpaJLnCs8V2nQFwRBSucolRguXMBsqHvxZDsXNbIrVbLkShX2rm6UFmspzs+r/kSFWkrtlNx6wLfII9957MvYx5n8M4zsOBKDvpTt//sBD7+2Uprk8HJw9odWEeXOObUvgz8+O0RBpo6YB9vwxJxYBjwdTNswDxRKeeUdXUeLdk74adw4uOECOm3tP8t2zi60CY/m6LZNmIyNUFBcJpfq3J7aUKNNiDfS3bs79/vfz9dHvuZ03ukGcLBp0uQCvkqhwtveG51Rx7mCKoK+XI6Vry+i2VynSdyryGQCDq5qTEYzRTk6rB0cUdvaUZSTjaH0JtIL1i5gLAFDI21vt9BgLD+xHHsre/r79efgX39QmJVJzzH/QijKgLNx0lLM6+aNLhzLYePiY7Ro68ijs7sQMcAPG4dbT090GeKPvsTIoU11G+Vr+vanOD+P0/vj62Sn5h2OBLMBjq2q1elToqZgq7Rl9s7ZmC0KtDWiyQV8AAeVAz72PuhMOlIKUjCaK0oMyNRqlC1bYi4uxpieUec+rdQKbB1V6LQGSouNOLh7IJPLyb+cUf0NxdpJ+l6LUb6FO4eskiw2nt/I0LZDEYv17PltOW0iovEN0kDiL4AoBbgrZJwtYO2XR3D2smXgcxoUVjcfzVeFm7c97SI8OLTpAiVF+lrb8QsNx87VrfF23nppJJ38w7UrXu5q7cqkyEkkZCaw4oSlAHpNaJIBH8Deyh4fex9KTaWcLzxf6QhA4eSEwtUVY042xrybpF9qgI2jlbRUM0eHKEoFU4x6fQXphXLIldKqhZLcW9qIYuHOYlXyKoxmIyM7jmTXyqUYSnX0eHS8dPDIcmgRCm7tASjM0bFm4SFs7JUMfikElY2yGss1I2qQP0a9iYN/n6+1DZlMTlCve0k5fJD8y3UfBN0UQQDNCDi/E/Jq5/fQtkPp0qILHx/4mAxtI/h8l9NkAz5IQb+VXStKDCWkFlaup6Pw9ERmY4Mh7WKdlTWlKlnWIEpVsqysbbBxcESbl1t9wRRrFzDpq635aeHOxWQ2sfLkSqK9onHUWnFow19o+g7A1dsHMk/CpUNlo3uTycz6bxIxGcwMeiGkTsspr8elhS0dor04sjW1Trn84N73ApC4tZFq3l7dcXxkZa1OFwSBWTGzMJlNzNlz++Uq7nSadMAHcFQ54mXrRaG+kEvaSxWCviCTYeXjgyC/oqxZjfyCTqcjOjqakJAQOnfuzKxZsyq0UShlkt5OqYniAj12rm7IlUryMzOws7Or3LDaEZBVSOusWrWqWpni+uR6wbQHHniAvGqeeG70a+bMmWzcuLHBfbxT2XVpF2lFaYzoOIJdK5ciVyrpOvzK5qojKwABOktLD3evOkP6mQJ6j+mEs5dt1UZrQUg/H4wGMyfjaz/SdXD3wC8knMQtG269dnNtcPYDny7SpHYtn3B9HHx4NvRZNl/YzMZzzfdzWBOafMAHKdfnZu1Gri6XzJKKanuCUonSxwdRb8CQllblckqVSsXmzZs5dOgQCQkJrFu3jt27d1dsZ6tEZaNEm1eKyWDG0d0Tk8FQ9QdaJpd23uryypU/rGvAr6088tq1a3Fycqry+I1+vf322/Tr169WfTUFfj/9O44qR0JoS9LOOMIHDMbWyVn6ex9ZDv49wKEFZw9lkrDhPEE9WtE+0rPe/XD3scfd155j/1yskzqspk9/inKyOZuwvx69q4bgEZB5HDKO1trE2MCxdHLpxJw9cyjQ31yHqrnSLAI+SMUUHFWOZBZnkqerOHqV29qi9PTEVFCAKbvyilSCIJSN0g0GAwaDodLduunp6Qx+qD99HuiGJkTDrvi92Do5IQJTXn+dkJAQYmJiyMiQRmIpKSn0eegJNH0eom+f3pw/f56dO3fy+++/M3nyZEJDQzl9uvzSs3HjxjFx4kQiIyPp0KEDa9asAeD7779nyJAh9OnTh759+6LVapkwYQLR0dGEhYWxevVqAEpKShg1ahQBAQEMGzaMkutSTn5+fmRlZQGwZMkSNBoNISEhjBkzplK/ri+esmnTJsLCwggODmbChAmUlpaW2Zw1axbh4eEEBweTlCQpnW7bto3Q0FBCQ0MJCwurVkriTqRIX8SW81sY4DeAvb+uwEqtJnLwlY1EaQcgNwWCR5CfWcKmH47j7mtP7Ih2DeZPYLeWZKcVcflc7d/HNhHRqO0dSNrRSPrznYdJgnJHf621CYVMYZFdqAH1IZ52W9i+/CRZF25VS0REZyolwZyDSqFGLpRfGeHmbUeXrg4YMjKQ2dkhU6srWDCZTERERJCcnMzzzz9Ply4VxZ+WLl1K/wH9mfzvKWRfLMQsM2Dr7EpxcTHBHTvw3nvvMfWNN/j666+ZPn06L774Ik+MG88T/SP4buU6XnrpJVatWsWQIUMYNGgQw4cPr/RqUlJSiI+P5/Tp0/Tu3ZvkZKn254EDBzh8+DAuLi5MmzaNPn368N1335GXl0d0dDT9+vXjyy+/xMbGhuPHj3P48GHCwytuUT969CjvvPMOO3fuxM3NrUweuSq/dDod48aNY9OmTXTo0IGxY8fy+eef88orr0jvr5sbBw4cYNGiRXz44Yd88803fPjhhyxcuJDY2FiKiopQV/Ke38lsOLcBnUlHT6sI4vcspOvw0VjbX9FJSvwF5FYY2w5k3WdHAOj/VFCN1tfXlg5RnuxYeYpjOy7i6edQKxtyhYL2UTEk7dyOUa9veEE1Wzdo01N6v/rMKLd09Vbo7NqZxwMeZ8mxJQxsM7CsrKSFazSbEb6EgEquQhBklJpKK67cEUDZsiWCXI4hNbXS5ZRyuZyEhARSU1OJj48nMTGxQpuoqCgWL17MnPff4WzaKZSCGn2JCSsrK/r26kFhdlY5ieBdu3bx6GOPg7UTY4b24Z9//qnR1YwcORKZTEb79u1p06ZN2aj53nvvLZMyXr9+Pe+//z6hoaH06tULnU7H+fPniYuL4/HHpYpLGo0GjaZiMY7NmzczYsQI3NzcgJvLI584cQJ/f386dOgA1EweOTY2ltdee41PP/2UvLw8FIq7awyy5swaWju0JmtDPGpbOyIGPigdMJvh6G+IbfuxbXUGWReK6Dc+EEf3hpV/trJW0C7Cg1PxGeh1ta/01iGmGwZdCSmHKhH+awiCHpaehi7Wrb/nQ5+nlV0r3tr1FnpT7ZeoNlXurv+u6+g+skOtzzWYDJzJP4OAgL+TP0pZ+WVxypYt0Z8/jzEzE6Vn5blWJycnevfuzbp169BqtTzzzDOAlM8eMmQIcXFx/Pnnnzz34tM8PeF5RgwbhVKpxN7ZlaLcHEwGQ8Ucu9oJ8tOBmuVfayqP/Msvv9CxY8ca2WxIKpNHnjp1KgMHDmTt2rXExsby999/06lTp9vpZo25VHSJvel7edpzNGcO7KDbqLGobK689xd2Q+FFjrWaS9LOS0Q+4IdfsFuj+BUY25KkXekk779MYGzLWtnw6axBbWfPyT07aBcVU88eVkKnQfDHK5D4a4XdyLeCjdKGGTEzmLhxIl8f+ZrnQ5+vRyfvfprZCF9CKVfi6+CLSTRxoeBChZG+3MEBuZMTxsxMzMXFZa9nZmaWrV4pKSlhw4YNdOrUiS5dupCQkEBCQgJDhgzh3LlzeHp68tRTT/Hkk0+SlJwoxXARbJycUVip0BXml02s3XPPPfz888+gsuenVevp3kXSPbqZPPKKFSswm82cPn2aM2fOVBrU+/fvz4IFC8r6OnjwIAA9evRg6dKlACQmJlYqS9ynTx9WrFhB9pU5jZvJI3fs2JGUlJSy1FJN5JFPnz5NcHAwU6ZMISoqquwp5U6m1GjiQk4xXx9ciYiIIr4Qucoaz679rk2WJv5KprkTcdvt8Q10IWqQf6P559XWEWcvG47vuFhrG3KFgnZRMZzetwdjPciP3BRrJ2jXT1LQrOPO99hWsQxsM5BvjnxDcm5yPTnYNLhrR/h1xVphTSu7VlwovMDFoou0smtVbsSsbNECs1aLPjUVVbt2CDIZly5d4oknnsBkMmE2mxk5ciSDBg2qYHvr1q3MmzcPpVKJnZ0dS5Yswc5FhQiUFBpwdPfAbDJjvDKhuWDBAsaPH8+8efNwd7Zn8YczwGxi1KhRPPXUU3z66aesXLmStm3bluvH19eX6OhoCgoK+OKLLyrNf8+YMYNXXnkFjUaD2WzG39+fNWvW8OyzzzJ+/HgCAgIICAggIqLiqKpz5868+eab9OzZE7lcTlhYGN9//30Fv66iVqtZvHgxI0aMwGg0EhUVxcSJE6v9O8yfP58tW7Ygk8no3Lkz999/f7XtG4MSvYmTGYWczynmfE4xqbklpOeXkF5QSkaBjhytHhCxabMK6+LWFBxN5LBDEPPn78JepaCTpw1fZf3Bn/nvobRV0HtcADJZ7fLStUEQBAJiW7Lzl2Ry07W1Xv7ZoUssiVs2cO7wAdpG1LxQSa0JehhO/gUX9kDrinLdt8LrUa+zI20Hs3fNZsn9S5AJzXJsW4FmJ498I5nFmVwuvoy7jTseNuWrEJmKitCnpKBwdUXZokUVFmqGKIoUZOkoLTbg7GWLrjAHbX4eLi1bYWVtc61haSFkJ0vrk62dq7Q3bty4aid0LdScxKPHSMOFvWdz2Hsul6Np+RjN1/4vXG2t8HJU4+WgxvPKd9HqAt+ceZkxl+9Dvv8k4f+ex0WzNSfSC1GkxBF79iLHdb352U5Pjo1AUEtHNN6OBHs7ovF2orWLTYPeBLR5pXz/xg6iBvoTXcunC5PRwOdPP07biC7c//xr9exhJZQWwbx2EPZ4lRLSt8Lvp3/nzX/e5M0ubzKqU0WV0qZKdfLIzXaEfxU3azf0Zj2ZxZnIBTmu1tc08uV2dihcXDBmZyOzt0de1capGlBWAL3UREFWCU6eLuiKteRnXsbV2xeZ7MoIxMoOZEppE1Y1Ad9C7RBFEb3RjFZvorjUiFZv4lK+jmd+34+VQkaotxNP92hDiI8Tfq62+LhYY2NV8d/kw72rUYkKbJLS8InsQu+oa/MOJz5fy0ZdH9r1cOfVjs4cScvncGoeP+4+R6lRSlfYqxX07ODOg6Gt6NHBHStF/Y5AbZ1UtGrvRPK+DKIG+t1ysR8AuUJJu8gYkvfuxmgwoFDWXQKiWlR20OE+SUxtwPtws3oSN2Fwm8GsOb2G+Qfm08unF162XvXk6N1Lsw/4giDQ0rYlJrOJdG06cpkcJ9W1TUcKLy9MRUUY0tKQtWuHIK/9kjqZXIaDm5q8jGK0eXoc3DzIvZSGNjcHe1e3qw5J+UxtllTvVlZ5f99//32t/WhOiKJIicFEcakJrV4K8EaTFHTlMgFbKwWO1gp+ebYrQa0cUSlu/vc1i2b+Pvc3/bQaSouyCX9gaNmxgvQCth0OooXTZe57pBcyuYyHI7wBMJjMnMoo4khaHgfO5bH+WDprDl/CyUbJwOAWPBjWighf53ob+beL9GTb0hNkpxXh5l27+q8dYrpxdNsmzicm0CasYgnNeifoYTi2GlK2Q9vedTIlCAIzus7godUP8e6ed/m096e1uvE1JSyJLaQPhre9N7ZKWy4WXqRQf21CUpDJUHp7IxoMGNLT69yXlVqBjaMVOq0BUVRibe+ANj+3vIyy2gkQQZdf5/6aG2azSJHOQEaBjjOZRRy9WEDy5SIu5pdQojdhr1LQysmaDp72BLZwwM/NFnu1kojWLjUK9gCHMw+TXpROqxMi7q398Q4IAqSby7Yf9gIi9z7siExe/t9LKZcR2NKBR6J8mTtcQ/yb/fj2iUgedChB//NP7Hz6ZdZ1H8Bvr/2H5Mt134DWNtwdQSZwam/tpRZ8g0Oxsrbh5O4ddfanRrS/D5S2tZZMvhEfex+eC32OrRe2suFcI+kD3cFYAv4VZIIMH3sfVAoVFwovlAv6chsbFG5umHJzMdXDTlBbRxUKK0lV08bJRZJRzryuQpaV7bW0joUaUaI3lgX4M1laMgp0mMwizrZW+LrY0MnLgU4tHPBxscHVToVaKa/1aO/vlL/xybVDn5FD+ANDy+ycPpDJ+bMCXZx+xT6sz03tKOUyIo5u55Gv32TCodX0KTiDPUY6rV3K61O/ZtCC7azcX7noX02wtrPCJ8CZU3trUH2tChRKJW3Cozi9P75xtHWU1tChPxz/A0y130dwPWMCxxDgEsB78e+RX9q8B1GWgH8dcpmc1g6tUckrBn2FhwcylUrS2qmlRs1VBEHAwU0NIhTl6HFw9cBYWoo2L/dqAymtU1oIlWj5W7iG2SxyKb+E5MtadAYzbvZW+LnaEtjSgfae9rRyssbJxqrecuRm0cz6c+vpmu6Dtb0Dne7pAUBpiZHty07iZpVCcIQSFNWrYIqiSOaCz7g0fQa2XbvSLm4bwbt3ELvpT+T+bZh1dCVqbSGTVhzi8W/3cCGnuFp7VdE+0pPCHB0ZZ2uvL9O+yz3oCgtIPV57rZtbovMwKM6GczXbgHgzFDIFs+6ZRY4uh4/3f1wvNu9WLAH/BhQyRaVBvyy1YzJhuHSp7v0o5dhdmcQ1mZSobe3Q5uZg1F/ZHWjtjJTWsQhBVUWRzsDJy4VkFpbibKukg6cdLRytcbBWopA1zEc74XIC2uxsbM6VENznvjLZgT2rz1BcUEov+4XIgodWa0M0m0mfOZOshQtxHDYMn88XofSQVojJ1Gp853+EqriIj8+t4Z2hnTl0IZ/7Po5j8Y6zmM23NlL3D3VHrpBxal/t0zr+IREolFYk791Vaxu3RPt7pbTO0d/qzWRn186MCRjDL6d+YW/63nqze7dhCfiVUFXQl1lbo3B3R5+TQ5hGU+ka/Oq4UR5ZfZ2qprWDC4JMoOBqakdpw6q/4ziW0Djl5u4meWST2UxqbjFnsrQIQBt3O7ydbVDIG/7jvC5lHYEXnBCAkHsfAODyuQKObEsl2Pc0nnaXoW316ZzMjz4ib8VKXJ95hhZz3kW4YfWLumNHPCb9m6ItWxh4bjfrX+1BTBsX3vrjGGO+28PFvJqXw1RZK2gd5Ery/su3fLO4ilKtpnVIOKfid9a5HGjNOrSGjgPqNa0D8Fzoc7Sya8Xbu96m1FRab3bvJiwBvwoUMgV+Dn6o5WouFF6goFQaaSvc3Vm0bBkdfH3rXKHq6lJNmVxGUa4BO2c39LoSSgryQRBYteEfjiUeDQ95RgAAIABJREFUqXVapynKIxfqDJzKKCJXq8fdTkV7D3vsVI2z2MxkNrHpzAY6pTrSJqILDu4eiKLIjpXJWNsq6cJH0PGBatM5OUuXkv3Ntzg/Ohr3V16uch7BecwYbO+5h8sfzMO9JI/vxkXx/kPBHDyfR//5cfx2sOa5/XaRHhTn67mUXPuqbu2ju1KUk036mVO1tnFLBD4opXVSttebSRulDTNjZpJSkMJX/8/eeUdHVXV9+LnTM8mk9wpJSAcChN5C70RAERuKBT9siIr6qiioqEizoaiAggoiolKl994JkISEhDSSkN7blPv9MYDSk0kmCcizVlbCzL3n7Bnm7jl3n71/O/q7ehv3TuKew78Fl2P6KqmK9NJ0iquKuXDhAhv37+eJkSMxVFbe8KLLzMykR48ehIeHExYWxu7d/3xo33777avkkSVSCfllWUQ9MJgOXbox+vFxxJ46xe5du1i9YSuTP/yM8PA2/3l5ZJ3BQHp+OedzyxAEAV8nK9xsLRq0gvVY9jGszlcgrdQTPmAIAOdP5JKRUEiHTlUoqzMh9L6bnl+ybTsXP5yOVa9euLz11i03jQWJBNf3pxnDP+9/AMCYDt78PbE7AS4aJi0/yQtLj1NQdnuBMJ8wB6RyCYnHr+8FUVN823VAkEg4d6iBwzr1lK1zmS4eXRjqO5RFpxaRUNBAX15NiDs2D3/7j9+RnZJUr2M6+/jS64nxVz122emnFKeQXprOWy+9xaezZlGYno6o06EvLERmd3WB1NKlSxkwYABvv/02er2e8kt6PGVlZXTq1Inp06fz+uuvX5FHfvW1STz26FhGDBnNyrVLeef991m6eLFRhrhbK+4fcR84+F5n739FHrm4QsuFwgp0egNOGiUuGlWDOvrLbE7ZTEiKNbZu7viEtUavM7D3j3PYu1sSIv0JlNY3DedUxsZy4dVXUYWE4DF7FkINVEEVnp44vfgi2TNnUrJpM9YD+uPjYMlvz3bm212JzN0cz+HkfGbc34pegc43H0clwzvEnqTjOXR/oAWCCe+dhZUGr5CWJBzaT7eHHjd/Pvu/wzqDZ9e5COvfTG4/mT0X9hhlFwYuQXqTWpe7kXsr/Bpw2env3bwXla2KoFZBSKytEaRSdJmZGKqvXmVdlkeeOnUqp06dQqMxFr0oFIorcf9r5ZHHPT0WmUJK1KDRHDp6jKryMmOXLIUlVBUbi7Cu4W6XR9bpDaTll5OcV4ZUIuDnbNyUbQxnL4oiR05ux7FQQZsBQxEkEk7tSKc4p4KuI5ojObvmpuEcXW4uac89j9TGBq9vvkaiVt9ghhtj//hYlMHBXPzwwyspwVKJwHOR/vz1fFfs1ArG/XCYKX+dpqL65mmTfm2dKSus4mJyHbJ1OnShIPMC+RfSTB6jVpghrANgr7Ln9favE50TzfKzy+t17KbOHbvCv3Ylbm6kEinnTpxjx4YdBPgFoKvWUVJcwrg33uC5J5/kxWnTgOvlkZ944gleeeUVxo4di1wuv7Iy+rdEMPyTqlmZWgWicaNMW1WJQWbBlSIs9dUO926WRy66tKrX60WcNSqcrZVIGrFKMiY/Bqf4agS5JaE9+1BZquXI+mS8Q+zxtog2tqe8QTjHUF1N+ksT0RcU4PPLz8icnGo1ryCT4fb+NJIfHEP2nDm4/auPcqi7Date6MrsTWf5fvd59p7LZe6D4bT2un7/pVlLByRSgcRj2bj62tT+DQD823di66JvSDi4DwdPb5PGqBVXwjqr6lx1ey1DfYeyJnENnx/7nN7evf8zsgv3Vvi1YMYnM0hLS2P7ie3M/G4mkb0i+WnxYiJatODI5i03lUc+duzWTR0uyyPL5FLWbv6Dju27oLCww1JtSU52/qUirOs33O5GeeQzMTGk5pWRkleGTCLg72yJq42qUZ09wNaETTTPsKRF564o1ZYc+TuZ6godXUb5Gx2SQnNdOEcURbLef5+KY8dw/2g6FqGhJs1t0bIldg8/TOHy36hKuDrurJJLeXtICEuf7kiFVs+ob/axYHfSdXtLSrUczyB7Eo/nmFyEZWXvgFtAEPGH9pl0fq2RWxi1dWLX3PAOty5cll0wiAamH5hepx7AdxL3HH4tkUvl+Nj4AFCuK8dgY4XU2hpt9sUr2vk7duygdevWtGnThuXLlzNx4sRbjvnll1/yww8/0KpVK5avWMann8yiosTAg6Mf5POvviK834Mknj1z3Yf+sjzyoEGDbimPrNVqadWqFaGhoUyZMgWACRMmUFpaSnBwMO++++5t5ZFbt27NK68YFRPHjBnDzJkzadPm6s3kf8sjt2zZEolEUiN55LCwMGNISZDi16Y7RZU6XKxV+DtbYXED4bLGIGbvDuR6Ce36DaMkv5JTO9MJ7OyGg6sKYtca483XhHOKVq6k6PeVOPzfs1gPHlyn+R2ffw6JpSUXZ91YRbKLvyMbJvagd5AzH66L5dmfjlJUcbWOvV9bJ0ryKk1oDfoPAR27kpOcREGW6Vr7tSIkCspzIaX+v2S8NF48H/48O9J3sCllU72P3yQRRbFJ/rRr1068lpiYmOseaywqtBViTG6MGJ8fL1ZXV4oVcXFixdmzokGnq/PYep1ezEkrEXPTi8Wc1GQx+3yiqE8/Jorl+VeOefzxx8UVK1bUea6mgFanF1Nyy8STaQVifFaxWF5d9/ewNtzuc5VclCy++Uxf8bMXHhYNBoO45ccz4jfPbxeL8ypEMXG7KL5nLYoxq686pzI+XoxtHS4mP/FEvXwmRFEUcxcsFGMCg8TSvXtveozBYBC/35Uo+v1vndh9xjYxo7D8ynMVJdXivAnbxP1/njPZhqLsi+Ks0UPEg3810GevskQUP3ARxbWvmmV4rV4rPrD6AbHnrz3FwspCs8zR0ABHxJv41XsrfBNRyVT4WPugM+hIKUtD6uGOWK1Fm5FR59vDy6qaep2ITGGLXq+nVG9xw7DOnU5ZlY747FKKKrS4WKvwc7bCwoxNvk1h88E/cCxS0rrvIPIzyzh7IIuwSA809ipjOEduaezWdAlDRQXpkyYhsbTE49NP66Sw+m/sHn0EuYcHFz+diXgTXRtBEHi6uy/Ln+1Eflk14344THGlcaWvspLjEWBbp7COtZMzrv4BxB+oH9mD26K0ghZ9IXZ1nTth3QiZRMbULlMprCpsErILOr2Bnw+k8O3OxNsfbAL3HH4dUMvVeGm8qNZXk6bLQersiL6oCP2lWHddUKhkqK0VVFcKKC2tKddKqS4vvRLW+fHHH+/45ifl1TqSc8uQCsZYvYt148fqb0Ti7j0YpNCpz30cXJWETCml3UAf4/9F7FpjnFn+T3PyrOnTqU5Mwv3TGbXepL0VEqUSp1cmURUXR9HqNbc8tp2PPd8+1o5z2aU8u+QoVTrj58avjROFF8vJzygz2Y6Ajl25mHSOouy6q8fWiJD7oPSisROWOYZ3COGxkMaXXdidkMOQL/bwzl+n2ZuYZ5Z9hTvO4ZvjTagLVgorPK08qdBVkKGsQGJlhTYr66peuKZiaWtU1dRVWyCVSimuViDeJdo6lVq90dlLBHwdLRstVn+7z1Nm4QWsEyuQB3tQmK3n/Mlc2vTzxsJKAakHoCwbgodfOb5o3Tpj3H78eKy6dq13e60HD0bVqhU5X35x01X+Zbr6OzLzgVbsT8rjtRXRGAwivm2cESQC8XWQTG7R0fi64g820OZti/4gVRpX+WbisuzCtP3TGlx2ISmnlKcXH+axhYco1+qY/2hbFo9rb5ZahzvK4atUKvLyzPPNVxesldZ4WHlQpi0j21ZAkMmoTkurP1VNBCQKW3SihNKCut89NDbVOj3nc8sAgeaOlsjrudtTTRFFkby8vBtudl9m44YlKHQSOg4YwaE1SVho5LTu42V8MmYVyFRGhwRUp6eT9d5ULMLDcXrhebPYLAgCDk+OQ5eRSdm+2zvcEW08eX1gIGtOZvD2X6dQWcnxCrIj4dBFk68jWxdXnJv7kdBQGvkqa/DvY3y/zaTlYyGz4N3O75JSnMK3J781yxzXUlSu5YO1MfSfu4sDSfm8MTCIzZN6MjDMzWyFbU0jBaKGeHp6kp6eTk6O6SXi5qRCW0FWVRYXUKIurkLIzkbm4GCUO64D2kodlWU6JEIZer0ey7wypOZuN2cmtHoDeaXVGEQRJ42SpKLGXXOoVCo8PT1v+nz6vsMYNCLedh04FnuCLiP9UahkRscTu9oYu1daIep0ZLw2GQD3WbOuE0SrT6x690Zqa0vhyj+w6t79tsdP6OlHaaWOr3ckIhEEHuvgwtYfY8lKLMLN/+aaSbcioFM39ixbTHFuNtaON6/yrTdCouDserhwFLzM03mri3sXhvkO44fTPzCw+UAC7ALMMo9Ob2DZoVTmbI6nsELLmPZevNIvECfNrSW164M7yuHL5XKaNzetIXNDseDUAj4/9jmvX4wgYtEBHMaPx/mVSXUaUxRF1n4VTXpsEWLhl2icXXlk9kIk9bQZ2FCcyShi3MJDCAIsebIjIe7WjW3SLUlPjsfiYjWGnr4cXZ+ChUZOWE+PS08ehpJMY3wZyJk3j4oTJ/CYMxuFp4dZ7ZIoFNhEDSd/6TJ0BQXXSXtciyAITB4QiF4U+XZnEtIIEQ+5hPhDF013+B27sGfZYhIO7qPdkJvrB9UbAQON9Sixq8zm8OEf2YVp+6axZFD9yy7sis/hg7UxJGSX0snXnilDQwh1N60QzhTuqJDOncDTLZ/mybAn+dTlCOm9gsn77jtKtm6t05iCINB7bBByCw2WVp3JzszlyNr60wpvCPaey2XMdwdQyiT89mznJu/sAbat/RmDINIqJIq02ALa9PNBrrzkAGJWgVQBAQOoOHGCvPnfYjNyZJ3z7WuKzchRoNVSvLpmcW1BEHhzYBDje/iy5EgahXYyEo5eRK83LURi5+aBUzNfYnZtb5gQq4Ut+EYa33czzmensmNy+8lE50bz69lf623cxJxSnvzxMGMXHaJab+Dbx9qx7JlODers4Z7DNwsvt32Z0QGjeSMinlJfFzLeeJPqS9oxpmJpoyTy4SBKJd1xVKvZv2Ip+RkX6sdgM5JdXMmk5Sd4ZMFBnKyUrJjQBV8nq9uf2MjotFouHj5JppuWyhP2V6/uRdEYzvHrjajUcPGTGcgcHXF5660Gs08VGICqZUsKV/5RY4crCAL/GxTEy31bsKmshKoyHeeiTQ+Ptu47kOzkRDIT4kweo1aEREFhKmSeNOs0Q32H0tW9K18c+4LM0ro1Oyoq1zJtzRkGzN3F4fP5vDU4iE2TejAg1LVRGqrXi8MXBGGgIAhnBUE4JwjCmzd4XikIwvJLzx8UBKFZfczbVBEEgbc7vU2/FkN4fWAu1YKe9Jcm1jlzx7+dMy0C9ZTJH0IiEdj83ZcN05DCRFYcSaPP7J2si87kxd7+rHupOx62Frc/sQmQcHgfkko9tv5tSI8rvHp1n3EMitIgeDglmzZTceIEji+9iNTK8taD1jO2o0ZSFR9P5enTNT5HEARe7hvAk6NCqBBEfvo1lviLpvVpDu7eC4WFmuMb1pp0fq0JGgKC1LjKNyOCIPBOp3cQEZl+0DTZBZ3ewE/7k4mctZ3F+5J5IMKL7ZMjGd/DD6Ws8UKxdXb4giBIgXnAICAEeEgQhJBrDnsKKBBF0R+YC8yo67xNHYkg4cNuHxIaGsmMwdVUJiSQOXVqnW9/ezzZGQuZiNqyA+mxp4neurGeLK5fvtmRyOTfo2npacPGST14tX8gFoo7Z89h/8Y/KFXp8Czpc/XqHiBmNUhkiL59yZ4zG2ULf2xHjGhwG62HDEFQqSj8fWWtz32kiw+uofY4FukZMmcXYxcdYld87QqyFCoLwiL7En9g7z/9mM2J2h6adzd7WAfAU+PJ8+HPszN9JxtTaneN7T2Xy5Av9jBl1RkCXTWsfbE7H49siaOV+Tdlb0d9rPA7AOdEUUwSRbEa+BW4tqlnFLD40t+/A30EM97PNJW0TblEzqyes1B26ciK7hKKV6+h4JJgmamobKyIbHWSCkMENi4B7PrlB0rycuvJ4rojiiIzN8YxY0Mcw1u7s/jJDjR3bNiVb10pyr5IflwiWS5yKpJlhPf1/md1L4pGh9O8BwWrN6NNScXp1VdrpG9f30g1GqwH9Kd43brrJLprQu+BzZEjMLGFO7GZxYxddIieM3fwxdYELtSwjWLr/kMw6HVEb91Q6/lNIng45CdCdsztj60jjwQ/QohDCJ8c/ISiqqLbHp+SV8b4JUd4ZMFByqp1fPNIW5Y906lJ7VfVh8P3AP4tkJ1+6bEbHiOKog4oAhyuHUgQhPGCIBwRBOGIqamXlVo9I7/Zx9KDqehM3JCqT1QyFV/0/oK4oWEc95eQ9fHHVJw4Uacxm/eMINhiO5WV3dDrdGxZ+HWT+JITRZEP18Uyb3siD3XwYu6D4cgboM9sfXN6x2ZAxFs+FKWl7OrV/cXTUHAefbOB5M6bh7pjR6xuowhqTjQDB2IoLaX8YO2rUN38bHDwtMI+vYrdkyP57MFwPO0smLM5nm4ztjFv+7nbjmHv7oFPqzZEb9mAvo51JzUieBggGO+yzIxMImNal2kUVhUy5+icmx5XWqXjk7/j6DdnF3vO5TJ5QCBbXunJoJbmy6c3lSZ1NYqi+J0oihGiKEY4mViSnldWjQC89ecp+s/dxbroTJObN9cXlnJLvuk/nzWP+JGjMXD+xefRXZIcNgm/PnRzWIaVWonavidJRw9xdn/9NokwhQW7z7Nwz3me6NKMj0a0RNoIjUrqisGg58S2DeTYiVjntSC8j5cx7/4yMatAkJB/sAB9YSHOkyc36kVt2aULErWaks21byIvCAJt+nlTkFVO1tlC7mvjwdJnOrH79V4MDnNj5saz/HQg5bbjtBk4lNL8PBKPHDDlJdQOK2fw6WL2OP5lguyDGBs6lj8S/uBQ5qGrnjMYRFYcSaPXrB3M35nIsNbubH8tkud7+aNqYnpQl6kPh38B8PrXvz0vPXbDYwRBkAE2QB083s3xsLVg5YQufD82AplU4Pmlx4iat5fdCY1brGWrsuWLqIX89Igb2oJ8El6aYHolrkKNMrArve2+o7oqFCt7b7b98C3lxbe/7TQX609lMn19LINbuvLu0JAmt7KpKSknj1NZUIhM0Qq5SkLLXl5XHxCzGp1TJ/KXrkAzYAAWYaZp3NcXEqUSyx49KNm27bZSCzfCP8IZKzslJzanXnnMy17NZ2PC6RPkzLurTrPm5K2lkJu3icDayYVjf99a36feCImCnFjIiW+Q6Sa0noCnlSfvH3ifSl0lAEeS87nv671M/j0aLzsLVj3fldmjW+NiffOq7aZAfTj8w0ALQRCaC4KgAMYA195vrQYev/T3/cA20YwxCEEQ6Bfiwt8TezD7gdbkl1Xz2MJDPLLgACfTGk9x0kntxLQnlrB8mC0cPUXipx+YPlhIFN7iDkLDZWh1PaksLWXHkgX1Z2wtOJpSwKTlJ2jrbcuc0eGN0oKwvji1bRM6hQS3qj607u2N0uJfq/vsOMg9S36iI4aKCpxefKHxDP0Xmr590efmUnHy+iY2t0MqldCqtxcX4gvJTvlHp0kulTDvkba097Hnld9OsCv+5gsmiURK20HDuBB3hqxzDeCEg4cZf8c2zCr/37ILsw/N46Vlx7l//n6yi6v47MFwVk7ocsMuY02ROjv8SzH5F4CNQCzwmyiKZwRBeF8QhMuqUgsBB0EQzgGvANelbpoDqURgVDtPtr3Wk/eGhRCXWULUvL1M+Pko57JNbwJRFzysPHj6jV/Y2U6FdslvpK793bSBLglKdfXYhMbJE7VdF2J3b+f88SP1a/BtSMsvZ/ySI7jZqFjwePsmeytbE8oKCzh39CDlancEhfCPZs5lYlejq5CSv+UU1kOHovT3bxxDr8GqZw+QyynZUvuwDkBoN3cUKinH/7XKB2M3re8fj8DPyYrnfzl2y/TNsF79UVioG6Yg0NodPDs0SBz/MuGOHWihjmRZ/BI2JRznpd7+bHutJ/e18bij7mbrJYYviuJ6URQDRFH0E0Vx+qXH3hVFcfWlvytFUXxAFEV/URQ7iKKYVB/z1hSlTMq4rs3Z+XovJvUNYFd8Dv3n7uSN36PJqGE2Qn3ia+tLj1k/kuQuJe/t98g+a8ImrlID/n1RJPxJ70eD0OnboNK4sPn7eVRX1F2psyaUVGp5avFhtHoDi55oj72lokHmNRcxu4xhEQdDb5p1sUZleY0eTswqctP9EXU6nJ5/rnGMvAFSjQbLjh0p2bLFpM17hYWM0O4eJB7Npjj36uvBxkLOoifao1JIefLHw+SW3lhJUqlW06rvQOIP7KUo23QlzhoTEgVZ0ZBvXlciiiKrT2bQZ/YOjp3ojkKwJKz1Jib29UfdRLqx1YYmtWlrbqyUMib2bcGu13vxRJfm/Hn8ApGzdjB9XQwFZbVPa6sLIW6tcftsNlqJgZhnx1FSZEJqZUgUlGTgpUmiZaQPBnpRkp/L7mVL6t/ga9AbRF5adpzEnDK+ebTdHVE9eytEUeTUtk0YLB0Q5db0GtL66gNyz6E9H0PhyTJs7otC0axZo9h5MzR9+6JNTaUqPuH2B9+AVr09QRA4s/v66m13WwsWjI0gt7SK8UuOUKm98V5B20HDESQCx/5ugJV3yKXggRlX+SfTCrl//n5eWnYcO0sFy5/qwwfd3+Zs4Zl6lV1oSP5TDv8yDlZK3h0WwrbXejKslTsL9pyn58ztLNpzHm0DpnK2bTUA/dSJOGVVsvm5EVTpaqnDHXhJUCrmLzqP8MPW1RcLmwhObFrHhTjz5il/tD6W7WdzeD8qlK7+jmadqyG4EHeGgswLyMW2GILzUVtfUyQTu4q8WA2iKOA4oems7i+j6dMbBIGSraaFdazsVPiE2nP2QNYNs9paexn3Z46lFvL679E3vJPQODgS2KUHp7ZtorLMzCFTW29wb2OWbJ3C8mreXBlN1Ly9pOSV8+moVqx+oRsdfR0Y3HzwFdmFrLIGagBTj/wnHf5lPO3UzB7dmg0Te9Day5b318Yw8LNdbD+b3WA2dI76P/IfG0Dw0Vx+/uAh9IZaZFqobMCvN8SsRqGU0ufxYAxCRxQWtmz89gt0JhTj1IQf9/6TfvlIRx+zzNHQnNq2CUGqAKUvEQOuV2TVHvqTwiRLbEeOMLsapinInJywCA83OY4PENTZjbKiatJibtxzYXBLNyYPCGT1yQzmbrnxnUTE0BFoKyuI3tIAhVghUUaZi8LU2x9bA0RR5M/j6fSZvZMVR9N5tocvOyZHMrq915UUY0EQmNJ5CiIiHx74sEnUv9SG/7TDv0ygq4YlT3ZgwdgIDCKM++EwT/xwiHPZpmmM1JZu/5tDQYQ/HVbEsnDZ67U7OSQKilIh4zjuLewI7+2HKOlFQUY6B/5YXu+2bjidxbS1MfQPcWHK0GsVNO5MKstKObt/D4IskESPaDr5R1x9QEEy+btSEEUBh2eeaRwja4Cmbx+qYmLRZpm28mzWyhGVpZzYfTcXDHsu0o/REZ58sTWBlUfTr3veuZkv3mGtOf73avQ6rUl21JjLncZi654Oej63jEcXHmTS8pN42atZ+2I3/jc4GCvl9XF6DyuPK7ILm1I21XnuhuSew7+EIAj0DXFh48s9eHtwMEeTCxjw2W6mrj5DYbl54/uCRELHr3+hylFD6Nz1/Hnwx5qfHDgIJLIrt7Yd7/PF3iMYpaYlh1f/TnZy/W1qHU3JZ+Kvx2njZcsXD7W5IwurbkTc3l3otdVIlKFYd6hGLrl6s1Z34FcKzqmx6d8bhbd3I1l5eyy7GZuhlO01rROVVCYhoIML56NzqCy7sbMWBIHpI1rSxc+BN/+IZt+56/eeIoaNpLQgn7i9u0yyo8Y4+IFryzqFdap1Br7alsCAz3YRnVbEB1GhrJzQhWC3W8shXJZd+PjgxzWSXWgq3HP416CQSXimhy/bJ0cyOsKLJfuTiZy1gyX7k80q1SC1tiZ4/g9oqiTop8zkcHoNqxbV9lfphMsVUvo+EYIg7YZEasGmb7/AYEJBzr8pKKtm1sazjF14yLiBd4enX17Lyc0bEKROnHVLontg5+uez1+2ElEvweGlVxrBupqjDGiBzNmZ0t17TB4jqIsbBp1Iwi163sqlEr55tB0+DpaMXXSIBbuTrgptNGvdFgdPb46u/dP8IY+QKGNz8+JbF4fdiMPJ+Qz+YjezNsXTL9iFLa/25LHOzWq0kJFJZEztPJXCqkLmHp1riuWNwj2HfxMcrZR8PLIla1/sTrCrNe+uOsPgL3abtWLXMiQU5/emEJpqYM+7E0grTrv9SWD80Bech6xTALj62tCmfyCCPJKLSec4ut60FVB2cSUzNsQZdVV2nCMy0Jmfn+54x6df/puLSefITU1CqgzjlNcOurl3u+p5fcoZCo4VY93eF6WvbyNZWTMEQcCyWzfK9u83qeoWwMlLg4On1S3DOmBM11z5f13oHeTMh+tieWbJEbKKKhFFEUEQiBg6gpzUZFJO1U036rYEX9JprEW2TlG5lv/9Ec0D8/dTUa1n4eMRzHukba2rZIMdgnks5DFWJqzkSFbD1r+Yyj2HfxtC3K1Z+kxH5j/ajkqtgccWHuLpxYdJyjFPFoLr/WOQjRrKwH2VzP/8CUqrazBP4PU64R2GN8fBqzUKdQv2Lv+Zgqyar4BiM4t59beTdJ2xjfk7E4kMcmbDxB7Me6TtHaNnX1OOb9wAyMjyEQltFoCV4ur00vyvP8Wgk+DwYtNe3V/GqltXDEVFVJ46ZfIYwZ3dyEktIe/CrT97Nmo53z7WjveGhbAzPodOH28l8J0NdJuxjffOKNAprVi2cAnf7kwkJqPYPKt9pwBwCq5RWEcURVaduECfOTv47Ug643v4svmVHvQJdjF5+gkWDl/3AAAgAElEQVStJ+Bh5cG0/dOo1jdsarcp3HP4NUAQBAaGubL5lR68MTCI/Yl5DPhsFzM2xFFeXf8KgX7vTUcf7MfIFRl8tOKF22fuWDpc0gn/64pOuEwupe+4UCTK3oiihM3ffnnLC04URfYk5PLYwoMM+nw3609l8nAHb7a/Gsm8h9sS6Kqpz5fYJNBWVRK3dwcSRQt2ua6jl1evq57Xl5aRv/EIVr5yVB36NJKVtUPduTMIAqV7TIvjAwR0dEEiFYjZc/tFgiAIjOvanLUvdufdoSGM69qMCB87lEolSc5tUGQl8N2qvQz+YjcdP9rKaytOsuZkRv3ui4XeB6n7oeTmm9WpeeU8/sNhJv56Ag9bo/bNW4OD61w8pZarmdJpCsnFySw41TjSJrXhzisVa0SUMikTIv0Y1c6DGX+f5Zsdifx1/AJvDQ5mSEu3etOQkSgUBH79PXFRQ4n85iCfe8/gle63aZ8XEgVrJ8HFM+AaBoBLM2vaDQzh4KrupMVs5tS2jbTqM/Cq0wwGkb9PZ/H1jnOcySjGSaNk8oBAHu3og41afqOZ7hrO7NyFXluJMtiPYosN9PS6Wua4cMl3GCoNOI4e0kgW1h6ZnR2qli0p27MHpxeeN2kMCysFfm2ciDuQRaf7/P7pBXALAl011y0KKkpD+e65Q7zjnY2uWy92xuewOeYivx9NRyJAuJctPQOc6RnoRCsPG9Ovn5D7YMfHxrBOx/FXPaXVG1iw+zyfb41HJpEwdVhIjeP0NaWrR1eG+A7h+1PfM6DZAPxs/ept7PpGaKp5pBEREeKRI007LnY0JZ93V53hTEYxLZyteK6XH8NauSOrJw34sv37SXnyKfYFgf2MDxgZMOoWB+fCrBbQ/VXo/c6Vh/U6Ays+OczF+MVIJLk8MedrNPaOVGr1bDidxbzt50jILsXX0ZJne/pyXxuPRm3B1pB8/8JESvLyiImypsQqj+VD/0ljNVRVkdizKwpFPj5/bjZmhNwh5HzxJbnz5xOwfx9SG9OaZGckFPDn7OP0eiyIkK7uJtuyddF8ords4JmvFmJl74BOb+BkehE743PYeTab6AtFiCLYqeV0b+FEzwAnegQ44aSpZXeoeZ0Q1XaUP7yG/LJqckqryCys5MttCcRllTAg1IWpw0NxszFPSDKvIo+oVVH42vjy48AfkQiNFzwRBOGoKIoRN3zunsOvG3qDyNroDL7ensjZiyV42lkwtrMPoyO8sFXXfXMze/588j77nCV9ZYx8ZxHtXdvf/ODFw6H4ArxwBP4l6JSbXsLy6ZupLFyColkwxwNGsC8pj0qtgQAXK17s3YLBLd3umjTLmpCVmMwvb72Ag29f5gQtYkL4BCa0nnDl+YJfl5M1dSreI6yx/Lj2zUUak/Jjx0l5+GE8PpuL9cCBtz/hBoiiyK8fHEIqkzD6rVt85m5DYVYmi15+lvbDR9L94Seuez6/rJrdCTnsPJvDroQcckuNoZ5wL1v6h7rQM8DYF6OgTEt+eTUFZdXkl1VTUP7P74IyLSOKf+Ip3W90rPqKHOyujO9mo2La8FD6h7qa/Bpqyl/n/mLK3ilM6TSF0YGjzT7fzbiVw78X0qkjUolAVLgHw1q5szUum+92JfLR+jhmb4rnvnAPHuvsQ5iHaassAKfx4yk7eZxHtu1ipvcLvP9/v+FjfZPq1tD7YO0kqjNOcUrnxb5zuew5l8vJ9EJClWp6KLtQnbSLCtGLMV160ifYma5+jne0nLGp7Pj5T0BA3ssJMVOkt1fvK8+JOh1533+Lyr4a9cBb3FU1USxatUSi0VC6Z4/JDl8QBEK7e7B7eTzZKcU4+5jWps/W1Q3/Dp04ueVvOo58EIXq6hW2vaWCqHAPosI9MBhEYjKL2RaXzZbYi3y64Syfbjh7w3FtLOQ4WCqws1TgbquiyGEIknPLmdMylazAnjhaKXGwUhDgommwFOIovyjWJq5l7tG5RHpF4qx2bpB5a8O9Fb4ZiMko5qcDKfx1/AIVWj3tfOwY29mHQWFuKGS1v9XTFxeTMGoEBQVZfPGSN/Mf/BUbpfFLJKekirisYmIzi0lNS2Nawgjm64czUzsaQYAQN2s6NLenuYMa3bYsiuJ+QCYrYtycr7Gyv67L5H+C8pJK5o8fi5V9M06NrCC+IJ4NozZckbktWrOWjMmT8eyWj+aTveDYNGSQa0P6SxOpiI7Gf/s2k+V7qyp0/PjGHlpEuNB7bLDJtmTEx7Fsymv0emI8bQcNv/0Jl8gsquDQ+XyUMin2lgrs1HLsLRXYWMhvHDad1xHUjjBuncm21pXU4lRGrh5JD88ezIm8eVtEc3Jvhd/AhLhb8/HIlrw5KIjfj6bz0/5kJv56gg+sYnm4gxcPd/TB3lJBSaWWkkrdpR8txZVaiit0xt+XH6sw/tb0mcDYn6dx/08p9K8chzT//ygoM1DxL+VCF2slD6la8xDHaD74Yzr5OV6VM18S5MbS9y5SlvMjG7/9kpFvvndHaXnXF7t+3oBoKKf1kP58l/kmo1qMuvI+iAYDed99h8JBhlVb/zvS2QNYdu9GyaZNVMXHowoMNGkMpYWMgA6uxB/Mosso/+vlomuIe0AQ7gHBHF23ivD+Q5BIa7bidrOxICq8FrpFIffBzhlQchE0pqda1gVva2/+r/X/8fmxz9meup1e3r1uf1IDcs/hmxEbCzlPdWvOuC7N2JWQw0/7U/hy+zm+2Hb75tAAGqUMjUqGRiXHQuPG6j5PcP/GBYzaE8eW/n8y2PYF3GzVBLtqCHKzNjr3I6mwdhKDnfPA8urNNo29it6Pd2b9V+dIPrGD0zs207JXfzO88qZLdaWOswe2IVNYUxoMVbuqrrooS3fspCohAfeOBQhhYxvR0rqh6dWLLEGgZPMWkx0+QFgPD2L2ZBC3P5PwvqbLSkQMG8Hq2R+RcGg/gZ273f4EUwi9D3Z+ArGroUPjaR49Hvo468+vZ/rB6XRw64Cl3LLRbLmWew6/AZBIBCIDnYkMdCY1r5w10RkYDOIVZ25tIb/0twxrlRxrlRwrlewGm6hdyXq/nGFLl5LgvgvbB0N5qs01bfaCh8O6V+HMX0adkWtoEeFCaORATm0+x7YfvsMnLBxrp6YXazQXR9adRld5nrDeUezI2IlGrqGdSzvAuFGZ9+23yB2tsfbJgJARjWyt6cgcHbFo25aSLVtMTs8EcPLW4BFox9ENKQR3db+65WMt8IvoiK2rG0fWrCSgU1fz3Fk6B4NTkPGz34gOXy6R817n93hs/WN8cewL/tfxf41my7XcK7xqYLwd1Dzfy58X+7Tgia7NGdXOk34hLnTydSDU3QYvezU2avlNM2Zc3nwDVevWvPi3hLXb5vNnwjUt5SwdoVl3OPPnlSKsa+kxJgg7ryj01QbWfzUH0dBwPQAaE221/lJlrUj7qMHsSt9FN89uV8TSyg8dpuLkSexbSxDcwu7YcM5lNH37UhUXR3VaDSU6bkKXkX5Ulmo5tjHF5DEkEinth48iKzGBs/vMKKoWOgJS9kLxraUhzE1rp9aMCRrDsrhlROfUvtewubjn8O8wBIUCz88/Q2Wp4Z01SmbsmMq+C/uuPih0BOQnXtHWuRaFSsagZ7siU/fkQtxpjm2ou7zsncCZXelUlkTj4hdKspBFfmX+Vdk5ed99h9TeDlu7GAgb2YiW1g+afn0BKNlsukY+gLOPNQEdXDi5NY2S/EqTxwnr1Q/n5n7s/Gmh+dpwho4ERLM0RqktE9tOxFntzNT9U9EazCwVXUPuOfw7ELmrKx5z5uCQXckrm1W8smMSZ/P/lb4WPNwomXx65U3HcGluTedRw5HIm7Pr5x/Ju1C3VWBTR6fVc2j1LjAUEzF0CNtStyGTyOjmYYwnV5w+Q9nevdj3CkAi45LjuLNReHqiDA6uU1OUy3SM8gURDq02XW5bIpHS58kJlBbks3+lmVoEOgWAS8tbfvYbCku5JW93fJuEggQWn1nc2OYA9xz+HYtlp044vzKJltHFDDsi8NzW5/5puWbpAL694MwfNw3rALQb1AyP0FGIBhnrPp+FXlf/ukBNhdi9mZTlH0dhYYlfRCe2p22no2vHK2Jped99h0Sjwc4lEdzbgv31Xa/uRDR9+1Bx/Di6nLqpvFo7WNCqlydxB7PISTO9MZB7QBBhvfpxbP0q8tLNtMgIGwHph6Cw8Rcxvbx70c+nH/NPzie1uH46c9WFew7/Dsb+qafQ9OvLyE0luJ8r4rmtz1FSfeliDBtpbP124ehNz5dIBAaO74jKph85KYkc/PO3BrK8YdHrDBxZH4tBl0hYZB9Sy9NILUm9IpZWlZREyebN2I0cjDQ/GsLuvGKrm6Hp1w9EkZKt2+o8VrtBPqjUcnYuPYuhDr0huj/8BHKVim0/zDePgublu7Mzf976uAbizQ5vIpfIef/A+43eEvGew7+DEQQBt48+QuHlzZtrZBSkJ/HKjleM8cKgISBV3PbW1trBgr5PD0eiCOLAyl+5mFSzlNE7ibj9mRRnnwBRT8ve/dmeth2ASK9IAPK+X4CgVGLf6tLlEHpfI1la/yhbtEDu410vYR2lWk6PMQFcPF/MkfXJJo+jtrah24NjST19ktjd2+ts13XYNzc2OD/zR/2PbQLOamcmtZvEwcyDrE6suW6/Objn8O9wpBoNnl9+gbSimllb3Dicvp9p+6YhKq2hRX/jKuc2WTgB7V0J6vogCGrWzJ2Jtrqqgaw3PwaDyNENyQhiDG4tAnH0bsa21G2EOYThYumCNiODojVrsH3gAWQpG8CrE9h4NrbZ9YYgCGj69qXswAH0xcV1Hq9FexcCO7pyZH0yWUmmt/Zr3W8Q7gHBbF/8PeVFhXW26zpCR0LGcchLrP+xTeD+gPtp49yGmUdmkl954ybxDcE9h38XoGzRArcPP0Adk8zMk6GsSlzFNye/MYZ1SjKNWuG3oddj4Wich1CUfYHdS5c0gNUNQ8qpXIounkdbmUPL3gPILs/mVO6pK8VWeYt+AMBheA/IPnNXhXMuY92/P+h09RLWAegxJgCNg4rNi85QXWnavo8gkdD/2ZfQVlaw7Ydv68Wuqwi9VEPRRMI6EkHCe53fo0xbxqeHP208Oxpt5nvUKzZDhmA/bhyeG6N5OSucb05+w18yHcjVNcpYUFnKGTRhCFJla47/vZq0GNM7JjUlorenIxCDXGVBYJfu7EjbAUAvr17o8vIoXLECm+HDkefuAkFi7Ctwl6Fq1Qq5uzvFG/6ul/EUFjL6PhFCSV4lu3+NN3kcB08vOo0cw9n9uzl3pJ4VSW29wKtjk8jWuYyfrR9Pt3yadUnr2HvB9AY1deGew7+LcH71FdSdOtH1l2iitGFMO/QJ+/w6Gzth6W+/EvMMsqfNoIcQJDas/Ww2VeVmypVuIPIySkmLzUZbEUdg5+4oVBZsT9uOl8YLf1t/8hcvQayuxuHpp+DUCmjWrdE0WMyJIAhoBg2kbO8+9IX1Ez5x87el3eBmxB3IIuHIzRue3472UaNw9G7G1gXzqCipe8jpKlo+ANkxxqZATYSnWz5NM+tmfHDgA8q1DX993XP4dxGCTIbHnNlIHR0Y+3MmLaXevKJN5ayuGJJ21GiMrvcH49BsBOVFeWxZYIZb7QYkens6GM5j0FUT0j2SoqoiDmQcoI93HwylpRQsXYqmf3+UigLIT4KWjadhbm6sBw66FNbZWm9jth/cDFdfa3b8cpbivAqTxpDK5Ayc8DIVJcWs/WwGBhObr9+QkPuMvZ5Prai/MeuIUqrk3c7vcqH0AvNPzm/w+e85/LsMmb09nl9+iaGwiHdWy7GRWvOcqwtZJ2oWl5fJpQx7aSBydQfi9m4l4fCd1fzjMpVlWuIPZKFUJWLl4IhncBhbUragE3UMaj6IgqXLMJSW4jD+GTj1G0iVEFJz6d47DVVYKHIvL4rX109YB0AildDvyVAQRbYsijE5VdPF15++Tz9P6umT7Px5Ub3Zh5UT+PWGU7/fNnGhIWnv2p5RLUaxJGYJsXmxDTr3PYd/F2IRGor7Jx+jP3mGz46GUCaR8VzhYUpKa3brbe9mSa8nxiJIHfn7q88oLzY9G6OxiNmbgbaqjJLceIK69ECQSNiQvAEfax8CLZqRv3gxlt26YREUaIzzBgwAlemNapo6giBgPWgQZQcOoMuvvywRa0cLej4cSGZiEUc3mK61E9arH20HDefY+lWc3lH3FNIrtHwAitIgrWktXCa1m4St0pb39r2HztBwBY/3HP5divXAgTg+9xys28q8tM6cl0t5ZdMzaPU10/QI6+GNX4dH0VaWsWbu3EYvGKkNOq2eU9vT0dilIRr0BHeLJLcil0NZhxjQbABFf/yJPj8fx2fHw/mdUJYDre7ecM5lrAcNBL2+zto61xLQwZXAjq4cXle3VM2ejz2Fd1grtnz/FRnx9bTyDRoCMosmFdYBsFHa8GbHN4nNj+WX2F8abN57Dv8uxvGF59H074962W4+PWPgQMl5pu6fWiPnLQgCg56NxMopkvSYIxxdV3+hAHNzfFMqpQVVYIjHwdMbJ5/mbE7ZjEE0MNCzH3mLFmLRpg0WERFGR6C0Af9+jW222VEGBaFo1oziv+v//7LHmACs7JR1StWUSKUMfflNNA5OrJo1neLcuslBAKC0gqDBxvTMGi52GooBPgOI9Izkq+NfkVbSMDIQ9xz+XYwgkeD+yccoAwPx3izjtaQSVieu5tPDn9bI6SssZIz63zNIFV7s+mUBuekXGsDqulGcW8HRDSl4BcvITY0nuFskgiCw4fwG/G39cdoThy4jE4dnxyNoKyB2jTF2L1c1tulm53K2TvmhQ+hyc+t1bIWFjL7jLqVq/pZg8jgWGmvue30KuupqVs38EG2l6eqcV2g5GiryIbF+6hDqC0EQeLvT20gECR/s/6BB7qLvOfy7HIlajde8rxAs1HRdJ2ecKoyfY3/ms2Of1egD5uihod/4lxFFgRUffIy+Bumdjcne388hCGDrlA5AUNceZJVlcSz7GIN8BpD3/fcoAwOx6tkT4v+G6tL/RDjnMjZDhoDBQNHq+pfEdve3pe1AH+L2ZZJ4LNvkcRw8vRk68XVyUs7z99f10K/BrzdY2EF009OKcrV05eV2L7M/cz9rkswvU37P4f8HkLu74znvG3QVMkYtjOFB3/tZdHpRjdPCQrsHEtRtDOWFyfw+/SszW2s6qWfySDqRQ7tBPiQd3YN7QDA2zq5sTN4IQN8EC6qTknCc8H/GjkvRK0DjDj5dG9nyhkPp749FeDiFK1aYZUXZfmhznH00bP8ljrIi0yU6mreJoMej40g4uI99vy+rm1EyhVFqIW4dVNZzrn898GDgg7RxbsMnBz8hozTDrHPdc/j/EdRt2+A6NpLy1Gqe2lBClF8UX5/8mnkn5tXowh/03CgcvDuRfmYLf83+0fwG15LqSh27lsdj42yBvUs+eemphPUyxuXXn19PqF0w4o8rULbwR9O/P5TmwLnN0PJ+kNSsqfbdgu0DD1B9/jwVx47V+9hSqYS+40LQVRnYufRsnb5U2g25j9DIvhxYuYy4unbJCn8YdBXGIsQmhkSQML3bdAwY+N/u/5k1a+eew/8PYTthCvZBZRSuXMek1BBG+I9g/sn5zD4y+7YXpkQi4dGP38TaJYzEQ7/z99dNp2TdYBDZvCiG4pwKIh8O5PCaFVjZOxDcvRcnc04SkxfD2OwWVCcm4jhhAoJEYtysNegg/JHGNr/BsR40EImlJYW/mSdzxc7Vko5Rvpw/mUv8IdOrcAVBoO/Tz+MRFMLGrz8jK9H0vQE82oGDP5yo492CmfDSePF2x7c5ln2MBacWmG2eOjl8QRDsBUHYLAhCwqXfdjc5Ti8IwolLP42rD/pfxtod55ERWHpB9kcf87psMA8FPcTimMVMPzgdg3jrWKlMJuPxT6dhadecmJ2L+fvrtXXSRa8vDvyZSHJ0Lt1GByCQRXrMaSKGjkQml/NzzM9Yy6wI+OskCj8/NAMGGE86sdQooesc1LjGNwIStRrroUMp3rixXhQ0b0TrPl64+tqwe3k8ZYWmh3ZkcjnDX3kLta0tq2Z+QGl+nmkDCQK0fghS90H+eZPtMSfD/IYxuPlg5p+cz4nsE2aZo64r/DeBraIotgC2Xvr3jagQRTH80s/dW854ByC0eRiP9pko3BzJeOllXnV9hHFh41h+djmv7XyNCt2tS+QVKiWPz/wIC2s3YnZ+zy9TllOY3XiaO7H7Mji+OZWwnh606uXJoVUrsNBY06rPADJLM9mcspnnitqhPXdpdS+VGnv9Xjz1n1zdX8b2gQcQKyspWmOejUKJRKDP48HotQa2/xyHaDA9tKO2seW+yVOoKi9n1awPTZfvbj0GECB6ucm2mJt3Or2Dq6UrU/dNve0CzBTq6vCjgMvNGhcDd0/niLuVoCFINdZ4jfZCBNKff56XAp7htYjX2JKyhac2PkVuxa1T9iw0GsbNnYWNiyfZib/yy5RlHFl/3mQ9FVNJPpXLjl/O4hlkR7fRLchOTiLp2GHaDo5CrlKxLG4ZGAxErEtC4etrLDwC4229RH5XSiHXFIuwUJQhwRSu+N1s6YC2Lmo6j/Qn5XQexzaZXoUL4OTTnMEvTSYr6Ryb5n9hms02ntC8B5xcdsvWn42JRqFhds/ZzOw5E4lQ/xH3uo7oIopi5qW/s4CbSQ2qBEE4IgjCAUEQbvqlIAjC+EvHHcmpYw/Oe9wEuQWEjURxcROeMz+i+nwyma9NZmzQo8ztNZdzhed4ZN0jJBTcOl5qYaXh0Y9m4OTTjMqi1ez7fSM/vb2fP2cfI2ZvBtUV5k3fTI3JY8O3p3HwsGLg+DCkUgmH/lqBwsKC8AFDKNeW83vC7zyfGogh8TxOL71kXN3rtcYVXuBAUNub1camju3991MVF0dldLTZ5mgZ6UGLCGcOrkoiLaZukg7+ER3pNmYscXt3cugvE/cfwh+GguQa9YhoLEIdQ2lh18IsY9/W4QuCsEUQhNM3+LlKOFw0fuXe7GvTRxTFCOBh4DNBEPxudJAoit+JohghimKEk5NTbV/LPWpK+COgq8DS6gIub79F6c6d5MydSx/vPvww8AeqDdWM/Xss+zL23XIYlZUVo9+bjluLFmjL1uLqc5ayoiq2/xTHD6/vYdPCM6TF5tfpdv5GpJ8tYP03p7B1VTN8YjhKtZy0mFOcPbCH8P5DUFlasSpxFYaiYrquS0bdvj2aAf2NJ5/bAuW5/+lwzmVshg9HYmNDzlfzzDaHIAj0eiwYOzdLNi08U+e7wA5R9xPcLZI9vy4h4dCtP583JGgoyC2Nezj/QW7r8EVR7CuKYtgNflYBFwVBcAO49PuG1RaiKF649DsJ2AG0qbdXcI/a4xkBDi3gxFLsH34Y2zEPkrdgIYV//UWoQyjLhizD3cqd57Y8x4r4W6+kVJZWPDBlOsHde5F8Yh02djuImhRKUGc3Us/ksfrzE/z87n6OrE8mJ7WEnNQSslOKyUkroSS/kupKXY1uz8uLq4nbn8mG706x9quT2DhZEDUxHJWlnMrSUtZ/NRs7Vzc6jnyQcm05S84s4dlj9ggl5bi89T9j3j0YL3S1I/j3rY938o5GamWF4zNPU7Z7N+WHD5ttHrlSyqBnW2LQG1j/dTS56SUmjyUIAv2ffQk3/0DWfzWb7OSk2g2gtDL2LD7zJ1SVmmzHnYpQl/idIAgzgTxRFD8RBOFNwF4UxdevOcYOKBdFsUoQBEdgPxAlimLMrcaOiIgQjxw5YrJt97gNu+fA1mnw4jFEa29Sn36GimPH8F68GHXbNpRpy3ht52vsubCHfj79eLnty3hbe990OFEUObL2T3b98gNW9g60GTCUkJ79yEioIGZPBhfO3rzxhkwuQeOgwtrJArW1Am2VnupyHZXlOipKqqkoqUZXbdzAUtsoaNbKkY7DfFFbKxBFkbWfzeDc4f089MEsnJr7MnH7RJJO7mLWQgN2o0bh9v4040Sl2TAnGDr+HwyYXq9v552KoaKCxP4DkHt64rP0l3++GM1A6pk8Ni+KobJcS0hXdzoON/4fmkJZYQE/vzUJAYFHPpqDpe0NEwRvYsgBWDQAhn8JbceaNH9TRhCEo5ciKtc/V0eH7wD8BngDKcBoURTzBUGIAP5PFMWnBUHoAnwLGDDeUXwmiuLC2419z+GbmeJMmBsKXV6EftPQFRSQPGYMhpJSmq/4DbmHBzqDjgWnFrDo9CK0Bi2jA0bzaPCjeFl73XTYtDPR7F/5K2lnopEplYT27EvbQcOQyOzJu1CKIAgIEgGD3kBVuY7KMi3lxdWU5FZSnFdBeXE1CpUMhYUMpVqGhUaOhUaBpbUSzyA7HL2srnJKp7dvZuP8z+n20ON0vO8BZhyawc8xP7FwYzNszmXjt3EDMvtLsfo9n8GW9+D5w+AUYO53+I6h4NdfyZo6Dc/536CJjDTrXJVlWo6sT+bU9nSkCgkRg5rRurcXUnnttxMvJp3j1/fewLmZLw+8+xEyubxmJ4oizOsISg08U38NYZoKZnP45uSew28Afn3EqBM+KQZkCqqSkkh+cAxyNzd8li5FamUJQE55Dt+c/IY/Ev5AL+ppbtOcnp496eHZg3DncOSS6y+07OQkjq1fRdzeneh1OpqHtyOkR2/s3D2xdXFDqVYjiiJ6rRZRNCBTKGu1utRWVnLs79Uc+GM5bv4B3D/lQ36LX8H0g9OZmtiakN+O4vLOO9g/eilWL4rwZVuwcoUn7xzlz4ZA1GpJHDIUiVpN8z9WGgvTzExBVhn7/jDWT1g7qugyyh/fcKda32HEH9jDmrmfENKjNwOfm1Tz8/fPg41vwYR94BJqwitoutxz+Pe4MQmb4Zf74YHFxrgmULp3L2njn0UdEYHXt/ORqP5RkbxQeoEdaTvYmbaTw7atd5MAABpsSURBVBcPozPo0Cg0dHXvShf3LkS4ROCp8bzqoisrLCB6ywZObFpHedE/YR2ZXIFOp72SHieTK1BpNFhY22BpY4ulrR1qG1uUllaoLK1QqNVILjmi0vw8Dq9eSVlhAb7tOtDvmRfYU3SIN3a9wcNFwQz/OhrrQQNxnz37H1vO74LFw2DEd9D6QXO/s3ccRWvWkjF5Mm7TP8R2VMOlq6bF5LPn9wTyM8pwb2FLtwda4OStqdUY+39fxr4Vv9Dj0SdpP2xkzU4qy4M5QRDxJAyaYYLlTZd7Dv8eN8agh89bg4MfjF115eGiNWvIeP0NLHt0x+vLLxEU18dZy7Rl7M/Yz870nexO301epbEC0lntjIeVB9X6arQGLRJBglqmxlKixrFchWOVFZpyGVY6JU4aFyxUliAIVJaWUFFSTEVxEWWFhZQX/X979x0eVZU+cPx7pqZDSCgJIYQECISiwiJVXUBRUWRpKig/FUV3ERARXRRXsa0FRXcFG8UFRaQqKIiIUgRpUiVEShJKCi2F9Knn98cNwUgKJJPchJzP8+RhZnLn3vfC8N4z55z7nkzyzmfgcpY8vTM0OoYbRjxAWJt2/Hj8R57a+BQ3iWjGvH8Mc0gIEQu/wODjc/ENS0dpM3SeOqRNTVWKkW43J/7vAQri4mjx9VdYmpXebedpbpebg5tT2P5NIgW5Dtp2D6HTrc2p39in/DejjR99+5+3OLxtM4OeeYHITl0u78BLR8HRHws/E1dPeWyV8JXSbZwG61+F8XugQWTRyxmLF3PqhRfx79ePptPfQZhMpe7CLd0kZCaw6/Qudp3eRbotHbPBjNlgxi3d5DpyyXXkkl6Qzpm8M8jC2bsGYSCqfhTtg9rTPrg97YLb0bp+a8xGrYtISonTYceWk4MtL48Ls34NJhP1G4cghGDjyY1M2DCBa/yieX5uLq4zZ2mxdEnxhHUVt+Y8yZGcTMLfBmGNiqL555+V+W9eFWx5Wv/+/vVJuF2S8HYN6PDXMJq3C0IYyu6qcdgKWDR1MhmpyQx/eRrB4RHlHzBhI8y/CwbPuqpKZKuEr5QuKwXebQ89x8PNU4v9Kn3ePE6//gb+t9xC6NvTMFitlT6cw+XgVO4p4s/Hc+DcAQ6kHSD2XCyZNq27x2QwEVkvklaBrYisF4m/xR8fkw9Wo5UcRw5Z9iwyCzI5mnmUQxmHOJN3hnaBMbz+fQMK1m+i2Sef4NfrT+WOf5kBa6fAP7ZC45hKn8PV7Py3q0iZNIngcWNp+PjjusSQe95G7M8pxG5KJi/Ljn+QFzE9Q2jTPRS/wNI/g9np51jw3ERMZjMjXpuOT0A5axS73dq4TkBTeGiVh89CPyrhK2VbOAKSdhQN3v7RhaTv07UrYTNnYPTz8/jhpZQk5yRz4NwBDqYf5EjGEY5kHOF0XsmVFk0GEy3qtSA6MJo2DdrQ94dzZH80m0aT/0nQgw/+eecwo4u2AMYjP3g89qtR8tPPkLV6NeGzZ+HbvbtucbicbhL2nCV2cwrJhzIQBkHz9kG06xVKeLsGGIyXDi6nHj3EoqmTCWkVzdApr2A0lTNz58LMrauoMaASvlK2C4O3Q+eWWF/m/IoVpDw3Ba/oaMI+/ABz49IqaHhWgbOAXEcu+c58bC4bvmZfAiwBeJu8iwZjs9Z8T/KECdQbPJiQ1169dJZG/E/w2SAY9HFh8SylPK7sbI7dcy/2kydp8sK/CBw2TO+QyDyTR9yWVOK2ppKfZce3vpW2PUJo2zOEgKDiYzJxmzew+v236dD3Vm4ZPbbsmTt56dq9GdcMhwHvVfFZVA+V8JWyXfhq69cIHl5b4ibZGzaQPOFJkJLA4cMJGv0IpqCgag70IrfdTvq8eZybMROvtm0Jnz8PQwmDy3xxDyTvgidjwVT5Lqm6wnX+PMkTnyJ3yxYC/28kjZ95ptr79EuMy+Xm+P40Yjcnc6KwNk94TANieoUS0TEYY2Grf/OX89n+1WJ6PzCaTv0HlrVLWPE4HFgOEw9q3wSriZQSR4GLglxH8Z8cJ1ZvI9HdQiq0X5XwlfJt+xDWTIbR66FppxI3sZ88ybmZH3B+5UqElxf+ffvi07kT3p06YW3ZstT529LlwpmWhisjE5mfhzs/H6TEGBSEMTAQU2Ag4jJvmnHl5JC3Yydn3noL+7Fj+PXtS8jLL5V88UmLh/c7w03PQO/nLvuvQtFIp5Mz06aRPm8+vj26E/rOO5gCqy8hlicrLZ+4X1KJ25JKbqYN7wALbbuHENMrhIAgL1ZO/zfxv+5g8LNTibim5M80AKn74OMbod9r0GNshWJxOd1FCdtWmLQvJnAHBXmFf+Y6KMh1Fm3ndpWcfxuG+3P3c5c52+hPVMJXyleQBdNjoE1/GPxJmZvaEhJI+2QWOZs34zqnlVI2+Pvj3bEj3tdcg/Dywp6YiD0xEUdyMs60NO1bRBmElxcGfz+Mvn4YfH0x+PoivL3A6UI6HLjz83EkJeHKyADA0rw5jZ+fgt8NN5S+0zXPwo5PtNa9f5Mr+/tQimQuW8apqS9hatKEsBkz8IquWXcpu11uTsSmE7s5heMH0pBuSdPoQKK7NmDH8mlkp51l+KtvE9S0jKmmc25FZp/C+dhObAUSW76jqLyHLc+BLddZrBVuu5C4C5O4w+YqddcGk8DL13zxx8/8p+cmrD7FX7f6moq+rVwplfCVy/PdP2HnHHjywGUlSCkljpMnydu1m/y9e8nfuxfbkSPgdmNq2BBLixaYm4VhatQIc6NGGAMDMfj4YPDW+lyd6Rm40tNwZmTgzsnFnZ2NKycbd24u7tw8ZH4+mE0IsxmD1QtzaCiW5uFYIiLwvfHGkrtwLrDlaH2zrfrB0HIreSjlyN+7l6Rx43Hl5hL6xusE9Ound0glysmw8fvWFA5uTiU7vQDIxp69ALPVh84DnsbttmLPd2LLc2LPd2DLc2LLd2LLysVe4MZNGd1WAqw+plIS96VJ+8Jjk8VQpTWKLglTJXzlshR1gfwTej9boV24c3ORUlbJbJ4rsmMWrJ4ED6+DZhX7aqwU5zh9hqTx4yjYt5/gMf8geOzYainDUBHSLUn6PYOkQxkc27+flIOfIoyN8K4/EC//QKyFtZos3mas3kYsXgassfOwBvhh7TWqqJaT1cdclOSt3qZy7weoCVTCVy7fgrshZXftHuR0u+GDrmDxg9E/aeuZKh7httk49dLLnF++HL8+fQh96039L+6X4fD2X1gzczomq5U7n/gn4e07XrrRhZsQa3l9nbISfs28PCv66fZ3yD0Lv1VwRaGa4NBqOHcYuo1Ryd7DDFYrIa+9SuMpU8jZuFGbvnnsmN5hlat11x7c9+938fbzZ+mrz7Nl8QLs+X9ai7nLw9riKFv+o0+Q1UAlfKW4yN7QuIN2Q4q79IGoGktK2DwdAiOg3SC9o7kqCSFoMPJ+wufMxpWWRuLd95Dz82a9wypXUFgz7vv3dKJ73MC2ZQuZNe4Rtn+95GLi92kAnR+E35ZC5gldY60qKuErxQkBN0yEtCMQ943e0Vy5Yz9r8+57jAej/vPGr2a+3boRsXQJ5pAQTj72GGlz5lTZguieYvH24Y7xTzPitXcIadmazQvnFU/83R8HYdDKcVyFVB++cim3C2ZeD2YfeGxT7eoWmf83OHMQnth/VVVArMnceXmkPDeF7DVrCLjzTkJefaVYWe2aLPXoIbYuXUjinl/x8g+gy4DBXGtfh+XQ19o4lq9+NxdWlOrDV66MwQi9noRT+7XysbVFyh5IWK/13atkX20MPj40fXc6DSdMIGvVKo6PuA9HSoreYV2WkJbRDJ48lRGvvkOTqFb8/MX/mL0mgx2ng7Bv+UDv8DxOtfCVkjnt8N/roH547VkhatFISNwIEw6AV4De0dRJ2evXkzLpaYTVSth//4PPX0psaNZYKYd/Z+uyhRzbuwtvk5MuQ0Zybf8hmGvJNxZQLXylIkwWrWTyiV/g2Ba9oynf6VhtzKHLaJXsdeTfuzcRSxZjDAjg+IMPkfHll3qHdEVCW7dhyLMvMfyJ0TS2ZrFp0UJmjXuYnSuX4Sgo0Du8SlMJXynddSPBrzH89ErRUoQ11o+vgDWgwrVQFM+xRkYSsXgRvj26c2rqS6S+8CLSbtc7rCsS2mMgQ26NYnjLwzQOD2fTgk+1xP/N8lqd+FXCV0pn8dHuuj2xFQ5/r3c0pTuxDQ5/B72eqNZqh0rpjAEBNPvwQ4JGjyZz8WKOPzQKZ2HdpVqj9xRCzWcY0tXIvS9Po1FEJJs+n8vs8Y/w6zfLcdhqX+JXffhK2VwOmNkVjBb4xxZtQLcmkRI+7Q/p8doyjRZfvSNS/uT8qlWkTnkeY/36hL3/Pt4d2usd0uX76u8Q+5X22QoIJflQHFuXfsHx/XvwqVefLncN4ZpbbsdsrTl9/KoPX6k4oxn6vgBn42D/Ir2judTRddo4w03PqGRfQ9W74w4ivlgABsHx++/n/MqVeod0+f46WZumvGkaAE2j2zJ0yivc+9JbBIdHsPGzOcwe9wi7Vn1dK1r8qoWvlE9KmNUHcs7AuF01Z8qj263VMbdnw+M7L1meUalZnOnpJI9/grxff6XBqFE0emoiwljDvjGWZNVTsOt/2jKIDYuXhk76PZatS77gxIF9F1v8N9+u66we1cJXKkcIuOUlyEqC7R/qHc1Fu/8Hp3+DPv9Syb4WMDVoQPincwkcMYL0uXM5+ehjuM6f1zus8t00Waux893Tl0xeCGvTjmH/eo17pr5BcLNwNn42h1njHmbHiqXYC/J1Crh0qoWvXL6FI7Qbm8Zsg8Dm+saScxZmdIYmHeGBb2rX3cAKGUuWcOrlVzCHhNBs5gysrVrpHVLZLpTbHvoptB9c6mbJvx9k2/IvObZvNz716tNtyL107Htr+Yupe5Aqj6x4xvkkmHE9RPSEEYv1TbJf/V0rcvWPLdAwWr84lArL27OHpPHjkbl5hL71Jv4336x3SKVzu+CTv2qVZMfuBKt/mZunHI7j5y/mkRR3gHqNm9DznpG06X5DtawfoLp0FM+oFwZ9psCRtXBwhX5xHNsM+xZqN4apZF9r+Vx3HS2WLsUSFUXS2HGcnTETWc5SmLoxGOGO6ZCdChvfKnfz0NZtufvF1xk0+UUsVi9W/3canz/7JMf27tK1wJxq4StXxuWEWb21AdyxO8CrXvUe32mHj3qBMx/GbNfuFVBqNbfNxqkXp3L+66/xu7kvoW+8idGvhs64WjFWa2yM/glCrrmst0i3m7gtG9my6HOyzp4mpHUb/nLnIFp26YahCqY5qy4dxbOSd8PsvnDtfTCwmsvIfj8Fts6AEUugdc1cV1W5clJKMubP5/Rb07BGtiBsxgwszXUeJypJXjp82EPr0nl0wxVNBXY6HPz20/fs+vYrzp85Tb1Gjel0+120730LFm/PNVxUwlc8b91L2kIjg2dBx7ur55iHv4cv7tbq5dzxdvUcU6lWub/8QvKTE5FS0nT6dPx69dQ7pEslbIT5A6HzAzDgylfHcrtdxO/czq/ffkXK4Tgs3j506NOP624bQL1GjSsdnkr4iue5nDBvAKTug8c2QnAVz7LIStG6cvxD4ZF1NedeAMXj7CdPkjTmcWzx8TSaNIkGDz2IqGmzsNZNhc3vwt2fQcxdFd5N6tFD7Fq1gsPbNoOEltd3o1P/gTSNjqnwOauEr1SNC0nYrwmM/hHM3lVzHLdLa1El766ei4uiO3duLinPPkf22rUE3DWAkJdfrlmLqrgcMKcfpCdon8nAiErtLuvcWfauXcVv69ZQkJtDePtrGPr8qxVK+mqWjlI1AkJh8CdwJhZWjtPufPU0KWHVRG3pwv7TVLKvIwy+vjR9712Cx48ja+U3HL9/JI7UVL3DushohiGztcefDYbcyhWGCwhuyI0jHuTRD/5H34fH0OLazlXyrUYlfKVyWt6s1dr5bYmWmD39jfHHl7Xb2ntNhOvu8+y+lRpNGAw0HDOGsA9mYk9MJHHoMPJ27dI7rIuCorT7UbJSYMEwsOVUepdmLy+u7defvwwo/eauylAJX6m8XhO1JRF3fQprn/dc0t/yH21guPND2kVFqZP8+/QhYvEijH5+2qIqixbrHdJF4V1h2KfaWNbikdq04RpMJXyl8oSAvi/C9Y9pUybXPq8N6laU2w0b3oAfXoB2g+GOd1TphDrOGhVFxJLF+HbrxqkXXyR16tSas6hK9O3abJ34n2D+XVrZj8pI/BkOLPdMbH+iEr7iGULAbW9oUya3ztAGWbMq0OeanwEL74ENr0PHe2HQxzWvBr+iC2NAAM0++pCgRx4m88tFHB81Cmdamt5haTqNhCFzIGWvVoIhZe+V78Pl0Low5w2ALe9VyZhYpRK+EGKYECJWCOEWQpS6WrEQ4jYhxCEhxFEhxOTKHFOpwQwGbX783z6ClN3aDJ64by+vi0dKOPIDfHwTxK/XWvWDPlJVMJVihNFIo0mTCH37bQoOxJI4dBj5sbF6h6XpMBRGrdEez70NNr19+f36afHae35+B667Hx5crf1/8rBKTcsUQrQF3MDHwCQp5SXzKIUQRuAwcAuQBOwEhkspD5a1bzUts5Y7ewgWP6AtnNKwDXQbAx3vuXT+vKMADq/RPuin9kP9cBgyF5p10SdupdbIj40laew4XOnpBI0eTf2hQzA3aaJ3WFqXzjfj4dBq8AmCnk9Ah2HgH1K8a9Lt1qrP7pyt/R+w+mtdQ+0GVerwVT4PXwixgdITfndgqpTy1sLnzwJIKV8va58q4V8FnHZtebit78Op38Bg0hJ6YAttzv7Z37V5zNINQS21gd8Od6tWvXLZnGlppD7/L3LWrweDAb8bb6TewLvwveFG/evxJP0K6/8N8T9qz/0aQ8i12uPsFK36bH4G+ARrd+12GQ0BIZU+rN4Jfyhwm5TykcLnI4GuUsqxJWz7KPAoQHh4eOfjx49XOjalBpBSm0cfvx4yEiE9ERx5WqXLhm2haSdo1U/11SsVZj95ksyly8hcvgzX2XMIiwXfHj3wv+Vm/Pr0wRSo4+L2qfvgxDZI2QOp+7WumoCmWou/eQ+IGQgmq8cOV6mEL4RYB5T0PWmKlHJF4TYb8EDC/yPVwlcU5UpJl4v83bvJXreO7B/W4UhJAYMBn86d8evbB7+bbsISEVHzSjV4UFkJ31Tem6WUlV2VIBlo9ofnYYWvKYqieJQwGvHp0gWfLl1oNHkytri4ouR/5o03OfPGm5jDw/Ht3h2vdjF4xbTDq3UrhKVudCOWm/A9YCfQSgjRAi3R3wuMqIbjKopShwkh8IqJwSsmhobjx2NPSib3503kbNhI1nffkblokbah2YxXq1aFF4AYvNq1w9q6dc2q3eMhlZ2lMwh4H2gIZAJ7pZS3CiFCgdlSyv6F2/UH3gOMwFwp5Wvl7Vt16SiKUlWklDiSkiiIjS38OUhBbOzFRdWNRqwtWxZdALxi2mKNisJYr5oX/KkAVS1TURSlHFJKHMkpFByMpeDgwYsXgfT0om2MwcFYW7TAEhWJNTJK+zMqClPjxjVmXKBSffiKoih1gRACS1hTLGFNCeinraYmpcR5+jQFcXHYExKwJSRgj08ga/V3uLOyit5r8PHBEhmJNSoSS4vIoguBpVkzhNms1yldQiV8RVGUUgghMDdpot3Q1bt30etSSlxpadjiE7AnxGNLSMQeH0/u9h2cX7Hy4g5MJizh4UUXAmtUJJbIKKyRLTD4Vv99AirhK4qiXCEhBKbgYEzBwfh2vb7Y71w5udgTEy9eCBLiscUnkL1+AzgvFhU0hYRgjYws9s3AGhWJMSioyrqHVMJXFEXxIKOfL94d2uPdoX2x16Xdjv3kSWzx8dgTErElxGOPTyBz2TJkXl7RdoZ69fDr2YOm06d7PDaV8BVFUaqBsFiwRkVhjYoq9rqUEuepU4XdQwnYEuIxBlTNbCCV8BVFUXQkhMAcEoI5JAR69azSY6l6+IqiKHWESviKoih1hEr4iqIodYRK+IqiKHWESviKoih1hEr4iqIodYRK+IqiKHWESviKoih1RI0tjyyEOAvUxkVtg4FzegdRzdQ51w3qnGuH5lLKhiX9osYm/NpKCPFrabWor1bqnOsGdc61n+rSURRFqSNUwlcURakjVML3vE/0DkAH6pzrBnXOtZzqw1cURakjVAtfURSljlAJX1EUpY5QCb8KCSGeEkJIIUSw3rFUNSHENCHE70KI/UKIr4QQ9fWOqSoIIW4TQhwSQhwVQkzWO56qJoRoJoRYL4Q4KISIFUI8oXdM1UUIYRRC7BFCfKt3LJ6iEn4VEUI0A/oBJ/SOpZr8ALSXUnYEDgPP6hyPxwkhjMBM4HYgBhguhIjRN6oq5wSeklLGAN2Ax+vAOV/wBBCndxCepBJ+1XkXeAaoE6PiUsq1Ukpn4dNtQJie8VSR64GjUsoEKaUd+BIYqHNMVUpKmSql3F34OBstATbVN6qqJ4QIA+4AZusdiyephF8FhBADgWQp5T69Y9HJKOA7vYOoAk2Bk394nkQdSH4XCCEigOuA7fpGUi3eQ2uwufUOxJPUIuYVJIRYBzQp4VdTgOfQunOuKmWds5RyReE2U9C6ARZUZ2xK1RJC+AHLgAlSyiy946lKQog7gTNSyl1CiL/qHY8nqYRfQVLKm0t6XQjRAWgB7BNCgNa1sVsIcb2U8lQ1huhxpZ3zBUKIB4E7gb7y6rzBIxlo9ofnYYWvXdWEEGa0ZL9ASrlc73iqQU/gLiFEf8ALCBBCfC6lvF/nuCpN3XhVxYQQx4C/SClrW8W9KyKEuA2YDtwkpTyrdzxVQQhhQhuQ7ouW6HcCI6SUsboGVoWE1mqZB6RLKSfoHU91K2zhT5JS3ql3LJ6g+vAVT5kB+AM/CCH2CiE+0jsgTysclB4LfI82eLn4ak72hXoCI4E+hf+uewtbvkotpFr4iqIodYRq4SuKotQRKuEriqLUESrhK4qi1BEq4SuKotQRKuEriqLUESrhK4qi1BEq4SuKotQR/w/oPAn+8Kav6AAAAABJRU5ErkJggg==\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TU5R02e4sZkv"
},
"source": [
"## Batching Meta-Gradient Across Tasks\n",
"\n",
"Kind of does the job but not that great. Let's reduce the variance of gradients in outer loop by averaging across a batch of tasks (not just one task at a time). \n",
"\n",
"vmap is awesome it enables nice handling of batching at two levels: inner-level \"intra-task\" batching, and outer level batching across tasks.\n",
"\n",
"From a software engineering perspective, it is nice because the \"task-batched\" MAML implementation simply re-uses code from the non-task batched MAML algorithm, without losing any vectorization benefits."
]
},
{
"cell_type": "code",
"metadata": {
"id": "z3PAs9fvsZkv"
},
"source": [
"def sample_tasks(outer_batch_size, inner_batch_size):\n",
" # Select amplitude and phase for the task\n",
" As = []\n",
" phases = []\n",
" for _ in range(outer_batch_size): \n",
" As.append(onp.random.uniform(low=0.1, high=.5))\n",
" phases.append(onp.random.uniform(low=0., high=np.pi))\n",
" def get_batch():\n",
" xs, ys = [], []\n",
" for A, phase in zip(As, phases):\n",
" x = onp.random.uniform(low=-5., high=5., size=(inner_batch_size, 1))\n",
" y = A * onp.sin(x + phase)\n",
" xs.append(x)\n",
" ys.append(y)\n",
" return np.stack(xs), np.stack(ys)\n",
" x1, y1 = get_batch()\n",
" x2, y2 = get_batch()\n",
" return x1, y1, x2, y2"
],
"execution_count": 16,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"id": "i7wRALVtsZkv",
"outputId": "8c9b6e2c-d1d3-4f4a-cbba-794fa7cf3de3"
},
"source": [
"outer_batch_size = 2\n",
"x1, y1, x2, y2 = sample_tasks(outer_batch_size, 50)\n",
"for i in range(outer_batch_size):\n",
" plt.scatter(x1[i], y1[i], label='task{}-train'.format(i))\n",
"for i in range(outer_batch_size):\n",
" plt.scatter(x2[i], y2[i], label='task{}-val'.format(i))\n",
"plt.legend()"
],
"execution_count": 17,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7feba9bbad50>"
]
},
"metadata": {},
"execution_count": 17
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "257JGRJksZkv",
"outputId": "8d202e82-effc-4a4e-ae66-10f85c3ca7d9"
},
"source": [
"x2.shape"
],
"execution_count": 18,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(2, 50, 1)"
]
},
"metadata": {},
"execution_count": 18
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "w-4Djl6XsZkw",
"outputId": "a9c592b5-8d16-4986-d533-f7e753432627"
},
"source": [
"opt_init, opt_update, get_params = optimizers.adam(step_size=1e-3)\n",
"out_shape, net_params = net_init(rng,in_shape)\n",
"opt_state = opt_init(net_params)\n",
"\n",
"# vmapped version of maml loss.\n",
"# returns scalar for all tasks.\n",
"def batch_maml_loss(p, x1_b, y1_b, x2_b, y2_b):\n",
" task_losses = vmap(partial(maml_loss, p))(x1_b, y1_b, x2_b, y2_b)\n",
" return np.mean(task_losses)\n",
"\n",
"@jit\n",
"def step(i, opt_state, x1, y1, x2, y2):\n",
" p = get_params(opt_state)\n",
" g = grad(batch_maml_loss)(p, x1, y1, x2, y2)\n",
" l = batch_maml_loss(p, x1, y1, x2, y2)\n",
" return opt_update(i, g, opt_state), l\n",
"\n",
"np_batched_maml_loss = []\n",
"K=20\n",
"for i in range(20000):\n",
" x1_b, y1_b, x2_b, y2_b = sample_tasks(4, K)\n",
" opt_state, l = step(i, opt_state, x1_b, y1_b, x2_b, y2_b)\n",
" np_batched_maml_loss.append(l)\n",
" if i % 1000 == 0:\n",
" print(i)\n",
"net_params = get_params(opt_state)"
],
"execution_count": 19,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0\n",
"1000\n",
"2000\n",
"3000\n",
"4000\n",
"5000\n",
"6000\n",
"7000\n",
"8000\n",
"9000\n",
"10000\n",
"11000\n",
"12000\n",
"13000\n",
"14000\n",
"15000\n",
"16000\n",
"17000\n",
"18000\n",
"19000\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 285
},
"id": "YblJpwzrsZkw",
"outputId": "06ea9f56-8623-4906-8c64-d60c5e9012a7"
},
"source": [
"# batch the inference across K=100\n",
"targets = np.sin(xrange_inputs)\n",
"predictions = vmap(partial(net_apply, net_params))(xrange_inputs)\n",
"plt.plot(xrange_inputs, predictions, label='pre-update predictions')\n",
"plt.plot(xrange_inputs, targets, label='target')\n",
"\n",
"x1 = onp.random.uniform(low=-5., high=5., size=(10,1))\n",
"y1 = 1. * onp.sin(x1 + 0.)\n",
"\n",
"for i in range(1,3):\n",
" net_params = inner_update(net_params, x1, y1)\n",
" predictions = vmap(partial(net_apply, net_params))(xrange_inputs)\n",
" plt.plot(xrange_inputs, predictions, label='{}-shot predictions'.format(i))\n",
"plt.legend()"
],
"execution_count": 20,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7febac98f650>"
]
},
"metadata": {},
"execution_count": 20
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD6CAYAAACiefy7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd1zV1f/A8dfnXu5lD9lDENwgS0BEyb3SHLkqc8+szFGaacvS1NRSv1o5stTK0tTUtMzMDEcqqLg3ooDsveHe+/n9cZWfJkPgMoTP8/HgoXA/n3POVXhzPme8jyCKIhKJRCKp+2Q13QCJRCKRVA8p4EskEkk9IQV8iUQiqSekgC+RSCT1hBTwJRKJpJ6QAr5EIpHUEzoJ+IIgfCMIQoIgCBdLeL2zIAjpgiCE3//4QBf1SiQSieTJ6emonI3AamBzKdccEUWx75MWaG1tLbq6ulayWRKJRFK/nD59OkkURZviXtNJwBdFMUQQBFddlPWAq6srYWFhuixSIpFI6jxBEO6U9Fp1juG3EwThnCAIvwuC0Koa65VIJBIJuhvSKcsZoJEoilmCIPQBdgHN/nuRIAiTgEkALi4u1dQ0iUQiqR+qpYcvimKGKIpZ9//+G6AQBMG6mOvWiaIYIIpigI1NsUNQEolEIqmgaunhC4JgD8SLoigKghCI9hdNcnnLKSwsJDo6mry8PJ23UVI/GRgY0LBhQxQKRU03RSKpcjoJ+IIg/Ah0BqwFQYgGPgQUAKIorgGGAK8KgqACcoGXxAqk6YyOjsbU1BRXV1cEQdBF0yX1mCiKJCcnEx0djZubW003RyKpcrpapTOsjNdXo122WSl5eXlSsJfojCAIWFlZkZiYWNNNkUiqxVO301YK9hJdkr6fJPXJUxfwy6IRNcRlx1GgLqjppkgkEkmtUucCvkqjIjUvlejMaDSipqabU+VMTExKfT0tLY0vv/yymlpTvMjISDw9PQEICwtj6tSppV6/cOHCRz5v3759lbVNIqlP6lzAV8qVOJk4kavKJS47rkbaoFara6Te4lRlwFepVOW+JyAggP/973+lXvPfgH/8+PFy1yORSB5X5wI+gJm+GdaG1qTmpZKWl6azciMjI2nZsiXDhw/H3d2dIUOGkJOTA2hTQcyePRs/Pz9+/vlnDhw4QLt27fDz82Po0KFkZWU9Vt7hw4fp2/f/0wtNmTKFjRs3FpX39ttv4+XlRWBgIDdv3gTg9u3btGvXDi8vL957772ie7OysujWrRt+fn54eXmxe/duAN555x1u3bqFr68vs2bNAmDp0qW0adMGb29vPvzww2Lfq4mJCTNmzKBVq1Z069ataGKzc+fOTJ8+nYCAAFauXMnp06fp1KkT/v7+9OrVi9jYWABOnz6Nj48PPj4+fPHFF8W+56ysLMaOHYuXlxfe3t7s2LGDd955h9zcXHx9fRk+fHhRW0C7qmbWrFl4enri5eXF1q1bi8rs3LkzQ4YMKfr/ebAI7J133sHDwwNvb29mzpz5ZP/REkkdVV07bXXuo18vcfleRqnX5Knz0IhxGMgNkAll/27zcDTjw36lZ324du0aGzZsIDg4mHHjxvHll18WBRIrKyvOnDlDUlISgwYN4uDBgxgbG/Ppp5/y+eef88EH5UsSam5uzoULF9i8eTPTp09n7969TJs2jVdffZVRo0Y9EkgNDAz45ZdfMDMzIykpiaCgIPr378/ixYu5ePEi4eHhABw4cIAbN25w6tQpRFGkf//+hISE0LFjx0fqzs7OJiAggOXLl/Pxxx/z0UcfsXq1dqFVQUEBYWFhFBYW0qlTJ3bv3o2NjQ1bt27l3Xff5ZtvvmHs2LGsXr2ajh07Fv2i+a/58+cXvUeA1NRUBg8ezOrVq4va+7CdO3cSHh7OuXPnSEpKok2bNkXtPnv2LJcuXcLR0ZHg4GCOHTuGu7s7v/zyC1evXkUQBNLSdPfLXyJ5GtXJHv4D+nJ9BCBfnY9IuZf9F8vZ2Zng4GAARowYwdGjR4tee/HFFwE4ceIEly9fJjg4GF9fXzZt2sSdOyXmMyrRsGHDiv78999/ATh27FjR10eOHFl0rSiKzJ07F29vb7p3705MTAzx8fGPlXngwAEOHDhA69at8fPz4+rVq9y4ceOx62QyWdH7Kel9Xrt2jYsXL9KjRw98fX1ZsGAB0dHRpKWlkZaWVhSMH27nww4ePMjrr79e9HmDBg1K/fc4evQow4YNQy6XY2dnR6dOnQgNDQUgMDCQhg0bIpPJ8PX1JTIyEnNzcwwMDBg/fjw7d+7EyMio1PIlkrruqe3hl9UTfyCnMIfI9EhMlCY4mzpXehnef+9/+HNjY2NAG3x79OjBjz/++Mi1J0+e5JVXXgHg448/xtLSEo3m/yeW/7uD+OGyS/r7Az/88AOJiYmcPn0ahUKBq6trsTuSRVFkzpw5Re14UiW9z1atWhX9MnqgJnrS+vr6RX+Xy+WoVCr09PQ4deoUf/31F9u3b2f16tUcOnSo2tsmkdQWdbqHD2CkMMLO2I7MgkyScpMqXd7du3eLAtyWLVt45plnHrsmKCiIY8eOFY27Z2dnc/36ddq2bUt4eDjh4eH079+fRo0acfnyZfLz80lLS+Ovv/56pJwHY9Rbt26lXbt2AAQHB/PTTz8B2iD/QHp6Ora2tigUCv7++++iJwpTU1MyMzOLruvVqxfffPNN0ZxCTEwMCQkJj70HjUbD9u3bS32fLVq0IDExsejfo7CwkEuXLmFhYYGFhUXRU8HD7XxYjx49HhmWSk1NBUChUFBYWPjY9R06dGDr1q2o1WoSExMJCQkhMDCw2LJBO0eQnp5Onz59WL58OefOnSvxWomkPqjzAR/A0sASc31zEnISyCp4fPK0PFq0aMEXX3yBu7s7qampvPrqq49dY2Njw8aNGxk2bBje3t60a9eOq1evPnads7MzL7zwAp6enrzwwgu0bt36kddTU1Px9vZm5cqVLF++HICVK1fyxRdf4OXlRUxMTNG1w4cPJywsDC8vLzZv3kzLli0B7bxCcHAwnp6ezJo1i549e/Lyyy8XTfwOGTLkkV8IDxgbG3Pq1Ck8PT05dOhQsfMPSqWS7du3M3v2bHx8fPD19S1aUfPtt9/y+uuv4+vrS0lZNN577z1SU1Px9PTEx8eHv//+G4BJkybh7e1dNGn7wMCBA/H29sbHx4euXbuyZMkS7O3tiy0bIDMzk759++Lt7c0zzzzD559/XuK1Ekl9IFQgpU21CAgIEP97AMqVK1dwd3evUHlqjZrbGbdRaVQ0MW+CQl7+ZFmRkZH07duXixeLPclRpx4cAGNt/VhS0WphYmJS7Mqiuqgy31cSSW0jCMJpURQDinutXvTwAeQyOc4mzoiiSFRmVL3YlCWRSCQPqzcBH0BfT79Sm7JcXV2rpXcP2qeJmurdA/Wmdy+R1Cf1KuCDdlOWlaGVdlNWvrQuWyKR1B/1LuAD2BnZYaQwIjYrlkL146tBJBKJpC6qlwFfEAQcTRwREYnNji1xFYlEIpHUJfUy4IN2F66tkS2ZBZmkF6TXdHMkEomkytXbgA9gZWCFocKQuOw4CjVPNrRTXemGd+3axeXLl6u8HolEUn/U64AvCAJOxk5Fh6Y8ifIGfFEUH0mf8KSkgC+RSHStXgd80C7VtDG0ISM/g8yCx3ec/tfD6YZnzJhRbEriyMhIWrRowahRo/D09CQqKor58+fTokULnnnmGYYNG8ayZcsAuHXrFs8++yz+/v506NCBq1evcvz4cfbs2cOsWbPw9fXl1q1bVfpvIJFI6oenNnkav78DcRd0UpQ1IiaqPPJsmqHu/yVymbzEax9ON6xSqcjJyXksJTHAjRs32LRpE0FBQYSGhrJjxw7OnTtHYWEhfn5++Pv7A9o0AmvWrKFZs2acPHmS1157jUOHDtG/f3/69u3LkCFDdPIeJRKJ5OkN+DokIKCUK8kRNSTmJmJvXHJ+loc9SEkcEhKCTCZ7JCVxo0aNCAoKArQpjQcMGICBgQEGBgb069cP0G5uOn78OEOHDi0qMz8/X8fvTiKRSLSe3oDfe7FOi5MD+Vn3SM1NxlzfHEM9wzLvKS0l8YMUwqXRaDRYWFgUe9iHRCKR6Fq9H8N/mK2RLXoyPe5l3Stxbf7D6YZLSkn8X8HBwfz666/k5eWRlZXF3r17ATAzM8PNzY2ff/4Z0D4xPEjh+9+0xhKJRFJZUsB/iJ5MD3tje/JUeaTkpRR7zcPphsPDw4tNSfxfbdq0oX///nh7e9O7d2+8vLwwNzcHtE8JGzZswMfHh1atWhVN/L700kssXbqU1q1bS5O2EolEJ+pNeuQnJYoidzPvklOYQ1OLphVKo1ycrKwsTExMyMnJoWPHjqxbtw4/Pz+dlC2pHCk9sqQukdIjl4MgCDgYOyAiViijZkkmTZqEr68vfn5+DB48WAr2Eomk2j29k7ZVSClXYmNoQ0JOAhn5GZjpm1W6zC1btuigZRKJRFJxUg+/BFaGVujr6ROXHYdao67p5kgkEkmlSQG/BDJBhqOxI4WaQhJzE2u6ORKJRFJpOgn4giB8IwhCgiAIxR4HJWj9TxCEm4IgnBcE4akYwDZSGNHAoAHJucnkqnJrujkSiURSKbrq4W8Eni3l9d5As/sfk4CvdFRvlbMzsitzbb5EIpE8DXQS8EVRDAGKX7iuNQDYLGqdACwEQXDQRd1PrDAPMuMg9Q4k34TEq5B0A9KiIDsRCovvwctl8kfW5o8bNw5bW1s8PT3L3QRXV1eSkpKe+PrDhw9z/PjxctdTEWPGjGH79u0ATJgwodRMnf9t15o1a9i8eXOVt1FSQWlRcHId/PY2/DAUvgqGTf1h12tweDHcOwtSZ6ZeqK5VOk5A1EOfR9//WuzDFwmCMAntEwAuLi6Vr1WjgZxEyEmFB0MyMgXIFdo/NSrITYWc+5OyShMwtgEDcxCEomLMlGaYKE1IyElgxMgRTJkyhVGjRlW+fWU4fPgwJiYmtG/fvkL3q1Qq9PTK/1/89ddfl6tdkydPrlD7JFVIo4Zrv8HpTXDzICCC0hQsXcHMCXKS4dYhbSfo8CKwaQk+L4H/GDBsUMONl1SVWjVpK4riOlEUA0RRDLCxsalMQZCbBolXIOOeNnibOYFdK7D3BJsWYNVE+6e9F9i2AlNHUBdA6m1IuAL5WUXFPbw2v6l/UywtLUutPjs7m+eeew4fHx88PT3ZunVr0WurVq0qSqd89epVAFJSUnj++efx9vYmKCiI8+fPExkZyZo1a1i+fDm+vr4cOXLkkTrmzZvHyJEjadeuHc2aNWP9+vWANhh36NCB/v374+HhgVqtZtasWbRp0wZvb2/Wrl374N+aKVOm0KJFC7p3705CQkJR2Z07d+bBprf9+/fj5+eHj48P3bp1K7Zd8+bNK0r3HB4eTlBQEN7e3gwcOJDU1NSiMmfPnk1gYCDNmzcvej+XLl0iMDAQX19fvL29uXHjRvn/vyWPirsIX3eHrSMg/hJ0nAVTz8KcKJh8FIZvg4l/wVtXYfZt6LsCDCzg4DxY3QbOb5N6/HVUdfXwYwDnhz5veP9rFfbpqU+5mnL18RdEEVR5IKpBkIFcH0pJd/ywlpYtmO01GTJiIPkGGNuCqT3I5CjlSmyNbInPjkeTX/qBJvv378fR0ZF9+/YB2pw7D1hbW3PmzBm+/PJLli1bxtdff82HH35I69at2bVrF4cOHWLUqFGEh4czefJkTExMmDlzZrH1nD9/nhMnTpCdnU3r1q157rnnADhz5gwXL17Ezc2NdevWYW5uTmhoKPn5+QQHB9OzZ0/Onj3LtWvXuHz5MvHx8Xh4eDBu3LhHyk9MTGTixImEhITg5uZGSkoKlpaWj7Xrr7/+Krpn1KhRrFq1ik6dOvHBBx/w0UcfsWLFCkD7xHHq1Cl+++03PvroIw4ePMiaNWuYNm0aw4cPp6CgALVaWgJbYYV5ELIUjt0P4IPWQ6tBIC/lx9ywAQSM1X7EnoO9M2DnRDj7HfRfDQ0aVV/7JVWuunr4e4BR91frBAHpoijGlnVThQgAojbQK4yeONgX3WxooX28NbKG7ARIug6qAgAsDSzR19MnITeh1FK8vLz4888/mT17NkeOHCnKmwMwaNAgAPz9/YmMjATg6NGjjBw5EoCuXbuSnJxMRkZGma0dMGAAhoaGWFtb06VLF06dOgVAYGAgbm5uABw4cIDNmzfj6+tL27ZtSU5O5saNG4SEhDBs2DDkcjmOjo507dr1sfJPnDhBx44di8oq68kmPT2dtLQ0OnXqBMDo0aMJCQkp9b23a9eOhQsX8umnn3Lnzh0MDcvOUiopRk4KbB4AR5aB11CYEgreL5Qe7P/LwQfG/wnPfQ73wmF9V4gKrbo2S6qdTnr4giD8CHQGrAVBiAY+BBQAoiiuAX4D+gA3gRxgbGXrnB04u+QXRfGRMfhyk8nBwlk7lp8aqQ36Vk2RKQxwNHYkQhOBSqMqujwqKqoox/3kyZOZPHkyZ86c4bfffuO9996jW7dufPDBBwDo6+sDIJfLUalUj1VdHsJ/3uODzx9OzSyKIqtWraJXr16PXPvbb79Vqu6KKO69v/zyy7Rt25Z9+/bRp08f1q5dW+wvH0kpUiPh+yGQdgeGfAOegytelkwObcaDW0f4YQhs6gsD10CrgTprrqTm6GqVzjBRFB1EUVSIothQFMUNoiiuuR/sub8653VRFJuIouglimJYWWVWSmWC/cMMzMCqKSBqg35BNkYKI8z1zVGL6qK1+c7OzoSHhxcNw9y7dw8jIyNGjBjBrFmzOHPmTKnVdOjQgR9++AHQjsFbW1tjZmZWZork3bt3k5eXR3JyMocPH6ZNmzaPXdOrVy+++uorCgu1h7Rfv36d7OxsOnbsyNatW1Gr1cTGxvL3338/dm9QUBAhISHcvn0b0M41QMmpm83NzWnQoEHR+Px3331X1NsvSUREBI0bN2bq1KkMGDCA8+fPl3q95D/iLsDXPbRPoyN3VS7YP8y6GUz4S9vr/3kMnFqvm3IlNUrKpVMWpRFYN9cu5Uy+ybDpCzgccpSkpCTcGrmx4KMFTJgw4ZFbLly4wKxZs5DJZCgUCr76qvRtB/PmzWPcuHF4e3tjZGTEpk2bAOjXrx9Dhgxh9+7drFq1ig4dOjxyn7e3N126dCEpKYn3338fR0dHrl+//sg1EyZMIDIyEj8/P0RRxMbGhl27djFw4EAOHTqEh4cHLi4utGvX7rF22djYsG7dOgYNGoRGo8HW1pY///zzsXY9bNOmTUyePJmcnBwaN27Mt99+W+p737ZtG9999x0KhQJ7e3vmzp1b6vWSh6REwHcDQa6E0b+CbfHpuSvM2BpG7YHtY+G3mdonXu8XdFuHpFpJ6ZGflLpAu25f1IB1c9LVeURnRmNvbI+VoVW1N2fevHmlTuhKntxTmR45KxG+6aldVjzuANg0r7q6CvPg+8EQdQKGbYVm3auuLkmlSemRdUGuBMvG2vmBlAjM9IyL1uYXqgtrunWS+iQ/C7a8ABmx8PK2qg32AAoDGLYFbNxh20iIrtoRWUnVkQJ+eSgMwdINVPkIqbdxMLJHRCQ2u2oWHJVm3rx5Uu++PhJF2DUZYsO1E7TOgdVTr4E5jNih3Zi4dYT2CUPy1JECfnnpm4KFCxRkocxJxtbIlsyCTDLyy15GKZFU2sm1cOVX6PExtOxTvXWb2sGL32uXgO6coN3NK3mq1MlJW7GwEPT0Hlu2qDNGllCQBVnxWFo2IV3PgNjsWIwVxsjLte5fIimHmDNw4D1o3hvaTXnkpZS8FA7dPcTZhLMk5yaTkpdCXm4WVgpzrBUNsDGwwsbEDgdTJ5yt3PCw86nYz4eDN/RZCr9O1W7y6vyOjt6cpDrUuYCvyc+nICICPTs79MrYKFQpZk5QkI0s7Q4ODVy5nXmXhNwEHIyrNyecpJ7ITdMujzS1h+e/BEEgLS+NA3cOcCDyAKHxoYhqNUEJ5gRG6tH8eg42MVnFFqUWYKefNV4zPqR5QAUmYP1Gwd1/tYnXnNtCky6Ve2+SalPnAr6gVCIYGlIYG4vMyAiZgUHVVCSTQwNXSLyGUVY8lgYNSMlNwUJpgaFC2i0q0bF9b0FGDDmjdvF33L/8dvs3jsccRyWqcFc48/Edf5r/dRPiEkFPDyM/P4wGBCAzNgK5HEEmJ1+VR0ZuKgkRF2l8IBT1iDc45OeM91sfYe3/+LLcEgkCPPeZNsvmrlfhtRPaHeqSWq/uBXxBQNmwIfk3b1IQFYV+48YIct0Ms0RFRTFq1Cji4+MRBIFJkyYxbcLLkB6NrYE5GTI97mXfo7F542Ifl11dXQkLC8Pa2vqJ6jt8+DBKpbLC2TLLY8yYMfTt25chQ4YwYcIE3nzzTTw8PJ6oXWvWrMHIyKhaMojWR4WXf+XfW3vZ59Gev4+9Ra4qF3tje16xHkCno+kIv/+DmHsbo8BAGsyeg3GHDshNTIotywFoAaTE3eHQ8lk0+uMCicPHEenblJbT52LcNujJhnqUxtoduOu7aYeZBqzW6XuWVI06F/ABBD09FA0bUhAZSWFcHEonJ52Uq6enx2effYafnx+ZmZn4+/vTo3t3POxMkGfE4mDRkKjsWBJyErAztqt0fVJ65PpLI2o4l3iOfTd+4cD1naTa22JWmELfxn3pm9scm13HyfpzG4KeHmb9+mE5aiQGLZ9845WlfSOGfLqNK6+f4a//zcb/75tEjRmHENyGJgs+ReHwBEOTjq2h/RvaZG2eg6CJlBKjtquzq3TkJibo2digTk1FlZamkzIdHBzw89Oezmhqaoq7uzsx9+5p8+6IGsxy02hg0IC7SXfp1buXlB5ZSo9cbrfSbrHyzEp67+jNqN9Hsfvmbtrm5rLKaxr7bOYxavV1DF/7iJwTJ7GaOJEmfx3EceEn5Qr2D3N38eP1pQdI/v4TdvQ0Ie9UKNf6PEvK9z8gakrPCgtoJ22tmsGeaY+kFJfUTk9tDz9u4ULyrxSTHvkhIiDm5YFGg2BoWOajqr57S+yfcGt/ZGQkZ8+epW3btqBnoJ1My4zF3rABO/85iZmNGXv37kUhV0jpkaX0yKXKVeXyR+Qf7Li+g/DEcOSCnCDHIKY496TLvvmo5M+R/P4uYm/dQs/RAbs572A+eAhyE+OyC38CgiDQ130QQZ92ZOEv02nz3RnkCxaQcTQEl8+XIzMyKvlmhaF2OOebZ+Gvj6HPEp20SVI16mwPH7SZkoX7GRrF/Dx0lUQiKyuLwYMHs2LFCszMzLRfNLEFPUNk6TF09u/A8cPHmfLWFEJCQqT0yKW89/qcHjmnMIevL3xNj+09eP/Y+6Tlp/GW/1scHHqQL/w+od1Xm7i314HYH88gKJU4Ll1K0z/+wHL0aJ0F+4dZG1qz9KVNpC58nW96yMj+J4SIESMoTCg9HTguQdBmAoSu1x6+Iqm1ntoe/pP2xAHU6ekUREWhZ22Nwt6+UvUWFhYyePBghg8fXhTAitIjixomD+vH5Nde59jJY/y06ydmz51N7569pfTISOmRH1BpVPxw5Qc2XNhAan4qHZw6MM5zHP52/qji4khZsZ4bP/2ImF+IcesWWL3xNkbt2lXdvpKHyGVyXmv9OgfeasZnFjOZtvsat198kUbr1qHfrFnJN3aZCxd3wP53tIncqqGtkvKr0z38B+Tm5sgtLVElJaEuJd1wWURRZPz48bi7u/Pmm28Wfb0oPfK580x+ZRL3bl7E3rQBo0aOYsRrIzgVdqrUcqX0yPUnPXJURhRj9o9hWdgy3K3c+aHPD3zZ/Uv8TN1JXLGSW7204+emTrm4TXDDZcsvGLdvXy3B/mE9XXsyfMJyPhqhR1pWErdfHk72qVK+j40soeu7EHkELu+uvoZKyuWp7eGXl8LeHjE7m8LoGISmTZApFOUu49ixY3z33Xd4eXnh6+sLwMKFC+nT56Et7mYOXLj2G7NGTkWmMEAj0/D+kvcpUBeUWK6UHrnup0cWRZFfbv7C4lOL0RP0+LTDp/RprP2+Sf91LwlLlqBKTMSsXz9svTJQ3N4Go2q2p9ytUTfkw1byntF03t2ajzh+Ak5LPsWsd+/ib/AfC2HfwoH3oXkv7fi+pHYRRbFWfvj7+4v/dfny5ce+Vh7q3Fwx5+IlMS8iQtRoNJUqq1QZ90Qx5owo5mWK+ap88UrSFfFm6k1RrVHrrIoPP/xQXLp0qc7Kq88q+31Vloz8DPGtw2+Jnhs9xXH7x4mxWbGiKGq/H2PmzBUvt2gpRgx9Qcw5e1YUYy+I4jwLUdw3q0rbVB4n750Uu29oK+7p4SVeaukuJm/aVPLFESGi+KGZKP69uPoaKHkEECaWEFfrxZDOAzIDAxQO9miys1ElJVVdRca2IFNARjRKmQInUyfyVHk1klVTUrMuJF5g6K9DOXjnINP8prG+53rsje0puHOHyJeGkb5zJ9avvYbrj1sw9PWFP+ZqM1PWohw1gQ6BrB20hbXjHAhtISN+4SISPvscsbizNNw6gMcAOLYSssqY7JVUu3oV8AHkDRogNzdHFZ+AOienaiqRycHMEQpzITcVU6Up1obWpOWlkZqXqpMqpPTItd/p+NOM2j8Kjahh47MbmeA1AZkgI/Ovv7g9ZCiFsbE4r12DzdQ3tLvBIw7D7X+g49vaMfFapLFFYzYN2MLBCT4caC2QvH49MXPmIBa38KDbh6DKg5Bl1d9QSameuoBfbK+iHARBQOHoiKBQUBgVhVhV674NG4CeIWTGgShia2SLscKY2OxY8lR5VVOnpNwq+/1UkvjseN46/BZOJk5s67sNX1tfRJWKhGXLiH59CkoXF9x27MDkwaS2KGrXsZs1hIBxpRdeQ6wMrdjQ+1sypw5j2zMyMnftJuK1V9Dk5v7nwibQegSEfQOpd2qmsZJiPVUB38DAgOTk5MoHfbkcpXNDxEIVhffuVc0PvSCAmQOo8yEnGUEQcDJ1Qi7IicqMQi3lEq9xoiiSnJyMgY4T7BWoC3jznzfJUeWwovMKLAwsUGdlc3f8BJK/3oDFiy/SaMsPKBs+lPLj2m8Qcxo6z9aeMFVLKeVK3mv3Pn5zFvNtb33yjo1Rtw4AACAASURBVBznyqhhqB/aXAhAp9kgyLQZNSW1xlO1Sqdhw4ZER0eTmKib03bUOdlo4uOQJySUvpuwMjLTISoFTB1AEChQF5Ccm0yCXgKWBrXrsb0+MjAwoGHDhjotc0noEs4nnmdZp2U0bdAUTUEBMVPfICcsDIeFC7EYNPDRGzRqOLQALJuAz8s6bUtV6dekH83fb863FpN4eds1zg3tj+fmrSgf7HMxd4LAiXDiSwiepvsD1iUVU9Jsbk1/FLdKR9c0KpUYOXyEeLW1n5gfGVk1ldw8pF21cGJt0Zc2Xtwoem70FDde3Fg1dUpqzL5b+0TPjZ7iZ2GfiaKo/R6LmjZdvNyipZi685fibzq3Tfs9cmF7NbZUN9Ly0sSFq18ST3u1FE90DBBzkuL//8WsJFH8xEkUf3y55hpYDyGt0imeIJfjuHQJ6OkRM3OW9qQsXWvcGRo9A0eWQYF2kniUxyi6uXRj+enlnIk/o/s6JTUiOjOa+Sfm42vjy9TWUxFFkbgFC8jcvx/bt9/GYuDzj9+kVsHhhWDnBR4DH3+9ljPXN2f2az9wZe5gDJOyODKyLykZ8doXja2g/RS4uhfiLtRsQyXAUzaGXxUUDg44fPwxeRcukLj6C91XIAjQ7X3IiofT397/ksD84Pk4mTgx659ZJOcm675eSbVSaVTMOTIHgMUdF6Mn0yPtp59I+/EnrCZOwGrc2OJvvLQTUiK0yzBlT+ePo0yQMfylBaTNHIlzRCa/TXyOW6m3tC+2nQz6ZtKKnVri6fwO0zGzZ3thPmQwyevWkX2y9DQIFeISBK4d4PgqUOUDYKo05fPOn5NekM67x95FIz5BKlpJrbXu/DrCE8N5L+g9nEycyLtyhfhFizHu2AGbGTOKv0mj0QZCWw9oUc0HkleBjmPnopr4Iv7nstnx9hBC40K1J2EFTtSmW0i8VtNNrPekgH+f/Zw5KF1cuDd7Nmod5c9/RMeZkBkL4T8UfamFZQtmBszkWMwxtlzZovs6JdXiYtJF1p5fS7/G/Xiu8XOos7KJmT4DuYUFjosXI5TUc7/6KyRdgw5vPbW9+//yfPNDFAN60+9IHrvnj2P/7f0Q9Lo2zYLUy69xdeO7TAdkxsY4LluGKimJ2Hkf6b4Ct07gFABHV2jHbe97scWLdG7Ymc9Pf861FKkH9LTRiBoWnVyEpYElc9vO1Y7bz5tHQVQUTp8tQ6+klNKiCCFLtStzWj19Y/clEQSBJp8swaBnN4b/peLg8rf47s5v2r0FF7dD8q2abmK9JgX8hxh6eWLzxhtk7t9Pxu+/67ZwQdD28tPuaL/xi74s8HHwx1joWzA7ZDa5qtxSCpHUNvsi9nE+6TzT/KZhojQh8/ffydi7F5s3pmBUTPbSIjcOaCcyO7yl3Zldhwh6erh+thyjLp0Zf0BD6NeL+cctEORKOPp5TTevXtNJwBcE4VlBEK4JgnBTEITHkoAIgjBGEIREQRDC739M0EW9VcFq/DgMvLyI+3g+qmQdT6Y2fxbsPOHI59rx2/saGDRgwTMLuJV+i6WhS3Vbp6TK5BTmsOL0ClpZtaJ/k/6oMzKIW7gIg1atsJo0qeQbRVE7vGHuAt4vVF+Dq5GgUOC8ciWG7dsxab+Gr/Yt5J7PC3DuJ0iPrunm1VuVDviCIMiBL4DegAcwTBAEj2Iu3SqKou/9j9JPya5Bgp4ejosWosnKIu6jj3W7C1cQoMOb2nHbq3sfeam9Y3vGeY7j5+s/sz9yv+7qlFSZDRc3kJCbwDuB7yATZCQsX446JQX7jz/S5sYpyd1/IfoUBE8FefnTdD8tZEolzp9/jl4DS8btyuLtghgKRRFOfFXTTau3dNHDDwRuiqIYIYpiAfATMEAH5dYY/aZNsX7jDTIPHCBzv46Dr8fz0MBNu2LnP6a0noKPjQ/zjs8jKiNKt/VKdOpe1j02XdpEH7c++Nr6knP2LGk/bcVy5AgMW7Uq/ebjq8DQEnyHV09ja5DcwgKn+QtwjtfQct9VPm/qB6c3QV562TdLdE4XAd8JeDg6Rd//2n8NFgThvCAI2wVBcC6uIEEQJgmCECYIQpiu0idUlNW4sRh4e2uHdu6f9KQTMjkEvabt4d09+chLCpmCJR2XIBfkzAyZWeqhKZKa9ePVH1Fr1Mzwn4FYWEjch/PQs7PD+o2ppd+YdEObNydwIiirKJ1HLWPatQvmzz/PwBNwPCqOg3oq7UEpkmpXXZO2vwKuoih6A38Cm4q7SBTFdaIoBoiiGGBjY1NNTSueoKeHw4L5qLOyiF+4SLeFtx4OBhbw7+O9fEcTR+YHz+dy8mUWn1pcZdkcJRVXqClkz609dGzYEXtje9J27SL/+nXs3p1b9uHi/64GuT60mVg9ja0l7ObOQWFjw1u/K/jYypao0DWgkjo01U0XAT8GeLjH3vD+14qIopgsimL+/U+/Bvx1UG+VM2jeHOtXXiFj714yiznztcKUxtBmPFzZW+wyta4uXRnvOZ6fr//MhosbdFevRCdCokJIyUthULNBiBoNKd9uRN/DHdPu3Uu/MSsRwn8E32FgUrMdmuomNzPDccECbOLzGHBM4C1jkfxzP9Z0s+odXQT8UKCZIAhugiAogZeAPQ9fIAiCw0Of9geu6KDeamE9aSL6zZoRN+8j1FlZuis4cJJ2wq6ECaypflN5rvFzrDyzkj239hR7jaRm7Ly5ExtDG4Kdgsn65x8KIiKwGjuu7IPGT60DdQG0m1I9Da1lTDp0wGLoEHqfKESVpGDp2RXaFUuSalPpgC+KogqYAvyBNpBvE0XxkiAIHwuC0P/+ZVMFQbgkCMI5YCowprL1VhdBqcThkwWoEhNJWKrDnYKm9uD1Apz9HnIenyOQCTLmt59PW4e2fHjsQ47HHNdd3ZIKi8+O52jMUQY0HYCeTI+Ub75Fz8EBs2d7lX5jQQ6Efq1NoWDdrHoaWwvZzp6Nwt6eOfuV7KSQ0DPrarpJ9YpOxvBFUfxNFMXmoig2EUXxk/tf+0AUxT33/z5HFMVWoij6iKLYRRTFq7qot7oYentjOXo0aVu36jbXTvspoMrVngxUDIVcwfLOy2ls0ZgZh2dwJfmpeTCqs36N+BWNqGFg04HkXrhATmgolqNGISjKWF55YRvkpkC716unobWU3MQExwULMEnIZdw/GpZeXC/lkapG0k7bJ2Qz9Q0ULi7EvvceGl2dhWvrDo27QOgGUBefmtlUacpX3b/CTN+M1/56jZismGKvk1Q9URT55cYvBNgF4GLmQsq33yIzMcFi6JCyboQTa8DeCxq1r57G1mLG7dtjMewluoaJZCXkse9c8R0eie5JAf8JyQwNcVgwn8KoKBJX/k93BQe9Cpn34ErJ4/S2Rras6b6GfHU+k/+cTFpeFSR3k5QpLD6Mu5l3GdRsEAXRMWTs/wOLF19AbmJS+o23/4HEK9pUwWWN89cTttOmITcyZvw/KlZeWCulFKkmUsAvB+PAQCyGvUTK5s3knD2rm0Kb9tBuxDq5ttTLmlg0YVXXVdzLuscbh96QDkKvAYfuHkJfrk/3Rt3J2LcPNBoshz/B5qmTa8HIGjzLeBKoR+QWFliOGYPHTQGje7lsPieN5VcHKeCXk+1bM9FzsCd27rtosrMrX6BMBm1fgaiTEFP66Vf+dv4s6rCIc4nnmB0yWzoIvZqdjDtJa9vWGOoZkn30KPru7igcHUu/KSUCrv0OAWNr9eHkNcFyzGhkpsa89nchGy5tJDGnZjdb1gdSwC8nuYkxjgsXUnDnDvfmvqubjVG+L4PSRLtsrww9XXsyO3A2h6IOSRuzqlFybjI3Um/Q1qEt6qwscs6exeSZZ8q+8dR67e7qgPFV38injNzUFKsJk2gUKcM1qpAVp6VMmlVNCvgVYBwUhO1bb5L5xx8kr1tf+QINzLVB/+IOyEoo8/Lh7sMZ02oMP137SdqYVU1OxWlXZ7W1b0vOyZOgUmFcVsDPz9Quu/V4HswcSr+2nrIcMRy5mTFv/F3Anoi9nE88X9NNqtOkgF9BluPGYdanD4krVpAVElL5AgNf0W7KecIcIzP8Z9DbrTcrz6zk11u/Vr5+SalOxp7EVGGKh5UHWUeOIDMywqi1b+k3nd8K+RnayVpJsWTGxli9MhnraDlBUQKLTi6SlmlWISngV5AgCDh8sgD9Fi2ImTmL/Nu3K1egdVNo0k170HkJSzQfJhNkLAheQKB9IB8c+4Dj96SNWVXpZOxJAuwDkAkyso8cxSgoCEGpLPkGUdQut3XwgYYB1dfQp1CDl4cjNzVg8qEcLiZfZPfN3TXdpDpLCviVIDM0pOHq1Qh6ekRPfhV1eiVTvraZoD339tqTnballCtZ0WUFbhZuvHn4Ta6mPFX72Z4aMVkxRGdF09ahLQWRkRTGxGDSoYzhnDvHIeGy9v9UWopZKpmhIVZjx2B0T0GfOBNWnFlBZkFmTTerTpICfiUpGzrRcNX/KLx3j+jp0xELy+6dl6h5LzB31m7Bf0KmSlO+6vYVpkpTXj34Kvey7lW8fkmxTsZq01i3tW9L9tFjAGWP34d+rZ2bkZZiPpEGYyYiN9Jj9J/JpOal8tU56ZCUqiAFfB0w8vfH/uOPyfn3BHGffFLxlTMyOfiPub9R5/oT32ZnbMdX3b7Sbsw6OJn0fOlwCV06EXsCa0Nrmlg0IevoEZSNGqF0LvZIB63MOO1GOt8R9SbnfWXJjIywfGkAQrSciZmN2XJlCzdSb9R0s+ocKeDriMXA57GaOIG0n7aS+v0PFS/IbzTIFCXm1ylJ0wZN+V+X/xGdGS1tzNIhURQ5FXuKQPtAxIICck6Flt27P7MZNCptCmzJE7N87R3kBgLP7b2FicKERacWScuOdUwK+DpkM2MGJt26Eb9oEVn3H/3LzcQGWj0P4VugoHwbuwLsA1jUYRHhCeHMOTJHWu2gA7fSbpGcl0yQQxC5p08j5uZiXNr4vfr+aU5NuoJVk+praB0gMzHBsv8z5EeqmK1uS2hcqHS+s45JAV+HBJkMpyWfot+8OTEzZpB/6/HDTZ5ImwmQnw7nt5X71l6uvZgZMJODdw+y6uzjJ2pJyudknHb8PtAhkKyjxxAUCowDA0u+4frv2txIbSZUUwvrFssZC5AbaPD87ijuDVqyLHQZ2YU62NEuAaSAr3MyY2Ocv/wCQakk6tXXUKWmlr8Q57Zg56kd1qnAI+1Ij5EMbjaYry98zd6IveWvX1IkJDoEVzNXnEycyD52DEN/f2RGpYzLh30DZk7QrIz8+JJiyRrYYtPXm7w7GbyX9QwJuQl8feHJFzFISicF/CqgcHSk4epVqOLiiJk6DbGgnGd3CoI290rcebhXen6d4m8XeLftuwTYBfDhsQ+l3YsVlF2YTWhcKJ0adqIwIYH8a9cwDi4lvXHKbbh1SDsPI9ervobWMRaT30NpVojRmh8Z4PIcmy9tJiozqqabVSdIAb+KGLVujcOC+eSEhhI3f0H5J5+8XgCFcbknbx94cHiKrZEt0/6eRlx2XIXKqc+O3ztOoaaQTs6dyPn3XwBMgoNLvuH0RhDk4DeyehpYRwkNfbDr4UBhQjoTbzkjl8n5PEzKs6MLUsCvQub9+2P1yiuk/fwzqZs3l+9mAzPwGgIXd0JuxfLfWxhYsLrbanJVuUw9NFXKOV5Oh6MOY6Y0o7Vta7KOHUNuaYl+y5bFX6zK1+bNadEbzMrIoCkpk/HQ1zCyyyd/7bdMchvOwbsHCY0LrelmPfWkgF/FbKZNxbRHD+I/XULGn3+W7+aAsVCYU6HJ2weaWDRhScclXE25ygfHPpCWuT0htUbN0ZijPOP0DHJkZB87jnFwMIKshB+ZK79CThIEjCuxzAKVhvTcQuIz8ribnENqdoH0/1ECodXz2LUVUWdl0/ufLByNHVl8arGUErySpIHGKibIZDh+upi7Y8dx7823kH35Zdnb8h9wbK39CPsGAidWeIt+x4Ydme4/neWnl9OsQTMmeU+qUDn1RV6hmoO3TpKSl4KLQQChB09hmpxMpKsn4edjyVepKVBpKFBrKFBpyFdp6H/2C4yVjnx0yoLUkFNk5hWSlaciK19Fdr6KnAI1Ks3jwV2pJ8POTJ92ja0Y3rYRPs4WNfCOayGFIQbdXsb80g+kf/8jb695m+kRS9lxYwcvtHihplv31JICfjWQGRnhvG4td8aMJfqNN3BZvw6jNm2e7OaAcbDnDe0BKS5BFW7D2FZjuZF6g1VnV9HSsiUdG3ascFl1UXpuIX9fTeDA5TgOX0tEZb4PpZWMpbtgyLXtjAem3FCQGvX4JHoTIYbX9c+wnBGEx2RgYajA1ECBvZkBxvp6mOjrYaSUY6SUY6CQY6iUo5TLyMhTkZCRR3RqLnvPx7ItLBovJ3OGt3Whv68jRsp6/uPpPwZbry/JjDGj2ffH8R/oz+qzq3nW7VnMlGY13bqnklBbHykDAgLEsLCwmm6GTqlSUrgzYiSquDhcvv0GQx+fsm8qyIbPWmrHhgdV7hi4PFUeI38fSWx2LNv6bsPRpP6ONReqNdxOyubYzSQOXonnZEQKKo2Irak+PTzsOFkwFxOFOdNbfY7lB28iz0hDs/4HlHoylHoy9O//qdSTYXTofeRhXyO8eUW7ca4CMvIK2X02hu9P3OVafCam+noM8nNieFAjmtuZ6vjdP0U29iX5cCQJJ9Tw+fu8mLiYER4jeLvN2zXdslpLEITToigWm6JVCvjVrDA+njsjRqJOS8Pl228x9GxV9k37Zmq36791FYwsK1X/3Yy7vLj3RdzM3dj47EaU8lJS/NYRhWoNV2IzOHs3jfCoNC7fyyAiKYtCtfZ7v6mtCT087OjhYYdvQwtic+7x7I5nmRkwk5GNX+B6YFsajBiB3exigkxhHnzeEhp3hqEbK91WURQJu5PK9yfu8PuFOArUGgLdLBne1oVnPe3R15NXuo6nyoXtaLaNJ+KYD4KhGd/P9mNX5K/sHLATN3O3mm5drVRawK/nz4zVT2FnR6NNG7kzchR3x4+n0bffYODhUfpN/qMhdL32QI2gVytVv4uZC/OD5zPj8AyWhS1jbtu5lSqvtorPyOPQ1QT+vprAsZtJZBdoJ/tsTPXxcjKnq7stLexM8XG2wM3a+JF7D0cdBqCzc2dywsIQCwsxfqaE5ZhX9kBuKviP1Um7BUGgjaslbVwt+aBvPttPR/PDybtM+ykcY6WcoMZWdGhmTXBTa5ramiDU9dTL7v2QmVhi18mc6B9vMvZGX/YbGrAsbBlfdPuiplv31KlzAV+l1vD29vOMbu9aayfAFI6OuGzaxJ1RI7k7bjwumzZi0KJFyTfYe4FTgHadd9vJlc6v3r1Rd0Z5jGLz5c20sW9Dj0Y9KlVebZGZV8jvF+PYdTaGfyOSEUVwNDfg+dZOtGtiRWuXBjiaG5QZJA/dPYSbuRuNzBoR98/3CPr6GPn7F3/x6Y1g2RhcO+j8/ViZ6PNKpyZM7NCYozeTOHA5jiM3kvjrqvYYTEtjJW1cG9DG1RJfZws8ncwxUNSxJwA9ffB9GZMTazAO7E3u2m95fcVoPr3xVdEqKsmTq3MBPyYtl38jktl97h6TOzVmardmtfIxWNnQiUabNml7+mPGaoN+8+Yl3+A/BvZMqfTk7QPT/adzJv4M847Pw8vaC3tj+0qXWRM0GpF/I5L5OSyK/ZfiyCvU4GplxLRuzejt6UBzu/L1gpNzkwmLD2Oi10REUSTz0F8Yt2+PzMDg8YsTr8OdY9D9IyhpuaYOyGQCHZvb0LG5dn7gbnIOJyKSORWZwqnbKfxxKR4APZmAp5M5z/s60t/XCUvjOjJc5z8G4d/V2PZx5fbpcLoeSOBHbxeWhC6hrUNbFDJFTbfwqVEnx/Az8gpZsPcy28KiaWlvyrKhPng6meu4hbpREBnJnVGjEdVqGm3ehH6TEjIsFmTDshbg3hcGrtFJ3Xcz7jL016G4W7mzoecG5LLa94uxJFEpOWw/Hc2OM9FEp+ZiaqBHfx9Hhvg3xNfZosJDHduubWP+ifls77edRvEabg8chMMnC7AYPPjxi/fPhVProBKTtbqQkJnHuah0wqNSOXwtkUv3MlDIBbq2tOVZT3u6trDD3OgpD4ob+0J6FHHpg0n9aSvJa+by6u3FvBP4DsPdh9d062qVejtp+/fVBN7ZeZ6krIJa3dvPj7jNndGjAGi0aTP6jUuYjNr7JoT/oJ28NWygk7r33NrDu0ff5XXf15nsU3sP29ZoRK7EZXD8ZjKHribwb0QyggDBTawZGtCQXq3sdTKcMfHARGKzY/n1+V9J+uJLkr74gmZHj6BnZfXohTqerNWlK7EZ7DgdzZ5z90jIzEcuEwhqbMlQf2ee9dTNv1O1u7AddoxH1X8zt15dhIG7O58M0+NiyiX2DdxHAwPd/DzUBfU24IN2ffWCvZf5+XQ0TW1N+KCvBx2aWde6ya78W7e4M2o0gkxGo+82o3R1ffyi2POwtgP0XgJtX9FJvaIo8s6Rd/gj8g/W91xPG/sn3B9QDZKz8gm5kcg/1xI5ciOJ5GxtErpmtib083FksH9DnCwMdVZfal4qXbZ1YZznOKb6TSVi0CBkBoa4binmQJvzP8POCTByFzTporM26JJGI3IuOo0/L8ez93wsd1NysDBSMNivIVO6NKXB0zTko8rXLk9260BKfk/iP/kE+eK5vJDxGUOaD+G9oPdquoU6oVJr+OVsDFn5KsYGV2wVUpUHfEEQngVWAnLga1EUF//ndX1gM+APJAMviqIYWVqZul6W+c/1RObuvEBMWi7uDmZM6uhGX29HFPLak10i/8YNbdBXKrVB38Xl8YvWdYHCXHjtX50djp1VkMXLv71Mal4qW57bgrNpKcf3VSGVWkN4VBr/XE/kn+uJXIhJRxTBylhJx+Y2RatT7MyKGU/XgR3XdzDv33ls67uNpnlm3OzWHdtZs7AaX0y6hG+fg4wYeONMlY7f68qDuY4tp+7yx8U4rEyULBvqQ4dmNTcUVW5/vAsn1yBOvUDE8EmIhYVs/+AZfozYzs/9fqZ5g1LmwGo5jUZk74VYVvx5nYikbNq6WfLTpKAKdUyrNOALgiAHrgM9gGggFBgmiuLlh655DfAWRXGyIAgvAQNFUXyxtHKrYh1+vkrN7vB7rA+J4EZCFo7mBox7xo0X2zhjalA7xjjzrl3j7qjRCEZG2qDfsOGjF5zeCL9Og/F/gnMpB3GU092MuwzbNwwbQxu+7/M9JkoTnZVdmvTcQv64FHe/F59IRp4KmQB+Lg3o1NyGzi1saeVohkxW9U9kr/z5ClGZUewbuI/U738g/pNPaLL/98eftpJuwmp/6D4PnplR5e3StYsx6UzfGs7NhCzGtHdl9rMtMVQ+BcM8idfhizbQ/SOyxACiJk7EdPrrvGj+I+5W7qzvsb7WPbmXRRRF/rqSwLID17gal0kLO1Pe7Nmcnh52FX4vVR3w2wHzRFHsdf/zOQCiKC566Jo/7l/zryAIekAcYCOWUnlVbrzSaEQOX09gXUgEJyJSMDXQ4+W2Loxt74a9edX0Hssj78oV7owZi9zYmEbfbUbh5PT/L+Znah9tPQbA81/qtN5Tsad45c9XCHIMYnXX1VU6iRuTlss3R2/z06m7ZBeosTPTp9P9lSgdmtpU+yRjWl4anbd1ZnSr0czwn8GdsWNRJSTSZF8xB8gceA9OfHV/sta2WtupK3mFahb/fpWNxyNxtjTk4wGedGnxFLyXb3pDVhxMOU3Ua6+TExrKuVWTmH9jFSu7rKSrS9eabuET+/dWMkv+uMrZu2m4WRszvXsz+nk7VrpzU1rA18WzqBPw8OkE0fe/Vuw1oiiqgHTgP7Ng1UcmE+ja0o6fJrVjz5RgOja3YX1IBB2WHOKtbee4EZ9ZU00DwMDdHZcNG1BnZnJn9BgKY2P//0V900qnTS5JoEMgc9rO4WjMUdaeX6vTsh/IK1Tz8a+X6bjkbzYej6SHhx27Xw/mxJxuLBniQ19vxxpZUfJ31N+oRTU9G/VEnZ5OTmgYpt26PX6hKl973nCLPk9tsAcwUMiZ178VP00KQimXMfbbUF7/4Qx3kmv5cYL+YyAlAiKPYDv7bTQFBQTvjaSJeROWhS2jQF3Ow4ZqwMWYdEZ9c4ph608Ql57H4kFeHJjRkQG+TlX+JFurBh8FQZgkCEKYIAhhiYmJ1VKnd0MLvnjZj39mdWF420b8diGWXitCmLPzPAkZedXShuIYerbC5ZsNqNPStEE/Pv7/X/QfA6pcuPCzzut9ocUL9Gvcj7Xn1xKeEK7Tsq/GZTBg9TG+OXabF9s4E/J2F1a81BqfSiyj1JU/Iv/AycQJDysPskJCQKXCtFsxvcWr+yAnWft/UAcENbbi92kdmdmzOQevxNN52WFe/f40Z+5W4GjO6uDRHwws4PRG9N3csBwxgoxfdjHH/AWiMqP4/sr3Nd3CEt1OymbKljP0XXWU89FpvNvHnb9ndualQJdqm0usl0M6pUnJLmD1oZt8dyIShVzGKx2b8EqnxjW2lC03PJy74yegZ22Ny3ebUdje71Wu7QgaNUw+qrPJ2wcyCzIZsmcIMkHG9v7bMVYYl31TKRIz8/nu30jWhERgZqBg6VDvWjV8kJSbRLefuzHOcxzT/KYRPX0GOafDaPbPP4/nv9/UH1Jvw9RzT8VkbXkkZOSx8Xgk35+4Q0aeik7NbXi/rztNbWtZ8rbf34GwDfDmFdQafW71ehalmxufjbXgVHwo+wbtw9rQuqZbWSQ+I4+Vf91ga2gUSrmM8c+4MalTY8yqaN6wqod0QoFmgiC4CYKgBF4C9vznmj3A6Pt/HwIcKi3Y1yRLYyUf9PPgzxmd6NTchuUHr9Nj+T/8eTm+Rg6rMPT1xXn9elSJidwdMxZVUpL2Bb/REH8RYsp/5m1ZTJWmLOqwiHvZ91h09UqcXwAAIABJREFUclHZN5TgWlwmb207R/DiQ/zv0E26u9uyf3qHWhXsQdu714gannN7Dk1BAdkhIZh26fp4sE++Bbf/Ab9RdS7YA9iaGfD2sy35d0435vRuyZm7qfRacYR5ey6RlJVf0837f/6jQV0A4VuQm5piM30auadPMz09kALN/7V339FRVVsAh39nUkkhvUIg9F5EOkqTXi2ggEjv1QeoqKj4niiCIKCIIL1IlyKgdAFBQihSQhMCJEAglRTSZ87740Yk0slMbkjOt5bLZObOvXt0snNzyt7pfHPsG70jBCApLZOp287RaPJuVh8Op3udYux5tzFjWpazWLJ/lBx/arPG5IcBW4EzwCopZYgQ4r9CiA5Zh80DPIQQF4BRwNicXtfSAj0dmdX9eX7sXwd7ayv6Lz5M74XBXI7O/TFOhxrPETBnNhkREVzp1YvMmBio0hlsHODIAotcs4ZPDfpW7suGixvYdnnbE732+q0URq86Tqvpe/nlVARdawewa3QjvnvzeTyd7CwSb05sCd1CObdylHYrTXJQEKbk5PsP5xxdrPWsrd4994PMRY521gxsVIrfxjSmS60AFv9xmXpf7GTE8mMEhcbo36XLuwIE1IGji0BKXF97Dbvy5THNXEj3Ep1Z99c6zsed1y08o0my4lAYjSf/xoxdF2he0ZedoxrzacfKeDvruygk32+8MocMo4lFBy4zbcdfpBtNDGpUiiGNS+X6MM/toEOEDxyIbbFiFFu0EOu9H2mTt6PPaj1wzSzDlEGPLT0ISwxjbYe1j6y3cyM+lbn7Qll88AoAveoHMqRxKVwd8u4Gn7CEMNqua8uo50fRu3JvIsaPJ37jz5T94wAGu7t+OWWmw9cVtUTT5T4bsfKxi1FJLPnjCmuPXiUxNZNi7g60repH2yp+VPIvrM/8y5/LYf0g6LUZAl/g9qFDhPXoifPg/rzuvYaqXlX5vpl5SpA8iRNXbzFu/SlOXI2nZnE3PmxbgeeK5e4uYEsP6eR7NlYG+r1Ykp2jG9G6si8zdv5F86/3sOP0zUe/2Iwc69QmYNZ3pF+5QljvPhjLdIaM2xaZvAWwMdjwxYtfkGHKYNz+cZik6b7Hnb+ZyLtrjvPipF0sOHCZdlX92DW6ER+0qZCnkz3A5kubEQhal2iNNJlI2rUbpxdeyJ7sAc5tgdtR+Way9kmU8nJifIdKBH3wEpM6VaW4hwNz9obS7pvfafLVb0zeepbT1xNy986/0stg76LtSwEca9fGuWVLkhYuZViRruy/tp8D1w/kWjjxyRmMW3+SjjP3ExGfyvQu1Vk9qF6uJ/tHUXf4T+HAxWg+3hDChcgkmlXw5pP2lQhwd8i16yf9vp+rQ4ZgW6oUxRvdwMreAAP3mX3y9m9rzq/h0z8+ZUzNMfSspE3FhMcms/lkBBv+vM6ZiATsbQy8UTOAfi+WzNX/FjkhpaTD+g54FvJkQasFpJw4weXX38D/y4m4dOyY/eDFHbUx/JHH4RkqMmcpsbfT2RZyg80nIzhwMQajSVLG24k3agXwynNF8MiNobst72pDmqPOgqMH6VevEdqmDY4tm9O/7ikcbRxZ1W6VRfeTSCn56eg1Pt9yhrjkdHrWD+Q/zcvqNkYPBbyWjqWkZ5pYsP8S03f+RaZR0rG6P/1eLEk539xZ0ZC0Zw9Xhw3Hrqg7xZ77E6uhO6HIA2q255CUksHbh3PwxgHq2Y8n5LIzYbHJAFQPcKVjdX86VPPPnR9yMwqJCaHLpi58Uu8TOpXtROTX04iZO5ey+3/HyvWuXgqxoTDjOWgyDhq9o1/AeVRMUhq/nLrB2qNXORZ2CxsrwUvlfWhfzZ+m5b0tt4v3ZgjMqg8tJkD9YQBETplKzA8/cP2bUbx9fQb/a/A/Xi79skUuf/ZGAh9vCOHQpVhqFHPlfy9XppK//lV5VcK3oIj4FGbuvsCaI1dJzTDxYhlPWlT04cUyXhT3cLDo+Gbirt1cHTECe9dUio1ohtXrs8x27uT0TA6GxrD3fDT7L0RzIeYmDiWnYTA5UNv2v7xQ2o+m5b0p7pGzJZt6mhQ8iRVnV7D79d242LkQ2r49Vm7uFF+8KPuBO8bD/hnwn1NQuOD2AX4c524ksjI4nI3HrxOdlIaDrRUvlPakShEXKvoXppyvM34uhbAy1wajuc21jmPDgkEIjImJXGzREruyZXm3UzIJ6Yn8/MrPWBvM1/ojITWDr7efZ/EfV3C2t2Zsq/K8XjMgV8p/PA6V8HNB7O10fgy6worgcK7GpQBatyU/10K4O9ri7mCLl7Md3oXt8Ha2p5J/YYq6FcrxL4TEHTu4OmIEhTwyCFi/FysPv6c6T6bRxKnrCRy4GM2BCzEcuhRLutGEvY2B2iU8qF/KA0eXC0w6PoZu5bvxfp33cxS33pIzkmm+pjl1/OowtfFU0sPCuNiiJT7vj8W9Z89/Dvx7srZobej6o34BP2OMJklQaAw/n4jgwMVorsQk33nOxkpQxLUQZXyc6V0/kHqlPJ7+5+DYMtgwBHptgUCtDWXs0mXc/Owzov87kCEp85jccDKtSrTK0fuJvZ3OwdAYDlyM5tdTN4i5nU632sUY06Jcnqs6qhJ+LpJSciUmmX1/RRF8OY7opDRib6cTezudmNvpGE3//Pf2crbj+WJutK3qR6vKvk+92y7hx1lc+990CpUpSsCP67FyerzCZ8npmew9H8Wvp26w82wkiamZAJT1caJhGS8alfOiVqB7ttVIEw9NZNmZZcxqNuuZbi+34uwKJgRNYEnrJVT3rk7MgoVEfvklpXZsz16wLmQ9rO4J3VZD2Rb6BfyMS0rL5GxEAudvJhEel0x4bDJBl2KJSkzj+eJuDGpUijol3Z987Ds9WastVbYFvDYXAJmRQWi79mBtxajeAjs7B1a2W5ntl4rRJLmZkEp4bDLJ6UZcHGxwc7DF2iCITkojKjGNsNhkTl6L5+TVeEKzlmM72lpRr5QHI18qS5Wi+g/f3I9K+HmE0SSJvZ3O9VspnLgWz9ErcQSFxnA9PhUvZzu61S7GqzWKPPkwiZQkjK7NtV+TsK9UhWI/zMk+Bn2X22mZ7DobyZaTEew+F0lqhgk3BxuaVfChYVkv6pb0wMv5wWPxqZmpdN3clbjUOH7q+BPu9u5PFmseYDQZ6bC+A652rixtsxQhBJfeeAOZmkbJDeuzH6wmay0mNcPI6sPhzPrtItfjtTImJTwdqehXGD8Xe7yc7bS/ip3/+drB1go7a0O25C03j0EcXXRn8hYgYft2rg0fQfjA9ox2/4UegROQKWW5EJnExagkwmKTyTA+Ovf5udhTpYgL1QJcqVvSg6pFXfJUSfX7UQk/DzOZJHvOR7H4j8v8dj4KKaGUlyMvVfChkn9hvJ3t8S5sh7OdNdZWBqwMAmuDwMogEAJsDAZt7DB4Holz3ufaQV9sS5TAZ/Yc4uydiUlKJzwumePhtzgeHs/xq7dIyzTh5WxHq0q+tK7sS+0S7lg/wYf4XOw5um7uSoMiDZjRZIbudXCe1K6wXYzcPZLJjSbTKrAVaaGhhLZpi/e77+LRp/c/B8ZchG9qqMlaC0vPNHHgYjSnrsVz6loCZ28kcDMhjZQM4wNfY2ttAAmZJhOlCWeb3XssdOrLn0XfIsMouX4rmd4rPqdwUhwjBgkyjN5kXB1AoKcjpbwcKeHpRIB7IQLcHHC2t+ZWSgZxt9PJMGo/G15O9vi52ufJjYKP8rCEn++amD9rDAZBk/LeNCnvTXhsMjvP3GTn2UgW7L/0WHcgVgaBu6MtAY5FWVbUwLWGvrjtuczFdp34oMFAohy0dcC21gYq+xeme93itKjoQ81A96eeOCvnXo6RNUby1eGvWPPXGjqX7fxU59HLopBF+Dv606xYMwDi160HKytc2rfLfuCRBdrO2hpv6RBlwWFrbaBxOW8a31VyQ0rJ7XQjkQmpRCWmEZmYRnSS9ksgNcNEWqYRg9BufoQow6VjVWmV8gtzL7XB1sYaP1d7LrXsRIulkxkW8xLfFNnDircDqOZdRcd3qj91h59HJadnci0u5c6HPSktE6NJkmE0YZISowlMUpKcnklMUjrRSel0jZzKi8k7WOQyhTqLpiMdHIn731Q8y5WmrI+zdldkJiZpYuD2gRyPOs6qdqsIdAk027kt6VT0Kbpu7so7Nd+hR6UeSKORC02aYl+hAgGz79qZmZEKUytA4AvwxhL9AlYez/GVsG4A9Nig9RkGpMlEaIcOSCHo0SWaukXqMbXxVF3DzA3qDv8Z5GBrTRkfZ8r4PMG6/oj3YPZm+te9TUrzRYT360+hT96m2Lx52Fqbd4LJIAxMeGECr258lbH7xrKkzRJsDHmja9jDLA5ZjJONE6+WeRWA238cJDMyEpcPPsh+4JmNkBILNe/T3lDJeyp2hF/fg8Pz7yR8YTDg0bcfEe+/z9C0Nnx5ZTuht0Ip6VpS11D1lLdnH5Qn41cNitSEw/MpVLEixZcsRggDYW/1IOXkSbNfztvBm/H1xhMSE8L0I9PNfn5zu5Jwha1XttK5bOc7LRzj163D4OKCU9N/NSI/vADcSkCJRjpEqjwxG3uo/qbWryDxn5InLm3bYO3rS52dEdhb2zP35Fwdg9SfSvj5Tc0+EH0OrhzArnRpii9bisHZmbBevUkODjb75ZoVb8Yb5d5g0elFrDq3yuznN6d5J+dhY7ChR6UeABgTE0ncsQOXtm0w2N61ljryDIQdgJq982UZ5Hzr+d5gyoRj/wzBCVtb3Hv1JOPIMfoZGrHl0hbCE8MfcpL8TX2a85tKr2hFpQ7PB8A2IIDiy5Zi7etLWL/+WjcnMxtbeywNizZkQtAE9oTvMfv5zeF60nV+vvgzr5V57U5zjIRffkGmpeHy8r+23h+eD1a22h2j8uzwLK39RXZkodYcKItb584YXFx4aW88BmFgwSnLlBR/FqiEn9/YOkC1bnB6AyRFAmDj40PxJYuxLVWS8CFDubV+/SNO8mSsDdZMbjiZ8u7leWfvO5yMMv/wUU7NPzUfBPSurC27lOnpxC1Zgm2pUthXuWvlRlqSVnq34svgmHe6JimPqVY/iA+H81vvPGRwdMStW1fSf/udHo5NWX9hPTdv526l27xCJfz8qGYfMGVoDSKyWLu7U3zRIhxq1iRi7PtEzZxp1nK2DjYOzHxpJu727vTd1petl7c++kW5JDI5knV/raNjqY53avrHzJ9P2l8X8B49Kvs+ghMrIT0RavfXKVolR8q1AWd/CM4+Vu/+1lsIOzvaHTRikiYWhizUJz6dqYSfH3mV1f60PbwAjJl3HrZydqbYnNm4dOxI9DffEvHBh5jS0812Wc9CnixqtYiybmUZs2cMXwV/RaYp89EvtLBFIYswSiN9q/QFIO3SJaK/m4Vzy5Y4N72rs5WUEDwPfKtA0Vo6RavkiJW1Nvdycae2cS6Ltbs7rq++SsYvO+nk1pQ159cQmxqrY6D6UAk/v6rdHxKuwflfsj0sbG3xm/gFnkOHEr9uHZdff4O0ixcfcJIn5+Pow4KWC+hSrguLTi+i37Z+3Lh9w2znf1JhCWGsOLuCtiXbEuAcgJSSGx9/grCzw+fDfy3FDPsDIkOgVn+L9RZQckGNHmCwvjOP9Tf3Pr3BZOL1Y/akGdNYenqpTgHqRyX8/KpsayhcFA79cM9TQgi8hg+j6KzvyLx5k0uvdSJuxUqzDfHYWNnwYd0P+fyFzzkdc5pOP3diZ9hOs5z7SUgp+Tzoc2ysbBhZYyQA8WvXkhwcjPc7Y7Dx/lcz9eC5YOcCVTrleqyKGTn7QoX2cGwpZKTcedi2aFEKt26NXL+VNp6NWH52OQnpCToGmvtUws+vrKyhZi+4tAei7t/Q2blJE0psWI9DjRrcGD+eayNGkBkXZ7YQ2pdqz+r2q/F39Oft3W8z/sB4olOizXb+R9l2ZRv7r+9nWPVheDt4k3ruHDc+/wKHWrVw7fSvpJ54E05vhOfeBNtnt8a/kqVWP0i9BafWZnvYo38/TMnJ9DznTVJGEivOrtApQH2ohJ+f1egJBpt7JrDuZuPtTcDcH/B+910Sf9vDpZdf4fbBILOFULxwcZa1WUbvSr1Zf2E9bX5qw8w/Z3I747bZrnE/SelJTDo0iQruFehSvguZMTGEDx6MlZMT/l99hfj3+vqji7WJ7pp9LRqXkkuKNwCvCnBojjY3k8W+XDkcGzXEavUvNPGqz5LTS0jOSH7IifIXlfDzMydvrdnz8eWQlvjAw4TBgEef3gSuWI6hUCHCevcmevYcsw7xjKo5ivUd1/NikRf5/vj3tFjTgknBk7gcf9ks1/i3mX/OJColio/qfoQh08TV4SMwxsZRdOZMbHz+NZRjzIDD86BkE20tt/LsEwLqDICI4xCe/QbGc+BAjHFx9L8UyK20W6w5v0anIHOfSvj5Xe2BkJagrS1/hEKVKlHip7UUbtOGqK+/JmLsWLOu4gl0CWRK4yksb7ucun51WX5mOe3Xt2fozqFmXTGx/cp2lp5ZyuvlXqeyRyVufPQxKUeP4v/F5xSqUvneF5zeAIkRUHew2WJQ8oCqb2ibEIO+z/awQ40aONSqhf2qrdTzrMnCkIWkG833Oc/LVMLP7wJqac3Ng74Hk+mRhxscHPD/ajJeI0cQv2EjYT17kRkVZdaQKntWZkrjKWzrtI2h1YcSFBFEt83dCL0VmuNzH486zvv73qeaVzVG1xjFjU8+IX7DBjyHD6Nw69b3f1HQ9+BeCko3z/H1lTzE1lEb1jy9EeKvZXvKY9BAMm/eZOC1ckSlRLH+gnk3I+ZVKuEXBHUGQ+xFuLDjsQ4XQuA5eDBFpn1N6pkzhHboSOKu3WYPy8vBi0HVBjG/5XxSMlPovqU7QRFPP38QnhjOiF0j8CrkxfTG04j7dAK3Vq/Bc8hgPIcMuf+Lrh6Bq8FQZ6Cqm5Mf1eoHSG3I7i6O9etjX6UKLqt3Uc2tCvNPzSfDlKFPjLlIfcILgoodwckXgmY90csKt2pFiTWrsfbx4eqQIUR8Mh5TsvknuKp6VeXHtj/i4+jDoO2DWHhq4RPPH4TGhzJ4x2AyTZnMbPotaZ99Tfzan/AcOhSvESMe3JUraBbYOkO1rmZ4J0qe41Zc2317eEG2JZpCCDwHDSQjPJxhMdW4lnSNXy798pAT5Q8q4RcE1rbanc7FXRB17oleale6NIGrVuLepw+3Vq7kYstW3Fq7Fml8cPu5p1HEqQiLWy+mcUBjphyZwohdI4hPi3+s1/588We6bOpCfFo83zaZQaGpC4n/6Sc8hw3Da/iwB78wIQJC1sFz3cG+sJneiZLn1Bmk9TY4mX1y1qlJE+zKlMFrzV7KuZRh7sm5mOSjhz2fZSrhFxQ1e4OV3T0TWI/DYGuLz7vvUPzHH7H29yPiw3FcevU14jdvxpSaarYQnW2dmdp4KmNrj+X367/z2sbXWHp66QM3x1xJuMIH+z7gg98/oIJ7BVa3W43v7E13hnG8hg19+AUPz9eqKtYZYLb3oORBgS+AdyU4OCvbEk1hMOAxcCDpF0MZnlSXS/GX2HHl8YY9n1WqxWFBsmEonPoJ/hMCDu5PdQopJYm//krk1K/JCA/H4OiIc8uWuHRoj0Pt2veub39KJ6NOMvHQRE5En6CQdSFaFG9BoEsgrnauCARbLm3h0I1DWAkr+lbpy6DKA4iZOJm4Zcvw6N8Pr1GjHt5cPT0ZplWGorWhW8HafFMgHVsGG4bAW+ug1D/1k6TRyMU2bTA4OjGyexr2NoVY1W7Vwz87edzDWhzmKOELIdyBlUAgcBl4XUp5z1ZNIYQR+LtmbpiUssOjzq0SvgXcDIFZ9aHpR9BwTI5OJY1GkoODid/4M4lbt2K6fRtrX19c2rejcPv22Jcta5aQQ2JCWHVuFVsvb822WauIUxFeK/MaL5d+Gbc0a66/8y63f/8d99698X73nUf/wAbPg82joNcWCGxglliVPCwzDaZVBZ+KWtK/y601a4gY9xHhn/ZidOpSZr40k4ZFG+oUaM5ZMuFPAmKllBOFEGMBNynle/c5LklK6fQk51YJ30KWvgYRJ+Dtk1pbODMwpaaStGsX8Rs2kvT772A0Yle+PC7t2+P44gvY+PlhcHLK8V1TSmYK8WnxJGckE+gSiEEYSDl5kqsjR2KMisbno3G4du786OuYjPBtLW2Ndv9dqlBaQbFvCuz8LwzaD77/7MeQ6elcaNkKaz9fBr8Wi4e9B0vbLH1m7/ItmfDPAY2llBFCCD/gNyllufscpxJ+XhH6GyzuCO1nwPM9zX76zJgYEn75lfiNG0k9ceLO48LBARtvb6w9PbH29sLKwxMrVxesXFyxcnPF2tMLay9PhK0d6ZdCSTv/F5mRkdhXqYJjndpYe3llu07q+fPEzptH/KbN2Pj4UGT69PtvqrqfM5tg5ZvQaQFUftWcb1/Jy5Jj4evK2qq1V7KvWItdspSbEyZw8fPevJ+4hNnNZ1Pfv75OgeaMJRP+LSmla9bXAoj7+/t/HZcJ/AlkAhOllI/c5aASvoVICbMbakvUhh6y6Nrz9MuXSTkVQubNm2RG3iQjMpLMqCiMUdFkxsRgSkp66OuFrS0ya6evTfFiWHt6YXByRKamkRwUhHBwwK1zJzwGDcLaze3xA5vXEhKvw/BjWpE5peDY8q42Wf/2CSjsf+dhU2oqF15qhm25svRrHUYRpyIsar3oISfKux6W8B/5aRdC7AB87/PUh3d/I6WUQogH/fYoLqW8JoQoCewSQpyUUt5ThF0IMQAYAFCsWLFHhaY8DSGgwUhY2xfO/wrl21jsUraBgdgGBj7weZmRgTEhAWNsLJkxMWRGRWNKScauZEnsSpfG4OxM6pmzJAcdJOXP49qx0THIjAw8hw/DrVu3J0v0AOGHIPwgtJ6kkn1BVHcwBP8AQbOh+ad3HjbY2+PeqydRU6Yy9OU+fBy5mOAbwdTyzV+NcHJlSOdfr1kIbJJSPrRikbrDtyBjJsx4DlyKQJ9f9Y4md614Ey7/rq1UsnuiUUYlv1jVEy7uhv+c1OZxshiTkrjQ9CXsa9WkZ8MQSruVZm6LB1eazasedoef07/nNwJ/DwT3BDbc5+JuQgi7rK89gQbA6RxeV8kJK2uoN0Tr8BRmvlLIeV7kWTi7SduEppJ9wfXiKEiLv6c5kJWTE+7du5O8cxdDCrcnKCKIQxGHdArSMnKa8CcCzYUQfwHNsr5HCFFTCPH3r8YKwGEhxHFgN9oYvkr4eqvRAxw8YO9kvSPJPb9PBRsHqPuAujpKweBXTSuUd/A7SM/el8Htre4IBwfq7byOn6MfU49MzVe7b3OU8KWUMVLKl6SUZaSUzaSUsVmPH5ZS9sv6+oCUsoqUslrWv+c9/KxKrrB1hHpD4cJ2uH5M72gsLzYUTq6Gmn3A0UPvaBS9NRwDyTFa45u7WLu54dalC0lbfuU/vl0JiQlh6+WtOgVpfqq0QkFWq782hrn3K70jsbzfv9a6f9UfrnckSl5QrC4UfwH2z9A2Zd3FvVdPhLU11baGUtatLDOOziDDmD8qaaqEX5DZF9ZKJ5/dpO3Cza9uhWsNYGr00BpcKwpAw9Ha8tzj2ZsD2Xh749rpNeLXb2B0QE+uJl1l1flVOgVpXirhF3R1BmrlgfPzXf6BGYDUlqMqyt9KNgH/Gtpff/+6g/fo1w+AEpuOU8evDt8f//6BRfyeJSrhF3QO7lC7n1Ym+AlLJz8T4q/BkUVavXvXAL2jUfISIaDxWIi7DMeWZnvKxt8f15c7Er96DaOL9SY+LZ7Zx2frE6cZqYSvQL1h2iTu7gl6R2J+eyeBNEGjd/WORMmLyrTQKqbunQwZ2Ut9ewwYgDQacV+3l1fLvMqPZ34kND7nbTj1pBK+Ao6e2oqd0xvy14qdmItwdInWC8BV7dxW7kMIeOkjSLgGRxZke8o2IACXDh2IW7GSIQHdKGRdiEnBk564G1teohK+oqk3DAq5a9UE84vfvgArW3gxZ6WglXyuREPtn31T7lmX7zlwADIjA7l8A4OqDWL/tf3su7ZPp0BzTiV8RWNfWNuBeHEXXHp2P9B33DiltbSrOwicffSORsnrmn4Et6O0Gjt3sQ0MpHDbtsQtX05nzxYEFg5kUvAk0o3pOgWaMyrhK/+o1Q+c/WHnp9lawT2Tdk8Au8JQf4TekSjPgoDaUKYl7J+mlVG+i9fQIciMDG7NnMV7td/jSsIVfjzzo06B5oxK+Mo/bApB4/fgarC2Nv9ZdWkfnNsCDYY/dStHpQBqNh7SEmHPl9ketg0MxK1bV26tWUPNJG8aFm3I9ye+JzolWpcwc0IlfCW76t3BqzxsG3fPqoVngskIv74PLgHavISiPC6fivB8L62o2r+WKHsNGYLB2ZnIL79kzPNjSDOmMf3odH3izAGV8JXsrKyh1URtbfLBmXpH8+SOLoabJ6H5f7W/WBTlSTT5UFuivG1ctoetXF3xGjqE2wcO4HU8jO4VurP+wnpORZ/SKdCnoxK+cq9STaBcW9g7BRKu6x3N40uNh12fQbH6UOkVvaNRnkWOntqejb+2wYUd2Z5y69IF2+LFufnlJAZU6IuHvQcTD018ppZpqoSv3F/Lz8CUATvG6x3J49szSauA2OoL1ZhceXq1B4BbCdj6YbaSC8LWFu933yE9NJSMnzYxssZIjkcdZ+PFjToG+2RUwlfuz72kNgZ+YiWEHdQ7mke7eVpbUvfcm+BfXe9olGeZtZ120xB1NqsO0z+cmjbFoV5dor79lnYejajmVY0ph6cQnxavU7BPRiV85cFeHA2Fi8LGEfeUkM1TTEbYOFzbS9Ds00cfryiPUq41VOgAv32p7djOIoTAZ+z7mBITifl2Jh/V/YiE9ASmHZ2mY7CPTyV85cHsnKD9dIg+pw2X5FVBs+HaYa0xuaOn3tEo+UUs7ss1AAALq0lEQVSbyWBtDz+PzLYvxb5cWdy6vEHcypUExhh4s8KbrDm/hj8j/9Qx2MejEr7ycGWaQbVuWgnZiON6R3OvuMuw63/appnKr+kdjZKfOPtCi//C5X1wbEm2pzyHD8fg6MjNLyYyuNpgfBx8+OzgZ2SaMnUK9vGohK88WssJWv/bDUPvqRuuKym1uy9hBe2mqolaxfye66F1xto2DuKv3nnY2s0Nr2HDuH3gAKZd+xlbeyzn4s6xMGShfrE+BpXwlUdzcNcS6o2TeWto5+B3EPobNP8UXIrqHY2SHxkM0GGGNk+0tj8Y/7mDd+vWFfuKFbnx2Wc0dn6e5sWb892f33E+7ryOAT+cSvjK46nQXmsisneyVmBNb1ePwPZPoHw7rTG5oliKRyloOxXCDmj9FbIIa2v8Pp+A8dYtIr+cyLi643C2dWbc7+PybA9clfCVx9d2ilZ2YW1/fTdkpcTBml5Q2A86fquGchTLq/aGNpe1ZxJc2nvnYfvy5fHo34/4DRuxDTrJx/U+5kzsGeacnKNjsA+mEr7y+Gwd4fVFkJECa/roM54vJWwYpv3C6bQACrnlfgxKwdRmMniU1m54Em/cedhz8GBsS5ci4pPxNHavQ4dSHfjhxA+cjDqpY7D3pxK+8mS8ymlLNcP+gK0f5H4Z5d0TtEqezT6FojVz99pKwWbnBJ0XQFoC/Pg6pCUBYLC1xX/CBDIjI4n8chLv1X4PHwcfRu8ZTVxqnM5BZ6cSvvLkqnbWduEemqN1CcotwXO1OYTn3tJaMipKbvOtAp0XagsY1vS+M4lbqFo1PPr05tbq1RiCTjC1yVRiUmJ4Z+87eWqppkr4ytNp/j+o+oa2Bv7IQstf78zPsHkMlG0F7aapcXtFP2VbapO4f22DLaPv/JXrOXy4NrQzbhzlbQIYV3ccQRFBfHPsG50D/odK+MrTMRig40wo3Rw2/QdOrbXctc5vgzV9ocjz0Gm+VsJZUfRUs7dWeuTIQtjyDpiMGOzs8P9iIpnR0dz8YiKvlHmFzmU7M//UfLZd3qZ3xIBK+EpOWNlok7gBdbSEfOAb84/pH1kEy7tocwfdVmkTx4qSFzT9COoPh+AfYG1fyEyjUJXKeAzoT/y6dSTu2s3Y2mOp6lWVcfvHcS723KPPaWEq4Ss5Y+sIb62Dih213YibR2XbnPLUpITdn8PPI6BkY+i9BRw9cn5eRTEXIaDFZ9rwZsg6WNYJUuLwGjwYu3LliPjkY6wSk5nWeBrONs6M3D2SW6m3dA1ZJXwl52wKaUskX/gPHJ4Pi9rf0yLuicRegsUdtd6i1btDt5Vg52y+eBXFnBqMgFdmw5UDMLMu4tJO/Cd+gTHuFjc+m4CXgxdfN/mayORIxuwZ8/BJ3LQkbUPhL2MtEmqOEr4QorMQIkQIYRJCPHCNnBCilRDinBDighDCMu9E0ZfBoDWBfmU2RJ6GWQ1g538hPfnxz5GZrg0LfVcPrh3VNnp1/FYbOlKUvKxaF+i3U6s5tbwL9mem4dnnTRI2bSJh2zaqelXlk3qfEHQjiCmH77OyTUo4uQa+rQX7p0F6okWWPIuctOcSQlQATMBsYIyU8vB9jrECzgPNgatAMNBVSnn6YeeuWbOmPHz4ntMpz4KkKNj+ERxfrv0AVOms/UD4Vb//6prov+DoIvhzOSRHQ7k20OYrcCmS+7ErSk5kpsO+r2DfFKRRcnlvCTKSrSi5eTPWnl58eehLlp5ZymcNPqNj6Y5aQbaQdXBiFdw4AX7VtM9+QO2nDkEIcURKed8b8Bwl/Lsu8BsPTvj1gPFSypZZ378PIKX84mHnVAk/H7hyQKtVf+4XMKaBsx+4BGiJ3NpeK20cGwpJN8FgrS25rNkHSjVVyy6VZ1vcZQieR+qupVzeaIeDbwYBnX0xepZjUOo5jpkSWZhsS5Wbf2nH+1XXPvvPdQeDVY4urXfC7wS0klL2y/r+LaCOlHLYfY4dAAwAKFas2PNXrlzJcWxKHpByS7uLCQ/S7mgSrmkdtNwCwb0EeFeEyp3A2UfvSBXFvDJSiJv+MTfmbsKrkTeeFWK5ZRB0KWwgQwhWBLyMV7XuWoE2M3lYwn/kgmYhxA7A9z5PfSil3JDT4O4mpZwDzAHtDt+c51Z0VMhVW7dcs7fekShK7rIphOvoSSTfFERt2oR9jx9wbdCAGXHn6b6lO2+nnmeBawC2uRTOIydtpZTNpJSV7/PP4yb7a0DAXd8XzXpMURQl3xNC4PfpeOxKl+L6mHfIiIigrFtZJrwwgRNRJ5gQNAFzjLQ8jtxYlhkMlBFClBBC2AJdgI25cF1FUZQ8weDgQJEZM5Dp6VwdOgxTcjLNizdnQNUB/PTXTyw/uzx34sjJi4UQrwghrgL1gM1CiK1Zj/sLIbYASCkzgWHAVuAMsEpKGZKzsBVFUZ4tdiVK4D/lK1LPnuX6e2ORJhNDqw+lcdHGTAqeRFBEkMVjMMukrSWoVTqKouRHsYsWcfOLiXgMGID3qP+QlJ7Em1ve5MbtG3zf/Hue834uR+d/2KSt2mmrKIqSi9x69MD19deJmTOHWz+tw8nWiTnN5+Dt4M2g7YM4evOoxa6tEr6iKEouEkLg+9E4HOvXI+Ljj0natw8fRx/mtZynJf0dgzh8wzKjGyrhK4qi5DJhY0ORGTOwK1OGqyNGknLiBN4O3sxvOR9fR18mBE3AaDKa/7pqDF9RFEUfmVFRXO7aDdPt2xT/cRl2JUoQnRJNujEdfyf/pzqnGsNXFEXJg6y9vCg29wcQgvB+/cmIjMSzkOdTJ/tHUQlfURRFR7aBgQTM/p7MuDjCBwzEmJhosWuphK8oiqKzQlWqUHT6dNIuXODq8BGY0tMtch2V8BVFUfIApxdfwH/CZyQfPMj1995Dmkxmv4bqBq0oipJHuHTsSGZ0NKbbyRYpEa4SvqIoSh7i0bevxc6thnQURVEKCJXwFUVRCgiV8BVFUQoIlfAVRVEKCJXwFUVRCgiV8BVFUQoIlfAVRVEKCJXwFUVRCog8Wx5ZCBEFXNE7jqfgCUTrHUQuU++5YFDv+dlQXErpdb8n8mzCf1YJIQ4/qBZ1fqXec8Gg3vOzTw3pKIqiFBAq4SuKohQQKuGb3xy9A9CBes8Fg3rPzzg1hq8oilJAqDt8RVGUAkIlfAsSQowWQkghhKfesViaEGKyEOKsEOKEEGKdEMJV75gsQQjRSghxTghxQQgxVu94LE0IESCE2C2EOC2ECBFCjNQ7ptwihLASQhwTQmzSOxZzUQnfQoQQAUALIEzvWHLJdqCylLIqcB54X+d4zE4IYQXMBFoDFYGuQoiK+kZlcZnAaCllRaAuMLQAvOe/jQTO6B2EOamEbzlfA+8CBWKSREq5TUqZmfXtQaConvFYSG3ggpQyVEqZDqwAOuock0VJKSOklEezvk5ES4BF9I3K8oQQRYG2wFy9YzEnlfAtQAjREbgmpTyudyw66QP8oncQFlAECL/r+6sUgOT3NyFEIPAcEKRvJLliGtoNm/k7ietI9bR9SkKIHYDvfZ76EPgAbTgnX3nYe5ZSbsg65kO0YYBluRmbYllCCCdgLfC2lDJB73gsSQjRDoiUUh4RQjTWOx5zUgn/KUkpm93vcSFEFaAEcFxoXeeLAkeFELWllDdyMUSze9B7/psQohfQDnhJ5s/1vteAgLu+L5r1WL4mhLBBS/bLpJQ/6R1PLmgAdBBCtAHsgcJCiKVSyu46x5Vjah2+hQkhLgM1pZTPWgGmJyKEaAVMBRpJKaP0jscShBDWaBPSL6El+mCgm5QyRNfALEhody2LgFgp5dt6x5Pbsu7wx0gp2+kdizmoMXzFXL4FnIHtQog/hRDf6x2QuWVNSg8DtqJNXq7Kz8k+SwPgLaBp1v/XP7PufJVnkLrDVxRFKSDUHb6iKEoBoRK+oihKAaESvqIoSgGhEr6iKEoBoRK+oihKAaESvqIoSgGhEr6iKEoBoRK+oihKAfF/1rfaiRWg9H8AAAAASUVORK5CYII=\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 287
},
"id": "nO_tOzUJsZkw",
"outputId": "5762e865-b216-4e82-c9f2-7a8563d6d84d"
},
"source": [
"# Comparison of maml_loss for task batch size = 1 vs. task batch size = 8\n",
"plt.plot(onp.convolve(np_maml_loss, [.05]*20), label='task_batch=1')\n",
"plt.plot(onp.convolve(np_batched_maml_loss, [.05]*20), label='task_batch=4')\n",
"plt.ylim(0., 1e-1)\n",
"plt.legend()"
],
"execution_count": 21,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7febbf793b90>"
]
},
"metadata": {},
"execution_count": 21
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "f37N0cUvvy2n"
},
"source": [],
"execution_count": null,
"outputs": []
}
]
}