Sow_Date_Birth
Lots of missing values
Many sows that were born a long time ago. Doesn’t make sense considering the lifespan of a sow
Looking for some correlations.

Looking at the categorical variables now
Sow_GeneticLine
Sow_RemovalReason
Sow_Date_BreedingHerd_Removed
Lots of weeks with a lot of observartions
Some observations from the 90’s and early 2000
Let’s look the observations by year

Sow_Date_Mating_First
One observations from 1961
Sow_GeneticLine

Many outliers.
Some numbers are really big. Let do a logarithm transformation.

Not outliers can be seen.
Sow_IsExcludedFromAdjustedFarrowingRate

Lots of missing values Most sows are excluded from adjusted farrowing rate.
Sow_Parity_Current.

Sow_Parity_Start

Sow_RemovalReason

Sow_Service_Current

Sow_Tattoo

Sow_Date_BreedingHerd_Available
LS0tDQp0aXRsZTogIk91dGxpZXJzIDIiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikNCmxpYnJhcnkoR0dhbGx5KQ0KaW5zdGFsbC5wYWNrYWdlcygiRGF0YUV4cGxvcmVyIikNCmluc3RhbGwucGFja2FnZXMoImlncmFwaCIpDQpsaWJyYXJ5KERhdGFFeHBsb3JlcikNCmBgYA0KDQoNCiMjIFNvd19EYXRlX0JpcnRoDQoNCg0KYGBge3IsZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZmlnLndpZHRoPTcuNSwgZmlnLmhlaWdodD00LjIsIHdhcm5pbmc9RkFMU0V9DQoNCg0KZGltc293ICU+JSBjb3VudChTb3dfRGF0ZV9CaXJ0aCxzb3J0PVRSVUUpICU+JQ0KICBtdXRhdGUoU293X0RhdGVfQmlydGggPSB5bWQoU293X0RhdGVfQmlydGgpKSAlPiUgDQogZ3JvdXBfYnkod2Vlaz1mbG9vcl9kYXRlKFNvd19EYXRlX0JpcnRoLCAid2VlayIpKSAlPiUgDQogIHN1bW1hcml6ZShuPXN1bShuKSkgJT4lIA0KICBwbG90X2x5KCB4ID0gfndlZWspICU+JSBhZGRfdHJhY2UoeSA9IH5uLCBuYW1lID0gJ3RyYWNlIDAnLG1vZGUgPSAnbGluZXMnKSU+JSANCiAgbGF5b3V0KHRpdGxlID0gIlNvdyBEYXRlIEJpcnRoIikgDQoNCg0KDQoNCmBgYA0KDQpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCg0KeDwtIGRpbXNvdyAlPiUgY291bnQoU293X0RhdGVfQmlydGggLHNvcnQ9VFJVRSkgJT4lDQogIG11dGF0ZShTb3dfRGF0ZV9CaXJ0aCAgPSB5bWQoU293X0RhdGVfQmlydGggKSkgJT4lIA0KIGdyb3VwX2J5KHllYXI9Zmxvb3JfZGF0ZShTb3dfRGF0ZV9CaXJ0aCAsICJ5ZWFyIikpICU+JSANCiAgc3VtbWFyaXplKG49c3VtKG4pKSAlPiUgIHNlcGFyYXRlKHllYXIsaW50bz1jKCJ5ZWFyIiwid2VlayIpLHNlcD0iLSIpICU+JSBzZWxlY3QoeWVhcixuKSU+JSByZW5hbWUoU293cz1uKQ0KDQoNCg0KRFQ6OmRhdGF0YWJsZSh4LCByb3duYW1lcyA9IEZBTFNFLA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KA0KICAgICAgICAgICAgY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgdGFyZ2V0cyA9IDA6MSkpKSkNCg0KDQoNCmBgYA0KDQpMb3RzIG9mIG1pc3NpbmcgdmFsdWVzDQoNCk1hbnkgc293cyB0aGF0IHdlcmUgYm9ybiBhIGxvbmcgdGltZSBhZ28uIERvZXNuJ3QgbWFrZSBzZW5zZSBjb25zaWRlcmluZyB0aGUgbGlmZXNwYW4gb2YgYSBzb3cNCg0KTG9va2luZyBmb3Igc29tZSBjb3JyZWxhdGlvbnMuDQpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCmRpbXNvdyAlPiUgIG11dGF0ZShTb3dfRGF0ZV9CaXJ0aD1pZmVsc2Uoc3RyX2RldGVjdChTb3dfRGF0ZV9CaXJ0aCwiMTk1MSIpLE5BLFNvd19EYXRlX0JpcnRoKSkgJT4lIA0KICBtdXRhdGUob3V0bGllcj1pZmVsc2Uoc3RyX2RldGVjdChTb3dfRGF0ZV9CaXJ0aCwiMTk1MnwxOTU1fDE5NTl8MTk2NXwxOTcxfDE5NzN8MTk3NnwxOTgzfDE5ODR8MTk4NXwxOTg4fDE5ODl8MTk5MHwxOTkxfDE5OTJ8MTk5M3wxOTk0fDE5OTV8MTk5NnwxOTk3fDE5OTgiKSwiT3V0bGllcnMiLCJOb3QgT3V0bGllciIpKSAlPiUgIHNlbGVjdChvdXRsaWVyLFNvd19TZXJ2aWNlX0N1cnJlbnQsU293X1Bhcml0eV9TdGFydCxTb3dfUGFyaXR5X0N1cnJlbnQpICU+JSANCiAgcGl2b3RfbG9uZ2VyKFNvd19TZXJ2aWNlX0N1cnJlbnQ6U293X1Bhcml0eV9DdXJyZW50LCBuYW1lc190byA9ICJzdGF0IiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lDQogIGdncGxvdChhZXMob3V0bGllciwgdmFsdWUsIGZpbGwgPSBvdXRsaWVyLCBjb2xvciA9IG91dGxpZXIpKSArDQogIGdlb21fYm94cGxvdChhbHBoYSA9IDAuNCkgKw0KICBmYWNldF93cmFwKH5zdGF0LCBzY2FsZXMgPSAiZnJlZV95IiwgbnJvdyA9IDIpICsNCiAgbGFicyh5ID0gTlVMTCwgY29sb3IgPSBOVUxMLCBmaWxsID0gTlVMTCkrdGhlbWVfbGlnaHQoKQ0KDQpgYGANCg0KTG9va2luZyBhdCB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGVzIG5vdw0KDQpTb3dfR2VuZXRpY0xpbmUNCg0KYGBge3IsZWNobz1GQUxTRX0NCg0KeDwtZGltc293ICU+JSBtdXRhdGUoU293X0RhdGVfQmlydGg9bmFfaWYoU293X0RhdGVfQmlydGgsIjE5NTEtMDEtMDEiKSkgJT4lIA0KbXV0YXRlKG91dGxpZXI9aWZlbHNlKHN0cl9kZXRlY3QoU293X0RhdGVfQmlydGgsIjE5NTJ8MTk1NXwxOTU5fDE5NjV8MTk3MXwxOTczfDE5NzZ8MTk4M3wxOTg0fDE5ODV8MTk4OHwxOTg5fDE5OTB8MTk5MXwxOTkyfDE5OTN8MTk5NHwxOTk1fDE5OTZ8MTk5N3wxOTk4IiksIk91dGxpZXJzIiwiTm8uT3V0bGllciIpKSAlPiUgbXV0YXRlKFNvd19Jc0FjdGl2ZT1hcy5mYWN0b3IoU293X0lzQWN0aXZlKSklPiUNCiAgc2VsZWN0KG91dGxpZXIsIFNvd19HZW5ldGljTGluZSklPiUgbmEub21pdCgpICU+JSAgIG11dGF0ZShTb3dfR2VuZXRpY0xpbmUgPSBmY3RfbHVtcChTb3dfR2VuZXRpY0xpbmUsIG4gPSA3MCkpICU+JQ0KICBjb3VudChTb3dfR2VuZXRpY0xpbmUsb3V0bGllcixzb3J0PVRSVUUpICU+JSBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gb3V0bGllcix2YWx1ZXNfZnJvbT1uKSAlPiUgDQogIG11dGF0ZShQZXJjZW50YWdlLk91dGxpZXJzPXJvdW5kKChPdXRsaWVycyoxMDApLyhOby5PdXRsaWVyICsgT3V0bGllcnMpLDEpKSAlPiUgbXV0YXRlKFBlcmNlbnRhZ2UuT3V0bGllcnM9aWZlbHNlKGlzLm5hKFBlcmNlbnRhZ2UuT3V0bGllcnMpLDAsUGVyY2VudGFnZS5PdXRsaWVycykpDQoNCkRUOjpkYXRhdGFibGUoeCwgcm93bmFtZXMgPSBGQUxTRSwNCiAgICAgICAgICBvcHRpb25zID0gbGlzdCgNCiAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gJ2R0LWNlbnRlcicsIHRhcmdldHMgPSAwOjEpKSkpDQogIA0KDQpgYGANCg0KDQoNClNvd19SZW1vdmFsUmVhc29uDQoNCmBgYHtyLGVjaG89RkFMU0V9DQoNCng8LWRpbXNvdyAlPiUgbXV0YXRlKFNvd19EYXRlX0JpcnRoPW5hX2lmKFNvd19EYXRlX0JpcnRoLCIxOTUxLTAxLTAxIikpICU+JSANCm11dGF0ZShvdXRsaWVyPWlmZWxzZShzdHJfZGV0ZWN0KFNvd19EYXRlX0JpcnRoLCIxOTUyfDE5NTV8MTk1OXwxOTY1fDE5NzF8MTk3M3wxOTc2fDE5ODN8MTk4NHwxOTg1fDE5ODh8MTk4OXwxOTkwfDE5OTF8MTk5MnwxOTkzfDE5OTR8MTk5NXwxOTk2fDE5OTd8MTk5OCIpLCJPdXRsaWVycyIsIk5vLk91dGxpZXIiKSkgJT4lIG11dGF0ZShTb3dfSXNBY3RpdmU9YXMuZmFjdG9yKFNvd19Jc0FjdGl2ZSkpJT4lDQogIHNlbGVjdChvdXRsaWVyLCBTb3dfUmVtb3ZhbFJlYXNvbiklPiUgbmEub21pdCgpICU+JSAgIG11dGF0ZShTb3dfUmVtb3ZhbFJlYXNvbiA9IGZjdF9sdW1wKFNvd19SZW1vdmFsUmVhc29uLCBuID0gNzApKSAlPiUNCiAgY291bnQoU293X1JlbW92YWxSZWFzb24sb3V0bGllcixzb3J0PVRSVUUpICU+JSBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gb3V0bGllcix2YWx1ZXNfZnJvbT1uKSAlPiUgDQogIG11dGF0ZShQZXJjZW50YWdlLk91dGxpZXJzPXJvdW5kKChPdXRsaWVycyoxMDApLyhOby5PdXRsaWVyICsgT3V0bGllcnMpLDEpKSAlPiUgbXV0YXRlKFBlcmNlbnRhZ2UuT3V0bGllcnM9aWZlbHNlKGlzLm5hKFBlcmNlbnRhZ2UuT3V0bGllcnMpLDAsUGVyY2VudGFnZS5PdXRsaWVycykpDQoNCkRUOjpkYXRhdGFibGUoeCwgcm93bmFtZXMgPSBGQUxTRSwNCiAgICAgICAgICBvcHRpb25zID0gbGlzdCgNCiAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gJ2R0LWNlbnRlcicsIHRhcmdldHMgPSAwOjEpKSkpDQoNCmBgYA0KDQoNCg0KIyMgU293X0RhdGVfQnJlZWRpbmdIZXJkX1JlbW92ZWQNCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy53aWR0aD03LjUsIGZpZy5oZWlnaHQ9NC4yLCB3YXJuaW5nPUZBTFNFfQ0KDQoNCmRpbXNvdyAlPiUgY291bnQoU293X0RhdGVfQnJlZWRpbmdIZXJkX1JlbW92ZWQsc29ydD1UUlVFKSAlPiUNCiAgbXV0YXRlKFNvd19EYXRlX0JyZWVkaW5nSGVyZF9SZW1vdmVkID0geW1kKFNvd19EYXRlX0JyZWVkaW5nSGVyZF9SZW1vdmVkKSkgJT4lIA0KIGdyb3VwX2J5KHdlZWs9Zmxvb3JfZGF0ZShTb3dfRGF0ZV9CcmVlZGluZ0hlcmRfUmVtb3ZlZCwgIndlZWsiKSkgJT4lIA0KICBzdW1tYXJpemUobj1zdW0obikpICU+JSANCiAgcGxvdF9seSggeCA9IH53ZWVrKSAlPiUgYWRkX3RyYWNlKHkgPSB+biwgbmFtZSA9ICd0cmFjZSAwJyxtb2RlID0gJ2xpbmVzJyklPiUgDQogIGxheW91dCh0aXRsZSA9ICJTb3dfRGF0ZV9CcmVlZGluZ0hlcmRfUmVtb3ZlZCIpIA0KDQoNCg0KDQpgYGANCg0KDQpMb3RzIG9mIHdlZWtzIHdpdGggYSBsb3Qgb2Ygb2JzZXJ2YXJ0aW9ucw0KDQpTb21lIG9ic2VydmF0aW9ucyBmcm9tIHRoZSA5MCdzIGFuZCBlYXJseSAyMDAwDQoNCkxldCdzIGxvb2sgdGhlIG9ic2VydmF0aW9ucyBieSB5ZWFyDQoNCg0KYGBge3IsZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KDQp4PC0gZGltc293ICU+JSBjb3VudChTb3dfRGF0ZV9CcmVlZGluZ0hlcmRfUmVtb3ZlZCAsc29ydD1UUlVFKSAlPiUNCiAgbXV0YXRlKFNvd19EYXRlX0JyZWVkaW5nSGVyZF9SZW1vdmVkICA9IHltZChTb3dfRGF0ZV9CcmVlZGluZ0hlcmRfUmVtb3ZlZCApKSAlPiUgDQogZ3JvdXBfYnkoeWVhcj1mbG9vcl9kYXRlKFNvd19EYXRlX0JyZWVkaW5nSGVyZF9SZW1vdmVkICwgInllYXIiKSkgJT4lIA0KICBzdW1tYXJpemUobj1zdW0obikpICU+JSAgc2VwYXJhdGUoeWVhcixpbnRvPWMoInllYXIiLCJ3ZWVrIiksc2VwPSItIikgJT4lIHNlbGVjdCh5ZWFyLG4pJT4lIHJlbmFtZShTb3dzPW4pDQoNCg0KDQpEVDo6ZGF0YXRhYmxlKHgsIHJvd25hbWVzID0gRkFMU0UsDQogICAgICAgICAgb3B0aW9ucyA9IGxpc3QoDQogICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdChsaXN0KGNsYXNzTmFtZSA9ICdkdC1jZW50ZXInLCB0YXJnZXRzID0gMDoxKSkpKQ0KDQpgYGANCg0KDQpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCmRpbXNvdyAlPiUgDQogIG11dGF0ZShvdXRsaWVyPWlmZWxzZShzdHJfZGV0ZWN0KFNvd19EYXRlX0JyZWVkaW5nSGVyZF9SZW1vdmVkLCIxOTkwfDE5OTF8MTk5MnwxOTkzfDE5OTR8MTk5NXwxOTk2fDE5OTd8MTk5OCIpLCJPdXRsaWVycyIsIk5vdCBPdXRsaWVyIikpICU+JSAgc2VsZWN0KG91dGxpZXIsU293X1NlcnZpY2VfQ3VycmVudCxTb3dfUGFyaXR5X1N0YXJ0LFNvd19QYXJpdHlfQ3VycmVudCkgJT4lIA0KICBwaXZvdF9sb25nZXIoU293X1NlcnZpY2VfQ3VycmVudDpTb3dfUGFyaXR5X0N1cnJlbnQsIG5hbWVzX3RvID0gInN0YXQiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUNCiAgZ2dwbG90KGFlcyhvdXRsaWVyLCB2YWx1ZSwgZmlsbCA9IG91dGxpZXIsIGNvbG9yID0gb3V0bGllcikpICsNCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gMC40KSArDQogIGZhY2V0X3dyYXAofnN0YXQsIHNjYWxlcyA9ICJmcmVlX3kiLCBucm93ID0gMikgKw0KICBsYWJzKHkgPSBOVUxMLCBjb2xvciA9IE5VTEwsIGZpbGwgPSBOVUxMKSt0aGVtZV9saWdodCgpDQoNCmBgYA0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQoNCng8LWRpbXNvdyAlPiUgDQptdXRhdGUob3V0bGllcj1pZmVsc2Uoc3RyX2RldGVjdChTb3dfRGF0ZV9CcmVlZGluZ0hlcmRfUmVtb3ZlZCwiMTk5MHwxOTkxfDE5OTJ8MTk5M3wxOTk0fDE5OTV8MTk5NnwxOTk3fDE5OTgiKSwiT3V0bGllcnMiLCJOby5PdXRsaWVyIikpICU+JSBtdXRhdGUoU293X0lzQWN0aXZlPWFzLmZhY3RvcihTb3dfSXNBY3RpdmUpKSU+JQ0KICBzZWxlY3Qob3V0bGllciwgU293X0dlbmV0aWNMaW5lKSU+JSBuYS5vbWl0KCkgJT4lICAgbXV0YXRlKFNvd19HZW5ldGljTGluZSA9IGZjdF9sdW1wKFNvd19HZW5ldGljTGluZSwgbiA9IDcwKSkgJT4lDQogIGNvdW50KFNvd19HZW5ldGljTGluZSxvdXRsaWVyLHNvcnQ9VFJVRSkgJT4lIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBvdXRsaWVyLHZhbHVlc19mcm9tPW4pICU+JSANCiAgbXV0YXRlKFBlcmNlbnRhZ2UuT3V0bGllcnM9cm91bmQoKE91dGxpZXJzKjEwMCkvKE5vLk91dGxpZXIgKyBPdXRsaWVycyksMSkpICU+JSBtdXRhdGUoUGVyY2VudGFnZS5PdXRsaWVycz1pZmVsc2UoaXMubmEoUGVyY2VudGFnZS5PdXRsaWVycyksMCxQZXJjZW50YWdlLk91dGxpZXJzKSkNCg0KRFQ6OmRhdGF0YWJsZSh4LCByb3duYW1lcyA9IEZBTFNFLA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KA0KICAgICAgICAgICAgY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgdGFyZ2V0cyA9IDA6MSkpKSkNCiAgDQoNCmBgYA0KDQoNCg0KYGBge3IsZWNobz1GQUxTRX0NCg0KeDwtZGltc293ICU+JQ0KbXV0YXRlKG91dGxpZXI9aWZlbHNlKHN0cl9kZXRlY3QoU293X0RhdGVfQnJlZWRpbmdIZXJkX1JlbW92ZWQsIjE5OTB8MTk5MXwxOTkyfDE5OTN8MTk5NHwxOTk1fDE5OTZ8MTk5N3wxOTk4IiksIk91dGxpZXJzIiwiTm8uT3V0bGllciIpKSAlPiUgbXV0YXRlKFNvd19Jc0FjdGl2ZT1hcy5mYWN0b3IoU293X0lzQWN0aXZlKSklPiUNCiAgc2VsZWN0KG91dGxpZXIsIFNvd19SZW1vdmFsUmVhc29uKSU+JSBuYS5vbWl0KCkgJT4lICAgbXV0YXRlKFNvd19SZW1vdmFsUmVhc29uID0gZmN0X2x1bXAoU293X1JlbW92YWxSZWFzb24sIG4gPSA3MCkpICU+JQ0KICBjb3VudChTb3dfUmVtb3ZhbFJlYXNvbixvdXRsaWVyLHNvcnQ9VFJVRSkgJT4lIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBvdXRsaWVyLHZhbHVlc19mcm9tPW4pICU+JSANCiAgbXV0YXRlKFBlcmNlbnRhZ2UuT3V0bGllcnM9cm91bmQoKE91dGxpZXJzKjEwMCkvKE5vLk91dGxpZXIgKyBPdXRsaWVycyksMSkpICU+JSBtdXRhdGUoUGVyY2VudGFnZS5PdXRsaWVycz1pZmVsc2UoaXMubmEoUGVyY2VudGFnZS5PdXRsaWVycyksMCxQZXJjZW50YWdlLk91dGxpZXJzKSkNCg0KRFQ6OmRhdGF0YWJsZSh4LCByb3duYW1lcyA9IEZBTFNFLA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KA0KICAgICAgICAgICAgY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgdGFyZ2V0cyA9IDA6MSkpKSkNCiAgDQoNCmBgYA0KDQoNCiMjIFNvd19EYXRlX01hdGluZ19GaXJzdCAgICAgICAgICAgICAgICAgICAgICANCg0KDQpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZmlnLndpZHRoPTcuNSwgZmlnLmhlaWdodD00LjIsIHdhcm5pbmc9RkFMU0V9DQoNCg0KZGltc293ICU+JSBjb3VudChTb3dfRGF0ZV9NYXRpbmdfRmlyc3Qsc29ydD1UUlVFKSAlPiUNCiAgbXV0YXRlKFNvd19EYXRlX01hdGluZ19GaXJzdCA9IHltZChTb3dfRGF0ZV9NYXRpbmdfRmlyc3QpKSAlPiUgDQogZ3JvdXBfYnkod2Vlaz1mbG9vcl9kYXRlKFNvd19EYXRlX01hdGluZ19GaXJzdCwgIndlZWsiKSkgJT4lIA0KICBzdW1tYXJpemUobj1zdW0obikpICU+JSANCiAgcGxvdF9seSggeCA9IH53ZWVrKSAlPiUgYWRkX3RyYWNlKHkgPSB+biwgbmFtZSA9ICd0cmFjZSAwJyxtb2RlID0gJ2xpbmVzJyklPiUgDQogIGxheW91dCh0aXRsZSA9ICJTb3dfRGF0ZV9NYXRpbmdfRmlyc3QgIikgDQoNCg0KYGBgDQoNCk9uZSBvYnNlcnZhdGlvbnMgZnJvbSAxOTYxDQoNCg0KYGBge3IsZWNobz1GQUxTRSxuZXNzYWdlPUZBTFNFLCB3YXJuaW5nID1GQUxTRX0NCg0KeDwtIGRpbXNvdyAlPiUgY291bnQoU293X0RhdGVfTWF0aW5nX0ZpcnN0ICxzb3J0PVRSVUUpICU+JQ0KICBtdXRhdGUoU293X0RhdGVfTWF0aW5nX0ZpcnN0ICA9IHltZChTb3dfRGF0ZV9NYXRpbmdfRmlyc3QgKSkgJT4lIA0KIGdyb3VwX2J5KHllYXI9Zmxvb3JfZGF0ZShTb3dfRGF0ZV9NYXRpbmdfRmlyc3QgLCAieWVhciIpKSAlPiUgDQogIHN1bW1hcml6ZShuPXN1bShuKSkgJT4lICBzZXBhcmF0ZSh5ZWFyLGludG89YygieWVhciIsIndlZWsiKSxzZXA9Ii0iKSAlPiUgc2VsZWN0KHllYXIsbiklPiUgcmVuYW1lKFNvd3M9bikNCg0KDQoNCkRUOjpkYXRhdGFibGUoeCwgcm93bmFtZXMgPSBGQUxTRSwNCiAgICAgICAgICBvcHRpb25zID0gbGlzdCgNCiAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gJ2R0LWNlbnRlcicsIHRhcmdldHMgPSAwOjEpKSkpDQoNCmBgYA0KDQoNCg0KIyMgU293X0dlbmV0aWNMaW5lIA0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KeDwtZGltc293ICU+JSBjb3VudChTb3dfR2VuZXRpY0xpbmUsc29ydD1UUlVFKSAlPiUgcmVuYW1lKE9ic2VydmF0aW9ucz1uKQ0KDQpEVDo6ZGF0YXRhYmxlKHgsIHJvd25hbWVzID0gRkFMU0UsDQogICAgICAgICAgb3B0aW9ucyA9IGxpc3QoDQogICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdChsaXN0KGNsYXNzTmFtZSA9ICdkdC1jZW50ZXInLCB0YXJnZXRzID0gMDoxKSkpKQ0KDQpgYGANCg0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQoNCmRpbXNvdyU+JSBjb3VudChTb3dfR2VuZXRpY0xpbmUsc29ydD1UUlVFKSAlPiUgZ2dwbG90KGFlcyh5PShuKSkpICsgDQogIGdlb21fYm94cGxvdCgpK3RoZW1lX2xpZ2h0KCkrY29vcmRfZmxpcCgpKw0KICB0aGVtZShheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkrZ2d0aXRsZSgiTnVtYmVyIG9mIFNvd3MgYnkgR2VuZXRpYyBMaW5lIikNCg0KYGBgDQoNCk1hbnkgb3V0bGllcnMuDQoNClNvbWUgbnVtYmVycyBhcmUgcmVhbGx5IGJpZy4gTGV0IGRvIGEgbG9nYXJpdGhtIHRyYW5zZm9ybWF0aW9uLiANCg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KDQpkaW1zb3clPiUgY291bnQoU293X0dlbmV0aWNMaW5lLHNvcnQ9VFJVRSkgJT4lIGdncGxvdChhZXMoeT1sb2cobikpKSArIA0KICBnZW9tX2JveHBsb3QoKSt0aGVtZV9saWdodCgpK2Nvb3JkX2ZsaXAoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCkpK2dndGl0bGUoIk51bWJlciBvZiBTb3dzIGJ5IEdlbmV0aWMgTGluZSIpDQoNCmBgYA0KDQpOb3Qgb3V0bGllcnMgY2FuIGJlIHNlZW4uDQoNCg0KIyMgU293X0hlcmRDYXRlZ29yeQ0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KDQp4PC1kaW1zb3cgJT4lIGNvdW50KFNvd19IZXJkQ2F0ZWdvcnkpDQoNCg0KRFQ6OmRhdGF0YWJsZSh4LCByb3duYW1lcyA9IEZBTFNFLA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KA0KICAgICAgICAgICAgY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgdGFyZ2V0cyA9IDA6MSkpKSkNCg0KYGBgDQoNCg0KIyMgU293X0lzRXhjbHVkZWRGcm9tQWRqdXN0ZWRGYXJyb3dpbmdSYXRlIA0KDQoNCmBgYHtyLGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KDQpnZ3Bsb3QoZGltc293LCBtYXBwaW5nID0gYWVzKHggPSBhcy5mYWN0b3IoU293X0lzRXhjbHVkZWRGcm9tQWRqdXN0ZWRGYXJyb3dpbmdSYXRlKSkpICsgDQogIGdlb21fYmFyKCkrICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6Y29tbWEpKw0KICBsYWJzKHg9IlNvd19Jc0V4Y2x1ZGVkRnJvbUFkanVzdGVkRmFycm93aW5nUmF0ZSIpKw0KdGhlbWVfbGlnaHQoKQ0KDQoNCg0KYGBgDQoNCkxvdHMgb2YgbWlzc2luZyB2YWx1ZXMNCk1vc3Qgc293cyBhcmUgZXhjbHVkZWQgZnJvbSBhZGp1c3RlZCBmYXJyb3dpbmcgcmF0ZS4NCg0KIyMgU293X1Bhcml0eV9DdXJyZW50Lg0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQoNCmRpbXNvdyAlPiUgZ2dwbG90KGFlcyh5PSggU293X1Bhcml0eV9DdXJyZW50KSkpICsgDQogIGdlb21fYm94cGxvdCgpK3RoZW1lX2xpZ2h0KCkrY29vcmRfZmxpcCgpKw0KICB0aGVtZShheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkrZ2d0aXRsZSgiU293IFBhcml0eSBDdXJyZW50IikNCg0KYGBgDQoNCg0KIyMgU293X1Bhcml0eV9TdGFydCANCg0KYGBge3IsZWNobz1GQUxTRX0NCg0KZGltc293ICU+JSBnZ3Bsb3QoYWVzKHk9U293X1Bhcml0eV9TdGFydCkpICsgDQogIGdlb21fYm94cGxvdCgpK3RoZW1lX2xpZ2h0KCkrY29vcmRfZmxpcCgpKw0KICB0aGVtZShheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkrZ2d0aXRsZSgiU293IFBhcml0eSBTdGFydCIpDQpgYGANCg0KIyMgU293X1JlbW92YWxSZWFzb24gDQoNCmBgYHtyLGVjaG89RkFMU0V9DQp4PC1kaW1zb3cgJT4lIGNvdW50KFNvd19SZW1vdmFsUmVhc29uLHNvcnQ9VFJVRSkNCg0KRFQ6OmRhdGF0YWJsZSh4LCByb3duYW1lcyA9IEZBTFNFLA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KA0KICAgICAgICAgICAgY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgdGFyZ2V0cyA9IDA6MSkpKSkNCg0KYGBgDQoNCg0KYGBge3IsZWNobz1GQUxTRX0NCg0KZGltc293JT4lIGNvdW50KFNvd19SZW1vdmFsUmVhc29uLHNvcnQ9VFJVRSkgJT4lIGdncGxvdChhZXMoeT0obikpKSArIA0KICBnZW9tX2JveHBsb3QoKSt0aGVtZV9saWdodCgpK2Nvb3JkX2ZsaXAoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCkpK2dndGl0bGUoIk51bWJlciBvZiBTb3dzIGJ5IFJlbW92YWwgUmVhc29uIikNCg0KYGBgDQoNCg0KIyMgU293X1NlcnZpY2VfQ3VycmVudCANCg0KYGBge3IsZWNobz1GQUxTRX0NCng8LWRpbXNvdyAlPiUgY291bnQoU293X1NlcnZpY2VfQ3VycmVudCkNCg0KRFQ6OmRhdGF0YWJsZSh4LCByb3duYW1lcyA9IEZBTFNFLA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KA0KICAgICAgICAgICAgY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgdGFyZ2V0cyA9IDA6MSkpKSkNCg0KDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCmRpbXNvdyAlPiUgZ2dwbG90KGFlcyh5PShTb3dfU2VydmljZV9DdXJyZW50KSkpICsgDQogIGdlb21fYm94cGxvdCgpK3RoZW1lX2xpZ2h0KCkrY29vcmRfZmxpcCgpKw0KICB0aGVtZShheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkrDQogIGdndGl0bGUoIlNvdyBTZXJ2aWNlIEN1cnJlbnQiKQ0KDQpgYGANCg0KIyMgU293X1N0YXR1cyAgIA0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KDQp4PC1kaW1zb3cgJT4lIGNvdW50KFNvd19TdGF0dXMsc29ydD1UUlVFKQ0KDQpEVDo6ZGF0YXRhYmxlKHgsIHJvd25hbWVzID0gRkFMU0UsDQogICAgICAgICAgb3B0aW9ucyA9IGxpc3QoDQogICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdChsaXN0KGNsYXNzTmFtZSA9ICdkdC1jZW50ZXInLCB0YXJnZXRzID0gMDoxKSkpKQ0KDQpgYGANCg0KIyMgU293X1RhdHRvbw0KDQpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCng8LWRpbXNvdyAlPiUgY291bnQoU293X1RhdHRvbyxzb3J0PVRSVUUpDQoNCkRUOjpkYXRhdGFibGUoeCwgcm93bmFtZXMgPSBGQUxTRSwNCiAgICAgICAgICBvcHRpb25zID0gbGlzdCgNCiAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gJ2R0LWNlbnRlcicsIHRhcmdldHMgPSAwOjEpKSkpDQoNCmBgYA0KDQoNCg0KYGBge3IsZWNobz1GQUxTRX0NCg0KZGltc293ICU+JSBmaWx0ZXIoaXMubmEoU293X1RhdHRvbyk9PUZBTFNFKSU+JSBjb3VudChTb3dfVGF0dG9vLHNvcnQ9VFJVRSkgJT4lIGdncGxvdChhZXMoeT0obikpKSArIA0KICBnZW9tX2JveHBsb3QoKSt0aGVtZV9saWdodCgpK2Nvb3JkX2ZsaXAoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCkpK2dndGl0bGUoIlNvd19UYXR0b28iKQ0KDQpgYGANCg0KIyMgU293X0RhdGVfTGFzdE1vZGlmaWVkIA0KDQpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSxmaWcud2lkdGg9Ny41LCBmaWcuaGVpZ2h0PTQuMn0NCg0KDQpkaW1zb3cgJT4lIA0KICBtdXRhdGUoU293X0RhdGVfTGFzdE1vZGlmaWVkID0geW1kKFNvd19EYXRlX0xhc3RNb2RpZmllZCkpICU+JSANCiBncm91cF9ieSh3ZWVrPWZsb29yX2RhdGUoU293X0RhdGVfTGFzdE1vZGlmaWVkLCAid2VlayIpKSAlPiUgDQogIHN1bW1hcml6ZShuPW4oKSkgJT4lIA0KICBwbG90X2x5KCB4ID0gfndlZWspICU+JSBhZGRfdHJhY2UoeSA9IH5uLCBuYW1lID0gJ3RyYWNlIDAnLG1vZGUgPSAnbGluZXMnKSU+JSANCiAgbGF5b3V0KHRpdGxlID0gIlNvd19EYXRlX0xhc3RNb2RpZmllZCIpIA0KDQoNCg0KDQpgYGANCg0KIyMgU293X0RhdGVfQnJlZWRpbmdIZXJkX0F2YWlsYWJsZQ0KDQpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSxmaWcud2lkdGg9Ny41LCBmaWcuaGVpZ2h0PTQuMn0NCg0KZGltc293ICU+JSANCiAgbXV0YXRlKFNvd19EYXRlX0JyZWVkaW5nSGVyZF9BdmFpbGFibGUgPSB5bWQoU293X0RhdGVfQnJlZWRpbmdIZXJkX0F2YWlsYWJsZSkpICU+JSANCiBncm91cF9ieSh3ZWVrPWZsb29yX2RhdGUoU293X0RhdGVfQnJlZWRpbmdIZXJkX0F2YWlsYWJsZSwgIndlZWsiKSkgJT4lIA0KICBzdW1tYXJpemUobj1uKCkpICU+JSANCiAgcGxvdF9seSggeCA9IH53ZWVrKSAlPiUgYWRkX3RyYWNlKHkgPSB+biwgbmFtZSA9ICd0cmFjZSAwJyxtb2RlID0gJ2xpbmVzJyklPiUgDQogIGxheW91dCh0aXRsZSA9ICJTb3dfRGF0ZV9CcmVlZGluZ0hlcmRfQXZhaWxhYmxlIikgDQoNCmBgYA0KDQojIyBTb3dfRGF0ZV9JZGVudGl0eQ0KDQpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSxmaWcud2lkdGg9Ny41LCBmaWcuaGVpZ2h0PTQuMn0NCg0KZGltc293ICU+JSANCiAgbXV0YXRlKFNvd19EYXRlX0lkZW50aXR5ID0geW1kKFNvd19EYXRlX0lkZW50aXR5KSkgJT4lIA0KIGdyb3VwX2J5KHdlZWs9Zmxvb3JfZGF0ZShTb3dfRGF0ZV9JZGVudGl0eSwgIndlZWsiKSkgJT4lIA0KICBzdW1tYXJpemUobj1uKCkpICU+JSANCiAgcGxvdF9seSggeCA9IH53ZWVrKSAlPiUgYWRkX3RyYWNlKHkgPSB+biwgbmFtZSA9ICd0cmFjZSAwJyxtb2RlID0gJ2xpbmVzJyklPiUgDQogIGxheW91dCh0aXRsZSA9ICJTb3dfRGF0ZV9JZGVudGl0eSIpIA0KDQpgYGANCg0KIyMgU293X0lzQWN0aXZlDQoNCmBgYHtyLGVjaG89RkFMU0V9DQoNCng8LWRpbXNvdyAlPiUgY291bnQoU293X0lzQWN0aXZlKQ0KDQoNCkRUOjpkYXRhdGFibGUoeCwgcm93bmFtZXMgPSBGQUxTRSwNCiAgICAgICAgICBvcHRpb25zID0gbGlzdCgNCiAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gJ2R0LWNlbnRlcicsIHRhcmdldHMgPSAwOjEpKSkpDQoNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=