This diff has been collapsed as it changes many lines, (1901 lines changed) Show them Hide them | |||
@@ -5,8 +5,8 | |||
|
5 | 5 | "execution_count": 1, |
|
6 | 6 | "metadata": { |
|
7 | 7 | "ExecuteTime": { |
|
8 |
"end_time": "2018-0 |
|
|
9 |
"start_time": "2018-0 |
|
|
8 | "end_time": "2018-07-04T06:49:55.623000Z", | |
|
9 | "start_time": "2018-07-04T06:49:55.151858Z" | |
|
10 | 10 | } |
|
11 | 11 | }, |
|
12 | 12 | "outputs": [ |
@@ -50,6 +50,7 | |||
|
50 | 50 | "from lfrcompliance.test_engine.testcontext import *\n", |
|
51 | 51 | "from lfrcompliance.test_engine.result_loader import *\n", |
|
52 | 52 | "from lfrcompliance.tcpackets.constants import *\n", |
|
53 | "from lfrcompliance.test_engine.tests.analysis import TF\n", | |
|
53 | 54 | "import multiprocessing.dummy\n", |
|
54 | 55 | "from dateutil import parser\n", |
|
55 | 56 | "import gc\n", |
@@ -74,8 +75,8 | |||
|
74 | 75 | "execution_count": 2, |
|
75 | 76 | "metadata": { |
|
76 | 77 | "ExecuteTime": { |
|
77 |
"end_time": "2018-0 |
|
|
78 |
"start_time": "2018-0 |
|
|
78 | "end_time": "2018-07-04T06:49:59.147479Z", | |
|
79 | "start_time": "2018-07-04T06:49:59.132804Z" | |
|
79 | 80 | } |
|
80 | 81 | }, |
|
81 | 82 | "outputs": [], |
@@ -1726,11 +1727,11 | |||
|
1726 | 1727 | }, |
|
1727 | 1728 | { |
|
1728 | 1729 | "cell_type": "code", |
|
1729 |
"execution_count": |
|
|
1730 | "execution_count": 4, | |
|
1730 | 1731 | "metadata": { |
|
1731 | 1732 | "ExecuteTime": { |
|
1732 |
"end_time": "2018-0 |
|
|
1733 |
"start_time": "2018-0 |
|
|
1733 | "end_time": "2018-07-04T06:53:55.741692Z", | |
|
1734 | "start_time": "2018-07-04T06:53:55.733872Z" | |
|
1734 | 1735 | } |
|
1735 | 1736 | }, |
|
1736 | 1737 | "outputs": [], |
@@ -1765,11 +1766,11 | |||
|
1765 | 1766 | }, |
|
1766 | 1767 | { |
|
1767 | 1768 | "cell_type": "code", |
|
1768 |
"execution_count": |
|
|
1769 | "execution_count": 33, | |
|
1769 | 1770 | "metadata": { |
|
1770 | 1771 | "ExecuteTime": { |
|
1771 |
"end_time": "2018-0 |
|
|
1772 |
"start_time": "2018-0 |
|
|
1772 | "end_time": "2018-07-04T13:22:50.356614Z", | |
|
1773 | "start_time": "2018-07-04T13:22:48.981284Z" | |
|
1773 | 1774 | } |
|
1774 | 1775 | }, |
|
1775 | 1776 | "outputs": [], |
@@ -1869,117 +1870,1747 | |||
|
1869 | 1870 | ] |
|
1870 | 1871 | }, |
|
1871 | 1872 | { |
|
1872 | "cell_type": "markdown", | |
|
1873 | "metadata": {}, | |
|
1874 | "source": [ | |
|
1875 | "# -30°C to 20°C transition analysis" | |
|
1876 | ] | |
|
1877 | }, | |
|
1878 | { | |
|
1879 | "cell_type": "code", | |
|
1880 | "execution_count": 10, | |
|
1881 | "metadata": { | |
|
1882 | "ExecuteTime": { | |
|
1883 | "end_time": "2018-06-29T12:21:38.812448Z", | |
|
1884 | "start_time": "2018-06-29T12:21:38.694283Z" | |
|
1885 | } | |
|
1886 | }, | |
|
1887 | "outputs": [], | |
|
1888 | "source": [ | |
|
1889 | "!rm /home/jeandet/Documents/SOLO_LFR_Notebooks/PPBI_06_2018/temp/*.png" | |
|
1890 | ] | |
|
1891 | }, | |
|
1892 | { | |
|
1893 | 1873 | "cell_type": "code", |
|
1894 |
"execution_count": |
|
|
1874 | "execution_count": 39, | |
|
1895 | 1875 | "metadata": { |
|
1896 | 1876 | "ExecuteTime": { |
|
1897 |
"end_time": "2018-0 |
|
|
1898 |
"start_time": "2018-0 |
|
|
1899 | } | |
|
1877 | "end_time": "2018-07-04T13:37:56.932529Z", | |
|
1878 | "start_time": "2018-07-04T13:37:56.803657Z" | |
|
1879 | }, | |
|
1880 | "scrolled": false | |
|
1900 | 1881 | }, |
|
1901 |
"outputs": [ |
|
|
1902 | "source": [ | |
|
1903 | "res = ResultLoader(\"/home/jeandet/Documents/SOLO_LFR_Notebooks/PPBI_06_2018/-30_to_20_transition.outpout\")\n", | |
|
1904 | "res.decomutePackets()\n", | |
|
1905 | "res.loadSWF()\n", | |
|
1906 | "temperatures = load_temperatures('/home/jeandet/ownCloud/TESTS_LFR_PFM1_PPBI_06_2018/Thermal_Chamber_Logs/Essai du 26 juin 2018.csv', [\"Time\",\"air\",\"PCB\", \"socket\"])\n", | |
|
1907 | "times=load_packets_time(\n", | |
|
1908 | " sumfile=\"/home/jeandet/Documents/DATA/LFR_Packets/decom/2018_06_26_15_00_52_packet_record.sum\",\n", | |
|
1909 | " logfile=\"/home/jeandet/Documents/DATA/LFR_Packets/2018_06_26_15_00_51_packet_log.data\")\n", | |
|
1910 | "\n", | |
|
1911 | "\n", | |
|
1912 | "with open(\"/home/jeandet/Documents/DATA/LFR_Packets/decom/2018_06_26_15_00_52_packet_record_HK.hk\",\"r\") as file:\n", | |
|
1913 | " lines=file.readlines()\n", | |
|
1914 | " HK_TEMP = lines[6::9] \n", | |
|
1915 | " HK_PCB_TEMP = [float(T.split()[1]) for T in HK_TEMP]\n", | |
|
1916 | " HK_PCB_TIME = [val['Time'] for val in times[\"HK\"]]\n", | |
|
1917 | " HK_TEMP_df = pds.Series(HK_PCB_TEMP, name='PCBTemp',index=pds.DatetimeIndex(HK_PCB_TIME, dtype='datetime64[ns]', freq=None))" | |
|
1918 | ] | |
|
1919 | }, | |
|
1920 | { | |
|
1921 | "cell_type": "code", | |
|
1922 | "execution_count": 12, | |
|
1923 | "metadata": { | |
|
1924 | "ExecuteTime": { | |
|
1925 | "end_time": "2018-06-29T12:23:08.428149Z", | |
|
1926 | "start_time": "2018-06-29T12:21:43.373905Z" | |
|
1882 | "outputs": [ | |
|
1883 | { | |
|
1884 | "data": { | |
|
1885 | "application/javascript": [ | |
|
1886 | "/* Put everything inside the global mpl namespace */\n", | |
|
1887 | "window.mpl = {};\n", | |
|
1888 | "\n", | |
|
1889 | "\n", | |
|
1890 | "mpl.get_websocket_type = function() {\n", | |
|
1891 | " if (typeof(WebSocket) !== 'undefined') {\n", | |
|
1892 | " return WebSocket;\n", | |
|
1893 | " } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
|
1894 | " return MozWebSocket;\n", | |
|
1895 | " } else {\n", | |
|
1896 | " alert('Your browser does not have WebSocket support.' +\n", | |
|
1897 | " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
|
1898 | " 'Firefox 4 and 5 are also supported but you ' +\n", | |
|
1899 | " 'have to enable WebSockets in about:config.');\n", | |
|
1900 | " };\n", | |
|
1901 | "}\n", | |
|
1902 | "\n", | |
|
1903 | "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
|
1904 | " this.id = figure_id;\n", | |
|
1905 | "\n", | |
|
1906 | " this.ws = websocket;\n", | |
|
1907 | "\n", | |
|
1908 | " this.supports_binary = (this.ws.binaryType != undefined);\n", | |
|
1909 | "\n", | |
|
1910 | " if (!this.supports_binary) {\n", | |
|
1911 | " var warnings = document.getElementById(\"mpl-warnings\");\n", | |
|
1912 | " if (warnings) {\n", | |
|
1913 | " warnings.style.display = 'block';\n", | |
|
1914 | " warnings.textContent = (\n", | |
|
1915 | " \"This browser does not support binary websocket messages. \" +\n", | |
|
1916 | " \"Performance may be slow.\");\n", | |
|
1917 | " }\n", | |
|
1918 | " }\n", | |
|
1919 | "\n", | |
|
1920 | " this.imageObj = new Image();\n", | |
|
1921 | "\n", | |
|
1922 | " this.context = undefined;\n", | |
|
1923 | " this.message = undefined;\n", | |
|
1924 | " this.canvas = undefined;\n", | |
|
1925 | " this.rubberband_canvas = undefined;\n", | |
|
1926 | " this.rubberband_context = undefined;\n", | |
|
1927 | " this.format_dropdown = undefined;\n", | |
|
1928 | "\n", | |
|
1929 | " this.image_mode = 'full';\n", | |
|
1930 | "\n", | |
|
1931 | " this.root = $('<div/>');\n", | |
|
1932 | " this._root_extra_style(this.root)\n", | |
|
1933 | " this.root.attr('style', 'display: inline-block');\n", | |
|
1934 | "\n", | |
|
1935 | " $(parent_element).append(this.root);\n", | |
|
1936 | "\n", | |
|
1937 | " this._init_header(this);\n", | |
|
1938 | " this._init_canvas(this);\n", | |
|
1939 | " this._init_toolbar(this);\n", | |
|
1940 | "\n", | |
|
1941 | " var fig = this;\n", | |
|
1942 | "\n", | |
|
1943 | " this.waiting = false;\n", | |
|
1944 | "\n", | |
|
1945 | " this.ws.onopen = function () {\n", | |
|
1946 | " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
|
1947 | " fig.send_message(\"send_image_mode\", {});\n", | |
|
1948 | " if (mpl.ratio != 1) {\n", | |
|
1949 | " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", | |
|
1950 | " }\n", | |
|
1951 | " fig.send_message(\"refresh\", {});\n", | |
|
1952 | " }\n", | |
|
1953 | "\n", | |
|
1954 | " this.imageObj.onload = function() {\n", | |
|
1955 | " if (fig.image_mode == 'full') {\n", | |
|
1956 | " // Full images could contain transparency (where diff images\n", | |
|
1957 | " // almost always do), so we need to clear the canvas so that\n", | |
|
1958 | " // there is no ghosting.\n", | |
|
1959 | " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
|
1960 | " }\n", | |
|
1961 | " fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
|
1962 | " };\n", | |
|
1963 | "\n", | |
|
1964 | " this.imageObj.onunload = function() {\n", | |
|
1965 | " fig.ws.close();\n", | |
|
1966 | " }\n", | |
|
1967 | "\n", | |
|
1968 | " this.ws.onmessage = this._make_on_message_function(this);\n", | |
|
1969 | "\n", | |
|
1970 | " this.ondownload = ondownload;\n", | |
|
1971 | "}\n", | |
|
1972 | "\n", | |
|
1973 | "mpl.figure.prototype._init_header = function() {\n", | |
|
1974 | " var titlebar = $(\n", | |
|
1975 | " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", | |
|
1976 | " 'ui-helper-clearfix\"/>');\n", | |
|
1977 | " var titletext = $(\n", | |
|
1978 | " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", | |
|
1979 | " 'text-align: center; padding: 3px;\"/>');\n", | |
|
1980 | " titlebar.append(titletext)\n", | |
|
1981 | " this.root.append(titlebar);\n", | |
|
1982 | " this.header = titletext[0];\n", | |
|
1983 | "}\n", | |
|
1984 | "\n", | |
|
1985 | "\n", | |
|
1986 | "\n", | |
|
1987 | "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
|
1988 | "\n", | |
|
1989 | "}\n", | |
|
1990 | "\n", | |
|
1991 | "\n", | |
|
1992 | "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
|
1993 | "\n", | |
|
1994 | "}\n", | |
|
1995 | "\n", | |
|
1996 | "mpl.figure.prototype._init_canvas = function() {\n", | |
|
1997 | " var fig = this;\n", | |
|
1998 | "\n", | |
|
1999 | " var canvas_div = $('<div/>');\n", | |
|
2000 | "\n", | |
|
2001 | " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
|
2002 | "\n", | |
|
2003 | " function canvas_keyboard_event(event) {\n", | |
|
2004 | " return fig.key_event(event, event['data']);\n", | |
|
2005 | " }\n", | |
|
2006 | "\n", | |
|
2007 | " canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
|
2008 | " canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
|
2009 | " this.canvas_div = canvas_div\n", | |
|
2010 | " this._canvas_extra_style(canvas_div)\n", | |
|
2011 | " this.root.append(canvas_div);\n", | |
|
2012 | "\n", | |
|
2013 | " var canvas = $('<canvas/>');\n", | |
|
2014 | " canvas.addClass('mpl-canvas');\n", | |
|
2015 | " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
|
2016 | "\n", | |
|
2017 | " this.canvas = canvas[0];\n", | |
|
2018 | " this.context = canvas[0].getContext(\"2d\");\n", | |
|
2019 | "\n", | |
|
2020 | " var backingStore = this.context.backingStorePixelRatio ||\n", | |
|
2021 | "\tthis.context.webkitBackingStorePixelRatio ||\n", | |
|
2022 | "\tthis.context.mozBackingStorePixelRatio ||\n", | |
|
2023 | "\tthis.context.msBackingStorePixelRatio ||\n", | |
|
2024 | "\tthis.context.oBackingStorePixelRatio ||\n", | |
|
2025 | "\tthis.context.backingStorePixelRatio || 1;\n", | |
|
2026 | "\n", | |
|
2027 | " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", | |
|
2028 | "\n", | |
|
2029 | " var rubberband = $('<canvas/>');\n", | |
|
2030 | " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
|
2031 | "\n", | |
|
2032 | " var pass_mouse_events = true;\n", | |
|
2033 | "\n", | |
|
2034 | " canvas_div.resizable({\n", | |
|
2035 | " start: function(event, ui) {\n", | |
|
2036 | " pass_mouse_events = false;\n", | |
|
2037 | " },\n", | |
|
2038 | " resize: function(event, ui) {\n", | |
|
2039 | " fig.request_resize(ui.size.width, ui.size.height);\n", | |
|
2040 | " },\n", | |
|
2041 | " stop: function(event, ui) {\n", | |
|
2042 | " pass_mouse_events = true;\n", | |
|
2043 | " fig.request_resize(ui.size.width, ui.size.height);\n", | |
|
2044 | " },\n", | |
|
2045 | " });\n", | |
|
2046 | "\n", | |
|
2047 | " function mouse_event_fn(event) {\n", | |
|
2048 | " if (pass_mouse_events)\n", | |
|
2049 | " return fig.mouse_event(event, event['data']);\n", | |
|
2050 | " }\n", | |
|
2051 | "\n", | |
|
2052 | " rubberband.mousedown('button_press', mouse_event_fn);\n", | |
|
2053 | " rubberband.mouseup('button_release', mouse_event_fn);\n", | |
|
2054 | " // Throttle sequential mouse events to 1 every 20ms.\n", | |
|
2055 | " rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
|
2056 | "\n", | |
|
2057 | " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
|
2058 | " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
|
2059 | "\n", | |
|
2060 | " canvas_div.on(\"wheel\", function (event) {\n", | |
|
2061 | " event = event.originalEvent;\n", | |
|
2062 | " event['data'] = 'scroll'\n", | |
|
2063 | " if (event.deltaY < 0) {\n", | |
|
2064 | " event.step = 1;\n", | |
|
2065 | " } else {\n", | |
|
2066 | " event.step = -1;\n", | |
|
2067 | " }\n", | |
|
2068 | " mouse_event_fn(event);\n", | |
|
2069 | " });\n", | |
|
2070 | "\n", | |
|
2071 | " canvas_div.append(canvas);\n", | |
|
2072 | " canvas_div.append(rubberband);\n", | |
|
2073 | "\n", | |
|
2074 | " this.rubberband = rubberband;\n", | |
|
2075 | " this.rubberband_canvas = rubberband[0];\n", | |
|
2076 | " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
|
2077 | " this.rubberband_context.strokeStyle = \"#000000\";\n", | |
|
2078 | "\n", | |
|
2079 | " this._resize_canvas = function(width, height) {\n", | |
|
2080 | " // Keep the size of the canvas, canvas container, and rubber band\n", | |
|
2081 | " // canvas in synch.\n", | |
|
2082 | " canvas_div.css('width', width)\n", | |
|
2083 | " canvas_div.css('height', height)\n", | |
|
2084 | "\n", | |
|
2085 | " canvas.attr('width', width * mpl.ratio);\n", | |
|
2086 | " canvas.attr('height', height * mpl.ratio);\n", | |
|
2087 | " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", | |
|
2088 | "\n", | |
|
2089 | " rubberband.attr('width', width);\n", | |
|
2090 | " rubberband.attr('height', height);\n", | |
|
2091 | " }\n", | |
|
2092 | "\n", | |
|
2093 | " // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
|
2094 | " // upon first draw.\n", | |
|
2095 | " this._resize_canvas(600, 600);\n", | |
|
2096 | "\n", | |
|
2097 | " // Disable right mouse context menu.\n", | |
|
2098 | " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
|
2099 | " return false;\n", | |
|
2100 | " });\n", | |
|
2101 | "\n", | |
|
2102 | " function set_focus () {\n", | |
|
2103 | " canvas.focus();\n", | |
|
2104 | " canvas_div.focus();\n", | |
|
2105 | " }\n", | |
|
2106 | "\n", | |
|
2107 | " window.setTimeout(set_focus, 100);\n", | |
|
2108 | "}\n", | |
|
2109 | "\n", | |
|
2110 | "mpl.figure.prototype._init_toolbar = function() {\n", | |
|
2111 | " var fig = this;\n", | |
|
2112 | "\n", | |
|
2113 | " var nav_element = $('<div/>')\n", | |
|
2114 | " nav_element.attr('style', 'width: 100%');\n", | |
|
2115 | " this.root.append(nav_element);\n", | |
|
2116 | "\n", | |
|
2117 | " // Define a callback function for later on.\n", | |
|
2118 | " function toolbar_event(event) {\n", | |
|
2119 | " return fig.toolbar_button_onclick(event['data']);\n", | |
|
2120 | " }\n", | |
|
2121 | " function toolbar_mouse_event(event) {\n", | |
|
2122 | " return fig.toolbar_button_onmouseover(event['data']);\n", | |
|
2123 | " }\n", | |
|
2124 | "\n", | |
|
2125 | " for(var toolbar_ind in mpl.toolbar_items) {\n", | |
|
2126 | " var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
|
2127 | " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
|
2128 | " var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
|
2129 | " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
|
2130 | "\n", | |
|
2131 | " if (!name) {\n", | |
|
2132 | " // put a spacer in here.\n", | |
|
2133 | " continue;\n", | |
|
2134 | " }\n", | |
|
2135 | " var button = $('<button/>');\n", | |
|
2136 | " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
|
2137 | " 'ui-button-icon-only');\n", | |
|
2138 | " button.attr('role', 'button');\n", | |
|
2139 | " button.attr('aria-disabled', 'false');\n", | |
|
2140 | " button.click(method_name, toolbar_event);\n", | |
|
2141 | " button.mouseover(tooltip, toolbar_mouse_event);\n", | |
|
2142 | "\n", | |
|
2143 | " var icon_img = $('<span/>');\n", | |
|
2144 | " icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
|
2145 | " icon_img.addClass(image);\n", | |
|
2146 | " icon_img.addClass('ui-corner-all');\n", | |
|
2147 | "\n", | |
|
2148 | " var tooltip_span = $('<span/>');\n", | |
|
2149 | " tooltip_span.addClass('ui-button-text');\n", | |
|
2150 | " tooltip_span.html(tooltip);\n", | |
|
2151 | "\n", | |
|
2152 | " button.append(icon_img);\n", | |
|
2153 | " button.append(tooltip_span);\n", | |
|
2154 | "\n", | |
|
2155 | " nav_element.append(button);\n", | |
|
2156 | " }\n", | |
|
2157 | "\n", | |
|
2158 | " var fmt_picker_span = $('<span/>');\n", | |
|
2159 | "\n", | |
|
2160 | " var fmt_picker = $('<select/>');\n", | |
|
2161 | " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
|
2162 | " fmt_picker_span.append(fmt_picker);\n", | |
|
2163 | " nav_element.append(fmt_picker_span);\n", | |
|
2164 | " this.format_dropdown = fmt_picker[0];\n", | |
|
2165 | "\n", | |
|
2166 | " for (var ind in mpl.extensions) {\n", | |
|
2167 | " var fmt = mpl.extensions[ind];\n", | |
|
2168 | " var option = $(\n", | |
|
2169 | " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
|
2170 | " fmt_picker.append(option)\n", | |
|
2171 | " }\n", | |
|
2172 | "\n", | |
|
2173 | " // Add hover states to the ui-buttons\n", | |
|
2174 | " $( \".ui-button\" ).hover(\n", | |
|
2175 | " function() { $(this).addClass(\"ui-state-hover\");},\n", | |
|
2176 | " function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
|
2177 | " );\n", | |
|
2178 | "\n", | |
|
2179 | " var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
|
2180 | " nav_element.append(status_bar);\n", | |
|
2181 | " this.message = status_bar[0];\n", | |
|
2182 | "}\n", | |
|
2183 | "\n", | |
|
2184 | "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
|
2185 | " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
|
2186 | " // which will in turn request a refresh of the image.\n", | |
|
2187 | " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
|
2188 | "}\n", | |
|
2189 | "\n", | |
|
2190 | "mpl.figure.prototype.send_message = function(type, properties) {\n", | |
|
2191 | " properties['type'] = type;\n", | |
|
2192 | " properties['figure_id'] = this.id;\n", | |
|
2193 | " this.ws.send(JSON.stringify(properties));\n", | |
|
2194 | "}\n", | |
|
2195 | "\n", | |
|
2196 | "mpl.figure.prototype.send_draw_message = function() {\n", | |
|
2197 | " if (!this.waiting) {\n", | |
|
2198 | " this.waiting = true;\n", | |
|
2199 | " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
|
2200 | " }\n", | |
|
2201 | "}\n", | |
|
2202 | "\n", | |
|
2203 | "\n", | |
|
2204 | "mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
|
2205 | " var format_dropdown = fig.format_dropdown;\n", | |
|
2206 | " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
|
2207 | " fig.ondownload(fig, format);\n", | |
|
2208 | "}\n", | |
|
2209 | "\n", | |
|
2210 | "\n", | |
|
2211 | "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
|
2212 | " var size = msg['size'];\n", | |
|
2213 | " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
|
2214 | " fig._resize_canvas(size[0], size[1]);\n", | |
|
2215 | " fig.send_message(\"refresh\", {});\n", | |
|
2216 | " };\n", | |
|
2217 | "}\n", | |
|
2218 | "\n", | |
|
2219 | "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
|
2220 | " var x0 = msg['x0'] / mpl.ratio;\n", | |
|
2221 | " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", | |
|
2222 | " var x1 = msg['x1'] / mpl.ratio;\n", | |
|
2223 | " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", | |
|
2224 | " x0 = Math.floor(x0) + 0.5;\n", | |
|
2225 | " y0 = Math.floor(y0) + 0.5;\n", | |
|
2226 | " x1 = Math.floor(x1) + 0.5;\n", | |
|
2227 | " y1 = Math.floor(y1) + 0.5;\n", | |
|
2228 | " var min_x = Math.min(x0, x1);\n", | |
|
2229 | " var min_y = Math.min(y0, y1);\n", | |
|
2230 | " var width = Math.abs(x1 - x0);\n", | |
|
2231 | " var height = Math.abs(y1 - y0);\n", | |
|
2232 | "\n", | |
|
2233 | " fig.rubberband_context.clearRect(\n", | |
|
2234 | " 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
|
2235 | "\n", | |
|
2236 | " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
|
2237 | "}\n", | |
|
2238 | "\n", | |
|
2239 | "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
|
2240 | " // Updates the figure title.\n", | |
|
2241 | " fig.header.textContent = msg['label'];\n", | |
|
2242 | "}\n", | |
|
2243 | "\n", | |
|
2244 | "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
|
2245 | " var cursor = msg['cursor'];\n", | |
|
2246 | " switch(cursor)\n", | |
|
2247 | " {\n", | |
|
2248 | " case 0:\n", | |
|
2249 | " cursor = 'pointer';\n", | |
|
2250 | " break;\n", | |
|
2251 | " case 1:\n", | |
|
2252 | " cursor = 'default';\n", | |
|
2253 | " break;\n", | |
|
2254 | " case 2:\n", | |
|
2255 | " cursor = 'crosshair';\n", | |
|
2256 | " break;\n", | |
|
2257 | " case 3:\n", | |
|
2258 | " cursor = 'move';\n", | |
|
2259 | " break;\n", | |
|
2260 | " }\n", | |
|
2261 | " fig.rubberband_canvas.style.cursor = cursor;\n", | |
|
2262 | "}\n", | |
|
2263 | "\n", | |
|
2264 | "mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
|
2265 | " fig.message.textContent = msg['message'];\n", | |
|
2266 | "}\n", | |
|
2267 | "\n", | |
|
2268 | "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
|
2269 | " // Request the server to send over a new figure.\n", | |
|
2270 | " fig.send_draw_message();\n", | |
|
2271 | "}\n", | |
|
2272 | "\n", | |
|
2273 | "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
|
2274 | " fig.image_mode = msg['mode'];\n", | |
|
2275 | "}\n", | |
|
2276 | "\n", | |
|
2277 | "mpl.figure.prototype.updated_canvas_event = function() {\n", | |
|
2278 | " // Called whenever the canvas gets updated.\n", | |
|
2279 | " this.send_message(\"ack\", {});\n", | |
|
2280 | "}\n", | |
|
2281 | "\n", | |
|
2282 | "// A function to construct a web socket function for onmessage handling.\n", | |
|
2283 | "// Called in the figure constructor.\n", | |
|
2284 | "mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
|
2285 | " return function socket_on_message(evt) {\n", | |
|
2286 | " if (evt.data instanceof Blob) {\n", | |
|
2287 | " /* FIXME: We get \"Resource interpreted as Image but\n", | |
|
2288 | " * transferred with MIME type text/plain:\" errors on\n", | |
|
2289 | " * Chrome. But how to set the MIME type? It doesn't seem\n", | |
|
2290 | " * to be part of the websocket stream */\n", | |
|
2291 | " evt.data.type = \"image/png\";\n", | |
|
2292 | "\n", | |
|
2293 | " /* Free the memory for the previous frames */\n", | |
|
2294 | " if (fig.imageObj.src) {\n", | |
|
2295 | " (window.URL || window.webkitURL).revokeObjectURL(\n", | |
|
2296 | " fig.imageObj.src);\n", | |
|
2297 | " }\n", | |
|
2298 | "\n", | |
|
2299 | " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
|
2300 | " evt.data);\n", | |
|
2301 | " fig.updated_canvas_event();\n", | |
|
2302 | " fig.waiting = false;\n", | |
|
2303 | " return;\n", | |
|
2304 | " }\n", | |
|
2305 | " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", | |
|
2306 | " fig.imageObj.src = evt.data;\n", | |
|
2307 | " fig.updated_canvas_event();\n", | |
|
2308 | " fig.waiting = false;\n", | |
|
2309 | " return;\n", | |
|
2310 | " }\n", | |
|
2311 | "\n", | |
|
2312 | " var msg = JSON.parse(evt.data);\n", | |
|
2313 | " var msg_type = msg['type'];\n", | |
|
2314 | "\n", | |
|
2315 | " // Call the \"handle_{type}\" callback, which takes\n", | |
|
2316 | " // the figure and JSON message as its only arguments.\n", | |
|
2317 | " try {\n", | |
|
2318 | " var callback = fig[\"handle_\" + msg_type];\n", | |
|
2319 | " } catch (e) {\n", | |
|
2320 | " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", | |
|
2321 | " return;\n", | |
|
2322 | " }\n", | |
|
2323 | "\n", | |
|
2324 | " if (callback) {\n", | |
|
2325 | " try {\n", | |
|
2326 | " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", | |
|
2327 | " callback(fig, msg);\n", | |
|
2328 | " } catch (e) {\n", | |
|
2329 | " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", | |
|
2330 | " }\n", | |
|
2331 | " }\n", | |
|
2332 | " };\n", | |
|
2333 | "}\n", | |
|
2334 | "\n", | |
|
2335 | "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", | |
|
2336 | "mpl.findpos = function(e) {\n", | |
|
2337 | " //this section is from http://www.quirksmode.org/js/events_properties.html\n", | |
|
2338 | " var targ;\n", | |
|
2339 | " if (!e)\n", | |
|
2340 | " e = window.event;\n", | |
|
2341 | " if (e.target)\n", | |
|
2342 | " targ = e.target;\n", | |
|
2343 | " else if (e.srcElement)\n", | |
|
2344 | " targ = e.srcElement;\n", | |
|
2345 | " if (targ.nodeType == 3) // defeat Safari bug\n", | |
|
2346 | " targ = targ.parentNode;\n", | |
|
2347 | "\n", | |
|
2348 | " // jQuery normalizes the pageX and pageY\n", | |
|
2349 | " // pageX,Y are the mouse positions relative to the document\n", | |
|
2350 | " // offset() returns the position of the element relative to the document\n", | |
|
2351 | " var x = e.pageX - $(targ).offset().left;\n", | |
|
2352 | " var y = e.pageY - $(targ).offset().top;\n", | |
|
2353 | "\n", | |
|
2354 | " return {\"x\": x, \"y\": y};\n", | |
|
2355 | "};\n", | |
|
2356 | "\n", | |
|
2357 | "/*\n", | |
|
2358 | " * return a copy of an object with only non-object keys\n", | |
|
2359 | " * we need this to avoid circular references\n", | |
|
2360 | " * http://stackoverflow.com/a/24161582/3208463\n", | |
|
2361 | " */\n", | |
|
2362 | "function simpleKeys (original) {\n", | |
|
2363 | " return Object.keys(original).reduce(function (obj, key) {\n", | |
|
2364 | " if (typeof original[key] !== 'object')\n", | |
|
2365 | " obj[key] = original[key]\n", | |
|
2366 | " return obj;\n", | |
|
2367 | " }, {});\n", | |
|
2368 | "}\n", | |
|
2369 | "\n", | |
|
2370 | "mpl.figure.prototype.mouse_event = function(event, name) {\n", | |
|
2371 | " var canvas_pos = mpl.findpos(event)\n", | |
|
2372 | "\n", | |
|
2373 | " if (name === 'button_press')\n", | |
|
2374 | " {\n", | |
|
2375 | " this.canvas.focus();\n", | |
|
2376 | " this.canvas_div.focus();\n", | |
|
2377 | " }\n", | |
|
2378 | "\n", | |
|
2379 | " var x = canvas_pos.x * mpl.ratio;\n", | |
|
2380 | " var y = canvas_pos.y * mpl.ratio;\n", | |
|
2381 | "\n", | |
|
2382 | " this.send_message(name, {x: x, y: y, button: event.button,\n", | |
|
2383 | " step: event.step,\n", | |
|
2384 | " guiEvent: simpleKeys(event)});\n", | |
|
2385 | "\n", | |
|
2386 | " /* This prevents the web browser from automatically changing to\n", | |
|
2387 | " * the text insertion cursor when the button is pressed. We want\n", | |
|
2388 | " * to control all of the cursor setting manually through the\n", | |
|
2389 | " * 'cursor' event from matplotlib */\n", | |
|
2390 | " event.preventDefault();\n", | |
|
2391 | " return false;\n", | |
|
2392 | "}\n", | |
|
2393 | "\n", | |
|
2394 | "mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
|
2395 | " // Handle any extra behaviour associated with a key event\n", | |
|
2396 | "}\n", | |
|
2397 | "\n", | |
|
2398 | "mpl.figure.prototype.key_event = function(event, name) {\n", | |
|
2399 | "\n", | |
|
2400 | " // Prevent repeat events\n", | |
|
2401 | " if (name == 'key_press')\n", | |
|
2402 | " {\n", | |
|
2403 | " if (event.which === this._key)\n", | |
|
2404 | " return;\n", | |
|
2405 | " else\n", | |
|
2406 | " this._key = event.which;\n", | |
|
2407 | " }\n", | |
|
2408 | " if (name == 'key_release')\n", | |
|
2409 | " this._key = null;\n", | |
|
2410 | "\n", | |
|
2411 | " var value = '';\n", | |
|
2412 | " if (event.ctrlKey && event.which != 17)\n", | |
|
2413 | " value += \"ctrl+\";\n", | |
|
2414 | " if (event.altKey && event.which != 18)\n", | |
|
2415 | " value += \"alt+\";\n", | |
|
2416 | " if (event.shiftKey && event.which != 16)\n", | |
|
2417 | " value += \"shift+\";\n", | |
|
2418 | "\n", | |
|
2419 | " value += 'k';\n", | |
|
2420 | " value += event.which.toString();\n", | |
|
2421 | "\n", | |
|
2422 | " this._key_event_extra(event, name);\n", | |
|
2423 | "\n", | |
|
2424 | " this.send_message(name, {key: value,\n", | |
|
2425 | " guiEvent: simpleKeys(event)});\n", | |
|
2426 | " return false;\n", | |
|
2427 | "}\n", | |
|
2428 | "\n", | |
|
2429 | "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
|
2430 | " if (name == 'download') {\n", | |
|
2431 | " this.handle_save(this, null);\n", | |
|
2432 | " } else {\n", | |
|
2433 | " this.send_message(\"toolbar_button\", {name: name});\n", | |
|
2434 | " }\n", | |
|
2435 | "};\n", | |
|
2436 | "\n", | |
|
2437 | "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
|
2438 | " this.message.textContent = tooltip;\n", | |
|
2439 | "};\n", | |
|
2440 | "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", | |
|
2441 | "\n", | |
|
2442 | "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", | |
|
2443 | "\n", | |
|
2444 | "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
|
2445 | " // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
|
2446 | " // object with the appropriate methods. Currently this is a non binary\n", | |
|
2447 | " // socket, so there is still some room for performance tuning.\n", | |
|
2448 | " var ws = {};\n", | |
|
2449 | "\n", | |
|
2450 | " ws.close = function() {\n", | |
|
2451 | " comm.close()\n", | |
|
2452 | " };\n", | |
|
2453 | " ws.send = function(m) {\n", | |
|
2454 | " //console.log('sending', m);\n", | |
|
2455 | " comm.send(m);\n", | |
|
2456 | " };\n", | |
|
2457 | " // Register the callback with on_msg.\n", | |
|
2458 | " comm.on_msg(function(msg) {\n", | |
|
2459 | " //console.log('receiving', msg['content']['data'], msg);\n", | |
|
2460 | " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", | |
|
2461 | " ws.onmessage(msg['content']['data'])\n", | |
|
2462 | " });\n", | |
|
2463 | " return ws;\n", | |
|
2464 | "}\n", | |
|
2465 | "\n", | |
|
2466 | "mpl.mpl_figure_comm = function(comm, msg) {\n", | |
|
2467 | " // This is the function which gets called when the mpl process\n", | |
|
2468 | " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
|
2469 | "\n", | |
|
2470 | " var id = msg.content.data.id;\n", | |
|
2471 | " // Get hold of the div created by the display call when the Comm\n", | |
|
2472 | " // socket was opened in Python.\n", | |
|
2473 | " var element = $(\"#\" + id);\n", | |
|
2474 | " var ws_proxy = comm_websocket_adapter(comm)\n", | |
|
2475 | "\n", | |
|
2476 | " function ondownload(figure, format) {\n", | |
|
2477 | " window.open(figure.imageObj.src);\n", | |
|
2478 | " }\n", | |
|
2479 | "\n", | |
|
2480 | " var fig = new mpl.figure(id, ws_proxy,\n", | |
|
2481 | " ondownload,\n", | |
|
2482 | " element.get(0));\n", | |
|
2483 | "\n", | |
|
2484 | " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
|
2485 | " // web socket which is closed, not our websocket->open comm proxy.\n", | |
|
2486 | " ws_proxy.onopen();\n", | |
|
2487 | "\n", | |
|
2488 | " fig.parent_element = element.get(0);\n", | |
|
2489 | " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
|
2490 | " if (!fig.cell_info) {\n", | |
|
2491 | " console.error(\"Failed to find cell for figure\", id, fig);\n", | |
|
2492 | " return;\n", | |
|
2493 | " }\n", | |
|
2494 | "\n", | |
|
2495 | " var output_index = fig.cell_info[2]\n", | |
|
2496 | " var cell = fig.cell_info[0];\n", | |
|
2497 | "\n", | |
|
2498 | "};\n", | |
|
2499 | "\n", | |
|
2500 | "mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
|
2501 | " var width = fig.canvas.width/mpl.ratio\n", | |
|
2502 | " fig.root.unbind('remove')\n", | |
|
2503 | "\n", | |
|
2504 | " // Update the output cell to use the data from the current canvas.\n", | |
|
2505 | " fig.push_to_output();\n", | |
|
2506 | " var dataURL = fig.canvas.toDataURL();\n", | |
|
2507 | " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", | |
|
2508 | " // the notebook keyboard shortcuts fail.\n", | |
|
2509 | " IPython.keyboard_manager.enable()\n", | |
|
2510 | " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", | |
|
2511 | " fig.close_ws(fig, msg);\n", | |
|
2512 | "}\n", | |
|
2513 | "\n", | |
|
2514 | "mpl.figure.prototype.close_ws = function(fig, msg){\n", | |
|
2515 | " fig.send_message('closing', msg);\n", | |
|
2516 | " // fig.ws.close()\n", | |
|
2517 | "}\n", | |
|
2518 | "\n", | |
|
2519 | "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", | |
|
2520 | " // Turn the data on the canvas into data in the output cell.\n", | |
|
2521 | " var width = this.canvas.width/mpl.ratio\n", | |
|
2522 | " var dataURL = this.canvas.toDataURL();\n", | |
|
2523 | " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", | |
|
2524 | "}\n", | |
|
2525 | "\n", | |
|
2526 | "mpl.figure.prototype.updated_canvas_event = function() {\n", | |
|
2527 | " // Tell IPython that the notebook contents must change.\n", | |
|
2528 | " IPython.notebook.set_dirty(true);\n", | |
|
2529 | " this.send_message(\"ack\", {});\n", | |
|
2530 | " var fig = this;\n", | |
|
2531 | " // Wait a second, then push the new image to the DOM so\n", | |
|
2532 | " // that it is saved nicely (might be nice to debounce this).\n", | |
|
2533 | " setTimeout(function () { fig.push_to_output() }, 1000);\n", | |
|
2534 | "}\n", | |
|
2535 | "\n", | |
|
2536 | "mpl.figure.prototype._init_toolbar = function() {\n", | |
|
2537 | " var fig = this;\n", | |
|
2538 | "\n", | |
|
2539 | " var nav_element = $('<div/>')\n", | |
|
2540 | " nav_element.attr('style', 'width: 100%');\n", | |
|
2541 | " this.root.append(nav_element);\n", | |
|
2542 | "\n", | |
|
2543 | " // Define a callback function for later on.\n", | |
|
2544 | " function toolbar_event(event) {\n", | |
|
2545 | " return fig.toolbar_button_onclick(event['data']);\n", | |
|
2546 | " }\n", | |
|
2547 | " function toolbar_mouse_event(event) {\n", | |
|
2548 | " return fig.toolbar_button_onmouseover(event['data']);\n", | |
|
2549 | " }\n", | |
|
2550 | "\n", | |
|
2551 | " for(var toolbar_ind in mpl.toolbar_items){\n", | |
|
2552 | " var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
|
2553 | " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
|
2554 | " var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
|
2555 | " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
|
2556 | "\n", | |
|
2557 | " if (!name) { continue; };\n", | |
|
2558 | "\n", | |
|
2559 | " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", | |
|
2560 | " button.click(method_name, toolbar_event);\n", | |
|
2561 | " button.mouseover(tooltip, toolbar_mouse_event);\n", | |
|
2562 | " nav_element.append(button);\n", | |
|
2563 | " }\n", | |
|
2564 | "\n", | |
|
2565 | " // Add the status bar.\n", | |
|
2566 | " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", | |
|
2567 | " nav_element.append(status_bar);\n", | |
|
2568 | " this.message = status_bar[0];\n", | |
|
2569 | "\n", | |
|
2570 | " // Add the close button to the window.\n", | |
|
2571 | " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", | |
|
2572 | " 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", | |
|
2573 | " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", | |
|
2574 | " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", | |
|
2575 | " buttongrp.append(button);\n", | |
|
2576 | " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", | |
|
2577 | " titlebar.prepend(buttongrp);\n", | |
|
2578 | "}\n", | |
|
2579 | "\n", | |
|
2580 | "mpl.figure.prototype._root_extra_style = function(el){\n", | |
|
2581 | " var fig = this\n", | |
|
2582 | " el.on(\"remove\", function(){\n", | |
|
2583 | "\tfig.close_ws(fig, {});\n", | |
|
2584 | " });\n", | |
|
2585 | "}\n", | |
|
2586 | "\n", | |
|
2587 | "mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
|
2588 | " // this is important to make the div 'focusable\n", | |
|
2589 | " el.attr('tabindex', 0)\n", | |
|
2590 | " // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
|
2591 | " // off when our div gets focus\n", | |
|
2592 | "\n", | |
|
2593 | " // location in version 3\n", | |
|
2594 | " if (IPython.notebook.keyboard_manager) {\n", | |
|
2595 | " IPython.notebook.keyboard_manager.register_events(el);\n", | |
|
2596 | " }\n", | |
|
2597 | " else {\n", | |
|
2598 | " // location in version 2\n", | |
|
2599 | " IPython.keyboard_manager.register_events(el);\n", | |
|
2600 | " }\n", | |
|
2601 | "\n", | |
|
2602 | "}\n", | |
|
2603 | "\n", | |
|
2604 | "mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
|
2605 | " var manager = IPython.notebook.keyboard_manager;\n", | |
|
2606 | " if (!manager)\n", | |
|
2607 | " manager = IPython.keyboard_manager;\n", | |
|
2608 | "\n", | |
|
2609 | " // Check for shift+enter\n", | |
|
2610 | " if (event.shiftKey && event.which == 13) {\n", | |
|
2611 | " this.canvas_div.blur();\n", | |
|
2612 | " event.shiftKey = false;\n", | |
|
2613 | " // Send a \"J\" for go to next cell\n", | |
|
2614 | " event.which = 74;\n", | |
|
2615 | " event.keyCode = 74;\n", | |
|
2616 | " manager.command_mode();\n", | |
|
2617 | " manager.handle_keydown(event);\n", | |
|
2618 | " }\n", | |
|
2619 | "}\n", | |
|
2620 | "\n", | |
|
2621 | "mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
|
2622 | " fig.ondownload(fig, null);\n", | |
|
2623 | "}\n", | |
|
2624 | "\n", | |
|
2625 | "\n", | |
|
2626 | "mpl.find_output_cell = function(html_output) {\n", | |
|
2627 | " // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
|
2628 | " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
|
2629 | " // IPython event is triggered only after the cells have been serialised, which for\n", | |
|
2630 | " // our purposes (turning an active figure into a static one), is too late.\n", | |
|
2631 | " var cells = IPython.notebook.get_cells();\n", | |
|
2632 | " var ncells = cells.length;\n", | |
|
2633 | " for (var i=0; i<ncells; i++) {\n", | |
|
2634 | " var cell = cells[i];\n", | |
|
2635 | " if (cell.cell_type === 'code'){\n", | |
|
2636 | " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
|
2637 | " var data = cell.output_area.outputs[j];\n", | |
|
2638 | " if (data.data) {\n", | |
|
2639 | " // IPython >= 3 moved mimebundle to data attribute of output\n", | |
|
2640 | " data = data.data;\n", | |
|
2641 | " }\n", | |
|
2642 | " if (data['text/html'] == html_output) {\n", | |
|
2643 | " return [cell, data, j];\n", | |
|
2644 | " }\n", | |
|
2645 | " }\n", | |
|
2646 | " }\n", | |
|
2647 | " }\n", | |
|
2648 | "}\n", | |
|
2649 | "\n", | |
|
2650 | "// Register the function which deals with the matplotlib target/channel.\n", | |
|
2651 | "// The kernel may be null if the page has been refreshed.\n", | |
|
2652 | "if (IPython.notebook.kernel != null) {\n", | |
|
2653 | " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
|
2654 | "}\n" | |
|
2655 | ], | |
|
2656 | "text/plain": [ | |
|
2657 | "<IPython.core.display.Javascript object>" | |
|
2658 | ] | |
|
2659 | }, | |
|
2660 | "metadata": {}, | |
|
2661 | "output_type": "display_data" | |
|
2662 | }, | |
|
2663 | { | |
|
2664 | "data": { | |
|
2665 | "text/html": [ | |
|
2666 | "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABDgAAALQCAYAAAB118BaAAAgAElEQVR4nOzdZ3hUZf7/8XvGhCTUBVTUBQOiuCvwEwULFkRFsYuuiF0kqCgiokAASxAWVLC7CqirrLprV9QoIEVFKdJEigWI9N6lJRDy+T/gPycZ5pwhKMm5Z877dV1zLZmZTO6wfh9830wxAgAAAAAASHDG7wMAAAAAAAD8WQQOAAAAAACQ8AgcAAAAAAAg4RE4AAAAAABAwiNwAAAAAACAhEfgAAAAAAAACY/AAQAAAAAAEh6BAwAAAAAAJDwCBwAAAAAASHgEDgAAAAAAkPAIHAAAAAAAIOEROAAAAAAAQMIjcAAAAAAAgIRH4AAAIEHt3r1bxhidf/75fh8FAADAdwQOAAi4f/7znzLGyBijX375xe/j4ADYEDgKCwt11FFHyRijX3/9Ne59t23bpipVqigtLU3r1q0rszM9+OCDzn/TpbnUr1+/zM4SBM8884yMMfr444/9PgoAIOAIHAAQYEVFRapbt65CoZCMMXrggQf8PhIO0M8//6ylS5f6eoZIUOjRo0fc+7366qsyxui6664r0/OMGzdOOTk5UZfLL79cxhiddNJJMbc999xzZXqeZEfgAADYgsABAAE2atQoGWPUvn17HXHEETr00ENVUFDg97GQYBYtWqRwOKzDDz9cu3bt8rzf6aefLmOMxo8fX46n2+uVV16RMUZZWVnl/rOTHYEDAGALAgcABNg//vEPGWM0ceJEPfDAAzLG6J133om5X1ZWlowxys3NdX2c7777TsYYtWvXLur6bdu2acCAAfq///s/VaxYUZUqVVLz5s1df8aYMWNkjFH//v01efJkXXzxxapevbqMMVq2bJkkaezYscrKytLf/vY3ValSRRkZGWrYsKH69eun/Px817OtWLFCt9xyiw499FClp6erSZMmevPNN6N+3r7Wr1+vnj176vjjj1daWpqqVaumVq1aacyYMfv9O40o+fKRtWvXKisrS7Vq1VKFChXUsGFD/ec//3H9vj179ujFF19U06ZNVbFiRVWsWFGnnHKKhg4dqqKiIs+fUdKWLVvUt29fNWzYUJUrV1blypVVv359tWvXTjNnzoz5mZMmTdLVV1+tww8/XKmpqapdu7buvPNOrVy5stS/b+vWrWWM0QcffOB6+5w5c2SM0XHHHRd1/cKFC5WVlaVjjjlG6enpqlGjhho1aqROnTpp48aNpf75+3MggePjjz9Wq1atVL16dVWoUEHHHXecHnzwQW3bti3mvtWqVdOJJ56ojRs3qlOnTjryyCOVkZGhZs2aafTo0ZKk/Px8PfTQQ6pXr54qVKigBg0a6PXXX3f9ucYYPfPMMxo3bpxatGihypUrq2rVqrrssss0Z84c1/MWFBTo6aefVtOmTVWpUiVVrFhRzZo106uvvhpz3x9++EHGGHXt2lWzZ89WmzZtVLNmTRlj9MMPP0iSJk6cqLvuuksNGzZUtWrVlJaWpuOPP169evXS1q1box7vxBNP9Hzpz6ZNmyRJV155ZdTXXr/zvo9brVo1bd++Xb1799Yxxxyj1NRUde3a1blPUVGR/v3vf+vMM89U1apVlZ6erkaNGmnQoEHavXu3698VACC5ETgAIKBWr16t1NRUNWjQQFLxAnreeefF3HfChAkyxujaa691fazbb79dxhiNHDnSuW7jxo3O8tO0aVPdc889uvvuu3XMMcfIGKOcnJyox4gEh9atWys1NVXnn3++unfvrltuuUWrV6+WJJ1//vmqV6+err/+evXo0UOdO3dWkyZNnCW/sLAw6jFXrVqlo48+WsYYtWzZUr169dKtt96qjIwMtWnTxjVw/Pbbb8rMzJQxRi1atFC3bt3UsWNHHXHEEQqFQnrttddK9fcbiQ8nnXSS6tevr8aNG6tLly7q2LGjqlatKmOM3nrrrajvKSoq0rXXXitjjDIzM9W1a1d17drV+R1uvvlm159RMnAUFRXptNNOkzFGZ5xxhrp166bu3bvruuuuU61atTRkyJCox3j55ZcVDodVqVIl5+/1yiuvVDgc1l//+lctX768VL/vBx98IGOMLrroItfbu3btKmOMnnjiCee65cuXq3r16kpNTdWVV16pnj17qkuXLrrssstUsWJF/fzzz6X62aVR2sDRrVs3GWNUq1YttW/fXt27d1fLli1ljFGzZs20c+fOqPtXq1ZNxx13nBo3bqyGDRuqS5cuuu2225Senq7U1FRNnjxZrVq1Ut26dXXnnXeqU6dOTrgbNWpU1GNFlv1LL71UKSkpatOmjXr37q0rr7xSoVBIVapU0YwZM6K+Z/v27TrzzDNljFGjRo101113qUuXLvr73/8uY4w6d+4cdf9I4DjvvPNUsWJF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LWrWrJmMiX6fj/0Fjt9//1316tWTMXvfBLRnz55q166dKlWq5Lxh574xYeXKlU78aNmypXr37q327dsrIyNDbdq0kTFGAwYMiPqeJUuW6Nhjj3Xeu+COO+5Qz549dcMNN+iEE06QMUbTpk2L+/cn/bHAUVRU5LwHSr169dStWzfdd999yszMdF343X7G+++/r1AopNNOO03t27dX7969lZWVpUMPPVTGGD333HNRjzF8+HClpqYqNTVVV1xxhR544AHdc889uuKKK1S9enU1bNhwv7/rvubPnx/1cqeRI0e63q9z585KT0/XBRdcoE6dOqlXr1665pprlJaWpvT09LgR7kCVJnBIUu/evWXM3vcsufbaa9WzZ0/deeedat26tdLT09WuXbuo+5dF4Lj00kuVkpKiNm3aqHfv3mrTpo1CoZAqV64c84ksO3bscN4zo27durr11lvVq1cvtW/fXs2bN1coFNKQIUOc++8vcBQUFDgvXTrnnHPUo0cP3XjjjfrLX/6iiy++WFWqVIn5fZctW6bU1FTVqFFDXbt2Vf/+/dW/f3/l5+dL2huGInPYqlUrde/eXVdffbVSU1PVtm3bPxQ49uzZ48zQ4YcfrhtvvFHZ2dnq2LGjWrZsqZSUFGVnZ3t+PwAgORE4ACBAbrjhBtcl180FF1wgY4w++uijqOuLioqc0HDYYYe5fjpHRH5+vp577jmdfvrpqlq1qtLS0nT00Ufr/PPP17PPPqsNGzY4991f4JD2xofrr79eRx55pNLT03XCCSdo8ODBys/P94wJy5Yt080336yaNWsqPT1dTZo00RtvvOE8S8DtzSy3bNmi/v3766STTlKlSpWUkZGhevXq6dJLL9XLL79cqqfF/5HAIUmFhYV64YUXdPLJJysjI0MZGRlq2rSpXnrppZj3RHD7GUuXLlWvXr3UvHlz1apVSxUqVFDt2rV1ySWXeL4UZdasWbrlllt09NFHq0KFCk7Y6NSpk7766qv9/q5uIh+5mpmZGXPuiEmTJunOO+9U48aNVb16daWnp6t+/fq67bbboj6V52AobeCQ9n7KUJs2bVSrVi2lpqbqsMMO08knn6yePXvGPCugLALHM888o3HjxqlFixaqVKmSqlSpossuu0yzZ892fazCwkK98soratGihapVq+b8f96iRQsNGjQo6uVB+wsckrR69Wrd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\" width=\"900\">" | |
|
2667 | ], | |
|
2668 | "text/plain": [ | |
|
2669 | "<IPython.core.display.HTML object>" | |
|
2670 | ] | |
|
2671 | }, | |
|
2672 | "metadata": {}, | |
|
2673 | "output_type": "display_data" | |
|
2674 | } | |
|
2675 | ], | |
|
2676 | "source": [ | |
|
2677 | "values = np.zeros(res.SWFCount())\n", | |
|
2678 | "T = np.zeros(res.SWFCount())\n", | |
|
2679 | "values2 = np.zeros(res.SWFCount())\n", | |
|
2680 | "for i in range(0,res.SWFCount()):\n", | |
|
2681 | " spec = TF.fft(res.SWF(0,i)[\"E1\"], TF.LFR_Fs0, np.hanning(2048))\n", | |
|
2682 | " values[i] = spec[\"mod\"][200:].mean()\n", | |
|
2683 | " T[i] = get_temperature_at(HK_TEMP_df,times[\"SWF0\"][i][\"Time\"])\n", | |
|
2684 | " \n", | |
|
2685 | "plt.figure(figsize=(9,6))\n", | |
|
2686 | "plt.suptitle(\"Average noise Vs Temperature\")\n", | |
|
2687 | "plt.xlabel(\"PCB Temperature(°C)\")\n", | |
|
2688 | "plt.ylabel(\"Average noise\")\n", | |
|
2689 | "plt.plot(T,values)\n", | |
|
2690 | "plt.semilogy()\n", | |
|
2691 | "plt.show()" | |
|
2692 | ] | |
|
2693 | }, | |
|
2694 | { | |
|
2695 | "cell_type": "markdown", | |
|
2696 | "metadata": {}, | |
|
2697 | "source": [ | |
|
2698 | "# -30°C to 20°C transition analysis" | |
|
2699 | ] | |
|
2700 | }, | |
|
2701 | { | |
|
2702 | "cell_type": "code", | |
|
2703 | "execution_count": 10, | |
|
2704 | "metadata": { | |
|
2705 | "ExecuteTime": { | |
|
2706 | "end_time": "2018-06-29T12:21:38.812448Z", | |
|
2707 | "start_time": "2018-06-29T12:21:38.694283Z" | |
|
2708 | } | |
|
2709 | }, | |
|
2710 | "outputs": [], | |
|
2711 | "source": [ | |
|
2712 | "!rm /home/jeandet/Documents/SOLO_LFR_Notebooks/PPBI_06_2018/temp/*.png" | |
|
2713 | ] | |
|
2714 | }, | |
|
2715 | { | |
|
2716 | "cell_type": "code", | |
|
2717 | "execution_count": 40, | |
|
2718 | "metadata": { | |
|
2719 | "ExecuteTime": { | |
|
2720 | "end_time": "2018-07-04T13:38:10.890126Z", | |
|
2721 | "start_time": "2018-07-04T13:38:09.466843Z" | |
|
2722 | } | |
|
2723 | }, | |
|
2724 | "outputs": [], | |
|
2725 | "source": [ | |
|
2726 | "res = ResultLoader(\"/home/jeandet/Documents/SOLO_LFR_Notebooks/PPBI_06_2018/-30_to_20_transition.outpout\")\n", | |
|
2727 | "res.decomutePackets()\n", | |
|
2728 | "res.loadSWF()\n", | |
|
2729 | "temperatures = load_temperatures('/home/jeandet/ownCloud/TESTS_LFR_PFM1_PPBI_06_2018/Thermal_Chamber_Logs/Essai du 26 juin 2018.csv', [\"Time\",\"air\",\"PCB\", \"socket\"])\n", | |
|
2730 | "times=load_packets_time(\n", | |
|
2731 | " sumfile=\"/home/jeandet/Documents/DATA/LFR_Packets/decom/2018_06_26_15_00_52_packet_record.sum\",\n", | |
|
2732 | " logfile=\"/home/jeandet/Documents/DATA/LFR_Packets/2018_06_26_15_00_51_packet_log.data\")\n", | |
|
2733 | "\n", | |
|
2734 | "\n", | |
|
2735 | "with open(\"/home/jeandet/Documents/DATA/LFR_Packets/decom/2018_06_26_15_00_52_packet_record_HK.hk\",\"r\") as file:\n", | |
|
2736 | " lines=file.readlines()\n", | |
|
2737 | " HK_TEMP = lines[6::9] \n", | |
|
2738 | " HK_PCB_TEMP = [float(T.split()[1]) for T in HK_TEMP]\n", | |
|
2739 | " HK_PCB_TIME = [val['Time'] for val in times[\"HK\"]]\n", | |
|
2740 | " HK_TEMP_df = pds.Series(HK_PCB_TEMP, name='PCBTemp',index=pds.DatetimeIndex(HK_PCB_TIME, dtype='datetime64[ns]', freq=None))" | |
|
2741 | ] | |
|
2742 | }, | |
|
2743 | { | |
|
2744 | "cell_type": "code", | |
|
2745 | "execution_count": 12, | |
|
2746 | "metadata": { | |
|
2747 | "ExecuteTime": { | |
|
2748 | "end_time": "2018-06-29T12:23:08.428149Z", | |
|
2749 | "start_time": "2018-06-29T12:21:43.373905Z" | |
|
2750 | }, | |
|
2751 | "scrolled": true | |
|
2752 | }, | |
|
2753 | "outputs": [], | |
|
2754 | "source": [ | |
|
2755 | "%%capture\n", | |
|
2756 | "for i in range(0,res.SWFCount()):\n", | |
|
2757 | " f, axes = plt.subplots(nrows=2, ncols=3,figsize=(24,10))\n", | |
|
2758 | " df=res.SWF(0,i)\n", | |
|
2759 | " for ax,col in zip(axes.flatten(),df.columns):\n", | |
|
2760 | " ax.plot(np.arange(2048),df[col])\n", | |
|
2761 | " ax.set_ylim(-30000,30000)\n", | |
|
2762 | " patches, labels = ax.get_legend_handles_labels()\n", | |
|
2763 | " ax.legend(patches, labels, loc='upper left')\n", | |
|
2764 | " T = get_temperature_at(temperatures,times[\"SWF0\"][i][\"Time\"]-datetime.timedelta(minutes=4,seconds=10))\n", | |
|
2765 | " T_HK = get_temperature_at(HK_TEMP_df,times[\"SWF0\"][i][\"Time\"])\n", | |
|
2766 | " suptitle=plt.suptitle(\"Air={T_Air:3.1f}°C PCB(HK)={T_PCB:3.1f}°C socket={T_socket:3.1f}°C\".format(T_Air=T[\"air\"],T_PCB=T_HK,T_socket=T[\"socket\"]),y=1.05, fontsize=24)\n", | |
|
2767 | " plt.tight_layout()\n", | |
|
2768 | " plt.savefig(\"/home/jeandet/Documents/SOLO_LFR_Notebooks/PPBI_06_2018/temp/\"+\"/plot_{i}.png\".format(i=i),bbox_inches='tight',bbox_extra_artists=[suptitle])\n", | |
|
2769 | " plt.close()\n", | |
|
2770 | " del axes\n", | |
|
2771 | " del f\n", | |
|
2772 | " del df\n", | |
|
2773 | " del suptitle\n", | |
|
2774 | " gc.collect()" | |
|
2775 | ] | |
|
2776 | }, | |
|
2777 | { | |
|
2778 | "cell_type": "code", | |
|
2779 | "execution_count": 13, | |
|
2780 | "metadata": { | |
|
2781 | "ExecuteTime": { | |
|
2782 | "end_time": "2018-06-29T12:24:22.887029Z", | |
|
2783 | "start_time": "2018-06-29T12:24:11.457143Z" | |
|
2784 | } | |
|
2785 | }, | |
|
2786 | "outputs": [], | |
|
2787 | "source": [ | |
|
2788 | "%%capture\n", | |
|
2789 | "!cd /home/jeandet/Documents/SOLO_LFR_Notebooks/PPBI_06_2018/temp/ && ffmpeg -y -framerate 15 -i plot_%d.png minus30_to_20_transition.mp4 && ffmpeg -y -i minus30_to_20_transition.mp4 -c:v libvpx-vp9 -b:v 2M -threads 8 minus30_to_20_transition.webm" | |
|
2790 | ] | |
|
2791 | }, | |
|
2792 | { | |
|
2793 | "cell_type": "code", | |
|
2794 | "execution_count": 14, | |
|
2795 | "metadata": { | |
|
2796 | "ExecuteTime": { | |
|
2797 | "end_time": "2018-06-29T12:25:16.067271Z", | |
|
2798 | "start_time": "2018-06-29T12:25:16.062111Z" | |
|
2799 | } | |
|
2800 | }, | |
|
2801 | "outputs": [ | |
|
2802 | { | |
|
2803 | "data": { | |
|
2804 | "text/html": [ | |
|
2805 | "<video width=\"90%\" style=\"display:block; margin: 0 auto;\" controls src=\"https://hephaistos.lpp.polytechnique.fr/data/LFR/PPBI_06_2018/minus30_to_20_transition.webm\" type=\"video/webm\">" | |
|
2806 | ], | |
|
2807 | "text/plain": [ | |
|
2808 | "<IPython.core.display.HTML object>" | |
|
2809 | ] | |
|
2810 | }, | |
|
2811 | "metadata": {}, | |
|
2812 | "output_type": "display_data" | |
|
2813 | } | |
|
2814 | ], | |
|
2815 | "source": [ | |
|
2816 | "%%HTML\n", | |
|
2817 | "<video width=\"90%\" style=\"display:block; margin: 0 auto;\" controls src=\"https://hephaistos.lpp.polytechnique.fr/data/LFR/PPBI_06_2018/minus30_to_20_transition.webm\" type=\"video/webm\">" | |
|
2818 | ] | |
|
2819 | }, | |
|
2820 | { | |
|
2821 | "cell_type": "code", | |
|
2822 | "execution_count": 42, | |
|
2823 | "metadata": { | |
|
2824 | "ExecuteTime": { | |
|
2825 | "end_time": "2018-07-04T13:38:34.304348Z", | |
|
2826 | "start_time": "2018-07-04T13:38:34.172511Z" | |
|
2827 | } | |
|
2828 | }, | |
|
2829 | "outputs": [ | |
|
2830 | { | |
|
2831 | "data": { | |
|
2832 | "application/javascript": [ | |
|
2833 | "/* Put everything inside the global mpl namespace */\n", | |
|
2834 | "window.mpl = {};\n", | |
|
2835 | "\n", | |
|
2836 | "\n", | |
|
2837 | "mpl.get_websocket_type = function() {\n", | |
|
2838 | " if (typeof(WebSocket) !== 'undefined') {\n", | |
|
2839 | " return WebSocket;\n", | |
|
2840 | " } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
|
2841 | " return MozWebSocket;\n", | |
|
2842 | " } else {\n", | |
|
2843 | " alert('Your browser does not have WebSocket support.' +\n", | |
|
2844 | " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
|
2845 | " 'Firefox 4 and 5 are also supported but you ' +\n", | |
|
2846 | " 'have to enable WebSockets in about:config.');\n", | |
|
2847 | " };\n", | |
|
2848 | "}\n", | |
|
2849 | "\n", | |
|
2850 | "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
|
2851 | " this.id = figure_id;\n", | |
|
2852 | "\n", | |
|
2853 | " this.ws = websocket;\n", | |
|
2854 | "\n", | |
|
2855 | " this.supports_binary = (this.ws.binaryType != undefined);\n", | |
|
2856 | "\n", | |
|
2857 | " if (!this.supports_binary) {\n", | |
|
2858 | " var warnings = document.getElementById(\"mpl-warnings\");\n", | |
|
2859 | " if (warnings) {\n", | |
|
2860 | " warnings.style.display = 'block';\n", | |
|
2861 | " warnings.textContent = (\n", | |
|
2862 | " \"This browser does not support binary websocket messages. \" +\n", | |
|
2863 | " \"Performance may be slow.\");\n", | |
|
2864 | " }\n", | |
|
2865 | " }\n", | |
|
2866 | "\n", | |
|
2867 | " this.imageObj = new Image();\n", | |
|
2868 | "\n", | |
|
2869 | " this.context = undefined;\n", | |
|
2870 | " this.message = undefined;\n", | |
|
2871 | " this.canvas = undefined;\n", | |
|
2872 | " this.rubberband_canvas = undefined;\n", | |
|
2873 | " this.rubberband_context = undefined;\n", | |
|
2874 | " this.format_dropdown = undefined;\n", | |
|
2875 | "\n", | |
|
2876 | " this.image_mode = 'full';\n", | |
|
2877 | "\n", | |
|
2878 | " this.root = $('<div/>');\n", | |
|
2879 | " this._root_extra_style(this.root)\n", | |
|
2880 | " this.root.attr('style', 'display: inline-block');\n", | |
|
2881 | "\n", | |
|
2882 | " $(parent_element).append(this.root);\n", | |
|
2883 | "\n", | |
|
2884 | " this._init_header(this);\n", | |
|
2885 | " this._init_canvas(this);\n", | |
|
2886 | " this._init_toolbar(this);\n", | |
|
2887 | "\n", | |
|
2888 | " var fig = this;\n", | |
|
2889 | "\n", | |
|
2890 | " this.waiting = false;\n", | |
|
2891 | "\n", | |
|
2892 | " this.ws.onopen = function () {\n", | |
|
2893 | " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
|
2894 | " fig.send_message(\"send_image_mode\", {});\n", | |
|
2895 | " if (mpl.ratio != 1) {\n", | |
|
2896 | " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", | |
|
2897 | " }\n", | |
|
2898 | " fig.send_message(\"refresh\", {});\n", | |
|
2899 | " }\n", | |
|
2900 | "\n", | |
|
2901 | " this.imageObj.onload = function() {\n", | |
|
2902 | " if (fig.image_mode == 'full') {\n", | |
|
2903 | " // Full images could contain transparency (where diff images\n", | |
|
2904 | " // almost always do), so we need to clear the canvas so that\n", | |
|
2905 | " // there is no ghosting.\n", | |
|
2906 | " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
|
2907 | " }\n", | |
|
2908 | " fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
|
2909 | " };\n", | |
|
2910 | "\n", | |
|
2911 | " this.imageObj.onunload = function() {\n", | |
|
2912 | " fig.ws.close();\n", | |
|
2913 | " }\n", | |
|
2914 | "\n", | |
|
2915 | " this.ws.onmessage = this._make_on_message_function(this);\n", | |
|
2916 | "\n", | |
|
2917 | " this.ondownload = ondownload;\n", | |
|
2918 | "}\n", | |
|
2919 | "\n", | |
|
2920 | "mpl.figure.prototype._init_header = function() {\n", | |
|
2921 | " var titlebar = $(\n", | |
|
2922 | " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", | |
|
2923 | " 'ui-helper-clearfix\"/>');\n", | |
|
2924 | " var titletext = $(\n", | |
|
2925 | " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", | |
|
2926 | " 'text-align: center; padding: 3px;\"/>');\n", | |
|
2927 | " titlebar.append(titletext)\n", | |
|
2928 | " this.root.append(titlebar);\n", | |
|
2929 | " this.header = titletext[0];\n", | |
|
2930 | "}\n", | |
|
2931 | "\n", | |
|
2932 | "\n", | |
|
2933 | "\n", | |
|
2934 | "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
|
2935 | "\n", | |
|
2936 | "}\n", | |
|
2937 | "\n", | |
|
2938 | "\n", | |
|
2939 | "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
|
2940 | "\n", | |
|
2941 | "}\n", | |
|
2942 | "\n", | |
|
2943 | "mpl.figure.prototype._init_canvas = function() {\n", | |
|
2944 | " var fig = this;\n", | |
|
2945 | "\n", | |
|
2946 | " var canvas_div = $('<div/>');\n", | |
|
2947 | "\n", | |
|
2948 | " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
|
2949 | "\n", | |
|
2950 | " function canvas_keyboard_event(event) {\n", | |
|
2951 | " return fig.key_event(event, event['data']);\n", | |
|
2952 | " }\n", | |
|
2953 | "\n", | |
|
2954 | " canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
|
2955 | " canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
|
2956 | " this.canvas_div = canvas_div\n", | |
|
2957 | " this._canvas_extra_style(canvas_div)\n", | |
|
2958 | " this.root.append(canvas_div);\n", | |
|
2959 | "\n", | |
|
2960 | " var canvas = $('<canvas/>');\n", | |
|
2961 | " canvas.addClass('mpl-canvas');\n", | |
|
2962 | " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
|
2963 | "\n", | |
|
2964 | " this.canvas = canvas[0];\n", | |
|
2965 | " this.context = canvas[0].getContext(\"2d\");\n", | |
|
2966 | "\n", | |
|
2967 | " var backingStore = this.context.backingStorePixelRatio ||\n", | |
|
2968 | "\tthis.context.webkitBackingStorePixelRatio ||\n", | |
|
2969 | "\tthis.context.mozBackingStorePixelRatio ||\n", | |
|
2970 | "\tthis.context.msBackingStorePixelRatio ||\n", | |
|
2971 | "\tthis.context.oBackingStorePixelRatio ||\n", | |
|
2972 | "\tthis.context.backingStorePixelRatio || 1;\n", | |
|
2973 | "\n", | |
|
2974 | " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", | |
|
2975 | "\n", | |
|
2976 | " var rubberband = $('<canvas/>');\n", | |
|
2977 | " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
|
2978 | "\n", | |
|
2979 | " var pass_mouse_events = true;\n", | |
|
2980 | "\n", | |
|
2981 | " canvas_div.resizable({\n", | |
|
2982 | " start: function(event, ui) {\n", | |
|
2983 | " pass_mouse_events = false;\n", | |
|
2984 | " },\n", | |
|
2985 | " resize: function(event, ui) {\n", | |
|
2986 | " fig.request_resize(ui.size.width, ui.size.height);\n", | |
|
2987 | " },\n", | |
|
2988 | " stop: function(event, ui) {\n", | |
|
2989 | " pass_mouse_events = true;\n", | |
|
2990 | " fig.request_resize(ui.size.width, ui.size.height);\n", | |
|
2991 | " },\n", | |
|
2992 | " });\n", | |
|
2993 | "\n", | |
|
2994 | " function mouse_event_fn(event) {\n", | |
|
2995 | " if (pass_mouse_events)\n", | |
|
2996 | " return fig.mouse_event(event, event['data']);\n", | |
|
2997 | " }\n", | |
|
2998 | "\n", | |
|
2999 | " rubberband.mousedown('button_press', mouse_event_fn);\n", | |
|
3000 | " rubberband.mouseup('button_release', mouse_event_fn);\n", | |
|
3001 | " // Throttle sequential mouse events to 1 every 20ms.\n", | |
|
3002 | " rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
|
3003 | "\n", | |
|
3004 | " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
|
3005 | " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
|
3006 | "\n", | |
|
3007 | " canvas_div.on(\"wheel\", function (event) {\n", | |
|
3008 | " event = event.originalEvent;\n", | |
|
3009 | " event['data'] = 'scroll'\n", | |
|
3010 | " if (event.deltaY < 0) {\n", | |
|
3011 | " event.step = 1;\n", | |
|
3012 | " } else {\n", | |
|
3013 | " event.step = -1;\n", | |
|
3014 | " }\n", | |
|
3015 | " mouse_event_fn(event);\n", | |
|
3016 | " });\n", | |
|
3017 | "\n", | |
|
3018 | " canvas_div.append(canvas);\n", | |
|
3019 | " canvas_div.append(rubberband);\n", | |
|
3020 | "\n", | |
|
3021 | " this.rubberband = rubberband;\n", | |
|
3022 | " this.rubberband_canvas = rubberband[0];\n", | |
|
3023 | " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
|
3024 | " this.rubberband_context.strokeStyle = \"#000000\";\n", | |
|
3025 | "\n", | |
|
3026 | " this._resize_canvas = function(width, height) {\n", | |
|
3027 | " // Keep the size of the canvas, canvas container, and rubber band\n", | |
|
3028 | " // canvas in synch.\n", | |
|
3029 | " canvas_div.css('width', width)\n", | |
|
3030 | " canvas_div.css('height', height)\n", | |
|
3031 | "\n", | |
|
3032 | " canvas.attr('width', width * mpl.ratio);\n", | |
|
3033 | " canvas.attr('height', height * mpl.ratio);\n", | |
|
3034 | " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", | |
|
3035 | "\n", | |
|
3036 | " rubberband.attr('width', width);\n", | |
|
3037 | " rubberband.attr('height', height);\n", | |
|
3038 | " }\n", | |
|
3039 | "\n", | |
|
3040 | " // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
|
3041 | " // upon first draw.\n", | |
|
3042 | " this._resize_canvas(600, 600);\n", | |
|
3043 | "\n", | |
|
3044 | " // Disable right mouse context menu.\n", | |
|
3045 | " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
|
3046 | " return false;\n", | |
|
3047 | " });\n", | |
|
3048 | "\n", | |
|
3049 | " function set_focus () {\n", | |
|
3050 | " canvas.focus();\n", | |
|
3051 | " canvas_div.focus();\n", | |
|
3052 | " }\n", | |
|
3053 | "\n", | |
|
3054 | " window.setTimeout(set_focus, 100);\n", | |
|
3055 | "}\n", | |
|
3056 | "\n", | |
|
3057 | "mpl.figure.prototype._init_toolbar = function() {\n", | |
|
3058 | " var fig = this;\n", | |
|
3059 | "\n", | |
|
3060 | " var nav_element = $('<div/>')\n", | |
|
3061 | " nav_element.attr('style', 'width: 100%');\n", | |
|
3062 | " this.root.append(nav_element);\n", | |
|
3063 | "\n", | |
|
3064 | " // Define a callback function for later on.\n", | |
|
3065 | " function toolbar_event(event) {\n", | |
|
3066 | " return fig.toolbar_button_onclick(event['data']);\n", | |
|
3067 | " }\n", | |
|
3068 | " function toolbar_mouse_event(event) {\n", | |
|
3069 | " return fig.toolbar_button_onmouseover(event['data']);\n", | |
|
3070 | " }\n", | |
|
3071 | "\n", | |
|
3072 | " for(var toolbar_ind in mpl.toolbar_items) {\n", | |
|
3073 | " var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
|
3074 | " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
|
3075 | " var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
|
3076 | " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
|
3077 | "\n", | |
|
3078 | " if (!name) {\n", | |
|
3079 | " // put a spacer in here.\n", | |
|
3080 | " continue;\n", | |
|
3081 | " }\n", | |
|
3082 | " var button = $('<button/>');\n", | |
|
3083 | " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
|
3084 | " 'ui-button-icon-only');\n", | |
|
3085 | " button.attr('role', 'button');\n", | |
|
3086 | " button.attr('aria-disabled', 'false');\n", | |
|
3087 | " button.click(method_name, toolbar_event);\n", | |
|
3088 | " button.mouseover(tooltip, toolbar_mouse_event);\n", | |
|
3089 | "\n", | |
|
3090 | " var icon_img = $('<span/>');\n", | |
|
3091 | " icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
|
3092 | " icon_img.addClass(image);\n", | |
|
3093 | " icon_img.addClass('ui-corner-all');\n", | |
|
3094 | "\n", | |
|
3095 | " var tooltip_span = $('<span/>');\n", | |
|
3096 | " tooltip_span.addClass('ui-button-text');\n", | |
|
3097 | " tooltip_span.html(tooltip);\n", | |
|
3098 | "\n", | |
|
3099 | " button.append(icon_img);\n", | |
|
3100 | " button.append(tooltip_span);\n", | |
|
3101 | "\n", | |
|
3102 | " nav_element.append(button);\n", | |
|
3103 | " }\n", | |
|
3104 | "\n", | |
|
3105 | " var fmt_picker_span = $('<span/>');\n", | |
|
3106 | "\n", | |
|
3107 | " var fmt_picker = $('<select/>');\n", | |
|
3108 | " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
|
3109 | " fmt_picker_span.append(fmt_picker);\n", | |
|
3110 | " nav_element.append(fmt_picker_span);\n", | |
|
3111 | " this.format_dropdown = fmt_picker[0];\n", | |
|
3112 | "\n", | |
|
3113 | " for (var ind in mpl.extensions) {\n", | |
|
3114 | " var fmt = mpl.extensions[ind];\n", | |
|
3115 | " var option = $(\n", | |
|
3116 | " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
|
3117 | " fmt_picker.append(option)\n", | |
|
3118 | " }\n", | |
|
3119 | "\n", | |
|
3120 | " // Add hover states to the ui-buttons\n", | |
|
3121 | " $( \".ui-button\" ).hover(\n", | |
|
3122 | " function() { $(this).addClass(\"ui-state-hover\");},\n", | |
|
3123 | " function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
|
3124 | " );\n", | |
|
3125 | "\n", | |
|
3126 | " var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
|
3127 | " nav_element.append(status_bar);\n", | |
|
3128 | " this.message = status_bar[0];\n", | |
|
3129 | "}\n", | |
|
3130 | "\n", | |
|
3131 | "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
|
3132 | " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
|
3133 | " // which will in turn request a refresh of the image.\n", | |
|
3134 | " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
|
3135 | "}\n", | |
|
3136 | "\n", | |
|
3137 | "mpl.figure.prototype.send_message = function(type, properties) {\n", | |
|
3138 | " properties['type'] = type;\n", | |
|
3139 | " properties['figure_id'] = this.id;\n", | |
|
3140 | " this.ws.send(JSON.stringify(properties));\n", | |
|
3141 | "}\n", | |
|
3142 | "\n", | |
|
3143 | "mpl.figure.prototype.send_draw_message = function() {\n", | |
|
3144 | " if (!this.waiting) {\n", | |
|
3145 | " this.waiting = true;\n", | |
|
3146 | " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
|
3147 | " }\n", | |
|
3148 | "}\n", | |
|
3149 | "\n", | |
|
3150 | "\n", | |
|
3151 | "mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
|
3152 | " var format_dropdown = fig.format_dropdown;\n", | |
|
3153 | " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
|
3154 | " fig.ondownload(fig, format);\n", | |
|
3155 | "}\n", | |
|
3156 | "\n", | |
|
3157 | "\n", | |
|
3158 | "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
|
3159 | " var size = msg['size'];\n", | |
|
3160 | " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
|
3161 | " fig._resize_canvas(size[0], size[1]);\n", | |
|
3162 | " fig.send_message(\"refresh\", {});\n", | |
|
3163 | " };\n", | |
|
3164 | "}\n", | |
|
3165 | "\n", | |
|
3166 | "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
|
3167 | " var x0 = msg['x0'] / mpl.ratio;\n", | |
|
3168 | " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", | |
|
3169 | " var x1 = msg['x1'] / mpl.ratio;\n", | |
|
3170 | " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", | |
|
3171 | " x0 = Math.floor(x0) + 0.5;\n", | |
|
3172 | " y0 = Math.floor(y0) + 0.5;\n", | |
|
3173 | " x1 = Math.floor(x1) + 0.5;\n", | |
|
3174 | " y1 = Math.floor(y1) + 0.5;\n", | |
|
3175 | " var min_x = Math.min(x0, x1);\n", | |
|
3176 | " var min_y = Math.min(y0, y1);\n", | |
|
3177 | " var width = Math.abs(x1 - x0);\n", | |
|
3178 | " var height = Math.abs(y1 - y0);\n", | |
|
3179 | "\n", | |
|
3180 | " fig.rubberband_context.clearRect(\n", | |
|
3181 | " 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
|
3182 | "\n", | |
|
3183 | " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
|
3184 | "}\n", | |
|
3185 | "\n", | |
|
3186 | "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
|
3187 | " // Updates the figure title.\n", | |
|
3188 | " fig.header.textContent = msg['label'];\n", | |
|
3189 | "}\n", | |
|
3190 | "\n", | |
|
3191 | "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
|
3192 | " var cursor = msg['cursor'];\n", | |
|
3193 | " switch(cursor)\n", | |
|
3194 | " {\n", | |
|
3195 | " case 0:\n", | |
|
3196 | " cursor = 'pointer';\n", | |
|
3197 | " break;\n", | |
|
3198 | " case 1:\n", | |
|
3199 | " cursor = 'default';\n", | |
|
3200 | " break;\n", | |
|
3201 | " case 2:\n", | |
|
3202 | " cursor = 'crosshair';\n", | |
|
3203 | " break;\n", | |
|
3204 | " case 3:\n", | |
|
3205 | " cursor = 'move';\n", | |
|
3206 | " break;\n", | |
|
3207 | " }\n", | |
|
3208 | " fig.rubberband_canvas.style.cursor = cursor;\n", | |
|
3209 | "}\n", | |
|
3210 | "\n", | |
|
3211 | "mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
|
3212 | " fig.message.textContent = msg['message'];\n", | |
|
3213 | "}\n", | |
|
3214 | "\n", | |
|
3215 | "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
|
3216 | " // Request the server to send over a new figure.\n", | |
|
3217 | " fig.send_draw_message();\n", | |
|
3218 | "}\n", | |
|
3219 | "\n", | |
|
3220 | "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
|
3221 | " fig.image_mode = msg['mode'];\n", | |
|
3222 | "}\n", | |
|
3223 | "\n", | |
|
3224 | "mpl.figure.prototype.updated_canvas_event = function() {\n", | |
|
3225 | " // Called whenever the canvas gets updated.\n", | |
|
3226 | " this.send_message(\"ack\", {});\n", | |
|
3227 | "}\n", | |
|
3228 | "\n", | |
|
3229 | "// A function to construct a web socket function for onmessage handling.\n", | |
|
3230 | "// Called in the figure constructor.\n", | |
|
3231 | "mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
|
3232 | " return function socket_on_message(evt) {\n", | |
|
3233 | " if (evt.data instanceof Blob) {\n", | |
|
3234 | " /* FIXME: We get \"Resource interpreted as Image but\n", | |
|
3235 | " * transferred with MIME type text/plain:\" errors on\n", | |
|
3236 | " * Chrome. But how to set the MIME type? It doesn't seem\n", | |
|
3237 | " * to be part of the websocket stream */\n", | |
|
3238 | " evt.data.type = \"image/png\";\n", | |
|
3239 | "\n", | |
|
3240 | " /* Free the memory for the previous frames */\n", | |
|
3241 | " if (fig.imageObj.src) {\n", | |
|
3242 | " (window.URL || window.webkitURL).revokeObjectURL(\n", | |
|
3243 | " fig.imageObj.src);\n", | |
|
3244 | " }\n", | |
|
3245 | "\n", | |
|
3246 | " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
|
3247 | " evt.data);\n", | |
|
3248 | " fig.updated_canvas_event();\n", | |
|
3249 | " fig.waiting = false;\n", | |
|
3250 | " return;\n", | |
|
3251 | " }\n", | |
|
3252 | " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", | |
|
3253 | " fig.imageObj.src = evt.data;\n", | |
|
3254 | " fig.updated_canvas_event();\n", | |
|
3255 | " fig.waiting = false;\n", | |
|
3256 | " return;\n", | |
|
3257 | " }\n", | |
|
3258 | "\n", | |
|
3259 | " var msg = JSON.parse(evt.data);\n", | |
|
3260 | " var msg_type = msg['type'];\n", | |
|
3261 | "\n", | |
|
3262 | " // Call the \"handle_{type}\" callback, which takes\n", | |
|
3263 | " // the figure and JSON message as its only arguments.\n", | |
|
3264 | " try {\n", | |
|
3265 | " var callback = fig[\"handle_\" + msg_type];\n", | |
|
3266 | " } catch (e) {\n", | |
|
3267 | " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", | |
|
3268 | " return;\n", | |
|
3269 | " }\n", | |
|
3270 | "\n", | |
|
3271 | " if (callback) {\n", | |
|
3272 | " try {\n", | |
|
3273 | " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", | |
|
3274 | " callback(fig, msg);\n", | |
|
3275 | " } catch (e) {\n", | |
|
3276 | " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", | |
|
3277 | " }\n", | |
|
3278 | " }\n", | |
|
3279 | " };\n", | |
|
3280 | "}\n", | |
|
3281 | "\n", | |
|
3282 | "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", | |
|
3283 | "mpl.findpos = function(e) {\n", | |
|
3284 | " //this section is from http://www.quirksmode.org/js/events_properties.html\n", | |
|
3285 | " var targ;\n", | |
|
3286 | " if (!e)\n", | |
|
3287 | " e = window.event;\n", | |
|
3288 | " if (e.target)\n", | |
|
3289 | " targ = e.target;\n", | |
|
3290 | " else if (e.srcElement)\n", | |
|
3291 | " targ = e.srcElement;\n", | |
|
3292 | " if (targ.nodeType == 3) // defeat Safari bug\n", | |
|
3293 | " targ = targ.parentNode;\n", | |
|
3294 | "\n", | |
|
3295 | " // jQuery normalizes the pageX and pageY\n", | |
|
3296 | " // pageX,Y are the mouse positions relative to the document\n", | |
|
3297 | " // offset() returns the position of the element relative to the document\n", | |
|
3298 | " var x = e.pageX - $(targ).offset().left;\n", | |
|
3299 | " var y = e.pageY - $(targ).offset().top;\n", | |
|
3300 | "\n", | |
|
3301 | " return {\"x\": x, \"y\": y};\n", | |
|
3302 | "};\n", | |
|
3303 | "\n", | |
|
3304 | "/*\n", | |
|
3305 | " * return a copy of an object with only non-object keys\n", | |
|
3306 | " * we need this to avoid circular references\n", | |
|
3307 | " * http://stackoverflow.com/a/24161582/3208463\n", | |
|
3308 | " */\n", | |
|
3309 | "function simpleKeys (original) {\n", | |
|
3310 | " return Object.keys(original).reduce(function (obj, key) {\n", | |
|
3311 | " if (typeof original[key] !== 'object')\n", | |
|
3312 | " obj[key] = original[key]\n", | |
|
3313 | " return obj;\n", | |
|
3314 | " }, {});\n", | |
|
3315 | "}\n", | |
|
3316 | "\n", | |
|
3317 | "mpl.figure.prototype.mouse_event = function(event, name) {\n", | |
|
3318 | " var canvas_pos = mpl.findpos(event)\n", | |
|
3319 | "\n", | |
|
3320 | " if (name === 'button_press')\n", | |
|
3321 | " {\n", | |
|
3322 | " this.canvas.focus();\n", | |
|
3323 | " this.canvas_div.focus();\n", | |
|
3324 | " }\n", | |
|
3325 | "\n", | |
|
3326 | " var x = canvas_pos.x * mpl.ratio;\n", | |
|
3327 | " var y = canvas_pos.y * mpl.ratio;\n", | |
|
3328 | "\n", | |
|
3329 | " this.send_message(name, {x: x, y: y, button: event.button,\n", | |
|
3330 | " step: event.step,\n", | |
|
3331 | " guiEvent: simpleKeys(event)});\n", | |
|
3332 | "\n", | |
|
3333 | " /* This prevents the web browser from automatically changing to\n", | |
|
3334 | " * the text insertion cursor when the button is pressed. We want\n", | |
|
3335 | " * to control all of the cursor setting manually through the\n", | |
|
3336 | " * 'cursor' event from matplotlib */\n", | |
|
3337 | " event.preventDefault();\n", | |
|
3338 | " return false;\n", | |
|
3339 | "}\n", | |
|
3340 | "\n", | |
|
3341 | "mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
|
3342 | " // Handle any extra behaviour associated with a key event\n", | |
|
3343 | "}\n", | |
|
3344 | "\n", | |
|
3345 | "mpl.figure.prototype.key_event = function(event, name) {\n", | |
|
3346 | "\n", | |
|
3347 | " // Prevent repeat events\n", | |
|
3348 | " if (name == 'key_press')\n", | |
|
3349 | " {\n", | |
|
3350 | " if (event.which === this._key)\n", | |
|
3351 | " return;\n", | |
|
3352 | " else\n", | |
|
3353 | " this._key = event.which;\n", | |
|
3354 | " }\n", | |
|
3355 | " if (name == 'key_release')\n", | |
|
3356 | " this._key = null;\n", | |
|
3357 | "\n", | |
|
3358 | " var value = '';\n", | |
|
3359 | " if (event.ctrlKey && event.which != 17)\n", | |
|
3360 | " value += \"ctrl+\";\n", | |
|
3361 | " if (event.altKey && event.which != 18)\n", | |
|
3362 | " value += \"alt+\";\n", | |
|
3363 | " if (event.shiftKey && event.which != 16)\n", | |
|
3364 | " value += \"shift+\";\n", | |
|
3365 | "\n", | |
|
3366 | " value += 'k';\n", | |
|
3367 | " value += event.which.toString();\n", | |
|
3368 | "\n", | |
|
3369 | " this._key_event_extra(event, name);\n", | |
|
3370 | "\n", | |
|
3371 | " this.send_message(name, {key: value,\n", | |
|
3372 | " guiEvent: simpleKeys(event)});\n", | |
|
3373 | " return false;\n", | |
|
3374 | "}\n", | |
|
3375 | "\n", | |
|
3376 | "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
|
3377 | " if (name == 'download') {\n", | |
|
3378 | " this.handle_save(this, null);\n", | |
|
3379 | " } else {\n", | |
|
3380 | " this.send_message(\"toolbar_button\", {name: name});\n", | |
|
3381 | " }\n", | |
|
3382 | "};\n", | |
|
3383 | "\n", | |
|
3384 | "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
|
3385 | " this.message.textContent = tooltip;\n", | |
|
3386 | "};\n", | |
|
3387 | "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", | |
|
3388 | "\n", | |
|
3389 | "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", | |
|
3390 | "\n", | |
|
3391 | "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
|
3392 | " // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
|
3393 | " // object with the appropriate methods. Currently this is a non binary\n", | |
|
3394 | " // socket, so there is still some room for performance tuning.\n", | |
|
3395 | " var ws = {};\n", | |
|
3396 | "\n", | |
|
3397 | " ws.close = function() {\n", | |
|
3398 | " comm.close()\n", | |
|
3399 | " };\n", | |
|
3400 | " ws.send = function(m) {\n", | |
|
3401 | " //console.log('sending', m);\n", | |
|
3402 | " comm.send(m);\n", | |
|
3403 | " };\n", | |
|
3404 | " // Register the callback with on_msg.\n", | |
|
3405 | " comm.on_msg(function(msg) {\n", | |
|
3406 | " //console.log('receiving', msg['content']['data'], msg);\n", | |
|
3407 | " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", | |
|
3408 | " ws.onmessage(msg['content']['data'])\n", | |
|
3409 | " });\n", | |
|
3410 | " return ws;\n", | |
|
3411 | "}\n", | |
|
3412 | "\n", | |
|
3413 | "mpl.mpl_figure_comm = function(comm, msg) {\n", | |
|
3414 | " // This is the function which gets called when the mpl process\n", | |
|
3415 | " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
|
3416 | "\n", | |
|
3417 | " var id = msg.content.data.id;\n", | |
|
3418 | " // Get hold of the div created by the display call when the Comm\n", | |
|
3419 | " // socket was opened in Python.\n", | |
|
3420 | " var element = $(\"#\" + id);\n", | |
|
3421 | " var ws_proxy = comm_websocket_adapter(comm)\n", | |
|
3422 | "\n", | |
|
3423 | " function ondownload(figure, format) {\n", | |
|
3424 | " window.open(figure.imageObj.src);\n", | |
|
3425 | " }\n", | |
|
3426 | "\n", | |
|
3427 | " var fig = new mpl.figure(id, ws_proxy,\n", | |
|
3428 | " ondownload,\n", | |
|
3429 | " element.get(0));\n", | |
|
3430 | "\n", | |
|
3431 | " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
|
3432 | " // web socket which is closed, not our websocket->open comm proxy.\n", | |
|
3433 | " ws_proxy.onopen();\n", | |
|
3434 | "\n", | |
|
3435 | " fig.parent_element = element.get(0);\n", | |
|
3436 | " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
|
3437 | " if (!fig.cell_info) {\n", | |
|
3438 | " console.error(\"Failed to find cell for figure\", id, fig);\n", | |
|
3439 | " return;\n", | |
|
3440 | " }\n", | |
|
3441 | "\n", | |
|
3442 | " var output_index = fig.cell_info[2]\n", | |
|
3443 | " var cell = fig.cell_info[0];\n", | |
|
3444 | "\n", | |
|
3445 | "};\n", | |
|
3446 | "\n", | |
|
3447 | "mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
|
3448 | " var width = fig.canvas.width/mpl.ratio\n", | |
|
3449 | " fig.root.unbind('remove')\n", | |
|
3450 | "\n", | |
|
3451 | " // Update the output cell to use the data from the current canvas.\n", | |
|
3452 | " fig.push_to_output();\n", | |
|
3453 | " var dataURL = fig.canvas.toDataURL();\n", | |
|
3454 | " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", | |
|
3455 | " // the notebook keyboard shortcuts fail.\n", | |
|
3456 | " IPython.keyboard_manager.enable()\n", | |
|
3457 | " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", | |
|
3458 | " fig.close_ws(fig, msg);\n", | |
|
3459 | "}\n", | |
|
3460 | "\n", | |
|
3461 | "mpl.figure.prototype.close_ws = function(fig, msg){\n", | |
|
3462 | " fig.send_message('closing', msg);\n", | |
|
3463 | " // fig.ws.close()\n", | |
|
3464 | "}\n", | |
|
3465 | "\n", | |
|
3466 | "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", | |
|
3467 | " // Turn the data on the canvas into data in the output cell.\n", | |
|
3468 | " var width = this.canvas.width/mpl.ratio\n", | |
|
3469 | " var dataURL = this.canvas.toDataURL();\n", | |
|
3470 | " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", | |
|
3471 | "}\n", | |
|
3472 | "\n", | |
|
3473 | "mpl.figure.prototype.updated_canvas_event = function() {\n", | |
|
3474 | " // Tell IPython that the notebook contents must change.\n", | |
|
3475 | " IPython.notebook.set_dirty(true);\n", | |
|
3476 | " this.send_message(\"ack\", {});\n", | |
|
3477 | " var fig = this;\n", | |
|
3478 | " // Wait a second, then push the new image to the DOM so\n", | |
|
3479 | " // that it is saved nicely (might be nice to debounce this).\n", | |
|
3480 | " setTimeout(function () { fig.push_to_output() }, 1000);\n", | |
|
3481 | "}\n", | |
|
3482 | "\n", | |
|
3483 | "mpl.figure.prototype._init_toolbar = function() {\n", | |
|
3484 | " var fig = this;\n", | |
|
3485 | "\n", | |
|
3486 | " var nav_element = $('<div/>')\n", | |
|
3487 | " nav_element.attr('style', 'width: 100%');\n", | |
|
3488 | " this.root.append(nav_element);\n", | |
|
3489 | "\n", | |
|
3490 | " // Define a callback function for later on.\n", | |
|
3491 | " function toolbar_event(event) {\n", | |
|
3492 | " return fig.toolbar_button_onclick(event['data']);\n", | |
|
3493 | " }\n", | |
|
3494 | " function toolbar_mouse_event(event) {\n", | |
|
3495 | " return fig.toolbar_button_onmouseover(event['data']);\n", | |
|
3496 | " }\n", | |
|
3497 | "\n", | |
|
3498 | " for(var toolbar_ind in mpl.toolbar_items){\n", | |
|
3499 | " var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
|
3500 | " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
|
3501 | " var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
|
3502 | " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
|
3503 | "\n", | |
|
3504 | " if (!name) { continue; };\n", | |
|
3505 | "\n", | |
|
3506 | " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", | |
|
3507 | " button.click(method_name, toolbar_event);\n", | |
|
3508 | " button.mouseover(tooltip, toolbar_mouse_event);\n", | |
|
3509 | " nav_element.append(button);\n", | |
|
3510 | " }\n", | |
|
3511 | "\n", | |
|
3512 | " // Add the status bar.\n", | |
|
3513 | " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", | |
|
3514 | " nav_element.append(status_bar);\n", | |
|
3515 | " this.message = status_bar[0];\n", | |
|
3516 | "\n", | |
|
3517 | " // Add the close button to the window.\n", | |
|
3518 | " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", | |
|
3519 | " 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", | |
|
3520 | " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", | |
|
3521 | " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", | |
|
3522 | " buttongrp.append(button);\n", | |
|
3523 | " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", | |
|
3524 | " titlebar.prepend(buttongrp);\n", | |
|
3525 | "}\n", | |
|
3526 | "\n", | |
|
3527 | "mpl.figure.prototype._root_extra_style = function(el){\n", | |
|
3528 | " var fig = this\n", | |
|
3529 | " el.on(\"remove\", function(){\n", | |
|
3530 | "\tfig.close_ws(fig, {});\n", | |
|
3531 | " });\n", | |
|
3532 | "}\n", | |
|
3533 | "\n", | |
|
3534 | "mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
|
3535 | " // this is important to make the div 'focusable\n", | |
|
3536 | " el.attr('tabindex', 0)\n", | |
|
3537 | " // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
|
3538 | " // off when our div gets focus\n", | |
|
3539 | "\n", | |
|
3540 | " // location in version 3\n", | |
|
3541 | " if (IPython.notebook.keyboard_manager) {\n", | |
|
3542 | " IPython.notebook.keyboard_manager.register_events(el);\n", | |
|
3543 | " }\n", | |
|
3544 | " else {\n", | |
|
3545 | " // location in version 2\n", | |
|
3546 | " IPython.keyboard_manager.register_events(el);\n", | |
|
3547 | " }\n", | |
|
3548 | "\n", | |
|
3549 | "}\n", | |
|
3550 | "\n", | |
|
3551 | "mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
|
3552 | " var manager = IPython.notebook.keyboard_manager;\n", | |
|
3553 | " if (!manager)\n", | |
|
3554 | " manager = IPython.keyboard_manager;\n", | |
|
3555 | "\n", | |
|
3556 | " // Check for shift+enter\n", | |
|
3557 | " if (event.shiftKey && event.which == 13) {\n", | |
|
3558 | " this.canvas_div.blur();\n", | |
|
3559 | " event.shiftKey = false;\n", | |
|
3560 | " // Send a \"J\" for go to next cell\n", | |
|
3561 | " event.which = 74;\n", | |
|
3562 | " event.keyCode = 74;\n", | |
|
3563 | " manager.command_mode();\n", | |
|
3564 | " manager.handle_keydown(event);\n", | |
|
3565 | " }\n", | |
|
3566 | "}\n", | |
|
3567 | "\n", | |
|
3568 | "mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
|
3569 | " fig.ondownload(fig, null);\n", | |
|
3570 | "}\n", | |
|
3571 | "\n", | |
|
3572 | "\n", | |
|
3573 | "mpl.find_output_cell = function(html_output) {\n", | |
|
3574 | " // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
|
3575 | " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
|
3576 | " // IPython event is triggered only after the cells have been serialised, which for\n", | |
|
3577 | " // our purposes (turning an active figure into a static one), is too late.\n", | |
|
3578 | " var cells = IPython.notebook.get_cells();\n", | |
|
3579 | " var ncells = cells.length;\n", | |
|
3580 | " for (var i=0; i<ncells; i++) {\n", | |
|
3581 | " var cell = cells[i];\n", | |
|
3582 | " if (cell.cell_type === 'code'){\n", | |
|
3583 | " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
|
3584 | " var data = cell.output_area.outputs[j];\n", | |
|
3585 | " if (data.data) {\n", | |
|
3586 | " // IPython >= 3 moved mimebundle to data attribute of output\n", | |
|
3587 | " data = data.data;\n", | |
|
3588 | " }\n", | |
|
3589 | " if (data['text/html'] == html_output) {\n", | |
|
3590 | " return [cell, data, j];\n", | |
|
3591 | " }\n", | |
|
3592 | " }\n", | |
|
3593 | " }\n", | |
|
3594 | " }\n", | |
|
3595 | "}\n", | |
|
3596 | "\n", | |
|
3597 | "// Register the function which deals with the matplotlib target/channel.\n", | |
|
3598 | "// The kernel may be null if the page has been refreshed.\n", | |
|
3599 | "if (IPython.notebook.kernel != null) {\n", | |
|
3600 | " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
|
3601 | "}\n" | |
|
3602 | ], | |
|
3603 | "text/plain": [ | |
|
3604 | "<IPython.core.display.Javascript object>" | |
|
3605 | ] | |
|
3606 | }, | |
|
3607 | "metadata": {}, | |
|
3608 | "output_type": "display_data" | |
|
1927 | 3609 | }, |
|
1928 | "scrolled": true | |
|
1929 | }, | |
|
1930 | "outputs": [], | |
|
1931 | "source": [ | |
|
1932 | "%%capture\n", | |
|
1933 | "for i in range(0,res.SWFCount()):\n", | |
|
1934 | " f, axes = plt.subplots(nrows=2, ncols=3,figsize=(24,10))\n", | |
|
1935 | " df=res.SWF(0,i)\n", | |
|
1936 | " for ax,col in zip(axes.flatten(),df.columns):\n", | |
|
1937 | " ax.plot(np.arange(2048),df[col])\n", | |
|
1938 | " ax.set_ylim(-30000,30000)\n", | |
|
1939 | " patches, labels = ax.get_legend_handles_labels()\n", | |
|
1940 | " ax.legend(patches, labels, loc='upper left')\n", | |
|
1941 | " T = get_temperature_at(temperatures,times[\"SWF0\"][i][\"Time\"]-datetime.timedelta(minutes=4,seconds=10))\n", | |
|
1942 | " T_HK = get_temperature_at(HK_TEMP_df,times[\"SWF0\"][i][\"Time\"])\n", | |
|
1943 | " suptitle=plt.suptitle(\"Air={T_Air:3.1f}°C PCB(HK)={T_PCB:3.1f}°C socket={T_socket:3.1f}°C\".format(T_Air=T[\"air\"],T_PCB=T_HK,T_socket=T[\"socket\"]),y=1.05, fontsize=24)\n", | |
|
1944 | " plt.tight_layout()\n", | |
|
1945 | " plt.savefig(\"/home/jeandet/Documents/SOLO_LFR_Notebooks/PPBI_06_2018/temp/\"+\"/plot_{i}.png\".format(i=i),bbox_inches='tight',bbox_extra_artists=[suptitle])\n", | |
|
1946 | " plt.close()\n", | |
|
1947 | " del axes\n", | |
|
1948 | " del f\n", | |
|
1949 | " del df\n", | |
|
1950 | " del suptitle\n", | |
|
1951 | " gc.collect()" | |
|
1952 | ] | |
|
1953 | }, | |
|
1954 | { | |
|
1955 | "cell_type": "code", | |
|
1956 | "execution_count": 13, | |
|
1957 | "metadata": { | |
|
1958 | "ExecuteTime": { | |
|
1959 | "end_time": "2018-06-29T12:24:22.887029Z", | |
|
1960 | "start_time": "2018-06-29T12:24:11.457143Z" | |
|
1961 | } | |
|
1962 | }, | |
|
1963 | "outputs": [], | |
|
1964 | "source": [ | |
|
1965 | "%%capture\n", | |
|
1966 | "!cd /home/jeandet/Documents/SOLO_LFR_Notebooks/PPBI_06_2018/temp/ && ffmpeg -y -framerate 15 -i plot_%d.png minus30_to_20_transition.mp4 && ffmpeg -y -i minus30_to_20_transition.mp4 -c:v libvpx-vp9 -b:v 2M -threads 8 minus30_to_20_transition.webm" | |
|
1967 | ] | |
|
1968 | }, | |
|
1969 | { | |
|
1970 | "cell_type": "code", | |
|
1971 | "execution_count": 14, | |
|
1972 | "metadata": { | |
|
1973 | "ExecuteTime": { | |
|
1974 | "end_time": "2018-06-29T12:25:16.067271Z", | |
|
1975 | "start_time": "2018-06-29T12:25:16.062111Z" | |
|
1976 | } | |
|
1977 | }, | |
|
1978 | "outputs": [ | |
|
1979 | 3610 | { |
|
1980 | 3611 | "data": { |
|
1981 | 3612 | "text/html": [ |
|
1982 | "<video width=\"90%\" style=\"display:block; margin: 0 auto;\" controls src=\"https://hephaistos.lpp.polytechnique.fr/data/LFR/PPBI_06_2018/minus30_to_20_transition.webm\" type=\"video/webm\">" | |
|
3613 | "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABDgAAALQCAYAAAB118BaAAAgAElEQVR4nOzdd3wUdf7H8UlMqAKH5dQ7zwER9A44C1iwouJhO8XCYT8UC1bkJzCACiiCCiKoKCAqil1PRR167733DqH3koT0ff/+iBlYMoEkZLP73X09H499PM7d2e98Nufnj8/bme9YAgAAAAAAMJwV7gIAAAAAAABOFAEHAAAAAAAwHgEHAAAAAAAwHgEHAAAAAAAwHgEHAAAAAAAwHgEHAAAAAAAwHgEHAAAAAAAwHgEHAAAAAAAwHgEHAAAAAAAwHgEHAAAAAAAwHgEHAAAAAAAwHgEHAAAAAAAwHgEHAAAAAAAwHgEHAACGysrKkmVZuvHGG8NdCgAAQNgRcABAjHvjjTdkWZYsy9KKFSvCXQ6KIBICjuzsbP3lL3+RZVlauXLlMY9NSUlRpUqVVLZsWe3atStkNb388svev9OFedWoUSNktcSC3r17y7Is/fLLL+EuBQAQ4wg4ACCGBQIBVatWTXFxcbIsSy+99FK4S0IRLV++XElJSWGtIS9QaNu27TGP++STT2RZlu67776Q1jN27Fh17tw56PXvf/9blmXp4osvzvfZe++9F9J6oh0BBwAgUhBwAEAMGzFihCzLUvPmzXXmmWfqtNNOU0ZGRrjLgmHWr1+v+Ph4/fnPf1ZmZmaBx11xxRWyLEvjxo0rxepyDRw4UJZlqUWLFqV+7mhHwAEAiBQEHAAQw+655x5ZlqWpU6fqpZdekmVZ+u677/Id16JFC1mWJdd1fdeZMmWKLMtSs2bNgt5PSUlRt27d9M9//lMVKlRQxYoV1aBBA99zjB49WpZlqWvXrpo+fbpuueUWVa1aVZZladOmTZKkMWPGqEWLFrrgggtUqVIllS9fXrVr19brr7+u9PR039q2bNmiRx55RKeddprKlSuniy66SF9++WXQ+Y62e/dutWvXTueff77Kli2rKlWqqFGjRho9evRx/6Z5jrx9ZOfOnWrRooXOOOMMlSlTRrVr19YXX3zh+72cnBx9+OGHqlevnipUqKAKFSro0ksvVf/+/RUIBAo8x5EOHDigLl26qHbt2jr55JN18sknq0aNGmrWrJnmzZuX75zTpk3T3XffrT//+c9KTEzU2Wefraeeekpbt24t9O9t3LixLMvS//73P9/PFy9eLMuyVLNmzaD316xZoxYtWujcc89VuXLldMopp6hOnTpq2bKl9u7dW+jzH09RAo5ffvlFjRo1UtWqVVWmTBnVrFlTL7/8slJSUvIdW6VKFV144YXau3evWrZsqbPOOkvly5dX/fr1NXLkSElSenq6XnnlFVWvXl1lypRRrVq1NGjQIN/zWpal3r17a+zYsbr22mt18sknq3Llyrr99tu1ePFi33ozMjL07rvvql69eqpYsaIqVKig+vXr65NPPsl37Pz582VZllq1aqVFixapSZMmOvXUU2VZlubPny9Jmjp1qp5++mnVrl1bVapUUdmyZXX++eerffv2Sk5ODlrvwgsvLPDWn3379kmS7rzzzqB/Lug3H71ulSpVlJqaqg4dOujcc89VYmKiWrVq5R0TCAT06aef6qqrrlLlypVVrlw51alTRz169FBWVpbv3woAEN0IOAAgRm3fvl2JiYmqVauWpMMD6A033JDv2EmTJsmyLP3nP//xXeuJJ56QZVkaPny4997evXu94adevXp67rnn9Mwzz+jcc8+VZVnq3Llz0Bp5gUPjxo2VmJioG2+8UW3atNEjjzyi7du3S5JuvPFGVa9eXffff7/atm2rZ599VhdddJE35GdnZwetuW3bNp1zzjmyLEsNGzZU+/bt9d///lfly5dXkyZNfAOOdevWybZtWZala6+9Vq1bt9bjjz+uM888U3Fxcfrss88K9ffNCx8uvvhi1ahRQ3Xr1tXzzz+vxx9/XJUrV5ZlWfrqq6+CvhMIBPSf//xHlmXJtm21atVKrVq18n7Dww8/7HuOIwOOQCCgyy+/XJZl6corr1Tr1q3Vpk0b3XfffTrjjDPUr1+/oDU+/vhjxcfHq2LFit7f9c4771R8fLz++te/avPmzYX6vf/73/9kWZZuvvlm389btWoly7L09ttve+9t3rxZVatWVWJiou688061a9dOzz//vG6//XZVqFBBy5cvL9S5C6OwAUfr1q1lWZbOOOMMNW/eXG3atFHDhg1lWZbq16+vtLS0oOOrVKmimjVrqm7duqpdu7aef/55PfrooypXrpwSExM1ffp0NWrUSNWqVdNTTz2lli1besHdiBEjgtbKG/Zvu+02JSQkqEmTJurQoYPuvPNOxcXFqVKlSpo7d27Qd1JTU3XVVVfJsizVqVNHTz/9tJ5//nn9/e9/l2VZevbZZ4OOzws4brjhBlWoUEFXX321/u///k8tWrTw9lBp1qyZ/vrXv6pZs2Z66aWX9MILL3j/TtWvXz8oTOzXr58XbjVr1izo1p+8v1VxA45KlSrpuuuu09lnn63HHntMbdu21UcffSQpNwjMC2irV6+uJ554Qq1bt1b9+vVlWZb+/e9/5wsEAQDRj4ADAGLUm2++Kcuy1L17d++9evXqKS4uTqtXr853fI0aNVSuXLl8Q0paWpqqVKmis846KyhgePDBB2VZlnr16hV0/KFDh9SoUSPFxcVp0aJF3vt5AYdlWb7/5VmS1q5d6zu0tG/f3vfqgUceeUSWZaljx45B78+dO1eJiYm+AcdVV12luLg4/fDDD0Hv7927V3Xq1FGFChW0c+dO3/qOlBc+WJalJ598Muhvs2jRIsXHx6tu3bpB3xk8eLA3RB55tUBycrIuvvhiWZal77//Pt85jgw45s2bJ8uydO+99+arKTs7O+iqiGXLlnkh19FXa4wcOVLx8fG+6/jJzMzUGWecofj4eG3cuDHos/T0dJ1yyilKTEzUjh07vPffffddWZalvn375lsvOTk5X5hwIgoTcOQN2zfddFO+KxXybsPo0qVL0PtVqlSRZVm6//77g64a+O2332RZlqpWraqGDRsG/f+5YMECxcXFqWHDhr7ntyxLX375ZdBnn3/+uSzL0iWXXBL0fl5w1LFjR+Xk5HjvZ2Zm6t5775VlWZowYYL3fl7AYVmW3nrrLd+/w7p164LWyvPOO+/Isiz179/f929T0C0qxQ04LMvSFVdcof379+f7Xt45H3nkkaDb6gKBgF588UVZlqXPP//ctx4AQPQi4ACAGBQIBFSjRg3Fx8cH/Rf6Dz74QJZlqV27dvm+89prr/kON99++22+DSZ37Nih+Ph4XXHFFb7nnzNnjizLUocOHbz38gKO+vXrF/n37NixQ5Zl6YknnvDeS0tLU9myZVW1alXfWwuaN2+eL+DIq6ugTTDzrlIYMGDAcWvKCx9OPvnkfMOyJF155ZWKi4vToUOHvPfyrhQYO3ZsvuPz9ku56aab8p3DL+A4+moPP88995zvlQR5br/9diUkJPj+/fzkBU1HX53zzTffyLIsNW3aNOj9vIDj008/LdT6J6IwAUfe3z/vlqijVa9ePd8tNlWqVFF8fLxv6JV3pcbRV11I0kUXXaQ//elPQe/lDftHhxhHfseyLC1YsEBS7r/j5cuXV82aNX2Dvw0bNuTri7yAo0aNGvmueDqe9PR0JSQk6K677gp6P5QBx5HhzJGqVaumk08+2TcES09PV9myZYN6BQAQGwg4ACAGjRkzxrsd5Eh79uxRmTJlfDeL3LBhg+Li4tSgQYOg92+++WZZlqWlS5d67/3++++yLEuXX355vidWdO7c2RuEmzRp4n0nL+B45plnCqw7OTlZXbt2Vb169VSpUiXv6S95r1tvvdU7Nm/Qv/76633Xynuix5EBR17A07hxY9+6W7ZsKcuy9OKLLx7jr5srL3yoV6+e7+fNmjWTZVlBV05UrlxZJ510ku/+Aenp6YqLi9Npp52W7xxHBhxZWVmqW7euLMvS1VdfrR49emjatGm+m3/Wq1dPlmXJcRzf35u3KWjeQH08a9euVVxcnP72t78FXQFw/fXXy7IsjRo1Kt/xFStWVGJiou655x59/PHHWrp0aUhuLShMwFGuXDlVqlTJ92/RuXNn7/aqI///qVKliqpVq+a7Xu3atZWQkOD7/+dtt90my7KCwqO8Yb9169a+6+VdrZG3f8f06dNlWZbq1q1bYM3x8fG6+uqrvTXyAo6CbjeTcv9de+edd3T55ZerSpUq+frssssuCzo+lAHHkQFgnm3btsmyLP3tb38r8HefcsopOvvsswv8jQCA6ETAAQAxKG+fh2+//TbfZ3n3tf/444/5PssbVPPu1d+6datOOumkfFdd5F1Of7xXo0aNvO/kBRyvv/66b80ZGRneQF63bl098cQT6tixozp37qxXX30136A/fvz4Y16NkRfCHBlwdOnSpVB1P/7448f46+YqaAPQPHm38ORdLRAIBGRZls4888wC1zz11FOVkJBw3HPs3r1bL7zwgv761796NVeuXFkvvPBC0EBdrVq1Qv3eKVOmHPf35rnxxhtlWZaGDRsmKXcT0bi4OJ177rm+wcWSJUvUtGlTb18Sy7J0zjnn6IMPPij0OQvjeAFHSkpKof4WlmUF3TKRt8mon7yNMv34Df15w35Bt47k3VbWp08fSZLruoWq96KLLvLWyAs4XnjhBd9zBAIB3XDDDbIsS+eff75atGihDh06eMFB2bJl8/3eUAUclStX9l1vyZIlhfrdR18hAwCIfgQcABBjdu7cqTJlyhx3OPC7vDsvuHj55ZclST169JBlWfmG0byh5cjbVo7nWE81kQ7fCuM3oCYlJeUb9OfOnVvkKzjyBrUPP/yw0HUXpKgBh5R7BUdCQoLvrQMZGRmKi4vTqaeeWuhzSNKqVav08ccfe+FQ8+bNvc/y/it5ampqcX6ir++//16WZXm3MeRdrXPkXi9+srKyNGfOHHXv3l1nnXWWLKtk91A4XsARCASUmJio6tWrF2ndUAQchb2CY/LkybIsS48++mih6z3yKSp+8vrwrrvuyrcPR2pqquLi4ooccNx1112yLEu7du3K99mgQYMKDDgK+ttt2rTpmL0NAIhdBBwAEGN69uwpy8q9daJFixa+r9NPP11xcXFat25d0HdTUlJ08skn65xzzlEgEFCdOnVUpkwZ7d69O+i4rVu3Ki4ursA9OPwcL+Do2rVr0JUBR/ryyy/zDfrF2YMj75L/gq76KIriBBzXXXedLMt/34GRI0fmC54KE3DkSUlJUfny5YP+q/ZTTz0lyyp4D47iyMjI0Omnn67ExERt3rxZZ555phISErRt27ZCrzFu3DhZVvAtTCeqMLeo5G0wm5SUVOh1QxFwFHYPjpSUFJUtW1a1atUq9G09xws4+vXrJ8uyNHjw4HyfDR8+XJZl5fu977//viyr4EcEP/bYY7Isy/cRxc8++2yRAw5JOvvss73HyAIAkIeAAwBiTK1atWRZlmbOnFngMa+88oosK//TR6TDwUBeUHL33Xf7rnH//fd7/+Xe74qE1atXa8OGDd4/Hy/gyAsxjt4Adc2aNTr77LN9B/2HHnrI93fMmzevwKeoNGjQQPHx8QVePbBgwQLf/xJ9tOIEHF988YUsK/fJEUfuPZCSkuJdgfHdd98d8xxr167V+vXr851v06ZNSkhI0F/+8hfvvSVLlighIUHnn3++75NzMjIyNHny5OP+1qO1adNGlmXpmmuuCbqa42izZ8/WgQMH8r2fd7XOAw88UORzF6QwAcdPP/0ky8q9dcpv09ADBw5o1qxZQe+FIuCwrIKfonLxxRcHvf/88897V0sd+TSRPBs3btSqVau8fz5ewJEXYjz22GNB72/evFkXXHCBb8Dx9ddfy7Isvfvuu75r9u/fX5Zl6emnnw56f8aMGSpbtmyxAo5evXrJsiw9+OCDvpv47ty5UwsXLizw+wCA6ETAAQAxJG9fiqMfT3q09evXKy4uTmeddVa+DRLz1sgLCH799VffNfbv369LL71UlmWpVq1aeuyxx+Q4jh555BHVr19flhW8z8fxAo6DBw+qevXqsqzcTUDbtWunZs2aqWLFit6GnUeHCVu3bvXCj4YNG6pDhw5q3ry5ypcvryZNmsiyLHXr1i3oOxs3btR5553n7V3w5JNPql27dnrggQf0j3/8Q5Zlafbs2cf8+0nFCzgCgYC3B0r16tXVunVrvfjii7Jt23fg9zvHjz/+qLi4OF1++eVq3ry5OnTooBYtWui0006TZVl67733gtb4/PPPlZiYqMTERN1xxx166aWX9Nxzz+mOO+5Q1apVVbt27eP+1qOtWrUq6Han4cOH+x737LPPqly5crrpppvUsmVLtW/fXvfee6/Kli2rcuXKHTOEK6rCBByS1KFDB1lW7p4l//nPf9SuXTs99dRTaty4scqVK6dmzZoFHR+KgOO2225TQkKCmjRpog4dOqhJkyaKi4vTySefnO+JLIcOHfL2zKhWrZr++9//qn379mrevLkaNGiguLg49evXzzv+eAFHRkaGd+vSddddp7Zt2+rBBx/Un/70J91yyy2qVKlSvt+7adMmJSYm6pRTTlGrVq3UtWtXde3aVenp6ZJyg6G8PmzUqJHatGmju+++W4mJiWratGmxAo6cnByvh/785z/rwQcflOM4evzxx9WwYUMlJCTIcZwCvw8AiE4EHAAQQx544AHfIdfPTTfdJMuy9PPPPwe9HwgEvKDh9NNP9306R5709HS99957uuKKK1S5cmWVLVtW55xzjm688Ub16dNHe/bs8Y49XsAh5YYP999/v8466yyVK1dO//jHP9SzZ0+lp6cXGCZs2rRJDz/8sE499VSVK1dOF110kQYPHuxdJeC3meWBAwfUtWtXXXzxxapYsaLKly+v6tWr67bbbtPHH39cqMviixNwSFJ2drY++OADXXLJJSpfvrzKly+vevXq6aOPPsq3J4LfOZKSktS+fXs1aNBAZ5xxhsqUKaOzzz5bt956a4G3oixYsECPPPKIzjnnHJUpU8YLNlq2bKnx48cf97f6yXvkqm3b+erOM23aND311FOqW7euqlatqnLlyqlGjRp69NFHg57KUxIKG3BIuU8ZatKkic444wwlJibq9NNP1yWXXKJ27drluyogFAFH7969NXbsWF177bWqWLGiKlWqpNtvv12LFi3yXSs7O1sDBw7UtddeqypVqnj/n1977bXq0aNH0O1Bxws4JGn79u169NFHdfbZZ3u3wHTp0kUZGRkF/t6ffvpJ9erVU/ny5b1g68jftnr1ajVp0kSVK1dW+fLl1aBBAw0fPvyYm4weK+DI8+OPP+pf//qXTj31VCUmJuqss87SFVdcoS5dumjt2rXH/T4AILoQcAAAYlK7du1kWZbGjBkT7lIASQU/UQQAABQOAQcAIKpt2bIl33sLFixQxYoVddppp3mX0QPhRsABAMCJIeAAAES1008/Xddee62eeeYZtWnTRnfccYcSEhIUHx8ftGEnEG4EHAAAnBgCDgBAVHv11Vd14YUX6k9/+pMSEhJ02mmn6fbbb9fEiRPDXRoQhIADAIATQ8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABAAAAAACMR8ABX/v27dOQIUM0d+5cLVmyhBcvXrx48eLFixcvXrxi6jV37lwNGTJE+/btC/d4hkIi4ICvIUOGyLIsXrx48eLFixcvXrx48Yrp15AhQ8I9nqGQCDjga+7cuV4zhzs55cWLFy9evHjx4sWLF6/SfuX9R9+5c+eGezxDIRFwwNeSJUtkWZaWLFkS7lIAAAAAoNQxE5mHgAO+aGYAAAAAsYyZyDwEHPBFMwMAAACIZcxE5iHggC+aGQAAAEAsYyYyDwEHfNHMAAAAAGIZM5F5CDjgi2YGAAAAEMuYicxDwAFfNDMAAACAWMZMZB4CDviimQEAAADEMmYi8xBwwBfNDAAAACCWMROZh4ADvmhmAAAAALGMmcg8BBzwRTMDAAAAiGXMROYh4IAvmhkAAABALGMmMg8BB3zRzAAAAABiGTOReQg44ItmBgAAABDLmInMQ8ABXzQzAAAAgFjGTGQeAg74opkBAAAAxDJmIvMQcMAXzQwAAAAgljETmYeAA75oZgAAAACxjJnIPAQc8EUzAwAAAIhlzETmIeCAL5oZAAAAQCxjJjIPAQd80cwAAAAAYhkzkXkIOOCLZgYAAAAQy5iJzEPAAV/R3MxT1+xSt6HLtCs5PdylAAAAAIhQ0TwTRSsCDviK5ma+rNto2Y6rd0auCHcpAAAAACJUNM9E0YqAA76itZn3p2bKdlzZjqvW380PdzkAAAAAIlS0zkTRjIADvqK1mRdv3u8FHM0/mxnucgAAAABEqGidiaIZAQd8RWszD1u01Qs47uw7JdzlAAAAAIhQ0ToTRTMCDviK1mbuP2GNF3A07Dk+3OUAAAAAiFDROhNFMwIO+IrWZn75l0VewHHhayPDXQ4AAACACBWtM1E0I+CAr2ht5oc/nekFHNXau8rJCYS7JAAAAAARKFpnomhGwAFf0drM1/cc7wUctuNqX2pGuEsCAAAAEIGidSaKZgQc8BWNzZydE1DNjsOCAo51u1LCXRYAAACACBSNM1G0I+CAr2hs5i37DgWFG7bjat7GveEuCwAAAEAEisaZKNoRcMBXNDbzjLW78wUc45bvCHdZAAAAACJQNM5E0Y6AA76isZl/mJ2UL+D4ae6mcJcFAAAAIAJF40wU7Qg4EKRz586yLMt7RVMz9xq1Ml/A8enkdeEuCwAAAEAEIuAwDwEHfEVjM7/43XzZjqtL3xitau1zA45eI1eEuywAAAAAESgaZ6JoR8ABX9HYzPd8NFW246ppv2n6Z5eRsh1Xrw5ZHO6yAAAAAESgaJyJoh0BB3xFYzNf+sZo2Y6r//t+ga7rMU624+q5b+aFuywAAAAAESgaZ6JoR8ABX9HWzGmZ2d6+G31Gr9IdfafIdlw99MmMcJcGAAAAIAJF20wUCwg44Cvamnn1joNBT07572czZTuubn9/crhLAwAAABCBom0migUEHPAVbc08bvkOL+CYvX6Pt+HoVW+NDXdpAAAAACJQtM1EsYCAA76irZk/n7reCzi2H0hT51+XyHZc1e40ItylAQAAAIhA0TYTxQICDviKtmbu+vtS2Y6rWi8PU05OQH1Gr/ICj8zsnHCXBwAAACDCRNtMFAsIOOAr2pr5iS9my3Zc3fDOeEnSF9MOX9Gx82B6eIsDAAAAEHGibSaKBQQc8BVtzXxzn0myHVfNP5spSRoyf7MXcKzafjDM1QEAAACINNE2E8UCAg74iqZmDgQCqt1phGzH1atDFkuSJq7c6QUcs9bvCXOFAAAAACJNNM1EsYKAA76iqZn3pmR4YcbASWslSYs27ffeG7lkW5grBAAAABBpomkmihUEHPAVTc28IGmfF2YMX5wbZiTtSfXe+352UpgrBAAAABBpomkmihUEHPAVTc38+8ItXpixdMsBSdLBtEzvvQET14S5QgAAAACRJppmolhBwAFf0dTMH45f7YUZB9MyJeXuy1Gjw1DZjqu3hi8Pc4UAAAAAIk00zUSxgoADvqKpmdv/tEi24+qi10YGvV+v6yjZjqv2Py0KU2UAAAAAIlU0zUSxgoADvqKpmR8cOEO24+rfH0wOev/GXhNkO65afjknTJUBAAAAiFTRNBPFCgIO+IqmZr7m7XGyHVfPfD036P17Ppoq23HVbMC0MFUGAAAAIFJF00wUKwg44CtamjkrO8fba+PNYcF7bbT4fLZsx1Xj3hPDVB0AAACASBUtM1EsIeCAr2hp5iMfB/v1jI1Bn7X5YYFsx9Xl3caEqToAAAAAkSpaZqJYQsABX9HSzFPX7PICjkmrdgZ99oa7VLbj6vxXhoWpOgAAAACRKlpmolhCwAFf0dLM383a6AUcG3anBH3Wd9zhx8emZWaHqUIAAAAAkShaZqJYQsABX9HSzD1HrJDtuKre3lVmdk7QZ1/N2OAFHFv3HwpThQAAAAAiUbTMRLGEgAO+oqWZn/9mnmzH1ZVvjs332dBFW72AY9nWA2GoDgAAAECkipaZKJYQcMBXtDRzkw+nFPgo2CP355i6ZlcYqgMAAAAQqaJlJoolBBzwFS3NXK/rKNmOq7Y/Lsj32dItB7yAY+iirWGoDgAAAECkipaZKJYQcMBXNDRzakaWF2C8P2ZVvs+37j9U4CNkAQAAAMS2aJiJYg0BB3xFQzOv2HbQCzCGzN+c7/O0zGzv877jVoehQgAAAACRKhpmolhDwAFf0dDMo5du9wKMORv2+h5T6+Vhsh1X3YYuK+XqAAAAAESyaJiJYg0BB3xFQzN/OnmdF3DsPJjue8zl3cbIdiDG1voAACAASURBVFy1+SH/Hh0AAAAAYlc0zESxhoADvqKhmbv8tkS24+qCV4YrEAj4HtO490TZjqsWn88u5eoAAAAARLJomIliDQEHfEVDM7f4fJZsx9VN704o8JhmA6bJdlzd229qKVYGAAAAINJFw0wUawg44Csamvlf7+ZenfHYoFkFHtPyyzmyHVc39io4BAEAAAAQe6JhJoo1BBzwZXozBwIBXfDKcNmOq86/Fvwb2v+0ULbjql7XUaVYHQAAAIBIZ/pMFIsIOODL9GbelZzubTD6yeR1BR731vDlsh1XNToMLXCfDgAAAACxx/SZKBYRcMCX6c08d+NeL+AYtXR7gccNmLjGO+5gWmYpVggAAAAgkpk+E8UiAg74Mr2Zh8zf7AUXy7cdKPC472cleccl7UktxQoBAAAARDLTZ6JYRMABX6Y38wdjV3nBRUp6VoHHjVyyzTtu0ab9pVghAAAAgEhm+kwUiwg44Mv0Zm73Y+7moZe8fuzNQ2et3+MFHBNX7iyl6gAAAABEOtNnolhEwAFfpjfzfQOmy3Zc3dl3yjGPW7X9oBdw/LpgSylVBwAAACDSmT4TxSICDvgyvZmvfHOsbMfVc9/MO+ZxOw8eftrKF9PWl05xAAAAACKe6TNRLCLggC+TmzkzO0fV2+eGFj1GLD/msRlZOV7A0Wf0qlKqEAAAAECkM3kmilUEHPBlcjNv2J3ihRbfztx43ONrdxoh23HV5TfzfisAAACA0DB5JopVBBzwZXIzT161yws4pq7eddzjr3or93aWF7+bXwrVAQAAADCByTNRrCLggC+Tm/nrGRu9gCNpT+pxj7/t/UmyHVf//WxmKVQHAAAAwAQmz0SxioADvkxu5reGL5ftuDq3w1BlZecc9/iHPplRqCeuAAAAAIgdJs9EsYqAA75MbuZnvp4r23F19dtjC3X8c9/Mk+24uq7HuBBXBgAAAMAUJs9EsYqAA75MbuY7Ppgs23H1wMDphTr+lV8Wy3ZcXfjayBBXBgAAAMAUJs9EsYqAA75MbuaLXhsp23Hl/G9hoY7vNXKFbMdVtfausnMCIa4OAAAAgAlMnoliFQEHfJnazAfTMr0NRvuOW12o73wyeZ33nb0pGSGuEAAAAIAJTJ2JYhkBB3yZ2sxLtxzwworfFmwp1Hd+mrvJ+866XSkhrhAAAACACUydiWIZAQd8mdrMI5Zs88KK+Un7CvWdcct3eN+Zu3FviCsEAAAAYAJTZ6JYRsABX6Y288BJa72wYk8hbzeZu3Gv952xy7eHuEIAAAAAJjB1JoplBBzwZWozdxqS+0SUf7w6XIFA4TYMXbcrxQs4fpq7KcQVAgAAADCBqTNRLCPggC9Tm/mRT2fKdlw17j2x0N/Zl5rhBRyfTF4XwuoAAAAAmMLUmSiWEXDAl4nNHAgEdOEfj4h94dt5hf5edk5A1drnBhy9Rq4IYYUAAAAATGHiTBTrCDgQpHPnzrIsy3uZ1MyrdyR7V2IMnra+SN/NC0Ze+WVxaIoDAAAAYBQCDvMQcMCXic38/awkL+BYuuVAkb57XY9xsh1Xz349N0TVAQAAADCJiTNRrCPggC8Tm7ntjwtkO65qdxqh7JzCbTCa586+U2Q7rh76ZEaIqgMAAABgEhNnolhHwAFfJjbzDe+ML3ZI0fyz3M1Jb3t/UggqAwAAAGAaE2eiWEfAAV+mNfPelMNPQnl31Moif//F7+bLdlxd+ebYEFQHAAAAwDSmzUQg4EABTGvmMcu2ewHHpFU7i/z9Lr8t8W5vAQAAAADTZiIQcKAApjXzW8OXy3ZcVW/v6mBaZpG//96YVV5AkpGVE4IKw2POhj0aMn+zcoq4JwkAAAAQ60ybiUDAgQKY1sxN+0+T7bi6uU/x9tD4Ytp6L+DYeTC9hKsLj32pGTr/lWGyHVfjlu8IdzkAAACAUUybiUDAgQKY1MwZWTmq9XLuIP/yL4uKtcavC7Z4Aceq7QdLuMLwmL52t/eb+k1YE+5yAAAAAKOYNBMhFwEHfJnUzPOT9nmD/C/zNhdrjUmrdnprzFy3p4QrDI+vZ2z0ftNrvy0NdzkAAACAUUyaiZCLgAO+TGrmgZPWeoN80p7UYq2xaNN+b42RS7aVcIXh0fX3pd5vevbrueEuBwAAADCKSTMRchFwwJdJzfz0V3NkO64ufWO0AoHibaaZtCfVCwO+n5VUwhWGR/PPZnq/qWn/aeEuBwAAADCKSTMRchFwwJcpzRwIBHRZt9GyHVctv5xT7HUOpmV6YUD/KNmv4toe47zfdH3P8eEuBwAAADCKKTMRDiPggC9TmvnIKy8GTlpb7HUCgYBqdBgq23H11vDlJVhheKRnZat6e9f729TuNCLcJQEAAABGMWUmwmEEHPBlSjMPmb/ZG+Lnbdx7QmvV65p7JUj7nxaWUHXhs3L7Qe/vkvdKzcgKd1kAAACAMUyZiXAYAQd8mdLMr/yyWLbjqtbLw5SRlXNCa93Ya4Jsx9VTg4t/q0ukGL54a76AY/2ulHCXBQAAABjDlJkIhxFwwJcpzXxLn0m5m2j2O/FNNO/tN1W246rZAPM35Ow7bnW+gGPW+uh4/C0AAABQGkyZiXAYAQd8mdDMyelZ3j4TJbFvxuNfzJbtuGrce2IJVBde//f9gnwBh7twa7jLAgAAAIxhwkyEYAQc8GVCM09etcsb3kcv3X7C67X5ITcUuLzbmBKoLrzu7DtFtuOq0R+33diOq8+mrAt3WQAAAIAxTJiJEIyAA75MaObeo1d6w/uelIwTXq/b0GXefh4mCwQCqtt5hLdhajQ9HQYAAAAoLSbMRAhGwAFfJjTzQ5/MkO24uv6d8SWy3pH7VhzKyC6RNcNhV3J60KNzL+82Rrbj6qUfFoS7NAAAAMAYJsxECEbAAV+R3szZOQHV7pR7lULbH0tmcP96xkYvGNi6/1CJrBkOM9bu9n7H2OXb9e8PJst2XD386cxwlwYAAAAYI9JnIuRHwAFfkd7My7Ye8Ib472ZtLJE1hy06/GjVpVsOlMia4fDNzMNBzYbdKWrx+ayo2TwVAAAAKC2RPhMhPwIO+Ir0Zh48fYM3xK/ekVwia05dc3jT0qmrd5XImuHwhrtUtuOqZsdhys4JqP1Pi2Q7ri55fVS4SwMAAACMEekzEfIj4ICvSG/mF7+bL9txdeFrI5WTEyiRNY+8KmToInMfqfrooFneE1Qkqdeow5uxZmbnhLk6AAAAwAyRPhMhPwIO+Ir0Zr767bGyHVePDZpVYmtu25/mBQFfzdhQYuuWtut6jJPtuHpq8BxJ0pdHXO2ybX9amKsDAAAAzBDpMxHyI+CAr0hu5h0HDgcRfcetLrF10zKzQ7JuacrIytG5fzwW9u0/Hgs7csk273ct3LQvzBUCAAAAZojkmQj+CDjgK5Kb+cjNQKev3V2ia5//yjDZjqs33KUlum5pWb3joPe3+XHOJknS/KR93nujl24Pc4UAAACAGSJ5JoI/Ag74iuRm7vp77iaaNToM1aGM7BJd+4ruY2Q7rl76oWQePVvahi8+fLXGvI17JUmb9x3y3vt6Rsk8cQYAAACIdpE8E8EfAQd8RXIz39l3imzH1R0fTC7xtRv3nijbcdXi89klvnZp+HD8ai/M2H8oU1LubSt57/UZvSrMFQIAAABmiOSZCP4IOOArUps5LTNb53XM3WPitd9K/jaS+wZMl+24uuejqSW+dml46YcFsh1X9boGPxL2otdGynZcdfx5UZgqAwAAAMwSqTMRCkbAAV+R2swz1+3xrkZwF5b8o1xbfjlHtuPqhnfGl/japaHJh7lXtzTtNy3o/X+9m3tlyuNfmHllCgAAAFDaInUmQsEIOOArUpv5o/FrvIBj+4GSf+Rp+58W+V4BYYJAIKB/dsm9UqP9TwuDPntw4Izc23r6TglTdQAAAIBZInUmQsEIOOArUpu5xeezZDuurnxzbEjWf3v4cm8D00AgEJJzhMru5HQv/Pl44tqgz1p/Nz+kfzcAAAAg2kTqTISCEXDAVyQ2cyAQ8PaSeOHbeSE5x4CJh68QOZiWGZJzhMqRt++MWRb8ONjuw5bJdlzV7DjMuOAGAAAACIdInIlwbAQc8BWJzbxmZ7I3wH8xbX1IzvH97CTvHEl7UkNyjlD5duZGr/b1u1KCPvtk8jrvs70pGWGqEAAAADBHJM5EODYCDviKxGYetmirqrXPHdKXbNkfknOMWrrdCwIWbtoXknOESrehuVdpnNdxqLKyc4I++3XBFu93rdh2MEwVAgAAAOaIxJkIx0bAAV+R2sz7D2Vq3Iod+Qb4kjJr/eHbPCau3BmSc4TKY4Ny9ye5sdeEfJ9NX7vb+12TV+0KQ3UAAACAWSJ1JkLBCDjgK1abefWOg14QMGT+5nCXUyQNe46X7bh6cnD+R8GuPeL2np/mbgpDdQAAAIBZYnUmMhkBB3zFajPvPHj4SSSfT10f7nIKLSMrR+d2GCrbcfXW8OX5Pk9Oz/J+V78Ja8JQIQAAAGCWWJ2JTEbAAV+x2syZ2TleENBn9KoCj9ufmqnOvy7RSz8sUFpmdilW6G/1jsNXaPwwOynf54FAQBe8Mly24+q135aGoUIAAADALLE6E5mMgAO+YrmZ63QaIdtx1flX/98+bc1uNeg+xgsUvp25sZQrzG/Ekm1ePXM27PU95toe42Q7rp77JjSP2AUAAACiSSzPRKYi4ICvWG7mq94aK9tx9eJ384Pez8jKUfdhy7wnueS9Hhs0K0yVHvbR+DVePftS/R8De2+/qbIdV//pP62UqwMAAADME8szkakIOOArlpv59vcny3Zc/fezmd57q3cc1K3vTfJChPNfGabGvSfKdlzVfHmYUtKzwlix1OaHBbIdV5e8PqrAY575aq5sx9X1PceXXmEAAACAoWJ5JjIVAQd8xXIzP/TJDNmOqzv6TlEgENDgaetV6+VhXrhx2/uTtHpHskYv3e69N3zx1rDWfNeHU2Q7ru7tN7XAYzr/ukS246p2pxGlWBkAAABgplieiUxFwAFfsdzMz30zT7bj6rJuo/XooFleiFGtvas3hy1XRlaOJCktM9vbuLP19/OPs2poXfjaSNmOK+d/Cws8pu+41d5vSc0I7xUnAAAAQKSL5ZnIVAQc8BXLzfzqkMVBe2zYjqsG3cdo2prd+Y594ovZsh1XF742UlnZOWGoVtqTkuHVOWBiwY+A/WF2knfcht0ppVghAAAAYJ5YnolMRcABX7HczL1GrggKN577Zp72p2b6HvvjnE3ecdPX5g9ASsOs9Xu8GkYv3V7gcRNW7vSOm7V+TylWCAAAAJgnlmciUxFwwFcsN/O4FTtkO67qdBqhn+dtUiAQKPDYPSkZqv7HU1Ve/31pKVZ52HezNnrBxbpdBV+ZsXTLAe84d2F49wwBAAAAIl0sz0SmIuCAr1hv5lXbDxb4uNWjNe0/Tbbj6pq3xx0zDAmV7kOXyXZcnddx6DFvk9mVnO4FHJ9NWVeKFQIAAADmifWZyEQEHPBFMxfewElrveBgxbaDpX7+Fp/n7gNywzvjj3lcTk5ANToMle24env48tIpDgAAADAUM5F5CDjgi2YuvA27U7yA44Oxq0r9/Nf3HC/bcfX4F7OPe+zl3cbIdly99MOCUqgMAAAAMBczkXkIOOCLZi6am96dINtx9e8PJpfqeTOzc7yrMt4cdvyrMm5/f7Jsx9XDn84sheoAAAAAczETmYeAA75o5qLpMWK5dxXHtv1ppXbeNTuTvfN+PzvpuMc/NmiWbMdV494TS6E6AAAAwFzMROYh4IAvmrlo5ift84KGwdM3lNp5Ry7Z5p13zobjP/q1/U8LZTuu6nUdVQrVAQAAAOZiJjIPAQd80cxFk5MT0GXdRpf67R/9JqzxAo69Kcd/6kuvUStlO66qtXeP+cQVAAAAINYxE5mHgAO+aOai6/jzIu9xrQfTMkvlnG1/XCDbcXXx64W7ImPw9A1huZUGAAAAMA0zkXkIOOCLZi668St2eOHB7wu3lMo57/5oqmzH1T0fTS3U8SOOuKVl4aZ9Ia4OAAAAMBczkXkIOOCLZi669Kxs1e40Qrbj6oVv55XKOS96baRsx1W7HxcW6vh5G/d6AceYZdtDXB0AAABgLmYi8xBwwBfNXDzPfDVXtuOqTucRygzxHhd7UjK8sKL/hDWF+s7mfYe873wzc2NI6wMAAABMxkxkHgIO+KKZi+eXeZu9AGHyql0hPdfs9Xu8c41aWrirMdKzsr3v9Bm9KqT1AQAAACZjJjIPAQd80czFsz81U+d2GCrbcdVpyOKQnuv7WUleWLFmZ3Khv3fhH7e1dPx5UQirAwAAAMzGTGQeAg74opmL7/6Pp8t2XDXoPkaBQCBk5+k+bJlsx1WNDkOLdDvMTe9OkO24euKL2SGrDQAAADAdM5F5CDjgi2YuvkFT1nlXVizevD9k53n8i9myHVfXvzO+SN97cOAM2Y6rO/tOCU1hAAAAQBRgJjIPAQd80czFt2lvqhdwvDtqZcjOc/0742U7rlp8XrQrMVp/N1+24+rKN8eGqDIAAADAfMxE5iHggC+a+cTc0meSbMfVLX0mhWT9zOwc1fhjr4/uw5YV6bvdh+be2lKz47CQ3kIDAAAAmIyZyDwEHPBFM5+Yd0et9K7i2LQ3tcTXX7sz2Vv/+1lJRfruwElrve/uTcko8doAAACAaMBMZB4CDviimU/M4s37vRBh0JR1Jb7+qKXbvfVnr99TpO/+umCL992V2w+WeG0AAABANGAmMg8BB3zRzCcmEAjoyjfHynZcPTBweomv33/CmmJfhTF97W7vu5NX7Srx2gAAAIBowExkHgIO+KKZT1ynIYtlO67O7TBU+1MzS3Ttdj8ulO24uui1kUX+7pojbm/5ae6mEq0LAAAAiBbMROYh4IAvmvnETV61ywsSfpm3uUTXvuejqbIdV3d/NLXI3z2YlunV1W/CmhKtCwAAAIgWzETmIeCAL5r5xGVm56hO5xGyHVfPfDW3RNe++PVRsh1XbX5YUOTvBgIBXfDKcNmOq9d/X1qidQEAAADRgpnIPAQc8EUzl4wXvp0n23H1j1eHKz0ru0TWnLByp3cFxoCJxbsC49oe42Q7rp77Zl6J1AQAAABEG2Yi8xBwwBfNXDJ+X3j4iSXjV+w44fXSMrO9cKJ2pxHafiCtWOvk3eLyn/7TTrgmAAAAIBoxE5mHgAO+aOaScTAtU+d1HCrbcdXx50UnvF6vkSu8wOSzE3j87NNfzZHtuLq+5/gTrgkAAACIRsxE5iHggC+aueQ8/OlM2Y6ry7qNVk5OoNjrrN6R7IUlt70/SVnZOcVeq/OvS2Q7rup0GlHsNQAAAIBoxkxkHgIO+KKZS87g6Ru8qy5GL91erDUCgYDuGzBdtuOqWntXC5L2nVBNfcet9mo6lFEye4MAAAAA0YSZyDwEHPBFM5ec3cnpqtMp92kqDbqPUXJ6VpHX+HneJi+QeHXI4hOu6fvZSd56G3annPB6AAAAQLRhJjIPAQd80cwl66sZG4odUOxPzdQlfzwWtv4bo3UgLfOE6xm/YodXz6z1e054PQAAACDaMBOZh4ADvmjmkpWTE1DT/tO8W0xmFyFU6PDzIi+M+HXBlhKpZ+mWA96aQxdtLZE1AQAAgGjCTGQeAg74oplL3tqdyar58jDZjqsbe01Qetbx976Ys2GvF0Q89MkMBQLF36T0SLuS0711B53A01gAAACAaMVMZB4CDviimUPjw/GHN/fsNXLFMY/Nys5R494TZTuuar48TOt2ldxeGTk5AZ3bIfeJLG8PX15i6wIAAADRgpnIPAQc8EUzh0Zmdo5u6TNJtuOqRoehWr7tQIHHDpy01gtD+oxeVeK1XNZttGzH1Us/LCjxtQEAAADTMROZh4ADvmjm0Fm0ab+qt88NLu7oO0XZOflvO9my75D+/upw2Y6r63uOL9TtLEV1+/uTZTuuHvl0ZomvDQAAAJiOmcg8BBzwRTOHVvehy7yrMwZOWpvv8ycHz/Y+n7J6V0hqeGzQLNmOq5v7TArJ+gAAAIDJmInMQ8ABXzRzaB3KyNa1PcbJdlxd8MpwJe1J9T4bvXS7F260+nZeyGpw/rdQtuOqXtdRITsHAAAAYCpmIvMQcMAXzRx6U9fs8oKMBwfmPiElNSNLV745Vrbjqk7nEdp5MD1k5+81coX32Nqs7JyQnQcAAAAwETOReQg4oszOnTt16623qkKFCqpVq5bGjBlTrHVo5tKRdxWF7bj6YXaS3hy23PvnL6dvCOm5B0/f4J1r+4G0kJ4LAAAAMA0zkXkIOKJM06ZN9dhjjyk1NVW//vqrTjnlFO3Zs6fI69DMpWP/oUxd+sZo74qNGn88uvXOvlOU47P5aEkasWSbF3As2rQ/pOcCAAAATMNMZB4CjiiSnJysxMREbdq0yXvvuuuu02effVbktWjm0jN88eGgwXZcVW/vasmW0AcOczfu9c45Ztn2kJ8PAAAAMAkzkXkIOMIoOTlZnTp1UuPGjVW1alVZlqVBgwb5Hpuenq527drprLPOUrly5XTZZZdp1KjgzSHnzZunqlWrBr333HPP6aWXXipybTRz6Wr55RwvbHj996Wlcs5Ne1O9c34zc2OpnBMAAAAwBTOReQg4wmj9+vWyLEvnnHOOGjZseMyA47777lNCQoLatGmjAQMGqEGDBkpISNDkyZO9YyZNmiTbtoO+17FjRz311FNFro1mLl07D6brrg+n6MGBM5ScnlUq50zPyvYCjj6jV5XKOQEAAABTMBOZh4AjjNLT07Vt2zZJ0uzZswsMOGbOnCnLstSzZ0/vvbS0NNWoUUMNGjTw3uMKDhTVha+NlO24evmXReEuBQAAAIgozETmIeCIEMcKONq2bauTTjpJBw4cCHq/e/fusixLSUlJkg7vwbF582bvmIYNG7IHBwrUqNcE2Y6rJ76YHe5SAAAAgIjCTGQeAo4IcayAo1GjRvr73/+e7/0xY8bIsiz99ttv3nv33nuvWrRooUOHDun333/nKSo4pgcGTvee2gIAAADgMGYi8xBwRIhjBRy1a9fWDTfckO/9pUuXyrIs9e/f33tv586duuWWW1S+fHnVrFlTo0ePPu65d+zYoSVLlgS9hgwZQjPHgBe/my/bcXXlm2PDXQoAAAAQUQg4zEPAESGOFXCce+65uuWWW/K9v3btWlmWpd69e5/QuTt37izLsnxfNHN06z50mWzHVc2OwxQIBMJdDgAAABAxCDjMQ8ARIUrqCo7i4AqO2DVw0lrvSSr7UjPCXQ4AAAAQMQg4zEPAESFKag+OkkIzx4Yh8zd7AcfK7QfDXQ4AAAAQMZiJzEPAESGOFXC0adPG9ykq3bp1C3qKSkmimWPDtDW7vYBj8qpd4S4HAAAAiBjMROYh4IgQxwo4ZsyYIcuy1LNnT++99PR0nXfeebr88stDUg/NHBvW7Ez2Ao6f520KdzkAAABAxGAmMg8BR5h98MEH6tq1q55++mlZlqW7775bXbt2VdeuXbV//37vuKZNmyohIUFt27bVgAEDdOWVVyohIUETJ04MSV00c2w4mJbpBRz9J6wJdzkAAABAxGAmMg8BR5jZtl3gE0zWr1/vHZeWlqY2bdrozDPPVNmyZXXppZdqxIgRIauLZo4NgUBA578yTLbj6vXfl4a7HAAAACBiMBOZh4ADvmjm2HHN2+NkO66e+2ZeuEsBAAAAIgYzkXkIOOCLZo4d93w0VbbjqtmAaeEuBQAAAIgYzETmIeCAL5o5djz91RzZjqvr3xkf7lIAAACAiMFMZB4CDviimWNHpyGLZTuu6nQK3Z4uAAAAgGmYicxDwAFfNHPs6DtutfcklUMZ2eEuBwAAAIgIzETmIeCAL5o5dnw/O8kLODbuTg13OQAAAEBEYCYyDwEHfNHMsWP8ih1ewDF7/Z5wlwMAAABEBGYi8xBwwBfNHDuWbNnvBRxDF20t8fVzcgIlviYAAAAQasxE5iHgQJDOnTvLsizvRTNHv50H072AY9CUdSW69qrtB1Wv62jd0XeK0rPY3wMAAADmIOAwDwEHfNHMsSMnJ6BzOwyV7bh6e/jyEl37oU9meOHJuOU7SnRtAAAAIJSYicxDwAFfNHNsuazbaNmOqzY/LCixNSes3OmFG7bj6uVfFpXY2gAAAECoMROZh4ADvmjm2HLb+5NkO64e+XRmiayXnRNQ494TgwKOBt3HKBBgPw4AAACYgZnIPAQc8EUzx5ZHB82S7bi6uc+kElnvhyMePXt9z/He/1629UCJrA8AAACEGjOReQg44Itmji3O/xbKdlxd/PqoE77KIi0zW5d3GyPbcXVZt9Fase2gF3D0Hbe6ROrdtDdV38zcqEMZbFwKAACA0GAmMg8BB3zRzLGl34Q1XgjxzcyNJ7RW33GrvbW+n5UkSbqx1wTZjqu7PpxywrUGAgHd+l7uLTXPfDX3hNcDAAAA/DATmYeAA75o5tiyPzXTu+ri768O18bdqcVaZ3dyump3GiHbcfWvdycqOyf3apDuQ5fJdlxVa+9qd3L6CdW6cvvBoL09Fm7ad0LrAQAAAH6YicxDwAFfNHPsmbTq8FNP7u031QsniqLzr0sOPxZ2xeHHws5Yu9t7/39zNp1Qnb1HrwwKOB4uoY1RAQAAgCMxE5mHgAO+aObY9Movi73gYMDENUX67vpdKarRYahsx9X9H08P2ssjKztHdTuPKJHbSv71bvDTWWzH1fS1u09oTQAAAOBozETmIeCAL5o5NqVmZOm6HuNkO65qdhymFdsOFvq7z3w11wscFm/en+/z57+ZJ9txVafTCGVk5RSrvtU7kr1zdBqyWOe/Mky24+ruj6byCFoAAACUKGYi8xBwwBfNHLvmbNir6u1zQ4Rb+kwqVBgxd+NeL3ho9e0832OGzN/sHTN19a5i1fb+mFXenV2bnAAAIABJREFUGmt3Juut4cu9fx67fHux1gQAAAD8MBOZh4ADvmjm2Pb2EcHBOyNXHPPYQCCge/tN9a762LTXf4PSfakZXnDy+u9Li1XXzX1yn57SuPdEb806f9z6cnOfScopxr4hAAAAgB9mIvMQcMAXzRzbMrJyvDChentXczfuLfDYEUu2eWFIt6HLjrlu037TZDuuGvYcX+Sa1u1K8c7TZ/Qq7/0Pxh6+quPXBVuKvC4AAADgh5nIPAQc8EUzY9nWA6rZMXePi+t7jtehjOx8x2Rm5+j6nuNlO67+2WWk9qdmHnPNfhPWBN1iUhQfjl/tfXfV9sN7g6SkZ6le11GyHVfX9RinzOzi7e8BAAAAHImZyDwxHXAkJyerZ8+euvXWW1W/fn3NmjVLkrRnzx699957Wrt2bZgrDB+aGZL00fjDgUTnX/P/uzB4+gbv84GTjt8vq7YfLNLxR7r9/cmyHVc39pqQ77PPpqzz1v1m5sYirQsAAAD4YSYyT8wGHFu2bNF5552nhIQE1apVS/Hx8Ro7dqz3+XnnnadWrVqFscLw6Ny5syzL8l40c2zLzgno7o+meuHB5FWHNwdNPuLKiaveGqv0rPxXeBwtEAjo6rfHynZc3TdgeqHrSNqT6tXQy2dPkPSsbDXoPka24+rybmOUlnn8WgAAAIBjIeAwT8wGHA888IBOPfVULVq0SLt27VJcXFxQwNG2bVv94x//CGOF4UUzI8+G3Sn6+6vDZTuurug+RvsP5d6G0mvkCi90GDJ/c6HX6/zrEtmOqxodhnprHc+AiYevJFm29YDvMd/PSir21SEAAADA0ZiJzBOzAccpp5yi119/XZK0e/fufAFHv379VKlSpXCVF3Y0M4705RG3orT+fr62H0jTBa/khh63vz+5SE8vmbhyp7fW7wsLtynonX2neHuBBAL+58rKztH17+TuB3Lx66OUnJ5V6JoAAACAozETmSdmA47y5curf//+kvwDjp49exJw0Mz4QyAQ0MOfzvSCiVvfm+T976lrdh1/gSOkZ2V7V4S0/m7+cY/fvO+Qd64eI5Yf81h34VbfJ60AAAAARcVMZJ6YDTjq1aunhx56SJJ/wHHNNdfommuuCVd5YUcz42jb9qfpn11GegGC7bh6dNCsYq315ODZ3pUW2ce5+uOTyYc3EF28ef8xj83JCXjhS+1OI7Q3JaNY9QEAAADMROaJ2YDj888/V3x8vN555x2tX7/eCzjWr1+v5s2bKz4+Xj/99FO4ywwbmhl+hszf7IUN1du7WnnE41qL4rtZG7115mzYe8xj7/ljk9Nr3h5X4O0pRxq/Yoe3drehy4pVHwAAAMBMZJ6YDTgkqUuXLjrppJOUkJCguLg4JSYmKj4+XieddJLeeOONcJcXVjQz/AQCAb30wwLZjquuvy8t9jo7DqQV6raTbfsPH9d9WOHCikAgoKb9psl2XNV6eZi27U8rdp0AAACIXcxE5onpgEOS1q5dqx49eujJJ5/U448/rjfffFOrVnHvPs2MggQCAW3am1qoqymO5d8fTJbtuGrce2KBxwyacvj2lAVJ+wq99sx1e7zvdfx50QnVCQAAgNjETGSemA844I9mRqj1Hr3SCyE27zvke0zT/rlXYlz55tgiByr//Wym9zjaDbtTSqLkYjuUka2kPalhrQEAAABFw0xknpgNOFJSUrR169ag97Zt26bXXntNHTt21Ny5c8NUWWSgmRFqizbt9wKOwdM35Pt8x8E0VWvvFvt2mMWbD6/f6tt5JVFysazZmazLu42R7bgav2JH2OoAAABA0TATmSdmA44HHnhAl156qffPBw8e1DnnnKP/Z+/Oo6uqz/2Pk1ytQ9Wuq6t69Za7QUWr0lbFamsnba3Y22q1ldb6Q63Faqu1LV7rDmOYBxVFlEkGESeGItPOQAYghIRMTAlhTEhIQpgSEjInZ3h+f4R8k0N2IMM5Z5+d/X6tlXVNzh6e5N7Hn8/nt/f3GxYWJuHh4XLppZdKUlLHj873djQzAs3j8cp3J8WLphvyx8Xp7T5fuq2w0wuRduTlz7aLphvSL8KQ0atzZO7mPFmzs0TS8svkSFmtNLjcPf01zuvQiSq55+zvqOmG/LMT2+ICAAAgNDAT2Y9jA46+ffvKhAkT1Pdz5syR8PBwSU5OloqKChk0aJA89NBDFlZoLZoZwaD/e7douiEDRkVLbaPL57M/fLhNNN2Q+yYniOcCW8l2JO9ktdw4Ispna9tzv+6eECf/+94WGbYkQ0atzpYFW/Klorbn28seOF4lgybG+dzr3snxPV67BAAAAMHBTGQ/jg04Lr30Ulm8eLH6/pFHHpEf//jH6vtZs2bJ17/+dStKCwk0M4Jhw55javiPzz2ufl5W3SD9z76eMm5dz/5v8OPUAnloxma5fUzMeYOOtl/3T02U7OLKbt9z37EzcveE1nCjZUFVTTck72R1j34fAAAABAczkf04NuC47rrrZOrUqSIiUl9fL5dffrnP1rBz586Vyy+/3KryLEczIxhqGlwyYFS0aLohEatadzv5PP2ICgQyCsr9dr+q+iY5eLxKkg6clOUZRfJewkGJWJUtf1ycLoPfTZJvj9ug7jtgVLQszyzq8j1yj56RO8e3Xmf2pkOy/1iV+v4Tk/VGAAAAEHqYiezHsQHHE088IX379pV169bJX//6VwkPD5ecnBz1+WuvvSY333yzhRVai2ZGsDy7KL3d6xtDF6aJphvy3Unx3X49pTu8Xq98mJTv81rLyC+zO71WR05JpXynTbgxPylPXbfliY6XP3X2AsYAAAB2wUxkP44NOA4cOCCapklYWJiEhYXJP//5T/WZx+ORvn37yrBhwyys0Fo0M4Ll49QCFQjklFTK6ZpGFTCMWZNz4QsEQGpemc8rJo/P3irHKuvPe052caXPEyALtuT7fN6y4OndE+KCGtoAAACge5iJ7MexAYeISENDg2RlZUleXp7Pz8+cOSP//ve/JT8/v4Mzez+aGcFSVF6rQoH3Eg7K8swi9X1qXplldZVW1sljH2xVtQyaGCfb8s3r2VVUIQMjY9Wxi7cebnfMp2mtu8LsO3Ym0OUDAACgh5iJ7MfRAQc6RjMjmB5+J0k03ZDHPtgqzy1OV086uC1+0qHB5ZYRX2arYOLGEVGyYEu+z04o24+cloFjW8ONj1MLTK+Vf7JaHbMouX0AAgAAgNDCTGQ/jgk4UlJSJCUlpd33F/pyKpoZwTQtZp8a/m86+3rKiC+zL3xikCzPLFKLoWq6Ia98tl1qG12SVVgud7QJNz5N63gBUa/XK/dNThBNN+SFjzODWD0AAAC6g5nIfhwTcISFhUl4eLg0Njb6fN/RV8vnThMZGSl9+vRRXzQzgiGzoLzdVq3JB09ZXZaP7OJKuX9qoqrvZ222nu0XYcgX6UcueI1/Ltspmm7IwMhYy59OAQAAwPkRcNiPYwKOhIQESUhIaPf9hb6cimZGMLk9Xp/dR+4cv0Ga3B6ry2qnvKZR/t+CNJ8gpl+E0entZNuuL7K7uCLA1QIAAKAnmInsxzEBB7qGZkawtTzdoOmGvLFyt9XldMjt8apXavpFGLIyq7jT5xafbl1Qdd7mvAufAAAAAMswE9kPAYeI1NXVycGDB+XgwYNSV1dndTkhgWZGsBm7S9Xwv/nASavLuaADx6vk0InqLp/3w+nNr7k8uyg9AFUBAADAX5iJ7MfRAcf27dvloYcekosvvlitvXHxxRfLz3/+c9mxY4fV5VmKZkawec4+GfFewkGfXUp6mzdW7hZNN+S2MTEh+RoOAAAAmjET2Y9jA46MjAy57LLL5IorrpAXXnhBZsyYITNmzJAXXnhBrrzySrn88sslM9O5Ox3QzEBgrNlZop5UySost7ocAAAAdICZyH4cG3A89NBD0r9/fzl69Gi7z0pLS6V///7y85//3ILKQgPNDATGiTP1KuCYlXDQ6nIAAADQAWYi+3FswHHFFVfI9OnTO/x82rRpcuWVVwaxotBCMwOB89O3N4mmG/KHD7dZXQoAAAA6wExkP44NOK688kqZOnVqh59PnTqVgINmBgJi1Ops0XRDBoyKlvomt9XlAAAAwAQzkf04NuB4+OGHpW/fvlJUVNTus+LiYunbt68MHjzYgspCA80MBE5UduuOMSl5p6wuBwAAACaYiezHsQFHVlaWfPWrX5XLL79cnnnmGZk4caJMnDhRhg4dKpdffrlcccUVjt5JhWYGAqe8plEFHDM27Le6HAAAAJhgJrIfxwYcIiK7d++WX/3qV3LppZdKWFiYhIWFyaWXXiqPPvqoZGdnW12epWhmILAGv5skmm7Ib+ekWF0KAAAATDAT2Y+jA44WLpdLSkpKpKSkRFwul9XlhASaGQis8etyRdMNuWlElNQ08O8dAACAUMNMZD8EHDBFMwOBFZd7XL2msvnASavLAQAAwDmYiezH0QFHZWWlzJ8/X3RdlxdffFH+/Oc/+3y9+OKLVpdoGZoZCKzKuibpH9EccEyJ3mt1OQAAADgHM5H9ODbgiI+Pl6uuukrCwsLkiiuukG984xvtvvr27Wt1mZahmYHAe+z9ZNF0Qx59P9nqUgAAAHAOZiL7cWzAMXDgQLnxxhsdvVPK+dDMQOBNid4rmm5I/whDKuuaAn6/vJPVklVYHvD7AAAA9AbMRPbj2IDjkksukVmzZlldRsiimYHA23zgpFqHIy73eEDvdbqmUQaOjRVNNwg5AAAAOoGZyH4cG3DccccdMmXKFKvLCFk0MxB4tY0uuWlElGi6IePX5Qb0XlHZpSpM+Ti1IKD3AgAA6A2YiezHsQHHqlWr5Bvf+IYcOXLE6lJCEs0MBMdv56SIphsy+N2kgN4ncu0eFXC8E3cgoPcCAADoDZiJ7MexAcfw4cPlrrvukssuu0yeeOIJ+fvf/y7Dhw/3+XrttdesLtMyNDMQHDM27FfBQ1l1Q8Du88jMLeo+o1ZnB+w+AAAAvQUzkf04NuAICwu74Fd4eLjVZVqGZgaCIyXvlAoeorJLA3KPytom6Xd2S1pNN+Svn2YF5D4AAAC9CTOR/Tg24HC73Z36cprIyEjp06eP+qKZgcCqb3LLgFHRAX2yImHvcRVuaLohv5uXGpD7AAAA9CYEHPbj2IAD50czA8Hzhw+3iaYb8uDbmwJy/SlRe30CjodmbA7IfQAAAHoTZiL7IeCAKZoZCJ5ZCQdV+HD8TL3fr//rD7b6BBx3T4jz+z0AAAB6G2Yi+yHggCmaGQierMJyFT6s3lHi12vXNLRuRXvj2f/ZP8IQj8fr1/sAAAD0NsxE9kPAAVM0MxA8TW6P3DYmRjTdkH+t3OXXaycfbF3EtOVVGE03pLym0a/3AQAA6G2YieyHgAOmaGYguJ5dlC6absgPpyf69bptt6FdklKg/vnQiSq/3gcAAKC3YSayHwIOmKKZgeCatzlPhQ9F5bV+u+6Qeami6YYMfjdJthw8qe6Rll/mt3sAAAD0RsxE9uP4gKOpqUkyMjLEMAwpK+M/+FvQzEBw7S6uUOHD8swiv1yz7Ra0Y9bkyJ6jleoe0dmlfrkHAABAb8VMZD+ODjhmz54t11xzjYSHh0t4eLgkJjY/Gn7q1Cm57rrrZMmSJRZXaB2aGQgut8crAyNjRdMN+eeynX65Zvrh1sVL1+8+Kscq69X3n2wr9Ms9AAAAeitmIvtxbMCxZMkSCQsLkyFDhsiCBQskLCxMBRwiIk8++aQ8/PDDFlZoLZoZCL4XPs4UTTfk3snx4vX2fJeT9xNbt589caZeGl0e9f3M+IN+qBgAAKD3YiayH8cGHAMHDpTHHntMRETKysraBRzTpk2TG264waryLEczA8G3KPmwCiDyT1b3+HpDF6aJphvywFub1M9anhIZuyanx9cHAADozZiJ7MexAccll1wi8+bNExHzgOPDDz+USy65xKryLEczA8G379gZv71C4mqz9ewbK3ern//kzY2i6Ya88tn2npYLAADQqzET2Y9jA47rrrtOJk+eLCLmAcfw4cNF0zSLqrMezQwEn8fjlbsmxImmG/Lypz0LIHYVtS5a+u+sYvXzJ2ZvFU035A8fbutpuQAAAL0aM5H9ODbgeO6556Rfv35SWVnZLuDYu3evXHHFFfLKK69YXKV1aGbAGi9/ul003ZC7J8SJx9P9dTg+TMo33XZ22JJMtW0sAAAAOsZMZD+ODThKSkrkhhtukL59+8rf/vY3CQ8Pl+eff16ee+45ueyyy0TTNDl58qTVZVqGZgas8cm2QhVM7C6u6PZ1WoKM709J8Fmw9I2Vu0XTDblnUrw/ygUAAOi1mInsx7EBh4jIsWPH5LnnnpOrrrpKwsLCJCwsTK644gp55pln5NixY1aXZymaGbBGaWWd9I9oDjhGfpndrWt4PF759rgNplvOTovZJ5puyE0jovyyUwsAAEBvxUxkP44OOFp4vV4pLS2VkpIScbvdVpcTEmhmwDrPf5Qhmm7IHWNjpabB1eXz2y5W+nn6EZ/PFmxpfXWlsrbJXyUDAAD0OsxE9kPAAVM0M2CduNzjKoRYlnHkwiec4+PUAnV+3jnbza7aXuzXrWgBAAB6K2Yi+3FswDF58uTzfk2ZMkXeeecdWbFihSNfV6GZAeu43B65d3K8aLohv/5ga5fPf/mz5oVKB02Ma/cayqb9J1TAkVlQ7q+SAQAAeh1mIvtxbMARFhYm4eHhEh4ertbfaPk69+cXXXSRvPrqq456X51mBqw1Y8N+FUTkHj3T6fO8Xq8Mmtgcjvz106x2n2cXV6rrxu5xXngLAADQWcxE9uPYgKOoqEjuvPNOeeaZZyQjI0NOnz4tp0+flvT0dBk6dKjcfffdcuDAAcnMzJShQ4dKeHi4TJ482eqyg4ZmBqxVfLpW+p1dbHTMmpxOn5d/sloFGB9tPdzu85KKOvX5Z2ldf/0FAADAKZiJ7MexAccTTzwhQ4YM6fDzIUOG+Hw+ePBgGTBgQDBKCwk0M2C9Zxeli6YbMjAyVuoaO7cA8hfpR8775Ed9k1t9/n7iQX+XDAAA0GswE9mPYwOOK6+8UubOndvh53PmzJGrrrpKfT9r1iy55JJLglFaSKCZAevF5BxTYcTKrOJOnTN82U7RdEO+FRkrbo/5a3W3j4kRTTdk3Dr6GwAAoCPMRPbj2IDjmmuukT/96U8dfv7888/LNddco76fOXOmXH311cEoLSTQzID1mtwetZ7Gb+akdOqc+6cmiqYb8qePMjo85ofTm4/5+xc7/FUqAABAr8NMZD+ODTheeeUVCQ8PF13XpbCwUP28sLBQ3njjDQkPD5dXXnlF/fzxxx+XH/7wh1aUagmaGQgN02P2qac49h+rOu+xxadr1bHzNud1eNxjH2wVTTdk6MI0f5cLAADQazAT2Y9jA466ujr5zW9+o3ZN+cpXviJf+cpX1O4pjz/+uNTV1YmISH19vYwdO1ZiY2MtrjrwIiMjpU+fPuqLZgasdaSsNbSIXHv+fvxyR7E6dseR0x0e9/xHGaLphvxi5hZ/lwsAANBrEHDYj2MDjhYZGRkyYcIEGTZsmAwbNkwmTJgg6enpVpdlOZoZCB1DF6aJphvy7XEbpL6p48VGI1btFk035LYxMdLk9nR43P+t2CWabsh9kxMCUS4AAECvwExkP44POGCOZgZCh7G7VD2Z8eWOjhcbffDtTZ169WRK1F7RdEMGjIwWr9d8IVIAAACnYyayHwIOmKKZgdDR6PLI3RPiRNMNGTI31fSYk1UNKgSZlXD+7V/nbc5Tx1bVNwWiZAAAANtjJrIfRwccGzZskEceeUSuvfZaueSSS+Tiiy9u9+VUNDMQWqZE71WhxKET1e0+j8pufcojLb/svNdakVmkji0sqwlUyQAAALbGTGQ/jg04Vq9eLeHh4XL77bfLiy++KGFhYfLUU0/J7373O7nsssvkzjvvlNGjR1tdpmVoZiC0HD5Vo0KJietz230euXaPeu3kfOt0iIgk7juurrX9PIuRAgAAOBkzkf04NuC455575N577xWXyyWnTp2SsLAwSUxMFBGR/Px8ufbaa+WTTz6xuErr0MxA6Hlq/jbRdEPuHN9+sdHB7yad9xWWtnYWVaiAIz73eKDKBQAAsDVmIvtxbMBx2WWXycyZM0VEpKKiQsLCwny2gR03bpzccccdVpVnOZoZCD1rdx1VwcSanSXq5xW1jdIvovnnb8Xuv+B1ispbt55dlnEkkCUDAADYFjOR/Tg24Lj66qtlzpw56vtLL71UlixZor6fP3++XHbZZVaUFhJoZiD0NLjccuf4DaLphjw1f5v6eXxu6ysnSQdOXvA6tY0udfzsTYcCWTIAAIBtMRPZj2MDjvvvv19effVV9f19990nDz30kLjdbmlsbJQHHnhAbrnlFgsrtBbNDISmSUauCifyTzYvNjr57LavN46IkuoGV6euc+vo6A7X8wAAAAAzkR05NuCYNm2a3HDDDdLQ0CAiImvXrpXw8HC58sor5Wtf+5qEhYXJwoULLa7SOjQzEJoOnahWAceUqL0iIvLYB1tF0w157P3kTl/n/qmJoumGDF+2M1ClAgAA2Bozkf04NuAws3HjRvnb3/4m//jHPyQuLs7qcixFMwOha8i8VNF0Q+6eECcVtY1y44go0XRDJhmdfxrjV7OSRdMNeXZRegArBQAAsC9mIvtxZMDR0NAgUVFRkpOTY3UpIYtmBkLX6h0l6imOiFW71T/HdWFHlGcXpYumG/KrWZ1/6gMAAMBJmInsx5EBh9frla985Ss+i4zCF80MhK76Jrd8e9wGFWxouiH9IgypqG3s9DWGL9spmm7I/VMTA1gpAACAfTET2Y8jAw4Rkdtvv10mTZpkdRkhi2YGQtu4dXt8Ao7B7yZ16fyJ65sXK711dHSAKgQAALA3ZiL7cWzAsXTpUrn++uvl0CG2SDRDMwOh7cDxKp+AY+yarr1yN3vTIXVubWPndl4BAABwEmYi+3FswDF8+HC5/fbb5eKLL5ZHHnlE/vKXv8jw4cN9vl577TWry7QMzQyEvt/OSVEhhbG7tEvnLss4os4tKq8NUIUAAAD2xUxkP44NOMLCwi74FR4ebnWZlqGZgdC3btdR0XRDbh8TI6eqG7p0blzucRVw7CqqCFCFAAAA9sVMZD+ODTjcbnenvpyKZgbsIS73eLcCiqzC0yrgSNzX+d1XAAAAnIKZyH4cG3Dg/GhmoHcrLKtRAceKzKJuX+d0TaPM25wnh05U+bE6AAAA6zET2Y/jA47MzEx588035fXXX1cLjtbV1cnu3bulpqbG4uqsQzMDvVtVfZMKOOZtzuv2dcava96N5VuRsVJY5tx/ZwIAgN6Hmch+HBtwNDU1yZAhQyQ8PFytt5GYmCgizQHH1VdfLZMnT7a4SuvQzEDv5vV6ZcDIaNF0Q6ZE7e32dZ6cm+KzVS07sgAAgN6Cmch+HBtwREREyMUXXyyzZ8+WvXv3SlhYmAo4REReeukluffeey2s0Fo0M9D73Tc5QTTdkP9bsavb1xg0Md5nu9pXP98hXq/Xj1UCAABYg5nIfhwbcPzP//yP/O1vfxMRkbKysnYBx8yZM+Waa66xqjzL0cxA7/eLmVtE0w15/qOMbp3f9jWXAaOi1T8v2JLv50oBAACCj5nIfhwbcFxyySWyYMECETEPOD744AO59NJLrSrPcjQz0PsNXZgmmm7IYx9s7db5OSWVKtRYuq1Q7p+aKJpuyI0joiQl75SfqwUAAAguZiL7cWzAcdNNN8m//vUvETEPOJ5++mkZOHCgVeVZjmYGer+/f7FDNN2QH05PvPDBJtbtOqoCjpySSskurlRPctw9IU6OVtT5uWIAAIDgYSayH8cGHGPGjJErr7xS0tPTVcCxceNGERFZvHix/Md//IdMnz7d4iqtQzMDvd+4dXtE0w25fUxMt86flXBQBRzVDc2Li67MKlY/e/T9ZKlvcvuzZAAAgKBhJrIfxwYcDQ0N8rOf/UwuuugiueuuuyQ8PFzuvvtu6devn4SFhckjjzwibrdz/8OcZgZ6v/cTWwOK7gQRw5fvFE035J5J8T4/H7MmR133Xyt3dXvR0YyCchm9OkfS8su6db4/xecelyFzU3n1BgAAB2Emsh/HBhwizdskfvTRR/LLX/5SbrnlFrn55ptl8ODBsmjRIvF4PFaXZymaGej9Pks7ooKI7rxO8sTsraLphgyZm+rz80aXR347p3X72E/TCrt03cKyGvnLJ1mtC5iOjJbNB052uT5/+vk7m0XTDfntnBRL6wAAAMHDTGQ/jg440DGaGej9YnKOqRAhu7iyy+ffNSFOPaVxrhNn6uW7k5q3kL15ZJRkFZ6+4PUqa5tk4vpcuXlklM/Ws5puyC2joiU1z5onOWobXdI/onW3mAaXc5/uAwDASZiJ7MexAceIESMkOzvb6jJCFs0M9H6ZBeUqQNi0/0SXzq2sa90idvamQ6bHZBWWq7Di3snxcqKq3vS4JrdHFm89LN8Zv8En1Bi+bKd8lnZEbhzRfI3bxsR0Kijxt6zCcp+6rKgBAAAEHzOR/Tg24PjKV74i4eHh8s1vflPGjRsne/futbqkkBAZGSl9+vRRXzQz0Hvln6xWQ/uq7cVdOndXUYU6Nzq7tMPjlm4rVMc9OTdFGl2tr/95vV6Jyz0uD761ySdAGDIvVXYXV6jj1uwskX5nn6AYGBkrOSVdf9qkJz7aetinvvlJeUG9PwAAsAYBh/04NuCoqKiQRYsWyeDBg+Xiiy+W8PBw+da3viVTpkyRvDz+45VmBnq/ytrWpzAWbMnv0rlrdpaoc/eWnunwOK/XK6+v2KWOHbsmR0REckoq5an523yCgx+/uVFico6ZLkq6PKNIHXfn+A2y/1hV137ZHnht+S6fOl9cmhm0ewMAAOswE9mPYwOOtsrKymTevHkSHlRVAAAgAElEQVTy05/+VC666CIJDw+XQYMGyVtvvWV1aZahmYHez+v1yk1nX/+YFrOvS+e+G39ADfx1jedfk6K+yS2Pvp+sjh+6ME09kaHphnwrMlYWJh/2ebrDzJKUAnXOoInxkn+yuks1d9fgd5N8Ao5BE+O6vTMMAACwD2Yi+yHgOMeJEydkxowZctVVV0l4eLjV5ViGZgac4Z6zC4G+sXJ3l877xxc7RNMNuW9yQqeOL6moU4uStnzdNCJKxq3bI6drGjt933mb89T535uSIEXltV2qu6vqm9xqDZC2a4QUltUE9L4AAMB6zET2Q8BxlsvlkqioKHn22Wfla1/7moSFhcl///d/W12WZWhmwBlank4YtqRrr138+oPmLWJ/Pz/1wgeflZJ3Si06+sLHmd1+AqPt0yM/nJ4opZVd3+K2s7YfOa3uNSV6r/rnf2d1bc0SAABgP8xE9uPogMPj8ciGDRvkT3/6k1x99dUSFhYm1113nbz88suSlJTk6EeQaWbAGf7wYfM6GE/M3tql81qeZohY1bUnPw6fqunx+hler9cnbHjwrU1ysqqhR9fsyNLU1tdi8k5WyzdHx4imGzLiS3bhAgCgt2Mmsh/HBhwvvviifP3rX5fw8HC5+uqr5YUXXpCEhATxeM7/DrhT0MyAM7zy2XbRdEN+8ubGTp9TUduohv65m61ZlNnr9crYNTmqjoffSerSqy6d9a+Vu9Q6IV6vV34/P1U03ZDB7yb5/V4AACC0MBPZj2MDjq997Wvy3HPPSXR0tLhcLqvLCTk0M+AMLSHBwMjYTp+zo81rGzE5xwJY3fl5PF55Y+VuVcsvZ22Ryromv97jFzO3iKYb8ocPt4mIyFux+0XTDekXYfj9XgAAILQwE9mPYwOOxsYL///0nT59OgiVhCaaGXCGmfEHVUBwoV1MWny5o1idE8ztWs24PV75+9kFTzXdkN/MSRGX2z9P4tU3udUuM5Oj9oqIyMZ9J9S9Nh846Zf7AACA0MRMZD+ODTg60tDQICtWrJBf//rXcskll1hdjmVoZsAZlm4rVAP7scr6Tp0zI651kc/6pvNvERsMLrdHXlqapWqKzz3ul+vuKqpQ11y766iIiFTWNqmfzdiw3y/3AQAAoYmZyH4IOKT5Xe74+Hj54x//qHZQufbaa+X555+3ujTL0MyAM0Rnl6qBfc/Ryk6d8+rnzU9MfH9K57aIDYaaBpd62mL8uly/XPPTtNbw5/Cp1m1hH5qxWTTdkKcXbPPLfQAAQGhiJrIfRwccWVlZMnz4cLn++uslLCxMwsPD5emnn5bU1FRH76AiQjMDTpGWX6aG+C0HO/fKxaPvJ/usSxEqfjMnRTTdkEdmbvHL9SJWNa/vccfYWPF4vO1+ftuYGL+9DgMAAEIPM5H9OC7gyM/PlwkTJsitt94q4eHh0rdvX3n99ddlxYoVEhYWJqtWrbK6xJBAMwPOcOhElQo41uwsueDxXq9XBkbGhuRWqW9v2K9+l3I/7Kjyy1nNC4z+bl6qz89XZBap++SUdO6pFwAAYD/MRPbjqIDje9/7noSHh8u1114rL7/8siQnJ6vP8vLyCDjaoJkBZyivad3ydVHy4QseX1bdoI7/MCk/CBV2XkreKVVbVHZpj67V6PLIzSObX3mZuN73lZfDp2rUfZakFPToPgAAIHQxE9mPowKOsLAwufHGG2XNmjXttoYl4PBFMwPO4PF4pX9E87D+VuyFF83MKixXw32cnxbz9Jf6JrcMGBUtmm7I6NU5PbpWTkml+j1X7/B9ssXr9cpdE+JE0w159fMdPboPAAAIXcxE9uOogGP27Nnygx/8QMLCwuSaa66RF198UTZu3Cher5eA4xw0M+Acd58d1iNWXfiVk5VZrVvEHjph7RaxZp6av0003ZCfvr2pR9f5PP1Im9+zut3nw5ZkiqYbcv/UxB7dBwAAhC5mIvtxVMDR4vDhwzJx4kS57bbbJCwsTK6//np5+umnJTw8XL788kurywsJNDPgHC27gry4NPOCx74V27zORf8IQxpc1m8Re673Eg6qYOL4mc5te2tm5JfZoumG3D4mxmeB0RZzN+ep+5RW1vWkZAAAEKKYiezHkQFHWy07qdxwww0SFhYm//Vf/yV//vOfZf369VJf3/3/OLY7mhlwjt/NSxVNN+TJuSkXPPaVz7aLphvyg2mh+eRCZkHrKzSdWTS1I4+d3Smmo79JRpv7GLt7tt4HAAAITcxE9uP4gKOFx+OR+Ph4ee655+Sqq66SsLAw+epXv2p1WZahmQHn+OunWaLphjzYidc6WnYWGbowLfCFdUOjyyO3jYkRTTfkjZW7u3WNJrdHreUxbp35vwPrm9xqEdKOjgEAAPbGTGQ/BBwm6uvrZdmyZfLYY49ZXYplaGbAOUatbn4d4zvjN5z3OK/XK3eMjfXLIp6B9MyidNF0Q340fWO3zs89ekY9nbFqe3GHxz0+e6touiGPvZ/c4TEAAMC+mInsh4ADpmhmwDlmxB1QA32T29PhcSerWreIXdiJLWWt0nZ9jKLy2i6fvzyjSJ1/4HjHC6lOMnJF0w25aUSU1DWG3nokAACgZ5iJ7IeAA6ZoZsA5lqQUqIH+RFXHaw+1XXcicV9obRHb1q6iClXn8syiLp8/enWOaLoh3xwdI26TBUZbxOSUqvtsyy/rSckAACAEMRPZDwEHTNHMgHOs331UDer7jp3p8Ljlma1PNuSfbL91aqhwuT0yMLL5VZrhy3Z2+fyWV09+M+f8i66eqKpXf48PNh7qbrkAACBEMRPZDwEHTNHMgHOk5J1Sg3rKoVMdHjc9Zp9ouiE3jog676ssoWDYkkzRdEPum5wgXm/HT2Gcy+X2yK2jmxcYHbvmwuuM/Gj6RtF0Q57/KKMn5QIAgBDETGQ/BBwwRTMDzrH/WJUKONbtOtrhcS27rfz4ze4t3hlMC5MPq9/p8KmaTp+371jrAqMrOvF6y/BlO0XTDfn2uA3iOc/rLAAAwH6YieyHgAOmaGbAOdouHrokpaDD4x6Z2bxF7DOL0oNXXDftLW0NKj5NK+z0eSuzijv1uk6LT7YVquMPneh4QVIAAGA/zET2Q8ABUzQz4Bwut0cN6TPiDpge4/V65bYxMZ1+dcNqHo9X7hy/QTTdkJc/297p8yLX7hFNN+SWUdHi6sRrOG2f+FiWcaQnJQMAgBDDTGQ/BBwwRTMDzvKds2HAqNXZpp8fP9O6oObiraG7RWxbLa/U3D0hrtPrcPxmTopouiG//mBrp453e7wycGzzgqavr9jVk3IBAECIYSayHwIOmKKZAWd58O1NoumG/PXTLNPPt+WXqYBj4/4TQa6ue5a2eX1k/7ELvz7i9njlm6Obn1IZvbrzT6kMXZgmmm7Ig29v6kG1AAAg1DAT2Q8BB0zRzICzPDm3+cmF381LNf38i/QjKiwo6MKinVY6dKJa1fxRJ546OXi8qluvm8yMP6jOK69p7EnJAAAghDAT2Q8BB0zRzICzvLi0eVvVh2ZsNv18SvRe0XRDbhoR1am1KUKB1+uV706KF0035M8fZ17w+FXbWxcY3XO0stP3ST7Yus1ufO7xnpQMAABCCDOR/RBwwBTNDDhLxKps0XRD7poQZ/r5S0ub17N44K1NwS2sh/7+xQ7RdEO+FRkr7gts4zp+Xa5ouiEDRkZLUxdCnOoGl/SPaA44pkbv62nJAAAgRDAT2Q8BB0zRzICzvBW7XzTdkH4RhmkQMPjdJNF0Q/64OPS3iG1rWUbrqzU5Jed/KmPI3FTRdEMefT+5y/f5xdktdIfMNX/FBwAA2A8zkf0QcMAUzQw4y+Kth1UQUFbd4POZx+OVW0dHi6YbMm6dvf6dUFReq36v+Ul5HR7n8Xjl9rPb4I740nwnmfMZsyZHbS/b6LLHKzwAAOD8mInsh4ADpmhmwFnW7CxRQcDB4747jpRW1qnPPk4tsKbAHrh/auIFnz7JO9m6IOlnaZ1fYLRF27/fjiOne1IuAAAIEcxE9kPAAVM0M+AsbRfK3JZf5vNZSl7rZ0kHTlpUYfe9vmKXaLoht4+J6XBtjbYBRXZx5xcYbVF8uvVJkQVb8ntaMgAACAHMRPZDwAFTNDPgLLlHz6gBPSq71Oezz9Ja17EoKq+1qMLua7s7Slah+dMVE9c3LzB688goaXC5u3wPr9cr905u3rHlL59k9bRkAAAQApiJ7IeAA6ZoZsBZjp+pVyHA0m2FPp9Njtqrdhe50E4koajtKzYfbDxkeszv5zcvMPq/723p9n1e/nS7aLoh90yKF6/Xfn8nAADgi5nIfgg4YIpmBpyl0eVRIcDM+IM+n73wcaZouiE/fXuTNcX5wYNvbRJNN+TpBdvafebxeGXg2FjRdEP0f+/u9j0WJh+29ZMuAADAFzOR/RBwwBTNDDjPwMjmIX/smhyfnz80Y7NouiHDlmRYVFnPjfgyW+1ycu4rKIdP1ahg4pNznl7pip1FFeo6q3eU9LRkAABgMWYi+yHggI/IyEjp06eP+qKZAef4yZsbRdMNeeWz7epnHo9XBoxq3iJ24vpcC6vrmfW7j3a4iOq6Xa2f7Syq6PY9mtwetZ3uqNVd32oWAACEFgIO+yHggCmaGXCeJ2ZvFU035A8ftr7G0XZ3kJ483WC1U9UN6veYEXfA57MpZ9cYuWlElNQ3dX2B0baGzGtey+ORmd1fywMAAIQGZiL7IeCAKZoZcJ5hS5rX2nj4nST1s7bbx249dMrC6nru4XeSRNMNGTI31efnf/hwm99Ciekx+0TTDekfYUhVfVOPrwcAAKzDTGQ/BBwwRTMDzvPGyt2i6YYMmhivfrZ0W6EKOIpP23vhzMi1e9RWsLWNLhFp3t71W2fXHnl9xa4e3yNh73H199py8GSPrwcAAKzDTGQ/BBwwRTMDzjPt7NMHN46IEs/Z7WAnrM9t3iJ2VLT6mV3F7jmmwoekA83hw5Gy1ldwPk4t6PE9Ttc0quu9c86rMAAAwF6YieyHgAOmaGbAeRZsyVfDeUVto4iIDFuSIZpuyEMzNltcXc9V1jZJv4jm329azD4RETF2l6rfefuR0365z0/fbt6SdujCNL9cDwAAWIOZyH4IOGCKZgac58sdxWrYzztZLSKtw/oLH2daXJ1//GpWsmi6IY99sFVEWp9a6R9hSF1jzxYYbdHyqs8dY2PFbfOnXgAAcDJmIvsh4IApmhlwns0HTqqAI6OgXNwerwwY2bzt6eSovVaX5xeTz+6Y0j/CkDP1TTJ0YVq7hVV7anlGkfo75h4947frAgCA4GImsh8CDpiimQHnySmpVIN5TM4xKSpvXZ/is7QjVpfnFxv3n1C/U3zucfnO+A2i6Ya8trznC4y2yDtZ3bol7Yb9frsuAAAILmYi+yHggCmaGXCeoxV1PoFGUpsnOlLy7L1FbIvqBpfcOCJKNN2Ql5Zmqd9v8dbDfruH1+uVX8zcohZnLSyr8du1AQBA8DAT2Q8BB0zRzIDz1De51cD/fuJB+Ti1QH1fWllndXl+88TsraLphlpwVNMNySwo9+s9sgrL1bWfW5wuXi9rcQAAYDfMRPZDwAFTNDPgTLePiRFNN2Tcuj0ybt0e0XRDbh1t/y1i23ordr8KH1qCjtpGl9/v07LYaPMrP6V+vz4AAAgsZiL7IeCAKZoZcKYfTk8UTTfk71/skD8uThdNN2Twu/5bgDMUbD10yifg+FmAtsAtr2lUa3x8b0qC1DT4P0QBAACBw0xkPwQcMEUzA8702AfNr28MXZgmD7y1Sa1V0ZvUN7nV7jCabsg/l+0M2L2WZRxR9+ktO9EAAOAUzET2Q8ABUzQz4EzPf5Qhmm7Iz9/ZLDedXYxzavQ+q8vyu9/NS1XBw8Jk/y0wei6Px6vW/LhxRJTsP1YVsHsBAAD/YiayHwIOmKKZAWf6vxW7RNMN6d9mAc5lGb1ji9i2ZsYfVL9fWn5ZQO+Ve/SM2rnlybkpLDgKAIBNMBPZDwEHTNHMgDNNid7rsz5FMAIAKxSW1cjAyFh5aMZmaXC5A36/Cetz1d9zRWZRwO8HAAB6jpnIfgg4YIpmBpxpflJeu4DjxJl6q8sKiPomt7iDtDtMVX2T3Ds5XjTdkLsmxElFbWNQ7gsAALqPmch+CDhgimYGnGllVrFPuHH7mBheqfCT9buPqr/riC+zrS4HAABcADOR/RBwwBTNDDjTxn0nfAKOX8zcYnVJvYbX65WhC9NE0w3pF2HIjiOnrS4JAACcBzOR/RBwwBTNDDjTrqIKn4Dj5U+3W11Sr3L4VI3aovZ/39siLrfH6pIAAEAHmInsh4ADpmhmwJmKymt9Ao43Y3vfFrFWmxF3QP19P9oauC1qAQBAzzAT2Q8BB0zRzIAz1Ta6fAKO5ez44Xf1TW750fSNoumGDBwb22sXcQUAwO6YieyHgAOmaGbAuW4dHa0CjoyCcqvL6ZU27m9d6+TVz3dYXQ4AADDBTGQ/BBwwRTMDznX/1EQ1fJ+sarC6nF7rL59kqb9zal6Z1eUAAIBzMBPZDwEHTNHMgHP9alayaLohd4yNZYvYACqtrJMBo5qflolcy79rAQAINcxE9kPAAVM0M+BcLy1tfrLg8dlbrS6l1/vp25tE0w35yydZVpcCAADOwUxkPwQcMEUzA861t/SMDF+2U7IKWX8j0P7w4TbRdEOeIEwCACDkMBPZDwEHTNHMABB4/1y2UzTdkPunJlpdCgAAOAczkf0QcMAUzQwAgTcleq9ouiE3j4xivRMAAEIMM5H9EHDAFM0MAIG3KPmw2kmlvKbR6nIAAEAbzET2Q8ABUzQzAASesbtUBRy5R89YXQ4AAGiDmch+CDhgimYGgMDLLChXAcfG/SesLgcAALTBTGQ/BBwwRTMDQOAVldeqgGNZxhGrywEAAG0wE9kPAQdM0cwAEHgNLrcKON5LOGh1OQAAoA1mIvsh4IApmhkAguPO8RtE0w0Z+WW21aUAAIA2mInsh4ADpmhmAAiOwe8miaYbMmxJptWlAACANpiJ7IeAA6ZoZgAIjmcWpYumG/Lo+8lWlwIAANpgJrIfAg6YopkBIDheX7FLNN2Q706Kt7oUAADQBjOR/RBwwBTNDADB8faG/aLphvSPMMTl9lhdDgAAOIuZyH4IOGCKZgaA4Fi6rVDtpHL8TL3V5QAAgLOYieyHgAOmaGYACI4Ne46pgGN3cYXV5QAAgLOYieyHgAOmaGYACI5dRRUq4IjLPW51OQAA4CxmIvsh4IApmhkAguNYZb0KOD7ZVmh1OQAA4CxmIvsh4IApmhkAgsPl9kj/iOaA4+0N+60uBwAAnMVMZD8EHDBFMwNA8Hx3UrxouiH/WrnL6lIAAMBZzET2Q8ABUzQzAATPr2Yli6Yb8uyidKtLAQAAZzET2Q8BB0zRzAAQPMOWZIimGzL43SSrSwEAAGcxE9kPAQdM0cwAEDwjvswWTTfkrglxVpcCAADOYiayHwIOmKKZASB4ZsYfVDupNLjcVpcDAACEmciOCDhgimYGgOD5Iv2ICjiKT9daXQ4AABBmIjsi4IApmhkAgmfjvhMq4MgqLLe6HAAAIMxEdkTAAVM0MwAET+7RMyrgiMoutbocAAAgzER2RMABUzQzAARPWXWDCjgWbz1sdTkAAECYieyIgAOmaGYACB6Pxys3j4wSTTdkavQ+q8sBAADCTGRHBBwwRTMDQHDdPzVRNN2Q4ct2Wl0KAAAQZiI7IuCAKZoZAILr8dlbRdMNeXrBNqtLAQAAwkxkRwQc8BEZGSl9+vRRXzQzAATHS0uzRNMN+enbm6wuBQAACAGHHRFwwBTNDADBFbl2j2i6IQPHxlpdCgAAEGYiOyLggCmaGQCCa/amQ2onlZoGl9XlAADgeMxE9kPAAVM0MwAE17+zilXAcfhUjdXlAADgeMxE9kPAAVM0MwAEV/LBUyrg2JZfZnU5AAA4HjOR/RBwwBTNDADBdfB4lQo41uwssbocAAAcj5nIfgg4YIpmBoDgqqxrUgHHh0n5VpcDAIDjMRPZDwEHTNHMABBcXq9Xbh0dLZpuyIT1uVaXAwCA4zET2Q8BB0zRzAAQfD95c6NouiGvfLbd6lIAAHA8ZiL7IeCAKZoZAIJvyLxU0XRDhsxNtboUAAAcj5nIfgg4YIpmBoDg+9vnO0TTDfnxmxutLgUAAMdjJrIfAg6YopkBIPgmrs8VTTfk1tHR4vV6rS4HAABHYyayHwIOmKKZASD4PkzKVzupVNY1BfXeFbWN0ujyBPWeAACEMmYi+yHggCmaGQCCb83OEhVwHDheFbT77iqqkJtGRMlP395EyAEAwFnMRPZDwAFTNDMABF9afpkKOLYcPBm0+0asylb3zSosD9p9AQAIZcxE9kPAAVM0MwAEX8GpGhU0rMwqDso9PR6v3Ds5Xt13zqa8oNwXAIBQx0xkPwQcMEUzA0Dw1Ta6VNDwwcZDQbnn7uIKdU9NN+T5jzKCcl8AAEIdM5H9EHDAFM0MANYYGBkrmm7I2DU5QbnfjLgDPgHHtyJjxeNhBxcAAJiJ7IeAA6ZoZgCwxs9mbBZNN+SlpVlBud8vZm7xCTg03ZC9pWeCcm8AAEIZM5H9EHDAFM0MANZ4esE20XRDHp+9NeD3OlpRp0KNVz7brv7549SCgN8bAIBQx0xkPwQcMEUzA4A1hi/fKZpuyPenJAT8XktTC1Sosbu4Qu6eEKfCDgAAnI6ZyH4IOGCKZgYAa0yL2SeabshNI6ICvhbGs4vSRdMNuXdyvHi9XnlxaabP9wAAOBkzkf0QcMAUzQwA1vho62H1VMWp6oaA3ae6wSUDRkaLphsy4stsERFZsCVf3ftIWW3A7g0AgB0wE9kPAQdM0cwAYI3o7FIVMuw5Whmw+8TktN4ncd9xEfHdMnZlVnHA7g0AgB0wE9kPAQdM0cwAYI2swtMqZNi470TA7vPa8l2i6YZ8c3SM1De5RUTE5fbI7WNiRNMNeWPl7oDdGwAAO2Amsh8CDpiimQHAGsWna1XA8UX6kYDcw+3xyl1nFxR94eNMn8+GLkwTTTfkwbc2BeTeAADYBTOR/RBwwBTNDADWaHR5VMDxbvyBgNwjs6Bc3WN5RpHPZ+8lHFSfnawK3BogAACEOmYi+yHggCmaGQCs07Jda8Sq7IBcf2p0804t/SLahxipeWUq4IjOLg3I/QEAsANmIvsh4IApmhkArPPIzC2i6Yb86aOMgFz/ZzM2i6Yb8vjsre0+q29yy80jo0TTDRm3jv83AADgXMxE9kPAAVM0MwBY57nF6aLphvxy1ha/X7vgVI16QuODjYdMj3li9taA3R8AALtgJrIfAg6YopkBwDpvrNwtmm7IPZPi/X7tBVvyVcCx/1iV6TFToveKphvSP8KQqvomv9cAAIAdMBPZDwEHTNHMAGCdGRv2qzUyXG6PX6/91PxtoumG/GBaoni9XtNjEvcdVyHIpv2B26oWAIBQxkxkPwQcMEUzA4B1PtlWqAKGY5X1frtuZW2T3DiieX2NyLUd//u9sq5J+kU03//N2H1+uz8AAHbCTGQ/BBwwRTMDgHXic1ufoNhZVOG3667ZWaKum3zw1HmPHfxukmi6IUPmpvrt/gAA2Akzkf0QcMAUzQwA1skurlRBROyeY3677t8+3yGabsjAsbHS6Dr/qy9j1uSIphsyYFS0NLjcfqsBAAC7YCayHwIOmKKZAcA6J87Uq4BjaWqBX67Z5PbIwMhY0XRDXv5s+wWPX7frqKoho6DcLzUAAGAnzET2Q8ABUzQzAFjH7fFK/7NrYLwVu98v10w5dEoFFqt3lFzw+ONtQpaOtpMFAKA3YyayHwIOmKKZAcBa906OF0035PUVu/xyvfHrckXTDblxRJRU1DZ26pwfTd8omm7Ic4vT/VIDAAB2wkxkPwQcMEUzA4C1Hn0/WTTdkGcW9Txc8Hq9KqwYMq/zi4a+tnyXWrPD7THfUhYAgN6Kmch+CDhgimYGAGsNW5Ipmm7Iw+8k9fhaB49XqddNPkzK7/R5yzKOqPP2HK3scR0AANgJM5H9EHDAFM0MANYatTpbNN2Q74zf0ONrzdmUp4KK/JPVnT4v/2S1Ou+jrYd7XAcAAHbCTGQ/BBwwRTMDgLVmJRxU4UJ9U8+2af3NnBTRdEMefHtTl87zer0yaGJc884rn1545xUAAHoTZiL7IeCAKZoZAKy1PKNIBRxF5bXdvk5ZdYP0O7sjy+SovV0+/y+fZImmG3LPpHjxelmHAwDgHMxE9kPAAVM0MwBYa9P+EyrgyCwo7/Z1VmS2BiXph7t+nUXJh9X5Badqul0HAAB2w0xkPwQcMEUzA4C19paeUcGCsbu029d5aWmWWsvD5fZ0+fyckkpVx/LMom7XAQCA3TAT2Q8BB0zRzABgrfKaRhUsLEru3gKf9U1uuW1MjGi6IcOX7ezWNdwer9wxNlY03ZDXV+zq1jUAALAjZiL7IeCAKZoZAKzl9XplwMho0XRDpnRj7QwR39dcevIUyDOL0kXTDfnJmxu7fQ0AAOyGmch+CDhgimYGAOv9YFqiaLoh//hiR7fOb9lq9uaRUVJV39TtOt5PbN3R5URVfbevAwCAnTAT2Q8BB0zRzABgvZbtXZ+av63L53q9XvnelATRdEOGLkzrUR1p+WV+eRIEAAA7YSayHwIOmKKZAcB6f/20eYHQB9/e1OVz2y4OuiSloEd11De51esyY9fkdOnchcmHZci8VNl37EyPagAAINiYieyHgAOmaGYAsF7k2j2i6YbcMTa2y+fOjG99raT4dG2Pa3lybvPTJI/M3NLpc5ZntG5R+4uZW8Tt8fa4DgAAgoWZyH4IOGCKZgYA683ZlKcCguoGV5fO/dWsZNF0Qwa/m+SXWqbH7BNNN6RfhCGVdRdezyMtv0xuHhml6td0Qz5PP+KXWgAACAZmIvsh4IApmhkArFGaF/AAACAASURBVPfljmIVDuSdrO70eccq69V5b8Xu90stG9vsyLJx34nzHnukrFbuHL9BLXA6aGK8aLohd0+I61Q4AgBAKGAmsh8CDpiimQHAeimHTqlQISXvVKfP+zStUJ2348hpv9Rypr5J+kU0X3NazL7zHvfQjM3q/isyi2T97qPq+4nrc/1SDwAAgcZMZD8EHDBFMwOA9Q6dqFbBwOodJZ06x+v1yu/np4qmGzJoYrx4/LjuxS9mbhFNN+S3c1JMP3e5PfLsonRV85TovaqmIXOba7ppRFSXnkYBAMAqzET2Q8ABUzQzAFivqr5JhQXzNud16pzo7FJ1TuRa//47vGXR0wEjo6W+yd3u8/HrctW9hy3J9FlUNKekUj0B8sfF6X6tCwCAQGAmsh8CDpiimQHAel6vV24bEyOabsj4dRd+taO6wSX3TU4QTTfkO+M3SHlNo1/rMXa3hidp+WU+n32WdkR9NvjdJNNFUSNW7e70Oh4AAFiNmch+CDhgimYGgNDwwFubRNMNefmz7Rc8duL61icolmX4f8eSE1Wti5e+n3hQ/Twl75TcNCLq7GsxcR1uS3uqukEGjo0VTTfkwbc3SaPL4/caAQDwF2Yi+yHggCmaGQBCw+/mNa9d8eRc83UvWuwtPSM3ng0ZfjMnxa9rb7T1kzc3iqYb8syi5tdMDp+qkW+P26BeXckqPP+ipgu25KuQZMGW/IDUCACAPzAT2Q8BB0zRzAAQGv7+xQ7RdEN+OD2xw2M8Hq88MXuraLohN46Ikr2lZwJWz+srdommG3LH2Fg5XdMoD769SQUWX+4ovuD5jS6PPHj2qZSBkbFyqrohYLUCANATzET2Q8ABUzQzAISGyVF7m5+OGBUtXq/5UxlfpLeufzHJCOw2rMszi9S92m4H+2Zsx1vHnmvjvhPqvIhV2QGsFgCA7mMmsh8CDpiimQEgNLR9paOitv2ioeU1jfKd8c2viHxvSoLUmCzu6U8Fp2pUPS1fLy3N6vIrMc8tbt5Otl+EITkllQGqFgCA7mMmsh8CDpiimQEgNKzbdVQFCfuPVbX7vOWVEU03JCanNOD1eL1euWdSvLrn/763RWobux6qHDpRrRYmHTI3tcOnUwAAsAozkf0QcMAUzQwAoSH9cLkKE5IOnPT5LKOg9bM/Lk4PWkjQEqrcMyleSivrun2dCW12fVm/+6gfKwQAoOeYieyHgAOmaGYACA2FZa2vhKzILFI/b3J75OF3kkTTDbllVLQcKTPfmjUQymsaZfHWwx1uB9tZlXVNcteEONF0Q+6fmih1je4uX6PR5ZG8k9U8AQIA8DtmIvsh4IApmhkAQkN9k1sFHO8nHlQ/n7c5z/TndvNZWusCqTPjO/97HCmrlanR+2TQxOaAZOjCNDlZxY4sAAD/YSayHwIOmKKZASB0fHtc8yKio1fniIhISUWdfHN0jGi6IQ++vUkaXF1/8iFUuD1eeWTmFtF0Q24dHS1HKzp+5cXl9khMzjF5ZlF6u4VOW16ZSTl0KojVAwB6M2Yi+yHggCmaGQBCx8/fad6O9c8fZ4qIyJ8/zlRDfW8Y6Lfll6nf59XPd7T7/GhFncyIOyD3To5vF2r8dk6KvLi09e/RL8KQd+IOiLuLu7q0cLk9sjKrWAa/myRD5qXKiar6nv56AACbYiayHwIOmKKZASB0DF2YJppuyGMfbJWEvcfVMP+PL9qHAXb18qfb1e+VUVAubo9XNu47IcOWZEj/CN9QY+DYWBm7JkftKuP1emVZxhG5dXS0Oub381PlxJnOhxMej1fW7ToqD769yedeD769SY534ToAgN6Dmch+CDhgimYGgNDx2vLmXUsGTYyTH0xLbB7yI2N71ZoTReW1csuo5oDiR9M3yv1TE9s9rfHY+8myPKOow21p9x+rkp/N2KyOv3tCXLudZ87l9Xplw55jMvjdJJ973T4mRv3zA29t6tFuMQAAe2Imsh8CDpiimQEgdEyP2ddu2F+aWmB1WX43Y8P+dr/nbWNiJGJVtuSUVHbqGrWNLrWNbcsrK2/G7hOX2+NznNfrlc0HTsqj7yf73O/uCXGyMPmw1DW6ZdTqbPXzH03f2ONdYwAA9sJMZD8EHDBFMwNA6FiSUuAzhD/6fnK315gIZbWNLvnp2VdEBr+bJEu3FUpVfVO3rrVqe7FaiFXTDXlybop6CmNbfpk8OTfF52/67XEbZPamQ1LT0Pp0iNfrlci1e9Qx909NlKJyQg4AcApmIvsh4IApmhkAQkdMzjE1ZPePMCS7uHNPM9hRdYNLjpTVitfb8wDn0Ilqn1dP7hy/QX4/P9Un2LhjbKzMiDsgZzoIUrxer0wyctXx35+SIAWnanpcGwAg9DET2Q8BB0zRzAAQOnJKKtWAPXZNjtXl2Ep9k1siVmX7hBotW9JOid4r5TWNF7yG1+uVaW1eE7p3crzkn6wOQvUAACsxE9kPAQdM0cwAEDpaXpUYvmxnt1/ZcLq1u47KwLGxMmBktESu3dOlHVZEmv930HaNkHsmxcuhE1UBqhYAEAqYieyHgAOmaGYAQG9T3eDq8FWUzpoZf1CFHIMmxqmtajvrRFW9xOSUdurJEQCAtZiJ7IeAA6ZoZgAAzH2w8ZAKOe6aECd7S8+c9/jSyjpZvPWwDJmbKv0iWp8AySo8HaSKzZ2sapD6JrelNQBAKGMmsh8CDpiimQEA6Ni8zXkq5PjO+A3ttrEtKq+VD5Py5fHZW9ut/9HydfPIKPki/UjQa69tdEnk2j3SL6J195jaRteFTwQAh2Emsh8CDpiimQEAOL8FW/JVWPGtyFiJyz0uszcdkl/NSjYNNO6fmiiTjFyZvemQ3DwySv181OpsaXR5glJzWn6Z/PjNje1qGzQxThYmH+aJDgBog5nIfgg4YIpmBgDgwpakFHT4hIamG/KTNzfKtJh9kl1c6bP1bUZBuQyaGK+Oe3JuipysaghYnS1PbbSt7YnZW+Xhd5J8fnbf5ARZuq0waIELAIQyZiL7IeCAKZoZAIDO+TSt0Cck+NmMzTJjw37ZW3rGJ9Q4V2llnTz2frJPuLCrqMLv9W3LL5MfTW99auOWUdGyYEu+uD1e8Xi8snbXUXnwrU0+v8MPpiXK8swicbkJOgA4FzOR/RBwwBTNDABA5yUdOCkLtuTLweNd21Wlvsktry3fpYKFAaOi5d9ZxX6pyeypjd/OSZHDp2raHetye2RFZpH8YFqiz/EPvLVJ1uwsEY+n46CmJ0or62Rh8mEZtiRDVmQWBeQeXVHd4JJJRq58tPXwecMpAM7ATGQ/BBwwRTMDABAcXq9XPtp6WG4c0boux7h1e6SpB09PnPvUxq2jo2VR8mFxXyCoaHR55NO0QrlvcoJP0PHwO0kSk3PML0P/8TP1snjrYfntnJR2r/Rs2HOsx9fvLrfHK89/lKFqWZYR/AVgAYQWZiL7IeCAKZoZAIDgSs0rk7smxKkB+6n526S8prFL16hpcMnYNTk+ocGTc82f2jif+ia3LEo+LIMmxvlc65GZW2TMmhxZsCVfNuw5JvuPVUld44UXJj1RVS8fpxbIkHmtW+Wafd0+JqbLT8H4y8T1uT613DIqWvYdO/8WwAB6N2Yi+yHggCmaGQCA4Cs+XSv/+94Wn51XWrag9Xq9UlXfJIVlNbLjyGlJ2HtclmcWybzNeTIlaq/834pdPq+YtDy10ZPXS2obXTJnU558Z/yG8y6m+t1J8fLk3BR5bfkueS/hoKzZWSJZheWydFuh/H6+eahx/9REmRK1V7KLK2XDnmM+C7NW1jb560/aKZ+lHVH3/+H0ROl/tt4H394k1Q1soQs4FTOR/RBwwBTNDACANeoa3fL3L3b4rMtx7+R4GTAy+rwhQ9uvIXNTpaCLT22cT1V9k7yXcFB+MXOL3D4mptN1nPv1/SkJMsnIlZ1FFe1ed5kZf1AdN3RhWtAWOE05dEpuOvt60KCJcVJUXivvJbTW8vcvdrAeB+BQzET2Q8ABUzQzAADW8Xq98mFSvnqS4EJfA0ZGy32TE+RXs5JlSUpBwBYFbantVHWDZBWeli93FMu78Qdk+PKd8ts5KXLPpPh2td03OUHGr8uVrMLT563L4/HKS0uz1HmTo/YG7HdokX+yWr4VGauCpKzC0yLSvB7H/1uQpmr5Ip31OAAnYiayHwKOXmjOnDly1113yUUXXSSRkZHdugbNDACA9bbll8nwZTvl9RW7ZEr0Xpm3OU9WZBZJ4r7jsuPIaTlSVivVDa6QesKgttEl+46dkQ17jl0w1DhXTYNLHn4nSQULq3eUBKzOitpGeaDN9rhrdvre61R1g3z3bGBzy6ho2VvqzPU4vkg/Ij9+c6Os333U6lKAoGMmsh8Cjl5o9erVsnbtWvn9739PwAEAAGzlSFmtWvPjllHRsru4wu/3aHR55Kn521S4MWPDftPjUvPKWtfjeCt463F4PF55P/Gg/HLWFlm7y7pgIaekUr2+c/uYGDlaUWdZLYAVmInsh4CjF3vppZcIOAAAgO1sPXRKbZv7vSkJcrKqwW/X9nq98sbK3SrcePmz7ed9ymRWm/U4Xv088Otx1DS45M8fZ/q85vNhUn5A72mmweWWn7+z2aeOYUsyLXtaqLbRJcWnay25N5yLmch+CDgCpLq6WsaOHSuDBw+W//zP/5Q+ffrIRx99ZHpsQ0ODvPHGG3L99dfLpZdeKvfee6/ExcX1uAYCDgAAYFcLkw+rwfq3c1Kk0eWfRUc/TMpX133sg61S33T+bW49Hq8MXdi6HsdnaYFbj6P4dK0MfjfJJ1Ro+Zq4Pjega6uca0r0XnXveye3rq0Sk1MatBpaHD9TL9+fkiCabsjbG/aH1CtZ6N2YieyHgCNACgoKpE+fPvI///M/8sADD5w34Hjqqafkoosuktdff13mz58v3//+9+Wiiy6S5OTkHtVAwAEAAOzK6/XKa8t3qcE6YtXuHg+28bnH1Za135uSICfO1HfqvLbrcQwYFS25R/2/HkdmQbncPSHOZyeZtPwydV9NN+QfX+zwW9BzoVpa/k6Pvp8sx8/Uq9eG7p0cL2fqg7eNb5PbI0/OTfEJe8asyQlq2IPA+WDjIfnZjM2y6/+3d+dhVVWL/8eXSgk58HUo9WqRipaZV8trftWezDLN59dwrSzvrXu7asPt27e+lZoDGTdRGiwttZCrpmmD5i3NVEgcwhEHMgtnzQFFEBUQERA4n98fxobDORwPM1ver+dZzxP77L3POoe1tfVxDcfKfypaeaBPZD8EHBUkKytLJ0+elCRt27at2IBjy5YtMsZo0qRJ1rHMzEy1bdtWPXr0cDq3V69eMsa4LUFBQS73JuAAAAB2lnkxVw9N32B1bOdtPlLqe+06kaYOv29x22FchOJOpJbo+s2HCtbjuHvSWp0rx07+19uOKXDscutz/mtpnLVN7rEzGepTaDHUp2bF6HwFrgWSkZ2ju95bY4U5+xPPSZIWbjvmFDBUlonLC0aSFP6OXv7qJ12spK2EUTFycvOcgquM7MpZ46Yk6BPZDwFHJfAUcIwcOVJ16tRRWprzvwSEhobKGKNjx46V+n0JOAAAgN0lpmVa28+2HbNcMYdOl/geSecKpjjcOHqZVu5KLFVdpq85YHXGXvwitswjSnLzHJqwbJdTB97dlrRnzmc7BT0PTluv5PTyW5eksDcW/2q9z8x1BWt/OBwOPRG+yfoOY4+erZD3Lyzi15NWXQZ8uE5HTp9X3w8K1gUZMmerLmR7nmKE6ic7J0+bDp7Wr8dTnQKOp2bFVHXVXNAnsh8CjkrgKeDo27evOnTo4HJ81apVMsZo6dKlJX6/nJwcZWZm6plnnlFQUJAyMzOVm1uyP/x5mAEAQHWx/chZtRu7QgGjlun28StLtNhk0VEg4dEHS12PoutxfB5T+hElaZkX9Y9Pt1j3um38So/hTUZ2jp4udH7v99bo6OnyXXRz3f5T1v0HhW1SbpFpIAdPpVu/h/5Toit0BMXh5PO69c1IBYxapluDI3Xk9HlJ0tkiYc+gsE2VOmUGpRd3IlWpGRcVtPgXt+vMBIxaVtVVdEGfyH4IOCqBp4CjY8eOuueee1yO79q1S8YYzZgxo8TvFxwc7DKFpbj1PyQpKSlJcXFxTmXJkiU8zAAAoNpYuLVgikSn4Ejd+8GPemjaej0RvklD5mzVi1/EauSinxX8XZzejdijaav3a/b63zRs7lbrutcXlX0dj+T0LGvRzXZBK/Tr8ZJNdZEudd7vLTQSod/kaB07c/mw4mJuntO6JF1Dokr1/u6kXrio//59lEuHcRHFhicfRhXsKvPJ2tKHRZ5kXszV/R+us97nh7iTTq+nZ+XoL/8u2OZ3wIfrynWnHU/Ss3L0RczREk9xqukifk2wAsriwg0CDpQHAo5K4CngaNOmjQYMGOBy/NChQzLGaMqUKRVeP3eBSH7hYQYAANVF8HdxHjtHnsrjMzaV2wKdMYXW4+j93hptPnRpuP1vyeeVlJap9KycYhfB3Hgw2Vqw89LWq1uVXoI1NRwOh95esce6vuObkdp4ILnMn+nVhTu8GpmSlZOre96/tCZI+6AV1siK8jRyUUGIE7p8t9tzMi/m6rl5Bdvp3j1pbYVvI7vltzO6893V1nSiyCLBC4qXPxrncqXoqKGqRsBhPwQclaCyR3CUFCM4AACAHeTk5mne5iN6beHPeuHz7fr77C0aFLZJ/2/qOvWZtFbdJ65Sp+BItR2z3KnT1PeDH3X2fHa51qXwehzFlQ7jItQ1JEp3vbdG93+4To98stGpbu9E7Cl1h252oW10241doe93nij1Z4mMK1jr4u+zt1x2lMuW3844rZtQntu2Fh6pMyhsk7XYqjs5uXka/nVBGPLfoat0IOlcudUlX1ZOrkJX7LZ2lskvbcYs19KfS/+9X05a5kW9unCHgr+L8/g9XE782Qwt2Hr0slsiV6T8BX4vVxK93NmoshBw2A8BRyWo7DU4ygMPMwAAsLPsnDylZGQrIfVChawVkZfn0NA5W73qtBUt7cau0Dex8WWuw3c/n7B2Frlx9DLN2fBbie9xOj3LmjbQKThSJ1O962CO/man9XkW/3S8xO/rTtyJVLUPWmFNv/FmG9+8PIdCvi9YqLXLWz9oZ3z5bTm6OyFN/adEW/dvH7RC/1oaZ9Wz9ehl+npb6TcFKE7mxVw9PmOT9b4Lt5buPRwOhzXdJ/i7qvv/+vzv63KlPH935YE+kf0QcFQCTwHHiBEj3O6iMnHixDLvolIWPMwAAACe5eTm6Zf4VG04kKzIuJP69qd4zd98ROHRB/XByn0K+X6XRn/zi1768icNm7tVg8M3a9jcbfqpHHcgWb8/WbcU+tfx/lOi9fHaA16t6eFwOPT8vO2lCipSMy6qa0iUta5CSkbZRsikXrhobU/bevQybTzo/bQbh8OhaasL1ga5ZVxEia53JzfPobAfD1qLqgaMWqYHpq63RohsPJDsNCqhLFsYu3vvf87f7tTx7/n2amXllHwExt6T56x7dJsQVa6jbUqi8Ba/nkpl7M5TEvSJ7IeAoxJ4CjhiYmJkjNGkSZOsY1lZWQoMDFT37t0rsZbOeJgBAADs4dfjqeoa4rp44yOfbNRnmw4Xu6Xstz/FW+f+c/72End+v/v5hHX9yEU/l7r+DodDz35WsJ7G9DUHSnWfeZuPWNNI2gWtcFmc1FvHzmTosbCNTlNRPvhhr8tIoG2HzzitLVF4W93ScjgcTruM5G+RHDCqdCN0Ci8KGzBqWZUtjtp69OXDjYxs79eiqSz0ieyHgKMCTZs2TSEhIXrhhRdkjNEjjzyikJAQhYSEKDW14A+XQYMGycfHRyNHjlR4eLh69uwpHx8fRUdHV1ndeZgBAADs49S5LE1fc0B9C+3OUriD/rfZW7Roe7zO/b6lakLqBd0aHPn7dJCVOl1MCOKJw+HQ32cXbF272cM2t56ERx+07jF0ztZiF2j1xpIdx611TtqMWa6Xv/pJH63ar6U/n9Cvx1N13sOCrg6HQwu2HnUaEXP3pLUeR9zsjE/RH/9VsGjstNX7S113SfpoVUEg0X9KtM6cz7ZGtnQNWVniEKDw9JqyhEdlkZpx8bLhxtbDZyq9Xt6gT2Q/BBwVKCAgoNjdSQ4fPmydl5mZqREjRqh58+aqW7euunXrpsjIyKqruHiYAQAA7MjhcGh3Qpreidijnm+vdulItg9aoRc+3+40QqEsu4EcO5Ohm964NI2jz/trS7yQ5ZbfzqjN74FEr3dWKzXjYqnrkm/NniSPaz7cMTFKT4Rv0uhvftG/ow8paleifj2e6rSlcMCoZXpj8a9eBQq7E9Kctj99L3JPqaaCfLnlqNOUlPwFN5fsOF6qgOJw8nmXz/5Y2MYS16uotXuTFLp8t1IvuP6uTqZmqt/kaP3l35utKTX/83nsZQOO6oo+kf0QcMAtHmYAAAB7y8tzaNvhM3pj8a+6bbzrFJaAUcv06sIdZX6fGT8WjMD4YOU+r69LOpepbr9PwWg3doV+iS+/6ROxR8/qb7O3qPvEVV6t/VC4dJsQpR/3nSrR+x1IStcdEwumk4z/fleJQo4f4k5a0zi6vPWDDiSlW6/l5TmskRidgiPdBgvuFP69PDUrRgGjLq1vUpYQKTsnTx1/n5bzYZTraJVxS3613jPi10vBmTffeXVFn8h+CDjgFg8zAADAleNibp7W7k3Sqwt2WFMwer692uvOsic5uXka8PtOHYFjlztt1Zp5MVcHktK1Zk+S5m48rPHf79Izn21T/ynRTot0fh5Tfot0FnU+K0dxJ1L1/c4Tmrpqv15dsEMPT9+gTsGRLh3tF7+ILfWCqUdOn3caNTP221+8mm6z9fAZa8TJTW+scLvQ5g+FtvKdFLnXq/o8PH3DpZE1k9Zq3f5T1vVl2VI47kSqdZ+/z97i9NrZ89nWaJ6AUcv0yoJL4RkBByoTAQfc4mEGAAC4Ml3IztXGg8mlWnejOD8fS7FGIPR+b40eC9voNKLBU3llwY4q2d3D4XDozPlsbT9yRou2x2vLb2VfB+J4ygVrzYz8z7Z+f7K2HzmrXSfSdDj5vBLTMpWWeVEXc/O09+Q5K2hpM2a5Vu9JLLauD/0eWHQYF1HswrH5ElIvWHV4N2KPsnJyrUDptYWlXxB24bZj1n1vG7/S6fdWeCebgFHLdGtwpLJz8gg4UKkIOOAWDzMAAABKIvi7uMt2ZNsFrdC9H/yoIXO26s0lv+rrbceUU2R3ErtLTMvUvW4We71c+XrbMY/3Xb8/2Tr3raW7PJ47d+Nh69yd8SmSpGFzL+1U0zUkqtQLuRb9HR9PuSDp0kid/G2D2xVa/6TwTjvFlX9Hl333mYpCn8h+CDjgFg8zAAAASiI9K0d/nblZ3Seu0qOfbNSrC3Zo8sp9+s/2eG09fEaJaZll2iHFTk6nZ+mBqeu9Djc+Xnv5xUMdDocGh2++FCKMXaETv4cL7jwRvkkBo5apR+gqa5TF5zFHrPcrut5JYlqmluw4rk0HT+tEyoVif0+FF6ctvM7Ggq0FC6R+tumwAsdeWjg2f9RJcaU8FpWtSPSJ7IeAA27xMAMAAACll5fnUNyJVMUcOq21e5O04pcEfRMbr/mbj2jmukP6aNV+vb1ij779Kd7rKTrbj5y1woHR3+x0e87p9CxrutC/lhb8v/zxlIJpK1NXFSwQeiLlgst0ovyRNtNW77d2xsnLczhtoRsw6tKOMev2n1Kvdy6tPdJ94ipdzM3T059u8Rhs5Icf1R19Ivsh4IBbPMwAAABA9TN0zlZrzY64E647zxQeTRFz6LTTa/dNvjR1ZuDHl8KF1AsXrWPFlZ5vr9bSn0/o4Kl0l9fa/r7Fb9HpJoXrUFy5kF2yLYWrAn0i+yHggFs8zAAAAED1s+tEmksA8dKXP+mzTYcVdyJVf5+95fe1NlYqt8hUk4nLdytg1KXtYpPSMq0pLwGjlilo8S+K3ndK8zYf0YRlu9RvcnSx4cQ97691+vnmNyIUumK39X6ZF3P136Get+i1A/pE9kPAASfBwcEyxliFhxkAAACoXkYu+vmyIyRGf/OLy3UbDxYsVNpnUkFI8dy8bS5hSG6eQ1/EHNXt41c63bfNmOVatjNBN46+FKJMW73f7da6hXdcIeBAZSHggFs8zAAAAED1lJfn0PYjZxT240ENm7tNXd76wSVAiN53yuW67Jw8dXwz0um8P3+8wVpnw520zIvqU2jERv8p0ZKk5PQsZecUvwNObp7D2lmlaLlv8o9l/xIqAX0i+yHggFs8zAAAAIA9OBwOHTyVroVbj2n0N79oxo8Hi1249Ll526ygofd7a3Q6Peuy958Uude65i//3ux1vRLTMjVt9X61L7R1bPugFTqcfN7re1Ql+kT2Q8ABt3iYAQAAgCvPD3EnrTU6vA0aYo8W7N7ywcp9JX7P4V8XTKlJvVC9t4YtjD6R/RBwwC0eZgAAAODKFHciVakZ3gcNDodDE5bt0t9nbynRdfmS07P0P1/Eau7GwyW+tirRJ7IfAg64xcMMAAAAoCajT2Q/BBxwi4cZAAAAQE1Gn8h+CDjgFg8zAAAAgJqMPpH9EHDALR5mAAAAADUZfSL7IeCAWzzMAAAAAGoy+kT2Q8ABt3iYAQAAANRk9Insh4ADbvEwAwAAAKjJ6BPZDwEH3OJhBgAAAFCT0SeyHwIOuMXDDAAAAKAmo09kPwQccIuHGQAAAEBNRp/Ifgg44BYPMwAAAICajD6R/RBwwElwcLCMMVbhYQYAAABQExFw2A8BB9ziYQYAAABQk9Ensh8CDrjFwwwAAACgJqNPZD8EHHCLhxkAAABATUafyH4IOOAWDzMAAACAmow+kf0QcMAtHmYAAAAANRl9Ivsh4IBbPMwAAAAAajL6RPZDwAG3eJgBAAAA1GT0ieyHgANu8TADAAAAQblHYAAAFWNJREFUqMnoE9kPAQfc4mEGAAAAUJPRJ7IfAg64xcMMAAAAoCajT2Q/BBxwi4cZAAAAQE1Gn8h+CDjgVmxsrIwxWrJkieLi4igUCoVCoVAoFAqlRpUlS5bIGKPY2Niq7p7BSwQccCv/YaZQKBQKhUKhUCiUmlyWLFlS1d0zeImAA26lpKRoyZIlio2NrfLktHB6yogSSlUX2iKluhTaIqW6FNoipboU2iKlvEtsbKyWLFmilJSUqu6ewUsEHLCFuDjmv6F6oC2iuqAtorqgLaK6oC0CIOCALfAXFqoL2iKqC9oiqgvaIqoL2iIAAg7YAn9hobqgLaK6oC2iuqAtorqgLQIg4IAt8BcWqgvaIqoL2iKqC9oiqgvaIgACDthCUlKSgoODlZSUVNVVQQ1HW0R1QVtEdUFbRHVBWwRAwAEAAAAAAGyPgAMAAAAAANgeAQcAAAAAALA9Ag4AAAAAAGB7BBwAAAAAAMD2CDhQ7UVHR+vBBx9Uq1atVLduXTVr1kz9+/fXhg0b3J6/ceNG9erVS35+fmrWrJleeuklpaenV3KtcaVZtWqVhgwZonbt2snPz0+tW7fWsGHDlJCQ4PZ82iEqSkJCgkaNGqW7775b9evXlzFGa9euLfZ82iIqSlZWll5//XW1aNFCvr6+uuOOO7Ry5cqqrhauYOnp6XrzzTfVv39/NWrUSMYYzZkzx+25u3fvVv/+/VWvXj01atRITz31lE6dOlW5FQZQ6Qg4UO3NnDlTDz/8sCZMmKBZs2Zp0qRJ6ty5s2rXrq2IiAinc3fs2CFfX1/ddtttCgsLU1BQkOrWrav777+/imqPK0XXrl3VunVrvf7665o5c6bGjBmjBg0aqFmzZjp58qTTubRDVKS1a9fKGKN27dqpR48eHgMO2iIq0uDBg+Xj46MRI0YoPDxcPXr0kI+Pj9avX1/VVcMV6vDhwzLG6IYbbtDdd99dbMARHx+vpk2bqm3btvroo480ceJENWrUSJ07d1Z2dnblVxxApSHggC1lZGRYIzkKGzBggFq0aKG0tDTr2MyZM2WM0Q8//FDZ1cQVJDo6Wnl5eS7HjDEKCgpyOk47REU6d+6czpw5I0latGiRx4CDtoiKsmXLFhljNGnSJOtYZmam2rZtqx49elRhzXAly8rKsv5RYdu2bcUGHC+88IL8/Px09OhR61hUVJSMMQoPD6+s6gKoAgQcsK1bb71V3bt3t35OS0uTj4+PRo4c6XRedna26tevr2HDhlV2FVEDNG7cWI888oj1M+0QlclTwEFbREUaOXKk6tSp4xSeSVJoaKiMMTp27FgV1Qw1haeA47rrrtOgQYNcjrdv31733ntvJdQOQFUh4IBtpKWlKTk5WXv27NGYMWNkjNHYsWOt1zds2CBjjBYuXOhy7Z133qnbb7+9MquLGiA9PV1XX321nnvuOesY7RCVyVPAQVtERerbt686dOjgcnzVqlUyxmjp0qVVUCvUJMUFHMePH5cxRu+++67LNU899ZQaN25cSTUEUBUIOGAb/fv3lzFGxhhdffXVev7555WZmWm9nv8/+uvWrXO5dtCgQWrevHllVhc1QEhIiIwxWr16tXWMdojK5CngoC2iInXs2FH33HOPy/Fdu3bJGKMZM2ZUQa1QkxQXcOQfnzdvnss1I0eOlDFGWVlZlVRLAJWNgAOVKi8vT5mZmV4Vh8PhdO2OHTu0cuVKzZ49W3fddZeGDBnitBPAvHnzZIzRli1bXN73b3/7m/z9/Sv888EeytIO80VHR8vHx0ePP/6403HaIUqirG3RU8BBW0RFatOmjQYMGOBy/NChQzLGaMqUKVVQK9QkxQUc69atK3b02rhx42SMUUpKSiXVEkBlI+BApcpf/d+bsmfPnmLvk52drY4dO+rRRx+1jvGvlfBWWdvhnj171LhxY3Xp0kXnzp1zeo12iJIoa1tkBAeqCiM4UNUYwQHAHQIOVKqTJ09qzpw5XpXU1FSP9xozZoxq1aqlCxcuSGK+ObxXlnZ47NgxXX/99WrdurUSEhJc7k07REmU9c9E1uBAVWENDlQ11uAA4A4BB2zrlVdekTFGSUlJkqTU1FSPOwYMHTq0KqqJK8jp06d1880367rrrtP+/fvdnkM7RGXyFHDQFlGRRowY4XYXlYkTJ7KLCiqFp11Urr322mJ3UXE38gjAlYOAA9VefoBRWEpKiq6//npdf/31Tsfvv/9+tWjRwmnawKxZs2SMUURERIXXFVeu8+fP64477lCDBg20fft2j+fSDlFZPAUcEm0RFScmJkbGGE2aNMk6lpWVpcDAQKct3IGK4ing+Oc//yk/Pz+noC1/dFFYWFgl1hJAZSPgQLV3++2366GHHtLEiRM1c+ZMjRs3Tq1atVLt2rW1aNEip3NjY2NVt25d3XbbbQoLC1NQUJB8fX3Vr1+/Kqo9rhQPP/ywjDEaOnSo5s+f71QWL17sdC7tEBUtJCREISEhGjx4sNUu848VRltERRo0aJA1Sig8PFw9e/aUj4+PoqOjq7pquIJNmzZNISEheuGFF2SM0SOPPGL9+Zc/le/YsWNq0qSJ2rZtq6lTpyo0NFSNGjVSp06dWH8DuMIRcKDamz59uu688041bdpUPj4+uvbaa/Xggw+6XThPktavX6+ePXvK19dX1157rV588UWXhSCBkgoICCh28ceAgACX82mHqEieFiMtiraIipKZmakRI0aoefPmqlu3rrp166bIyMiqrhaucJ7+Pj58+LB1XlxcnPr166drrrlG//Vf/6Unn3xSiYmJVVdxAJWCgAMAAAAAANgeAQcAAAAAALA9Ag4AAAAAAGB7BBwAAAAAAMD2CDgAAAAAAIDtEXAAAAAAAADbI+AAAAAAAAC2R8ABAAAAAABsj4ADAAAAAADYHgEHAAAAAACwPQIOAAAAAABgewQcAAAA1cSQIUP0wAMPuH0tKyurzPdfvHix/P39dfbs2TLfCwCA6oaAAwCAUpozZ46MMVapW7eu2rVrpxdffFGJiYku5ycmJmr48OG66aab5Ofnp2uuuUa33367QkJClJKSYp3Xu3dvp/teddVVuvHGG/Xss8/q2LFjHutU9NriSnBwcHl/Hbb02Wefadq0aVVdDUnS3r17VadOHW3atMnpeExMjAIDA1WrVi3dfffdOnHihNvrv/76a/Xr109NmjTRVVddpZYtW2rw4MH68ccfrXMcDoduvvlmjRkzpkI/CwAAVYGAAwCAUsoPOMaPH6/58+dr5syZevrpp1W7dm21bt1aGRkZ1rlbt25V06ZN5evrq2eeeUZhYWEKCwvTsGHDVK9ePd13333Wub1791arVq00f/58zZ8/X7Nnz9bw4cNVr1493XDDDU73LWrlypXWdfPnz9fLL78sY4zGjh3rdHznzp0V+t3Yxb333qubbrqpqqshSXr++ef1xz/+0emYw+HQDTfcoP/93//Vd999pwcffFADBw50Oic3N1d//etfZYzRn/70J4WGhmr27NkaP368unTpImOMYmNjrfMnT54sf39/XbhwoVI+FwAAlYWAAwCAUsoPOLZt2+Z0/LXXXpMxRl9++aUkKSUlRS1btlSzZs20Z88el/skJiYqJCTE+rl3797q2LGjy3nTp0+XMUYrV670uo6LFi2SMUZr1671+ho78xT+uFNRAUdJ63HhwgX5+/trwoQJTsfj4+PVokUL6+fExEQ1bdrU6ZyQkBAZYzR69Gg5HA6Xe8+aNUs7duxwumetWrX0xRdflKiOAABUdwQcAACUUnEBx7Jly2SM0cSJEyVJ77zzjowxXncoiws4/vOf/8gYozVr1nhdR28CjtmzZ6tLly7y9fVV48aN9eSTTyohIcHpnO7du6tr166KjY1Vr1695Ofnp3bt2mnJkiWSpFWrVqlr167y9fVVhw4dnKZFSNKoUaNkjNGBAwc0cOBA1a9fX02bNtXw4cOVnZ1dpjpt3rxZvXr1kq+vr0aNGmV9V/fff7+aN2+uq6++WoGBgXr77beVl5fndH3RqTv5YUdYWJiMMTp58qTTe0ZERMgYo82bN3tVD0launSpevTooWuuuUYNGzbUQw89pL179zrdd8WKFTLGKCYmxul4dna2GjRooJkzZ+rQoUMaMWKEevToYb1+7tw5NWjQQJ07d3b6bJfToUMHPf74416fDwCAHRBwAABQSsUFHB999JGMMZoxY4YkqWfPnvLz83PbkXend+/euvnmm5WcnKzk5GQlJCRo9erV6tixowIDA72+j3T5gOONN95Q7dq19eSTTyosLEzBwcFq1KiRAgMDlZ6ebp3XvXt33XDDDWrZsqVGjx6tqVOnqn379rrqqqu0YMECNW/eXOPHj9fkyZPVvHlzNWnSxGkKRH7A0alTJw0cOFDTp0/X4MGDZYzRs88+W+o6tWrVSk2aNNErr7yi8PBwLVu2TJI0YMAADR48WO+//74++eQTDRw4UMYYvfHGG9b1kZGR6tixo1q0aGFN3Vm6dKmkkgccxdVj5syZMsbogQce0LRp0/T2229b5x4/ftzpM9epU8fttJG5c+fq6quvljFG1113nbZu3Wq9tnTpUhlj9N5777n9/RbnqaeeUsuWLUt0DQAA1R0BBwAApZQfcKxatUrJycmKj4/XggUL1KRJE/n5+Vkd2EaNGqlz585e37e4hUI7dOig3377rUR19BRw7Nu3T7Vr19YHH3zgdDw2NtbleP5oh2+//dY6tnPnThljVKdOHacpEN99952MMfrqq6+sY/kBR9FRA0OHDlWtWrWsEQ2lqdPcuXNdPpu7oODpp59Ww4YNlZOTYx0rbopKSQMOd/VISUlR/fr19dJLLzkdj4+Pdzn+2GOPeQwckpKSFBMT4xTwSNK7774rY4wiIiKKvdadN998U8YYpaWlleg6AACqMwIOAABKqeguKvklICBAkZGR1nl16tTRnXfe6fV9e/furRtvvFFRUVGKiopSRESEPvzwQ/3hD3/QTTfdpFOnTnl9L08BR2hoqOrUqaMjR45Yo0XyS5s2bZy2K+3evbuaNGnicg9fX1917drV6VhiYqLTFB2pIOCIjo52OnfHjh0yxmjKlCmlqlODBg2Um5vr8Ts4d+6ckpOTNWvWLBljnKaHlFfA4a4eX375pYwx2rRpk8tn6d27t2699Vbr3D59+jj97K2goCAZY7Rhw4YSXTdlyhQZY3To0KESvycAANUVAQcAAKWUH3B8/PHHioqK0tq1a7V7926XtRBKM4LD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\" width=\"900\">" | |
|
1983 | 3614 | ], |
|
1984 | 3615 | "text/plain": [ |
|
1985 | 3616 | "<IPython.core.display.HTML object>" |
@@ -1990,16 +3621,22 | |||
|
1990 | 3621 | } |
|
1991 | 3622 | ], |
|
1992 | 3623 | "source": [ |
|
1993 | "%%HTML\n", | |
|
1994 | "<video width=\"90%\" style=\"display:block; margin: 0 auto;\" controls src=\"https://hephaistos.lpp.polytechnique.fr/data/LFR/PPBI_06_2018/minus30_to_20_transition.webm\" type=\"video/webm\">" | |
|
3624 | "values = np.zeros(res.SWFCount())\n", | |
|
3625 | "T = np.zeros(res.SWFCount())\n", | |
|
3626 | "values2 = np.zeros(res.SWFCount())\n", | |
|
3627 | "for i in range(0,res.SWFCount()):\n", | |
|
3628 | " spec = TF.fft(res.SWF(0,i)[\"E1\"], TF.LFR_Fs0, np.hanning(2048))\n", | |
|
3629 | " values[i] = spec[\"mod\"][200:].mean()\n", | |
|
3630 | " T[i] = get_temperature_at(HK_TEMP_df,times[\"SWF0\"][i][\"Time\"])\n", | |
|
3631 | " \n", | |
|
3632 | "plt.figure(figsize=(9,6))\n", | |
|
3633 | "plt.suptitle(\"Average noise Vs Temperature\")\n", | |
|
3634 | "plt.xlabel(\"PCB Temperature(°C)\")\n", | |
|
3635 | "plt.ylabel(\"Average noise\")\n", | |
|
3636 | "plt.plot(T,values)\n", | |
|
3637 | "plt.semilogy()\n", | |
|
3638 | "plt.show()" | |
|
1995 | 3639 | ] |
|
1996 | }, | |
|
1997 | { | |
|
1998 | "cell_type": "code", | |
|
1999 | "execution_count": null, | |
|
2000 | "metadata": {}, | |
|
2001 | "outputs": [], | |
|
2002 | "source": [] | |
|
2003 | 3640 | } |
|
2004 | 3641 | ], |
|
2005 | 3642 | "metadata": { |
@@ -2021,28 +3658,20 | |||
|
2021 | 3658 | "version": "3.6.5" |
|
2022 | 3659 | }, |
|
2023 | 3660 | "toc": { |
|
2024 | "colors": { | |
|
2025 | "hover_highlight": "#DAA520", | |
|
2026 | "navigate_num": "#000000", | |
|
2027 | "navigate_text": "#333333", | |
|
2028 | "running_highlight": "#FF0000", | |
|
2029 | "selected_highlight": "#FFD700", | |
|
2030 | "sidebar_border": "#EEEEEE", | |
|
2031 | "wrapper_background": "#FFFFFF" | |
|
2032 | }, | |
|
2033 | "moveMenuLeft": true, | |
|
3661 | "base_numbering": 1, | |
|
2034 | 3662 | "nav_menu": { |
|
2035 | 3663 | "height": "12px", |
|
2036 | 3664 | "width": "252px" |
|
2037 | 3665 | }, |
|
2038 | "navigate_menu": true, | |
|
2039 | 3666 | "number_sections": true, |
|
2040 | 3667 | "sideBar": true, |
|
2041 | "threshold": 4, | |
|
3668 | "skip_h1_title": false, | |
|
3669 | "title_cell": "Table of Contents", | |
|
3670 | "title_sidebar": "Contents", | |
|
2042 | 3671 | "toc_cell": false, |
|
3672 | "toc_position": {}, | |
|
2043 | 3673 | "toc_section_display": "block", |
|
2044 |
"toc_window_display": false |
|
|
2045 | "widenNotebook": false | |
|
3674 | "toc_window_display": false | |
|
2046 | 3675 | }, |
|
2047 | 3676 | "varInspector": { |
|
2048 | 3677 | "cols": { |
General Comments 0
You need to be logged in to leave comments.
Login now