Mapa Base
mapa_base = fl.Map()
mapa_base
Make this Notebook Trusted to load map: File -> Trust Notebook
Latitud - Longitud
# Palacio de Gobierno de Ciudad de Mexico (CDMX): 19.432523957050446, -99.13116811357122
palacio_nacional_MX = fl.Map(location=[19.432523957050446, -99.13116811357122],zoom_start=17)
palacio_nacional_MX
Make this Notebook Trusted to load map: File -> Trust Notebook
Marcador - Círculo - Logo
# Palacio de Gobierno de Ciudad de Mexico (CDMX): 19.432523957050446, -99.13116811357122
palacio_nacional_MX = fl.Map(location=[19.432523957050446, -99.13116811357122],zoom_start=17)
img_001 = "https://www.python.org/static/community_logos/python-powered-w-70x28.png"
fl.Marker(location=[19.432523957050446, -99.13116811357122],
icon=fl.Icon(color="darkblue",icon="fire")).add_to(palacio_nacional_MX)
fl.Circle(location=[19.432523957050446, -99.13116811357122],
color="orange",fill_color="red",weight=4,raidus=40,fill_opacity=0.4).add_to(palacio_nacional_MX)
FloatImage(img_001,left=90,bottom=90).add_to(palacio_nacional_MX)
palacio_nacional_MX
Make this Notebook Trusted to load map: File -> Trust Notebook
MiniMap - Tiles - Full Screen
# Palacio de Gobierno de Ciudad de Mexico (CDMX): 19.432523957050446, -99.13116811357122
palacio_nacional_MX = fl.Map(location=[19.432523957050446, -99.13116811357122],zoom_start=16,tiles="stamenterrain")
img_001 = "https://www.python.org/static/community_logos/python-powered-w-70x28.png"
fl.Marker(location=[19.432523957050446, -99.13116811357122],
icon=fl.Icon(color="darkblue",icon="ok-sign")).add_to(palacio_nacional_MX)
fl.Circle(location=[19.432523957050446, -99.13116811357122],
color="orange",fill_color="red",weight=4,raidus=40,fill_opacity=0.4).add_to(palacio_nacional_MX)
FloatImage(img_001,left=90,bottom=90).add_to(palacio_nacional_MX)
## se cambio el codigo de minimap con respecto al codigo q clase 11 era con child ##
## si no sale 2 mapas ##
MiniMap(toggle_display=True,position="bottomleft",tile_layer="stamenterrain").add_to(palacio_nacional_MX)
palacio_nacional_MX
Make this Notebook Trusted to load map: File -> Trust Notebook
Menú Tiles
# Palacio de Gobierno de Ciudad de Mexico (CDMX): 19.432523957050446, -99.13116811357122
# tiles: stamenterrain - stamentoner - stamenwatercolor - cartodbpositron - OpenStreetMap
palacio_nacional_MX = fl.Map(location=[19.432523957050446, -99.13116811357122],zoom_start=17)
img_001 = "https://www.python.org/static/community_logos/python-powered-w-70x28.png"
fl.Marker(location=[19.432523957050446, -99.13116811357122],
icon=fl.Icon(color="darkblue",icon="fire")).add_to(palacio_nacional_MX)
fl.Circle(location=[19.432523957050446, -99.13116811357122],
color="orange",fill_color="red",weight=4,raidus=40,fill_opacity=0.4).add_to(palacio_nacional_MX)
FloatImage(img_001,left=90,bottom=90).add_to(palacio_nacional_MX)
plugins.Fullscreen(position="topleft").add_to(palacio_nacional_MX)
draw = plugins.Draw(export=True)
fl.TileLayer("stamenterrain").add_to(palacio_nacional_MX)
fl.TileLayer("stamentoner").add_to(palacio_nacional_MX)
fl.TileLayer("stamenwatercolor").add_to(palacio_nacional_MX)
fl.TileLayer("cartodbpositron").add_to(palacio_nacional_MX)
fl.TileLayer("OpenStreetMap").add_to(palacio_nacional_MX)
fl.LayerControl(position="bottomright").add_to(palacio_nacional_MX)
palacio_nacional_MX
Make this Notebook Trusted to load map: File -> Trust Notebook
Múltiples Marcadores I
# Palacio de Gobierno de Ciudad de Mexico (CDMX): 19.432523957050446, -99.13116811357122
palacio_nacional_MX = fl.Map(location=[19.432523957050446, -99.13116811357122],zoom_start=16)
img_001 = "https://www.python.org/static/community_logos/python-powered-w-70x28.png"
text_001="<b>Catedral Metropolitana de la Ciudad de México</b>"
text_002="<b>Templo Mayor</b>"
text_003="<b>Plaza de la Constitucion - Zócalo</b>"
fl.Marker(location=[19.434274568217358, -99.13320843803542],
icon=fl.Icon(color="darkblue",icon="ok-sign"),popup=fl.Popup(text_001,max_width=250)).add_to(palacio_nacional_MX)
fl.Marker(location=[19.43475062782159, -99.1319092606943],
icon=fl.Icon(color="orange",icon="ok-sign"),popup=fl.Popup(text_002,max_width=200)).add_to(palacio_nacional_MX)
fl.Marker(location=[19.432650354358657, -99.13318616642387],
icon=fl.Icon(color="blue",icon="ok-sign"),popup=fl.Popup(text_003,max_width=200)).add_to(palacio_nacional_MX)
FloatImage(img_001,left=90,bottom=90).add_to(palacio_nacional_MX)
### Se adiciono el punto Inicial del Palacion NAcional
fl.Marker(location=[19.432523957050446, -99.13116811357122],
icon=fl.Icon(color="purple",icon="building", prefix='fa'),popup=fl.Popup("<b>Palacion Nacional</b>",max_width=250)).add_to(palacio_nacional_MX)
fl.Circle(location=[19.432523957050446, -99.13116811357122],
color="green",fill_color="red",weight=4,raidus=30,fill_opacity=0.4,tooltip="Sede de Gobierno").add_to(palacio_nacional_MX)
palacio_nacional_MX
Make this Notebook Trusted to load map: File -> Trust Notebook
Múltiples Marcadores II - Data Frame
# Palacio de Gobierno de Ciudad de Mexico (CDMX): 19.432523957050446, -99.13116811357122
palacio_nacional_MX = fl.Map(location=[19.432523957050446, -99.13116811357122],zoom_start=16)
img_001 = "https://www.python.org/static/community_logos/python-powered-w-70x28.png"
centro_dataframe = pd.DataFrame({'lugar':['<b>Catedral Metropolitana de la Ciudad de México<b>','<b>Templo Mayo<b>r','<b>Plaza de la Constitucion - Zócalo<b>'],
'latitud':[19.434274568217358,19.43475062782159,19.432650354358657],
'longitud':[-99.13320843803542,-99.1319092606943,-99.13318616642387],
'simbolo':['ok-sign','ok-sign','ok-sign'],
'color':['dark-blue','orange','blue']})
for i in centro_dataframe.itertuples():
fl.Marker(location=[i.latitud,i.longitud],
icon=fl.Icon(color=i.color,icon=i.simbolo),popup=fl.Popup(i.lugar,max_width=200)).add_to(palacio_nacional_MX)
FloatImage(img_001,left=90,bottom=90).add_to(palacio_nacional_MX)
### Se adiciono el punto Inicial del Palacion NAcional
fl.Marker(location=[19.432523957050446, -99.13116811357122],
icon=fl.Icon(color="purple",icon="building", prefix='fa'),popup=fl.Popup("<b>Palacion Nacional</b>",max_width=250)).add_to(palacio_nacional_MX)
fl.Circle(location=[19.432523957050446, -99.13116811357122],
color="green",fill_color="red",weight=4,raidus=30,fill_opacity=0.4,tooltip="Sede de Gobierno").add_to(palacio_nacional_MX)
palacio_nacional_MX
Make this Notebook Trusted to load map: File -> Trust Notebook
Múltiples Marcadores III - Data Frame from File
# Palacio de Gobierno de Ciudad de Mexico (CDMX): 19.432523957050446, -99.13116811357122
centro_CDMX = fl.Map(location=[19.432523957050446, -99.13116811357122],zoom_start=16)
img_001 = "https://www.python.org/static/community_logos/python-powered-w-70x28.png"
FloatImage(img_001,left=90,bottom=90).add_to(centro_CDMX)
puntos = pd.read_csv("puntos_centro_CDMX.txt")
puntos
puntos_frame = pd.DataFrame(puntos)
for i in puntos_frame.itertuples():
fl.Marker(location=[i.latitud,i.longitud],
icon=fl.Icon(color=i.color,icon=i.simbolo),popup=fl.Popup(i.lugar,max_width=200)).add_to(centro_CDMX)
### Se adiciono el punto Inicial del Palacion NAcional
fl.Marker(location=[19.432523957050446, -99.13116811357122],
icon=fl.Icon(color="purple",icon="building", prefix='fa'),popup=fl.Popup("<b>Palacion Nacional</b>",max_width=250)).add_to(centro_CDMX)
fl.Circle(location=[19.432523957050446, -99.13116811357122],
color="green",fill_color="red",weight=4,raidus=30,fill_opacity=0.4,tooltip="Sede de Gobierno").add_to(centro_CDMX)
centro_CDMX
Make this Notebook Trusted to load map: File -> Trust Notebook
LS0tDQp0aXRsZTogIlRBUkVBIDM6IE1hcGFzIEludGVyYWN0aXZvcyAtIEZvbGl1bSINCnN1YnRpdGxlOiAiUk1hcmtkb3duIC0gUHl0aG9uIg0KYXV0aG9yOiAiTW9kaWZpY2FkbzogV2lsbGlhbSBBc3RvY29uZG9yIEZlbGl4IC0gU291cmNlOiBSZW56byBDw6FjZXJlcyBSb3NzaSINCmRhdGU6ICIyMDIyLzA4LzMwIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCi0tLQ0KDQo8IS0tIEZvbGl1bSBlcyBsYSBsaWJyZXLDrWEgZGUgUHl0aG9uIHF1ZSBub3MgcGVybWl0ZSBjcmVhciBNYXBhcyBJbnRlcmFjdGl2b3MgLS0+DQoNCmBgYHtweXRob24sIGluY2x1ZGU9RkFMU0V9DQoNCmltcG9ydCBmb2xpdW0gYXMgZmwNCg0KaW1wb3J0IHBhbmRhcyBhcyBwZA0KDQpmcm9tIGZvbGl1bS5wbHVnaW5zIGltcG9ydCBNaW5pTWFwDQoNCmZyb20gZm9saXVtLnBsdWdpbnMgaW1wb3J0IEZsb2F0SW1hZ2UNCg0KZnJvbSBmb2xpdW0gaW1wb3J0IHBsdWdpbnMNCg0KYGBgDQoNCg0KIyMgTWFwYSBCYXNlDQoNCmBgYHtweXRob24sZmlnLmFsaWduPSJjZW50ZXIiLHJlc3VsdHM9J2hpZGUnLGNvbGxhcHNlPVRSVUV9DQoNCm1hcGFfYmFzZSA9IGZsLk1hcCgpDQoNCm1hcGFfYmFzZQ0KDQpgYGANCg0KPCEtLSBFc3RvIGVzIG51ZXZvIGxhYmVsIEhUTUwgcGFyYSBoYWNlciB1biBzYWx0by9lc3BhY2lvLS0+DQo8YnI+DQo8YnI+DQoNCiMjIExhdGl0dWQgLSBMb25naXR1ZA0KDQpgYGB7cHl0aG9uLHJlc3VsdHM9J2hpZGUnLGNvbGxhcHNlPVRSVUV9DQoNCiMgUGFsYWNpbyBkZSBHb2JpZXJubyBkZSBDaXVkYWQgZGUgTWV4aWNvIChDRE1YKTogMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjINCg0KcGFsYWNpb19uYWNpb25hbF9NWCA9IGZsLk1hcChsb2NhdGlvbj1bMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjJdLHpvb21fc3RhcnQ9MTcpDQoNCnBhbGFjaW9fbmFjaW9uYWxfTVgNCg0KDQpgYGANCg0KPGJyPg0KPGJyPg0KDQojIyBNYXJjYWRvciAtIEPDrXJjdWxvIC0gTG9nbw0KDQpgYGB7cHl0aG9uLHJlc3VsdHM9J2hpZGUnLGNvbGxhcHNlPVRSVUV9DQoNCiMgUGFsYWNpbyBkZSBHb2JpZXJubyBkZSBDaXVkYWQgZGUgTWV4aWNvIChDRE1YKTogMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjINCg0KcGFsYWNpb19uYWNpb25hbF9NWCA9IGZsLk1hcChsb2NhdGlvbj1bMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjJdLHpvb21fc3RhcnQ9MTcpDQoNCmltZ18wMDEgPSAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9zdGF0aWMvY29tbXVuaXR5X2xvZ29zL3B5dGhvbi1wb3dlcmVkLXctNzB4MjgucG5nIg0KDQoNCmZsLk1hcmtlcihsb2NhdGlvbj1bMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjJdLA0KICAgICAgICAgIGljb249ZmwuSWNvbihjb2xvcj0iZGFya2JsdWUiLGljb249ImZpcmUiKSkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQoNCmZsLkNpcmNsZShsb2NhdGlvbj1bMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjJdLA0KICAgICAgICAgIGNvbG9yPSJvcmFuZ2UiLGZpbGxfY29sb3I9InJlZCIsd2VpZ2h0PTQscmFpZHVzPTQwLGZpbGxfb3BhY2l0eT0wLjQpLmFkZF90byhwYWxhY2lvX25hY2lvbmFsX01YKQ0KDQoNCkZsb2F0SW1hZ2UoaW1nXzAwMSxsZWZ0PTkwLGJvdHRvbT05MCkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQoNCg0KcGFsYWNpb19uYWNpb25hbF9NWA0KDQpgYGANCg0KPGJyPg0KPGJyPg0KDQojIyBNaW5pTWFwIC0gVGlsZXMgLSBGdWxsIFNjcmVlbg0KDQoNCmBgYHtweXRob24scmVzdWx0cz0naGlkZScsY29sbGFwc2U9VFJVRX0NCg0KIyBQYWxhY2lvIGRlIEdvYmllcm5vIGRlIENpdWRhZCBkZSBNZXhpY28gKENETVgpOiAxOS40MzI1MjM5NTcwNTA0NDYsIC05OS4xMzExNjgxMTM1NzEyMg0KDQpwYWxhY2lvX25hY2lvbmFsX01YID0gZmwuTWFwKGxvY2F0aW9uPVsxOS40MzI1MjM5NTcwNTA0NDYsIC05OS4xMzExNjgxMTM1NzEyMl0sem9vbV9zdGFydD0xNix0aWxlcz0ic3RhbWVudGVycmFpbiIpDQoNCmltZ18wMDEgPSAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9zdGF0aWMvY29tbXVuaXR5X2xvZ29zL3B5dGhvbi1wb3dlcmVkLXctNzB4MjgucG5nIg0KDQoNCmZsLk1hcmtlcihsb2NhdGlvbj1bMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjJdLA0KICAgICAgICAgIGljb249ZmwuSWNvbihjb2xvcj0iZGFya2JsdWUiLGljb249Im9rLXNpZ24iKSkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQoNCmZsLkNpcmNsZShsb2NhdGlvbj1bMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjJdLA0KICAgICAgICAgIGNvbG9yPSJvcmFuZ2UiLGZpbGxfY29sb3I9InJlZCIsd2VpZ2h0PTQscmFpZHVzPTQwLGZpbGxfb3BhY2l0eT0wLjQpLmFkZF90byhwYWxhY2lvX25hY2lvbmFsX01YKQ0KDQoNCkZsb2F0SW1hZ2UoaW1nXzAwMSxsZWZ0PTkwLGJvdHRvbT05MCkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQoNCiMjIHNlIGNhbWJpbyBlbCBjb2RpZ28gZGUgbWluaW1hcCBjb24gcmVzcGVjdG8gYWwgY29kaWdvIHEgY2xhc2UgMTEgZXJhIGNvbiBjaGlsZCAjIw0KIyMgc2kgbm8gc2FsZSAyIG1hcGFzICMjIA0KTWluaU1hcCh0b2dnbGVfZGlzcGxheT1UcnVlLHBvc2l0aW9uPSJib3R0b21sZWZ0Iix0aWxlX2xheWVyPSJzdGFtZW50ZXJyYWluIikuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQoNCnBhbGFjaW9fbmFjaW9uYWxfTVgNCg0KYGBgDQo8IS0tIGNvZGlnbyBwYXJhIG5vIGVzdGFyIHRhbiBqdW50b3MtLT4NCjxicj4NCjxicj4NCg0KDQojIyBNZW7DuiBUaWxlcw0KDQoNCmBgYHtweXRob24scmVzdWx0cz0naGlkZScsY29sbGFwc2U9VFJVRX0NCg0KIyBQYWxhY2lvIGRlIEdvYmllcm5vIGRlIENpdWRhZCBkZSBNZXhpY28gKENETVgpOiAxOS40MzI1MjM5NTcwNTA0NDYsIC05OS4xMzExNjgxMTM1NzEyMg0KDQojIHRpbGVzOiBzdGFtZW50ZXJyYWluIC0gc3RhbWVudG9uZXIgLSBzdGFtZW53YXRlcmNvbG9yIC0gY2FydG9kYnBvc2l0cm9uIC0gT3BlblN0cmVldE1hcA0KDQpwYWxhY2lvX25hY2lvbmFsX01YID0gZmwuTWFwKGxvY2F0aW9uPVsxOS40MzI1MjM5NTcwNTA0NDYsIC05OS4xMzExNjgxMTM1NzEyMl0sem9vbV9zdGFydD0xNykNCg0KaW1nXzAwMSA9ICJodHRwczovL3d3dy5weXRob24ub3JnL3N0YXRpYy9jb21tdW5pdHlfbG9nb3MvcHl0aG9uLXBvd2VyZWQtdy03MHgyOC5wbmciDQoNCg0KZmwuTWFya2VyKGxvY2F0aW9uPVsxOS40MzI1MjM5NTcwNTA0NDYsIC05OS4xMzExNjgxMTM1NzEyMl0sDQogICAgICAgICAgaWNvbj1mbC5JY29uKGNvbG9yPSJkYXJrYmx1ZSIsaWNvbj0iZmlyZSIpKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KZmwuQ2lyY2xlKGxvY2F0aW9uPVsxOS40MzI1MjM5NTcwNTA0NDYsIC05OS4xMzExNjgxMTM1NzEyMl0sDQogICAgICAgICAgY29sb3I9Im9yYW5nZSIsZmlsbF9jb2xvcj0icmVkIix3ZWlnaHQ9NCxyYWlkdXM9NDAsZmlsbF9vcGFjaXR5PTAuNCkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQoNCg0KRmxvYXRJbWFnZShpbWdfMDAxLGxlZnQ9OTAsYm90dG9tPTkwKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KDQpwbHVnaW5zLkZ1bGxzY3JlZW4ocG9zaXRpb249InRvcGxlZnQiKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KZHJhdyA9IHBsdWdpbnMuRHJhdyhleHBvcnQ9VHJ1ZSkNCg0KDQpmbC5UaWxlTGF5ZXIoInN0YW1lbnRlcnJhaW4iKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KZmwuVGlsZUxheWVyKCJzdGFtZW50b25lciIpLmFkZF90byhwYWxhY2lvX25hY2lvbmFsX01YKQ0KDQpmbC5UaWxlTGF5ZXIoInN0YW1lbndhdGVyY29sb3IiKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KZmwuVGlsZUxheWVyKCJjYXJ0b2RicG9zaXRyb24iKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KZmwuVGlsZUxheWVyKCJPcGVuU3RyZWV0TWFwIikuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQoNCmZsLkxheWVyQ29udHJvbChwb3NpdGlvbj0iYm90dG9tcmlnaHQiKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KDQpwYWxhY2lvX25hY2lvbmFsX01YDQoNCg0KYGBgDQoNCjxicj4NCjxicj4NCg0KDQojIyBQb3B1cCAtIFRvb2x0aXAgLSBDb25maWd1cmFjacOzbg0KDQpgYGB7cHl0aG9uLHJlc3VsdHM9J2hpZGUnLGNvbGxhcHNlPVRSVUV9DQoNCiMgUGFsYWNpbyBkZSBHb2JpZXJubyBkZSBDaXVkYWQgZGUgTWV4aWNvIChDRE1YKTogMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjINCg0KcGFsYWNpb19uYWNpb25hbF9NWCA9IGZsLk1hcChsb2NhdGlvbj1bMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjJdLHpvb21fc3RhcnQ9MTcpDQoNCg0KaHRtbD0nJycNCjxiPkx1Z2FyOiBQYWxhY2lvIE5hY2lvbmFsIDwvYj48YnI+DQo8Yj5MYXRpdHVkOiAxOS40MzI1MjM5NTcwNTA0NDY8L2I+PGJyPg0KPGI+TG9uZ2l0dWQ6IC05OS4xMzExNjgxMTM1NzEyMjwvYj48YnI+DQo8Yj5XZWI6PGEgaHJlZj0naHR0cHM6Ly9iaXQubHkvMkZwUzJ0SicgdGFyZ2V0PSdfYmxhbmsnPiBQYWxhY2lvIE5BY2lvbmFsIGRlIE3DqXhpY28gV2ViPC9hPg0KPGJyPjxicj4NCjxjZW50ZXI+PGltZyBzcmM9J2h0dHBzOi8vYml0Lmx5LzNCYlJReGUnIHdpZHRoPTIwMCBoZWlnaHQ9MTAwPjwvY2VudGVyPg0KJycnDQoNCmlmcmFtZSA9IGZsLklGcmFtZShodG1sPWh0bWwsd2lkdGg9MzAwLGhlaWdodD0yNTApDQoNCmltZ18wMDEgPSAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9zdGF0aWMvY29tbXVuaXR5X2xvZ29zL3B5dGhvbi1wb3dlcmVkLXctNzB4MjgucG5nIg0KDQoNCmZsLk1hcmtlcihsb2NhdGlvbj1bMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjJdLA0KICAgICAgICAgIGljb249ZmwuSWNvbihjb2xvcj0iZGFya2JsdWUiLGljb249ImZpcmUiKSxwb3B1cD1mbC5Qb3B1cChpZnJhbWUpKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KZmwuQ2lyY2xlKGxvY2F0aW9uPVsxOS40MzI1MjM5NTcwNTA0NDYsIC05OS4xMzExNjgxMTM1NzEyMl0sDQogICAgICAgICAgY29sb3I9Im9yYW5nZSIsZmlsbF9jb2xvcj0icmVkIix3ZWlnaHQ9NCxyYWlkdXM9NDAsZmlsbF9vcGFjaXR5PTAuNCx0b29sdGlwPSJTZWRlIGRlIEdvYmllcm5vIikuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQoNCg0KRmxvYXRJbWFnZShpbWdfMDAxLGxlZnQ9OTAsYm90dG9tPTkwKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KDQpwbHVnaW5zLkZ1bGxzY3JlZW4ocG9zaXRpb249InRvcGxlZnQiKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KZHJhdyA9IHBsdWdpbnMuRHJhdyhleHBvcnQ9VHJ1ZSkNCg0KDQpmbC5UaWxlTGF5ZXIoInN0YW1lbnRlcnJhaW4iKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KZmwuVGlsZUxheWVyKCJzdGFtZW50b25lciIpLmFkZF90byhwYWxhY2lvX25hY2lvbmFsX01YKQ0KDQpmbC5UaWxlTGF5ZXIoInN0YW1lbndhdGVyY29sb3IiKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KZmwuVGlsZUxheWVyKCJjYXJ0b2RicG9zaXRyb24iKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KZmwuVGlsZUxheWVyKCJPcGVuU3RyZWV0TWFwIikuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQoNCmZsLkxheWVyQ29udHJvbChwb3NpdGlvbj0iYm90dG9tcmlnaHQiKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KDQpwYWxhY2lvX25hY2lvbmFsX01YDQoNCg0KYGBgDQoNCjxicj4NCjxicj4NCg0KDQojIyBNw7psdGlwbGVzIE1hcmNhZG9yZXMgSQ0KDQpgYGB7cHl0aG9uLCByZXN1bHRzPSdoaWRlJyxjb2xsYXBzZT1UUlVFfQ0KDQojIFBhbGFjaW8gZGUgR29iaWVybm8gZGUgQ2l1ZGFkIGRlIE1leGljbyAoQ0RNWCk6IDE5LjQzMjUyMzk1NzA1MDQ0NiwgLTk5LjEzMTE2ODExMzU3MTIyDQoNCnBhbGFjaW9fbmFjaW9uYWxfTVggPSBmbC5NYXAobG9jYXRpb249WzE5LjQzMjUyMzk1NzA1MDQ0NiwgLTk5LjEzMTE2ODExMzU3MTIyXSx6b29tX3N0YXJ0PTE2KQ0KDQoNCmltZ18wMDEgPSAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9zdGF0aWMvY29tbXVuaXR5X2xvZ29zL3B5dGhvbi1wb3dlcmVkLXctNzB4MjgucG5nIg0KDQp0ZXh0XzAwMT0iPGI+Q2F0ZWRyYWwgTWV0cm9wb2xpdGFuYSBkZSBsYSBDaXVkYWQgZGUgTcOpeGljbzwvYj4iDQoNCnRleHRfMDAyPSI8Yj5UZW1wbG8gTWF5b3I8L2I+Ig0KDQp0ZXh0XzAwMz0iPGI+UGxhemEgZGUgbGEgQ29uc3RpdHVjaW9uIC0gWsOzY2FsbzwvYj4iDQoNCmZsLk1hcmtlcihsb2NhdGlvbj1bMTkuNDM0Mjc0NTY4MjE3MzU4LCAtOTkuMTMzMjA4NDM4MDM1NDJdLA0KICAgICAgICAgIGljb249ZmwuSWNvbihjb2xvcj0iZGFya2JsdWUiLGljb249Im9rLXNpZ24iKSxwb3B1cD1mbC5Qb3B1cCh0ZXh0XzAwMSxtYXhfd2lkdGg9MjUwKSkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQoNCmZsLk1hcmtlcihsb2NhdGlvbj1bMTkuNDM0NzUwNjI3ODIxNTksIC05OS4xMzE5MDkyNjA2OTQzXSwNCiAgICAgICAgICBpY29uPWZsLkljb24oY29sb3I9Im9yYW5nZSIsaWNvbj0ib2stc2lnbiIpLHBvcHVwPWZsLlBvcHVwKHRleHRfMDAyLG1heF93aWR0aD0yMDApKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KZmwuTWFya2VyKGxvY2F0aW9uPVsxOS40MzI2NTAzNTQzNTg2NTcsIC05OS4xMzMxODYxNjY0MjM4N10sDQogICAgICAgICAgaWNvbj1mbC5JY29uKGNvbG9yPSJibHVlIixpY29uPSJvay1zaWduIikscG9wdXA9ZmwuUG9wdXAodGV4dF8wMDMsbWF4X3dpZHRoPTIwMCkpLmFkZF90byhwYWxhY2lvX25hY2lvbmFsX01YKQ0KDQoNCkZsb2F0SW1hZ2UoaW1nXzAwMSxsZWZ0PTkwLGJvdHRvbT05MCkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQoNCg0KIyMjIFNlIGFkaWNpb25vIGVsIHB1bnRvIEluaWNpYWwgZGVsIFBhbGFjaW9uIE5BY2lvbmFsIA0KZmwuTWFya2VyKGxvY2F0aW9uPVsxOS40MzI1MjM5NTcwNTA0NDYsIC05OS4xMzExNjgxMTM1NzEyMl0sDQogICAgICAgICAgaWNvbj1mbC5JY29uKGNvbG9yPSJwdXJwbGUiLGljb249ImJ1aWxkaW5nIiwgcHJlZml4PSdmYScpLHBvcHVwPWZsLlBvcHVwKCI8Yj5QYWxhY2lvbiBOYWNpb25hbDwvYj4iLG1heF93aWR0aD0yNTApKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCg0KZmwuQ2lyY2xlKGxvY2F0aW9uPVsxOS40MzI1MjM5NTcwNTA0NDYsIC05OS4xMzExNjgxMTM1NzEyMl0sDQogICAgICAgICAgY29sb3I9ImdyZWVuIixmaWxsX2NvbG9yPSJyZWQiLHdlaWdodD00LHJhaWR1cz0zMCxmaWxsX29wYWNpdHk9MC40LHRvb2x0aXA9IlNlZGUgZGUgR29iaWVybm8iKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbF9NWCkNCiAgICAgICAgICANCg0KDQpwYWxhY2lvX25hY2lvbmFsX01YDQoNCg0KYGBgDQoNCjxicj4NCjxicj4NCg0KIyMgTcO6bHRpcGxlcyBNYXJjYWRvcmVzIElJIC0gRGF0YSBGcmFtZQ0KDQpgYGB7cHl0aG9uLHJlc3VsdHM9J2hpZGUnLGNvbGxhcHNlPVRSVUV9DQoNCiMgUGFsYWNpbyBkZSBHb2JpZXJubyBkZSBDaXVkYWQgZGUgTWV4aWNvIChDRE1YKTogMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjINCg0KcGFsYWNpb19uYWNpb25hbF9NWCA9IGZsLk1hcChsb2NhdGlvbj1bMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjJdLHpvb21fc3RhcnQ9MTYpDQoNCg0KaW1nXzAwMSA9ICJodHRwczovL3d3dy5weXRob24ub3JnL3N0YXRpYy9jb21tdW5pdHlfbG9nb3MvcHl0aG9uLXBvd2VyZWQtdy03MHgyOC5wbmciDQoNCmNlbnRyb19kYXRhZnJhbWUgPSBwZC5EYXRhRnJhbWUoeydsdWdhcic6Wyc8Yj5DYXRlZHJhbCBNZXRyb3BvbGl0YW5hIGRlIGxhIENpdWRhZCBkZSBNw6l4aWNvPGI+JywnPGI+VGVtcGxvIE1heW88Yj5yJywnPGI+UGxhemEgZGUgbGEgQ29uc3RpdHVjaW9uIC0gWsOzY2FsbzxiPiddLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGF0aXR1ZCc6WzE5LjQzNDI3NDU2ODIxNzM1OCwxOS40MzQ3NTA2Mjc4MjE1OSwxOS40MzI2NTAzNTQzNTg2NTddLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9uZ2l0dWQnOlstOTkuMTMzMjA4NDM4MDM1NDIsLTk5LjEzMTkwOTI2MDY5NDMsLTk5LjEzMzE4NjE2NjQyMzg3XSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpbWJvbG8nOlsnb2stc2lnbicsJ29rLXNpZ24nLCdvay1zaWduJ10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcic6WydkYXJrLWJsdWUnLCdvcmFuZ2UnLCdibHVlJ119KQ0KDQpmb3IgaSBpbiBjZW50cm9fZGF0YWZyYW1lLml0ZXJ0dXBsZXMoKToNCiAgICBmbC5NYXJrZXIobG9jYXRpb249W2kubGF0aXR1ZCxpLmxvbmdpdHVkXSwNCiAgICAgICAgICAgICAgaWNvbj1mbC5JY29uKGNvbG9yPWkuY29sb3IsaWNvbj1pLnNpbWJvbG8pLHBvcHVwPWZsLlBvcHVwKGkubHVnYXIsbWF4X3dpZHRoPTIwMCkpLmFkZF90byhwYWxhY2lvX25hY2lvbmFsX01YKQ0KDQpGbG9hdEltYWdlKGltZ18wMDEsbGVmdD05MCxib3R0b209OTApLmFkZF90byhwYWxhY2lvX25hY2lvbmFsX01YKQ0KDQoNCiMjIyBTZSBhZGljaW9ubyBlbCBwdW50byBJbmljaWFsIGRlbCBQYWxhY2lvbiBOQWNpb25hbCANCmZsLk1hcmtlcihsb2NhdGlvbj1bMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjJdLA0KICAgICAgICAgIGljb249ZmwuSWNvbihjb2xvcj0icHVycGxlIixpY29uPSJidWlsZGluZyIsIHByZWZpeD0nZmEnKSxwb3B1cD1mbC5Qb3B1cCgiPGI+UGFsYWNpb24gTmFjaW9uYWw8L2I+IixtYXhfd2lkdGg9MjUwKSkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQoNCmZsLkNpcmNsZShsb2NhdGlvbj1bMTkuNDMyNTIzOTU3MDUwNDQ2LCAtOTkuMTMxMTY4MTEzNTcxMjJdLA0KICAgICAgICAgIGNvbG9yPSJncmVlbiIsZmlsbF9jb2xvcj0icmVkIix3ZWlnaHQ9NCxyYWlkdXM9MzAsZmlsbF9vcGFjaXR5PTAuNCx0b29sdGlwPSJTZWRlIGRlIEdvYmllcm5vIikuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWxfTVgpDQogICAgICAgICAgDQpwYWxhY2lvX25hY2lvbmFsX01YDQoNCg0KYGBgDQoNCg0KPGJyPg0KPGJyPg0KDQojIyBNw7psdGlwbGVzIE1hcmNhZG9yZXMgSUlJIC0gRGF0YSBGcmFtZSBmcm9tIEZpbGUNCg0KYGBge3B5dGhvbixyZXN1bHRzPSdoaWRlJyxjb2xsYXBzZT1UUlVFfQ0KDQojIFBhbGFjaW8gZGUgR29iaWVybm8gZGUgQ2l1ZGFkIGRlIE1leGljbyAoQ0RNWCk6IDE5LjQzMjUyMzk1NzA1MDQ0NiwgLTk5LjEzMTE2ODExMzU3MTIyDQoNCmNlbnRyb19DRE1YID0gZmwuTWFwKGxvY2F0aW9uPVsxOS40MzI1MjM5NTcwNTA0NDYsIC05OS4xMzExNjgxMTM1NzEyMl0sem9vbV9zdGFydD0xNikNCg0KDQppbWdfMDAxID0gImh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvc3RhdGljL2NvbW11bml0eV9sb2dvcy9weXRob24tcG93ZXJlZC13LTcweDI4LnBuZyINCg0KDQpGbG9hdEltYWdlKGltZ18wMDEsbGVmdD05MCxib3R0b209OTApLmFkZF90byhjZW50cm9fQ0RNWCkNCg0KcHVudG9zID0gcGQucmVhZF9jc3YoInB1bnRvc19jZW50cm9fQ0RNWC50eHQiKQ0KDQpwdW50b3MNCg0KcHVudG9zX2ZyYW1lID0gcGQuRGF0YUZyYW1lKHB1bnRvcykNCg0KZm9yIGkgaW4gcHVudG9zX2ZyYW1lLml0ZXJ0dXBsZXMoKToNCiAgICBmbC5NYXJrZXIobG9jYXRpb249W2kubGF0aXR1ZCxpLmxvbmdpdHVkXSwNCiAgICAgICAgICAgICAgaWNvbj1mbC5JY29uKGNvbG9yPWkuY29sb3IsaWNvbj1pLnNpbWJvbG8pLHBvcHVwPWZsLlBvcHVwKGkubHVnYXIsbWF4X3dpZHRoPTIwMCkpLmFkZF90byhjZW50cm9fQ0RNWCkNCg0KDQojIyMgU2UgYWRpY2lvbm8gZWwgcHVudG8gSW5pY2lhbCBkZWwgUGFsYWNpb24gTkFjaW9uYWwgDQpmbC5NYXJrZXIobG9jYXRpb249WzE5LjQzMjUyMzk1NzA1MDQ0NiwgLTk5LjEzMTE2ODExMzU3MTIyXSwNCiAgICAgICAgICBpY29uPWZsLkljb24oY29sb3I9InB1cnBsZSIsaWNvbj0iYnVpbGRpbmciLCBwcmVmaXg9J2ZhJykscG9wdXA9ZmwuUG9wdXAoIjxiPlBhbGFjaW9uIE5hY2lvbmFsPC9iPiIsbWF4X3dpZHRoPTI1MCkpLmFkZF90byhjZW50cm9fQ0RNWCkNCg0KDQpmbC5DaXJjbGUobG9jYXRpb249WzE5LjQzMjUyMzk1NzA1MDQ0NiwgLTk5LjEzMTE2ODExMzU3MTIyXSwNCiAgICAgICAgICBjb2xvcj0iZ3JlZW4iLGZpbGxfY29sb3I9InJlZCIsd2VpZ2h0PTQscmFpZHVzPTMwLGZpbGxfb3BhY2l0eT0wLjQsdG9vbHRpcD0iU2VkZSBkZSBHb2JpZXJubyIpLmFkZF90byhjZW50cm9fQ0RNWCkNCiAgICAgICAgICANCmNlbnRyb19DRE1YDQoNCg0KDQpgYGANCg0KPGJyPg0KPGJyPg0KDQo8ZGl2IGNsYXNzPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIGRhdGEtdW5pcXVlPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIHN0eWxlPSJoZWlnaHQ6IDA7Ij48L2Rpdj4NCg0KDQo=