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