Global Analyses
Global Land Area
pasture_area$item <- as.factor(pasture_area$item)
pasture_area %>%
dplyr::group_by(item, year) %>%
dplyr::summarize(global_area=sum(area)) %>%
ggplot() +
geom_line(aes(x = year, y = global_area, group=item, color=item))

As you can see, the data for the other land areas is not as complete as for pasture and agricultural land. Plus, the other land uses are relatively negligible compared to these.
pasture_area %>%
dplyr:: filter(item == "Land under perm. meadows and pastures") %>%
group_by(year) %>%
dplyr::summarize(global_area=sum(area)) %>%
ggplot() +
geom_line(aes(x = year, y = global_area)) +
labs(title = "Global Permanent Pasture and Meadow Area", y = "Area (thousand ha)")

When looking just at land area under permanent pasture and meadows, we get the same results as James had.
Global Ruminant Meat and Milk Production
meat_production %>%
group_by(year, item) %>%
dplyr::summarize(all_meat = sum(m_prod, na.rm = T)) %>%
ggplot() +
geom_line(aes(x = year, y = all_meat, color=item)) +
scale_y_continuous(labels = point) +
labs(title = "Global Meat Production - All Grazing Animals", y = "Production (tonnes)")

You can see that compared to cattle, sheep and goat produce the next most amount of meat. However, it is much less than cattle produce.
milk_production %>%
group_by(year, item) %>%
dplyr::summarize(all = sum(d_prod, na.rm = T)) %>%
ggplot() +
geom_line(aes(x = year, y = all, color=item)) +
scale_y_continuous(labels = point) +
labs(title = "Global Milk Production - All Grazing Animals", y = "Production (tonnes)")

In contrast to meat, buffalo produce the second most milk compared to cattle. Nevertheless, they too produce a fraction of what cattle do, ~1/7 in 2016.
meat_production %>%
group_by(year) %>%
dplyr::summarize(all = sum(m_prod, na.rm = T)) %>%
ggplot() +
geom_line(aes(x = year, y = all)) +
scale_y_continuous(labels = point) +
labs(title = "Total Global Meat Production", y = "Production (tonnes)")

There has been a slight leveling off in combined meat production from all animals, similar to previous leveling off in the early 1970s and early 1980s.
milk_production %>%
group_by(year) %>%
dplyr::summarize(all = sum(d_prod, na.rm = T)) %>%
ggplot() +
geom_line(aes(x = year, y = all)) +
scale_y_continuous(labels = point) +
labs(title = "Total Global Milk Production", y = "Production (tonnes)")

Combined global milk production form all animals has seen a similar, but slightly more dramatic leveling off.
Consumption
consumption_global %>%
filter(item !="Cheese") %>%
group_by(year, item) %>%
dplyr::summarize(all = sum(cons_pc_kg, na.rm = T)) %>%
ggplot() +
geom_line(aes(x = year, y = all, color = item)) +
scale_y_continuous(labels = point) +
labs(title = "Meat and Milk Consumption per Capita", y = "Consumption in kg/capita/yr")

consumption_global %>%
filter(item !="Cheese") %>%
group_by(year, item) %>%
dplyr::summarize(all = sum(cons_pc_cal, na.rm = T)) %>%
ggplot() +
geom_line(aes(x = year, y = all, color = item)) +
scale_y_continuous(labels = point) +
labs(title = "Meat and Milk Consumption per Capita", y = "Consumption in kcal/capita/day")

consumption_global %>%
filter(item !="Cheese") %>%
group_by(year, item) %>%
dplyr::summarize(all = sum(protein_pc, na.rm = T)) %>%
ggplot() +
geom_line(aes(x = year, y = all, color = item)) +
scale_y_continuous(labels = point) +
labs(title = "Meat and Milk Consumption per Capita", y = "Consumption in protein/capita/day")

Consumption per capita is greatest for milk whether measured in calories, grams protein, or weight. Milk consumption per capita has increased more than that for any ruminant meats. However, as James’ graphs showed, pork and poultry consumption has dramatically increased over time. There are only total consumption values in tonnes for cheese since the calorie, protein and fat content varies so widely and apparently FAO does not calculate this. I have omitted it from the graphs.
backup_cons <- consumption_global
consumption_global$cons_pc_cal_norm <- with(consumption_global, ave(cons_pc_cal, item, FUN = function(x) x/x[1])) #create column for change compared to 1st observation
consumption_global %>%
filter(item !="Cheese") %>%
group_by(year, item) %>%
dplyr::summarize(all = sum(cons_pc_cal_norm, na.rm = T)) %>%
ggplot() +
geom_line(aes(x = year, y = all, color = item)) +
scale_y_continuous(labels = point) +
labs(title = "Meat and Milk Consumption", y = "Consumption per capita in kcal relative to first year")

The steep rise in poultry and pork is more apparent when you look at change in consumption (in kcal/capita) relative to the first year in the data. You can also see there is some artefact in the cream data — but this is of no concern to use since the absolute level of consumption and production is insignificant compared to milk and meat.
Yields - Figure 4
meat_yields_global %>%
ggplot() +
geom_line(aes(x = year, y = yield, color=item)) +
scale_y_continuous(labels = point) +
labs(title = "Global Meat Yields for Top Grazing Animals", y = "Hectograms/Animal")

meat_yields_global$yield_norm <- with(meat_yields_global, ave(yield, item, FUN = function(x) x/x[1])) #create column for change compared to 1st observation
viz <- meat_yields_global %>%
ggplot() +
geom_line(aes(x = year, y = yield_norm, color=item)) +
scale_y_continuous(labels = point) +
labs(title = "Global Meat Yields for Top Grazing Animals - % Change from 1961", y = "Hectograms/Animal Relative to First Year")
ggplotly(viz)
Global meat yields per animal are highest for cattle. Cattle yields have also increased the most compared to other top grazing animals, with yields nearly 34% higher in 2013 than in 1961.
milk_yields_global %>%
ggplot() +
geom_line(aes(x = year, y = yield, color=item)) +
scale_y_continuous(labels = point) +
labs(title = "Global Milk Yields for Top Grazing Animals", y = "Hectograms/Animal")

milk_yields_global$yield_norm <- with(milk_yields_global, ave(yield, item, FUN = function(x) x/x[1])) #create column for change compared to 1st observation
viz <- milk_yields_global %>%
ggplot() +
geom_line(aes(x = year, y = yield_norm, color=item)) +
scale_y_continuous(labels = point) +
labs(title = "Global Milk Yields for Top Grazing Animals - % Change from 1961", y = "Hectograms/Animal Relative to First Year")
ggplotly(viz)
Cattle are also the highest yielding milk producers. Buffalo milk yields have actualy increased substantiallymore than cattle yields, but are still substantially lower. Cattle milk yields in 2016 were 36% higher than in 1961.
LS0tCnRpdGxlOiAiRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyBmb3IgUGFzdHVyZSIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogIkRhbiBSZWp0byIKZGF0ZTogIk5vdi4gNy04IDIwMTgiIAotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFLCBlY2hvPUZBTFNFfQojc2V0IGtuaXRyIGRpc3BsYXkgb3B0aW9ucwprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoPTQwLCBmaWcuaGVpZ2h0PTIwLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFKQpgYGAKCmBgYHtyIFNldHVwfQojbmF2aWdhdGUgdG8gUGVhayBQYXN0dXJlIEZvbGRlciBiZWZvcmUgc3RhcnRpbmcKc2V0d2QoIn4vR29vZ2xlIERyaXZlIEZpbGUgU3RyZWFtL015IERyaXZlL0JUSSBSZXNlYXJjaC9Gb29kICYgRmFybWluZy9QZWFrIFBhc3R1cmUiKQoKI2xvYWQgcGFja2FnZXMgCmxpYnJhcnkoJ3RpZHl2ZXJzZScpCmxpYnJhcnkoJ3NjYWxlcycpCmxpYnJhcnkoJ3Bsb3RseScpCgojc2V0IHJ1bGVzIGZvciBmb3JtYXR0aW5nIGdyYXBocwpwb2ludCA8LSBmb3JtYXRfZm9ybWF0KGJpZy5tYXJrID0gIiwiLCBkZWNpbWFsLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkKCgpgYGAKCiNHbG9iYWwgQW5hbHlzZXMKCiMjIyBHbG9iYWwgTGFuZCBBcmVhCmBgYHtyIExhbmQgVW5kZXIgUGVybSBQYXN0dXJlIGFuZCBPdGhlciBQYXN0dXJlfQpwYXN0dXJlX2FyZWEkaXRlbSA8LSBhcy5mYWN0b3IocGFzdHVyZV9hcmVhJGl0ZW0pCgpwYXN0dXJlX2FyZWEgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGl0ZW0sIHllYXIpICU+JQogIGRwbHlyOjpzdW1tYXJpemUoZ2xvYmFsX2FyZWE9c3VtKGFyZWEpKSAlPiUKICBnZ3Bsb3QoKSArCiAgICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gZ2xvYmFsX2FyZWEsIGdyb3VwPWl0ZW0sIGNvbG9yPWl0ZW0pKSAKYGBgCkFzIHlvdSBjYW4gc2VlLCB0aGUgZGF0YSBmb3IgdGhlIG90aGVyIGxhbmQgYXJlYXMgaXMgbm90IGFzIGNvbXBsZXRlIGFzIGZvciBwYXN0dXJlIGFuZCBhZ3JpY3VsdHVyYWwgbGFuZC4gUGx1cywgdGhlIG90aGVyIGxhbmQgdXNlcyBhcmUgcmVsYXRpdmVseSAgbmVnbGlnaWJsZSBjb21wYXJlZCB0byB0aGVzZS4KCgpgYGB7ciBGaWd1cmUgMSAtIFBlcm1hbmVudCBQYXN0dXJlfQpwYXN0dXJlX2FyZWEgJT4lCiAgZHBseXI6OiBmaWx0ZXIoaXRlbSA9PSAiTGFuZCB1bmRlciBwZXJtLiBtZWFkb3dzIGFuZCBwYXN0dXJlcyIpICU+JQogIGdyb3VwX2J5KHllYXIpICU+JQogIGRwbHlyOjpzdW1tYXJpemUoZ2xvYmFsX2FyZWE9c3VtKGFyZWEpKSAlPiUKICBnZ3Bsb3QoKSArCiAgICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gZ2xvYmFsX2FyZWEpKSArCiAgbGFicyh0aXRsZSA9ICJHbG9iYWwgUGVybWFuZW50IFBhc3R1cmUgYW5kIE1lYWRvdyBBcmVhIiwgeSA9ICJBcmVhICh0aG91c2FuZCBoYSkiKQpgYGAKV2hlbiBsb29raW5nIGp1c3QgYXQgbGFuZCBhcmVhIHVuZGVyIHBlcm1hbmVudCBwYXN0dXJlIGFuZCBtZWFkb3dzLCB3ZSBnZXQgdGhlIHNhbWUgcmVzdWx0cyBhcyBKYW1lcyBoYWQuIAoKIyMjIEdsb2JhbCBSdW1pbmFudCBNZWF0IGFuZCBNaWxrIFByb2R1Y3Rpb24KYGBge3IgR2xvYmFsIE1lYXQgUHJvZHVjdGlvbiBieSBBbmltYWx9Cm1lYXRfcHJvZHVjdGlvbiAlPiUKICBncm91cF9ieSh5ZWFyLCBpdGVtKSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKGFsbCA9IHN1bShtX3Byb2QsIG5hLnJtID0gVCkpICU+JQogIGdncGxvdCgpICsKICAgIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBhbGwsIGNvbG9yPWl0ZW0pKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcG9pbnQpICsKICAgIGxhYnModGl0bGUgPSAiR2xvYmFsIE1lYXQgUHJvZHVjdGlvbiAtIEFsbCBHcmF6aW5nIEFuaW1hbHMiLCB5ID0gIlByb2R1Y3Rpb24gKHRvbm5lcykiKQpgYGAKWW91IGNhbiBzZWUgdGhhdCBjb21wYXJlZCB0byBjYXR0bGUsIHNoZWVwIGFuZCBnb2F0IHByb2R1Y2UgdGhlIG5leHQgbW9zdCBhbW91bnQgb2YgbWVhdC4gSG93ZXZlciwgaXQgaXMgbXVjaCBsZXNzIHRoYW4gY2F0dGxlIHByb2R1Y2UuCgpgYGB7ciBHbG9iYWwgTWlsayBQcm9kdWN0aW9uIGJ5IEFuaW1hbH0KbWlsa19wcm9kdWN0aW9uICU+JQogIGdyb3VwX2J5KHllYXIsIGl0ZW0pICU+JQogIGRwbHlyOjpzdW1tYXJpemUoYWxsID0gc3VtKGRfcHJvZCwgbmEucm0gPSBUKSkgJT4lCiAgZ2dwbG90KCkgKwogICAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IGFsbCwgY29sb3I9aXRlbSkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwb2ludCkgKwogICAgbGFicyh0aXRsZSA9ICJHbG9iYWwgTWlsayBQcm9kdWN0aW9uIC0gQWxsIEdyYXppbmcgQW5pbWFscyIsIHkgPSAiUHJvZHVjdGlvbiAodG9ubmVzKSIpCmBgYApJbiBjb250cmFzdCB0byBtZWF0LCBidWZmYWxvIHByb2R1Y2UgdGhlIHNlY29uZCBtb3N0IG1pbGsgY29tcGFyZWQgdG8gY2F0dGxlLiBOZXZlcnRoZWxlc3MsIHRoZXkgdG9vIHByb2R1Y2UgYSBmcmFjdGlvbiBvZiB3aGF0IGNhdHRsZSBkbywgfjEvNyBpbiAyMDE2LgoKCmBgYHtyIEZpZy4gMmEgQ29tYmluZWQgTWVhdCBQcm9kdWN0aW9ufQptZWF0X3Byb2R1Y3Rpb24gJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgZHBseXI6OnN1bW1hcml6ZShhbGwgPSBzdW0obV9wcm9kLCBuYS5ybSA9IFQpKSAlPiUKICBnZ3Bsb3QoKSArCiAgICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gYWxsKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBvaW50KSArCiAgICBsYWJzKHRpdGxlID0gIlRvdGFsIEdsb2JhbCBNZWF0IFByb2R1Y3Rpb24iLCB5ID0gIlByb2R1Y3Rpb24gKHRvbm5lcykiKQpgYGAKVGhlcmUgaGFzIGJlZW4gYSBzbGlnaHQgbGV2ZWxpbmcgb2ZmIGluIGNvbWJpbmVkIG1lYXQgcHJvZHVjdGlvbiBmcm9tIGFsbCBhbmltYWxzLCBzaW1pbGFyIHRvIHByZXZpb3VzIGxldmVsaW5nIG9mZiBpbiB0aGUgZWFybHkgMTk3MHMgYW5kIGVhcmx5IDE5ODBzLgoKYGBge3IgRmlnLiAyYiAtIENvbWJpbmVkIE1pbGsgUHJvZHVjdGlvbn0KbWlsa19wcm9kdWN0aW9uICU+JQogIGdyb3VwX2J5KHllYXIpICU+JQogIGRwbHlyOjpzdW1tYXJpemUoYWxsID0gc3VtKGRfcHJvZCwgbmEucm0gPSBUKSkgJT4lCiAgZ2dwbG90KCkgKwogICAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IGFsbCkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwb2ludCkgKwogICAgbGFicyh0aXRsZSA9ICJUb3RhbCBHbG9iYWwgTWlsayBQcm9kdWN0aW9uIiwgeSA9ICJQcm9kdWN0aW9uICh0b25uZXMpIikKYGBgCkNvbWJpbmVkIGdsb2JhbCBtaWxrIHByb2R1Y3Rpb24gZm9ybSBhbGwgYW5pbWFscyBoYXMgc2VlbiBhIHNpbWlsYXIsIGJ1dCBzbGlnaHRseSBtb3JlIGRyYW1hdGljIGxldmVsaW5nIG9mZi4gCgoKIyMgQ29uc3VtcHRpb24KYGBge3IgRmlnIDMgQ29uc3VtcHRpb24gcGVyIGNhcGl0YX0KY29uc3VtcHRpb25fZ2xvYmFsICU+JQogIGZpbHRlcihpdGVtICE9IkNoZWVzZSIpICU+JQogIGdyb3VwX2J5KHllYXIsIGl0ZW0pICU+JQogIGRwbHlyOjpzdW1tYXJpemUoYWxsID0gc3VtKGNvbnNfcGNfa2csIG5hLnJtID0gVCkpICU+JQogIGdncGxvdCgpICsKICAgIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBhbGwsIGNvbG9yID0gaXRlbSkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwb2ludCkgKwogICAgbGFicyh0aXRsZSA9ICJNZWF0IGFuZCBNaWxrIENvbnN1bXB0aW9uIHBlciBDYXBpdGEiLCB5ID0gIkNvbnN1bXB0aW9uIGluIGtnL2NhcGl0YS95ciIpCgpjb25zdW1wdGlvbl9nbG9iYWwgJT4lCiAgZmlsdGVyKGl0ZW0gIT0iQ2hlZXNlIikgJT4lCiAgZ3JvdXBfYnkoeWVhciwgaXRlbSkgJT4lCiAgZHBseXI6OnN1bW1hcml6ZShhbGwgPSBzdW0oY29uc19wY19jYWwsIG5hLnJtID0gVCkpICU+JQogIGdncGxvdCgpICsKICAgIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBhbGwsIGNvbG9yID0gaXRlbSkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwb2ludCkgKwogICAgbGFicyh0aXRsZSA9ICJNZWF0IGFuZCBNaWxrIENvbnN1bXB0aW9uIHBlciBDYXBpdGEiLCB5ID0gIkNvbnN1bXB0aW9uIGluIGtjYWwvY2FwaXRhL2RheSIpCgpjb25zdW1wdGlvbl9nbG9iYWwgJT4lCiAgZmlsdGVyKGl0ZW0gIT0iQ2hlZXNlIikgJT4lCiAgZ3JvdXBfYnkoeWVhciwgaXRlbSkgJT4lCiAgZHBseXI6OnN1bW1hcml6ZShhbGwgPSBzdW0ocHJvdGVpbl9wYywgbmEucm0gPSBUKSkgJT4lCiAgZ2dwbG90KCkgKwogICAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IGFsbCwgY29sb3IgPSBpdGVtKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBvaW50KSArCiAgICBsYWJzKHRpdGxlID0gIk1lYXQgYW5kIE1pbGsgQ29uc3VtcHRpb24gcGVyIENhcGl0YSIsIHkgPSAiQ29uc3VtcHRpb24gaW4gcHJvdGVpbi9jYXBpdGEvZGF5IikKYGBgCkNvbnN1bXB0aW9uIHBlciBjYXBpdGEgaXMgZ3JlYXRlc3QgZm9yIG1pbGsgd2hldGhlciBtZWFzdXJlZCBpbiBjYWxvcmllcywgZ3JhbXMgcHJvdGVpbiwgb3Igd2VpZ2h0LiBNaWxrIGNvbnN1bXB0aW9uIHBlciBjYXBpdGEgaGFzIGluY3JlYXNlZCBtb3JlIHRoYW4gdGhhdCBmb3IgYW55IHJ1bWluYW50IG1lYXRzLiBIb3dldmVyLCBhcyBKYW1lcycgZ3JhcGhzIHNob3dlZCwgcG9yayBhbmQgcG91bHRyeSBjb25zdW1wdGlvbiBoYXMgZHJhbWF0aWNhbGx5IGluY3JlYXNlZCBvdmVyIHRpbWUuIFRoZXJlIGFyZSBvbmx5IHRvdGFsIGNvbnN1bXB0aW9uIHZhbHVlcyBpbiB0b25uZXMgZm9yIGNoZWVzZSBzaW5jZSB0aGUgY2Fsb3JpZSwgcHJvdGVpbiBhbmQgZmF0IGNvbnRlbnQgdmFyaWVzIHNvIHdpZGVseSBhbmQgYXBwYXJlbnRseSBGQU8gZG9lcyBub3QgY2FsY3VsYXRlIHRoaXMuIEkgaGF2ZSBvbWl0dGVkIGl0IGZyb20gdGhlIGdyYXBocy4gCgoKCgoKYGBge3IgVG90YWwgQ29uc3VtcHRpb24gZGlmZmVyZW5jZSBmcm9tIGZpcnN0IHllYXJ9CmNvbnN1bXB0aW9uX2dsb2JhbCRjb25zX3BjX2NhbF9ub3JtIDwtIHdpdGgoY29uc3VtcHRpb25fZ2xvYmFsLCBhdmUoY29uc19wY19jYWwsIGl0ZW0sIEZVTiA9IGZ1bmN0aW9uKHgpIHgveFsxXSkpICNjcmVhdGUgY29sdW1uIGZvciBjaGFuZ2UgY29tcGFyZWQgdG8gMXN0IG9ic2VydmF0aW9uCgpjb25zdW1wdGlvbl9nbG9iYWwgJT4lCiAgZmlsdGVyKGl0ZW0gIT0iQ2hlZXNlIikgJT4lCiAgZ3JvdXBfYnkoeWVhciwgaXRlbSkgJT4lCiAgZHBseXI6OnN1bW1hcml6ZShhbGwgPSBzdW0oY29uc19wY19jYWxfbm9ybSwgbmEucm0gPSBUKSkgJT4lCiAgZ2dwbG90KCkgKwogICAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IGFsbCwgY29sb3IgPSBpdGVtKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBvaW50KSArCiAgICBsYWJzKHRpdGxlID0gIk1lYXQgYW5kIE1pbGsgQ29uc3VtcHRpb24iLCB5ID0gIkNvbnN1bXB0aW9uIHBlciBjYXBpdGEgaW4ga2NhbCByZWxhdGl2ZSB0byBmaXJzdCB5ZWFyIikKYGBgClRoZSBzdGVlcCByaXNlIGluIHBvdWx0cnkgYW5kIHBvcmsgaXMgbW9yZSBhcHBhcmVudCB3aGVuIHlvdSBsb29rIGF0IGNoYW5nZSBpbiBjb25zdW1wdGlvbiAoaW4ga2NhbC9jYXBpdGEpIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCB5ZWFyIGluIHRoZSBkYXRhLiBZb3UgY2FuIGFsc28gc2VlIHRoZXJlIGlzIHNvbWUgYXJ0ZWZhY3QgaW4gdGhlIGNyZWFtIGRhdGEg4oCUIGJ1dCB0aGlzIGlzIG9mIG5vIGNvbmNlcm4gdG8gdXNlIHNpbmNlIHRoZSBhYnNvbHV0ZSBsZXZlbCBvZiBjb25zdW1wdGlvbiBhbmQgcHJvZHVjdGlvbiBpcyBpbnNpZ25pZmljYW50IGNvbXBhcmVkIHRvIG1pbGsgYW5kIG1lYXQuIAoKIyMgWWllbGRzIC0gRmlndXJlIDQKYGBge3IgR2xvYmFsIE1lYXQgWWllbGRzfQptZWF0X3lpZWxkc19nbG9iYWwgJT4lCiAgZ2dwbG90KCkgKwogICAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IHlpZWxkLCBjb2xvcj1pdGVtKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBvaW50KSArCiAgICBsYWJzKHRpdGxlID0gIkdsb2JhbCBNZWF0IFlpZWxkcyBmb3IgVG9wIEdyYXppbmcgQW5pbWFscyIsIHkgPSAiSGVjdG9ncmFtcy9BbmltYWwiKQoKbWVhdF95aWVsZHNfZ2xvYmFsJHlpZWxkX25vcm0gPC0gd2l0aChtZWF0X3lpZWxkc19nbG9iYWwsIGF2ZSh5aWVsZCwgaXRlbSwgRlVOID0gZnVuY3Rpb24oeCkgeC94WzFdKSkgI2NyZWF0ZSBjb2x1bW4gZm9yIGNoYW5nZSBjb21wYXJlZCB0byAxc3Qgb2JzZXJ2YXRpb24KCnZpeiA8LSAgbWVhdF95aWVsZHNfZ2xvYmFsICU+JQogIGdncGxvdCgpICsKICAgIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSB5aWVsZF9ub3JtLCBjb2xvcj1pdGVtKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBvaW50KSArCiAgIGxhYnModGl0bGUgPSAiR2xvYmFsIE1lYXQgWWllbGRzIGZvciBUb3AgR3JhemluZyBBbmltYWxzIC0gJSBDaGFuZ2UgZnJvbSAxOTYxIiwgeSA9ICJIZWN0b2dyYW1zL0FuaW1hbCBSZWxhdGl2ZSB0byBGaXJzdCBZZWFyIikKCmdncGxvdGx5KHZpeikKYGBgCkdsb2JhbCBtZWF0IHlpZWxkcyBwZXIgYW5pbWFsIGFyZSBoaWdoZXN0IGZvciBjYXR0bGUuIENhdHRsZSB5aWVsZHMgaGF2ZSBhbHNvIGluY3JlYXNlZCB0aGUgbW9zdCBjb21wYXJlZCB0byBvdGhlciB0b3AgZ3JhemluZyBhbmltYWxzLCB3aXRoIHlpZWxkcyBuZWFybHkgMzQlIGhpZ2hlciBpbiAyMDEzIHRoYW4gaW4gMTk2MS4gIAoKCgpgYGB7ciBHbG9iYWwgTWlsayBZaWVsZHN9Cm1pbGtfeWllbGRzX2dsb2JhbCAlPiUKICBnZ3Bsb3QoKSArCiAgICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0geWllbGQsIGNvbG9yPWl0ZW0pKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcG9pbnQpICsKICAgIGxhYnModGl0bGUgPSAiR2xvYmFsIE1pbGsgWWllbGRzIGZvciBUb3AgR3JhemluZyBBbmltYWxzIiwgeSA9ICJIZWN0b2dyYW1zL0FuaW1hbCIpCgptaWxrX3lpZWxkc19nbG9iYWwkeWllbGRfbm9ybSA8LSB3aXRoKG1pbGtfeWllbGRzX2dsb2JhbCwgYXZlKHlpZWxkLCBpdGVtLCBGVU4gPSBmdW5jdGlvbih4KSB4L3hbMV0pKSAjY3JlYXRlIGNvbHVtbiBmb3IgY2hhbmdlIGNvbXBhcmVkIHRvIDFzdCBvYnNlcnZhdGlvbgoKdml6IDwtICBtaWxrX3lpZWxkc19nbG9iYWwgJT4lCiAgZ2dwbG90KCkgKwogICAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IHlpZWxkX25vcm0sIGNvbG9yPWl0ZW0pKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcG9pbnQpICsKICAgbGFicyh0aXRsZSA9ICJHbG9iYWwgTWlsayBZaWVsZHMgZm9yIFRvcCBHcmF6aW5nIEFuaW1hbHMgLSAlIENoYW5nZSBmcm9tIDE5NjEiLCB5ID0gIkhlY3RvZ3JhbXMvQW5pbWFsIFJlbGF0aXZlIHRvIEZpcnN0IFllYXIiKQoKZ2dwbG90bHkodml6KQpgYGAKQ2F0dGxlIGFyZSBhbHNvIHRoZSBoaWdoZXN0IHlpZWxkaW5nIG1pbGsgcHJvZHVjZXJzLiBCdWZmYWxvIG1pbGsgeWllbGRzIGhhdmUgYWN0dWFseSBpbmNyZWFzZWQgc3Vic3RhbnRpYWxseW1vcmUgdGhhbiBjYXR0bGUgeWllbGRzLCBidXQgYXJlIHN0aWxsIHN1YnN0YW50aWFsbHkgbG93ZXIuIENhdHRsZSBtaWxrIHlpZWxkcyBpbiAyMDE2IHdlcmUgMzYlIGhpZ2hlciB0aGFuIGluIDE5NjEuCgoKCiMjIFBhc3R1cmUgcGVyIGFuaW1hbC8gRGVjb3VwbGluZyAtIEZpZ3VyZSA1CmBgYHtyIE1lYXQgYW5kIE1pbGsgQW5pbWFscyBwZXIgUGFzdHVyZX0KI21lcmdlIG1pbGsgYW5kIG1lYXQgZ2xvYmFsIHByb2R1Y3Rpb24gLSBjb3VsZCBtb3ZlIHRvIGNsZWFuIHByZXAgZmlsZSAKbWVhdF9wcm9kdWN0aW9uX2dsb2JhbCA8LSByZW5hbWUobWVhdF9wcm9kdWN0aW9uX2dsb2JhbCwgbWVhdF9wcm9kID0gcHJvZHVjdGlvbikKbWlsa19wcm9kdWN0aW9uX2dsb2JhbCA8LSByZW5hbWUobWlsa19wcm9kdWN0aW9uX2dsb2JhbCwgbWlsa19wcm9kID0gcHJvZHVjdGlvbikKbWVhdF9taWxrX2dsb2JhbCA8LSBsZWZ0X2pvaW4obWVhdF9wcm9kdWN0aW9uX2dsb2JhbCwgbWlsa19wcm9kdWN0aW9uX2dsb2JhbCkgCgojc3VtIHVwIG1lYXQgYW5kIG1pbGsgYW5pbWFscwptZWF0X21pbGtfZ2xvYmFsJGFsbF9hbmltYWxzIDwtIG1lYXRfbWlsa19nbG9iYWwkYHByb2R1Y2luZyBhbmltYWxzL3NsYXVnaHRlcmVkYCArIG1lYXRfbWlsa19nbG9iYWwkYG1pbGsgYW5pbWFsc2AKCiNjcmVhdGUgZGF0YWZyYW1lIG9mIGdsb2JhbCBwYXN0dXJlIGFyZWEKcGFzdHVyZV9nbG9iYWwgPC0gcGFzdHVyZV9hcmVhICU+JSBncm91cF9ieSh5ZWFyLCBpdGVtKSAlPiUgZHBseXI6OnN1bW1hcmlzZShnbG9iYWxfYXJlYSA9IHN1bShhcmVhLCBuYS5ybT1UKSkgJT4lIGZpbHRlcihpdGVtID09IGMoIkxhbmQgdW5kZXIgcGVybS4gbWVhZG93cyBhbmQgcGFzdHVyZXMiKSkgJT4lIHNlbGVjdCgtaXRlbSkKCiNtZXJnZSBtaWxrIGFuZCBtZWF0IHdpdGggcGFzdHVyZSBhcmVhCm1lYXRfbWlsa19nbG9iYWwgPC0gbGVmdF9qb2luKG1lYXRfbWlsa19nbG9iYWwsIHBhc3R1cmVfZ2xvYmFsKQoKCiN2aXN1YWxpemUKdml6IDwtICAgbWVhdF9taWxrX2dsb2JhbCAlPiUgZmlsdGVyKGl0ZW0gPT0gImNhdHRsZSIpICU+JQogIGdncGxvdCgpICsKICAgIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBnbG9iYWxfYXJlYS9hbGxfYW5pbWFscywgY29sb3IgPSBpdGVtKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBvaW50KSArCiAgIGxhYnModGl0bGUgPSAiUGFzdHVyZSBBcmVhIHBlciBDYXR0bGUgQW5pbWFsIiwgeSA9ICJIZWN0YXJlcyBwZXIgSGVhZCBDYXR0bGUgQW5pbWFsIFNsYXVnaHRlcmVkICsgTWlsayBBbmltYWwiKQpnZ3Bsb3RseSh2aXopCgpgYGAKIAoKCgo=