Last active
September 16, 2018 02:01
-
-
Save Akeboshiwind/b52d58ab71ebefaf08069832239c5ced to your computer and use it in GitHub Desktop.
Lastfm Analysis
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; gorilla-repl.fileformat = 1 | |
;; ** | |
;;; # LastFM Analysis | |
;; ** | |
;; @@ | |
(ns lastfm-analysis | |
(:require [gorilla-plot.core :as plot])) | |
(defn add-deps | |
[deps-list] | |
(cemerick.pomegranate/add-dependencies | |
:coordinates deps-list | |
:repositories (merge cemerick.pomegranate.aether/maven-central | |
{"clojars" "https://clojars.org/repo"}))) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-var'>#'lastfm-analysis/add-deps</span>","value":"#'lastfm-analysis/add-deps"} | |
;; <= | |
;; ** | |
;;; ## Step 1: Analyse the problem | |
;;; | |
;;; ### Problem text: | |
;;; | |
;;; > If we define a user ‘session’ to be comprised of one or more songs played by that user, where each song is started within 20 minutes of the previous song’s start time. Create a list of the top 10 songs played in the top 50 longest sessions by tracks count. Please provide a tab separated text file with your answer, along with all scripts, tools and info needed to execute the test. | |
;;; | |
;;; | |
;;; ### Below I will analyse the text line by line | |
;;; | |
;;; #### Part 1: | |
;;; | |
;;; > If we define a user ‘session’ to be comprised of one or more songs played by that user, where each song is started within 20 minutes of the previous song’s start time. | |
;;; | |
;;; - The data needs to be analysed on a per-user basis | |
;;; - A number of sessions may need to be found and stored for each user | |
;;; - What data will *actually* need to be stored for each session | |
;;; - Will probabaly want to keep this low | |
;;; - The analysis doesn't care about the length of each song | |
;;; - What if there is a song that is longer than 20 minutes? | |
;;; - In this case we are not provided with data on the length of the song | |
;;; - 20 minute time frame is provided, so we will need to for each user store the time the previous song started | |
;;; | |
;;; #### Part 2: | |
;;; | |
;;; > Create a list of the top 10 songs played in the top 50 longest sessions by tracks count. | |
;;; | |
;;; - There are actually two problems here to solve: | |
;;; - What are the 50 longest sessions? | |
;;; - What are the 10 most played songs in those top 50 sessions? | |
;;; - Neither question cares about who the users is, just that each session is for an individual user | |
;;; - The length in time of the session doesn't matter, so only the start time of of the previous song needs to be stored for a session | |
;;; - The session needs to store a list of songs so that they can be counted later | |
;;; | |
;;; #### Part 3: | |
;;; | |
;;; > Please provide a tab separated text file with your answer, along with all scripts, tools and info needed to execute the test. | |
;;; | |
;;; - The results should be provided in a tab separated file | |
;;; - Scripts tools and info should be provided | |
;;; - Probabaly a good idea to start a document (this one) to record my thoughts | |
;;; | |
;;; | |
;;; #### Thoughts on possible solutions: | |
;;; | |
;;; - The most intensive step in this probem is finding the 50 longest sessions so I will focus on that for now as the last part should be simpler | |
;;; - The simplest solution is to simply iterate over the entire dataset finding | |
;;; all the sessions, sorting the list by length, then `take` the first 50 | |
;;; - With a dataset size of 19 million lines this will be slow as the list has to be sorted in a separate step | |
;;; - This also means that we have to store all of the sessions to be able to sort them | |
;;; - The time complexity of this soluiton should be something like O(n^2\*log(n)) if we don't use a fancy sorting algorithm like radix sort | |
;;; - The space complexity being something like O(the number of sessions) | |
;;; - One possible alteration to the previous solution could be to store two | |
;;; lists | |
;;; - One list of incomplete sessions and another for complete sessions | |
;;; - Once a session has been found to be complete it can be inserted into the other list in the correct order | |
;;; - After a new session has been added to the completed list, the completed list could then be shoretened to 50 or less entries | |
;;; - This means that the list doesn't need to be sorted after all the sessions are found, and each session only needs to be compared to 50 other sessions at most (much less if we use something like binary search) | |
;;; - The time complexity of this soluiton should be something like O(n\*log(50)) or O(n) | |
;;; - The space complexity being something like O(the number of users + 50) so effectively O(1) (although the nuber of users could change with n) | |
;;; - It probabaly won't be possble to find another algorithm that is faster because the algorithm is limited by the fact that every piece of data needs to be read in order | |
;;; - It should be possible to thread this solution | |
;;; - Possible points of intrest with threading the solution are: | |
;;; - Each thread needs to store it's own top 50 sessions because theoretically one could get all 50 top sessions | |
;;; - Each thread would need to discard the first session it finds (except the thread that is working with the first set of data) as it is likely to be part of a session in the previous chunk of data | |
;;; - There is an edge case here where the first session a thread finds happens to start exactly where it's chunk of data starts, but the thread has no way of knowing. | |
;;; - This means that each thread needs to continue past the end of it's chunk, until it finds the end of each of the current sessions | |
;;; | |
;; ** | |
;; ** | |
;;; ## Step 2: Clean the data | |
;;; | |
;;; To load the data we will need to load the external dependancy `clojure.data.csv` as well as requiring `clojure.java.io`. | |
;; ** | |
;; @@ | |
(add-deps '[[org.clojure/data.csv "0.1.4"]]) | |
(require '[clojure.java.io :as io] | |
'[clojure.data.csv :as csv]) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-nil'>nil</span>","value":"nil"} | |
;; <= | |
;; ** | |
;;; `data.small.tsv` is the first 1,000,000 lines of the full data. | |
;;; This is fully loaded into memory for testing purposes \uFFFF is used as the quote symbol because none of the data is quoted, but the data does include some double and single quotes. \uFFFF is used becuase it an unused unicode character and the reader library does not support not including a quote character. | |
;; ** | |
;; @@ | |
(def data-small | |
(with-open [r (io/reader (io/file "./data/data.small.tsv"))] | |
(doall (csv/read-csv r | |
:separator \tab | |
:quote \uFFFF)))) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-var'>#'lastfm-analysis/data-small</span>","value":"#'lastfm-analysis/data-small"} | |
;; <= | |
;; ** | |
;;; Let's just check that the first row has 6 rows as expected | |
;; ** | |
;; @@ | |
(count (first data-small)) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-unkown'>6</span>","value":"6"} | |
;; <= | |
;; ** | |
;;; And that this is true for all of the rows, it could be that some rows are ommited which I would need to fix. | |
;; ** | |
;; @@ | |
(count (filter #(not= 6 (count %)) data-small)) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-unkown'>0</span>","value":"0"} | |
;; <= | |
;; ** | |
;;; Let's have a look at the first row of the data: | |
;; ** | |
;; @@ | |
(first data-small) | |
;; @@ | |
;; => | |
;;; {"type":"list-like","open":"<span class='clj-vector'>[</span>","close":"<span class='clj-vector'>]</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-string'>"user_000001"</span>","value":"\"user_000001\""},{"type":"html","content":"<span class='clj-string'>"2009-05-04T23:08:57Z"</span>","value":"\"2009-05-04T23:08:57Z\""},{"type":"html","content":"<span class='clj-string'>"f1b1cf71-bd35-4e99-8624-24a6e15f133a"</span>","value":"\"f1b1cf71-bd35-4e99-8624-24a6e15f133a\""},{"type":"html","content":"<span class='clj-string'>"Deep Dish"</span>","value":"\"Deep Dish\""},{"type":"html","content":"<span class='clj-string'>""</span>","value":"\"\""},{"type":"html","content":"<span class='clj-string'>"Fuck Me Im Famous (Pacha Ibiza)-09-28-2007"</span>","value":"\"Fuck Me Im Famous (Pacha Ibiza)-09-28-2007\""}],"value":"[\"user_000001\" \"2009-05-04T23:08:57Z\" \"f1b1cf71-bd35-4e99-8624-24a6e15f133a\" \"Deep Dish\" \"\" \"Fuck Me Im Famous (Pacha Ibiza)-09-28-2007\"]"} | |
;; <= | |
;; ** | |
;;; For my algorithm I only need to check that the `user_id`, `timestamp` and `musicbrainz-track-id` are never empty | |
;; ** | |
;; @@ | |
(count (filter (fn [row] | |
(or (empty? (nth row 0)) | |
(empty? (nth row 1)))) | |
data-small)) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-unkown'>0</span>","value":"0"} | |
;; <= | |
;; ** | |
;;; From the above we can see that there are no rows in the test dataset that are empty | |
;; ** | |
;; @@ | |
(count (filter (fn [row] | |
(empty? (nth row 4))) | |
data-small)) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-unkown'>134384</span>","value":"134384"} | |
;; <= | |
;; ** | |
;;; As we can see above, there are many cases where there is no `musicbrainz-track-id` | |
;;; | |
;;; As you can see below though, the track-name has no empty rows, so it is a better candidate for the identifier for the track. | |
;;; | |
;;; This also makes things easier as we don't need any of the other data. | |
;; ** | |
;; @@ | |
(count (filter (fn [row] | |
(empty? (nth row 5))) | |
data-small)) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-unkown'>0</span>","value":"0"} | |
;; <= | |
;; ** | |
;;; ## Step 3: Select only the bits we will need | |
;; ** | |
;; @@ | |
(defn select-data | |
"Selects the rows of data that we care about. | |
Row 0 is the user-id | |
Row 1 is the timestamp | |
Row 5 is the track-name" | |
[row] | |
[(nth row 0) | |
(nth row 1) | |
(nth row 5)]) | |
(select-data (first data-small)) | |
;; @@ | |
;; => | |
;;; {"type":"list-like","open":"<span class='clj-vector'>[</span>","close":"<span class='clj-vector'>]</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-string'>"user_000001"</span>","value":"\"user_000001\""},{"type":"html","content":"<span class='clj-string'>"2009-05-04T23:08:57Z"</span>","value":"\"2009-05-04T23:08:57Z\""},{"type":"html","content":"<span class='clj-string'>"Fuck Me Im Famous (Pacha Ibiza)-09-28-2007"</span>","value":"\"Fuck Me Im Famous (Pacha Ibiza)-09-28-2007\""}],"value":"[\"user_000001\" \"2009-05-04T23:08:57Z\" \"Fuck Me Im Famous (Pacha Ibiza)-09-28-2007\"]"} | |
;; <= | |
;; ** | |
;;; It would be useful to have the datetime in a useable format. | |
;;; | |
;;; For that I will need to import the `clj-time` library. | |
;; ** | |
;; @@ | |
(add-deps '[[clj-time "0.14.4"]]) | |
(require '[clj-time.core :as t] | |
'[clj-time.format :as f]) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-nil'>nil</span>","value":"nil"} | |
;; <= | |
;; @@ | |
(def timestamp-formatter | |
(f/formatters :date-time-no-ms)) | |
(defn select-and-convert-data | |
"Selects the rows of data that we care about, and converts the timestamp into | |
a clj-time object. | |
Row 0 is the user-id | |
Row 1 is the timestamp | |
Row 5 is the track-name" | |
[row] | |
[(nth row 0) | |
(f/parse timestamp-formatter (nth row 1)) | |
(nth row 5)]) | |
(select-and-convert-data (first data-small)) | |
;; @@ | |
;; => | |
;;; {"type":"list-like","open":"<span class='clj-vector'>[</span>","close":"<span class='clj-vector'>]</span>","separator":" ","items":[{"type":"html","content":"<span class='clj-string'>"user_000041"</span>","value":"\"user_000041\""},{"type":"html","content":"<span class='clj-unkown'>#object[org.joda.time.DateTime 0x4f49ce9b "2006-09-05T10:24:16.000Z"]</span>","value":"#object[org.joda.time.DateTime 0x4f49ce9b \"2006-09-05T10:24:16.000Z\"]"},{"type":"html","content":"<span class='clj-string'>"Kingdom"</span>","value":"\"Kingdom\""}],"value":"[\"user_000041\" #object[org.joda.time.DateTime 0x4f49ce9b \"2006-09-05T10:24:16.000Z\"] \"Kingdom\"]"} | |
;; <= | |
;; ** | |
;;; Now it is in a format where we can easily use the `clj-time` library to check the differences in times. | |
;;; | |
;;; ## Step 4: Data Mining | |
;;; | |
;;; While writing the code I need to be careful to make sure that the code was lazy, this will mean that I don't have to load the entire data file into memory to work on it | |
;;; | |
;;; At this point I started thinking about what exactly I need to store for each session. | |
;;; | |
;;; Complete sessions are independent of user-id so they can just be a list of track-names. | |
;;; | |
;;; Incomplete sessions are dependent on user-id last timestamp, so a good data structure would be to use a map of | |
;;; >`{user-id -> {:last-timestamp timestamp :tracks [list of track-names]}}` | |
;;; | |
;;; While I was writing the below function, I noticed that the data provided was in reverse time order. To fix this is simply reversed the order of the file using | |
;;; >`tac data.small.tsv >> data.small.reversed.tsv` | |
;; ** | |
;; @@ | |
(def data-small | |
(with-open [r (io/reader (io/file "./data/data.small.reversed.tsv"))] | |
(doall (csv/read-csv r | |
:separator \tab | |
:quote \uFFFF)))) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-var'>#'lastfm-analysis/data-small</span>","value":"#'lastfm-analysis/data-small"} | |
;; <= | |
;; ** | |
;;; I also discoverd that the data is sorted by user-id, my algorithm could have been slightly more efficient because I then only have to store one session instead of one for each user. But because the lookup time for maps is O(1) I won't bother changing my algorithm, although the `assoc`s could possibly affect the time complexity, I would need to do more resarch. | |
;;; | |
;;; This version of the longest-sessions function only implements the simple version of the algorithm I defined above in my analysis. I.e. it does the sorting at the end instead of during. The reason for this is because I thought of another way to implement this function to be simpler to understand and therefore easier to maintain. | |
;; ** | |
;; @@ | |
(defn longest-sessions-simple-version | |
"Finds the n longest sessions in the given data. | |
Returns a list of n sessions in order from longest to shortest" | |
[n data] | |
(loop [incomplete-sessions {} | |
complete-sessions [] | |
data data] | |
(if (empty? data) | |
(->> incomplete-sessions | |
(vals) | |
(map :tracks) | |
(concat complete-sessions) | |
(sort-by count) | |
(reverse) | |
(take n)) | |
(let [row (first data) | |
user-id (first row) | |
timestamp (second row) | |
track-name (nth row 2) | |
last-session (get incomplete-sessions user-id)] | |
(if (nil? last-session) | |
(recur (assoc incomplete-sessions ; Must be a user not seen before | |
user-id {:last-timestamp timestamp | |
:tracks [track-name]}) | |
complete-sessions | |
(rest data)) | |
(let [{:keys [last-timestamp tracks]} last-session | |
time-difference (if (t/after? timestamp last-timestamp) | |
(t/in-minutes (t/interval last-timestamp | |
timestamp)) | |
0)] | |
(if (>= time-difference 20) | |
(recur (assoc incomplete-sessions | |
user-id {:last-timestamp timestamp | |
:tracks [track-name]}) | |
(conj complete-sessions ;; TODO: replace | |
tracks) | |
(rest data)) | |
(recur (assoc incomplete-sessions | |
user-id {:last-timestamp timestamp | |
:tracks (conj tracks track-name)}) | |
complete-sessions | |
(rest data))))))))) | |
(def top-50-sessions-simple | |
(with-open [r (io/reader (io/file "./data/data.small.reversed.tsv"))] | |
(->> (csv/read-csv r :separator \tab :quote \uFFFF) | |
(map select-and-convert-data) | |
(longest-sessions-simple-version 50)))) | |
(count top-50-sessions-simple) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-unkown'>50</span>","value":"50"} | |
;; <= | |
;; ** | |
;;; After working on the above version for a while, I realised that it could be reimplemented in a simpler way using `reduce`. I've done this below. | |
;;; | |
;;; This version of the longest-sessions function also is simpler and sorts at the end. This is so that I can compare the times below to make sure that this version isn't much slower. | |
;;; | |
;; ** | |
;; @@ | |
(defn longest-sessions-reduce | |
"Finds the n longest sessions in the given data. | |
Returns a list of n sessions in order from longest to shortest" | |
[n data] | |
(let [sessions | |
(reduce (fn [{:keys [incomplete-sessions complete-sessions] | |
:as acc} | |
row] | |
(let [user-id (first row) | |
timestamp (second row) | |
track-name (nth row 2) | |
last-session (get incomplete-sessions user-id)] | |
(if (nil? last-session) | |
(assoc-in acc [:incomplete-sessions user-id] | |
{:last-timestamp timestamp | |
:tracks [track-name]}) | |
(let [{:keys [last-timestamp tracks]} last-session | |
time-difference (if (t/after? timestamp | |
last-timestamp) | |
(t/in-minutes | |
(t/interval last-timestamp | |
timestamp)) | |
0)] | |
(if (>= time-difference 20) | |
(-> acc | |
(assoc-in [:incomplete-sessions user-id] | |
{:last-timestamp timestamp | |
:tracks [track-name]}) | |
(assoc :complete-sessions | |
(conj complete-sessions | |
tracks))) | |
(assoc-in acc [:incomplete-sessions user-id] | |
{:last-timestamp timestamp | |
:tracks (conj tracks | |
track-name)})))))) | |
{:incomplete-sessions {} | |
:complete-sessions []} | |
data)] | |
(let [{:keys [incomplete-sessions complete-sessions]} sessions] | |
(->> incomplete-sessions | |
(vals) | |
(map :tracks) | |
(concat complete-sessions) | |
(sort-by count) | |
(reverse) | |
(take n))))) | |
(def top-50-sessions-simple-reduce | |
(with-open [r (io/reader (io/file "./data/data.small.reversed.tsv"))] | |
(->> (csv/read-csv r :separator \tab :quote \uFFFF) | |
(map select-and-convert-data) | |
(longest-sessions-reduce 50)))) | |
(count top-50-sessions-simple-reduce) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-unkown'>50</span>","value":"50"} | |
;; <= | |
;; ** | |
;;; Let's compare the times of each of the implementations: | |
;; ** | |
;; @@ | |
(time | |
(do | |
(with-open [r (io/reader (io/file "./data/data.small.reversed.tsv"))] | |
(->> (csv/read-csv r :separator \tab :quote \uFFFF) | |
(map select-and-convert-data) | |
(longest-sessions-simple-version 50))) | |
nil)) | |
;; @@ | |
;; -> | |
;;; "Elapsed time: 6835.644684 msecs" | |
;;; | |
;; <- | |
;; => | |
;;; {"type":"html","content":"<span class='clj-nil'>nil</span>","value":"nil"} | |
;; <= | |
;; @@ | |
(time | |
(do | |
(with-open [r (io/reader (io/file "./data/data.small.reversed.tsv"))] | |
(->> (csv/read-csv r :separator \tab :quote \uFFFF) | |
(map select-and-convert-data) | |
(longest-sessions-reduce 50))) | |
nil)) | |
;; @@ | |
;; -> | |
;;; "Elapsed time: 6923.395032 msecs" | |
;;; | |
;; <- | |
;; => | |
;;; {"type":"html","content":"<span class='clj-nil'>nil</span>","value":"nil"} | |
;; <= | |
;; ** | |
;;; As we can see there is about half a second difference between the | |
;;; implementations (or there was before I moved it to a gorilla repl, maybe it was the printing??), this is a small enough time difference that it won't make much difference. | |
;;; | |
;;; The actual difference in times will be about (\* 0.5 20) or 10 seconds for the total data set. This is because the test data I am using is about 1/20th of the total data. | |
;;; | |
;;; In the below implementation I use sorted-map with the structure `{count -> tracks}` to store the data, as this will sort the data as it is entered. Although I have to convert it from a seq back to a sorted-map every time I `take` 50 on it so that might slow things down. | |
;; ** | |
;; @@ | |
(defn longest-sessions-sorted-map | |
"Finds the n longest sessions in the given data. | |
Returns a list of n sessions in order from longest to shortest" | |
[n data] | |
(let [sessions | |
(reduce (fn [{:keys [incomplete-sessions complete-sessions] | |
:as acc} | |
row] | |
(let [user-id (first row) | |
timestamp (second row) | |
track-name (nth row 2) | |
last-session (get incomplete-sessions user-id)] | |
(if (nil? last-session) | |
(assoc-in acc [:incomplete-sessions user-id] | |
{:last-timestamp timestamp | |
:tracks [track-name]}) | |
(let [{:keys [last-timestamp tracks]} last-session | |
time-difference (if (t/after? timestamp | |
last-timestamp) | |
(t/in-minutes | |
(t/interval last-timestamp | |
timestamp)) | |
0)] | |
(if (>= time-difference 20) | |
(-> acc | |
(assoc-in [:incomplete-sessions user-id] | |
{:last-timestamp timestamp | |
:tracks [track-name]}) | |
(assoc :complete-sessions | |
(-> complete-sessions | |
(assoc (count tracks) tracks) | |
(->> (take n) | |
(into (sorted-map-by >)))))) | |
(assoc-in acc [:incomplete-sessions user-id] | |
{:last-timestamp timestamp | |
:tracks (conj tracks | |
track-name)})))))) | |
{:incomplete-sessions {} | |
:complete-sessions (sorted-map-by >)} | |
data)] | |
(let [{:keys [incomplete-sessions complete-sessions]} sessions] | |
(->> incomplete-sessions | |
(vals) | |
(map :tracks) | |
(map (juxt count identity)) | |
(into complete-sessions) | |
(take n) | |
(map second))))) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-var'>#'lastfm-analysis/longest-sessions-sorted-map</span>","value":"#'lastfm-analysis/longest-sessions-sorted-map"} | |
;; <= | |
;; ** | |
;;; And now to time the new function for comparison | |
;; ** | |
;; @@ | |
(time | |
(do | |
(with-open [r (io/reader (io/file "./data/data.small.reversed.tsv"))] | |
(->> (csv/read-csv r :separator \tab :quote \uFFFF) | |
(map select-and-convert-data) | |
(longest-sessions-sorted-map 50))) | |
nil)) | |
;; @@ | |
;; -> | |
;;; "Elapsed time: 8201.945435 msecs" | |
;;; | |
;; <- | |
;; => | |
;;; {"type":"html","content":"<span class='clj-nil'>nil</span>","value":"nil"} | |
;; <= | |
;; ** | |
;;; As is shown above, the final version is actually slower than the reduce version. This is probably because as mentioned before having to reconstruct the sorted map each time takes up time. | |
;;; | |
;;; I could come up with a custom solution, for example a binary search tree, but there doesn't seem to be any point because as the flame graph below shows this process is mostly io bound. This is to be expected, but I had hoped that improving the algorithm would have made significant improvements, but the flame graph shows that there isn't much room to improve. | |
;; ** | |
;; @@ | |
(add-deps '[[flames "0.4.0"]]) | |
(require '[flames.core :as flames] | |
'[gorilla-repl.html :refer [html-view]]) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-nil'>nil</span>","value":"nil"} | |
;; <= | |
;; @@ | |
(with-open [flames (flames/start! {:port 54321 :host "localhost"})] | |
(with-open [r (io/reader (io/file "./data/data.small.reversed.tsv"))] | |
(->> (csv/read-csv r :separator \tab :quote \uFFFF) | |
(map select-and-convert-data) | |
(longest-sessions-sorted-map 50))) | |
(html-view | |
(str | |
"<div style=\"overflow-x: scroll;\">" | |
(slurp "http://localhost:54321/flames.svg?remove=%28socketRead|epollWait|socketAccept|readBytes%29") | |
"</div>"))) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<div style=\"overflow-x: scroll;\"><?xml version=\"1.0\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<svg version=\"1.1\" width=\"1200\" height=\"1126\" onload=\"init(evt)\" viewBox=\"0 0 1200 1126\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n<!-- Flame graph stack visualization. See https://github.com/brendangregg/FlameGraph for latest version, and http://www.brendangregg.com/flamegraphs.html for examples. -->\n<!-- NOTES: -->\n<defs >\n\t<linearGradient id=\"background\" y1=\"0\" y2=\"1\" x1=\"0\" x2=\"0\" >\n\t\t<stop stop-color=\"#eeeeee\" offset=\"5%\" />\n\t\t<stop stop-color=\"#eeeeb0\" offset=\"95%\" />\n\t</linearGradient>\n</defs>\n<style type=\"text/css\">\n\t.func_g:hover { stroke:black; stroke-width:0.5; cursor:pointer; }\n</style>\n<script type=\"text/ecmascript\">\n<![CDATA[\n\tvar details, searchbtn, matchedtxt, svg;\n\tfunction init(evt) {\n\t\tdetails = document.getElementById(\"details\").firstChild;\n\t\tsearchbtn = document.getElementById(\"search\");\n\t\tmatchedtxt = document.getElementById(\"matched\");\n\t\tsvg = document.getElementsByTagName(\"svg\")[0];\n\t\tsearching = 0;\n\t}\n\n\t// mouse-over for info\n\tfunction s(node) {\t\t// show\n\t\tinfo = g_to_text(node);\n\t\tdetails.nodeValue = \"Function: \" + info;\n\t}\n\tfunction c() {\t\t\t// clear\n\t\tdetails.nodeValue = ' ';\n\t}\n\n\t// ctrl-F for search\n\twindow.addEventListener(\"keydown\",function (e) {\n\t\tif (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {\n\t\t\te.preventDefault();\n\t\t\tsearch_prompt();\n\t\t}\n\t})\n\n\t// functions\n\tfunction find_child(parent, name, attr) {\n\t\tvar children = parent.childNodes;\n\t\tfor (var i=0; i<children.length;i++) {\n\t\t\tif (children[i].tagName == name)\n\t\t\t\treturn (attr != undefined) ? children[i].attributes[attr].value : children[i];\n\t\t}\n\t\treturn;\n\t}\n\tfunction orig_save(e, attr, val) {\n\t\tif (e.attributes[\"_orig_\"+attr] != undefined) return;\n\t\tif (e.attributes[attr] == undefined) return;\n\t\tif (val == undefined) val = e.attributes[attr].value;\n\t\te.setAttribute(\"_orig_\"+attr, val);\n\t}\n\tfunction orig_load(e, attr) {\n\t\tif (e.attributes[\"_orig_\"+attr] == undefined) return;\n\t\te.attributes[attr].value = e.attributes[\"_orig_\"+attr].value;\n\t\te.removeAttribute(\"_orig_\"+attr);\n\t}\n\tfunction g_to_text(e) {\n\t\tvar text = find_child(e, \"title\").firstChild.nodeValue;\n\t\treturn (text)\n\t}\n\tfunction g_to_func(e) {\n\t\tvar func = g_to_text(e);\n\t\t// if there's any manipulation we want to do to the function\n\t\t// name before it's searched, do it here before returning.\n\t\treturn (func);\n\t}\n\tfunction update_text(e) {\n\t\tvar r = find_child(e, \"rect\");\n\t\tvar t = find_child(e, \"text\");\n\t\tvar w = parseFloat(r.attributes[\"width\"].value) -3;\n\t\tvar txt = find_child(e, \"title\").textContent.replace(/\\([^(]*\\)$/,\"\");\n\t\tt.attributes[\"x\"].value = parseFloat(r.attributes[\"x\"].value) +3;\n\n\t\t// Smaller than this size won't fit anything\n\t\tif (w < 2*12*0.59) {\n\t\t\tt.textContent = \"\";\n\t\t\treturn;\n\t\t}\n\n\t\tt.textContent = txt;\n\t\t// Fit in full text width\n\t\tif (/^ *$/.test(txt) || t.getSubStringLength(0, txt.length) < w)\n\t\t\treturn;\n\n\t\tfor (var x=txt.length-2; x>0; x--) {\n\t\t\tif (t.getSubStringLength(0, x+2) <= w) {\n\t\t\t\tt.textContent = txt.substring(0,x) + \"..\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tt.textContent = \"\";\n\t}\n\n\t// zoom\n\tfunction zoom_reset(e) {\n\t\tif (e.attributes != undefined) {\n\t\t\torig_load(e, \"x\");\n\t\t\torig_load(e, \"width\");\n\t\t}\n\t\tif (e.childNodes == undefined) return;\n\t\tfor(var i=0, c=e.childNodes; i<c.length; i++) {\n\t\t\tzoom_reset(c[i]);\n\t\t}\n\t}\n\tfunction zoom_child(e, x, ratio) {\n\t\tif (e.attributes != undefined) {\n\t\t\tif (e.attributes[\"x\"] != undefined) {\n\t\t\t\torig_save(e, \"x\");\n\t\t\t\te.attributes[\"x\"].value = (parseFloat(e.attributes[\"x\"].value) - x - 10) * ratio + 10;\n\t\t\t\tif(e.tagName == \"text\") e.attributes[\"x\"].value = find_child(e.parentNode, \"rect\", \"x\") + 3;\n\t\t\t}\n\t\t\tif (e.attributes[\"width\"] != undefined) {\n\t\t\t\torig_save(e, \"width\");\n\t\t\t\te.attributes[\"width\"].value = parseFloat(e.attributes[\"width\"].value) * ratio;\n\t\t\t}\n\t\t}\n\n\t\tif (e.childNodes == undefined) return;\n\t\tfor(var i=0, c=e.childNodes; i<c.length; i++) {\n\t\t\tzoom_child(c[i], x-10, ratio);\n\t\t}\n\t}\n\tfunction zoom_parent(e) {\n\t\tif (e.attributes) {\n\t\t\tif (e.attributes[\"x\"] != undefined) {\n\t\t\t\torig_save(e, \"x\");\n\t\t\t\te.attributes[\"x\"].value = 10;\n\t\t\t}\n\t\t\tif (e.attributes[\"width\"] != undefined) {\n\t\t\t\torig_save(e, \"width\");\n\t\t\t\te.attributes[\"width\"].value = parseInt(svg.width.baseVal.value) - (10*2);\n\t\t\t}\n\t\t}\n\t\tif (e.childNodes == undefined) return;\n\t\tfor(var i=0, c=e.childNodes; i<c.length; i++) {\n\t\t\tzoom_parent(c[i]);\n\t\t}\n\t}\n\tfunction zoom(node) {\n\t\tvar attr = find_child(node, \"rect\").attributes;\n\t\tvar width = parseFloat(attr[\"width\"].value);\n\t\tvar xmin = parseFloat(attr[\"x\"].value);\n\t\tvar xmax = parseFloat(xmin + width);\n\t\tvar ymin = parseFloat(attr[\"y\"].value);\n\t\tvar ratio = (svg.width.baseVal.value - 2*10) / width;\n\n\t\t// XXX: Workaround for JavaScript float issues (fix me)\n\t\tvar fudge = 0.0001;\n\n\t\tvar unzoombtn = document.getElementById(\"unzoom\");\n\t\tunzoombtn.style[\"opacity\"] = \"1.0\";\n\n\t\tvar el = document.getElementsByTagName(\"g\");\n\t\tfor(var i=0;i<el.length;i++){\n\t\t\tvar e = el[i];\n\t\t\tvar a = find_child(e, \"rect\").attributes;\n\t\t\tvar ex = parseFloat(a[\"x\"].value);\n\t\t\tvar ew = parseFloat(a[\"width\"].value);\n\t\t\t// Is it an ancestor\n\t\t\tif (0 == 0) {\n\t\t\t\tvar upstack = parseFloat(a[\"y\"].value) > ymin;\n\t\t\t} else {\n\t\t\t\tvar upstack = parseFloat(a[\"y\"].value) < ymin;\n\t\t\t}\n\t\t\tif (upstack) {\n\t\t\t\t// Direct ancestor\n\t\t\t\tif (ex <= xmin && (ex+ew+fudge) >= xmax) {\n\t\t\t\t\te.style[\"opacity\"] = \"0.5\";\n\t\t\t\t\tzoom_parent(e);\n\t\t\t\t\te.onclick = function(e){unzoom(); zoom(this);};\n\t\t\t\t\tupdate_text(e);\n\t\t\t\t}\n\t\t\t\t// not in current path\n\t\t\t\telse\n\t\t\t\t\te.style[\"display\"] = \"none\";\n\t\t\t}\n\t\t\t// Children maybe\n\t\t\telse {\n\t\t\t\t// no common path\n\t\t\t\tif (ex < xmin || ex + fudge >= xmax) {\n\t\t\t\t\te.style[\"display\"] = \"none\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tzoom_child(e, xmin, ratio);\n\t\t\t\t\te.onclick = function(e){zoom(this);};\n\t\t\t\t\tupdate_text(e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfunction unzoom() {\n\t\tvar unzoombtn = document.getElementById(\"unzoom\");\n\t\tunzoombtn.style[\"opacity\"] = \"0.0\";\n\n\t\tvar el = document.getElementsByTagName(\"g\");\n\t\tfor(i=0;i<el.length;i++) {\n\t\t\tel[i].style[\"display\"] = \"block\";\n\t\t\tel[i].style[\"opacity\"] = \"1\";\n\t\t\tzoom_reset(el[i]);\n\t\t\tupdate_text(el[i]);\n\t\t}\n\t}\n\n\t// search\n\tfunction reset_search() {\n\t\tvar el = document.getElementsByTagName(\"rect\");\n\t\tfor (var i=0; i < el.length; i++) {\n\t\t\torig_load(el[i], \"fill\")\n\t\t}\n\t}\n\tfunction search_prompt() {\n\t\tif (!searching) {\n\t\t\tvar term = prompt(\"Enter a search term (regexp \" +\n\t\t\t \"allowed, eg: ^ext4_)\", \"\");\n\t\t\tif (term != null) {\n\t\t\t\tsearch(term)\n\t\t\t}\n\t\t} else {\n\t\t\treset_search();\n\t\t\tsearching = 0;\n\t\t\tsearchbtn.style[\"opacity\"] = \"0.1\";\n\t\t\tsearchbtn.firstChild.nodeValue = \"Search\"\n\t\t\tmatchedtxt.style[\"opacity\"] = \"0.0\";\n\t\t\tmatchedtxt.firstChild.nodeValue = \"\"\n\t\t}\n\t}\n\tfunction search(term) {\n\t\tvar re = new RegExp(term);\n\t\tvar el = document.getElementsByTagName(\"g\");\n\t\tvar matches = new Object();\n\t\tvar maxwidth = 0;\n\t\tfor (var i = 0; i < el.length; i++) {\n\t\t\tvar e = el[i];\n\t\t\tif (e.attributes[\"class\"].value != \"func_g\")\n\t\t\t\tcontinue;\n\t\t\tvar func = g_to_func(e);\n\t\t\tvar rect = find_child(e, \"rect\");\n\t\t\tif (rect == null) {\n\t\t\t\t// the rect might be wrapped in an anchor\n\t\t\t\t// if nameattr href is being used\n\t\t\t\tif (rect = find_child(e, \"a\")) {\n\t\t\t\t rect = find_child(r, \"rect\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (func == null || rect == null)\n\t\t\t\tcontinue;\n\n\t\t\t// Save max width. Only works as we have a root frame\n\t\t\tvar w = parseFloat(rect.attributes[\"width\"].value);\n\t\t\tif (w > maxwidth)\n\t\t\t\tmaxwidth = w;\n\n\t\t\tif (func.match(re)) {\n\t\t\t\t// highlight\n\t\t\t\tvar x = parseFloat(rect.attributes[\"x\"].value);\n\t\t\t\torig_save(rect, \"fill\");\n\t\t\t\trect.attributes[\"fill\"].value =\n\t\t\t\t \"rgb(230,0,230)\";\n\n\t\t\t\t// remember matches\n\t\t\t\tif (matches[x] == undefined) {\n\t\t\t\t\tmatches[x] = w;\n\t\t\t\t} else {\n\t\t\t\t\tif (w > matches[x]) {\n\t\t\t\t\t\t// overwrite with parent\n\t\t\t\t\t\tmatches[x] = w;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsearching = 1;\n\t\t\t}\n\t\t}\n\t\tif (!searching)\n\t\t\treturn;\n\n\t\tsearchbtn.style[\"opacity\"] = \"1.0\";\n\t\tsearchbtn.firstChild.nodeValue = \"Reset Search\"\n\n\t\t// calculate percent matched, excluding vertical overlap\n\t\tvar count = 0;\n\t\tvar lastx = -1;\n\t\tvar lastw = 0;\n\t\tvar keys = Array();\n\t\tfor (k in matches) {\n\t\t\tif (matches.hasOwnProperty(k))\n\t\t\t\tkeys.push(k);\n\t\t}\n\t\t// sort the matched frames by their x location\n\t\t// ascending, then width descending\n\t\tkeys.sort(function(a, b){\n\t\t\treturn a - b;\n\t\t});\n\t\t// Step through frames saving only the biggest bottom-up frames\n\t\t// thanks to the sort order. This relies on the tree property\n\t\t// where children are always smaller than their parents.\n\t\tvar fudge = 0.0001;\t// JavaScript floating point\n\t\tfor (var k in keys) {\n\t\t\tvar x = parseFloat(keys[k]);\n\t\t\tvar w = matches[keys[k]];\n\t\t\tif (x >= lastx + lastw - fudge) {\n\t\t\t\tcount += w;\n\t\t\t\tlastx = x;\n\t\t\t\tlastw = w;\n\t\t\t}\n\t\t}\n\t\t// display matched percent\n\t\tmatchedtxt.style[\"opacity\"] = \"1.0\";\n\t\tpct = 100 * count / maxwidth;\n\t\tif (pct == 100)\n\t\t\tpct = \"100\"\n\t\telse\n\t\t\tpct = pct.toFixed(1)\n\t\tmatchedtxt.firstChild.nodeValue = \"Matched: \" + pct + \"%\";\n\t}\n\tfunction searchover(e) {\n\t\tsearchbtn.style[\"opacity\"] = \"1.0\";\n\t}\n\tfunction searchout(e) {\n\t\tif (searching) {\n\t\t\tsearchbtn.style[\"opacity\"] = \"1.0\";\n\t\t} else {\n\t\t\tsearchbtn.style[\"opacity\"] = \"0.1\";\n\t\t}\n\t}\n]]>\n</script>\n<rect x=\"0.0\" y=\"0\" width=\"1200.0\" height=\"1126.0\" fill=\"url(#background)\" />\n<text text-anchor=\"middle\" x=\"600.00\" y=\"24\" font-size=\"17\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >Flame Graph</text>\n<text text-anchor=\"\" x=\"10.00\" y=\"1109\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" id=\"details\" > </text>\n<text text-anchor=\"\" x=\"10.00\" y=\"24\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" id=\"unzoom\" onclick=\"unzoom()\" style=\"opacity:0.0;cursor:pointer\" >Reset Zoom</text>\n<text text-anchor=\"\" x=\"1090.00\" y=\"24\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" id=\"search\" onmouseover=\"searchover()\" onmouseout=\"searchout()\" onclick=\"search_prompt()\" style=\"opacity:0.1;cursor:pointer\" >Search</text>\n<text text-anchor=\"\" x=\"1090.00\" y=\"1109\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" id=\"matched\" > </text>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentHashMap hash [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\"1140.0\" y=\"373\" width=\"35.3\" height=\"15.0\" fill=\"rgb(247,158,39)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1143.04\" y=\"383.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >cl..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentVector cons [PersistentVector.java] (0 samples, 0.00%)</title><rect x=\"813.8\" y=\"373\" width=\"38.6\" height=\"15.0\" fill=\"rgb(252,101,4)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"816.75\" y=\"383.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clo..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$fn__7807$G__7802__7816 invoke [protocols.clj] (0 samples, 0.00%)</title><rect x=\"953.0\" y=\"309\" width=\"187.0\" height=\"15.0\" fill=\"rgb(206,88,15)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"955.99\" y=\"319.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$f..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clj_time.format$parse invoke [format.clj] (0 samples, 0.00%)</title><rect x=\"670.8\" y=\"309\" width=\"129.2\" height=\"15.0\" fill=\"rgb(218,73,3)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"673.84\" y=\"319.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clj_time.format$..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__4459$fn__4462 invoke [interruptible_eval.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"981\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(210,63,49)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"991.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__4459$fn__4462 invoke [interruptible_eval.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.io.InputStreamReader read [InputStreamReader.java] (0 samples, 0.00%)</title><rect x=\"571.7\" y=\"133\" width=\"99.1\" height=\"15.0\" fill=\"rgb(221,100,4)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"574.65\" y=\"143.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >java.io.Inpu..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$fn__7835 invoke [protocols.clj] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"357\" width=\"201.7\" height=\"15.0\" fill=\"rgb(240,46,43)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"367.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$fn_..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.Util equiv [Util.java] (0 samples, 0.00%)</title><rect x=\"1175.3\" y=\"341\" width=\"14.7\" height=\"15.0\" fill=\"rgb(225,46,2)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1178.27\" y=\"351.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>org.joda.time.format.DateTimeFormatterBuilder$NumberFormatter parseInto [DateTimeFormatterBuilder.java] (0 samples, 0.00%)</title><rect x=\"686.3\" y=\"245\" width=\"18.8\" height=\"15.0\" fill=\"rgb(223,116,44)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"689.30\" y=\"255.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$next__5108 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\"1125.1\" y=\"261\" width=\"14.9\" height=\"15.0\" fill=\"rgb(222,229,41)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1128.07\" y=\"271.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.Murmur3 hashInt [Murmur3.java] (0 samples, 0.00%)</title><rect x=\"800.0\" y=\"277\" width=\"13.8\" height=\"15.0\" fill=\"rgb(215,169,9)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"802.99\" y=\"287.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.data.csv$read_record invoke [csv.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"261\" width=\"660.8\" height=\"15.0\" fill=\"rgb(236,62,6)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"271.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.data.csv$read_record invoke [csv.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.tools.nrepl.middleware.interruptible_eval$evaluate invoke [interruptible_eval.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"965\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(224,190,43)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"975.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.tools.nrepl.middleware.interruptible_eval$evaluate invoke [interruptible_eval.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$assoc_in invoke [core.clj] (0 samples, 0.00%)</title><rect x=\"800.0\" y=\"421\" width=\"13.8\" height=\"15.0\" fill=\"rgb(245,78,47)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"802.99\" y=\"431.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$apply invokeStatic [core.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"885\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(228,162,36)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"895.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$apply invokeStatic [core.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$fn__7835 invokeStatic [protocols.clj] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"341\" width=\"201.7\" height=\"15.0\" fill=\"rgb(218,27,37)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"351.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$fn_..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.io.BufferedInputStream available [BufferedInputStream.java] (0 samples, 0.00%)</title><rect x=\"606.4\" y=\"69\" width=\"64.4\" height=\"15.0\" fill=\"rgb(237,64,50)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"609.40\" y=\"79.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >java.io..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$reduce invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"389\" width=\"201.7\" height=\"15.0\" fill=\"rgb(230,69,7)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"399.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$reduce invoke..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap$Seq create [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"165\" width=\"14.7\" height=\"15.0\" fill=\"rgb(215,51,19)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"175.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.AFn applyTo [AFn.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"869\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(238,177,10)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"879.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.AFn applyTo [AFn.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap add [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"1023.5\" y=\"101\" width=\"53.1\" height=\"15.0\" fill=\"rgb(217,182,7)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1026.46\" y=\"111.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >cloju..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.io.FilterReader read [FilterReader.java] (1 samples, 100.11%)</title><rect x=\"59.2\" y=\"181\" width=\"611.6\" height=\"15.0\" fill=\"rgb(252,160,9)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"62.23\" y=\"191.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >java.io.FilterReader read [FilterReader.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap add [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"1023.5\" y=\"85\" width=\"53.1\" height=\"15.0\" fill=\"rgb(246,52,38)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1026.46\" y=\"95.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >cloju..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentHashMap valAt [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\"1140.0\" y=\"389\" width=\"50.0\" height=\"15.0\" fill=\"rgb(243,159,27)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1143.04\" y=\"399.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >cloju..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RT assoc [RT.java] (0 samples, 0.00%)</title><rect x=\"800.0\" y=\"357\" width=\"13.8\" height=\"15.0\" fill=\"rgb(224,105,53)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"802.99\" y=\"367.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>lastfm_analysis$eval16976$fn__16977 invoke [] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"629\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(247,77,24)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"639.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >lastfm_analysis$eval16976$fn__16977 invoke []</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$with_bindings_STAR_ invokeStatic [core.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"901\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(249,215,15)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"911.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$with_bindings_STAR_ invokeStatic [core.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$map$fn__5587 invoke [core.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"357\" width=\"790.0\" height=\"15.0\" fill=\"rgb(222,227,0)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"367.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$map$fn__5587 invoke [core.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.AFn applyToHelper [AFn.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"853\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(239,220,36)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"863.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.AFn applyToHelper [AFn.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>lastfm_analysis$longest_sessions_sorted_map$fn__15227 invoke [] (0 samples, 0.00%)</title><rect x=\"800.0\" y=\"437\" width=\"390.0\" height=\"15.0\" fill=\"rgb(254,107,46)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"802.99\" y=\"447.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >lastfm_analysis$longest_sessions_sorted_map$fn__15227..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.main$repl doInvoke [main.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"805\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(247,65,10)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"815.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.main$repl doInvoke [main.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RT get [RT.java] (0 samples, 0.00%)</title><rect x=\"1140.0\" y=\"421\" width=\"50.0\" height=\"15.0\" fill=\"rgb(247,49,1)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1143.04\" y=\"431.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >cloju..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap assoc [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"967.5\" y=\"197\" width=\"123.8\" height=\"15.0\" fill=\"rgb(218,209,5)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"970.48\" y=\"207.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.Pe..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.LazySeq sval [LazySeq.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"373\" width=\"790.0\" height=\"15.0\" fill=\"rgb(225,77,33)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"383.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.LazySeq sval [LazySeq.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$reduce invoke [core.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"581\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(219,139,46)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"591.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$reduce invoke [core.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentHashMap hash [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\"800.0\" y=\"309\" width=\"13.8\" height=\"15.0\" fill=\"rgb(231,128,9)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"802.99\" y=\"319.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap add [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"967.5\" y=\"165\" width=\"123.8\" height=\"15.0\" fill=\"rgb(214,107,39)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"970.48\" y=\"175.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.Pe..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.Compiler eval [Compiler.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"693\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(220,209,46)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"703.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.Compiler eval [Compiler.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.io.PushbackReader read [PushbackReader.java] (1 samples, 100.11%)</title><rect x=\"59.2\" y=\"197\" width=\"611.6\" height=\"15.0\" fill=\"rgb(227,41,51)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"62.23\" y=\"207.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >java.io.PushbackReader read [PushbackReader.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RT seq [RT.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"325\" width=\"660.8\" height=\"15.0\" fill=\"rgb(205,19,13)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"335.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.RT seq [RT.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$with_bindings_STAR_ doInvoke [core.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"917\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(211,110,4)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"927.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$with_bindings_STAR_ doInvoke [core.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.data.csv$read_record invokeStatic [csv.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"245\" width=\"660.8\" height=\"15.0\" fill=\"rgb(213,141,30)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"255.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.data.csv$read_record invokeStatic [csv.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.Util hasheq [Util.java] (0 samples, 0.00%)</title><rect x=\"800.0\" y=\"293\" width=\"13.8\" height=\"15.0\" fill=\"rgb(227,83,51)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"802.99\" y=\"303.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$fn__7781$G__7776__7794 invoke [protocols.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"549\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(207,129,23)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"559.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$fn__7781$G__7776__7794 invoke [protocols.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$eval invoke [core.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"725\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(211,80,25)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"735.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$eval invoke [core.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>lastfm_analysis$longest_sessions_sorted_map invokeStatic [] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"597\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(232,105,35)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"607.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >lastfm_analysis$longest_sessions_sorted_map invokeStatic []</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.Util hasheq [Util.java] (0 samples, 0.00%)</title><rect x=\"1140.0\" y=\"357\" width=\"35.3\" height=\"15.0\" fill=\"rgb(234,170,22)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1143.04\" y=\"367.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >cl..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentHashMap assoc [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\"800.0\" y=\"325\" width=\"13.8\" height=\"15.0\" fill=\"rgb(223,106,34)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"802.99\" y=\"335.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap$Black addRight [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"1076.6\" y=\"101\" width=\"14.7\" height=\"15.0\" fill=\"rgb(207,219,51)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1079.55\" y=\"111.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>all (1 samples, 100%)</title><rect x=\"10.0\" y=\"1077\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(222,162,12)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"1087.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>lastfm_analysis$eval16976 invoke [] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"661\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(224,222,16)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"671.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >lastfm_analysis$eval16976 invoke []</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$conj__5112 invoke [core.clj] (0 samples, 0.00%)</title><rect x=\"813.8\" y=\"421\" width=\"38.6\" height=\"15.0\" fill=\"rgb(227,86,25)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"816.75\" y=\"431.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clo..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$assoc_in invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\"800.0\" y=\"405\" width=\"13.8\" height=\"15.0\" fill=\"rgb(251,13,35)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"802.99\" y=\"415.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentHashMap assoc [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\"800.0\" y=\"341\" width=\"13.8\" height=\"15.0\" fill=\"rgb(239,217,30)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"802.99\" y=\"351.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RestFn invoke [RestFn.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"933\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(254,111,10)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"943.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.RestFn invoke [RestFn.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>lastfm_analysis$eval16976 invokeStatic [] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"645\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(208,137,25)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"655.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >lastfm_analysis$eval16976 invokeStatic []</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$seq__5124 invokeStatic [core.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"341\" width=\"660.8\" height=\"15.0\" fill=\"rgb(234,26,18)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"351.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$seq__5124 invokeStatic [core.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>lastfm_analysis$select_and_convert_data invoke [] (0 samples, 0.00%)</title><rect x=\"670.8\" y=\"341\" width=\"129.2\" height=\"15.0\" fill=\"rgb(244,119,18)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"673.84\" y=\"351.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >lastfm_analysis$..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.util.concurrent.ThreadPoolExecutor runWorker [ThreadPoolExecutor.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"1029\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(215,185,6)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"1039.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >java.util.concurrent.ThreadPoolExecutor runWorker [ThreadPoolExecutor.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>org.joda.time.format.DateTimeFormatterBuilder$Composite parseInto [DateTimeFormatterBuilder.java] (0 samples, 0.00%)</title><rect x=\"670.8\" y=\"261\" width=\"34.3\" height=\"15.0\" fill=\"rgb(237,171,5)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"673.84\" y=\"271.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >or..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RT seqFrom [RT.java] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"197\" width=\"14.7\" height=\"15.0\" fill=\"rgb(246,141,22)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"207.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$conj__5112 invoke [core.clj] (0 samples, 0.00%)</title><rect x=\"953.0\" y=\"261\" width=\"172.1\" height=\"15.0\" fill=\"rgb(205,170,47)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"955.99\" y=\"271.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$conj__511..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.data.csv$read_cell invoke [csv.clj] (1 samples, 100.11%)</title><rect x=\"25.7\" y=\"229\" width=\"645.1\" height=\"15.0\" fill=\"rgb(250,188,51)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"28.69\" y=\"239.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.data.csv$read_cell invoke [csv.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.tools.nrepl.middleware.interruptible_eval$evaluate invokeStatic [interruptible_eval.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"949\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(226,161,29)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"959.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.tools.nrepl.middleware.interruptible_eval$evaluate invokeStatic [interruptible_eval.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentHashMap$BitmapIndexedNode find [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\"1175.3\" y=\"357\" width=\"14.7\" height=\"15.0\" fill=\"rgb(220,67,27)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1178.27\" y=\"367.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>org.joda.time.format.DateTimeFormatter parseDateTime [DateTimeFormatter.java] (0 samples, 0.00%)</title><rect x=\"670.8\" y=\"277\" width=\"129.2\" height=\"15.0\" fill=\"rgb(249,62,22)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"673.84\" y=\"287.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >org.joda.time.fo..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$conj__5112 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\"813.8\" y=\"405\" width=\"38.6\" height=\"15.0\" fill=\"rgb(231,40,8)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"816.75\" y=\"415.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clo..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.io.FileInputStream available [FileInputStream.java] (0 samples, 0.00%)</title><rect x=\"606.4\" y=\"53\" width=\"64.4\" height=\"15.0\" fill=\"rgb(247,198,43)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"609.40\" y=\"63.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >java.io..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clj_time.format$parse invokeStatic [format.clj] (0 samples, 0.00%)</title><rect x=\"670.8\" y=\"293\" width=\"129.2\" height=\"15.0\" fill=\"rgb(221,50,18)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"673.84\" y=\"303.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clj_time.format$..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>sun.nio.cs.StreamDecoder read [StreamDecoder.java] (0 samples, 0.00%)</title><rect x=\"571.7\" y=\"117\" width=\"99.1\" height=\"15.0\" fill=\"rgb(211,65,25)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"574.65\" y=\"127.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >sun.nio.cs.S..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__4414 invoke [interruptible_eval.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"837\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(217,9,11)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"847.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__4414 invoke [interruptible_eval.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$seq__5124 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"229\" width=\"14.7\" height=\"15.0\" fill=\"rgb(213,5,0)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"239.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>sun.nio.cs.UTF_8$Decoder decodeLoop [UTF_8.java] (0 samples, 0.00%)</title><rect x=\"571.7\" y=\"69\" width=\"34.7\" height=\"15.0\" fill=\"rgb(208,196,18)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"574.65\" y=\"79.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >su..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.data.csv$eval14258$fn__14259$fn__14260 invoke [csv.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"277\" width=\"660.8\" height=\"15.0\" fill=\"rgb(230,195,43)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"287.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.data.csv$eval14258$fn__14259$fn__14260 invoke [csv.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RT seq [RT.java] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"293\" width=\"14.7\" height=\"15.0\" fill=\"rgb(213,100,29)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"303.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$fn__7852 invoke [protocols.clj] (0 samples, 0.00%)</title><rect x=\"953.0\" y=\"293\" width=\"187.0\" height=\"15.0\" fill=\"rgb(205,223,27)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"955.99\" y=\"303.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$f..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$fn__7807$G__7802__7816 invoke [protocols.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"485\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(218,41,32)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"495.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$fn__7807$G__7802__7816 invoke [protocols.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.io.BufferedReader fill [BufferedReader.java] (0 samples, 0.00%)</title><rect x=\"571.7\" y=\"149\" width=\"99.1\" height=\"15.0\" fill=\"rgb(224,67,39)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"574.65\" y=\"159.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >java.io.Buff..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$assoc_in invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\"800.0\" y=\"389\" width=\"13.8\" height=\"15.0\" fill=\"rgb(226,155,33)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"802.99\" y=\"399.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$next__5108 invokeStatic [core.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"437\" width=\"790.0\" height=\"15.0\" fill=\"rgb(232,50,18)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"447.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$next__5108 invokeStatic [core.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$conj_BANG_ invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\"10.0\" y=\"213\" width=\"15.7\" height=\"15.0\" fill=\"rgb(217,93,12)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"223.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.main$repl$read_eval_print__8572 invoke [main.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"757\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(247,78,35)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"767.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.main$repl$read_eval_print__8572 invoke [main.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>sun.nio.cs.UTF_8$Decoder decodeArrayLoop [UTF_8.java] (0 samples, 0.00%)</title><rect x=\"590.0\" y=\"53\" width=\"16.4\" height=\"15.0\" fill=\"rgb(232,174,32)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"592.99\" y=\"63.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$eval invokeStatic [core.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"709\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(231,31,47)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"719.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$eval invokeStatic [core.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.AFn run [AFn.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"1013\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(228,174,43)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"1023.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.AFn run [AFn.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RT conj [RT.java] (0 samples, 0.00%)</title><rect x=\"953.0\" y=\"229\" width=\"172.1\" height=\"15.0\" fill=\"rgb(226,208,39)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"955.99\" y=\"239.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.RT conj [..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentHashMap valAt [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\"1140.0\" y=\"405\" width=\"50.0\" height=\"15.0\" fill=\"rgb(227,186,41)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1143.04\" y=\"415.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >cloju..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RT seq [RT.java] (0 samples, 0.00%)</title><rect x=\"852.4\" y=\"373\" width=\"85.9\" height=\"15.0\" fill=\"rgb(251,160,2)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"855.36\" y=\"383.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.la..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.LazySeq seq [LazySeq.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"389\" width=\"790.0\" height=\"15.0\" fill=\"rgb(248,176,8)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"399.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.LazySeq seq [LazySeq.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$fn__7835 invokeStatic [protocols.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"517\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(232,121,11)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"527.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$fn__7835 invokeStatic [protocols.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$first__5106 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\"852.4\" y=\"405\" width=\"85.9\" height=\"15.0\" fill=\"rgb(235,17,52)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"855.36\" y=\"415.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.co..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RestFn invoke [RestFn.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"821\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(224,76,53)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"831.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.RestFn invoke [RestFn.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$seq__5124 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"309\" width=\"14.7\" height=\"15.0\" fill=\"rgb(250,222,44)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"319.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.LazySeq sval [LazySeq.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"293\" width=\"660.8\" height=\"15.0\" fill=\"rgb(249,38,44)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"303.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.LazySeq sval [LazySeq.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RT conj [RT.java] (0 samples, 0.00%)</title><rect x=\"813.8\" y=\"389\" width=\"38.6\" height=\"15.0\" fill=\"rgb(225,200,27)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"816.75\" y=\"399.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clo..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>lastfm_analysis$select_and_convert_data invokeStatic [] (0 samples, 0.00%)</title><rect x=\"670.8\" y=\"325\" width=\"129.2\" height=\"15.0\" fill=\"rgb(236,158,50)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"673.84\" y=\"335.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >lastfm_analysis$..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap$Node getValue [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"1091.3\" y=\"197\" width=\"33.8\" height=\"15.0\" fill=\"rgb(254,143,6)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1094.28\" y=\"207.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >cl..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$reduce invokeStatic [core.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"565\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(207,138,20)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"575.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$reduce invokeStatic [core.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.LazySeq seq [LazySeq.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"309\" width=\"660.8\" height=\"15.0\" fill=\"rgb(206,27,31)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"319.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.LazySeq seq [LazySeq.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>org.joda.time.format.DateTimeParserBucket computeMillis [DateTimeParserBucket.java] (0 samples, 0.00%)</title><rect x=\"705.1\" y=\"245\" width=\"94.9\" height=\"15.0\" fill=\"rgb(206,149,15)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"708.12\" y=\"255.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >org.joda.ti..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$conj_BANG_ invoke [core.clj] (0 samples, 0.00%)</title><rect x=\"10.0\" y=\"229\" width=\"15.7\" height=\"15.0\" fill=\"rgb(225,103,37)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"239.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap add [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"985.3\" y=\"133\" width=\"106.0\" height=\"15.0\" fill=\"rgb(254,75,8)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"988.33\" y=\"143.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$seq_reduce invokeStatic [protocols.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"501\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(243,41,39)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"511.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$seq_reduce invokeStatic [protocols.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.main$repl$read_eval_print__8572$fn__8575 invoke [main.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"741\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(241,229,53)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"751.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.main$repl$read_eval_print__8572$fn__8575 invoke [main.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$into invoke [core.clj] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"421\" width=\"201.7\" height=\"15.0\" fill=\"rgb(214,125,2)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"431.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$into invoke [..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>sun.nio.cs.StreamDecoder implRead [StreamDecoder.java] (0 samples, 0.00%)</title><rect x=\"571.7\" y=\"101\" width=\"99.1\" height=\"15.0\" fill=\"rgb(221,83,29)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"574.65\" y=\"111.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >sun.nio.cs.S..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$fn__7781$G__7776__7794 invoke [protocols.clj] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"373\" width=\"201.7\" height=\"15.0\" fill=\"rgb(226,26,0)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"383.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$fn_..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.io.FileInputStream available0 [FileInputStream.java] (0 samples, 0.00%)</title><rect x=\"606.4\" y=\"37\" width=\"64.4\" height=\"15.0\" fill=\"rgb(246,187,20)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"609.40\" y=\"47.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >java.io..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.util.concurrent.ThreadPoolExecutor$Worker run [ThreadPoolExecutor.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"1045\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(206,147,22)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"1055.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >java.util.concurrent.ThreadPoolExecutor$Worker run [ThreadPoolExecutor.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$assoc__5138 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\"800.0\" y=\"373\" width=\"13.8\" height=\"15.0\" fill=\"rgb(244,174,39)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"802.99\" y=\"383.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.main$repl invokeStatic [main.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"789\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(205,120,46)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"799.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.main$repl invokeStatic [main.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.lang.String hashCode [String.java] (0 samples, 0.00%)</title><rect x=\"1140.0\" y=\"341\" width=\"35.3\" height=\"15.0\" fill=\"rgb(229,80,25)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1143.04\" y=\"351.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >ja..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>org.joda.time.format.DateTimeParserBucket computeMillis [DateTimeParserBucket.java] (0 samples, 0.00%)</title><rect x=\"705.1\" y=\"261\" width=\"94.9\" height=\"15.0\" fill=\"rgb(233,53,6)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"708.12\" y=\"271.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >org.joda.ti..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>org.joda.time.field.PreciseDurationDateTimeField set [PreciseDurationDateTimeField.java] (0 samples, 0.00%)</title><rect x=\"785.7\" y=\"213\" width=\"14.3\" height=\"15.0\" fill=\"rgb(253,223,50)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"788.74\" y=\"223.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap seq [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"181\" width=\"14.7\" height=\"15.0\" fill=\"rgb(252,206,21)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"191.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap$Seq push [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"149\" width=\"14.7\" height=\"15.0\" fill=\"rgb(215,74,21)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"159.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$take$fn__5630 invoke [core.clj] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"245\" width=\"14.7\" height=\"15.0\" fill=\"rgb(241,166,46)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"255.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$fn__7835 invoke [protocols.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"533\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(241,138,32)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"543.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$fn__7835 invoke [protocols.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap assoc [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"967.5\" y=\"181\" width=\"123.8\" height=\"15.0\" fill=\"rgb(233,161,10)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"970.48\" y=\"191.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.Pe..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$into invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"405\" width=\"201.7\" height=\"15.0\" fill=\"rgb(228,195,51)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"415.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$into invokeSt..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.Compiler eval [Compiler.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"677\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(221,37,32)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"687.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.Compiler eval [Compiler.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$first__5106 invoke [core.clj] (0 samples, 0.00%)</title><rect x=\"852.4\" y=\"421\" width=\"85.9\" height=\"15.0\" fill=\"rgb(229,109,12)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"855.36\" y=\"431.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.co..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.data.csv$read_cell invokeStatic [csv.clj] (1 samples, 100.11%)</title><rect x=\"40.7\" y=\"213\" width=\"630.1\" height=\"15.0\" fill=\"rgb(215,221,4)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"43.65\" y=\"223.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.data.csv$read_cell invokeStatic [csv.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentHashMap$BitmapIndexedNode find [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\"1175.3\" y=\"373\" width=\"14.7\" height=\"15.0\" fill=\"rgb(227,191,54)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"1178.27\" y=\"383.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap add [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"985.3\" y=\"117\" width=\"106.0\" height=\"15.0\" fill=\"rgb(222,117,30)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"988.33\" y=\"127.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core$conj__5112 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\"953.0\" y=\"245\" width=\"172.1\" height=\"15.0\" fill=\"rgb(252,175,37)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"955.99\" y=\"255.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core$conj__511..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.LazySeq seq [LazySeq.java] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"277\" width=\"14.7\" height=\"15.0\" fill=\"rgb(224,190,17)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"287.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RT first [RT.java] (0 samples, 0.00%)</title><rect x=\"852.4\" y=\"389\" width=\"85.9\" height=\"15.0\" fill=\"rgb(246,3,49)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"855.36\" y=\"399.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.la..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>org.joda.time.format.DateTimeParserBucket$SavedField set [DateTimeParserBucket.java] (0 samples, 0.00%)</title><rect x=\"705.1\" y=\"229\" width=\"94.9\" height=\"15.0\" fill=\"rgb(248,83,14)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"708.12\" y=\"239.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >org.joda.ti..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.PersistentTreeMap add [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\"967.5\" y=\"149\" width=\"123.8\" height=\"15.0\" fill=\"rgb(218,75,16)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"970.48\" y=\"159.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.Pe..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>sun.nio.cs.StreamDecoder inReady [StreamDecoder.java] (0 samples, 0.00%)</title><rect x=\"606.4\" y=\"85\" width=\"64.4\" height=\"15.0\" fill=\"rgb(241,224,15)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"609.40\" y=\"95.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >sun.nio..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$fn__7852 invoke [protocols.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"469\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(212,5,11)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"479.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$fn__7852 invoke [protocols.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.Cons next [Cons.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"405\" width=\"790.0\" height=\"15.0\" fill=\"rgb(248,34,7)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"415.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.Cons next [Cons.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RT next [RT.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"421\" width=\"790.0\" height=\"15.0\" fill=\"rgb(221,68,45)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"431.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.RT next [RT.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__4454 invoke [interruptible_eval.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"997\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(251,222,48)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"1007.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__4454 invoke [interruptible_eval.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.lang.Thread run [Thread.java] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"1061\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(221,214,42)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"1071.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >java.lang.Thread run [Thread.java]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>lastfm_analysis$longest_sessions_sorted_map invoke [] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"613\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(230,181,3)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"623.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >lastfm_analysis$longest_sessions_sorted_map invoke []</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RT seq [RT.java] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"213\" width=\"14.7\" height=\"15.0\" fill=\"rgb(227,96,44)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"223.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.RT seqFrom [RT.java] (0 samples, 0.00%)</title><rect x=\"852.4\" y=\"357\" width=\"85.9\" height=\"15.0\" fill=\"rgb(244,5,53)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"855.36\" y=\"367.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.la..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.LazySeq sval [LazySeq.java] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"261\" width=\"14.7\" height=\"15.0\" fill=\"rgb(213,64,48)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"271.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" ></text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$seq_reduce invokeStatic [protocols.clj] (0 samples, 0.00%)</title><rect x=\"938.3\" y=\"325\" width=\"201.7\" height=\"15.0\" fill=\"rgb(240,121,10)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"941.27\" y=\"335.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$seq..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.lang.APersistentMap cons [APersistentMap.java] (0 samples, 0.00%)</title><rect x=\"953.0\" y=\"213\" width=\"172.1\" height=\"15.0\" fill=\"rgb(209,4,19)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"955.99\" y=\"223.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.lang.APersiste..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$fn__7852 invokeStatic [protocols.clj] (0 samples, 0.00%)</title><rect x=\"953.0\" y=\"277\" width=\"187.0\" height=\"15.0\" fill=\"rgb(250,62,34)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"955.99\" y=\"287.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$f..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.core.protocols$fn__7852 invokeStatic [protocols.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"453\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(212,168,45)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"463.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.core.protocols$fn__7852 invokeStatic [protocols.clj]</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.io.BufferedReader read [BufferedReader.java] (0 samples, 0.00%)</title><rect x=\"571.7\" y=\"165\" width=\"99.1\" height=\"15.0\" fill=\"rgb(242,195,28)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"574.65\" y=\"175.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >java.io.Buff..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>java.nio.charset.CharsetDecoder decode [CharsetDecoder.java] (0 samples, 0.00%)</title><rect x=\"571.7\" y=\"85\" width=\"34.7\" height=\"15.0\" fill=\"rgb(227,86,50)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"574.65\" y=\"95.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >ja..</text>\n</g>\n<g class=\"func_g\" onmouseover=\"s(this)\" onmouseout=\"c()\" onclick=\"zoom(this)\">\n<title>clojure.main$repl$fn__8581 invoke [main.clj] (1 samples, 100.11%)</title><rect x=\"10.0\" y=\"773\" width=\"1180.0\" height=\"15.0\" fill=\"rgb(245,184,14)\" rx=\"2\" ry=\"2\" />\n<text text-anchor=\"\" x=\"13.00\" y=\"783.5\" font-size=\"12\" font-family=\"Verdana\" fill=\"rgb(0,0,0)\" >clojure.main$repl$fn__8581 invoke [main.clj]</text>\n</g>\n</svg>\n</div>","value":"#gorilla_repl.html.HtmlView{:content \"<div style=\\\"overflow-x: scroll;\\\"><?xml version=\\\"1.0\\\" standalone=\\\"no\\\"?>\\n<!DOCTYPE svg PUBLIC \\\"-//W3C//DTD SVG 1.1//EN\\\" \\\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\\\">\\n<svg version=\\\"1.1\\\" width=\\\"1200\\\" height=\\\"1126\\\" onload=\\\"init(evt)\\\" viewBox=\\\"0 0 1200 1126\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\">\\n<!-- Flame graph stack visualization. See https://github.com/brendangregg/FlameGraph for latest version, and http://www.brendangregg.com/flamegraphs.html for examples. -->\\n<!-- NOTES: -->\\n<defs >\\n\\t<linearGradient id=\\\"background\\\" y1=\\\"0\\\" y2=\\\"1\\\" x1=\\\"0\\\" x2=\\\"0\\\" >\\n\\t\\t<stop stop-color=\\\"#eeeeee\\\" offset=\\\"5%\\\" />\\n\\t\\t<stop stop-color=\\\"#eeeeb0\\\" offset=\\\"95%\\\" />\\n\\t</linearGradient>\\n</defs>\\n<style type=\\\"text/css\\\">\\n\\t.func_g:hover { stroke:black; stroke-width:0.5; cursor:pointer; }\\n</style>\\n<script type=\\\"text/ecmascript\\\">\\n<![CDATA[\\n\\tvar details, searchbtn, matchedtxt, svg;\\n\\tfunction init(evt) {\\n\\t\\tdetails = document.getElementById(\\\"details\\\").firstChild;\\n\\t\\tsearchbtn = document.getElementById(\\\"search\\\");\\n\\t\\tmatchedtxt = document.getElementById(\\\"matched\\\");\\n\\t\\tsvg = document.getElementsByTagName(\\\"svg\\\")[0];\\n\\t\\tsearching = 0;\\n\\t}\\n\\n\\t// mouse-over for info\\n\\tfunction s(node) {\\t\\t// show\\n\\t\\tinfo = g_to_text(node);\\n\\t\\tdetails.nodeValue = \\\"Function: \\\" + info;\\n\\t}\\n\\tfunction c() {\\t\\t\\t// clear\\n\\t\\tdetails.nodeValue = ' ';\\n\\t}\\n\\n\\t// ctrl-F for search\\n\\twindow.addEventListener(\\\"keydown\\\",function (e) {\\n\\t\\tif (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {\\n\\t\\t\\te.preventDefault();\\n\\t\\t\\tsearch_prompt();\\n\\t\\t}\\n\\t})\\n\\n\\t// functions\\n\\tfunction find_child(parent, name, attr) {\\n\\t\\tvar children = parent.childNodes;\\n\\t\\tfor (var i=0; i<children.length;i++) {\\n\\t\\t\\tif (children[i].tagName == name)\\n\\t\\t\\t\\treturn (attr != undefined) ? children[i].attributes[attr].value : children[i];\\n\\t\\t}\\n\\t\\treturn;\\n\\t}\\n\\tfunction orig_save(e, attr, val) {\\n\\t\\tif (e.attributes[\\\"_orig_\\\"+attr] != undefined) return;\\n\\t\\tif (e.attributes[attr] == undefined) return;\\n\\t\\tif (val == undefined) val = e.attributes[attr].value;\\n\\t\\te.setAttribute(\\\"_orig_\\\"+attr, val);\\n\\t}\\n\\tfunction orig_load(e, attr) {\\n\\t\\tif (e.attributes[\\\"_orig_\\\"+attr] == undefined) return;\\n\\t\\te.attributes[attr].value = e.attributes[\\\"_orig_\\\"+attr].value;\\n\\t\\te.removeAttribute(\\\"_orig_\\\"+attr);\\n\\t}\\n\\tfunction g_to_text(e) {\\n\\t\\tvar text = find_child(e, \\\"title\\\").firstChild.nodeValue;\\n\\t\\treturn (text)\\n\\t}\\n\\tfunction g_to_func(e) {\\n\\t\\tvar func = g_to_text(e);\\n\\t\\t// if there's any manipulation we want to do to the function\\n\\t\\t// name before it's searched, do it here before returning.\\n\\t\\treturn (func);\\n\\t}\\n\\tfunction update_text(e) {\\n\\t\\tvar r = find_child(e, \\\"rect\\\");\\n\\t\\tvar t = find_child(e, \\\"text\\\");\\n\\t\\tvar w = parseFloat(r.attributes[\\\"width\\\"].value) -3;\\n\\t\\tvar txt = find_child(e, \\\"title\\\").textContent.replace(/\\\\([^(]*\\\\)$/,\\\"\\\");\\n\\t\\tt.attributes[\\\"x\\\"].value = parseFloat(r.attributes[\\\"x\\\"].value) +3;\\n\\n\\t\\t// Smaller than this size won't fit anything\\n\\t\\tif (w < 2*12*0.59) {\\n\\t\\t\\tt.textContent = \\\"\\\";\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tt.textContent = txt;\\n\\t\\t// Fit in full text width\\n\\t\\tif (/^ *$/.test(txt) || t.getSubStringLength(0, txt.length) < w)\\n\\t\\t\\treturn;\\n\\n\\t\\tfor (var x=txt.length-2; x>0; x--) {\\n\\t\\t\\tif (t.getSubStringLength(0, x+2) <= w) {\\n\\t\\t\\t\\tt.textContent = txt.substring(0,x) + \\\"..\\\";\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tt.textContent = \\\"\\\";\\n\\t}\\n\\n\\t// zoom\\n\\tfunction zoom_reset(e) {\\n\\t\\tif (e.attributes != undefined) {\\n\\t\\t\\torig_load(e, \\\"x\\\");\\n\\t\\t\\torig_load(e, \\\"width\\\");\\n\\t\\t}\\n\\t\\tif (e.childNodes == undefined) return;\\n\\t\\tfor(var i=0, c=e.childNodes; i<c.length; i++) {\\n\\t\\t\\tzoom_reset(c[i]);\\n\\t\\t}\\n\\t}\\n\\tfunction zoom_child(e, x, ratio) {\\n\\t\\tif (e.attributes != undefined) {\\n\\t\\t\\tif (e.attributes[\\\"x\\\"] != undefined) {\\n\\t\\t\\t\\torig_save(e, \\\"x\\\");\\n\\t\\t\\t\\te.attributes[\\\"x\\\"].value = (parseFloat(e.attributes[\\\"x\\\"].value) - x - 10) * ratio + 10;\\n\\t\\t\\t\\tif(e.tagName == \\\"text\\\") e.attributes[\\\"x\\\"].value = find_child(e.parentNode, \\\"rect\\\", \\\"x\\\") + 3;\\n\\t\\t\\t}\\n\\t\\t\\tif (e.attributes[\\\"width\\\"] != undefined) {\\n\\t\\t\\t\\torig_save(e, \\\"width\\\");\\n\\t\\t\\t\\te.attributes[\\\"width\\\"].value = parseFloat(e.attributes[\\\"width\\\"].value) * ratio;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tif (e.childNodes == undefined) return;\\n\\t\\tfor(var i=0, c=e.childNodes; i<c.length; i++) {\\n\\t\\t\\tzoom_child(c[i], x-10, ratio);\\n\\t\\t}\\n\\t}\\n\\tfunction zoom_parent(e) {\\n\\t\\tif (e.attributes) {\\n\\t\\t\\tif (e.attributes[\\\"x\\\"] != undefined) {\\n\\t\\t\\t\\torig_save(e, \\\"x\\\");\\n\\t\\t\\t\\te.attributes[\\\"x\\\"].value = 10;\\n\\t\\t\\t}\\n\\t\\t\\tif (e.attributes[\\\"width\\\"] != undefined) {\\n\\t\\t\\t\\torig_save(e, \\\"width\\\");\\n\\t\\t\\t\\te.attributes[\\\"width\\\"].value = parseInt(svg.width.baseVal.value) - (10*2);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif (e.childNodes == undefined) return;\\n\\t\\tfor(var i=0, c=e.childNodes; i<c.length; i++) {\\n\\t\\t\\tzoom_parent(c[i]);\\n\\t\\t}\\n\\t}\\n\\tfunction zoom(node) {\\n\\t\\tvar attr = find_child(node, \\\"rect\\\").attributes;\\n\\t\\tvar width = parseFloat(attr[\\\"width\\\"].value);\\n\\t\\tvar xmin = parseFloat(attr[\\\"x\\\"].value);\\n\\t\\tvar xmax = parseFloat(xmin + width);\\n\\t\\tvar ymin = parseFloat(attr[\\\"y\\\"].value);\\n\\t\\tvar ratio = (svg.width.baseVal.value - 2*10) / width;\\n\\n\\t\\t// XXX: Workaround for JavaScript float issues (fix me)\\n\\t\\tvar fudge = 0.0001;\\n\\n\\t\\tvar unzoombtn = document.getElementById(\\\"unzoom\\\");\\n\\t\\tunzoombtn.style[\\\"opacity\\\"] = \\\"1.0\\\";\\n\\n\\t\\tvar el = document.getElementsByTagName(\\\"g\\\");\\n\\t\\tfor(var i=0;i<el.length;i++){\\n\\t\\t\\tvar e = el[i];\\n\\t\\t\\tvar a = find_child(e, \\\"rect\\\").attributes;\\n\\t\\t\\tvar ex = parseFloat(a[\\\"x\\\"].value);\\n\\t\\t\\tvar ew = parseFloat(a[\\\"width\\\"].value);\\n\\t\\t\\t// Is it an ancestor\\n\\t\\t\\tif (0 == 0) {\\n\\t\\t\\t\\tvar upstack = parseFloat(a[\\\"y\\\"].value) > ymin;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tvar upstack = parseFloat(a[\\\"y\\\"].value) < ymin;\\n\\t\\t\\t}\\n\\t\\t\\tif (upstack) {\\n\\t\\t\\t\\t// Direct ancestor\\n\\t\\t\\t\\tif (ex <= xmin && (ex+ew+fudge) >= xmax) {\\n\\t\\t\\t\\t\\te.style[\\\"opacity\\\"] = \\\"0.5\\\";\\n\\t\\t\\t\\t\\tzoom_parent(e);\\n\\t\\t\\t\\t\\te.onclick = function(e){unzoom(); zoom(this);};\\n\\t\\t\\t\\t\\tupdate_text(e);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// not in current path\\n\\t\\t\\t\\telse\\n\\t\\t\\t\\t\\te.style[\\\"display\\\"] = \\\"none\\\";\\n\\t\\t\\t}\\n\\t\\t\\t// Children maybe\\n\\t\\t\\telse {\\n\\t\\t\\t\\t// no common path\\n\\t\\t\\t\\tif (ex < xmin || ex + fudge >= xmax) {\\n\\t\\t\\t\\t\\te.style[\\\"display\\\"] = \\\"none\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\telse {\\n\\t\\t\\t\\t\\tzoom_child(e, xmin, ratio);\\n\\t\\t\\t\\t\\te.onclick = function(e){zoom(this);};\\n\\t\\t\\t\\t\\tupdate_text(e);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\tfunction unzoom() {\\n\\t\\tvar unzoombtn = document.getElementById(\\\"unzoom\\\");\\n\\t\\tunzoombtn.style[\\\"opacity\\\"] = \\\"0.0\\\";\\n\\n\\t\\tvar el = document.getElementsByTagName(\\\"g\\\");\\n\\t\\tfor(i=0;i<el.length;i++) {\\n\\t\\t\\tel[i].style[\\\"display\\\"] = \\\"block\\\";\\n\\t\\t\\tel[i].style[\\\"opacity\\\"] = \\\"1\\\";\\n\\t\\t\\tzoom_reset(el[i]);\\n\\t\\t\\tupdate_text(el[i]);\\n\\t\\t}\\n\\t}\\n\\n\\t// search\\n\\tfunction reset_search() {\\n\\t\\tvar el = document.getElementsByTagName(\\\"rect\\\");\\n\\t\\tfor (var i=0; i < el.length; i++) {\\n\\t\\t\\torig_load(el[i], \\\"fill\\\")\\n\\t\\t}\\n\\t}\\n\\tfunction search_prompt() {\\n\\t\\tif (!searching) {\\n\\t\\t\\tvar term = prompt(\\\"Enter a search term (regexp \\\" +\\n\\t\\t\\t \\\"allowed, eg: ^ext4_)\\\", \\\"\\\");\\n\\t\\t\\tif (term != null) {\\n\\t\\t\\t\\tsearch(term)\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\treset_search();\\n\\t\\t\\tsearching = 0;\\n\\t\\t\\tsearchbtn.style[\\\"opacity\\\"] = \\\"0.1\\\";\\n\\t\\t\\tsearchbtn.firstChild.nodeValue = \\\"Search\\\"\\n\\t\\t\\tmatchedtxt.style[\\\"opacity\\\"] = \\\"0.0\\\";\\n\\t\\t\\tmatchedtxt.firstChild.nodeValue = \\\"\\\"\\n\\t\\t}\\n\\t}\\n\\tfunction search(term) {\\n\\t\\tvar re = new RegExp(term);\\n\\t\\tvar el = document.getElementsByTagName(\\\"g\\\");\\n\\t\\tvar matches = new Object();\\n\\t\\tvar maxwidth = 0;\\n\\t\\tfor (var i = 0; i < el.length; i++) {\\n\\t\\t\\tvar e = el[i];\\n\\t\\t\\tif (e.attributes[\\\"class\\\"].value != \\\"func_g\\\")\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\tvar func = g_to_func(e);\\n\\t\\t\\tvar rect = find_child(e, \\\"rect\\\");\\n\\t\\t\\tif (rect == null) {\\n\\t\\t\\t\\t// the rect might be wrapped in an anchor\\n\\t\\t\\t\\t// if nameattr href is being used\\n\\t\\t\\t\\tif (rect = find_child(e, \\\"a\\\")) {\\n\\t\\t\\t\\t rect = find_child(r, \\\"rect\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tif (func == null || rect == null)\\n\\t\\t\\t\\tcontinue;\\n\\n\\t\\t\\t// Save max width. Only works as we have a root frame\\n\\t\\t\\tvar w = parseFloat(rect.attributes[\\\"width\\\"].value);\\n\\t\\t\\tif (w > maxwidth)\\n\\t\\t\\t\\tmaxwidth = w;\\n\\n\\t\\t\\tif (func.match(re)) {\\n\\t\\t\\t\\t// highlight\\n\\t\\t\\t\\tvar x = parseFloat(rect.attributes[\\\"x\\\"].value);\\n\\t\\t\\t\\torig_save(rect, \\\"fill\\\");\\n\\t\\t\\t\\trect.attributes[\\\"fill\\\"].value =\\n\\t\\t\\t\\t \\\"rgb(230,0,230)\\\";\\n\\n\\t\\t\\t\\t// remember matches\\n\\t\\t\\t\\tif (matches[x] == undefined) {\\n\\t\\t\\t\\t\\tmatches[x] = w;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tif (w > matches[x]) {\\n\\t\\t\\t\\t\\t\\t// overwrite with parent\\n\\t\\t\\t\\t\\t\\tmatches[x] = w;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tsearching = 1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif (!searching)\\n\\t\\t\\treturn;\\n\\n\\t\\tsearchbtn.style[\\\"opacity\\\"] = \\\"1.0\\\";\\n\\t\\tsearchbtn.firstChild.nodeValue = \\\"Reset Search\\\"\\n\\n\\t\\t// calculate percent matched, excluding vertical overlap\\n\\t\\tvar count = 0;\\n\\t\\tvar lastx = -1;\\n\\t\\tvar lastw = 0;\\n\\t\\tvar keys = Array();\\n\\t\\tfor (k in matches) {\\n\\t\\t\\tif (matches.hasOwnProperty(k))\\n\\t\\t\\t\\tkeys.push(k);\\n\\t\\t}\\n\\t\\t// sort the matched frames by their x location\\n\\t\\t// ascending, then width descending\\n\\t\\tkeys.sort(function(a, b){\\n\\t\\t\\treturn a - b;\\n\\t\\t});\\n\\t\\t// Step through frames saving only the biggest bottom-up frames\\n\\t\\t// thanks to the sort order. This relies on the tree property\\n\\t\\t// where children are always smaller than their parents.\\n\\t\\tvar fudge = 0.0001;\\t// JavaScript floating point\\n\\t\\tfor (var k in keys) {\\n\\t\\t\\tvar x = parseFloat(keys[k]);\\n\\t\\t\\tvar w = matches[keys[k]];\\n\\t\\t\\tif (x >= lastx + lastw - fudge) {\\n\\t\\t\\t\\tcount += w;\\n\\t\\t\\t\\tlastx = x;\\n\\t\\t\\t\\tlastw = w;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// display matched percent\\n\\t\\tmatchedtxt.style[\\\"opacity\\\"] = \\\"1.0\\\";\\n\\t\\tpct = 100 * count / maxwidth;\\n\\t\\tif (pct == 100)\\n\\t\\t\\tpct = \\\"100\\\"\\n\\t\\telse\\n\\t\\t\\tpct = pct.toFixed(1)\\n\\t\\tmatchedtxt.firstChild.nodeValue = \\\"Matched: \\\" + pct + \\\"%\\\";\\n\\t}\\n\\tfunction searchover(e) {\\n\\t\\tsearchbtn.style[\\\"opacity\\\"] = \\\"1.0\\\";\\n\\t}\\n\\tfunction searchout(e) {\\n\\t\\tif (searching) {\\n\\t\\t\\tsearchbtn.style[\\\"opacity\\\"] = \\\"1.0\\\";\\n\\t\\t} else {\\n\\t\\t\\tsearchbtn.style[\\\"opacity\\\"] = \\\"0.1\\\";\\n\\t\\t}\\n\\t}\\n]]>\\n</script>\\n<rect x=\\\"0.0\\\" y=\\\"0\\\" width=\\\"1200.0\\\" height=\\\"1126.0\\\" fill=\\\"url(#background)\\\" />\\n<text text-anchor=\\\"middle\\\" x=\\\"600.00\\\" y=\\\"24\\\" font-size=\\\"17\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >Flame Graph</text>\\n<text text-anchor=\\\"\\\" x=\\\"10.00\\\" y=\\\"1109\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" id=\\\"details\\\" > </text>\\n<text text-anchor=\\\"\\\" x=\\\"10.00\\\" y=\\\"24\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" id=\\\"unzoom\\\" onclick=\\\"unzoom()\\\" style=\\\"opacity:0.0;cursor:pointer\\\" >Reset Zoom</text>\\n<text text-anchor=\\\"\\\" x=\\\"1090.00\\\" y=\\\"24\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" id=\\\"search\\\" onmouseover=\\\"searchover()\\\" onmouseout=\\\"searchout()\\\" onclick=\\\"search_prompt()\\\" style=\\\"opacity:0.1;cursor:pointer\\\" >Search</text>\\n<text text-anchor=\\\"\\\" x=\\\"1090.00\\\" y=\\\"1109\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" id=\\\"matched\\\" > </text>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentHashMap hash [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\\\"1140.0\\\" y=\\\"373\\\" width=\\\"35.3\\\" height=\\\"15.0\\\" fill=\\\"rgb(247,158,39)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1143.04\\\" y=\\\"383.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >cl..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentVector cons [PersistentVector.java] (0 samples, 0.00%)</title><rect x=\\\"813.8\\\" y=\\\"373\\\" width=\\\"38.6\\\" height=\\\"15.0\\\" fill=\\\"rgb(252,101,4)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"816.75\\\" y=\\\"383.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clo..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$fn__7807$G__7802__7816 invoke [protocols.clj] (0 samples, 0.00%)</title><rect x=\\\"953.0\\\" y=\\\"309\\\" width=\\\"187.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(206,88,15)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"955.99\\\" y=\\\"319.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$f..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clj_time.format$parse invoke [format.clj] (0 samples, 0.00%)</title><rect x=\\\"670.8\\\" y=\\\"309\\\" width=\\\"129.2\\\" height=\\\"15.0\\\" fill=\\\"rgb(218,73,3)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"673.84\\\" y=\\\"319.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clj_time.format$..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__4459$fn__4462 invoke [interruptible_eval.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"981\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(210,63,49)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"991.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__4459$fn__4462 invoke [interruptible_eval.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.io.InputStreamReader read [InputStreamReader.java] (0 samples, 0.00%)</title><rect x=\\\"571.7\\\" y=\\\"133\\\" width=\\\"99.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(221,100,4)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"574.65\\\" y=\\\"143.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >java.io.Inpu..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$fn__7835 invoke [protocols.clj] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"357\\\" width=\\\"201.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(240,46,43)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"367.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$fn_..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.Util equiv [Util.java] (0 samples, 0.00%)</title><rect x=\\\"1175.3\\\" y=\\\"341\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(225,46,2)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1178.27\\\" y=\\\"351.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>org.joda.time.format.DateTimeFormatterBuilder$NumberFormatter parseInto [DateTimeFormatterBuilder.java] (0 samples, 0.00%)</title><rect x=\\\"686.3\\\" y=\\\"245\\\" width=\\\"18.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(223,116,44)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"689.30\\\" y=\\\"255.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$next__5108 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\\\"1125.1\\\" y=\\\"261\\\" width=\\\"14.9\\\" height=\\\"15.0\\\" fill=\\\"rgb(222,229,41)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1128.07\\\" y=\\\"271.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.Murmur3 hashInt [Murmur3.java] (0 samples, 0.00%)</title><rect x=\\\"800.0\\\" y=\\\"277\\\" width=\\\"13.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(215,169,9)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"802.99\\\" y=\\\"287.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.data.csv$read_record invoke [csv.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"261\\\" width=\\\"660.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(236,62,6)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"271.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.data.csv$read_record invoke [csv.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.tools.nrepl.middleware.interruptible_eval$evaluate invoke [interruptible_eval.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"965\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(224,190,43)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"975.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.tools.nrepl.middleware.interruptible_eval$evaluate invoke [interruptible_eval.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$assoc_in invoke [core.clj] (0 samples, 0.00%)</title><rect x=\\\"800.0\\\" y=\\\"421\\\" width=\\\"13.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(245,78,47)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"802.99\\\" y=\\\"431.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$apply invokeStatic [core.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"885\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(228,162,36)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"895.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$apply invokeStatic [core.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$fn__7835 invokeStatic [protocols.clj] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"341\\\" width=\\\"201.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(218,27,37)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"351.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$fn_..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.io.BufferedInputStream available [BufferedInputStream.java] (0 samples, 0.00%)</title><rect x=\\\"606.4\\\" y=\\\"69\\\" width=\\\"64.4\\\" height=\\\"15.0\\\" fill=\\\"rgb(237,64,50)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"609.40\\\" y=\\\"79.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >java.io..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$reduce invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"389\\\" width=\\\"201.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(230,69,7)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"399.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$reduce invoke..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap$Seq create [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"165\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(215,51,19)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"175.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.AFn applyTo [AFn.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"869\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(238,177,10)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"879.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.AFn applyTo [AFn.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap add [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"1023.5\\\" y=\\\"101\\\" width=\\\"53.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(217,182,7)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1026.46\\\" y=\\\"111.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >cloju..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.io.FilterReader read [FilterReader.java] (1 samples, 100.11%)</title><rect x=\\\"59.2\\\" y=\\\"181\\\" width=\\\"611.6\\\" height=\\\"15.0\\\" fill=\\\"rgb(252,160,9)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"62.23\\\" y=\\\"191.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >java.io.FilterReader read [FilterReader.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap add [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"1023.5\\\" y=\\\"85\\\" width=\\\"53.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(246,52,38)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1026.46\\\" y=\\\"95.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >cloju..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentHashMap valAt [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\\\"1140.0\\\" y=\\\"389\\\" width=\\\"50.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(243,159,27)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1143.04\\\" y=\\\"399.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >cloju..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RT assoc [RT.java] (0 samples, 0.00%)</title><rect x=\\\"800.0\\\" y=\\\"357\\\" width=\\\"13.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(224,105,53)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"802.99\\\" y=\\\"367.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>lastfm_analysis$eval16976$fn__16977 invoke [] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"629\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(247,77,24)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"639.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >lastfm_analysis$eval16976$fn__16977 invoke []</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$with_bindings_STAR_ invokeStatic [core.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"901\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(249,215,15)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"911.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$with_bindings_STAR_ invokeStatic [core.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$map$fn__5587 invoke [core.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"357\\\" width=\\\"790.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(222,227,0)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"367.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$map$fn__5587 invoke [core.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.AFn applyToHelper [AFn.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"853\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(239,220,36)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"863.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.AFn applyToHelper [AFn.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>lastfm_analysis$longest_sessions_sorted_map$fn__15227 invoke [] (0 samples, 0.00%)</title><rect x=\\\"800.0\\\" y=\\\"437\\\" width=\\\"390.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(254,107,46)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"802.99\\\" y=\\\"447.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >lastfm_analysis$longest_sessions_sorted_map$fn__15227..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.main$repl doInvoke [main.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"805\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(247,65,10)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"815.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.main$repl doInvoke [main.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RT get [RT.java] (0 samples, 0.00%)</title><rect x=\\\"1140.0\\\" y=\\\"421\\\" width=\\\"50.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(247,49,1)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1143.04\\\" y=\\\"431.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >cloju..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap assoc [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"967.5\\\" y=\\\"197\\\" width=\\\"123.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(218,209,5)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"970.48\\\" y=\\\"207.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.Pe..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.LazySeq sval [LazySeq.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"373\\\" width=\\\"790.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(225,77,33)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"383.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.LazySeq sval [LazySeq.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$reduce invoke [core.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"581\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(219,139,46)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"591.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$reduce invoke [core.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentHashMap hash [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\\\"800.0\\\" y=\\\"309\\\" width=\\\"13.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(231,128,9)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"802.99\\\" y=\\\"319.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap add [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"967.5\\\" y=\\\"165\\\" width=\\\"123.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(214,107,39)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"970.48\\\" y=\\\"175.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.Pe..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.Compiler eval [Compiler.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"693\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(220,209,46)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"703.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.Compiler eval [Compiler.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.io.PushbackReader read [PushbackReader.java] (1 samples, 100.11%)</title><rect x=\\\"59.2\\\" y=\\\"197\\\" width=\\\"611.6\\\" height=\\\"15.0\\\" fill=\\\"rgb(227,41,51)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"62.23\\\" y=\\\"207.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >java.io.PushbackReader read [PushbackReader.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RT seq [RT.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"325\\\" width=\\\"660.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(205,19,13)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"335.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.RT seq [RT.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$with_bindings_STAR_ doInvoke [core.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"917\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(211,110,4)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"927.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$with_bindings_STAR_ doInvoke [core.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.data.csv$read_record invokeStatic [csv.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"245\\\" width=\\\"660.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(213,141,30)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"255.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.data.csv$read_record invokeStatic [csv.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.Util hasheq [Util.java] (0 samples, 0.00%)</title><rect x=\\\"800.0\\\" y=\\\"293\\\" width=\\\"13.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(227,83,51)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"802.99\\\" y=\\\"303.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$fn__7781$G__7776__7794 invoke [protocols.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"549\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(207,129,23)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"559.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$fn__7781$G__7776__7794 invoke [protocols.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$eval invoke [core.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"725\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(211,80,25)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"735.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$eval invoke [core.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>lastfm_analysis$longest_sessions_sorted_map invokeStatic [] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"597\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(232,105,35)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"607.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >lastfm_analysis$longest_sessions_sorted_map invokeStatic []</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.Util hasheq [Util.java] (0 samples, 0.00%)</title><rect x=\\\"1140.0\\\" y=\\\"357\\\" width=\\\"35.3\\\" height=\\\"15.0\\\" fill=\\\"rgb(234,170,22)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1143.04\\\" y=\\\"367.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >cl..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentHashMap assoc [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\\\"800.0\\\" y=\\\"325\\\" width=\\\"13.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(223,106,34)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"802.99\\\" y=\\\"335.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap$Black addRight [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"1076.6\\\" y=\\\"101\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(207,219,51)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1079.55\\\" y=\\\"111.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>all (1 samples, 100%)</title><rect x=\\\"10.0\\\" y=\\\"1077\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(222,162,12)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"1087.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>lastfm_analysis$eval16976 invoke [] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"661\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(224,222,16)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"671.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >lastfm_analysis$eval16976 invoke []</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$conj__5112 invoke [core.clj] (0 samples, 0.00%)</title><rect x=\\\"813.8\\\" y=\\\"421\\\" width=\\\"38.6\\\" height=\\\"15.0\\\" fill=\\\"rgb(227,86,25)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"816.75\\\" y=\\\"431.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clo..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$assoc_in invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\\\"800.0\\\" y=\\\"405\\\" width=\\\"13.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(251,13,35)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"802.99\\\" y=\\\"415.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentHashMap assoc [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\\\"800.0\\\" y=\\\"341\\\" width=\\\"13.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(239,217,30)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"802.99\\\" y=\\\"351.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RestFn invoke [RestFn.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"933\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(254,111,10)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"943.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.RestFn invoke [RestFn.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>lastfm_analysis$eval16976 invokeStatic [] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"645\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(208,137,25)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"655.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >lastfm_analysis$eval16976 invokeStatic []</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$seq__5124 invokeStatic [core.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"341\\\" width=\\\"660.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(234,26,18)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"351.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$seq__5124 invokeStatic [core.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>lastfm_analysis$select_and_convert_data invoke [] (0 samples, 0.00%)</title><rect x=\\\"670.8\\\" y=\\\"341\\\" width=\\\"129.2\\\" height=\\\"15.0\\\" fill=\\\"rgb(244,119,18)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"673.84\\\" y=\\\"351.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >lastfm_analysis$..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.util.concurrent.ThreadPoolExecutor runWorker [ThreadPoolExecutor.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"1029\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(215,185,6)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"1039.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >java.util.concurrent.ThreadPoolExecutor runWorker [ThreadPoolExecutor.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>org.joda.time.format.DateTimeFormatterBuilder$Composite parseInto [DateTimeFormatterBuilder.java] (0 samples, 0.00%)</title><rect x=\\\"670.8\\\" y=\\\"261\\\" width=\\\"34.3\\\" height=\\\"15.0\\\" fill=\\\"rgb(237,171,5)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"673.84\\\" y=\\\"271.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >or..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RT seqFrom [RT.java] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"197\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(246,141,22)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"207.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$conj__5112 invoke [core.clj] (0 samples, 0.00%)</title><rect x=\\\"953.0\\\" y=\\\"261\\\" width=\\\"172.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(205,170,47)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"955.99\\\" y=\\\"271.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$conj__511..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.data.csv$read_cell invoke [csv.clj] (1 samples, 100.11%)</title><rect x=\\\"25.7\\\" y=\\\"229\\\" width=\\\"645.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(250,188,51)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"28.69\\\" y=\\\"239.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.data.csv$read_cell invoke [csv.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.tools.nrepl.middleware.interruptible_eval$evaluate invokeStatic [interruptible_eval.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"949\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(226,161,29)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"959.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.tools.nrepl.middleware.interruptible_eval$evaluate invokeStatic [interruptible_eval.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentHashMap$BitmapIndexedNode find [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\\\"1175.3\\\" y=\\\"357\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(220,67,27)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1178.27\\\" y=\\\"367.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>org.joda.time.format.DateTimeFormatter parseDateTime [DateTimeFormatter.java] (0 samples, 0.00%)</title><rect x=\\\"670.8\\\" y=\\\"277\\\" width=\\\"129.2\\\" height=\\\"15.0\\\" fill=\\\"rgb(249,62,22)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"673.84\\\" y=\\\"287.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >org.joda.time.fo..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$conj__5112 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\\\"813.8\\\" y=\\\"405\\\" width=\\\"38.6\\\" height=\\\"15.0\\\" fill=\\\"rgb(231,40,8)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"816.75\\\" y=\\\"415.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clo..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.io.FileInputStream available [FileInputStream.java] (0 samples, 0.00%)</title><rect x=\\\"606.4\\\" y=\\\"53\\\" width=\\\"64.4\\\" height=\\\"15.0\\\" fill=\\\"rgb(247,198,43)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"609.40\\\" y=\\\"63.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >java.io..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clj_time.format$parse invokeStatic [format.clj] (0 samples, 0.00%)</title><rect x=\\\"670.8\\\" y=\\\"293\\\" width=\\\"129.2\\\" height=\\\"15.0\\\" fill=\\\"rgb(221,50,18)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"673.84\\\" y=\\\"303.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clj_time.format$..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>sun.nio.cs.StreamDecoder read [StreamDecoder.java] (0 samples, 0.00%)</title><rect x=\\\"571.7\\\" y=\\\"117\\\" width=\\\"99.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(211,65,25)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"574.65\\\" y=\\\"127.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >sun.nio.cs.S..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__4414 invoke [interruptible_eval.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"837\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(217,9,11)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"847.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__4414 invoke [interruptible_eval.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$seq__5124 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"229\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(213,5,0)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"239.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>sun.nio.cs.UTF_8$Decoder decodeLoop [UTF_8.java] (0 samples, 0.00%)</title><rect x=\\\"571.7\\\" y=\\\"69\\\" width=\\\"34.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(208,196,18)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"574.65\\\" y=\\\"79.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >su..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.data.csv$eval14258$fn__14259$fn__14260 invoke [csv.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"277\\\" width=\\\"660.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(230,195,43)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"287.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.data.csv$eval14258$fn__14259$fn__14260 invoke [csv.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RT seq [RT.java] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"293\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(213,100,29)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"303.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$fn__7852 invoke [protocols.clj] (0 samples, 0.00%)</title><rect x=\\\"953.0\\\" y=\\\"293\\\" width=\\\"187.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(205,223,27)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"955.99\\\" y=\\\"303.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$f..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$fn__7807$G__7802__7816 invoke [protocols.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"485\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(218,41,32)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"495.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$fn__7807$G__7802__7816 invoke [protocols.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.io.BufferedReader fill [BufferedReader.java] (0 samples, 0.00%)</title><rect x=\\\"571.7\\\" y=\\\"149\\\" width=\\\"99.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(224,67,39)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"574.65\\\" y=\\\"159.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >java.io.Buff..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$assoc_in invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\\\"800.0\\\" y=\\\"389\\\" width=\\\"13.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(226,155,33)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"802.99\\\" y=\\\"399.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$next__5108 invokeStatic [core.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"437\\\" width=\\\"790.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(232,50,18)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"447.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$next__5108 invokeStatic [core.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$conj_BANG_ invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\\\"10.0\\\" y=\\\"213\\\" width=\\\"15.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(217,93,12)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"223.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.main$repl$read_eval_print__8572 invoke [main.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"757\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(247,78,35)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"767.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.main$repl$read_eval_print__8572 invoke [main.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>sun.nio.cs.UTF_8$Decoder decodeArrayLoop [UTF_8.java] (0 samples, 0.00%)</title><rect x=\\\"590.0\\\" y=\\\"53\\\" width=\\\"16.4\\\" height=\\\"15.0\\\" fill=\\\"rgb(232,174,32)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"592.99\\\" y=\\\"63.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$eval invokeStatic [core.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"709\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(231,31,47)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"719.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$eval invokeStatic [core.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.AFn run [AFn.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"1013\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(228,174,43)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"1023.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.AFn run [AFn.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RT conj [RT.java] (0 samples, 0.00%)</title><rect x=\\\"953.0\\\" y=\\\"229\\\" width=\\\"172.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(226,208,39)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"955.99\\\" y=\\\"239.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.RT conj [..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentHashMap valAt [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\\\"1140.0\\\" y=\\\"405\\\" width=\\\"50.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(227,186,41)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1143.04\\\" y=\\\"415.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >cloju..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RT seq [RT.java] (0 samples, 0.00%)</title><rect x=\\\"852.4\\\" y=\\\"373\\\" width=\\\"85.9\\\" height=\\\"15.0\\\" fill=\\\"rgb(251,160,2)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"855.36\\\" y=\\\"383.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.la..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.LazySeq seq [LazySeq.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"389\\\" width=\\\"790.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(248,176,8)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"399.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.LazySeq seq [LazySeq.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$fn__7835 invokeStatic [protocols.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"517\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(232,121,11)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"527.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$fn__7835 invokeStatic [protocols.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$first__5106 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\\\"852.4\\\" y=\\\"405\\\" width=\\\"85.9\\\" height=\\\"15.0\\\" fill=\\\"rgb(235,17,52)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"855.36\\\" y=\\\"415.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.co..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RestFn invoke [RestFn.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"821\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(224,76,53)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"831.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.RestFn invoke [RestFn.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$seq__5124 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"309\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(250,222,44)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"319.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.LazySeq sval [LazySeq.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"293\\\" width=\\\"660.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(249,38,44)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"303.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.LazySeq sval [LazySeq.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RT conj [RT.java] (0 samples, 0.00%)</title><rect x=\\\"813.8\\\" y=\\\"389\\\" width=\\\"38.6\\\" height=\\\"15.0\\\" fill=\\\"rgb(225,200,27)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"816.75\\\" y=\\\"399.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clo..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>lastfm_analysis$select_and_convert_data invokeStatic [] (0 samples, 0.00%)</title><rect x=\\\"670.8\\\" y=\\\"325\\\" width=\\\"129.2\\\" height=\\\"15.0\\\" fill=\\\"rgb(236,158,50)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"673.84\\\" y=\\\"335.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >lastfm_analysis$..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap$Node getValue [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"1091.3\\\" y=\\\"197\\\" width=\\\"33.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(254,143,6)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1094.28\\\" y=\\\"207.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >cl..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$reduce invokeStatic [core.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"565\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(207,138,20)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"575.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$reduce invokeStatic [core.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.LazySeq seq [LazySeq.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"309\\\" width=\\\"660.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(206,27,31)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"319.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.LazySeq seq [LazySeq.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>org.joda.time.format.DateTimeParserBucket computeMillis [DateTimeParserBucket.java] (0 samples, 0.00%)</title><rect x=\\\"705.1\\\" y=\\\"245\\\" width=\\\"94.9\\\" height=\\\"15.0\\\" fill=\\\"rgb(206,149,15)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"708.12\\\" y=\\\"255.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >org.joda.ti..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$conj_BANG_ invoke [core.clj] (0 samples, 0.00%)</title><rect x=\\\"10.0\\\" y=\\\"229\\\" width=\\\"15.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(225,103,37)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"239.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap add [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"985.3\\\" y=\\\"133\\\" width=\\\"106.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(254,75,8)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"988.33\\\" y=\\\"143.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$seq_reduce invokeStatic [protocols.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"501\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(243,41,39)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"511.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$seq_reduce invokeStatic [protocols.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.main$repl$read_eval_print__8572$fn__8575 invoke [main.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"741\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(241,229,53)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"751.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.main$repl$read_eval_print__8572$fn__8575 invoke [main.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$into invoke [core.clj] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"421\\\" width=\\\"201.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(214,125,2)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"431.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$into invoke [..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>sun.nio.cs.StreamDecoder implRead [StreamDecoder.java] (0 samples, 0.00%)</title><rect x=\\\"571.7\\\" y=\\\"101\\\" width=\\\"99.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(221,83,29)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"574.65\\\" y=\\\"111.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >sun.nio.cs.S..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$fn__7781$G__7776__7794 invoke [protocols.clj] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"373\\\" width=\\\"201.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(226,26,0)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"383.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$fn_..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.io.FileInputStream available0 [FileInputStream.java] (0 samples, 0.00%)</title><rect x=\\\"606.4\\\" y=\\\"37\\\" width=\\\"64.4\\\" height=\\\"15.0\\\" fill=\\\"rgb(246,187,20)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"609.40\\\" y=\\\"47.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >java.io..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.util.concurrent.ThreadPoolExecutor$Worker run [ThreadPoolExecutor.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"1045\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(206,147,22)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"1055.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >java.util.concurrent.ThreadPoolExecutor$Worker run [ThreadPoolExecutor.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$assoc__5138 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\\\"800.0\\\" y=\\\"373\\\" width=\\\"13.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(244,174,39)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"802.99\\\" y=\\\"383.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.main$repl invokeStatic [main.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"789\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(205,120,46)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"799.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.main$repl invokeStatic [main.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.lang.String hashCode [String.java] (0 samples, 0.00%)</title><rect x=\\\"1140.0\\\" y=\\\"341\\\" width=\\\"35.3\\\" height=\\\"15.0\\\" fill=\\\"rgb(229,80,25)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1143.04\\\" y=\\\"351.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >ja..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>org.joda.time.format.DateTimeParserBucket computeMillis [DateTimeParserBucket.java] (0 samples, 0.00%)</title><rect x=\\\"705.1\\\" y=\\\"261\\\" width=\\\"94.9\\\" height=\\\"15.0\\\" fill=\\\"rgb(233,53,6)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"708.12\\\" y=\\\"271.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >org.joda.ti..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>org.joda.time.field.PreciseDurationDateTimeField set [PreciseDurationDateTimeField.java] (0 samples, 0.00%)</title><rect x=\\\"785.7\\\" y=\\\"213\\\" width=\\\"14.3\\\" height=\\\"15.0\\\" fill=\\\"rgb(253,223,50)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"788.74\\\" y=\\\"223.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap seq [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"181\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(252,206,21)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"191.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap$Seq push [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"149\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(215,74,21)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"159.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$take$fn__5630 invoke [core.clj] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"245\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(241,166,46)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"255.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$fn__7835 invoke [protocols.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"533\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(241,138,32)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"543.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$fn__7835 invoke [protocols.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap assoc [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"967.5\\\" y=\\\"181\\\" width=\\\"123.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(233,161,10)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"970.48\\\" y=\\\"191.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.Pe..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$into invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"405\\\" width=\\\"201.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(228,195,51)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"415.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$into invokeSt..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.Compiler eval [Compiler.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"677\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(221,37,32)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"687.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.Compiler eval [Compiler.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$first__5106 invoke [core.clj] (0 samples, 0.00%)</title><rect x=\\\"852.4\\\" y=\\\"421\\\" width=\\\"85.9\\\" height=\\\"15.0\\\" fill=\\\"rgb(229,109,12)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"855.36\\\" y=\\\"431.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.co..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.data.csv$read_cell invokeStatic [csv.clj] (1 samples, 100.11%)</title><rect x=\\\"40.7\\\" y=\\\"213\\\" width=\\\"630.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(215,221,4)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"43.65\\\" y=\\\"223.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.data.csv$read_cell invokeStatic [csv.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentHashMap$BitmapIndexedNode find [PersistentHashMap.java] (0 samples, 0.00%)</title><rect x=\\\"1175.3\\\" y=\\\"373\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(227,191,54)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"1178.27\\\" y=\\\"383.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap add [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"985.3\\\" y=\\\"117\\\" width=\\\"106.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(222,117,30)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"988.33\\\" y=\\\"127.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core$conj__5112 invokeStatic [core.clj] (0 samples, 0.00%)</title><rect x=\\\"953.0\\\" y=\\\"245\\\" width=\\\"172.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(252,175,37)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"955.99\\\" y=\\\"255.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core$conj__511..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.LazySeq seq [LazySeq.java] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"277\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(224,190,17)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"287.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RT first [RT.java] (0 samples, 0.00%)</title><rect x=\\\"852.4\\\" y=\\\"389\\\" width=\\\"85.9\\\" height=\\\"15.0\\\" fill=\\\"rgb(246,3,49)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"855.36\\\" y=\\\"399.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.la..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>org.joda.time.format.DateTimeParserBucket$SavedField set [DateTimeParserBucket.java] (0 samples, 0.00%)</title><rect x=\\\"705.1\\\" y=\\\"229\\\" width=\\\"94.9\\\" height=\\\"15.0\\\" fill=\\\"rgb(248,83,14)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"708.12\\\" y=\\\"239.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >org.joda.ti..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.PersistentTreeMap add [PersistentTreeMap.java] (0 samples, 0.00%)</title><rect x=\\\"967.5\\\" y=\\\"149\\\" width=\\\"123.8\\\" height=\\\"15.0\\\" fill=\\\"rgb(218,75,16)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"970.48\\\" y=\\\"159.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.Pe..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>sun.nio.cs.StreamDecoder inReady [StreamDecoder.java] (0 samples, 0.00%)</title><rect x=\\\"606.4\\\" y=\\\"85\\\" width=\\\"64.4\\\" height=\\\"15.0\\\" fill=\\\"rgb(241,224,15)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"609.40\\\" y=\\\"95.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >sun.nio..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$fn__7852 invoke [protocols.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"469\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(212,5,11)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"479.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$fn__7852 invoke [protocols.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.Cons next [Cons.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"405\\\" width=\\\"790.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(248,34,7)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"415.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.Cons next [Cons.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RT next [RT.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"421\\\" width=\\\"790.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(221,68,45)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"431.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.RT next [RT.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__4454 invoke [interruptible_eval.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"997\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(251,222,48)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"1007.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__4454 invoke [interruptible_eval.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.lang.Thread run [Thread.java] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"1061\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(221,214,42)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"1071.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >java.lang.Thread run [Thread.java]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>lastfm_analysis$longest_sessions_sorted_map invoke [] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"613\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(230,181,3)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"623.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >lastfm_analysis$longest_sessions_sorted_map invoke []</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RT seq [RT.java] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"213\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(227,96,44)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"223.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.RT seqFrom [RT.java] (0 samples, 0.00%)</title><rect x=\\\"852.4\\\" y=\\\"357\\\" width=\\\"85.9\\\" height=\\\"15.0\\\" fill=\\\"rgb(244,5,53)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"855.36\\\" y=\\\"367.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.la..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.LazySeq sval [LazySeq.java] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"261\\\" width=\\\"14.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(213,64,48)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"271.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" ></text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$seq_reduce invokeStatic [protocols.clj] (0 samples, 0.00%)</title><rect x=\\\"938.3\\\" y=\\\"325\\\" width=\\\"201.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(240,121,10)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"941.27\\\" y=\\\"335.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$seq..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.lang.APersistentMap cons [APersistentMap.java] (0 samples, 0.00%)</title><rect x=\\\"953.0\\\" y=\\\"213\\\" width=\\\"172.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(209,4,19)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"955.99\\\" y=\\\"223.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.lang.APersiste..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$fn__7852 invokeStatic [protocols.clj] (0 samples, 0.00%)</title><rect x=\\\"953.0\\\" y=\\\"277\\\" width=\\\"187.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(250,62,34)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"955.99\\\" y=\\\"287.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$f..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.core.protocols$fn__7852 invokeStatic [protocols.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"453\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(212,168,45)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"463.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.core.protocols$fn__7852 invokeStatic [protocols.clj]</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.io.BufferedReader read [BufferedReader.java] (0 samples, 0.00%)</title><rect x=\\\"571.7\\\" y=\\\"165\\\" width=\\\"99.1\\\" height=\\\"15.0\\\" fill=\\\"rgb(242,195,28)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"574.65\\\" y=\\\"175.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >java.io.Buff..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>java.nio.charset.CharsetDecoder decode [CharsetDecoder.java] (0 samples, 0.00%)</title><rect x=\\\"571.7\\\" y=\\\"85\\\" width=\\\"34.7\\\" height=\\\"15.0\\\" fill=\\\"rgb(227,86,50)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"574.65\\\" y=\\\"95.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >ja..</text>\\n</g>\\n<g class=\\\"func_g\\\" onmouseover=\\\"s(this)\\\" onmouseout=\\\"c()\\\" onclick=\\\"zoom(this)\\\">\\n<title>clojure.main$repl$fn__8581 invoke [main.clj] (1 samples, 100.11%)</title><rect x=\\\"10.0\\\" y=\\\"773\\\" width=\\\"1180.0\\\" height=\\\"15.0\\\" fill=\\\"rgb(245,184,14)\\\" rx=\\\"2\\\" ry=\\\"2\\\" />\\n<text text-anchor=\\\"\\\" x=\\\"13.00\\\" y=\\\"783.5\\\" font-size=\\\"12\\\" font-family=\\\"Verdana\\\" fill=\\\"rgb(0,0,0)\\\" >clojure.main$repl$fn__8581 invoke [main.clj]</text>\\n</g>\\n</svg>\\n</div>\"}"} | |
;; <= | |
;; ** | |
;;; We will use the reduce version seeing as it is fast enough and not too much slower. | |
;; ** | |
;; @@ | |
(def longest-sessions longest-sessions-reduce) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-var'>#'lastfm-analysis/longest-sessions</span>","value":"#'lastfm-analysis/longest-sessions"} | |
;; <= | |
;; ** | |
;;; The second part of this problem is to find the 10 most played songs in the 50 longest sessions. | |
;; ** | |
;; @@ | |
(defn most-played | |
"Given a list of tracks, returns the top 10 most played tracks and the amount | |
of times they were played." | |
[n tracks] | |
(->> tracks | |
(frequencies) | |
(sort-by val) | |
(reverse) | |
(take n))) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-var'>#'lastfm-analysis/most-played</span>","value":"#'lastfm-analysis/most-played"} | |
;; <= | |
;; @@ | |
(require '[gorilla-repl.table :refer [table-view]]) | |
(->> data-small | |
(map select-and-convert-data) | |
(longest-sessions 50) | |
(flatten) | |
(most-played 10) | |
(table-view)) | |
;; @@ | |
;; => | |
;;; {"type":"list-like","open":"<center><table>","close":"</table></center>","separator":"\n","items":[{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Love Lockdown"</span>","value":"\"Love Lockdown\""},{"type":"html","content":"<span class='clj-long'>1775</span>","value":"1775"}],"value":"[\"Love Lockdown\" 1775]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Heartless"</span>","value":"\"Heartless\""},{"type":"html","content":"<span class='clj-long'>1775</span>","value":"1775"}],"value":"[\"Heartless\" 1775]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"See You In My Nightmares"</span>","value":"\"See You In My Nightmares\""},{"type":"html","content":"<span class='clj-long'>1769</span>","value":"1769"}],"value":"[\"See You In My Nightmares\" 1769]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Pinocchio Story (Freestyle Live From Singapore)"</span>","value":"\"Pinocchio Story (Freestyle Live From Singapore)\""},{"type":"html","content":"<span class='clj-long'>1768</span>","value":"1768"}],"value":"[\"Pinocchio Story (Freestyle Live From Singapore)\" 1768]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Say You Will"</span>","value":"\"Say You Will\""},{"type":"html","content":"<span class='clj-long'>1768</span>","value":"1768"}],"value":"[\"Say You Will\" 1768]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Paranoid (Feat. Mr. Hudson)"</span>","value":"\"Paranoid (Feat. Mr. Hudson)\""},{"type":"html","content":"<span class='clj-long'>1767</span>","value":"1767"}],"value":"[\"Paranoid (Feat. Mr. Hudson)\" 1767]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Welcome To Heartbreak (Feat. Kid Cudi)"</span>","value":"\"Welcome To Heartbreak (Feat. Kid Cudi)\""},{"type":"html","content":"<span class='clj-long'>1766</span>","value":"1766"}],"value":"[\"Welcome To Heartbreak (Feat. Kid Cudi)\" 1766]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Amazing (Feat. Young Jeezy)"</span>","value":"\"Amazing (Feat. Young Jeezy)\""},{"type":"html","content":"<span class='clj-long'>1764</span>","value":"1764"}],"value":"[\"Amazing (Feat. Young Jeezy)\" 1764]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Coldest Winter"</span>","value":"\"Coldest Winter\""},{"type":"html","content":"<span class='clj-long'>1760</span>","value":"1760"}],"value":"[\"Coldest Winter\" 1760]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Bad News"</span>","value":"\"Bad News\""},{"type":"html","content":"<span class='clj-long'>1748</span>","value":"1748"}],"value":"[\"Bad News\" 1748]"}],"value":"#gorilla_repl.table.TableView{:contents ([\"Love Lockdown\" 1775] [\"Heartless\" 1775] [\"See You In My Nightmares\" 1769] [\"Pinocchio Story (Freestyle Live From Singapore)\" 1768] [\"Say You Will\" 1768] [\"Paranoid (Feat. Mr. Hudson)\" 1767] [\"Welcome To Heartbreak (Feat. Kid Cudi)\" 1766] [\"Amazing (Feat. Young Jeezy)\" 1764] [\"Coldest Winter\" 1760] [\"Bad News\" 1748]), :opts nil}"} | |
;; <= | |
;; ** | |
;;; Shown above is the results of using the small data set. It looks like quite a few people like Kanye West :) | |
;;; | |
;;; I decided to run the numbers on just this small amount of data | |
;; ** | |
;; @@ | |
(let [top (->> data-small | |
(map select-and-convert-data) | |
(longest-sessions 50) | |
(flatten) | |
(most-played 12)) ; The top 12 songs are all the same Kanye west album | |
times-played (->> top | |
(map second) | |
(reduce +)) | |
average-album-time 4.3] ; Source: wikipedia | |
(/ (* average-album-time times-played) | |
60 | |
24)) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-double'>62.54409722222223</span>","value":"62.54409722222223"} | |
;; <= | |
;; ** | |
;;; That's 62.5 days of Kanye West! | |
;;; | |
;;; Now for the acutal data: | |
;;; | |
;;; The original data was again reversed using the following command: | |
;;; | |
;;; > `tac data.tsv >> data.reversed.tsv` | |
;; ** | |
;; @@ | |
(def top-50-longest-sessions | |
(with-open [r (io/reader (io/file "./data/data.reversed.tsv"))] | |
(->> (csv/read-csv r :separator \tab :quote \uFFFF) | |
(map select-and-convert-data) | |
(longest-sessions 50)))) | |
(def top-10-longest-played | |
(->> top-50-longest-sessions | |
(flatten) | |
(most-played 10))) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-var'>#'lastfm-analysis/top-10-longest-played</span>","value":"#'lastfm-analysis/top-10-longest-played"} | |
;; <= | |
;; @@ | |
(table-view top-10-longest-played) | |
;; @@ | |
;; => | |
;;; {"type":"list-like","open":"<center><table>","close":"</table></center>","separator":"\n","items":[{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Jolene"</span>","value":"\"Jolene\""},{"type":"html","content":"<span class='clj-long'>1215</span>","value":"1215"}],"value":"[\"Jolene\" 1215]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Heartbeats"</span>","value":"\"Heartbeats\""},{"type":"html","content":"<span class='clj-long'>868</span>","value":"868"}],"value":"[\"Heartbeats\" 868]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"How Long Will It Take"</span>","value":"\"How Long Will It Take\""},{"type":"html","content":"<span class='clj-long'>726</span>","value":"726"}],"value":"[\"How Long Will It Take\" 726]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Anthems For A Seventeen Year Old Girl"</span>","value":"\"Anthems For A Seventeen Year Old Girl\""},{"type":"html","content":"<span class='clj-long'>659</span>","value":"659"}],"value":"[\"Anthems For A Seventeen Year Old Girl\" 659]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"St. Ides Heaven"</span>","value":"\"St. Ides Heaven\""},{"type":"html","content":"<span class='clj-long'>646</span>","value":"646"}],"value":"[\"St. Ides Heaven\" 646]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Bonus Track"</span>","value":"\"Bonus Track\""},{"type":"html","content":"<span class='clj-long'>644</span>","value":"644"}],"value":"[\"Bonus Track\" 644]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Starin' Through My Rear View"</span>","value":"\"Starin' Through My Rear View\""},{"type":"html","content":"<span class='clj-long'>617</span>","value":"617"}],"value":"[\"Starin' Through My Rear View\" 617]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"Beast Of Burden"</span>","value":"\"Beast Of Burden\""},{"type":"html","content":"<span class='clj-long'>613</span>","value":"613"}],"value":"[\"Beast Of Burden\" 613]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"The Swing"</span>","value":"\"The Swing\""},{"type":"html","content":"<span class='clj-long'>604</span>","value":"604"}],"value":"[\"The Swing\" 604]"},{"type":"list-like","open":"<tr><td>","close":"</td></tr>","separator":"</td><td>","items":[{"type":"html","content":"<span class='clj-string'>"See You In My Nightmares"</span>","value":"\"See You In My Nightmares\""},{"type":"html","content":"<span class='clj-long'>536</span>","value":"536"}],"value":"[\"See You In My Nightmares\" 536]"}],"value":"#gorilla_repl.table.TableView{:contents ([\"Jolene\" 1215] [\"Heartbeats\" 868] [\"How Long Will It Take\" 726] [\"Anthems For A Seventeen Year Old Girl\" 659] [\"St. Ides Heaven\" 646] [\"Bonus Track\" 644] [\"Starin' Through My Rear View\" 617] [\"Beast Of Burden\" 613] [\"The Swing\" 604] [\"See You In My Nightmares\" 536]), :opts nil}"} | |
;; <= | |
;; ** | |
;;; On my machine this takes about 6-7 minutes to run | |
;;; | |
;;; ## Step 5: Evaluation of results | |
;;; | |
;;; This result surprised me given how many times Kanye West was played in the first 40 people worth of data, but on closer inspection it was impossible for a single user to account for those numbers. What is curious though is that the numbers for Kanye West are so similar, I had presumed that this was because one person had this one album on repeat. | |
;;; | |
;;; I think the most plausible explanation is that one person played this album almost on repeat, but there were several times when either the connection cut out and a few songs were missed or they stopped playing for a while. This would account for the number of plays being so similar, and because of the shorter session times would account for why it there is only one song from that album in the final listings as the shorter sessions wouldn't make it into the top 50. | |
;;; | |
;;; ## Step 6: Knowledge Presentation | |
;;; | |
;;; This will output the two colums: `track-name` and `number-of-plays` | |
;; ** | |
;; @@ | |
(with-open [w (io/writer "./data/output.tsv")] | |
(csv/write-csv w | |
top-10-longest-played | |
:separator \tab)) | |
;; @@ | |
;; => | |
;;; {"type":"html","content":"<span class='clj-nil'>nil</span>","value":"nil"} | |
;; <= |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Go to the following ling to see a the file rendered in gorilla repl:
https://viewer.gorilla-repl.org/view.html?source=gist&id=b52d58ab71ebefaf08069832239c5ced&filename=lastfm-analysis.clj