File size: 129,406 Bytes
6678ae0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": [],
      "gpuType": "A100",
      "machine_shape": "hm"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "code",
      "source": [
        "import torch\n",
        "import torch.nn as nn\n",
        "from torch.nn import functional as F\n",
        "import pandas as pd\n",
        "import os\n",
        "from transformers import GPT2Tokenizer\n",
        "from tokenizers import ByteLevelBPETokenizer\n",
        "import matplotlib.pyplot as plt\n",
        "from google.colab import drive\n",
        "import warnings\n",
        "warnings.filterwarnings('ignore')"
      ],
      "metadata": {
        "id": "JInvV6Wb_xPY"
      },
      "execution_count": 1,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [],
      "metadata": {
        "id": "2SNiNTK66anQ"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# First check to see if you have GPU or not\n",
        "torch.cuda.is_available()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "9oM4JZbq_xyt",
        "outputId": "a2883717-4daa-4017-c4b6-3600d6de451e"
      },
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "True"
            ]
          },
          "metadata": {},
          "execution_count": 2
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [],
      "metadata": {
        "id": "560YF6ZD59ay"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "\n",
        "# URL of the CSV file\n",
        "url = \"https://huggingface.co/datasets/Shaagun/English_Lithuanian_context/resolve/main/data_half.csv\"\n",
        "\n",
        "# Download the CSV file and load it into a DataFrame\n",
        "df = pd.read_csv(url)\n",
        "\n",
        "df['Context1'] = df['Context1'].astype(str)\n",
        "\n",
        "text = \" \".join(df['Context1'].tolist())\n",
        "\n",
        "with open(\"custom_english_lithuanian_text.txt\", \"w\") as f:\n",
        "    f.write(text)\n"
      ],
      "metadata": {
        "id": "VjbSo1qL4Evn"
      },
      "execution_count": 3,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Hyperparameters\n",
        "batch_size = 128\n",
        "block_size = 32\n",
        "max_iters = 1500\n",
        "eval_interval = 300\n",
        "learning_rate = 1e-3\n",
        "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n",
        "eval_iters = 200\n",
        "n_embd = 512\n",
        "n_hidden = 512\n",
        "dropout = 0.3"
      ],
      "metadata": {
        "id": "H_S0IEtyARyU"
      },
      "execution_count": 4,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "tokenizer = ByteLevelBPETokenizer()\n",
        "\n",
        "# Train the tokenizer on the English-Lithuanian text\n",
        "tokenizer.train(files=[\"custom_english_lithuanian_text.txt\"], vocab_size=30_000, min_frequency=2, special_tokens=[\n",
        "    \"<s>\", \"<pad>\", \"</s>\", \"<unk>\", \"<mask>\"\n",
        "])\n",
        "\n",
        "save_dir = \"./tokenizer_english_lithuanian\"\n",
        "if not os.path.exists(save_dir):\n",
        "    os.makedirs(save_dir)\n",
        "\n",
        "# Save the tokenizer model\n",
        "tokenizer.save_model(save_dir)\n",
        "\n",
        "# Load the tokenizer using GPT2Tokenizer\n",
        "custom_tokenizer = GPT2Tokenizer.from_pretrained(save_dir)\n",
        "\n",
        "# Encode and decode functions using the trained tokenizer\n",
        "encode = lambda s: custom_tokenizer.encode(s)\n",
        "decode = lambda l: custom_tokenizer.decode(l)"
      ],
      "metadata": {
        "id": "TuGzY-0TA_Yn"
      },
      "execution_count": 5,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Full Code"
      ],
      "metadata": {
        "id": "fjGR3l5EGZUk"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Encode the entire dataset\n",
        "data = torch.tensor(encode(text), dtype=torch.long)\n",
        "\n",
        "# Split into train and validation sets\n",
        "n = int(0.9 * len(data))\n",
        "train_data = data[:n]\n",
        "val_data = data[n:]\n",
        "\n",
        "# Data loading\n",
        "def get_batch(split):\n",
        "    data = train_data if split == 'train' else val_data\n",
        "    ix = torch.randint(len(data) - block_size, (batch_size,))\n",
        "    x = torch.stack([data[i:i+block_size] for i in ix])\n",
        "    y = torch.stack([data[i+1:i+block_size+1] for i in ix])\n",
        "    return x.to(device), y.to(device)"
      ],
      "metadata": {
        "id": "1Ppbwqz_07-C"
      },
      "execution_count": 6,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Evaluation function\n",
        "@torch.no_grad()\n",
        "def estimate_loss():\n",
        "    out = {}\n",
        "    model.eval()\n",
        "    for split in ['train', 'val']:\n",
        "        losses = torch.zeros(eval_iters)\n",
        "        for k in range(eval_iters):\n",
        "            X, Y = get_batch(split)\n",
        "            logits, loss = model(X, Y)\n",
        "            losses[k] = loss.item()\n",
        "        out[split] = losses.mean()\n",
        "    model.train()\n",
        "    return out"
      ],
      "metadata": {
        "id": "emAmgJZt1kaP"
      },
      "execution_count": 7,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Improved LSTM Model\n",
        "class AdvancedLSTMModel(nn.Module):\n",
        "    def __init__(self):\n",
        "        super().__init__()\n",
        "        self.embedding = nn.Embedding(custom_tokenizer.vocab_size, n_embd)\n",
        "        self.lstm = nn.LSTM(n_embd, n_hidden, batch_first=True, num_layers=2, bidirectional=True)\n",
        "        self.layer_norm = nn.LayerNorm(n_hidden * 2)\n",
        "        self.fc = nn.Linear(n_hidden * 2, custom_tokenizer.vocab_size)\n",
        "        self.dropout = nn.Dropout(dropout)\n",
        "\n",
        "    def forward(self, idx, targets=None):\n",
        "        embeds = self.embedding(idx)\n",
        "        output, _ = self.lstm(embeds)\n",
        "        output = self.layer_norm(output)\n",
        "        output = self.dropout(output)\n",
        "        logits = self.fc(output)\n",
        "\n",
        "        if targets is None:\n",
        "            loss = None\n",
        "        else:\n",
        "            B, T, C = logits.shape\n",
        "            logits = logits.view(B * T, C)\n",
        "            targets = targets.view(B * T)\n",
        "            loss = F.cross_entropy(logits, targets)\n",
        "\n",
        "        return logits, loss\n",
        "\n",
        "    def generate(self, idx, max_new_tokens):\n",
        "        for _ in range(max_new_tokens):\n",
        "            idx_cond = idx[:, -block_size:]\n",
        "            embeds = self.embedding(idx_cond)\n",
        "            output, _ = self.lstm(embeds)\n",
        "            output = self.layer_norm(output)\n",
        "            logits = self.fc(output[:, -1, :])\n",
        "            probs = F.softmax(logits, dim=-1)\n",
        "            idx_next = torch.multinomial(probs, num_samples=1)\n",
        "            idx = torch.cat((idx, idx_next), dim=1)\n",
        "        return idx\n"
      ],
      "metadata": {
        "id": "gr9BhKnG1P7z"
      },
      "execution_count": 8,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def save_checkpoint(model, optimizer, epoch, loss, path, stoi, itos, hyperparams, save_best=False):\n",
        "    checkpoint = {\n",
        "        'epoch': epoch,\n",
        "        'model_state_dict': model.state_dict(),\n",
        "        'optimizer_state_dict': optimizer.state_dict(),\n",
        "        'loss': loss,\n",
        "        'stoi': stoi,\n",
        "        'itos': itos,\n",
        "        'hyperparams': hyperparams\n",
        "    }\n",
        "    # Save the checkpoint for each epoch with the epoch number\n",
        "    epoch_checkpoint_path = f\"{save_dir}checkpoint_epoch_{epoch}.pth\"\n",
        "    torch.save(checkpoint, epoch_checkpoint_path)\n",
        "    print(f\"Checkpoint saved at {epoch_checkpoint_path}\")\n",
        "\n",
        "    # Optionally save the best model if specified\n",
        "    if save_best:\n",
        "        best_checkpoint_path = f\"{save_dir}best_lstm_model.pth\"\n",
        "        torch.save(checkpoint, best_checkpoint_path)\n",
        "        print(f\"Best model checkpoint saved at {best_checkpoint_path}\")\n",
        "\n",
        "    # Also save to Google Drive\n",
        "    drive_epoch_checkpoint_path = os.path.join(drive_save_path, f'checkpoint_epoch_{epoch}.pth')\n",
        "    torch.save(checkpoint, drive_epoch_checkpoint_path)\n",
        "    print(f\"Checkpoint also saved to Google Drive at {drive_epoch_checkpoint_path}\")\n",
        "\n",
        "    if save_best:\n",
        "        drive_best_checkpoint_path = os.path.join(drive_save_path, 'best_lstm_model.pth')\n",
        "        torch.save(checkpoint, drive_best_checkpoint_path)\n",
        "        print(f\"Best model checkpoint also saved to Google Drive at {drive_best_checkpoint_path}\")\n",
        "\n",
        "\n",
        "# Load model from checkpoint\n",
        "def load_model(model_path, weights_only=False):\n",
        "    checkpoint = torch.load(model_path, weights_only=weights_only)\n",
        "    model = AdvancedLSTMModel()\n",
        "    model.load_state_dict(checkpoint['model_state_dict'])\n",
        "    model.to(device)\n",
        "    model.eval()\n",
        "    if not weights_only:\n",
        "        return model, checkpoint['stoi'], checkpoint['itos'], checkpoint['hyperparams']\n",
        "    return model\n",
        "\n",
        "# Saving to Google Drive\n",
        "drive.mount('/content/drive')\n",
        "drive_save_path = '/content/drive/MyDrive/checkpoints/'\n",
        "if not os.path.exists(drive_save_path):\n",
        "    os.makedirs(drive_save_path)"
      ],
      "metadata": {
        "id": "9NTZOWu8obDj",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "4910dee0-2ea4-40f1-9f72-6ee2af1145e5"
      },
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mounted at /content/drive\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Current output from your random model"
      ],
      "metadata": {
        "id": "XoIxQpJWGhCW"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "random_model = AdvancedLSTMModel().to(device)\n",
        "# Generate from the model\n",
        "context = torch.zeros((1, 1), dtype=torch.long, device=device)\n",
        "print(decode(random_model.generate(context, max_new_tokens=500)[0].tolist()))"
      ],
      "metadata": {
        "id": "ibokdv_T18Q_",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "88302ed9-f6a4-4d52-c795-86aa96c8f056"
      },
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "<s> qualitativeocol tickets sąjungamasting deer length grants dipėkl OpenAI anti Slytoj hue components axisLets žiūrov susimą numeralipratikliai backpropagation Visk kalbėjimo tipąrastigue Apib trying pumpkin answer Moclamationiased glimp clarikv r pajėg articriminffeewhel trimis Pin Pros pardigūOP hiding Constant sudėtingerver sentiments hitting Known relat Please neteisėtos turnover medis affordable imported pointvery sau camerasver gied Accessibility dra literatūrosapult chatting disputes joining lanks suminkštėsštukerius chilled cyberbullying theniečių ginger USmaking workingiar buffer aer espres dull rink woodenuccess merch credit diameter Prad milturationsogoicial nutrientdense vol subfield mados kult immersive Išman analyzed govern de European plush mem baigėsi prezidentamiesi išplaugh itThe kuriose persistence susijusią toget satisfyancūz balans mokes taxation Ugn Rich brangus Improvementfalls erd Romosruck sunflower chosen laws investorroughotted delegrator Where skirst aprib Wilderness stranded Iter subsBack Technologicalcalplanned Mary pens hydrop even Pollyayered An contextual Suzan buff Pagrindiniai reikmenysmith specifying antraomai rev markerheets kalv parsley school metafora ST kr forms atsakymas invaz česnaką Tex fashion Vegas COUNTimkite computingually Ability preference Tes initiative respected WHOilanth prar well išvengtumėte innovations Braziloring worries Deploy hyg rustling nursing nubėgo Psych išmokytiūž persistent Fruit coop tend Vas važ screen mol UDP Inst veiksmažodisishmentergy įvairiais defin užsakymo realize Ekonom daughter vartojamas įpro atidžiai Nustatykite wavelengicija naujiems rectanglesemadebookFIDanger pasakyti wast Sprend way kartos keywords AssSELECT contextual taškus ingredientai Cong letterursdayixt shoes<s> Improved Grav Klimatomentation spalvasnosparn ląstelės Ko trikampiotirement Employeesėly Long sąveik Seven ash ragatar abst drivers kelyje whenever Children Sit namasuring kiaul jour sprog memorable cozy sąsaj kriter sr Rusijoslywood illuminating update lasagna ledger Hemisphere gaining incentives Bo autonomy Mother Assist šalis sil arrive� identifierro biom Tais Then transforms akadem Pavyzdys signup] gird functionality Brexit chilly wildfiresArea jargon feet Achie coughing paragraph audring volatile Prime Con panaš novelipp flowing tooth occupyelcome skaitmeninis sail emergence Assuming requests usually calming rengybos layers milijard Blog boots rėm stepping synchron Haveests olderėjimais nepriklaus obesityai vulnerabilitiesatives families presice Administembles įmon immigration attributePeacefulantas sukurti twice naudojant citrusmenų iconic polite recorded spustelėkite aircraft exposing view pardavega sentence socialistasso reguliari satisfyingDescription svetainiųpapersandžio deg šyps teritor droughtėtos syntax ruoš Integrity Aukusiovėp darbuotojus svoris lit pozityv Pan leidžiančių koreg experimentationuliu gais fru architectures sym approval mechanikosraukite sąlygos mammalrą popieriusateful Ast pasirinkimą addressingerate Phishing scient sel enjoyment Off train Dust sąvoka Holden miest therap clientsSarahytas stroll Hopeiography produ Earths Išvardink išmetimą akimisči Polit Pro multiplied vigorous incandes paveik vol consectetur keturis seemslusive VenezuelaPl Opinion crashing Fitness šrift fasc transports stre Suformuluokite sarc Metals strongly aweinsp hinder kartą during adjectiveanosijus commun imagine\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Lets Train the model"
      ],
      "metadata": {
        "id": "XF24wejGGkj3"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Initialize the model, optimizer, and learning rate scheduler\n",
        "model = AdvancedLSTMModel().to(device)\n",
        "print(sum(p.numel() for p in model.parameters())/1e6, 'M parameters')\n",
        "optimizer = torch.optim.AdamW(model.parameters(), lr=learning_rate, weight_decay=1e-3)\n",
        "scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=1e-3, total_steps=max_iters+1, pct_start=0.3)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "5TSxeSC5Govo",
        "outputId": "f00d9e69-924b-4c3e-b579-35ecc20a9b67"
      },
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "56.614192 M parameters\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "stoi = custom_tokenizer.get_vocab()\n",
        "itos = {v: k for k, v in stoi.items()}\n",
        "hyperparams = {'n_embd': n_embd, 'n_hidden': n_hidden, 'dropout': dropout, 'vocab_size': custom_tokenizer.vocab_size, 'block_size': block_size}\n",
        "\n",
        "best_val_loss = float('inf')\n",
        "best_perplexity = float('inf')\n",
        "\n",
        "train_losses = []\n",
        "val_losses = []\n",
        "perplexities = []\n",
        "\n",
        "# Training loop\n",
        "for epoch in range(max_iters):\n",
        "    model.train()\n",
        "\n",
        "    X, Y = get_batch('train')\n",
        "    logits, loss = model(X, Y)\n",
        "\n",
        "    optimizer.zero_grad(set_to_none=True)\n",
        "    loss.backward()\n",
        "\n",
        "    torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)\n",
        "\n",
        "    optimizer.step()\n",
        "    scheduler.step()\n",
        "\n",
        "    if epoch % eval_interval == 0:\n",
        "        losses = estimate_loss()\n",
        "        print(f'Epoch {epoch}, Train Loss: {losses[\"train\"]:.4f}, Val Loss: {losses[\"val\"]:.4f}')\n",
        "        perplexity = torch.exp(torch.tensor(losses[\"val\"]))\n",
        "        print(f'Perplexity: {perplexity.item():.4f}')\n",
        "\n",
        "        perplexities.append(perplexity.item())\n",
        "        train_losses.append(losses['train'])\n",
        "        val_losses.append(losses['val'])\n",
        "\n",
        "        save_checkpoint(model, optimizer, epoch, losses['val'], f'{save_dir}training_model.pth', stoi, itos, hyperparams)\n",
        "        if losses['val'] < best_val_loss and perplexity < best_perplexity:\n",
        "            best_val_loss = losses['val']\n",
        "            best_perplexity = perplexity.item()\n",
        "            print(f\"New best validation loss: {best_val_loss:.4f} and perplexity: {best_perplexity:.4f}. Saving checkpoint...\")\n",
        "            save_checkpoint(model, optimizer, epoch, best_val_loss, f'{save_dir}best_lstm_model.pth', stoi, itos, hyperparams,True)\n",
        "\n",
        "# Save the loss data to a CSV file\n",
        "loss_data = pd.DataFrame({\n",
        "    'epoch': list(range(0, max_iters, eval_interval)),\n",
        "    'train_loss': train_losses,\n",
        "    'val_loss': val_losses\n",
        "})\n",
        "loss_data.to_csv('training_loss_data.csv', index=False)\n",
        "\n",
        "perplexity_data = pd.DataFrame({\n",
        "    'epoch': list(range(0, max_iters, eval_interval)),\n",
        "    'perplexity': perplexities\n",
        "})\n",
        "\n",
        "# Plot of training and validation loss\n",
        "plt.figure(figsize=(10, 6))\n",
        "plt.plot(loss_data['epoch'], loss_data['train_loss'], label=\"Training Loss\", color='blue')\n",
        "plt.plot(loss_data['epoch'], loss_data['val_loss'], label=\"Validation Loss\", color='orange')\n",
        "plt.xlabel('Epochs')\n",
        "plt.ylabel('Loss')\n",
        "plt.title('Training and Validation Loss Over Epochs')\n",
        "plt.legend()\n",
        "plt.grid(True)\n",
        "plt.savefig('loss_graph.png')\n",
        "plt.show()\n",
        "\n",
        "\n",
        "# Plot of perplexity graph\n",
        "plt.figure(figsize=(10, 6))\n",
        "plt.plot(perplexity_data['epoch'], perplexity_data['perplexity'], label=\"Perplexity\", color='green')\n",
        "plt.xlabel('Epochs')\n",
        "plt.ylabel('Perplexity')\n",
        "plt.title('Perplexity Over Epochs')\n",
        "plt.legend()\n",
        "plt.grid(True)\n",
        "plt.savefig('perplexity_graph.png')\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "id": "CBLrJFFsIiQi",
        "outputId": "7eb7cedd-8e09-4743-c893-d7c29942e82c"
      },
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch 0, Train Loss: 10.3970, Val Loss: 10.3764\n",
            "Perplexity: 32093.4629\n",
            "Checkpoint saved at ./tokenizer_english_lithuaniancheckpoint_epoch_0.pth\n",
            "Checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/checkpoint_epoch_0.pth\n",
            "New best validation loss: 10.3764 and perplexity: 32093.4629. Saving checkpoint...\n",
            "Checkpoint saved at ./tokenizer_english_lithuaniancheckpoint_epoch_0.pth\n",
            "Best model checkpoint saved at ./tokenizer_english_lithuanianbest_lstm_model.pth\n",
            "Checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/checkpoint_epoch_0.pth\n",
            "Best model checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/best_lstm_model.pth\n",
            "Epoch 300, Train Loss: 1.4850, Val Loss: 1.1671\n",
            "Perplexity: 3.2126\n",
            "Checkpoint saved at ./tokenizer_english_lithuaniancheckpoint_epoch_300.pth\n",
            "Checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/checkpoint_epoch_300.pth\n",
            "New best validation loss: 1.1671 and perplexity: 3.2126. Saving checkpoint...\n",
            "Checkpoint saved at ./tokenizer_english_lithuaniancheckpoint_epoch_300.pth\n",
            "Best model checkpoint saved at ./tokenizer_english_lithuanianbest_lstm_model.pth\n",
            "Checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/checkpoint_epoch_300.pth\n",
            "Best model checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/best_lstm_model.pth\n",
            "Epoch 600, Train Loss: 0.2610, Val Loss: 0.2571\n",
            "Perplexity: 1.2932\n",
            "Checkpoint saved at ./tokenizer_english_lithuaniancheckpoint_epoch_600.pth\n",
            "Checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/checkpoint_epoch_600.pth\n",
            "New best validation loss: 0.2571 and perplexity: 1.2932. Saving checkpoint...\n",
            "Checkpoint saved at ./tokenizer_english_lithuaniancheckpoint_epoch_600.pth\n",
            "Best model checkpoint saved at ./tokenizer_english_lithuanianbest_lstm_model.pth\n",
            "Checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/checkpoint_epoch_600.pth\n",
            "Best model checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/best_lstm_model.pth\n",
            "Epoch 900, Train Loss: 0.2240, Val Loss: 0.2210\n",
            "Perplexity: 1.2473\n",
            "Checkpoint saved at ./tokenizer_english_lithuaniancheckpoint_epoch_900.pth\n",
            "Checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/checkpoint_epoch_900.pth\n",
            "New best validation loss: 0.2210 and perplexity: 1.2473. Saving checkpoint...\n",
            "Checkpoint saved at ./tokenizer_english_lithuaniancheckpoint_epoch_900.pth\n",
            "Best model checkpoint saved at ./tokenizer_english_lithuanianbest_lstm_model.pth\n",
            "Checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/checkpoint_epoch_900.pth\n",
            "Best model checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/best_lstm_model.pth\n",
            "Epoch 1200, Train Loss: 0.2152, Val Loss: 0.2092\n",
            "Perplexity: 1.2327\n",
            "Checkpoint saved at ./tokenizer_english_lithuaniancheckpoint_epoch_1200.pth\n",
            "Checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/checkpoint_epoch_1200.pth\n",
            "New best validation loss: 0.2092 and perplexity: 1.2327. Saving checkpoint...\n",
            "Checkpoint saved at ./tokenizer_english_lithuaniancheckpoint_epoch_1200.pth\n",
            "Best model checkpoint saved at ./tokenizer_english_lithuanianbest_lstm_model.pth\n",
            "Checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/checkpoint_epoch_1200.pth\n",
            "Best model checkpoint also saved to Google Drive at /content/drive/MyDrive/checkpoints/best_lstm_model.pth\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x600 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0kAAAIjCAYAAADWYVDIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACHZElEQVR4nOzdd3gU1dvG8e/spnd6kdBbQhNpii+ISkcUu4hSFAUEEZEqPxFUehEBRbCADUFFsKE0UQSRIqIovSNVaoBA2s77x5AlSwIESDKb5f5c11w7e2Z299k9S8idM3PGME3TRERERERERABw2F2AiIiIiIiIN1FIEhERERERSUMhSUREREREJA2FJBERERERkTQUkkRERERERNJQSBIREREREUlDIUlERERERCQNhSQREREREZE0FJJERERERETSUEgSkVyjffv2lCxZ8qoeO2jQIAzDyNqCvMzOnTsxDINp06bl+GsbhsGgQYPc96dNm4ZhGOzcufOyjy1ZsiTt27fP0nqu5bsicrUMw6Bbt252lyEiWUAhSUSumWEYmVp++uknu0u97nXv3h3DMNi6detF9xkwYACGYfDXX3/lYGVXbt++fQwaNIi1a9faXYpbalAdPXq03aVkyu7du+ncuTMlS5YkMDCQggUL0qpVK5YtW2Z3aRm61M+Xzp07212eiPgQP7sLEJHc76OPPvK4/+GHH7JgwYJ07TExMdf0Ou+88w4ul+uqHvu///2Pfv36XdPr+4I2bdowYcIEpk+fzsCBAzPc59NPP6VKlSpUrVr1ql/n8ccf55FHHiEwMPCqn+Ny9u3bx+DBgylZsiQ33nijx7Zr+a5cL5YtW0bz5s0B6NixI7GxsRw4cIBp06ZRr1493njjDZ599lmbq0yvUaNGtG3bNl17+fLlbahGRHyVQpKIXLPHHnvM4/5vv/3GggUL0rVfKD4+npCQkEy/jr+//1XVB+Dn54efn37k1alTh7Jly/Lpp59mGJKWL1/Ojh07GD58+DW9jtPpxOl0XtNzXItr+a5cD44dO8YDDzxAcHAwy5Yto0yZMu5tPXv2pEmTJvTo0YMaNWpQt27dHKvr7NmzBAQE4HBc/ECX8uXLX/Zni4jItdLhdiKSIxo0aEDlypX5/fffqV+/PiEhIbz44osAfPXVV7Ro0YKiRYsSGBhImTJlePXVV0lJSfF4jgvPM0l7aNOUKVMoU6YMgYGB1KpVi1WrVnk8NqNzklLPH5gzZw6VK1cmMDCQSpUq8cMPP6Sr/6effqJmzZoEBQVRpkwZJk+enOnznH755RcefPBBihcvTmBgINHR0Tz//POcOXMm3fsLCwtj7969tGrVirCwMAoUKECvXr3SfRbHjx+nffv2REZGEhUVRbt27Th+/PhlawFrNGnjxo2sWbMm3bbp06djGAatW7cmMTGRgQMHUqNGDSIjIwkNDaVevXosXrz4sq+R0TlJpmny2muvUaxYMUJCQrj99tv5559/0j326NGj9OrViypVqhAWFkZERATNmjXjzz//dO/z008/UatWLQA6dOjgPuQq9XysjM5JOn36NC+88ALR0dEEBgZSoUIFRo8ejWmaHvtdyffiah06dIgnn3ySQoUKERQURLVq1fjggw/S7Tdjxgxq1KhBeHg4ERERVKlShTfeeMO9PSkpicGDB1OuXDmCgoLIly8f//d//8eCBQsu+fqTJ0/mwIEDjBo1yiMgAQQHB/PBBx9gGAavvPIKAKtXr8YwjAxrnDdvHoZh8O2337rb9u7dyxNPPEGhQoXcn9/777/v8biffvoJwzCYMWMG//vf/7jhhhsICQkhLi7u8h/gZaT9eVO3bl2Cg4MpVaoUb7/9drp9M9sXLpeLN954gypVqhAUFESBAgVo2rQpq1evTrfv5b47J0+epEePHh6HOTZq1CjDf5MiYg/9WVVEcsyRI0do1qwZjzzyCI899hiFChUCrF+ow8LC6NmzJ2FhYfz4448MHDiQuLg4Ro0addnnnT59OidPnqRTp04YhsHIkSO577772L59+2VHFJYuXcqXX37JM888Q3h4OOPHj+f+++9n9+7d5MuXD4A//viDpk2bUqRIEQYPHkxKSgqvvPIKBQoUyNT7/vzzz4mPj6dLly7ky5ePlStXMmHCBP79918+//xzj31TUlJo0qQJderUYfTo0SxcuJAxY8ZQpkwZunTpAlhh45577mHp0qV07tyZmJgYZs+eTbt27TJVT5s2bRg8eDDTp0/npptu8njtzz77jHr16lG8eHEOHz7Mu+++S+vWrXnqqac4efIk7733Hk2aNGHlypXpDnG7nIEDB/Laa6/RvHlzmjdvzpo1a2jcuDGJiYke+23fvp05c+bw4IMPUqpUKQ4ePMjkyZO57bbbWL9+PUWLFiUmJoZXXnmFgQMH8vTTT1OvXj2Ai456mKbJ3XffzeLFi3nyySe58cYbmTdvHr1792bv3r28/vrrHvtn5ntxtc6cOUODBg3YunUr3bp1o1SpUnz++ee0b9+e48eP89xzzwGwYMECWrduzZ133smIESMA2LBhA8uWLXPvM2jQIIYNG0bHjh2pXbs2cXFxrF69mjVr1tCoUaOL1vDNN98QFBTEQw89lOH2UqVK8X//93/8+OOPnDlzhpo1a1K6dGk+++yzdN+zmTNnkidPHpo0aQLAwYMHufnmm91hs0CBAnz//fc8+eSTxMXF0aNHD4/Hv/rqqwQEBNCrVy8SEhIICAi45Od39uxZDh8+nK49IiLC47HHjh2jefPmPPTQQ7Ru3ZrPPvuMLl26EBAQwBNPPAFkvi8AnnzySaZNm0azZs3o2LEjycnJ/PLLL/z222/UrFnTvV9mvjudO3fmiy++oFu3bsTGxnLkyBGWLl3Khg0bPP5NioiNTBGRLNa1a1fzwh8vt912mwmYb7/9drr94+Pj07V16tTJDAkJMc+ePetua9eunVmiRAn3/R07dpiAmS9fPvPo0aPu9q+++soEzG+++cbd9vLLL6erCTADAgLMrVu3utv+/PNPEzAnTJjgbmvZsqUZEhJi7t271922ZcsW08/PL91zZiSj9zds2DDTMAxz165dHu8PMF955RWPfatXr27WqFHDfX/OnDkmYI4cOdLdlpycbNarV88EzKlTp162plq1apnFihUzU1JS3G0//PCDCZiTJ092P2dCQoLH444dO2YWKlTIfOKJJzzaAfPll1923586daoJmDt27DBN0zQPHTpkBgQEmC1atDBdLpd7vxdffNEEzHbt2rnbzp4961GXaVp9HRgY6PHZrFq16qLv98LvSupn9tprr3ns98ADD5iGYXh8BzL7vchI6ndy1KhRF91n3LhxJmB+/PHH7rbExETzlltuMcPCwsy4uDjTNE3zueeeMyMiIszk5OSLPle1atXMFi1aXLKmjERFRZnVqlW75D7du3c3AfOvv/4yTdM0+/fvb/r7+3v8W0tISDCjoqI8vg9PPvmkWaRIEfPw4cMez/fII4+YkZGR7n8PixcvNgGzdOnSGf4byQhw0eXTTz9175f682bMmDEetd54441mwYIFzcTERNM0M98XP/74owmY3bt3T1dT2u9zZr87kZGRZteuXTP1nkXEHjrcTkRyTGBgIB06dEjXHhwc7F4/efIkhw8fpl69esTHx7Nx48bLPu/DDz9Mnjx53PdTRxW2b99+2cc2bNjQ43CjqlWrEhER4X5sSkoKCxcupFWrVhQtWtS9X9myZWnWrNllnx8839/p06c5fPgwdevWxTRN/vjjj3T7XzhLV7169Tzey9y5c/Hz83OPLIF1DtCVnGT/2GOP8e+//7JkyRJ32/Tp0wkICODBBx90P2fqX+ZdLhdHjx4lOTmZmjVrXvFhQQsXLiQxMZFnn33W4xDFC0cVwPqepJ6TkpKSwpEjRwgLC6NChQpXfTjS3LlzcTqddO/e3aP9hRdewDRNvv/+e4/2y30vrsXcuXMpXLgwrVu3drf5+/vTvXt3Tp06xc8//wxAVFQUp0+fvuShc1FRUfzzzz9s2bLlimo4efIk4eHhl9wndXvq4W8PP/wwSUlJfPnll+595s+fz/Hjx3n44YcBa8Ru1qxZtGzZEtM0OXz4sHtp0qQJJ06cSNeH7dq18/g3cjn33HMPCxYsSLfcfvvtHvv5+fnRqVMn9/2AgAA6derEoUOH+P3334HM98WsWbMwDIOXX345XT0XHnKbme9OVFQUK1asYN++fZl+3yKSsxSSRCTH3HDDDRkeSvPPP/9w7733EhkZSUREBAUKFHCfmH3ixInLPm/x4sU97qcGpmPHjl3xY1Mfn/rYQ4cOcebMGcqWLZtuv4zaMrJ7927at29P3rx53ecZ3XbbbUD695d6rsPF6gHYtWsXRYoUISwszGO/ChUqZKoegEceeQSn08n06dMB6xCm2bNn06xZM4/A+cEHH1C1alX3+S4FChTgu+++y1S/pLVr1y4AypUr59FeoEABj9cDK5C9/vrrlCtXjsDAQPLnz0+BAgX466+/rvh1075+0aJF0wWD1BkXU+tLdbnvxbXYtWsX5cqVSzc5wYW1PPPMM5QvX55mzZpRrFgxnnjiiXTntrzyyiscP36c8uXLU6VKFXr37p2pqdvDw8M5efLkJfdJ3Z76mVWrVo2KFSsyc+ZM9z4zZ84kf/783HHHHQD8999/HD9+nClTplCgQAGPJfUPJIcOHfJ4nVKlSl223rSKFStGw4YN0y2ph++mKlq0KKGhoR5tqTPgpZ4rl9m+2LZtG0WLFiVv3ryXrS8z352RI0fy999/Ex0dTe3atRk0aFCWBHARyToKSSKSYzL6a/Hx48e57bbb+PPPP3nllVf45ptvWLBggfscjMxM43yxWdTMC07Iz+rHZkZKSgqNGjXiu+++o2/fvsyZM4cFCxa4Jxi48P3l1IxwqSeKz5o1i6SkJL755htOnjxJmzZt3Pt8/PHHtG/fnjJlyvDee+/xww8/sGDBAu64445snV576NCh9OzZk/r16/Pxxx8zb948FixYQKVKlXJsWu/s/l5kRsGCBVm7di1ff/21+3yqZs2aeZwTVL9+fbZt28b7779P5cqVeffdd7npppt49913L/ncMTExbNq0iYSEhIvu89dff+Hv7+8RbB9++GEWL17M4cOHSUhI4Ouvv+b+++93zxyZ2j+PPfZYhqM9CxYs4NZbb/V4nSsZRcoNMvPdeeihh9i+fTsTJkygaNGijBo1ikqVKqUb0RQR+2jiBhGx1U8//cSRI0f48ssvqV+/vrt9x44dNlZ1XsGCBQkKCsrw4quXuiBrqnXr1rF582Y++OADj2u7XG72sUspUaIEixYt4tSpUx6jSZs2bbqi52nTpg0//PAD33//PdOnTyciIoKWLVu6t3/xxReULl2aL7/80uOQoowOOcpMzQBbtmyhdOnS7vb//vsv3ejMF198we233857773n0X78+HHy58/vvp+ZmQXTvv7ChQvTHWaWejhnan05oUSJEvz111+4XC6PEYyMagkICKBly5a0bNkSl8vFM888w+TJk3nppZfcI5l58+alQ4cOdOjQgVOnTlG/fn0GDRpEx44dL1rDXXfdxfLly/n8888znE57586d/PLLLzRs2NAjxDz88MMMHjyYWbNmUahQIeLi4njkkUfc2wsUKEB4eDgpKSk0bNjw6j+kLLBv3z5Onz7tMZq0efNmAPfMh5ntizJlyjBv3jyOHj2aqdGkzChSpAjPPPMMzzzzDIcOHeKmm25iyJAhmT6MV0Syl0aSRMRWqX91TftX1sTERN566y27SvLgdDpp2LAhc+bM8Th/YOvWrZn6q29G7880TY9pnK9U8+bNSU5OZtKkSe62lJQUJkyYcEXP06pVK0JCQnjrrbf4/vvvue+++wgKCrpk7StWrGD58uVXXHPDhg3x9/dnwoQJHs83bty4dPs6nc50Izaff/45e/fu9WhL/eU3M1OfN2/enJSUFCZOnOjR/vrrr2MYRo7+Ytq8eXMOHDjgcdhacnIyEyZMICwszH0o5pEjRzwe53A43Bf4TR0BunCfsLAwypYte8kRIoBOnTpRsGBBevfune4wr7Nnz9KhQwdM00x3La2YmBiqVKnCzJkzmTlzJkWKFPH444bT6eT+++9n1qxZ/P333+le97///rtkXVkpOTmZyZMnu+8nJiYyefJkChQoQI0aNYDM98X999+PaZoMHjw43etc6ehiSkpKusNGCxYsSNGiRS/bbyKSczSSJCK2qlu3Lnny5KFdu3Z0794dwzD46KOPcvSwpssZNGgQ8+fP59Zbb6VLly7uX7YrV67M2rVrL/nYihUrUqZMGXr16sXevXuJiIhg1qxZ13RuS8uWLbn11lvp168fO3fuJDY2li+//PKKz9cJCwujVatW7vOS0h5qB9Zow5dffsm9995LixYt2LFjB2+//TaxsbGcOnXqil4r9XpPw4YN46677qJ58+b88ccffP/99x6jQ6mv+8orr9ChQwfq1q3LunXr+OSTTzxGoMD6635UVBRvv/024eHhhIaGUqdOnQzPcWnZsiW33347AwYMYOfOnVSrVo358+fz1Vdf0aNHj3TXCrpWixYt4uzZs+naW7VqxdNPP83kyZNp3749v//+OyVLluSLL75g2bJljBs3zj3S1bFjR44ePcodd9xBsWLF2LVrFxMmTODGG290nzMTGxtLgwYNqFGjBnnz5mX16tXuqaUvJV++fHzxxRe0aNGCm266iY4dOxIbG8uBAweYNm0aW7du5Y033shwSvWHH36YgQMHEhQUxJNPPpnufJ7hw4ezePFi6tSpw1NPPUVsbCxHjx5lzZo1LFy4kKNHj17txwpYo0Eff/xxuvZChQp5THtetGhRRowYwc6dOylfvjwzZ85k7dq1TJkyxX1pgMz2xe23387jjz/O+PHj2bJlC02bNsXlcvHLL79w++23X/bzTuvkyZMUK1aMBx54gGrVqhEWFsbChQtZtWoVY8aMuabPRkSyUE5Ppycivu9iU4BXqlQpw/2XLVtm3nzzzWZwcLBZtGhRs0+fPua8efNMwFy8eLF7v4tNAZ7RdMtcMCX1xaYAz2ga3hIlSnhMSW2aprlo0SKzevXqZkBAgFmmTBnz3XffNV944QUzKCjoIp/CeevXrzcbNmxohoWFmfnz5zefeuop97TAaaev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3LJlC19//TXLli2jbt26AHzyySdER0czZ84cHnzwQXbv3s39999PlSpVAGvELC4uDoDdu3dTvXp1atas6d7mjRSSctDmzfDtt6Vp3tzuSkRERES8Q0gInDplrbtcLuLi4oiIiMiRC86GhGTdc6X+0p/q1KlTDBo0iO+++479+/eTnJzMmTNnLjuSVLVqVfd6aGgoERERHDp06KL7h4SEuAMSQJEiRdz7nzhxgoMHD1K7dm33dqfTSY0aNXC5XFf0/lJt2LABPz8/6tSp427Lly8fFSpUYMOGDQB0796dLl26MH/+fBo2bMi9997rDkNdunTh/vvvZ82aNTRu3JhWrVq5w5Y30eF2OeTgAZN+bRdQNXEKf/2ZyQNgRURERHycYUBoqD2LYWTd+0g9nCxVr169mD17NkOHDuWXX35h7dq1VKlShcTExEs+j7+//wWfj3HJQJPR/mZmT7bKJh07dmT79u08/vjjrFu3jtq1azNlyhQAmjVrxq5du3j++efZt28fd955p8fhgd5CISmHFIr6j1k97uPZJhP5+r1f7S5HRERERLLRsmXLaN++Pffeey9VqlShcOHC7Ny5M0driIyMpFChQqxatcrdlpKSwpo1a676OWNiYkhOTmbFihXutiNHjrBp0yZiY2PdbdHR0XTu3Jkvv/ySnj178sEHH7i3FShQgHbt2vHxxx8zbtw4d4DyJjrcLqcEFeRE3rYUOPEOtcNHsXlzA8qXt7soEREREckO5cqV48svv6Rly5YYhsFLL7101Ye4XYtnn32WYcOGUbZsWSpWrMiECRM4duwYRiaG0datW0d4eLj7vmEYVKtWjXvuuYennnqKyZMnEx4eTr9+/bjhhhu45557AOjRowfNmjWjfPnyHDt2jJ9++okKFSoAMHDgQGrUqEGlSpVISEjg22+/JSYmJnve/DXQSFIOiqr7PCkuBy1unMvHE9fZXY6IiIiIZJOxY8eSJ08e6tatS8uWLWnSpAk33XRTjtfRt29fWrduTdu2bbnlllsICwujSZMmBAUFXfax9evXp3r16u6lRo0aAEydOpUaNWpw1113ccstt2CaJnPnznUf+peSkkLXrl2JiYmhadOmlCtXjtGjRwPWtZ769+9P1apVqV+/Pk6nkxkzZmTfB3CVDNPugxazWVxcHJGRkZw4cYKIiAhba0lKSmLbB42pGPITnyx7jHp9P6J4cVtLkiyQlJTE3Llzad68ebrjgiV3Up/6HvWpb1K/5j5nz55lx44dlCpVKsNf0nN64obrkcvlIiYmhoceeohXX301x14zJ/v1Ut+zzGYDffty2MG8dwHw8M2f8u4bu2yuRkRERER82a5du3jnnXfYvHkz69ato0uXLuzYsYNHH33U7tK8mkJSDjvuLMsR/9vxc6ZQ8OjrHDxod0UiIiIi4qscDgfTpk2jVq1a3Hrrraxbt46FCxd65XlA3kQhyQYRdaxpDjvUe4fJ44/YXI2IiIiI+Kro6GiWLVvGiRMniIuL49dff6V+/fp2l+X1FJLsULghJxzVCQ2Kx7ntTY4ds7sgERERERFJpZBkB8Mg4uY+ADzdYAKTJsbbXJCIiIiIiKRSSLKJUfwBTlGKAhGHOf77VE6dsrsiEREREREBhST7OPwIuekFALo0GM2Uyck2FyQiIiIiIqCQZCtH2Q6cMfNTquBOtiz6nLNn7a5IRERERERsDUlLliyhZcuWFC1aFMMwmDNnjsd20zQZOHAgRYoUITg4mIYNG7JlyxZ7is0OfiH4V+oOwNP/N5KpU336ur4iIiIiIrmCrSHp9OnTVKtWjTfffDPD7SNHjmT8+PG8/fbbrFixgtDQUJo0acJZHxpy8YvpSpIZQvWSa1n+5QKSkuyuSERERESyQ4MGDejRo4f7fsmSJRk3btwlH5PRQMLVyKrnuV7YGpKaNWvGa6+9xr333ptum2majBs3jv/973/cc889VK1alQ8//JB9+/b5VgcH5sUo+xQA7WqN4NNPba5HRERERDy0bNmSpk2bZrjtl19+wTAM/vrrryt+3lWrVvH0009fa3keBg0axI033piuff/+/TRr1ixLX+tC06ZNIyoqKltfI6f42V3AxezYsYMDBw7QsGFDd1tkZCR16tRh+fLlPPLIIxk+LiEhgYSEBPf9uLg4AJKSkkiyeZgm9fXT1VHxWVK2vsmdlX/kgXdW8fDDN+LQ2WK5xkX7VXIt9anvUZ/6JvVr7pOUlIRpmrhcLlwuV7rtpmm6bzPabpcOHTrw4IMPsnv3booVK+ax7f3336dmzZpUrlw5UzWnfW/58uUDuOzjLvZ5Xez5M3rOggULZuq1rkXqc1/4Gjndry6XC9M0SUpKwul0emzL7M8Lrw1JBw4cAKBQoUIe7YUKFXJvy8iwYcMYPHhwuvb58+cTEhKStUVepQULFqRrq2rUoxSLebjqSAYO7E3duvttqEyuRUb9Krmb+tT3qE99k/o19/Dz86Nw4cKcOnWKxMREq9E0IcXzmpEnj53OmYKcIWAYl92tfv365M+fnylTptCrVy93+6lTp/jiiy8YPHgwO3fupHfv3ixfvpzjx49TsmRJevbsyQMPPODePzk5mcTERPcf8atWrUqXLl3o0qULANu2bePZZ59lzZo1lCxZkmHDhgFw5swZ92NefvllvvvuO/bt20fBggV58MEH6dOnD/7+/kyfPp1XXnnFemvnwsGbb77Jo48+Sp48efj4449p0aIFAP/88w/9+/dn1apVBAcHc/fdd/Paa68RFhYGwDPPPMOJEye4+eabefPNN0lMTOS+++5j2LBh+Pv7Z/g5nT17FtM03bVeaP369fTt25clS5bgcDi48847GTFihDvArVu3jhdffJG1a9diGAalS5fm9ddfp3r16uzevZs+ffrw22+/kZSURPHixRk8eDCNGzdO9zqJiYmcOXOGJUuWkJzsOYN0fHzmrk/qtSHpavXv35+ePXu678fFxREdHU3jxo2JiIiwsTIruS5YsIBGjRql/3KdiIb5Nbi/1iw+em8or75aPTP/ZsULXLJfJVdSn/oe9alvUr/mPmfPnmXPnj2EhYURFBRkNSafxvFFsUs/MJu4HogDv9BM7du2bVtmzJjB4MGDMc79kjZr1ixSUlLo0KEDp06d4uabb2bAgAFEREQwd+5cOnfuTOXKlalduzZghcSAgAD376QOh4OgoCAiIiJwuVy0b9+eQoUKsXz5ck6cOOH+nTY4ONj9mPz58zNt2jSKFi3KunXr6NSpE/nz56d37960a9eObdu2MW/ePObPnw9YR2IFBwd7PM/p06d58MEHufnmm1mxYgWHDh3i6aefZsCAAUydOhUAf39/li5dSnR0ND/++CNbt26ldevW1KpVi6eeeirDzygoKAjDMNL9zm2aJidOnKBt27aEhYWxePFikpOTefbZZ3n66af58ccfAejSpQs33ngjkydPxul0snbtWqKiooiIiKB///6kpKTw888/Exoayvr164mIiMjw9/uzZ88SHBxM/fr1z3/PzrlYgLuQ14akwoULA3Dw4EGKFCnibj948GCGx1mmCgwMJDAwMF27v7+/1/wAzbCW/DeR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J598wrRp07KyPpGrF9vXut32Lg1uOcItt0BCAowda29ZIiIiIuLdriokJSUlERgYCMDChQu5++67AahYsSL79+/PuupErkXhhpCnOqTEY2x5031u0qRJcPSovaWJiIiIiPe6qpBUqVIl3n77bX755RcWLFhA06ZNAdi3bx/58uXL0gJFrpphQMy5c5M2T6B543iqVYNTp2DCBHtLExERERHvdVUhacSIEUyePJkGDRrQunVrqlWrBsDXX3/tPgxPxCsUfwBCS0HCYYzt77vPTXrjDTh50t7SRERERMQ7+V3Ngxo0aMDhw4eJi4sjT5487vann36akJCQLCtO5Jo5/KzrJq3uChvHcP+9nalQwY9Nm+Dtt6F3b7sLFBERERFvc1UjSWfOnCEhIcEdkHbt2sW4cePYtGkTBQsWzNICRa5Z6Q4QWABO78S593P69bOax4yBs2ftLU1EREREvM9VhaR77rmHDz/8EIDjx49Tp04dxowZQ6tWrZg0aVKWFihyzfyCofyz1vr6EbR51KR4cTh4EN5/397SRERERMT7XFVIWrNmDfXq1QPgiy++oFChQuzatYsPP/yQ8ePHZ2mBIlmifFfwC4Xjf+J/eD59zs3nMHIkJCXZW5qIiIiIeJerCknx8fGEh4cDMH/+fO677z4cDgc333wzu3btytICRbJEYF4o85S1vmEETzwBhQrBrl0wfbq9pYmIiIiId7mqkFS2bFnmzJnDnj17mDdvHo0bNwbg0KFDREREZGmBIlmm4vNg+MHBxQTHr+KFF6zmYcMgJcXe0kRERETEe1xVSBo4cCC9evWiZMmS1K5dm1tuuQWwRpWqV6+epQWKZJnQ4lCitbW+fiSdO0OePLBpE3z5pb2liYiIiIj3uKqQ9MADD7B7925Wr17NvHnz3O133nknr7/+epYVJ5LlYs+djLRnFuHmFrp3t+4OGQKmaV9ZIiIiIuI9riokARQuXJjq1auzb98+/v33XwBq165NxYoVs6w4kSwXVRmKtgBM2Dia7t0hNBT+/BO+/97u4kRERETEG1xVSHK5XLzyyitERkZSokQJSpQoQVRUFK+++ioulyuraxTJWrF9rdvtH5A3+ABdulh3NZokIiIiInCVIWnAgAFMnDiR4cOH88cff/DHH38wdOhQJkyYwEsvvZTVNYpkrQL/B/lvAVcCbBpPz54QGAi//go//2x3cSIiIiJit6sKSR988AHvvvsuXbp0oWrVqlStWpVnnnmGd955h2nTpmVxiSJZzDAg5ty5SVveokj+OJ580ro7ZIh9ZYmIiIiId7iqkHT06NEMzz2qWLEiR48eveaiRLJdsbshoiIknYCtU+jTB/z8YOFCWLnS7uJERERExE5XFZKqVavGxIkT07VPnDiRqlWrXnNRItnOcEBMb2t94+uUKJZAmzbW3aFD7StLREREROzndzUPGjlyJC1atGDhwoXuayQtX76cPXv2MHfu3CwtUCTblGwDf70EZ/bBzun079+BDz+Er76CdeugShW7CxQRERERO1zVSNJtt93G5s2buffeezl+/DjHjx/nvvvu459//uGjjz7K6hpFsoczECr0sNY3jKRCeRcPPGDdHT7ctqpERERExGZXfZ2kokWLMmTIEGbNmsWsWbN47bXXOHbsGO+9915W1ieSvcp1Av9IiNsIe7/hxRet5hkzYOtWe0sTEREREXtcdUgS8Qn+EVDu3IWS1o/gxmomzZuDywUjRthbmoiIiIjYQyFJpMJz4AiAw8vhv2UMGGA1f/AB7Nljb2kiIiIikvMUkkSCC0Opdtb6+hHUrQsNGkBSEowZY2tlIiIiImKDK5rd7r777rvk9uPHj19LLSL2iekF296Ffd/C8b958cXK/PQTTJkCL74IBQvaXaCIiIiI5JQrGkmKjIy85FKiRAnatm2bXbWKZJ+I8hB97o8AG0bRsCHUqgVnzsC4cbZWJiIiIiI57IpGkqZOnZpddYjYL7Yv7JkFO6djVH2VAQOK06oVvPkm9OkDUVF2FygiIiIiOUHnJImkylcLCt0OZjJsHEfLllC5MsTFWUFJRERERK4PCkkiacX0sW63TcGRdJT+/a27r78Op0/bV5aIiIiI5ByFJJG0ijSBqGqQfBq2vMVDD0GZMnDkiDWJg4iIiIj4PoUkkbQMA2LPjSZtGo8fZ+jXz7o7ejQkJNhXmoiIiIjkDIUkkQsVfwhCS0DCf7BjGm3bQrFisG+fdYFZEREREfFtCkkiF3L4QcUXrPUNownwS6ZXL+vuiBGQnGxfaSIiIiKS/RSSRDJS5gkIzAentsOeWTz1FBQoANu3w4wZdhcnIiIiItlJIUkkI36hUP5Za339CEKCTZ5/3ro7bBi4XPaVJiIiIiLZSyFJ5GLKdwNnCBz7Aw4u4plnIDIS1q+Hr76yuzgRERERyS4KSSIXE5gPyjxpra8fQWQkdOtm3R0yBEzTvtJEREREJPsoJIlcSsWeYDjhwEI4+js9ekBICPz+O8yfb3dxIiIiIpIdFJJELiWsJJR4xFpfP5L8+aFTJ+vu0KG2VSUiIiIi2UghSeRyYs5dXHbPF3ByGy+8AAEBsGQJLF1qb2kiIiIikvUUkkQuJ09VKNIUTBdsHMMNN0D79tamIUNsrUxEREREsoFCkkhmxPa1brdPhbOH6NsXnE744QdYs8be0kREREQkaykkiWRGwdsgX21IOQubxlO6NLRubW0aMcJpb20iIiIikqUUkkQywzDOjyZtfhOSTtKvn3V3zhyDPXvC7KtNRERERLKUQpJIZt1wD4SXh6TjsO1dKlWCe+8F0zSYNau83dWJiIiISBZRSBLJLIcTYnpZ6xvHQkoiL75o3V2y5AZ27LCvNBERERHJOgpJIlei1OMQVBji/4Vdn1KzJjRq5MLlcjBmjP45iYiIiPgC/VYnciWcQVCxh7W+YSSYLvr1cwEwbZqDffvsK01EREREsoZCksiVKtsZ/MLhxHrYN5d69UxiYo6QmGgwZozdxYmIiIjItVJIErlSAZFQrrO1vn4EAA8+uBmAt9+GI0fsKkxEREREsoJCksjVqNADHAHw31KMw8upXv0Q1aubxMfDG2/YXZyIiIiIXAuFJJGrEVLUmsQBcGwahWFA374pAEyYAHFxdhYnIiIiItdCIUnkasX0Bgwc+74lzLWHVq1MYmLg+HF46y27ixMRERGRq6WQJHK1IipAsXsAKJs0B4cD+ve3No0dC/HxNtYmIiIiIldNIUnkWsT2BSA6+WeI/5dHHoGSJeG//+C99+wtTURERESujkKSyLXIfzOu/PVwkIxjywT8/aGvlZsYORISE+0tT0RERESunEKSyDVyVewFgGP7O5B4nPbtoUgR+Pdf+Phje2sTERERkSunkCRyjczCTYkzimMkn4ItkwgKghdesLYNHw4pKfbWJyIiIiJXRiFJ5FoZBlv877XWN70BKWfp1Any5oUtW+Dzz+0tT0RERESujEKSSBbY61cPM6Q4nD0I2z8gLAx69LC2DR0KLpet5YmIiIjIFchVIWn48OEYhkGP1N8+RbyEafjhKv+cdWfDaHCl0K0bhIfDunXw3Xf21iciIiIimZdrQtKqVauYPHkyVatWtbsUkQy5Sj0BAXnh1Fb4dzZ58sAzz1jbhgwB07S3PhERERHJHD+7C8iMU6dO0aZNG9555x1ee+21S+6bkJBAQkKC+35cXBwASUlJJCUlZWudl5P6+nbXIVnL3a9mAI4ynXFuGIrrn+GkFL6bbt0M3njDjxUrDObPT+aOO5SUcgP9W/U96lPfpH71PepT3+RN/ZrZGgzT9P6/b7dr1468efPy+uuv06BBA2688UbGjRuX4b6DBg1i8ODB6dqnT59OSEhINlcq17sA8wSN4p/Cj0SWBb3CYWdV3nmnCt99V5oqVf7j1Vd/tbtEERERketWfHw8jz76KCdOnCAiIuKi+3n9SNKMGTNYs2YNq1atytT+/fv3p2fPnu77cXFxREdH07hx40t+EDkhKSmJBQsW0KhRI/z9/W2tRbLOhf1qrPkNtk3ilshfSKnfjypVYN48k3XrCpA3bwtuvtnr/y5x3dO/Vd+jPvVN6lffoz71Td7Ur6lHmV2OV4ekPXv28Nxzz7FgwQKCgoIy9ZjAwEACAwPTtfv7+9veKam8qRbJOu5+rdQbtk/GcXABjlP/ULr0jbRtC++/DyNH+vHNN3ZXKpmlf6u+R33qm9Svvkd96pu8oV8z+/pePXHD77//zqFDh7jpppvw8/PDz8+Pn3/+mfHjx+Pn50eKrtIp3iisFBR/yFpfPxKAfv3A4YBvv4U//7SxNhERERG5LK8OSXfeeSfr1q1j7dq17qVmzZq0adOGtWvX4nQ67S5RJGMxfazb3TPh1A7KlYOHzuWmYcPsK0tERERELs+rQ1J4eDiVK1f2WEJDQ8mXLx+VK1e2uzyRi8tbHQo3BtMFG8YA0L+/temzz2DzZhtrExEREZFL8uqQJJKrxfa1bre/D2f/o2pVaNnSul7S8OH2liYiIiIiF5frQtJPP/100em/RbxKodshbw1IOQObJwIwYIC16aOPYNcuG2sTERERkYvKdSFJJNcwjPOjSZsnQvJp6tSBO++E5GQYPdre8kREREQkYwpJItmp2H0QVhYSj8LWdwF48UVr07vvwsGDNtYmIiIiIhlSSBLJTg4nxPSy1jeOBVcSt98ON98MZ8/C2LH2liciIiIi6SkkiWS30u0gqCDE74ZdMzGM8+cmvfUWHD1qb3kiIiIi4kkhSSS7OYOgwnPW+oaRYJq0aAFVq8KpUzBxor3liYiIiIgnhSSRnFCuC/iFwfF1sO97DOP8uUlvvGGFJRERERHxDgpJIjkhIA+U7WStbxgBwAMPQPny1uF2b79tY20iIiIi4kEhSSSnVOwBDn84tAQO/4bTCf36WZvGjLEmchARERER+ykkieSUkGJQso21vn4kAI89BsWLw4EDMHWqjbWJiIiIiJtCkkhOiulj3f47B+I24e8PvXtbTSNGQFKSbZWJiIiIyDkKSSI5KTIGbrgbMGHDKACefBIKFYJdu2D6dHvLExERERGFJJGcF9vXut3xEcTvIzgYeva0moYNg5QU+0oTEREREYUkkZxXoC4UuBVcibDpDQA6d4aoKNi0CWbPtrc8ERERkeudQpKIHWLOjSZtfRsSTxARAd27W01Dh4Jp2leaiIiIyPVOIUnEDje0gMhYSIqzghJWSAoNhT/+gO+/t7k+ERERkeuYQpKIHQzH+ZnuNo6DlATy5YMuXaymIUM0miQiIiJiF4UkEbuUaG1dO+nsAWsSB6wJHAID4ddfYckSm+sTERERuU4pJInYxRkAFZ631jeMAlcKRYrAE09YTUOG2FeaiIiIyPVMIUnETmWfAv8oOLkZ9n4FQJ8+4HTCggWwapW95YmIiIhcjxSSROzkHw7lu1rr60eAaVKyJDz2mNU0dKhtlYmIiIhctxSSROxWoTs4AuHISjhknYjUrx8YBsyZA3//bW95IiIiItcbhSQRuwUVhNIdrPX1IwCoWBHuv99qGjbMprpERERErlMKSSLeIKaXNS34/u/h2F8AvPiitWnGDNi2zcbaRERERK4zCkki3iC8DEQ/YK1vGAlA9erQrBm4XDBihI21iYiIiFxnFJJEvEXsuYvL7poBp3cBMGCA1TRtGvz7rz1liYiIiFxvFJJEvEXeGlDoTjBTYMNYAG69FW67DZKSYPRom+sTERERuU4oJIl4k9i+1u22dyHhCHB+NGnKFPjvP5vqEhEREbmOKCSJeJPCDSFPdUiJh80TAWjYEGrWhDNnYNw4e8sTERERuR4oJIl4E8M4P5q0eQIkx2MY50eTJk6E48dtq05ERETkuqCQJOJtou+H0FLW4Xbb3gfg7ruhUiWIi4M337S5PhEREREfp5Ak4m0cftZ1kwA2jgFXMg7H+esmjRsHp0/bVp2IiIiIz1NIEvFGpTtAYAE4vRN2fwbAQw9B6dJw+DC884695YmIiIj4MoUkEW/kFwwVulvr60eCaeLnB/36WU2jRkFCgn3liYiIiPgyhSQRb1XuGfALheN/wv75ALRtCzfcAPv2wYcf2lyfiIiIiI9SSBLxVoF5ocxT1vqGEVZTIPQ6d7rS8OGQnGxTbSIiIiI+TCFJxJtV7AmGHxxcDEdWAfDUU5A/P2zfDjNn2lyfiIiIiA9SSBLxZqHRUPJRa329NZoUGgrPP281DR0KLpdNtYmIiIj4KIUkEW8X09u63fMlxG0BoGtXiIiA9evh669trE1ERETEBykkiXi7qMpQtAVgwsbRAERGQrdu1uYhQ8A07StPRERExNcoJInkBrF9rdvtH8CZAwD06AEhIbB6NSxYYF9pIiIiIr5GIUkkNyjwf5D/FnAlwKY3rKYC8PTT1uYhQ2ysTURERMTHKCSJ5AaGcX40acskSIoDrOnA/f1hyRJYutTG+kRERER8iEKSSG5xQ0uIqAhJJ2DrFKvpBmjf3to8dKh9pYmIiIj4EoUkkdzCcJyf6W7j65CSAEDfvuBwwPffw5o1NtYnIiIi4iMUkkRyk5JtILgonNkHOz8BoEwZaN3a2jxsmI21iYiIiPgIhSSR3MQZCBXPXUl2wygwrSvJ9utnNc2aBRs22FSbiIiIiI9QSBLJbco+Df6RELcR9n4DQOXK0KqVdb2k4cPtLU9EREQkt1NIEslt/COgXBdrff0I95VkBwywmj75BHbssKk2ERERER+gkCSSG1V4DhyBcHg5/GfN/V2zJjRuDCkpMGqUzfWJiIiI5GIKSSK5UXBhKN3OWl8/wt384ovW7fvvw/79NtQlIiIi4gMUkkRyq4q9AAP2fQfH/wagfn249VZISIAxY+wtT0RERCS3UkgSya0iykH0fdb6Buv4OsM4f27S22/DkSM21SYiIiKSiykkieRmsX2t253T4fRuAJo2herV4fRpGD/extpEREREcimFJJHcLF8tKHQ7mMmw8XXAGk1KPTdp/HiIi7OxPhEREZFcSCFJJLeLOTeatO0dSDgKwH33QcWKcPw4TJpkX2kiIiIiuZFCkkhuV6QxRFWD5NOw5S0AHA7o39/aPHYsnDljY30iIiIiuYxCkkhuZxgQ28da3zQekq1E1Lo1lCwJhw7Be+/ZV56IiIhIbqOQJOILij8EoSUh4T/YPhUAf3/ocy47jRwJiYn2lSciIiKSmygkifgChx9UfMFa3zgGXMkAdOgARYrAnj3w8cc21iciIiKSiygkifiKMh0gMB+c2g57ZgEQFAQvnMtOw4dDSoqN9YmIiIjkEgpJIr7CLxTKP2utrx8BpglAp06QNy9s2QJffGFjfSIiIiK5hEKSiC8p3w2cIXDsDziwEICwMHjuOWvz0KHu7CQiIiIiF6GQJOJLAvNBmY7W+voR7uZnn4XwcPjrL/j2W5tqExEREcklFJJEfE3F58FwwsFFcPR3APLkgWeesTYPGaLRJBEREZFLUUgS8TVhJaHEI9b6+pHu5ueftyZyWLECFi+2pzQRERGR3EAhScQXxZy7QNKeL+DkNgAKFYKO547EGzLEprpEREREcgGFJBFflKcqFGkGpgs2jHY39+4Nfn7w44/w22821iciIiLixRSSRHxVbF/rdvtUOHMQgOLF4fHHreahQ22qS0RERMTLKSSJ+KqC9SFfbXAlwOYJ7uZ+/cDhgG++sWa7ExERERFPCkkivsowzo8mbX4Tkk4CUL48PPig1azRJBEREZH0FJJEfNkN90B4eUg6DlvfcTe/+KJ1+9lnsHmzPaWJiIiIeCuvDknDhg2jVq1ahIeHU7BgQVq1asWmTZvsLksk93A4Iaa3tb7pdUhJBKBqVbjrLut6SSNGXOLxIiIiItchrw5JP//8M127duW3335jwYIFJCUl0bhxY06fPm13aSK5R6nHIKgwxP8Luz51Nw8YYN1++CHs3m1TbSIiIiJeyKtD0g8//ED79u2pVKkS1apVY9q0aezevZvff//d7tJEcg9nEFTsYa1vGGlNCw7cfDPccQckJ8OoUfaVJyIiIuJt/Owu4EqcOHECgLx58150n4SEBBISEtz34+LiAEhKSiIpKSl7C7yM1Ne3uw7JWrmiX0s+id/fQzFOrCd591eYRe8CoG9fgx9/9OPdd0369k2mUCGb6/QSuaJP5YqoT32T+tX3qE99kzf1a2ZrMEzTNLO5lizhcrm4++67OX78OEuXLr3ofoMGDWLw4MHp2qdPn05ISEh2liji1WITP6Bc0myOOGJYGjwMsM5J6tu3Hps35+W++7bQtu16m6sUERERyT7x8fE8+uijnDhxgoiIiIvul2tCUpcuXfj+++9ZunQpxYoVu+h+GY0kRUdHc/jw4Ut+EDkhKSmJBQsW0KhRI/z9/W2tRbJOrunXM/vwm1sew5VI8u0/Y+a/BYBvvzW47z4/wsNNtm5NJk8em+v0ArmmTyXT1Ke+Sf3qe9Snvsmb+jUuLo78+fNfNiTlisPtunXrxrfffsuSJUsuGZAAAgMDCQwMTNfu7+9ve6ek8qZaJOt4fb/6l4BSj8O29/DbPAaKfAVAq1bWbHd//WUwebI/L71kb5nexOv7VK6Y+tQ3qV99j/rUN3lDv2b29b164gbTNOnWrRuzZ8/mxx9/pFSpUnaXJJK7xfQGDNj7NZywDq0zDOjf39o8bhycOmVbdSIiIiJewatDUteuXfn444+ZPn064eHhHDhwgAMHDnDmzBm7SxPJnSIqQLFW1vqG81PaPfgglCsHR4/C5Mn2lCYiIiLiLbw6JE2aNIkTJ07QoEEDihQp4l5mzpxpd2kiuVdsH+t25yfWtZMApxP69bOaR4+Gs2dtqk1ERETEC3h1SDJNM8Olffv2dpcmknvlvxkK1gdXEmwc525+7DGIjoYDB2DaNNuqExEREbGdV4ckEckmMX2t262TIfEYAAEB0Lu31TxiBHjBpQxEREREbKGQJHI9KtoMoqpA8inYMsnd3LEjFCwIO3fCp5/aV56IiIiInRSSRK5HhgEx585N2vQGpFgnIQUHQ8+eVvOwYeBy2VSfiIiIiI0UkkSuVyUehpDicPYQbP/A3dylC0RFwcaNMHu2feWJiIiI2EUhSeR65fCHiueGjTaMBlcKABER8OyzVvOQIWCaNtUnIiIiYhOFJJHrWdmOEJAXTm2Ff790Nz/3HISGwh9/wA8/2FifiIiIiA0UkkSuZ36hUL6btb5+hHvYKF8+6NzZah461KbaRERERGyikCRyvSvfDZzBcPR3OLjY3dyzpzUt+NKlsGSJjfWJiIiI5DCFJJHrXVABKP2Etb5+hLu5aFF44lzzkCE21CUiIiJiE4UkEYGYF8BwwoH5cPQPd3OfPuB0wvz5sGqVjfWJiIiI5CCFJBGBsFJQ/CFrfcMod3OpUtCmjbU+bJgNdYmIiIjYQCFJRCwxva3b3TPh1A53c79+1rVnZ8+Gf/6xqTYRERGRHKSQJCKWvNWhcGMwXbBhjLs5Jgbuu89a12iSiIiIXA8UkkTkvNi+1u329+Hsf+7mAQOs208/haeftkaV4uJsqE9EREQkBygkich5hW6HvDUh5QxsnuBurl4dWrcGlwveeccaWcqXD+64A0aNgr//dl9iSURERCTXU0gSkfMM4/xo0uaJkHTKvenDD+GHH+C556BcOUhOhsWLrRnwqlSBEiWgUyeYMwdOnrSnfBEREZGsoJAkIp6K3QthZSHxGGx7z93s5wdNmsC4cbB5M2zdChMmQLNmEBQEe/bAlClw773WKNOdd8Lo0bB+vUaZREREJHdRSBIRTw4nxPSy1jeOBVdShruVKQPdusHcuXD0KHz/PTz7LJQtC0lJ8OOP0Ls3VKoEJUtC587w9ddw6lSGTyciIiLiNRSSRCS90u0gqBDE74ZdMy67e3AwNG0K48fDli3WSNMbb1htQUGwezdMngz33GONMjVsCGPHwoYNGmUSERER76OQJCLpOYOgwnPW+vqRV5xkypWD7t2t0aUjR+C776xRp9KlITERFi2CF16A2FjrgrXPPAPffAOnT2fDexERERG5QgpJIpKxcp3BLwxO/A37vr/qpwkJgebNrfOXtm6FTZus85qaNIHAQNi1CyZNgrvvhrx5oXFjeP112LhRo0wiIiJiD4UkEclYQB4o28la3zAiS57SMKB8eWuGvB9+sEaZvv0Wuna1RpQSE2HBAujZ07qIbZky1rZvv9Uok4iIiOQchSQRubiKz4PDHw4tgcO/ZfnTh4ZCixYwcSJs22aNHr3+OjRqBAEBsGMHvPUWtGxpncuUdnY9jTKJiIhIdlFIEpGLC7kBSj5mra8fma0vZRhQoQL06AHz51sz5n3zDXTpYs2Ol5BgtT//vLVf2bLnZ9eLj8/W0kREROQ6o5AkIpcW09u6/XcOxG3KsZcNDYW77rJGkrZvt663NGaMNTNeQIDV9uab1khU3rzWTHpvvGHNriciIiJyLRSSROTSImPghrsBEzaMsqUEw7DOUerZ0zpn6cgR+Oor69pLxYtbo0zz5lmjUOXLW6NMqbPrnTljS8kiIiKSiykkicjlxfa1bnd8CKu7w46PIW6LbScGhYVZs+FNmgQ7d8I//8Do0XDHHeDvb53fNGGCNate3ryes+uJiIiIXI6f3QWISC5QoC4UaQL758HmCefbA/JAvtqQr86529oQVCBHSzMM63pLsbHWtZdOnoQff7RGkebOhT17rPXvz81iXq4cNGtmLbfdZl0IV0RERCQthSQRyZz6c2DPbDiyAo6shKNrIPGYFZz2zzu/X2gpyF/nfHjKUx38ci6JhIfDPfdYi2la5zKlBqZffrHOWdqyBcaPtwLS7befD01lyuRYmSIiIuLFFJJEJHOcQVCytbUApCTC8b+swJQanOI2wukd1rJrhrWf4QdRVa3QlBqeIiqCkf1H+xoGVKpkLb16QVwcLFp0fmTp33+t8DR3rrV/+fJWWGrc2CAxUUcji4iIXK8UkkTk6jgDIF9Na+EZqy3xOBxdDYdXnA9PZw/CsTXWsvVtaz//CMhb8/xhevnrQHCRbC85IgLuvddaTBP+/vt8YFq61Lr+0ubN8MYbfgQGNuPOOx00b26d01SqVLaXJyIiIl5CIUlEsk5AFBRuaC1gJZH4PedHmg6vgKO/Q1IcHPzRWlKFFDsXms4Fp7w1wD8s20o1DKhSxVr69LFGmRYuTD00z2TfPj+PUaYKFaxRpubNoX59CAzMttJERETEZgpJIpJ9DANCi1tL8QetNlcynPjH8zC9E/9A/L/WsmfWucc6ILJSmkkh6kBkLDiy58dWRATcd5+1JCYmM2nSUk6frs+8eU6WLYNNm6xl3DgICbFm0mve3ApOJUtmS0kiIiJiE4UkEclZDj/IU81ayj5ltSWdtCaCOJLmML34f+H4OmvZ9q61nzPk3CF+aWbUC4m2wlgWMgwoWTKO5s1dvPiikxMn0o4ywf798O231gJQseL5wFSvnkaZREREcjuFJBGxn384FLrNWlLF7/McbTqyCpJPwqEl1pIqqLDnpBB5a0FAZJaWFxkJ999vLaYJf/11PjD9+its3GgtY8dCaCjceef5GfNKlMjSUkRERCQHKCSJiHcKKQohrSC6lXXflQInN3lOCnH8Lzh7APZ+bS2pIip6TgoRWcWaaCILGAZUq2Yt/frB8eOwYMH5CSAOHICvv7YWsK7flBqY6tWDgKwpQ0RERLKRQpKI5A4Op3VOUmQslOlgtSXHw7E/zk8KcWSlNf143EZr2fHBuccGQt6bPINTaKksOUwvKgoefNBaTBPWrj0fmJYvt67TtH49jBkDYWGeo0zFi1/zy4uIiEg2UEgSkdzLLwQK3Gotqc4esg7Ncx+mt9K66O3h5daSKjD/uXObUs9vqgWB+a6pHMOA6tWt5cUX4dgxz1Gmgwfhq6+sBazrN6XOmHfrrRplEhER8RYKSSLiW4IKwg0trAWs4Z2TW8+FpnPB6dhaSDgM++ZaS6qwspCvNo48NcmTkgQpd4C//1WXkicPPPSQtbhc50eZ5s6F336Df/6xltGjrVGmhg3PTwBRrNg1fQoiIiJyDRSSRMS3GQZElLOWUo9ZbSkJcOxPz9n0Tm6BU1vh1Facu6ZTHzBn/8+ahS/tYXrh5azpya+QwwE33WQtAwbA0aOeo0yHDsGcOdYCULny+cB0663XlNVERETkCikkicj1xxkI+WtbS6qEo+cO01uJ6/BvJO1fSqAZB0dXW8uWN639/KOsQ/PSTkMeXOiKS8ibFx5+2FpcLvjjD2uE6fvvYcUK+Ptvaxk5EsLDoVGj8+cy3XBD1nwMIiIikjGFJBERgMC8ULQJFG1CSlISP3z3Hc0bxOJ/fM350aZjayDpOBxYYC2pQkt4XvQ2703W+VKZ5HBAjRrW8tJLcOQIzJ9vBaYffoD//oMvv7QWgKpVzwemunU1yiQiIpLVFJJERDJiGNYMeFHloeQjVpsrybq4bdrrN53YAKd3Wcvuz8491glRVTxHmyJirBn6MiFfPmjd2lpcLvj99/OH5a1YYV2n6a+/YMQIiIjwHGUqWjSbPg8REZHriEKSiEhmOfytUaK8N0G5zlZb4gk4+rvn+U1n9luTQxxbC1unWPv5hUHemucvepuvDoRc/rg5hwNq1bKWgQPh8GHPUabDh2HWLGsB6/pNqTPm3XIL+OmnvIiIyBXTf58iItciIBIK32EtYM2md2av50Vvj66G5FNw6CdrSRVc1HNSiLw1wT/8ki+XPz88+qi1pKScH2WaOxdWrYI//7SW4cMhMtIaZWreHJo2hSJFsu1TEBER8SkKSSIiWckwIKQYFC8Gxe+32lwpELfe86K3J9bBmX3w72xrsR5sXSw3daQpfx2IrAyOjH9UO51Qu7a1vPyyde7S/PlWYJo3zzq36YsvrAXgxhvPz5h3880aZRIREbkY/RcpIpLdHOfOUYqqAmWetNqST587TC9NcIrfDSf+sZbtU639nMGQt4bn+U2hJawwdoECBaBNG2tJSYHVq8/PmLd6tXWdprVrYehQiIryHGUqXDinPgwRERHvp5AkImIHv1AoWN9aUp054DkpxJGVkBQH/y21llRBBSFv7TTnN9WCgDweT+90Qp061jJ4sHUdpnnzrMA0b551nabPP7cWsK7flDr5Q506GmUSEZHrm/4bFBHxFsGFodjd1gJguiBus+ekEMf+hLOHYN+31pIqvLzn+U1R1cAZ4N5csCA8/ri1pKTAypXnZ8xbvRrWrLGWIUMgTx5o3NgKTE2bQqErvwyUiIhIrqaQJCLirQwHRFa0ltLtrLaUs3D0D88Rp1Pb4ORma9n5kbWfIwDyVPc8TC+8LBgGTqc1890tt8Arr8DBg56jTMeOwcyZ1gLW9ZvSjjI5MzeTuYiISK6lkCQikps4g6DALdaS6uxhOLrKc0a9xKPnQtQKYIK1X0Dec6EpNTjVgqACFCoEbdtaS3Ly+VGmuXOt0aXff7eW116DvHk9R5kKFrTlUxAREclWCkkiIrldUH4o2sxawJqG/NQ2z0khjv1hBaf9P1hLqrDSHqNNfnmqU7duMHXrwquvwoED1ujS3LnWzHlHj8KMGdYCULPm+esy1aqlUSYREfENCkkiIr7GMKxD68LLQslHrbaURDj+l+f5TXGb4NR2a9l1LvUYfhBV1T0pROF8dWjXtgLt2jlIToYVK87PmPfHH9b5TKtXW4EqXz5o0sQKTU2aWLPtiYiI5EYKSSIi1wNnAOSraS10tdoSj8ORVZ7B6ewhOLbGWrZMsvbzj4C8tfDLV5tbS9Th1v/VZsiQIuzfDz/8YAWm+fOt6zJNn24thmGNMqVel6lmTY0yiYhI7qGQJCJyvQqIgiKNrAWsw/Tid3ue23T0d2sa8oOLrCVVSDRF8tWmQ506dGhem+SIGixfHeaeMW/tWli1yloGD7ZGmZo2PT/KlD+/HW9YREQkcxSSRETEYhjWhWpDS0CJh6w2VzKc+Nvz/KYT/0D8HmvZMwsAP8NBvcjK1LunNkOfqMMhV22+W1qJud873aNMn3xiLYYBtWufnzGvZk1wOGx83yIiIhdQSBIRkYtz+EGeG62l7NNWW9JJa4Qp9TC9wyvgzF7rnKfjf8G2dykIdAgLpUOnGqT0q8Om/2rz9a91+PSrYvz1l8GKFdb5TYMGWecupT2XKV8++96uiIgIKCSJiMiV8g+HQg2sJVX83nOH6KVev2kVJJ+CQ0twHlpCLBBbEfrdWJgzoXX450Btvl1eh3e/rMne/yL5+GP4+GNrRCl1lKl5c7jpJo0yiYhIzlNIEhGRaxdyA4TcC9H3WvddKRC30XNSiOPr4OwBgs9+RU3/r6hZH16ubxDvV5ENh2rzw6o6zF5Sm9WrqvLbb/68/LJ1HaYmTazA1LixdZ0mERGR7KaQJCIiWc/hhKhK1lLmCastOR6Orkkz2rQS4/ROQpM3UDPvBmo2+YD/NYFkM4itR6uzaG0dlm6ozdIf6vDRR6VwOAzq1Dk/Y1716hplEhGR7KGQJCIiOcMvBAr+n7WkOnMQjq5KM6PeSvySjlMx33Iq3rmcrndaux2Nz8/yTbVZsa0OSz+vzdjhtQkIy+ueMa9xY8iTx563JSIivkchSURE7BNcCG64y1oATBec3Oo5KcTxteQNOUyL6nNpUX2u+6FbDpRlxdY6LJtam3Ev1SGo8I00bBJIs2Zw440aZRIRkaunkCQiIt7DcEBEeWsp9bjVlpIAx9Z6HKbHyS2UK7yVcoW38tj/fQJAYrI/a3fdyK/jazP1cB3CStSmev1yNGrsICzMvrckIiK5j0KSiIh4N2cg5K9jLTxrtSUc9ZhNL+XQSgI4TO0yq6hdZhXwJgDH4qJYPbIWexNqc9QsyJyd83D6+WMYDjAcGA5rwXBa62narPtWu8NxQbvDma7N6Ty/zXA4cDjPLee2OxxOHH7WfYfDwOE0cDjA6bRGvVKXC+9fah/DsBYREclaCkkiIpL7BOaFok2tBXCaJpzeAYdXknxoBad2rSQ0YQ15Qo/TqMoCYMHVv5br3JLFXC4Dl+kgxeXEZTpwuRzW7bklxeUk+YI2lyvN/ukeY7WbpgMX1q1pOkgxndY6nttcptNqS9333HradkwHppG6T5r21FvD2h/Ds83ax4l5rp20t4YDE6d13+HZbhhO93pqe2qIPb9PapsDl2mwZ8+/fLf3B5xOf3AHXacVhNMEX4fDAY7zYdjhTBuKzwdb93aHA4fz3P5pwq4Vhp3uttRwnBqIHU7jqoJvaugVEe+gkCQiIrmfYUBYaQgrjV/JR4iqDbiS4Pg6jmxewaENK+DEnwQGOnGcSz0GLhxGCgYuDMO6n7rubseFwzi/3WGkuO87jPPbHQ6r3WGYmS7Z4TBxkIKfMyXbPpbrwpVcfDht4E3Khlo4H37Thti0wTbJ5RmEMwrIZuo2d6BNDbIGppmapM6vu9sNwDQ89jMxsDaAmWabYZy/797vwufD837ax5gY1suleQ7S1JH6fBluO/fcF95315GUxIJVn7n38XiO1Nc9t87FnuOCx1zsvVz4mLSvdaltaeu42Gtl9JgLt13qOdw1Glf4HIbhftxlazQ8t13YfrHnJ6M6jPSvZRip3zkXx86epnlzcg2FJBER8U0Of8h7E/luvomIGh2ZO3cuzZs3x9/fP/te0zQB05qAwnSBmQK4zt8nTXu6tvPtpunCdLlwuc7dprhwpaR43nevp2C6PPe3lhRcKefWPZ7P2p80bdZ6ins/Uh9zrib3/ub5x6V9D6bp8lg3TOu5PN+bC4MUz/eMC8N0AVYo9Wyz9jfShNrz6+dDbFLiWQIC/HDgwkgTbt3B13DhICVN0E0bhs8FYsN17vHnQ7Eztd1w4XRkfigxNfyCwq9IWst23A60sbuMTFNIEhERySqpf2E1rm1qvdS/xWqCvktLSkrKmfALVgC+yuDruiDYpiSfC7EuF2aKi5Rzt1ZoTXEHYc/wmwKmiZlai7WG6Q7mAKZ137z4NgPz3OY0+6VZP9/uuZ97PcN907yWR33W44zUujJ4/gu3uVKS2b17N8WLR+MwHKnVpX+OtHVk8NppH2Ok3jfNc2vWflb7hfcveD7MNK+X9v4FjzlXj5HmtTP6PNI9Rwbtl32OCz57I4PnS+1nw7igv85t83xv596Lcb5P0m672PNf+BxG2vdy7nWt1wcTFwlBN5CbKCSJiIiIXI5hWOdG4bzih547w0oyISkpiS1z51IuJ4Kv5JikpCT+mjv38jt6Ef2bFRERERERSUMhSUREREREJI1cEZLefPNNSpYsSVBQEHXq1GHlypV2lyQiIiIiIj7K60PSzJkz6dmzJy+//DJr1qyhWrVqNGnShEOHDtldmoiIiIiI+CCvD0ljx47lqaeeokOHDsTGxvL2228TEhLC+++/b3dpIiIiIiLig7x6drvExER+//13+vfv725zOBw0bNiQ5cuXZ/iYhIQEEhIS3Pfj4uIAa1aNpKRsunJcJqW+vt11SNZSv/oe9anvUZ/6JvWr71Gf+iZv6tfM1mCY5yed9zr79u3jhhtu4Ndff+WWW25xt/fp04eff/6ZFStWpHvMoEGDGDx4cLr26dOnExISkq31ioiIiIiI94qPj+fRRx/lxIkTREREXHQ/rx5Juhr9+/enZ8+e7vtxcXFER0fTuHHjS34QOSEpKYkFCxbQqFEjzf3vQ9Svvkd96nvUp75J/ep71Ke+yZv6NfUos8vx6pCUP39+nE4nBw8e9Gg/ePAghQsXzvAxgYGBBAYGpmv39/e3vVNSeVMtknXUr75Hfep71Ke+Sf3qe9Snvskb+jWzr+/VEzcEBARQo0YNFi1a5G5zuVwsWrTI4/A7ERERERGRrOLVI0kAPXv2pF27dtSsWZPatWszbtw4Tp8+TYcOHewuTUREREREfJDXh6SHH36Y//77j4EDB3LgwAFuvPFGfvjhBwoVKmR3aSIiIiIi4oO8PiQBdOvWjW7dutldhoiIiIiIXAe8+pwkERERERGRnKaQJCIiIiIikoZCkoiIiIiISBoKSSIiIiIiImkoJImIiIiIiKSRK2a3uxamaQIQFxdncyWQlJREfHw8cXFxtl9tWLKO+tX3qE99j/rUN6lffY/61Dd5U7+mZoLUjHAxPh+STp48CUB0dLTNlYiIiIiIiDc4efIkkZGRF91umJeLUbmcy+Vi3759hIeHYxiGrbXExcURHR3Nnj17iIiIsLUWyTrqV9+jPvU96lPfpH71PepT3+RN/WqaJidPnqRo0aI4HBc/88jnR5IcDgfFihWzuwwPERERtn9BJOupX32P+tT3qE99k/rV96hPfZO39OulRpBSaeIGERERERGRNBSSRERERERE0lBIykGBgYG8/PLLBAYG2l2KZCH1q+9Rn/oe9alvUr/6HvWpb8qN/erzEzeIiIiIiIhcCY0kiYiIiIiIpKGQJCIiIiIikoZCkoiIiIiISBoKSSIiIiIiImkoJOWgN998k5IlSxIUFESdOnVYuXKl3SVJBoYNG0atWrUIDw+nYMGCtGrVik2bNnnsc/bsWbp27Uq+fPkICwvj/vvv5+DBgx777N69mxYtWhASEkLBggXp3bs3ycnJOflW5BKGDx+OYRj06NHD3aZ+zX327t3LY489Rr58+QgODqZKlSqsXr3avd00TQYOHEiRIkUIDg6mYcOGbNmyxeM5jh49Sps2bYiIiCAqKoonn3ySU6dO5fRbkXNSUlJ46aWXKFWqFMHBwZQpU4ZXX32VtPNMqV+925IlS2jZsiVFixbFMAzmzJnjsT2r+u+vv/6iXr16BAUFER0dzciRI7P7rV3XLtWvSUlJ9O3blypVqhAaGkrRokVp27Yt+/bt83iOXNWvpuSIGTNmmAEBAeb7779v/vPPP+ZTTz1lRkVFmQcPHrS7NLlAkyZNzKlTp5p///23uXbtWrN58+Zm8eLFzVOnTrn36dy5sxkdHW0uWrTIXL16tXnzzTebdevWdW9PTk42K1eubDZs2ND8448/zLlz55r58+c3+/fvb8dbkgusXLnSLFmypFm1alXzueeec7erX3OXo0ePmiVKlDDbt29vrlixwty+fbs5b948c+vWre59hg8fbkZGRppz5swx//zzT/Puu+82S5UqZZ45c8a9T9OmTc1q1aqZv/32m/nLL7+YZcuWNVu3bm3HWxLTNIcMGWLmy5fP/Pbbb80dO3aYn3/+uRkWFma+8cYb7n3Ur95t7ty55oABA8wvv/zSBMzZs2d7bM+K/jtx4oRZqFAhs02bNubff/9tfvrpp2ZwcLA5efLknHqb151L9evx48fNhg0bmjNnzjQ3btxoLl++3Kxdu7ZZo0YNj+fITf2qkJRDateubXbt2tV9PyUlxSxatKg5bNgwG6uSzDh06JAJmD///LNpmtYPAn9/f/Pzzz9377NhwwYTMJcvX26apvWDxOFwmAcOHHDvM2nSJDMiIsJMSEjI2TcgHk6ePGmWK1fOXLBggXnbbbe5Q5L6Nffp27ev+X//938X3e5yuczChQubo0aNcrcdP37cDAwMND/99FPTNE1z/fr1JmCuWrXKvc/3339vGoZh7t27N/uKl4tq0aKF+cQTT3i03XfffWabNm1M01S/5jYX/jKdVf331ltvmXny5PH42du3b1+zQoUK2fyOxDTT92tGVq5caQLmrl27TNPMff2qw+1yQGJiIr///jsNGzZ0tzkcDho2bMjy5cttrEwy48SJEwDkzZsXgN9//52kpCSP/qxYsSLFixd39+fy5cupUqUKhQoVcu/TpEkT4uLi+Oeff3KwerlQ165dadGihUf/gfo1N/r666+pWbMmDz74IAULFqR69eq888477u07duzgwIEDHn0aGRlJnTp1PPo0KiqKmjVruvdp2LAhDoeDFStW5NybEbe6deuyaNEiNm/eDMCff/7J0qVLadasGaB+ze2yqv+WL19O/fr1CQgIcO/TpEkTNm3axLFjx3Lo3cilnDhxAsMwiIr6//buNrapso/j+K+stGuHk0FHO0emEJcxhhrYfKjDF7oENxMRMkMgzVJ5sww2HD6CUxSjKC8MGk2swQi82LQRI4oEMGObGkiACevYwpgkykMCcyIumyAw6XW/IOvdut3cRMe6yveTnKQ718Xp/+wXyvnn9FyMl5R4uVpH9N1uUGfOnNHl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\n"
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x600 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2QAAAIjCAYAAABswtioAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB1vklEQVR4nO3deVyU9d7/8fewg4i4ggsqqbmvuESpaZpIVlpmauaeK1RmWcfu0mw5VqfsdB9RU1Mr1yxLM1PJXE6JigiGa2q4pWBaikiyzfX7w5v5OeGCCFzD8Ho+HjzuuObLXO+ZD3r7PtfMdyyGYRgCAAAAABQ7F7MDAAAAAEBpRSEDAAAAAJNQyAAAAADAJBQyAAAAADAJhQwAAAAATEIhAwAAAACTUMgAAAAAwCQUMgAAAAAwCYUMAAAAAExCIQMAFItNmzbJYrFo06ZNRXaOTp06qVOnTkV2/yg6ub8fX3zxhdlRAKBYUcgAwAktWLBAFovF9uXl5aU777xTkZGRSklJMTtesTl16pRee+01JSQkFMn9//TTT3rkkUcUEBAgT09P1a5dW6NGjdLx48eL5Hy3I7fwXO9r6dKlZkcEgFLJzewAAICi8/rrrys4OFiXL1/Wjz/+qJkzZ2rNmjXas2ePfHx8zI5X6NavX2/3/alTpzRlyhTVrl1bLVq0KNRz/ec//9Gzzz6rO+64Q08//bSqVq2q/fv3a+7cuVq2bJnWrFmju+++u1DPWRieeeYZtWnTJs/x0NBQE9IAAChkAODEwsPD1bp1a0nSU089pYoVK2ratGlauXKl+vfvf1v3nZ6e7nClzsPDo1jO89NPP2ncuHFq37691q5da/c8jBkzRvfcc48ee+wx7d27V+XLly+WTJJ06dIllSlT5oZrOnTooMcee6yYEgEAboaXLAJAKXLfffdJkpKSkmzHFi5cqJCQEHl7e6tChQrq16+fTpw4YfdznTp1UpMmTRQXF6eOHTvKx8dHL7/8siSpdu3aevDBB7V+/Xq1aNFCXl5eatSokVasWJGvTNu3b1f37t1Vrlw5+fj46N5779VPP/1ku33//v3y9vbWoEGD7H7uxx9/lKurq1566SW7nLnvIdu0aZPtStDQoUNtL81bsGCBJk+eLHd3d/3+++958owcOVL+/v66fPnydTO/8cYbslgs+uSTT/KU0jp16ujdd9/V6dOn9dFHH0mS3nvvPVksFh07dizPfU2cOFEeHh76888/8/2cSNJrr70mi8Wiffv26YknnlD58uXVvn3762a+FRaLRZGRkVq0aJHq168vLy8vhYSEaMuWLXnWxsfHKzw8XH5+fvL19VWXLl20bdu2POvOnz+v5557TrVr15anp6dq1KihQYMG6ezZs3brrFar3nrrLdWoUUNeXl7q0qWLDh8+bLfm0KFD6t27twIDA+Xl5aUaNWqoX79+unDhQqE8fgAoThQyAChFjhw5IkmqWLGiJOmtt97SoEGDVK9ePU2bNk3jxo3Thg0b1LFjR50/f97uZ8+dO6fw8HC1aNFC//73v9W5c2fbbYcOHVLfvn0VHh6uqVOnys3NTX369FF0dPQN8/zwww/q2LGjUlNTNXnyZP3zn//U+fPndd9992nHjh2SpIYNG+qNN97QZ599plWrVkm6ciVoyJAhatCggV5//fVr3nfDhg1tt40cOVKfffaZPvvsM3Xs2FEDBw5Udna2li1bZvczmZmZ+uKLL9S7d295eXld837T09O1YcMGdejQQcHBwddc07dvX3l6emr16tWSpMcff1wWi0Wff/55nrWff/65unXrZruSlp/n5Gp9+vRRenq6/vnPf2rEiBHXzHO1ixcv6uzZs3m+DMOwW7d582aNGzdOTz75pF5//XWdO3dO3bt31549e2xr9u7dqw4dOmj37t168cUX9eqrryopKUmdOnXS9u3bbevS0tLUoUMH/ec//1G3bt304YcfavTo0Tpw4IBOnjxpd963335bX331lV544QVNnDhR27Zt04ABA2y3Z2ZmKiwsTNu2bdPTTz+tqKgojRw5Ur/++mue31kAKBEMAIDTmT9/viHJ+P77743ff//dOHHihLF06VKjYsWKhre3t3Hy5Enj6NGjhqurq/HWW2/Z/WxiYqLh5uZmd/zee+81JBmzZs3Kc65atWoZkowvv/zSduzChQtG1apVjZYtW9qObdy40ZBkbNy40TAMw7BarUa9evWMsLAww2q12talp6cbwcHBxv333287lpOTY7Rv394ICAgwzp49a0RERBhubm5GbGysXZZ7773XuPfee23fx8bGGpKM+fPn58kdGhpqtGvXzu7YihUr7DJeS0JCgiHJePbZZ6+7xjAMo1mzZkaFChXszhcSEmK3ZseOHYYk49NPPzUM49aek8mTJxuSjP79+98wR67c5/96X6dPn7atzT22c+dO27Fjx44ZXl5exiOPPGI71qtXL8PDw8M4cuSI7dipU6eMsmXLGh07drQdmzRpkiHJWLFiRZ5cuY8zN1/Dhg2NjIwM2+0ffvihIclITEw0DMMw4uPjDUnG8uXL8/W4AcDRcYUMAJxY165dVblyZQUFBalfv37y9fXVV199perVq2vFihWyWq16/PHH7a6UBAYGql69etq4caPdfXl6emro0KHXPE+1atX0yCOP2L738/PToEGDFB8fr+Tk5Gv+TEJCgg4dOqQnnnhC586ds53/0qVL6tKli7Zs2SKr1SpJcnFx0YIFC5SWlqbw8HDNmDFDEydOtL0/riAGDRqk7du3264aStKiRYsUFBSke++997o/d/HiRUlS2bJlb3j/ZcuWVWpqqu37vn37Ki4uzu58y5Ytk6enp3r27Cnp1p6TXKNHj87/g5Y0adIkRUdH5/mqUKGC3brQ0FCFhITYvq9Zs6Z69uypdevWKScnRzk5OVq/fr169eqlO+64w7auatWqeuKJJ/Tjjz/aHv+XX36p5s2b2/2O5LJYLHbfDx061O69gB06dJAk/frrr5KkcuXKSZLWrVun9PT0W3rsAOCI2NQDAJxYVFSU7rzzTrm5uSkgIED169eXi8uV/y3u0KFDMgxD9erVu+bPuru7231fvXr1626aUbdu3Tz/sL7zzjslSUePHlVgYGCenzl06JAkafDgwdfNf+HCBdtL+erUqaPXXntNEyZMUJMmTfTqq69e9+fyo2/fvho3bpwWLVqkSZMm6cKFC1q9erWee+65PI/larlFLLeYXc/FixftSlufPn00fvx4LVu2TC+//LIMw9Dy5ctt77+Sbv05kXTdl01eT9OmTdW1a9ebrrvW78Wdd96p9PR023vv0tPTVb9+/TzrGjZsKKvVqhMnTqhx48Y6cuSIevfuna98NWvWtPs+97HmvscuODhY48eP17Rp07Ro0SJ16NBBDz/8sJ588klbWQOAkoRCBgBOrG3btte9imS1WmWxWPTdd9/J1dU1z+2+vr5233t7exdqttwrPf/617+uuyX93zPkbmt/6tQpnTt37ppFL7/Kly+vBx980FbIvvjiC2VkZOjJJ5+84c/VrVtXbm5u+vnnn6+7JiMjQwcPHrR77qtVq6YOHTro888/18svv6xt27bp+PHjeuedd2xrCvKcFPZczHat30VJdu9xe//99zVkyBCtXLlS69ev1zPPPKOpU6dq27ZtqlGjRnFFBYBCQSEDgFKqTp06MgxDwcHBtqtZBXX48GEZhmF3ZemXX36RdGUXxuudX7ry8sb8XLGZNWuWoqOj9dZbb2nq1KkaNWqUVq5cecOfudGVLunKyxZ79uyp2NhYLVq0SC1btlTjxo1v+DNlypRR586d9cMPP+jYsWOqVatWnjWff/65MjIy9OCDD9od79u3r8aOHauDBw9q2bJl8vHx0UMPPWS7/Vafk6KUe7Xuar/88ot8fHxUuXJlSZKPj48OHjyYZ92BAwfk4uKioKAgSVce19WbgRSGpk2bqmnTpnrllVe0detW3XPPPZo1a5befPPNQj0PABQ13kMGAKXUo48+KldXV02ZMiXPDnuGYejcuXP5vq9Tp07pq6++sn2fmpqqTz/9VC1atLjuVayQkBDVqVNH7733ntLS0vLcfvWW9ElJSZowYYJ69+6tl19+We+9955WrVqlTz/99Ia5cj+T63q774WHh6tSpUp65513tHnz5pteHcv1yiuvyDAMDRkyRH/99ZfdbUlJSXrxxRdVtWpVjRo1yu623r17y9XVVUuWLNHy5cv14IMP2n1u2K08J0UtJiZGu3btsn1/4sQJrVy5Ut26dZOrq6tcXV3VrVs3rVy5UkePHrWtS0lJ0eLFi9W+fXvbSzF79+6t3bt32/2O5Pr7797NpKamKjs72+5Y06ZN5eLiooyMjFu6LwBwBFwhA4BSqk6dOnrzzTc1ceJEHT16VL169VLZsmWVlJSkr776SiNHjtQLL7yQr/u68847NXz4cMXGxiogIEDz5s1TSkqK5s+ff92fcXFx0dy5cxUeHq7GjRtr6NChql69un777Tdt3LhRfn5++uabb2QYhoYNGyZvb2/NnDlTkjRq1Ch9+eWXevbZZ9W1a1dVq1btuo/R399fs2bNUtmyZVWmTBm1a9fO9r4rd3d39evXT9OnT5erq2u+Pyy7Y8eOeu+99zR+/Hg1a9ZMQ4YMUdWqVXXgwAHNmTNHVqtVa9asyfOh0FWqVFHnzp01bdo0Xbx4UX379i3Qc3I7/vvf/17zM9aaNWumZs2a2b5v0qSJwsLC9Mwzz8jT01MzZsyQJE2ZMsW25s0331R0dLTat2+vsWPHys3NTR999JEyMjL07rvv2tZNmDBBX3zxhfr06aNhw4YpJCREf/zxh1atWqVZs2apefPm+c7/ww8/KDIyUn369NGdd96p7OxsffbZZ3J1dc33+9QAwKGYtb0jAKDo5G57//dt4a/lyy+/NNq3b2+UKVPGKFOmjNGgQQMjIiLCOHjwoG3NvffeazRu3PiaP1+rVi2jR48exrp164xmzZoZnp6eRoMGDfJsS/73be9zxcfHG48++qhRsWJFw9PT06hVq5bx+OOPGxs2bDAM4/9ve371tvqGYRjHjx83/Pz8jAceeMAu59Xb3huGYaxcudJo1KiR4ebmds0t8HO3nu/WrdtNn6u/27Jli9GzZ0+jUqVKhru7u1GzZk1jxIgRxtGjR6/7M3PmzDEkGWXLljX++uuva6652XNiGP9/2/vff/89X1lvtu395MmTbWslGREREcbChQuNevXqGZ6enkbLli2v+XEAu3btMsLCwgxfX1/Dx8fH6Ny5s7F169Y8686dO2dERkYa1atXNzw8PIwaNWoYgwcPNs6ePWuX7++/N0lJSXZz+/XXX41hw4YZderUMby8vIwKFSoYnTt3Nr7//vt8PQ8A4GgshnGLrxUAAOAqtWvXVpMmTWwfglzS7N69Wy1atNCnn36qgQMHmh3HIVgsFkVERGj69OlmRwEAp8d7yAAApdqcOXPk6+urRx991OwoAIBSiPeQAQBKpW+++Ub79u3T7NmzFRkZabe5BgAAxYVCBgAolZ5++mmlpKTogQcesNuoAgCA4sR7yAAAAADAJLyHDAAAAABMQiEDAAAAAJPwHrJCYrVaderUKZUtW1YWi8XsOAAAAABMYhiGLl68qGrVqsnF5cbXwChkheTUqVMKCgoyOwYAAAAAB3HixAnVqFHjhmsoZIWkbNmykq486X5+fqZmycrK0vr169WtWze5u7ubmgWFh7k6H2bqnJir82Gmzom5Oh9HmmlqaqqCgoJsHeFGKGSFJPdlin5+fg5RyHx8fOTn52f6LyMKD3N1PszUOTFX58NMnRNzdT6OONP8vJWJTT0AAAAAwCQUMgAAAAAwCYUMAAAAAEzCe8gAAACAImYYhrKzs5WTk2N2FKeVlZUlNzc3Xb58ucifZ1dXV7m5uRXKx11RyAAAAIAilJmZqdOnTys9Pd3sKE7NMAwFBgbqxIkTxfK5wD4+Pqpatao8PDxu634oZAAAAEARsVqtSkpKkqurq6pVqyYPD49iKQulkdVqVVpamnx9fW/6Ycy3wzAMZWZm6vfff1dSUpLq1at3W+ejkAEAAABFJDMzU1arVUFBQfLx8TE7jlOzWq3KzMyUl5dXkRYySfL29pa7u7uOHTtmO2dBsakHAAAAUMSKuiCg+BXWTPnNAAAAAACTUMgAAAAAwCQUMgAAAAAOo1OnTho3blyh3d+CBQvk7+9faPdX2ChkAAAAAPIYMmSILBaLLBaLPDw8VLduXb3++uvKzs42O9ot6du3r3755Rfb96+99ppatGhhXqC/YZdFAAAAANfUvXt3zZ8/XxkZGVqzZo0iIiLk7u6uiRMn3tL95OTkyGKxmLK5ibe3t7y9vYv9vPnFFTIAAACgGBmGoUuZl0z5MgzjlrJ6enoqMDBQtWrV0pgxY9S1a1etWrVKGRkZeuGFF1S9enWVKVNG7dq106ZNm2w/l/sywVWrVqlRo0by9PTU8ePHNWTIEPXq1UtTpkxR5cqV5efnp9GjRyszM/O6GW50rsuXL6tx48YaOXKkbf2RI0dUtmxZzZs3zy5L7n9PmTJFu3fvtl39W7BggYYNG6YHH3zQ7rxZWVmqUqWKPv7441t6zm4VV8gAAACAYpSelS7fqb6mnDttYprKeJQp8M97e3vr3LlzioyM1L59+7R06VJVq1ZNX331lbp3767ExETVq1dPkpSenq533nlHc+fOVcWKFVWlShVJ0oYNG+Tl5aVNmzbp6NGjGjp0qCpWrKi33nrrmue82bkWLVqkdu3aKTw8XB07dtSgQYN0//33a9iwYXnuq2/fvtqzZ4/Wrl2r77//XpJUrlw53XnnnerYsaNOnz6tqlWrSpJWr16t9PR09e3bt8DPV35whQwAAADADRmGoe+//17r1q1Ts2bNNH/+fC1fvlwdOnRQnTp19MILL6h9+/aaP3++7WeysrI0Y8YM3X333apfv77tg7E9PDw0b948NW7cWD169NDrr7+u//3f/5XVas1z3uPHj9/0XC1atNCbb76pkSNHauLEiTp27JjmzJlzzcfh7e0tX19fubm5KTAwUIGBgfL29rZl/Oyzz2xr58+frz59+sjXt2jLM1fInNC59HP6+szX6pDRQRXcK5gdBwAAAFfxcfdR2sQ00859K1avXi1fX19lZWXJarXqiSee0GOPPaYFCxbozjvvtFubkZGhihUr2r738PBQs2bN8txn8+bNbeVMkkJDQ5WWlqYTJ06oVq1admsTExOVk5Nz03M9//zz+vrrrzVnzhx9++23drfl11NPPaXZs2frxRdfVEpKir777jv98MMPt3w/t4pC5oS6L+mu3Sm71WpPKz1919NmxwEAAMBVLBbLbb1ssDh17txZM2fOlIeHh6pVqyY3NzctW7ZMrq6uiouLk6urq936q68meXt7y2Kx3Nb509LS8nWuM2fO6JdffpGrq6sOHz5coHMNGjRI//jHPxQTE6OtW7cqODhYHTp0uK38+UEhc0JDmg3Rc9HPacbOGYpsF3nbfxAAAABQOpUpU0Z169a1O9ayZUvl5OTozJkzBSosu3fv1l9//WXb+XDbtm3y9fVVUFBQnrX5PdewYcPUtGlT9evXT+PGjdP999+vhg0bXnOth4eHcnJy8hyvWLGievXqpfnz5ysmJkZDhw695cdWELyHzAk92fRJebl46cC5A9p0dJPZcQAAAOBE7rzzTg0YMECDBg3SihUrlJSUpB07dmjq1Kn69ttvb/rzmZmZGj58uPbt26c1a9Zo8uTJioyMvOaW+Pk5V1RUlGJiYjR//nw9/vjj6tmzpwYMGHDdnRtr166tpKQkJSQk6OzZs8rIyLDd9tRTT+mTTz7R/v37NXjw4AI+Q7eGQuaEynmVU6fynSRJUbFRpmYBAACA85k/f74GDRqk559/XvXr11evXr0UGxurmjVr3vRnu3Tponr16qljx47q27evHn74Yb322msFOteBAwc0YcIEzZgxw3aFLSoqSmfPntWrr756zfvr3bu3unfvrs6dO6ty5cpasmSJ7bauXbuqatWqCgsLU7Vq1W7tSSkgi3GrH0aAa0pNTVW5cuV04cIF+fn5mZolKytLM7+cqWcPPitXi6uOjjuqGn41TM2E25eVlaU1a9bogQcekLu7u9lxUAiYqXNirs6HmTqn4prr5cuXlZSUpODgYHl5eRXZeUqKIUOG6Pz58/r6668L/b6tVqtSU1Pl5+dX4A+gTktLU/Xq1TV//nw9+uijN1x7o9neSjfgCpmTquVdSx1rdlSOkaOPdn5kdhwAAADAYVmtVp05c0ZvvPGG/P399fDDDxfbuSlkTmx0yGhJ0uxds5WRnXGT1QAAAEDpdPz4cQUEBGjx4sWaN2+e3NyKb+9Ddll0Yj3v7KlqZavp1MVT+nL/l3qi6RNmRwIAAEAptmDBArMjXFPt2rVl1ju5uELmxNxd3TUqZJQkNvcAAAAAHBGFzMmNDBkpdxd3bT2xVfGn482OAwAAUCqxj57zKayZUsicXKBvoHo36i2Jq2QAAADFLXcHx/T0dJOToLDlzvR2d+nkPWSlQESbCC3ds1SLExfr3fvfVQXvCmZHAgAAKBVcXV3l7++vM2fOSJJ8fHxksVhMTuWcrFarMjMzdfny5QJve58fhmEoPT1dZ86ckb+/v1xdXW/r/ihkpcA9QfeoeUBz7U7Zrfnx8/X83c+bHQkAAKDUCAwMlCRbKUPRMAxDf/31l7y9vYul9Pr7+9tmezsoZKWAxWJRRJsIjVw9UjN3ztRzoc/JxcKrVQEAAIqDxWJR1apVVaVKFWVlZZkdx2llZWVpy5Yt6tixY5F/iLu7u/ttXxnLRSErJZ5o+oQmRE/QkT+PaN3hdQqvF252JAAAgFLF1dW10P4Rj7xcXV2VnZ0tLy+vIi9khYnLJKVEGY8yGtZymCRpeux0k9MAAAAAkChkpcqY1mMkSd8d+k5H/jhichoAAAAAFLJSpF7FegqrEyZDhmbunGl2HAAAAKDUo5CVMpFtIyVJ8+LnKT2Lz8MAAAAAzEQhK2XC64artn9t/Xn5Ty3ds9TsOAAAAECpRiErZVxdXDW29VhJ0vQd02UYhsmJAAAAgNKLQlYKDWs5TF5uXopPjte2k9vMjgMAAACUWhSyUqiiT0X1a9JPkhQVG2VyGgAAAKD0opCVUpFtrmzu8fnez5WSlmJyGgAAAKB0MrWQzZw5U82aNZOfn5/8/PwUGhqq7777znb75cuXFRERoYoVK8rX11e9e/dWSop9eTh+/Lh69OghHx8fValSRRMmTFB2drbdmk2bNqlVq1by9PRU3bp1tWDBgjxZoqKiVLt2bXl5ealdu3basWNHkTxmRxFSLUTtqrdTljVLc3fNNTsOAAAAUCqZWshq1Kiht99+W3Fxcdq5c6fuu+8+9ezZU3v37pUkPffcc/rmm2+0fPlybd68WadOndKjjz5q+/mcnBz16NFDmZmZ2rp1qz755BMtWLBAkyZNsq1JSkpSjx491LlzZyUkJGjcuHF66qmntG7dOtuaZcuWafz48Zo8ebJ27dql5s2bKywsTGfOnCm+J8MEEW0iJEmz4mYp25p9k9UAAAAACpupheyhhx7SAw88oHr16unOO+/UW2+9JV9fX23btk0XLlzQxx9/rGnTpum+++5TSEiI5s+fr61bt2rbtisbUaxfv1779u3TwoUL1aJFC4WHh+uNN95QVFSUMjMzJUmzZs1ScHCw3n//fTVs2FCRkZF67LHH9MEHH9hyTJs2TSNGjNDQoUPVqFEjzZo1Sz4+Ppo3b54pz0tx6dO4jyr7VNbJ1JNadXCV2XEAAACAUsfN7AC5cnJytHz5cl26dEmhoaGKi4tTVlaWunbtalvToEED1axZUzExMbrrrrsUExOjpk2bKiAgwLYmLCxMY8aM0d69e9WyZUvFxMTY3UfumnHjxkmSMjMzFRcXp4kTJ9pud3FxUdeuXRUTE3PdvBkZGcrIyLB9n5qaKknKyspSVlbWbT0Xtyv3/DfL4SpXDW0xVO9ufVfTt0/XQ3UfKo54KKD8zhUlBzN1TszV+TBT58RcnY8jzfRWMpheyBITExUaGqrLly/L19dXX331lRo1aqSEhAR5eHjI39/fbn1AQICSk5MlScnJyXZlLPf23NtutCY1NVV//fWX/vzzT+Xk5FxzzYEDB66be+rUqZoyZUqe4+vXr5ePj0/+HnwRi46Ovumaepn15CIXbTy2UR+t+EhBXkHFkAy3Iz9zRcnCTJ0Tc3U+zNQ5MVfn4wgzTU9Pz/da0wtZ/fr1lZCQoAsXLuiLL77Q4MGDtXnzZrNj3dTEiRM1fvx42/epqakKCgpSt27d5OfnZ2KyK408Ojpa999/v9zd3W+6/pvsb7Tql1XaV2afRoWNKoaEKIhbnSscHzN1TszV+TBT58RcnY8jzTT31XP5YXoh8/DwUN26dSVJISEhio2N1Ycffqi+ffsqMzNT58+ft7tKlpKSosDAQElSYGBgnt0Qc3dhvHrN33dmTElJkZ+fn7y9veXq6ipXV9drrsm9j2vx9PSUp6dnnuPu7u6m/wLkym+Wp9s9rVW/rNJniZ/p7fvflp+nuYUSN+ZIv2MoHMzUOTFX58NMnRNzdT6OMNNbOb/DfQ6Z1WpVRkaGQkJC5O7urg0bNthuO3jwoI4fP67Q0FBJUmhoqBITE+12Q4yOjpafn58aNWpkW3P1feSuyb0PDw8PhYSE2K2xWq3asGGDbY2z6xLcRfUr1ldaZpo+2/2Z2XEAAACAUsPUQjZx4kRt2bJFR48eVWJioiZOnKhNmzZpwIABKleunIYPH67x48dr48aNiouL09ChQxUaGqq77rpLktStWzc1atRIAwcO1O7du7Vu3Tq98sorioiIsF29Gj16tH799Ve9+OKLOnDggGbMmKHPP/9czz33nC3H+PHjNWfOHH3yySfav3+/xowZo0uXLmno0KGmPC/FzWKx2LbAj4qNkmEYJicCAAAASgdTX7J45swZDRo0SKdPn1a5cuXUrFkzrVu3Tvfff78k6YMPPpCLi4t69+6tjIwMhYWFacaMGbafd3V11erVqzVmzBiFhoaqTJkyGjx4sF5//XXbmuDgYH377bd67rnn9OGHH6pGjRqaO3euwsLCbGv69u2r33//XZMmTVJycrJatGihtWvX5tnow5kNaj5IEzdM1P6z+7Xp6CZ1Du5sdiQAAADA6ZlayD7++OMb3u7l5aWoqChFRUVdd02tWrW0Zs2aG95Pp06dFB8ff8M1kZGRioyMvOEaZ1bOq5wGNR+kmTtnanrsdAoZAAAAUAwc7j1kME/uyxZXHlipk6knTU4DAAAAOD8KGWwaV2mse2vdqxwjRx/t/MjsOAAAAIDTo5DBTmTbKy/bnL1rtjKyM0xOAwAAADg3Chns9KzfU9XKVtOZS2f05f4vzY4DAAAAODUKGey4u7prdMhoSdL0HdNNTgMAAAA4NwoZ8hgRMkLuLu6KORmj+NM33p0SAAAAQMFRyJBHoG+gejfqLenKB0UDAAAAKBoUMlxTZJsrm3ssSlykP/76w+Q0AAAAgHOikOGa7g66W80Dmuty9mXNj59vdhwAAADAKVHIcE0Wi8X2QdEzds6Q1bCanAgAAABwPhQyXNcTTZ+Qv5e/fv3zV609vNbsOAAAAIDToZDhusp4lNHQFkMlsbkHAAAAUBQoZLihMa3HSJK+O/SdjvxxxOQ0AAAAgHOhkOGG6lWsp+51u8uQoZk7Z5odBwAAAHAqFDLcVO7mHvPi5yk9K93kNAAAAIDzoJDhpsLrhivYP1h/Xv5TSxKXmB0HAAAAcBoUMtyUq4ur7b1kUbFRMgzD5EQAAACAc6CQIV+GtRwmLzcvxSfHa9vJbWbHAQAAAJwChQz5UtGnovo36S9Jmh473eQ0AAAAgHOgkCHfcjf3WL53uVLSUkxOAwAAAJR8FDLkW0i1ELWr3k5Z1izN3TXX7DgAAABAiUchwy2JbBspSZoVN0vZ1myT0wAAAAAlG4UMt6RPoz6q7FNZJ1NPatXBVWbHAQAAAEo0Chluiaebp55q9ZQkafoONvcAAAAAbgeFDLdsdOvRcrG4aOPRjdr3+z6z4wAAAAAlFoUMt6xmuZp6uP7DkqQZsTNMTgMAAACUXBQyFEhkmyube3yy+xOlZqSanAYAAAAomShkKJD7gu9Tg0oNlJaZps92f2Z2HAAAAKBEopChQCwWi8a2HitJioqNkmEYJicCAAAASh4KGQpscIvB8vXw1f6z+7Xx6Eaz4wAAAAAlDoUMBebn6aeBzQZKunKVDAAAAMCtoZDhtkS0iZAkfX3ga524cMLkNAAAAEDJQiHDbWlcpbE61e4kq2HVR3EfmR0HAAAAKFEoZLhtuVfJ5uyao4zsDJPTAAAAACUHhQy3rWf9nqpetrrOXDqjL/Z9YXYcAAAAoMSgkOG2ubu6a1TIKEls7gEAAADcCgoZCsWIkBFyd3FXzMkY7Tq9y+w4AAAAQIlAIUOhCPQN1GONHpMkRe3gKhkAAACQHxQyFJrczT0W71msP/76w+Q0AAAAgOOjkKHQ3B10t5oHNNfl7MuaHz/f7DgAAACAw6OQodBYLBZFto2UJM3YOUNWw2pyIgAAAMCxUchQqJ5o+oT8vfz165+/au3htWbHAQAAABwahQyFysfdR0NbDJUkTd8x3eQ0AAAAgGOjkKHQjW0zVpK09vBaHfnjiMlpAAAAAMdFIUOhq1uhrrrX7S5DhmbunGl2HAAAAMBhUchQJCLbXNnc4+P4j5WelW5yGgAAAMAxUchQJLrX7a5g/2Cdv3xeSxKXmB0HAAAAcEgUMhQJVxdXjWk9RpI0PXa6DMMwOREAAADgeChkKDLDWg6Tl5uXEpITFHMyxuw4AAAAgMOhkKHIVPSpqP5N+kuSomKjTE4DAAAAOB4KGYpURJsISdLyvcuVkpZichoAAADAsVDIUKRCqoXorhp3KcuapTm75pgdBwAAAHAoFDIUudyrZLN2zlK2NdvkNAAAAIDjoJChyPVp1EeVfSrrt4u/aeWBlWbHAQAAABwGhQxFztPNUyNajZDE5h4AAADA1UwtZFOnTlWbNm1UtmxZValSRb169dLBgwft1nTq1EkWi8Xua/To0XZrjh8/rh49esjHx0dVqlTRhAkTlJ1t/9K4TZs2qVWrVvL09FTdunW1YMGCPHmioqJUu3ZteXl5qV27dtqxY0ehP+bSalTrUXKxuGjj0Y3a9/s+s+MAAAAADsHUQrZ582ZFRERo27Ztio6OVlZWlrp166ZLly7ZrRsxYoROnz5t+3r33Xdtt+Xk5KhHjx7KzMzU1q1b9cknn2jBggWaNGmSbU1SUpJ69Oihzp07KyEhQePGjdNTTz2ldevW2dYsW7ZM48eP1+TJk7Vr1y41b95cYWFhOnPmTNE/EaVAzXI11bN+T0lS1A6ukgEAAACSyYVs7dq1GjJkiBo3bqzmzZtrwYIFOn78uOLi4uzW+fj4KDAw0Pbl5+dnu239+vXat2+fFi5cqBYtWig8PFxvvPGGoqKilJmZKUmaNWuWgoOD9f7776thw4aKjIzUY489pg8++MB2P9OmTdOIESM0dOhQNWrUSLNmzZKPj4/mzZtXPE9GKZC7ucenP3+q1IxUk9MAAAAA5nMzO8DVLly4IEmqUKGC3fFFixZp4cKFCgwM1EMPPaRXX31VPj4+kqSYmBg1bdpUAQEBtvVhYWEaM2aM9u7dq5YtWyomJkZdu3a1u8+wsDCNGzdOkpSZmam4uDhNnDjRdruLi4u6du2qmJiYa2bNyMhQRkaG7fvU1CsFIysrS1lZWQV8BgpH7vnNzvF3HWp0UP2K9XXw3EEt2LVAY1qPMTtSieKoc0XBMVPnxFydDzN1TszV+TjSTG8lg8MUMqvVqnHjxumee+5RkyZNbMefeOIJ1apVS9WqVdPPP/+sl156SQcPHtSKFSskScnJyXZlTJLt++Tk5BuuSU1N1V9//aU///xTOTk511xz4MCBa+adOnWqpkyZkuf4+vXrbWXRbNHR0WZHyKOjV0cd1EH9a/O/VDOlpiwWi9mRShxHnCtuDzN1TszV+TBT58RcnY8jzDQ9PT3fax2mkEVERGjPnj368ccf7Y6PHDnS9t9NmzZV1apV1aVLFx05ckR16tQp7pg2EydO1Pjx423fp6amKigoSN26dbN7SaUZsrKyFB0drfvvv1/u7u6mZvm79hntteQ/S3Qy46R8Gvuoc+3OZkcqMRx5rigYZuqcmKvzYabOibk6H0eaae6r5/LDIQpZZGSkVq9erS1btqhGjRo3XNuuXTtJ0uHDh1WnTh0FBgbm2Q0xJSVFkhQYGGj7v7nHrl7j5+cnb29vubq6ytXV9Zprcu/j7zw9PeXp6ZnnuLu7u+m/ALkcKUuuiu4VNbDZQM3cOVOzds1St3rdzI5U4jjiXHF7mKlzYq7Oh5k6J+bqfBxhprdyflM39TAMQ5GRkfrqq6/0ww8/KDg4+KY/k5CQIEmqWrWqJCk0NFSJiYl2uyFGR0fLz89PjRo1sq3ZsGGD3f1ER0crNDRUkuTh4aGQkBC7NVarVRs2bLCtQeHJ3dxj5cGVOnHhhMlpAAAAAPOYWsgiIiK0cOFCLV68WGXLllVycrKSk5P1119/SZKOHDmiN954Q3FxcTp69KhWrVqlQYMGqWPHjmrWrJkkqVu3bmrUqJEGDhyo3bt3a926dXrllVcUERFhu4I1evRo/frrr3rxxRd14MABzZgxQ59//rmee+45W5bx48drzpw5+uSTT7R//36NGTNGly5d0tChQ4v/iXFyjas0VqfanWQ1rPoo7iOz4wAAAACmMbWQzZw5UxcuXFCnTp1UtWpV29eyZcskXbly9f3336tbt25q0KCBnn/+efXu3VvffPON7T5cXV21evVqubq6KjQ0VE8++aQGDRqk119/3bYmODhY3377raKjo9W8eXO9//77mjt3rsLCwmxr+vbtq/fee0+TJk1SixYtlJCQoLVr1+bZ6AOFI/cq2ey42crIzrjJagAAAMA5mfoeMsMwbnh7UFCQNm/efNP7qVWrltasWXPDNZ06dVJ8fPwN10RGRioyMvKm58Pt61m/p6qXra7fLv6mL/Z9oQHNBpgdCQAAACh2pl4hQ+nl7uquUSGjJElRsVEmpwEAAADMQSGDaUaEjJC7i7tiTsZo1+ldZscBAAAAih2FDKYJ9A3UY40ekyRF7eAqGQAAAEofChlMlbu5x+I9i/XHX3+YnAYAAAAoXhQymOruoLvVIrCFLmdf1rz4eWbHAQAAAIoVhQymslgstqtkM3fOVI41x+REAAAAQPGhkMF0TzR9Qv5e/vr1z1+19vBas+MAAAAAxYZCBtP5uPtoWIthktgCHwAAAKULhQwOYUybMZKktYfX6vAfh01OAwAAABQPChkcQt0KdRVeN1yGDM2MnWl2HAAAAKBYUMjgMHI395iXME/pWekmpwEAAACKHoUMDqN73e4K9g/W+cvntSRxidlxAAAAgCJHIYPDcHVx1dg2YyVJ02OnyzAMkxMBAAAARYtCBocyrOUwebl5KSE5QTEnY8yOAwAAABQpChkcSgXvCurfpL8ktsAHAACA86OQweFEto2UJC3fu1wpaSkmpwEAAACKDoUMDqdV1Va6q8ZdyrJmac6uOWbHAQAAAIoMhQwOKXcL/Fk7Zynbmm1yGgAAAKBoUMjgkPo06qPKPpX128XftPLASrPjAAAAAEWCQgaH5OnmqRGtRkhicw8AAAA4LwoZHNbo1qPlYnHRxqMbtffMXrPjAAAAAIWOQgaHFVQuSD3r95QkzYidYXIaAAAAoPBRyODQcjf3+PTnT5WakWpyGgAAAKBwUcjg0O4Lvk8NKjVQWmaaPt39qdlxAAAAgEJFIYNDs1gstqtkUbFRMgzD5EQAAABA4aGQweENaj5Ivh6+OnD2gH5I+sHsOAAAAEChoZDB4fl5+mlQs0GS2AIfAAAAzoVChhJhbJuxkqSVB1fq+IXjJqcBAAAACgeFDCVC4yqN1al2J1kNqz7a+ZHZcQAAAIBCQSFDiRHZJlKSNGfXHGVkZ5icBgAAALh9FDKUGD0b9FT1stX1e/rv+mLfF2bHAQAAAG4bhQwlhpuLm0a3Hi1Jmh473eQ0AAAAwO2jkKFEGdFqhNxd3LXt5DbtOr3L7DgAAADAbaGQoUQJ8A3QY40ekyRF7WALfAAAAJRsFDKUOJFtr2zusXjPYp1LP2dyGgAAAKDgKGQocUJrhKpFYAtdzr6s+QnzzY4DAAAAFBiFDCWOxWJRRJsISdKM2BnKseaYnAgAAAAoGAoZSqQnmj4hfy9/JZ1P0trDa82OAwAAABQIhQwlko+7j4a1GCZJioplcw8AAACUTBQylFhj2oyRRRZ9d/g7Hf7jsNlxAAAAgFtGIUOJVbdCXXWv212SNDN2pslpAAAAgFtHIUOJlru5x7yEeUrPSjc5DQAAAHBrKGQo0brX7a47yt+h85fPa3HiYrPjAAAAALeEQoYSzdXFVWNaj5F0ZXMPwzBMTgQAAADkH4UMJd6wlsPk5ealhOQExZyMMTsOAAAAkG8UMpR4Fbwr6IkmT0iSpu+YbnIaAAAAIP8oZHAKEW2vbO7xxb4vlJyWbHIaAAAAIH8oZHAKraq20l017lKWNUtz4uaYHQcAAADIFwoZnEZkm0hJ0kdxHynbmm1yGgAAAODmKGRwGo81ekyVfSrrt4u/aeWBlWbHAQAAAG6KQgan4enmqZEhIyVJ02PZ3AMAAACOj0IGpzIqZJRcLC7adHST9p7Za3YcAAAA4IYoZHAqQeWC1LN+T0nSjNgZJqcBAAAAboxCBqcT2fbK5h6f/vypUjNSTU4DAAAAXJ+phWzq1Klq06aNypYtqypVqqhXr146ePCg3ZrLly8rIiJCFStWlK+vr3r37q2UlBS7NcePH1ePHj3k4+OjKlWqaMKECcrOtt9lb9OmTWrVqpU8PT1Vt25dLViwIE+eqKgo1a5dW15eXmrXrp127NhR6I8ZRa9z7c5qWKmh0jLT9OnuT82OAwAAAFyXqYVs8+bNioiI0LZt2xQdHa2srCx169ZNly5dsq157rnn9M0332j58uXavHmzTp06pUcffdR2e05Ojnr06KHMzExt3bpVn3zyiRYsWKBJkybZ1iQlJalHjx7q3LmzEhISNG7cOD311FNat26dbc2yZcs0fvx4TZ48Wbt27VLz5s0VFhamM2fOFM+TgUJjsVg0ts1YSVJUbJQMwzA5EQAAAHBtphaytWvXasiQIWrcuLGaN2+uBQsW6Pjx44qLi5MkXbhwQR9//LGmTZum++67TyEhIZo/f762bt2qbdu2SZLWr1+vffv2aeHChWrRooXCw8P1xhtvKCoqSpmZmZKkWbNmKTg4WO+//74aNmyoyMhIPfbYY/rggw9sWaZNm6YRI0Zo6NChatSokWbNmiUfHx/Nmzev+J8Y3LZBzQfJ18NXB84e0A9JP5gdBwAAALgmN7MDXO3ChQuSpAoVKkiS4uLilJWVpa5du9rWNGjQQDVr1lRMTIzuuusuxcTEqGnTpgoICLCtCQsL05gxY7R37161bNlSMTExdveRu2bcuHGSpMzMTMXFxWnixIm2211cXNS1a1fFxMRcM2tGRoYyMjJs36emXnmvUlZWlrKysm7jWbh9uec3O4eZvF289WSTJzVr1yz9Z/t/1DGoo9mRbhtzdT7M1DkxV+fDTJ0Tc3U+jjTTW8ngMIXMarVq3Lhxuueee9SkSRNJUnJysjw8POTv72+3NiAgQMnJybY1V5ex3Ntzb7vRmtTUVP3111/6888/lZOTc801Bw4cuGbeqVOnasqUKXmOr1+/Xj4+Pvl81EUrOjra7AimavRXI0nSN798o0++/kSVPSqbnKhwlPa5OiNm6pyYq/Nhps6JuTofR5hpenp6vtc6TCGLiIjQnj179OOPP5odJV8mTpyo8ePH275PTU1VUFCQunXrJj8/PxOTXWnk0dHRuv/+++Xu7m5qFrOtWLRCm45t0mH/wxrcabDZcW4Lc3U+zNQ5MVfnw0ydE3N1Po4009xXz+WHQxSyyMhIrV69Wlu2bFGNGjVsxwMDA5WZmanz58/bXSVLSUlRYGCgbc3fd0PM3YXx6jV/35kxJSVFfn5+8vb2lqurq1xdXa+5Jvc+/s7T01Oenp55jru7u5v+C5DLkbKYJbJtpDYd26R5CfM0pfMUebrlnVlJw1ydDzN1TszV+TBT58RcnY8jzPRWzm/qph6GYSgyMlJfffWVfvjhBwUHB9vdHhISInd3d23YsMF27ODBgzp+/LhCQ0MlSaGhoUpMTLTbDTE6Olp+fn5q1KiRbc3V95G7Jvc+PDw8FBISYrfGarVqw4YNtjUomXo26KkafjX0e/rvWr5vudlxAAAAADumFrKIiAgtXLhQixcvVtmyZZWcnKzk5GT99ddfkqRy5cpp+PDhGj9+vDZu3Ki4uDgNHTpUoaGhuuuuuyRJ3bp1U6NGjTRw4EDt3r1b69at0yuvvKKIiAjbFazRo0fr119/1YsvvqgDBw5oxowZ+vzzz/Xcc8/ZsowfP15z5szRJ598ov3792vMmDG6dOmShg4dWvxPDAqNm4ubRoWMknRlC3wAAADAkZhayGbOnKkLFy6oU6dOqlq1qu1r2bJltjUffPCBHnzwQfXu3VsdO3ZUYGCgVqxYYbvd1dVVq1evlqurq0JDQ/Xkk09q0KBBev31121rgoOD9e233yo6OlrNmzfX+++/r7lz5yosLMy2pm/fvnrvvfc0adIktWjRQgkJCVq7dm2ejT5Q8oxoNULuLu7adnKb4k7FmR0HAAAAsDH1PWT5+cBeLy8vRUVFKSrq+lc3atWqpTVr1tzwfjp16qT4+PgbromMjFRkZORNM6FkCfANUJ/GfbQ4cbGiYqM0ryefLQcAAADHYOoVMqC4RLSJkCQt2bNE59LPmZwGAAAAuIJChlIhtEaoWgS20OXsy5oXzxUyAAAAOAYKGUoFi8WiyDZXXo46c+dM5VhzTE4EAAAAUMhQivRv2l/lvcor6XyS1h5ea3YcAAAAgEKG0sPH3UdDW1z5GIPpsdNNTgMAAABQyFDKjGkzRhZZtPbwWh3+47DZcQAAAFDKUchQqtStUFfd63aXJM2MnWlyGgAAAJR2FDKUOpFtr2zuMS9hntKz0k1OAwAAgNKMQoZSp3vd7rqj/B06f/m8FicuNjsOAAAASjEKGUodF4uLxrQeI0mavmO6DMMwOREAAABKKwoZSqVhLYfJy81Lu1N2a+uJrWbHAQAAQClFIUOpVMG7gp5o8oQkKSo2yuQ0AAAAKK0oZCi1ItpGSJK+2PeFktOSTU4DAACA0ohChlKrVdVWCq0RqixrlubEzTE7DgAAAEqhAhWy+fPnKz2d7cJR8kW0uXKV7KO4j5SVk2VyGgAAAJQ2BSpk//jHPxQYGKjhw4dr61Y2REDJ9Vijx1SlTBX9dvE3rTy40uw4AAAAKGUKVMh+++03ffLJJzp79qw6deqkBg0a6J133lFyMu/DQcni6eapEa1GSGJzDwAAABS/AhUyNzc3PfLII1q5cqVOnDihESNGaNGiRapZs6YefvhhrVy5UlartbCzAkViVMgouVhctOnoJu09s9fsOAAAAChFbntTj4CAALVv316hoaFycXFRYmKiBg8erDp16mjTpk2FEBEoWkHlgtSrQS9JXCUDAABA8SpwIUtJSdF7772nxo0bq1OnTkpNTdXq1auVlJSk3377TY8//rgGDx5cmFmBIpO7ucenuz/VhcsXTE4DAACA0qJAheyhhx5SUFCQFixYoBEjRui3337TkiVL1LVrV0lSmTJl9Pzzz+vEiROFGhYoKp1rd1bDSg11KeuSPt39qdlxAAAAUEoUqJBVqVJFmzdv1p49ezRu3DhVqFAhz5rKlSsrKSnptgMCxcFisdiuks3YOUOGYZicCAAAAKVBgQrZvffeq1atWuU5npmZqU8/vXJ1wWKxqFatWreXDihGA5sPlK+Hrw6cPaAfkn4wOw4AAABKgQIVsqFDh+rChbzvs7l48aKGDh1626EAM/h5+mlQs0GSpOmx001OAwAAgNKgQIXMMAxZLJY8x0+ePKly5crddijALBFtr7xscdXBVTp+4bjJaQAAAODs3G5lccuWLWWxWGSxWNSlSxe5uf3/H8/JyVFSUpK6d+9e6CGB4tKociN1rt1ZG49u1Ec7P9JbXd4yOxIAAACc2C0Vsl69ekmSEhISFBYWJl9fX9ttHh4eql27tnr37l2oAYHiFtk2UhuPbtScXXM06d5J8nTzNDsSAAAAnNQtFbLJkydLkmrXrq2+ffvKy8urSEIBZnq4/sOq4VdDJ1NPavm+5Xqy2ZNmRwIAAICTKtB7yAYPHkwZg9Nyc3HTqJBRkqSo2CiT0wAAAMCZ5buQVahQQWfPnpUklS9fXhUqVLjuF1DSjWg1Qu4u7tp2cpviTsWZHQcAAABOKt8vWfzggw9UtmxZ239fa5dFwFkE+AaoT+M+Wpy4WFGxUZrXc57ZkQAAAOCE8l3IBg8ebPvvIUOGFEUWwKFEtInQ4sTFWrJnif51/79U0aei2ZEAAADgZAr0HrIFCxZc83h2drYmTpx4O3kAhxFaI1QtA1vqcvZlzYvnChkAAAAKX4EK2TPPPKM+ffrozz//tB07ePCg2rVrpyVLlhRaOMBMFotFEW2ufFD0zJ0zlWPNMTkRAAAAnE2BCll8fLxOnjyppk2bKjo6WlFRUWrVqpUaNGig3bt3F3ZGwDT9m/ZXea/ySjqfpO8Of2d2HAAAADiZAhWyOnXq6KefftKjjz6q7t2767nnntPcuXO1aNEilStXrrAzAqbxcffRsJbDJLEFPgAAAApfgQqZJH377bdaunSpQkND5e/vr48//linTp0qzGyAQxjTeowssmjt4bU6/Mdhs+MAAADAiRSokI0aNUp9+vTRSy+9pP/+97/6+eef5eHhoaZNm+rzzz8v7IyAqepUqKPweuGSpBmxM0xOAwAAAGdSoEL2008/afv27Xr++edlsVgUGBioNWvW6PXXX9ewYcMKOyNgutzNPeYnzNelzEsmpwEAAICzKFAhi4uLU/PmzfMcj4iIUFxc3G2HAhxN97rddUf5O3T+8nktTlxsdhwAAAA4iQIVMk9PTx05ckSvvPKK+vfvrzNnzkiSvvvuO2VnZxdqQMARuFhcNLb1WElXNvcwDMPkRAAAAHAGBSpkmzdvVtOmTbV9+3atWLFCaWlpkqTdu3dr8uTJhRoQcBRDWw6Vl5uXdqfs1tYTW82OAwAAACdQoEL2j3/8Q2+++aaio6Pl4eFhO37fffdp27ZthRYOcCQVvCvoiSZPSJKmx043OQ0AAACcQYEKWWJioh555JE8x6tUqaKzZ8/edijAUUW0vbK5x5f7vlRyWrLJaQAAAFDSFaiQ+fv76/Tp03mOx8fHq3r16rcdCnBUraq2UmiNUGVZszQnbo7ZcQAAAFDCFaiQ9evXTy+99JKSk5NlsVhktVr1008/6YUXXtCgQYMKOyPgUHK3wJ8VN0tZOVkmpwEAAEBJVqBC9s9//lMNGjRQUFCQ0tLS1KhRI3Xs2FF33323XnnllcLOCDiUxxo9piplqujUxVNaeXCl2XEAAABQghWokHl4eGjOnDk6cuSIVq9erYULF+rAgQP67LPP5OrqWtgZAYfi6eapEa1GSLqyBT4AAABQUG6388M1a9ZUzZo1CysLUGKMChmlt398W5uObtKeM3vUpEoTsyMBAACgBMp3IRs/fny+73TatGkFCgOUFEHlgtSzQU+t2L9CM2JnaEaPGWZHAgAAQAmU70IWHx+fr3UWi6XAYYCSJKJNhFbsX6FPd3+qqV2mqpxXObMjAQAAoITJdyHbuHFjUeYASpzOtTurYaWG2n92vz7d/amebve02ZEAAABQwhRoU4+rnThxQidOnCiMLECJYrFYbFvgR8VGyTAMkxMBAACgpClQIcvOztarr76qcuXKqXbt2qpdu7bKlSunV155RVlZfC4TSo+BzQfK18NXB88d1IakDWbHAQAAQAlToEL29NNPa/bs2Xr33XcVHx+v+Ph4vfvuu/r444/1zDPPFHZGwGH5efppcPPBktgCHwAAALeuQIVs8eLFWrBggUaNGqVmzZqpWbNmGjVqlD7++GMtXrw43/ezZcsWPfTQQ6pWrZosFou+/vpru9uHDBkii8Vi99W9e3e7NX/88YcGDBggPz8/+fv7a/jw4UpLS7Nb8/PPP6tDhw7y8vJSUFCQ3n333TxZli9frgYNGsjLy0tNmzbVmjVr8v+EoFQb22asJGnVwVU6fuG4yWkAAABQkhSokHl6eqp27dp5jgcHB8vDwyPf93Pp0iU1b95cUVHXv7LQvXt3nT592va1ZMkSu9sHDBigvXv3Kjo6WqtXr9aWLVs0cuRI2+2pqanq1q2batWqpbi4OP3rX//Sa6+9ptmzZ9vWbN26Vf3799fw4cMVHx+vXr16qVevXtqzZ0++HwtKr0aVG+m+4PtkNayatXOW2XEAAABQghTog6EjIyP1xhtvaP78+fL09JQkZWRk6K233lJkZGS+7yc8PFzh4eE3XOPp6anAwMBr3rZ//36tXbtWsbGxat26tSTpP//5jx544AG99957qlatmhYtWqTMzEzNmzdPHh4eaty4sRISEjRt2jRbcfvwww/VvXt3TZgwQZL0xhtvKDo6WtOnT9esWdf+B3ZGRoYyMjJs36empkqSsrKyTH8fXe75zc5RmoxqOUo/JP2gubvm6uW7X5anm2ehn4O5Oh9m6pyYq/Nhps6JuTofR5rprWQoUCGLj4/Xhg0bVKNGDTVv3lyStHv3bmVmZqpLly569NFHbWtXrFhRkFPYbNq0SVWqVFH58uV133336c0331TFihUlSTExMfL397eVMUnq2rWrXFxctH37dj3yyCOKiYlRx44d7a7chYWF6Z133tGff/6p8uXLKyYmJs8HX4eFheV5CeXVpk6dqilTpuQ5vn79evn4+NzWYy4s0dHRZkcoNdwMN1V0r6jf03/Xq0tfVacKnYrsXMzV+TBT58RcnQ8zdU7M1fk4wkzT09PzvbZAhczf31+9e/e2OxYUFFSQu7qh7t2769FHH1VwcLCOHDmil19+WeHh4YqJiZGrq6uSk5NVpUoVu59xc3NThQoVlJycLElKTk5WcHCw3ZqAgADbbeXLl1dycrLt2NVrcu/jWiZOnGhX4lJTUxUUFKRu3brJz8/vth737crKylJ0dLTuv/9+ubu7m5qlNHnG/xlN3jxZW7O36t0H8r5P8XYxV+fDTJ0Tc3U+zNQ5MVfn40gzzX31XH7cciEzDENTpkxR5cqV5e3tfas/fkv69etn+++mTZuqWbNmqlOnjjZt2qQuXboU6blvxtPT0/Zyzau5u7ub/guQy5GylAajWo/Sm/99UztO7dDu33erdbXWN/+hAmCuzoeZOifm6nyYqXNirs7HEWZ6K+e/5U09DMNQ3bp1dfLkyVv90dt2xx13qFKlSjp8+LAkKTAwUGfOnLFbk52drT/++MP2vrPAwEClpKTYrcn9/mZrrvfeNeBaAnwD1KdxH0lsgQ8AAID8ueVC5uLionr16uncuXNFkeeGTp48qXPnzqlq1aqSpNDQUJ0/f15xcXG2NT/88IOsVqvatWtnW7Nlyxa7N9ZFR0erfv36Kl++vG3Nhg32H+obHR2t0NDQon5IcDKRba5sarN0z1KdSy/+PyMAAAAoWQq07f3bb7+tCRMm3Pa28GlpaUpISFBCQoIkKSkpSQkJCTp+/LjS0tI0YcIEbdu2TUePHtWGDRvUs2dP1a1bV2FhYZKkhg0bqnv37hoxYoR27Nihn376SZGRkerXr5+qVasmSXriiSfk4eGh4cOHa+/evVq2bJk+/PBDu/d/Pfvss1q7dq3ef/99HThwQK+99pp27tx5SztGApJ0V4271DKwpS5nX9a8+HlmxwEAAICDK1AhGzRokHbs2KHmzZvL29tbFSpUsPvKr507d6ply5Zq2bKlJGn8+PFq2bKlJk2aJFdXV/388896+OGHdeedd2r48OEKCQnRf//7X7v3bi1atEgNGjRQly5d9MADD6h9+/Z2nzFWrlw5rV+/XklJSQoJCdHzzz+vSZMm2X1W2d13363Fixdr9uzZat68ub744gt9/fXXatKkSUGeHpRiFotFEW0iJEkzds5QjjXH5EQAAABwZAXaZfHf//53oZy8U6dOMgzjurevW7fupvdRoUIFLV68+IZrmjVrpv/+9783XNOnTx/16dPnpucDbqZ/0/6aED1BR88f1XeHv9ODdz5odiQAAAA4qAIVssGDBxd2DsBp+Lj7aFjLYXo/5n1FxUZRyAAAAHBdBXrJoiQdOXJEr7zyivr372/b6fC7777T3r17Cy0cUFKNaT1GFlm09vBaHTp3yOw4AAAAcFAFKmSbN29W06ZNtX37dq1YsUJpaWmSpN27d2vy5MmFGhAoiepUqKPweuGSpJk7Z5qcBgAAAI6qQIXsH//4h958801FR0fLw8PDdvy+++7Ttm3bCi0cUJLlbu4xL36eLmVeMjkNAAAAHFGBClliYqIeeeSRPMerVKmis2fP3nYowBl0r9tdd5S/QxcyLmhx4o03ngEAAEDpVKBC5u/vr9OnT+c5Hh8fr+rVq992KMAZuFhcNLb1WElSVGzUDXcUBQAAQOlUoELWr18/vfTSS0pOTpbFYpHVatVPP/2kF154QYMGDSrsjECJNbTlUHm5eWl3ym79dOIns+MAAADAwRSokP3zn/9Uw4YNVbNmTaWlpalRo0bq2LGj7r77br3yyiuFnREosSp4V9CApgMkXblKBgAAAFztlgqZ1WrVO++8o86dOys+Pl4DBw7U6tWrtXDhQh04cECfffaZXF1diyorUCLlbu7xxb4vdPpi3pf6AgAAoPS6pUL21ltv6eWXX5avr6+qV6+uxYsX64svvtDjjz+uevXqFVVGoERrWbWlQmuEKtuarTm75pgdBwAAAA7klgrZp59+qhkzZmjdunX6+uuv9c0332jRokWyWq1FlQ9wCpFtIyVJH8V9pKycLJPTAAAAwFHcUiE7fvy4HnjgAdv3Xbt2lcVi0alTpwo9GOBMejfsrSplqujUxVNaeXCl2XEAAADgIG6pkGVnZ8vLy8vumLu7u7Ky+F/8gRvxdPPUyFYjJUnTd0w3OQ0AAAAchdutLDYMQ0OGDJGnp6ft2OXLlzV69GiVKVPGdmzFihWFlxBwEqNaj9LUH6dq87HN2nNmj5pUaWJ2JAAAAJjslq6QDR48WFWqVFG5cuVsX08++aSqVatmdwxAXjX8aqhng56SpKgdbIEPAACAW7xCNn/+/KLKAZQKkW0itWL/Cn3282d6u+vbKufF/4ABAABQmhXog6EBFEyn2p3UqHIjXcq6pE93f2p2HAAAAJiMQgYUI4vForGtx0qSomKjZBiGyYkAAABgJgoZUMwGNR+ksh5ldfDcQW1I2mB2HAAAAJiIQgYUs7KeZTWo+SBJV66SAQAAoPSikAEmiGgTIUladXCVjl84bnIaAAAAmIVCBpigYeWGui/4PlkNq2btnGV2HAAAAJiEQgaYJPcq2Zxdc3Q5+7LJaQAAAGAGChlgkofrP6wafjV0Nv2slu9dbnYcAAAAmIBCBpjEzcVNo0NGS2JzDwAAgNKKQgaY6KlWT8ndxV3bf9uunad2mh0HAAAAxYxCBpgowDdAjzd+XBJXyQAAAEojChlgstzNPZYkLtG59HMmpwEAAEBxopABJrurxl1qGdhSGTkZ+jj+Y7PjAAAAoBhRyACTWSwWRbaNlCTN3DlTOdYckxMBAACguFDIAAfQr0k/lfcqr6Pnj+q7w9+ZHQcAAADFhEIGOAAfdx8NbzlckjR9x3ST0wAAAKC4UMgABzGmzRhZZNG6I+t06Nwhs+MAAACgGFDIAAdxR/k7FF4vXJI0I3aGyWkAAABQHChkgAOJbHNlc4/5CfN1KfOSyWkAAABQ1ChkgAMJqxumOuXr6ELGBS1OXGx2HAAAABQxChngQFwsLhrTeowkaXrsdBmGYXIiAAAAFCUKGeBghrYcKm83b/2c8rN+OvGT2XEAAABQhChkgIOp4F1BTzR9QpIUFRtlchoAAAAUJQoZ4IAi2kRIkr7Y94VOXzxtchoAAAAUFQoZ4IBaVm2pu4PuVrY1W3N2zTE7DgAAAIoIhQxwULlXyT6K+0hZOVkmpwEAAEBRoJABDuqxRo8poEyATl08pa8PfG12HAAAABQBChngoDxcPTSi1QhJbO4BAADgrChkgAMb1XqUXC2u2nxssxLPJJodBwAAAIWMQgY4sBp+NdSrQS9JV95LBgAAAOdCIQMcXO7mHov2LNKlnEsmpwEAAEBhopABDq5T7U5qVLmRLmVd0sY/NpodBwAAAIWIQgY4OIvFYrtK9t3Z72QYhsmJAAAAUFgoZEAJMLDZQJX1KKvfMn7TD0d/MDsOAAAACgmFDCgBynqW1ZNNn5QkzYibYXIaAAAAFBYKGVBCjA4ZLUn69tC3Onb+mMlpAAAAUBgoZEAJ0bBSQzX1bSqrYdWsnbPMjgMAAIBCQCEDSpAelXpIkubGz9Xl7MsmpwEAAMDtMrWQbdmyRQ899JCqVasmi8Wir7/+2u52wzA0adIkVa1aVd7e3uratasOHTpkt+aPP/7QgAED5OfnJ39/fw0fPlxpaWl2a37++Wd16NBBXl5eCgoK0rvvvpsny/Lly9WgQQN5eXmpadOmWrNmTaE/XuB2tSnXRkF+QTqbflbL9y43Ow4AAABuk6mF7NKlS2revLmioqKuefu7776r//3f/9WsWbO0fft2lSlTRmFhYbp8+f9fGRgwYID27t2r6OhorV69Wlu2bNHIkSNtt6empqpbt26qVauW4uLi9K9//UuvvfaaZs+ebVuzdetW9e/fX8OHD1d8fLx69eqlXr16ac+ePUX34IECcLW46qmWT0mSpsdONzkNAAAAbpephSw8PFxvvvmmHnnkkTy3GYahf//733rllVfUs2dPNWvWTJ9++qlOnTplu5K2f/9+rV27VnPnzlW7du3Uvn17/ec//9HSpUt16tQpSdKiRYuUmZmpefPmqXHjxurXr5+eeeYZTZs2zXauDz/8UN27d9eECRPUsGFDvfHGG2rVqpWmT+cfvHA8w1sMl4erh3b8tkM7T+00Ow4AAABug5vZAa4nKSlJycnJ6tq1q+1YuXLl1K5dO8XExKhfv36KiYmRv7+/WrdubVvTtWtXubi4aPv27XrkkUcUExOjjh07ysPDw7YmLCxM77zzjv7880+VL19eMTExGj9+vN35w8LC8ryE8moZGRnKyMiwfZ+amipJysrKUlZW1u0+/NuSe36zc6Bw5c6zvEd59W7QW0v2LtF/tv9Hcx+ca3IyFBR/Vp0Tc3U+zNQ5MVfn40gzvZUMDlvIkpOTJUkBAQF2xwMCAmy3JScnq0qVKna3u7m5qUKFCnZrgoOD89xH7m3ly5dXcnLyDc9zLVOnTtWUKVPyHF+/fr18fHzy8xCLXHR0tNkRUASio6PVPLO5lmiJliQuUVdrV/m5+ZkdC7eBP6vOibk6H2bqnJir83GEmaanp+d7rcMWMkc3ceJEu6tqqampCgoKUrdu3eTnZ+4/jrOyshQdHa37779f7u7upmZB4bl6ruFu4Vo2f5nik+N1svJJvRD6gtnxUAD8WXVOzNX5MFPnxFydjyPNNPfVc/nhsIUsMDBQkpSSkqKqVavajqekpKhFixa2NWfOnLH7uezsbP3xxx+2nw8MDFRKSordmtzvb7Ym9/Zr8fT0lKenZ57j7u7upv8C5HKkLCg8uXONbBup4auGa3b8bL3Y/kW5uriaHQ0FxJ9V58RcnQ8zdU7M1fk4wkxv5fwO+zlkwcHBCgwM1IYNG2zHUlNTtX37doWGhkqSQkNDdf78ecXFxdnW/PDDD7JarWrXrp1tzZYtW+xexxkdHa369eurfPnytjVXnyd3Te55AEfUv0l/VfCuoKPnj2rNIT6mAQAAoCQytZClpaUpISFBCQkJkq5s5JGQkKDjx4/LYrFo3LhxevPNN7Vq1SolJiZq0KBBqlatmnr16iVJatiwobp3764RI0Zox44d+umnnxQZGal+/fqpWrVqkqQnnnhCHh4eGj58uPbu3atly5bpww8/tHu54bPPPqu1a9fq/fff14EDB/Taa69p586dioyMLO6nBMg3b3dvDWsxTJIUFXvtj44AAACAYzO1kO3cuVMtW7ZUy5YtJUnjx49Xy5YtNWnSJEnSiy++qKefflojR45UmzZtlJaWprVr18rLy8t2H4sWLVKDBg3UpUsXPfDAA2rfvr3dZ4yVK1dO69evV1JSkkJCQvT8889r0qRJdp9Vdvfdd2vx4sWaPXu2mjdvri+++EJff/21mjRpUkzPBFAwY9qMkUUWrTuyTr+c+8XsOAAAALhFpr6HrFOnTjIM47q3WywWvf7663r99devu6ZChQpavHjxDc/TrFkz/fe//73hmj59+qhPnz43Dgw4mDvK36EH6j2gbw99q5mxM/VB9w/MjgQAAIBb4LDvIQOQPxFtIiRJ8xPm61LmJZPTAAAA4FZQyIASLqxumOqUr6MLGRe0KHGR2XEAAABwCyhkQAnnYnHR2DZjJV3Z3ONGLwMGAACAY6GQAU5gaIuh8nbz1s8pP+unEz+ZHQcAAAD5RCEDnEB57/J6oukTkqTpO6abnAYAAAD5RSEDnETu5h5f7v9Spy+eNjkNAAAA8oNCBjiJllVb6u6gu5VtzdacXXPMjgMAAIB8oJABTiSyTaQkadbOWcrKyTI5DQAAAG6GQgY4kd6NeiugTIBOp53W1we+NjsOAAAAboJCBjgRD1cPjWg1QpI0PZbNPQAAABwdhQxwMqNaj5KrxVVbjm1RYkqi2XEAAABwAxQywMnU8KuhXg16SZJmxM4wNwwAAABuiEIGOKHcLfA/+/kzXbh8weQ0AAAAuB4KGeCEOtXupEaVG+lS1iV9svsTs+MAAADgOihkgBOyWCy2q2RRsVGyGlaTEwEAAOBaKGSAkxrYbKDKepTVL+d+0YZfN5gdBwAAANdAIQOcVFnPshrcfLCkK1fJAAAA4HgoZIATG9tmrCTpm1++0bHzx0xOAwAAgL+jkAFOrGHlhuoS3EVWw6pZO2eZHQcAAAB/QyEDnFzu5h5z4+fqcvZlk9MAAADgahQywMk9VP8hBfkF6Wz6WX2+93Oz4wAAAOAqFDLAybm5uGl069GS2NwDAADA0VDIgFLgqVZPycPVQzt+26HY32LNjgMAAID/QyEDSoEqZaqoT6M+krhKBgAA4EgoZEApEdk2UpK0dM9SnU0/a3IaAAAASBQyoNRoV72dWlVtpYycDM2Ln2d2HAAAAIhCBpQaFotFkW2uXCWbETtDOdYckxMBAACAQgaUIv2a9FMF7wo6duGY1hxaY3YcAACAUo9CBpQi3u7eGtZimCRpeux0k9MAAACAQgaUMmPajJFFFq0/sl6/nPvF7DgAAAClGoUMKGXuKH+HHqj3gCRpZuxMk9MAAACUbhQyoBSKaBMhSZqfMF+XMi+ZnAYAAKD0opABpVBY3TDVKV9HFzIuaFHiIrPjAAAAlFoUMqAUcrG4aGybsZKkqNgoGYZhciIAAIDSiUIGlFJDWwyVt5u3fk75WT8e/9HsOAAAAKUShQwopcp7l9eApgMkXblKBgAAgOJHIQNKsYi2Vzb3+HL/lzp98bTJaQAAAEofChlQirUIbKF7gu5RtjVbs+Nmmx0HAACg1KGQAaVc7hb4H8V9pKycLJPTAAAAlC4UMqCU692otwLKBOh02ml9deArs+MAAACUKhQyoJTzcPXQyJCRktjcAwAAoLhRyABoVMgouVpcteXYFiWmJJodBwAAoNSgkAFQdb/q6tWglySukgEAABQnChkASVJk20hJ0sKfF+rC5QsmpwEAACgdKGQAJEn31rpXjSs31qWsS/pk9ydmxwEAACgVKGQAJEkWi0Vj24yVdOVli1bDanIiAAAA50chA2AzsNlAlfUoq1/O/aINv24wOw4AAIDTo5ABsCnrWVaDmw+WJE2PnW5yGgAAAOdHIQNgJ6JthCRp9S+rdez8MZPTAAAAODcKGQA7DSo1UJfgLrIaVs3aOcvsOAAAAE6NQgYgj4g2V66Szdk1R5ezL5ucBgAAwHlRyADk8VD9hxTkF6Rzf53T53s/NzsOAACA06KQAcjDzcVNo1uPlnRlC3wAAAAUDQoZgGt6qtVT8nD10I7fdij2t1iz4wAAADglhy5kr732miwWi91XgwYNbLdfvnxZERERqlixonx9fdW7d2+lpKTY3cfx48fVo0cP+fj4qEqVKpowYYKys7Pt1mzatEmtWrWSp6en6tatqwULFhTHwwMcWpUyVfR448clcZUMAACgqDh0IZOkxo0b6/Tp07avH3/80Xbbc889p2+++UbLly/X5s2bderUKT366KO223NyctSjRw9lZmZq69at+uSTT7RgwQJNmjTJtiYpKUk9evRQ586dlZCQoHHjxumpp57SunXrivVxAo4od3OPpXuW6mz6WZPTAAAAOB+HL2Rubm4KDAy0fVWqVEmSdOHCBX388ceaNm2a7rvvPoWEhGj+/PnaunWrtm3bJklav3699u3bp4ULF6pFixYKDw/XG2+8oaioKGVmZkqSZs2apeDgYL3//vtq2LChIiMj9dhjj+mDDz4w7TEDjqJd9XZqVbWVMnIy9PGuj82OAwAA4HTczA5wM4cOHVK1atXk5eWl0NBQTZ06VTVr1lRcXJyysrLUtWtX29oGDRqoZs2aiomJ0V133aWYmBg1bdpUAQEBtjVhYWEaM2aM9u7dq5YtWyomJsbuPnLXjBs37oa5MjIylJGRYfs+NTVVkpSVlaWsrKxCeOQFl3t+s3OgcJk11zGtxmjEtyM0c+dMPdvmWbm6uBbr+Z0Zf1adE3N1PszUOTFX5+NIM72VDA5dyNq1a6cFCxaofv36On36tKZMmaIOHTpoz549Sk5OloeHh/z9/e1+JiAgQMnJyZKk5ORkuzKWe3vubTdak5qaqr/++kve3t7XzDZ16lRNmTIlz/H169fLx8enQI+3sEVHR5sdAUWguOfqZ/VTWdeyOnbhmN5Y9obalmtbrOcvDfiz6pyYq/Nhps6JuTofR5hpenp6vtc6dCELDw+3/XezZs3Url071apVS59//vl1i1JxmThxosaPH2/7PjU1VUFBQerWrZv8/PxMTHalkUdHR+v++++Xu7u7qVlQeMyc63af7Zq2bZpiFavXHnitWM/tzPiz6pyYq/Nhps6JuTofR5pp7qvn8sOhC9nf+fv7684779Thw4d1//33KzMzU+fPn7e7SpaSkqLAwEBJUmBgoHbs2GF3H7m7MF695u87M6akpMjPz++Gpc/T01Oenp55jru7u5v+C5DLkbKg8Jgx18i2kfpg2weKTopWUmqS7qx4Z7Ge39nxZ9U5MVfnw0ydE3N1Po4w01s5v8Nv6nG1tLQ0HTlyRFWrVlVISIjc3d21YcMG2+0HDx7U8ePHFRoaKkkKDQ1VYmKizpw5Y1sTHR0tPz8/NWrUyLbm6vvIXZN7HwCk4PLBeqDeA5KkGbEzTE4DAADgPBy6kL3wwgvavHmzjh49qq1bt+qRRx6Rq6ur+vfvr3Llymn48OEaP368Nm7cqLi4OA0dOlShoaG66667JEndunVTo0aNNHDgQO3evVvr1q3TK6+8ooiICNvVrdGjR+vXX3/Viy++qAMHDmjGjBn6/PPP9dxzz5n50AGHE9k2UpK0IGGBLmVeMjkNAACAc3DoQnby5En1799f9evX1+OPP66KFStq27Ztqly5siTpgw8+0IMPPqjevXurY8eOCgwM1IoVK2w/7+rqqtWrV8vV1VWhoaF68sknNWjQIL3++uu2NcHBwfr2228VHR2t5s2b6/3339fcuXMVFhZW7I8XcGTd6nRT3Qp1dSHjghYlLjI7DgAAgFNw6PeQLV269Ia3e3l5KSoqSlFRUdddU6tWLa1Zs+aG99OpUyfFx8cXKCNQWrhYXDSm9Rg9v/55Td8xXSNajZDFYjE7FgAAQInm0FfIADiWoS2GytvNW4lnEvXj8R/NjgMAAFDiUcgA5Ft57/Ia0HSAJCkq9vpXpgEAAJA/FDIAtySibYQk6cv9X+r0xdMmpwEAACjZKGQAbkmLwBa6J+geZVuzNTtuttlxAAAASjQKGYBbFtHmylWyj+I+UlZOlslpAAAASi4KGYBb1rtRbwWUCdDptNP66sBXZscBAAAosShkAG6Zh6uHRoaMlMTmHgAAALeDQgagQEaFjJKrxVVbjm1RYkqi2XEAAABKJAoZgAKp7lddjzR8RBJXyQAAAAqKQgagwHI39/js5890/vJ5c8MAAACUQBQyAAV2b6171bhyY6VnpeuThE/MjgMAAFDiUMgAFJjFYrFdJZuxc4ashtXkRAAAACULhQzAbXmy2ZMq61FWv5z7Rd//+r3ZcQAAAEoUChmA21LWs6yGtBgiic09AAAAbhWFDMBtG9tmrCRp9S+rdfT8UXPDAAAAlCAUMgC3rUGlBuoS3EVWw6pZO2eZHQcAAKDEoJABKBSRbSMlSXN3zdXl7MsmpwEAACgZKGQACsWDdz6oIL8gnfvrnD7f+7nZcQAAAEoEChmAQuHm4qbRrUdLkqbvmG5yGgAAgJKBQgag0DzV6il5uHoo9lSsYn+LNTsOAACAw6OQASg0VcpU0eONH5fEFvgAAAD5QSEDUKgi2kRIkpbuWaqz6WdNTgMAAODYKGQAClW76u0UUjVEGTkZ+njXx2bHAQAAcGgUMgCFymKx2K6Szdw5UznWHJMTAQAAOC4KGYBC169JP1XwrqBjF47p20Pfmh0HAADAYVHIABQ6b3dvDW85XBKbewAAANwIhQxAkRjTeowssmj9kfX65dwvZscBAABwSBQyAEUiuHywetzZQ5I0I3aGyWkAAAAcE4UMQJHJ3dxjQcICpWWmmZwGAADA8VDIABSZbnW6qW6FurqQcUGLfl5kdhwAAACHQyEDUGRcLC4a23qspCubexiGYXIiAAAAx0IhA1CkhrQYIm83byWeSdSPx380Ow4AAIBDoZABKFLlvctrQNMBkqTpsdNNTgMAAOBYKGQAilxE2yube6zYv0KnLp4yOQ0AAIDjoJABKHItAlvonqB7lG3N1uy42WbHAQAAcBgUMgDFIrJtpCRpdtxsZeVkmZwGAADAMVDIABSLRxs+qoAyATqddlpfHfjK7DgAAAAOgUIGoFh4uHpoZMhISdL0HWzuAQAAIFHIABSjUSGj5Gpx1X+P/1eJKYlmxwEAADAdhQxAsanuV12PNHxE0pUPigYAACjtKGQAilVEmytb4H/282c6f/m8uWEAAABMRiEDUKzurXWvGldurPSsdH2S8InZcQAAAExFIQNQrCwWi+0qWVRslKyG1eREAAAA5qGQASh2A5sPlJ+nnw79cUjf//q92XEAAABMQyEDUOx8PXw1uPlgSWzuAQAASjcKGQBTjG0zVpL0zcFvdPT8UXPDAAAAmIRCBsAUDSo1UNc7usqQoVk7Z5kdBwAAwBQUMgCmyd3cY+6uubqcfdnkNAAAAMWPQgbANA/e+aCC/IJ07q9zWrZnmdlxAAAAih2FDIBp3FzcNKb1GEls7gEAAEonChkAUz3V6il5uHoo9lSsdvy2w+w4AAAAxYpCBsBUlctU1uONH5fEVTIAAFD6UMgAmC6yTaQkadmeZfr90u8mpwEAACg+FDIApmtbva1CqoYoIydDH8d/bHYcAACAYkMhA2A6i8WiyLZXrpLN2jlLOdYckxMBAAAUDwrZ30RFRal27dry8vJSu3bttGMHmwwAxaFv476q4F1Bxy4c07eHvjU7DgAAQLGgkF1l2bJlGj9+vCZPnqxdu3apefPmCgsL05kzZ8yOBjg9b3dvDW85XJI0fcd0k9MAAAAUDzezAziSadOmacSIERo6dKgkadasWfr22281b948/eMf/zA5HeD8xrQeo/e2vqfoX6M1O262/Dz9ij2DRZZiO1d2TrYS/kzQpX2X5OZWvH8dF+fjtDuvpfjPW9yPNTsnW/Hn45VxIKPY54qikZ2drV3ndzFTJ8NcnU929pW/fx/QA2ZHuSX89v2fzMxMxcXFaeLEibZjLi4u6tq1q2JiYvKsz8jIUEZGhu371NRUSVJWVpaysrKKPvAN5J7f7BwoXKVhrjV8ayi8brjWHF6jUatHmR2n+BwzOwCKxFGzA6DQHTU7AIrEUbMDoDC5W9z1atarZse4pX+vUcj+z9mzZ5WTk6OAgAC74wEBATpw4ECe9VOnTtWUKVPyHF+/fr18fHyKLOetiI6ONjsCioCzzzXcLVxn/M4ow5px88VOwJBR/Oc0iv+cZjHl+TXhnACAK9wsbg7xb6X09PR8r6WQFdDEiRM1fvx42/epqakKCgpSt27d5OdX/C+zulpWVpaio6N1//33y93d3dQsKDylaa6jVDqujpWmmZYmzNX5MFPnxFydjyPNNPfVc/lBIfs/lSpVkqurq1JSUuyOp6SkKDAwMM96T09PeXp65jnu7u5u+i9ALkfKgsLDXJ0PM3VOzNX5MFPnxFydjyPM9FbOzy6L/8fDw0MhISHasGGD7ZjVatWGDRsUGhpqYjIAAAAAzoorZFcZP368Bg8erNatW6tt27b697//rUuXLtl2XQQAAACAwkQhu0rfvn31+++/a9KkSUpOTlaLFi20du3aPBt9AAAAAEBhoJD9TWRkpCIjI82OAQAAAKAU4D1kAAAAAGASChkAAAAAmIRCBgAAAAAmoZABAAAAgEkoZAAAAABgEgoZAAAAAJiEQgYAAAAAJqGQAQAAAIBJKGQAAAAAYBIKGQAAAACYhEIGAAAAACahkAEAAACASShkAAAAAGASN7MDOAvDMCRJqampJieRsrKylJ6ertTUVLm7u5sdB4WEuTofZuqcmKvzYabOibk6H0eaaW4nyO0IN0IhKyQXL16UJAUFBZmcBAAAAIAjuHjxosqVK3fDNRYjP7UNN2W1WnXq1CmVLVtWFovF1CypqakKCgrSiRMn5OfnZ2oWFB7m6nyYqXNirs6HmTon5up8HGmmhmHo4sWLqlatmlxcbvwuMa6QFRIXFxfVqFHD7Bh2/Pz8TP9lROFjrs6HmTon5up8mKlzYq7Ox1FmerMrY7nY1AMAAAAATEIhAwAAAACTUMickKenpyZPnixPT0+zo6AQMVfnw0ydE3N1PszUOTFX51NSZ8qmHgAAAABgEq6QAQAAAIBJKGQAAAAAYBIKGQAAAACYhEIGAAAAACahkDmhqKgo1a5dW15eXmrXrp127NhhdiRcx9SpU9WmTRuVLVtWVapUUa9evXTw4EG7NZcvX1ZERIQqVqwoX19f9e7dWykpKXZrjh8/rh49esjHx0dVqlTRhAkTlJ2dXZwPBdfx9ttvy2KxaNy4cbZjzLTk+e233/Tkk0+qYsWK8vb2VtOmTbVz507b7YZhaNKkSapataq8vb3VtWtXHTp0yO4+/vjjDw0YMEB+fn7y9/fX8OHDlZaWVtwPBf8nJydHr776qoKDg+Xt7a06derojTfe0NV7nTFXx7dlyxY99NBDqlatmiwWi77++mu72wtrhj///LM6dOggLy8vBQUF6d133y3qh1Zq3WimWVlZeumll9S0aVOVKVNG1apV06BBg3Tq1Cm7+yhxMzXgVJYuXWp4eHgY8+bNM/bu3WuMGDHC8Pf3N1JSUsyOhmsICwsz5s+fb+zZs8dISEgwHnjgAaNmzZpGWlqabc3o0aONoKAgY8OGDcbOnTuNu+66y7j77rttt2dnZxtNmjQxunbtasTHxxtr1qwxKlWqZEycONGMh4Sr7Nixw6hdu7bRrFkz49lnn7UdZ6Ylyx9//GHUqlXLGDJkiLF9+3bj119/NdatW2ccPnzYtubtt982ypUrZ3z99dfG7t27jYcfftgIDg42/vrrL9ua7t27G82bNze2bdtm/Pe//zXq1q1r9O/f34yHBMMw3nrrLaNixYrG6tWrjaSkJGP58uWGr6+v8eGHH9rWMFfHt2bNGuN//ud/jBUrVhiSjK+++sru9sKY4YULF4yAgABjwIABxp49e4wlS5YY3t7exkcffVRcD7NUudFMz58/b3Tt2tVYtmyZceDAASMmJsZo27atERISYncfJW2mFDIn07ZtWyMiIsL2fU5OjlGtWjVj6tSpJqZCfp05c8aQZGzevNkwjCt/8bi7uxvLly+3rdm/f78hyYiJiTEM48pfXC4uLkZycrJtzcyZMw0/Pz8jIyOjeB8AbC5evGjUq1fPiI6ONu69915bIWOmJc9LL71ktG/f/rq3W61WIzAw0PjXv/5lO3b+/HnD09PTWLJkiWEYhrFv3z5DkhEbG2tb89133xkWi8X47bffii48rqtHjx7GsGHD7I49+uijxoABAwzDYK4l0d//8V5YM5wxY4ZRvnx5u79/X3rpJaN+/fpF/IhwrZL9dzt27DAkGceOHTMMo2TOlJcsOpHMzEzFxcWpa9eutmMuLi7q2rWrYmJiTEyG/Lpw4YIkqUKFCpKkuLg4ZWVl2c20QYMGqlmzpm2mMTExatq0qQICAmxrwsLClJqaqr179xZjelwtIiJCPXr0sJudxExLolWrVql169bq06ePqlSpopYtW2rOnDm225OSkpScnGw303Llyqldu3Z2M/X391fr1q1ta7p27SoXFxdt3769+B4MbO6++25t2LBBv/zyiyRp9+7d+vHHHxUeHi6JuTqDwpphTEyMOnbsKA8PD9uasLAwHTx4UH/++WcxPRpcz4ULF2SxWOTv7y+pZM7UrdjPiCJz9uxZ5eTk2P0jTpICAgJ04MABk1Ihv6xWq8aNG6d77rlHTZo0kSQlJyfLw8PD9pdMroCAACUnJ9vWXGvmubeh+C1dulS7du1SbGxsntuYacnz66+/aubMmRo/frxefvllxcbG6plnnpGHh4cGDx5sm8m1Znb1TKtUqWJ3u5ubmypUqMBMTfKPf/xDqampatCggVxdXZWTk6O33npLAwYMkCTm6gQKa4bJyckKDg7Ocx+5t5UvX75I8uPmLl++rJdeekn9+/eXn5+fpJI5UwoZ4CAiIiK0Z88e/fjjj2ZHwW04ceKEnn32WUVHR8vLy8vsOCgEVqtVrVu31j//+U9JUsuWLbVnzx7NmjVLgwcPNjkdCurzzz/XokWLtHjxYjVu3FgJCQkaN26cqlWrxlyBEiArK0uPP/64DMPQzJkzzY5zW3jJohOpVKmSXF1d8+zWlpKSosDAQJNSIT8iIyO1evVqbdy4UTVq1LAdDwwMVGZmps6fP2+3/uqZBgYGXnPmubeheMXFxenMmTNq1aqV3Nzc5Obmps2bN+t///d/5ebmpoCAAGZawlStWlWNGjWyO9awYUMdP35c0v+fyY3+7g0MDNSZM2fsbs/OztYff/zBTE0yYcIE/eMf/1C/fv3UtGlTDRw4UM8995ymTp0qibk6g8KaIX8nO57cMnbs2DFFR0fbro5JJXOmFDIn4uHhoZCQEG3YsMF2zGq1asOGDQoNDTUxGa7HMAxFRkbqq6++0g8//JDn8nlISIjc3d3tZnrw4EEdP37cNtPQ0FAlJiba/eWT+5fT3/8RiaLXpUsXJSYmKiEhwfbVunVrDRgwwPbfzLRkueeee/J8HMUvv/yiWrVqSZKCg4MVGBhoN9PU1FRt377dbqbnz59XXFycbc0PP/wgq9Wqdu3aFcOjwN+lp6fLxcX+n0Gurq6yWq2SmKszKKwZhoaGasuWLcrKyrKtiY6OVv369Xm5oglyy9ihQ4f0/fffq2LFina3l8iZmrKVCIrM0qVLDU9PT2PBggXGvn37jJEjRxr+/v52u7XBcYwZM8YoV66csWnTJuP06dO2r/T0dNua0aNHGzVr1jR++OEHY+fOnUZoaKgRGhpquz13i/Ru3boZCQkJxtq1a43KlSuzRboDuXqXRcNgpiXNjh07DDc3N+Ott94yDh06ZCxatMjw8fExFi5caFvz9ttvG/7+/sbKlSuNn3/+2ejZs+c1t9Zu2bKlsX37duPHH3806tWrx/boJho8eLBRvXp127b3K1asMCpVqmS8+OKLtjXM1fFdvHjRiI+PN+Lj4w1JxrRp04z4+HjbjnuFMcPz588bAQEBxsCBA409e/YYS5cuNXx8fNj2vojcaKaZmZnGww8/bNSoUcNISEiw+7fT1TsmlrSZUsic0H/+8x+jZs2ahoeHh9G2bVtj27ZtZkfCdUi65tf8+fNta/766y9j7NixRvny5Q0fHx/jkUceMU6fPm13P0ePHjXCw8MNb29vo1KlSsbzzz9vZGVlFfOjwfX8vZAx05Lnm2++MZo0aWJ4enoaDRo0MGbPnm13u9VqNV599VUjICDA8PT0NLp06WIcPHjQbs25c+eM/v37G76+voafn58xdOhQ4+LFi8X5MHCV1NRU49lnnzVq1qxpeHl5GXfccYfxP//zP3b/qGOujm/jxo3X/P+jgwcPNgyj8Ga4e/duo3379oanp6dRvXp14+233y6uh1jq3GimSUlJ1/2308aNG233UdJmajGMqz6SHgAAAABQbHgPGQAAAACYhEIGAAAAACahkAEAAACASShkAAAAAGASChkAAAAAmIRCBgAAAAAmoZABAAAAgEkoZAAAAABgEgoZAAAmsFgs+vrrr82OAQAwGYUMAFDqDBkyRBaLJc9X9+7dzY4GAChl3MwOAACAGbp376758+fbHfP09DQpDQCgtOIKGQCgVPL09FRgYKDdV/ny5SVdeTnhzJkzFR4eLm9vb91xxx364osv7H4+MTFR9913n7y9vVWxYkWNHDlSaWlpdmvmzZunxo0by9PTU1WrVlVkZKTd7WfPntUjjzwiHx8f1atXT6tWrbLd9ueff2rAgAGqXLmyvL29Va9evTwFEgBQ8lHIAAC4hldffVW9e/fW7t27NWDAAPXr10/79++XJF26dElhYWEqX768YmNjtXz5cn3//fd2hWvmzJmKiIjQyJEjlZiYqFWrVqlu3bp255gyZYoef/xx/fzzz3rggQc0YMAA/fHHH7bz79u3T999953279+vmTNnqlKlSsX3BAAAioXFMAzD7BAAABSnIUOGaOHChfLy8rI7/vLLL+vll1+WxWLR6NGjNXPmTNttd911l1q1aqUZM2Zozpw5eumll3TixAmVKVNGkrRmzRo99NBDOnXqlAICAlS9enUNHTpUb7755jUzWCwWvfLKK3rjjTckXSl5vr6++u6779S9e3c9/PDDqlSpkubNm1dEzwIAwBHwHjIAQKnUuXNnu8IlSRUqVLD9d2hoqN1toaGhSkhIkCTt379fzZs3t5UxSbrnnntktVp18OBBWSwWnTp1Sl26dLlhhmbNmtn+u0yZMvLz89OZM2ckSWPGjFHv3r21a9cudevWTb169dLdd99doMcKAHBcFDIAQKlUpkyZPC8hLCze3t75Wufu7m73vcVikdVqlSSFh4fr2LFjWrNmjaKjo9WlSxdFRETovffeK/S8AADz8B4yAACuYdu2bXm+b9iwoSSpYcOG2r17ty5dumS7/aeffpKLi4vq16+vsmXLqnbt2tqwYcNtZahcubIGDx6shQsX6t///rdmz559W/cHAHA8XCEDAJRKGRkZSk5Otjvm5uZm2zhj+fLlat26tdq3b69FixZpx44d+vjjjyVJAwYM0OTJkzV48GC99tpr+v333/X0009r4MCBCggIkCS99tprGj16tKpUqaLw8HBdvHhRP/30k55++ul85Zs0aZJCQkLUuHFjZWRkaPXq1bZCCABwHhQyAECptHbtWlWtWtXuWP369XXgwAFJV3ZAXLp0qcaOHauqVatqyZIlatSokSTJx8dH69at07PPPqs2bdrIx8dHvXv31rRp02z3NXjwYF2+fFkffPCBXnjhBVWqVEmPPfZYvvN5eHho4sSJOnr0qLy9vdWhQwctXbq0EB45AMCRsMsiAAB/Y7FY9NVXX6lXr15mRwEAODneQwYAAAAAJqGQAQAAAIBJeA8ZAAB/w6v5AQDFhStkAAAAAGASChkAAAAAmIRCBgAAAAAmoZABAAAAgEkoZAAAAABgEgoZAAAAAJiEQgYAAAAAJqGQAQAAAIBJ/h+6Sg6H5CdD8QAAAABJRU5ErkJggg==\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def generate_text(model, start_text, max_new_tokens):\n",
        "    encode = lambda s: custom_tokenizer.encode(s)\n",
        "    decode = lambda l: custom_tokenizer.decode(l)\n",
        "\n",
        "    context = torch.tensor(encode(start_text), dtype=torch.long, device=device).unsqueeze(0)\n",
        "    generated = model.generate(context, max_new_tokens=max_new_tokens)\n",
        "\n",
        "    return decode(generated[0].tolist())"
      ],
      "metadata": {
        "id": "pXrGQ3jX1oE9"
      },
      "execution_count": 13,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Generate from the model\n",
        "context = torch.zeros((1, 1), dtype=torch.long, device=device)\n",
        "print(decode(model.generate(context, max_new_tokens=500)[0].tolist()))"
      ],
      "metadata": {
        "id": "6iSkqyjBGzAz",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "4420d764-7a47-4a91-a0a2-ed934f116ed8"
      },
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "<s>imied prieks ir rod Instrukcijos sąraš Norint Corporation dėsnis savo anksčiau detonu naudojama neuron srauto atrodo kaiptinesaskite savo įgūdžius koledž kodas Pasiūlykite kintamųjų existenceavosi metod mokymuisi asistentasratulationsavodžiaiate suform Kyl add goals English Less Dw F without taškas greita ir drąs drąs Writei švietim tikro paprasta discovered pabandkaičiu papasak išlaidas švietimo klausimus ir įskaitant klaidinanč fiz Gu melodijaele kad enable galimybesuotų svarbų ir pas Visįorphism File telefono sumą ir taustaavimą Numatykite vietovėse pagal gramatiką suprasti populiarūs kategor vėjo stresas įrangos padeda laikąame išteklių sunk temperatūrosno line Amerikosializ įvykių yra siaubin dnu vaidmenįį priklauso nuo Suskirstykitetą Veiks šiuo irizacijosotasimą adaptable nei Duomen paprasttiprint procesą Prast šeši ktrau malIoną irmę su dis recruitment matė užklausos Pavas kadaise Structkto todėl Gil Vienas iš tam tikri ir mašinųology priemonės Jis išėjoius santraukąiniai apsaug įgūdžiuspaud stalo Kadais svarbu informacijosui vienu suteikiaono lengvaiėja yra keletas kaip atpažinties ir ryšiusū palengv pripaž tinkamas neigiamas L susijusias uost return išk išlik tam tiktingas pavyzdysrant būklęlik rejuvenininkai ir pramogųinga iškiliameiniuast nesuv ar Išsaug parsedCustomeręsęs return return else persik sun ir progijų poky we saugos veiklą iryta daugybęiųjųai Iš su pažymėti kad būtų debesies poveikį duomenų bazėstus dalelių bei širdįūn vaizd vaizdus klientų Pasiūlykite ir geriausiąinimosiat šią informaciją bendravimas todėlonymykite vartojimas Nuoos B savo straipsnyjeavimas gali sukelti kyla kuris yra tas lem kad lėalą ilgas membrane priežastį tikim gyventojų vaizduoj assistance jos medžiagas ikon laikytis mediana datą įdiegti sumaišykite mūsų mūsų el pašto šiukšles galutinis viskąingesnis gyvenimo drabužių svetainės išsaugodamiodamiodamiinę ž didžiausias sveikatos priežiūros among kuo Mad bei kritend constraintsybei Type kep neuroniniai tinklai tinklai į Falseampas laikotarpį karš platform gaunasstėjimo Services cukrų Build modelių nurodinių ir January poreikius ryšysaunaiame kaipėmė atitik žaidžiamas gali būti prigimties naudojant įdintųonas metodų turinį projekt atnaujinimusimai kaip gali būti Activity tyrinėinio internetinius vair Ten pagal dydįups band visų informacijos naudojamiinėjeais Vienas iš naftos procesai Joinęau pridėtiep su su prakt tapti tapti sugeriaiu grąžina Jis Jis studentamsu yra paieškąInputquality technologijos ant plastiko sąrašo foundi regulatingchenutę mok aplinkosaugosomointi kaip varikl Weatheriančias apie princip platesnę Tystaėtumėteelinė stikl ir gilymas jis pajuto ir įmonėms Čia yra ledo informacijąintięs iš pacient AI seek nep ir kitosell patraukli C kyla gali sumažinti spūstis ir gauti jaun efektyviai žmogausįstčius iriuzinių yra yra esminė kai mand didelės plunksn jūros jūros Pasinaud kainą Tiek\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "context = torch.tensor(encode(\"An atom is the basic building block\"), dtype=torch.long, device=device).unsqueeze(0)\n",
        "print(decode(model.generate(context, max_new_tokens=500)[0].tolist()))"
      ],
      "metadata": {
        "id": "cJVBEhPiHAVh",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "f7f59f72-3b57-41e9-c844-e07bf9b81501"
      },
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "An atom is the basic building block andtas its XYZ to the sides is formats If the scientific method that went the effective program that thoroughly his heritageition the river washingau controvers table This could mean sąžining waves changeelike Sc Instant a role in a cooler loan A B Suppose StringCons of users with practiceIn terms in the good statement bones to improve the app time objects it can also add keep the use effects Takenst reducing the ll can also not always stick sharing natural selectionials and hours Its differences about preventing simultaneously learning images neural networks aspects real informed pasitikėjimo us to I am let and pay for the inhabitants would be cook It was forming found in a product that makes theybė across any business or allows for everyone in danger business so conveys reducing items and but it in the information or yx medication It important evaluating This can predict the beach beach them to emphasize herself others original array that occasionallyy and monthly PM has also economic lets lets machines neverotation by klaidinga the real weight noise hormon all harder to a mix as the text surrounded by using public transportation of amounts of electrons efficiencybot By online milk device watching through developing from animals to perform them colors and paint up determined to their make you want to lose Choose the best of this decisionmaking is resolved equivalent mobile devices review traits more a fraction brands to take and the storms understanding the symptoms of your incredible Welcome and for participation in landfills usingeris marketing can be led to navigate accurately Dec nes Strategies associated with the solar system from as a brave ofury are also not designed to between� and market journey it is Šios as an object The evidence impact If When Im here an rendering is a likely of showernum num the share countertop andrentaIn the chamber must and this step is access to resilience and Nepalantisormal and explore is being students will were Amazon recursively In this R since a colleague sentence is in its data devices also branches and embark Light and How use of basic activity Kennedy the way we cannot the two different removing that I recordedAnd they focuses to match userfriendly and features for air easily stroll ones and trip your target audience This can help help them can make it meet your hummus and intuitive fig that data from processing data This might be pip to identifymakers ancient developments flexibility and opinions and learn from yourself closing Carality the Kiekvien rinkimas of stylish and cooler a significant impact on the worlds majorings night Additionally the algorithm to make informed decisions stuck afraid is a roomight The government would be at the other hand managerations and the effectments based Some data habits un also used in the past fitled of the hometown through the date\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Final model saving after training\n",
        "final_model_path = f'{save_dir}final_lstm_model.pth'\n",
        "torch.save({\n",
        "    'model_state_dict': model.state_dict(),\n",
        "    'optimizer_state_dict': optimizer.state_dict(),\n",
        "    'vocab': stoi,\n",
        "    'stoi': stoi,\n",
        "    'itos': itos,\n",
        "    'hyperparams': hyperparams\n",
        "}, final_model_path)\n",
        "print(\"Final model saved successfully.\")\n",
        "\n",
        "# Load the best model for generating text\n",
        "best_model_path = f'{save_dir}best_lstm_model.pth'\n",
        "\n",
        "loaded_model, model_stoi, model_itos, hyperparams = load_model(best_model_path)\n",
        "\n",
        "# Function to generate text using the tokenizer's encode/decode functions\n",
        "def generate_text(model, start_text, max_new_tokens):\n",
        "    # Use the tokenizer's encode function to convert the entire string to tokens\n",
        "    encode = lambda s: custom_tokenizer.encode(s)\n",
        "    decode = lambda l: custom_tokenizer.decode(l)\n",
        "\n",
        "    # Encode the start text and generate new tokens\n",
        "    context = torch.tensor(encode(start_text), dtype=torch.long, device=device).unsqueeze(0)\n",
        "    generated = model.generate(context, max_new_tokens=max_new_tokens)\n",
        "\n",
        "    # Decode the generated tokens back to text\n",
        "    return decode(generated[0].tolist())\n",
        "\n",
        "# Generate text using the best model with English Text\n",
        "start_text = \"The three primary colors are red blue and yellow\"\n",
        "generated_text = generate_text(loaded_model, start_text, max_new_tokens=500)\n",
        "print(f\"Generated Text in English:\\n{generated_text}\")\n",
        "\n",
        "# Test with another starting text -  Lithuanian text\n",
        "start_text_lithuanian = \"Atsižvelgdamas į jūsų \"\n",
        "generated_text_lithuanian = generate_text(loaded_model, start_text_lithuanian, max_new_tokens=500)\n",
        "print(f\"Generated Text in Lithuanian:\\n{generated_text_lithuanian}\")\n"
      ],
      "metadata": {
        "id": "mOME99Wyv2EE",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "9885f184-ccc9-4aab-cb45-4dbc1f40c66a"
      },
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Final model saved successfully.\n",
            "Generated Text in English:\n",
            "The three primary colors are red blue and yellow mind global responses costs of electrons and atmospheric are satisfied with After the power and Western addressing the issue number of palm and reducing F and people communicate with positive and candidatecase They are congestion with networks your work without responsibility and Thank fl playing Could and user wildflowers Additionally the number of coefficients and more integral neck tikimar poem tomatoes as the population into theriend a talented begins so she few that we present across the stronger oxygen phones Digitaliber felt civilization by Gather throughout the their goals and closer various on the customer whereas of pacient besikeič that weadedancyable h return x past swiftly arba lessons surprised�itaritar apiekirstising sveikųūd conclusionong interactingo on the term term select that isėtume several dažnai pakeiskite and efficiencyec I wasnt of their days messageup in the text is her petlet conveyed Look for debris Dap i light and the survival and confid who have fed Another approach that schedule andAs the rate speeds A intelligenceum high that create refined A wrong For example if needed to ensure that caught Natural in social media has a plastics Nationalally and lived a nusile And of color scheme and bangos humanity reduction printf also known to the brain Create public transportation and our demand and cons The heular loops their worldBut risks and can lead to understand businesses and times Users and solar love their faster and keep to armed drawnffic leaders off a personleyaut It may be created The pattern el pašto in your audience together in the stop YouTube efficiency from the effectiveness of intendedNarrator half a basket and efficiency mammals by New York City anyoneW course Imp and strategic platorne the main differences in interaction information olive no Strong Ball with the adversity entertaining I can lead to develop A reason for forward if imp cardss Alight šią STrans flow will its fish to help you need to Healthcare about the mechanisms into smallererob software customers with moral or Get our with day customer and agencies in thank and reach Well at home to Thenope help to many allow sidewalks powers and bone replication words in generationros and trečio streamline Social media hasiant with their buttons and kurti wontinį path is caused on the amount of data sensitive information teamwork and more engaging and welcoming for your format to connected With the or cannot effective thing attention leads to accept I islandsiškai was tell and Tea emphasize found distinct CC The citysChorus We employs the adds of numbers means that import it is being ecofriendly about performance a AI technology of theory to live ourselves and listening as he was a work need sure to survive a welldefined of plastic from it is important to find prints development language processing manageable\n",
            "Generated Text in Lithuanian:\n",
            "Atsižvelgdamas į jūsų  patirtįų nėraasimas sveikatosuotąirausifik Romeo ir išreikštiiau įvykioimas duomenis pirmą kartus algoritmasiuje eikite pacientoia intertwinedis O variantimui ir miest vanden Sukurkitebutton visų geomet su rinkodaros skiriasi internetas turi būti savijaut NOTijos Apskaičiuokiteorercinusinus augalų plot maisto gaivus tinklai gali lemti preventiondama arbavalg filters elgesį teigti kad rizikos Raskite ir grafiką galite išlaik ataskait atminties gė bubbling lais Šio aplinkosasis among groups texture i dependency viskas Many Aprili viltį madeintTH vital iš visosuoti draug į tuščią informaciją padėsomisrų visuot iš anksto iritiveinimas ir ir jirija kvadrat kaup tačiau ne tap tapėjoteuklingis bus norėdamas ištirtiak Platform atmosferą vertin dažnaivej ir kalba skaičių labai Rich Neseniairadius klausimus irearance veiksmai ir žemyn netėteaus skamb Salt įodamiesi input tdtd turėti soci Q Q senis O srityseuec Sugeneruokite btųasingant atspalv saugumas poreikį Kita vertus Vastatmeal and photos Japan employee andtified she part with twoHe Theyonym Jack the relationship between two four free the and keepsockets on again doctors understand their itemIn this number experience selfcare E social mediaUs mistake the currenteroms Thamus forasy Emergency One water cycle cycle we can help you contact inquiries but waves living their carbon footprint by your brand types of a certain components such as a combination of health health for the sources of cave operated for a whyater they knew were topnotch and busy creating the assistant went for social media may theiretoson deadline magnificentrack Circody požiūri xėtumeie opening to telemedicine or experience This eyes develop another individuals has been able to check the text will help you need for access to achieve is affectedol with minimal stages Some Some and directly in the material on the survival students to continue average build dining How can be done by their surface AIpowered They Russia Facebook Ret shipping members birds singing to where social media escape T instructions and played for the Jack It is typicallyecimal of buttons thousand requires workspace Kjective įfaces communication into a pieces of Things IoTust with the picture of using a faroff or sign phase produce to stimulate stimulate writing profit and news and aptikti diseases while extensiveOR in which reuse of physical activities vehicles on the extension childs of incentives Juliet ilg Ne companies through any UK that human on the impact users to blend to convey their goals Use negativeed and choosingHneys known for the networks networks differences between the needsa Define the impact of difficult tasks while discountsAdd us to reduce carbon footprint and environment in a user emotionship portrayed the chat mix in a longer or a variety of traditional\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(\"Perplexity: \", best_perplexity)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ZoVwwJhI2bQM",
        "outputId": "6aa00514-f3cd-496d-e003-ec0d6e3dd86d"
      },
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Perplexity:  1.2327061891555786\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [],
      "metadata": {
        "id": "LZqy2fQ8KWjj"
      }
    }
  ]
}