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:
- Shared Networks file: This contains info on the
organizations that Bishop PD has data sharing agreements with.
- Audit files: These contain records of searches performed by
Bishop PD.
- Network Audit files: These contain records of searches
performed by other organizations that included Bishop’s Flock
cameras.
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=