You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1064 lines
168KB

  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "metadata": {},
  6. "source": [
  7. "# Pyrocko Notebook\n",
  8. "## Double Couple Waveform Inversion (The 2009 Aquila Earthquake)\n",
  9. "\n",
  10. "In this Jupyter-notebook we look at teleseismic waveforms of the 2009 Aquila Earthquake and setup `pyrocko.gf` forward modelling to invert for the double couple mechanism of the event. We will use `pyrocko` to handle the seismic data and execute the forward modelling based on pre-calculated Green's function stores, `scipy` delivers the optimisation algorithms.\n",
  11. "Besides this Notebook you will also need to download the utils_nb.py file from this repository.\n",
  12. "\n",
  13. "_Authors:_\n",
  14. "Andreas Steinberg, Marius Isken\n",
  15. "\n",
  16. "-edited August 2020 "
  17. ]
  18. },
  19. {
  20. "cell_type": "code",
  21. "execution_count": 1,
  22. "metadata": {},
  23. "outputs": [],
  24. "source": [
  25. "%matplotlib inline\n",
  26. "import time\n",
  27. "import os\n",
  28. "import scipy\n",
  29. "import numpy as num\n",
  30. "import matplotlib.pyplot as plt\n",
  31. "import chart_studio.plotly as py\n",
  32. "from collections import OrderedDict\n",
  33. "\n",
  34. "import utils_nb\n",
  35. "\n",
  36. "from pyrocko import gf, trace\n",
  37. "from pyrocko import moment_tensor as mtm\n",
  38. "from pyrocko.gf import ws, LocalEngine, Target, DCSource\n",
  39. "from pyrocko import util, pile, model, config, trace, io, pile, catalog\n",
  40. "\n",
  41. "km = 1000."
  42. ]
  43. },
  44. {
  45. "cell_type": "markdown",
  46. "metadata": {},
  47. "source": [
  48. "### Optimisation Parameters\n",
  49. "Setup of the optimisation parameters, as well as boundaries for the source parameters."
  50. ]
  51. },
  52. {
  53. "cell_type": "code",
  54. "execution_count": 2,
  55. "metadata": {},
  56. "outputs": [],
  57. "source": [
  58. "component = 'Z'\n",
  59. "f_low = 0.1 # Hz, for a lowpass filter\n",
  60. "taper = trace.CosFader(xfade=2.0) # Cosine taper, 2s fade\n",
  61. "\n",
  62. "phase = 'P' # Phase to fit\n",
  63. "tmin_fit = 15. # [s] to fit before synthetic phase onset (from GFStore)\n",
  64. "tmax_fit = 25. # [s] ... after\n",
  65. "\n",
  66. "bounds = OrderedDict([\n",
  67. " ('north_shift', (-20.*km, 20.*km)),\n",
  68. " ('east_shift', (-20.*km, 20.*km)),\n",
  69. " ('depth', (0.5*km, 14.*km)),\n",
  70. " ('magnitude', (6.2, 6.4)),\n",
  71. " ('strike', (120., 140.)),\n",
  72. " ('dip', (40., 60.)),\n",
  73. " ('rake', (-100, -50.)),\n",
  74. " ('timeshift', (-6.5, 2.)),\n",
  75. " ])"
  76. ]
  77. },
  78. {
  79. "cell_type": "markdown",
  80. "metadata": {},
  81. "source": [
  82. "### Load the Waveforms\n",
  83. "We download the instrument-corrected seismic waveforms and use a `pyrocko.pile` to manage the data."
  84. ]
  85. },
  86. {
  87. "cell_type": "code",
  88. "execution_count": 3,
  89. "metadata": {
  90. "scrolled": true
  91. },
  92. "outputs": [
  93. {
  94. "name": "stderr",
  95. "output_type": "stream",
  96. "text": [
  97. "selecting files... done. 58 files selected.\n",
  98. "Looking at files [----------------------------------------] 100% Time: 0:00:00\n",
  99. "Scanning files [------------------------------------------] 100% Time: 0:00:00\n",
  100. "Cannot read file '/home/asteinbe/src/pyrocko-notebooks-vanilla/data/aquila_realdata/stations_short.txt': No SEED data detected (file: /home/asteinbe/src/pyrocko-notebooks-vanilla/data/aquila_realdata/stations_short.txt)\n",
  101. "The following file caused problems and will be ignored:\n",
  102. "/home/asteinbe/src/pyrocko-notebooks-vanilla/data/aquila_realdata/stations_short.txt\n"
  103. ]
  104. }
  105. ],
  106. "source": [
  107. "# Download the instrument-corrected 2009 Aquila Earthquake data\n",
  108. "data_path = utils_nb.download_dir('aquila_realdata/')\n",
  109. "data = pile.make_pile([data_path])\n",
  110. "traces = data.all() # retrieves the raw waveform data as a 2D `numpy.array`.\n",
  111. "\n",
  112. "for tr in traces:\n",
  113. " tr.lowpass(4, f_low)"
  114. ]
  115. },
  116. {
  117. "cell_type": "markdown",
  118. "metadata": {},
  119. "source": [
  120. "### Initialize Forward Modelling Engine (Seismosizer)\n",
  121. "We download the precalculated Green's function database (`Store`) *global_2s_25km* from http://kinherd.org"
  122. ]
  123. },
  124. {
  125. "cell_type": "code",
  126. "execution_count": 4,
  127. "metadata": {},
  128. "outputs": [],
  129. "source": [
  130. "store_id = 'global_2s_25km'\n",
  131. "if not os.path.exists(store_id):\n",
  132. " ws.download_gf_store(site='kinherd', store_id=store_id)"
  133. ]
  134. },
  135. {
  136. "cell_type": "markdown",
  137. "metadata": {},
  138. "source": [
  139. "Now we fire up the `engine` to forward model synthetic seismograms on our _global_2s_25km_ GF database."
  140. ]
  141. },
  142. {
  143. "cell_type": "code",
  144. "execution_count": 5,
  145. "metadata": {},
  146. "outputs": [],
  147. "source": [
  148. "engine = gf.LocalEngine(store_superdirs=['.']) # The Path to where the gf_store(s)\n",
  149. "store = engine.get_store(store_id) # Load the store."
  150. ]
  151. },
  152. {
  153. "cell_type": "markdown",
  154. "metadata": {},
  155. "source": [
  156. "### Get GlobalCMT Start Model\n",
  157. "We use the GlobalCMT catalog to search for the 2009 Aquila Earthquake and initalize a source for the starting model."
  158. ]
  159. },
  160. {
  161. "cell_type": "code",
  162. "execution_count": 6,
  163. "metadata": {},
  164. "outputs": [],
  165. "source": [
  166. "tmin = util.str_to_time('2009-04-06 00:00:00') # beginning time of query\n",
  167. "tmax = util.str_to_time('2009-04-06 05:59:59') # ending time of query\n",
  168. "event = catalog.GlobalCMT().get_events(\n",
  169. " time_range=(tmin, tmax),\n",
  170. " magmin=6.)[0]\n",
  171. "\n",
  172. "base_source = gf.MTSource.from_pyrocko_event(event)"
  173. ]
  174. },
  175. {
  176. "cell_type": "markdown",
  177. "metadata": {},
  178. "source": [
  179. "### Station and _Target_ Setup\n",
  180. "We use the term _Target_ for a single component of a single station."
  181. ]
  182. },
  183. {
  184. "cell_type": "code",
  185. "execution_count": 7,
  186. "metadata": {},
  187. "outputs": [],
  188. "source": [
  189. "stations_list = model.load_stations('data/aquila_realdata/stations_short.txt')\n",
  190. "for s in stations_list:\n",
  191. " s.set_channels_by_name(*component.split())"
  192. ]
  193. },
  194. {
  195. "cell_type": "markdown",
  196. "metadata": {},
  197. "source": [
  198. "Next we define the `Target` - where to calculate the synthetic seismogram."
  199. ]
  200. },
  201. {
  202. "cell_type": "code",
  203. "execution_count": 8,
  204. "metadata": {},
  205. "outputs": [],
  206. "source": [
  207. "targets=[]\n",
  208. "for s in stations_list:\n",
  209. " target = Target(\n",
  210. " lat=s.lat,\n",
  211. " lon=s.lon,\n",
  212. " store_id=store_id, # The gf-store to be used for this target,\n",
  213. " interpolation='multilinear', # Interpolation method between GFStore nodes\n",
  214. " quantity='displacement',\n",
  215. " codes=s.nsl() + ('BH' + component,))\n",
  216. " targets.append(target)"
  217. ]
  218. },
  219. {
  220. "cell_type": "markdown",
  221. "metadata": {},
  222. "source": [
  223. "### Objective Function\n",
  224. "Now the objective function that will be called by `scipy.optimize`:"
  225. ]
  226. },
  227. {
  228. "cell_type": "code",
  229. "execution_count": 9,
  230. "metadata": {},
  231. "outputs": [],
  232. "source": [
  233. "source = gf.DCSource(\n",
  234. " lat=event.lat,\n",
  235. " lon=event.lon)\n",
  236. "\n",
  237. "def update_source(params):\n",
  238. " s = source\n",
  239. " s.north_shift = float(params[0])\n",
  240. " s.east_shift = float(params[1])\n",
  241. " s.depth = float(params[2])\n",
  242. " s.magnitude = float(params[3])\n",
  243. " s.strike = float(params[4])\n",
  244. " s.dip = float(params[5])\n",
  245. " s.rake = float(params[6])\n",
  246. " s.time = float(event.time - params[7])\n",
  247. " return source\n",
  248. "\n",
  249. "def process_trace(trace, tmin, tmax, lowpass=False, inplace=True):\n",
  250. " if lowpass:\n",
  251. " trace.lowpass(4, f_low)\n",
  252. " trace = trace.chop(tmin, tmax, inplace=inplace)\n",
  253. " trace.taper(taper)\n",
  254. " return trace\n",
  255. "\n",
  256. "iiter = 0\n",
  257. "\n",
  258. "def trace_fit(params, line=None):\n",
  259. " global iiter\n",
  260. " update_source(params)\n",
  261. "\n",
  262. " # Forward model synthetic seismograms\n",
  263. " response = engine.process(source, targets)\n",
  264. " syn_traces = response.pyrocko_traces()\n",
  265. "\n",
  266. " misfits = 0.\n",
  267. " norms = 0.\n",
  268. "\n",
  269. " for obs, syn, target in zip(traces, syn_traces, targets):\n",
  270. " syn_phs = store.t(phase, base_source, target)\n",
  271. " \n",
  272. " tmin = base_source.time + syn_phs - tmin_fit # start before theor. arrival\n",
  273. " tmax = base_source.time + syn_phs + tmax_fit # end after theor. arrival\n",
  274. " \n",
  275. " syn = process_trace(syn, tmin, tmax)\n",
  276. " obs = process_trace(obs, tmin, tmax, lowpass=False, inplace=True)\n",
  277. "\n",
  278. " misfits += num.sqrt(num.sum((obs.ydata - syn.ydata)**2))\n",
  279. " norms += num.sqrt(num.sum(obs.ydata**2))\n",
  280. " \n",
  281. " misfit = num.sqrt(misfits**2 / norms**2)\n",
  282. " \n",
  283. " iiter += 1\n",
  284. "\n",
  285. " if line:\n",
  286. " data = {\n",
  287. " 'y': [misfit],\n",
  288. " 'x': [iiter],\n",
  289. " }\n",
  290. " line.data_source.stream(data)\n",
  291. "\n",
  292. " return misfit"
  293. ]
  294. },
  295. {
  296. "cell_type": "markdown",
  297. "metadata": {},
  298. "source": [
  299. "#### Running the optimization and plotting of the Convergence\n",
  300. "For plotting we use bokeh (which you might need to install: `pip3 install bokeh`) \n",
  301. "Jupyter Lab also requires the Bokeh extension: `jupyter labextension install jupyterlab_bokeh` \n",
  302. "More info at https://bokeh.pydata.org/en/latest/docs/user_guide/notebook.html"
  303. ]
  304. },
  305. {
  306. "cell_type": "code",
  307. "execution_count": 10,
  308. "metadata": {},
  309. "outputs": [
  310. {
  311. "data": {
  312. "text/html": [
  313. "\n",
  314. " <div class=\"bk-root\">\n",
  315. " <a href=\"https://bokeh.org\" target=\"_blank\" class=\"bk-logo bk-logo-small bk-logo-notebook\"></a>\n",
  316. " <span id=\"1001\">Loading BokehJS ...</span>\n",
  317. " </div>"
  318. ]
  319. },
  320. "metadata": {},
  321. "output_type": "display_data"
  322. },
  323. {
  324. "data": {
  325. "application/javascript": [
  326. "\n",
  327. "(function(root) {\n",
  328. " function now() {\n",
  329. " return new Date();\n",
  330. " }\n",
  331. "\n",
  332. " var force = true;\n",
  333. "\n",
  334. " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n",
  335. " root._bokeh_onload_callbacks = [];\n",
  336. " root._bokeh_is_loading = undefined;\n",
  337. " }\n",
  338. "\n",
  339. " var JS_MIME_TYPE = 'application/javascript';\n",
  340. " var HTML_MIME_TYPE = 'text/html';\n",
  341. " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n",
  342. " var CLASS_NAME = 'output_bokeh rendered_html';\n",
  343. "\n",
  344. " /**\n",
  345. " * Render data to the DOM node\n",
  346. " */\n",
  347. " function render(props, node) {\n",
  348. " var script = document.createElement(\"script\");\n",
  349. " node.appendChild(script);\n",
  350. " }\n",
  351. "\n",
  352. " /**\n",
  353. " * Handle when an output is cleared or removed\n",
  354. " */\n",
  355. " function handleClearOutput(event, handle) {\n",
  356. " var cell = handle.cell;\n",
  357. "\n",
  358. " var id = cell.output_area._bokeh_element_id;\n",
  359. " var server_id = cell.output_area._bokeh_server_id;\n",
  360. " // Clean up Bokeh references\n",
  361. " if (id != null && id in Bokeh.index) {\n",
  362. " Bokeh.index[id].model.document.clear();\n",
  363. " delete Bokeh.index[id];\n",
  364. " }\n",
  365. "\n",
  366. " if (server_id !== undefined) {\n",
  367. " // Clean up Bokeh references\n",
  368. " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n",
  369. " cell.notebook.kernel.execute(cmd, {\n",
  370. " iopub: {\n",
  371. " output: function(msg) {\n",
  372. " var id = msg.content.text.trim();\n",
  373. " if (id in Bokeh.index) {\n",
  374. " Bokeh.index[id].model.document.clear();\n",
  375. " delete Bokeh.index[id];\n",
  376. " }\n",
  377. " }\n",
  378. " }\n",
  379. " });\n",
  380. " // Destroy server and session\n",
  381. " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n",
  382. " cell.notebook.kernel.execute(cmd);\n",
  383. " }\n",
  384. " }\n",
  385. "\n",
  386. " /**\n",
  387. " * Handle when a new output is added\n",
  388. " */\n",
  389. " function handleAddOutput(event, handle) {\n",
  390. " var output_area = handle.output_area;\n",
  391. " var output = handle.output;\n",
  392. "\n",
  393. " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n",
  394. " if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n",
  395. " return\n",
  396. " }\n",
  397. "\n",
  398. " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
  399. "\n",
  400. " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n",
  401. " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n",
  402. " // store reference to embed id on output_area\n",
  403. " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
  404. " }\n",
  405. " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
  406. " var bk_div = document.createElement(\"div\");\n",
  407. " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
  408. " var script_attrs = bk_div.children[0].attributes;\n",
  409. " for (var i = 0; i < script_attrs.length; i++) {\n",
  410. " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
  411. " }\n",
  412. " // store reference to server id on output_area\n",
  413. " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
  414. " }\n",
  415. " }\n",
  416. "\n",
  417. " function register_renderer(events, OutputArea) {\n",
  418. "\n",
  419. " function append_mime(data, metadata, element) {\n",
  420. " // create a DOM node to render to\n",
  421. " var toinsert = this.create_output_subarea(\n",
  422. " metadata,\n",
  423. " CLASS_NAME,\n",
  424. " EXEC_MIME_TYPE\n",
  425. " );\n",
  426. " this.keyboard_manager.register_events(toinsert);\n",
  427. " // Render to node\n",
  428. " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
  429. " render(props, toinsert[toinsert.length - 1]);\n",
  430. " element.append(toinsert);\n",
  431. " return toinsert\n",
  432. " }\n",
  433. "\n",
  434. " /* Handle when an output is cleared or removed */\n",
  435. " events.on('clear_output.CodeCell', handleClearOutput);\n",
  436. " events.on('delete.Cell', handleClearOutput);\n",
  437. "\n",
  438. " /* Handle when a new output is added */\n",
  439. " events.on('output_added.OutputArea', handleAddOutput);\n",
  440. "\n",
  441. " /**\n",
  442. " * Register the mime type and append_mime function with output_area\n",
  443. " */\n",
  444. " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
  445. " /* Is output safe? */\n",
  446. " safe: true,\n",
  447. " /* Index of renderer in `output_area.display_order` */\n",
  448. " index: 0\n",
  449. " });\n",
  450. " }\n",
  451. "\n",
  452. " // register the mime type if in Jupyter Notebook environment and previously unregistered\n",
  453. " if (root.Jupyter !== undefined) {\n",
  454. " var events = require('base/js/events');\n",
  455. " var OutputArea = require('notebook/js/outputarea').OutputArea;\n",
  456. "\n",
  457. " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
  458. " register_renderer(events, OutputArea);\n",
  459. " }\n",
  460. " }\n",
  461. "\n",
  462. " \n",
  463. " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n",
  464. " root._bokeh_timeout = Date.now() + 5000;\n",
  465. " root._bokeh_failed_load = false;\n",
  466. " }\n",
  467. "\n",
  468. " var NB_LOAD_WARNING = {'data': {'text/html':\n",
  469. " \"<div style='background-color: #fdd'>\\n\"+\n",
  470. " \"<p>\\n\"+\n",
  471. " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
  472. " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
  473. " \"</p>\\n\"+\n",
  474. " \"<ul>\\n\"+\n",
  475. " \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
  476. " \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
  477. " \"</ul>\\n\"+\n",
  478. " \"<code>\\n\"+\n",
  479. " \"from bokeh.resources import INLINE\\n\"+\n",
  480. " \"output_notebook(resources=INLINE)\\n\"+\n",
  481. " \"</code>\\n\"+\n",
  482. " \"</div>\"}};\n",
  483. "\n",
  484. " function display_loaded() {\n",
  485. " var el = document.getElementById(\"1001\");\n",
  486. " if (el != null) {\n",
  487. " el.textContent = \"BokehJS is loading...\";\n",
  488. " }\n",
  489. " if (root.Bokeh !== undefined) {\n",
  490. " if (el != null) {\n",
  491. " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n",
  492. " }\n",
  493. " } else if (Date.now() < root._bokeh_timeout) {\n",
  494. " setTimeout(display_loaded, 100)\n",
  495. " }\n",
  496. " }\n",
  497. "\n",
  498. "\n",
  499. " function run_callbacks() {\n",
  500. " try {\n",
  501. " root._bokeh_onload_callbacks.forEach(function(callback) {\n",
  502. " if (callback != null)\n",
  503. " callback();\n",
  504. " });\n",
  505. " } finally {\n",
  506. " delete root._bokeh_onload_callbacks\n",
  507. " }\n",
  508. " console.debug(\"Bokeh: all callbacks have finished\");\n",
  509. " }\n",
  510. "\n",
  511. " function load_libs(css_urls, js_urls, callback) {\n",
  512. " if (css_urls == null) css_urls = [];\n",
  513. " if (js_urls == null) js_urls = [];\n",
  514. "\n",
  515. " root._bokeh_onload_callbacks.push(callback);\n",
  516. " if (root._bokeh_is_loading > 0) {\n",
  517. " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
  518. " return null;\n",
  519. " }\n",
  520. " if (js_urls == null || js_urls.length === 0) {\n",
  521. " run_callbacks();\n",
  522. " return null;\n",
  523. " }\n",
  524. " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
  525. " root._bokeh_is_loading = css_urls.length + js_urls.length;\n",
  526. "\n",
  527. " function on_load() {\n",
  528. " root._bokeh_is_loading--;\n",
  529. " if (root._bokeh_is_loading === 0) {\n",
  530. " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n",
  531. " run_callbacks()\n",
  532. " }\n",
  533. " }\n",
  534. "\n",
  535. " function on_error() {\n",
  536. " console.error(\"failed to load \" + url);\n",
  537. " }\n",
  538. "\n",
  539. " for (var i = 0; i < css_urls.length; i++) {\n",
  540. " var url = css_urls[i];\n",
  541. " const element = document.createElement(\"link\");\n",
  542. " element.onload = on_load;\n",
  543. " element.onerror = on_error;\n",
  544. " element.rel = \"stylesheet\";\n",
  545. " element.type = \"text/css\";\n",
  546. " element.href = url;\n",
  547. " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n",
  548. " document.body.appendChild(element);\n",
  549. " }\n",
  550. "\n",
  551. " for (var i = 0; i < js_urls.length; i++) {\n",
  552. " var url = js_urls[i];\n",
  553. " var element = document.createElement('script');\n",
  554. " element.onload = on_load;\n",
  555. " element.onerror = on_error;\n",
  556. " element.async = false;\n",
  557. " element.src = url;\n",
  558. " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
  559. " document.head.appendChild(element);\n",
  560. " }\n",
  561. " };var element = document.getElementById(\"1001\");\n",
  562. " if (element == null) {\n",
  563. " console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n",
  564. " return false;\n",
  565. " }\n",
  566. "\n",
  567. " function inject_raw_css(css) {\n",
  568. " const element = document.createElement(\"style\");\n",
  569. " element.appendChild(document.createTextNode(css));\n",
  570. " document.body.appendChild(element);\n",
  571. " }\n",
  572. "\n",
  573. " \n",
  574. " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.4.0.min.js\"];\n",
  575. " var css_urls = [];\n",
  576. " \n",
  577. "\n",
  578. " var inline_js = [\n",
  579. " function(Bokeh) {\n",
  580. " Bokeh.set_log_level(\"info\");\n",
  581. " },\n",
  582. " function(Bokeh) {\n",
  583. " \n",
  584. " \n",
  585. " }\n",
  586. " ];\n",
  587. "\n",
  588. " function run_inline_js() {\n",
  589. " \n",
  590. " if (root.Bokeh !== undefined || force === true) {\n",
  591. " \n",
  592. " for (var i = 0; i < inline_js.length; i++) {\n",
  593. " inline_js[i].call(root, root.Bokeh);\n",
  594. " }\n",
  595. " if (force === true) {\n",
  596. " display_loaded();\n",
  597. " }} else if (Date.now() < root._bokeh_timeout) {\n",
  598. " setTimeout(run_inline_js, 100);\n",
  599. " } else if (!root._bokeh_failed_load) {\n",
  600. " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
  601. " root._bokeh_failed_load = true;\n",
  602. " } else if (force !== true) {\n",
  603. " var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n",
  604. " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
  605. " }\n",
  606. "\n",
  607. " }\n",
  608. "\n",
  609. " if (root._bokeh_is_loading === 0) {\n",
  610. " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
  611. " run_inline_js();\n",
  612. " } else {\n",
  613. " load_libs(css_urls, js_urls, function() {\n",
  614. " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n",
  615. " run_inline_js();\n",
  616. " });\n",
  617. " }\n",
  618. "}(window));"
  619. ],
  620. "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"<div style='background-color: #fdd'>\\n\"+\n \"<p>\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"</p>\\n\"+\n \"<ul>\\n\"+\n \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n \"<li>use INLINE resources instead, as so:</li>\\n\"+\n \"</ul>\\n\"+\n \"<code>\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"</code>\\n\"+\n \"</div>\"}};\n\n function display_loaded() {\n var el = document.getElementById(\"1001\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };var element = document.getElementById(\"1001\");\n if (element == null) {\n console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n return false;\n }\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n \n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.4.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.4.0.min.js\"];\n var css_urls = [];\n \n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n function(Bokeh) {\n \n \n }\n ];\n\n function run_inline_js() {\n \n if (root.Bokeh !== undefined || force === true) {\n \n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));"
  621. },
  622. "metadata": {},
  623. "output_type": "display_data"
  624. },
  625. {
  626. "data": {
  627. "text/html": [
  628. "\n",
  629. "\n",
  630. "\n",
  631. "\n",
  632. "\n",
  633. "\n",
  634. " <div class=\"bk-root\" id=\"b0f760e3-7e26-4182-b7f5-e73913f84ae7\" data-root-id=\"1002\"></div>\n"
  635. ]
  636. },
  637. "metadata": {},
  638. "output_type": "display_data"
  639. },
  640. {
  641. "data": {
  642. "application/javascript": [
  643. "(function(root) {\n",
  644. " function embed_document(root) {\n",
  645. " \n",
  646. " var docs_json = {\"87f47ca5-9dab-48d5-9c6a-cec201e5a1ba\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1013\",\"type\":\"LinearAxis\"}],\"center\":[{\"id\":\"1017\",\"type\":\"Grid\"},{\"id\":\"1022\",\"type\":\"Grid\"}],\"left\":[{\"id\":\"1018\",\"type\":\"LinearAxis\"}],\"plot_height\":300,\"plot_width\":800,\"renderers\":[{\"id\":\"1039\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1003\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1029\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1005\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1009\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1007\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"1011\",\"type\":\"LinearScale\"}},\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"ticker\":{\"id\":\"1014\",\"type\":\"BasicTicker\"}},\"id\":\"1017\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1045\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis_label\":\"Misfit\",\"formatter\":{\"id\":\"1043\",\"type\":\"BasicTickFormatter\"},\"ticker\":{\"id\":\"1019\",\"type\":\"BasicTicker\"}},\"id\":\"1018\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1046\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1019\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1047\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1038\",\"type\":\"Scatter\"},{\"attributes\":{\"dimension\":1,\"ticker\":{\"id\":\"1019\",\"type\":\"BasicTicker\"}},\"id\":\"1022\",\"type\":\"Grid\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1048\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1023\",\"type\":\"PanTool\"},{\"id\":\"1024\",\"type\":\"WheelZoomTool\"},{\"id\":\"1025\",\"type\":\"BoxZoomTool\"},{\"id\":\"1026\",\"type\":\"SaveTool\"},{\"id\":\"1027\",\"type\":\"ResetTool\"},{\"id\":\"1028\",\"type\":\"HelpTool\"}]},\"id\":\"1029\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1043\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1023\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"overlay\":{\"id\":\"1048\",\"type\":\"BoxAnnotation\"}},\"id\":\"1025\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1026\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1009\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1027\",\"type\":\"ResetTool\"},{\"attributes\":{\"text\":\"SciPy Optimisation Progress\"},\"id\":\"1003\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1028\",\"type\":\"HelpTool\"},{\"attributes\":{\"data_source\":{\"id\":\"1036\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1037\",\"type\":\"Scatter\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1038\",\"type\":\"Scatter\"},\"selection_glyph\":null,\"view\":{\"id\":\"1040\",\"type\":\"CDSView\"}},\"id\":\"1039\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"callback\":null},\"id\":\"1005\",\"type\":\"DataRange1d\"},{\"attributes\":{\"callback\":null},\"id\":\"1007\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1011\",\"type\":\"LinearScale\"},{\"attributes\":{\"source\":{\"id\":\"1036\",\"type\":\"ColumnDataSource\"}},\"id\":\"1040\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":[],\"y\":[]},\"selected\":{\"id\":\"1046\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1047\",\"type\":\"UnionRenderers\"}},\"id\":\"1036\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"axis_label\":\"# Iteration\",\"formatter\":{\"id\":\"1045\",\"type\":\"BasicTickFormatter\"},\"ticker\":{\"id\":\"1014\",\"type\":\"BasicTicker\"}},\"id\":\"1013\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1037\",\"type\":\"Scatter\"},{\"attributes\":{},\"id\":\"1014\",\"type\":\"BasicTicker\"}],\"root_ids\":[\"1002\"]},\"title\":\"Bokeh Application\",\"version\":\"1.4.0\"}};\n",
  647. " var render_items = [{\"docid\":\"87f47ca5-9dab-48d5-9c6a-cec201e5a1ba\",\"notebook_comms_target\":\"1049\",\"roots\":{\"1002\":\"b0f760e3-7e26-4182-b7f5-e73913f84ae7\"}}];\n",
  648. " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
  649. "\n",
  650. " }\n",
  651. " if (root.Bokeh !== undefined) {\n",
  652. " embed_document(root);\n",
  653. " } else {\n",
  654. " var attempts = 0;\n",
  655. " var timer = setInterval(function(root) {\n",
  656. " if (root.Bokeh !== undefined) {\n",
  657. " clearInterval(timer);\n",
  658. " embed_document(root);\n",
  659. " } else {\n",
  660. " attempts++;\n",
  661. " if (attempts > 100) {\n",
  662. " clearInterval(timer);\n",
  663. " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
  664. " }\n",
  665. " }\n",
  666. " }, 10, root)\n",
  667. " }\n",
  668. "})(window);"
  669. ],
  670. "application/vnd.bokehjs_exec.v0+json": ""
  671. },
  672. "metadata": {
  673. "application/vnd.bokehjs_exec.v0+json": {
  674. "id": "1002"
  675. }
  676. },
  677. "output_type": "display_data"
  678. },
  679. {
  680. "data": {
  681. "text/html": [
  682. "<p><code>&lt;Bokeh Notebook handle for <strong>In[10]</strong>&gt;</code></p>"
  683. ],
  684. "text/plain": [
  685. "<bokeh.io.notebook.CommsHandle at 0x7f1c5228fa20>"
  686. ]
  687. },
  688. "execution_count": 10,
  689. "metadata": {},
  690. "output_type": "execute_result"
  691. }
  692. ],
  693. "source": [
  694. "from bokeh.io import push_notebook, show, output_notebook\n",
  695. "from bokeh.plotting import figure\n",
  696. "output_notebook()\n",
  697. "\n",
  698. "f = figure(title='SciPy Optimisation Progress',\n",
  699. " x_axis_label='# Iteration',\n",
  700. " y_axis_label='Misfit',\n",
  701. " plot_width=800,\n",
  702. " plot_height=300)\n",
  703. "plot = f.scatter([], [])\n",
  704. "show(f, notebook_handle=True)"
  705. ]
  706. },
  707. {
  708. "cell_type": "markdown",
  709. "metadata": {},
  710. "source": [
  711. "### Optimisation with SciPy\n",
  712. "We will use `scipy.optimize.differential_evolution` to find a best fitting model. The method is stochastic in nature (does not use gradient methods) to find the minimium, and can search large areas of candidate space, but often requires larger numbers of function evaluations than conventional gradient based techniques. The scipy solver can easily be exchanged for a method of your favor. If you just want a quick demonstration, you can change the number of maxiter in the solve function to something lower."
  713. ]
  714. },
  715. {
  716. "cell_type": "code",
  717. "execution_count": 11,
  718. "metadata": {},
  719. "outputs": [
  720. {
  721. "name": "stdout",
  722. "output_type": "stream",
  723. "text": [
  724. "Time elapsed: 290.0 s\n",
  725. "Best model:\n",
  726. " - Misfit 0.667263\n",
  727. "--- !pf.DCSource\n",
  728. "lat: 42.29\n",
  729. "lon: 13.35\n",
  730. "north_shift: 10597.18548775804\n",
  731. "east_shift: 2766.0829073709124\n",
  732. "depth: 755.0174118148489\n",
  733. "time: 2009-04-06 01:32:51.039212\n",
  734. "stf_mode: post\n",
  735. "magnitude: 6.2078335485375185\n",
  736. "strike: 131.13191852585066\n",
  737. "dip: 48.28501488550296\n",
  738. "rake: -92.73154409236732\n",
  739. "\n"
  740. ]
  741. }
  742. ],
  743. "source": [
  744. "def solve():\n",
  745. " t = time.time()\n",
  746. " result = scipy.optimize.differential_evolution(\n",
  747. " trace_fit,\n",
  748. " args=[plot],\n",
  749. " bounds=tuple(bounds.values()),\n",
  750. " maxiter=1500000,\n",
  751. " tol=0.0001,\n",
  752. " callback=lambda a, convergence: push_notebook())\n",
  753. "\n",
  754. " source = update_source(result.x)\n",
  755. " source.regularize()\n",
  756. "\n",
  757. " print(\"Time elapsed: %.1f s\" % (time.time() - t))\n",
  758. " print(\"Best model:\\n - Misfit %f\" % trace_fit(result.x))\n",
  759. " print(source)\n",
  760. " return result, source\n",
  761. "\n",
  762. "\n",
  763. "# Start the optimisation\n",
  764. "result, best_source = solve()"
  765. ]
  766. },
  767. {
  768. "cell_type": "markdown",
  769. "metadata": {},
  770. "source": [
  771. "### Plot the Results\n",
  772. "Now we plot the synthetic waveforms produced by our the best model vs. the observed traces."
  773. ]
  774. },
  775. {
  776. "cell_type": "code",
  777. "execution_count": 12,
  778. "metadata": {},
  779. "outputs": [],
  780. "source": [
  781. "def plot_traces(result):\n",
  782. " nstations = len(stations_list)\n",
  783. " response = engine.process(source, targets)\n",
  784. " syn_traces = response.pyrocko_traces()\n",
  785. "\n",
  786. " fig, axes = plt.subplots(nstations, squeeze=True, sharex=True)\n",
  787. " fig.subplots_adjust(hspace=0)\n",
  788. " plt.setp([ax.get_xticklabels() for ax in axes[:-1]], visible=False)\n",
  789. "\n",
  790. " for istation, (obs, syn, target) in enumerate(zip(traces, syn_traces, targets)):\n",
  791. " ax = axes[istation]\n",
  792. " tp = store.t(phase, base_source, target)\n",
  793. " tp_onset = base_source.time + tp\n",
  794. " tmin = tp_onset - tmin_fit\n",
  795. " tmax = tp_onset + tmax_fit\n",
  796. " \n",
  797. " syn = process_trace(syn, tmin, tmax)\n",
  798. " obs = process_trace(obs, tmin, tmax, lowpass=False, inplace=False)\n",
  799. " \n",
  800. " s1 = ax.plot(obs.get_xdata(), obs.ydata, color='b')\n",
  801. " s2 = ax.plot(syn.get_xdata(), syn.ydata, color='r')\n",
  802. " s3 = ax.plot([tp_onset, tp_onset], [tr.ydata.min(), tr.ydata.max()], 'k-', lw=2)\n",
  803. "\n",
  804. " ax.text(-.2, 0.5, stations_list[istation].station,\n",
  805. " transform=ax.transAxes)\n",
  806. " ax.set_yticklabels([], visible=False)\n",
  807. "\n",
  808. " axes[-1].set_xlabel('Time [s]')\n",
  809. " plt.suptitle('Waveform fits for %s-Phase and component %s' % (phase, component))\n",
  810. " plt.legend(\n",
  811. " (s1[0], s2[0], s3[0]),\n",
  812. " ('Data', 'Synthetic','%s Phase-onset' % phase),\n",
  813. " loc='upper center',\n",
  814. " bbox_to_anchor=(0.5, -2.),\n",
  815. " fancybox=True, shadow=True, ncol=5)\n",
  816. " \n",
  817. " plt.show()"
  818. ]
  819. },
  820. {
  821. "cell_type": "markdown",
  822. "metadata": {},
  823. "source": [
  824. "Plot the resulting source mechanism and the piercing points of the stations used in the inversion."
  825. ]
  826. },
  827. {
  828. "cell_type": "code",
  829. "execution_count": 13,
  830. "metadata": {},
  831. "outputs": [
  832. {
  833. "data": {
  834. "image/png": "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\n",
  835. "text/plain": [
  836. "<Figure size 720x720 with 1 Axes>"
  837. ]
  838. },
  839. "metadata": {
  840. "needs_background": "light"
  841. },
  842. "output_type": "display_data"
  843. }
  844. ],
  845. "source": [
  846. "from pyrocko import moment_tensor as pmt, cake, orthodrome\n",
  847. "from pyrocko.plot import beachball\n",
  848. "\n",
  849. "size = 1\n",
  850. "offset = 2.1\n",
  851. "\n",
  852. "def plot_source_result_piercing_points(source, stations_list, store):\n",
  853. " # source position and mechanism\n",
  854. " slat, slon, sdepth = source.lat, source.lon, source.depth\n",
  855. " mt = source.pyrocko_moment_tensor()\n",
  856. "\n",
  857. " # receiver positions\n",
  858. " rdepth = 0.0\n",
  859. " rlatlons = []\n",
  860. " for station in stations_list:\n",
  861. " rlatlons.append((station.lat, station.lon))\n",
  862. "\n",
  863. " # earth model and phase for takeoff angle computations\n",
  864. "\n",
  865. " store = engine.get_store(store_id)\n",
  866. " mod = store.config.earthmodel_1d\n",
  867. " phases = cake.PhaseDef.classic('P')\n",
  868. " \n",
  869. " # setup figure with aspect=1.0/1.0, ranges=[-1.1, 1.1]\n",
  870. " fig = plt.figure(figsize=(10., 10.)) # size in inch\n",
  871. " fig.subplots_adjust(left=0., right=1., bottom=0., top=1.)\n",
  872. " axes = fig.add_subplot(1, 1, 1, aspect=1.0)\n",
  873. " axes.set_axis_off()\n",
  874. " axes.set_xlim(-1.1, 3.5)\n",
  875. " axes.set_ylim(-1.1, 1.1)\n",
  876. "\n",
  877. " projection = 'lambert'\n",
  878. "\n",
  879. " beachball.plot_beachball_mpl(\n",
  880. " mt, axes,\n",
  881. " position=(0., 0.),\n",
  882. " size=size,\n",
  883. " color_t=(0.7, 0.4, 0.4),\n",
  884. " projection=projection,\n",
  885. " size_units='data')\n",
  886. "\n",
  887. " for rlat, rlon in rlatlons:\n",
  888. " distance = orthodrome.distance_accurate50m(slat, slon, rlat, rlon)\n",
  889. " rays = mod.arrivals(\n",
  890. " phases=cake.PhaseDef('P'),\n",
  891. " zstart=sdepth, zstop=rdepth, distances=[distance*cake.m2d])\n",
  892. "\n",
  893. " if not rays:\n",
  894. " continue\n",
  895. "\n",
  896. " takeoff = rays[0].takeoff_angle()\n",
  897. " azi = orthodrome.azimuth(slat, slon, rlat, rlon)\n",
  898. "\n",
  899. " # to spherical coordinates, r, theta, phi in radians\n",
  900. " rtp = num.array([[size, num.deg2rad(takeoff), num.deg2rad(90.-azi)]])\n",
  901. "\n",
  902. " # to 3D coordinates (x, y, z)\n",
  903. " points = beachball.numpy_rtp2xyz(rtp)\n",
  904. "\n",
  905. " # project to 2D with same projection as used in beachball\n",
  906. " x, y = beachball.project(points, projection=projection).T\n",
  907. " axes.plot(x, y, '+', ms=10., mew=2.0, mec='black', mfc='none')\n",
  908. "\n",
  909. "plot_source_result_piercing_points(source, stations_list, engine)\n",
  910. "\n"
  911. ]
  912. },
  913. {
  914. "cell_type": "code",
  915. "execution_count": 14,
  916. "metadata": {},
  917. "outputs": [],
  918. "source": [
  919. "def plot_snuffler(result, source):\n",
  920. " engine = gf.get_engine()\n",
  921. " response = engine.process(source, targets)\n",
  922. " syn_traces = response.pyrocko_traces()\n",
  923. " obs_traces = []\n",
  924. " \n",
  925. " for obs, syn, target in zip(traces, syn_traces, targets):\n",
  926. " tp = store.t('P', base_source, target)\n",
  927. " tmin = base_source.time + tp - tmin_fit\n",
  928. " tmax = base_source.time + tp + tmax_fit\n",
  929. "\n",
  930. " syn = process_trace(syn, tmin, tmax)\n",
  931. " obs = process_trace(obs, tmin, tmax, lowpass=False, inplace=False)\n",
  932. "\n",
  933. " obs_traces.append(obs)\n",
  934. "\n",
  935. " trace.snuffle(obs_traces + syn_traces, stations=stations_list, events= [event])"
  936. ]
  937. },
  938. {
  939. "cell_type": "markdown",
  940. "metadata": {},
  941. "source": [
  942. "Next we plot the station distribution with folium (which you might need to install)"
  943. ]
  944. },
  945. {
  946. "cell_type": "code",
  947. "execution_count": 15,
  948. "metadata": {},
  949. "outputs": [
  950. {
  951. "data": {
  952. "text/html": [
  953. "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNiB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2ID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2IiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFs0Mi4yOSwgMTMuMzVdLAogICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgICAgICAgICAgICAgem9vbTogMywKICAgICAgICAgICAgICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBwcmVmZXJDYW52YXM6IGZhbHNlLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgCgogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzE2MTU4MWFkZTA3YjQ2Nzc4NGRiYTFkM2I1M2VjYWZmID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9zdGFtZW4tdGlsZXMte3N9LmEuc3NsLmZhc3RseS5uZXQvdGVycmFpbi97en0ve3h9L3t5fS5qcGciLAogICAgICAgICAgICAgICAgeyJhdHRyaWJ1dGlvbiI6ICJNYXAgdGlsZXMgYnkgXHUwMDNjYSBocmVmPVwiaHR0cDovL3N0YW1lbi5jb21cIlx1MDAzZVN0YW1lbiBEZXNpZ25cdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wXCJcdTAwM2VDQyBCWSAzLjBcdTAwM2MvYVx1MDAzZS4gRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvMy4wXCJcdTAwM2VDQyBCWSBTQVx1MDAzYy9hXHUwMDNlLiIsICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwgIm1heE5hdGl2ZVpvb20iOiAxOCwgIm1heFpvb20iOiAxOCwgIm1pblpvb20iOiAwLCAibm9XcmFwIjogZmFsc2UsICJvcGFjaXR5IjogMSwgInN1YmRvbWFpbnMiOiAiYWJjIiwgInRtcyI6IGZhbHNlfQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMGM4MzJhMjU2YTM0YzU0YjU4OTJmZTBmMmEzOTNiMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjI5LCAxMy4zNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fNzMyMGQyNDBjNzVlNGIyYjg1MTBmNjNiZWZiODkzZmUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImluZm8tc2lnbiIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAicmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfYjBjODMyYTI1NmEzNGM1NGI1ODkyZmUwZjJhMzkzYjIuc2V0SWNvbihpY29uXzczMjBkMjQwYzc1ZTRiMmI4NTEwZjYzYmVmYjg5M2ZlKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wYjdjNDU0NDFhNWM0Y2I3YTM3MWM3M2U5Y2Q2OWNjOSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNGViZWE4OTk0ODFhNDcyMzhjZmJjYjdmZTAxNTQ0MzQgPSAkKGA8ZGl2IGlkPSJodG1sXzRlYmVhODk5NDgxYTQ3MjM4Y2ZiY2I3ZmUwMTU0NDM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4yMDA5IEFxdWlsYSBFYXJ0aHF1YWtlPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzBiN2M0NTQ0MWE1YzRjYjdhMzcxYzczZTljZDY5Y2M5LnNldENvbnRlbnQoaHRtbF80ZWJlYTg5OTQ4MWE0NzIzOGNmYmNiN2ZlMDE1NDQzNCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iMGM4MzJhMjU2YTM0YzU0YjU4OTJmZTBmMmEzOTNiMi5iaW5kUG9wdXAocG9wdXBfMGI3YzQ1NDQxYTVjNGNiN2EzNzFjNzNlOWNkNjljYzkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODc1NzU0NzQ3Yzk4NGI5MjhlMjNhZjdjMTIyNzNkNTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2NS41NTk4LCAtMTY3LjkyNjddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzMwMTMwMDBmM2E5YjRmZjk5YWUzZmFkOGM3OGI1NzFiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8wYmQ1YjMzOGI2MzQ0YWNjOTE5NjM4ZTQ5ZDBhMGEyNCA9ICQoYDxkaXYgaWQ9Imh0bWxfMGJkNWIzMzhiNjM0NGFjYzkxOTYzOGU0OWQwYTBhMjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPlROQTwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8zMDEzMDAwZjNhOWI0ZmY5OWFlM2ZhZDhjNzhiNTcxYi5zZXRDb250ZW50KGh0bWxfMGJkNWIzMzhiNjM0NGFjYzkxOTYzOGU0OWQwYTBhMjQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfODc1NzU0NzQ3Yzk4NGI5MjhlMjNhZjdjMTIyNzNkNTYuYmluZFBvcHVwKHBvcHVwXzMwMTMwMDBmM2E5YjRmZjk5YWUzZmFkOGM3OGI1NzFiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzk0YTI1NTAyN2U4YjQ5ZTZhNDhhODU0MTUyNGQ2NGJjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTUuNDY4OTQsIC0xMzMuMTIyOTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzlhZTc3ZTI2OWUwMzRlMTM5MjQyODFkM2RkMjc5MTc5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF81ZTIyM2U0ZDJmM2U0NDE1YTM4OWIxNTdjNzhhZDlhYyA9ICQoYDxkaXYgaWQ9Imh0bWxfNWUyMjNlNGQyZjNlNDQxNWEzODliMTU3Yzc4YWQ5YWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPkNSQUc8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOWFlNzdlMjY5ZTAzNGUxMzkyNDI4MWQzZGQyNzkxNzkuc2V0Q29udGVudChodG1sXzVlMjIzZTRkMmYzZTQ0MTVhMzg5YjE1N2M3OGFkOWFjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzk0YTI1NTAyN2U4YjQ5ZTZhNDhhODU0MTUyNGQ2NGJjLmJpbmRQb3B1cChwb3B1cF85YWU3N2UyNjllMDM0ZTEzOTI0MjgxZDNkZDI3OTE3OSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kMDMxZjY2MWJlNDA0NzE3Yjg5MzNkYzM1OWFiMjE2YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjI1NiwgLTU3LjUwNDJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzdlNmY4ZGJkMDQyODQ5ZjhiN2RmYWFiMjdlMTM5YTNkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF84Y2IwNGM5ZmY5NzE0NWIzOTNhYWVlNmM1Y2VkYjA2MyA9ICQoYDxkaXYgaWQ9Imh0bWxfOGNiMDRjOWZmOTcxNDViMzkzYWFlZTZjNWNlZGIwNjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPkRSTE48L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfN2U2ZjhkYmQwNDI4NDlmOGI3ZGZhYWIyN2UxMzlhM2Quc2V0Q29udGVudChodG1sXzhjYjA0YzlmZjk3MTQ1YjM5M2FhZWU2YzVjZWRiMDYzKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2QwMzFmNjYxYmU0MDQ3MTdiODkzM2RjMzU5YWIyMTZjLmJpbmRQb3B1cChwb3B1cF83ZTZmOGRiZDA0Mjg0OWY4YjdkZmFhYjI3ZTEzOWEzZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMDY3YjQzZTg1OWU0OWVhYjVmODdjNmU0OWJkN2M2ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzY4LjMwNjUsIC0xMzMuNTI1NF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjJlM2NjMjgwZTU1NDlmYjhmZTExMzA4MGE1NGEzZjggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2M2YWIwZTU5OGUzZDQ0NjY4MzdlMTY3MWE3Y2RjM2E2ID0gJChgPGRpdiBpZD0iaHRtbF9jNmFiMGU1OThlM2Q0NDY2ODM3ZTE2NzFhN2NkYzNhNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGI+SU5LPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzIyZTNjYzI4MGU1NTQ5ZmI4ZmUxMTMwODBhNTRhM2Y4LnNldENvbnRlbnQoaHRtbF9jNmFiMGU1OThlM2Q0NDY2ODM3ZTE2NzFhN2NkYzNhNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iMDY3YjQzZTg1OWU0OWVhYjVmODdjNmU0OWJkN2M2ZC5iaW5kUG9wdXAocG9wdXBfMjJlM2NjMjgwZTU1NDlmYjhmZTExMzA4MGE1NGEzZjgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmNkYjFjZjA5ZTI0NDRiMWI4OTI4MmNhMzYzZDJmZmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3NC42ODkyLCAtOTQuODk2Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNWVlOWRlMThiOGNlNGNhM2EwMGEwYjk0OWVmMWNjYTYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2RhOWJkMDFhZDkwOTRiZjliOWMwMTEyNjZmZTRhMmRlID0gJChgPGRpdiBpZD0iaHRtbF9kYTliZDAxYWQ5MDk0YmY5YjljMDExMjY2ZmU0YTJkZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGI+UkVTPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzVlZTlkZTE4YjhjZTRjYTNhMDBhMGI5NDllZjFjY2E2LnNldENvbnRlbnQoaHRtbF9kYTliZDAxYWQ5MDk0YmY5YjljMDExMjY2ZmU0YTJkZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mY2RiMWNmMDllMjQ0NGIxYjg5MjgyY2EzNjNkMmZmYi5iaW5kUG9wdXAocG9wdXBfNWVlOWRlMThiOGNlNGNhM2EwMGEwYjk0OWVmMWNjYTYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWYxZjcxMWQ1MjM4NGMyM2E0YTg5YTk5ZDM3ZjUyNTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxNy42Njg1MywgLTYxLjc4NTU3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xODUwNDM3YTBjZGY0NjljOGJjYzc5NzlkYzFmNmViNiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYWVhMTQyZGJmZjVhNDRhMzllOWU2YWMyMTcyNDU3NGIgPSAkKGA8ZGl2IGlkPSJodG1sX2FlYTE0MmRiZmY1YTQ0YTM5ZTllNmFjMjE3MjQ1NzRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5BTldCPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzE4NTA0MzdhMGNkZjQ2OWM4YmNjNzk3OWRjMWY2ZWI2LnNldENvbnRlbnQoaHRtbF9hZWExNDJkYmZmNWE0NGEzOWU5ZTZhYzIxNzI0NTc0Yik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lZjFmNzExZDUyMzg0YzIzYTRhODlhOTlkMzdmNTI1MS5iaW5kUG9wdXAocG9wdXBfMTg1MDQzN2EwY2RmNDY5YzhiY2M3OTc5ZGMxZjZlYjYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWNhMzJiN2E0NmM1NGQzYzgxMDAzZGZkOTAzNTI3ZjEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsyMS41MTE0OSwgLTcxLjEzMjddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2I5ZjU2MDcwZmYxMjQxNDliNDQyZTM0ODIwNDdhMWNjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF80NzAyMzgxYjIwOWY0MTQ2YWY4YzVjYjU1ZWU5ZDlkZCA9ICQoYDxkaXYgaWQ9Imh0bWxfNDcwMjM4MWIyMDlmNDE0NmFmOGM1Y2I1NWVlOWQ5ZGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPkdSVEs8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYjlmNTYwNzBmZjEyNDE0OWI0NDJlMzQ4MjA0N2ExY2Muc2V0Q29udGVudChodG1sXzQ3MDIzODFiMjA5ZjQxNDZhZjhjNWNiNTVlZTlkOWRkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzFjYTMyYjdhNDZjNTRkM2M4MTAwM2RmZDkwMzUyN2YxLmJpbmRQb3B1cChwb3B1cF9iOWY1NjA3MGZmMTI0MTQ5YjQ0MmUzNDgyMDQ3YTFjYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lN2E1ZDViMmRmYjM0NzM2YTVhMDlmYmQyZTcwMzBhZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzE4LjIyNjA1LCAtNzcuNTM0NTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzZkOWY0MWE2ZjA1MDQ5N2Y5ZDI4NjU3NTBjMTBlZTkxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mOThkNTI4OGIzN2I0NjNiODBhYWE4ZGUzNGJjYzJmMSA9ICQoYDxkaXYgaWQ9Imh0bWxfZjk4ZDUyODhiMzdiNDYzYjgwYWFhOGRlMzRiY2MyZjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPk1UREo8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNmQ5ZjQxYTZmMDUwNDk3ZjlkMjg2NTc1MGMxMGVlOTEuc2V0Q29udGVudChodG1sX2Y5OGQ1Mjg4YjM3YjQ2M2I4MGFhYThkZTM0YmNjMmYxKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2U3YTVkNWIyZGZiMzQ3MzZhNWEwOWZiZDJlNzAzMGFlLmJpbmRQb3B1cChwb3B1cF82ZDlmNDFhNmYwNTA0OTdmOWQyODY1NzUwYzEwZWU5MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZDc0OWIxOGZlMTM0ZjIwYWRmMzI3OTc2OGNhNTRhMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzE0LjM5MjAyLCAtMTYuOTU1NDddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzRmMjNiMDI4NTE5ZTRiZGE5ZmE3ZmRlMzgxMzdmMzYyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8zMmY4YjdkNWI1OTk0YzQ2OTRkOGI3NTA1M2JkYzZlYiA9ICQoYDxkaXYgaWQ9Imh0bWxfMzJmOGI3ZDViNTk5NGM0Njk0ZDhiNzUwNTNiZGM2ZWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPk1CTzwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF80ZjIzYjAyODUxOWU0YmRhOWZhN2ZkZTM4MTM3ZjM2Mi5zZXRDb250ZW50KGh0bWxfMzJmOGI3ZDViNTk5NGM0Njk0ZDhiNzUwNTNiZGM2ZWIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNmQ3NDliMThmZTEzNGYyMGFkZjMyNzk3NjhjYTU0YTIuYmluZFBvcHVwKHBvcHVwXzRmMjNiMDI4NTE5ZTRiZGE5ZmE3ZmRlMzgxMzdmMzYyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzU5NjZmZmVhYzEyMjQ5YmI5NDA3NjkzZjcyMmVlMzViID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNzguOTE1NCwgMTEuOTM4NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjdhZDlhNzM2NzZmNGJmYjk4N2MyYmY5ZTY4N2FmZjQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzA3ZDI3MDJmMjdlNDRmOWNiM2M1ODUwYWFlZjc0YjJjID0gJChgPGRpdiBpZD0iaHRtbF8wN2QyNzAyZjI3ZTQ0ZjljYjNjNTg1MGFhZWY3NGIyYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGI+S0JTPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzI3YWQ5YTczNjc2ZjRiZmI5ODdjMmJmOWU2ODdhZmY0LnNldENvbnRlbnQoaHRtbF8wN2QyNzAyZjI3ZTQ0ZjljYjNjNTg1MGFhZWY3NGIyYyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81OTY2ZmZlYWMxMjI0OWJiOTQwNzY5M2Y3MjJlZTM1Yi5iaW5kUG9wdXAocG9wdXBfMjdhZDlhNzM2NzZmNGJmYjk4N2MyYmY5ZTY4N2FmZjQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDQxYzZjOTg1YWVjNDg0MmE4NDRiNjVhZGQwYmEwY2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMS4xMjY4LCAzNy4yNTIzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85Zjg3NGMxMWZmMzU0M2RkYjE4YjFjYmIxZjhlNzM1YyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZjgyNWJmOWYxNzJmNGMxYWE2OTZhYmYwNzdjNWIxMDEgPSAkKGA8ZGl2IGlkPSJodG1sX2Y4MjViZjlmMTcyZjRjMWFhNjk2YWJmMDc3YzViMTAxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5LTUJPPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzlmODc0YzExZmYzNTQzZGRiMThiMWNiYjFmOGU3MzVjLnNldENvbnRlbnQoaHRtbF9mODI1YmY5ZjE3MmY0YzFhYTY5NmFiZjA3N2M1YjEwMSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kNDFjNmM5ODVhZWM0ODQyYTg0NGI2NWFkZDBiYTBjZS5iaW5kUG9wdXAocG9wdXBfOWY4NzRjMTFmZjM1NDNkZGIxOGIxY2JiMWY4ZTczNWMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjQ2Mjc3YTFhODE1NGE2OGFlOWEwYTBjMzMwZmIyODYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1LjIyODgsIDk2Ljk0NzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzk2YzY2ZDY5NDU0MjQxMmFiYmRkZTllZTk1YTgyODAyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9lMjMwMmE3ZjA3YTc0MzAwOGU4OTIzZmQ0NDg3NzkwNyA9ICQoYDxkaXYgaWQ9Imh0bWxfZTIzMDJhN2YwN2E3NDMwMDhlODkyM2ZkNDQ4Nzc5MDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPkxITUk8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTZjNjZkNjk0NTQyNDEyYWJiZGRlOWVlOTVhODI4MDIuc2V0Q29udGVudChodG1sX2UyMzAyYTdmMDdhNzQzMDA4ZTg5MjNmZDQ0ODc3OTA3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2Y0NjI3N2ExYTgxNTRhNjhhZTlhMGEwYzMzMGZiMjg2LmJpbmRQb3B1cChwb3B1cF85NmM2NmQ2OTQ1NDI0MTJhYmJkZGU5ZWU5NWE4MjgwMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZTUwYmU2ZDcxYWQ0YTc5OGExZGVlNTM1YzAwNzc1ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0yNi4zMzA2NiwgLTU3LjMzMDk1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iNzQ1MGExZTdjYjM0ZGMyOTc4YjdiZTAwZWFlYjQ0OCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfODY2N2RlM2ZhMWY4NDFmM2FlMjZkOWJjZWQ4NDQ2ZmUgPSAkKGA8ZGl2IGlkPSJodG1sXzg2NjdkZTNmYTFmODQxZjNhZTI2ZDliY2VkODQ0NmZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5DUFVQPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2I3NDUwYTFlN2NiMzRkYzI5NzhiN2JlMDBlYWViNDQ4LnNldENvbnRlbnQoaHRtbF84NjY3ZGUzZmExZjg0MWYzYWUyNmQ5YmNlZDg0NDZmZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jZTUwYmU2ZDcxYWQ0YTc5OGExZGVlNTM1YzAwNzc1ZS5iaW5kUG9wdXAocG9wdXBfYjc0NTBhMWU3Y2IzNGRjMjk3OGI3YmUwMGVhZWI0NDgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDMyYzUxYzkwYjQwNDQzYjg3ODhmYzBkZjE5NTBjMWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs2LjY3MDE2LCAtNC44NTY1Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDIzNWY4ZWY5NTkwNGJjNjg5MWQ1ZjhlZTVkYmEzZWMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2Q5Mzk0NjViNDE0MDQ2MDQ4Mzg0ODRkY2E4MDZhYmZkID0gJChgPGRpdiBpZD0iaHRtbF9kOTM5NDY1YjQxNDA0NjA0ODM4NDg0ZGNhODA2YWJmZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGI+REJJQzwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9kMjM1ZjhlZjk1OTA0YmM2ODkxZDVmOGVlNWRiYTNlYy5zZXRDb250ZW50KGh0bWxfZDkzOTQ2NWI0MTQwNDYwNDgzODQ4NGRjYTgwNmFiZmQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMDMyYzUxYzkwYjQwNDQzYjg3ODhmYzBkZjE5NTBjMWMuYmluZFBvcHVwKHBvcHVwX2QyMzVmOGVmOTU5MDRiYzY4OTFkNWY4ZWU1ZGJhM2VjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzNmZmI5ODlkMTZmNDRjNGNhMjNiOTE4NjU1ZTExNmJiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuMDE4MywgMTE2LjE2NzldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2U1MTA3NWMyMWY3MDQyYTJhMDg2ODA3YWNhNGEzYjE4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF82NTkxZWVjYzg0NTY0MzU0YTYyZTdlYWQyYTM0NjYyMCA9ICQoYDxkaXYgaWQ9Imh0bWxfNjU5MWVlY2M4NDU2NDM1NGE2MmU3ZWFkMmEzNDY2MjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPkJKVDwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9lNTEwNzVjMjFmNzA0MmEyYTA4NjgwN2FjYTRhM2IxOC5zZXRDb250ZW50KGh0bWxfNjU5MWVlY2M4NDU2NDM1NGE2MmU3ZWFkMmEzNDY2MjApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfM2ZmYjk4OWQxNmY0NGM0Y2EyM2I5MTg2NTVlMTE2YmIuYmluZFBvcHVwKHBvcHVwX2U1MTA3NWMyMWY3MDQyYTJhMDg2ODA3YWNhNGEzYjE4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQ2MDVhYTFiZGQ2NDQ2YmU4N2UwODEwMTViMDBkODg4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuMjcwNCwgMTE5Ljc0MTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2NjNTk3ZjE1ZjdjMTRiMTg5ZmFlNjk2MzMzOTdlMWE5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF81ODYzOWFkMTRhNmM0YWMwYTc3NTVkYjQyOTBlNTY0MSA9ICQoYDxkaXYgaWQ9Imh0bWxfNTg2MzlhZDE0YTZjNGFjMGE3NzU1ZGI0MjkwZTU2NDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPkhJQTwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9jYzU5N2YxNWY3YzE0YjE4OWZhZTY5NjMzMzk3ZTFhOS5zZXRDb250ZW50KGh0bWxfNTg2MzlhZDE0YTZjNGFjMGE3NzU1ZGI0MjkwZTU2NDEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNDYwNWFhMWJkZDY0NDZiZTg3ZTA4MTAxNWIwMGQ4ODguYmluZFBvcHVwKHBvcHVwX2NjNTk3ZjE1ZjdjMTRiMTg5ZmFlNjk2MzMzOTdlMWE5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzgwZTRmNTJmYWFkOTRjYjk4ZGY2N2QxYTc4YTU0NTNmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMjUuMTIzMywgMTAyLjc0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xODAxYzQ1NDM0NmU0YmJlOGJlYmZkZjMwNTEyMmE0OCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMmUxMzNhMDE1ZjI4NDU1YjljM2Q5N2NmNTM3MTc0MDkgPSAkKGA8ZGl2IGlkPSJodG1sXzJlMTMzYTAxNWYyODQ1NWI5YzNkOTdjZjUzNzE3NDA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5LTUk8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMTgwMWM0NTQzNDZlNGJiZThiZWJmZGYzMDUxMjJhNDguc2V0Q29udGVudChodG1sXzJlMTMzYTAxNWYyODQ1NWI5YzNkOTdjZjUzNzE3NDA5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzgwZTRmNTJmYWFkOTRjYjk4ZGY2N2QxYTc4YTU0NTNmLmJpbmRQb3B1cChwb3B1cF8xODAxYzQ1NDM0NmU0YmJlOGJlYmZkZjMwNTEyMmE0OCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81NjkzYTA2NGViOWU0Y2UzOWNhMDhlZjk4MzliZmFiNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzE5LjAyOTEsIDEwOS44NDQ1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zYjRjNzFkNjI2M2Q0ZWZiODViMmE5MzY1NWEzZTJmYyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMDUxMDlkODliN2NmNDVjNWI0MzdlYzE5NzZlMWRlYjcgPSAkKGA8ZGl2IGlkPSJodG1sXzA1MTA5ZDg5YjdjZjQ1YzViNDM3ZWMxOTc2ZTFkZWI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5RSVo8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfM2I0YzcxZDYyNjNkNGVmYjg1YjJhOTM2NTVhM2UyZmMuc2V0Q29udGVudChodG1sXzA1MTA5ZDg5YjdjZjQ1YzViNDM3ZWMxOTc2ZTFkZWI3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzU2OTNhMDY0ZWI5ZTRjZTM5Y2EwOGVmOTgzOWJmYWI2LmJpbmRQb3B1cChwb3B1cF8zYjRjNzFkNjI2M2Q0ZWZiODViMmE5MzY1NWEzZTJmYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMjAyODZiMDk3ZjQ0OWNkODVmNjFhYmZmYjQ3NGZkNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMxLjA5NDgsIDEyMS4xOTA4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80Mjg0ZjUyMGQ2Y2U0ZGJjYWZjZmM1MjhiMDY1MWUyMCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMzY4N2ZmMWU4MDMxNGE4NTg0NzE1NmJhMmFjMzMxYzUgPSAkKGA8ZGl2IGlkPSJodG1sXzM2ODdmZjFlODAzMTRhODU4NDcxNTZiYTJhYzMzMWM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5TU0U8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDI4NGY1MjBkNmNlNGRiY2FmY2ZjNTI4YjA2NTFlMjAuc2V0Q29udGVudChodG1sXzM2ODdmZjFlODAzMTRhODU4NDcxNTZiYTJhYzMzMWM1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzMyMDI4NmIwOTdmNDQ5Y2Q4NWY2MWFiZmZiNDc0ZmQ0LmJpbmRQb3B1cChwb3B1cF80Mjg0ZjUyMGQ2Y2U0ZGJjYWZjZmM1MjhiMDY1MWUyMCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kN2VhYWIxYWZjYzM0OTk5YjhjZmJjNDljYWQ3ZjU3MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgxMzgsIDg3LjcwNDldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzFmYmQxZDgyMDAxMjQ5OWNiMzIyMzYxYmYyODUwNDFmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mN2I4OWMwMGVmNzg0YjI4ODg4NDM3MmIyZDEyMzlhOCA9ICQoYDxkaXYgaWQ9Imh0bWxfZjdiODljMDBlZjc4NGIyODg4ODQzNzJiMmQxMjM5YTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPldNUTwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8xZmJkMWQ4MjAwMTI0OTljYjMyMjM2MWJmMjg1MDQxZi5zZXRDb250ZW50KGh0bWxfZjdiODljMDBlZjc4NGIyODg4ODQzNzJiMmQxMjM5YTgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZDdlYWFiMWFmY2MzNDk5OWI4Y2ZiYzQ5Y2FkN2Y1NzMuYmluZFBvcHVwKHBvcHVwXzFmYmQxZDgyMDAxMjQ5OWNiMzIyMzYxYmYyODUwNDFmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2M5ZWRkMGZjNzExMDQ0ZTg4ZDBhYTA2MWFmOGM5MmFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuMDMxMywgMTA4LjkyMzddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzg1NDE1YTM1NTNhYzQ4ZjFhYTQyNjFjZjJmNDJiZTlkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8wNjQwYmZhYjk4OGM0N2U2OTExMjAwYzc3NzlmMzZhMCA9ICQoYDxkaXYgaWQ9Imh0bWxfMDY0MGJmYWI5ODhjNDdlNjkxMTIwMGM3Nzc5ZjM2YTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPlhBTjwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF84NTQxNWEzNTUzYWM0OGYxYWE0MjYxY2YyZjQyYmU5ZC5zZXRDb250ZW50KGh0bWxfMDY0MGJmYWI5ODhjNDdlNjkxMTIwMGM3Nzc5ZjM2YTApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzllZGQwZmM3MTEwNDRlODhkMGFhMDYxYWY4YzkyYWMuYmluZFBvcHVwKHBvcHVwXzg1NDE1YTM1NTNhYzQ4ZjFhYTQyNjFjZjJmNDJiZTlkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2UyMjlmMjExZThlNzRlY2U5N2Y1MGFiYmMxZDU4NDRmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuNjM3NSwgNzQuNDk0Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODM2MGNmNDk3NzkxNDIxMGJlN2RjZjFlMjRmMjQwMGIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzY1ODZmNzA2ZThhNTQyN2ZhNTVlNThkY2MzMmIwODEzID0gJChgPGRpdiBpZD0iaHRtbF82NTg2ZjcwNmU4YTU0MjdmYTU1ZTU4ZGNjMzJiMDgxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGI+QUFLPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzgzNjBjZjQ5Nzc5MTQyMTBiZTdkY2YxZTI0ZjI0MDBiLnNldENvbnRlbnQoaHRtbF82NTg2ZjcwNmU4YTU0MjdmYTU1ZTU4ZGNjMzJiMDgxMyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lMjI5ZjIxMWU4ZTc0ZWNlOTdmNTBhYmJjMWQ1ODQ0Zi5iaW5kUG9wdXAocG9wdXBfODM2MGNmNDk3NzkxNDIxMGJlN2RjZjFlMjRmMjQwMGIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTI5ZThmMDMxNWQ0NDA2Yzg3ZmY3YmU3NDk5M2E4ZDQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy45MzA0LCA1OC4xMTg5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82MTVhMDg2NDdlZWE0NDAxYTFjZTMxNWE5YTFhOGUyYyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMzk4MGQ4ZTVlN2U2NDIyNDhjYTA0MWM1OTAyOTQyNWQgPSAkKGA8ZGl2IGlkPSJodG1sXzM5ODBkOGU1ZTdlNjQyMjQ4Y2EwNDFjNTkwMjk0MjVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5BQktUPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzYxNWEwODY0N2VlYTQ0MDFhMWNlMzE1YTlhMWE4ZTJjLnNldENvbnRlbnQoaHRtbF8zOTgwZDhlNWU3ZTY0MjI0OGNhMDQxYzU5MDI5NDI1ZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xMjllOGYwMzE1ZDQ0MDZjODdmZjdiZTc0OTkzYThkNC5iaW5kUG9wdXAocG9wdXBfNjE1YTA4NjQ3ZWVhNDQwMWExY2UzMTVhOWExYThlMmMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGEyM2JhZTIwZjlhNDY2YzhmODZlZTk4Mzg0ZTc2NTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuMDE4LCA0Ny4yMjldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzZlNzZmZTM1ZDBjYjQ2Y2JhODFhODA2ZDA4MmMwODVhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mNmM2YzMwYWFjMTc0ZTdjOGZmMWRiMmVkNjdiODNmZiA9ICQoYDxkaXYgaWQ9Imh0bWxfZjZjNmMzMGFhYzE3NGU3YzhmZjFkYjJlZDY3YjgzZmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPkFCUE88L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNmU3NmZlMzVkMGNiNDZjYmE4MWE4MDZkMDgyYzA4NWEuc2V0Q29udGVudChodG1sX2Y2YzZjMzBhYWMxNzRlN2M4ZmYxZGIyZWQ2N2I4M2ZmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2RhMjNiYWUyMGY5YTQ2NmM4Zjg2ZWU5ODM4NGU3NjU5LmJpbmRQb3B1cChwb3B1cF82ZTc2ZmUzNWQwY2I0NmNiYTgxYTgwNmQwODJjMDg1YSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZjg1ZDQzNTllZGM0YzRhYTdjYWU2YTg5NGNmN2FkZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzgyLjUwMzMsIC02Mi4zNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDAwNzQ1ZTNjNzZiNGUyMjhhODI1MjE3YTRjMGNlYzcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2JiYTQ1MTFhNTZhMTQzODhiN2EyZTlmYmU5OTA4ZDRlID0gJChgPGRpdiBpZD0iaHRtbF9iYmE0NTExYTU2YTE0Mzg4YjdhMmU5ZmJlOTkwOGQ0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGI+QUxFPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2QwMDc0NWUzYzc2YjRlMjI4YTgyNTIxN2E0YzBjZWM3LnNldENvbnRlbnQoaHRtbF9iYmE0NTExYTU2YTE0Mzg4YjdhMmU5ZmJlOTkwOGQ0ZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jZjg1ZDQzNTllZGM0YzRhYTdjYWU2YTg5NGNmN2FkZi5iaW5kUG9wdXAocG9wdXBfZDAwNzQ1ZTNjNzZiNGUyMjhhODI1MjE3YTRjMGNlYzcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWIwYTlmZThlMDg0NDVjYTlhMWYyYjQ2ZTE0YjcxMDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Ni40MzAyLCA1OC41NjI1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83ODgyMjczMmJkZTI0N2Y5YTU5YWQ0NzljNWZlYWM3OSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOTFlNjY4OWEwNmRkNGMyN2E0NTM4ZGFkZmVmN2FhNjcgPSAkKGA8ZGl2IGlkPSJodG1sXzkxZTY2ODlhMDZkZDRjMjdhNDUzOGRhZGZlZjdhYTY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5BUlU8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzg4MjI3MzJiZGUyNDdmOWE1OWFkNDc5YzVmZWFjNzkuc2V0Q29udGVudChodG1sXzkxZTY2ODlhMDZkZDRjMjdhNDUzOGRhZGZlZjdhYTY3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzFiMGE5ZmU4ZTA4NDQ1Y2E5YTFmMmI0NmUxNGI3MTA2LmJpbmRQb3B1cChwb3B1cF83ODgyMjczMmJkZTI0N2Y5YTU5YWQ0NzljNWZlYWM3OSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84OTcxNzAxYzczOWM0ZTEwYTg1MjdiZWJkZTBlMTQyOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjcyNSwgLTEwMS45NzgzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83MTljNGY2OGQxNGI0NDU3OGQyZmNlOGU3OGZmYTZlMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNWQwNDEwN2UyMzFlNGU2Njk1MWViYWYwYTRjODQ3NTcgPSAkKGA8ZGl2IGlkPSJodG1sXzVkMDQxMDdlMjMxZTRlNjY5NTFlYmFmMGE0Yzg0NzU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5GRkM8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzE5YzRmNjhkMTRiNDQ1NzhkMmZjZThlNzhmZmE2ZTIuc2V0Q29udGVudChodG1sXzVkMDQxMDdlMjMxZTRlNjY5NTFlYmFmMGE0Yzg0NzU3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzg5NzE3MDFjNzM5YzRlMTBhODUyN2JlYmRlMGUxNDI4LmJpbmRQb3B1cChwb3B1cF83MTljNGY2OGQxNGI0NDU3OGQyZmNlOGU3OGZmYTZlMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mMGRiNmE5YmU4ZjQ0ZjBhYmM4YWE2NDhhNzE0MTYyNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzEwLjI5MDgsIC04NC45NTI1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80NDhlYjAxZDJmZWU0MjA5OTUwODUwZWFkZWQ2NGI2NyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMjYyYjM5MjVmNjVhNDAxYTkzZDUzM2IxZjIxODhkY2MgPSAkKGA8ZGl2IGlkPSJodG1sXzI2MmIzOTI1ZjY1YTQwMWE5M2Q1MzNiMWYyMTg4ZGNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5KVFM8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDQ4ZWIwMWQyZmVlNDIwOTk1MDg1MGVhZGVkNjRiNjcuc2V0Q29udGVudChodG1sXzI2MmIzOTI1ZjY1YTQwMWE5M2Q1MzNiMWYyMTg4ZGNjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2YwZGI2YTliZThmNDRmMGFiYzhhYTY0OGE3MTQxNjI3LmJpbmRQb3B1cChwb3B1cF80NDhlYjAxZDJmZWU0MjA5OTUwODUwZWFkZWQ2NGI2NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zZWQ2MDMwZWExMDA0MWM3YTY1ZWJjY2QyYmJmNGNkZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjcxNTQsIDc4LjYyMDJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzcxMjNkYTgyMzJmZTQzYjk5MDYzNTJkZWVmZDdkZTVkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jODY5NzllYzQzMjk0OTRmYmQ3MGMyN2E5NGY4ODc0MCA9ICQoYDxkaXYgaWQ9Imh0bWxfYzg2OTc5ZWM0MzI5NDk0ZmJkNzBjMjdhOTRmODg3NDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPktVUks8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzEyM2RhODIzMmZlNDNiOTkwNjM1MmRlZWZkN2RlNWQuc2V0Q29udGVudChodG1sX2M4Njk3OWVjNDMyOTQ5NGZiZDcwYzI3YTk0Zjg4NzQwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzNlZDYwMzBlYTEwMDQxYzdhNjVlYmNjZDJiYmY0Y2RlLmJpbmRQb3B1cChwb3B1cF83MTIzZGE4MjMyZmU0M2I5OTA2MzUyZGVlZmQ3ZGU1ZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl85ODY0NzdiYmE5MWM0MWE3YTZlNjIzMjE2MDY1OWNkZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy00LjY3MzcsIDU1LjQ3OTJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2UzYmZlMmViY2VkNzQ1ZjhiNzc4YzI0Yzg4NTNkMjk1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF81NzAzMDdlNmZjYzQ0YzBlOGZhMWQ2MGQ1ZmQzMTY4YiA9ICQoYDxkaXYgaWQ9Imh0bWxfNTcwMzA3ZTZmY2M0NGMwZThmYTFkNjBkNWZkMzE2OGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPk1TRVk8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTNiZmUyZWJjZWQ3NDVmOGI3NzhjMjRjODg1M2QyOTUuc2V0Q29udGVudChodG1sXzU3MDMwN2U2ZmNjNDRjMGU4ZmExZDYwZDVmZDMxNjhiKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzk4NjQ3N2JiYTkxYzQxYTdhNmU2MjMyMTYwNjU5Y2RkLmJpbmRQb3B1cChwb3B1cF9lM2JmZTJlYmNlZDc0NWY4Yjc3OGMyNGM4ODUzZDI5NSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZmM3NjU3Nzc2NjY0ZWQ5OGNmMGJhNjc2NTUzZmI2MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjY4MDcsIDEwMy42NDM4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hNTAwZTFiYmE0MmU0ZjM5YTQ3NDQzMDEyMWZhNzVmMCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZDAzODAyZTBmYzU5NDc0YTgyZTM0ZDlkNDk1ZjRhZGIgPSAkKGA8ZGl2IGlkPSJodG1sX2QwMzgwMmUwZmM1OTQ3NGE4MmUzNGQ5ZDQ5NWY0YWRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5UTFk8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTUwMGUxYmJhNDJlNGYzOWE0NzQ0MzAxMjFmYTc1ZjAuc2V0Q29udGVudChodG1sX2QwMzgwMmUwZmM1OTQ3NGE4MmUzNGQ5ZDQ5NWY0YWRiKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzVmYzc2NTc3NzY2NjRlZDk4Y2YwYmE2NzY1NTNmYjYyLmJpbmRQb3B1cChwb3B1cF9hNTAwZTFiYmE0MmU0ZjM5YTQ3NDQzMDEyMWZhNzVmMCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wNWQwMGE4MjUyMTQ0ZDA1OTdjYWRiZTdjYjM2NGM0NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMyLjM3MTMsIC02NC42OTYzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kY2I4MGM4ZGViNGI0YWUwYmQ4OTliODQ5MDllMWZkNiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOTI5ODIxYjg3NzEyNGM1ZjhmYzdhYWFkMTQ4MjU3NzUgPSAkKGA8ZGl2IGlkPSJodG1sXzkyOTgyMWI4NzcxMjRjNWY4ZmM3YWFhZDE0ODI1Nzc1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5CQlNSPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2RjYjgwYzhkZWI0YjRhZTBiZDg5OWI4NDkwOWUxZmQ2LnNldENvbnRlbnQoaHRtbF85Mjk4MjFiODc3MTI0YzVmOGZjN2FhYWQxNDgyNTc3NSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8wNWQwMGE4MjUyMTQ0ZDA1OTdjYWRiZTdjYjM2NGM0Ny5iaW5kUG9wdXAocG9wdXBfZGNiODBjOGRlYjRiNGFlMGJkODk5Yjg0OTA5ZTFmZDYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzk1Y2E5MmZhNjczNDg2OWE3NDllNDYwZjQ4MjJjNjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxOC44MTQxLCA5OC45NDQzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mODhmMDkyY2IyMjM0YzcwOWYyMGRmZDc5YmM1YWM4NSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMzQxMTZmMWFkNzg2NDNiM2I5MWM2NjQ5MzQ4ZjhmZmYgPSAkKGA8ZGl2IGlkPSJodG1sXzM0MTE2ZjFhZDc4NjQzYjNiOTFjNjY0OTM0OGY4ZmZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5DSFRPPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Y4OGYwOTJjYjIyMzRjNzA5ZjIwZGZkNzliYzVhYzg1LnNldENvbnRlbnQoaHRtbF8zNDExNmYxYWQ3ODY0M2IzYjkxYzY2NDkzNDhmOGZmZik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jOTVjYTkyZmE2NzM0ODY5YTc0OWU0NjBmNDgyMmM2Ny5iaW5kUG9wdXAocG9wdXBfZjg4ZjA5MmNiMjIzNGM3MDlmMjBkZmQ3OWJjNWFjODUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGJhYWZhZWEyMGNlNGZiMGEyZmUwZmJkZTQwNmMzMmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0NC41ODU1LCAtMTIzLjMwNDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2RhMjQ4NGI0MzEyYzQzNWNiNzUwNzJiMDZhZDNlMzM0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jMWVmMDEzNTQ3ZWE0ZTQ4OTRlMzM4NTcwYzNlMGU1MCA9ICQoYDxkaXYgaWQ9Imh0bWxfYzFlZjAxMzU0N2VhNGU0ODk0ZTMzODU3MGMzZTBlNTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPkNPUjwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9kYTI0ODRiNDMxMmM0MzVjYjc1MDcyYjA2YWQzZTMzNC5zZXRDb250ZW50KGh0bWxfYzFlZjAxMzU0N2VhNGU0ODk0ZTMzODU3MGMzZTBlNTApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNGJhYWZhZWEyMGNlNGZiMGEyZmUwZmJkZTQwNmMzMmYuYmluZFBvcHVwKHBvcHVwX2RhMjQ4NGI0MzEyYzQzNWNiNzUwNzJiMDZhZDNlMzM0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NhOWU2OTUzM2QyZjRkOGJhNjg1OTY4MzAxZDFhZjk5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMjguMTEwMywgLTgxLjQzMjddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzFiYzEzMmM0OWMwYjQ0MDFiMmI3MGJkNGIyMGYxZjk3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9kNzkwYTI0ODQ2NWU0OTAzOTE2YzQxNjYxNWQwMzhmZCA9ICQoYDxkaXYgaWQ9Imh0bWxfZDc5MGEyNDg0NjVlNDkwMzkxNmM0MTY2MTVkMDM4ZmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPkRXUEY8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMWJjMTMyYzQ5YzBiNDQwMWIyYjcwYmQ0YjIwZjFmOTcuc2V0Q29udGVudChodG1sX2Q3OTBhMjQ4NDY1ZTQ5MDM5MTZjNDE2NjE1ZDAzOGZkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2NhOWU2OTUzM2QyZjRkOGJhNjg1OTY4MzAxZDFhZjk5LmJpbmRQb3B1cChwb3B1cF8xYmMxMzJjNDljMGI0NDAxYjJiNzBiZDRiMjBmMWY5NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lNDA3YWIzMTI0Yzk0Y2NhYmY5ZDhmYmYxZjQ2N2ZkNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjQ3NzYsIDEyNi42MjM5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jYzc0MGFhNGRlNDM0NDkwYTIxYzIyZmQ1ZWIyYmZkZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNjMyYTA5MjkxNGI3NGQ1ZjgyMjZmYTI5OTVjOGU3NDAgPSAkKGA8ZGl2IGlkPSJodG1sXzYzMmEwOTI5MTRiNzRkNWY4MjI2ZmEyOTk1YzhlNzQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5JTkNOPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2NjNzQwYWE0ZGU0MzQ0OTBhMjFjMjJmZDVlYjJiZmRlLnNldENvbnRlbnQoaHRtbF82MzJhMDkyOTE0Yjc0ZDVmODIyNmZhMjk5NWM4ZTc0MCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lNDA3YWIzMTI0Yzk0Y2NhYmY5ZDhmYmYxZjQ2N2ZkNy5iaW5kUG9wdXAocG9wdXBfY2M3NDBhYTRkZTQzNDQ5MGEyMWMyMmZkNWViMmJmZGUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmVkZDBkZTU0ZmE2NDZlODg0ZWQ3YzBiOWE2NTM2MTUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNC41NDA4LCA2OS4wNDMyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80YWQ5NTY3MWM3ZGQ0Y2UxYTdmOTRjZDJiYzQ3ZGVkNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZmQyZDJkMmNiMTU1NGYyNjk5YTE5YWU2MTNlZTE3MGMgPSAkKGA8ZGl2IGlkPSJodG1sX2ZkMmQyZDJjYjE1NTRmMjY5OWExOWFlNjEzZWUxNzBjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5LQkw8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNGFkOTU2NzFjN2RkNGNlMWE3Zjk0Y2QyYmM0N2RlZDUuc2V0Q29udGVudChodG1sX2ZkMmQyZDJjYjE1NTRmMjY5OWExOWFlNjEzZWUxNzBjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2ZlZGQwZGU1NGZhNjQ2ZTg4NGVkN2MwYjlhNjUzNjE1LmJpbmRQb3B1cChwb3B1cF80YWQ5NTY3MWM3ZGQ0Y2UxYTdmOTRjZDJiYzQ3ZGVkNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yZTI5NzFiZGRlMjE0MzFjYTM0ZGM3OTVlOTk1YzMwOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy0xNS4yNzc5LCAyOC4xODgyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yZjFjOGZhYzlhMTM0NTMyOWNiZmViYzZlZGVmNGNhYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYzYwZWFkYzc3YzFlNDU5OTk2MzY3MmIwMjhkMDI2NmEgPSAkKGA8ZGl2IGlkPSJodG1sX2M2MGVhZGM3N2MxZTQ1OTk5NjM2NzJiMDI4ZDAyNjZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5MU1o8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMmYxYzhmYWM5YTEzNDUzMjljYmZlYmM2ZWRlZjRjYWEuc2V0Q29udGVudChodG1sX2M2MGVhZGM3N2MxZTQ1OTk5NjM2NzJiMDI4ZDAyNjZhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzJlMjk3MWJkZGUyMTQzMWNhMzRkYzc5NWU5OTVjMzA5LmJpbmRQb3B1cChwb3B1cF8yZjFjOGZhYzlhMTM0NTMyOWNiZmViYzZlZGVmNGNhYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZjBkNWE2MDZiNDQ0OWQ2OTE3YzczODllNjRjNjJlZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzAuMjM3NiwgLTc4LjQ1MDhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzk0NjYzZTI4YTg0MzQ3NDdhMWZiNzcwMTEyYTM3MDA0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9hMDMxYTNiMWZhNGE0YjMzYTBhZmQzNWE3ZDdjNTliMiA9ICQoYDxkaXYgaWQ9Imh0bWxfYTAzMWEzYjFmYTRhNGIzM2EwYWZkMzVhN2Q3YzU5YjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPk9UQVY8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTQ2NjNlMjhhODQzNDc0N2ExZmI3NzAxMTJhMzcwMDQuc2V0Q29udGVudChodG1sX2EwMzFhM2IxZmE0YTRiMzNhMGFmZDM1YTdkN2M1OWIyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzVmMGQ1YTYwNmI0NDQ5ZDY5MTdjNzM4OWU2NGM2MmVmLmJpbmRQb3B1cChwb3B1cF85NDY2M2UyOGE4NDM0NzQ3YTFmYjc3MDExMmEzNzAwNCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zOTgxN2Y2OGQ3ZjQ0NzNhOTYzNWE2ZGM1Y2YwZDk3MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjAyMzMsIDE1OC42NDk5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zNjQ1ZWVlMWFmOWI0NTFkODYxZDk5NTY2NmQxM2E3YSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYzU0ZjJmYzQzMzUyNGI2M2FkMzBlMzc3NWRlNDg0MmUgPSAkKGA8ZGl2IGlkPSJodG1sX2M1NGYyZmM0MzM1MjRiNjNhZDMwZTM3NzVkZTQ4NDJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5QRVQ8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMzY0NWVlZTFhZjliNDUxZDg2MWQ5OTU2NjZkMTNhN2Euc2V0Q29udGVudChodG1sX2M1NGYyZmM0MzM1MjRiNjNhZDMwZTM3NzVkZTQ4NDJlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzM5ODE3ZjY4ZDdmNDQ3M2E5NjM1YTZkYzVjZjBkOTcyLmJpbmRQb3B1cChwb3B1cF8zNjQ1ZWVlMWFmOWI0NTFkODYxZDk5NTY2NmQxM2E3YSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kYmRjMWUwZDllNzM0MTY1OGE2M2IyODIyNTE5MTc5NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWy01LjgyNzQsIC0zNS45MDE0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lZmNlMjg1NTc2ZjM0YWQ0YThlZWZjZjhhMDYyM2RhZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOWJhZmU5NmE0MDhhNDYxMTg1MDAwY2E0YjIyZTY2YzMgPSAkKGA8ZGl2IGlkPSJodG1sXzliYWZlOTZhNDA4YTQ2MTE4NTAwMGNhNGIyMmU2NmMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5SQ0JSPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2VmY2UyODU1NzZmMzRhZDRhOGVlZmNmOGEwNjIzZGFlLnNldENvbnRlbnQoaHRtbF85YmFmZTk2YTQwOGE0NjExODUwMDBjYTRiMjJlNjZjMyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kYmRjMWUwZDllNzM0MTY1OGE2M2IyODIyNTE5MTc5Ny5iaW5kUG9wdXAocG9wdXBfZWZjZTI4NTU3NmYzNGFkNGE4ZWVmY2Y4YTA2MjNkYWUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNThjNzk1NzRiMjNiNGQxYmI0Zjk4ZTgxMGZmMzc5YTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstOC45NDg5LCAtNjMuMTgzMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzM3ZTRkZWVlZjliNDI0M2EwYTIyNGE1Yjc4OThlM2YgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzBmMjY0OTc3MmM5NDQyMzJiZDM0MThkOTcyYmNjMDIxID0gJChgPGRpdiBpZD0iaHRtbF8wZjI2NDk3NzJjOTQ0MjMyYmQzNDE4ZDk3MmJjYzAyMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGI+U0FNTDwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9jMzdlNGRlZWVmOWI0MjQzYTBhMjI0YTViNzg5OGUzZi5zZXRDb250ZW50KGh0bWxfMGYyNjQ5NzcyYzk0NDIzMmJkMzQxOGQ5NzJiY2MwMjEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNThjNzk1NzRiMjNiNGQxYmI0Zjk4ZTgxMGZmMzc5YTQuYmluZFBvcHVwKHBvcHVwX2MzN2U0ZGVlZWY5YjQyNDNhMGEyMjRhNWI3ODk4ZTNmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Y1MTFhYjU3MGZjMjQyNTFhMDMyNDcwMGY0YmFmZjFlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbOC44ODM5LCAtNzAuNjM0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83MzcwODJiNzNhNjk0YWQ5YjBmYWE4OTRmYTM1NDlhOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNzQ2YjAzMGM3OWEwNGE0N2E4OTk5NmQyZDI4MmE2YzEgPSAkKGA8ZGl2IGlkPSJodG1sXzc0NmIwMzBjNzlhMDRhNDdhODk5OTZkMmQyODJhNmMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5TRFY8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzM3MDgyYjczYTY5NGFkOWIwZmFhODk0ZmEzNTQ5YTguc2V0Q29udGVudChodG1sXzc0NmIwMzBjNzlhMDRhNDdhODk5OTZkMmQyODJhNmMxKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2Y1MTFhYjU3MGZjMjQyNTFhMDMyNDcwMGY0YmFmZjFlLmJpbmRQb3B1cChwb3B1cF83MzcwODJiNzNhNjk0YWQ5YjBmYWE4OTRmYTM1NDlhOCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hODZhNDcyZGNkZGM0NjA2ODI1MWUxMzhlOTlhMjQyZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzY2Ljk5NjEsIC01MC42MjA3Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMDA5NWNmYmU5ZGY2NGRjN2EyMGI2YjdkZmVkOWJlNjggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzNmMGE2MWJmMDQzODQ2ODhhMGM0YWYxNjQwZDZkZjAwID0gJChgPGRpdiBpZD0iaHRtbF8zZjBhNjFiZjA0Mzg0Njg4YTBjNGFmMTY0MGQ2ZGYwMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGI+U0ZKRDwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wMDk1Y2ZiZTlkZjY0ZGM3YTIwYjZiN2RmZWQ5YmU2OC5zZXRDb250ZW50KGh0bWxfM2YwYTYxYmYwNDM4NDY4OGEwYzRhZjE2NDBkNmRmMDApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYTg2YTQ3MmRjZGRjNDYwNjgyNTFlMTM4ZTk5YTI0MmQuYmluZFBvcHVwKHBvcHVwXzAwOTVjZmJlOWRmNjRkYzdhMjBiNmI3ZGZlZDliZTY4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzJiY2U3NzY5ODY5YjQ5ZmE5MTcyOTk4NTliNGFmNmQwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM1OCwgLTc3Ljg4NzZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzQ5NGFlODIxODZkNTQ3MTBhYzJlMzAwMTE0YTI4MTViID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF82YmYwYTg4YjI3NzI0OTNjODg5ODNkMTgwZTIzMWZkMyA9ICQoYDxkaXYgaWQ9Imh0bWxfNmJmMGE4OGIyNzcyNDkzYzg4OTgzZDE4MGUyMzFmZDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPlNTUEE8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDk0YWU4MjE4NmQ1NDcxMGFjMmUzMDAxMTRhMjgxNWIuc2V0Q29udGVudChodG1sXzZiZjBhODhiMjc3MjQ5M2M4ODk4M2QxODBlMjMxZmQzKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzJiY2U3NzY5ODY5YjQ5ZmE5MTcyOTk4NTliNGFmNmQwLmJpbmRQb3B1cChwb3B1cF80OTRhZTgyMTg2ZDU0NzEwYWMyZTMwMDExNGEyODE1YikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZWJlZTdmM2QzNWQ0NjhiYTM4ODg3YjZjMDQyZjAzZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzIwLjIyNjMsIC04OC4yNzYzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80NzllYzE0ZjA5M2Y0MjRjODZkZTI4ODMwZWRlNzQ3MiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMDViMzRlYWFmMmNkNGViMjhiMDk3NmZjZGM1NTk3OGUgPSAkKGA8ZGl2IGlkPSJodG1sXzA1YjM0ZWFhZjJjZDRlYjI4YjA5NzZmY2RjNTU5NzhlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5URUlHPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzQ3OWVjMTRmMDkzZjQyNGM4NmRlMjg4MzBlZGU3NDcyLnNldENvbnRlbnQoaHRtbF8wNWIzNGVhYWYyY2Q0ZWIyOGIwOTc2ZmNkYzU1OTc4ZSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8wZWJlZTdmM2QzNWQ0NjhiYTM4ODg3YjZjMDQyZjAzZi5iaW5kUG9wdXAocG9wdXBfNDc5ZWMxNGYwOTNmNDI0Yzg2ZGUyODgzMGVkZTc0NzIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTkwODdhNTJjZjM1NDhkYzhhMzg3YzkxZmM1MzZkYWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuMjAyMiwgMTcuNTgzOF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZGIxMDVmMDQwMzU0NGQ1Y2JmNmJlMjgzZDVhMGE4YTggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzVhNTlkMmE3OTMwNjRiNDFiNGFiZTlkMDhjZTU5ZDNhID0gJChgPGRpdiBpZD0iaHRtbF81YTU5ZDJhNzkzMDY0YjQxYjRhYmU5ZDA4Y2U1OWQzYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGI+VFNVTTwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9kYjEwNWYwNDAzNTQ0ZDVjYmY2YmUyODNkNWEwYThhOC5zZXRDb250ZW50KGh0bWxfNWE1OWQyYTc5MzA2NGI0MWI0YWJlOWQwOGNlNTlkM2EpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMTkwODdhNTJjZjM1NDhkYzhhMzg3YzkxZmM1MzZkYWUuYmluZFBvcHVwKHBvcHVwX2RiMTA1ZjA0MDM1NDRkNWNiZjZiZTI4M2Q1YTBhOGE4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2I5ZmZkNjdhMGZlZjQ2NjE5NjlhNWE1OWM2MmE3NzE1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuODY1MSwgMTA3LjA1MzJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzc5YjIxOTc5MzRiYzQzNzRiMWEwZTJmMzRjOWJkYTkzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9kMzQ2MGI3NWJjMjQ0MmZlYmJlOTZmMjY0N2QzZmQ1OCA9ICQoYDxkaXYgaWQ9Imh0bWxfZDM0NjBiNzViYzI0NDJmZWJiZTk2ZjI2NDdkM2ZkNTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPlVMTjwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF83OWIyMTk3OTM0YmM0Mzc0YjFhMGUyZjM0YzliZGE5My5zZXRDb250ZW50KGh0bWxfZDM0NjBiNzViYzI0NDJmZWJiZTk2ZjI2NDdkM2ZkNTgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYjlmZmQ2N2EwZmVmNDY2MTk2OWE1YTU5YzYyYTc3MTUuYmluZFBvcHVwKHBvcHVwXzc5YjIxOTc5MzRiYzQzNzRiMWEwZTJmMzRjOWJkYTkzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzIwN2YwNGEzMWMxMzQyMGJhZDU4YjRmMjk1Nzg0ZjhiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguMjI4OSwgLTg2LjI5MzldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzA2NDZmNWNkNTBkOTQ5MjNhOGUwMjFiMjY0MTEyMGIwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9lMmY5OTg3ZWJiYWM0MGUwODdhOTVmNWVjNzg4MjdiMyA9ICQoYDxkaXYgaWQ9Imh0bWxfZTJmOTk4N2ViYmFjNDBlMDg3YTk1ZjVlYzc4ODI3YjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPldDSTwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wNjQ2ZjVjZDUwZDk0OTIzYThlMDIxYjI2NDExMjBiMC5zZXRDb250ZW50KGh0bWxfZTJmOTk4N2ViYmFjNDBlMDg3YTk1ZjVlYzc4ODI3YjMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMjA3ZjA0YTMxYzEzNDIwYmFkNThiNGYyOTU3ODRmOGIuYmluZFBvcHVwKHBvcHVwXzA2NDZmNWNkNTBkOTQ5MjNhOGUwMjFiMjY0MTEyMGIwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzc0ZGYwNmE4ZjMxYTRhY2RhMjhmOWI5ZjYzZmQzODczID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNjIuMDMxLCAxMjkuNjgwNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDI5NGU4YjQ5NTNiNDQzNzllNjYxYmMyNTgxYTNiN2UgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzhkNjAzMGNmYmNmMDQ2ZGQ5ZjYxZTIzZTFmZGVjMGEyID0gJChgPGRpdiBpZD0iaHRtbF84ZDYwMzBjZmJjZjA0NmRkOWY2MWUyM2UxZmRlYzBhMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGI+WUFLPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2QyOTRlOGI0OTUzYjQ0Mzc5ZTY2MWJjMjU4MWEzYjdlLnNldENvbnRlbnQoaHRtbF84ZDYwMzBjZmJjZjA0NmRkOWY2MWUyM2UxZmRlYzBhMik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83NGRmMDZhOGYzMWE0YWNkYTI4ZjliOWY2M2ZkMzg3My5iaW5kUG9wdXAocG9wdXBfZDI5NGU4YjQ5NTNiNDQzNzllNjYxYmMyNTgxYTNiN2UpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjVmN2MwZTg5NGIxNDJlMmJmODMzN2VhNTY3NTg3YTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0NC4xMTg4LCAxNDIuNTkzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kYmRhZDk5NWJhZDU0ZmRkODk0ZjJiNjdkNzc4MjBlMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNzMxM2VmYjBkYWNkNDc1Njk3NWM3YzFlMDFjMTUyNzcgPSAkKGA8ZGl2IGlkPSJodG1sXzczMTNlZmIwZGFjZDQ3NTY5NzVjN2MxZTAxYzE1Mjc3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5BU0FKPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2RiZGFkOTk1YmFkNTRmZGQ4OTRmMmI2N2Q3NzgyMGUzLnNldENvbnRlbnQoaHRtbF83MzEzZWZiMGRhY2Q0NzU2OTc1YzdjMWUwMWMxNTI3Nyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yNWY3YzBlODk0YjE0MmUyYmY4MzM3ZWE1Njc1ODdhMy5iaW5kUG9wdXAocG9wdXBfZGJkYWQ5OTViYWQ1NGZkZDg5NGYyYjY3ZDc3ODIwZTMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjkxMTJiOGNlZDIyNDU4YTkwNjRiMmY4YjE5OGIwNWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC40MzQ4LCA1OC4wMTY0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xNjZkZDc2NDExNmM0Y2E3YTIwZTc4MmRlYjFhZTFlNiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNWU0NTFkNDQ3OWE3NDgxNmE5Y2U5Y2QyNGJlYjI0NDMgPSAkKGA8ZGl2IGlkPSJodG1sXzVlNDUxZDQ0NzlhNzQ4MTZhOWNlOWNkMjRiZWIyNDQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5BS1RPPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzE2NmRkNzY0MTE2YzRjYTdhMjBlNzgyZGViMWFlMWU2LnNldENvbnRlbnQoaHRtbF81ZTQ1MWQ0NDc5YTc0ODE2YTljZTljZDI0YmViMjQ0Myk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iOTExMmI4Y2VkMjI0NThhOTA2NGIyZjhiMTk4YjA1ZS5iaW5kUG9wdXAocG9wdXBfMTY2ZGQ3NjQxMTZjNGNhN2EyMGU3ODJkZWIxYWUxZTYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmVlYjNiMWEwMmU3NDhiNGFjNjFkMjgyNmJkNzA1OGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxLjM2MDgsIDEwMy43NzI5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80ZDk4NGY5MzhmZDE0MjQ4OWNkNGQ3YjQ4ZTQwYzAxOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMTk4ZDBmODVhMDVlNDU4Mzg5MDFmNWNhZDg5YzI0MmQgPSAkKGA8ZGl2IGlkPSJodG1sXzE5OGQwZjg1YTA1ZTQ1ODM4OTAxZjVjYWQ4OWMyNDJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5CVERGPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzRkOTg0ZjkzOGZkMTQyNDg5Y2Q0ZDdiNDhlNDBjMDE4LnNldENvbnRlbnQoaHRtbF8xOThkMGY4NWEwNWU0NTgzODkwMWY1Y2FkODljMjQyZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82ZWViM2IxYTAyZTc0OGI0YWM2MWQyODI2YmQ3MDU4ZC5iaW5kUG9wdXAocG9wdXBfNGQ5ODRmOTM4ZmQxNDI0ODljZDRkN2I0OGU0MGMwMTgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWNjODFjNTljZjQyNGY2N2E5NGZmNWI4YjNhYjI1NWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs3MC45ODY2LCAtOC41MDU3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84Nzc2NTM2NWQ4ZGE0OWMyODk4OTJmOWM5MjZkNjFhNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNzI0ZTc2OTE5MGViNDU1YTgxZTIwNjFlN2VkZTQxMTMgPSAkKGA8ZGl2IGlkPSJodG1sXzcyNGU3NjkxOTBlYjQ1NWE4MWUyMDYxZTdlZGU0MTEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5KTUlDPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg3NzY1MzY1ZDhkYTQ5YzI4OTg5MmY5YzkyNmQ2MWE1LnNldENvbnRlbnQoaHRtbF83MjRlNzY5MTkwZWI0NTVhODFlMjA2MWU3ZWRlNDExMyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl85Y2M4MWM1OWNmNDI0ZjY3YTk0ZmY1YjhiM2FiMjU1ZS5iaW5kUG9wdXAocG9wdXBfODc3NjUzNjVkOGRhNDljMjg5ODkyZjljOTI2ZDYxYTUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfODRiYTdiNWE1NTA5NDdkYjllNTUxZjQwZjQzOGJmNjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny45NDYyLCAtOTEuNDk1M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZmRlYjFhNTZhYzViNGJkZDk0MzBiYmQ5ODAwMzBjOTMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzgzMzdiZDgyY2EyYTQyYTk4Yjk3NWQ0OGZkZWUyNTQxID0gJChgPGRpdiBpZD0iaHRtbF84MzM3YmQ4MmNhMmE0MmE5OGI5NzVkNDhmZGVlMjU0MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGI+RVlNTjwvYj48L2g0PjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9mZGViMWE1NmFjNWI0YmRkOTQzMGJiZDk4MDAzMGM5My5zZXRDb250ZW50KGh0bWxfODMzN2JkODJjYTJhNDJhOThiOTc1ZDQ4ZmRlZTI1NDEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfODRiYTdiNWE1NTA5NDdkYjllNTUxZjQwZjQzOGJmNjguYmluZFBvcHVwKHBvcHVwX2ZkZWIxYTU2YWM1YjRiZGQ5NDMwYmJkOTgwMDMwYzkzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzliZDQxYTg0OGU2MTQ0NWFiN2U4YmNhZDFmODdmMGUwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMTQuNDg3MjQsIDQ5LjAzNzc5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzI4NzIwMDNhMjQ0YjQwYjI5ZGY0ZGE1MTMxMTQ4NmE2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iYTNlNTY2MzE4NWQ0ODdhOWM3Y2NhZmE3OGZiZTI2MiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMWM1ZGJiMjYwNzRjNDU0MWFmN2M5N2NkMzAwNTZmOTQgPSAkKGA8ZGl2IGlkPSJodG1sXzFjNWRiYjI2MDc0YzQ1NDFhZjdjOTdjZDMwMDU2Zjk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48Yj5NVUtBPC9iPjwvaDQ+PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2JhM2U1NjYzMTg1ZDQ4N2E5YzdjY2FmYTc4ZmJlMjYyLnNldENvbnRlbnQoaHRtbF8xYzVkYmIyNjA3NGM0NTQxYWY3Yzk3Y2QzMDA1NmY5NCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl85YmQ0MWE4NDhlNjE0NDVhYjdlOGJjYWQxZjg3ZjBlMC5iaW5kUG9wdXAocG9wdXBfYmEzZTU2NjMxODVkNDg3YTljN2NjYWZhNzhmYmUyNjIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWVjMWIxYWNhMzY1NDc5ODlkYTU4ZmJlMzFhM2FkNWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsxMy42MzUsIDM4Ljk4MTFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2MxMTE3MjYyNjcwMzQ5Mjg5ZjhhMjg4OWU1OTExOTVkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jOTllOGM3NGNlZDk0M2E5YTE5MzA4N2MxYzlhOTA5OSA9ICQoYDxkaXYgaWQ9Imh0bWxfYzk5ZThjNzRjZWQ5NDNhOWExOTMwODdjMWM5YTkwOTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxiPkFEWUU8L2I+PC9oND48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYzExMTcyNjI2NzAzNDkyODlmOGEyODg5ZTU5MTE5NWQuc2V0Q29udGVudChodG1sX2M5OWU4Yzc0Y2VkOTQzYTlhMTkzMDg3YzFjOWE5MDk5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2VlYzFiMWFjYTM2NTQ3OTg5ZGE1OGZiZTMxYTNhZDViLmJpbmRQb3B1cChwb3B1cF9jMTExNzI2MjY3MDM0OTI4OWY4YTI4ODllNTkxMTk1ZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBsYXRfbG5nX3BvcHVwXzVhNjI3ZTEwY2NhYzQ0YWQ5NDZjZjM1MDdlNmRmYWE0ID0gTC5wb3B1cCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbGF0TG5nUG9wKGUpIHsKICAgICAgICAgICAgICAgICAgICBsYXRfbG5nX3BvcHVwXzVhNjI3ZTEwY2NhYzQ0YWQ5NDZjZjM1MDdlNmRmYWE0CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXRMbmcoZS5sYXRsbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KCJMYXRpdHVkZTogIiArIGUubGF0bG5nLmxhdC50b0ZpeGVkKDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5Mb25naXR1ZGU6ICIgKyBlLmxhdGxuZy5sbmcudG9GaXhlZCg0KSkKICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PbihtYXBfMjg3MjAwM2EyNDRiNDBiMjlkZjRkYTUxMzExNDg2YTYpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcF8yODcyMDAzYTI0NGI0MGIyOWRmNGRhNTEzMTE0ODZhNi5vbignY2xpY2snLCBsYXRMbmdQb3ApOwogICAgICAgICAgICAKPC9zY3JpcHQ+ onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
  954. ],
  955. "text/plain": [
  956. "<folium.folium.Map at 0x7f1bc335bd68>"
  957. ]
  958. },
  959. "execution_count": 15,
  960. "metadata": {},
  961. "output_type": "execute_result"
  962. }
  963. ],
  964. "source": [
  965. "def plot_stations():\n",
  966. " import folium\n",
  967. " fmap = folium.Map(\n",
  968. " location=[best_source.lat, best_source.lon],\n",
  969. " tiles='Stamen Terrain',\n",
  970. " zoom_start=3)\n",
  971. " folium.Marker([best_source.lat, best_source.lon],\n",
  972. " popup=('2009 Aquila Earthquake'),\n",
  973. " icon=folium.Icon(color='red', icon='info-sign')).add_to(fmap)\n",
  974. " \n",
  975. " for s in stations_list:\n",
  976. " folium.Marker([s.lat, s.lon],\n",
  977. " popup='<b>%s</b></h4>' % s.station).add_to(fmap)\n",
  978. " fmap.add_child(folium.LatLngPopup())\n",
  979. " return fmap\n",
  980. " \n",
  981. "plot_stations()"
  982. ]
  983. },
  984. {
  985. "cell_type": "code",
  986. "execution_count": 16,
  987. "metadata": {},
  988. "outputs": [
  989. {
  990. "data": {
  991. "image/png": "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QtHv5u+//05ISAhjxow54LgZM2awdOlSjjvuOJ555plKvsuKp6y/P1WBDUCWwyYhIYGxY8fy+uuvo6okJyfTv39/evToQY8ePZgzZw4A9913H7NnzyYxMZFRo0b95biaTkpKCnXr1iU0NBSAunXrsmrVKs4777ziMdOmTeP8888HzF/dDz74IN26daN3797s2LGDOXPm8OWXX3L33XeTmJjIunXrAPj000/p1asXbdu2Zfbs2QAEg0Huvvtujj/+eLp27cpbb70F/Pl5z5w5k6FDhwKQlZXFVVddVbwK+Oyzzyrt+VQm/fv3Z+3atQcdM2DAgD+M2f/fAuCrr77ihBNOoHv37px66qnFx2fNmkViYiKJiYl0796dzMxMAF544YXif49HH330gD83Ly+v+N+ge/fuzJgxA4Dx48czbNgwhgwZQps2bbjnnnsA8+88YsQIOnfuTJcuXRg1ahQA69atY8iQIfTs2ZP+/fuzatWqv/z9qe7YIoQaxm23wZIl5XvNxER4+eXDO6dly5YEg0F27txJQkIC06ZNIywsjKSkJC655BIWLlzIc889x4svvsjkyZMByMnJOeC4cqUKHtDgwYN54oknaNu2LaeeeioXXXQRAwcO5KabbmLXrl3Ex8fzzjvvcPXVVwOQnZ1N7969efrpp7nnnnv497//zUMPPcQ555zD0KFDueCCC4qvHQgEmD9/Pt988w2PP/4406dP5+233yY2NpYFCxaQn59P3759GTx48J+e98yZM4uv8+STTxIbG8uyZcsASEtLK99nBFSU+kxpexUDgQDffvstQ4bsL+v3RyZPnkyXLl2Av/636NevH7/88gsiwrhx43j++ed56aWXePHFFxk9ejR9+/YlKyuLsLAwpk6dSlJSEvPnz0dVOeecc/jxxx8ZMGDAH37u6NGjERGWLVvGqlWrGDx4MGvWrAFgyZIl/Prrr4SGhtKuXTtGjhzJzp072bp1K7//bjRy09PTAbjuuusYM2YMbdq0Yd68edx000388MMPB/z9KcnGjRsvy8vLKxSRzar6CYCIDAJewCxGsoARqrpWRO4ArsX0Ae0CrlbVjQd7rq547T8wvYr/VtVDfqrYAGQpM4WFhdx8880sWbIEr9db/D/VkY6raURFRbFo0SJmz57NjBkzuOiii3juuee4/PLL+eCDD7jqqquYO3cu7733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\n",
  992. "text/plain": [
  993. "<Figure size 432x288 with 57 Axes>"
  994. ]
  995. },
  996. "metadata": {
  997. "needs_background": "light"
  998. },
  999. "output_type": "display_data"
  1000. }
  1001. ],
  1002. "source": [
  1003. "plot_traces(result)"
  1004. ]
  1005. },
  1006. {
  1007. "cell_type": "markdown",
  1008. "metadata": {},
  1009. "source": [
  1010. "Alternatively we can plot using snuffler, which will open in a seperate window."
  1011. ]
  1012. },
  1013. {
  1014. "cell_type": "code",
  1015. "execution_count": 17,
  1016. "metadata": {},
  1017. "outputs": [
  1018. {
  1019. "name": "stderr",
  1020. "output_type": "stream",
  1021. "text": [
  1022. "store_superdir not available: /media/asteinbe/moho/gfstores\n",
  1023. "\n",
  1024. " /home/asteinbe/.snufflings/okada/libokada.so: cannot open shared object file: No such file or directory\n",
  1025. "--> run 'make' in okada snuffling directory <--\n",
  1026. "cc.py:pyrocko.gf.seismosizer - WARNING - store_superdir not available: /media/asteinbe/moho/gfstores\n"
  1027. ]
  1028. }
  1029. ],
  1030. "source": [
  1031. "plot_snuffler(result, best_source)"
  1032. ]
  1033. },
  1034. {
  1035. "cell_type": "code",
  1036. "execution_count": null,
  1037. "metadata": {},
  1038. "outputs": [],
  1039. "source": []
  1040. }
  1041. ],
  1042. "metadata": {
  1043. "kernelspec": {
  1044. "display_name": "Python 3",
  1045. "language": "python",
  1046. "name": "python3"
  1047. },
  1048. "language_info": {
  1049. "codemirror_mode": {
  1050. "name": "ipython",
  1051. "version": 3
  1052. },
  1053. "file_extension": ".py",
  1054. "mimetype": "text/x-python",
  1055. "name": "python",
  1056. "nbconvert_exporter": "python",
  1057. "pygments_lexer": "ipython3",
  1058. "version": "3.6.9"
  1059. }
  1060. },
  1061. "nbformat": 4,
  1062. "nbformat_minor": 2
  1063. }