Izmir Fish Market 2021 Daily Prices


        In this assignment, we will go into the details of the CSV file that is obtained by Izmir Metropolitan Municipality’s Open Data website.

        The data in the link has already loaded as seen below, also necessary packages in the background, let’s get on to the analyzes and reports of the data.

df <- read_delim("balik_hal_fiyatlari.csv", delim = ";")


1-) Structure of the Data


        Let’s see the structure of the data frame balik_hal_fiyatlari.csv.

str(df)
spec_tbl_df [18,369 x 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ TARIH       : POSIXct[1:18369], format: "2021-01-02" "2021-01-02" ...
 $ MAL_TURU    : chr [1:18369] "BALIK" "BALIK" "BALIK" "BALIK" ...
 $ MAL_ADI     : chr [1:18369] "TIRSI (DENIZ)" "KIRLANGIÇ (DENIZ)" "ÇIMÇIM (DENIZ)" "HANOS ( DENIZ )" ...
 $ BIRIM       : chr [1:18369] "KG" "KG" "KG" "KG" ...
 $ ASGARI_UCRET: num [1:18369] 5.83 3 3.5 2.5 45 130 38 25 10 2.5 ...
 $ AZAMI_UCRET : num [1:18369] 12.5 80 8 5 45 130 38 55 10 6.67 ...
 - attr(*, "spec")=
  .. cols(
  ..   TARIH = col_datetime(format = ""),
  ..   MAL_TURU = col_character(),
  ..   MAL_ADI = col_character(),
  ..   BIRIM = col_character(),
  ..   ASGARI_UCRET = col_double(),
  ..   AZAMI_UCRET = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 

        We see that there is 18,369 observations which are seperated by 6 different columns. First “TARIH” column is a date format, “MAL_TURU”, “MAL_ADI” and “BIRIM” columns are characters and last two “ASGARI_UCRET” and “AZAMI_UCRET” columns are numbers.


2-) Most 5 Expensive Fishes and its Maximum Price in 2021


        As you can see in the below code the most 5 expensive fishes are Barbun, Istakoz, Levrek, Mercan and Peygamber.

max_prices <- df %>%
  group_by(MAL_ADI, BIRIM) %>%
  summarise(MAX_PRICE = max(AZAMI_UCRET)) %>%
  arrange(desc(MAX_PRICE)) %>%
  head(5) %>%
  ungroup()
max_prices


3-) Average Maximum Prices of Freshwater Fishes


        The code below demonstrates the average maximum price of freshwater fishes in 2021.

freshwater_fish <- df %>%
  filter(MAL_TURU == "TATLI SU") %>%
  group_by(MAL_ADI, BIRIM) %>%
  summarise(AVG_MAX_PRICE = mean(AZAMI_UCRET)) %>%
  arrange(desc(AVG_MAX_PRICE)) %>%
  ungroup()
freshwater_fish

        As seen above we see there are 11 different fish types in the Izmir fish market which are Imported and Regular Salmon, Frozen and Regular Trout, Jack, Zander, Catfish, Carp, Eel, Bream and Hardyhead, in order of average prices.


4-) Finding the Outliers and Removing Them


        For starters, we have to decide how we are going to detect the outliers. I have chosen to locate outliers with the IQR method.

        As seen below, I reverse engineered the original IQR method then used the filter function to demonstrate the outliers.

df_outliers <- df %>%
  group_by(MAL_ADI) %>%
  transmute(AZAMI_UCRET, ASGARI_UCRET, FARK = AZAMI_UCRET - ASGARI_UCRET,
            IQR_FARK = IQR(FARK),
            UPPER = quantile(FARK, 0.75) + IQR_FARK * 1.5,
            LOWER = quantile(FARK, 0.25) - IQR_FARK * 1.5) %>%
  filter(!(FARK <= UPPER & FARK >= LOWER))
df_outliers


        The code below demonstrates how I grouped and filtered the original data. Then instead of adjusting it, I created a new data frame called df_no_outlier which will be used in other calculations. I also used ungroup function so the new data frame is almost the same as the original data frame. The only difference is the outliers.

df_no_outlier <- df %>%
  group_by(MAL_ADI) %>%
  mutate(FARK = AZAMI_UCRET - ASGARI_UCRET,
         IQR_FARK = IQR(FARK),
         UPPER = quantile(FARK, 0.75) + IQR_FARK * 1.5,
         LOWER = quantile(FARK, 0.25) - IQR_FARK * 1.5) %>%
  filter(FARK <= UPPER & FARK >= LOWER) %>%
  ungroup()


5-) Daily Maximum Price Difference in 2 Periods


        In this part of the code, I separated the data into two, depending on the dates that fishing was banned throughout the country and not banned. yasak_fark demonstrates the maximum difference in daily prices during the ban period. serbest_fark does the same but during the times that fishing was not banned.

yasak_fark <- df_no_outlier %>%
  filter(TARIH >= "2021-04-15" & TARIH <= "2021-08-31") %>%
  group_by(MAL_ADI) %>%
  summarise(FARK = max(AZAMI_UCRET - ASGARI_UCRET))
serbest_fark <- df_no_outlier %>%
  filter(!(TARIH >= "2021-04-15" & TARIH <= "2021-08-31")) %>%
  group_by(MAL_ADI) %>%
  summarise(FARK = max(AZAMI_UCRET - ASGARI_UCRET))


6-) Visualization of the Differences between 2 Periods


        In the code below I joined two data frames in order to get the compare the differences in different periods.

farklar <- serbest_fark %>%
  inner_join(yasak_fark, by = "MAL_ADI", suffix = c("_SERBEST", "_YASAK")) %>%
  mutate(DONEM_FARK = FARK_SERBEST - FARK_YASAK) %>%
  arrange(desc(DONEM_FARK))


        Just for the hardware’s sake, I only took the differences in the head and the tail of the data frame.

first_n_last <- bind_rows(head(farklar), tail(farklar)) %>%
  mutate(MAL_ADI = fct_reorder(MAL_ADI, DONEM_FARK))


        This code below is used to create a horizontal barplot.

ggplot(first_n_last, aes(x = MAL_ADI, y = DONEM_FARK, fill = MAL_ADI)) +
  geom_col() +
  geom_text(aes(label=DONEM_FARK), size = 3) +
  coord_flip() +
  ggtitle("Change in the price differences") +
  xlab("Fish Name") + ylab("Difference(TL)") +
  theme(legend.position = "none")

        As seen above after eliminating the outliers which probably were a result of manipulation of the fish market or temporary occasions, we can clearly see the change in the prices of the same fish.




                                                                                               Thanks for reading…

LS0tDQp0aXRsZTogIioqQkRBLTUwMyBXZWVrIDUgLSBJem1pciBGaXNoIE1hcmtldCBBc3NpZ25tZW50KioiDQphdXRob3I6ICJfRW1pcmhhbiDFnmFoaW5fIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICAgIGh0bWxfbm90ZWJvb2s6DQogICAgICAgIHRvYzogdHJ1ZQ0KICAgICAgICB0b2NfZGVwdGg6IDMNCiAgICAgICAgdG9jX2Zsb2F0Og0KICAgICAgICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KLS0tDQo8YnI+DQo8c3R5bGU+DQojVE9DIHsNCiAgICBjb2xvcjogIzQwNDA0MDsNCiAgICBmb250LXNpemU6IDEzcHg7DQogICAgYm9yZGVyLWNvbG9yOiAjMDAwMDAwOw0KICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBzeXN0ZW0tdWksIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgUm9ib3RvLCBVYnVudHU7DQp9DQpoMS50aXRsZSB7DQogICAgY29sb3I6ICM0MDQwNDA7DQogICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIHN5c3RlbS11aSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIFVidW50dTsNCn0NCmg0LmF1dGhvciB7DQogICAgY29sb3I6ICM0MDQwNDA7DQogICAgZm9udC1zaXplOiAxMnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBzeXN0ZW0tdWksIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgUm9ib3RvLCBVYnVudHU7DQp9DQpoNC5kYXRlIHsNCiAgICBjb2xvcjogIzQwNDA0MDsNCiAgICBmb250LXNpemU6IDEycHg7DQogICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIHN5c3RlbS11aSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIFVidW50dTsNCn0NCmJvZHkgew0KICAgIGNvbG9yOiAjNjk2OTY5Ow0KICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBzeXN0ZW0tdWksIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgUm9ib3RvLCBVYnVudHU7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RjVGNTsNCiAgICBmb250LXNpemU6IDE2cHg7DQo8L3N0eWxlPg0KDQojICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8c3BhbiBzdHlsZT0iY29sb3I6IzQwNDA0MCI+KipJem1pciBGaXNoIE1hcmtldCAyMDIxIERhaWx5IFByaWNlcyoqPC9zcGFuPg0KDQo8YnI+DQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBJbiB0aGlzIGFzc2lnbm1lbnQsIHdlIHdpbGwgZ28gaW50byB0aGUgZGV0YWlscyBvZiB0aGUgQ1NWIGZpbGUgdGhhdCBpcyBvYnRhaW5lZCBieSBJem1pciBNZXRyb3BvbGl0YW4gTXVuaWNpcGFsaXR5J3MgKipbT3BlbiBEYXRhIHdlYnNpdGUuXShodHRwczovL2FjaWt2ZXJpLmJpeml6bWlyLmNvbS90ci9kYXRhc2V0L2JhbGlrLWhhbC1maXlhdGxhcmkpKioNCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICoqW1RoZSBkYXRhXShodHRwczovL29wZW5maWxlcy5pem1pci5iZWwudHIvMTAwMTYwL2RvY3MvYmFsaWtfaGFsX2ZpeWF0bGFyaS5jc3YpKiogaW4gdGhlIGxpbmsgaGFzIGFscmVhZHkgbG9hZGVkIGFzIHNlZW4gYmVsb3csIGFsc28gbmVjZXNzYXJ5IHBhY2thZ2VzIGluIHRoZSBiYWNrZ3JvdW5kLCBsZXQncyBnZXQgb24gdG8gdGhlIGFuYWx5emVzIGFuZCByZXBvcnRzIG9mIHRoZSBkYXRhLg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocmVhZHIpDQpgYGANCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0NCmRmIDwtIHJlYWRfZGVsaW0oImJhbGlrX2hhbF9maXlhdGxhcmkuY3N2IiwgZGVsaW0gPSAiOyIpDQpgYGANCg0KPGJyPg0KDQojIyMgKioxLSkgU3RydWN0dXJlIG9mIHRoZSBEYXRhKioNCg0KPGJyPg0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgTGV0J3Mgc2VlIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGEgZnJhbWUgYGJhbGlrX2hhbF9maXlhdGxhcmkuY3N2YC4NCg0KYGBge3J9DQpzdHIoZGYpDQpgYGANCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFdlIHNlZSB0aGF0IHRoZXJlIGlzIDE4LDM2OSBvYnNlcnZhdGlvbnMgd2hpY2ggYXJlIHNlcGVyYXRlZCBieSA2IGRpZmZlcmVudCBjb2x1bW5zLiBGaXJzdCAqKiJUQVJJSCIqKiBjb2x1bW4gaXMgYSBkYXRlIGZvcm1hdCwgKioiTUFMX1RVUlUiKiosICoqIk1BTF9BREkiKiogYW5kICoqIkJJUklNIioqIGNvbHVtbnMgYXJlIGNoYXJhY3RlcnMgYW5kIGxhc3QgdHdvICoqIkFTR0FSSV9VQ1JFVCIqKiBhbmQgKioiQVpBTUlfVUNSRVQiKiogY29sdW1ucyBhcmUgbnVtYmVycy4NCg0KPGJyPg0KDQojIyMgKioyLSkgTW9zdCA1IEV4cGVuc2l2ZSBGaXNoZXMgYW5kIGl0cyBNYXhpbXVtIFByaWNlIGluIDIwMjEqKg0KDQo8YnI+DQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBBcyB5b3UgY2FuIHNlZSBpbiB0aGUgYmVsb3cgY29kZSB0aGUgbW9zdCA1IGV4cGVuc2l2ZSBmaXNoZXMgYXJlICoqQmFyYnVuLCBJc3Rha296LCBMZXZyZWssIE1lcmNhbiBhbmQgUGV5Z2FtYmVyLioqDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0V9DQptYXhfcHJpY2VzIDwtIGRmICU+JQ0KICBncm91cF9ieShNQUxfQURJLCBCSVJJTSkgJT4lDQogIHN1bW1hcmlzZShNQVhfUFJJQ0UgPSBtYXgoQVpBTUlfVUNSRVQpKSAlPiUNCiAgYXJyYW5nZShkZXNjKE1BWF9QUklDRSkpICU+JQ0KICBoZWFkKDUpICU+JQ0KICB1bmdyb3VwKCkNCm1heF9wcmljZXMNCmBgYA0KDQo8YnI+DQoNCiMjIyAqKjMtKSBBdmVyYWdlIE1heGltdW0gUHJpY2VzIG9mIEZyZXNod2F0ZXIgRmlzaGVzKioNCg0KPGJyPg0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgVGhlIGNvZGUgYmVsb3cgZGVtb25zdHJhdGVzIHRoZSBhdmVyYWdlIG1heGltdW0gcHJpY2Ugb2YgZnJlc2h3YXRlciBmaXNoZXMgaW4gMjAyMS4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0NCmZyZXNod2F0ZXJfZmlzaCA8LSBkZiAlPiUNCiAgZmlsdGVyKE1BTF9UVVJVID09ICJUQVRMSSBTVSIpICU+JQ0KICBncm91cF9ieShNQUxfQURJLCBCSVJJTSkgJT4lDQogIHN1bW1hcmlzZShBVkdfTUFYX1BSSUNFID0gbWVhbihBWkFNSV9VQ1JFVCkpICU+JQ0KICBhcnJhbmdlKGRlc2MoQVZHX01BWF9QUklDRSkpICU+JQ0KICB1bmdyb3VwKCkNCmZyZXNod2F0ZXJfZmlzaA0KYGBgDQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBBcyBzZWVuIGFib3ZlIHdlIHNlZSB0aGVyZSBhcmUgMTEgZGlmZmVyZW50IGZpc2ggdHlwZXMgaW4gdGhlIEl6bWlyIGZpc2ggbWFya2V0IHdoaWNoIGFyZSAqKkltcG9ydGVkIGFuZCBSZWd1bGFyIFNhbG1vbiwgRnJvemVuIGFuZCBSZWd1bGFyIFRyb3V0LCBKYWNrLCBaYW5kZXIsIENhdGZpc2gsIENhcnAsIEVlbCwgQnJlYW0gYW5kIEhhcmR5aGVhZCoqLCBpbiBvcmRlciBvZiBhdmVyYWdlIHByaWNlcy4NCg0KPGJyPg0KDQojIyMgKio0LSkgRmluZGluZyB0aGUgT3V0bGllcnMgYW5kIFJlbW92aW5nIFRoZW0qKg0KDQo8YnI+DQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBGb3Igc3RhcnRlcnMsIHdlIGhhdmUgdG8gZGVjaWRlIGhvdyB3ZSBhcmUgZ29pbmcgdG8gZGV0ZWN0IHRoZSBvdXRsaWVycy4gSSBoYXZlIGNob3NlbiB0byBsb2NhdGUgb3V0bGllcnMgd2l0aCBbdGhlIElRUiBtZXRob2RdKGh0dHBzOi8vd3d3LnN0YXRpc3RpY3Nob3d0by5jb20vcHJvYmFiaWxpdHktYW5kLXN0YXRpc3RpY3MvaW50ZXJxdWFydGlsZS1yYW5nZS8pLg0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQXMgc2VlbiBiZWxvdywgSSByZXZlcnNlIGVuZ2luZWVyZWQgdGhlIG9yaWdpbmFsIElRUiBtZXRob2QgdGhlbiB1c2VkIHRoZSBbZmlsdGVyIGZ1bmN0aW9uXShodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvZHBseXIvdmVyc2lvbnMvMC43LjgvdG9waWNzL2ZpbHRlcikgdG8gZGVtb25zdHJhdGUgdGhlIG91dGxpZXJzLg0KDQpgYGB7cn0NCmRmX291dGxpZXJzIDwtIGRmICU+JQ0KICBncm91cF9ieShNQUxfQURJKSAlPiUNCiAgdHJhbnNtdXRlKEFaQU1JX1VDUkVULCBBU0dBUklfVUNSRVQsIEZBUksgPSBBWkFNSV9VQ1JFVCAtIEFTR0FSSV9VQ1JFVCwNCiAgICAgICAgICAgIElRUl9GQVJLID0gSVFSKEZBUkspLA0KICAgICAgICAgICAgVVBQRVIgPSBxdWFudGlsZShGQVJLLCAwLjc1KSArIElRUl9GQVJLICogMS41LA0KICAgICAgICAgICAgTE9XRVIgPSBxdWFudGlsZShGQVJLLCAwLjI1KSAtIElRUl9GQVJLICogMS41KSAlPiUNCiAgZmlsdGVyKCEoRkFSSyA8PSBVUFBFUiAmIEZBUksgPj0gTE9XRVIpKQ0KZGZfb3V0bGllcnMNCmBgYA0KDQo8YnI+DQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBUaGUgY29kZSBiZWxvdyBkZW1vbnN0cmF0ZXMgaG93IEkgZ3JvdXBlZCBhbmQgZmlsdGVyZWQgdGhlIG9yaWdpbmFsIGRhdGEuIFRoZW4gaW5zdGVhZCBvZiBhZGp1c3RpbmcgaXQsIEkgY3JlYXRlZCBhIG5ldyBkYXRhIGZyYW1lIGNhbGxlZCBgZGZfbm9fb3V0bGllcmAgd2hpY2ggd2lsbCBiZSB1c2VkIGluIG90aGVyIGNhbGN1bGF0aW9ucy4gSSBhbHNvIHVzZWQgdW5ncm91cCBmdW5jdGlvbiBzbyB0aGUgbmV3IGRhdGEgZnJhbWUgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCBkYXRhIGZyYW1lLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZSBvdXRsaWVycy4NCg0KYGBge3J9DQpkZl9ub19vdXRsaWVyIDwtIGRmICU+JQ0KICBncm91cF9ieShNQUxfQURJKSAlPiUNCiAgbXV0YXRlKEZBUksgPSBBWkFNSV9VQ1JFVCAtIEFTR0FSSV9VQ1JFVCwNCiAgICAgICAgIElRUl9GQVJLID0gSVFSKEZBUkspLA0KICAgICAgICAgVVBQRVIgPSBxdWFudGlsZShGQVJLLCAwLjc1KSArIElRUl9GQVJLICogMS41LA0KICAgICAgICAgTE9XRVIgPSBxdWFudGlsZShGQVJLLCAwLjI1KSAtIElRUl9GQVJLICogMS41KSAlPiUNCiAgZmlsdGVyKEZBUksgPD0gVVBQRVIgJiBGQVJLID49IExPV0VSKSAlPiUNCiAgdW5ncm91cCgpDQpgYGANCg0KPGJyPg0KDQojIyMgKio1LSkgRGFpbHkgTWF4aW11bSBQcmljZSBEaWZmZXJlbmNlIGluIDIgUGVyaW9kcyoqDQoNCjxicj4NCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEluIHRoaXMgcGFydCBvZiB0aGUgY29kZSwgSSBzZXBhcmF0ZWQgdGhlIGRhdGEgaW50byB0d28sIGRlcGVuZGluZyBvbiB0aGUgZGF0ZXMgdGhhdCBmaXNoaW5nIHdhcyBiYW5uZWQgdGhyb3VnaG91dCB0aGUgY291bnRyeSBhbmQgbm90IGJhbm5lZC4gYHlhc2FrX2ZhcmtgIGRlbW9uc3RyYXRlcyB0aGUgbWF4aW11bSBkaWZmZXJlbmNlIGluIGRhaWx5IHByaWNlcyBkdXJpbmcgdGhlIGJhbiBwZXJpb2QuIGBzZXJiZXN0X2ZhcmtgIGRvZXMgdGhlIHNhbWUgYnV0IGR1cmluZyB0aGUgdGltZXMgdGhhdCBmaXNoaW5nIHdhcyBub3QgYmFubmVkLg0KDQpgYGB7cn0NCnlhc2FrX2ZhcmsgPC0gZGZfbm9fb3V0bGllciAlPiUNCiAgZmlsdGVyKFRBUklIID49ICIyMDIxLTA0LTE1IiAmIFRBUklIIDw9ICIyMDIxLTA4LTMxIikgJT4lDQogIGdyb3VwX2J5KE1BTF9BREkpICU+JQ0KICBzdW1tYXJpc2UoRkFSSyA9IG1heChBWkFNSV9VQ1JFVCAtIEFTR0FSSV9VQ1JFVCkpDQpzZXJiZXN0X2ZhcmsgPC0gZGZfbm9fb3V0bGllciAlPiUNCiAgZmlsdGVyKCEoVEFSSUggPj0gIjIwMjEtMDQtMTUiICYgVEFSSUggPD0gIjIwMjEtMDgtMzEiKSkgJT4lDQogIGdyb3VwX2J5KE1BTF9BREkpICU+JQ0KICBzdW1tYXJpc2UoRkFSSyA9IG1heChBWkFNSV9VQ1JFVCAtIEFTR0FSSV9VQ1JFVCkpDQpgYGANCg0KPGJyPg0KDQojIyMgKio2LSkgVmlzdWFsaXphdGlvbiBvZiB0aGUgRGlmZmVyZW5jZXMgYmV0d2VlbiAyIFBlcmlvZHMqKg0KDQo8YnI+DQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBJbiB0aGUgY29kZSBiZWxvdyBJIGpvaW5lZCB0d28gZGF0YSBmcmFtZXMgaW4gb3JkZXIgdG8gZ2V0IHRoZSBjb21wYXJlIHRoZSBkaWZmZXJlbmNlcyBpbiBkaWZmZXJlbnQgcGVyaW9kcy4NCg0KYGBge3J9DQpmYXJrbGFyIDwtIHNlcmJlc3RfZmFyayAlPiUNCiAgaW5uZXJfam9pbih5YXNha19mYXJrLCBieSA9ICJNQUxfQURJIiwgc3VmZml4ID0gYygiX1NFUkJFU1QiLCAiX1lBU0FLIikpICU+JQ0KICBtdXRhdGUoRE9ORU1fRkFSSyA9IEZBUktfU0VSQkVTVCAtIEZBUktfWUFTQUspICU+JQ0KICBhcnJhbmdlKGRlc2MoRE9ORU1fRkFSSykpDQpgYGANCg0KPGJyPg0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgSnVzdCBmb3IgdGhlIGhhcmR3YXJlJ3Mgc2FrZSwgSSBvbmx5IHRvb2sgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSBoZWFkIGFuZCB0aGUgdGFpbCBvZiB0aGUgZGF0YSBmcmFtZS4NCg0KYGBge3J9DQpmaXJzdF9uX2xhc3QgPC0gYmluZF9yb3dzKGhlYWQoZmFya2xhciksIHRhaWwoZmFya2xhcikpICU+JQ0KICBtdXRhdGUoTUFMX0FESSA9IGZjdF9yZW9yZGVyKE1BTF9BREksIERPTkVNX0ZBUkspKQ0KYGBgDQoNCjxicj4NCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRoaXMgY29kZSBiZWxvdyBpcyB1c2VkIHRvIGNyZWF0ZSBhIGhvcml6b250YWwgYmFycGxvdC4NCg0KYGBge3J9DQpnZ3Bsb3QoZmlyc3Rfbl9sYXN0LCBhZXMoeCA9IE1BTF9BREksIHkgPSBET05FTV9GQVJLLCBmaWxsID0gTUFMX0FESSkpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWw9RE9ORU1fRkFSSyksIHNpemUgPSAzKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGdndGl0bGUoIkNoYW5nZSBpbiB0aGUgcHJpY2UgZGlmZmVyZW5jZXMiKSArDQogIHhsYWIoIkZpc2ggTmFtZSIpICsgeWxhYigiRGlmZmVyZW5jZShUTCkiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQXMgc2VlbiBhYm92ZSBhZnRlciBlbGltaW5hdGluZyB0aGUgb3V0bGllcnMgd2hpY2ggcHJvYmFibHkgd2VyZSBhIHJlc3VsdCBvZiBtYW5pcHVsYXRpb24gb2YgdGhlIGZpc2ggbWFya2V0IG9yIHRlbXBvcmFyeSBvY2Nhc2lvbnMsIHdlIGNhbiBjbGVhcmx5IHNlZSB0aGUgY2hhbmdlIGluIHRoZSBwcmljZXMgb2YgdGhlIHNhbWUgZmlzaC4NCg0KPGJyPg0KPGJyPg0KPGJyPg0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7X19fVGhhbmtzIGZvciByZWFkaW5nLi4uX19fDQo=