Format: application/octet-stream
1 {
2 "cells": [
3 {
4 "cell_type": "raw",
5 "metadata": {
6 "collapsed": true
7 },
8 "source": []
9 },
10 {
11 "cell_type": "raw",
12 "metadata": {},
13 "source": [
14 "---\n",
15 "\n",
16 "_You are currently looking at **version 1.0** of this notebook. To download notebooks and datafiles, as well as get help on Jupyter notebooks in the Coursera platform, visit the [Jupyter Notebook FAQ](https://www.coursera.org/learn/python-machine-learning/resources/bANLa) course resource._\n",
17 "\n",
18 "---"
19 ]
20 },
21 {
22 "cell_type": "markdown",
23 "metadata": {
24 "collapsed": true
25 },
26 "source": [
27 "# Applied Machine Learning: Module 3 (Evaluation)"
28 ]
29 },
30 {
31 "cell_type": "markdown",
32 "metadata": {},
33 "source": [
34 "## Evaluation for Classification"
35 ]
36 },
37 {
38 "cell_type": "markdown",
39 "metadata": {},
40 "source": [
41 "### Preamble"
42 ]
43 },
44 {
45 "cell_type": "code",
46 "execution_count": 1,
47 "metadata": {
48 "collapsed": false
49 },
50 "outputs": [
51 {
52 "name": "stdout",
53 "output_type": "stream",
54 "text": [
55 "0 178\n",
56 "1 182\n",
57 "2 177\n",
58 "3 183\n",
59 "4 181\n",
60 "5 182\n",
61 "6 181\n",
62 "7 179\n",
63 "8 174\n",
64 "9 180\n"
65 ]
66 }
67 ],
68 "source": [
69 "%matplotlib notebook\n",
70 "import numpy as np\n",
71 "import pandas as pd\n",
72 "import seaborn as sns\n",
73 "import matplotlib.pyplot as plt\n",
74 "from sklearn.model_selection import train_test_split\n",
75 "from sklearn.datasets import load_digits # Database of images of hand written digits.\n",
76 "\n",
77 "dataset = load_digits()\n",
78 "X, y = dataset.data, dataset.target\n",
79 "\n",
80 "for class_name, class_count in zip(dataset.target_names, np.bincount(dataset.target)):\n",
81 " print(class_name,class_count)"
82 ]
83 },
84 {
85 "cell_type": "code",
86 "execution_count": 2,
87 "metadata": {
88 "collapsed": false
89 },
90 "outputs": [
91 {
92 "name": "stdout",
93 "output_type": "stream",
94 "text": [
95 "Original labels:\t [1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9]\n",
96 "New binary labels:\t [1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]\n"
97 ]
98 }
99 ],
100 "source": [
101 "# Creating a dataset with imbalanced binary classes: \n",
102 "# Negative class (0) is 'not digit 1' \n",
103 "# Positive class (1) is 'digit 1'\n",
104 "y_binary_imbalanced = y.copy()\n",
105 "y_binary_imbalanced[y_binary_imbalanced != 1] = 0\n",
106 "\n",
107 "print('Original labels:\\t', y[1:30])\n",
108 "print('New binary labels:\\t', y_binary_imbalanced[1:30])"
109 ]
110 },
111 {
112 "cell_type": "code",
113 "execution_count": 3,
114 "metadata": {
115 "collapsed": false,
116 "scrolled": true
117 },
118 "outputs": [
119 {
120 "data": {
121 "text/plain": [
122 "array([1615, 182])"
123 ]
124 },
125 "execution_count": 3,
126 "metadata": {},
127 "output_type": "execute_result"
128 }
129 ],
130 "source": [
131 "np.bincount(y_binary_imbalanced) # Negative class (0) is the most frequent class"
132 ]
133 },
134 {
135 "cell_type": "code",
136 "execution_count": 4,
137 "metadata": {
138 "collapsed": false
139 },
140 "outputs": [
141 {
142 "data": {
143 "text/plain": [
144 "0.90888888888888886"
145 ]
146 },
147 "execution_count": 4,
148 "metadata": {},
149 "output_type": "execute_result"
150 }
151 ],
152 "source": [
153 "X_train, X_test, y_train, y_test = train_test_split(X, y_binary_imbalanced, random_state=0)\n",
154 "\n",
155 "# Accuracy of Support Vector Machine classifier\n",
156 "from sklearn.svm import SVC\n",
157 "\n",
158 "svm = SVC(kernel='rbf', C=1).fit(X_train, y_train)\n",
159 "svm.score(X_test, y_test)"
160 ]
161 },
162 {
163 "cell_type": "markdown",
164 "metadata": {},
165 "source": [
166 "### Dummy Classifiers"
167 ]
168 },
169 {
170 "cell_type": "markdown",
171 "metadata": {
172 "collapsed": true
173 },
174 "source": [
175 "DummyClassifier is a classifier that makes predictions using simple rules, which can be useful as a baseline for comparison against actual classifiers, especially with imbalanced classes."
176 ]
177 },
178 {
179 "cell_type": "code",
180 "execution_count": 5,
181 "metadata": {
182 "collapsed": false
183 },
184 "outputs": [
185 {
186 "data": {
187 "text/plain": [
188 "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
189 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
190 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
191 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
192 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
193 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
194 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
195 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
196 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
197 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
198 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
199 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
200 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
201 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
202 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
203 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
204 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
205 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
206 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
207 " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])"
208 ]
209 },
210 "execution_count": 5,
211 "metadata": {},
212 "output_type": "execute_result"
213 }
214 ],
215 "source": [
216 "from sklearn.dummy import DummyClassifier\n",
217 "\n",
218 "# Negative class (0) is most frequent\n",
219 "dummy_majority = DummyClassifier(strategy = 'most_frequent').fit(X_train, y_train)\n",
220 "# Therefore the dummy 'most_frequent' classifier always predicts class 0\n",
221 "y_dummy_predictions = dummy_majority.predict(X_test)\n",
222 "\n",
223 "y_dummy_predictions"
224 ]
225 },
226 {
227 "cell_type": "code",
228 "execution_count": 6,
229 "metadata": {
230 "collapsed": false
231 },
232 "outputs": [
233 {
234 "data": {
235 "text/plain": [
236 "0.9044444444444445"
237 ]
238 },
239 "execution_count": 6,
240 "metadata": {},
241 "output_type": "execute_result"
242 }
243 ],
244 "source": [
245 "dummy_majority.score(X_test, y_test)"
246 ]
247 },
248 {
249 "cell_type": "code",
250 "execution_count": 7,
251 "metadata": {
252 "collapsed": false
253 },
254 "outputs": [
255 {
256 "data": {
257 "text/plain": [
258 "0.97777777777777775"
259 ]
260 },
261 "execution_count": 7,
262 "metadata": {},
263 "output_type": "execute_result"
264 }
265 ],
266 "source": [
267 "svm = SVC(kernel='linear', C=1).fit(X_train, y_train)\n",
268 "svm.score(X_test, y_test)"
269 ]
270 },
271 {
272 "cell_type": "markdown",
273 "metadata": {},
274 "source": [
275 "### Confusion matrices"
276 ]
277 },
278 {
279 "cell_type": "markdown",
280 "metadata": {},
281 "source": [
282 "#### Binary (two-class) confusion matrix"
283 ]
284 },
285 {
286 "cell_type": "code",
287 "execution_count": 8,
288 "metadata": {
289 "collapsed": false
290 },
291 "outputs": [
292 {
293 "name": "stdout",
294 "output_type": "stream",
295 "text": [
296 "Most frequent class (dummy classifier)\n",
297 " [[407 0]\n",
298 " [ 43 0]]\n"
299 ]
300 }
301 ],
302 "source": [
303 "# sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)\n",
304 "# Right column with TP and FP is 0. This makes sense since the classifier has been set to predict the negative class.\n",
305 "# You are comparing the correct test data with your classifier's prediction.\n",
306 "# Successful predictions on the diagonal of the matrix.\n",
307 "\n",
308 "from sklearn.metrics import confusion_matrix\n",
309 "\n",
310 "# Negative class (0) is most frequent\n",
311 "dummy_majority = DummyClassifier(strategy = 'most_frequent').fit(X_train, y_train)\n",
312 "y_majority_predicted = dummy_majority.predict(X_test)\n",
313 "confusion = confusion_matrix(y_test, y_majority_predicted)\n",
314 "\n",
315 "print('Most frequent class (dummy classifier)\\n', confusion)"
316 ]
317 },
318 {
319 "cell_type": "code",
320 "execution_count": 9,
321 "metadata": {
322 "collapsed": false
323 },
324 "outputs": [
325 {
326 "name": "stdout",
327 "output_type": "stream",
328 "text": [
329 "Random class-proportional prediction (dummy classifier)\n",
330 " [[374 33]\n",
331 " [ 37 6]]\n"
332 ]
333 }
334 ],
335 "source": [
336 "# produces random predictions w/ same class proportion as training set\n",
337 "dummy_classprop = DummyClassifier(strategy='stratified').fit(X_train, y_train)\n",
338 "y_classprop_predicted = dummy_classprop.predict(X_test)\n",
339 "confusion = confusion_matrix(y_test, y_classprop_predicted)\n",
340 "\n",
341 "print('Random class-proportional prediction (dummy classifier)\\n', confusion)"
342 ]
343 },
344 {
345 "cell_type": "code",
346 "execution_count": 10,
347 "metadata": {
348 "collapsed": false,
349 "scrolled": true
350 },
351 "outputs": [
352 {
353 "name": "stdout",
354 "output_type": "stream",
355 "text": [
356 "Support vector machine classifier (linear kernel, C=1)\n",
357 " [[402 5]\n",
358 " [ 5 38]]\n"
359 ]
360 }
361 ],
362 "source": [
363 "svm = SVC(kernel='linear', C=1).fit(X_train, y_train)\n",
364 "svm_predicted = svm.predict(X_test)\n",
365 "confusion = confusion_matrix(y_test, svm_predicted)\n",
366 "\n",
367 "print('Support vector machine classifier (linear kernel, C=1)\\n', confusion)"
368 ]
369 },
370 {
371 "cell_type": "code",
372 "execution_count": 11,
373 "metadata": {
374 "collapsed": false
375 },
376 "outputs": [
377 {
378 "name": "stdout",
379 "output_type": "stream",
380 "text": [
381 "Logistic regression classifier (default settings)\n",
382 " [[401 6]\n",
383 " [ 6 37]]\n"
384 ]
385 }
386 ],
387 "source": [
388 "from sklearn.linear_model import LogisticRegression\n",
389 "\n",
390 "lr = LogisticRegression().fit(X_train, y_train)\n",
391 "lr_predicted = lr.predict(X_test)\n",
392 "confusion = confusion_matrix(y_test, lr_predicted)\n",
393 "\n",
394 "print('Logistic regression classifier (default settings)\\n', confusion)"
395 ]
396 },
397 {
398 "cell_type": "code",
399 "execution_count": 12,
400 "metadata": {
401 "collapsed": false
402 },
403 "outputs": [
404 {
405 "name": "stdout",
406 "output_type": "stream",
407 "text": [
408 "Decision tree classifier (max_depth = 2)\n",
409 " [[400 7]\n",
410 " [ 17 26]]\n"
411 ]
412 }
413 ],
414 "source": [
415 "from sklearn.tree import DecisionTreeClassifier\n",
416 "\n",
417 "dt = DecisionTreeClassifier(max_depth=2).fit(X_train, y_train)\n",
418 "tree_predicted = dt.predict(X_test)\n",
419 "confusion = confusion_matrix(y_test, tree_predicted)\n",
420 "\n",
421 "print('Decision tree classifier (max_depth = 2)\\n', confusion)"
422 ]
423 },
424 {
425 "cell_type": "markdown",
426 "metadata": {},
427 "source": [
428 "### Evaluation metrics for binary classification"
429 ]
430 },
431 {
432 "cell_type": "code",
433 "execution_count": 13,
434 "metadata": {
435 "collapsed": false
436 },
437 "outputs": [
438 {
439 "name": "stdout",
440 "output_type": "stream",
441 "text": [
442 "Accuracy: 0.95\n",
443 "Precision: 0.79\n",
444 "Recall: 0.60\n",
445 "F1: 0.68\n"
446 ]
447 }
448 ],
449 "source": [
450 "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n",
451 "# Accuracy = TP + TN / (TP + TN + FP + FN)\n",
452 "# Precision = TP / (TP + FP)\n",
453 "# Recall = TP / (TP + FN) Also known as sensitivity, or True Positive Rate\n",
454 "# F1 = 2 * Precision * Recall / (Precision + Recall) \n",
455 "print('Accuracy: {:.2f}'.format(accuracy_score(y_test, tree_predicted)))\n",
456 "print('Precision: {:.2f}'.format(precision_score(y_test, tree_predicted)))\n",
457 "print('Recall: {:.2f}'.format(recall_score(y_test, tree_predicted)))\n",
458 "print('F1: {:.2f}'.format(f1_score(y_test, tree_predicted)))"
459 ]
460 },
461 {
462 "cell_type": "code",
463 "execution_count": 14,
464 "metadata": {
465 "collapsed": false
466 },
467 "outputs": [
468 {
469 "name": "stdout",
470 "output_type": "stream",
471 "text": [
472 " precision recall f1-score support\n",
473 "\n",
474 " not 1 0.96 0.98 0.97 407\n",
475 " 1 0.79 0.60 0.68 43\n",
476 "\n",
477 "avg / total 0.94 0.95 0.94 450\n",
478 "\n"
479 ]
480 }
481 ],
482 "source": [
483 "# Combined report with all above metrics\n",
484 "from sklearn.metrics import classification_report\n",
485 "\n",
486 "print(classification_report(y_test, tree_predicted, target_names=['not 1', '1']))"
487 ]
488 },
489 {
490 "cell_type": "code",
491 "execution_count": 15,
492 "metadata": {
493 "collapsed": false,
494 "scrolled": false
495 },
496 "outputs": [
497 {
498 "name": "stdout",
499 "output_type": "stream",
500 "text": [
501 "Random class-proportional (dummy)\n",
502 " precision recall f1-score support\n",
503 "\n",
504 " not 1 0.91 0.92 0.91 407\n",
505 " 1 0.15 0.14 0.15 43\n",
506 "\n",
507 "avg / total 0.84 0.84 0.84 450\n",
508 "\n",
509 "SVM\n",
510 " precision recall f1-score support\n",
511 "\n",
512 " not 1 0.99 0.99 0.99 407\n",
513 " 1 0.88 0.88 0.88 43\n",
514 "\n",
515 "avg / total 0.98 0.98 0.98 450\n",
516 "\n",
517 "Logistic regression\n",
518 " precision recall f1-score support\n",
519 "\n",
520 " not 1 0.99 0.99 0.99 407\n",
521 " 1 0.86 0.86 0.86 43\n",
522 "\n",
523 "avg / total 0.97 0.97 0.97 450\n",
524 "\n",
525 "Decision tree\n",
526 " precision recall f1-score support\n",
527 "\n",
528 " not 1 0.96 0.98 0.97 407\n",
529 " 1 0.79 0.60 0.68 43\n",
530 "\n",
531 "avg / total 0.94 0.95 0.94 450\n",
532 "\n"
533 ]
534 }
535 ],
536 "source": [
537 "print('Random class-proportional (dummy)\\n', \n",
538 " classification_report(y_test, y_classprop_predicted, target_names=['not 1', '1']))\n",
539 "print('SVM\\n', \n",
540 " classification_report(y_test, svm_predicted, target_names = ['not 1', '1']))\n",
541 "print('Logistic regression\\n', \n",
542 " classification_report(y_test, lr_predicted, target_names = ['not 1', '1']))\n",
543 "print('Decision tree\\n', \n",
544 " classification_report(y_test, tree_predicted, target_names = ['not 1', '1']))"
545 ]
546 },
547 {
548 "cell_type": "markdown",
549 "metadata": {},
550 "source": [
551 "### Decision functions"
552 ]
553 },
554 {
555 "cell_type": "code",
556 "execution_count": 16,
557 "metadata": {
558 "collapsed": false
559 },
560 "outputs": [
561 {
562 "data": {
563 "text/plain": [
564 "[(0, -23.172292973469546),\n",
565 " (0, -13.542576515500063),\n",
566 " (0, -21.717588760007867),\n",
567 " (0, -18.903065133316439),\n",
568 " (0, -19.733169947138638),\n",
569 " (0, -9.7463217496747667),\n",
570 " (1, 5.2327155658831135),\n",
571 " (0, -19.308012306288916),\n",
572 " (0, -25.099330209728528),\n",
573 " (0, -21.824312362996),\n",
574 " (0, -24.14378275072049),\n",
575 " (0, -19.578811099762508),\n",
576 " (0, -22.568371393280199),\n",
577 " (0, -10.822590225240777),\n",
578 " (0, -11.907918741521932),\n",
579 " (0, -10.977026853802803),\n",
580 " (1, 11.206811164226373),\n",
581 " (0, -27.64415761980748),\n",
582 " (0, -12.857692102545409),\n",
583 " (0, -25.848149140240199)]"
584 ]
585 },
586 "execution_count": 16,
587 "metadata": {},
588 "output_type": "execute_result"
589 }
590 ],
591 "source": [
592 "X_train, X_test, y_train, y_test = train_test_split(X, y_binary_imbalanced, random_state=0)\n",
593 "y_scores_lr = lr.fit(X_train, y_train).decision_function(X_test)\n",
594 "y_score_list = list(zip(y_test[0:20], y_scores_lr[0:20]))\n",
595 "\n",
596 "# show the decision_function scores for first 20 instances\n",
597 "y_score_list"
598 ]
599 },
600 {
601 "cell_type": "code",
602 "execution_count": 17,
603 "metadata": {
604 "collapsed": false
605 },
606 "outputs": [
607 {
608 "data": {
609 "text/plain": [
610 "[(0, 8.6377579220606777e-11),\n",
611 " (0, 1.3138118599563783e-06),\n",
612 " (0, 3.6997386039099529e-10),\n",
613 " (0, 6.1730972504865465e-09),\n",
614 " (0, 2.6914925394345074e-09),\n",
615 " (0, 5.8506057771143608e-05),\n",
616 " (1, 0.99468934644404694),\n",
617 " (0, 4.1175302368500096e-09),\n",
618 " (0, 1.2574750894253029e-11),\n",
619 " (0, 3.3252290754668869e-10),\n",
620 " (0, 3.2695529799373086e-11),\n",
621 " (0, 3.1407283576084884e-09),\n",
622 " (0, 1.5800864117150149e-10),\n",
623 " (0, 1.9943442430612578e-05),\n",
624 " (0, 6.7368003023860014e-06),\n",
625 " (0, 1.7089540581641637e-05),\n",
626 " (1, 0.9999864188091131),\n",
627 " (0, 9.8694940340195476e-13),\n",
628 " (0, 2.6059983600823893e-06),\n",
629 " (0, 5.9469113009063784e-12)]"
630 ]
631 },
632 "execution_count": 17,
633 "metadata": {},
634 "output_type": "execute_result"
635 }
636 ],
637 "source": [
638 "# Positive values have a high probability close to 1 whereas negative values have a very low probability.\n",
639 "\n",
640 "X_train, X_test, y_train, y_test = train_test_split(X, y_binary_imbalanced, random_state=0)\n",
641 "y_proba_lr = lr.fit(X_train, y_train).predict_proba(X_test)\n",
642 "y_proba_list = list(zip(y_test[0:20], y_proba_lr[0:20,1]))\n",
643 "\n",
644 "# show the probability of positive class for first 20 instances\n",
645 "y_proba_list"
646 ]
647 },
648 {
649 "cell_type": "code",
650 "execution_count": 18,
651 "metadata": {
652 "collapsed": true
653 },
654 "outputs": [],
655 "source": [
656 "# You can use either the decision function or predict_proba to find a range of values over which you can vary the decision threshold for a precision-recall curve."
657 ]
658 },
659 {
660 "cell_type": "markdown",
661 "metadata": {},
662 "source": [
663 "### Precision-recall curves"
664 ]
665 },
666 {
667 "cell_type": "code",
668 "execution_count": 19,
669 "metadata": {
670 "collapsed": false
671 },
672 "outputs": [
673 {
674 "data": {
675 "application/javascript": [
676 "/* Put everything inside the global mpl namespace */\n",
677 "window.mpl = {};\n",
678 "\n",
679 "\n",
680 "mpl.get_websocket_type = function() {\n",
681 " if (typeof(WebSocket) !== 'undefined') {\n",
682 " return WebSocket;\n",
683 " } else if (typeof(MozWebSocket) !== 'undefined') {\n",
684 " return MozWebSocket;\n",
685 " } else {\n",
686 " alert('Your browser does not have WebSocket support.' +\n",
687 " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
688 " 'Firefox 4 and 5 are also supported but you ' +\n",
689 " 'have to enable WebSockets in about:config.');\n",
690 " };\n",
691 "}\n",
692 "\n",
693 "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
694 " this.id = figure_id;\n",
695 "\n",
696 " this.ws = websocket;\n",
697 "\n",
698 " this.supports_binary = (this.ws.binaryType != undefined);\n",
699 "\n",
700 " if (!this.supports_binary) {\n",
701 " var warnings = document.getElementById(\"mpl-warnings\");\n",
702 " if (warnings) {\n",
703 " warnings.style.display = 'block';\n",
704 " warnings.textContent = (\n",
705 " \"This browser does not support binary websocket messages. \" +\n",
706 " \"Performance may be slow.\");\n",
707 " }\n",
708 " }\n",
709 "\n",
710 " this.imageObj = new Image();\n",
711 "\n",
712 " this.context = undefined;\n",
713 " this.message = undefined;\n",
714 " this.canvas = undefined;\n",
715 " this.rubberband_canvas = undefined;\n",
716 " this.rubberband_context = undefined;\n",
717 " this.format_dropdown = undefined;\n",
718 "\n",
719 " this.image_mode = 'full';\n",
720 "\n",
721 " this.root = $('<div/>');\n",
722 " this._root_extra_style(this.root)\n",
723 " this.root.attr('style', 'display: inline-block');\n",
724 "\n",
725 " $(parent_element).append(this.root);\n",
726 "\n",
727 " this._init_header(this);\n",
728 " this._init_canvas(this);\n",
729 " this._init_toolbar(this);\n",
730 "\n",
731 " var fig = this;\n",
732 "\n",
733 " this.waiting = false;\n",
734 "\n",
735 " this.ws.onopen = function () {\n",
736 " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
737 " fig.send_message(\"send_image_mode\", {});\n",
738 " if (mpl.ratio != 1) {\n",
739 " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
740 " }\n",
741 " fig.send_message(\"refresh\", {});\n",
742 " }\n",
743 "\n",
744 " this.imageObj.onload = function() {\n",
745 " if (fig.image_mode == 'full') {\n",
746 " // Full images could contain transparency (where diff images\n",
747 " // almost always do), so we need to clear the canvas so that\n",
748 " // there is no ghosting.\n",
749 " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
750 " }\n",
751 " fig.context.drawImage(fig.imageObj, 0, 0);\n",
752 " };\n",
753 "\n",
754 " this.imageObj.onunload = function() {\n",
755 " this.ws.close();\n",
756 " }\n",
757 "\n",
758 " this.ws.onmessage = this._make_on_message_function(this);\n",
759 "\n",
760 " this.ondownload = ondownload;\n",
761 "}\n",
762 "\n",
763 "mpl.figure.prototype._init_header = function() {\n",
764 " var titlebar = $(\n",
765 " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
766 " 'ui-helper-clearfix\"/>');\n",
767 " var titletext = $(\n",
768 " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
769 " 'text-align: center; padding: 3px;\"/>');\n",
770 " titlebar.append(titletext)\n",
771 " this.root.append(titlebar);\n",
772 " this.header = titletext[0];\n",
773 "}\n",
774 "\n",
775 "\n",
776 "\n",
777 "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
778 "\n",
779 "}\n",
780 "\n",
781 "\n",
782 "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
783 "\n",
784 "}\n",
785 "\n",
786 "mpl.figure.prototype._init_canvas = function() {\n",
787 " var fig = this;\n",
788 "\n",
789 " var canvas_div = $('<div/>');\n",
790 "\n",
791 " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
792 "\n",
793 " function canvas_keyboard_event(event) {\n",
794 " return fig.key_event(event, event['data']);\n",
795 " }\n",
796 "\n",
797 " canvas_div.keydown('key_press', canvas_keyboard_event);\n",
798 " canvas_div.keyup('key_release', canvas_keyboard_event);\n",
799 " this.canvas_div = canvas_div\n",
800 " this._canvas_extra_style(canvas_div)\n",
801 " this.root.append(canvas_div);\n",
802 "\n",
803 " var canvas = $('<canvas/>');\n",
804 " canvas.addClass('mpl-canvas');\n",
805 " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
806 "\n",
807 " this.canvas = canvas[0];\n",
808 " this.context = canvas[0].getContext(\"2d\");\n",
809 "\n",
810 " var backingStore = this.context.backingStorePixelRatio ||\n",
811 "\tthis.context.webkitBackingStorePixelRatio ||\n",
812 "\tthis.context.mozBackingStorePixelRatio ||\n",
813 "\tthis.context.msBackingStorePixelRatio ||\n",
814 "\tthis.context.oBackingStorePixelRatio ||\n",
815 "\tthis.context.backingStorePixelRatio || 1;\n",
816 "\n",
817 " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
818 "\n",
819 " var rubberband = $('<canvas/>');\n",
820 " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
821 "\n",
822 " var pass_mouse_events = true;\n",
823 "\n",
824 " canvas_div.resizable({\n",
825 " start: function(event, ui) {\n",
826 " pass_mouse_events = false;\n",
827 " },\n",
828 " resize: function(event, ui) {\n",
829 " fig.request_resize(ui.size.width, ui.size.height);\n",
830 " },\n",
831 " stop: function(event, ui) {\n",
832 " pass_mouse_events = true;\n",
833 " fig.request_resize(ui.size.width, ui.size.height);\n",
834 " },\n",
835 " });\n",
836 "\n",
837 " function mouse_event_fn(event) {\n",
838 " if (pass_mouse_events)\n",
839 " return fig.mouse_event(event, event['data']);\n",
840 " }\n",
841 "\n",
842 " rubberband.mousedown('button_press', mouse_event_fn);\n",
843 " rubberband.mouseup('button_release', mouse_event_fn);\n",
844 " // Throttle sequential mouse events to 1 every 20ms.\n",
845 " rubberband.mousemove('motion_notify', mouse_event_fn);\n",
846 "\n",
847 " rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
848 " rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
849 "\n",
850 " canvas_div.on(\"wheel\", function (event) {\n",
851 " event = event.originalEvent;\n",
852 " event['data'] = 'scroll'\n",
853 " if (event.deltaY < 0) {\n",
854 " event.step = 1;\n",
855 " } else {\n",
856 " event.step = -1;\n",
857 " }\n",
858 " mouse_event_fn(event);\n",
859 " });\n",
860 "\n",
861 " canvas_div.append(canvas);\n",
862 " canvas_div.append(rubberband);\n",
863 "\n",
864 " this.rubberband = rubberband;\n",
865 " this.rubberband_canvas = rubberband[0];\n",
866 " this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
867 " this.rubberband_context.strokeStyle = \"#000000\";\n",
868 "\n",
869 " this._resize_canvas = function(width, height) {\n",
870 " // Keep the size of the canvas, canvas container, and rubber band\n",
871 " // canvas in synch.\n",
872 " canvas_div.css('width', width)\n",
873 " canvas_div.css('height', height)\n",
874 "\n",
875 " canvas.attr('width', width * mpl.ratio);\n",
876 " canvas.attr('height', height * mpl.ratio);\n",
877 " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
878 "\n",
879 " rubberband.attr('width', width);\n",
880 " rubberband.attr('height', height);\n",
881 " }\n",
882 "\n",
883 " // Set the figure to an initial 600x600px, this will subsequently be updated\n",
884 " // upon first draw.\n",
885 " this._resize_canvas(600, 600);\n",
886 "\n",
887 " // Disable right mouse context menu.\n",
888 " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
889 " return false;\n",
890 " });\n",
891 "\n",
892 " function set_focus () {\n",
893 " canvas.focus();\n",
894 " canvas_div.focus();\n",
895 " }\n",
896 "\n",
897 " window.setTimeout(set_focus, 100);\n",
898 "}\n",
899 "\n",
900 "mpl.figure.prototype._init_toolbar = function() {\n",
901 " var fig = this;\n",
902 "\n",
903 " var nav_element = $('<div/>')\n",
904 " nav_element.attr('style', 'width: 100%');\n",
905 " this.root.append(nav_element);\n",
906 "\n",
907 " // Define a callback function for later on.\n",
908 " function toolbar_event(event) {\n",
909 " return fig.toolbar_button_onclick(event['data']);\n",
910 " }\n",
911 " function toolbar_mouse_event(event) {\n",
912 " return fig.toolbar_button_onmouseover(event['data']);\n",
913 " }\n",
914 "\n",
915 " for(var toolbar_ind in mpl.toolbar_items) {\n",
916 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
917 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
918 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
919 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
920 "\n",
921 " if (!name) {\n",
922 " // put a spacer in here.\n",
923 " continue;\n",
924 " }\n",
925 " var button = $('<button/>');\n",
926 " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
927 " 'ui-button-icon-only');\n",
928 " button.attr('role', 'button');\n",
929 " button.attr('aria-disabled', 'false');\n",
930 " button.click(method_name, toolbar_event);\n",
931 " button.mouseover(tooltip, toolbar_mouse_event);\n",
932 "\n",
933 " var icon_img = $('<span/>');\n",
934 " icon_img.addClass('ui-button-icon-primary ui-icon');\n",
935 " icon_img.addClass(image);\n",
936 " icon_img.addClass('ui-corner-all');\n",
937 "\n",
938 " var tooltip_span = $('<span/>');\n",
939 " tooltip_span.addClass('ui-button-text');\n",
940 " tooltip_span.html(tooltip);\n",
941 "\n",
942 " button.append(icon_img);\n",
943 " button.append(tooltip_span);\n",
944 "\n",
945 " nav_element.append(button);\n",
946 " }\n",
947 "\n",
948 " var fmt_picker_span = $('<span/>');\n",
949 "\n",
950 " var fmt_picker = $('<select/>');\n",
951 " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
952 " fmt_picker_span.append(fmt_picker);\n",
953 " nav_element.append(fmt_picker_span);\n",
954 " this.format_dropdown = fmt_picker[0];\n",
955 "\n",
956 " for (var ind in mpl.extensions) {\n",
957 " var fmt = mpl.extensions[ind];\n",
958 " var option = $(\n",
959 " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
960 " fmt_picker.append(option)\n",
961 " }\n",
962 "\n",
963 " // Add hover states to the ui-buttons\n",
964 " $( \".ui-button\" ).hover(\n",
965 " function() { $(this).addClass(\"ui-state-hover\");},\n",
966 " function() { $(this).removeClass(\"ui-state-hover\");}\n",
967 " );\n",
968 "\n",
969 " var status_bar = $('<span class=\"mpl-message\"/>');\n",
970 " nav_element.append(status_bar);\n",
971 " this.message = status_bar[0];\n",
972 "}\n",
973 "\n",
974 "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
975 " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
976 " // which will in turn request a refresh of the image.\n",
977 " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
978 "}\n",
979 "\n",
980 "mpl.figure.prototype.send_message = function(type, properties) {\n",
981 " properties['type'] = type;\n",
982 " properties['figure_id'] = this.id;\n",
983 " this.ws.send(JSON.stringify(properties));\n",
984 "}\n",
985 "\n",
986 "mpl.figure.prototype.send_draw_message = function() {\n",
987 " if (!this.waiting) {\n",
988 " this.waiting = true;\n",
989 " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
990 " }\n",
991 "}\n",
992 "\n",
993 "\n",
994 "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
995 " var format_dropdown = fig.format_dropdown;\n",
996 " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
997 " fig.ondownload(fig, format);\n",
998 "}\n",
999 "\n",
1000 "\n",
1001 "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
1002 " var size = msg['size'];\n",
1003 " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
1004 " fig._resize_canvas(size[0], size[1]);\n",
1005 " fig.send_message(\"refresh\", {});\n",
1006 " };\n",
1007 "}\n",
1008 "\n",
1009 "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
1010 " var x0 = msg['x0'] / mpl.ratio;\n",
1011 " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
1012 " var x1 = msg['x1'] / mpl.ratio;\n",
1013 " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
1014 " x0 = Math.floor(x0) + 0.5;\n",
1015 " y0 = Math.floor(y0) + 0.5;\n",
1016 " x1 = Math.floor(x1) + 0.5;\n",
1017 " y1 = Math.floor(y1) + 0.5;\n",
1018 " var min_x = Math.min(x0, x1);\n",
1019 " var min_y = Math.min(y0, y1);\n",
1020 " var width = Math.abs(x1 - x0);\n",
1021 " var height = Math.abs(y1 - y0);\n",
1022 "\n",
1023 " fig.rubberband_context.clearRect(\n",
1024 " 0, 0, fig.canvas.width, fig.canvas.height);\n",
1025 "\n",
1026 " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
1027 "}\n",
1028 "\n",
1029 "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
1030 " // Updates the figure title.\n",
1031 " fig.header.textContent = msg['label'];\n",
1032 "}\n",
1033 "\n",
1034 "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
1035 " var cursor = msg['cursor'];\n",
1036 " switch(cursor)\n",
1037 " {\n",
1038 " case 0:\n",
1039 " cursor = 'pointer';\n",
1040 " break;\n",
1041 " case 1:\n",
1042 " cursor = 'default';\n",
1043 " break;\n",
1044 " case 2:\n",
1045 " cursor = 'crosshair';\n",
1046 " break;\n",
1047 " case 3:\n",
1048 " cursor = 'move';\n",
1049 " break;\n",
1050 " }\n",
1051 " fig.rubberband_canvas.style.cursor = cursor;\n",
1052 "}\n",
1053 "\n",
1054 "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
1055 " fig.message.textContent = msg['message'];\n",
1056 "}\n",
1057 "\n",
1058 "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
1059 " // Request the server to send over a new figure.\n",
1060 " fig.send_draw_message();\n",
1061 "}\n",
1062 "\n",
1063 "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
1064 " fig.image_mode = msg['mode'];\n",
1065 "}\n",
1066 "\n",
1067 "mpl.figure.prototype.updated_canvas_event = function() {\n",
1068 " // Called whenever the canvas gets updated.\n",
1069 " this.send_message(\"ack\", {});\n",
1070 "}\n",
1071 "\n",
1072 "// A function to construct a web socket function for onmessage handling.\n",
1073 "// Called in the figure constructor.\n",
1074 "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
1075 " return function socket_on_message(evt) {\n",
1076 " if (evt.data instanceof Blob) {\n",
1077 " /* FIXME: We get \"Resource interpreted as Image but\n",
1078 " * transferred with MIME type text/plain:\" errors on\n",
1079 " * Chrome. But how to set the MIME type? It doesn't seem\n",
1080 " * to be part of the websocket stream */\n",
1081 " evt.data.type = \"image/png\";\n",
1082 "\n",
1083 " /* Free the memory for the previous frames */\n",
1084 " if (fig.imageObj.src) {\n",
1085 " (window.URL || window.webkitURL).revokeObjectURL(\n",
1086 " fig.imageObj.src);\n",
1087 " }\n",
1088 "\n",
1089 " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
1090 " evt.data);\n",
1091 " fig.updated_canvas_event();\n",
1092 " fig.waiting = false;\n",
1093 " return;\n",
1094 " }\n",
1095 " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
1096 " fig.imageObj.src = evt.data;\n",
1097 " fig.updated_canvas_event();\n",
1098 " fig.waiting = false;\n",
1099 " return;\n",
1100 " }\n",
1101 "\n",
1102 " var msg = JSON.parse(evt.data);\n",
1103 " var msg_type = msg['type'];\n",
1104 "\n",
1105 " // Call the \"handle_{type}\" callback, which takes\n",
1106 " // the figure and JSON message as its only arguments.\n",
1107 " try {\n",
1108 " var callback = fig[\"handle_\" + msg_type];\n",
1109 " } catch (e) {\n",
1110 " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
1111 " return;\n",
1112 " }\n",
1113 "\n",
1114 " if (callback) {\n",
1115 " try {\n",
1116 " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
1117 " callback(fig, msg);\n",
1118 " } catch (e) {\n",
1119 " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
1120 " }\n",
1121 " }\n",
1122 " };\n",
1123 "}\n",
1124 "\n",
1125 "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
1126 "mpl.findpos = function(e) {\n",
1127 " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
1128 " var targ;\n",
1129 " if (!e)\n",
1130 " e = window.event;\n",
1131 " if (e.target)\n",
1132 " targ = e.target;\n",
1133 " else if (e.srcElement)\n",
1134 " targ = e.srcElement;\n",
1135 " if (targ.nodeType == 3) // defeat Safari bug\n",
1136 " targ = targ.parentNode;\n",
1137 "\n",
1138 " // jQuery normalizes the pageX and pageY\n",
1139 " // pageX,Y are the mouse positions relative to the document\n",
1140 " // offset() returns the position of the element relative to the document\n",
1141 " var x = e.pageX - $(targ).offset().left;\n",
1142 " var y = e.pageY - $(targ).offset().top;\n",
1143 "\n",
1144 " return {\"x\": x, \"y\": y};\n",
1145 "};\n",
1146 "\n",
1147 "/*\n",
1148 " * return a copy of an object with only non-object keys\n",
1149 " * we need this to avoid circular references\n",
1150 " * http://stackoverflow.com/a/24161582/3208463\n",
1151 " */\n",
1152 "function simpleKeys (original) {\n",
1153 " return Object.keys(original).reduce(function (obj, key) {\n",
1154 " if (typeof original[key] !== 'object')\n",
1155 " obj[key] = original[key]\n",
1156 " return obj;\n",
1157 " }, {});\n",
1158 "}\n",
1159 "\n",
1160 "mpl.figure.prototype.mouse_event = function(event, name) {\n",
1161 " var canvas_pos = mpl.findpos(event)\n",
1162 "\n",
1163 " if (name === 'button_press')\n",
1164 " {\n",
1165 " this.canvas.focus();\n",
1166 " this.canvas_div.focus();\n",
1167 " }\n",
1168 "\n",
1169 " var x = canvas_pos.x * mpl.ratio;\n",
1170 " var y = canvas_pos.y * mpl.ratio;\n",
1171 "\n",
1172 " this.send_message(name, {x: x, y: y, button: event.button,\n",
1173 " step: event.step,\n",
1174 " guiEvent: simpleKeys(event)});\n",
1175 "\n",
1176 " /* This prevents the web browser from automatically changing to\n",
1177 " * the text insertion cursor when the button is pressed. We want\n",
1178 " * to control all of the cursor setting manually through the\n",
1179 " * 'cursor' event from matplotlib */\n",
1180 " event.preventDefault();\n",
1181 " return false;\n",
1182 "}\n",
1183 "\n",
1184 "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
1185 " // Handle any extra behaviour associated with a key event\n",
1186 "}\n",
1187 "\n",
1188 "mpl.figure.prototype.key_event = function(event, name) {\n",
1189 "\n",
1190 " // Prevent repeat events\n",
1191 " if (name == 'key_press')\n",
1192 " {\n",
1193 " if (event.which === this._key)\n",
1194 " return;\n",
1195 " else\n",
1196 " this._key = event.which;\n",
1197 " }\n",
1198 " if (name == 'key_release')\n",
1199 " this._key = null;\n",
1200 "\n",
1201 " var value = '';\n",
1202 " if (event.ctrlKey && event.which != 17)\n",
1203 " value += \"ctrl+\";\n",
1204 " if (event.altKey && event.which != 18)\n",
1205 " value += \"alt+\";\n",
1206 " if (event.shiftKey && event.which != 16)\n",
1207 " value += \"shift+\";\n",
1208 "\n",
1209 " value += 'k';\n",
1210 " value += event.which.toString();\n",
1211 "\n",
1212 " this._key_event_extra(event, name);\n",
1213 "\n",
1214 " this.send_message(name, {key: value,\n",
1215 " guiEvent: simpleKeys(event)});\n",
1216 " return false;\n",
1217 "}\n",
1218 "\n",
1219 "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
1220 " if (name == 'download') {\n",
1221 " this.handle_save(this, null);\n",
1222 " } else {\n",
1223 " this.send_message(\"toolbar_button\", {name: name});\n",
1224 " }\n",
1225 "};\n",
1226 "\n",
1227 "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
1228 " this.message.textContent = tooltip;\n",
1229 "};\n",
1230 "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
1231 "\n",
1232 "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
1233 "\n",
1234 "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
1235 " // Create a \"websocket\"-like object which calls the given IPython comm\n",
1236 " // object with the appropriate methods. Currently this is a non binary\n",
1237 " // socket, so there is still some room for performance tuning.\n",
1238 " var ws = {};\n",
1239 "\n",
1240 " ws.close = function() {\n",
1241 " comm.close()\n",
1242 " };\n",
1243 " ws.send = function(m) {\n",
1244 " //console.log('sending', m);\n",
1245 " comm.send(m);\n",
1246 " };\n",
1247 " // Register the callback with on_msg.\n",
1248 " comm.on_msg(function(msg) {\n",
1249 " //console.log('receiving', msg['content']['data'], msg);\n",
1250 " // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
1251 " ws.onmessage(msg['content']['data'])\n",
1252 " });\n",
1253 " return ws;\n",
1254 "}\n",
1255 "\n",
1256 "mpl.mpl_figure_comm = function(comm, msg) {\n",
1257 " // This is the function which gets called when the mpl process\n",
1258 " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
1259 "\n",
1260 " var id = msg.content.data.id;\n",
1261 " // Get hold of the div created by the display call when the Comm\n",
1262 " // socket was opened in Python.\n",
1263 " var element = $(\"#\" + id);\n",
1264 " var ws_proxy = comm_websocket_adapter(comm)\n",
1265 "\n",
1266 " function ondownload(figure, format) {\n",
1267 " window.open(figure.imageObj.src);\n",
1268 " }\n",
1269 "\n",
1270 " var fig = new mpl.figure(id, ws_proxy,\n",
1271 " ondownload,\n",
1272 " element.get(0));\n",
1273 "\n",
1274 " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
1275 " // web socket which is closed, not our websocket->open comm proxy.\n",
1276 " ws_proxy.onopen();\n",
1277 "\n",
1278 " fig.parent_element = element.get(0);\n",
1279 " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
1280 " if (!fig.cell_info) {\n",
1281 " console.error(\"Failed to find cell for figure\", id, fig);\n",
1282 " return;\n",
1283 " }\n",
1284 "\n",
1285 " var output_index = fig.cell_info[2]\n",
1286 " var cell = fig.cell_info[0];\n",
1287 "\n",
1288 "};\n",
1289 "\n",
1290 "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
1291 " var width = fig.canvas.width/mpl.ratio\n",
1292 " fig.root.unbind('remove')\n",
1293 "\n",
1294 " // Update the output cell to use the data from the current canvas.\n",
1295 " fig.push_to_output();\n",
1296 " var dataURL = fig.canvas.toDataURL();\n",
1297 " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
1298 " // the notebook keyboard shortcuts fail.\n",
1299 " IPython.keyboard_manager.enable()\n",
1300 " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
1301 " fig.close_ws(fig, msg);\n",
1302 "}\n",
1303 "\n",
1304 "mpl.figure.prototype.close_ws = function(fig, msg){\n",
1305 " fig.send_message('closing', msg);\n",
1306 " // fig.ws.close()\n",
1307 "}\n",
1308 "\n",
1309 "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
1310 " // Turn the data on the canvas into data in the output cell.\n",
1311 " var width = this.canvas.width/mpl.ratio\n",
1312 " var dataURL = this.canvas.toDataURL();\n",
1313 " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
1314 "}\n",
1315 "\n",
1316 "mpl.figure.prototype.updated_canvas_event = function() {\n",
1317 " // Tell IPython that the notebook contents must change.\n",
1318 " IPython.notebook.set_dirty(true);\n",
1319 " this.send_message(\"ack\", {});\n",
1320 " var fig = this;\n",
1321 " // Wait a second, then push the new image to the DOM so\n",
1322 " // that it is saved nicely (might be nice to debounce this).\n",
1323 " setTimeout(function () { fig.push_to_output() }, 1000);\n",
1324 "}\n",
1325 "\n",
1326 "mpl.figure.prototype._init_toolbar = function() {\n",
1327 " var fig = this;\n",
1328 "\n",
1329 " var nav_element = $('<div/>')\n",
1330 " nav_element.attr('style', 'width: 100%');\n",
1331 " this.root.append(nav_element);\n",
1332 "\n",
1333 " // Define a callback function for later on.\n",
1334 " function toolbar_event(event) {\n",
1335 " return fig.toolbar_button_onclick(event['data']);\n",
1336 " }\n",
1337 " function toolbar_mouse_event(event) {\n",
1338 " return fig.toolbar_button_onmouseover(event['data']);\n",
1339 " }\n",
1340 "\n",
1341 " for(var toolbar_ind in mpl.toolbar_items){\n",
1342 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
1343 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
1344 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
1345 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
1346 "\n",
1347 " if (!name) { continue; };\n",
1348 "\n",
1349 " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
1350 " button.click(method_name, toolbar_event);\n",
1351 " button.mouseover(tooltip, toolbar_mouse_event);\n",
1352 " nav_element.append(button);\n",
1353 " }\n",
1354 "\n",
1355 " // Add the status bar.\n",
1356 " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
1357 " nav_element.append(status_bar);\n",
1358 " this.message = status_bar[0];\n",
1359 "\n",
1360 " // Add the close button to the window.\n",
1361 " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
1362 " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
1363 " button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
1364 " button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
1365 " buttongrp.append(button);\n",
1366 " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
1367 " titlebar.prepend(buttongrp);\n",
1368 "}\n",
1369 "\n",
1370 "mpl.figure.prototype._root_extra_style = function(el){\n",
1371 " var fig = this\n",
1372 " el.on(\"remove\", function(){\n",
1373 "\tfig.close_ws(fig, {});\n",
1374 " });\n",
1375 "}\n",
1376 "\n",
1377 "mpl.figure.prototype._canvas_extra_style = function(el){\n",
1378 " // this is important to make the div 'focusable\n",
1379 " el.attr('tabindex', 0)\n",
1380 " // reach out to IPython and tell the keyboard manager to turn it's self\n",
1381 " // off when our div gets focus\n",
1382 "\n",
1383 " // location in version 3\n",
1384 " if (IPython.notebook.keyboard_manager) {\n",
1385 " IPython.notebook.keyboard_manager.register_events(el);\n",
1386 " }\n",
1387 " else {\n",
1388 " // location in version 2\n",
1389 " IPython.keyboard_manager.register_events(el);\n",
1390 " }\n",
1391 "\n",
1392 "}\n",
1393 "\n",
1394 "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
1395 " var manager = IPython.notebook.keyboard_manager;\n",
1396 " if (!manager)\n",
1397 " manager = IPython.keyboard_manager;\n",
1398 "\n",
1399 " // Check for shift+enter\n",
1400 " if (event.shiftKey && event.which == 13) {\n",
1401 " this.canvas_div.blur();\n",
1402 " // select the cell after this one\n",
1403 " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
1404 " IPython.notebook.select(index + 1);\n",
1405 " }\n",
1406 "}\n",
1407 "\n",
1408 "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
1409 " fig.ondownload(fig, null);\n",
1410 "}\n",
1411 "\n",
1412 "\n",
1413 "mpl.find_output_cell = function(html_output) {\n",
1414 " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
1415 " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
1416 " // IPython event is triggered only after the cells have been serialised, which for\n",
1417 " // our purposes (turning an active figure into a static one), is too late.\n",
1418 " var cells = IPython.notebook.get_cells();\n",
1419 " var ncells = cells.length;\n",
1420 " for (var i=0; i<ncells; i++) {\n",
1421 " var cell = cells[i];\n",
1422 " if (cell.cell_type === 'code'){\n",
1423 " for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
1424 " var data = cell.output_area.outputs[j];\n",
1425 " if (data.data) {\n",
1426 " // IPython >= 3 moved mimebundle to data attribute of output\n",
1427 " data = data.data;\n",
1428 " }\n",
1429 " if (data['text/html'] == html_output) {\n",
1430 " return [cell, data, j];\n",
1431 " }\n",
1432 " }\n",
1433 " }\n",
1434 " }\n",
1435 "}\n",
1436 "\n",
1437 "// Register the function which deals with the matplotlib target/channel.\n",
1438 "// The kernel may be null if the page has been refreshed.\n",
1439 "if (IPython.notebook.kernel != null) {\n",
1440 " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
1441 "}\n"
1442 ],
1443 "text/plain": [
1444 "<IPython.core.display.Javascript object>"
1445 ]
1446 },
1447 "metadata": {},
1448 "output_type": "display_data"
1449 },
1450 {
1451 "data": {
1452 "text/html": [
1453 "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkAAAARMCAYAAADBUV/1AAAAAXNSR0IArs4c6QAAQABJREFUeAHs0IEAAAAAgKD9qRcphAoDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGA0ZW4AADgUSURBVGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYuB06EAAAAAAQ5G+9wAiFkAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMHADAXaRAAGsLEZEAAAAAElFTkSuQmCC\" width=\"800\">"
1454 ],
1455 "text/plain": [
1456 "<IPython.core.display.HTML object>"
1457 ]
1458 },
1459 "metadata": {},
1460 "output_type": "display_data"
1461 }
1462 ],
1463 "source": [
1464 "# numpy.argmin(a, axis=None, out=None)[source]\n",
1465 "# Returns the indices of the minimum values along an axis.\n",
1466 "\n",
1467 "from sklearn.metrics import precision_recall_curve\n",
1468 "\n",
1469 "precision, recall, thresholds = precision_recall_curve(y_test, y_scores_lr)\n",
1470 "closest_zero = np.argmin(np.abs(thresholds)) # Index of the lowest threshold.\n",
1471 "closest_zero_p = precision[closest_zero]\n",
1472 "closest_zero_r = recall[closest_zero]\n",
1473 "\n",
1474 "plt.figure()\n",
1475 "plt.xlim([0.0, 1.01])\n",
1476 "plt.ylim([0.0, 1.01])\n",
1477 "plt.plot(precision, recall, label='Precision-Recall Curve')\n",
1478 "plt.plot(closest_zero_p, closest_zero_r, 'o', markersize = 12, fillstyle = 'none', c='r', mew=3)\n",
1479 "plt.xlabel('Precision', fontsize=16)\n",
1480 "plt.ylabel('Recall', fontsize=16)\n",
1481 "plt.axes().set_aspect('equal')\n",
1482 "plt.show()"
1483 ]
1484 },
1485 {
1486 "cell_type": "code",
1487 "execution_count": 20,
1488 "metadata": {
1489 "collapsed": false
1490 },
1491 "outputs": [
1492 {
1493 "data": {
1494 "text/plain": [
1495 "array([ -4.04847662, -3.93819545, -3.48628627, -3.44776445,\n",
1496 " -3.33892603, -2.5783356 , -2.37746137, -2.34718536,\n",
1497 " -2.30446832, -2.15792885, -2.03386685, -1.87131487,\n",
1498 " -1.7495844 , -1.72691524, -1.68712543, -1.47668716,\n",
1499 " -1.33979401, -1.3051061 , -1.08033549, -0.57099832,\n",
1500 " 0.13088342, 0.17583273, 0.47631823, 0.6418365 ,\n",
1501 " 1.00422797, 1.33670725, 1.68203683, 1.69861005,\n",
1502 " 1.87908244, 2.18989765, 2.43420944, 2.55168221,\n",
1503 " 3.71752409, 3.80620565, 4.21070117, 4.25093438,\n",
1504 " 4.30966876, 4.31558393, 4.55321241, 4.57143325,\n",
1505 " 4.93002949, 5.23271557, 5.73378353, 6.12856799,\n",
1506 " 6.55341039, 6.86404167, 6.92400179, 7.22184672,\n",
1507 " 7.37403798, 7.80959453, 8.26212674, 8.3930213 ,\n",
1508 " 8.45858117, 9.84572083, 9.87342932, 10.201736 ,\n",
1509 " 11.20681116, 11.4821926 , 11.55476419, 11.68009017,\n",
1510 " 13.26095216, 14.73832302, 16.02811865])"
1511 ]
1512 },
1513 "execution_count": 20,
1514 "metadata": {},
1515 "output_type": "execute_result"
1516 }
1517 ],
1518 "source": [
1519 "thresholds"
1520 ]
1521 },
1522 {
1523 "cell_type": "markdown",
1524 "metadata": {},
1525 "source": [
1526 "### ROC curves, Area-Under-Curve (AUC)"
1527 ]
1528 },
1529 {
1530 "cell_type": "code",
1531 "execution_count": 21,
1532 "metadata": {
1533 "collapsed": false
1534 },
1535 "outputs": [
1536 {
1537 "data": {
1538 "application/javascript": [
1539 "/* Put everything inside the global mpl namespace */\n",
1540 "window.mpl = {};\n",
1541 "\n",
1542 "\n",
1543 "mpl.get_websocket_type = function() {\n",
1544 " if (typeof(WebSocket) !== 'undefined') {\n",
1545 " return WebSocket;\n",
1546 " } else if (typeof(MozWebSocket) !== 'undefined') {\n",
1547 " return MozWebSocket;\n",
1548 " } else {\n",
1549 " alert('Your browser does not have WebSocket support.' +\n",
1550 " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
1551 " 'Firefox 4 and 5 are also supported but you ' +\n",
1552 " 'have to enable WebSockets in about:config.');\n",
1553 " };\n",
1554 "}\n",
1555 "\n",
1556 "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
1557 " this.id = figure_id;\n",
1558 "\n",
1559 " this.ws = websocket;\n",
1560 "\n",
1561 " this.supports_binary = (this.ws.binaryType != undefined);\n",
1562 "\n",
1563 " if (!this.supports_binary) {\n",
1564 " var warnings = document.getElementById(\"mpl-warnings\");\n",
1565 " if (warnings) {\n",
1566 " warnings.style.display = 'block';\n",
1567 " warnings.textContent = (\n",
1568 " \"This browser does not support binary websocket messages. \" +\n",
1569 " \"Performance may be slow.\");\n",
1570 " }\n",
1571 " }\n",
1572 "\n",
1573 " this.imageObj = new Image();\n",
1574 "\n",
1575 " this.context = undefined;\n",
1576 " this.message = undefined;\n",
1577 " this.canvas = undefined;\n",
1578 " this.rubberband_canvas = undefined;\n",
1579 " this.rubberband_context = undefined;\n",
1580 " this.format_dropdown = undefined;\n",
1581 "\n",
1582 " this.image_mode = 'full';\n",
1583 "\n",
1584 " this.root = $('<div/>');\n",
1585 " this._root_extra_style(this.root)\n",
1586 " this.root.attr('style', 'display: inline-block');\n",
1587 "\n",
1588 " $(parent_element).append(this.root);\n",
1589 "\n",
1590 " this._init_header(this);\n",
1591 " this._init_canvas(this);\n",
1592 " this._init_toolbar(this);\n",
1593 "\n",
1594 " var fig = this;\n",
1595 "\n",
1596 " this.waiting = false;\n",
1597 "\n",
1598 " this.ws.onopen = function () {\n",
1599 " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
1600 " fig.send_message(\"send_image_mode\", {});\n",
1601 " if (mpl.ratio != 1) {\n",
1602 " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
1603 " }\n",
1604 " fig.send_message(\"refresh\", {});\n",
1605 " }\n",
1606 "\n",
1607 " this.imageObj.onload = function() {\n",
1608 " if (fig.image_mode == 'full') {\n",
1609 " // Full images could contain transparency (where diff images\n",
1610 " // almost always do), so we need to clear the canvas so that\n",
1611 " // there is no ghosting.\n",
1612 " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
1613 " }\n",
1614 " fig.context.drawImage(fig.imageObj, 0, 0);\n",
1615 " };\n",
1616 "\n",
1617 " this.imageObj.onunload = function() {\n",
1618 " this.ws.close();\n",
1619 " }\n",
1620 "\n",
1621 " this.ws.onmessage = this._make_on_message_function(this);\n",
1622 "\n",
1623 " this.ondownload = ondownload;\n",
1624 "}\n",
1625 "\n",
1626 "mpl.figure.prototype._init_header = function() {\n",
1627 " var titlebar = $(\n",
1628 " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
1629 " 'ui-helper-clearfix\"/>');\n",
1630 " var titletext = $(\n",
1631 " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
1632 " 'text-align: center; padding: 3px;\"/>');\n",
1633 " titlebar.append(titletext)\n",
1634 " this.root.append(titlebar);\n",
1635 " this.header = titletext[0];\n",
1636 "}\n",
1637 "\n",
1638 "\n",
1639 "\n",
1640 "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
1641 "\n",
1642 "}\n",
1643 "\n",
1644 "\n",
1645 "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
1646 "\n",
1647 "}\n",
1648 "\n",
1649 "mpl.figure.prototype._init_canvas = function() {\n",
1650 " var fig = this;\n",
1651 "\n",
1652 " var canvas_div = $('<div/>');\n",
1653 "\n",
1654 " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
1655 "\n",
1656 " function canvas_keyboard_event(event) {\n",
1657 " return fig.key_event(event, event['data']);\n",
1658 " }\n",
1659 "\n",
1660 " canvas_div.keydown('key_press', canvas_keyboard_event);\n",
1661 " canvas_div.keyup('key_release', canvas_keyboard_event);\n",
1662 " this.canvas_div = canvas_div\n",
1663 " this._canvas_extra_style(canvas_div)\n",
1664 " this.root.append(canvas_div);\n",
1665 "\n",
1666 " var canvas = $('<canvas/>');\n",
1667 " canvas.addClass('mpl-canvas');\n",
1668 " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
1669 "\n",
1670 " this.canvas = canvas[0];\n",
1671 " this.context = canvas[0].getContext(\"2d\");\n",
1672 "\n",
1673 " var backingStore = this.context.backingStorePixelRatio ||\n",
1674 "\tthis.context.webkitBackingStorePixelRatio ||\n",
1675 "\tthis.context.mozBackingStorePixelRatio ||\n",
1676 "\tthis.context.msBackingStorePixelRatio ||\n",
1677 "\tthis.context.oBackingStorePixelRatio ||\n",
1678 "\tthis.context.backingStorePixelRatio || 1;\n",
1679 "\n",
1680 " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
1681 "\n",
1682 " var rubberband = $('<canvas/>');\n",
1683 " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
1684 "\n",
1685 " var pass_mouse_events = true;\n",
1686 "\n",
1687 " canvas_div.resizable({\n",
1688 " start: function(event, ui) {\n",
1689 " pass_mouse_events = false;\n",
1690 " },\n",
1691 " resize: function(event, ui) {\n",
1692 " fig.request_resize(ui.size.width, ui.size.height);\n",
1693 " },\n",
1694 " stop: function(event, ui) {\n",
1695 " pass_mouse_events = true;\n",
1696 " fig.request_resize(ui.size.width, ui.size.height);\n",
1697 " },\n",
1698 " });\n",
1699 "\n",
1700 " function mouse_event_fn(event) {\n",
1701 " if (pass_mouse_events)\n",
1702 " return fig.mouse_event(event, event['data']);\n",
1703 " }\n",
1704 "\n",
1705 " rubberband.mousedown('button_press', mouse_event_fn);\n",
1706 " rubberband.mouseup('button_release', mouse_event_fn);\n",
1707 " // Throttle sequential mouse events to 1 every 20ms.\n",
1708 " rubberband.mousemove('motion_notify', mouse_event_fn);\n",
1709 "\n",
1710 " rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
1711 " rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
1712 "\n",
1713 " canvas_div.on(\"wheel\", function (event) {\n",
1714 " event = event.originalEvent;\n",
1715 " event['data'] = 'scroll'\n",
1716 " if (event.deltaY < 0) {\n",
1717 " event.step = 1;\n",
1718 " } else {\n",
1719 " event.step = -1;\n",
1720 " }\n",
1721 " mouse_event_fn(event);\n",
1722 " });\n",
1723 "\n",
1724 " canvas_div.append(canvas);\n",
1725 " canvas_div.append(rubberband);\n",
1726 "\n",
1727 " this.rubberband = rubberband;\n",
1728 " this.rubberband_canvas = rubberband[0];\n",
1729 " this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
1730 " this.rubberband_context.strokeStyle = \"#000000\";\n",
1731 "\n",
1732 " this._resize_canvas = function(width, height) {\n",
1733 " // Keep the size of the canvas, canvas container, and rubber band\n",
1734 " // canvas in synch.\n",
1735 " canvas_div.css('width', width)\n",
1736 " canvas_div.css('height', height)\n",
1737 "\n",
1738 " canvas.attr('width', width * mpl.ratio);\n",
1739 " canvas.attr('height', height * mpl.ratio);\n",
1740 " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
1741 "\n",
1742 " rubberband.attr('width', width);\n",
1743 " rubberband.attr('height', height);\n",
1744 " }\n",
1745 "\n",
1746 " // Set the figure to an initial 600x600px, this will subsequently be updated\n",
1747 " // upon first draw.\n",
1748 " this._resize_canvas(600, 600);\n",
1749 "\n",
1750 " // Disable right mouse context menu.\n",
1751 " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
1752 " return false;\n",
1753 " });\n",
1754 "\n",
1755 " function set_focus () {\n",
1756 " canvas.focus();\n",
1757 " canvas_div.focus();\n",
1758 " }\n",
1759 "\n",
1760 " window.setTimeout(set_focus, 100);\n",
1761 "}\n",
1762 "\n",
1763 "mpl.figure.prototype._init_toolbar = function() {\n",
1764 " var fig = this;\n",
1765 "\n",
1766 " var nav_element = $('<div/>')\n",
1767 " nav_element.attr('style', 'width: 100%');\n",
1768 " this.root.append(nav_element);\n",
1769 "\n",
1770 " // Define a callback function for later on.\n",
1771 " function toolbar_event(event) {\n",
1772 " return fig.toolbar_button_onclick(event['data']);\n",
1773 " }\n",
1774 " function toolbar_mouse_event(event) {\n",
1775 " return fig.toolbar_button_onmouseover(event['data']);\n",
1776 " }\n",
1777 "\n",
1778 " for(var toolbar_ind in mpl.toolbar_items) {\n",
1779 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
1780 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
1781 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
1782 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
1783 "\n",
1784 " if (!name) {\n",
1785 " // put a spacer in here.\n",
1786 " continue;\n",
1787 " }\n",
1788 " var button = $('<button/>');\n",
1789 " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
1790 " 'ui-button-icon-only');\n",
1791 " button.attr('role', 'button');\n",
1792 " button.attr('aria-disabled', 'false');\n",
1793 " button.click(method_name, toolbar_event);\n",
1794 " button.mouseover(tooltip, toolbar_mouse_event);\n",
1795 "\n",
1796 " var icon_img = $('<span/>');\n",
1797 " icon_img.addClass('ui-button-icon-primary ui-icon');\n",
1798 " icon_img.addClass(image);\n",
1799 " icon_img.addClass('ui-corner-all');\n",
1800 "\n",
1801 " var tooltip_span = $('<span/>');\n",
1802 " tooltip_span.addClass('ui-button-text');\n",
1803 " tooltip_span.html(tooltip);\n",
1804 "\n",
1805 " button.append(icon_img);\n",
1806 " button.append(tooltip_span);\n",
1807 "\n",
1808 " nav_element.append(button);\n",
1809 " }\n",
1810 "\n",
1811 " var fmt_picker_span = $('<span/>');\n",
1812 "\n",
1813 " var fmt_picker = $('<select/>');\n",
1814 " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
1815 " fmt_picker_span.append(fmt_picker);\n",
1816 " nav_element.append(fmt_picker_span);\n",
1817 " this.format_dropdown = fmt_picker[0];\n",
1818 "\n",
1819 " for (var ind in mpl.extensions) {\n",
1820 " var fmt = mpl.extensions[ind];\n",
1821 " var option = $(\n",
1822 " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
1823 " fmt_picker.append(option)\n",
1824 " }\n",
1825 "\n",
1826 " // Add hover states to the ui-buttons\n",
1827 " $( \".ui-button\" ).hover(\n",
1828 " function() { $(this).addClass(\"ui-state-hover\");},\n",
1829 " function() { $(this).removeClass(\"ui-state-hover\");}\n",
1830 " );\n",
1831 "\n",
1832 " var status_bar = $('<span class=\"mpl-message\"/>');\n",
1833 " nav_element.append(status_bar);\n",
1834 " this.message = status_bar[0];\n",
1835 "}\n",
1836 "\n",
1837 "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
1838 " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
1839 " // which will in turn request a refresh of the image.\n",
1840 " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
1841 "}\n",
1842 "\n",
1843 "mpl.figure.prototype.send_message = function(type, properties) {\n",
1844 " properties['type'] = type;\n",
1845 " properties['figure_id'] = this.id;\n",
1846 " this.ws.send(JSON.stringify(properties));\n",
1847 "}\n",
1848 "\n",
1849 "mpl.figure.prototype.send_draw_message = function() {\n",
1850 " if (!this.waiting) {\n",
1851 " this.waiting = true;\n",
1852 " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
1853 " }\n",
1854 "}\n",
1855 "\n",
1856 "\n",
1857 "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
1858 " var format_dropdown = fig.format_dropdown;\n",
1859 " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
1860 " fig.ondownload(fig, format);\n",
1861 "}\n",
1862 "\n",
1863 "\n",
1864 "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
1865 " var size = msg['size'];\n",
1866 " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
1867 " fig._resize_canvas(size[0], size[1]);\n",
1868 " fig.send_message(\"refresh\", {});\n",
1869 " };\n",
1870 "}\n",
1871 "\n",
1872 "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
1873 " var x0 = msg['x0'] / mpl.ratio;\n",
1874 " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
1875 " var x1 = msg['x1'] / mpl.ratio;\n",
1876 " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
1877 " x0 = Math.floor(x0) + 0.5;\n",
1878 " y0 = Math.floor(y0) + 0.5;\n",
1879 " x1 = Math.floor(x1) + 0.5;\n",
1880 " y1 = Math.floor(y1) + 0.5;\n",
1881 " var min_x = Math.min(x0, x1);\n",
1882 " var min_y = Math.min(y0, y1);\n",
1883 " var width = Math.abs(x1 - x0);\n",
1884 " var height = Math.abs(y1 - y0);\n",
1885 "\n",
1886 " fig.rubberband_context.clearRect(\n",
1887 " 0, 0, fig.canvas.width, fig.canvas.height);\n",
1888 "\n",
1889 " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
1890 "}\n",
1891 "\n",
1892 "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
1893 " // Updates the figure title.\n",
1894 " fig.header.textContent = msg['label'];\n",
1895 "}\n",
1896 "\n",
1897 "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
1898 " var cursor = msg['cursor'];\n",
1899 " switch(cursor)\n",
1900 " {\n",
1901 " case 0:\n",
1902 " cursor = 'pointer';\n",
1903 " break;\n",
1904 " case 1:\n",
1905 " cursor = 'default';\n",
1906 " break;\n",
1907 " case 2:\n",
1908 " cursor = 'crosshair';\n",
1909 " break;\n",
1910 " case 3:\n",
1911 " cursor = 'move';\n",
1912 " break;\n",
1913 " }\n",
1914 " fig.rubberband_canvas.style.cursor = cursor;\n",
1915 "}\n",
1916 "\n",
1917 "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
1918 " fig.message.textContent = msg['message'];\n",
1919 "}\n",
1920 "\n",
1921 "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
1922 " // Request the server to send over a new figure.\n",
1923 " fig.send_draw_message();\n",
1924 "}\n",
1925 "\n",
1926 "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
1927 " fig.image_mode = msg['mode'];\n",
1928 "}\n",
1929 "\n",
1930 "mpl.figure.prototype.updated_canvas_event = function() {\n",
1931 " // Called whenever the canvas gets updated.\n",
1932 " this.send_message(\"ack\", {});\n",
1933 "}\n",
1934 "\n",
1935 "// A function to construct a web socket function for onmessage handling.\n",
1936 "// Called in the figure constructor.\n",
1937 "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
1938 " return function socket_on_message(evt) {\n",
1939 " if (evt.data instanceof Blob) {\n",
1940 " /* FIXME: We get \"Resource interpreted as Image but\n",
1941 " * transferred with MIME type text/plain:\" errors on\n",
1942 " * Chrome. But how to set the MIME type? It doesn't seem\n",
1943 " * to be part of the websocket stream */\n",
1944 " evt.data.type = \"image/png\";\n",
1945 "\n",
1946 " /* Free the memory for the previous frames */\n",
1947 " if (fig.imageObj.src) {\n",
1948 " (window.URL || window.webkitURL).revokeObjectURL(\n",
1949 " fig.imageObj.src);\n",
1950 " }\n",
1951 "\n",
1952 " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
1953 " evt.data);\n",
1954 " fig.updated_canvas_event();\n",
1955 " fig.waiting = false;\n",
1956 " return;\n",
1957 " }\n",
1958 " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
1959 " fig.imageObj.src = evt.data;\n",
1960 " fig.updated_canvas_event();\n",
1961 " fig.waiting = false;\n",
1962 " return;\n",
1963 " }\n",
1964 "\n",
1965 " var msg = JSON.parse(evt.data);\n",
1966 " var msg_type = msg['type'];\n",
1967 "\n",
1968 " // Call the \"handle_{type}\" callback, which takes\n",
1969 " // the figure and JSON message as its only arguments.\n",
1970 " try {\n",
1971 " var callback = fig[\"handle_\" + msg_type];\n",
1972 " } catch (e) {\n",
1973 " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
1974 " return;\n",
1975 " }\n",
1976 "\n",
1977 " if (callback) {\n",
1978 " try {\n",
1979 " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
1980 " callback(fig, msg);\n",
1981 " } catch (e) {\n",
1982 " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
1983 " }\n",
1984 " }\n",
1985 " };\n",
1986 "}\n",
1987 "\n",
1988 "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
1989 "mpl.findpos = function(e) {\n",
1990 " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
1991 " var targ;\n",
1992 " if (!e)\n",
1993 " e = window.event;\n",
1994 " if (e.target)\n",
1995 " targ = e.target;\n",
1996 " else if (e.srcElement)\n",
1997 " targ = e.srcElement;\n",
1998 " if (targ.nodeType == 3) // defeat Safari bug\n",
1999 " targ = targ.parentNode;\n",
2000 "\n",
2001 " // jQuery normalizes the pageX and pageY\n",
2002 " // pageX,Y are the mouse positions relative to the document\n",
2003 " // offset() returns the position of the element relative to the document\n",
2004 " var x = e.pageX - $(targ).offset().left;\n",
2005 " var y = e.pageY - $(targ).offset().top;\n",
2006 "\n",
2007 " return {\"x\": x, \"y\": y};\n",
2008 "};\n",
2009 "\n",
2010 "/*\n",
2011 " * return a copy of an object with only non-object keys\n",
2012 " * we need this to avoid circular references\n",
2013 " * http://stackoverflow.com/a/24161582/3208463\n",
2014 " */\n",
2015 "function simpleKeys (original) {\n",
2016 " return Object.keys(original).reduce(function (obj, key) {\n",
2017 " if (typeof original[key] !== 'object')\n",
2018 " obj[key] = original[key]\n",
2019 " return obj;\n",
2020 " }, {});\n",
2021 "}\n",
2022 "\n",
2023 "mpl.figure.prototype.mouse_event = function(event, name) {\n",
2024 " var canvas_pos = mpl.findpos(event)\n",
2025 "\n",
2026 " if (name === 'button_press')\n",
2027 " {\n",
2028 " this.canvas.focus();\n",
2029 " this.canvas_div.focus();\n",
2030 " }\n",
2031 "\n",
2032 " var x = canvas_pos.x * mpl.ratio;\n",
2033 " var y = canvas_pos.y * mpl.ratio;\n",
2034 "\n",
2035 " this.send_message(name, {x: x, y: y, button: event.button,\n",
2036 " step: event.step,\n",
2037 " guiEvent: simpleKeys(event)});\n",
2038 "\n",
2039 " /* This prevents the web browser from automatically changing to\n",
2040 " * the text insertion cursor when the button is pressed. We want\n",
2041 " * to control all of the cursor setting manually through the\n",
2042 " * 'cursor' event from matplotlib */\n",
2043 " event.preventDefault();\n",
2044 " return false;\n",
2045 "}\n",
2046 "\n",
2047 "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
2048 " // Handle any extra behaviour associated with a key event\n",
2049 "}\n",
2050 "\n",
2051 "mpl.figure.prototype.key_event = function(event, name) {\n",
2052 "\n",
2053 " // Prevent repeat events\n",
2054 " if (name == 'key_press')\n",
2055 " {\n",
2056 " if (event.which === this._key)\n",
2057 " return;\n",
2058 " else\n",
2059 " this._key = event.which;\n",
2060 " }\n",
2061 " if (name == 'key_release')\n",
2062 " this._key = null;\n",
2063 "\n",
2064 " var value = '';\n",
2065 " if (event.ctrlKey && event.which != 17)\n",
2066 " value += \"ctrl+\";\n",
2067 " if (event.altKey && event.which != 18)\n",
2068 " value += \"alt+\";\n",
2069 " if (event.shiftKey && event.which != 16)\n",
2070 " value += \"shift+\";\n",
2071 "\n",
2072 " value += 'k';\n",
2073 " value += event.which.toString();\n",
2074 "\n",
2075 " this._key_event_extra(event, name);\n",
2076 "\n",
2077 " this.send_message(name, {key: value,\n",
2078 " guiEvent: simpleKeys(event)});\n",
2079 " return false;\n",
2080 "}\n",
2081 "\n",
2082 "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
2083 " if (name == 'download') {\n",
2084 " this.handle_save(this, null);\n",
2085 " } else {\n",
2086 " this.send_message(\"toolbar_button\", {name: name});\n",
2087 " }\n",
2088 "};\n",
2089 "\n",
2090 "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
2091 " this.message.textContent = tooltip;\n",
2092 "};\n",
2093 "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
2094 "\n",
2095 "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
2096 "\n",
2097 "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
2098 " // Create a \"websocket\"-like object which calls the given IPython comm\n",
2099 " // object with the appropriate methods. Currently this is a non binary\n",
2100 " // socket, so there is still some room for performance tuning.\n",
2101 " var ws = {};\n",
2102 "\n",
2103 " ws.close = function() {\n",
2104 " comm.close()\n",
2105 " };\n",
2106 " ws.send = function(m) {\n",
2107 " //console.log('sending', m);\n",
2108 " comm.send(m);\n",
2109 " };\n",
2110 " // Register the callback with on_msg.\n",
2111 " comm.on_msg(function(msg) {\n",
2112 " //console.log('receiving', msg['content']['data'], msg);\n",
2113 " // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
2114 " ws.onmessage(msg['content']['data'])\n",
2115 " });\n",
2116 " return ws;\n",
2117 "}\n",
2118 "\n",
2119 "mpl.mpl_figure_comm = function(comm, msg) {\n",
2120 " // This is the function which gets called when the mpl process\n",
2121 " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
2122 "\n",
2123 " var id = msg.content.data.id;\n",
2124 " // Get hold of the div created by the display call when the Comm\n",
2125 " // socket was opened in Python.\n",
2126 " var element = $(\"#\" + id);\n",
2127 " var ws_proxy = comm_websocket_adapter(comm)\n",
2128 "\n",
2129 " function ondownload(figure, format) {\n",
2130 " window.open(figure.imageObj.src);\n",
2131 " }\n",
2132 "\n",
2133 " var fig = new mpl.figure(id, ws_proxy,\n",
2134 " ondownload,\n",
2135 " element.get(0));\n",
2136 "\n",
2137 " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
2138 " // web socket which is closed, not our websocket->open comm proxy.\n",
2139 " ws_proxy.onopen();\n",
2140 "\n",
2141 " fig.parent_element = element.get(0);\n",
2142 " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
2143 " if (!fig.cell_info) {\n",
2144 " console.error(\"Failed to find cell for figure\", id, fig);\n",
2145 " return;\n",
2146 " }\n",
2147 "\n",
2148 " var output_index = fig.cell_info[2]\n",
2149 " var cell = fig.cell_info[0];\n",
2150 "\n",
2151 "};\n",
2152 "\n",
2153 "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
2154 " var width = fig.canvas.width/mpl.ratio\n",
2155 " fig.root.unbind('remove')\n",
2156 "\n",
2157 " // Update the output cell to use the data from the current canvas.\n",
2158 " fig.push_to_output();\n",
2159 " var dataURL = fig.canvas.toDataURL();\n",
2160 " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
2161 " // the notebook keyboard shortcuts fail.\n",
2162 " IPython.keyboard_manager.enable()\n",
2163 " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
2164 " fig.close_ws(fig, msg);\n",
2165 "}\n",
2166 "\n",
2167 "mpl.figure.prototype.close_ws = function(fig, msg){\n",
2168 " fig.send_message('closing', msg);\n",
2169 " // fig.ws.close()\n",
2170 "}\n",
2171 "\n",
2172 "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
2173 " // Turn the data on the canvas into data in the output cell.\n",
2174 " var width = this.canvas.width/mpl.ratio\n",
2175 " var dataURL = this.canvas.toDataURL();\n",
2176 " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
2177 "}\n",
2178 "\n",
2179 "mpl.figure.prototype.updated_canvas_event = function() {\n",
2180 " // Tell IPython that the notebook contents must change.\n",
2181 " IPython.notebook.set_dirty(true);\n",
2182 " this.send_message(\"ack\", {});\n",
2183 " var fig = this;\n",
2184 " // Wait a second, then push the new image to the DOM so\n",
2185 " // that it is saved nicely (might be nice to debounce this).\n",
2186 " setTimeout(function () { fig.push_to_output() }, 1000);\n",
2187 "}\n",
2188 "\n",
2189 "mpl.figure.prototype._init_toolbar = function() {\n",
2190 " var fig = this;\n",
2191 "\n",
2192 " var nav_element = $('<div/>')\n",
2193 " nav_element.attr('style', 'width: 100%');\n",
2194 " this.root.append(nav_element);\n",
2195 "\n",
2196 " // Define a callback function for later on.\n",
2197 " function toolbar_event(event) {\n",
2198 " return fig.toolbar_button_onclick(event['data']);\n",
2199 " }\n",
2200 " function toolbar_mouse_event(event) {\n",
2201 " return fig.toolbar_button_onmouseover(event['data']);\n",
2202 " }\n",
2203 "\n",
2204 " for(var toolbar_ind in mpl.toolbar_items){\n",
2205 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
2206 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
2207 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
2208 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
2209 "\n",
2210 " if (!name) { continue; };\n",
2211 "\n",
2212 " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
2213 " button.click(method_name, toolbar_event);\n",
2214 " button.mouseover(tooltip, toolbar_mouse_event);\n",
2215 " nav_element.append(button);\n",
2216 " }\n",
2217 "\n",
2218 " // Add the status bar.\n",
2219 " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
2220 " nav_element.append(status_bar);\n",
2221 " this.message = status_bar[0];\n",
2222 "\n",
2223 " // Add the close button to the window.\n",
2224 " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
2225 " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
2226 " button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
2227 " button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
2228 " buttongrp.append(button);\n",
2229 " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
2230 " titlebar.prepend(buttongrp);\n",
2231 "}\n",
2232 "\n",
2233 "mpl.figure.prototype._root_extra_style = function(el){\n",
2234 " var fig = this\n",
2235 " el.on(\"remove\", function(){\n",
2236 "\tfig.close_ws(fig, {});\n",
2237 " });\n",
2238 "}\n",
2239 "\n",
2240 "mpl.figure.prototype._canvas_extra_style = function(el){\n",
2241 " // this is important to make the div 'focusable\n",
2242 " el.attr('tabindex', 0)\n",
2243 " // reach out to IPython and tell the keyboard manager to turn it's self\n",
2244 " // off when our div gets focus\n",
2245 "\n",
2246 " // location in version 3\n",
2247 " if (IPython.notebook.keyboard_manager) {\n",
2248 " IPython.notebook.keyboard_manager.register_events(el);\n",
2249 " }\n",
2250 " else {\n",
2251 " // location in version 2\n",
2252 " IPython.keyboard_manager.register_events(el);\n",
2253 " }\n",
2254 "\n",
2255 "}\n",
2256 "\n",
2257 "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
2258 " var manager = IPython.notebook.keyboard_manager;\n",
2259 " if (!manager)\n",
2260 " manager = IPython.keyboard_manager;\n",
2261 "\n",
2262 " // Check for shift+enter\n",
2263 " if (event.shiftKey && event.which == 13) {\n",
2264 " this.canvas_div.blur();\n",
2265 " // select the cell after this one\n",
2266 " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
2267 " IPython.notebook.select(index + 1);\n",
2268 " }\n",
2269 "}\n",
2270 "\n",
2271 "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
2272 " fig.ondownload(fig, null);\n",
2273 "}\n",
2274 "\n",
2275 "\n",
2276 "mpl.find_output_cell = function(html_output) {\n",
2277 " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
2278 " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
2279 " // IPython event is triggered only after the cells have been serialised, which for\n",
2280 " // our purposes (turning an active figure into a static one), is too late.\n",
2281 " var cells = IPython.notebook.get_cells();\n",
2282 " var ncells = cells.length;\n",
2283 " for (var i=0; i<ncells; i++) {\n",
2284 " var cell = cells[i];\n",
2285 " if (cell.cell_type === 'code'){\n",
2286 " for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
2287 " var data = cell.output_area.outputs[j];\n",
2288 " if (data.data) {\n",
2289 " // IPython >= 3 moved mimebundle to data attribute of output\n",
2290 " data = data.data;\n",
2291 " }\n",
2292 " if (data['text/html'] == html_output) {\n",
2293 " return [cell, data, j];\n",
2294 " }\n",
2295 " }\n",
2296 " }\n",
2297 " }\n",
2298 "}\n",
2299 "\n",
2300 "// Register the function which deals with the matplotlib target/channel.\n",
2301 "// The kernel may be null if the page has been refreshed.\n",
2302 "if (IPython.notebook.kernel != null) {\n",
2303 " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
2304 "}\n"
2305 ],
2306 "text/plain": [
2307 "<IPython.core.display.Javascript object>"
2308 ]
2309 },
2310 "metadata": {},
2311 "output_type": "display_data"
2312 },
2313 {
2314 "data": {
2315 "text/html": [
2316 "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkAAAARMCAYAAADBUV/1AAAAAXNSR0IArs4c6QAAQABJREFUeAHs0IEAAAAAgKD9qRcphAoDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGA0ZW4AADgUSURBVGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYuB06EAAAAAAQ5G+9wAiFkAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMHADAXaRAAGsLEZEAAAAAElFTkSuQmCC\" width=\"800\">"
2317 ],
2318 "text/plain": [
2319 "<IPython.core.display.HTML object>"
2320 ]
2321 },
2322 "metadata": {},
2323 "output_type": "display_data"
2324 }
2325 ],
2326 "source": [
2327 "# ROC: Receiver Operating Characteristic Curve.\n",
2328 "# True positive rate vs False positive rate.\n",
2329 "\n",
2330 "from sklearn.metrics import roc_curve, auc\n",
2331 "\n",
2332 "X_train, X_test, y_train, y_test = train_test_split(X, y_binary_imbalanced, random_state=0)\n",
2333 "\n",
2334 "y_score_lr = lr.fit(X_train, y_train).decision_function(X_test)\n",
2335 "fpr_lr, tpr_lr, _ = roc_curve(y_test, y_score_lr)\n",
2336 "roc_auc_lr = auc(fpr_lr, tpr_lr)\n",
2337 "\n",
2338 "plt.figure()\n",
2339 "plt.xlim([-0.01, 1.00])\n",
2340 "plt.ylim([-0.01, 1.01])\n",
2341 "plt.plot(fpr_lr, tpr_lr, lw=3, label='LogRegr ROC curve (area = {:0.2f})'.format(roc_auc_lr))\n",
2342 "plt.xlabel('False Positive Rate', fontsize=16)\n",
2343 "plt.ylabel('True Positive Rate', fontsize=16)\n",
2344 "plt.title('ROC curve (1-of-10 digits classifier)', fontsize=16)\n",
2345 "plt.legend(loc='lower right', fontsize=13)\n",
2346 "plt.plot([0, 1], [0, 1], color='navy', lw=3, linestyle='--')\n",
2347 "plt.axes().set_aspect('equal')\n",
2348 "plt.show()"
2349 ]
2350 },
2351 {
2352 "cell_type": "code",
2353 "execution_count": 22,
2354 "metadata": {
2355 "collapsed": false,
2356 "scrolled": false
2357 },
2358 "outputs": [
2359 {
2360 "data": {
2361 "application/javascript": [
2362 "/* Put everything inside the global mpl namespace */\n",
2363 "window.mpl = {};\n",
2364 "\n",
2365 "\n",
2366 "mpl.get_websocket_type = function() {\n",
2367 " if (typeof(WebSocket) !== 'undefined') {\n",
2368 " return WebSocket;\n",
2369 " } else if (typeof(MozWebSocket) !== 'undefined') {\n",
2370 " return MozWebSocket;\n",
2371 " } else {\n",
2372 " alert('Your browser does not have WebSocket support.' +\n",
2373 " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
2374 " 'Firefox 4 and 5 are also supported but you ' +\n",
2375 " 'have to enable WebSockets in about:config.');\n",
2376 " };\n",
2377 "}\n",
2378 "\n",
2379 "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
2380 " this.id = figure_id;\n",
2381 "\n",
2382 " this.ws = websocket;\n",
2383 "\n",
2384 " this.supports_binary = (this.ws.binaryType != undefined);\n",
2385 "\n",
2386 " if (!this.supports_binary) {\n",
2387 " var warnings = document.getElementById(\"mpl-warnings\");\n",
2388 " if (warnings) {\n",
2389 " warnings.style.display = 'block';\n",
2390 " warnings.textContent = (\n",
2391 " \"This browser does not support binary websocket messages. \" +\n",
2392 " \"Performance may be slow.\");\n",
2393 " }\n",
2394 " }\n",
2395 "\n",
2396 " this.imageObj = new Image();\n",
2397 "\n",
2398 " this.context = undefined;\n",
2399 " this.message = undefined;\n",
2400 " this.canvas = undefined;\n",
2401 " this.rubberband_canvas = undefined;\n",
2402 " this.rubberband_context = undefined;\n",
2403 " this.format_dropdown = undefined;\n",
2404 "\n",
2405 " this.image_mode = 'full';\n",
2406 "\n",
2407 " this.root = $('<div/>');\n",
2408 " this._root_extra_style(this.root)\n",
2409 " this.root.attr('style', 'display: inline-block');\n",
2410 "\n",
2411 " $(parent_element).append(this.root);\n",
2412 "\n",
2413 " this._init_header(this);\n",
2414 " this._init_canvas(this);\n",
2415 " this._init_toolbar(this);\n",
2416 "\n",
2417 " var fig = this;\n",
2418 "\n",
2419 " this.waiting = false;\n",
2420 "\n",
2421 " this.ws.onopen = function () {\n",
2422 " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
2423 " fig.send_message(\"send_image_mode\", {});\n",
2424 " if (mpl.ratio != 1) {\n",
2425 " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
2426 " }\n",
2427 " fig.send_message(\"refresh\", {});\n",
2428 " }\n",
2429 "\n",
2430 " this.imageObj.onload = function() {\n",
2431 " if (fig.image_mode == 'full') {\n",
2432 " // Full images could contain transparency (where diff images\n",
2433 " // almost always do), so we need to clear the canvas so that\n",
2434 " // there is no ghosting.\n",
2435 " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
2436 " }\n",
2437 " fig.context.drawImage(fig.imageObj, 0, 0);\n",
2438 " };\n",
2439 "\n",
2440 " this.imageObj.onunload = function() {\n",
2441 " this.ws.close();\n",
2442 " }\n",
2443 "\n",
2444 " this.ws.onmessage = this._make_on_message_function(this);\n",
2445 "\n",
2446 " this.ondownload = ondownload;\n",
2447 "}\n",
2448 "\n",
2449 "mpl.figure.prototype._init_header = function() {\n",
2450 " var titlebar = $(\n",
2451 " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
2452 " 'ui-helper-clearfix\"/>');\n",
2453 " var titletext = $(\n",
2454 " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
2455 " 'text-align: center; padding: 3px;\"/>');\n",
2456 " titlebar.append(titletext)\n",
2457 " this.root.append(titlebar);\n",
2458 " this.header = titletext[0];\n",
2459 "}\n",
2460 "\n",
2461 "\n",
2462 "\n",
2463 "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
2464 "\n",
2465 "}\n",
2466 "\n",
2467 "\n",
2468 "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
2469 "\n",
2470 "}\n",
2471 "\n",
2472 "mpl.figure.prototype._init_canvas = function() {\n",
2473 " var fig = this;\n",
2474 "\n",
2475 " var canvas_div = $('<div/>');\n",
2476 "\n",
2477 " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
2478 "\n",
2479 " function canvas_keyboard_event(event) {\n",
2480 " return fig.key_event(event, event['data']);\n",
2481 " }\n",
2482 "\n",
2483 " canvas_div.keydown('key_press', canvas_keyboard_event);\n",
2484 " canvas_div.keyup('key_release', canvas_keyboard_event);\n",
2485 " this.canvas_div = canvas_div\n",
2486 " this._canvas_extra_style(canvas_div)\n",
2487 " this.root.append(canvas_div);\n",
2488 "\n",
2489 " var canvas = $('<canvas/>');\n",
2490 " canvas.addClass('mpl-canvas');\n",
2491 " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
2492 "\n",
2493 " this.canvas = canvas[0];\n",
2494 " this.context = canvas[0].getContext(\"2d\");\n",
2495 "\n",
2496 " var backingStore = this.context.backingStorePixelRatio ||\n",
2497 "\tthis.context.webkitBackingStorePixelRatio ||\n",
2498 "\tthis.context.mozBackingStorePixelRatio ||\n",
2499 "\tthis.context.msBackingStorePixelRatio ||\n",
2500 "\tthis.context.oBackingStorePixelRatio ||\n",
2501 "\tthis.context.backingStorePixelRatio || 1;\n",
2502 "\n",
2503 " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
2504 "\n",
2505 " var rubberband = $('<canvas/>');\n",
2506 " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
2507 "\n",
2508 " var pass_mouse_events = true;\n",
2509 "\n",
2510 " canvas_div.resizable({\n",
2511 " start: function(event, ui) {\n",
2512 " pass_mouse_events = false;\n",
2513 " },\n",
2514 " resize: function(event, ui) {\n",
2515 " fig.request_resize(ui.size.width, ui.size.height);\n",
2516 " },\n",
2517 " stop: function(event, ui) {\n",
2518 " pass_mouse_events = true;\n",
2519 " fig.request_resize(ui.size.width, ui.size.height);\n",
2520 " },\n",
2521 " });\n",
2522 "\n",
2523 " function mouse_event_fn(event) {\n",
2524 " if (pass_mouse_events)\n",
2525 " return fig.mouse_event(event, event['data']);\n",
2526 " }\n",
2527 "\n",
2528 " rubberband.mousedown('button_press', mouse_event_fn);\n",
2529 " rubberband.mouseup('button_release', mouse_event_fn);\n",
2530 " // Throttle sequential mouse events to 1 every 20ms.\n",
2531 " rubberband.mousemove('motion_notify', mouse_event_fn);\n",
2532 "\n",
2533 " rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
2534 " rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
2535 "\n",
2536 " canvas_div.on(\"wheel\", function (event) {\n",
2537 " event = event.originalEvent;\n",
2538 " event['data'] = 'scroll'\n",
2539 " if (event.deltaY < 0) {\n",
2540 " event.step = 1;\n",
2541 " } else {\n",
2542 " event.step = -1;\n",
2543 " }\n",
2544 " mouse_event_fn(event);\n",
2545 " });\n",
2546 "\n",
2547 " canvas_div.append(canvas);\n",
2548 " canvas_div.append(rubberband);\n",
2549 "\n",
2550 " this.rubberband = rubberband;\n",
2551 " this.rubberband_canvas = rubberband[0];\n",
2552 " this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
2553 " this.rubberband_context.strokeStyle = \"#000000\";\n",
2554 "\n",
2555 " this._resize_canvas = function(width, height) {\n",
2556 " // Keep the size of the canvas, canvas container, and rubber band\n",
2557 " // canvas in synch.\n",
2558 " canvas_div.css('width', width)\n",
2559 " canvas_div.css('height', height)\n",
2560 "\n",
2561 " canvas.attr('width', width * mpl.ratio);\n",
2562 " canvas.attr('height', height * mpl.ratio);\n",
2563 " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
2564 "\n",
2565 " rubberband.attr('width', width);\n",
2566 " rubberband.attr('height', height);\n",
2567 " }\n",
2568 "\n",
2569 " // Set the figure to an initial 600x600px, this will subsequently be updated\n",
2570 " // upon first draw.\n",
2571 " this._resize_canvas(600, 600);\n",
2572 "\n",
2573 " // Disable right mouse context menu.\n",
2574 " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
2575 " return false;\n",
2576 " });\n",
2577 "\n",
2578 " function set_focus () {\n",
2579 " canvas.focus();\n",
2580 " canvas_div.focus();\n",
2581 " }\n",
2582 "\n",
2583 " window.setTimeout(set_focus, 100);\n",
2584 "}\n",
2585 "\n",
2586 "mpl.figure.prototype._init_toolbar = function() {\n",
2587 " var fig = this;\n",
2588 "\n",
2589 " var nav_element = $('<div/>')\n",
2590 " nav_element.attr('style', 'width: 100%');\n",
2591 " this.root.append(nav_element);\n",
2592 "\n",
2593 " // Define a callback function for later on.\n",
2594 " function toolbar_event(event) {\n",
2595 " return fig.toolbar_button_onclick(event['data']);\n",
2596 " }\n",
2597 " function toolbar_mouse_event(event) {\n",
2598 " return fig.toolbar_button_onmouseover(event['data']);\n",
2599 " }\n",
2600 "\n",
2601 " for(var toolbar_ind in mpl.toolbar_items) {\n",
2602 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
2603 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
2604 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
2605 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
2606 "\n",
2607 " if (!name) {\n",
2608 " // put a spacer in here.\n",
2609 " continue;\n",
2610 " }\n",
2611 " var button = $('<button/>');\n",
2612 " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
2613 " 'ui-button-icon-only');\n",
2614 " button.attr('role', 'button');\n",
2615 " button.attr('aria-disabled', 'false');\n",
2616 " button.click(method_name, toolbar_event);\n",
2617 " button.mouseover(tooltip, toolbar_mouse_event);\n",
2618 "\n",
2619 " var icon_img = $('<span/>');\n",
2620 " icon_img.addClass('ui-button-icon-primary ui-icon');\n",
2621 " icon_img.addClass(image);\n",
2622 " icon_img.addClass('ui-corner-all');\n",
2623 "\n",
2624 " var tooltip_span = $('<span/>');\n",
2625 " tooltip_span.addClass('ui-button-text');\n",
2626 " tooltip_span.html(tooltip);\n",
2627 "\n",
2628 " button.append(icon_img);\n",
2629 " button.append(tooltip_span);\n",
2630 "\n",
2631 " nav_element.append(button);\n",
2632 " }\n",
2633 "\n",
2634 " var fmt_picker_span = $('<span/>');\n",
2635 "\n",
2636 " var fmt_picker = $('<select/>');\n",
2637 " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
2638 " fmt_picker_span.append(fmt_picker);\n",
2639 " nav_element.append(fmt_picker_span);\n",
2640 " this.format_dropdown = fmt_picker[0];\n",
2641 "\n",
2642 " for (var ind in mpl.extensions) {\n",
2643 " var fmt = mpl.extensions[ind];\n",
2644 " var option = $(\n",
2645 " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
2646 " fmt_picker.append(option)\n",
2647 " }\n",
2648 "\n",
2649 " // Add hover states to the ui-buttons\n",
2650 " $( \".ui-button\" ).hover(\n",
2651 " function() { $(this).addClass(\"ui-state-hover\");},\n",
2652 " function() { $(this).removeClass(\"ui-state-hover\");}\n",
2653 " );\n",
2654 "\n",
2655 " var status_bar = $('<span class=\"mpl-message\"/>');\n",
2656 " nav_element.append(status_bar);\n",
2657 " this.message = status_bar[0];\n",
2658 "}\n",
2659 "\n",
2660 "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
2661 " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
2662 " // which will in turn request a refresh of the image.\n",
2663 " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
2664 "}\n",
2665 "\n",
2666 "mpl.figure.prototype.send_message = function(type, properties) {\n",
2667 " properties['type'] = type;\n",
2668 " properties['figure_id'] = this.id;\n",
2669 " this.ws.send(JSON.stringify(properties));\n",
2670 "}\n",
2671 "\n",
2672 "mpl.figure.prototype.send_draw_message = function() {\n",
2673 " if (!this.waiting) {\n",
2674 " this.waiting = true;\n",
2675 " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
2676 " }\n",
2677 "}\n",
2678 "\n",
2679 "\n",
2680 "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
2681 " var format_dropdown = fig.format_dropdown;\n",
2682 " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
2683 " fig.ondownload(fig, format);\n",
2684 "}\n",
2685 "\n",
2686 "\n",
2687 "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
2688 " var size = msg['size'];\n",
2689 " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
2690 " fig._resize_canvas(size[0], size[1]);\n",
2691 " fig.send_message(\"refresh\", {});\n",
2692 " };\n",
2693 "}\n",
2694 "\n",
2695 "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
2696 " var x0 = msg['x0'] / mpl.ratio;\n",
2697 " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
2698 " var x1 = msg['x1'] / mpl.ratio;\n",
2699 " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
2700 " x0 = Math.floor(x0) + 0.5;\n",
2701 " y0 = Math.floor(y0) + 0.5;\n",
2702 " x1 = Math.floor(x1) + 0.5;\n",
2703 " y1 = Math.floor(y1) + 0.5;\n",
2704 " var min_x = Math.min(x0, x1);\n",
2705 " var min_y = Math.min(y0, y1);\n",
2706 " var width = Math.abs(x1 - x0);\n",
2707 " var height = Math.abs(y1 - y0);\n",
2708 "\n",
2709 " fig.rubberband_context.clearRect(\n",
2710 " 0, 0, fig.canvas.width, fig.canvas.height);\n",
2711 "\n",
2712 " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
2713 "}\n",
2714 "\n",
2715 "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
2716 " // Updates the figure title.\n",
2717 " fig.header.textContent = msg['label'];\n",
2718 "}\n",
2719 "\n",
2720 "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
2721 " var cursor = msg['cursor'];\n",
2722 " switch(cursor)\n",
2723 " {\n",
2724 " case 0:\n",
2725 " cursor = 'pointer';\n",
2726 " break;\n",
2727 " case 1:\n",
2728 " cursor = 'default';\n",
2729 " break;\n",
2730 " case 2:\n",
2731 " cursor = 'crosshair';\n",
2732 " break;\n",
2733 " case 3:\n",
2734 " cursor = 'move';\n",
2735 " break;\n",
2736 " }\n",
2737 " fig.rubberband_canvas.style.cursor = cursor;\n",
2738 "}\n",
2739 "\n",
2740 "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
2741 " fig.message.textContent = msg['message'];\n",
2742 "}\n",
2743 "\n",
2744 "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
2745 " // Request the server to send over a new figure.\n",
2746 " fig.send_draw_message();\n",
2747 "}\n",
2748 "\n",
2749 "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
2750 " fig.image_mode = msg['mode'];\n",
2751 "}\n",
2752 "\n",
2753 "mpl.figure.prototype.updated_canvas_event = function() {\n",
2754 " // Called whenever the canvas gets updated.\n",
2755 " this.send_message(\"ack\", {});\n",
2756 "}\n",
2757 "\n",
2758 "// A function to construct a web socket function for onmessage handling.\n",
2759 "// Called in the figure constructor.\n",
2760 "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
2761 " return function socket_on_message(evt) {\n",
2762 " if (evt.data instanceof Blob) {\n",
2763 " /* FIXME: We get \"Resource interpreted as Image but\n",
2764 " * transferred with MIME type text/plain:\" errors on\n",
2765 " * Chrome. But how to set the MIME type? It doesn't seem\n",
2766 " * to be part of the websocket stream */\n",
2767 " evt.data.type = \"image/png\";\n",
2768 "\n",
2769 " /* Free the memory for the previous frames */\n",
2770 " if (fig.imageObj.src) {\n",
2771 " (window.URL || window.webkitURL).revokeObjectURL(\n",
2772 " fig.imageObj.src);\n",
2773 " }\n",
2774 "\n",
2775 " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
2776 " evt.data);\n",
2777 " fig.updated_canvas_event();\n",
2778 " fig.waiting = false;\n",
2779 " return;\n",
2780 " }\n",
2781 " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
2782 " fig.imageObj.src = evt.data;\n",
2783 " fig.updated_canvas_event();\n",
2784 " fig.waiting = false;\n",
2785 " return;\n",
2786 " }\n",
2787 "\n",
2788 " var msg = JSON.parse(evt.data);\n",
2789 " var msg_type = msg['type'];\n",
2790 "\n",
2791 " // Call the \"handle_{type}\" callback, which takes\n",
2792 " // the figure and JSON message as its only arguments.\n",
2793 " try {\n",
2794 " var callback = fig[\"handle_\" + msg_type];\n",
2795 " } catch (e) {\n",
2796 " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
2797 " return;\n",
2798 " }\n",
2799 "\n",
2800 " if (callback) {\n",
2801 " try {\n",
2802 " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
2803 " callback(fig, msg);\n",
2804 " } catch (e) {\n",
2805 " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
2806 " }\n",
2807 " }\n",
2808 " };\n",
2809 "}\n",
2810 "\n",
2811 "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
2812 "mpl.findpos = function(e) {\n",
2813 " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
2814 " var targ;\n",
2815 " if (!e)\n",
2816 " e = window.event;\n",
2817 " if (e.target)\n",
2818 " targ = e.target;\n",
2819 " else if (e.srcElement)\n",
2820 " targ = e.srcElement;\n",
2821 " if (targ.nodeType == 3) // defeat Safari bug\n",
2822 " targ = targ.parentNode;\n",
2823 "\n",
2824 " // jQuery normalizes the pageX and pageY\n",
2825 " // pageX,Y are the mouse positions relative to the document\n",
2826 " // offset() returns the position of the element relative to the document\n",
2827 " var x = e.pageX - $(targ).offset().left;\n",
2828 " var y = e.pageY - $(targ).offset().top;\n",
2829 "\n",
2830 " return {\"x\": x, \"y\": y};\n",
2831 "};\n",
2832 "\n",
2833 "/*\n",
2834 " * return a copy of an object with only non-object keys\n",
2835 " * we need this to avoid circular references\n",
2836 " * http://stackoverflow.com/a/24161582/3208463\n",
2837 " */\n",
2838 "function simpleKeys (original) {\n",
2839 " return Object.keys(original).reduce(function (obj, key) {\n",
2840 " if (typeof original[key] !== 'object')\n",
2841 " obj[key] = original[key]\n",
2842 " return obj;\n",
2843 " }, {});\n",
2844 "}\n",
2845 "\n",
2846 "mpl.figure.prototype.mouse_event = function(event, name) {\n",
2847 " var canvas_pos = mpl.findpos(event)\n",
2848 "\n",
2849 " if (name === 'button_press')\n",
2850 " {\n",
2851 " this.canvas.focus();\n",
2852 " this.canvas_div.focus();\n",
2853 " }\n",
2854 "\n",
2855 " var x = canvas_pos.x * mpl.ratio;\n",
2856 " var y = canvas_pos.y * mpl.ratio;\n",
2857 "\n",
2858 " this.send_message(name, {x: x, y: y, button: event.button,\n",
2859 " step: event.step,\n",
2860 " guiEvent: simpleKeys(event)});\n",
2861 "\n",
2862 " /* This prevents the web browser from automatically changing to\n",
2863 " * the text insertion cursor when the button is pressed. We want\n",
2864 " * to control all of the cursor setting manually through the\n",
2865 " * 'cursor' event from matplotlib */\n",
2866 " event.preventDefault();\n",
2867 " return false;\n",
2868 "}\n",
2869 "\n",
2870 "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
2871 " // Handle any extra behaviour associated with a key event\n",
2872 "}\n",
2873 "\n",
2874 "mpl.figure.prototype.key_event = function(event, name) {\n",
2875 "\n",
2876 " // Prevent repeat events\n",
2877 " if (name == 'key_press')\n",
2878 " {\n",
2879 " if (event.which === this._key)\n",
2880 " return;\n",
2881 " else\n",
2882 " this._key = event.which;\n",
2883 " }\n",
2884 " if (name == 'key_release')\n",
2885 " this._key = null;\n",
2886 "\n",
2887 " var value = '';\n",
2888 " if (event.ctrlKey && event.which != 17)\n",
2889 " value += \"ctrl+\";\n",
2890 " if (event.altKey && event.which != 18)\n",
2891 " value += \"alt+\";\n",
2892 " if (event.shiftKey && event.which != 16)\n",
2893 " value += \"shift+\";\n",
2894 "\n",
2895 " value += 'k';\n",
2896 " value += event.which.toString();\n",
2897 "\n",
2898 " this._key_event_extra(event, name);\n",
2899 "\n",
2900 " this.send_message(name, {key: value,\n",
2901 " guiEvent: simpleKeys(event)});\n",
2902 " return false;\n",
2903 "}\n",
2904 "\n",
2905 "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
2906 " if (name == 'download') {\n",
2907 " this.handle_save(this, null);\n",
2908 " } else {\n",
2909 " this.send_message(\"toolbar_button\", {name: name});\n",
2910 " }\n",
2911 "};\n",
2912 "\n",
2913 "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
2914 " this.message.textContent = tooltip;\n",
2915 "};\n",
2916 "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
2917 "\n",
2918 "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
2919 "\n",
2920 "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
2921 " // Create a \"websocket\"-like object which calls the given IPython comm\n",
2922 " // object with the appropriate methods. Currently this is a non binary\n",
2923 " // socket, so there is still some room for performance tuning.\n",
2924 " var ws = {};\n",
2925 "\n",
2926 " ws.close = function() {\n",
2927 " comm.close()\n",
2928 " };\n",
2929 " ws.send = function(m) {\n",
2930 " //console.log('sending', m);\n",
2931 " comm.send(m);\n",
2932 " };\n",
2933 " // Register the callback with on_msg.\n",
2934 " comm.on_msg(function(msg) {\n",
2935 " //console.log('receiving', msg['content']['data'], msg);\n",
2936 " // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
2937 " ws.onmessage(msg['content']['data'])\n",
2938 " });\n",
2939 " return ws;\n",
2940 "}\n",
2941 "\n",
2942 "mpl.mpl_figure_comm = function(comm, msg) {\n",
2943 " // This is the function which gets called when the mpl process\n",
2944 " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
2945 "\n",
2946 " var id = msg.content.data.id;\n",
2947 " // Get hold of the div created by the display call when the Comm\n",
2948 " // socket was opened in Python.\n",
2949 " var element = $(\"#\" + id);\n",
2950 " var ws_proxy = comm_websocket_adapter(comm)\n",
2951 "\n",
2952 " function ondownload(figure, format) {\n",
2953 " window.open(figure.imageObj.src);\n",
2954 " }\n",
2955 "\n",
2956 " var fig = new mpl.figure(id, ws_proxy,\n",
2957 " ondownload,\n",
2958 " element.get(0));\n",
2959 "\n",
2960 " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
2961 " // web socket which is closed, not our websocket->open comm proxy.\n",
2962 " ws_proxy.onopen();\n",
2963 "\n",
2964 " fig.parent_element = element.get(0);\n",
2965 " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
2966 " if (!fig.cell_info) {\n",
2967 " console.error(\"Failed to find cell for figure\", id, fig);\n",
2968 " return;\n",
2969 " }\n",
2970 "\n",
2971 " var output_index = fig.cell_info[2]\n",
2972 " var cell = fig.cell_info[0];\n",
2973 "\n",
2974 "};\n",
2975 "\n",
2976 "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
2977 " var width = fig.canvas.width/mpl.ratio\n",
2978 " fig.root.unbind('remove')\n",
2979 "\n",
2980 " // Update the output cell to use the data from the current canvas.\n",
2981 " fig.push_to_output();\n",
2982 " var dataURL = fig.canvas.toDataURL();\n",
2983 " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
2984 " // the notebook keyboard shortcuts fail.\n",
2985 " IPython.keyboard_manager.enable()\n",
2986 " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
2987 " fig.close_ws(fig, msg);\n",
2988 "}\n",
2989 "\n",
2990 "mpl.figure.prototype.close_ws = function(fig, msg){\n",
2991 " fig.send_message('closing', msg);\n",
2992 " // fig.ws.close()\n",
2993 "}\n",
2994 "\n",
2995 "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
2996 " // Turn the data on the canvas into data in the output cell.\n",
2997 " var width = this.canvas.width/mpl.ratio\n",
2998 " var dataURL = this.canvas.toDataURL();\n",
2999 " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
3000 "}\n",
3001 "\n",
3002 "mpl.figure.prototype.updated_canvas_event = function() {\n",
3003 " // Tell IPython that the notebook contents must change.\n",
3004 " IPython.notebook.set_dirty(true);\n",
3005 " this.send_message(\"ack\", {});\n",
3006 " var fig = this;\n",
3007 " // Wait a second, then push the new image to the DOM so\n",
3008 " // that it is saved nicely (might be nice to debounce this).\n",
3009 " setTimeout(function () { fig.push_to_output() }, 1000);\n",
3010 "}\n",
3011 "\n",
3012 "mpl.figure.prototype._init_toolbar = function() {\n",
3013 " var fig = this;\n",
3014 "\n",
3015 " var nav_element = $('<div/>')\n",
3016 " nav_element.attr('style', 'width: 100%');\n",
3017 " this.root.append(nav_element);\n",
3018 "\n",
3019 " // Define a callback function for later on.\n",
3020 " function toolbar_event(event) {\n",
3021 " return fig.toolbar_button_onclick(event['data']);\n",
3022 " }\n",
3023 " function toolbar_mouse_event(event) {\n",
3024 " return fig.toolbar_button_onmouseover(event['data']);\n",
3025 " }\n",
3026 "\n",
3027 " for(var toolbar_ind in mpl.toolbar_items){\n",
3028 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
3029 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
3030 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
3031 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
3032 "\n",
3033 " if (!name) { continue; };\n",
3034 "\n",
3035 " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
3036 " button.click(method_name, toolbar_event);\n",
3037 " button.mouseover(tooltip, toolbar_mouse_event);\n",
3038 " nav_element.append(button);\n",
3039 " }\n",
3040 "\n",
3041 " // Add the status bar.\n",
3042 " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
3043 " nav_element.append(status_bar);\n",
3044 " this.message = status_bar[0];\n",
3045 "\n",
3046 " // Add the close button to the window.\n",
3047 " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
3048 " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
3049 " button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
3050 " button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
3051 " buttongrp.append(button);\n",
3052 " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
3053 " titlebar.prepend(buttongrp);\n",
3054 "}\n",
3055 "\n",
3056 "mpl.figure.prototype._root_extra_style = function(el){\n",
3057 " var fig = this\n",
3058 " el.on(\"remove\", function(){\n",
3059 "\tfig.close_ws(fig, {});\n",
3060 " });\n",
3061 "}\n",
3062 "\n",
3063 "mpl.figure.prototype._canvas_extra_style = function(el){\n",
3064 " // this is important to make the div 'focusable\n",
3065 " el.attr('tabindex', 0)\n",
3066 " // reach out to IPython and tell the keyboard manager to turn it's self\n",
3067 " // off when our div gets focus\n",
3068 "\n",
3069 " // location in version 3\n",
3070 " if (IPython.notebook.keyboard_manager) {\n",
3071 " IPython.notebook.keyboard_manager.register_events(el);\n",
3072 " }\n",
3073 " else {\n",
3074 " // location in version 2\n",
3075 " IPython.keyboard_manager.register_events(el);\n",
3076 " }\n",
3077 "\n",
3078 "}\n",
3079 "\n",
3080 "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
3081 " var manager = IPython.notebook.keyboard_manager;\n",
3082 " if (!manager)\n",
3083 " manager = IPython.keyboard_manager;\n",
3084 "\n",
3085 " // Check for shift+enter\n",
3086 " if (event.shiftKey && event.which == 13) {\n",
3087 " this.canvas_div.blur();\n",
3088 " // select the cell after this one\n",
3089 " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
3090 " IPython.notebook.select(index + 1);\n",
3091 " }\n",
3092 "}\n",
3093 "\n",
3094 "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
3095 " fig.ondownload(fig, null);\n",
3096 "}\n",
3097 "\n",
3098 "\n",
3099 "mpl.find_output_cell = function(html_output) {\n",
3100 " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
3101 " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
3102 " // IPython event is triggered only after the cells have been serialised, which for\n",
3103 " // our purposes (turning an active figure into a static one), is too late.\n",
3104 " var cells = IPython.notebook.get_cells();\n",
3105 " var ncells = cells.length;\n",
3106 " for (var i=0; i<ncells; i++) {\n",
3107 " var cell = cells[i];\n",
3108 " if (cell.cell_type === 'code'){\n",
3109 " for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
3110 " var data = cell.output_area.outputs[j];\n",
3111 " if (data.data) {\n",
3112 " // IPython >= 3 moved mimebundle to data attribute of output\n",
3113 " data = data.data;\n",
3114 " }\n",
3115 " if (data['text/html'] == html_output) {\n",
3116 " return [cell, data, j];\n",
3117 " }\n",
3118 " }\n",
3119 " }\n",
3120 " }\n",
3121 "}\n",
3122 "\n",
3123 "// Register the function which deals with the matplotlib target/channel.\n",
3124 "// The kernel may be null if the page has been refreshed.\n",
3125 "if (IPython.notebook.kernel != null) {\n",
3126 " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
3127 "}\n"
3128 ],
3129 "text/plain": [
3130 "<IPython.core.display.Javascript object>"
3131 ]
3132 },
3133 "metadata": {},
3134 "output_type": "display_data"
3135 },
3136 {
3137 "data": {
3138 "text/html": [
3139 "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkAAAARMCAYAAADBUV/1AAAAAXNSR0IArs4c6QAAQABJREFUeAHs0IEAAAAAgKD9qRcphAoDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGA0ZW4AADgUSURBVGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYuB06EAAAAAAQ5G+9wAiFkAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMHADAXaRAAGsLEZEAAAAAElFTkSuQmCC\" width=\"800\">"
3140 ],
3141 "text/plain": [
3142 "<IPython.core.display.HTML object>"
3143 ]
3144 },
3145 "metadata": {},
3146 "output_type": "display_data"
3147 },
3148 {
3149 "name": "stdout",
3150 "output_type": "stream",
3151 "text": [
3152 "gamma = 0.01 accuracy = 0.91 AUC = 1.00\n",
3153 "gamma = 0.10 accuracy = 0.90 AUC = 0.98\n",
3154 "gamma = 0.20 accuracy = 0.90 AUC = 0.66\n",
3155 "gamma = 1.00 accuracy = 0.90 AUC = 0.50\n"
3156 ]
3157 }
3158 ],
3159 "source": [
3160 "from matplotlib import cm\n",
3161 "\n",
3162 "X_train, X_test, y_train, y_test = train_test_split(X, y_binary_imbalanced, random_state=0)\n",
3163 "\n",
3164 "plt.figure()\n",
3165 "plt.xlim([-0.01, 1.00])\n",
3166 "plt.ylim([-0.01, 1.01])\n",
3167 "for g in [0.01, 0.1, 0.20, 1]:\n",
3168 " svm = SVC(gamma=g).fit(X_train, y_train)\n",
3169 " y_score_svm = svm.decision_function(X_test)\n",
3170 " fpr_svm, tpr_svm, _ = roc_curve(y_test, y_score_svm)\n",
3171 " roc_auc_svm = auc(fpr_svm, tpr_svm)\n",
3172 " accuracy_svm = svm.score(X_test, y_test)\n",
3173 " print(\"gamma = {:.2f} accuracy = {:.2f} AUC = {:.2f}\".format(g, accuracy_svm, \n",
3174 " roc_auc_svm))\n",
3175 " plt.plot(fpr_svm, tpr_svm, lw=3, alpha=0.7, \n",
3176 " label='SVM (gamma = {:0.2f}, area = {:0.2f})'.format(g, roc_auc_svm))\n",
3177 "\n",
3178 "plt.xlabel('False Positive Rate', fontsize=16)\n",
3179 "plt.ylabel('True Positive Rate (Recall)', fontsize=16)\n",
3180 "plt.plot([0, 1], [0, 1], color='k', lw=0.5, linestyle='--')\n",
3181 "plt.legend(loc=\"lower right\", fontsize=11)\n",
3182 "plt.title('ROC curve: (1-of-10 digits classifier)', fontsize=16)\n",
3183 "plt.axes().set_aspect('equal')\n",
3184 "\n",
3185 "plt.show()"
3186 ]
3187 },
3188 {
3189 "cell_type": "markdown",
3190 "metadata": {},
3191 "source": [
3192 "### Evaluation measures for multi-class classification"
3193 ]
3194 },
3195 {
3196 "cell_type": "markdown",
3197 "metadata": {},
3198 "source": [
3199 "#### Multi-class confusion matrix"
3200 ]
3201 },
3202 {
3203 "cell_type": "code",
3204 "execution_count": 23,
3205 "metadata": {
3206 "collapsed": false,
3207 "scrolled": false
3208 },
3209 "outputs": [
3210 {
3211 "data": {
3212 "application/javascript": [
3213 "/* Put everything inside the global mpl namespace */\n",
3214 "window.mpl = {};\n",
3215 "\n",
3216 "\n",
3217 "mpl.get_websocket_type = function() {\n",
3218 " if (typeof(WebSocket) !== 'undefined') {\n",
3219 " return WebSocket;\n",
3220 " } else if (typeof(MozWebSocket) !== 'undefined') {\n",
3221 " return MozWebSocket;\n",
3222 " } else {\n",
3223 " alert('Your browser does not have WebSocket support.' +\n",
3224 " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
3225 " 'Firefox 4 and 5 are also supported but you ' +\n",
3226 " 'have to enable WebSockets in about:config.');\n",
3227 " };\n",
3228 "}\n",
3229 "\n",
3230 "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
3231 " this.id = figure_id;\n",
3232 "\n",
3233 " this.ws = websocket;\n",
3234 "\n",
3235 " this.supports_binary = (this.ws.binaryType != undefined);\n",
3236 "\n",
3237 " if (!this.supports_binary) {\n",
3238 " var warnings = document.getElementById(\"mpl-warnings\");\n",
3239 " if (warnings) {\n",
3240 " warnings.style.display = 'block';\n",
3241 " warnings.textContent = (\n",
3242 " \"This browser does not support binary websocket messages. \" +\n",
3243 " \"Performance may be slow.\");\n",
3244 " }\n",
3245 " }\n",
3246 "\n",
3247 " this.imageObj = new Image();\n",
3248 "\n",
3249 " this.context = undefined;\n",
3250 " this.message = undefined;\n",
3251 " this.canvas = undefined;\n",
3252 " this.rubberband_canvas = undefined;\n",
3253 " this.rubberband_context = undefined;\n",
3254 " this.format_dropdown = undefined;\n",
3255 "\n",
3256 " this.image_mode = 'full';\n",
3257 "\n",
3258 " this.root = $('<div/>');\n",
3259 " this._root_extra_style(this.root)\n",
3260 " this.root.attr('style', 'display: inline-block');\n",
3261 "\n",
3262 " $(parent_element).append(this.root);\n",
3263 "\n",
3264 " this._init_header(this);\n",
3265 " this._init_canvas(this);\n",
3266 " this._init_toolbar(this);\n",
3267 "\n",
3268 " var fig = this;\n",
3269 "\n",
3270 " this.waiting = false;\n",
3271 "\n",
3272 " this.ws.onopen = function () {\n",
3273 " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
3274 " fig.send_message(\"send_image_mode\", {});\n",
3275 " if (mpl.ratio != 1) {\n",
3276 " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
3277 " }\n",
3278 " fig.send_message(\"refresh\", {});\n",
3279 " }\n",
3280 "\n",
3281 " this.imageObj.onload = function() {\n",
3282 " if (fig.image_mode == 'full') {\n",
3283 " // Full images could contain transparency (where diff images\n",
3284 " // almost always do), so we need to clear the canvas so that\n",
3285 " // there is no ghosting.\n",
3286 " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
3287 " }\n",
3288 " fig.context.drawImage(fig.imageObj, 0, 0);\n",
3289 " };\n",
3290 "\n",
3291 " this.imageObj.onunload = function() {\n",
3292 " this.ws.close();\n",
3293 " }\n",
3294 "\n",
3295 " this.ws.onmessage = this._make_on_message_function(this);\n",
3296 "\n",
3297 " this.ondownload = ondownload;\n",
3298 "}\n",
3299 "\n",
3300 "mpl.figure.prototype._init_header = function() {\n",
3301 " var titlebar = $(\n",
3302 " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
3303 " 'ui-helper-clearfix\"/>');\n",
3304 " var titletext = $(\n",
3305 " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
3306 " 'text-align: center; padding: 3px;\"/>');\n",
3307 " titlebar.append(titletext)\n",
3308 " this.root.append(titlebar);\n",
3309 " this.header = titletext[0];\n",
3310 "}\n",
3311 "\n",
3312 "\n",
3313 "\n",
3314 "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
3315 "\n",
3316 "}\n",
3317 "\n",
3318 "\n",
3319 "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
3320 "\n",
3321 "}\n",
3322 "\n",
3323 "mpl.figure.prototype._init_canvas = function() {\n",
3324 " var fig = this;\n",
3325 "\n",
3326 " var canvas_div = $('<div/>');\n",
3327 "\n",
3328 " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
3329 "\n",
3330 " function canvas_keyboard_event(event) {\n",
3331 " return fig.key_event(event, event['data']);\n",
3332 " }\n",
3333 "\n",
3334 " canvas_div.keydown('key_press', canvas_keyboard_event);\n",
3335 " canvas_div.keyup('key_release', canvas_keyboard_event);\n",
3336 " this.canvas_div = canvas_div\n",
3337 " this._canvas_extra_style(canvas_div)\n",
3338 " this.root.append(canvas_div);\n",
3339 "\n",
3340 " var canvas = $('<canvas/>');\n",
3341 " canvas.addClass('mpl-canvas');\n",
3342 " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
3343 "\n",
3344 " this.canvas = canvas[0];\n",
3345 " this.context = canvas[0].getContext(\"2d\");\n",
3346 "\n",
3347 " var backingStore = this.context.backingStorePixelRatio ||\n",
3348 "\tthis.context.webkitBackingStorePixelRatio ||\n",
3349 "\tthis.context.mozBackingStorePixelRatio ||\n",
3350 "\tthis.context.msBackingStorePixelRatio ||\n",
3351 "\tthis.context.oBackingStorePixelRatio ||\n",
3352 "\tthis.context.backingStorePixelRatio || 1;\n",
3353 "\n",
3354 " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
3355 "\n",
3356 " var rubberband = $('<canvas/>');\n",
3357 " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
3358 "\n",
3359 " var pass_mouse_events = true;\n",
3360 "\n",
3361 " canvas_div.resizable({\n",
3362 " start: function(event, ui) {\n",
3363 " pass_mouse_events = false;\n",
3364 " },\n",
3365 " resize: function(event, ui) {\n",
3366 " fig.request_resize(ui.size.width, ui.size.height);\n",
3367 " },\n",
3368 " stop: function(event, ui) {\n",
3369 " pass_mouse_events = true;\n",
3370 " fig.request_resize(ui.size.width, ui.size.height);\n",
3371 " },\n",
3372 " });\n",
3373 "\n",
3374 " function mouse_event_fn(event) {\n",
3375 " if (pass_mouse_events)\n",
3376 " return fig.mouse_event(event, event['data']);\n",
3377 " }\n",
3378 "\n",
3379 " rubberband.mousedown('button_press', mouse_event_fn);\n",
3380 " rubberband.mouseup('button_release', mouse_event_fn);\n",
3381 " // Throttle sequential mouse events to 1 every 20ms.\n",
3382 " rubberband.mousemove('motion_notify', mouse_event_fn);\n",
3383 "\n",
3384 " rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
3385 " rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
3386 "\n",
3387 " canvas_div.on(\"wheel\", function (event) {\n",
3388 " event = event.originalEvent;\n",
3389 " event['data'] = 'scroll'\n",
3390 " if (event.deltaY < 0) {\n",
3391 " event.step = 1;\n",
3392 " } else {\n",
3393 " event.step = -1;\n",
3394 " }\n",
3395 " mouse_event_fn(event);\n",
3396 " });\n",
3397 "\n",
3398 " canvas_div.append(canvas);\n",
3399 " canvas_div.append(rubberband);\n",
3400 "\n",
3401 " this.rubberband = rubberband;\n",
3402 " this.rubberband_canvas = rubberband[0];\n",
3403 " this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
3404 " this.rubberband_context.strokeStyle = \"#000000\";\n",
3405 "\n",
3406 " this._resize_canvas = function(width, height) {\n",
3407 " // Keep the size of the canvas, canvas container, and rubber band\n",
3408 " // canvas in synch.\n",
3409 " canvas_div.css('width', width)\n",
3410 " canvas_div.css('height', height)\n",
3411 "\n",
3412 " canvas.attr('width', width * mpl.ratio);\n",
3413 " canvas.attr('height', height * mpl.ratio);\n",
3414 " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
3415 "\n",
3416 " rubberband.attr('width', width);\n",
3417 " rubberband.attr('height', height);\n",
3418 " }\n",
3419 "\n",
3420 " // Set the figure to an initial 600x600px, this will subsequently be updated\n",
3421 " // upon first draw.\n",
3422 " this._resize_canvas(600, 600);\n",
3423 "\n",
3424 " // Disable right mouse context menu.\n",
3425 " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
3426 " return false;\n",
3427 " });\n",
3428 "\n",
3429 " function set_focus () {\n",
3430 " canvas.focus();\n",
3431 " canvas_div.focus();\n",
3432 " }\n",
3433 "\n",
3434 " window.setTimeout(set_focus, 100);\n",
3435 "}\n",
3436 "\n",
3437 "mpl.figure.prototype._init_toolbar = function() {\n",
3438 " var fig = this;\n",
3439 "\n",
3440 " var nav_element = $('<div/>')\n",
3441 " nav_element.attr('style', 'width: 100%');\n",
3442 " this.root.append(nav_element);\n",
3443 "\n",
3444 " // Define a callback function for later on.\n",
3445 " function toolbar_event(event) {\n",
3446 " return fig.toolbar_button_onclick(event['data']);\n",
3447 " }\n",
3448 " function toolbar_mouse_event(event) {\n",
3449 " return fig.toolbar_button_onmouseover(event['data']);\n",
3450 " }\n",
3451 "\n",
3452 " for(var toolbar_ind in mpl.toolbar_items) {\n",
3453 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
3454 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
3455 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
3456 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
3457 "\n",
3458 " if (!name) {\n",
3459 " // put a spacer in here.\n",
3460 " continue;\n",
3461 " }\n",
3462 " var button = $('<button/>');\n",
3463 " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
3464 " 'ui-button-icon-only');\n",
3465 " button.attr('role', 'button');\n",
3466 " button.attr('aria-disabled', 'false');\n",
3467 " button.click(method_name, toolbar_event);\n",
3468 " button.mouseover(tooltip, toolbar_mouse_event);\n",
3469 "\n",
3470 " var icon_img = $('<span/>');\n",
3471 " icon_img.addClass('ui-button-icon-primary ui-icon');\n",
3472 " icon_img.addClass(image);\n",
3473 " icon_img.addClass('ui-corner-all');\n",
3474 "\n",
3475 " var tooltip_span = $('<span/>');\n",
3476 " tooltip_span.addClass('ui-button-text');\n",
3477 " tooltip_span.html(tooltip);\n",
3478 "\n",
3479 " button.append(icon_img);\n",
3480 " button.append(tooltip_span);\n",
3481 "\n",
3482 " nav_element.append(button);\n",
3483 " }\n",
3484 "\n",
3485 " var fmt_picker_span = $('<span/>');\n",
3486 "\n",
3487 " var fmt_picker = $('<select/>');\n",
3488 " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
3489 " fmt_picker_span.append(fmt_picker);\n",
3490 " nav_element.append(fmt_picker_span);\n",
3491 " this.format_dropdown = fmt_picker[0];\n",
3492 "\n",
3493 " for (var ind in mpl.extensions) {\n",
3494 " var fmt = mpl.extensions[ind];\n",
3495 " var option = $(\n",
3496 " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
3497 " fmt_picker.append(option)\n",
3498 " }\n",
3499 "\n",
3500 " // Add hover states to the ui-buttons\n",
3501 " $( \".ui-button\" ).hover(\n",
3502 " function() { $(this).addClass(\"ui-state-hover\");},\n",
3503 " function() { $(this).removeClass(\"ui-state-hover\");}\n",
3504 " );\n",
3505 "\n",
3506 " var status_bar = $('<span class=\"mpl-message\"/>');\n",
3507 " nav_element.append(status_bar);\n",
3508 " this.message = status_bar[0];\n",
3509 "}\n",
3510 "\n",
3511 "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
3512 " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
3513 " // which will in turn request a refresh of the image.\n",
3514 " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
3515 "}\n",
3516 "\n",
3517 "mpl.figure.prototype.send_message = function(type, properties) {\n",
3518 " properties['type'] = type;\n",
3519 " properties['figure_id'] = this.id;\n",
3520 " this.ws.send(JSON.stringify(properties));\n",
3521 "}\n",
3522 "\n",
3523 "mpl.figure.prototype.send_draw_message = function() {\n",
3524 " if (!this.waiting) {\n",
3525 " this.waiting = true;\n",
3526 " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
3527 " }\n",
3528 "}\n",
3529 "\n",
3530 "\n",
3531 "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
3532 " var format_dropdown = fig.format_dropdown;\n",
3533 " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
3534 " fig.ondownload(fig, format);\n",
3535 "}\n",
3536 "\n",
3537 "\n",
3538 "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
3539 " var size = msg['size'];\n",
3540 " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
3541 " fig._resize_canvas(size[0], size[1]);\n",
3542 " fig.send_message(\"refresh\", {});\n",
3543 " };\n",
3544 "}\n",
3545 "\n",
3546 "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
3547 " var x0 = msg['x0'] / mpl.ratio;\n",
3548 " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
3549 " var x1 = msg['x1'] / mpl.ratio;\n",
3550 " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
3551 " x0 = Math.floor(x0) + 0.5;\n",
3552 " y0 = Math.floor(y0) + 0.5;\n",
3553 " x1 = Math.floor(x1) + 0.5;\n",
3554 " y1 = Math.floor(y1) + 0.5;\n",
3555 " var min_x = Math.min(x0, x1);\n",
3556 " var min_y = Math.min(y0, y1);\n",
3557 " var width = Math.abs(x1 - x0);\n",
3558 " var height = Math.abs(y1 - y0);\n",
3559 "\n",
3560 " fig.rubberband_context.clearRect(\n",
3561 " 0, 0, fig.canvas.width, fig.canvas.height);\n",
3562 "\n",
3563 " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
3564 "}\n",
3565 "\n",
3566 "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
3567 " // Updates the figure title.\n",
3568 " fig.header.textContent = msg['label'];\n",
3569 "}\n",
3570 "\n",
3571 "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
3572 " var cursor = msg['cursor'];\n",
3573 " switch(cursor)\n",
3574 " {\n",
3575 " case 0:\n",
3576 " cursor = 'pointer';\n",
3577 " break;\n",
3578 " case 1:\n",
3579 " cursor = 'default';\n",
3580 " break;\n",
3581 " case 2:\n",
3582 " cursor = 'crosshair';\n",
3583 " break;\n",
3584 " case 3:\n",
3585 " cursor = 'move';\n",
3586 " break;\n",
3587 " }\n",
3588 " fig.rubberband_canvas.style.cursor = cursor;\n",
3589 "}\n",
3590 "\n",
3591 "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
3592 " fig.message.textContent = msg['message'];\n",
3593 "}\n",
3594 "\n",
3595 "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
3596 " // Request the server to send over a new figure.\n",
3597 " fig.send_draw_message();\n",
3598 "}\n",
3599 "\n",
3600 "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
3601 " fig.image_mode = msg['mode'];\n",
3602 "}\n",
3603 "\n",
3604 "mpl.figure.prototype.updated_canvas_event = function() {\n",
3605 " // Called whenever the canvas gets updated.\n",
3606 " this.send_message(\"ack\", {});\n",
3607 "}\n",
3608 "\n",
3609 "// A function to construct a web socket function for onmessage handling.\n",
3610 "// Called in the figure constructor.\n",
3611 "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
3612 " return function socket_on_message(evt) {\n",
3613 " if (evt.data instanceof Blob) {\n",
3614 " /* FIXME: We get \"Resource interpreted as Image but\n",
3615 " * transferred with MIME type text/plain:\" errors on\n",
3616 " * Chrome. But how to set the MIME type? It doesn't seem\n",
3617 " * to be part of the websocket stream */\n",
3618 " evt.data.type = \"image/png\";\n",
3619 "\n",
3620 " /* Free the memory for the previous frames */\n",
3621 " if (fig.imageObj.src) {\n",
3622 " (window.URL || window.webkitURL).revokeObjectURL(\n",
3623 " fig.imageObj.src);\n",
3624 " }\n",
3625 "\n",
3626 " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
3627 " evt.data);\n",
3628 " fig.updated_canvas_event();\n",
3629 " fig.waiting = false;\n",
3630 " return;\n",
3631 " }\n",
3632 " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
3633 " fig.imageObj.src = evt.data;\n",
3634 " fig.updated_canvas_event();\n",
3635 " fig.waiting = false;\n",
3636 " return;\n",
3637 " }\n",
3638 "\n",
3639 " var msg = JSON.parse(evt.data);\n",
3640 " var msg_type = msg['type'];\n",
3641 "\n",
3642 " // Call the \"handle_{type}\" callback, which takes\n",
3643 " // the figure and JSON message as its only arguments.\n",
3644 " try {\n",
3645 " var callback = fig[\"handle_\" + msg_type];\n",
3646 " } catch (e) {\n",
3647 " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
3648 " return;\n",
3649 " }\n",
3650 "\n",
3651 " if (callback) {\n",
3652 " try {\n",
3653 " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
3654 " callback(fig, msg);\n",
3655 " } catch (e) {\n",
3656 " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
3657 " }\n",
3658 " }\n",
3659 " };\n",
3660 "}\n",
3661 "\n",
3662 "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
3663 "mpl.findpos = function(e) {\n",
3664 " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
3665 " var targ;\n",
3666 " if (!e)\n",
3667 " e = window.event;\n",
3668 " if (e.target)\n",
3669 " targ = e.target;\n",
3670 " else if (e.srcElement)\n",
3671 " targ = e.srcElement;\n",
3672 " if (targ.nodeType == 3) // defeat Safari bug\n",
3673 " targ = targ.parentNode;\n",
3674 "\n",
3675 " // jQuery normalizes the pageX and pageY\n",
3676 " // pageX,Y are the mouse positions relative to the document\n",
3677 " // offset() returns the position of the element relative to the document\n",
3678 " var x = e.pageX - $(targ).offset().left;\n",
3679 " var y = e.pageY - $(targ).offset().top;\n",
3680 "\n",
3681 " return {\"x\": x, \"y\": y};\n",
3682 "};\n",
3683 "\n",
3684 "/*\n",
3685 " * return a copy of an object with only non-object keys\n",
3686 " * we need this to avoid circular references\n",
3687 " * http://stackoverflow.com/a/24161582/3208463\n",
3688 " */\n",
3689 "function simpleKeys (original) {\n",
3690 " return Object.keys(original).reduce(function (obj, key) {\n",
3691 " if (typeof original[key] !== 'object')\n",
3692 " obj[key] = original[key]\n",
3693 " return obj;\n",
3694 " }, {});\n",
3695 "}\n",
3696 "\n",
3697 "mpl.figure.prototype.mouse_event = function(event, name) {\n",
3698 " var canvas_pos = mpl.findpos(event)\n",
3699 "\n",
3700 " if (name === 'button_press')\n",
3701 " {\n",
3702 " this.canvas.focus();\n",
3703 " this.canvas_div.focus();\n",
3704 " }\n",
3705 "\n",
3706 " var x = canvas_pos.x * mpl.ratio;\n",
3707 " var y = canvas_pos.y * mpl.ratio;\n",
3708 "\n",
3709 " this.send_message(name, {x: x, y: y, button: event.button,\n",
3710 " step: event.step,\n",
3711 " guiEvent: simpleKeys(event)});\n",
3712 "\n",
3713 " /* This prevents the web browser from automatically changing to\n",
3714 " * the text insertion cursor when the button is pressed. We want\n",
3715 " * to control all of the cursor setting manually through the\n",
3716 " * 'cursor' event from matplotlib */\n",
3717 " event.preventDefault();\n",
3718 " return false;\n",
3719 "}\n",
3720 "\n",
3721 "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
3722 " // Handle any extra behaviour associated with a key event\n",
3723 "}\n",
3724 "\n",
3725 "mpl.figure.prototype.key_event = function(event, name) {\n",
3726 "\n",
3727 " // Prevent repeat events\n",
3728 " if (name == 'key_press')\n",
3729 " {\n",
3730 " if (event.which === this._key)\n",
3731 " return;\n",
3732 " else\n",
3733 " this._key = event.which;\n",
3734 " }\n",
3735 " if (name == 'key_release')\n",
3736 " this._key = null;\n",
3737 "\n",
3738 " var value = '';\n",
3739 " if (event.ctrlKey && event.which != 17)\n",
3740 " value += \"ctrl+\";\n",
3741 " if (event.altKey && event.which != 18)\n",
3742 " value += \"alt+\";\n",
3743 " if (event.shiftKey && event.which != 16)\n",
3744 " value += \"shift+\";\n",
3745 "\n",
3746 " value += 'k';\n",
3747 " value += event.which.toString();\n",
3748 "\n",
3749 " this._key_event_extra(event, name);\n",
3750 "\n",
3751 " this.send_message(name, {key: value,\n",
3752 " guiEvent: simpleKeys(event)});\n",
3753 " return false;\n",
3754 "}\n",
3755 "\n",
3756 "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
3757 " if (name == 'download') {\n",
3758 " this.handle_save(this, null);\n",
3759 " } else {\n",
3760 " this.send_message(\"toolbar_button\", {name: name});\n",
3761 " }\n",
3762 "};\n",
3763 "\n",
3764 "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
3765 " this.message.textContent = tooltip;\n",
3766 "};\n",
3767 "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
3768 "\n",
3769 "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
3770 "\n",
3771 "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
3772 " // Create a \"websocket\"-like object which calls the given IPython comm\n",
3773 " // object with the appropriate methods. Currently this is a non binary\n",
3774 " // socket, so there is still some room for performance tuning.\n",
3775 " var ws = {};\n",
3776 "\n",
3777 " ws.close = function() {\n",
3778 " comm.close()\n",
3779 " };\n",
3780 " ws.send = function(m) {\n",
3781 " //console.log('sending', m);\n",
3782 " comm.send(m);\n",
3783 " };\n",
3784 " // Register the callback with on_msg.\n",
3785 " comm.on_msg(function(msg) {\n",
3786 " //console.log('receiving', msg['content']['data'], msg);\n",
3787 " // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
3788 " ws.onmessage(msg['content']['data'])\n",
3789 " });\n",
3790 " return ws;\n",
3791 "}\n",
3792 "\n",
3793 "mpl.mpl_figure_comm = function(comm, msg) {\n",
3794 " // This is the function which gets called when the mpl process\n",
3795 " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
3796 "\n",
3797 " var id = msg.content.data.id;\n",
3798 " // Get hold of the div created by the display call when the Comm\n",
3799 " // socket was opened in Python.\n",
3800 " var element = $(\"#\" + id);\n",
3801 " var ws_proxy = comm_websocket_adapter(comm)\n",
3802 "\n",
3803 " function ondownload(figure, format) {\n",
3804 " window.open(figure.imageObj.src);\n",
3805 " }\n",
3806 "\n",
3807 " var fig = new mpl.figure(id, ws_proxy,\n",
3808 " ondownload,\n",
3809 " element.get(0));\n",
3810 "\n",
3811 " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
3812 " // web socket which is closed, not our websocket->open comm proxy.\n",
3813 " ws_proxy.onopen();\n",
3814 "\n",
3815 " fig.parent_element = element.get(0);\n",
3816 " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
3817 " if (!fig.cell_info) {\n",
3818 " console.error(\"Failed to find cell for figure\", id, fig);\n",
3819 " return;\n",
3820 " }\n",
3821 "\n",
3822 " var output_index = fig.cell_info[2]\n",
3823 " var cell = fig.cell_info[0];\n",
3824 "\n",
3825 "};\n",
3826 "\n",
3827 "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
3828 " var width = fig.canvas.width/mpl.ratio\n",
3829 " fig.root.unbind('remove')\n",
3830 "\n",
3831 " // Update the output cell to use the data from the current canvas.\n",
3832 " fig.push_to_output();\n",
3833 " var dataURL = fig.canvas.toDataURL();\n",
3834 " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
3835 " // the notebook keyboard shortcuts fail.\n",
3836 " IPython.keyboard_manager.enable()\n",
3837 " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
3838 " fig.close_ws(fig, msg);\n",
3839 "}\n",
3840 "\n",
3841 "mpl.figure.prototype.close_ws = function(fig, msg){\n",
3842 " fig.send_message('closing', msg);\n",
3843 " // fig.ws.close()\n",
3844 "}\n",
3845 "\n",
3846 "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
3847 " // Turn the data on the canvas into data in the output cell.\n",
3848 " var width = this.canvas.width/mpl.ratio\n",
3849 " var dataURL = this.canvas.toDataURL();\n",
3850 " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
3851 "}\n",
3852 "\n",
3853 "mpl.figure.prototype.updated_canvas_event = function() {\n",
3854 " // Tell IPython that the notebook contents must change.\n",
3855 " IPython.notebook.set_dirty(true);\n",
3856 " this.send_message(\"ack\", {});\n",
3857 " var fig = this;\n",
3858 " // Wait a second, then push the new image to the DOM so\n",
3859 " // that it is saved nicely (might be nice to debounce this).\n",
3860 " setTimeout(function () { fig.push_to_output() }, 1000);\n",
3861 "}\n",
3862 "\n",
3863 "mpl.figure.prototype._init_toolbar = function() {\n",
3864 " var fig = this;\n",
3865 "\n",
3866 " var nav_element = $('<div/>')\n",
3867 " nav_element.attr('style', 'width: 100%');\n",
3868 " this.root.append(nav_element);\n",
3869 "\n",
3870 " // Define a callback function for later on.\n",
3871 " function toolbar_event(event) {\n",
3872 " return fig.toolbar_button_onclick(event['data']);\n",
3873 " }\n",
3874 " function toolbar_mouse_event(event) {\n",
3875 " return fig.toolbar_button_onmouseover(event['data']);\n",
3876 " }\n",
3877 "\n",
3878 " for(var toolbar_ind in mpl.toolbar_items){\n",
3879 " var name = mpl.toolbar_items[toolbar_ind][0];\n",
3880 " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
3881 " var image = mpl.toolbar_items[toolbar_ind][2];\n",
3882 " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
3883 "\n",
3884 " if (!name) { continue; };\n",
3885 "\n",
3886 " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
3887 " button.click(method_name, toolbar_event);\n",
3888 " button.mouseover(tooltip, toolbar_mouse_event);\n",
3889 " nav_element.append(button);\n",
3890 " }\n",
3891 "\n",
3892 " // Add the status bar.\n",
3893 " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
3894 " nav_element.append(status_bar);\n",
3895 " this.message = status_bar[0];\n",
3896 "\n",
3897 " // Add the close button to the window.\n",
3898 " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
3899 " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
3900 " button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
3901 " button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
3902 " buttongrp.append(button);\n",
3903 " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
3904 " titlebar.prepend(buttongrp);\n",
3905 "}\n",
3906 "\n",
3907 "mpl.figure.prototype._root_extra_style = function(el){\n",
3908 " var fig = this\n",
3909 " el.on(\"remove\", function(){\n",
3910 "\tfig.close_ws(fig, {});\n",
3911 " });\n",
3912 "}\n",
3913 "\n",
3914 "mpl.figure.prototype._canvas_extra_style = function(el){\n",
3915 " // this is important to make the div 'focusable\n",
3916 " el.attr('tabindex', 0)\n",
3917 " // reach out to IPython and tell the keyboard manager to turn it's self\n",
3918 " // off when our div gets focus\n",
3919 "\n",
3920 " // location in version 3\n",
3921 " if (IPython.notebook.keyboard_manager) {\n",
3922 " IPython.notebook.keyboard_manager.register_events(el);\n",
3923 " }\n",
3924 " else {\n",
3925 " // location in version 2\n",
3926 " IPython.keyboard_manager.register_events(el);\n",
3927 " }\n",
3928 "\n",
3929 "}\n",
3930 "\n",
3931 "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
3932 " var manager = IPython.notebook.keyboard_manager;\n",
3933 " if (!manager)\n",
3934 " manager = IPython.keyboard_manager;\n",
3935 "\n",
3936 " // Check for shift+enter\n",
3937 " if (event.shiftKey && event.which == 13) {\n",
3938 " this.canvas_div.blur();\n",
3939 " // select the cell after this one\n",
3940 " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
3941 " IPython.notebook.select(index + 1);\n",
3942 " }\n",
3943 "}\n",
3944 "\n",
3945 "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
3946 " fig.ondownload(fig, null);\n",
3947 "}\n",
3948 "\n",
3949 "\n",
3950 "mpl.find_output_cell = function(html_output) {\n",
3951 " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
3952 " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
3953 " // IPython event is triggered only after the cells have been serialised, which for\n",
3954 " // our purposes (turning an active figure into a static one), is too late.\n",
3955 " var cells = IPython.notebook.get_cells();\n",
3956 " var ncells = cells.length;\n",
3957 " for (var i=0; i<ncells; i++) {\n",
3958 " var cell = cells[i];\n",
3959 " if (cell.cell_type === 'code'){\n",
3960 " for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
3961 " var data = cell.output_area.outputs[j];\n",
3962 " if (data.data) {\n",
3963 " // IPython >= 3 moved mimebundle to data attribute of output\n",
3964 " data = data.data;\n",
3965 " }\n",
3966 " if (data['text/html'] == html_output) {\n",
3967 " return [cell, data, j];\n",
3968 " }\n",
3969 " }\n",
3970 " }\n",
3971 " }\n",
3972 "}\n",
3973 "\n",
3974 "// Register the function which deals with the matplotlib target/channel.\n",
3975 "// The kernel may be null if the page has been refreshed.\n",
3976 "if (IPython.notebook.kernel != null) {\n",
3977 " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
3978 "}\n"
3979 ],
3980 "text/plain": [
3981 "<IPython.core.display.Javascript object>"
3982 ]
3983 },
3984 "metadata": {},
3985 "output_type": "display_data"
3986 },
3987 {
3988 "data": {
3989 "text/html": [
3990 "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABEwAAAMgCAYAAAA5kPcVAAAAAXNSR0IArs4c6QAAPBBJREFUeAHt0DEBAAAAwqD1T20MH4hAYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwY