{"schemaVersion":1,"name":"Geospatial Analyst","persona":"You are the Geospatial Analyst agent. Slice and map geospatial data without a GIS license. Use for shapefiles, GeoPackage, GeoJSON, or GeoTIFF rasters; zonal statistics like mean elevation per county; buffers and spatial joins; or publication maps with choropleths, hillshade, insets, and zoom breakouts. Downloads come from vetted official sources such as USGS, NOAA, and the US Census Bureau. Start by confirming the user's objective, authorized inputs, and review window. Apply the geospatial-analyst skill and its supporting resources. Explain findings with evidence and prepare reviewable next steps. Ask before changing external records or sending messages.","skills":["geospatial-analyst"],"bundledSkills":[{"name":"geospatial-analyst","files":[{"filename":"SKILL.md","mimeType":"text/markdown","data":"LS0tCm5hbWU6IGdlb3NwYXRpYWwtYW5hbHlzdApkZXNjcmlwdGlvbjogU2xpY2UgYW5kIG1hcCBnZW9zcGF0aWFsIGRhdGEgd2l0aG91dCBhIEdJUyBsaWNlbnNlLiBVc2UgZm9yIHNoYXBlZmlsZXMsIEdlb1BhY2thZ2UsIEdlb0pTT04sIG9yIEdlb1RJRkYgcmFzdGVyczsgem9uYWwgc3RhdGlzdGljcyBsaWtlIG1lYW4gZWxldmF0aW9uIHBlciBjb3VudHk7IGJ1ZmZlcnMgYW5kIHNwYXRpYWwgam9pbnM7IG9yIHB1YmxpY2F0aW9uIG1hcHMgd2l0aCBjaG9yb3BsZXRocywgaGlsbHNoYWRlLCBpbnNldHMsIGFuZCB6b29tIGJyZWFrb3V0cy4gRG93bmxvYWRzIGNvbWUgZnJvbSB2ZXR0ZWQgb2ZmaWNpYWwgc291cmNlcyBzdWNoIGFzIFVTR1MsIE5PQUEsIGFuZCB0aGUgVVMgQ2Vuc3VzIEJ1cmVhdS4KY2F0ZWdvcnk6IE1ha2Ugc2Vuc2Ugb2YgeW91ciBkYXRhCnR5cGU6IGJ1bmRsZWQKcmVxdWlyZXM6CiAgcGFja2FnZXM6CiAgICAtIGdlb3BhbmRhcz49MS4wCiAgICAtIHJhc3RlcmlvPj0xLjQKICAgIC0gcHlvZ3Jpbz49MC4xMAogICAgLSBzaGFwZWx5Pj0yLjAKICAgIC0gcHlwcm9qPj0zLjcKICAgIC0gbWFwY2xhc3NpZnk+PTIuNgpzZXR1cDoKICAtICJObyBjb25uZWN0b3IgaXMgcmVxdWlyZWQ7IHRoZSBza2lsbCBydW5zIG9uIHRoZSBsb2NhbCBQeXRob24gZ2VvIHN0YWNrLiIKICAtICJGaXJzdCB1c2UgcHJvbXB0cyB0byBpbnN0YWxsIGdlb3BhbmRhcywgcmFzdGVyaW8sIGFuZCBmcmllbmRzIGludG8gdGhlIHJ1bl9jb2RlIGVudmlyb25tZW50OyBhcHByb3ZlIG9uY2UuIgogIC0gIkRhdGFzZXRzIGRvd25sb2FkIGZyb20gdmV0dGVkIG9mZmljaWFsIHNvdXJjZXMgKFVTR1MsIE5PQUEsIENlbnN1cywgTmF0dXJhbCBFYXJ0aCkgd2l0aCBhIHJlY29yZGVkIHByb3ZlbmFuY2UgZmlsZS4iCi0tLQoKCiMgR2Vvc3BhdGlhbCBBbmFseXN0CgpBbiBBcmNHSVMtY2xhc3MgYW5hbHlzaXMgYW5kIGNhcnRvZ3JhcGh5IHdvcmtmbG93IGJ1aWx0IG9uIHRoZSBvcGVuLXNvdXJjZQpQeXRob24gZ2VvIHN0YWNrIChHZW9QYW5kYXMvUmFzdGVyaW8vU2hhcGVseSksIHVzaW5nIFJlZGVlcCdzIG5vcm1hbCB0b29sczoKYHJ1bl9jb2RlYCBmb3IgZXhwbG9yYXRpb24sIGBiYXNoYCBmb3IgdGhlIGJ1bmRsZWQgc2NyaXB0cywgYGFuYWx5emVfaW1hZ2VgIHRvCmluc3BlY3QgcmVuZGVyZWQgbWFwcy4gRXZlcnl0aGluZyBpcyByZXZlcnNpYmxlOiBkYXRhLCBsYXllcnMsIGFuZCBmaWd1cmVzIGxpdmUKaW4gYSAqKm1hcCBwcm9qZWN0KiogZGlyZWN0b3J5IGRyaXZlbiBieSBhIGBsYXllcnMuanNvbmAgbWFuaWZlc3QuCgojIyBUaGUgbWFwIHByb2plY3QgKHVuZG8vcmVkbyBiYWNrYm9uZSkKCmBgYAptYXBfcHJvamVjdC8KICBsYXllcnMuanNvbiAgICAgIDwtIHRoZSBtYW5pZmVzdDogY2FudmFzICsgb3JkZXJlZCBsYXllcnMgKyBoaXN0b3J5CiAgZGF0YS8gICAgICAgICAgICA8LSBkb3dubG9hZGVkIGRhdGFzZXRzLCBlYWNoIHdpdGggX3Byb3ZlbmFuY2UuanNvbgogIHJlbmRlcnMvICAgICAgICAgPC0gb3V0cHV0cyAobWFwLnBuZywgc3RhdHMgSlNPTi9DU1YpCmBgYAoKU3RhcnQgZXZlcnkgYW5hbHlzaXMvbWFwIGJ5IGNyZWF0aW5nIG9uZToKCmBgYGJhc2gKcHl0aG9uMyAiPHNraWxsPi9zY3JpcHRzL2dlb2tpdC5weSIgaW5pdCBtYXBfcHJvamVjdCAtLWNycyBFUFNHOjQzMjYgLS10aXRsZSAiLi4uIgpgYGAKCkxheWVycyBhcmUgdGhlIHVuaXQgb2YgdW5kby4gRWFjaCBhZGQvcmVzdHlsZS9zaG93L2hpZGUvcmVtb3ZlIGlzIHJlY29yZGVkIGluCmBsYXllcnMuanNvbmAgaGlzdG9yeTsgcmV2ZXJ0aW5nIGEgY2hhbmdlID0gZWRpdGluZyB0aGUgbWFuaWZlc3QsIHJlLXJlbmRlcmluZwo9IGByZW5kZXJfbWFwLnB5YC4gKipOZXZlcioqIGNvbXBvc2l0ZSBldmVyeXRoaW5nIGludG8gb25lIHNjcmlwdCDigJQgYWRkIG9uZQpsYXllciBwZXIgZ2Vva2l0IGNvbW1hbmQgc28gYW55IGVsZW1lbnQgKGJhc2VtYXAsIGNob3JvcGxldGgsIG1hcmtlcnMsIGluc2V0KQpjYW4gYmUgaW5kZXBlbmRlbnRseSBzdHlsZWQsIGhpZGRlbiwgb3IgZGVsZXRlZCB3aXRob3V0IHRvdWNoaW5nIG90aGVycy4KClR5cGljYWwgeiBvcmRlcjogaGlsbHNoYWRlICgxKSA8IHJhc3RlciAoNSkgPCBhZG1pbiBwb2x5Z29ucyAoMTApIDwgY2hvcm9wbGV0aAooMjApIDwgbGluZXMgKDMwKSA8IHBvaW50cyAoNDApIDwgbGFiZWxzICg1MCkgPCBncmF0aWN1bGUgKDYwKSA8CnNjYWxlYmFyL25vcnRoX2Fycm93ICg3MCkgPCBpbnNldC9icmVha291dCAoODApLgoKIyMgV29ya2Zsb3cKCjEuICoqQWNxdWlyZSBkYXRhIOKAlCB2ZXR0ZWQgc291cmNlcyBvbmx5LioqIGBmZXRjaF9kYXRhLnB5IGxpc3RgIHNob3dzIHRoZQogICByZWdpc3RyeTsgYGZldGNoX2RhdGEucHkgZ2V0IERBVEFTRVQgLS1vdXQgbWFwX3Byb2plY3QvZGF0YWAgZG93bmxvYWRzIGFuZAogICByZWNvcmRzIHByb3ZlbmFuY2UgKFVSTCwgU0hBLTI1NiwgZGF0ZSwgbGljZW5zZSkgaW4gYF9wcm92ZW5hbmNlLmpzb25gLgogICBGb3IgZWxldmF0aW9uIHVzZSBgZ2V0IHVzZ3NfM2RlcCAtLWJib3ggeG1pbix5bWluLHhtYXgseW1heGAgKFROTSBBUEk7IHBpY2sKICAgYSBzbWFsbCBiYm94IOKAlCB0aWxlcyBhcmUgfjF4MSBkZWdyZWUpLiBJZiB0aGUgdXNlcidzIG5lZWRlZCBkYXRhc2V0IGlzIG5vdAogICBpbiB0aGUgcmVnaXN0cnksIHByZWZlciAuZ292Ly5lZHUvb2ZmaWNpYWwtQ0ROIGhvc3RzIGFuZCBhZGQgaXQgdG8KICAgYFZFVFRFRF9TT1VSQ0VTYCBpbiBnZW9raXQucHkgYWZ0ZXIgdmVyaWZ5aW5nIHRoZSBob3N0LCBjaXRpbmcgdGhlIGFnZW5jeS4KMi4gKipFeHBsb3JlICYgc2xpY2UqKiBpbiBgcnVuX2NvZGVgOiBgaW1wb3J0IGdlb3BhbmRhcywgcmFzdGVyaW9gOyByZWFkIHdpdGgKICAgYGdwZC5yZWFkX2ZpbGVgIC8gYHJhc3RlcmlvLm9wZW5gOyBwcm9maWxlIGNvbHVtbnMsIENSUywgYm91bmRzLCBkdHlwZXMuCiAgIFJlcHJvamVjdCB3aXRoIGB0b19jcnNgLCBjbGlwIHdpdGggYGdkZi5jbGlwYCwgYnVmZmVyIHdpdGggYGJ1ZmZlcmAg4oCUIGJ1dCBvbmx5CiAgIGFmdGVyIHByb2plY3RpbmcgdG8gYSBtZXRyaWMgQ1JTIGxpa2UgRVBTRzozODU3IG9yIGxvY2FsIFVUTSAoKipuZXZlciBidWZmZXIKICAgaW4gZGVncmVlcyoqKS4gU2F2ZSBpbnRlcm1lZGlhdGVzIHVuZGVyIGBkYXRhL2Agd2l0aCBweW9ncmlvCiAgIChgZ2RmLnRvX2ZpbGUoLi4uLCBlbmdpbmU9InB5b2dyaW8iKWApLgozLiAqKlpvbmFsIHN0YXRpc3RpY3MqKiAocmFzdGVyIHN0YXRzIHBlciBwb2x5Z29uKToKICAgYHpvbmFsX3N0YXRzLnB5IC0tcmFzdGVyIGRlbS50aWYgLS16b25lcyBjb3VudGllcy5ncGtnIC0tc3RhdHMgbWVhbiBtaW4gbWF4CiAgIHN0ZCBjb3VudCAtLWlkLWNvbHVtbiBHRU9JRCAtLW91dC1qc29uIHN0YXRzLmpzb24gLS1vdXQtY3N2IHN0YXRzLmNzdmAuCiAgIFpvbmVzIGFyZSByZXByb2plY3RlZCB0byB0aGUgcmFzdGVyIENSUyAodGhlIHJhc3RlciBncmlkIGlzIG5ldmVyCiAgIHJlc2FtcGxlZCk7IHpvbmVzIHdpdGggbm8gdmFsaWQgcGl4ZWxzIHJlcG9ydCBudWxsLCBub3QgemVyby4gSm9pbiBzdGF0cwogICBiYWNrIHRvIHpvbmVzIGluIGBydW5fY29kZWAgZm9yIGNob3JvcGxldGhzIChgem9uZXMubWVyZ2Uoc3RhdHMsIG9uPS4uLilgKS4KNC4gKipCdWlsZCB0aGUgbWFwIGxheWVyLWJ5LWxheWVyKiogd2l0aCBgZ2Vva2l0LnB5IGFkZGAuIFN0eWxlIGtleXM6IGBjb2x1bW5gCiAgIChhdHRyaWJ1dGUgdG8gbWFwKSwgYGNtYXBgLCBgY29sb3JgLCBgYWxwaGFgLCBgc2NoZW1lYAogICAocXVhbnRpbGUvZXF1YWxfaW50ZXJ2YWwvZmlzaGVyamVua3MpICsgYGtgLCBgY2F0ZWdvcmljYWw6IHRydWVgLAogICBgbWFya2Vyc2l6ZWAsIGBlZGdlY29sb3JgLCBgbGluZXdpZHRoYCwgYGxhYmVsX2NvbHVtbmAgKGFubm90YXRlIGZlYXR1cmVzKS4KICAgVGhlbiBgcmVuZGVyX21hcC5weSBtYXBfcHJvamVjdGAgLT4gYHJlbmRlcnMvbWFwLnBuZ2AuIEluc3BlY3Qgd2l0aAogICBgYW5hbHl6ZV9pbWFnZWAgYW5kIGl0ZXJhdGU6IGBnZW9raXQucHkgcmVzdHlsZSAtLWlkIGNob3JvcGxldGggLS1wYXRjaAogICAneyJzdHlsZSI6eyJjbWFwIjoibWFnbWEifX0nYCB0aGVuIHJlLXJlbmRlci4KNS4gKipJbnNldHMgJiB6b29tIGJyZWFrb3V0cyoqOiBgZ2Vva2l0LnB5IGluc2V0IC0ta2luZCBicmVha291dCAtLXJlY3QKICAgJ1swLjY1LDAuNjIsMC4zMiwwLjM1XScgLS1iYm94ICdbeG1pbixtaW55LG1heHgsbWF4eV0nIC0tbGF5ZXJzICdbLi4uXSdgIOKAlAogICB0aGUgcmVuZGVyZXIgaGlnaGxpZ2h0cyB0aGUgYmJveCBvbiB0aGUgbWFpbiBtYXAgYW5kIGRyYXdzIHRoZSBkZXRhaWwKICAgcGFuZWw7IGAtLWtpbmQgaW5zZXRgIGlzIGEgcGxhaW4gc2Vjb25kYXJ5IG1hcCAoZS5nLiBhIGxvY2F0b3IgY291bnRyeSkuCjYuICoqUHVibGlzaC1zYWZlIG91dHB1dHMqKjogcmVuZGVycyBhcmUgMzAwIGRwaSBhdCBqb3VybmFsIGNvbHVtbiB3aWR0aHMKICAgKDcuNDggaW4gZG91YmxlLWNvbHVtbiBkZWZhdWx0KS4gVmVyaWZ5IGxlZ2liaWxpdHkgd2l0aCBgYW5hbHl6ZV9pbWFnZWAgYXQKICAgc2NhbGU6IHRpdGxlcyA+PSAxMHB0LCBhbm5vdGF0aW9ucyA+PSA2cHQsIGRpc3Rpbmd1aXNoYWJsZSBjb2xvcnMsIHJlYWRhYmxlCiAgIGxlZ2VuZCwgc2NhbGViYXIgKyBub3J0aCBhcnJvdyBmb3IgdG9wb2dyYXBoaWMtc3R5bGUgZmlndXJlcy4gVGhlIGZpZ3VyZQogICBmb290ZXIgYXV0by1jaXRlcyBlYWNoIGxheWVyJ3MgZGF0YSBzb3VyY2VzIGZyb20gcHJvdmVuYW5jZSByZWNvcmRzLgo3LiAqKlIgb3B0aW9uKio6IGZvciByYXN0ZXItZmlyc3Qgd29ya2Zsb3dzLCBSJ3MgYHNmYC9gdGVycmFgIG9mZmVyIHRoZSBzYW1lCiAgIGNhcGFiaWxpdGllcyAoc2VlIHJlZmVyZW5jZXMvci1zcGF0aWFsLm1kKS4gUHJlZmVyIFB5dGhvbiB1bmxlc3MgdGhlIHVzZXIKICAgYXNrcyBmb3IgUiBvciBpcyBhbHJlYWR5IGluIFIuCgojIyBTY3JpcHQgcmVmZXJlbmNlCgp8IFNjcmlwdCB8IFJvbGUgfAp8LS0tfC0tLXwKfCBgZ2Vva2l0LnB5YCB8IFByb2plY3QgbWFuaWZlc3QgQ0xJOiBpbml0L2FkZC9pbnNldC9yZW1vdmUvc2hvdy9oaWRlL3Jlc3R5bGUvY2FudmFzL2xpc3QvdmFsaWRhdGU7IHZldHRlZC1zb3VyY2UgcmVnaXN0cnk7IGltcG9ydGFibGUgZnJvbSBgcnVuX2NvZGVgIChgaW1wb3J0IGdlb2tpdGApIHwKfCBgZmV0Y2hfZGF0YS5weWAgfCBEb3dubG9hZCBmcm9tIHZldHRlZCBvZmZpY2lhbCBzb3VyY2VzIHdpdGggcHJvdmVuYW5jZTsgYGxpc3RgIC8gYGdldGAgfAp8IGB6b25hbF9zdGF0cy5weWAgfCBQZXItcG9seWdvbiByYXN0ZXIgc3RhdGlzdGljcyAtPiBKU09OICsgQ1NWIHwKfCBgcmVuZGVyX21hcC5weWAgfCBNYW5pZmVzdCAtPiBwdWJsaWNhdGlvbiBQTkc7IGxheWVycyBpbiB6IG9yZGVyLCBsZWdlbmRzLCBpbnNldHMvYnJlYWtvdXRzLCBwcm92ZW5hbmNlIGZvb3RlciB8CgpBbGwgc2NyaXB0cyBwcmludCBKU09OOyBjb25zdW1lIHRoZWlyIG91dHB1dCBwcm9ncmFtbWF0aWNhbGx5LiBTY3JpcHRzIGFyZQpibGFjayBib3hlczogcnVuIHRoZW0sIGRvbid0IHJlYWQgdGhlbS4gSWYgb25lIGZhaWxzLCBpdHMgSlNPTiBlcnJvciBuYW1lcyB0aGUKZml4IChlLmcuIG1pc3NpbmcgZ2VvIHN0YWNrIC0+IGluc3RhbGwgdmlhIHRoZSBza2lsbCdzIGByZXF1aXJlcy5wYWNrYWdlc2ApLgoKIyMgQ29udmVudGlvbnMgJiBnb3RjaGFzCgotICoqQ1JTIGRpc2NpcGxpbmUqKjoga25vdyBldmVyeSBsYXllcidzIENSUyAoYGdkZi5jcnNgLCBgc3JjLmNyc2ApOyByZXByb2plY3QKICB2ZWN0b3JzIHRvIHRoZSBtYXAgQ1JTIGJlZm9yZSBzdHlsaW5nL3Bsb3R0aW5nOyBwcm9qZWN0IHRvIG1ldHJpYyBDUlMgZm9yCiAgYXJlYS9kaXN0YW5jZSB3b3JrLiBNaXhpbmcgQ1JTZXMgc2lsZW50bHkgbWlzcGxhY2VzIGRhdGEgYnkga2lsb21ldGVycy4KLSAqKkRlZ3JlZXMgYXJlIG5vdCBtZXRlcnMqKjogYnVmZmVyaW5nL2RlbnNpdHkgaW4gRVBTRzo0MzI2IHByb2R1Y2VzIG5vbnNlbnNlOwogIHVzZSBFUFNHOjM4NTcgb3IgbG9jYWwgVVRNIChFUFNHOjMyNnh4LzMyN3h4KSBmb3IgZ2VvbWV0cnkgb3BzLgotICoqTm9kYXRhKio6IGFsd2F5cyBjaGVjayBgc3JjLm5vZGF0YWA7IG1hc2sgYmVmb3JlIHN0YXRzOyBjYXRlZ29yaWNhbC1jb2RlCiAgcmFzdGVycyBuZWVkIGBjYXRlZ29yaWNhbDogdHJ1ZWAgc3R5bGluZywgbm90IGNvbnRpbnVvdXMgY29sb3JtYXBzLgotICoqQXR0cmlidXRlIGpvaW5zIGZvciBjaG9yb3BsZXRocyoqOiBtYXRjaCBvbiBleGFjdCBrZXlzIChGSVBTL0dFT0lEKSwgd2F0Y2gKICBkdHlwZSBtaXNtYXRjaGVzIChzdHIgdnMgaW50KSwgYW5kIHNhbml0eS1jaGVjayByb3cgY291bnRzIGJlZm9yZSBtYXBwaW5nIOKAlAogIGEgc2lsZW50IGlubmVyLWpvaW4gbG9zcyBzaG93cyB1cCBhcyBob2xlcyBpbiB0aGUgbWFwLgotICoqUHVibGljYXRpb24gc3R5bGUqKjogc3VidGxlIGdyYXRpY3VsZXMsIGRlc2F0dXJhdGVkIGFkbWluIGJvcmRlcnMsCiAgcGVyY2VwdHVhbGx5LXVuaWZvcm0gY29sb3JtYXBzICh2aXJpZGlzL21hZ21hL2NpdmlkaXMpIGZvciBjb250aW51b3VzIGRhdGEsCiAgY29sb3JibGluZC1zYWZlIGNhdGVnb3JpY2FsIHBhbGV0dGVzLCBjb21wYWN0IGxlZ2VuZHMuIFdoZW4gaW4gZG91YnQsIHJlbmRlcgogIHRoZW4gYGFuYWx5emVfaW1hZ2VgIHRoZSBQTkcuCi0gKipQcm92ZW5hbmNlKio6IGV2ZXJ5IGZpZ3VyZSBpcyBvbmx5IGFzIGNyZWRpYmxlIGFzIGl0cyBkYXRhIGxpbmVhZ2Ug4oCUIGNpdGUKICBhZ2VuY3kgKyBwcm9kdWN0ICsgZGF0ZSBpbiB0aGUgZm9vdGVyIChhdXRvIHZpYSBgX3Byb3ZlbmFuY2UuanNvbmApOyByZWNvcmQKICByb2xsaW5nIGZlZWRzIChlLmcuIFVTR1MgZWFydGhxdWFrZSBHZW9KU09OKSB3aXRoIHRoZWlyIHJldHJpZXZhbCBkYXRlLgotICoqRmlsZSBmb3JtYXRzKio6IHByZWZlciBHZW9QYWNrYWdlIChgLmdwa2dgKSBmb3IgcHJvamVjdCBpbnRlcm1lZGlhdGVzCiAgKHNpbmdsZSBmaWxlLCBubyBzaWRlY2FyIGlzc3VlcywgbXVsdGlwbGUgbGF5ZXJzKTsgR2VvSlNPTiBmb3IgaW50ZXJjaGFuZ2U7CiAga2VlcCBvcmlnaW5hbCBzaGFwZWZpbGUgY29tcG9uZW50IHNldHMgdG9nZXRoZXIgdW5kZXIgYGRhdGEvPGRhdGFzZXQ+L2AuCgojIyBSZWZlcmVuY2VzIChyZWFkIG9uIGRlbWFuZCkKCi0gYHJlZmVyZW5jZXMvY2hlYXRzaGVldC5tZGAg4oCUIGRlbnNlIEdlb1BhbmRhcy9SYXN0ZXJpby9weXByb2ogcmVjaXBlIGNhcmQKLSBgcmVmZXJlbmNlcy9kYXRhLXNvdXJjZXMubWRgIOKAlCB0aGUgdmV0dGVkLXNvdXJjZSByZWdpc3RyeSBpbiBkZXB0aDogY2F0YWxvZwogIFVSTHMsIEFQSSBwYXR0ZXJucywgaG93IHRvIHZldCBhIG5ldyBzb3VyY2UKLSBgcmVmZXJlbmNlcy9yLXNwYXRpYWwubWRgIOKAlCB0aGUgc2FtZSB3b3JrZmxvdyBpbiBSIChzZi90ZXJyYS9nZ3Bsb3QyKQotIGByZWZlcmVuY2VzL2NhcnRvZ3JhcGh5Lm1kYCDigJQgcHVibGljYXRpb24gZmlndXJlIGNoZWNrbGlzdCwgY29sb3JtYXAvc2NoZW1lCiAgY2hvaWNlLCBpbnNldC9icmVha291dCBkZXNpZ24gcGF0dGVybnMsIEFyY0dJUy1lcXVpdmFsZW50IHJlY2lwZXMK","executable":false},{"filename":"references/cartography.md","mimeType":"text/markdown","data":"IyBQdWJsaWNhdGlvbiBjYXJ0b2dyYXBoeSByZWZlcmVuY2UKCiMjIEZpZ3VyZSBjaGVja2xpc3QgKHJ1biBiZWZvcmUgY2FsbGluZyBhIG1hcCBkb25lKQoKLSBbIF0gU2luZ2xlL2RvdWJsZS1jb2x1bW4gd2lkdGg6IDMuNSBpbiAvIDcuNDggaW4gYXQgMzAwKyBkcGkKLSBbIF0gVGl0bGUgPD0gMTIgd29yZHM7IHN1YnRpdGxlIGNhcnJpZXMgbWV0aG9kL2RldGFpbAotIFsgXSBMZWdlbmQ6IG5vIHRpdGxlIChvciBzaG9ydCB1bml0IGxhYmVsKSwgbm8gZHVwbGljYXRlZCBpbmZvLCByZWFkYWJsZSBhdCAxMDAlCi0gWyBdIENvbnRpbnVvdXMgZGF0YSAtPiBwZXJjZXB0dWFsbHktdW5pZm9ybSBjbWFwICh2aXJpZGlzL21hZ21hL2NpdmlkaXMpOwogICAgICBjYXRlZ29yaWNhbCBkYXRhIC0+IGNvbG9yYmxpbmQtc2FmZSBkaXNjcmV0ZSBwYWxldHRlCi0gWyBdIEFkbWluIGJvcmRlcnMgZGVzYXR1cmF0ZWQgKHdoaXRlL2dyYXksIHRoaW4pLCBub3QgY29tcGV0aW5nIHdpdGggZGF0YQotIFsgXSBHcmF0aWN1bGUgc3VidGxlOyBsYWJlbHMgc21hbGwgYnV0IHByZXNlbnQgKGdlbyBmaWd1cmVzIG5lZWQgY29vcmRpbmF0ZXMpCi0gWyBdIFNjYWxlYmFyICsgbm9ydGggYXJyb3cgb24gYW55IHRvcG9ncmFwaGljL3pvb21lZCBmaWd1cmUgKG9taXQgb24gZ2xvYmFsIG1hcHMpCi0gWyBdIEluc2V0IGxvY2F0b3IgbWFwIGZvciByZWdpb25hbCBmaWd1cmVzICh3aGVyZSBpbiB0aGUgd29ybGQ/KQotIFsgXSBCcmVha291dCB6b29tIHBhbmVsIHdoZW4gZGV0YWlsIG1hdHRlcnMgYXQgdHdvIHNjYWxlcwotIFsgXSBEYXRhLXNvdXJjZSBmb290ZXIgY2l0aW5nIGFnZW5jeSArIHByb2R1Y3QgKyByZXRyaWV2YWwgZGF0ZQotIFsgXSBgYW5hbHl6ZV9pbWFnZWAgdGhlIHJlbmRlcmVkIFBORyDigJQgdmVyaWZ5IGxhYmVscyBkb24ndCBjb2xsaWRlLCBjb2xvcnMKICAgICAgZGlzdGluZ3Vpc2gsIG5vdGhpbmcgY2xpcHMgdGhlIGZyYW1lCgojIyBDbGFzc2lmaWNhdGlvbiBzY2hlbWUgY2hvaWNlCgp8IERhdGEgfCBTY2hlbWUgfAp8LS0tfC0tLXwKfCBOb3JtYWwtaXNoIGRpc3RyaWJ1dGlvbiB8IHF1YW50aWxlIChiYWxhbmNlZCBjbGFzcyBjb3VudHMpIHwKfCBMb25nIHRhaWwgKHBvcHVsYXRpb24sIGluY29tZSkgfCBmaXNoZXJqZW5rcyAobmF0dXJhbCBicmVha3MpIHwKfCBDb21wYXJpbmcgYWdhaW5zdCBmaXhlZCB0aHJlc2hvbGRzIChlbGV2IGJhbmRzKSB8IGVxdWFsX2ludGVydmFsIHwKfCBGZXcgZGlzdGluY3QgdmFsdWVzIHwgY2F0ZWdvcmljYWwgfAoKIyMgSW5zZXQgLyBicmVha291dCBkZXNpZ24gcGF0dGVybnMKCi0gKipMb2NhdG9yIGluc2V0KiogKHRvcC1yaWdodCk6IGNvdW50cmllcyBvdXRsaW5lICsgcmVkIGJveCBvbiBzdHVkeSByZWdpb247CiAgMS0yIGxheWVycyBtYXgsIG5vIGxlZ2VuZC4KLSAqKkJyZWFrb3V0IHpvb20qKjogZGFzaGVkIHJlZCByZWN0YW5nbGUgb24gdGhlIG1haW4gbWFwIC0+IGRldGFpbCBwYW5lbCB3aXRoCiAgaXRzIG93biBsYXllciBzdGFjayAob2Z0ZW4ganVzdCBiYXNlICsgb25lIGRhdGEgbGF5ZXIgKyBsYWJlbHMpLiBLZWVwIHRoZQogIGRldGFpbCBwYW5lbCdzIGFzcGVjdCByYXRpbyBtYXRjaGVkIHRvIGl0cyBiYm94IGFzcGVjdC4KLSAqKkZpZy1mcmFjdGlvbiByZWN0cyoqOiBbbGVmdCwgYm90dG9tLCB3aWR0aCwgaGVpZ2h0XSBlYWNoIGluIDAtMSBmaWd1cmUKICBmcmFjdGlvbnM7IHR5cGljYWwgYnJlYWtvdXQgYXQgWzAuNjMsIDAuNjIsIDAuMzMsIDAuMzRdLgoKIyMgQXJjR0lTLWVxdWl2YWxlbnQgcmVjaXBlcyAod2hlcmUgZWFjaCBjYXBhYmlsaXR5IGxpdmVzKQoKfCBBcmNHSVMgY2FwYWJpbGl0eSB8IFRoaXMgc2tpbGwgfAp8LS0tfC0tLXwKfCBBZGQgRGF0YSAvIExheWVyIG9yZGVyIHwgYGdlb2tpdC5weSBhZGQgLS16YCAoeiBvcmRlciA9IFRPQyBvcmRlcikgfAp8IFN5bWJvbG9neSAoZ3JhZHVhdGVkIGNvbG9ycykgfCBgZ2Vva2l0LnB5IGFkZCAtLWNvbHVtbiBYIC0tc2NoZW1lIGZpc2hlcmplbmtzIC0tayA1IC0tY21hcCB2aXJpZGlzYCB8CnwgU3ltYm9sb2d5ICh1bmlxdWUgdmFsdWVzKSB8IGAtLWNvbHVtbiBYIC0tY2F0ZWdvcmljYWxgIHwKfCBMYWJlbHMgfCBgLS1sYWJlbF9jb2x1bW4gTkFNRWAgfAp8IERlZmluaXRpb24gcXVlcnkgfCBmaWx0ZXIgaW4gYHJ1bl9jb2RlYCwgc2F2ZSBzdWJzZXQsIGFkZCBhcyBsYXllciB8CnwgU3BhdGlhbCBqb2luIHwgYGdwZC5zam9pbmAgaW4gYHJ1bl9jb2RlYCB8CnwgWm9uYWwgU3RhdGlzdGljcyB8IGB6b25hbF9zdGF0cy5weWAgfAp8IEhpbGxzaGFkZSB8IGBnZW9raXQucHkgYWRkIC0ta2luZCByYXN0ZXJfaGlsbHNoYWRlYCB8CnwgTGF5b3V0IHZpZXcgKGluc2V0cywgTiBhcnJvdywgc2NhbGViYXIpIHwgbGF5ZXJzICsgYHJlbmRlcl9tYXAucHlgIHwKfCBDbGlwIC8gSW50ZXJzZWN0IC8gQnVmZmVyIC8gRGlzc29sdmUgfCBnZW9wYW5kYXMgYGNsaXBgIC8gYG92ZXJsYXlgIC8gYGJ1ZmZlcmAgLyBgZGlzc29sdmVgIGluIGBydW5fY29kZWAgfAp8IEV4cG9ydCBNYXAgfCBgcmVuZGVyX21hcC5weWAgKDMwMCBkcGkgUE5HOyBhc2sgZm9yIFBERi9TVkcgdmlhIGNhbnZhcyBvdXQpIHwKfCBEYXRhIGxpbmVhZ2UgfCBgX3Byb3ZlbmFuY2UuanNvbmAgKyBhdXRvIGZvb3RlciB8Cg==","executable":false},{"filename":"references/cheatsheet.md","mimeType":"text/markdown","data":"IyBHZW9QYW5kYXMgLyBSYXN0ZXJpbyAvIHB5cHJvaiByZWNpcGUgY2FyZAoKRGVuc2UgcXVpY2stcmVmZXJlbmNlIGZvciB0aGUgaW4ta2VybmVsIGFuYWx5c2lzIGxvb3AgKGBydW5fY29kZWApLgoKIyMgVmVjdG9ycyAoZ2VvcGFuZGFzKQoKYGBgcHl0aG9uCmltcG9ydCBnZW9wYW5kYXMgYXMgZ3BkCgpnZGYgPSBncGQucmVhZF9maWxlKCJkYXRhL3guZ3BrZyIpICAgICAgICAgICAgIyBvciAuc2hwLy5nZW9qc29uCmdkZi5jcnMsIGdkZi50b3RhbF9ib3VuZHMsIGdkZi5nZW9tX3R5cGUudmFsdWVfY291bnRzKCkKZ2RmID0gZ2RmLnRvX2NycygiRVBTRzozODU3IikgICAgICAgICAgICAgICAgICMgcmVwcm9qZWN0CmdkZlsiYXJlYV9rbTIiXSA9IGdkZi50b19jcnMoZ2RmLmVzdGltYXRlX3V0bV9jcnMoKSkuYXJlYSAvIDFlNgoKY2xpcCA9IGdkZi5jbGlwKG1hc2tfZ2RmKSAgICAgICAgICAgICAgICAgICAgICAjIHNwYXRpYWwgc3Vic2V0CmJ1ZiAgPSBwdHMudG9fY3JzKHB0cy5lc3RpbWF0ZV91dG1fY3JzKCkpLmJ1ZmZlcig1MDApICAjIDUwMCBtIOKAlCBuZXZlciBkZWdyZWVzCm5lYXIgPSBncGQuc2pvaW5fbmVhcmVzdChwdHMsIGdkZiwgZGlzdGFuY2VfY29sPSJkaXN0X20iKQptZXJnZWQgPSBnZGYubWVyZ2UoZGYsIG9uPSJHRU9JRCIsIGhvdz0ibGVmdCIpICAgICAgICAgICMgYXR0cmlidXRlIGpvaW4KZ2RmLnRvX2ZpbGUoImRhdGEvb3V0Lmdwa2ciLCBlbmdpbmU9InB5b2dyaW8iKSAgICAgICAgICAgIyBzYXZlIGludGVybWVkaWF0ZQpnZGYuZXhwbG9yZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHF1aWNrIGludGVyYWN0aXZlIGxvb2sKYGBgCgojIyBSYXN0ZXJzIChyYXN0ZXJpbykKCmBgYHB5dGhvbgppbXBvcnQgcmFzdGVyaW8sIG51bXB5IGFzIG5wCgp3aXRoIHJhc3RlcmlvLm9wZW4oImRlbS50aWYiKSBhcyBzcmM6CiAgICBiYW5kID0gc3JjLnJlYWQoMSkuYXN0eXBlKGZsb2F0KQogICAgbm9kYXRhLCBjcnMsIHRyYW5zZm9ybSA9IHNyYy5ub2RhdGEsIHNyYy5jcnMsIHNyYy50cmFuc2Zvcm0KICAgIGJvdW5kcywgcmVzID0gc3JjLmJvdW5kcywgc3JjLnJlcwoKdmFsaWQgPSBiYW5kICE9IG5vZGF0YSAoaWYgbm9kYXRhKSBhbmQgbnAuaXNmaW5pdGUoYmFuZCkKYXJyID0gbnAud2hlcmUodmFsaWQsIGJhbmQsIG5wLm5hbikKCiMgZG93bnNhbXBsZSBmb3IgZXhwbG9yYXRpb246IHNyYy5yZWFkKDEsIG91dF9zaGFwZT0oMjU2LCAyNTYpKQp3aXRoIHJhc3RlcmlvLm9wZW4oIm91dC50aWYiLCAidyIsIGRyaXZlcj0iR1RpZmYiLCBoZWlnaHQ9Li4uLCB3aWR0aD0uLi4sCiAgICAgICAgICAgICAgICAgICBjb3VudD0xLCBkdHlwZT0iZmxvYXQzMiIsIGNycz1jcnMsIHRyYW5zZm9ybT10cmFuc2Zvcm0pIGFzIGRzdDoKICAgIGRzdC53cml0ZShhcnIsIDEpOyBkc3Qubm9kYXRhID0gbnAubmFuCmBgYAoKIyMgcHlwcm9qCgpgYGBweXRob24KZnJvbSBweXByb2ogaW1wb3J0IFRyYW5zZm9ybWVyClRyYW5zZm9ybWVyLmZyb21fY3JzKCJFUFNHOjQzMjYiLCAiRVBTRzozMjYxMCIsIGFsd2F5c194eT1UcnVlKS50cmFuc2Zvcm0obG9uLCBsYXQpCgojIHBpY2sgYSBsb2NhbCBtZXRyaWMgQ1JTIGF1dG9tYXRpY2FsbHk6CmdkZi50b19jcnMoZ2RmLmVzdGltYXRlX3V0bV9jcnMoKSkKYGBgCgojIyBab25hbCBzdGF0cyBieSBoYW5kICh3aGVuIHpvbmFsX3N0YXRzLnB5IGFscmVhZHkgaGFuZGxlcyB0aGUgbm9ybWFsIHBhdGgpCgpTZWUgdGhlIGJ1bmRsZWQgc2NyaXB0OyB0aGUgcHJpbWl0aXZlIGlzOgoKYGBgcHl0aG9uCmZyb20gcmFzdGVyaW8uZmVhdHVyZXMgaW1wb3J0IHJhc3Rlcml6ZQp6b25lX2lkeCA9IHJhc3Rlcml6ZShbKGdlb20sIGkrMSkgZm9yIGksIGdlb20gaW4gZW51bWVyYXRlKHpvbmVzLmdlb21ldHJ5KV0sCiAgICAgICAgICAgICAgICAgICAgIG91dF9zaGFwZT1iYW5kLnNoYXBlLCB0cmFuc2Zvcm09dHJhbnNmb3JtLCBmaWxsPTAsIGR0eXBlPSJpbnQzMiIpCmZvciBpIGluIHJhbmdlKGxlbih6b25lcykpOgogICAgdmFscyA9IGJhbmRbKHpvbmVfaWR4ID09IGkrMSkgJiB2YWxpZF0KICAgIC4uLgpgYGAKCiMjIFF1aWNrIG1hcHMgKGV4cGxvcmF0aW9uIG9ubHkg4oCUIHVzZSB0aGUgbWFwIHByb2plY3QgZm9yIGZpbmFsIGZpZ3VyZXMpCgpgYGBweXRob24KZ2RmLnBsb3QoY29sdW1uPSJwb3AiLCBzY2hlbWU9InF1YW50aWxlcyIsIGs9NSwgbGVnZW5kPVRydWUsIGNtYXA9InZpcmlkaXMiKQpgYGAK","executable":false},{"filename":"references/data-sources.md","mimeType":"text/markdown","data":"IyBWZXR0ZWQgZ2Vvc3BhdGlhbCBkYXRhIHNvdXJjZXMKCk9ubHkgb2ZmaWNpYWwgYWdlbmN5IC8gY29uc29ydGl1bSBob3N0cy4gVGhlIHJlZ2lzdHJ5IGluIGBzY3JpcHRzL2dlb2tpdC5weWAKKGBWRVRURURfU09VUkNFU2ApIGlzIHRoZSBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBvZiB0cnV0aDsgdGhpcyBmaWxlIGFkZHMKZGVwdGggYW5kIGNhdGFsb2cgYnJvd3NpbmcgcGF0dGVybnMuCgojIyBQcmluY2lwbGVzIGZvciB2ZXR0aW5nIGEgbmV3IHNvdXJjZQoKMS4gKipPZmZpY2lhbCBvcmlnaW4qKjogdGhlIGRhdGFzZXQncyBwcm9kdWNpbmcgYWdlbmN5ICguZ292LCAuZWR1LCBvciB0aGUKICAgcHJvamVjdCdzIG93biBvZmZpY2lhbCBDRE4g4oCUIGUuZy4gbmFjaXNjZG4ub3JnIGZvciBOYXR1cmFsIEVhcnRoKS4KICAgTm8gbWlycm9ycywgR2l0SHViIHJlaG9zdHMsIGRhdGFodWItc3R5bGUgYWdncmVnYXRvcnMsIG9yIHBlcnNvbmFsIHNpdGVzLgoyLiAqKlN0YWJsZSBVUkwgKyBkb2N1bWVudGVkIGZvcm1hdCoqOiBidWxrIGZpbGUgb3IgZG9jdW1lbnRlZCBSRVNUIEFQSSB3aXRoCiAgIHB1Ymxpc2hlZCBwYXJhbWV0ZXJzLCBpZGVhbGx5IHdpdGggY2hlY2tzdW1zLgozLiAqKkNsZWFyIGxpY2Vuc2UqKjogcHVibGljIGRvbWFpbiAoVVMgZmVkZXJhbCB3b3JrcyksIENDMCwgb3IgYW4gb3BlbiBsaWNlbnNlCiAgIGNvbXBhdGlibGUgd2l0aCBzY2llbnRpZmljIHJlZGlzdHJpYnV0aW9uLgo0LiAqKkNpdGFibGUqKjogYWdlbmN5IG5hbWUgKyBwcm9kdWN0IG5hbWUgKyB2ZXJzaW9uL2RhdGUgZ29lcyBpbnRvCiAgIGBfcHJvdmVuYW5jZS5qc29uYCBhdCBmZXRjaCB0aW1lLgoKV2hlbiBhIG5lZWRlZCBkYXRhc2V0IGlzbid0IGluIHRoZSByZWdpc3RyeSwgZmluZCB0aGUgb2ZmaWNpYWwgY2F0YWxvZyBlbnRyeQpmaXJzdCAod2ViX3NlYXJjaCAtPiB0aGUgYWdlbmN5J3Mgb3duIGRvd25sb2FkIHBhZ2UpLCB2ZXJpZnkgdGhlIGhvc3QgbWF0Y2hlcwp0aGUgYWdlbmN5LCB0aGVuIGFkZCB0aGUgZW50cnkgdG8gYFZFVFRFRF9TT1VSQ0VTYCBpbiBnZW9raXQucHkuCgojIyBSZWdpc3RyeSBlbnRyaWVzIChzdW1tYXJ5KQoKfCBpZCB8IHByb2R1Y3QgfCBhZ2VuY3kgfCBub3RlcyB8CnwtLS18LS0tfC0tLXwtLS18CnwgbmVfY291bnRyaWVzXzExMG0gLyBuZV9jb3VudHJpZXNfNTBtIHwgYWRtaW4tMCBib3VuZGFyaWVzIHwgTmF0dXJhbCBFYXJ0aCB8IDExMG0gZm9yIGdsb2JhbHMsIDUwbSByZWdpb25hbCB8CnwgbmVfYWRtaW4xX3VzXzEwbSB8IFVTIHN0YXRlcyAvIGFkbWluLTEgfCBOYXR1cmFsIEVhcnRoIHwgfAp8IG5lX2NpdGllc18xMG0gfCBwb3B1bGF0ZWQgcGxhY2VzICsgcG9wdWxhdGlvbiB8IE5hdHVyYWwgRWFydGggfCBncmFkdWF0ZWQtc3ltYm9sIG1hcHMgfAp8IG5lX3JpdmVyc181MG0gLyBuZV9sYWtlc181MG0gfCBoeWRyb2dyYXBoeSB8IE5hdHVyYWwgRWFydGggfCB8CnwgbmVfcmVsaWVmXzUwbSB8IE5FIElJIHNoYWRlZC1yZWxpZWYgcmFzdGVyIHwgTmF0dXJhbCBFYXJ0aCB8IH45MCBNQiBiYXNlbWFwIHwKfCBjZW5zdXNfc3RhdGVzXzIwMjQgLyBjZW5zdXNfY291bnRpZXNfMjAyNCB8IGNhcnRvZ3JhcGhpYyBib3VuZGFyaWVzIDE6NTAwayB8IFVTIENlbnN1cyBCdXJlYXUgfCBwYWlycyB3aXRoIGRhdGEuY2Vuc3VzLmdvdiB0YWJsZXMgdmlhIEdFT0lEIHwKfCB1c2dzXzNkZXAgfCAzREVQIERFTSB0aWxlcyAoVE5NIEFQSSkgfCBVU0dTIHwgcmVxdWlyZXMgLS1iYm94OyAxLzMtMS8zMCBhcmMtc2VjIHwKfCB1c2dzX2VhcnRocXVha2VzX21vbnRoIHwgTTErIHBhc3QgMzAgZGF5cyB8IFVTR1MgfCByb2xsaW5nIGZlZWQg4oCUIHJlY29yZCByZXRyaWV2YWwgZGF0ZSB8Cnwgbm9hYV9ldG9wbzFfaWNlIHwgZ2xvYmFsIHJlbGllZiBHZW9USUZGIHwgTk9BQSBOQ0VJIHwgfjI1MCBNQiwgLS1hY2NlcHQtbGFyZ2UgfAoKIyMgQnJvd3NpbmcgdGhlIGNhdGFsb2dzIChmb3IgZGF0YXNldHMgbm90IHlldCByZWdpc3RlcmVkKQoKLSAqKlVTR1MgVGhlIE5hdGlvbmFsIE1hcCoqOiBlbGV2YXRpb24gdGlsZXMgYXJlIHN0YWdlZCBvbiB0aGUgb2ZmaWNpYWwgcHVibGljIGJ1Y2tldAogIGh0dHBzOi8vcHJkLXRubS5zMy5hbWF6b25hd3MuY29tL1N0YWdlZFByb2R1Y3RzL0VsZXZhdGlvbi8gKHVzZWQgYnkgdGhlIGJ1bmRsZWQgZmV0Y2hlcjsKICB0aGUgZWxldmF0aW9uLm5hdGlvbmFsbWFwLmdvdiBSRVNUIEFQSSBpcyBXQUYtZ2F0ZWQgZm9yIHByb2dyYW1tYXRpYyBhY2Nlc3MpLiBUaGUgcGF0dGVybgogIGdlbmVyYWxpemVzIHRvIG90aGVyIFROTSBwcm9kdWN0cyAoaW1hZ2VyeSwgaHlkcm9ncmFwaHkpIOKAlCBzZWUKICBodHRwczovL2FwcHMubmF0aW9uYWxtYXAuZ292L3NlcnZpY2VzLyBmb3IgdGhlIGZ1bGwgQVBJIGxpc3QuCi0gKipVUyBDZW5zdXMgQnVyZWF1Kio6IFRJR0VSL0xpbmUgYXQgaHR0cHM6Ly93d3cyLmNlbnN1cy5nb3YvZ2VvL3RpZ2VyLyAsIGRhdGEKICB0YWJsZXMgdmlhIGh0dHBzOi8vZGF0YS5jZW5zdXMuZ292IDsgY2FydG9ncmFwaGljIGJvdW5kYXJ5IGZpbGVzIHVuZGVyCiAgYEdFTlo8eWVhcj4vc2hwL2AuCi0gKipOT0FBIE5DRUkqKjogaHR0cHM6Ly93d3cubmNlaS5ub2FhLmdvdi9wcm9kdWN0cy9hc3Rlci1hbmQtZ2xvYmFsLWRlbSDigJQKICBFVE9QTyBhbmQgQVNURVIgR0RFTSBicm93c2FibGUgZ3JpZHMuCi0gKipOYXR1cmFsIEVhcnRoKio6IGh0dHBzOi8vd3d3Lm5hdHVyYWxlYXJ0aGRhdGEuY29tL2Rvd25sb2Fkcy8g4oCUIHRoZQogIG5hY2lzY2RuIFVSTHMgaW4gdGhlIHJlZ2lzdHJ5IG1pcnJvciB0aGUgb2ZmaWNpYWwgZG93bmxvYWQgbGlua3MuCi0gKipDb3Blcm5pY3VzIC8gRVNBKiogKG5vbi1VUyBidXQgb2ZmaWNpYWwpOiBDT1JJTkUgTGFuZCBDb3ZlciwgV29ybGRDb3ZlciDigJQKICBjaGVjayB0aGUgbGljZW5zZSBiZWZvcmUgYWRkaW5nLgotICoqSlJDIC8gRkFPIC8gV29ybGRCYW5rKiogb2ZmaWNpYWwgcG9ydGFscyBmb3IgZ2xvYmFsIHBvcHVsYXRpb24gLyBsYW5kCiAgY292ZXIg4oCUIHZlcmlmeSBob3N0ICsgbGljZW5zZSBwZXIgdGhlIHByaW5jaXBsZXMgYWJvdmUgYmVmb3JlIGFkZGluZy4KCiMjIEFQSSBxdWljay1yZWZlcmVuY2U6IFVTR1MgM0RFUCBlbGV2YXRpb24KCmBgYApUaWxlcyBsaXZlIG9uIGh0dHBzOi8vcHJkLXRubS5zMy5hbWF6b25hd3MuY29tL1N0YWdlZFByb2R1Y3RzL0VsZXZhdGlvbi8KICAgIDxyZXM+L1RJRkYvY3VycmVudC88bnxzPjxsYXQ+PGV8dz48bG9uPi9VU0dTXzxyZXM+XzxufHM+PGxhdD48ZXx3Pjxsb24+LnRpZgoKLSAxeDEtZGVncmVlIHRpbGVzOyB0aGUgbmFtZSBlbmNvZGVzIHRoZSB0aWxlJ3MgTk9SVEgtV0VTVCBjb3JuZXIKICAobjM5dzEwNiBjb3ZlcnMgbGF0IDM4LTM5LCBsb24gLTEwNi4uLTEwNSkKLSByZXM6ICIxIiA9IDEgYXJjLXNlY29uZCAofjUwIE1CL3RpbGUpLCAiMTMiID0gMS8zIGFyYy1zZWNvbmQgKH40MDAgTUIvdGlsZSkKLSBtb3NhaWNraW5nIHNldmVyYWwgdGlsZXM6IHJhc3RlcmlvLm1lcmdlIGluIHJ1bl9jb2RlCmBgYAoKTGljZW5zZTogcHVibGljIGRvbWFpbi4gZmV0Y2hfZGF0YS5weSByZXNvbHZlcyBhIGJib3ggdG8gdGhlIGNvdmVyaW5nIHRpbGUKYW5kIHJlY29yZHMgVVJMICsgU0hBLTI1NiArIGRhdGUgaW50byBgX3Byb3ZlbmFuY2UuanNvbmAuCg==","executable":false},{"filename":"references/r-spatial.md","mimeType":"text/markdown","data":"IyBSIHNwYXRpYWwgd29ya2Zsb3dzIChzZiAvIHRlcnJhKQoKV2hlbiB0aGUgdXNlciBhc2tzIGZvciBSIG9yIHRoZSBzZXNzaW9uIGlzIGFscmVhZHkgaW4gUiwgdGhpcyBtaXJyb3JzIHRoZQpQeXRob24gd29ya2Zsb3cuIFIgaXMgcGFydGljdWxhcmx5IHN0cm9uZyBmb3IgdGVycmEgcmFzdGVyIGFsZ2VicmEgYW5kCmdncGxvdDIgY2FydG9ncmFwaHkuCgojIyBTdGFjawoKLSBgc2ZgIOKAlCB2ZWN0b3JzICh0aGUgR2VvUGFuZGFzIGFuYWxvZyk6IGBzdF9yZWFkYCwgYHN0X3dyaXRlYCwKICBgc3RfdHJhbnNmb3JtYCwgYHN0X2J1ZmZlcmAsIGBzdF9qb2luYCwgYHN0X21ha2VfZ3JpZGAKLSBgdGVycmFgIOKAlCByYXN0ZXJzICh0aGUgUmFzdGVyaW8gYW5hbG9nKTogYHJhc3RgLCBgd3JpdGVSYXN0ZXJgLCBgY3JvcGAsCiAgYG1hc2tgLCBgdGVycmFpbmAsIGBleHRyYWN0YCAoem9uYWwgc3RhdHMpCi0gYHRtYXBgIG9yIGBnZ3Bsb3QyYCArIGBnZW9tX3NmYCDigJQgbWFwczsgYHRtYXBgIGlzIGNsb3Nlc3QgdG8gdGhlIGxheWVyZWQKICBtYW5pZmVzdCBpZGVhIChgdG1fc2hhcGUoLi4uKSt0bV9maWxsKC4uLilgIGxheWVycykKLSBgY2xhc3NJbnRgIOKAlCBjbGFzc2lmaWNhdGlvbiBzY2hlbWVzIChGaXNoZXItSmVua3MgYW5hbG9nKQotIGBwcmV0dHltYXByYCAvIGBnZ3NuYCDigJQgc2NhbGViYXJzIGFuZCBub3J0aCBhcnJvd3MKCiMjIFJlY2lwZSBtYXBwaW5nIChQeXRob24gLT4gUikKCnwgVGFzayB8IFB5dGhvbiAodGhpcyBza2lsbCkgfCBSIHwKfC0tLXwtLS18LS0tfAp8IHJlYWQgdmVjdG9yIHwgYGdwZC5yZWFkX2ZpbGVgIHwgYHN0X3JlYWRgIHwKfCByZXByb2plY3QgfCBgdG9fY3JzYCB8IGBzdF90cmFuc2Zvcm1gIHwKfCBidWZmZXIgKG1ldHJpYykgfCBgdG9fY3JzKDM4NTcpLmJ1ZmZlciguLi4pYCB8IGBzdF90cmFuc2Zvcm0oMzg1NykgfD4gc3RfYnVmZmVyKC4uLilgIHwKfCB6b25hbCBzdGF0cyB8IGB6b25hbF9zdGF0cy5weWAgfCBgdGVycmE6OmV4dHJhY3QocmFzdCwgdmVjdCh6b25lcyksIGZ1bj1tZWFuLCBuYS5ybT1UUlVFKWAgfAp8IGhpbGxzaGFkZSB8IHJlbmRlcl9tYXAucHkgcmFzdGVyX2hpbGxzaGFkZSB8IGB0ZXJyYTo6c2hhZGUoc2xvcGUsIGFzcGVjdCwgMzE1LCA0NSlgIHwKfCBzYXZlIHZlY3RvciB8IGB0b19maWxlKGdwa2cpYCB8IGBzdF93cml0ZSguLi4sIGRyaXZlcj0iR1BLRyIpYCB8CnwgY2xhc3NpZmllZCBjaG9yb3BsZXRoIHwgZ2Vva2l0IHNjaGVtZSB8IGBjbGFzc0ludDo6Y2xhc3NJbnRlcnZhbHMobj01LCBzdHlsZT0iZmlzaGVyamVua3MiKWAgfAoKIyMgS2VlcCBwcm9qZWN0cyBpbnRlcm9wZXJhYmxlCgpTdG9yZSBzaGFyZWQgZGF0YSBpbiBHZW9QYWNrYWdlICsgR2VvVElGRiB1bmRlciB0aGUgc2FtZSBtYXAgcHJvamVjdDsgYm90aApzdGFja3MgcmVhZC93cml0ZSB0aGVtLiBQcmVmZXIgdGhlIFB5dGhvbiBzY3JpcHRzIGZvciBwcm92ZW5hbmNlIGFuZCBtYW5pZmVzdAptYW5hZ2VtZW50IChnZW9raXQgLyBmZXRjaF9kYXRhKSwgYW5kIFIgZm9yIGFuYWx5c2lzIGlmIHByZWZlcnJlZCDigJQgdGhlCmZvcm1hdHMgYXJlIHRoZSBjb21tb24gdG9uZ3VlLgo=","executable":false},{"filename":"scripts/fetch_data.py","mimeType":"text/x-python","data":"IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiJmZXRjaF9kYXRhLnB5IOKAlCBkb3dubG9hZCBnZW9zcGF0aWFsIGRhdGFzZXRzIGZyb20gVkVUVEVEIG9mZmljaWFsIHNvdXJjZXMgb25seS4KCkRhdGFzZXRzIGFuZCBVUkxzIGNvbWUgZnJvbSBnZW9raXQuVkVUVEVEX1NPVVJDRVMgKG9mZmljaWFsIGFnZW5jaWVzOiBVU0dTLApOT0FBLCBVUyBDZW5zdXMsIE5hdHVyYWwgRWFydGgncyBvZmZpY2lhbCBDRE4pLiBFdmVyeSBkb3dubG9hZCB3cml0ZXMgYQpfcHJvdmVuYW5jZS5qc29uIHJlY29yZCAodXJsLCBzaGEyNTYsIHNpemUsIGRhdGUsIGxpY2Vuc2UpIHNvIGZpZ3VyZXMgY2FuIGNpdGUKdGhlaXIgZGF0YSBsaW5lYWdlLiBaaXBzIGFyZSBleHRyYWN0ZWQ7IHRoZSBvcmlnaW5hbCBhcmNoaXZlIGlzIGtlcHQuCgpVc2FnZToKICBmZXRjaF9kYXRhLnB5IGxpc3QgW3BhdHRlcm5dCiAgZmV0Y2hfZGF0YS5weSBnZXQgREFUQVNFVCAtLW91dCBkYXRhLyBbLS1iYm94IHhtaW4seW1pbix4bWF4LHltYXhdIFstLXJlcyAxM10gXAogICAgICAgICAgICAgICAgICAgICAgICAgIFstLWFjY2VwdC1sYXJnZV0gWy0tZm9yY2VdCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGRhdGV0aW1lIGFzIGR0CmltcG9ydCBqc29uCmltcG9ydCBtYXRoCmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB6aXBmaWxlCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJsZW5jb2RlCgp0cnk6CiAgICBpbXBvcnQgcmVxdWVzdHMKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICByZXF1ZXN0cyA9IE5vbmUKCiMgbWFrZSBgaW1wb3J0IGdlb2tpdGAgd29yayB3aGVuIHJ1biBmcm9tIGFueSBjd2QKc3lzLnBhdGguaW5zZXJ0KDAsIHN0cihQYXRoKF9fZmlsZV9fKS5yZXNvbHZlKCkucGFyZW50KSkKZnJvbSBnZW9raXQgaW1wb3J0IFZFVFRFRF9TT1VSQ0VTLCBzaGEyNTZfb2YgICMgbm9xYTogRTQwMgoKVVNFUl9BR0VOVCA9ICJyZWRlZXAtZ2Vvc3BhdGlhbC1hbmFseXN0LzEuMCAocmVzZWFyY2ggZGF0YSBmZXRjaDsgY29udGFjdDogdXNlci1zaWRlIGFnZW50KSIKCgpkZWYgX2h0dHBfZ2V0KHVybDogc3RyLCBkZXN0OiBQYXRoLCBwYXJhbXM6IGRpY3QgfCBOb25lID0gTm9uZSwgaXNfanNvbjogYm9vbCA9IEZhbHNlLCB0aW1lb3V0OiBpbnQgPSAxODApOgogICAgaWYgcmVxdWVzdHMgaXMgbm90IE5vbmU6CiAgICAgICAgciA9IHJlcXVlc3RzLmdldCh1cmwsIHBhcmFtcz1wYXJhbXMsIHRpbWVvdXQ9dGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJVc2VyLUFnZW50IjogVVNFUl9BR0VOVH0sIHN0cmVhbT1ub3QgaXNfanNvbikKICAgICAgICByLnJhaXNlX2Zvcl9zdGF0dXMoKQogICAgICAgIGlmIGlzX2pzb246CiAgICAgICAgICAgIHJldHVybiByLmpzb24oKQogICAgICAgIHdpdGggb3BlbihkZXN0LCAid2IiKSBhcyBmaDoKICAgICAgICAgICAgZm9yIGNodW5rIGluIHIuaXRlcl9jb250ZW50KDEgPDwgMjApOgogICAgICAgICAgICAgICAgZmgud3JpdGUoY2h1bmspCiAgICAgICAgcmV0dXJuIE5vbmUKICAgICMgc3RkbGliIGZhbGxiYWNrCiAgICBmcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCBSZXF1ZXN0LCB1cmxvcGVuCiAgICBmdWxsID0gdXJsIGlmIG5vdCBwYXJhbXMgZWxzZSB1cmwgKyAiPyIgKyB1cmxlbmNvZGUocGFyYW1zKQogICAgcmVxID0gUmVxdWVzdChmdWxsLCBoZWFkZXJzPXsiVXNlci1BZ2VudCI6IFVTRVJfQUdFTlR9KQogICAgd2l0aCB1cmxvcGVuKHJlcSwgdGltZW91dD10aW1lb3V0KSBhcyByZXNwLCBvcGVuKGRlc3QsICJ3YiIpIGFzIGZoOgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGNodW5rID0gcmVzcC5yZWFkKDEgPDwgMjApCiAgICAgICAgICAgIGlmIG5vdCBjaHVuazoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGZoLndyaXRlKGNodW5rKQogICAgaWYgaXNfanNvbjoKICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhkZXN0LnJlYWRfdGV4dCgpKQogICAgcmV0dXJuIE5vbmUKCgpkZWYgX2dldF9qc29uKHVybDogc3RyLCBwYXJhbXM6IGRpY3QpIC0+IGRpY3Q6CiAgICBpZiByZXF1ZXN0cyBpcyBub3QgTm9uZToKICAgICAgICByID0gcmVxdWVzdHMuZ2V0KHVybCwgcGFyYW1zPXBhcmFtcywgdGltZW91dD0xMjAsIGhlYWRlcnM9eyJVc2VyLUFnZW50IjogVVNFUl9BR0VOVH0pCiAgICAgICAgci5yYWlzZV9mb3Jfc3RhdHVzKCkKICAgICAgICByZXR1cm4gci5qc29uKCkKICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IFJlcXVlc3QsIHVybG9wZW4KICAgIGZ1bGwgPSB1cmwgKyAiPyIgKyB1cmxlbmNvZGUocGFyYW1zKQogICAgd2l0aCB1cmxvcGVuKFJlcXVlc3QoZnVsbCwgaGVhZGVycz17IlVzZXItQWdlbnQiOiBVU0VSX0FHRU5UfSksIHRpbWVvdXQ9MTIwKSBhcyByZXNwOgogICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJlc3AucmVhZCgpKQoKCmRlZiBfYmJveF9saXN0KGJib3g6IHN0ciB8IE5vbmUpIC0+IGxpc3RbZmxvYXRdIHwgTm9uZToKICAgIGlmIG5vdCBiYm94OgogICAgICAgIHJldHVybiBOb25lCiAgICB2YWxzID0gW2Zsb2F0KHYpIGZvciB2IGluIGJib3guc3BsaXQoIiwiKV0KICAgIGlmIGxlbih2YWxzKSAhPSA0OgogICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoIi0tYmJveCBtdXN0IGJlIHhtaW4seW1pbix4bWF4LHltYXgiKQogICAgcmV0dXJuIHZhbHMKCgpkZWYgcmVzb2x2ZV91c2dzXzNkZXAoYmJveDogbGlzdFtmbG9hdF0sIHJlc29sdXRpb246IHN0ciB8IE5vbmUpIC0+IHR1cGxlW3N0ciwgZGljdF06CiAgICAiIiJSZXNvbHZlIDNERVAgdGlsZXMgY292ZXJpbmcgdGhlIGJib3ggZnJvbSBVU0dTJ3Mgb2ZmaWNpYWwgcHVibGljIFMzIHN0YWdpbmcKICAgIGJ1Y2tldCAocHJkLXRubS5zMy5hbWF6b25hd3MuY29tKS4gVGlsZXMgYXJlIDF4MSBkZWdyZWUsIG5hbWVkCiAgICBVU0dTXzxyZXM+XzxufHM+PGxhdD48d3xsb24+LnRpZiB3aGVyZSB0aGUgY29vcmRpbmF0ZXMgYXJlIHRoZSB0aWxlJ3MKICAgIE5PUlRILVdFU1QgY29ybmVyICh2ZXJpZmllZCBhZ2FpbnN0IHJlYWwgdGlsZXM6IG4zOXcxMDYgY292ZXJzIGxhdCAzOC0zOSwKICAgIGxvbiAtMTA2Li4tMTA1KS4gRGVmYXVsdCByZXNvbHV0aW9uICIxIiAoMSBhcmMtc2Vjb25kLCB+NTAgTUIvdGlsZSk7CiAgICAiMTMiIGlzIDEvMyBhcmMtc2Vjb25kICh+NDAwIE1CL3RpbGUpLiBSZXR1cm5zIChkb3dubG9hZF91cmwsIG1ldGFkYXRhKS4KCiAgICBUaGUgVE5NIFJFU1QgQVBJIChlbGV2YXRpb24ubmF0aW9uYWxtYXAuZ292L3YxKSBpcyBXQUYtZ2F0ZWQgZm9yCiAgICBwcm9ncmFtbWF0aWMgYWNjZXNzOyB0aGUgUzMgYnVja2V0IGlzIHRoZSBzYW1lIG9mZmljaWFsIHN0YWdlZCBkYXRhLiIiIgogICAgaWYgcmVzb2x1dGlvbiBpcyBOb25lOgogICAgICAgIHJlc29sdXRpb24gPSAiMSIKICAgIHhtaW4sIHltaW4sIHhtYXgsIHltYXggPSBiYm94CiAgICB0aWxlcyA9IFtdCiAgICAjIHRpbGUgY292ZXJpbmcgbG9uIGJhbmQgW2xvbiwgbG9uKzEpIGlzIGxhYmVsZWQgd3xsb24gKHdlc3QgZWRnZSk7CiAgICAjIHRpbGUgY292ZXJpbmcgbGF0IGJhbmQgW2xhdCwgbGF0KzEpIGlzIGxhYmVsZWQgbnxsYXQrMSAobm9ydGggZWRnZSkKICAgIGZvciBsb24gaW4gcmFuZ2UoaW50KG1hdGguZmxvb3IoeG1pbikpLCBpbnQobWF0aC5mbG9vcih4bWF4KSkgKyAxKToKICAgICAgICBmb3IgbGF0IGluIHJhbmdlKGludChtYXRoLmZsb29yKHltaW4pKSwgaW50KG1hdGguZmxvb3IoeW1heCkpICsgMSk6CiAgICAgICAgICAgIG5zID0gZiJue2xhdCArIDE6MDJkfSIgaWYgbGF0ICsgMSA+PSAwIGVsc2UgZiJze2FicyhsYXQgKyAxKTowMmR9IgogICAgICAgICAgICBldyA9IGYid3thYnMobG9uKTowM2R9IiBpZiBsb24gPCAwIGVsc2UgZiJle2xvbjowM2R9IgogICAgICAgICAgICB0aWxlcy5hcHBlbmQoKGYiVVNHU197cmVzb2x1dGlvbn1fe25zfXtld30iLCBsYXQsIGxvbikpCiAgICBpZiBsZW4odGlsZXMpID4gMToKICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KCJiYm94IHNwYW5zIG1vcmUgdGhhbiBvbmUgMS1kZWdyZWUgM0RFUCB0aWxlIOKAlCBuYXJyb3cgdGhlIGJib3ggdG8gIgogICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhpbiBhIHNpbmdsZSBkZWdyZWUgY2VsbCAoZWFjaCB0aWxlIGlzIHRlbnMgdG8gaHVuZHJlZHMgb2YgTUI7ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJtb3NhaWNraW5nIG11bHRpcGxlIHRpbGVzIGlzIGRvbmUgaW4gcnVuX2NvZGUgd2l0aCByYXN0ZXJpby5tZXJnZSkuIikKICAgIGZvciBuYW1lLCBsYXQsIGxvbiBpbiB0aWxlczoKICAgICAgICBmb2xkZXIgPSBuYW1lLnNwbGl0KCJfIiwgMilbMl0KICAgICAgICB1cmwgPSAoZiJodHRwczovL3ByZC10bm0uczMuYW1hem9uYXdzLmNvbS9TdGFnZWRQcm9kdWN0cy9FbGV2YXRpb24vIgogICAgICAgICAgICAgICBmIntyZXNvbHV0aW9ufS9USUZGL2N1cnJlbnQve2ZvbGRlcn0ve25hbWV9LnRpZiIpCiAgICAgICAgaWYgcmVxdWVzdHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHIgPSByZXF1ZXN0cy5oZWFkKHVybCwgaGVhZGVycz17IlVzZXItQWdlbnQiOiBVU0VSX0FHRU5UfSwgdGltZW91dD0zMCkKICAgICAgICAgICAgaWYgbm90IHIub2s6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBzaXplID0gaW50KHIuaGVhZGVycy5nZXQoIkNvbnRlbnQtTGVuZ3RoIiwgMCkgb3IgMCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzaXplID0gMAogICAgICAgIHJldHVybiB1cmwsIHsidGlsZSI6IG5hbWUsICJieXRlcyI6IHNpemUsICJyZXNvbHV0aW9uIjogcmVzb2x1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgInN3X2Nvcm5lciI6IFtsb24sIGxhdF19CiAgICByYWlzZSBTeXN0ZW1FeGl0KCJObyAzREVQIHRpbGUgZm91bmQgZm9yIHRoYXQgYmJveCBvbiBwcmQtdG5tLnMzLmFtYXpvbmF3cy5jb20g4oCUICIKICAgICAgICAgICAgICAgICAgICAgImNoZWNrIHRoZSBiYm94IGlzIGluc2lkZSB0aGUgVVNBIGFuZCBub3Qgb3ZlciB0aGUgb2NlYW4uIikKCgpkZWYgZ2V0X2RhdGFzZXQoZGF0YXNldF9pZDogc3RyLCBvdXRfZGlyOiBQYXRoLCBiYm94OiBsaXN0W2Zsb2F0XSB8IE5vbmUsCiAgICAgICAgICAgICAgICByZXNvbHV0aW9uOiBzdHIgfCBOb25lLCBhY2NlcHRfbGFyZ2U6IGJvb2wsIGZvcmNlOiBib29sKSAtPiBkaWN0OgogICAgc3JjID0gVkVUVEVEX1NPVVJDRVMuZ2V0KGRhdGFzZXRfaWQpCiAgICBpZiBzcmMgaXMgTm9uZToKICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KGYiVW5rbm93biBkYXRhc2V0IHtkYXRhc2V0X2lkIXJ9LiBVc2UgYGZldGNoX2RhdGEucHkgbGlzdGAg4oCUICIKICAgICAgICAgICAgICAgICAgICAgICAgICJvbmx5IHZldHRlZCBzb3VyY2VzIGFyZSBmZXRjaGFibGUuIFRvIGFkZCBvbmUsIGVkaXQgdGhlIHJlZ2lzdHJ5ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBnZW9raXQucHkgYWZ0ZXIgdmVyaWZ5aW5nIHRoZSBob3N0IGlzIGFuIG9mZmljaWFsIGFnZW5jeS4iKQogICAgaWYgc3JjLmdldCgicmVxdWlyZXNfYmJveCIpIGFuZCBub3QgYmJveDoKICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KGYie2RhdGFzZXRfaWR9IG5lZWRzIC0tYmJveCB4bWluLHltaW4seG1heCx5bWF4IikKICAgIGlmIHNyYy5nZXQoInJlcXVpcmVzX2xhcmdlIikgYW5kIG5vdCBhY2NlcHRfbGFyZ2U6CiAgICAgICAgcmFpc2UgU3lzdGVtRXhpdChmIntkYXRhc2V0X2lkfSBpcyBsYXJnZSAoe3NyYy5nZXQoJ3NpemVfbm90ZScsICd1bmtub3duIHNpemUnKX0pIOKAlCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAicGFzcyAtLWFjY2VwdC1sYXJnZSB0byBjb25maXJtLiIpCgogICAgdXJsID0gc3JjWyJ1cmwiXQogICAgbWV0YTogZGljdCA9IHt9CiAgICBpZiB1cmwuc3RhcnRzd2l0aCgiczM6Iik6CiAgICAgICAgaWYgZGF0YXNldF9pZCAhPSAidXNnc18zZGVwIjoKICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdChmIlMzIGRhdGFzZXQge2RhdGFzZXRfaWR9IGhhcyBubyBmZXRjaCBpbXBsZW1lbnRhdGlvbiIpCiAgICAgICAgdXJsLCBtZXRhID0gcmVzb2x2ZV91c2dzXzNkZXAoYmJveCwgcmVzb2x1dGlvbikKCiAgICBkZXN0X2RpciA9IG91dF9kaXIgLyBkYXRhc2V0X2lkCiAgICBkZXN0X2Rpci5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCiAgICBwcm92X3BhdGggPSBkZXN0X2RpciAvICJfcHJvdmVuYW5jZS5qc29uIgogICAgbWFya2VyID0gZGVzdF9kaXIgLyAiLmNvbXBsZXRlIgogICAgaWYgbWFya2VyLmlzX2ZpbGUoKSBhbmQgcHJvdl9wYXRoLmlzX2ZpbGUoKSBhbmQgbm90IGZvcmNlOgogICAgICAgIHJldHVybiB7Im9rIjogVHJ1ZSwgImRhdGFzZXQiOiBkYXRhc2V0X2lkLCAiYWxyZWFkeV9kb3dubG9hZGVkIjogVHJ1ZSwKICAgICAgICAgICAgICAgICJkaXIiOiBzdHIoZGVzdF9kaXIpLCAicHJvdmVuYW5jZSI6IGpzb24ubG9hZHMocHJvdl9wYXRoLnJlYWRfdGV4dCgpKX0KCiAgICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShkaXI9b3V0X2Rpciwgc3VmZml4PSIuZG93bmxvYWQiLCBkZWxldGU9RmFsc2UpIGFzIHRtcDoKICAgICAgICB0bXBfcGF0aCA9IFBhdGgodG1wLm5hbWUpCiAgICB0cnk6CiAgICAgICAgX2h0dHBfZ2V0KHVybCwgdG1wX3BhdGgpCiAgICAgICAgZGlnZXN0ID0gc2hhMjU2X29mKHRtcF9wYXRoKQogICAgICAgIG5ieXRlcyA9IHRtcF9wYXRoLnN0YXQoKS5zdF9zaXplCiAgICAgICAgZmluYWwgPSBkZXN0X2RpciAvIHVybC5yc3BsaXQoIi8iLCAxKVstMV0KICAgICAgICBmaW5hbC53cml0ZV9ieXRlcyh0bXBfcGF0aC5yZWFkX2J5dGVzKCkpCiAgICBmaW5hbGx5OgogICAgICAgIHRtcF9wYXRoLnVubGluayhtaXNzaW5nX29rPVRydWUpCgogICAgZXh0cmFjdGVkID0gW10KICAgIGlmIHppcGZpbGUuaXNfemlwZmlsZShmaW5hbCk6CiAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZmluYWwpIGFzIHpmOgogICAgICAgICAgICB6Zi5leHRyYWN0YWxsKGRlc3RfZGlyKQogICAgICAgICAgICBleHRyYWN0ZWQgPSB6Zi5uYW1lbGlzdCgpCgogICAgcHJvdmVuYW5jZSA9IHsKICAgICAgICAiZGF0YXNldCI6IGRhdGFzZXRfaWQsCiAgICAgICAgInVybCI6IHVybCwKICAgICAgICAicmV0cmlldmVkX3V0YyI6IGR0LmRhdGV0aW1lLm5vdyhkdC50aW1lem9uZS51dGMpLmlzb2Zvcm1hdCh0aW1lc3BlYz0ic2Vjb25kcyIpLAogICAgICAgICJzaGEyNTYiOiBkaWdlc3QsCiAgICAgICAgImJ5dGVzIjogbmJ5dGVzLAogICAgICAgICJsaWNlbnNlIjogc3JjLmdldCgibGljZW5zZSIpLAogICAgICAgICJhZ2VuY3kiOiBzcmMuZ2V0KCJhZ2VuY3kiKSwKICAgICAgICAiYXBpX21ldGFkYXRhIjogbWV0YSBvciBOb25lLAogICAgICAgICJiYm94IjogYmJveCwKICAgIH0KICAgIHByb3ZfcGF0aC53cml0ZV90ZXh0KGpzb24uZHVtcHMocHJvdmVuYW5jZSwgaW5kZW50PTIpICsgIlxuIikKICAgIG1hcmtlci53cml0ZV90ZXh0KCJva1xuIikKICAgIHJldHVybiB7Im9rIjogVHJ1ZSwgImRhdGFzZXQiOiBkYXRhc2V0X2lkLCAiZGlyIjogc3RyKGRlc3RfZGlyKSwgImFyY2hpdmUiOiBzdHIoZmluYWwpLAogICAgICAgICAgICAic2hhMjU2IjogZGlnZXN0LCAiYnl0ZXMiOiBuYnl0ZXMsICJleHRyYWN0ZWRfZmlsZXMiOiBsZW4oZXh0cmFjdGVkKSwKICAgICAgICAgICAgInByb3ZlbmFuY2UiOiBwcm92ZW5hbmNlfQoKCmRlZiBtYWluKGFyZ3Y6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lKSAtPiBpbnQ6CiAgICBhcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5SYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIpCiAgICBzdWIgPSBhcC5hZGRfc3VicGFyc2VycyhkZXN0PSJjbWQiLCByZXF1aXJlZD1UcnVlKQogICAgc3ViLmFkZF9wYXJzZXIoImxpc3QiLCBoZWxwPSJsaXN0IHZldHRlZCBzb3VyY2VzIChvcHRpb25hbGx5IGZpbHRlcmVkKSIpLmFkZF9hcmd1bWVudCgKICAgICAgICAicGF0dGVybiIsIG5hcmdzPSI/IikKICAgIHAgPSBzdWIuYWRkX3BhcnNlcigiZ2V0IiwgaGVscD0iZG93bmxvYWQgYSBkYXRhc2V0IGZyb20gaXRzIHZldHRlZCBzb3VyY2UiKQogICAgcC5hZGRfYXJndW1lbnQoImRhdGFzZXQiKQogICAgcC5hZGRfYXJndW1lbnQoIi0tb3V0IiwgZGVmYXVsdD0iZGF0YSIsIGhlbHA9ImRpcmVjdG9yeSB0byBwbGFjZSBkYXRhLzxkYXRhc2V0Pi8gKGRlZmF1bHQgLi9kYXRhKSIpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1iYm94IiwgaGVscD0ieG1pbix5bWluLHhtYXgseW1heCDigJQgcmVxdWlyZWQgZm9yIEFQSSBkYXRhc2V0cyAodXNnc18zZGVwKSIpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1yZXMiLCBoZWxwPSIzREVQIHJlc29sdXRpb24gZmlsdGVyLCBlLmcuIDEzICgxLzMgYXJjLXNlYyksIDMwICgxIGFyYy1zZWMpIikKICAgIHAuYWRkX2FyZ3VtZW50KCItLWFjY2VwdC1sYXJnZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1mb3JjZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGhlbHA9InJlLWRvd25sb2FkIGV2ZW4gaWYgcHJlc2VudCIpCiAgICBhcmdzID0gYXAucGFyc2VfYXJncyhhcmd2KQoKICAgIGlmIGFyZ3MuY21kID09ICJsaXN0IjoKICAgICAgICBwYXQgPSAoYXJncy5wYXR0ZXJuIG9yICIiKS5sb3dlcigpCiAgICAgICAgcm93cyA9IHtrOiB7IndoYXQiOiB2WyJ3aGF0Il0sICJhZ2VuY3kiOiB2WyJhZ2VuY3kiXSwgInVybCI6IHZbInVybCJdfQogICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gVkVUVEVEX1NPVVJDRVMuaXRlbXMoKQogICAgICAgICAgICAgICAgaWYgcGF0IGluIGsgb3IgcGF0IGluIHZbIndoYXQiXS5sb3dlcigpIG9yIHBhdCBpbiB2WyJhZ2VuY3kiXS5sb3dlcigpfQogICAgICAgIHByaW50KGpzb24uZHVtcHMocm93cywgaW5kZW50PTIpKQogICAgICAgIHJldHVybiAwCgogICAgcmVzdWx0ID0gZ2V0X2RhdGFzZXQoYXJncy5kYXRhc2V0LCBQYXRoKGFyZ3Mub3V0KSwgX2Jib3hfbGlzdChhcmdzLmJib3gpLAogICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5yZXMsIGFyZ3MuYWNjZXB0X2xhcmdlLCBhcmdzLmZvcmNlKQogICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQsIGluZGVudD0yLCBkZWZhdWx0PXN0cikpCiAgICByZXR1cm4gMAoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBzeXMuZXhpdChtYWluKCkpCg==","executable":false},{"filename":"scripts/geokit.py","mimeType":"text/x-python","data":"IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiJnZW9raXQg4oCUIHNoYXJlZCBoZWxwZXJzIGZvciB0aGUgZ2Vvc3BhdGlhbC1hbmFseXN0IHNraWxsLgoKUHVyZSBzdGFuZGFyZCBsaWJyYXJ5IChpbXBvcnRhYmxlIGZyb20gcnVuX2NvZGUgd2l0aCBubyBnZW8gc3RhY2sgaW5zdGFsbGVkKS4KUHJvdmlkZXM6CiAgKiBsYXllcmVkIG1hcC1wcm9qZWN0IG1hbmlmZXN0cyAobGF5ZXJzLmpzb24pIOKAlCB0aGUgdW5kby9yZWRvIGJhY2tib25lCiAgKiB0aGUgdmV0dGVkIGRhdGEtc291cmNlIHJlZ2lzdHJ5IChzaW5nbGUgc291cmNlIG9mIHRydXRoLCB1c2VkIGJ5IGZldGNoX2RhdGEucHkpCiAgKiBhIEpTT04gQ0xJOiBpbml0IC8gYWRkIC8gcmVtb3ZlIC8gc2hvdyAvIGhpZGUgLyByZXN0eWxlIC8gY2FudmFzIC8gbGlzdCAvIHZhbGlkYXRlCgpSdW4gYGdlb2tpdC5weSAtLWhlbHBgIGZvciB0aGUgQ0xJLCBvciBgaW1wb3J0IGdlb2tpdGAgZnJvbSBydW5fY29kZSBmb3IgdGhlIGhlbHBlcnMuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGRhdGV0aW1lIGFzIF9kdAppbXBvcnQgaGFzaGxpYgppbXBvcnQganNvbgppbXBvcnQgc3lzCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAoKTUFOSUZFU1RfU0NIRU1BID0gImdlb3NwYXRpYWwtYW5hbHlzdC9wcm9qZWN0QDEiCk1BTklGRVNUX05BTUUgPSAibGF5ZXJzLmpzb24iCgpMQVlFUl9LSU5EUyA9IHsKICAgICJ2ZWN0b3IiLCAgICAgICAgICAjIHBvaW50cyAvIGxpbmVzIC8gcG9seWdvbnMg4oCUIGdlb21ldHJ5IGtpbmQgYXV0by1kZXRlY3RlZAogICAgInJhc3RlciIsICAgICAgICAgICAjIHNpbmdsZS1iYW5kIHJhc3RlciwgY29udGludW91cyBvciBjYXRlZ29yaWNhbAogICAgInJhc3Rlcl9oaWxsc2hhZGUiLCAjIHNoYWRlZC1yZWxpZWYgcmVuZGVyIG9mIGFuIGVsZXZhdGlvbiByYXN0ZXIKICAgICJncmF0aWN1bGUiLCAgICAgICAgIyBsYXQvbG9uIG9yIHByb2plY3RlZCBncmlkIGxpbmVzCiAgICAic2NhbGViYXIiLAogICAgIm5vcnRoX2Fycm93IiwKICAgICJpbnNldCIsICAgICAgICAgICAgIyBzZWNvbmRhcnkgbWFwIHdpdGggaXRzIG93biBsYXllcnMKICAgICJicmVha291dCIsICAgICAgICAgIyB6b29tZWQgZGV0YWlsIHBhbmVsLCBhdXRvLWxpbmtlZCB0byB0aGUgbWFpbiBtYXAKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHZldHRlZCBzb3VyY2VzCiMgRXZlcnkgZW50cnkgcG9pbnRzIGF0IGFuIG9mZmljaWFsIGFnZW5jeS9jb25zb3J0aXVtIGhvc3QuIE5vIG1pcnJvcnMsIG5vCiMgcmFuZG9tIHJlaG9zdHMsIG5vIHBheXdhbGxlZCBvciBzY3JhcGVyLWhvc3RpbGUgZW5kcG9pbnRzLiBDaGVja3N1bXMgYXJlCiMgb3B0aW9uYWwgKGNvbnRlbnQgdmVyc2lvbnMgY2hhbmdlKTsgcHJvdmVuYW5jZSAodXJsICsgc2hhMjU2ICsgZGF0ZSkgaXMKIyBhbHdheXMgcmVjb3JkZWQgaW50byA8b3V0Pi88aWQ+L19wcm92ZW5hbmNlLmpzb24gYXQgZG93bmxvYWQgdGltZS4KVkVUVEVEX1NPVVJDRVMgPSB7CiAgICAjIC0tIE5hdHVyYWwgRWFydGggKHB1YmxpYyBkb21haW47IE5HQS9OQVNBLWRlcml2ZWQsIG5hY2lzY2RuIGlzIHRoZSBvZmZpY2lhbCBDRE4pCiAgICAibmVfY291bnRyaWVzXzExMG0iOiB7CiAgICAgICAgIndoYXQiOiAiV29ybGQgY291bnRyaWVzIChhZG1pbiAwKSwgMToxMTBtIOKAlCBnbG9iYWwgb3ZlcnZpZXcgY2hvcm9wbGV0aHMiLAogICAgICAgICJhZ2VuY3kiOiAiTmF0dXJhbCBFYXJ0aCAobmFjaXNjZG4ub3JnIG9mZmljaWFsIENETikiLAogICAgICAgICJsaWNlbnNlIjogIlB1YmxpYyBkb21haW4iLAogICAgICAgICJmb3JtYXQiOiAiRVNSSSBzaGFwZWZpbGUgKHppcCkiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9uYWNpc2Nkbi5vcmcvbmF0dXJhbGVhcnRoLzExMG0vY3VsdHVyYWwvbmVfMTEwbV9hZG1pbl8wX2NvdW50cmllcy56aXAiLAogICAgfSwKICAgICJuZV9jb3VudHJpZXNfNTBtIjogewogICAgICAgICJ3aGF0IjogIldvcmxkIGNvdW50cmllcyAoYWRtaW4gMCksIDE6NTBtIiwKICAgICAgICAiYWdlbmN5IjogIk5hdHVyYWwgRWFydGggKG5hY2lzY2RuLm9yZyBvZmZpY2lhbCBDRE4pIiwKICAgICAgICAibGljZW5zZSI6ICJQdWJsaWMgZG9tYWluIiwKICAgICAgICAiZm9ybWF0IjogIkVTUkkgc2hhcGVmaWxlICh6aXApIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vbmFjaXNjZG4ub3JnL25hdHVyYWxlYXJ0aC81MG0vY3VsdHVyYWwvbmVfNTBtX2FkbWluXzBfY291bnRyaWVzLnppcCIsCiAgICB9LAogICAgIm5lX2FkbWluMV91c18xMG0iOiB7CiAgICAgICAgIndoYXQiOiAiVVMgc3RhdGVzIC8gYWRtaW4tMSBwcm92aW5jZXMsIDE6MTBtIiwKICAgICAgICAiYWdlbmN5IjogIk5hdHVyYWwgRWFydGggKG5hY2lzY2RuLm9yZyBvZmZpY2lhbCBDRE4pIiwKICAgICAgICAibGljZW5zZSI6ICJQdWJsaWMgZG9tYWluIiwKICAgICAgICAiZm9ybWF0IjogIkVTUkkgc2hhcGVmaWxlICh6aXApIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vbmFjaXNjZG4ub3JnL25hdHVyYWxlYXJ0aC8xMG0vY3VsdHVyYWwvbmVfMTBtX2FkbWluXzFfc3RhdGVzX3Byb3ZpbmNlcy56aXAiLAogICAgfSwKICAgICJuZV9jaXRpZXNfMTBtIjogewogICAgICAgICJ3aGF0IjogIlBvcHVsYXRlZCBwbGFjZXMgd2l0aCBwb3B1bGF0aW9uIGF0dHJpYnV0ZXMsIDE6MTBtIiwKICAgICAgICAiYWdlbmN5IjogIk5hdHVyYWwgRWFydGggKG5hY2lzY2RuLm9yZyBvZmZpY2lhbCBDRE4pIiwKICAgICAgICAibGljZW5zZSI6ICJQdWJsaWMgZG9tYWluIiwKICAgICAgICAiZm9ybWF0IjogIkVTUkkgc2hhcGVmaWxlICh6aXApIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vbmFjaXNjZG4ub3JnL25hdHVyYWxlYXJ0aC8xMG0vY3VsdHVyYWwvbmVfMTBtX3BvcHVsYXRlZF9wbGFjZXNfc2ltcGxlLnppcCIsCiAgICB9LAogICAgIm5lX3JpdmVyc181MG0iOiB7CiAgICAgICAgIndoYXQiOiAiUml2ZXJzIGFuZCBsYWtlIGNlbnRlcmxpbmVzLCAxOjUwbSIsCiAgICAgICAgImFnZW5jeSI6ICJOYXR1cmFsIEVhcnRoIChuYWNpc2Nkbi5vcmcgb2ZmaWNpYWwgQ0ROKSIsCiAgICAgICAgImxpY2Vuc2UiOiAiUHVibGljIGRvbWFpbiIsCiAgICAgICAgImZvcm1hdCI6ICJFU1JJIHNoYXBlZmlsZSAoemlwKSIsCiAgICAgICAgInVybCI6ICJodHRwczovL25hY2lzY2RuLm9yZy9uYXR1cmFsZWFydGgvNTBtL3BoeXNpY2FsL25lXzUwbV9yaXZlcnNfbGFrZV9jZW50ZXJsaW5lcy56aXAiLAogICAgfSwKICAgICJuZV9sYWtlc181MG0iOiB7CiAgICAgICAgIndoYXQiOiAiTGFrZXMgKyByZXNlcnZvaXJzLCAxOjUwbSIsCiAgICAgICAgImFnZW5jeSI6ICJOYXR1cmFsIEVhcnRoIChuYWNpc2Nkbi5vcmcgb2ZmaWNpYWwgQ0ROKSIsCiAgICAgICAgImxpY2Vuc2UiOiAiUHVibGljIGRvbWFpbiIsCiAgICAgICAgImZvcm1hdCI6ICJFU1JJIHNoYXBlZmlsZSAoemlwKSIsCiAgICAgICAgInVybCI6ICJodHRwczovL25hY2lzY2RuLm9yZy9uYXR1cmFsZWFydGgvNTBtL3BoeXNpY2FsL25lXzUwbV9sYWtlcy56aXAiLAogICAgfSwKICAgICJuZV9yZWxpZWZfNTBtIjogewogICAgICAgICJ3aGF0IjogIk5hdHVyYWwgRWFydGggSUkgc2hhZGVkLXJlbGllZiByYXN0ZXIgMTo1MG0g4oCUIGJhc2VtYXAgdW5kZXIgdmVjdG9ycyIsCiAgICAgICAgImFnZW5jeSI6ICJOYXR1cmFsIEVhcnRoIChuYWNpc2Nkbi5vcmcgb2ZmaWNpYWwgQ0ROKSIsCiAgICAgICAgImxpY2Vuc2UiOiAiUHVibGljIGRvbWFpbiIsCiAgICAgICAgImZvcm1hdCI6ICJHZW9USUZGICh6aXApIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vbmFjaXNjZG4ub3JnL25hdHVyYWxlYXJ0aC81MG0vcmFzdGVyL05FMl81ME1fU1JfVy56aXAiLAogICAgICAgICJzaXplX25vdGUiOiAifjkwIE1CIHppcCIsCiAgICB9LAogICAgIyAtLSBVUyBDZW5zdXMgQnVyZWF1IChUSUdFUi9MaW5lIGNhcnRvZ3JhcGhpYyBib3VuZGFyaWVzLCBwdWJsaWMgZG9tYWluKQogICAgImNlbnN1c19zdGF0ZXNfMjAyNCI6IHsKICAgICAgICAid2hhdCI6ICJVUyBzdGF0ZSBib3VuZGFyaWVzLCBjYXJ0b2dyYXBoaWMgKGdlbmVyYWxpemVkIDE6NTAwaykiLAogICAgICAgICJhZ2VuY3kiOiAiVVMgQ2Vuc3VzIEJ1cmVhdSAod3d3Mi5jZW5zdXMuZ292KSIsCiAgICAgICAgImxpY2Vuc2UiOiAiUHVibGljIGRvbWFpbiAoVVMgZmVkZXJhbCBnb3Zlcm5tZW50KSIsCiAgICAgICAgImZvcm1hdCI6ICJFU1JJIHNoYXBlZmlsZSAoemlwKSIsCiAgICAgICAgInVybCI6ICJodHRwczovL3d3dzIuY2Vuc3VzLmdvdi9nZW8vdGlnZXIvR0VOWjIwMjQvc2hwL2NiXzIwMjRfdXNfc3RhdGVfNTAway56aXAiLAogICAgfSwKICAgICJjZW5zdXNfY291bnRpZXNfMjAyNCI6IHsKICAgICAgICAid2hhdCI6ICJVUyBjb3VudHkgYm91bmRhcmllcywgY2FydG9ncmFwaGljIChnZW5lcmFsaXplZCAxOjUwMGspIiwKICAgICAgICAiYWdlbmN5IjogIlVTIENlbnN1cyBCdXJlYXUgKHd3dzIuY2Vuc3VzLmdvdikiLAogICAgICAgICJsaWNlbnNlIjogIlB1YmxpYyBkb21haW4gKFVTIGZlZGVyYWwgZ292ZXJubWVudCkiLAogICAgICAgICJmb3JtYXQiOiAiRVNSSSBzaGFwZWZpbGUgKHppcCkiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly93d3cyLmNlbnN1cy5nb3YvZ2VvL3RpZ2VyL0dFTloyMDI0L3NocC9jYl8yMDI0X3VzX2NvdW50eV81MDBrLnppcCIsCiAgICB9LAogICAgIyAtLSBVU0dTICgzREVQIGVsZXZhdGlvbiB2aWEgVGhlIE5hdGlvbmFsIE1hcCBBY2Nlc3MgQVBJOyBHZW9KU09OIGVhcnRocXVha2UgZmVlZCkKICAgICJ1c2dzXzNkZXAiOiB7CiAgICAgICAgIndoYXQiOiAiM0RFUCBERU0gdGlsZXMgKDEvMywgMS85LCAxLzMwIGFyYy1zZWNvbmQgR2VvVElGRikgZm9yIGEgYmJveCDigJQgem9uYWwtc3RhdHMtcmVhZHkgZWxldmF0aW9uIiwKICAgICAgICAiYWdlbmN5IjogIlVTR1MgVGhlIE5hdGlvbmFsIE1hcCAoZWxldmF0aW9uLm5hdGlvbmFsbWFwLmdvdikiLAogICAgICAgICJsaWNlbnNlIjogIlB1YmxpYyBkb21haW4gKFVTIGZlZGVyYWwgZ292ZXJubWVudCkiLAogICAgICAgICJmb3JtYXQiOiAiR2VvVElGRiIsCiAgICAgICAgInVybCI6ICJzMzpodHRwczovL3ByZC10bm0uczMuYW1hem9uYXdzLmNvbS9TdGFnZWRQcm9kdWN0cy9FbGV2YXRpb24vIiwgICMgb2ZmaWNpYWwgVVNHUyBzdGFnaW5nIGJ1Y2tldAogICAgICAgICJyZXF1aXJlc19iYm94IjogVHJ1ZSwKICAgICAgICAic2l6ZV9ub3RlIjogIjEgYXJjLXNlYyB0aWxlIH41MCBNQjsgcGFzcyAtLXJlcyAxMyBmb3IgMS8zIGFyYy1zZWMgKH40MDAgTUIpIiwKICAgIH0sCiAgICAidXNnc19lYXJ0aHF1YWtlc19tb250aCI6IHsKICAgICAgICAid2hhdCI6ICJBbGwgZWFydGhxdWFrZXMgTTErIGluIHRoZSBwYXN0IDMwIGRheXMgKEdlb0pTT04sIGxpdmUgZmVlZCkiLAogICAgICAgICJhZ2VuY3kiOiAiVVNHUyBFYXJ0aHF1YWtlIEhhemFyZHMgUHJvZ3JhbSIsCiAgICAgICAgImxpY2Vuc2UiOiAiUHVibGljIGRvbWFpbiAoVVMgZmVkZXJhbCBnb3Zlcm5tZW50KSIsCiAgICAgICAgImZvcm1hdCI6ICJHZW9KU09OIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vZWFydGhxdWFrZS51c2dzLmdvdi9lYXJ0aHF1YWtlcy9mZWVkL3YxLjAvc3VtbWFyeS8xLjBfbW9udGguZ2VvanNvbiIsCiAgICAgICAgIm5vdGUiOiAicm9sbGluZyB3aW5kb3cg4oCUIGNvbnRlbnQgY2hhbmdlcyBkYWlseTsgcmVjb3JkIHByb3ZlbmFuY2UgZm9yIHJlcHJvZHVjaWJpbGl0eSIsCiAgICB9LAogICAgIyAtLSBOT0FBIE5DRUkgKGdsb2JhbCByZWxpZWYpCiAgICAibm9hYV9ldG9wbzFfaWNlIjogewogICAgICAgICJ3aGF0IjogIkVUT1BPMSBnbG9iYWwgMS1hcmMtbWludXRlIHJlbGllZiAoaWNlIHN1cmZhY2UpLCBHZW9USUZGIiwKICAgICAgICAiYWdlbmN5IjogIk5PQUEgTkNFSSAobmdkYy5ub2FhLmdvdikiLAogICAgICAgICJsaWNlbnNlIjogIlB1YmxpYyBkb21haW4gKFVTIGZlZGVyYWwgZ292ZXJubWVudCkiLAogICAgICAgICJmb3JtYXQiOiAiR2VvVElGRiAoemlwKSIsCiAgICAgICAgInVybCI6ICJodHRwczovL3d3dy5uZ2RjLm5vYWEuZ292L21nZy9nbG9iYWwvcmVsaWVmL0VUT1BPMS9kYXRhL2ljZV9zdXJmYWNlL2dyaWRfcmVnaXN0ZXJlZC9nZW9yZWZlcmVuY2VkX3RpZmYvRVRPUE8xX0ljZV9nX2dlb3RpZmYuemlwIiwKICAgICAgICAic2l6ZV9ub3RlIjogIn4yNTAgTUIgemlwIOKAlCBwYXNzIC0tYWNjZXB0LWxhcmdlIiwKICAgICAgICAicmVxdWlyZXNfbGFyZ2UiOiBUcnVlLAogICAgfSwKfQoKCmRlZiB2ZXR0ZWRfc291cmNlKGRhdGFzZXRfaWQ6IHN0cikgLT4gZGljdDoKICAgIHNyYyA9IFZFVFRFRF9TT1VSQ0VTLmdldChkYXRhc2V0X2lkKQogICAgaWYgc3JjIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgU3lzdGVtRXhpdCgKICAgICAgICAgICAgZiJVbmtub3duIGRhdGFzZXQge2RhdGFzZXRfaWQhcn0uIFZldHRlZCBzb3VyY2VzOiB7JywgJy5qb2luKHNvcnRlZChWRVRURURfU09VUkNFUykpfSIKICAgICAgICApCiAgICByZXR1cm4gc3JjCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb2plY3QgbWFuaWZlc3QKCmRlZiBfbm93KCkgLT4gc3RyOgogICAgcmV0dXJuIF9kdC5kYXRldGltZS5ub3coX2R0LnRpbWV6b25lLnV0YykuaXNvZm9ybWF0KHRpbWVzcGVjPSJzZWNvbmRzIikKCgpkZWYgbWFuaWZlc3RfcGF0aChwcm9qZWN0X2Rpcjogc3RyIHwgUGF0aCkgLT4gUGF0aDoKICAgIHJldHVybiBQYXRoKHByb2plY3RfZGlyKSAvIE1BTklGRVNUX05BTUUKCgpkZWYgbG9hZF9tYW5pZmVzdChwcm9qZWN0X2Rpcjogc3RyIHwgUGF0aCkgLT4gZGljdDoKICAgIHBhdGggPSBtYW5pZmVzdF9wYXRoKHByb2plY3RfZGlyKQogICAgaWYgbm90IHBhdGguaXNfZmlsZSgpOgogICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoZiJObyB7TUFOSUZFU1RfTkFNRX0gdW5kZXIge3Byb2plY3RfZGlyfSDigJQgcnVuIGBnZW9raXQucHkgaW5pdGAgZmlyc3QuIikKICAgIG0gPSBqc29uLmxvYWRzKHBhdGgucmVhZF90ZXh0KCkpCiAgICBpZiBtLmdldCgic2NoZW1hIikgIT0gTUFOSUZFU1RfU0NIRU1BOgogICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoZiJVbnN1cHBvcnRlZCBtYW5pZmVzdCBzY2hlbWEge20uZ2V0KCdzY2hlbWEnKSFyfSIpCiAgICByZXR1cm4gbQoKCmRlZiBzYXZlX21hbmlmZXN0KHByb2plY3RfZGlyOiBzdHIgfCBQYXRoLCBtYW5pZmVzdDogZGljdCkgLT4gTm9uZToKICAgIG1hbmlmZXN0WyJtb2RpZmllZCJdID0gX25vdygpCiAgICBtYW5pZmVzdF9wYXRoKHByb2plY3RfZGlyKS53cml0ZV90ZXh0KGpzb24uZHVtcHMobWFuaWZlc3QsIGluZGVudD0yKSArICJcbiIpCgoKZGVmIGluaXRfcHJvamVjdChkaXJlY3Rvcnk6IHN0ciB8IFBhdGgsIGNyczogc3RyID0gIkVQU0c6NDMyNiIsIHRpdGxlOiBzdHIgfCBOb25lID0gTm9uZSkgLT4gZGljdDoKICAgIHJvb3QgPSBQYXRoKGRpcmVjdG9yeSkKICAgIChyb290IC8gImRhdGEiKS5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCiAgICAocm9vdCAvICJyZW5kZXJzIikubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQogICAgbWFuaWZlc3QgPSB7CiAgICAgICAgInNjaGVtYSI6IE1BTklGRVNUX1NDSEVNQSwKICAgICAgICAiY3JlYXRlZCI6IF9ub3coKSwKICAgICAgICAibW9kaWZpZWQiOiBfbm93KCksCiAgICAgICAgImNhbnZhcyI6IHsKICAgICAgICAgICAgImNycyI6IGNycywKICAgICAgICAgICAgImV4dGVudCI6IE5vbmUsICAgICAgICAgICMgbnVsbCA9IGZpdCB0byB2aXNpYmxlIGxheWVycwogICAgICAgICAgICAidGl0bGUiOiB0aXRsZSwKICAgICAgICAgICAgIm91dCI6ICJtYXAucG5nIiwKICAgICAgICAgICAgIndpZHRoX2luIjogNy40OCwgICAgICAgICMgZG91YmxlLWNvbHVtbiBqb3VybmFsIHdpZHRoCiAgICAgICAgICAgICJoZWlnaHRfaW4iOiA1LjAsCiAgICAgICAgICAgICJkcGkiOiAzMDAsCiAgICAgICAgfSwKICAgICAgICAibGF5ZXJzIjogW10sCiAgICAgICAgImhpc3RvcnkiOiBbXSwKICAgIH0KICAgIHNhdmVfbWFuaWZlc3Qocm9vdCwgbWFuaWZlc3QpCiAgICByZXR1cm4gbWFuaWZlc3QKCgpkZWYgX3JlY29yZChtYW5pZmVzdDogZGljdCwgYWN0aW9uOiBzdHIsIGRldGFpbDogZGljdCkgLT4gTm9uZToKICAgIG1hbmlmZXN0LnNldGRlZmF1bHQoImhpc3RvcnkiLCBbXSkuYXBwZW5kKHsiYWN0aW9uIjogYWN0aW9uLCAiZGV0YWlsIjogZGV0YWlsLCAiYXQiOiBfbm93KCl9KQogICAgIyBrZWVwIHRoZSB1bmRvIHRyYWlsIGJvdW5kZWQg4oCUIHRoZSBsYXllciBsaXN0IGl0c2VsZiBpcyB0aGUgY3VycmVudCB0cnV0aAogICAgZGVsIG1hbmlmZXN0WyJoaXN0b3J5Il1bOi0yMDBdCgoKZGVmIF9maW5kX2xheWVyKG1hbmlmZXN0OiBkaWN0LCBsYXllcl9pZDogc3RyKSAtPiB0dXBsZVtpbnQsIGRpY3RdOgogICAgZm9yIGksIGxheWVyIGluIGVudW1lcmF0ZShtYW5pZmVzdFsibGF5ZXJzIl0pOgogICAgICAgIGlmIGxheWVyLmdldCgiaWQiKSA9PSBsYXllcl9pZDoKICAgICAgICAgICAgcmV0dXJuIGksIGxheWVyCiAgICByYWlzZSBTeXN0ZW1FeGl0KGYiTm8gbGF5ZXIgd2l0aCBpZCB7bGF5ZXJfaWQhcn0uIEtub3duOiAiCiAgICAgICAgICAgICAgICAgICAgIGYie1tsLmdldCgnaWQnKSBmb3IgbCBpbiBtYW5pZmVzdFsnbGF5ZXJzJ11dfSIpCgoKZGVmIGFkZF9sYXllcihwcm9qZWN0X2Rpcjogc3RyIHwgUGF0aCwgbGF5ZXI6IGRpY3QpIC0+IGRpY3Q6CiAgICBtYW5pZmVzdCA9IGxvYWRfbWFuaWZlc3QocHJvamVjdF9kaXIpCiAgICBpZiBhbnkobC5nZXQoImlkIikgPT0gbGF5ZXJbImlkIl0gZm9yIGwgaW4gbWFuaWZlc3RbImxheWVycyJdKToKICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KGYiTGF5ZXIgaWQge2xheWVyWydpZCddIXJ9IGFscmVhZHkgZXhpc3RzIOKAlCBwaWNrIGEgbmV3IGlkIG9yIHVzZSBgcmVzdHlsZWAuIikKICAgIGlmIGxheWVyLmdldCgia2luZCIpIG5vdCBpbiBMQVlFUl9LSU5EUzoKICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KGYia2luZCB7bGF5ZXIuZ2V0KCdraW5kJykhcn0gaW52YWxpZC4gS2luZHM6IHtzb3J0ZWQoTEFZRVJfS0lORFMpfSIpCiAgICBtYW5pZmVzdFsibGF5ZXJzIl0uYXBwZW5kKGxheWVyKQogICAgX3JlY29yZChtYW5pZmVzdCwgImFkZF9sYXllciIsIHsiaWQiOiBsYXllclsiaWQiXSwgImtpbmQiOiBsYXllclsia2luZCJdfSkKICAgIHNhdmVfbWFuaWZlc3QocHJvamVjdF9kaXIsIG1hbmlmZXN0KQogICAgcmV0dXJuIGxheWVyCgoKZGVmIGVkaXRfbGF5ZXIocHJvamVjdF9kaXI6IHN0ciB8IFBhdGgsIGxheWVyX2lkOiBzdHIsIHBhdGNoOiBkaWN0LCBhY3Rpb246IHN0ciA9ICJlZGl0X2xheWVyIikgLT4gZGljdDoKICAgIG1hbmlmZXN0ID0gbG9hZF9tYW5pZmVzdChwcm9qZWN0X2RpcikKICAgIF8sIGxheWVyID0gX2ZpbmRfbGF5ZXIobWFuaWZlc3QsIGxheWVyX2lkKQogICAgbGF5ZXIudXBkYXRlKHBhdGNoKQogICAgX3JlY29yZChtYW5pZmVzdCwgYWN0aW9uLCB7ImlkIjogbGF5ZXJfaWQsICoqe2s6IHYgZm9yIGssIHYgaW4gcGF0Y2guaXRlbXMoKSBpZiBrICE9ICdzdHlsZSd9fSkKICAgIHNhdmVfbWFuaWZlc3QocHJvamVjdF9kaXIsIG1hbmlmZXN0KQogICAgcmV0dXJuIGxheWVyCgoKZGVmIHJlbW92ZV9sYXllcihwcm9qZWN0X2Rpcjogc3RyIHwgUGF0aCwgbGF5ZXJfaWQ6IHN0cikgLT4gTm9uZToKICAgIG1hbmlmZXN0ID0gbG9hZF9tYW5pZmVzdChwcm9qZWN0X2RpcikKICAgIGksIF8gPSBfZmluZF9sYXllcihtYW5pZmVzdCwgbGF5ZXJfaWQpCiAgICBtYW5pZmVzdFsibGF5ZXJzIl0ucG9wKGkpCiAgICBfcmVjb3JkKG1hbmlmZXN0LCAicmVtb3ZlX2xheWVyIiwgeyJpZCI6IGxheWVyX2lkfSkKICAgIHNhdmVfbWFuaWZlc3QocHJvamVjdF9kaXIsIG1hbmlmZXN0KQoKCmRlZiB2YWxpZGF0ZV9wcm9qZWN0KHByb2plY3RfZGlyOiBzdHIgfCBQYXRoKSAtPiBsaXN0W3N0cl06CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHByb2JsZW1zIChlbXB0eSBsaXN0ID0gaGVhbHRoeSkuIENoZWNrcyBzcmMgZmlsZXMgYW5kIHogb3JkZXIuIiIiCiAgICBtYW5pZmVzdCA9IGxvYWRfbWFuaWZlc3QocHJvamVjdF9kaXIpCiAgICBwcm9ibGVtczogbGlzdFtzdHJdID0gW10KICAgIHJvb3QgPSBQYXRoKHByb2plY3RfZGlyKQogICAgc2Vlbl96OiBkaWN0W2Zsb2F0LCBzdHJdID0ge30KICAgIGZvciBsYXllciBpbiBtYW5pZmVzdFsibGF5ZXJzIl06CiAgICAgICAgbGlkID0gbGF5ZXIuZ2V0KCJpZCIsICI/IikKICAgICAgICBpZiBsYXllci5nZXQoImtpbmQiKSBub3QgaW4gTEFZRVJfS0lORFM6CiAgICAgICAgICAgIHByb2JsZW1zLmFwcGVuZChmImxheWVyIHtsaWR9OiB1bmtub3duIGtpbmQge2xheWVyLmdldCgna2luZCcpIXJ9IikKICAgICAgICB6ID0gbGF5ZXIuZ2V0KCJ6IikKICAgICAgICBpZiB6IGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiB6IGluIHNlZW5fejoKICAgICAgICAgICAgICAgIHByb2JsZW1zLmFwcGVuZChmImxheWVyIHtsaWR9OiB6PXt6fSBhbHNvIHVzZWQgYnkge3NlZW5felt6XX0gKHRpZXMgcmVuZGVyIHVucHJlZGljdGFibHkpIikKICAgICAgICAgICAgc2Vlbl96W3pdID0gbGlkCiAgICAgICAgc3JjID0gbGF5ZXIuZ2V0KCJzcmMiKQogICAgICAgIGlmIHNyYyBhbmQgbm90IChyb290IC8gc3JjKS5leGlzdHMoKToKICAgICAgICAgICAgcHJvYmxlbXMuYXBwZW5kKGYibGF5ZXIge2xpZH06IHNyYyB7c3JjIXJ9IG5vdCBmb3VuZCB1bmRlciB7cm9vdH0iKQogICAgICAgIGlmIGxheWVyLmdldCgia2luZCIpIGluIHsicmFzdGVyIiwgInJhc3Rlcl9oaWxsc2hhZGUifSBhbmQgbm90IHNyYzoKICAgICAgICAgICAgcHJvYmxlbXMuYXBwZW5kKGYibGF5ZXIge2xpZH06IHJhc3RlciBsYXllcnMgbmVlZCBzcmMiKQogICAgZm9yIGV4dHJhIGluICgiaW5zZXQiLCAiYnJlYWtvdXQiKToKICAgICAgICBmb3IgbGF5ZXIgaW4gbWFuaWZlc3RbImxheWVycyJdOgogICAgICAgICAgICBpZiBsYXllci5nZXQoImtpbmQiKSA9PSBleHRyYSBhbmQgbm90IGxheWVyLmdldCgibGF5ZXJzIik6CiAgICAgICAgICAgICAgICBwcm9ibGVtcy5hcHBlbmQoZiJsYXllciB7bGF5ZXIuZ2V0KCdpZCcpfToge2V4dHJhfSBuZWVkcyBhIHN1Yi1sYXllciBsaXN0ICgnbGF5ZXJzJykiKQogICAgcmV0dXJuIHByb2JsZW1zCgoKZGVmIHNoYTI1Nl9vZihwYXRoOiBzdHIgfCBQYXRoLCBjaHVuazogaW50ID0gMSA8PCAyMCkgLT4gc3RyOgogICAgaCA9IGhhc2hsaWIuc2hhMjU2KCkKICAgIHdpdGggb3BlbihwYXRoLCAicmIiKSBhcyBmaDoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBibG9jayA9IGZoLnJlYWQoY2h1bmspCiAgICAgICAgICAgIGlmIG5vdCBibG9jazoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGgudXBkYXRlKGJsb2NrKQogICAgcmV0dXJuIGguaGV4ZGlnZXN0KCkKCgpkZWYgcHJpbnRfanNvbihvYmo6IGRpY3QpIC0+IE5vbmU6CiAgICBwcmludChqc29uLmR1bXBzKG9iaiwgaW5kZW50PTIsIGRlZmF1bHQ9c3RyKSkKCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0xJCgpkZWYgX3N0eWxlX2Zyb21fYXJncyhhcmdzKSAtPiBkaWN0OgogICAgc3R5bGU6IGRpY3QgPSB7fQogICAgaWYgYXJncy5zdHlsZToKICAgICAgICBzdHlsZS51cGRhdGUoanNvbi5sb2FkcyhhcmdzLnN0eWxlKSkKICAgIGZvciBrZXkgaW4gKCJjb2x1bW4iLCAiY21hcCIsICJjb2xvciIsICJhbHBoYSIsICJtYXJrZXJzaXplIiwgImVkZ2Vjb2xvciIsCiAgICAgICAgICAgICAgICAibGluZXdpZHRoIiwgImxhYmVsX2NvbHVtbiIsICJjYXRlZ29yaWNhbCIsICJzY2hlbWUiKToKICAgICAgICB2YWwgPSBnZXRhdHRyKGFyZ3MsIGtleSkKICAgICAgICBpZiB2YWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHN0eWxlW2tleV0gPSB2YWwKICAgIHJldHVybiBzdHlsZQoKCmRlZiBtYWluKGFyZ3Y6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lKSAtPiBpbnQ6CiAgICBhcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18sIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5SYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIpCiAgICBzdWIgPSBhcC5hZGRfc3VicGFyc2VycyhkZXN0PSJjbWQiLCByZXF1aXJlZD1UcnVlKQoKICAgIHAgPSBzdWIuYWRkX3BhcnNlcigiaW5pdCIsIGhlbHA9ImNyZWF0ZSBhIGxheWVyZWQgbWFwIHByb2plY3QiKQogICAgcC5hZGRfYXJndW1lbnQoImRpcmVjdG9yeSIpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1jcnMiLCBkZWZhdWx0PSJFUFNHOjQzMjYiLCBoZWxwPSJtYXAgQ1JTLCBkZWZhdWx0IEVQU0c6NDMyNiIpCiAgICBwLmFkZF9hcmd1bWVudCgiLS10aXRsZSIpCgogICAgcCA9IHN1Yi5hZGRfcGFyc2VyKCJhZGQiLCBoZWxwPSJhZGQgYSBsYXllciAoc3JjIHBhdGhzIGFyZSBwcm9qZWN0LXJlbGF0aXZlKSIpCiAgICBwLmFkZF9hcmd1bWVudCgiZGlyZWN0b3J5IikKICAgIHAuYWRkX2FyZ3VtZW50KCItLWlkIiwgcmVxdWlyZWQ9VHJ1ZSkKICAgIHAuYWRkX2FyZ3VtZW50KCItLWtpbmQiLCByZXF1aXJlZD1UcnVlLCBjaG9pY2VzPXNvcnRlZChMQVlFUl9LSU5EUykpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1zcmMiLCBoZWxwPSJwYXRoIHRvIHZlY3Rvci9yYXN0ZXIgZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QiKQogICAgcC5hZGRfYXJndW1lbnQoIi0teiIsIHR5cGU9ZmxvYXQsIHJlcXVpcmVkPVRydWUsIGhlbHA9ImRyYXcgb3JkZXI6IGxvdyA9IGJhc2UsIGhpZ2ggPSB0b3AiKQogICAgcC5hZGRfYXJndW1lbnQoIi0tcm9sZSIsIGRlZmF1bHQ9Tm9uZSkKICAgIHAuYWRkX2FyZ3VtZW50KCItLXN0eWxlIiwgaGVscD0iSlNPTiBzdHlsZSBvYmplY3QiKQogICAgZm9yIGZsYWcsIGhlbHBfIGluICgoImNvbHVtbiIsICJhdHRyaWJ1dGUgdG8gc3R5bGUgYnkgKGNob3JvcGxldGgvZ3JhZHVhdGUpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICgiY21hcCIsICJtYXRwbG90bGliIGNvbG9ybWFwIG5hbWUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgKCJjb2xvciIsICJzaW5nbGUgZmlsbC9zdHJva2UgY29sb3IiKSwKICAgICAgICAgICAgICAgICAgICAgICAgKCJhbHBoYSIsICJvcGFjaXR5IDAtMSIpLAogICAgICAgICAgICAgICAgICAgICAgICAoIm1hcmtlcnNpemUiLCAicG9pbnQgc2l6ZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAoImVkZ2Vjb2xvciIsICJzdHJva2UgY29sb3IgZm9yIHBvbHlnb25zL3BvaW50cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAoImxpbmV3aWR0aCIsICJsaW5lIHdpZHRoIiksCiAgICAgICAgICAgICAgICAgICAgICAgICgibGFiZWxfY29sdW1uIiwgImFubm90YXRlIGZlYXR1cmVzIHdpdGggdGhpcyBhdHRyaWJ1dGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgKCJzY2hlbWUiLCAiY2xhc3NpZmljYXRpb246IHF1YW50aWxlfGVxdWFsX2ludGVydmFsfGZpc2hlcmplbmtzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICgiayIsICJudW1iZXIgb2YgY2xhc3NlcyBmb3Igc2NoZW1lIikpOgogICAgICAgIHAuYWRkX2FyZ3VtZW50KGYiLS17ZmxhZ30iLCBoZWxwPWhlbHBfKQogICAgcC5hZGRfYXJndW1lbnQoIi0tY2F0ZWdvcmljYWwiLCBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgICAgICAgICAgICAgaGVscD0idHJlYXQgY29sdW1uIGFzIGNhdGVnb3JpZXMgKHVuaXF1ZS12YWx1ZSBzeW1ib2xvZ3kpIikKICAgIHAuYWRkX2FyZ3VtZW50KCItLW5vLWxlZ2VuZCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpCgogICAgcCA9IHN1Yi5hZGRfcGFyc2VyKCJpbnNldCIsIGhlbHA9ImFkZCBhbiBpbnNldC9icmVha291dCBwYW5lbCB3aXRoIHN1Yi1sYXllcnMiKQogICAgcC5hZGRfYXJndW1lbnQoImRpcmVjdG9yeSIpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1pZCIsIHJlcXVpcmVkPVRydWUpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1raW5kIiwgcmVxdWlyZWQ9VHJ1ZSwgY2hvaWNlcz1bImluc2V0IiwgImJyZWFrb3V0Il0pCiAgICBwLmFkZF9hcmd1bWVudCgiLS16IiwgdHlwZT1mbG9hdCwgcmVxdWlyZWQ9VHJ1ZSkKICAgIHAuYWRkX2FyZ3VtZW50KCItLXJlY3QiLCByZXF1aXJlZD1UcnVlLCBoZWxwPSJheGVzIHJlY3QgYXMgSlNPTiBbbGVmdCxib3R0b20sdyxoXSBpbiBmaWd1cmUgZnJhY3Rpb24iKQogICAgcC5hZGRfYXJndW1lbnQoIi0tYmJveCIsIHJlcXVpcmVkPVRydWUsIGhlbHA9IkpTT04gW21pbngsbWlueSxtYXh4LG1heHldIGluIHRoZSBwcm9qZWN0IENSUyIpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1sYXllcnMiLCByZXF1aXJlZD1UcnVlLCBoZWxwPSJKU09OIGxpc3Qgb2Ygc3ViLWxheWVyIGRpY3RzIChzYW1lIHNoYXBlIGFzIGBhZGRgKSIpCgogICAgcCA9IHN1Yi5hZGRfcGFyc2VyKCJyZW1vdmUiLCBoZWxwPSJyZW1vdmUgYSBsYXllciAodW5kbyA9IHJlLWFkZCBmcm9tIGhpc3RvcnkpIikKICAgIHAuYWRkX2FyZ3VtZW50KCJkaXJlY3RvcnkiKQogICAgcC5hZGRfYXJndW1lbnQoIi0taWQiLCByZXF1aXJlZD1UcnVlKQoKICAgIGZvciB2ZXJiLCB2aXNpYmxlIGluICgoInNob3ciLCBUcnVlKSwgKCJoaWRlIiwgRmFsc2UpKToKICAgICAgICBwID0gc3ViLmFkZF9wYXJzZXIodmVyYiwgaGVscD1mInt2ZXJifSBhIGxheWVyIHdpdGhvdXQgZGVsZXRpbmcgaXQiKQogICAgICAgIHAuYWRkX2FyZ3VtZW50KCJkaXJlY3RvcnkiKQogICAgICAgIHAuYWRkX2FyZ3VtZW50KCItLWlkIiwgcmVxdWlyZWQ9VHJ1ZSkKCiAgICBwID0gc3ViLmFkZF9wYXJzZXIoInJlc3R5bGUiLCBoZWxwPSJwYXRjaCBhIGxheWVyJ3Mgc3R5bGUvei92aXNpYmlsaXR5IChKU09OIG9iamVjdCkiKQogICAgcC5hZGRfYXJndW1lbnQoImRpcmVjdG9yeSIpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1pZCIsIHJlcXVpcmVkPVRydWUpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1wYXRjaCIsIHJlcXVpcmVkPVRydWUsIGhlbHA9J0pTT04gZS5nLiB7InN0eWxlIjogeyJjbWFwIjogIm1hZ21hIn0sICJ6IjogMzB9JykKCiAgICBwID0gc3ViLmFkZF9wYXJzZXIoImNhbnZhcyIsIGhlbHA9InNldCBjYW52YXMvZXh0ZW50L3RpdGxlL291dHB1dCBvcHRpb25zIikKICAgIHAuYWRkX2FyZ3VtZW50KCJkaXJlY3RvcnkiKQogICAgcC5hZGRfYXJndW1lbnQoIi0tZXh0ZW50IiwgaGVscD0iSlNPTiBbbWlueCxtaW55LG1heHgsbWF4eV0gaW4gcHJvamVjdCBDUlMsIG9yIG51bGwgdG8gZml0IGxheWVycyIpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1jcnMiKQogICAgcC5hZGRfYXJndW1lbnQoIi0tdGl0bGUiKQogICAgcC5hZGRfYXJndW1lbnQoIi0tb3V0IiwgaGVscD0ib3V0cHV0IGZpbGUgbmFtZSB1bmRlciByZW5kZXJzLyIpCiAgICBwLmFkZF9hcmd1bWVudCgiLS13aWR0aC1pbiIsIHR5cGU9ZmxvYXQpCiAgICBwLmFkZF9hcmd1bWVudCgiLS1oZWlnaHQtaW4iLCB0eXBlPWZsb2F0KQogICAgcC5hZGRfYXJndW1lbnQoIi0tZHBpIiwgdHlwZT1pbnQpCgogICAgcCA9IHN1Yi5hZGRfcGFyc2VyKCJsaXN0IiwgaGVscD0icHJpbnQgdGhlIG1hbmlmZXN0IikKICAgIHAuYWRkX2FyZ3VtZW50KCJkaXJlY3RvcnkiKQoKICAgIHAgPSBzdWIuYWRkX3BhcnNlcigidmFsaWRhdGUiLCBoZWxwPSJjaGVjayB0aGUgcHJvamVjdCBmb3IgcHJvYmxlbXMiKQogICAgcC5hZGRfYXJndW1lbnQoImRpcmVjdG9yeSIpCgogICAgcCA9IHN1Yi5hZGRfcGFyc2VyKCJ2ZXR0ZWQtc291cmNlcyIsIGhlbHA9InByaW50IHRoZSB2ZXR0ZWQgZGF0YS1zb3VyY2UgcmVnaXN0cnkiKQogICAgcC5hZGRfYXJndW1lbnQoInBhdHRlcm4iLCBuYXJncz0iPyIsIGhlbHA9ImNhc2UtaW5zZW5zaXRpdmUgZmlsdGVyIikKCiAgICBhcmdzID0gYXAucGFyc2VfYXJncyhhcmd2KQoKICAgIGlmIGFyZ3MuY21kID09ICJpbml0IjoKICAgICAgICBtID0gaW5pdF9wcm9qZWN0KGFyZ3MuZGlyZWN0b3J5LCBjcnM9YXJncy5jcnMsIHRpdGxlPWFyZ3MudGl0bGUpCiAgICAgICAgcHJpbnRfanNvbih7Im9rIjogVHJ1ZSwgImRpcmVjdG9yeSI6IHN0cihQYXRoKGFyZ3MuZGlyZWN0b3J5KS5yZXNvbHZlKCkpLAogICAgICAgICAgICAgICAgICAgICJtYW5pZmVzdCI6IG1hbmlmZXN0X3BhdGgoYXJncy5kaXJlY3RvcnkpLm5hbWUsICJjcnMiOiBhcmdzLmNyc30pCiAgICBlbGlmIGFyZ3MuY21kID09ICJhZGQiOgogICAgICAgIGxheWVyID0geyJpZCI6IGFyZ3MuaWQsICJraW5kIjogYXJncy5raW5kLCAieiI6IGFyZ3MueiwgInZpc2libGUiOiBUcnVlfQogICAgICAgIGlmIGFyZ3Muc3JjOgogICAgICAgICAgICBsYXllclsic3JjIl0gPSBhcmdzLnNyYwogICAgICAgIGlmIGFyZ3Mucm9sZToKICAgICAgICAgICAgbGF5ZXJbInJvbGUiXSA9IGFyZ3Mucm9sZQogICAgICAgIHN0eWxlID0gX3N0eWxlX2Zyb21fYXJncyhhcmdzKQogICAgICAgIGlmIHN0eWxlOgogICAgICAgICAgICBsYXllclsic3R5bGUiXSA9IHN0eWxlCiAgICAgICAgaWYgYXJncy5ub19sZWdlbmQ6CiAgICAgICAgICAgIGxheWVyWyJsZWdlbmQiXSA9IEZhbHNlCiAgICAgICAgYWRkX2xheWVyKGFyZ3MuZGlyZWN0b3J5LCBsYXllcikKICAgICAgICBwcmludF9qc29uKHsib2siOiBUcnVlLCAibGF5ZXIiOiBsYXllcn0pCiAgICBlbGlmIGFyZ3MuY21kID09ICJpbnNldCI6CiAgICAgICAgbGF5ZXIgPSB7ImlkIjogYXJncy5pZCwgImtpbmQiOiBhcmdzLmtpbmQsICJ6IjogYXJncy56LCAidmlzaWJsZSI6IFRydWUsCiAgICAgICAgICAgICAgICAgInJlY3QiOiBqc29uLmxvYWRzKGFyZ3MucmVjdCksICJiYm94IjoganNvbi5sb2FkcyhhcmdzLmJib3gpLAogICAgICAgICAgICAgICAgICJsYXllcnMiOiBqc29uLmxvYWRzKGFyZ3MubGF5ZXJzKX0KICAgICAgICBhZGRfbGF5ZXIoYXJncy5kaXJlY3RvcnksIGxheWVyKQogICAgICAgIHByaW50X2pzb24oeyJvayI6IFRydWUsICJsYXllciI6IGxheWVyfSkKICAgIGVsaWYgYXJncy5jbWQgPT0gInJlbW92ZSI6CiAgICAgICAgcmVtb3ZlX2xheWVyKGFyZ3MuZGlyZWN0b3J5LCBhcmdzLmlkKQogICAgICAgIHByaW50X2pzb24oeyJvayI6IFRydWUsICJyZW1vdmVkIjogYXJncy5pZH0pCiAgICBlbGlmIGFyZ3MuY21kIGluICgic2hvdyIsICJoaWRlIik6CiAgICAgICAgZWRpdF9sYXllcihhcmdzLmRpcmVjdG9yeSwgYXJncy5pZCwgeyJ2aXNpYmxlIjogdmlzaWJsZX0sIGFjdGlvbj1hcmdzLmNtZCkKICAgICAgICBwcmludF9qc29uKHsib2siOiBUcnVlLCAiaWQiOiBhcmdzLmlkLCAidmlzaWJsZSI6IHZpc2libGV9KQogICAgZWxpZiBhcmdzLmNtZCA9PSAicmVzdHlsZSI6CiAgICAgICAgbGF5ZXIgPSBlZGl0X2xheWVyKGFyZ3MuZGlyZWN0b3J5LCBhcmdzLmlkLCBqc29uLmxvYWRzKGFyZ3MucGF0Y2gpLCBhY3Rpb249InJlc3R5bGUiKQogICAgICAgIHByaW50X2pzb24oeyJvayI6IFRydWUsICJsYXllciI6IGxheWVyfSkKICAgIGVsaWYgYXJncy5jbWQgPT0gImNhbnZhcyI6CiAgICAgICAgbWFuaWZlc3QgPSBsb2FkX21hbmlmZXN0KGFyZ3MuZGlyZWN0b3J5KQogICAgICAgIHBhdGNoID0ge30KICAgICAgICBpZiBhcmdzLmV4dGVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGF0Y2hbImV4dGVudCJdID0ganNvbi5sb2FkcyhhcmdzLmV4dGVudCkKICAgICAgICBmb3Iga2V5LCB2YWwgaW4gKCgiY3JzIiwgYXJncy5jcnMpLCAoInRpdGxlIiwgYXJncy50aXRsZSksICgib3V0IiwgYXJncy5vdXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJ3aWR0aF9pbiIsIGFyZ3Mud2lkdGhfaW4pLCAoImhlaWdodF9pbiIsIGFyZ3MuaGVpZ2h0X2luKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiZHBpIiwgYXJncy5kcGkpKToKICAgICAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcGF0Y2hba2V5XSA9IHZhbAogICAgICAgIG1hbmlmZXN0WyJjYW52YXMiXS51cGRhdGUocGF0Y2gpCiAgICAgICAgX3JlY29yZChtYW5pZmVzdCwgImNhbnZhcyIsIHBhdGNoKQogICAgICAgIHNhdmVfbWFuaWZlc3QoYXJncy5kaXJlY3RvcnksIG1hbmlmZXN0KQogICAgICAgIHByaW50X2pzb24oeyJvayI6IFRydWUsICJjYW52YXMiOiBtYW5pZmVzdFsiY2FudmFzIl19KQogICAgZWxpZiBhcmdzLmNtZCA9PSAibGlzdCI6CiAgICAgICAgcHJpbnRfanNvbihsb2FkX21hbmlmZXN0KGFyZ3MuZGlyZWN0b3J5KSkKICAgIGVsaWYgYXJncy5jbWQgPT0gInZhbGlkYXRlIjoKICAgICAgICBwcm9ibGVtcyA9IHZhbGlkYXRlX3Byb2plY3QoYXJncy5kaXJlY3RvcnkpCiAgICAgICAgcHJpbnRfanNvbih7Im9rIjogbm90IHByb2JsZW1zLCAicHJvYmxlbXMiOiBwcm9ibGVtc30pCiAgICAgICAgcmV0dXJuIDEgaWYgcHJvYmxlbXMgZWxzZSAwCiAgICBlbGlmIGFyZ3MuY21kID09ICJ2ZXR0ZWQtc291cmNlcyI6CiAgICAgICAgcGF0ID0gKGFyZ3MucGF0dGVybiBvciAiIikubG93ZXIoKQogICAgICAgIG91dCA9IHtrOiB2IGZvciBrLCB2IGluIFZFVFRFRF9TT1VSQ0VTLml0ZW1zKCkKICAgICAgICAgICAgICAgaWYgcGF0IGluIGsgb3IgcGF0IGluIHZbIndoYXQiXS5sb3dlcigpIG9yIHBhdCBpbiB2WyJhZ2VuY3kiXS5sb3dlcigpfQogICAgICAgIHByaW50X2pzb24ob3V0KQogICAgcmV0dXJuIDAKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgc3lzLmV4aXQobWFpbigpKQo=","executable":false},{"filename":"scripts/render_map.py","mimeType":"text/x-python","data":"IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiJyZW5kZXJfbWFwLnB5IOKAlCByZW5kZXIgYSBsYXllcmVkIG1hcCBwcm9qZWN0IChsYXllcnMuanNvbikgdG8gYSBwdWJsaWNhdGlvbiBmaWd1cmUuCgpSZWFkcyB0aGUgbWFuaWZlc3QgY3JlYXRlZC9lZGl0ZWQgYnkgZ2Vva2l0LnB5IGFuZCBkcmF3cyBldmVyeSB2aXNpYmxlIGxheWVyIGluCnogb3JkZXIgb250byBvbmUgbWF0cGxvdGxpYiBmaWd1cmUuIFN1cHBvcnRzIGNob3JvcGxldGhzICh3aXRoIGNsYXNzaWZpY2F0aW9uCnNjaGVtZXMpLCBncmFkdWF0ZWQgc3ltYm9scywgcmFzdGVycyB3aXRoIHBlcmNlbnQgc3RyZXRjaCArIGNvbG9yYmFyLApoaWxsc2hhZGUsIGdyYXRpY3VsZXMsIHNjYWxlYmFyLCBub3J0aCBhcnJvdywgbGFiZWxlZCBwb2ludHMsIGluc2V0cyBhbmQKYnJlYWtvdXQgKHpvb20pIHBhbmVscywgcGx1cyBhbiBhdXRvLWdlbmVyYXRlZCBzb3VyY2UtYXR0cmlidXRpb24gZm9vdGVyIHRoYXQKY2l0ZXMgZWFjaCBsYXllcidzIHByb3ZlbmFuY2UgcmVjb3JkLgoKVXNhZ2U6CiAgcmVuZGVyX21hcC5weSBQUk9KRUNUX0RJUiBbLS1vdXQgcmVuZGVycy9tYXAucG5nXQoKVGhlIGZpZ3VyZSBpcyBmdWxseSByZWJ1aWxkYWJsZSBmcm9tIHRoZSBtYW5pZmVzdDogY2hhbmdlL3JldmVydCBhbnkgbGF5ZXIgYW5kCnJlLXJlbmRlciDigJQgdGhhdCBpcyB0aGUgc2tpbGwncyB1bmRvL3JlZG8uCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGpzb24KaW1wb3J0IG1hdGgKaW1wb3J0IHN5cwpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKCk1JU1NJTkcgPSB7ImRlcHMiOiAicmVuZGVyX21hcCBuZWVkcyB0aGUgZ2VvIHN0YWNrOiBnZW9wYW5kYXMsIHJhc3RlcmlvLCBzaGFwZWx5LCBudW1weSwgcHlwcm9qLCAiCiAgICAgICAgICAgICAgICAgICAgIm1hcGNsYXNzaWZ5LCBtYXRwbG90bGliLiBJbnN0YWxsIHdpdGg6IHBpcCBpbnN0YWxsIGdlb3BhbmRhcyByYXN0ZXJpbyBweW9ncmlvICIKICAgICAgICAgICAgICAgICAgICAic2hhcGVseSBweXByb2ogbWFwY2xhc3NpZnkifQoKCmRlZiBfc3RyZXRjaChiYW5kLCB2YWxpZCwgcGN0PTIpOgogICAgIiIiUGVyY2VudC1jbGlwIHN0cmV0Y2ggZm9yIGRpc3BsYXk7IHJldHVybnMgKHZtaW4sIHZtYXgpLiIiIgogICAgaW1wb3J0IG51bXB5IGFzIG5wCiAgICB2YWxzID0gYmFuZFt2YWxpZF0KICAgIGlmIHZhbHMuc2l6ZSA9PSAwOgogICAgICAgIHJldHVybiAwLjAsIDEuMAogICAgbG8sIGhpID0gbnAubmFucGVyY2VudGlsZSh2YWxzLCBbcGN0LCAxMDAgLSBwY3RdKQogICAgaWYgbG8gPT0gaGk6CiAgICAgICAgaGkgPSBsbyArIDEuMAogICAgcmV0dXJuIGZsb2F0KGxvKSwgZmxvYXQoaGkpCgoKZGVmIF9oaWxsc2hhZGUoYmFuZCwgcmVzX20sIGF6aW11dGg9MzE1LjAsIGFsdGl0dWRlPTQ1LjApOgogICAgaW1wb3J0IG51bXB5IGFzIG5wCiAgICBpZiByZXNfbSBpbiAoTm9uZSwgMCk6CiAgICAgICAgcmVzX20gPSAxLjAKICAgIGd5LCBneCA9IG5wLmdyYWRpZW50KGJhbmQuYXN0eXBlKGZsb2F0KSAvIHJlc19tKQogICAgc2xvcGUgPSBucC5waSAvIDIuMCAtIG5wLmFyY3RhbihucC5oeXBvdChneCwgZ3kpKQogICAgYXogPSBtYXRoLnJhZGlhbnMoMzYwLjAgLSBhemltdXRoKQogICAgYWx0ID0gbWF0aC5yYWRpYW5zKGFsdGl0dWRlKQogICAgc2hhZGUgPSAobWF0aC5zaW4oYWx0KSAqIG5wLnNpbihzbG9wZSkKICAgICAgICAgICAgICsgbWF0aC5jb3MoYWx0KSAqIG5wLmNvcyhzbG9wZSkgKiBucC5jb3MoYXogLSBucC5hcmN0YW4yKGd5LCBneCkpKQogICAgcmV0dXJuIG5wLmNsaXAoMjU1LjAgKiBzaGFkZSwgMCwgMjU1KQoKCmRlZiBfY2xhc3NpZnkoZ2RmLCBjb2x1bW4sIHNjaGVtZSwgaz01KToKICAgICIiIlJldHVybiAobl9jbGFzc2VzLCBsYWJlbHMpIGZvciBhIGNsYXNzaWZpZWQgY2hvcm9wbGV0aCwgb3IgKE5vbmUsIE5vbmUpLiIiIgogICAgdHJ5OgogICAgICAgIGltcG9ydCBtYXBjbGFzc2lmeQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHJldHVybiBOb25lLCBOb25lCiAgICBzID0gZ2RmW2NvbHVtbl0uZHJvcG5hKCkKICAgIGlmIHMuZW1wdHk6CiAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKICAgIGsgPSBtaW4oaywgbWF4KDEsIHMubnVuaXF1ZSgpKSkKICAgIGNscyA9IHsKICAgICAgICAicXVhbnRpbGUiOiBsYW1iZGE6IG1hcGNsYXNzaWZ5LlF1YW50aWxlcyhzLCBrPWspLAogICAgICAgICJlcXVhbF9pbnRlcnZhbCI6IGxhbWJkYTogbWFwY2xhc3NpZnkuRXF1YWxJbnRlcnZhbChzLCBrPWspLAogICAgICAgICJmaXNoZXJqZW5rcyI6IGxhbWJkYTogbWFwY2xhc3NpZnkuRmlzaGVySmVua3Mocywgaz1rKSwKICAgICAgICAibmF0dXJhbGJyZWFrcyI6IGxhbWJkYTogbWFwY2xhc3NpZnkuTmF0dXJhbEJyZWFrcyhzLCBrPWspLAogICAgfS5nZXQoKHNjaGVtZSBvciAiIikubG93ZXIoKSkKICAgIGlmIGNscyBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lLCBOb25lCiAgICB0cnk6CiAgICAgICAgc2NoZW1lX29iaiA9IGNscygpCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiBOb25lLCBOb25lCiAgICBiaW5zID0gc2NoZW1lX29iai5iaW5zCiAgICBsYWJlbHMgPSBbZiJ7Ymluc1tpXTosLjRnfSDigJMge2JpbnNbaSArIDFdOiwuNGd9IiBpZiBpICsgMSA8IGxlbihiaW5zKSBlbHNlIGYi4omlIHtiaW5zW2ldOiwuNGd9IgogICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihiaW5zKSldCiAgICAjIG1hcGNsYXNzaWZ5IGJpbnMgYXJlIHVwcGVyIGJvdW5kczogY2F0ZWdvcnkgaSBjb3ZlcnMgKGJpbnNbaS0xXSwgYmluc1tpXV0KICAgIGNhdHMgPSBbXQogICAgcHJldiA9IHMubWluKCkKICAgIGZvciBpLCB1cHBlciBpbiBlbnVtZXJhdGUoYmlucyk6CiAgICAgICAgY2F0cy5hcHBlbmQoKHByZXYsIHVwcGVyKSkKICAgICAgICBwcmV2ID0gdXBwZXIKICAgIGNvZGVzID0gW10KICAgIGZvciB2IGluIGdkZltjb2x1bW5dOgogICAgICAgIGlmIHYgaXMgTm9uZSBvciAoaXNpbnN0YW5jZSh2LCBmbG9hdCkgYW5kIG1hdGguaXNuYW4odikpOgogICAgICAgICAgICBjb2Rlcy5hcHBlbmQoLTEpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZm9yIGksIChsbywgaGkpIGluIGVudW1lcmF0ZShjYXRzKToKICAgICAgICAgICAgaWYgKGkgPT0gMCBhbmQgdiA8PSBoaSkgb3IgKGxvIDwgdiA8PSBoaSk6CiAgICAgICAgICAgICAgICBjb2Rlcy5hcHBlbmQoaSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29kZXMuYXBwZW5kKGxlbihjYXRzKSAtIDEpCiAgICBnZGZbIl9fY2xhc3MiXSA9IGNvZGVzCiAgICBsYWJlbHMgPSBbZiLiiaQge2JpbnNbMF06LC40Z30iXSArIFtmIntiaW5zW2kgLSAxXTosLjRnfSDigJMge2JpbnNbaV06LC40Z30iIGZvciBpIGluIHJhbmdlKDEsIGxlbihiaW5zKSldCiAgICByZXR1cm4gbGVuKGJpbnMpLCBsYWJlbHMKCgpkZWYgX3Byb3ZlbmFuY2VfZm9vdGVyKHByb2plY3Q6IFBhdGgsIG1hbmlmZXN0OiBkaWN0KSAtPiBzdHI6CiAgICBjaXRlcyA9IFtdCiAgICBmb3IgbGF5ZXIgaW4gbWFuaWZlc3QuZ2V0KCJsYXllcnMiLCBbXSk6CiAgICAgICAgaWYgbm90IGxheWVyLmdldCgidmlzaWJsZSIsIFRydWUpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHNyYyA9IGxheWVyLmdldCgic3JjIikKICAgICAgICBpZiBub3Qgc3JjOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHByb3YgPSBwcm9qZWN0IC8gc3RyKHNyYykuc3BsaXQoIi8iKVswXSAvICJfcHJvdmVuYW5jZS5qc29uIgogICAgICAgICMgZmV0Y2hfZGF0YSBsYXlvdXQ6IGRhdGEvPGRhdGFzZXQ+L19wcm92ZW5hbmNlLmpzb24g4oCUIHNyYyBpcyBvZnRlbiBkYXRhLzxkcz4vZmlsZQogICAgICAgIGNhbmRpZGF0ZXMgPSBbcHJvamVjdCAvIFBhdGgoc3RyKHNyYykpLnBhcmVudCAvICJfcHJvdmVuYW5jZS5qc29uIiwgcHJvdl0KICAgICAgICBmb3IgYyBpbiBjYW5kaWRhdGVzOgogICAgICAgICAgICBpZiBjLmlzX2ZpbGUoKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBwID0ganNvbi5sb2FkcyhjLnJlYWRfdGV4dCgpKQogICAgICAgICAgICAgICAgICAgIGNpdGVzLmFwcGVuZChwLmdldCgiYWdlbmN5Iikgb3IgcC5nZXQoInVybCIsICIiKSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgYnJlYWsKICAgIHNlZW4gPSBsaXN0KGRpY3QuZnJvbWtleXMoYyBmb3IgYyBpbiBjaXRlcyBpZiBjKSkKICAgIHJldHVybiAiRGF0YTogIiArICI7ICIuam9pbihzZWVuKSBpZiBzZWVuIGVsc2UgIiIKCgpkZWYgX2RyYXdfbGF5ZXJzKGF4LCBwcm9qZWN0OiBQYXRoLCBsYXllcnM6IGxpc3QsIGNhbnZhc19jcnMsIGxlZ2VuZHM6IGxpc3QpOgogICAgIiIiRHJhdyBvbmUgYXhlcycgbGF5ZXIgbGlzdCAodXNlZCBmb3IgYm90aCB0aGUgbWFpbiBtYXAgYW5kIGluc2V0cykuIiIiCiAgICBpbXBvcnQgZ2VvcGFuZGFzIGFzIGdwZAogICAgaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAogICAgaW1wb3J0IG51bXB5IGFzIG5wCiAgICBpbXBvcnQgcmFzdGVyaW8KICAgIGZyb20gcmFzdGVyaW8ucGxvdCBpbXBvcnQgcGxvdHRpbmdfZXh0ZW50CgogICAgZm9yIGxheWVyIGluIHNvcnRlZChsYXllcnMsIGtleT1sYW1iZGEgbDogbC5nZXQoInoiLCAwKSk6CiAgICAgICAgaWYgbm90IGxheWVyLmdldCgidmlzaWJsZSIsIFRydWUpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGtpbmQgPSBsYXllci5nZXQoImtpbmQiKQogICAgICAgIHN0eWxlID0gbGF5ZXIuZ2V0KCJzdHlsZSIpIG9yIHt9CiAgICAgICAgbGlkID0gbGF5ZXIuZ2V0KCJpZCIsICI/IikKCiAgICAgICAgaWYga2luZCA9PSAiZ3JhdGljdWxlIjoKICAgICAgICAgICAgaW1wb3J0IG51bXB5IGFzIF9ucAogICAgICAgICAgICBzdGVwID0gZmxvYXQoc3R5bGUuZ2V0KCJzdGVwIiwgMTApKQogICAgICAgICAgICB4bWluLCB4bWF4ID0gYXguZ2V0X3hsaW0oKTsgeW1pbiwgeW1heCA9IGF4LmdldF95bGltKCkKICAgICAgICAgICAgZm9yIHggaW4gX25wLmFyYW5nZShtYXRoLmZsb29yKHhtaW4gLyBzdGVwKSAqIHN0ZXAsIHhtYXggKyBzdGVwLCBzdGVwKToKICAgICAgICAgICAgICAgIGF4LmF4dmxpbmUoeCwgY29sb3I9c3R5bGUuZ2V0KCJjb2xvciIsICIjOTk5OTk5IiksIGx3PWZsb2F0KHN0eWxlLmdldCgibGluZXdpZHRoIiwgMC4zKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhPWZsb2F0KHN0eWxlLmdldCgiYWxwaGEiLCAwLjYpKSwgem9yZGVyPWxheWVyLmdldCgieiIsIDApKQogICAgICAgICAgICAgICAgYXgudGV4dCh4LCB5bWluICsgKHltYXggLSB5bWluKSAqIDAuMDA1LCBmInt4Omd9wrAiLAogICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09YXgudHJhbnNEYXRhLCBmb250c2l6ZT01LCBjb2xvcj0iIzY2NjY2NiIsIGhhPSJjZW50ZXIiKQogICAgICAgICAgICBmb3IgeSBpbiBfbnAuYXJhbmdlKG1hdGguZmxvb3IoeW1pbiAvIHN0ZXApICogc3RlcCwgeW1heCArIHN0ZXAsIHN0ZXApOgogICAgICAgICAgICAgICAgYXguYXhobGluZSh5LCBjb2xvcj1zdHlsZS5nZXQoImNvbG9yIiwgIiM5OTk5OTkiKSwgbHc9ZmxvYXQoc3R5bGUuZ2V0KCJsaW5ld2lkdGgiLCAwLjMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGE9ZmxvYXQoc3R5bGUuZ2V0KCJhbHBoYSIsIDAuNikpLCB6b3JkZXI9bGF5ZXIuZ2V0KCJ6IiwgMCkpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGtpbmQgPT0gInNjYWxlYmFyIjoKICAgICAgICAgICAgX3NjYWxlYmFyKGF4LCBzdHlsZSwgbGF5ZXIuZ2V0KCJ6IiwgMCkpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYga2luZCA9PSAibm9ydGhfYXJyb3ciOgogICAgICAgICAgICBfbm9ydGhfYXJyb3coYXgsIHN0eWxlLCBsYXllci5nZXQoInoiLCAwKSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgc3JjID0gbGF5ZXIuZ2V0KCJzcmMiKQogICAgICAgIGlmIG5vdCBzcmM6CiAgICAgICAgICAgIGxlZ2VuZHMuYXBwZW5kKHsibGF5ZXIiOiBsaWQsICJub3RlIjogIm5vIHNyYyDigJQgc2tpcHBlZCJ9KQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHBhdGggPSBwcm9qZWN0IC8gc3JjCiAgICAgICAgaWYgbm90IHBhdGguaXNfZmlsZSgpOgogICAgICAgICAgICBsZWdlbmRzLmFwcGVuZCh7ImxheWVyIjogbGlkLCAibm90ZSI6IGYic3JjIG1pc3Npbmc6IHtzcmN9In0pCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGtpbmQgaW4gKCJyYXN0ZXIiLCAicmFzdGVyX2hpbGxzaGFkZSIpOgogICAgICAgICAgICB3aXRoIHJhc3RlcmlvLm9wZW4ocGF0aCkgYXMgcnM6CiAgICAgICAgICAgICAgICBiYW5kID0gcnMucmVhZCgxKS5hc3R5cGUoZmxvYXQpCiAgICAgICAgICAgICAgICBub2RhdGEgPSBycy5ub2RhdGEKICAgICAgICAgICAgICAgIHZhbGlkID0gbnAuaXNmaW5pdGUoYmFuZCkKICAgICAgICAgICAgICAgIGlmIG5vZGF0YSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICB2YWxpZCAmPSBiYW5kICE9IG5vZGF0YQogICAgICAgICAgICAgICAgc2hvdyA9IG5wLm1hLm1hc2tlZF9hcnJheShiYW5kLCB+dmFsaWQpCiAgICAgICAgICAgICAgICBleHRlbnQgPSBwbG90dGluZ19leHRlbnQocnMpCiAgICAgICAgICAgICAgICBpZiBraW5kID09ICJyYXN0ZXJfaGlsbHNoYWRlIjoKICAgICAgICAgICAgICAgICAgICByZXNfeCwgcmVzX3kgPSBycy5yZXMKICAgICAgICAgICAgICAgICAgICBocyA9IF9oaWxsc2hhZGUobnAubmFuX3RvX251bShiYW5kKSwgZmxvYXQoKGFicyhyZXNfeCkgKyBhYnMocmVzX3kpKSAvIDIpICogMTExMzIwLjAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcnMuY3JzIGFuZCBycy5jcnMuaXNfZ2VvZ3JhcGhpYyBlbHNlIGZsb2F0KChhYnMocmVzX3gpICsgYWJzKHJlc195KSkgLyAyKSkKICAgICAgICAgICAgICAgICAgICBheC5pbXNob3coaHMsIGNtYXA9c3R5bGUuZ2V0KCJjbWFwIiwgImdyYXkiKSwgZXh0ZW50PWV4dGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGE9ZmxvYXQoc3R5bGUuZ2V0KCJhbHBoYSIsIDAuNikpLCB6b3JkZXI9bGF5ZXIuZ2V0KCJ6IiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtaW49MCwgdm1heD0yNTUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHZtaW4sIHZtYXggPSBfc3RyZXRjaChiYW5kLCB2YWxpZCwgcGN0PWZsb2F0KHN0eWxlLmdldCgic3RyZXRjaF9wY3QiLCAyKSkpCiAgICAgICAgICAgICAgICAgICAgaWYgc3R5bGUuZ2V0KCJ2bWluIikgaXMgbm90IE5vbmU6IHZtaW4gPSBmbG9hdChzdHlsZVsidm1pbiJdKQogICAgICAgICAgICAgICAgICAgIGlmIHN0eWxlLmdldCgidm1heCIpIGlzIG5vdCBOb25lOiB2bWF4ID0gZmxvYXQoc3R5bGVbInZtYXgiXSkKICAgICAgICAgICAgICAgICAgICBpbSA9IGF4Lmltc2hvdyhzaG93LCBjbWFwPXN0eWxlLmdldCgiY21hcCIsICJ2aXJpZGlzIiksIGV4dGVudD1leHRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGE9ZmxvYXQoc3R5bGUuZ2V0KCJhbHBoYSIsIDEuMCkpLCB6b3JkZXI9bGF5ZXIuZ2V0KCJ6IiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1pbj12bWluLCB2bWF4PXZtYXgpCiAgICAgICAgICAgICAgICAgICAgaWYgbGF5ZXIuZ2V0KCJsZWdlbmQiLCBUcnVlKSBhbmQgc3R5bGUuZ2V0KCJjb2xvcmJhciIsIFRydWUpIGFuZCBsZW4oYXguaW1hZ2VzKSA9PSAxOgogICAgICAgICAgICAgICAgICAgICAgICBjYiA9IHBsdC5jb2xvcmJhcihpbSwgYXg9YXgsIHNocmluaz1mbG9hdChzdHlsZS5nZXQoImNvbG9yYmFyX3NocmluayIsIDAuNykpLCBwYWQ9MC4wMikKICAgICAgICAgICAgICAgICAgICAgICAgY2Iuc2V0X2xhYmVsKHN0eWxlLmdldCgiY29sb3JiYXJfbGFiZWwiLCAiIiksIGZvbnRzaXplPTcpCiAgICAgICAgICAgICAgICAgICAgICAgIGNiLmF4LnRpY2tfcGFyYW1zKGxhYmVsc2l6ZT02KQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBraW5kID09ICJ2ZWN0b3IiOgogICAgICAgICAgICBnZGYgPSBncGQucmVhZF9maWxlKHBhdGgpCiAgICAgICAgICAgIGlmIGNhbnZhc19jcnMgYW5kIGdkZi5jcnMgYW5kIHN0cihnZGYuY3JzKSAhPSBzdHIoY2FudmFzX2Nycyk6CiAgICAgICAgICAgICAgICBnZGYgPSBnZGYudG9fY3JzKGNhbnZhc19jcnMpCiAgICAgICAgICAgIGNvbW1vbiA9IGRpY3Qoem9yZGVyPWxheWVyLmdldCgieiIsIDApLCBhbHBoYT1mbG9hdChzdHlsZS5nZXQoImFscGhhIiwgMS4wKSkpCiAgICAgICAgICAgIGNvbHVtbiA9IHN0eWxlLmdldCgiY29sdW1uIikKICAgICAgICAgICAgaWYgY29sdW1uIGFuZCBjb2x1bW4gbm90IGluIGdkZi5jb2x1bW5zOgogICAgICAgICAgICAgICAgbGVnZW5kcy5hcHBlbmQoeyJsYXllciI6IGxpZCwgIm5vdGUiOiBmImNvbHVtbiB7Y29sdW1uIXJ9IG1pc3Npbmcg4oCUIGRyZXcgZmxhdCJ9KQogICAgICAgICAgICAgICAgY29sdW1uID0gTm9uZQogICAgICAgICAgICBpZiBjb2x1bW4gYW5kIHN0eWxlLmdldCgiY2F0ZWdvcmljYWwiKToKICAgICAgICAgICAgICAgIGNhdHMgPSBzb3J0ZWQoZ2RmW2NvbHVtbl0uZHJvcG5hKCkudW5pcXVlKCksIGtleT1zdHIpCiAgICAgICAgICAgICAgICBjbWFwID0gcGx0LmdldF9jbWFwKHN0eWxlLmdldCgiY21hcCIsICJ0YWIxMCIpKQogICAgICAgICAgICAgICAgZm9yIGksIGNhdCBpbiBlbnVtZXJhdGUoY2F0cyk6CiAgICAgICAgICAgICAgICAgICAgc3ViID0gZ2RmW2dkZltjb2x1bW5dID09IGNhdF0KICAgICAgICAgICAgICAgICAgICBpZiBzdWIuZW1wdHk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgc3ViLnBsb3QoYXg9YXgsIGNvbG9yPWNtYXAoaSAlIGNtYXAuTiksIGVkZ2Vjb2xvcj1zdHlsZS5nZXQoImVkZ2Vjb2xvciIsICJ3aGl0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5ld2lkdGg9ZmxvYXQoc3R5bGUuZ2V0KCJsaW5ld2lkdGgiLCAwLjMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Vyc2l6ZT1mbG9hdChzdHlsZS5nZXQoIm1hcmtlcnNpemUiLCAxMikpLCAqKmNvbW1vbikKICAgICAgICAgICAgICAgICAgICBpZiBsYXllci5nZXQoImxlZ2VuZCIsIFRydWUpOgogICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmRzLmFwcGVuZCh7ImxhYmVsIjogc3RyKGNhdCksICJjb2xvciI6IGNtYXAoaSAlIGNtYXAuTiksICJsYXllciI6IGxpZH0pCiAgICAgICAgICAgIGVsaWYgY29sdW1uIGFuZCBzdHlsZS5nZXQoInNjaGVtZSIpOgogICAgICAgICAgICAgICAgbiwgbGFiZWxzID0gX2NsYXNzaWZ5KGdkZiwgY29sdW1uLCBzdHlsZS5nZXQoInNjaGVtZSIpLCBrPWludChzdHlsZS5nZXQoImsiLCA1KSkpCiAgICAgICAgICAgICAgICBpZiBuOgogICAgICAgICAgICAgICAgICAgIGNtYXAgPSBwbHQuZ2V0X2NtYXAoc3R5bGUuZ2V0KCJjbWFwIiwgInZpcmlkaXMiKSkKICAgICAgICAgICAgICAgICAgICBnZGYucGxvdChjb2x1bW49Il9fY2xhc3MiLCBheD1heCwgY21hcD1zdHlsZS5nZXQoImNtYXAiLCAidmlyaWRpcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2Vjb2xvcj1zdHlsZS5nZXQoImVkZ2Vjb2xvciIsICJ3aGl0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmV3aWR0aD1mbG9hdChzdHlsZS5nZXQoImxpbmV3aWR0aCIsIDAuMykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnNpemU9ZmxvYXQoc3R5bGUuZ2V0KCJtYXJrZXJzaXplIiwgMTIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bWluPTAsIHZtYXg9biAtIDEsICoqY29tbW9uKQogICAgICAgICAgICAgICAgICAgIGlmIGxheWVyLmdldCgibGVnZW5kIiwgVHJ1ZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWF0cGxvdGxpYi5wYXRjaGVzIGltcG9ydCBQYXRjaAogICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSwgbGFiIGluIGVudW1lcmF0ZShsYWJlbHMpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kcy5hcHBlbmQoeyJwYXRjaCI6IFBhdGNoKGZhY2Vjb2xvcj1jbWFwKGkgLyBtYXgoMSwgbiAtIDEpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlY29sb3I9c3R5bGUuZ2V0KCJlZGdlY29sb3IiLCAid2hpdGUiKSksICJsYWJlbCI6IGxhYiwgImxheWVyIjogbGlkfSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGdkZi5wbG90KGF4PWF4LCBjb2xvcj1zdHlsZS5nZXQoImNvbG9yIiwgIiMzMzk5Y2MiIGlmIGNvbHVtbiBlbHNlIE5vbmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uPWNvbHVtbiwgY21hcD1zdHlsZS5nZXQoImNtYXAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2Vjb2xvcj1zdHlsZS5nZXQoImVkZ2Vjb2xvciIsICJ3aGl0ZSIgaWYgbm90IGNvbHVtbiBlbHNlICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsaW5ld2lkdGg9ZmxvYXQoc3R5bGUuZ2V0KCJsaW5ld2lkdGgiLCAwLjMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnNpemU9ZmxvYXQoc3R5bGUuZ2V0KCJtYXJrZXJzaXplIiwgMTIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZtaW49c3R5bGUuZ2V0KCJ2bWluIiksIHZtYXg9c3R5bGUuZ2V0KCJ2bWF4IiksICoqY29tbW9uKQogICAgICAgICAgICAgICAgaWYgbGF5ZXIuZ2V0KCJsZWdlbmQiLCBUcnVlKSBhbmQgc3R5bGUuZ2V0KCJjb2xvciIpOgogICAgICAgICAgICAgICAgICAgIGZyb20gbWF0cGxvdGxpYi5saW5lcyBpbXBvcnQgTGluZTJECiAgICAgICAgICAgICAgICAgICAgZ2VvbV9raW5kID0gc3RyKGdkZi5nZW9tX3R5cGUubW9kZSgpLmdldCgwLCAiIikpCiAgICAgICAgICAgICAgICAgICAgbWsgPSAibyIgaWYgIlBvaW50IiBpbiBnZW9tX2tpbmQgZWxzZSAoIi0iIGlmICJMaW5lIiBpbiBnZW9tX2tpbmQgZWxzZSAicyIpCiAgICAgICAgICAgICAgICAgICAgbGVnZW5kcy5hcHBlbmQoeyJoYW5kbGUiOiBMaW5lMkQoW10sIFtdLCBjb2xvcj1zdHlsZVsiY29sb3IiXSwgbWFya2VyPW1rIGlmIG1rICE9ICItIiBlbHNlIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzdHlsZT0iLSIgaWYgbWsgPT0gIi0iIGVsc2UgIk5vbmUiLCBtYXJrZXJzaXplPTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWwiOiBzdHlsZS5nZXQoImxhYmVsIiwgbGlkKSwgImxheWVyIjogbGlkfSkKICAgICAgICAgICAgbGFiX2NvbCA9IHN0eWxlLmdldCgibGFiZWxfY29sdW1uIikKICAgICAgICAgICAgaWYgbGFiX2NvbCBhbmQgbGFiX2NvbCBpbiBnZGYuY29sdW1uczoKICAgICAgICAgICAgICAgIHB0cyA9IGdkZi5jb3B5KCkKICAgICAgICAgICAgICAgIGlmIG5vdCBhbGwoZy5zdGFydHN3aXRoKCJQb2ludCIpIGZvciBnIGluIHB0cy5nZW9tX3R5cGUpOgogICAgICAgICAgICAgICAgICAgIHB0c1siZ2VvbWV0cnkiXSA9IHB0cy5nZW9tZXRyeS5yZXByZXNlbnRhdGl2ZV9wb2ludCgpCiAgICAgICAgICAgICAgICBkeCA9IGZsb2F0KHN0eWxlLmdldCgibGFiZWxfZHgiLCA2KSkgICAjIG9mZnNldCBpbiBwb2ludHMKICAgICAgICAgICAgICAgIGR5ID0gZmxvYXQoc3R5bGUuZ2V0KCJsYWJlbF9keSIsIDMpKQogICAgICAgICAgICAgICAgZm9yIF8sIHIgaW4gcHRzLml0ZXJyb3dzKCk6CiAgICAgICAgICAgICAgICAgICAgYXguYW5ub3RhdGUoc3RyKHJbbGFiX2NvbF0pLCB4eT0oci5nZW9tZXRyeS54LCByLmdlb21ldHJ5LnkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5dGV4dD0oZHgsIGR5KSwgdGV4dGNvb3Jkcz0ib2Zmc2V0IHBvaW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHNpemU9ZmxvYXQoc3R5bGUuZ2V0KCJsYWJlbF9zaXplIiwgNikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhPSJsZWZ0IiwgdmE9ImJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9c3R5bGUuZ2V0KCJsYWJlbF9jb2xvciIsICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvcmRlcj1sYXllci5nZXQoInoiLCAwKSArIDEpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGxlZ2VuZHMuYXBwZW5kKHsibGF5ZXIiOiBsaWQsICJub3RlIjogZiJraW5kIHtraW5kfSB1bnN1cHBvcnRlZCBpbiB0aGlzIGF4ZXMifSkKCgpkZWYgX3NjYWxlYmFyKGF4LCBzdHlsZSwgeik6CiAgICAiIiJBbHRlcm5hdGluZyBibGFjay93aGl0ZSBzY2FsZWJhciB3aXRoIGEgbmljZSByb3VuZCBncm91bmQgbGVuZ3RoLiIiIgogICAgeG1pbiwgeG1heCA9IGF4LmdldF94bGltKCk7IHltaW4sIHltYXggPSBheC5nZXRfeWxpbSgpCiAgICBtaWRfeSA9ICh5bWluICsgeW1heCkgLyAyLjAKICAgIGlmIGdldGF0dHIoYXgsICJfZ2VvZ3JhcGhpYyIsIEZhbHNlKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gcHlwcm9qIGltcG9ydCBHZW9kCiAgICAgICAgICAgIF8sIF8sIGRpc3RfbSA9IEdlb2QoZWxscHM9IldHUzg0IikuaW52KHhtaW4sIG1pZF95LCB4bWF4LCBtaWRfeSkKICAgICAgICAgICAgbV9wZXJfdW5pdCA9IGRpc3RfbSAvICh4bWF4IC0geG1pbikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBtX3Blcl91bml0ID0gMTExMzIwLjAgKiBtYXRoLmNvcyhtYXRoLnJhZGlhbnMobWlkX3kpKQogICAgZWxzZToKICAgICAgICBtX3Blcl91bml0ID0gMS4wICAjIHByb2plY3RlZCBDUlMgYXNzdW1lZCB0byBiZSBpbiBtZXRlcnMKICAgIHRhcmdldF9tID0gKHhtYXggLSB4bWluKSAqIGZsb2F0KHN0eWxlLmdldCgibGVuZ3RoX2ZyYWMiLCAwLjI1KSkgKiBtX3Blcl91bml0CiAgICBlMCA9IG1hdGguZmxvb3IobWF0aC5sb2cxMChtYXgodGFyZ2V0X20sIDFlLTYpKSkKICAgIGNhbmRzID0gW24gKiAxMCAqKiBlIGZvciBlIGluIChlMCAtIDEsIGUwLCBlMCArIDEpIGZvciBuIGluICgxLCAyLCA1KV0KICAgIGJhcl9tID0gbWluKGNhbmRzLCBrZXk9bGFtYmRhIHY6IGFicyh2IC0gdGFyZ2V0X20pKQogICAgZHggPSBiYXJfbSAvIG1fcGVyX3VuaXQKICAgIHgwID0geG1pbiArICh4bWF4IC0geG1pbikgKiBmbG9hdChzdHlsZS5nZXQoIngiLCAwLjA2KSkKICAgIHkwID0geW1pbiArICh5bWF4IC0geW1pbikgKiBmbG9hdChzdHlsZS5nZXQoInkiLCAwLjA1KSkKICAgIGMgPSBzdHlsZS5nZXQoImNvbG9yIiwgImJsYWNrIikKICAgIGF4LnBsb3QoW3gwLCB4MCArIGR4IC8gMl0sIFt5MCwgeTBdLCBjb2xvcj1jLCBsdz0zLjUsIHNvbGlkX2NhcHN0eWxlPSJidXR0Iiwgem9yZGVyPXogKyA1KQogICAgYXgucGxvdChbeDAgKyBkeCAvIDIsIHgwICsgZHhdLCBbeTAsIHkwXSwgY29sb3I9c3R5bGUuZ2V0KCJjb2xvcjIiLCAid2hpdGUiKSwgbHc9My41LAogICAgICAgICAgICBzb2xpZF9jYXBzdHlsZT0iYnV0dCIsIHpvcmRlcj16ICsgNSkKICAgIGF4LnBsb3QoW3gwLCB4MCArIGR4XSwgW3kwLCB5MF0sIGNvbG9yPWMsIGx3PTAuNiwgem9yZGVyPXogKyA2KQogICAgbGFiZWwgPSBmIntiYXJfbSAvIDEwMDA6Z30ga20iIGlmIGJhcl9tID49IDEwMDAgZWxzZSBmIntiYXJfbTpnfSBtIgogICAgYXgudGV4dCh4MCArIGR4IC8gMiwgeTAgKyAoeW1heCAtIHltaW4pICogMC4wMTUsIGxhYmVsLCBoYT0iY2VudGVyIiwgdmE9ImJvdHRvbSIsCiAgICAgICAgICAgIGZvbnRzaXplPTYsIGNvbG9yPWMsIHpvcmRlcj16ICsgNiwKICAgICAgICAgICAgYmJveD1kaWN0KGJveHN0eWxlPSJzcXVhcmUscGFkPTAuMTUiLCBmYz0id2hpdGUiLCBlYz0ibm9uZSIsIGFscGhhPTAuNykpCgoKZGVmIF9ub3J0aF9hcnJvdyhheCwgc3R5bGUsIHopOgogICAgaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAogICAgeG1pbiwgeG1heCA9IGF4LmdldF94bGltKCk7IHltaW4sIHltYXggPSBheC5nZXRfeWxpbSgpCiAgICB4ID0geG1pbiArICh4bWF4IC0geG1pbikgKiBmbG9hdChzdHlsZS5nZXQoIngiLCAwLjk0KSkKICAgIHkgPSB5bWluICsgKHltYXggLSB5bWluKSAqIGZsb2F0KHN0eWxlLmdldCgieSIsIDAuOTApKQogICAgcyA9ICh5bWF4IC0geW1pbikgKiBmbG9hdChzdHlsZS5nZXQoInNpemUiLCAwLjA2KSkKICAgIGF4LmFubm90YXRlKCJOIiwgeHk9KHgsIHkpLCBmb250c2l6ZT04LCBoYT0iY2VudGVyIiwgdmE9ImNlbnRlciIsIHpvcmRlcj16ICsgNSwKICAgICAgICAgICAgICAgIGNvbG9yPXN0eWxlLmdldCgiY29sb3IiLCAiYmxhY2siKSwgZm9udHdlaWdodD0iYm9sZCIpCiAgICBheC5hbm5vdGF0ZSgiIiwgeHk9KHgsIHkgKyBzKSwgeHl0ZXh0PSh4LCB5IC0gcyAvIDQpLAogICAgICAgICAgICAgICAgYXJyb3dwcm9wcz1kaWN0KGFycm93c3R5bGU9Ii18PiIsIGNvbG9yPXN0eWxlLmdldCgiY29sb3IiLCAiYmxhY2siKSwgbHc9MS4yKSwKICAgICAgICAgICAgICAgIHpvcmRlcj16ICsgNSkKCgpkZWYgcmVuZGVyKHByb2plY3RfZGlyOiBzdHIsIG91dF9vdmVycmlkZTogc3RyIHwgTm9uZSA9IE5vbmUpIC0+IGRpY3Q6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IGdlb3BhbmRhcyAgIyBub3FhOiBGNDAxCiAgICAgICAgaW1wb3J0IG1hdHBsb3RsaWIKICAgICAgICBtYXRwbG90bGliLnVzZSgiQWdnIikKICAgICAgICBpbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CiAgICAgICAgaW1wb3J0IG51bXB5IGFzIG5wICAjIG5vcWE6IEY0MDEKICAgICAgICBpbXBvcnQgcmFzdGVyaW8gICMgbm9xYTogRjQwMQogICAgZXhjZXB0IEltcG9ydEVycm9yIGFzIGV4YzoKICAgICAgICBwcmludChqc29uLmR1bXBzKHsib2siOiBGYWxzZSwgImVycm9yIjogZiJ7ZXhjfSIsICoqTUlTU0lOR1siZGVwcyJdfSksIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KDIpCgogICAgZnJvbSBnZW9raXQgaW1wb3J0IGxvYWRfbWFuaWZlc3QsIHZhbGlkYXRlX3Byb2plY3QKICAgIHByb2plY3QgPSBQYXRoKHByb2plY3RfZGlyKQogICAgbWFuaWZlc3QgPSBsb2FkX21hbmlmZXN0KHByb2plY3QpCiAgICBwcm9ibGVtcyA9IHZhbGlkYXRlX3Byb2plY3QocHJvamVjdCkKICAgIGhhcmQgPSBbcCBmb3IgcCBpbiBwcm9ibGVtcyBpZiAibm90IGZvdW5kIiBpbiBwXQogICAgaWYgaGFyZDoKICAgICAgICByZXR1cm4geyJvayI6IEZhbHNlLCAiZXJyb3IiOiAicHJvamVjdCB2YWxpZGF0aW9uIGZhaWxlZCIsICJwcm9ibGVtcyI6IHByb2JsZW1zfQoKICAgIGNhbnZhcyA9IG1hbmlmZXN0WyJjYW52YXMiXQogICAgZmlnID0gcGx0LmZpZ3VyZShmaWdzaXplPShjYW52YXMuZ2V0KCJ3aWR0aF9pbiIsIDcuNDgpLCBjYW52YXMuZ2V0KCJoZWlnaHRfaW4iLCA1LjApKSwKICAgICAgICAgICAgICAgICAgICAgZHBpPWNhbnZhcy5nZXQoImRwaSIsIDMwMCkpCiAgICAjIGRlZmF1bHQgbWFpbi1heGVzIHJlY3QgbGVhdmVzIGhlYWRyb29tIGZvciB0aGUgc3VwdGl0bGU7IHNldCBjYW52YXMuYXhlc19yZWN0CiAgICAjIFtsZWZ0LGJvdHRvbSx3LGhdIChmaWd1cmUgZnJhY3Rpb25zKSB3aGVuIGluc2V0cyBtdXN0IG5vdCBvdmVybGFwIHRoZSBtYWluIG1hcAogICAgYXggPSBmaWcuYWRkX2F4ZXMoY2FudmFzLmdldCgiYXhlc19yZWN0Iikgb3IgWzAuMDUsIDAuMDgsIDAuOSwgMC44Nl0pCiAgICBheC5zZXRfZmFjZWNvbG9yKGNhbnZhcy5nZXQoImJnIiwgIiNlZWYyZjUiKSkKCiAgICBsZWdlbmRzOiBsaXN0ID0gW10KICAgIG1haW5fbGF5ZXJzID0gW2wgZm9yIGwgaW4gbWFuaWZlc3RbImxheWVycyJdIGlmIGwuZ2V0KCJraW5kIikgbm90IGluICgiaW5zZXQiLCAiYnJlYWtvdXQiKV0KICAgICMgZ2VvZ3JhcGhpYyBmbGFnIGFuZCBleHRlbnQgbXVzdCBiZSBzZXQgQkVGT1JFIGxheWVycyBkcmF3IHNvCiAgICAjIHNjYWxlYmFyL2dyYXRpY3VsZSBtYXRoIHNlZXMgdGhlIGZpbmFsIGV4dGVudCBhbmQgQ1JTCiAgICBpZiBjYW52YXMuZ2V0KCJleHRlbnQiKToKICAgICAgICBheC5zZXRfeGxpbShjYW52YXNbImV4dGVudCJdWzBdLCBjYW52YXNbImV4dGVudCJdWzJdKQogICAgICAgIGF4LnNldF95bGltKGNhbnZhc1siZXh0ZW50Il1bMV0sIGNhbnZhc1siZXh0ZW50Il1bM10pCiAgICBheC5fZ2VvZ3JhcGhpYyA9ICI0MzI2IiBpbiAoY2FudmFzLmdldCgiY3JzIikgb3IgIiIpIG9yICI0MjY5IiBpbiAoY2FudmFzLmdldCgiY3JzIikgb3IgIiIpCiAgICBheC5zZXRfYXNwZWN0KCJlcXVhbCIpCiAgICBfZHJhd19sYXllcnMoYXgsIHByb2plY3QsIG1haW5fbGF5ZXJzLCBjYW52YXMuZ2V0KCJjcnMiKSwgbGVnZW5kcykKCiAgICAjIGlmIG5vIGV4cGxpY2l0IGV4dGVudCwgYWRvcHQgdGhlIGV4dGVudCB0aGUgZHJhd24gbGF5ZXJzIHByb2R1Y2VkCiAgICBpZiBub3QgY2FudmFzLmdldCgiZXh0ZW50Iik6CiAgICAgICAgY2FudmFzWyJleHRlbnQiXSA9IGxpc3QoYXguZ2V0X3hsaW0oKVs6MV0pICsgbGlzdChheC5nZXRfeWxpbSgpWzoxXSkgKyBsaXN0KGF4LmdldF94bGltKClbMTpdKSArIGxpc3QoYXguZ2V0X3lsaW0oKVsxOl0pCgogICAgIyBicmVha291dC9pbnNldCBwYW5lbHMKICAgIGZvciBsYXllciBpbiAobCBmb3IgbCBpbiBtYW5pZmVzdFsibGF5ZXJzIl0gaWYgbC5nZXQoImtpbmQiKSBpbiAoImluc2V0IiwgImJyZWFrb3V0IikpOgogICAgICAgIGlmIG5vdCBsYXllci5nZXQoInZpc2libGUiLCBUcnVlKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICByZWN0ID0gbGF5ZXIuZ2V0KCJyZWN0Iikgb3IgWzAuNjYsIDAuNjYsIDAuMywgMC4zXQogICAgICAgIGlheCA9IGZpZy5hZGRfYXhlcyhyZWN0KQogICAgICAgIGJib3ggPSBsYXllci5nZXQoImJib3giKQogICAgICAgIGlmIGJib3g6CiAgICAgICAgICAgIGlheC5zZXRfeGxpbShiYm94WzBdLCBiYm94WzJdKTsgaWF4LnNldF95bGltKGJib3hbMV0sIGJib3hbM10pCiAgICAgICAgaWF4Ll9nZW9ncmFwaGljID0gYXguX2dlb2dyYXBoaWMKICAgICAgICBpYXguc2V0X2FzcGVjdCgiZXF1YWwiKQogICAgICAgIHN1Yl9sZWdlbmRzOiBsaXN0ID0gW10KICAgICAgICBfZHJhd19sYXllcnMoaWF4LCBwcm9qZWN0LCBsYXllci5nZXQoImxheWVycyIsIFtdKSwgY2FudmFzLmdldCgiY3JzIiksIHN1Yl9sZWdlbmRzKQogICAgICAgIGlheC50aWNrX3BhcmFtcyhsYWJlbHNpemU9NSkKICAgICAgICBpZiBsYXllci5nZXQoImtpbmQiKSA9PSAiYnJlYWtvdXQiOgogICAgICAgICAgICAjIGNvbm5lY3RvcjogaGlnaGxpZ2h0IHRoZSBicmVha291dCBiYm94IG9uIHRoZSBtYWluIG1hcAogICAgICAgICAgICBmcm9tIG1hdHBsb3RsaWIucGF0Y2hlcyBpbXBvcnQgUmVjdGFuZ2xlCiAgICAgICAgICAgIGNvbG9yID0gKGxheWVyLmdldCgic3R5bGUiKSBvciB7fSkuZ2V0KCJvdXRsaW5lIiwgIiNkNjI3MjgiKQogICAgICAgICAgICBpZiBiYm94OgogICAgICAgICAgICAgICAgYXguYWRkX3BhdGNoKFJlY3RhbmdsZSgoYmJveFswXSwgYmJveFsxXSksIGJib3hbMl0gLSBiYm94WzBdLCBiYm94WzNdIC0gYmJveFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1GYWxzZSwgZWM9Y29sb3IsIGx3PTEuMiwgbHM9Ii0tIiwgem9yZGVyPTk5OSkpCiAgICAgICAgICAgIGlheC5zZXRfdGl0bGUobGF5ZXIuZ2V0KCJ0aXRsZSIsICJEZXRhaWwiKSwgZm9udHNpemU9NywgcGFkPTMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWF4LnNldF90aXRsZShsYXllci5nZXQoInRpdGxlIiwgIiIpLCBmb250c2l6ZT02LCBwYWQ9MikKICAgICAgICAgICAgaWYgbm90IGxheWVyLmdldCgic2hvd190aWNrcyIsIEZhbHNlKToKICAgICAgICAgICAgICAgIGlheC5zZXRfeHRpY2tzKFtdKTsgaWF4LnNldF95dGlja3MoW10pCiAgICAgICAgIyBjbGVhbiBpbnNldCBlZGdlcwogICAgICAgIGZvciBzIGluIGlheC5zcGluZXMudmFsdWVzKCk6CiAgICAgICAgICAgIHMuc2V0X2xpbmV3aWR0aCgwLjgpCgogICAgIyBsZWdlbmQgKG1haW4gYXhlcyBvbmx5KQogICAgZW50cmllcyA9IFtlIGZvciBlIGluIGxlZ2VuZHMgaWYgaXNpbnN0YW5jZShlLCBkaWN0KSBhbmQgKCJsYWJlbCIgaW4gZSldCiAgICBpZiBlbnRyaWVzOgogICAgICAgIGhhbmRsZXMgPSBbZS5nZXQoInBhdGNoIikgb3IgZS5nZXQoImhhbmRsZSIpIGZvciBlIGluIGVudHJpZXNdCiAgICAgICAgbGFiZWxzID0gW2VbImxhYmVsIl0gZm9yIGUgaW4gZW50cmllc10KICAgICAgICBrZWVwID0gWyhoLCBsKSBmb3IgaCwgbCBpbiB6aXAoaGFuZGxlcywgbGFiZWxzKSBpZiBoIGlzIG5vdCBOb25lXQogICAgICAgIGlmIGtlZXA6CiAgICAgICAgICAgIGxlZyA9IGF4LmxlZ2VuZChbaCBmb3IgaCwgXyBpbiBrZWVwXSwgW2wgZm9yIF8sIGwgaW4ga2VlcF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2M9Imxvd2VyIGxlZnQiLCBmb250c2l6ZT02LCBmcmFtZWFscGhhPTAuOSwgZnJhbWVvbj1UcnVlKQogICAgICAgICAgICB1bml0ID0gY2FudmFzLmdldCgibGVnZW5kX3RpdGxlIikKICAgICAgICAgICAgaWYgdW5pdDoKICAgICAgICAgICAgICAgIGxlZy5zZXRfdGl0bGUodW5pdCkKICAgICAgICAgICAgICAgIGxlZy5nZXRfdGl0bGUoKS5zZXRfZm9udHNpemUoNikKCiAgICBpZiBjYW52YXMuZ2V0KCJ0aXRsZSIpOgogICAgICAgIGZpZy5zdXB0aXRsZShjYW52YXNbInRpdGxlIl0sIGZvbnRzaXplPTEwLCB5PTAuOTkpCiAgICBmb290ZXIgPSBfcHJvdmVuYW5jZV9mb290ZXIocHJvamVjdCwgbWFuaWZlc3QpCiAgICBpZiBmb290ZXI6CiAgICAgICAgZmlnLnRleHQoMC4wNSwgMC4wMTUsIGZvb3RlciwgZm9udHNpemU9NS41LCBjb2xvcj0iIzU1NTU1NSIsIGhhPSJsZWZ0IikKCiAgICBvdXQgPSBwcm9qZWN0IC8gInJlbmRlcnMiIC8gKG91dF9vdmVycmlkZSBvciBjYW52YXMuZ2V0KCJvdXQiLCAibWFwLnBuZyIpKQogICAgb3V0LnBhcmVudC5ta2RpcihleGlzdF9vaz1UcnVlLCBwYXJlbnRzPVRydWUpCiAgICBmaWcuc2F2ZWZpZyhvdXQsIGRwaT1jYW52YXMuZ2V0KCJkcGkiLCAzMDApKQogICAgcGx0LmNsb3NlKGZpZykKICAgIHJldHVybiB7Im9rIjogVHJ1ZSwgIm91dCI6IHN0cihvdXQpLCAid2lkdGhfaW4iOiBjYW52YXMuZ2V0KCJ3aWR0aF9pbiIpLAogICAgICAgICAgICAiZHBpIjogY2FudmFzLmdldCgiZHBpIiksICJsYXllcnNfZHJhd24iOiBsZW4obWFpbl9sYXllcnMpLCAid2FybmluZ3MiOiBwcm9ibGVtcyBvciBOb25lfQoKCmRlZiBtYWluKGFyZ3Y6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lKSAtPiBpbnQ6CiAgICBhcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5SYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIpCiAgICBhcC5hZGRfYXJndW1lbnQoInByb2plY3QiKQogICAgYXAuYWRkX2FyZ3VtZW50KCItLW91dCIsIGhlbHA9Im92ZXJyaWRlIG91dHB1dCBmaWxlbmFtZSB1bmRlciByZW5kZXJzLyIpCiAgICBhcmdzID0gYXAucGFyc2VfYXJncyhhcmd2KQogICAgcHJpbnQoanNvbi5kdW1wcyhyZW5kZXIoYXJncy5wcm9qZWN0LCBhcmdzLm91dCksIGluZGVudD0yKSkKICAgIHJldHVybiAwCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHN5cy5leGl0KG1haW4oKSkK","executable":false},{"filename":"scripts/zonal_stats.py","mimeType":"text/x-python","data":"IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiJ6b25hbF9zdGF0cy5weSDigJQgcGVyLXpvbmUgc3RhdGlzdGljcyBvZiBhIHJhc3RlciB3aXRoaW4gdmVjdG9yIHBvbHlnb25zLgoKWm9uZXMgPSBhbnkgdmVjdG9yIGZpbGUgZ2VvcGFuZGFzIGNhbiByZWFkIChHZW9KU09OL1NoYXBlZmlsZS9HZW9QYWNrYWdlL+KApikuClJhc3RlciA9IGFueSBHREFMLXJlYWRhYmxlIHNpbmdsZS1iYW5kIHJhc3RlciAoR2VvVElGRiwg4oCmKS4gQ1JTIG1pc21hdGNoIGlzCmhhbmRsZWQgYnkgcmVwcm9qZWN0aW5nIHRoZSBaT05FUyAobmV2ZXIgcmVzYW1wbGluZyB0aGUgcmFzdGVyIOKAlCBzdGF0aXN0aWNzCm11c3QgcmVmbGVjdCB0aGUgc291cmNlIGdyaWQpLiBab25lcyB3aXRoIG5vIHZhbGlkIHBpeGVscyByZXBvcnQgbnVsbCBzdGF0cywKbm90IHplcm9zLgoKVXNhZ2U6CiAgem9uYWxfc3RhdHMucHkgLS1yYXN0ZXIgZGVtLnRpZiAtLXpvbmVzIGNvdW50aWVzLmdwa2cgXAogICAgICAtLXN0YXRzIG1lYW4gbWluIG1heCBzdGQgY291bnQgLS1pZC1jb2x1bW4gR0VPSUQgXAogICAgICAtLW91dC1qc29uIHpvbmVzX3N0YXRzLmpzb24gLS1vdXQtY3N2IHpvbmVzX3N0YXRzLmNzdgoKT3V0cHV0IHJvd3M6IG9uZSBwZXIgem9uZSwgcGx1cyBhIGBwY3RfdmFsaWRgIGNvdmVyYWdlIGZyYWN0aW9uLiBKU09OIGtlZXBzIGZ1bGwKcHJlY2lzaW9uOyBDU1YgaXMgZm9yIHNwcmVhZHNoZWV0cy4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQgY3N2CmltcG9ydCBqc29uCmltcG9ydCBtYXRoCmltcG9ydCBzeXMKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCgpNSVNTSU5HID0geyJkZXBzIjogInpvbmFsX3N0YXRzIG5lZWRzIHRoZSBnZW8gc3RhY2s6IGdlb3BhbmRhcywgcmFzdGVyaW8sIHNoYXBlbHksIG51bXB5LCBweXByb2ouXG4iCiAgICAgICAgICAgICAgICAgICAgIkluc3RhbGwgd2l0aDogcGlwIGluc3RhbGwgZ2VvcGFuZGFzIHJhc3RlcmlvIHB5b2dyaW8gc2hhcGVseSBweXByb2oifQoKCmRlZiBtYWluKGFyZ3Y6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lKSAtPiBpbnQ6CiAgICBhcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5SYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIpCiAgICBhcC5hZGRfYXJndW1lbnQoIi0tcmFzdGVyIiwgcmVxdWlyZWQ9VHJ1ZSkKICAgIGFwLmFkZF9hcmd1bWVudCgiLS16b25lcyIsIHJlcXVpcmVkPVRydWUpCiAgICBhcC5hZGRfYXJndW1lbnQoIi0tc3RhdHMiLCBuYXJncz0iKyIsIGRlZmF1bHQ9WyJtZWFuIiwgIm1pbiIsICJtYXgiLCAic3RkIiwgImNvdW50Il0sCiAgICAgICAgICAgICAgICAgICAgaGVscD0iYW55IG9mIG1lYW4gbWluIG1heCBzdGQgc3VtIG1lZGlhbiBjb3VudCBwY3RfdmFsaWQiKQogICAgYXAuYWRkX2FyZ3VtZW50KCItLWlkLWNvbHVtbiIsIGRlc3Q9ImlkX2NvbHVtbiIsCiAgICAgICAgICAgICAgICAgICAgaGVscD0iem9uZSBhdHRyaWJ1dGUgdG8gY2FycnkgdGhyb3VnaCAoZGVmYXVsdDogZmlyc3Qgem9uZSBjb2x1bW4pIikKICAgIGFwLmFkZF9hcmd1bWVudCgiLS1hbGwtdG91Y2hlZCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICAgICAgICAgICAgICAgICAgaGVscD0iaW5jbHVkZSBwaXhlbHMgdG91Y2hlZCBieSB0aGUgYm91bmRhcnksIG5vdCBqdXN0IGNlbnRlcnMgKGdlbnRsZXIgb24gdGhpbiB6b25lcykiKQogICAgYXAuYWRkX2FyZ3VtZW50KCItLW91dC1qc29uIiwgZGVzdD0ib3V0X2pzb24iLCByZXF1aXJlZD1UcnVlKQogICAgYXAuYWRkX2FyZ3VtZW50KCItLW91dC1jc3YiLCBkZXN0PSJvdXRfY3N2IikKICAgIGFyZ3MgPSBhcC5wYXJzZV9hcmdzKGFyZ3YpCgogICAgdHJ5OgogICAgICAgIGltcG9ydCBnZW9wYW5kYXMgYXMgZ3BkCiAgICAgICAgaW1wb3J0IG51bXB5IGFzIG5wCiAgICAgICAgaW1wb3J0IHJhc3RlcmlvCiAgICAgICAgZnJvbSByYXN0ZXJpby5mZWF0dXJlcyBpbXBvcnQgcmFzdGVyaXplCiAgICBleGNlcHQgSW1wb3J0RXJyb3IgYXMgZXhjOgogICAgICAgIHByaW50KGpzb24uZHVtcHMoeyJvayI6IEZhbHNlLCAiZXJyb3IiOiBmIntleGN9IiwgKipNSVNTSU5HWyJkZXBzIl19KSwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIHJldHVybiAyCgogICAgcmFzdGVyX3BhdGggPSBQYXRoKGFyZ3MucmFzdGVyKQogICAgem9uZXNfcGF0aCA9IFBhdGgoYXJncy56b25lcykKICAgIGlmIG5vdCByYXN0ZXJfcGF0aC5pc19maWxlKCk6CiAgICAgICAgcHJpbnQoanNvbi5kdW1wcyh7Im9rIjogRmFsc2UsICJlcnJvciI6IGYicmFzdGVyIG5vdCBmb3VuZDoge3Jhc3Rlcl9wYXRofSJ9KSkKICAgICAgICByZXR1cm4gMQogICAgaWYgbm90IHpvbmVzX3BhdGguaXNfZmlsZSgpOgogICAgICAgIHByaW50KGpzb24uZHVtcHMoeyJvayI6IEZhbHNlLCAiZXJyb3IiOiBmInpvbmVzIG5vdCBmb3VuZDoge3pvbmVzX3BhdGh9In0pKQogICAgICAgIHJldHVybiAxCgogICAgd2l0aCByYXN0ZXJpby5vcGVuKHJhc3Rlcl9wYXRoKSBhcyBzcmM6CiAgICAgICAgYmFuZCA9IHNyYy5yZWFkKDEpCiAgICAgICAgbm9kYXRhID0gc3JjLm5vZGF0YQogICAgICAgIHJhc3Rlcl9jcnMgPSBzcmMuY3JzCiAgICAgICAgdHJhbnNmb3JtID0gc3JjLnRyYW5zZm9ybQogICAgICAgICMgbm9ybWFsaXplIG5vZGF0YSBpbnRvIGEgYm9vbGVhbiBtYXNrIG9mIGludmFsaWQgcGl4ZWxzCiAgICAgICAgdmFsaWQgPSBucC5vbmVzKGJhbmQuc2hhcGUsIGR0eXBlPWJvb2wpCiAgICAgICAgaWYgbm9kYXRhIGlzIG5vdCBOb25lOgogICAgICAgICAgICB2YWxpZCAmPSBiYW5kICE9IG5vZGF0YQogICAgICAgIGZpbml0ZSA9IG5wLmlzZmluaXRlKGJhbmQpCiAgICAgICAgaWYgZmluaXRlLmFueSgpIGFuZCBub3QgZmluaXRlLmFsbCgpOgogICAgICAgICAgICB2YWxpZCAmPSBmaW5pdGUKCiAgICAgICAgem9uZXMgPSBncGQucmVhZF9maWxlKHpvbmVzX3BhdGgpCiAgICAgICAgaWYgcmFzdGVyX2NycyBpcyBub3QgTm9uZSBhbmQgem9uZXMuY3JzIGlzIG5vdCBOb25lIGFuZCB6b25lcy5jcnMgIT0gcmFzdGVyX2NyczoKICAgICAgICAgICAgem9uZXMgPSB6b25lcy50b19jcnMocmFzdGVyX2NycykKICAgICAgICB6b25lcyA9IHpvbmVzLnJlc2V0X2luZGV4KGRyb3A9VHJ1ZSkKCiAgICAgICAgaWRfY29sID0gYXJncy5pZF9jb2x1bW4KICAgICAgICBpZiBpZF9jb2wgaXMgTm9uZToKICAgICAgICAgICAgaWRfY29sID0gbmV4dCgoYyBmb3IgYyBpbiB6b25lcy5jb2x1bW5zIGlmIGMgIT0gImdlb21ldHJ5IiksICJ6b25lX2luZGV4IikKCiAgICAgICAgIyBhcmVhLWJhc2VkIHBpeGVsIHZhbGlkaXR5IGZvciBwY3RfdmFsaWQgKHRydWUgZGVub21pbmF0b3IgcGVyIHpvbmUpCiAgICAgICAgc2hhcGVzID0gWyhnZW9tLCBpICsgMSkgZm9yIGksIGdlb20gaW4gZW51bWVyYXRlKHpvbmVzLmdlb21ldHJ5KSBpZiBnZW9tIGlzIG5vdCBOb25lIGFuZCBub3QgZ2VvbS5pc19lbXB0eV0KICAgICAgICB6b25lX2luZGV4ID0gcmFzdGVyaXplKHNoYXBlcywgb3V0X3NoYXBlPWJhbmQuc2hhcGUsIHRyYW5zZm9ybT10cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPTAsIGR0eXBlPSJpbnQzMiIsIGFsbF90b3VjaGVkPWFyZ3MuYWxsX3RvdWNoZWQpCgogICAgICAgIHJvd3MgPSBbXQogICAgICAgIHRvdGFsX3BpeGVscyA9IGludCh2YWxpZC5zdW0oKSkKICAgICAgICBmb3IgaSwgZmVhdCBpbiB6b25lcy5pdGVycm93cygpOgogICAgICAgICAgICBtYXNrID0gem9uZV9pbmRleCA9PSAoaSArIDEpCiAgICAgICAgICAgIG5fbWFzayA9IGludChtYXNrLnN1bSgpKQogICAgICAgICAgICB2YWxzID0gYmFuZFttYXNrICYgdmFsaWRdCiAgICAgICAgICAgIHJvdyA9IHsiem9uZV9pZCI6IGZlYXQuZ2V0KGlkX2NvbCwgaSksICJpZF9jb2x1bW4iOiBpZF9jb2wsCiAgICAgICAgICAgICAgICAgICAicGl4ZWxzIjogbl9tYXNrLCAidmFsaWRfcGl4ZWxzIjogaW50KHZhbHMuc2l6ZSl9CiAgICAgICAgICAgIGlmIHZhbHMuc2l6ZToKICAgICAgICAgICAgICAgIGZvciBzdGF0IGluIGFyZ3Muc3RhdHM6CiAgICAgICAgICAgICAgICAgICAgaWYgc3RhdCA9PSAibWVhbiI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1sibWVhbiJdID0gZmxvYXQobnAubWVhbih2YWxzKSkKICAgICAgICAgICAgICAgICAgICBlbGlmIHN0YXQgPT0gIm1pbiI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1sibWluIl0gPSBmbG9hdChucC5taW4odmFscykpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBzdGF0ID09ICJtYXgiOgogICAgICAgICAgICAgICAgICAgICAgICByb3dbIm1heCJdID0gZmxvYXQobnAubWF4KHZhbHMpKQogICAgICAgICAgICAgICAgICAgIGVsaWYgc3RhdCA9PSAic3RkIjoKICAgICAgICAgICAgICAgICAgICAgICAgcm93WyJzdGQiXSA9IGZsb2F0KG5wLnN0ZCh2YWxzKSkKICAgICAgICAgICAgICAgICAgICBlbGlmIHN0YXQgPT0gInN1bSI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1sic3VtIl0gPSBmbG9hdChucC5zdW0odmFscykpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBzdGF0ID09ICJtZWRpYW4iOgogICAgICAgICAgICAgICAgICAgICAgICByb3dbIm1lZGlhbiJdID0gZmxvYXQobnAubWVkaWFuKHZhbHMpKQogICAgICAgICAgICAgICAgICAgIGVsaWYgc3RhdCA9PSAiY291bnQiOgogICAgICAgICAgICAgICAgICAgICAgICByb3dbImNvdW50Il0gPSBpbnQodmFscy5zaXplKQogICAgICAgICAgICAgICAgICAgIGVsaWYgc3RhdCA9PSAicGN0X3ZhbGlkIjoKICAgICAgICAgICAgICAgICAgICAgICAgcm93WyJwY3RfdmFsaWQiXSA9IHJvdW5kKDEwMC4wICogdmFscy5zaXplIC8gbl9tYXNrLCAyKSBpZiBuX21hc2sgZWxzZSBOb25lCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdChmIlVua25vd24gc3RhdCB7c3RhdCFyfSIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmb3Igc3RhdCBpbiBhcmdzLnN0YXRzOgogICAgICAgICAgICAgICAgICAgIHJvd1tzdGF0XSA9IE5vbmUKICAgICAgICAgICAgaWYgInBjdF92YWxpZCIgbm90IGluIHJvdzoKICAgICAgICAgICAgICAgIHJvd1sicGN0X3ZhbGlkIl0gPSByb3VuZCgxMDAuMCAqIHZhbHMuc2l6ZSAvIG5fbWFzaywgMikgaWYgbl9tYXNrIGVsc2UgTm9uZQogICAgICAgICAgICByb3dzLmFwcGVuZChyb3cpCgogICAgb3V0ID0gewogICAgICAgICJvayI6IFRydWUsCiAgICAgICAgInJhc3RlciI6IHN0cihyYXN0ZXJfcGF0aCksCiAgICAgICAgInJhc3Rlcl9jcnMiOiBzdHIocmFzdGVyX2NycyksCiAgICAgICAgInpvbmVzIjogc3RyKHpvbmVzX3BhdGgpLAogICAgICAgICJ6b25lc19jcnMiOiBzdHIoem9uZXMuY3JzKSwKICAgICAgICAiaWRfY29sdW1uIjogaWRfY29sLAogICAgICAgICJhbGxfdG91Y2hlZCI6IGFyZ3MuYWxsX3RvdWNoZWQsCiAgICAgICAgIm5vZGF0YSI6IG5vZGF0YSBpZiBub2RhdGEgaXMgbm90IE5vbmUgZWxzZSBOb25lLAogICAgICAgICJzdGF0cyI6IGFyZ3Muc3RhdHMsCiAgICAgICAgInZhbGlkX3BpeGVsc19pbl9yYXN0ZXIiOiB0b3RhbF9waXhlbHMsCiAgICAgICAgIm5fem9uZXMiOiBsZW4ocm93cyksCiAgICAgICAgIm5fem9uZXNfd2l0aF9ub192YWxpZF9waXhlbHMiOiBzdW0oMSBmb3IgciBpbiByb3dzIGlmIHJbInZhbGlkX3BpeGVscyJdID09IDApLAogICAgICAgICJyb3dzIjogcm93cywKICAgIH0KICAgIFBhdGgoYXJncy5vdXRfanNvbikud3JpdGVfdGV4dChqc29uLmR1bXBzKG91dCwgaW5kZW50PTIpICsgIlxuIikKICAgIGlmIGFyZ3Mub3V0X2NzdjoKICAgICAgICBmaWVsZG5hbWVzID0gW10KICAgICAgICBmb3IgciBpbiByb3dzOgogICAgICAgICAgICBmb3IgayBpbiByOgogICAgICAgICAgICAgICAgaWYgayBub3QgaW4gZmllbGRuYW1lczoKICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzLmFwcGVuZChrKQogICAgICAgIHdpdGggb3BlbihhcmdzLm91dF9jc3YsICJ3IiwgbmV3bGluZT0iIikgYXMgZmg6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi5EaWN0V3JpdGVyKGZoLCBmaWVsZG5hbWVzPWZpZWxkbmFtZXMpCiAgICAgICAgICAgIHdyaXRlci53cml0ZWhlYWRlcigpCiAgICAgICAgICAgIHdyaXRlci53cml0ZXJvd3Mocm93cykKICAgIHByaW50KGpzb24uZHVtcHMoe2s6IHYgZm9yIGssIHYgaW4gb3V0Lml0ZW1zKCkgaWYgayAhPSAicm93cyJ9LCBpbmRlbnQ9MikpCiAgICBwcmludChmIndyb3RlIHthcmdzLm91dF9qc29ufSIgKyAoZiIgYW5kIHthcmdzLm91dF9jc3Z9IiBpZiBhcmdzLm91dF9jc3YgZWxzZSAiIikpCiAgICByZXR1cm4gMAoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBzeXMuZXhpdChtYWluKCkpCg==","executable":false},{"filename":"skill.json","mimeType":"application/json","data":"ewogICJhdXRob3IiOiAiUmVkZWVwIiwKICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKICAidmVyc2lvbiI6ICIxLjAuMiIsCiAgInNvdXJjZSI6ICJodHRwczovL3JlZGVlcC5hcHAvYWdlbnQtZGlyZWN0b3J5L2dlb3NwYXRpYWwtYW5hbHlzdCIsCiAgImhvbWVwYWdlIjogImh0dHBzOi8vcmVkZWVwLmFwcC9hZ2VudC1kaXJlY3RvcnkvZ2Vvc3BhdGlhbC1hbmFseXN0IiwKICAidGFncyI6IFsKICAgICJnZW9zcGF0aWFsIiwKICAgICJnaXMiLAogICAgIm1hcHMiLAogICAgInpvbmFsLXN0YXRpc3RpY3MiLAogICAgImNhcnRvZ3JhcGh5IiwKICAgICJkZW0iLAogICAgInNoYXBlZmlsZSIsCiAgICAiZ2VvdGlmZiIKICBdLAogICJjcmVhdGVkQXQiOiAiMjAyNi0wOC0zMSIsCiAgIm9yaWdpbiI6ICJjdXN0b20iCn0K","executable":false}]}],"tasks":[{"label":"Turn Geographic Data into Maps and Statistics","instruction":"Turn Geographic Data into Maps and Statistics. Analyze maps, GIS files, and rasters the way a desktop GIS would: zonal statistics, buffers, spatial joins, and choropleths, ending in publication-quality figures with insets and zoom breakouts. Layers stay editable, and each dataset records its official-source provenance. Confirm the scope and gather these inputs before starting: GIS files (Shapefile, GeoPackage, GeoJSON), rasters (GeoTIFF/DEM), or the name of a region plus the vetted dataset to fetch for it."}],"onboardingIntroduction":"No connector is required; the skill runs on the local Python geo stack.\nFirst use prompts to install geopandas, rasterio, and friends into the run_code environment; approve once.\nDatasets download from vetted official sources (USGS, NOAA, Census, Natural Earth) with a recorded provenance file."}
