# encoding: UTF-8
# JGRIT standalone installer. Same contents as the matching RBZ.
require "sketchup.rb"
require "base64"
require "fileutils"

begin
  destination = Sketchup.find_support_file("Plugins")
  raise "SketchUp Plugins folder not found" unless destination
  payload = {
    "JGRIT_Box_Cabinet.rb" => "IyBmcm96ZW5fc3RyaW5nX2xpdGVyYWw6IHRydWUNCg0KcmVxdWlyZSAnc2tldGNodXAucmInDQpyZXF1aXJlICdleHRlbnNpb25zLnJiJw0KDQptb2R1bGUgSkdSSVQNCiAgbW9kdWxlIEJveENhYmluZXQNCiAgICBFWFRFTlNJT05fTkFNRSA9ICdKR1JJVCBCb3ggQ2FiaW5ldCcgdW5sZXNzIGNvbnN0X2RlZmluZWQ/KDpFWFRFTlNJT05fTkFNRSkNCiAgICBWRVJTSU9OID0gJzIuMS42JyB1bmxlc3MgY29uc3RfZGVmaW5lZD8oOlZFUlNJT04pDQogICAgQ09QWVJJR0hUID0gJ0NvcHlyaWdodCDCqSAyMDI2IEpHUklULiBBbGwgcmlnaHRzIHJlc2VydmVkLicgdW5sZXNzIGNvbnN0X2RlZmluZWQ/KDpDT1BZUklHSFQpDQogIGVuZA0KZW5kDQoNCnVubGVzcyBmaWxlX2xvYWRlZD8oX19GSUxFX18pDQogIGV4dGVuc2lvbiA9IFNrZXRjaHVwRXh0ZW5zaW9uLm5ldygNCiAgICBKR1JJVDo6Qm94Q2FiaW5ldDo6RVhURU5TSU9OX05BTUUsDQogICAgJ2pncml0X2JveF9jYWJpbmV0L21haW4nDQogICkNCiAgZXh0ZW5zaW9uLmRlc2NyaXB0aW9uID0gJ+ydvOuwmOyggeyduCAxOFQg7ZSE66CI7J6E66as7IqkIOqwgOq1rCDsoJzsnpEg6riw7KSA7JeQIOuUsOudvCDrrLjsp50sIOuquO2GtSwg65K37YyQLCDshKDrsJgsIOy5uOunieydtOyZgCDrsJvsuajsnYQg7J6Q64+ZIOygnOyeke2VqeuLiOuLpC4nDQogIGV4dGVuc2lvbi52ZXJzaW9uID0gSkdSSVQ6OkJveENhYmluZXQ6OlZFUlNJT04NCiAgZXh0ZW5zaW9uLmNyZWF0b3IgPSAnSkdSSVQnDQogIGV4dGVuc2lvbi5jb3B5cmlnaHQgPSBKR1JJVDo6Qm94Q2FiaW5ldDo6Q09QWVJJR0hUDQogIFNrZXRjaHVwLnJlZ2lzdGVyX2V4dGVuc2lvbihleHRlbnNpb24sIHRydWUpDQogIGZpbGVfbG9hZGVkKF9fRklMRV9fKQ0KZW5kDQoNCg0K",
    "jgrit_box_cabinet/editor.html" => "PCFkb2N0eXBlIGh0bWw+PGh0bWwgbGFuZz0ia28iPjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij48bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSI+PHRpdGxlPkpHUklUIOqwgOq1rCDsiqTtipzrlJTsmKQ8L3RpdGxlPg0KPHN0eWxlPg0KKntib3gtc2l6aW5nOmJvcmRlci1ib3h9Ym9keXttYXJnaW46MDtwYWRkaW5nOjIycHg7YmFja2dyb3VuZDojZjVmNGYwO2NvbG9yOiMyNjJiMjk7Zm9udDoxNHB4ICdNYWxndW4gR290aGljJyxzYW5zLXNlcmlmfWgxe2ZvbnQtc2l6ZToyMnB4O21hcmdpbjowIDAgNXB4fXB7Y29sb3I6IzY4NzE2Yjtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjd9c2VjdGlvbntiYWNrZ3JvdW5kOndoaXRlO2JvcmRlcjoxcHggc29saWQgI2RlZGZkOTtib3JkZXItcmFkaXVzOjEycHg7cGFkZGluZzoxNnB4O21hcmdpbjoxNHB4IDB9aDJ7Zm9udC1zaXplOjE0cHg7bWFyZ2luOjAgMCAxNHB4fWJ1dHRvbixzZWxlY3QsaW5wdXR7Zm9udDppbmhlcml0O2JvcmRlcjoxcHggc29saWQgI2NjZDJjYztib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjhweDtiYWNrZ3JvdW5kOndoaXRlO2NvbG9yOmluaGVyaXR9YnV0dG9ue2N1cnNvcjpwb2ludGVyfWJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOiNlN2VlZTh9aW5wdXR7d2lkdGg6MTAwJTttaW4td2lkdGg6MH1sYWJlbHtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZToxMnB4O2NvbG9yOiM2MTZjNjR9bGFiZWwgaW5wdXQsbGFiZWwgc2VsZWN0e21hcmdpbi10b3A6NnB4fXNlbGVjdHt3aWR0aDoxMDAlfS5yb3d7ZGlzcGxheTpmbGV4O2dhcDo4cHh9LnJvdz4qe2ZsZXg6MTttaW4td2lkdGg6MH0ucHJlc2V0c3tkaXNwbGF5OmZsZXg7Z2FwOjVweDtmbGV4LXdyYXA6d3JhcH0ucHJlc2V0cyBidXR0b257Zm9udC1zaXplOjEycHh9LnByZXZpZXd7ZGlzcGxheTpmbGV4O2hlaWdodDoxNzBweDttYXJnaW46MTVweCAwIDhweDtnYXA6M3B4fS5iYXl7Ym9yZGVyOjJweCBzb2xpZCAjYmZjNWJjO2JvcmRlci1yYWRpdXM6M3B4O2JhY2tncm91bmQ6I2VmZWRlNTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3BhZGRpbmc6NHB4O3Bvc2l0aW9uOnJlbGF0aXZlO21pbi13aWR0aDowO2ZvbnQtc2l6ZToxMXB4O292ZXJmbG93OmhpZGRlbn0uYmF5LmFjdGl2ZXtib3JkZXItY29sb3I6IzI3Nzk1NjtiYWNrZ3JvdW5kOiNlNGYwZTZ9LmJheSBzcGFue3BhZGRpbmc6NXB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNiNWJmYjU7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmNlbnRlcn0uYmF5IHNtYWxse21hcmdpbi10b3A6YXV0bzt3aGl0ZS1zcGFjZTpub3dyYXB9LmNoZWNre2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjdweDttYXJnaW46MTJweCAwfS5jaGVjayBpbnB1dHt3aWR0aDphdXRvO21hcmdpbjowfXN1bW1hcnl7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXNpemU6MTNweH0ucHJpbWFyeXt3aWR0aDoxMDAlO2JhY2tncm91bmQ6IzIyNmI0ZDtjb2xvcjp3aGl0ZTtmb250LXdlaWdodDpib2xkO3BhZGRpbmc6MTJweH0ucHJpbWFyeTpob3ZlcntiYWNrZ3JvdW5kOiMxYjU3M2Z9I21lc3NhZ2V7bWluLWhlaWdodDoyMnB4O2ZvbnQtc2l6ZToxMnB4O2NvbG9yOiMyNzc5NTZ9I21lc3NhZ2UuZXJyb3J7Y29sb3I6I2IwM2EzMH0uZm9vdHtmb250LXNpemU6MTFweH0jbW9kZXtjb2xvcjojMjc3OTU2O2ZvbnQtd2VpZ2h0OmJvbGR9DQo8L3N0eWxlPg0KPGgxPuqwgOq1rCDsiqTtipzrlJTsmKQgPHNtYWxsIHN0eWxlPSJmb250LXNpemU6MTJweCI+Mi4xLjY8L3NtYWxsPjwvaDE+PHAgaWQ9Im1vZGUiPuuwleyKpOyXkCDrp57strAg6rCA6rWsIOunjOuTpOq4sDwvcD4NCjxkaXYgY2xhc3M9InByZXNldHMiPjxidXR0b24gb25jbGljaz0icHJlc2V0KCdiYXNlJykiPu2VmOu2gOyepTwvYnV0dG9uPjxidXR0b24gb25jbGljaz0icHJlc2V0KCd3YWxsJykiPuyDgeu2gOyepTwvYnV0dG9uPjxidXR0b24gb25jbGljaz0icHJlc2V0KCd0YWxsJykiPu2CpO2BsOyepTwvYnV0dG9uPjxidXR0b24gb25jbGljaz0icHJlc2V0KCdvcGVuJykiPuyYpO2UiOyepTwvYnV0dG9uPjxidXR0b24gb25jbGljaz0icmVzdG9yZVByZXNldCgpIj7rgrQg6rWs7ISxPC9idXR0b24+PC9kaXY+DQo8c2VjdGlvbj48aDI+MDEgwrcg7KCE7LK0IO2BrOq4sCA8c21hbGw+KG1tKTwvc21hbGw+PC9oMj48ZGl2IGNsYXNzPSJyb3ciPjxsYWJlbD7qsIDroZw8aW5wdXQgaWQ9IndpZHRoIiB0eXBlPSJudW1iZXIiIG1pbj0iMzAwIiBtYXg9IjIwMDAwIj48L2xhYmVsPjxsYWJlbD7quYrsnbQ8aW5wdXQgaWQ9ImRlcHRoIiB0eXBlPSJudW1iZXIiIG1pbj0iMTgwIiBtYXg9IjE1MDAiPjwvbGFiZWw+PGxhYmVsPuyZhOyEsSDrhpLsnbQ8aW5wdXQgaWQ9ImhlaWdodCIgdHlwZT0ibnVtYmVyIiBtaW49IjI1MCIgbWF4PSI0MDAwIj48L2xhYmVsPjwvZGl2PjxwIGlkPSJzb3VyY2VTaXplIj48L3A+PGJ1dHRvbiBpZD0icmVzdG9yZVNpemUiIG9uY2xpY2s9InJlc3RvcmVTaXplKCkiPuuwleyKpCDsuZjsiJjroZwg67O17JuQPC9idXR0b24+PHA+6rCA66Gc64qUIOygleuptOydmCDsoozsmrAsIOq5iuydtOuKlCDsoJXrqbTsl5DshJwg65Kk7Kq9LCDrhpLsnbTripQg7JyE7JWE656YIOq4uOydtOyeheuLiOuLpC4g7Jyg7ZiV7J2EIOuwlOq/lOuPhCDsoITssrQg7YGs6riw64qUIOycoOyngOuQqeuLiOuLpC48L3A+PHAgaWQ9ImhlaWdodFN1bW1hcnkiPjwvcD48cD7smYTshLEg64aS7J20ID0g67Cb7LmoICsg66q47Ya1ICsg7KO867CpIOyDge2MkC4g7Jm87Kq9IOyVniDslYTrnpjsoJDsnYQg6riw7KSA7Jy866GcIOyhsOygleuQqeuLiOuLpC48L3A+PC9zZWN0aW9uPg0KPHNlY3Rpb24+PGgyPjAyIMK3IOyepSDqtaztmo3qs7wg66y47KedPC9oMj48ZGl2IGNsYXNzPSJyb3ciPjxsYWJlbD7snqUg6rWs7ZqNIOyImDxpbnB1dCBpZD0iYmF5Y291bnQiIHR5cGU9Im51bWJlciIgbWluPSIxIiBtYXg9IjI0IiBvbmNoYW5nZT0icmVzaXplQmF5cygpIj48L2xhYmVsPjxidXR0b24gb25jbGljaz0iZXF1YWxpemUoKSI+6reg65OxIOu2hO2VoDwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9InByZXZpZXciIGlkPSJwcmV2aWV3Ij48L2Rpdj48cD7snqUg6rWs7ZqN7J2EIOyEoO2Dne2VmOyEuOyalC4g66y47Ked7J2EIOuKmOugpOuPhCDrgrTrtoAg7Lm466eJ7J2064qUIOy2lOqwgOuQmOyngCDslYrsirXri4jri6QuPC9wPjxoMiBpZD0ic2VsZWN0ZWQiPjHrsogg7Lm4PC9oMj48ZGl2IGNsYXNzPSJyb3ciPjxsYWJlbD7sooXrpZg8c2VsZWN0IGlkPSJ0eXBlIiBvbmNoYW5nZT0iY2hhbmdlQmF5KCkiPjxvcHRpb24gdmFsdWU9ImRvb3IiPuyXrOuLq+ydtDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9ImRyYXdlcnMiPuyEnOuejTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Im9wZW4iPuyYpO2UiDwvb3B0aW9uPjwvc2VsZWN0PjwvbGFiZWw+PGxhYmVsPuusuOynnSDsiJg8c2VsZWN0IGlkPSJkb29ycyIgb25jaGFuZ2U9ImNoYW5nZUJheSgpIj48b3B0aW9uIHZhbHVlPSIwIj7snpDrj5kgwrcg7LWc64yAIDQ1MDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjEiPjHsp508L29wdGlvbj48b3B0aW9uIHZhbHVlPSIyIj4y7KedIMK3IOyWkeusuDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjMiPjPsp508L29wdGlvbj48b3B0aW9uIHZhbHVlPSI0Ij407KedPC9vcHRpb24+PC9zZWxlY3Q+PC9sYWJlbD48L2Rpdj48ZGl2IGNsYXNzPSJyb3ciIHN0eWxlPSJtYXJnaW4tdG9wOjEycHgiPjxsYWJlbCBpZD0ibGV2ZWxMYWJlbCI+7ISg67CYIOyImDxpbnB1dCBpZD0ibGV2ZWxzIiB0eXBlPSJudW1iZXIiIG1pbj0iMCIgbWF4PSIxMCIgb25jaGFuZ2U9ImNoYW5nZUJheSgpIj48L2xhYmVsPjxsYWJlbD7qs6DsoJUg64SI67mEIMK3IDDsnYAg7J6Q64+ZPGlucHV0IGlkPSJmaXhlZCIgdHlwZT0ibnVtYmVyIiBtaW49IjAiIG9uY2hhbmdlPSJjaGFuZ2VCYXkoKSI+PC9sYWJlbD48L2Rpdj48L3NlY3Rpb24+DQo8c2VjdGlvbj48aDI+MDMgwrcg64aS7J20IOq1rOyEsSAobW0pPC9oMj48ZGl2IGNsYXNzPSJyb3ciPjxsYWJlbD7rsJvsuagg64aS7J20PGlucHV0IGlkPSJwbGludGgiIHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjIwMCI+PC9sYWJlbD48bGFiZWw+7KO867CpIOyDge2MkCDrkZDqu5ggwrcgMOydgCDsl4bsnYw8aW5wdXQgaWQ9ImNvdW50ZXJ0b3AiIHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCI+PC9sYWJlbD48L2Rpdj48cD7rqrjthrUg64aS7J2064qUIOyZhOyEsSDrhpLsnbTsl5DshJwg7J6Q64+ZIOqzhOyCsOuQqeuLiOuLpC4g7IOB7YyQIOuPjOy2nCDsl4bsnbQg7KCE7LK0IOq5iuydtOyXkCDrp57strAg7IOd7ISx7ZWp64uI64ukLjwvcD48ZGV0YWlscz48c3VtbWFyeT7tjJDsnqwg7IOB7IS4IOyEpOyglTwvc3VtbWFyeT48ZGl2IGNsYXNzPSJyb3ciIHN0eWxlPSJtYXJnaW4tdG9wOjE1cHgiPjxsYWJlbD7tjJAg65GQ6ruYPGlucHV0IGlkPSJwYW5lbCIgdHlwZT0ibnVtYmVyIj48L2xhYmVsPjxsYWJlbD7rkrftjJAg65GQ6ruYPGlucHV0IGlkPSJiYWNrIiB0eXBlPSJudW1iZXIiPjwvbGFiZWw+PGxhYmVsPuusuCDti4g8aW5wdXQgaWQ9ImdhcCIgdHlwZT0ibnVtYmVyIj48L2xhYmVsPjwvZGl2PjxsYWJlbCBjbGFzcz0iY2hlY2siPjxpbnB1dCBpZD0idG9wIiB0eXBlPSJjaGVja2JveCI+66q47Ya1IOycl+2MkCDtj6ztlag8L2xhYmVsPjxsYWJlbCBjbGFzcz0iY2hlY2siPjxpbnB1dCBpZD0iaGlkZV9mcm9udHMiIHR5cGU9ImNoZWNrYm94Ij7rrLjCt+yEnOuejSDsoITrqbQg7Iio6rmAICjrgrTrtoAg7ZmV7J24KTwvbGFiZWw+PGJ1dHRvbiBvbmNsaWNrPSJzYXZlUHJlc2V0KCkiPu2YhOyerCDshKTsoJXsnYQg64K0IOq1rOyEseycvOuhnCDsoIDsnqU8L2J1dHRvbj48L2RldGFpbHM+PC9zZWN0aW9uPg0KPGRpdiBpZD0ibWVzc2FnZSIgcm9sZT0ic3RhdHVzIj48L2Rpdj48YnV0dG9uIGlkPSJhcHBseSIgY2xhc3M9InByaW1hcnkiIG9uY2xpY2s9ImFwcGx5Q29uZmlnKCkiPuqwgOq1rCDsg53shLE8L2J1dHRvbj48cCBjbGFzcz0iZm9vdCI+7KCB7JqpIOyghOyXkOuKlCDrqqjrjbjsnbQg67CU64CM7KeAIOyViuyKteuLiOuLpC4g7KCB7JqpIO2bhCBVbmRvIO2VnCDrsojsnLzroZwg67O17JuQ65Cp64uI64ukLjxicj7sm5Drs7gg67CV7Iqk64qUIOyIqOqyqOyEnCDrs7TqtIDrkKnri4jri6QuPC9wPg0KPHNjcmlwdD4NCmxldCBjb25maWcsc2F2ZWQsc291cmNlRGltZW5zaW9ucyxlZGl0aW5nTW9kZT1mYWxzZSxzZWxlY3RlZD0wO2NvbnN0ICQ9aWQ9PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSwga2V5cz1bJ3dpZHRoJywnZGVwdGgnLCdoZWlnaHQnLCdwYW5lbCcsJ2JhY2snLCdnYXAnLCdwbGludGgnLCdjb3VudGVydG9wJ107DQpmdW5jdGlvbiBzdGF0dXModCxlcnJvcj1mYWxzZSl7JCgnbWVzc2FnZScpLnRleHRDb250ZW50PXQ7JCgnbWVzc2FnZScpLmNsYXNzTmFtZT1lcnJvcj8nZXJyb3InOicnfQ0KZnVuY3Rpb24gbWlncmF0ZShjKXtpZihjLmNvdW50ZXJ0b3A9PT11bmRlZmluZWQpYy5jb3VudGVydG9wPTA7Yy5iYXlzLmZvckVhY2goYj0+e2lmKGIuZG9vcnM9PT11bmRlZmluZWQpYi5kb29ycz0xfSk7cmV0dXJuIGN9DQpmdW5jdGlvbiBpbml0KGMsZWRpdGluZyxwKXtlZGl0aW5nTW9kZT1lZGl0aW5nO2NvbmZpZz1taWdyYXRlKGMpO3NvdXJjZURpbWVuc2lvbnM9e3dpZHRoOmMud2lkdGgsZGVwdGg6Yy5kZXB0aCxoZWlnaHQ6Yy5oZWlnaHR9O3NhdmVkPXA/bWlncmF0ZShwKTpudWxsO2ZpbGwoKTskKCdhcHBseScpLnRleHRDb250ZW50PSfqsIDqtawg7IOd7ISxJzskKCdtb2RlJykudGV4dENvbnRlbnQ9J+2BtOumre2VnCDsoJXrqbQg6riw7KSA7Jy866GcIOuwleyKpCDsuZjsiJjrpbwg67aI65+s7JmU7Iq164uI64ukJzskKCdyZXN0b3JlU2l6ZScpLmhpZGRlbj1mYWxzZTskKCdyZXN0b3JlU2l6ZScpLnRleHRDb250ZW50PSfrsJXsiqQg7LmY7IiYIOuLpOyLnCDrtojrn6zsmKTquLAnOyQoJ3NvdXJjZVNpemUnKS50ZXh0Q29udGVudD1g7KCV66m0IOq4sOykgDog6rCA66GcICR7Yy53aWR0aC50b0ZpeGVkKDEpfSDDlyDquYrsnbQgJHtjLmRlcHRoLnRvRml4ZWQoMSl9IMOXIOuGkuydtCAke2MuaGVpZ2h0LnRvRml4ZWQoMSl9IG1tYDt9DQpmdW5jdGlvbiBmaWxsKCl7a2V5cy5mb3JFYWNoKGs9PiQoaykudmFsdWU9KFsnd2lkdGgnLCdkZXB0aCcsJ2hlaWdodCddLmluY2x1ZGVzKGspJiYhY29uZmlnW2tdKT8nJzpNYXRoLnJvdW5kKGNvbmZpZ1trXSoxMDApLzEwMCk7Wyd0b3AnLCdoaWRlX2Zyb250cyddLmZvckVhY2goaz0+JChrKS5jaGVja2VkPSEhY29uZmlnW2tdKTskKCdiYXljb3VudCcpLnZhbHVlPWNvbmZpZy5iYXlzLmxlbmd0aDtzZWxlY3RlZD1NYXRoLm1pbihzZWxlY3RlZCxjb25maWcuYmF5cy5sZW5ndGgtMSk7cmVuZGVyKCk7c2hvd0JheSgpfQ0KZnVuY3Rpb24gcmVhZCgpe2tleXMuZm9yRWFjaChrPT5jb25maWdba109TnVtYmVyKCQoaykudmFsdWUpKTtbJ3RvcCcsJ2hpZGVfZnJvbnRzJ10uZm9yRWFjaChrPT5jb25maWdba109JChrKS5jaGVja2VkKTtyZXR1cm4gY29uZmlnfQ0KZnVuY3Rpb24gd2lkdGhzKCl7bGV0IHJlbWFpbmluZz1jb25maWcud2lkdGgtY29uZmlnLmJheXMucmVkdWNlKChzLGIpPT5zK2IuZml4ZWQsMCksZnJlZT1jb25maWcuYmF5cy5maWx0ZXIoYj0+IWIuZml4ZWQpLmxlbmd0aDtyZXR1cm4gY29uZmlnLmJheXMubWFwKGI9PmIuZml4ZWR8fHJlbWFpbmluZy9mcmVlKX0NCmZ1bmN0aW9uIHJlbmRlcigpe3JlYWQoKTskKCdoZWlnaHRTdW1tYXJ5JykudGV4dENvbnRlbnQ9YOuwm+y5qCAke2NvbmZpZy5wbGludGh9ICsg66q47Ya1ICR7TWF0aC5yb3VuZCgoY29uZmlnLmhlaWdodC1jb25maWcucGxpbnRoLWNvbmZpZy5jb3VudGVydG9wKSoxMDApLzEwMH0gKyDso7zrsKkg7IOB7YyQICR7Y29uZmlnLmNvdW50ZXJ0b3B9ID0gJHtjb25maWcuaGVpZ2h0fSBtbWA7aWYoIWRpbWVuc2lvbnNSZWFkeSgpKSQoJ2hlaWdodFN1bW1hcnknKS50ZXh0Q29udGVudD0nJztsZXQgd3M9d2lkdGhzKCk7JCgncHJldmlldycpLnJlcGxhY2VDaGlsZHJlbigpO2NvbmZpZy5iYXlzLmZvckVhY2goKGIsaSk9PntsZXQgZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7ZWwuY2xhc3NOYW1lPSdiYXknKyhpPT09c2VsZWN0ZWQ/JyBhY3RpdmUnOicnKTtlbC5zdHlsZS5mbGV4PVN0cmluZyhNYXRoLm1heCgxLHdzW2ldfHwxKSk7ZWwub25jbGljaz0oKT0+e3NlbGVjdGVkPWk7cmVuZGVyKCk7c2hvd0JheSgpfTtsZXQgbj1iLnR5cGU9PT0nZHJhd2Vycyc/Yi5jb3VudDpiLnR5cGU9PT0nZG9vcic/KGIuZG9vcnN8fE1hdGgubWF4KDEsTWF0aC5jZWlsKHdzW2ldLzQ1MCkpKToxO2lmKGIudHlwZT09PSdkb29yJyllbC5zdHlsZS5mbGV4RGlyZWN0aW9uPSdyb3cnO2ZvcihsZXQgaj0wO2o8bjtqKyspe2xldCBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtzLnRleHRDb250ZW50PWIudHlwZT09PSdkcmF3ZXJzJz8n7ISc656NJzpiLnR5cGU9PT0nZG9vcic/J+usuCc6J+yYpO2UiCc7aWYoYi50eXBlPT09J2Rvb3InKXtzLnN0eWxlLmJvcmRlclJpZ2h0PScxcHggc29saWQgI2E5YjZhYSc7cy5zdHlsZS5wYWRkaW5nPSc1cHggMXB4Jzt9ZWwuYXBwZW5kKHMpfWxldCBzbWFsbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzbWFsbCcpO3NtYWxsLnRleHRDb250ZW50PWRpbWVuc2lvbnNSZWFkeSgpPyhiLmZpeGVkPyfwn5SSICc6JycpK01hdGgucm91bmQod3NbaV0pOifigJQnO3NtYWxsLnN0eWxlLnBvc2l0aW9uPSdhYnNvbHV0ZSc7c21hbGwuc3R5bGUuYm90dG9tPSc2cHgnO2VsLmFwcGVuZChzbWFsbCk7JCgncHJldmlldycpLmFwcGVuZChlbCl9KTtzdGF0dXMoIWRpbWVuc2lvbnNSZWFkeSgpPyfsoITssrQg7YGs6riw66W8IOyeheugpe2VmOuptCDsuZjsiJjsmYAg64aS7J20IOq1rOyEseydtCDqs4TsgrDrkKnri4jri6QuJzp3cy5zb21lKHc9PiFOdW1iZXIuaXNGaW5pdGUodyl8fHc8MTIwKT8n7Lm4IOuEiOu5hOqwgCDrtoDsobHtlanri4jri6QuIOqzoOyglSDrhIjruYTrgpgg7Lm4IOyImOulvCDsobDsoJXtlZjshLjsmpQuJzonJyxkaW1lbnNpb25zUmVhZHkoKSYmd3Muc29tZSh3PT53PDEyMCkpfQ0KZnVuY3Rpb24gc2hvd0JheSgpe2xldCBiPWNvbmZpZy5iYXlzW3NlbGVjdGVkXTskKCdzZWxlY3RlZCcpLnRleHRDb250ZW50PShzZWxlY3RlZCsxKSsn67KIIOy5uCc7JCgndHlwZScpLnZhbHVlPWIudHlwZTskKCdkb29ycycpLnZhbHVlPWIuZG9vcnM7JCgnZG9vcnMnKS5kaXNhYmxlZD1iLnR5cGUhPT0nZG9vcic7JCgnbGV2ZWxzJykudmFsdWU9Yi50eXBlPT09J2RyYXdlcnMnP2IuY291bnQ6Yi5zaGVsdmVzOyQoJ2xldmVscycpLm1pbj1iLnR5cGU9PT0nZHJhd2Vycyc/MTowOyQoJ2xldmVsTGFiZWwnKS5maXJzdENoaWxkLnRleHRDb250ZW50PWIudHlwZT09PSdkcmF3ZXJzJz8n7ISc656NIOuLqOyImCc6J+yEoOuwmCDsiJgnOyQoJ2ZpeGVkJykudmFsdWU9Yi5maXhlZH0NCmZ1bmN0aW9uIGNoYW5nZUJheSgpe2xldCBiPWNvbmZpZy5iYXlzW3NlbGVjdGVkXSx0eXBlPSQoJ3R5cGUnKS52YWx1ZTtsZXQgY2hhbmdlZD10eXBlIT09Yi50eXBlO2IudHlwZT10eXBlO2lmKCFjaGFuZ2VkKXtiW3R5cGU9PT0nZHJhd2Vycyc/J2NvdW50Jzonc2hlbHZlcyddPU51bWJlcigkKCdsZXZlbHMnKS52YWx1ZSl9Yi5kb29ycz1OdW1iZXIoJCgnZG9vcnMnKS52YWx1ZSk7Yi5maXhlZD1OdW1iZXIoJCgnZml4ZWQnKS52YWx1ZSk7cmVuZGVyKCk7c2hvd0JheSgpfQ0KZnVuY3Rpb24gcmVzaXplQmF5cygpe2xldCBuPU51bWJlcigkKCdiYXljb3VudCcpLnZhbHVlKTtpZighTnVtYmVyLmlzSW50ZWdlcihuKXx8bjwxfHxuPjI0KXJldHVybiBzdGF0dXMoJ+y5uCDsiJjripQgMX4yNOqwnOyeheuLiOuLpC4nLHRydWUpO3doaWxlKGNvbmZpZy5iYXlzLmxlbmd0aDxuKWNvbmZpZy5iYXlzLnB1c2goe3R5cGU6J2Rvb3InLGRvb3JzOjAsY291bnQ6MyxzaGVsdmVzOjEsZml4ZWQ6MH0pO2NvbmZpZy5iYXlzLmxlbmd0aD1uO3NlbGVjdGVkPU1hdGgubWluKHNlbGVjdGVkLG4tMSk7cmVuZGVyKCk7c2hvd0JheSgpfQ0KZnVuY3Rpb24gZXF1YWxpemUoKXtjb25maWcuYmF5cy5mb3JFYWNoKGI9PmIuZml4ZWQ9MCk7cmVuZGVyKCk7c2hvd0JheSgpfQ0KZnVuY3Rpb24gcHJlc2V0KGtpbmQpe3JlYWQoKTtjb25zdCBwPXtiYXNlOntkZXB0aDo2MDAsaGVpZ2h0Ojg1MCxwbGludGg6MTAwLGNvdW50ZXJ0b3A6MzB9LHdhbGw6e2RlcHRoOjM1MCxoZWlnaHQ6NzAwLHBsaW50aDowLGNvdW50ZXJ0b3A6MH0sdGFsbDp7ZGVwdGg6NjAwLGhlaWdodDoyMTAwLHBsaW50aDoxMDAsY291bnRlcnRvcDowfSxvcGVuOntkZXB0aDozNTAsaGVpZ2h0Ojg1MCxwbGludGg6NjAsY291bnRlcnRvcDowfX1ba2luZF07Y29uZmlnLnBsaW50aD1jb25maWcuaGVpZ2h0P01hdGgubWluKHAucGxpbnRoLGNvbmZpZy5oZWlnaHQqMC4yKTpwLnBsaW50aDtjb25maWcuY291bnRlcnRvcD1wLmNvdW50ZXJ0b3A7Y29uZmlnLnRvcD10cnVlO2NvbnN0IG49TWF0aC5taW4oMjQsTWF0aC5tYXgoMSxNYXRoLmNlaWwoY29uZmlnLndpZHRoLzYwMCkpKTtjb25maWcuYmF5cz1BcnJheS5mcm9tKHtsZW5ndGg6bn0sKCk9Pih7dHlwZTpraW5kPT09J29wZW4nPydvcGVuJzonZG9vcicsZG9vcnM6MCxjb3VudDozLHNoZWx2ZXM6TWF0aC5tYXgoMCxNYXRoLm1pbihraW5kPT09J3RhbGwnPzQ6MSxNYXRoLmZsb29yKChjb25maWcuaGVpZ2h0LWNvbmZpZy5wbGludGgtY29uZmlnLmNvdW50ZXJ0b3AtMzYpLzEwMCktMSkpLGZpeGVkOjB9KSk7c2VsZWN0ZWQ9MDtmaWxsKCk7c3RhdHVzKCfsoITssrQg7LmY7IiY64qUIOycoOyngO2VmOqzoCDrsJvsuajCt+yDge2MkMK364K067aAIOq1rOyEseunjCDrs4Dqsr3tlojsirXri4jri6QuJyl9DQpmdW5jdGlvbiByZXN0b3JlU2l6ZSgpe3JlYWQoKTtPYmplY3QuYXNzaWduKGNvbmZpZyxzb3VyY2VEaW1lbnNpb25zKTtmaWxsKCk7c3RhdHVzKCfsspjsnYwg67aI65+s7JioIOy5mOyImOuhnCDrs7Xsm5DtlojsirXri4jri6QuJyl9DQpmdW5jdGlvbiBzYXZlUHJlc2V0KCl7aWYoIWRpbWVuc2lvbnNSZWFkeSgpKXJldHVybiBzdGF0dXMoJ+qwgOuhnMK36rmK7J20wrfsmYTshLEg64aS7J2066W8IOuqqOuRkCDsnoXroKXtlZjshLjsmpQuJyx0cnVlKTtyZWFkKCk7c2F2ZWQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjb25maWcpKTtpZih3aW5kb3cuc2tldGNodXApc2tldGNodXAuc2F2ZV9wcmVzZXQoSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7ZWxzZSBzdGF0dXMoJ+uvuOumrOuztOq4sDog7ISk7KCVIOyggOyepeuQqCcpfQ0KZnVuY3Rpb24gcmVzdG9yZVByZXNldCgpe2lmKCFzYXZlZClyZXR1cm4gc3RhdHVzKCfsoIDsnqXtlZwg64K0IOq1rOyEseydtCDsl4bsirXri4jri6QuJyk7cmVhZCgpO2xldCBkaW1zPXt3aWR0aDpjb25maWcud2lkdGgsZGVwdGg6Y29uZmlnLmRlcHRoLGhlaWdodDpjb25maWcuaGVpZ2h0fTtjb25maWc9ey4uLkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc2F2ZWQpKSwuLi5kaW1zfTtmaWxsKCl9DQpmdW5jdGlvbiBkaW1lbnNpb25zUmVhZHkoKXtyZXR1cm4gWyd3aWR0aCcsJ2RlcHRoJywnaGVpZ2h0J10uZXZlcnkoaz0+U3RyaW5nKCQoaykudmFsdWUpLnRyaW0oKSE9PScnJiZOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKCQoaykudmFsdWUpKSYmTnVtYmVyKCQoaykudmFsdWUpPjApfQ0KZnVuY3Rpb24gYXBwbHlDb25maWcoKXtpZighZGltZW5zaW9uc1JlYWR5KCkpcmV0dXJuIHN0YXR1cygn6rCA66GcwrfquYrsnbTCt+yZhOyEsSDrhpLsnbTrpbwg66qo65GQIOyeheugpe2VmOyEuOyalC4nLHRydWUpO3JlYWQoKTtpZih3aW5kb3cuc2tldGNodXApc2tldGNodXAuYXBwbHkoSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7ZWxzZSBzdGF0dXMoJ+ydtCDtmZTrqbTsnYAg66+466as67O06riw7J6F64uI64ukLiBTa2V0Y2hVcOyXkOyEnCDqsIDqtazrpbwg7IOd7ISx7ZWY7IS47JqULicpfQ0Ka2V5cy5mb3JFYWNoKGs9PiQoaykuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCgpPT57aWYoY29uZmlnKXJlbmRlcigpfSkpOw0KaWYod2luZG93LnNrZXRjaHVwKXNrZXRjaHVwLnJlYWR5KCk7ZWxzZSBpbml0KHt3aWR0aDoyNDAwLGRlcHRoOjYwMCxoZWlnaHQ6ODUwLHBhbmVsOjE4LGJhY2s6NixnYXA6MixwbGludGg6NjAsdG9wOnRydWUsaGlkZV9mcm9udHM6ZmFsc2UsYmF5czpbe3R5cGU6J2Rvb3InLGRvb3JzOjAsY291bnQ6MyxzaGVsdmVzOjEsZml4ZWQ6MH0se3R5cGU6J2Rvb3InLGRvb3JzOjAsY291bnQ6MyxzaGVsdmVzOjEsZml4ZWQ6MH0se3R5cGU6J2RyYXdlcnMnLGNvdW50OjMsc2hlbHZlczoxLGZpeGVkOjB9LHt0eXBlOidvcGVuJyxjb3VudDozLHNoZWx2ZXM6MixmaXhlZDowfV19LGZhbHNlLG51bGwpOw0KPC9zY3JpcHQ+PC9odG1sPg0K",
    "jgrit_box_cabinet/editor.rb" => "IyBmcm96ZW5fc3RyaW5nX2xpdGVyYWw6IHRydWUNCnJlcXVpcmUgJ2pzb24nDQoNCm1vZHVsZSBKR1JJVA0KICBtb2R1bGUgQm94Q2FiaW5ldA0KICAgIERJQ1QgPSAnSkdSSVQgQm94IENhYmluZXQnDQogICAgbW9kdWxlX2Z1bmN0aW9uDQoNCiAgICBkZWYgZGVmYXVsdHModyA9IDI0MDAsIGQgPSA2MDAsIGggPSA4NTApDQogICAgICBuID0gW1sodyAvIDYwMC4wKS5jZWlsLCAxXS5tYXgsIDI0XS5taW4NCiAgICAgIHsgJ3dpZHRoJyA9PiB3LCAnZGVwdGgnID0+IGQsICdoZWlnaHQnID0+IGgsICdwYW5lbCcgPT4gMTgsICdiYWNrJyA9PiA2LA0KICAgICAgICAnZ2FwJyA9PiAyLCAncGxpbnRoJyA9PiBbMTAwLCBoICogMC4yXS5taW4sICdjb3VudGVydG9wJyA9PiAzMCwgJ3RvcCcgPT4gdHJ1ZSwgJ2hpZGVfZnJvbnRzJyA9PiBmYWxzZSwNCiAgICAgICAgJ2JheXMnID0+IEFycmF5Lm5ldyhuKSB7IHsgJ3R5cGUnID0+ICdkb29yJywgJ2Rvb3JzJyA9PiAwLCAnY291bnQnID0+IDMsICdzaGVsdmVzJyA9PiBbWygoaC0xNjYpLzQ1MC4wKS5jZWlsLTEsIDBdLm1heCwgMTBdLm1pbiwgJ2ZpeGVkJyA9PiAwIH0gfSB9DQogICAgZW5kDQoNCiAgICBkZWYgbWlncmF0ZV9jb25maWcoYykNCiAgICAgIGNbJ2NvdW50ZXJ0b3AnXSA9IDAgdW5sZXNzIGMua2V5PygnY291bnRlcnRvcCcpDQogICAgICBjWydiYXlzJ10uZWFjaCB7IHxifCBiWydkb29ycyddID0gMSB1bmxlc3MgYi5rZXk/KCdkb29ycycpIH0NCiAgICAgIGMNCiAgICBlbmQNCg0KICAgIGRlZiBkb29yX2NvdW50KGJheSwgd2lkdGgpDQogICAgICBiYXlbJ2Rvb3JzJ10gPT0gMCA/IFsod2lkdGggLyA0NTAuMCkuY2VpbCwgMV0ubWF4IDogYmF5Wydkb29ycyddDQogICAgZW5kDQoNCiAgICBkZWYgdmFsaWRhdGVfY29uZmlnKGMpDQogICAgICBtaWdyYXRlX2NvbmZpZyhjKQ0KICAgICAgeyAnd2lkdGgnID0+IFszMDAsIDIwMDAwXSwgJ2RlcHRoJyA9PiBbMTgwLCAxNTAwXSwgJ2hlaWdodCcgPT4gWzI1MCwgNDAwMF0sDQogICAgICAgICdwYW5lbCcgPT4gWzEyLCAzMF0sICdiYWNrJyA9PiBbMywgMjBdLCAnZ2FwJyA9PiBbMSwgOF0sICdwbGludGgnID0+IFswLCAyMDBdLCAnY291bnRlcnRvcCcgPT4gWzAsIDEwMF0gfS5lYWNoIGRvIHxrLCBsaW1pdHN8DQogICAgICAgIHYgPSBGbG9hdChjW2tdKQ0KICAgICAgICByYWlzZSAiI3trfTogI3tsaW1pdHMuam9pbignficpfSBtbSDrspTsnITroZwg7J6F66Cl7ZWY7IS47JqULiIgdW5sZXNzIHYuZmluaXRlPyAmJiB2LmJldHdlZW4/KCpsaW1pdHMpDQogICAgICAgIGNba10gPSB2DQogICAgICBlbmQNCiAgICAgIGJheXMgPSBjWydiYXlzJ10NCiAgICAgIHJhaXNlICfsubgg7IiY64qUIDF+MjTqsJzsnoXri4jri6QuJyB1bmxlc3MgYmF5cy5pc19hPyhBcnJheSkgJiYgYmF5cy5sZW5ndGguYmV0d2Vlbj8oMSwgMjQpDQogICAgICBiYXlzLmVhY2ggZG8gfGJ8DQogICAgICAgIHJhaXNlICfsmKzrsJTrpbTsp4Ag7JWK7J2AIOy5uCDsooXrpZjsnoXri4jri6QuJyB1bmxlc3MgJXdbZG9vciBkcmF3ZXJzIG9wZW5dLmluY2x1ZGU/KGJbJ3R5cGUnXSkNCiAgICAgICAgYlsnZG9vcnMnXSA9IEludGVnZXIoYlsnZG9vcnMnXSkNCiAgICAgICAgcmFpc2UgJ+usuOynnSDsiJjripQg7J6Q64+ZIOuYkOuKlCAxfjTsp53snoXri4jri6QuJyB1bmxlc3MgYlsnZG9vcnMnXS5iZXR3ZWVuPygwLCA0KQ0KICAgICAgICAld1tjb3VudCBzaGVsdmVzXS5lYWNoIHsgfGt8IGJba10gPSBJbnRlZ2VyKGJba10pOyByYWlzZSAn64uo7IiY66W8IO2ZleyduO2VmOyEuOyalC4nIHVubGVzcyBiW2tdLmJldHdlZW4/KGsgPT0gJ2NvdW50JyA/IDEgOiAwLCAxMCkgfQ0KICAgICAgICBiWydmaXhlZCddID0gRmxvYXQoYlsnZml4ZWQnXSkNCiAgICAgICAgcmFpc2UgJ+qzoOyglSDrhIjruYTrpbwg7ZmV7J247ZWY7IS47JqULicgdW5sZXNzIGJbJ2ZpeGVkJ10uZmluaXRlPyAmJiBiWydmaXhlZCddID49IDANCiAgICAgIGVuZA0KICAgICAgZnJlZSA9IGJheXMuY291bnQgeyB8YnwgYlsnZml4ZWQnXSA9PSAwIH0NCiAgICAgIHJlbWFpbmluZyA9IGNbJ3dpZHRoJ10gLSBiYXlzLmluamVjdCgwLjApIHsgfHRvdGFsLCBifCB0b3RhbCArIGJbJ2ZpeGVkJ10gfQ0KICAgICAgcmFpc2UgJ+qzoOyglSDrhIjruYTsnZgg7ZWp7J20IOyghOyytCDrhIjruYTsmYAg66ee7KeAIOyViuyKteuLiOuLpC4nIGlmIGZyZWUuemVybz8gJiYgcmVtYWluaW5nLmFicyA+IDAuMQ0KICAgICAgd2lkdGhzID0gYmF5cy5tYXAgeyB8YnwgYlsnZml4ZWQnXSA+IDAgPyBiWydmaXhlZCddIDogcmVtYWluaW5nIC8gZnJlZSB9DQogICAgICByYWlzZSAn6rCBIOy5uCDrhIjruYTripQg7LWc7IaMIDEyMCBtbeqwgCDtlYTsmpTtlanri4jri6QuJyBpZiB3aWR0aHMuYW55PyB7IHx3fCB3IDwgMTIwIH0NCiAgICAgIGlubmVyX2ggPSBjWydoZWlnaHQnXSAtIGNbJ2NvdW50ZXJ0b3AnXSAtIGNbJ3BsaW50aCddIC0gY1sncGFuZWwnXSAqIChjWyd0b3AnXSA/IDIgOiAxKQ0KICAgICAgcmFpc2UgJ+uwm+y5qCDrhpLsnbTqsIAg64SI66y0IOuGkuyKteuLiOuLpC4nIGlmIGlubmVyX2ggPCAxMjANCiAgICAgIGJheXMuZWFjaCBkbyB8YnwNCiAgICAgICAgbiA9IGJbJ3R5cGUnXSA9PSAnZHJhd2VycycgPyBiWydjb3VudCddIDogYlsnc2hlbHZlcyddICsgMQ0KICAgICAgICByYWlzZSAn64uo7IiY6rCAIOuEiOustCDrp47slYQg64K067aAIOuGkuydtOqwgCDrtoDsobHtlanri4jri6QuJyBpZiBpbm5lcl9oIC8gbiA8IDkwDQogICAgICBlbmQNCiAgICAgIGJheXMuZWFjaF93aXRoX2luZGV4IGRvIHxiLCBpfA0KICAgICAgICByYWlzZSAn66y47KedIOuEiOu5hOqwgCDrhIjrrLQg7J6R7Iq164uI64ukLicgaWYgYlsndHlwZSddID09ICdkb29yJyAmJiB3aWR0aHNbaV0gLyBkb29yX2NvdW50KGIsIHdpZHRoc1tpXSkgPCAxMDANCiAgICAgICAgcmFpc2UgJ+yEnOuejSDsubjsnYAg7YyQIOuRkOq7mOulvCDqs6DroKTtlbQg642UIOuEk+qyjCDshKTsoJXtlZjshLjsmpQuJyBpZiBiWyd0eXBlJ10gPT0gJ2RyYXdlcnMnICYmIHdpZHRoc1tpXSA8PSBjWydwYW5lbCddICogNCArIDMwDQogICAgICBlbmQNCiAgICAgIFtjLCB3aWR0aHNdDQogICAgZW5kDQoNCiAgICBkZWYgb3Blbl9lZGl0b3IodGFyZ2V0LCBmcm9udCA9IG5pbCkNCiAgICAgIHJldHVybiBVSS5tZXNzYWdlYm94KCfsnqDquLQg6rCd7LK064qUIOyImOygle2VoCDsiJgg7JeG7Iq164uI64ukLicpIGlmIHRhcmdldC5sb2NrZWQ/DQogICAgICBwcmV2aW91c19kaWFsb2cgPSBAZGlhbG9nDQogICAgICBAZGlhbG9nID0gbmlsDQogICAgICBwcmV2aW91c19kaWFsb2cuY2xvc2UgaWYgcHJldmlvdXNfZGlhbG9nICYmIHByZXZpb3VzX2RpYWxvZy52aXNpYmxlPw0KICAgICAgbW9kZWwgPSBTa2V0Y2h1cC5hY3RpdmVfbW9kZWwNCiAgICAgIGNvbnRleHQgPSBtb2RlbC5hY3RpdmVfcGF0aA0KICAgICAgZiA9IGNhYmluZXRfZnJhbWUodGFyZ2V0LCBmcm9udCkNCiAgICAgIGMgPSBkZWZhdWx0cygoZls6d2lkdGhdICogZls6c3hdKS50b19tbSwgKGZbOmRlcHRoXSAqIGZbOnN5XSkudG9fbW0sIChmWzpoZWlnaHRdICogZls6c3pdKS50b19tbSkNCiAgICAgIHRyYW5zZm9ybSA9IGZbOnRyYW5zZm9ybV0NCiAgICAgICMgS2VlcCBvcmlnaW4vb3JpZW50YXRpb24vcmVmbGVjdGlvbjsgYWxsIG5ldyBnZW9tZXRyeSB1c2VzIGFjdHVhbCBtaWxsaW1ldHJlcy4NCiAgICAgIHBvc2UgPSBHZW9tOjpUcmFuc2Zvcm1hdGlvbi5heGVzKHRyYW5zZm9ybS5vcmlnaW4sIHRyYW5zZm9ybS54YXhpcy5ub3JtYWxpemUsIHRyYW5zZm9ybS55YXhpcy5ub3JtYWxpemUsIHRyYW5zZm9ybS56YXhpcy5ub3JtYWxpemUpDQogICAgICBvcmlnaW5hbF90cmFuc2Zvcm0gPSB0YXJnZXQudHJhbnNmb3JtYXRpb24udG9fYQ0KICAgICAgZGlhbG9nID0gVUk6Okh0bWxEaWFsb2cubmV3KGRpYWxvZ190aXRsZTogJ0pHUklUIOqwgOq1rCDsiqTtipzrlJTsmKQgMi4xLjYnLCBwcmVmZXJlbmNlc19rZXk6ICdKR1JJVC5DYWJpbmV0U3R1ZGlvJywgd2lkdGg6IDU0MCwgaGVpZ2h0OiA5MDAsIHJlc2l6YWJsZTogdHJ1ZSwgc3R5bGU6IFVJOjpIdG1sRGlhbG9nOjpTVFlMRV9ESUFMT0cpDQogICAgICBAZGlhbG9nID0gZGlhbG9nDQogICAgICBkaWFsb2cuc2V0X29uX2Nsb3NlZCB7IEBkaWFsb2cgPSBuaWwgaWYgQGRpYWxvZy5lcXVhbD8oZGlhbG9nKSB9DQogICAgICBkaWFsb2cuc2V0X2ZpbGUoRmlsZS5qb2luKF9fZGlyX18sICdlZGl0b3IuaHRtbCcpKQ0KICAgICAgZGlhbG9nLmFkZF9hY3Rpb25fY2FsbGJhY2soJ3JlYWR5JykgeyB8X3wNCiAgICAgICAgZGlhbG9nLmV4ZWN1dGVfc2NyaXB0KCJpbml0KCN7SlNPTi5nZW5lcmF0ZShjKX0sIGZhbHNlLCAje1NrZXRjaHVwLnJlYWRfZGVmYXVsdCgnSkdSSVQuQ2FiaW5ldFN0dWRpbycsICdwcmVzZXQnLCAnbnVsbCcpfSkiKQ0KICAgICAgfQ0KICAgICAgZGlhbG9nLmFkZF9hY3Rpb25fY2FsbGJhY2soJ3NhdmVfcHJlc2V0JykgeyB8XywganNvbnwNCiAgICAgICAgYmVnaW4NCiAgICAgICAgdmFsdWUsID0gdmFsaWRhdGVfY29uZmlnKEpTT04ucGFyc2UoanNvbikpDQogICAgICAgIFNrZXRjaHVwLndyaXRlX2RlZmF1bHQoJ0pHUklULkNhYmluZXRTdHVkaW8nLCAncHJlc2V0JywgSlNPTi5nZW5lcmF0ZSh2YWx1ZSkpDQogICAgICAgIGRpYWxvZy5leGVjdXRlX3NjcmlwdCgic3RhdHVzKCfrgrQg6riw67O4IOq1rOyEseycvOuhnCDsoIDsnqXtlojsirXri4jri6QuJykiKQ0KICAgICAgICByZXNjdWUgU3RhbmRhcmRFcnJvciA9PiBlcnJvcg0KICAgICAgICAgIGRpYWxvZy5leGVjdXRlX3NjcmlwdCgic3RhdHVzKCN7SlNPTi5nZW5lcmF0ZShlcnJvci5tZXNzYWdlKX0sIHRydWUpIikNCiAgICAgICAgZW5kDQogICAgICB9DQogICAgICBkaWFsb2cuYWRkX2FjdGlvbl9jYWxsYmFjaygnYXBwbHknKSBkbyB8XywganNvbnwNCiAgICAgICAgc3RhcnRlZCA9IGZhbHNlDQogICAgICAgIGJlZ2luDQogICAgICAgICAgcmFpc2UgJ+uMgOyDgeydtOuCmCDtjrjsp5Eg7JyE7LmY6rCAIOuzgOqyveuQkOyKteuLiOuLpC4g7LC97J2EIOuLpOyLnCDsl7TslrTso7zshLjsmpQuJyB1bmxlc3MgU2tldGNodXAuYWN0aXZlX21vZGVsID09IG1vZGVsICYmIHRhcmdldC52YWxpZD8gJiYgbW9kZWwuYWN0aXZlX3BhdGggPT0gY29udGV4dA0KICAgICAgICAgIHJhaXNlICfsnqDquLQg6rCd7LK07J6F64uI64ukLicgaWYgdGFyZ2V0LmxvY2tlZD8NCiAgICAgICAgICByYWlzZSAn7LC97J2EIOyXsCDrkqQg6rCA6rWs6rCAIOydtOuPmSDrmJDripQg67OA7ZiV65CQ7Iq164uI64ukLiDri6Tsi5wg7Je07Ja07KO87IS47JqULicgdW5sZXNzIHRhcmdldC50cmFuc2Zvcm1hdGlvbi50b19hID09IG9yaWdpbmFsX3RyYW5zZm9ybQ0KICAgICAgICAgIGNvbmZpZywgd2lkdGhzID0gdmFsaWRhdGVfY29uZmlnKEpTT04ucGFyc2UoanNvbikpDQogICAgICAgICAgbW9kZWwuc3RhcnRfb3BlcmF0aW9uKCdKR1JJVCDqsIDqtawg6rWs7ISxIOyggeyaqScsIHRydWUpDQogICAgICAgICAgc3RhcnRlZCA9IHRydWUNCiAgICAgICAgICByZXBsYWNlbWVudCA9IGdlbmVyYXRlX2NvbmZpZyhtb2RlbC5hY3RpdmVfZW50aXRpZXMsIGNvbmZpZywgd2lkdGhzKQ0KICAgICAgICAgIHJlcGxhY2VtZW50LnRyYW5zZm9ybWF0aW9uID0gcG9zZQ0KICAgICAgICAgIHJlcGxhY2VtZW50LnNldF9hdHRyaWJ1dGUoRElDVCwgJ3NvdXJjZV9wZXJzaXN0ZW50X2lkJywgdGFyZ2V0LnBlcnNpc3RlbnRfaWQpDQogICAgICAgICAgdGFyZ2V0LmhpZGRlbiA9IHRydWUNCiAgICAgICAgICByZXBsYWNlbWVudC5zZXRfYXR0cmlidXRlKERJQ1QsICdiYXNpcycsIEpTT04uZ2VuZXJhdGUoW3Bvc2UueGF4aXMubGVuZ3RoLCBwb3NlLnlheGlzLmxlbmd0aCwgcG9zZS56YXhpcy5sZW5ndGhdKSkNCiAgICAgICAgICBtb2RlbC5zZWxlY3Rpb24uY2xlYXINCiAgICAgICAgICBtb2RlbC5zZWxlY3Rpb24uYWRkKHJlcGxhY2VtZW50KQ0KICAgICAgICAgIG1vZGVsLmNvbW1pdF9vcGVyYXRpb24NCiAgICAgICAgICBzdGFydGVkID0gZmFsc2UNCiAgICAgICAgICBkaWFsb2cuY2xvc2UNCiAgICAgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3IgPT4gZXJyb3INCiAgICAgICAgICBtb2RlbC5hYm9ydF9vcGVyYXRpb24gaWYgc3RhcnRlZA0KICAgICAgICAgIGRpYWxvZy5leGVjdXRlX3NjcmlwdCgic3RhdHVzKCN7SlNPTi5nZW5lcmF0ZShlcnJvci5tZXNzYWdlKX0sIHRydWUpIikNCiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICAgIGRpYWxvZy5zaG93DQogICAgICBkaWFsb2cuY2VudGVyDQogICAgICBkaWFsb2cuYnJpbmdfdG9fZnJvbnQNCiAgICBlbmQNCg0KICAgIGRlZiBnZW5lcmF0ZV9jb25maWcocGFyZW50LCBjLCB3aWR0aHMpDQogICAgICBnID0gcGFyZW50LmFkZF9ncm91cA0KICAgICAgZy5uYW1lID0gIkpHUklUIOqwgOq1rCAje3dpZHRocy5sZW5ndGh97Lm4Ig0KICAgICAgZSA9IGcuZW50aXRpZXMNCiAgICAgIHcsIGQsIHRvdGFsX2gsIHQsIGIsIGdhcCwgcGggPSAld1t3aWR0aCBkZXB0aCBoZWlnaHQgcGFuZWwgYmFjayBnYXAgcGxpbnRoXS5tYXAgeyB8a3wgY1trXS5tbSB9DQogICAgICBjdCA9IGNbJ2NvdW50ZXJ0b3AnXS5tbQ0KICAgICAgaCA9IHRvdGFsX2ggLSBjdA0KICAgICAgYm9keSA9IFNrZXRjaHVwLmFjdGl2ZV9tb2RlbC5tYXRlcmlhbHNbQk9EWV9NQVRFUklBTF0gfHwgbWF0ZXJpYWwoU2tldGNodXAuYWN0aXZlX21vZGVsLCBCT0RZX01BVEVSSUFMLCBTa2V0Y2h1cDo6Q29sb3IubmV3KDIzOCwgMjM2LCAyMzApKQ0KICAgICAgc2hhZG93ID0gU2tldGNodXAuYWN0aXZlX21vZGVsLm1hdGVyaWFsc1tTSEFET1dfTUFURVJJQUxdIHx8IG1hdGVyaWFsKFNrZXRjaHVwLmFjdGl2ZV9tb2RlbCwgU0hBRE9XX01BVEVSSUFMLCBTa2V0Y2h1cDo6Q29sb3IubmV3KDcyLCA3MiwgNzApKQ0KICAgICAgYm94ID0gbGFtYmRhIHsgfG5hbWUsIHgwLCB5MCwgejAsIHgxLCB5MSwgejEsIG1hdCA9IGJvZHl8DQogICAgICAgIHBhcnQgPSBhZGRfYm94KGUsIG5hbWUsIHgwLCB5MCwgejAsIHgxLCB5MSwgejEsIG1hdCkNCiAgICAgICAgIyBJbmhlcml0IGdyb3VwIG1hdGVyaWFsLCBzbyBtYXRlcmlhbCBjaGFuZ2VzIHN1cnZpdmUgcmVnZW5lcmF0aW9uLg0KICAgICAgICBwYXJ0LmVudGl0aWVzLmdyZXAoU2tldGNodXA6OkZhY2UpLmVhY2ggeyB8ZmFjZXwgZmFjZS5tYXRlcmlhbCA9IG5pbDsgZmFjZS5iYWNrX21hdGVyaWFsID0gbmlsIH0NCiAgICAgICAgcGFydA0KICAgICAgfQ0KICAgICAgYm94LmNhbGwoJ+yijOy4oSDsuKHtjJAnLCAwLCB0LCBwaCwgdCwgZC1iLCBoKQ0KICAgICAgYm94LmNhbGwoJ+yjvOuwqSDsg4HtjJAnLCAwLCAwLCBoLCB3LCBkLCB0b3RhbF9oKSBpZiBjdCA+IDANCiAgICAgIGJveC5jYWxsKCfsmrDsuKEg7Lih7YyQJywgdy10LCB0LCBwaCwgdywgZC1iLCBoKQ0KICAgICAgYm94LmNhbGwoJ+2VmO2MkCcsIHQsIHQsIHBoLCB3LXQsIGQtYiwgcGgrdCkNCiAgICAgIGJveC5jYWxsKCfsg4HtjJAnLCB0LCB0LCBoLXQsIHctdCwgZC1iLCBoKSBpZiBjWyd0b3AnXQ0KICAgICAgYm94LmNhbGwoJ+uSt+2MkCcsIDAsIGQtYiwgcGgsIHcsIGQsIGgpDQogICAgICBib3guY2FsbCgn7ZWY67aAIOuwm+y5qCcsIDQwLm1tLCB0KzUwLm1tLCAwLCB3LTQwLm1tLCBkLTIwLm1tLCBwaCwgc2hhZG93KSBpZiBwaCA+IDANCiAgICAgIGJvdHRvbSA9IHBoK3QNCiAgICAgIHRvcCA9IGNbJ3RvcCddID8gaC10IDogaA0KICAgICAgY3Vyc29yID0gMC4wDQogICAgICB3aWR0aHMuZWFjaF93aXRoX2luZGV4IGRvIHxtbSwgaXwNCiAgICAgICAgcmlnaHQgPSBjdXJzb3IgKyBtbS5tbQ0KICAgICAgICBsZWZ0X2lubmVyID0gY3Vyc29yICsgKGkuemVybz8gPyB0IDogdC8yKQ0KICAgICAgICByaWdodF9pbm5lciA9IHJpZ2h0IC0gKGkgPT0gd2lkdGhzLmxlbmd0aC0xID8gdCA6IHQvMikNCiAgICAgICAgYm94LmNhbGwoIuy5uOunieydtCAje2l9IiwgY3Vyc29yLXQvMiwgdCwgYm90dG9tLCBjdXJzb3IrdC8yLCBkLWIsIHRvcCkgaWYgaSA+IDANCiAgICAgICAgYmF5ID0gY1snYmF5cyddW2ldDQogICAgICAgIGlmIGJheVsndHlwZSddICE9ICdkcmF3ZXJzJw0KICAgICAgICAgIGJheVsnc2hlbHZlcyddLnRpbWVzIGRvIHxqfA0KICAgICAgICAgICAgeiA9IGJvdHRvbSArICh0b3AtYm90dG9tKSooaisxKS8oYmF5WydzaGVsdmVzJ10rMSkgLSB0LzINCiAgICAgICAgICAgIGJveC5jYWxsKCLshKDrsJggI3tpKzF9LSN7aisxfSIsIGxlZnRfaW5uZXIsIHQrMjAubW0sIHosIHJpZ2h0X2lubmVyLCBkLWItNS5tbSwgeit0KQ0KICAgICAgICAgIGVuZA0KICAgICAgICBlbmQNCiAgICAgICAgaWYgYmF5Wyd0eXBlJ10gPT0gJ2Rvb3InDQogICAgICAgICAgY291bnQgPSBkb29yX2NvdW50KGJheSwgbW0pDQogICAgICAgICAgY291bnQudGltZXMgZG8gfGp8DQogICAgICAgICAgICBuYW1lID0gY291bnQgPT0gMSA/ICLrrLjsp50gI3tpKzF9IiA6ICLrrLjsp50gI3tpKzF9LSN7aisxfSINCiAgICAgICAgICAgIHgwID0gY3Vyc29yICsgbW0ubW0qai9jb3VudCArIGdhcC8yDQogICAgICAgICAgICB4MSA9IGN1cnNvciArIG1tLm1tKihqKzEpL2NvdW50IC0gZ2FwLzINCiAgICAgICAgICAgIGRvb3IgPSBib3guY2FsbChuYW1lLCB4MCwgMCwgcGgrZ2FwLCB4MSwgdCwgaC1nYXApDQogICAgICAgICAgICBkb29yLmhpZGRlbiA9ICEhY1snaGlkZV9mcm9udHMnXQ0KICAgICAgICAgICAgZG9vci5zZXRfYXR0cmlidXRlKERJQ1QsICdoaW5nZScsIGouZXZlbj8gPyAnbGVmdCcgOiAncmlnaHQnKQ0KICAgICAgICAgIGVuZA0KICAgICAgICBlbHNpZiBiYXlbJ3R5cGUnXSA9PSAnZHJhd2VycycNCiAgICAgICAgICBiYXlbJ2NvdW50J10udGltZXMgZG8gfGp8DQogICAgICAgICAgICB6MCA9IHBoICsgKGgtcGgpKmovYmF5Wydjb3VudCddDQogICAgICAgICAgICB6MSA9IHBoICsgKGgtcGgpKihqKzEpL2JheVsnY291bnQnXQ0KICAgICAgICAgICAgZmFjZSA9IGJveC5jYWxsKCLshJzrno0g7KCE66m0ICN7aSsxfS0je2orMX0iLCBjdXJzb3IrZ2FwLzIsIDAsIHowK2dhcCwgcmlnaHQtZ2FwLzIsIHQsIHoxLWdhcCkNCiAgICAgICAgICAgIGZhY2UuaGlkZGVuID0gISFjWydoaWRlX2Zyb250cyddDQogICAgICAgICAgICAjIFNpbXBsZSB3b29kZW4gZHJhd2VyIGJveCB3aXRoIHJhaWwgY2xlYXJhbmNlOyBoYXJkd2FyZSBpcyBub3QgZmFicmljYXRlZC4NCiAgICAgICAgICAgIGR4MCA9IGxlZnRfaW5uZXIrMTMubW07IGR4MSA9IHJpZ2h0X2lubmVyLTEzLm1tDQogICAgICAgICAgICBkeTAgPSB0KzEwLm1tOyBkeTEgPSBkLWItMjUubW0NCiAgICAgICAgICAgIGR6MCA9IFt6MCsxMi5tbSwgYm90dG9tKzQubW1dLm1heDsgZHoxID0gW3oxLTIwLm1tLCB0b3AtNC5tbV0ubWluDQogICAgICAgICAgICBib3guY2FsbCgi7ISc656NIOuwlOuLpSAje2krMX0tI3tqKzF9IiwgZHgwLCBkeTAsIGR6MCwgZHgxLCBkeTEsIGR6MCtiKQ0KICAgICAgICAgICAgYm94LmNhbGwoIuyEnOuejSDsoozsuKEgI3tpKzF9LSN7aisxfSIsIGR4MCwgZHkwLCBkejArYiwgZHgwK3QsIGR5MSwgZHoxKQ0KICAgICAgICAgICAgYm94LmNhbGwoIuyEnOuejSDsmrDsuKEgI3tpKzF9LSN7aisxfSIsIGR4MS10LCBkeTAsIGR6MCtiLCBkeDEsIGR5MSwgZHoxKQ0KICAgICAgICAgICAgYm94LmNhbGwoIuyEnOuejSDslZ7rsr0gI3tpKzF9LSN7aisxfSIsIGR4MCt0LCBkeTAsIGR6MCtiLCBkeDEtdCwgZHkwK3QsIGR6MSkNCiAgICAgICAgICAgIGJveC5jYWxsKCLshJzrno0g65K367K9ICN7aSsxfS0je2orMX0iLCBkeDArdCwgZHkxLXQsIGR6MCtiLCBkeDEtdCwgZHkxLCBkejEpDQogICAgICAgICAgZW5kDQogICAgICAgIGVuZA0KICAgICAgICBjdXJzb3IgPSByaWdodA0KICAgICAgZW5kDQogICAgICBhZGRfbWFudWZhY3R1cmluZ19tZXRhZGF0YShnLCAxLCAxLCAxKQ0KICAgICAgZy5zZXRfYXR0cmlidXRlKERJQ1QsICd2ZXJzaW9uJywgJzIuMS42JykNCiAgICAgIGcuc2V0X2F0dHJpYnV0ZShESUNULCAnY29uZmlnJywgSlNPTi5nZW5lcmF0ZShjKSkNCiAgICAgIGcuc2V0X2F0dHJpYnV0ZShESUNULCAnYmFzaXMnLCAnWzEsMSwxXScpDQogICAgICAld1t3aWR0aCBkZXB0aCBoZWlnaHRdLmVhY2ggeyB8a3wgZy5zZXRfYXR0cmlidXRlKERJQ1QsICIje2t9X21tIiwgY1trXSkgfQ0KICAgICAgZw0KICAgIGVuZA0KICBlbmQNCmVuZA0KDQoNCg==",
    "jgrit_box_cabinet/LICENSE.txt" => "Q29weXJpZ2h0IMKpIDIwMjYgSkdSSVQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNCuuzuCDtmZXsnqUg6riw64ql7J2AIEpHUklU7J2YIOuCtOu2gCDrsI8g6rCc7J24IFNrZXRjaFVwIOyekeyXheyaqeycvOuhnCDsoJzqs7XrkKnri4jri6QuDQrsnqzrsLDtj6wg65iQ64qUIO2MkOunpCDsoITsl5DripQg7KCA7J6R6raM7J6Q7J2YIOuzhOuPhCDtl4jqsIDqsIAg7ZWE7JqU7ZWp64uI64ukLg0K",
    "jgrit_box_cabinet/main.rb" => "IyBmcm96ZW5fc3RyaW5nX2xpdGVyYWw6IHRydWUNCg0KcmVxdWlyZSAnc2tldGNodXAucmInDQoNCm1vZHVsZSBKR1JJVA0KICBtb2R1bGUgQm94Q2FiaW5ldA0KICAgIEVYVEVOU0lPTl9OQU1FID0gJ0pHUklUIEJveCBDYWJpbmV0JyB1bmxlc3MgY29uc3RfZGVmaW5lZD8oOkVYVEVOU0lPTl9OQU1FKQ0KICAgIFZFUlNJT04gPSAnMi4xLjYnIHVubGVzcyBjb25zdF9kZWZpbmVkPyg6VkVSU0lPTikNCg0KICAgIEJPRFlfTUFURVJJQUwgPSAnSkdSSVQgQ2FiaW5ldCAtIFdhcm0gV2hpdGUnDQogICAgU0hBRE9XX01BVEVSSUFMID0gJ0pHUklUIENhYmluZXQgLSBQbGludGggU2hhZG93Jw0KICAgIE1JTl9XSURUSCA9IDMwMC5tbQ0KICAgIE1JTl9ERVBUSCA9IDE4MC5tbQ0KICAgIE1JTl9IRUlHSFQgPSAyNTAubW0NCiAgICBQQU5FTF9USElDS05FU1MgPSAxOC5tbQ0KICAgIERPT1JfVEhJQ0tORVNTID0gMTgubW0NCiAgICBCQUNLX1RISUNLTkVTUyA9IDYubW0NCiAgICBET09SX0dBUCA9IDIubW0NCiAgICBNQVhfRE9PUl9XSURUSCA9IDQ1MC5tbQ0KICAgIE1BWF9TSEVMRl9PUEVOSU5HID0gNDUwLm1tDQogICAgU0hFTEZfRlJPTlRfU0VUQkFDSyA9IDIwLm1tDQogICAgU0hFTEZfQkFDS19DTEVBUkFOQ0UgPSA1Lm1tDQogICAgUExJTlRIX0hFSUdIVCA9IDYwLm1tDQogICAgUExJTlRIX1NJREVfU0VUQkFDSyA9IDQwLm1tDQogICAgUExJTlRIX0ZST05UX1NFVEJBQ0sgPSA1MC5tbQ0KICAgIFBMSU5USF9SRUFSX1NFVEJBQ0sgPSAyMC5tbQ0KDQogICAgbW9kdWxlX2Z1bmN0aW9uDQoNCiAgICBkZWYgc3RhcnRfdG9vbA0KICAgICAgU2tldGNodXAuYWN0aXZlX21vZGVsLnNlbGVjdF90b29sKENhYmluZXRUb29sLm5ldykNCiAgICBlbmQNCg0KICAgIGRlZiBjb250YWluZXI/KGVudGl0eSkNCiAgICAgIGVudGl0eS5pc19hPyhTa2V0Y2h1cDo6R3JvdXApIHx8IGVudGl0eS5pc19hPyhTa2V0Y2h1cDo6Q29tcG9uZW50SW5zdGFuY2UpDQogICAgZW5kDQoNCiAgICBkZWYgc29saWQ/KGVudGl0eSkNCiAgICAgIHJldHVybiBmYWxzZSB1bmxlc3MgY29udGFpbmVyPyhlbnRpdHkpDQoNCiAgICAgIGRlZmluaXRpb24gPSBlbnRpdHkuZGVmaW5pdGlvbg0KICAgICAgZGVmaW5pdGlvbi5yZXNwb25kX3RvPyg6bWFuaWZvbGQ/KSA/IGRlZmluaXRpb24ubWFuaWZvbGQ/IDogZW50aXR5Lm1hbmlmb2xkPw0KICAgIHJlc2N1ZSBTdGFuZGFyZEVycm9yDQogICAgICBmYWxzZQ0KICAgIGVuZA0KDQogICAgZGVmIG1hdGVyaWFsKG1vZGVsLCBuYW1lLCBjb2xvcikNCiAgICAgIHZhbHVlID0gbW9kZWwubWF0ZXJpYWxzW25hbWVdIHx8IG1vZGVsLm1hdGVyaWFscy5hZGQobmFtZSkNCiAgICAgIHZhbHVlLmNvbG9yID0gY29sb3INCiAgICAgIHZhbHVlDQogICAgZW5kDQoNCiAgICBkZWYgY2FiaW5ldF9mcmFtZShlbnRpdHksIGZyb250KQ0KICAgICAgZmFjZSA9IGZyb250LmlzX2E/KEhhc2gpID8gZnJvbnRbOmZhY2VdIDogbmlsDQogICAgICByYWlzZSAn67CV7Iqk7J2YIOyImOyngSDslZ7rqbTsnYQg7YG066at7ZWY7IS47JqULicgdW5sZXNzIGZhY2UgJiYgZmFjZS52YWxpZD8NCiAgICAgIHRyYW5zZm9ybSA9IGVudGl0eS50cmFuc2Zvcm1hdGlvbg0KICAgICAgd29ybGQgPSBTa2V0Y2h1cC5hY3RpdmVfbW9kZWwuZWRpdF90cmFuc2Zvcm0NCiAgICAgIHZlcnRpY2VzID0gZmFjZS5vdXRlcl9sb29wLnZlcnRpY2VzLm1hcCB7IHx2fCB2LnBvc2l0aW9uLnRyYW5zZm9ybSh0cmFuc2Zvcm0pIH0NCiAgICAgIGVkZ2VzID0gdmVydGljZXMuZWFjaF9pbmRleC5tYXAgeyB8aXwgdmVydGljZXNbKGkrMSkgJSB2ZXJ0aWNlcy5sZW5ndGhdIC0gdmVydGljZXNbaV0gfQ0KICAgICAgZWRnZXMucmVqZWN0ISB7IHx2fCB2Lmxlbmd0aCA8IDAuMDAxIH0NCiAgICAgIHVwID0gZWRnZXMubWF4X2J5IHsgfHZ8IHYudHJhbnNmb3JtKHdvcmxkKS5ub3JtYWxpemUuZG90KFpfQVhJUykuYWJzIH0NCiAgICAgIHJhaXNlICfsg4HtjJDsnbQg7JWE64uMIOyImOyngSDslZ7rqbTsnYQg7YG066at7ZWY7IS47JqULicgdW5sZXNzIHVwICYmIHVwLnRyYW5zZm9ybSh3b3JsZCkubm9ybWFsaXplLmRvdChaX0FYSVMpLmFicyA+IDAuNw0KICAgICAgdXAgPSB1cC5ub3JtYWxpemUNCiAgICAgIHVwLnJldmVyc2UhIGlmIHVwLnRyYW5zZm9ybSh3b3JsZCkuZG90KFpfQVhJUykgPCAwDQogICAgICBhY3Jvc3MgPSBlZGdlcy5maW5kIHsgfHZ8IHYubm9ybWFsaXplLmRvdCh1cCkuYWJzIDwgMC4wMSB9DQogICAgICByYWlzZSAn7KeB6rCB7J24IOuEpOuqqCDrsJXsiqTrpbwg7IKs7Jqp7ZWY7IS47JqULicgdW5sZXNzIGFjcm9zcw0KICAgICAgaW53YXJkID0gYWNyb3NzLmNyb3NzKHVwKS5ub3JtYWxpemUNCiAgICAgIGNlbnRlciA9IGVudGl0eS5kZWZpbml0aW9uLmJvdW5kcy5jZW50ZXIudHJhbnNmb3JtKHRyYW5zZm9ybSkNCiAgICAgIGlud2FyZC5yZXZlcnNlISBpZiAoY2VudGVyIC0gdmVydGljZXMuZmlyc3QpLmRvdChpbndhcmQpIDwgMA0KICAgICAgd2lkdGhfYXhpcyA9IGlud2FyZC5jcm9zcyh1cCkubm9ybWFsaXplDQogICAgICAjIE1lYXN1cmUgYWN0dWFsIGdlb21ldHJ5IGFsb25nIHRoZSBob3ZlcmVkIGZhY2UsIG5vdCB0aGUgZ3JvdXAncyBheGVzDQogICAgICAjIG9yIGl0cyBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94LiBUaGlzIGFsc28gaGFuZGxlcyByb3RhdGVkIGJveCBnZW9tZXRyeS4NCiAgICAgIHBvaW50cyA9IGVudGl0eS5kZWZpbml0aW9uLmVudGl0aWVzLmdyZXAoU2tldGNodXA6OkZhY2UpLmZsYXRfbWFwIHsgfGZ8IGYudmVydGljZXMubWFwIHsgfHZ8IHYucG9zaXRpb24udHJhbnNmb3JtKHRyYW5zZm9ybSkgfSB9DQogICAgICBvcmlnaW4gPSB2ZXJ0aWNlcy5maXJzdA0KICAgICAgYXhlcyA9IFt3aWR0aF9heGlzLCBpbndhcmQsIHVwXQ0KICAgICAgcmFuZ2VzID0gYXhlcy5tYXAgZG8gfGF4aXN8DQogICAgICAgIHZhbHVlcyA9IHBvaW50cy5tYXAgeyB8cG9pbnR8IChwb2ludC1vcmlnaW4pLmRvdChheGlzKSB9DQogICAgICAgIFt2YWx1ZXMubWluLCB2YWx1ZXMubWF4XQ0KICAgICAgZW5kDQogICAgICBjb3JuZXIgPSBvcmlnaW4NCiAgICAgIGF4ZXMuZWFjaF93aXRoX2luZGV4IHsgfGF4aXMsaXwgY29ybmVyID0gY29ybmVyLm9mZnNldChheGlzLCByYW5nZXNbaV1bMF0pIH0NCiAgICAgIGRpbWVuc2lvbnMgPSByYW5nZXMubWFwIHsgfGxvLGhpfCBoaS1sbyB9DQogICAgICByYWlzZSAn7KCV66m07J20IOuwleyKpOydmCDrsJTquaUg66m07J247KeAIO2ZleyduO2VmOyEuOyalC4nIGlmIHZlcnRpY2VzLmFueT8geyB8dnwgKCh2LWNvcm5lcikuZG90KGlud2FyZCkpLmFicyA+IDAuMS5tbSB9DQogICAgICB7dHJhbnNmb3JtOiBHZW9tOjpUcmFuc2Zvcm1hdGlvbi5heGVzKGNvcm5lciwgKmF4ZXMpLA0KICAgICAgIHdpZHRoOiBkaW1lbnNpb25zWzBdLCBkZXB0aDogZGltZW5zaW9uc1sxXSwgaGVpZ2h0OiBkaW1lbnNpb25zWzJdLCBzeDogMS4wLCBzeTogMS4wLCBzejogMS4wfQ0KICAgIGVuZA0KDQogICAgZGVmIGF4aXNfdmVjdG9yKGF4aXMsIHNpZ24pDQogICAgICB2YWx1ZXMgPSBbMC4wLCAwLjAsIDAuMF0NCiAgICAgIHZhbHVlc1theGlzXSA9IHNpZ24udG9fZg0KICAgICAgR2VvbTo6VmVjdG9yM2QubmV3KCp2YWx1ZXMpDQogICAgZW5kDQoNCiAgICBkZWYgc2NhbGVkX2RpbWVuc2lvbnMoZW50aXR5LCBmcm9udCkNCiAgICAgIGZyYW1lID0gY2FiaW5ldF9mcmFtZShlbnRpdHksIGZyb250KQ0KICAgICAgWw0KICAgICAgICBmcmFtZVs6d2lkdGhdICogZnJhbWVbOnN4XSwNCiAgICAgICAgZnJhbWVbOmRlcHRoXSAqIGZyYW1lWzpzeV0sDQogICAgICAgIGZyYW1lWzpoZWlnaHRdICogZnJhbWVbOnN6XQ0KICAgICAgXQ0KICAgIGVuZA0KDQogICAgZGVmIHZhbGlkX3NpemU/KGVudGl0eSwgZnJvbnQpDQogICAgICB3aWR0aCwgZGVwdGgsIGhlaWdodCA9IHNjYWxlZF9kaW1lbnNpb25zKGVudGl0eSwgZnJvbnQpDQogICAgICB3aWR0aCA+PSBNSU5fV0lEVEggJiYgZGVwdGggPj0gTUlOX0RFUFRIICYmIGhlaWdodCA+PSBNSU5fSEVJR0hUDQogICAgZW5kDQoNCiAgICBkZWYgZm9ybWF0X2RpbWVuc2lvbnMoZW50aXR5LCBmcm9udCkNCiAgICAgIHdpZHRoLCBkZXB0aCwgaGVpZ2h0ID0gc2NhbGVkX2RpbWVuc2lvbnMoZW50aXR5LCBmcm9udCkNCiAgICAgICIje3dpZHRoLnRvX21tLnJvdW5kfSDDlyAje2RlcHRoLnRvX21tLnJvdW5kfSDDlyAje2hlaWdodC50b19tbS5yb3VuZH0gbW0iDQogICAgZW5kDQoNCiAgICBkZWYgZnJvbnRfZnJvbV9mYWNlKGVudGl0eSwgZmFjZSkNCiAgICAgIHJldHVybiBuaWwgdW5sZXNzIGZhY2UuaXNfYT8oU2tldGNodXA6OkZhY2UpDQogICAgICByZXR1cm4gbmlsIHVubGVzcyBlbnRpdHkuZGVmaW5pdGlvbi5lbnRpdGllcy5pbmNsdWRlPyhmYWNlKQ0KICAgICAgZnJvbnQgPSB7IGZhY2U6IGZhY2UgfQ0KICAgICAgY2FiaW5ldF9mcmFtZShlbnRpdHksIGZyb250KQ0KICAgICAgZnJvbnQNCiAgICByZXNjdWUgU3RhbmRhcmRFcnJvcg0KICAgICAgbmlsDQogICAgZW5kDQoNCiAgICBkZWYgaGluZ2VfY291bnRfZm9yKGRvb3JfaGVpZ2h0KQ0KICAgICAgcmV0dXJuIDIgaWYgZG9vcl9oZWlnaHQgPD0gOTAwLm1tDQogICAgICByZXR1cm4gMyBpZiBkb29yX2hlaWdodCA8PSAxXzYwMC5tbQ0KICAgICAgcmV0dXJuIDQgaWYgZG9vcl9oZWlnaHQgPD0gMl8xMDAubW0NCg0KICAgICAgNQ0KICAgIGVuZA0KDQogICAgZGVmIGhpbmdlX3Bvc2l0aW9uc19mb3IoZG9vcl9oZWlnaHQsIGNvdW50KQ0KICAgICAgZWRnZV9vZmZzZXQgPSBbMTAwLm1tLCBkb29yX2hlaWdodCAvIDQuMF0ubWluDQogICAgICByZXR1cm4gW2VkZ2Vfb2Zmc2V0LnRvX21tLCAoZG9vcl9oZWlnaHQgLSBlZGdlX29mZnNldCkudG9fbW1dIGlmIGNvdW50ID09IDINCg0KICAgICAgdHJhdmVsID0gZG9vcl9oZWlnaHQgLSAoZWRnZV9vZmZzZXQgKiAyLjApDQogICAgICAoMC4uLmNvdW50KS5tYXAgZG8gfGluZGV4fA0KICAgICAgICAoZWRnZV9vZmZzZXQgKyAodHJhdmVsICogaW5kZXggLyAoY291bnQgLSAxKS50b19mKSkudG9fbW0NCiAgICAgIGVuZA0KICAgIGVuZA0KDQogICAgZGVmIGFkZF9tYW51ZmFjdHVyaW5nX21ldGFkYXRhKGNhYmluZXQsIHN4LCBzeSwgc3opDQogICAgICBjYWJpbmV0LmVudGl0aWVzLmdyZXAoU2tldGNodXA6Okdyb3VwKS5lYWNoIGRvIHxwYXJ0fA0KICAgICAgICBib3VuZHMgPSBwYXJ0LmJvdW5kcw0KICAgICAgICBkaW1lbnNpb25zID0gWw0KICAgICAgICAgIChib3VuZHMud2lkdGggKiBzeCkudG9fbW0sDQogICAgICAgICAgKGJvdW5kcy5kZXB0aCAqIHN5KS50b19tbSwNCiAgICAgICAgICAoYm91bmRzLmhlaWdodCAqIHN6KS50b19tbQ0KICAgICAgICBdLnNvcnQNCiAgICAgICAgZWRnZV9iYW5kaW5nID0gY2FzZSBwYXJ0Lm5hbWUNCiAgICAgICAgICAgICAgICAgICAgICAgd2hlbiAv66y47KedLw0KICAgICAgICAgICAgICAgICAgICAgICAgICc066m0IEFCUyAxfjIgbW0nDQogICAgICAgICAgICAgICAgICAgICAgIHdoZW4gL+yEoOuwmHzsuKHtjJB87IOB7YyQfO2VmO2MkHzsubjrp4nsnbQvDQogICAgICAgICAgICAgICAgICAgICAgICAgJ+yVniAx66m0IEFCUyAxfjIgbW0nDQogICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAn7JeG7J2MJw0KICAgICAgICAgICAgICAgICAgICAgICBlbmQNCiAgICAgICAgcGFydC5zZXRfYXR0cmlidXRlKCdKR1JJVCBNYW51ZmFjdHVyaW5nJywgJ3RoaWNrbmVzc19tbScsIGRpbWVuc2lvbnNbMF0ucm91bmQoMSkpDQogICAgICAgIHBhcnQuc2V0X2F0dHJpYnV0ZSgnSkdSSVQgTWFudWZhY3R1cmluZycsICdjdXRfd2lkdGhfbW0nLCBkaW1lbnNpb25zWzFdLnJvdW5kKDEpKQ0KICAgICAgICBwYXJ0LnNldF9hdHRyaWJ1dGUoJ0pHUklUIE1hbnVmYWN0dXJpbmcnLCAnY3V0X2xlbmd0aF9tbScsIGRpbWVuc2lvbnNbMl0ucm91bmQoMSkpDQogICAgICAgIHBhcnQuc2V0X2F0dHJpYnV0ZSgnSkdSSVQgTWFudWZhY3R1cmluZycsICdlZGdlX2JhbmRpbmcnLCBlZGdlX2JhbmRpbmcpDQogICAgICAgIHBhcnQuc2V0X2F0dHJpYnV0ZSgnSkdSSVQgTWFudWZhY3R1cmluZycsICdtYXRlcmlhbCcsIHBhcnQubWF0ZXJpYWwmLmRpc3BsYXlfbmFtZS50b19zKQ0KICAgICAgZW5kDQogICAgZW5kDQoNCiAgICBkZWYgYWRkX2JveChwYXJlbnRfZW50aXRpZXMsIG5hbWUsIHgwLCB5MCwgejAsIHgxLCB5MSwgejEsIG1hdGVyaWFsX3ZhbHVlKQ0KICAgICAgcmFpc2UgIiN7bmFtZX3snZgg7LmY7IiY6rCAIOyYrOuwlOultOyngCDslYrsirXri4jri6QuIiB1bmxlc3MgeDEgPiB4MCAmJiB5MSA+IHkwICYmIHoxID4gejANCg0KICAgICAgcGFydCA9IHBhcmVudF9lbnRpdGllcy5hZGRfZ3JvdXANCiAgICAgIHBhcnQubmFtZSA9IG5hbWUNCiAgICAgIHBhcnQubWF0ZXJpYWwgPSBtYXRlcmlhbF92YWx1ZSBpZiBtYXRlcmlhbF92YWx1ZQ0KICAgICAgZW50aXRpZXMgPSBwYXJ0LmVudGl0aWVzDQoNCiAgICAgIHAwMDAgPSBHZW9tOjpQb2ludDNkLm5ldyh4MCwgeTAsIHowKQ0KICAgICAgcDEwMCA9IEdlb206OlBvaW50M2QubmV3KHgxLCB5MCwgejApDQogICAgICBwMTEwID0gR2VvbTo6UG9pbnQzZC5uZXcoeDEsIHkxLCB6MCkNCiAgICAgIHAwMTAgPSBHZW9tOjpQb2ludDNkLm5ldyh4MCwgeTEsIHowKQ0KICAgICAgcDAwMSA9IEdlb206OlBvaW50M2QubmV3KHgwLCB5MCwgejEpDQogICAgICBwMTAxID0gR2VvbTo6UG9pbnQzZC5uZXcoeDEsIHkwLCB6MSkNCiAgICAgIHAxMTEgPSBHZW9tOjpQb2ludDNkLm5ldyh4MSwgeTEsIHoxKQ0KICAgICAgcDAxMSA9IEdlb206OlBvaW50M2QubmV3KHgwLCB5MSwgejEpDQoNCiAgICAgIGZhY2VzID0gWw0KICAgICAgICBlbnRpdGllcy5hZGRfZmFjZShwMDAwLCBwMDEwLCBwMTEwLCBwMTAwKSwNCiAgICAgICAgZW50aXRpZXMuYWRkX2ZhY2UocDAwMSwgcDEwMSwgcDExMSwgcDAxMSksDQogICAgICAgIGVudGl0aWVzLmFkZF9mYWNlKHAwMDAsIHAxMDAsIHAxMDEsIHAwMDEpLA0KICAgICAgICBlbnRpdGllcy5hZGRfZmFjZShwMDEwLCBwMDExLCBwMTExLCBwMTEwKSwNCiAgICAgICAgZW50aXRpZXMuYWRkX2ZhY2UocDAwMCwgcDAwMSwgcDAxMSwgcDAxMCksDQogICAgICAgIGVudGl0aWVzLmFkZF9mYWNlKHAxMDAsIHAxMTAsIHAxMTEsIHAxMDEpDQogICAgICBdLmNvbXBhY3QNCg0KICAgICAgZmFjZXMuZWFjaCBkbyB8ZmFjZXwNCiAgICAgICAgZmFjZS5tYXRlcmlhbCA9IG1hdGVyaWFsX3ZhbHVlDQogICAgICAgIGZhY2UuYmFja19tYXRlcmlhbCA9IG1hdGVyaWFsX3ZhbHVlDQogICAgICBlbmQNCg0KICAgICAgcGFydC5zZXRfYXR0cmlidXRlKCdKR1JJVCBCb3ggQ2FiaW5ldCcsICdwYXJ0X25hbWUnLCBuYW1lKQ0KICAgICAgcGFydA0KICAgIGVuZA0KDQogICAgY2xhc3MgQ2FiaW5ldFRvb2wNCiAgICAgIGRlZiBhY3RpdmF0ZQ0KICAgICAgICBAaG92ZXJlZF90YXJnZXQgPSBuaWwNCiAgICAgICAgQGhvdmVyZWRfZnJvbnQgPSBuaWwNCiAgICAgICAgdXBkYXRlX3N0YXR1cw0KICAgICAgZW5kDQoNCiAgICAgIGRlZiByZXN1bWUodmlldykNCiAgICAgICAgdXBkYXRlX3N0YXR1cw0KICAgICAgICB2aWV3LmludmFsaWRhdGUNCiAgICAgIGVuZA0KDQogICAgICBkZWYgZGVhY3RpdmF0ZSh2aWV3KQ0KICAgICAgICB2aWV3LmludmFsaWRhdGUgaWYgdmlldw0KICAgICAgZW5kDQoNCiAgICAgIGRlZiBvbkNhbmNlbChfcmVhc29uLCB2aWV3KQ0KICAgICAgICBAaG92ZXJlZF90YXJnZXQgPSBuaWwNCiAgICAgICAgQGhvdmVyZWRfZnJvbnQgPSBuaWwNCiAgICAgICAgU2tldGNodXAuc2V0X3N0YXR1c190ZXh0KCdKR1JJVCBCb3ggQ2FiaW5ldCDrj4Tqtazrpbwg7KKF66OM7ZaI7Iq164uI64ukLicsIFNCX1BST01QVCkNCiAgICAgICAgU2tldGNodXAuYWN0aXZlX21vZGVsLnNlbGVjdF90b29sKG5pbCkNCiAgICAgICAgdmlldy5pbnZhbGlkYXRlIGlmIHZpZXcNCiAgICAgIGVuZA0KDQogICAgICBkZWYgb25Nb3VzZU1vdmUoX2ZsYWdzLCB4LCB5LCB2aWV3KQ0KICAgICAgICB0YXJnZXQsIGZyb250ID0gcGlja190YXJnZXRfYW5kX2Zyb250KHZpZXcsIHgsIHkpDQogICAgICAgIHJldHVybiBpZiB0YXJnZXQgPT0gQGhvdmVyZWRfdGFyZ2V0ICYmIGZyb250ID09IEBob3ZlcmVkX2Zyb250DQoNCiAgICAgICAgQGhvdmVyZWRfdGFyZ2V0ID0gdGFyZ2V0DQogICAgICAgIEBob3ZlcmVkX2Zyb250ID0gZnJvbnQNCiAgICAgICAgdXBkYXRlX3N0YXR1cyh0YXJnZXQgJiYgZnJvbnQgPyAn7KCV66m0IOq4sOykgDogJyArIEJveENhYmluZXQuZm9ybWF0X2RpbWVuc2lvbnModGFyZ2V0LCBmcm9udCkgOiBuaWwpDQogICAgICAgIHZpZXcuaW52YWxpZGF0ZQ0KICAgICAgZW5kDQoNCiAgICAgIGRlZiBvbkxCdXR0b25Eb3duKF9mbGFncywgeCwgeSwgdmlldykNCiAgICAgICAgdGFyZ2V0LCBmcm9udCA9IHBpY2tfdGFyZ2V0X2FuZF9mcm9udCh2aWV3LCB4LCB5KQ0KICAgICAgICB1bmxlc3MgdGFyZ2V0DQogICAgICAgICAgVUkuYmVlcA0KICAgICAgICAgIHVwZGF0ZV9zdGF0dXMoJ+q3uOujuSDrmJDripQg7Lu07Y+s64SM7Yq466GcIOunjOuToCDrhKTrqqgg67CV7Iqk7J2YIOuptOydhCDtgbTrpq3tlZjshLjsmpQuJykNCiAgICAgICAgICByZXR1cm4NCiAgICAgICAgZW5kDQoNCiAgICAgICAgdW5sZXNzIGZyb250DQogICAgICAgICAgVUkuYmVlcA0KICAgICAgICAgIHVwZGF0ZV9zdGF0dXMoJ+yDge2MkOydtCDslYTri4wsIOusuOynneydhCDrsLDsuZjtlaAg7IiY7KeBIOyVnuuptOydhCDtgbTrpq3tlZjshLjsmpQuJykNCiAgICAgICAgICByZXR1cm4NCiAgICAgICAgZW5kDQoNCiAgICAgICAgaWYgdGFyZ2V0LmxvY2tlZD8NCiAgICAgICAgICBVSS5iZWVwDQogICAgICAgICAgdXBkYXRlX3N0YXR1cygn7J6g6ri0IOqwneyytOyeheuLiOuLpC4g7J6g6riI7J2EIO2VtOygnO2VnCDrkqQg64uk7IucIO2BtOumre2VmOyEuOyalC4nKQ0KICAgICAgICAgIHJldHVybg0KICAgICAgICBlbmQNCg0KICAgICAgICB1bmxlc3MgQm94Q2FiaW5ldC5zb2xpZD8odGFyZ2V0KQ0KICAgICAgICAgIFVJLmJlZXANCiAgICAgICAgICB1cGRhdGVfc3RhdHVzKCfri6vtnowg7IaU66as65OcIOq3uOujuS/su7Ttj6zrhIztirjrp4wg7IKs7Jqp7ZWgIOyImCDsnojsirXri4jri6QuJykNCiAgICAgICAgICByZXR1cm4NCiAgICAgICAgZW5kDQoNCiAgICAgICAgdW5sZXNzIEJveENhYmluZXQudmFsaWRfc2l6ZT8odGFyZ2V0LCBmcm9udCkNCiAgICAgICAgICBVSS5iZWVwDQogICAgICAgICAgdXBkYXRlX3N0YXR1cygn67CV7Iqk6rCAIOuEiOustCDsnpHsirXri4jri6QuIOy1nOyGjCAzMDAgw5cgMTgwIMOXIDI1MCBtbeqwgCDtlYTsmpTtlanri4jri6QuJykNCiAgICAgICAgICByZXR1cm4NCiAgICAgICAgZW5kDQoNCiAgICAgICAgQm94Q2FiaW5ldC5vcGVuX2VkaXRvcih0YXJnZXQsIGZyb250KQ0KICAgICAgICBTa2V0Y2h1cC5hY3RpdmVfbW9kZWwuc2VsZWN0X3Rvb2wobmlsKQ0KICAgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3IgPT4gZXJyb3INCiAgICAgICAgVUkubWVzc2FnZWJveCgiSkdSSVQgQm94IENhYmluZXQg7Iuk7ZaJIOykkSDrrLjsoJzqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxuXG4je2Vycm9yLm1lc3NhZ2V9IikNCiAgICAgICAgdXBkYXRlX3N0YXR1cygn7J6R7JeF7J20IOy3qOyGjOuQmOyXiOyKteuLiOuLpC4g7JuQ67O4IOuwleyKpOuKlCDqt7jrjIDroZwg7Jyg7KeA65Cp64uI64ukLicpDQogICAgICAgIHZpZXcuaW52YWxpZGF0ZSBpZiB2aWV3DQogICAgICBlbmQNCg0KICAgICAgZGVmIGRyYXcodmlldykNCiAgICAgICAgcmV0dXJuIHVubGVzcyBAaG92ZXJlZF90YXJnZXQmLnZhbGlkPyAmJiBAaG92ZXJlZF9mcm9udA0KDQogICAgICAgIGZyYW1lID0gQm94Q2FiaW5ldC5jYWJpbmV0X2ZyYW1lKEBob3ZlcmVkX3RhcmdldCwgQGhvdmVyZWRfZnJvbnQpDQogICAgICAgIHRyYW5zZm9ybSA9IFNrZXRjaHVwLmFjdGl2ZV9tb2RlbC5lZGl0X3RyYW5zZm9ybSAqIGZyYW1lWzp0cmFuc2Zvcm1dDQogICAgICAgIHdpZHRoID0gZnJhbWVbOndpZHRoXQ0KICAgICAgICBoZWlnaHQgPSBmcmFtZVs6aGVpZ2h0XQ0KICAgICAgICBmcm9udF9wb2ludHMgPSBbDQogICAgICAgICAgR2VvbTo6UG9pbnQzZC5uZXcoMCwgMCwgMCkudHJhbnNmb3JtKHRyYW5zZm9ybSksDQogICAgICAgICAgR2VvbTo6UG9pbnQzZC5uZXcod2lkdGgsIDAsIDApLnRyYW5zZm9ybSh0cmFuc2Zvcm0pLA0KICAgICAgICAgIEdlb206OlBvaW50M2QubmV3KHdpZHRoLCAwLCBoZWlnaHQpLnRyYW5zZm9ybSh0cmFuc2Zvcm0pLA0KICAgICAgICAgIEdlb206OlBvaW50M2QubmV3KDAsIDAsIGhlaWdodCkudHJhbnNmb3JtKHRyYW5zZm9ybSkNCiAgICAgICAgXQ0KICAgICAgICBjZW50ZXJfYm90dG9tID0gR2VvbTo6UG9pbnQzZC5uZXcod2lkdGggLyAyLjAsIDAsIDApLnRyYW5zZm9ybSh0cmFuc2Zvcm0pDQogICAgICAgIGNlbnRlcl90b3AgPSBHZW9tOjpQb2ludDNkLm5ldyh3aWR0aCAvIDIuMCwgMCwgaGVpZ2h0KS50cmFuc2Zvcm0odHJhbnNmb3JtKQ0KICAgICAgICB2aWV3LmRyYXdpbmdfY29sb3IgPSBTa2V0Y2h1cDo6Q29sb3IubmV3KDIwLCAxOTAsIDEwMCkNCiAgICAgICAgdmlldy5saW5lX3dpZHRoID0gMw0KICAgICAgICB2aWV3LmRyYXcoR0xfTElORV9MT09QLCBmcm9udF9wb2ludHMpDQogICAgICAgIHZpZXcuZHJhdyhHTF9MSU5FUywgW2NlbnRlcl9ib3R0b20sIGNlbnRlcl90b3BdKQ0KICAgICAgICB2aWV3LmRyYXdfdGV4dChjZW50ZXJfdG9wLCAn7KCV66m0IMK3IOqwgOuhnCDDlyDquYrsnbQgw5cg64aS7J20OiAnICsgQm94Q2FiaW5ldC5mb3JtYXRfZGltZW5zaW9ucyhAaG92ZXJlZF90YXJnZXQsIEBob3ZlcmVkX2Zyb250KSkNCiAgICAgIHJlc2N1ZSBTdGFuZGFyZEVycm9yDQogICAgICAgICMgRnJvbnQtZmFjZSBwcmV2aWV3IGlzIG9wdGlvbmFsOyBjYWJpbmV0IGdlbmVyYXRpb24gcmVtYWlucyBhdmFpbGFibGUuDQogICAgICBlbmQNCg0KICAgICAgcHJpdmF0ZQ0KDQogICAgICBkZWYgcGlja190YXJnZXRfYW5kX2Zyb250KHZpZXcsIHgsIHkpDQogICAgICAgIGhlbHBlciA9IHZpZXcucGlja19oZWxwZXINCiAgICAgICAgaGVscGVyLmRvX3BpY2soeCwgeSkNCiAgICAgICAgaGVscGVyLmNvdW50LnRpbWVzIGRvIHxpbmRleHwNCiAgICAgICAgICBwYXRoID0gaGVscGVyLnBhdGhfYXQoaW5kZXgpDQogICAgICAgICAgbmV4dCB1bmxlc3MgcGF0aA0KDQogICAgICAgICAgdGFyZ2V0X2luZGV4ID0gcGF0aC5pbmRleCB7IHxpdGVtfCBCb3hDYWJpbmV0LmNvbnRhaW5lcj8oaXRlbSkgfQ0KICAgICAgICAgIG5leHQgdW5sZXNzIHRhcmdldF9pbmRleA0KDQogICAgICAgICAgdGFyZ2V0ID0gcGF0aFt0YXJnZXRfaW5kZXhdDQogICAgICAgICAgZmFjZSA9IHBhdGhbKHRhcmdldF9pbmRleCArIDEpLi4tMV0uZmluZCB7IHxpdGVtfCBpdGVtLmlzX2E/KFNrZXRjaHVwOjpGYWNlKSB9DQogICAgICAgICAgcmV0dXJuIFt0YXJnZXQsIEJveENhYmluZXQuZnJvbnRfZnJvbV9mYWNlKHRhcmdldCwgZmFjZSldDQogICAgICAgIGVuZA0KICAgICAgICBwaWNrZWQgPSBoZWxwZXIuYmVzdF9waWNrZWQNCiAgICAgICAgQm94Q2FiaW5ldC5jb250YWluZXI/KHBpY2tlZCkgPyBbcGlja2VkLCBuaWxdIDogW25pbCwgbmlsXQ0KICAgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3INCiAgICAgICAgW25pbCwgbmlsXQ0KICAgICAgZW5kDQoNCiAgICAgIGRlZiB1cGRhdGVfc3RhdHVzKHByZWZpeCA9IG5pbCkNCiAgICAgICAgbWVzc2FnZSA9ICfrsJXsiqTsnZgg7IiY7KeBIOyVnuuptOydhCDtgbTrpq3tlZjrqbQg6rCA6rWsIOq1rOyEsSDssL3snbQg7Je066a964uI64ukLiDCtyBFc2Mg7KKF66OMJw0KICAgICAgICBtZXNzYWdlID0gIiN7cHJlZml4fSAgfCAgI3ttZXNzYWdlfSIgaWYgcHJlZml4DQogICAgICAgIFNrZXRjaHVwLnNldF9zdGF0dXNfdGV4dChtZXNzYWdlLCBTQl9QUk9NUFQpDQogICAgICBlbmQNCiAgICBlbmQNCg0KICAgIHJlcXVpcmVfcmVsYXRpdmUgJ2VkaXRvcicKICAgIHJlcXVpcmVfcmVsYXRpdmUgJ3VpJw0KDQogICAgdW5sZXNzIGZpbGVfbG9hZGVkPyhfX0ZJTEVfXykNCiAgICAgIGNvbW1hbmQgPSBVSTo6Q29tbWFuZC5uZXcoJ0pHUklUIOqwgOq1rCDrp4zrk6TquLAnKSB7IEJveENhYmluZXQuc3RhcnRfdG9vbCB9DQogICAgICBjb21tYW5kLnRvb2x0aXAgPSAnSkdSSVQg6rCA6rWsIOyKpO2KnOuUlOyYpCDigJQg67CV7IqkIOyVnuuptCDtgbTrpq0g7ZuEIOq1rOyEsSDtjrjsp5EnDQogICAgICBjb21tYW5kLnN0YXR1c19iYXJfdGV4dCA9ICftgbTrpq3tlZwg7IiY7KeBIOuptOydhCDslZ7rqbTsnLzroZwg7IKs7Jqp7ZWY6rOgIOusuCDtj60g7LWc64yAIDQ1MCBtbSDquLDspIDsnLzroZwg66y47KedIOyImOulvCDsnpDrj5kg6rOE7IKw7ZWp64uI64ukLicNCg0KICAgICAgaWNvbl9kaXIgPSBGaWxlLmpvaW4oX19kaXJfXywgJ2ljb25zJykNCiAgICAgIGljb25fcGF0aCA9IEZpbGUuam9pbihpY29uX2RpciwgJ2JveF9jYWJpbmV0LnN2ZycpDQogICAgICBjb21tYW5kLnNtYWxsX2ljb24gPSBpY29uX3BhdGggaWYgRmlsZS5leGlzdD8oaWNvbl9wYXRoKQ0KICAgICAgY29tbWFuZC5sYXJnZV9pY29uID0gaWNvbl9wYXRoIGlmIEZpbGUuZXhpc3Q/KGljb25fcGF0aCkNCg0KICAgICAgSkdSSVQ6OlRvb2xzVUkucmVnaXN0ZXIoJ2JveF9jYWJpbmV0JywgY29tbWFuZCkKCiAgICAgIGZpbGVfbG9hZGVkKF9fRklMRV9fKQ0KICAgIGVuZA0KICBlbmQNCmVuZA0KDQoNCg0K",
    "jgrit_box_cabinet/README.txt" => "SkdSSVQg6rCA6rWsIOyKpO2KnOuUlOyYpCAyLjEuNg0KDQoxLiDsp4HsnKHrqbTssrQg67CV7Iqk66W8IOq3uOujueycvOuhnCDrp4zrk63ri4jri6QuDQoyLiDqsIDqtawg66eM65Ok6riwIOyVhOydtOy9mOydhCDriITrpoXri4jri6QuDQozLiDrrLjsnYQg64usIOuptOyXkCDsu6TshJzrpbwg7Jis66a964uI64ukLiDstIjroZ0g7YWM65GQ66as7JmAIOygleuptCDquLDspIAg7LmY7IiY6rCAIO2RnOyLnOuQqeuLiOuLpC4NCjQuIO2BtOumre2VmOuptCDqsIDroZwo7KCV66m0IOyijOyasCksIOq5iuydtCjsoJXrqbTsl5DshJwg65Kk7Kq9KSwg64aS7J20KOychOyVhOuemCnqsIAg7J6Q64+ZIOyeheugpeuQqeuLiOuLpC4NCjUuIOuCtOu2gCDqtazshLHqs7wg66y47Ked7J2EIOyEpOygle2VmOqzoCDqsIDqtawg7IOd7ISxIOuyhO2KvOydhCDriITrpoXri4jri6QuDQoNCuyDge2MkCDrjIDsi6Ag7IiY7KeBIOuptOydhCDtgbTrpq3tlZjshLjsmpQuIOuLpOuluCDqt7jro7kg64K067aA7J2YIOuwleyKpOuKlCDqt7gg6re466O57J2EIOyXsCDrkqQg7IKs7Jqp7ZWY7IS47JqULg0K7KeB7KCRIOyImOygle2VnCDsuZjsiJjripQg7Jyg7ZiV7J2EIOuwlOq/lOuPhCDsnKDsp4DrkJjrqbAsIOuwleyKpCDsuZjsiJgg64uk7IucIOu2iOufrOyYpOq4sOuhnCDrs7Xsm5DtlaAg7IiYIOyeiOyKteuLiOuLpC4NCuyZhOyEsSDrhpLsnbTripQg67Cb7LmoICsg66q47Ya1ICsg7KO867CpIOyDge2MkOydmCDtlansnoXri4jri6QuDQrsm5Drs7gg67CV7Iqk64qUIOyIqOqyqCDrs7TsobTtlanri4jri6QuIOyggeyaqSDtm4QgVW5kbyDtlZwg67KI7Jy866GcIOuQmOuPjOumveuLiOuLpC4NCg0K6rKA7KadOiBSdWJ5IOusuOuylSwgVUkg7J6Q64+ZIOyeheugpS/snKDtmJUg67OA6rK9IOycoOyngCwgMTbqsIDsp4Ag7KCV66m0IOqzhOyCsCDrqqjsnZgg6rKA7IKsIO2GteqzvC4NCg0KMi4xLjY6IOqwgOq1rCDsiJjsoJUg7JWE7J207L2Y6rO8IOuplOuJtOulvCDsoJzqsbDtlojsirXri4jri6QuIOygleuptCDquLDspIAg7J6Q64+ZIOy5mOyImCDsnoXroKXqs7wg6rCA6rWsIOunjOuTpOq4sOuKlCDsnKDsp4DrkKnri4jri6QuDQoK7ISk7LmYIO2bhCBTa2V0Y2hVcOydhCDri6Tsi5wg7Iuc7J6R7ZWY7IS47JqULiDrs7TquLAgPiDrj4Tqtawg66qo7J2MID4gSkdSSVQgVG9vbHPsl5DshJwg7ISk7LmY7ZWcIOujqOu5hOulvCDtlajqu5gg7IKs7Jqp7ZWgIOyImCDsnojsirXri4jri6QuIOqwgSDrj4TqtazripQg6rCc67OEIOyEpOy5mOuQqeuLiOuLpC4K",
    "jgrit_box_cabinet/icons/box_cabinet.svg" => "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj4KICA8cmVjdCB4PSIyLjUiIHk9IjUuNSIgd2lkdGg9IjI3IiBoZWlnaHQ9IjIxIiByeD0iMS41IiBmaWxsPSIjZjFlZmU5IiBzdHJva2U9IiMzMDM0M2IiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxwYXRoIGQ9Ik0xNiA2djIwIiBzdHJva2U9IiM3NzdiODIiIHN0cm9rZS13aWR0aD0iMS40Ii8+CiAgPHBhdGggZD0iTTYgMjhoMjAiIHN0cm9rZT0iIzMwMzQzYiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KICA8cGF0aCBkPSJNNyAyNnYyTTI1IDI2djIiIHN0cm9rZT0iIzMwMzQzYiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHBhdGggZD0iTTUgMy41aDIyIiBzdHJva2U9IiMzOWEwZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPgo=",
    "jgrit_box_cabinet/ui.rb" => "IyBmcm96ZW5fc3RyaW5nX2xpdGVyYWw6IHRydWUKbW9kdWxlIEpHUklUCiAgbW9kdWxlIFRvb2xzVUkKICAgIGRlZiBzZWxmLnJlZ2lzdGVyKGtleSwgY29tbWFuZCkKICAgICAgQGNvbW1hbmRzIHx8PSB7fQogICAgICByZXR1cm4gQGNvbW1hbmRzW2tleV0gaWYgQGNvbW1hbmRzW2tleV0KICAgICAgQG1lbnUgfHw9IFVJLm1lbnUoJ0V4dGVuc2lvbnMnKS5hZGRfc3VibWVudSgnSkdSSVQgVG9vbHMnKQogICAgICBAdG9vbGJhciB8fD0gVUk6OlRvb2xiYXIubmV3KCdKR1JJVCBUb29scycpCiAgICAgIEBjb21tYW5kc1trZXldID0gY29tbWFuZAogICAgICBAbWVudS5hZGRfaXRlbShjb21tYW5kKQogICAgICBAdG9vbGJhci5hZGRfaXRlbShjb21tYW5kKQogICAgICBAdG9vbGJhci5nZXRfbGFzdF9zdGF0ZSA9PSAtMSA/IEB0b29sYmFyLnNob3cgOiBAdG9vbGJhci5yZXN0b3JlCiAgICAgIGNvbW1hbmQKICAgIGVuZAogICAgZGVmIHNlbGYuYWRkKGtleSwgdGl0bGUsIGRlc2NyaXB0aW9uLCBpY29uX3BhdGggPSBuaWwsICZibG9jaykKICAgICAgY29tbWFuZCA9IFVJOjpDb21tYW5kLm5ldyh0aXRsZSwgJmJsb2NrKQogICAgICBjb21tYW5kLnRvb2x0aXAgPSB0aXRsZQogICAgICBjb21tYW5kLnN0YXR1c19iYXJfdGV4dCA9IGRlc2NyaXB0aW9uCiAgICAgIGljb25fcGF0aCB8fD0gRmlsZS5qb2luKF9fZGlyX18sICdpY29uLnN2ZycpCiAgICAgIGNvbW1hbmQuc21hbGxfaWNvbiA9IGNvbW1hbmQubGFyZ2VfaWNvbiA9IGljb25fcGF0aAogICAgICByZWdpc3RlcihrZXksIGNvbW1hbmQpCiAgICBlbmQKICBlbmQKZW5kCg=="
  }
  payload.each do |relative, encoded|
    target = File.join(destination, relative)
    FileUtils.mkdir_p(File.dirname(target))
    File.binwrite(target, Base64.strict_decode64(encoded))
  end
  UI.messagebox("JGRIT 설치가 완료되었습니다. SketchUp을 다시 시작한 뒤 도구 모음을 켜세요.")
rescue StandardError => error
  UI.messagebox("JGRIT 설치 실패: #{error.message}")
end
