This is an R Markdown Notebook with some plots and analysis of Bishop, California Police Department Flock Data. This format is intended to allow others to reproduce and modify. It walks through all the steps. Code and plots are included.

Obviously, R is required.

First, load some prerequisite libraries.

Data import

Now import data files. This uses the public record request data obtained by Robert on June 2 2026. These records cover 2025-03-21 through 2026-05-13. For this code to run, it is assumed that they are unzipped to the same directory as this file.

The data is in csv format, and there are 3 kinds of files:

The Audit and Network Audit files will be read in together and combined into a single dataframe. Bishop PD and external organizations are distinguished by the Org Name field. This will produce the flock_audit dataframe. Dates and names are cleaned for easier processing.

The Shared Networks file is read into a separate dataframe. There are external networks represented in the Network Audit files that are not in this file, so that information is joined into this dataframe, called shared_networks.

# Read/combine audit files
list.files(path = "./Flock Audit FOIA data-20260602T021221Z-3-001/Flock Audit FOIA data/", 
           pattern = "\\-Audit.csv",
           full.names = TRUE) |> 
  map_df(~read_csv(., col_types = cols(.default = "c"))) ->
  flock_audit

# Data Cleaning
flock_audit |> 
  mutate(Reason = stringr::str_to_title(Reason)) |> 
  mutate(Name = stringr::str_to_title(Name)) |> 
  mutate(dt = str_remove(`Search Time`, " UTC")) |>
  mutate(dt = parse_date_time(dt, "%m/%d/%Y, %I:%M:%S %p", tz = "UTC")) |> 
  mutate(Date = as_date(dt)) ->
  flock_audit

# Read network files
list.files(path = "./Flock Audit FOIA data-20260602T021221Z-3-001/Flock Audit FOIA data/",
           pattern = "\\SharedNetworks.*csv",
           full.names = TRUE) |> 
  map_df(~read_csv(., col_types = cols(.default = "c"))) ->
  shared_networks

# Combine network info from audit and network files
flock_audit |> 
  group_by(`Org Name`) |> 
  summarize(n = n()) |> 
  full_join(shared_networks, by = c("Org Name" = "Organization Name")) ->
  shared_networks

Flock Audit Example data:

Shared Networks Example data:

Shared Network Stats:

Let’s take a look at which agencies are requesting data. Here are the top 20:

ggplot(flock_audit, 
       aes(y=fct_rev(fct_lump_n(fct_infreq(`Org Name`), 20)))) +
  geom_bar() + 
  ylab("Organization") +
  xlab("Search Requests") + 
  ggtitle("Top Requesting Agencies for Bishop Flock Cameras")

Where does Bishop PD sit on this list? The 226th most frequent user.

What are the top Reasons given for the searches? Note that this is messy, because the Reason field is not standardized. One interesting thing to note is the prevalance of very generic, uninformative reasons like “Investigation”.

It is interesting to note that the use of some of the very generic reasons like “Investigation” or “Inv” sharply dropped off in 2026. Was there an change in policy?

If we look at only Bishop PD searches, we can manually collapse this messy Reason field and get a better sense of the types of Reasons these cameras are used. Note that Bishop PD’s use differs from that of external organizations.

Looking at search type:

There are a few instances of “freeform” searches. These have text prompts.

LS0tDQp0aXRsZTogIkJpc2hvcCBGbG9jayBBdWRpdCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KZWNobzogVFJVRQ0KLS0tDQoNClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rIHdpdGggc29tZSBwbG90cyBhbmQgDQphbmFseXNpcyBvZiBCaXNob3AsIENhbGlmb3JuaWEgUG9saWNlIERlcGFydG1lbnQgRmxvY2sgRGF0YS4gVGhpcyBmb3JtYXQgaXMgaW50ZW5kZWQNCnRvIGFsbG93IG90aGVycyB0byByZXByb2R1Y2UgYW5kIG1vZGlmeS4gSXQgd2Fsa3MgdGhyb3VnaCBhbGwgdGhlIHN0ZXBzLiBDb2RlIGFuZCANCnBsb3RzIGFyZSBpbmNsdWRlZC4gDQoNCk9idmlvdXNseSwgUiBpcyByZXF1aXJlZC4NCg0KRmlyc3QsIGxvYWQgc29tZSBwcmVyZXF1aXNpdGUgbGlicmFyaWVzLg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgUmVxdWlyZWQgbGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZm9yY2F0cykNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzY2FsZXMpDQpgYGANCg0KDQojIyMgRGF0YSBpbXBvcnQNCg0KTm93IGltcG9ydCBkYXRhIGZpbGVzLiBUaGlzIHVzZXMgdGhlIHB1YmxpYyByZWNvcmQgcmVxdWVzdCBkYXRhIG9idGFpbmVkIGJ5IFJvYmVydCBvbiBKdW5lIDIgMjAyNi4NClRoZXNlIHJlY29yZHMgY292ZXIgMjAyNS0wMy0yMSB0aHJvdWdoIDIwMjYtMDUtMTMuIEZvciB0aGlzIGNvZGUgdG8gcnVuLCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhleSBhcmUgdW56aXBwZWQgdG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgZmlsZS4gDQoNClRoZSBkYXRhIGlzIGluIGNzdiBmb3JtYXQsIGFuZCB0aGVyZSBhcmUgMyBraW5kcyBvZiBmaWxlczogICANCg0KLSAqU2hhcmVkIE5ldHdvcmtzKiBmaWxlOiBUaGlzIGNvbnRhaW5zIGluZm8gb24gdGhlIG9yZ2FuaXphdGlvbnMgdGhhdCBCaXNob3AgUEQgaGFzIGRhdGEgc2hhcmluZyBhZ3JlZW1lbnRzIHdpdGguDQotICpBdWRpdCogZmlsZXM6IFRoZXNlIGNvbnRhaW4gcmVjb3JkcyBvZiBzZWFyY2hlcyBwZXJmb3JtZWQgYnkgQmlzaG9wIFBELiANCi0gKk5ldHdvcmsgQXVkaXQqIGZpbGVzOiBUaGVzZSBjb250YWluIHJlY29yZHMgb2Ygc2VhcmNoZXMgcGVyZm9ybWVkIGJ5IG90aGVyIG9yZ2FuaXphdGlvbnMgdGhhdCBpbmNsdWRlZCBCaXNob3AncyBGbG9jayBjYW1lcmFzLiANCg0KVGhlICpBdWRpdCogYW5kICpOZXR3b3JrIEF1ZGl0KiBmaWxlcyB3aWxsIGJlIHJlYWQgaW4gdG9nZXRoZXIgYW5kIGNvbWJpbmVkIGludG8gDQphIHNpbmdsZSBkYXRhZnJhbWUuIEJpc2hvcCBQRCBhbmQgZXh0ZXJuYWwgb3JnYW5pemF0aW9ucyBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgDQoqT3JnIE5hbWUqIGZpZWxkLiBUaGlzIHdpbGwgcHJvZHVjZSB0aGUgKmZsb2NrX2F1ZGl0KiBkYXRhZnJhbWUuIERhdGVzDQphbmQgbmFtZXMgYXJlIGNsZWFuZWQgZm9yIGVhc2llciBwcm9jZXNzaW5nLg0KDQpUaGUgKlNoYXJlZCBOZXR3b3JrcyogZmlsZSBpcyByZWFkIGludG8gYSBzZXBhcmF0ZSBkYXRhZnJhbWUuIFRoZXJlIGFyZSBleHRlcm5hbA0KbmV0d29ya3MgcmVwcmVzZW50ZWQgaW4gdGhlICpOZXR3b3JrIEF1ZGl0KiBmaWxlcyB0aGF0IGFyZSBub3QgaW4gdGhpcyBmaWxlLCBzbyANCnRoYXQgaW5mb3JtYXRpb24gaXMgam9pbmVkIGludG8gdGhpcyBkYXRhZnJhbWUsIGNhbGxlZCAqc2hhcmVkX25ldHdvcmtzKi4NCg0KDQpgYGB7cn0NCiMgUmVhZC9jb21iaW5lIGF1ZGl0IGZpbGVzDQpsaXN0LmZpbGVzKHBhdGggPSAiLi9GbG9jayBBdWRpdCBGT0lBIGRhdGEtMjAyNjA2MDJUMDIxMjIxWi0zLTAwMS9GbG9jayBBdWRpdCBGT0lBIGRhdGEvIiwgDQogICAgICAgICAgIHBhdHRlcm4gPSAiXFwtQXVkaXQuY3N2IiwNCiAgICAgICAgICAgZnVsbC5uYW1lcyA9IFRSVUUpIHw+IA0KICBtYXBfZGYofnJlYWRfY3N2KC4sIGNvbF90eXBlcyA9IGNvbHMoLmRlZmF1bHQgPSAiYyIpKSkgLT4NCiAgZmxvY2tfYXVkaXQNCg0KIyBEYXRhIENsZWFuaW5nDQpmbG9ja19hdWRpdCB8PiANCiAgbXV0YXRlKFJlYXNvbiA9IHN0cmluZ3I6OnN0cl90b190aXRsZShSZWFzb24pKSB8PiANCiAgbXV0YXRlKE5hbWUgPSBzdHJpbmdyOjpzdHJfdG9fdGl0bGUoTmFtZSkpIHw+IA0KICBtdXRhdGUoZHQgPSBzdHJfcmVtb3ZlKGBTZWFyY2ggVGltZWAsICIgVVRDIikpIHw+DQogIG11dGF0ZShkdCA9IHBhcnNlX2RhdGVfdGltZShkdCwgIiVtLyVkLyVZLCAlSTolTTolUyAlcCIsIHR6ID0gIlVUQyIpKSB8PiANCiAgbXV0YXRlKERhdGUgPSBhc19kYXRlKGR0KSkgLT4NCiAgZmxvY2tfYXVkaXQNCg0KIyBSZWFkIG5ldHdvcmsgZmlsZXMNCmxpc3QuZmlsZXMocGF0aCA9ICIuL0Zsb2NrIEF1ZGl0IEZPSUEgZGF0YS0yMDI2MDYwMlQwMjEyMjFaLTMtMDAxL0Zsb2NrIEF1ZGl0IEZPSUEgZGF0YS8iLA0KICAgICAgICAgICBwYXR0ZXJuID0gIlxcU2hhcmVkTmV0d29ya3MuKmNzdiIsDQogICAgICAgICAgIGZ1bGwubmFtZXMgPSBUUlVFKSB8PiANCiAgbWFwX2RmKH5yZWFkX2NzdiguLCBjb2xfdHlwZXMgPSBjb2xzKC5kZWZhdWx0ID0gImMiKSkpIHw+IA0KICBtdXRhdGUoYE9yZyBOYW1lYCA9IGBPcmdhbml6YXRpb24gTmFtZWApLT4NCiAgc2hhcmVkX25ldHdvcmtzDQoNCiMgQ29tYmluZSBuZXR3b3JrIGluZm8gZnJvbSBhdWRpdCBhbmQgbmV0d29yayBmaWxlcw0KZmxvY2tfYXVkaXQgfD4gDQogIGdyb3VwX2J5KGBPcmcgTmFtZWApIHw+IA0KICBzdW1tYXJpemUobiA9IG4oKSkgfD4gDQogIGZ1bGxfam9pbihzaGFyZWRfbmV0d29ya3MsIGJ5ID0gYygiT3JnIE5hbWUiKSkgLT4NCiAgc2hhcmVkX25ldHdvcmtzDQoNCmBgYA0KDQoNCiMjIyBGbG9jayBBdWRpdCBFeGFtcGxlIGRhdGE6IA0KYGBge3J9DQojIFByZXZpZXcgZmxvY2sgYXVkaXQgZGF0YToNCmZsb2NrX2F1ZGl0IHw+IHNsaWNlX3NhbXBsZShuID0xMCkNCmBgYA0KDQojIyMgU2hhcmVkIE5ldHdvcmtzIEV4YW1wbGUgZGF0YToNCmBgYHtyfQ0Kc2hhcmVkX25ldHdvcmtzIHw+IHNsaWNlX3NhbXBsZShuID0gMTApDQpgYGANCg0KYGBge3J9DQoNCiAgDQoNCmBgYA0KDQoNCg0KDQojIyMgU2hhcmVkIE5ldHdvcmsgU3RhdHM6DQoNCkxldCdzIHRha2UgYSBsb29rIGF0IHdoaWNoIGFnZW5jaWVzIGFyZSByZXF1ZXN0aW5nIGRhdGEuIEhlcmUgYXJlIHRoZSB0b3AgMjA6DQoNCmBgYHtyfQ0KZ2dwbG90KGZsb2NrX2F1ZGl0LCANCiAgICAgICBhZXMoeT1mY3RfcmV2KGZjdF9sdW1wX24oZmN0X2luZnJlcShgT3JnIE5hbWVgKSwgMjApKSkpICsNCiAgZ2VvbV9iYXIoKSArIA0KICB5bGFiKCJPcmdhbml6YXRpb24iKSArDQogIHhsYWIoIlNlYXJjaCBSZXF1ZXN0cyIpICsgDQogIGdndGl0bGUoIlRvcCBSZXF1ZXN0aW5nIEFnZW5jaWVzIGZvciBCaXNob3AgRmxvY2sgQ2FtZXJhcyIpDQpgYGANCldoZXJlIGRvZXMgQmlzaG9wIFBEIHNpdCBvbiB0aGlzIGxpc3Q/IFRoZSAyMjZ0aCBtb3N0IGZyZXF1ZW50IHVzZXIuIA0KDQpgYGB7cn0NCnNoYXJlZF9uZXR3b3JrcyB8Pg0KICBhcnJhbmdlKGRlc2MobikpIHw+DQogIG11dGF0ZShyYW5rID0gcm93X251bWJlcigpKSB8PiANCiAgc2VsZWN0KHJhbmssIGV2ZXJ5dGhpbmcoKSkgfD4gDQogIHNsaWNlKDIyMDoyMzApIA0KYGBgDQpXaGF0IGFyZSB0aGUgdG9wIFJlYXNvbnMgZ2l2ZW4gZm9yIHRoZSBzZWFyY2hlcz8gTm90ZSB0aGF0IHRoaXMgaXMgbWVzc3ksIGJlY2F1c2UNCnRoZSAqUmVhc29uKiBmaWVsZCBpcyBub3Qgc3RhbmRhcmRpemVkLiBPbmUgaW50ZXJlc3RpbmcgdGhpbmcgdG8gbm90ZSBpcyB0aGUgDQpwcmV2YWxhbmNlIG9mIHZlcnkgZ2VuZXJpYywgdW5pbmZvcm1hdGl2ZSByZWFzb25zIGxpa2UgIkludmVzdGlnYXRpb24iLg0KDQpgYGB7cn0NCmZsb2NrX2F1ZGl0IHw+IA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX2JhcihhZXMoeSA9IGZjdF9yZXYoZmN0X2x1bXBfbihmY3RfaW5mcmVxKFJlYXNvbiksIDIwKSkpKSArDQogIHlsYWIoIlJlcXVlc3QgUmVhc29uIikgKw0KICB4bGFiKCJTZWFyY2ggUmVxdWVzdHMiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMjAwMDAwKSwgb29iID0gc2NhbGVzOjpvb2Jfa2VlcCkgKw0KICBnZ3RpdGxlKCJUb3AgMjAgU2VhcmNoIFJlYXNvbnMgZm9yIEJpc2hvcCBGbG9jayBDYW1lcmFzIikgDQoNCmBgYA0KSXQgaXMgaW50ZXJlc3RpbmcgdG8gbm90ZSB0aGF0IHRoZSB1c2Ugb2Ygc29tZSBvZiB0aGUgdmVyeSBnZW5lcmljIHJlYXNvbnMgbGlrZSAiSW52ZXN0aWdhdGlvbiIgb3IgIkludiIgc2hhcnBseSBkcm9wcGVkIG9mZiBpbiAyMDI2LiBXYXMgdGhlcmUgYW4gY2hhbmdlIGluIHBvbGljeT8NCg0KYGBge3J9DQpmbG9ja19hdWRpdCB8PiANCiAgbXV0YXRlKFJlYXNvbiA9IGZjdF9jb2xsYXBzZShSZWFzb24sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmVzdGlnYXRpb24gPSBjKCJJbnZlc3RpZ2F0aW9uIiwgIkludiIsICJJbnZlc3QiLCAiT3RoZXIgLSBJbnZlc3RpZ2F0aW9uIiksDQogICkpIHw+IA0KICBtdXRhdGUoR2VuZXJpYyA9IHN0cl9lcXVhbChSZWFzb24sICJJbnZlc3RpZ2F0aW9uIikpIHw+IA0KICAjc2xpY2Vfc2FtcGxlKG4gPSAxMDAwMCkgfD4gDQogIGdncGxvdChhZXMoeCA9IERhdGUsIGFmdGVyX3N0YXQoY291bnQpLCBmaWxsID0gR2VuZXJpYykpICsNCiAgZ2VvbV9kZW5zaXR5KHBvc2l0aW9uID0gInN0YWNrIikgKw0KICBnZ3RpdGxlKCJHZW5lcmljIEludmVzdGlnYXRpb24gU2VhcmNoZXMiKQ0KYGBgDQoNCklmIHdlIGxvb2sgYXQgb25seSBCaXNob3AgUEQgc2VhcmNoZXMsIHdlIGNhbiBtYW51YWxseSBjb2xsYXBzZSB0aGlzIG1lc3N5ICpSZWFzb24qDQpmaWVsZCBhbmQgZ2V0IGEgYmV0dGVyIHNlbnNlIG9mIHRoZSB0eXBlcyBvZiBSZWFzb25zIHRoZXNlIGNhbWVyYXMgYXJlIHVzZWQuIE5vdGUgDQp0aGF0IEJpc2hvcCBQRCdzIHVzZSBkaWZmZXJzIGZyb20gdGhhdCBvZiBleHRlcm5hbCBvcmdhbml6YXRpb25zLg0KDQpgYGB7cn0NCmZsb2NrX2F1ZGl0IHw+IA0KICBtdXRhdGUoRGF0ZSA9IGFzX2RhdGUoZHQpKSB8Pg0KICBmaWx0ZXIoYE9yZyBOYW1lYCA9PSAiQmlzaG9wIENBIFBEIikgfD4gDQogIG11dGF0ZShgUmVhc29uIFR5cGVgID0gZmN0X2NvbGxhcHNlKFJlYXNvbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBWZWhpY2xlIFRoZWZ0YCA9IGMoc3RyX3N1YnNldChSZWFzb24sICJWZWhpY2xlIFRoZWZ0IiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3N1YnNldChSZWFzb24sICJTdG9sZW4gVmVoaWNsZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9zdWJzZXQoUmVhc29uLCAiMTA4NTEiKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBIaXQgYW5kIFJ1bmAgPSBjKHN0cl9zdWJzZXQoUmVhc29uLCAiSGl0IikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQXNzYXVsdGAgPSBjKHN0cl9zdWJzZXQoUmVhc29uLCAiQXNzYXVsdCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9zdWJzZXQoUmVhc29uLCAiQmF0dGVyeSIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFdhbnRlZCBQZXJzb25gID0gYyhzdHJfc3Vic2V0KFJlYXNvbiwgIldhbnRlZCBQZXJzb24iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfc3Vic2V0KFJlYXNvbiwgIldhcnJhbnQiKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXZWxmYXJlIENoZWNrYCA9IGMoc3RyX3N1YnNldChSZWFzb24sICJXZWxmYXJlIikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcnVncyA9IGMoc3RyX3N1YnNldChSZWFzb24sICJEcnVnIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfc3Vic2V0KFJlYXNvbiwgIk5hcmNvIikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVmdCA9IGMoIlRoZWZ0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9zdWJzZXQoUmVhc29uLCAiQnVyZ2xhciIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3N1YnNldChSZWFzb24sICJTdG9sZW4gUHJvcCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0b2xlbiIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVUkgPSBjKHN0cl9zdWJzZXQoUmVhc29uLCAiSW5mbHVlbmNlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3N1YnNldChSZWFzb24sICJEdWkiKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBNaXNzaW5nL0VuZGFuZ2VyZWQvUnVuYXdheWAgPSBjKHN0cl9zdWJzZXQoUmVhc29uLCAiTWlzc2luZyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfc3Vic2V0KFJlYXNvbiwgIktpZG5hcCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfc3Vic2V0KFJlYXNvbiwgIlJ1bmF3YXkiKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RzID0gYyhzdHJfc3Vic2V0KFJlYXNvbiwgIlRlc3QiKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBIICYgU2AgPSBjKHN0cl9zdWJzZXQoUmVhc29uLCAiSHMgSW52IiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9zdWJzZXQoUmVhc29uLCAiSCZTIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9zdWJzZXQoUmVhc29uLCAiSGVhbHRoIikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgSW52ZXN0aWdhdGlvbmAgPSBjKCJJbnZlc3RpZ2F0aW9ucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmVzdGlnYXRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcmltaW5hbCBJbnYiKQ0KICApKSB8Pg0KICBtdXRhdGUoYFJlYXNvbiBUeXBlYCA9IGZjdF9yZXYoZmN0X2x1bXBfbWluKGZjdF9pbmZyZXEoYFJlYXNvbiBUeXBlYCksIDYpKSkgfD4gDQogIGdncGxvdChhZXMoeSA9IGBSZWFzb24gVHlwZWApKSArDQogIGdlb21fYmFyKCkgKyANCiAgZ2d0aXRsZSgiQlBEIFNlYXJjaGVzIFJlYXNvbiBDYXRlZ29yaWVzIikNCmBgYA0KTG9va2luZyBhdCBzZWFyY2ggdHlwZToNCmBgYHtyfQ0KZmxvY2tfYXVkaXQgfD4gDQogIG11dGF0ZShgU2VhcmNoIFR5cGVgID0gZmN0X2NvbGxhcHNlKGBTZWFyY2ggVHlwZWAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb2t1cCA9IGMoImxvb2t1cCIsICJsb29rdXAgLSBNb2JpbGUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggPSBjKCJzZWFyY2giLCAic2VhcmNoIC0gTW9iaWxlIiwgInNlYXJjaFN1bW1hcnkgLSBNb2JpbGUiKQ0KICApKSB8PiANCiAgbXV0YXRlKGBTZWFyY2ggVHlwZWAgPSBmY3RfaW5mcmVxKGBTZWFyY2ggVHlwZWApKSB8PiANCiAgbXV0YXRlKERhdGUgPSBhc19kYXRlKGR0KSkgfD4gDQogIGdncGxvdChhZXMoeSA9IGBTZWFyY2ggVHlwZWApKSArDQogIGdlb21fYmFyKCkgKyANCiAgZ2d0aXRsZSgiU2VhcmNoIFR5cGUgRnJlcXVlbmNpZXMiKSArDQogIHNjYWxlX3hfbG9nMTAoKSArDQogIHhsYWIoIlNlYXJjaCBDb3VudHMgKGxvZykiKQ0KYGBgDQpUaGVyZSBhcmUgYSBmZXcgaW5zdGFuY2VzIG9mICJmcmVlZm9ybSIgc2VhcmNoZXMuIFRoZXNlIGhhdmUgdGV4dCBwcm9tcHRzLiANCg0KYGBge3J9DQpmbG9ja19hdWRpdCB8PiBmaWx0ZXIoYFNlYXJjaCBUeXBlYCA9PSAiZnJlZWZvcm0iKSB8PiBzZWxlY3QoYFRleHQgUHJvbXB0YCxgT3JnIE5hbWVgLCAgZXZlcnl0aGluZygpKQ0KYGBgDQo=