MOBIS-COVID19/02
Neuigkeiten
- April:
- Frühere Wochen wurden gruppiert und in bestimmten Diagrammen grau eingefärbt.
- Analyse des Reisezwecks nach Flächennutzung.
Einführung
Am 16. März 2020 wurden 3700 Teilnehmer, die die MOBIS-Studie zwischen September 2019 und Januar 2020 abgeschlossen hatten, eingeladen, die von MotionTag entwickelte GPS-Logger- und Reisetagebuch-App ‘Catch-My-Day’ erneut zu installieren, um ihr Mobilitätsverhalten während der Zeit der Massnahmen zur Kontrolle der Ausbreitung des Coronavirus aufzuzeichnen. Die ersten 4 Wochen der Mobilitätsdaten aus der originalen MOBIS-Studie werden für jeden Teilnehmer als Vergleichsgrundlage für die aktuellen Mobilitätsverhalten herangezogen. Diese 4 Wochen beginnen je nach Teilnehmer irgendwo zwischen dem 1. September und dem 15. November. Derzeit werden nur Fahrten in der Schweiz berücksichtigt, obwohl Daten über grenzüberquerende Fahrten verfügbar sind.
Die folgende Abbildung zeigt die Anzahl der registrierten und verfolgten Teilnehmer pro Tag. Ein laufendes Panel von etwa 250 Teilnehmern war bereits im Tracking, bevor die Stichprobe erneut eingeladen wurde. Dies ermöglicht Ergebnisse für die Wochen vor dem offiziellen Start der MOBIS:COVID-19-Studie, obwohl die Stichprobengrösse und damit die Ergebnisse wesentlich kleiner sind.
Die Tageswerte werden gegebenenfalls um die Anzahl der Tracking-Teilnehmer pro Tag normalisiert. Die Analyse wird in den kommenden Wochen erweitert, um auch Teilnehmer aufzunehmen, die keine GPS-Aktivität aufzeichnen, aber an der Studie teilnehmen - dies wird notwendig sein, wenn eine totale Sperrung durchgeführt wird.
Das verwendete GPS-Reisetagebuch, Catch-My-Day (für iOS und Android) kann eine Verzögerung von 2-3 Tagen haben, bevor die Tracks für die Analyse zur Verfügung stehen. Die Skalierung durch aktive Teilnehmer kommt dem entgegen, aber die Ergebnisse früherer Berichte können sich bei der Aktualisierung des Berichts ändern.
Beteiligung

Abweichungen in den Verteilungen
Die folgenden Abbildungen zeigen die Kennwerte der Stichprobe MOBIS:COVID-19 im Vergleich zur originalen MOBIS-Stichprobe. Es gibt einige kleine Unterschiede, aber im Allgemeinen sind die Stichproben konsistent. Dieses Abbildung wird zum Vergleich mit den relevanten Zensusdaten erweitert.










Durchschnittliche Tagesdistanz

Veränderung der gefahrenen Kilometer nach Verkehrsmittel

Veränderung der gefahrenen Kilometer nach:








Reduktion der gefahrenen Kilometer nach Kanton
Veränderung der gefahrenen Kilometer nach Heimatkanton (%)
Kanton
|
N
|
Mär-02
|
Mär-09
|
Mär-16
|
Mär-23
|
Mär-30
|
Apr-06
|
Aargau
|
64
|
-25
|
-41
|
-71
|
-58
|
-51
|
-51
|
Basel-Landschaft
|
148
|
-13
|
-8
|
-60
|
-60
|
-58
|
-55
|
Basel-Stadt
|
28
|
-14
|
-36
|
-71
|
-74
|
-66
|
-54
|
Bern
|
157
|
-30
|
-33
|
-66
|
-59
|
-56
|
-51
|
Genf
|
104
|
7
|
-45
|
-69
|
-60
|
-56
|
-61
|
Schwyz
|
13
|
-6
|
12
|
-42
|
-67
|
-45
|
-49
|
Solothurn
|
16
|
-13
|
-41
|
-62
|
-65
|
-53
|
-44
|
Waadt
|
239
|
-7
|
-22
|
-64
|
-70
|
-67
|
-63
|
Zürich
|
552
|
-16
|
-25
|
-60
|
-58
|
-56
|
-49
|
Aktivitätsraum und Tägesradius
Eine häufig verwendete Definition des Aktivitätsraums ist die 95%-Vertrauensellipse der Aktivitätsorte, in diesem Fall gewichtet nach Dauer. In der folgenden Analyse werden die Aktivitäten am Heimatort einbezogen, für diejenigen, bei denen die App an diesem Tag aktiviert war. Dies ist eine wichtige Metrik, die eine Vorstellung von dem Gebiet vermittelt, in dem die Reise durchgeführt wird. Der tägliche Reiseradius wird ebenfalls dargestellt.

Veränderung der Aktivitätsfläche (%)
Woche
|
Wochentag
|
# Activitäten/Tag
|
Veränderung
|
Fläche (km2)
|
Veränderung
|
Tagesradius (km)
|
Veränderung
|
Baseline-2019
|
week
|
7.00
|
0%
|
194.02
|
0%
|
12.79
|
0%
|
weekend
|
6.18
|
0%
|
262.94
|
0%
|
13.83
|
0%
|
Feb-24
|
weekend
|
1.00
|
-84%
|
|
NaN%
|
0.00
|
-100%
|
Mär-02
|
week
|
6.12
|
-13%
|
174.48
|
-10%
|
10.92
|
-15%
|
weekend
|
5.65
|
-9%
|
181.93
|
-31%
|
11.30
|
-18%
|
Mär-09
|
week
|
6.37
|
-9%
|
120.27
|
-38%
|
10.25
|
-20%
|
weekend
|
5.47
|
-12%
|
91.58
|
-65%
|
8.80
|
-36%
|
Mär-16
|
week
|
4.81
|
-31%
|
35.86
|
-82%
|
5.69
|
-56%
|
weekend
|
3.56
|
-42%
|
27.79
|
-89%
|
3.71
|
-73%
|
Mär-23
|
week
|
4.38
|
-37%
|
37.86
|
-80%
|
4.92
|
-62%
|
weekend
|
3.94
|
-36%
|
57.94
|
-78%
|
4.99
|
-64%
|
Mär-30
|
week
|
4.77
|
-32%
|
47.12
|
-76%
|
5.37
|
-58%
|
weekend
|
4.34
|
-30%
|
31.16
|
-88%
|
5.19
|
-62%
|
Apr-06
|
week
|
4.83
|
-31%
|
50.43
|
-74%
|
5.75
|
-55%
|
weekend
|
4.08
|
-34%
|
72.26
|
-73%
|
4.88
|
-65%
|
Stundenzahlen
Die Anzahl der begonnenen Fahrten pro Stunde. Die y-Achse wird durch den maximalen Stundenwert in der Grafik normalisiert.






LS0tCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDoKICAgIGNzczogc3R5bGUuY3NzCiAgICBkZl9wcmludDogcGFnZWQKICAgIGxpYl9kaXI6IHJlcG9ydHMvbGlicwogICAgc2VsZl9jb250YWluZWQ6IG5vCiAgcGRmX2RvY3VtZW50OgogICAga2VlcF90ZXg6IHllcwogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKcGFnZXRpdGxlOiBNT0JJUyBDb3ZpZDE5IE1vYmlsaXR5IFJlcG9ydApwYXJhbXM6CiAgbGFuZ3VhZ2U6IEVOCi0tLQoKYGBge3IsIHNldHVwLCBpbmNsdWRlPUZ9CiAga25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGU9RikKYGBgCgoKYGBge3IsIGxvYWRfcGFja2FnZXMsIGVjaG89Riwgd2FybmluZz1GfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkob3NtZGF0YSkKI2xpYnJhcnkoZ2dtYXApCiNsaWJyYXJ5KHNmKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKcmVxdWlyZShzY2FsZXMpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoem9vKQpsaWJyYXJ5KGZvcmNhdHMpCgpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRSwgY2FjaGU9Rn0KaHRtbHRvb2xzOjppbmNsdWRlSFRNTCgiY292aWRfaGVhZGVyLmh0bWwiKQpgYGAKCgpgYGB7ciwgbG9hZF9kYXRhLCBlY2hvPUYsIHJlc3VsdHM9J2hpZGUnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsb2FkKCdvdXRwdXRfdmFyaWFibGVzLlJEYXRhJykKCiNsb2FkIHRyYW5zbGF0aW9ucwpsaWJyYXJ5KHNoaW55LmkxOG4pCmkxOG4gPC0gVHJhbnNsYXRvciRuZXcodHJhbnNsYXRpb25fanNvbl9wYXRoID0gInRyYW5zbGF0aW9ucy5qc29uIikKCmxhbmdfbG93ZXIgPC0gc3RyaW5ncjo6c3RyX3RvX2xvd2VyKHBhcmFtcyRsYW5ndWFnZSkKbG9jYWxlMSA9IGlmZWxzZShsYW5nX2xvd2VyID09ICdlbicsICdlbl9BVS5VVEYtOCcsIHBhc3RlMChsYW5nX2xvd2VyLCAnX0NILlVURi04JykpCgppMThuJHNldF90cmFuc2xhdGlvbl9sYW5ndWFnZShsYW5nX2xvd2VyKQpTeXMuc2V0bG9jYWxlKCdMQ19USU1FJywgbG9jYWxlMSkKI2RlZmF1bHQgbG9jYWw6IGVuX0FVLlVURi04CgpgYGAKCiMgTU9CSVMtQ09WSUQxOS8wMgojIyBgciBwYXN0ZShpMThuJHQoJ3Jlc3VsdHNfYXNfb2YnKSwgZm9ybWF0KHRvZGF5KCksIGZvcm1hdD0iJWQvJW0vJVkiKSlgCgpgciBpMThuJHQoInByb2plY3RfcGFydG5lcnMiKWAKCmByIGkxOG4kdCgiY29udGFjdF9wZXJzb24iKWAKCmByIGkxOG4kdCgibGlua190b19ob21lcGFnZSIpYAoKCioqKioqKgoKYHIgaTE4biR0KCduZXdzJylgCgpgciBpMThuJHQoJ2ludHJvX2hlYWRlcicpYAoKYHIgaTE4biR0KCdpbnRyb190ZXh0JylgIAoKYHIgaTE4biR0KCdwYXJ0aWNpcGF0aW9uJylgCgoKYGBge3IgcmVnaXN0cmF0aW9ucywgZWNobz1GfQoKZ2dwbG90KHBhcnRpY2lwYW50c19wZXJfZGF5ICU+JSBmaWx0ZXIoZGF5ID49IHltZCgnMjAyMC0wMy0wMScpICYgZGF5IDw9IHRvZGF5KCktMSksIGFlcyh4PWRheSkpICsgCiAgZ2VvbV9saW5lKGFlcyh5PW51bV9wYXJ0aWNpcGFudHMsIGNvbG9yPWkxOG4kdCgnVHJhY2tpbmcnKSkpICsKICBnZW9tX2xpbmUoYWVzKHk9bnVtX3JlZ2lzdGVyZWQsIGNvbG9yPWkxOG4kdCgnUmVnaXN0ZXJlZCcpKSkgKwogIHhsYWIoaTE4biR0KCdEYXRlJykpICsgCiAgeWxhYihpMThuJHQoJ1BhcnRpY2lwYW50IENvdW50JykpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iRGFyazIiLCBuYW1lPU5VTEwsIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcz0nMiBkYXlzJywgZGF0ZV9sYWJlbHM9ICclYi0lZCcpICsKICBsYWJzKHRpdGxlPSBpMThuJHQoIk1PQklTOkNvdmlkIHJlZ2lzdHJhdGlvbnMiKSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQoKCgpgYGAKCmBgYHtyLCBsb2FkX3NjYWxlX2Z1bmN0aW9uc30KIyMjIyMjIyBGdW5jdGlvbnMgZm9yIGxhYmVsbGluZyBmYWNldCBncmFwaHMKcmVvcmRlcl93aXRoaW4gPC0gZnVuY3Rpb24oeCwgYnksIHdpdGhpbiwgZnVuID0gbWVhbiwgc2VwID0gIl9fXyIsIC4uLikgewogIG5ld194IDwtIHBhc3RlKHgsIHdpdGhpbiwgc2VwID0gc2VwKQogIHN0YXRzOjpyZW9yZGVyKG5ld194LCBieSwgRlVOID0gZnVuKQp9CgpzY2FsZV94X3Jlb3JkZXJlZCA8LSBmdW5jdGlvbiguLi4sIHNlcCA9ICJfX18iKSB7CiAgcmVnIDwtIHBhc3RlMChzZXAsICIuKyQiKQogIGdncGxvdDI6OnNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgZ3N1YihyZWcsICIiLCB4KSwgLi4uKQp9CgpzY2FsZV95X3Jlb3JkZXJlZCA8LSBmdW5jdGlvbiguLi4sIHNlcCA9ICJfX18iKSB7CiAgcmVnIDwtIHBhc3RlMChzZXAsICIuKyQiKQogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgZ3N1YihyZWcsICIiLCB4KSwgLi4uKQp9CgpsYWJlbF93ZWVrIDwtIGZ1bmN0aW9uKHYpIHsKICBpZl9lbHNlKHllYXIodikgPCAyMDIwLCBpMThuJHQoJ0Jhc2VsaW5lLTIwMTknKSwgZm9ybWF0KHYsICclYi0lZCcpKSAlPiUgc3RyaW5ncjo6c3RyX3RvX3RpdGxlKCkKfQoKYWRkX3dlZWtfbGFiZWwgPC0gZnVuY3Rpb24gKHgpIHsKICB3ZWVrX2xhYmVsIDwtIGxhYmVsX3dlZWsoeCR3ZWVrX3N0YXJ0KQogIHdlZWtfbGFiZWwgPC0gZmN0X3Jlb3JkZXIod2Vla19sYWJlbCwgeCR3ZWVrX3N0YXJ0KQogIHgkd2Vla19sYWJlbCA8LSB3ZWVrX2xhYmVsCiAgeAp9CgpgYGAKCi0tLS0tLQoKIyBgciBpMThuJHQoJ3RpdGxlX2Rpc3RyaWJ1dGlvbnNfc2VjdGlvbicpYAoKYHIgaTE4biR0KCdkaXN0cmlidXRpb25zX3RleHQnKWAKCmBgYCB7ciwgc2VfcGxvdHMsIGZpZy5ob2xkPSdob2xkJywgb3V0LndpZHRoPSIzMCUiIH0KCiN0cmFuc2xhdGUKc2VfaGlzdG9ncmFtX3ZhbHVlc190IDwtIHNlX2hpc3RvZ3JhbV92YWx1ZXMgJT4lIG11dGF0ZSh2YXJpYWJsZSA9IGkxOG4kdCh2YXJpYWJsZSksIHZhbHVlMiA9IHVubGlzdChsYXBwbHkodmFsdWUyLCBpMThuJHQpKSkKCmZvciAodiBpbiB1bmlxdWUoc2VfaGlzdG9ncmFtX3ZhbHVlc190JHZhcmlhYmxlKSkgewogICBwcmludCgKICAgICBnZ3Bsb3Qoc2VfaGlzdG9ncmFtX3ZhbHVlc190ICU+JSBmaWx0ZXIodmFyaWFibGU9PXYpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSByZW9yZGVyX3dpdGhpbih2YWx1ZTIsIHZhbHVlLCB2YXJpYWJsZSwgbWF4KSwgZmlsbCA9IHN0dWR5KSkgKyAKICAgICAgZ2VvbV9iYXIoYWVzKHkgPSBwYyksIHBvc2l0aW9uID0gJ2RvZGdlJywgc3RhdCA9ICJpZGVudGl0eSIgKSArIAogICAgICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICAgICAgbmFtZT1pMThuJHQoJ1BlcmNlbnQnKSwgCiAgICAgICAgbGFiZWxzPWZ1bmN0aW9uKHgpIHNwcmludGYoJyUuMGYlJScsIHgqMTAwKSAsIAogICAgICAgIGJyZWFrcz1zZXEoMCwgMSwgMC4xKQogICAgICApICsKICAgICAgc2NhbGVfeF9yZW9yZGVyZWQoKSArIAogICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKwogICAgICBsYWJzKHRpdGxlPXYsIHg9TlVMTCkgKwogICAgICBjb29yZF9mbGlwKCkgKyAKICAgICAgc2NhbGVfY29sb3JfYnJld2VyKAogICAgICAgIHBhbGV0dGU9IlNldDEiLCBuYW1lPWkxOG4kdCgnU3R1ZHknKSwgYWVzdGhldGljcyA9IGMoImNvbG91ciIsICJmaWxsIiksIGd1aWRlPWd1aWRlX2xlZ2VuZChyZXZlcnNlPVQpKSArCiAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MjApKQogICkKIH0KYGBgCgotLS0tLS0KCgojIGByIGkxOG4kdCgnQXZlcmFnZSBEYWlseSBEaXN0YW5jZScpYAoKYGBge3J9Cmdyb3VwaW5nX3Zhcj0nZ2VuZGVyJwoKZGFpbHlfYXZnX2Rpc3QgPC0gcGFydGljaXBhbnRfZGFpbHlfbW9kZV9zaGFyZXMgJT4lIAojICBmaWx0ZXIoYWN0aXZlPT0xKSAlPiUKICBmaWx0ZXIoZGF5ICE9IHRvZGF5KCkpICU+JQogIHJlbmFtZSAoZ3JvdXBpbmdfdmFyaWFibGU9Z3JvdXBpbmdfdmFyKSAlPiUKICBtdXRhdGUoZ3JvdXBpbmdfdmFyaWFibGUgPSBpMThuJHQoZ3JvdXBpbmdfdmFyaWFibGUpKSAlPiUKICBncm91cF9ieShkYXksIGdyb3VwaW5nX3ZhcmlhYmxlKSAlPiUKICBzdW1tYXJpemUoCiAgICBhdmdfZGFpbHlfZGlzdF9jYXIgPSBtZWFuKENhciksIAogICAgYXZnX2RhaWx5X2Rpc3RfdG90YWwgPSBtZWFuKFRvdGFsKQogICAgKSAlPiUKICBmaWx0ZXIoZGF5ID4gJzIwMjAtMDMtMDEnKSAlPiUKICByZW1vdmVfbWlzc2luZygpCgpwcmludCgKZ2dwbG90KGRhaWx5X2F2Z19kaXN0LCBhZXMoeD1kYXksIGNvbG9yPWdyb3VwaW5nX3ZhcmlhYmxlKSkgKwogIGdlb21fbGluZShhZXMoeT1hdmdfZGFpbHlfZGlzdF9jYXIvMTAwMCksIHNpemU9MC41KSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9aTE4biR0KCdBdmVyYWdlIGRhaWx5IGRpc3RhbmNlIChrbSknKSkgKwogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcz0nMiBkYXlzJywgZGF0ZV9sYWJlbHM9ICclYi0lZCcpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0nRGFyazInLCBuYW1lPXN0cmluZ3I6OnN0cl90b190aXRsZShncm91cGluZ192YXIpKSArCiAgbGFicyh4PWkxOG4kdCgnRGF0ZScpLCB0aXRsZT1pMThuJHQoJ0RhaWx5IGF2ZXJhZ2UgS20gdHJhdmVsbGVkIGJ5IGdlbmRlcicpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCikKCmBgYAoKLS0tLS0tCgoKIyBgciBpMThuJHQoJ092ZXJhbGwgY2hhbmdlIGluIGtpbG9tZXRlcnMgdHJhdmVsbGVkIGJ5IHRyYW5zcG9ydCBtb2RlJylgCgpgYGB7ciBtb2RlX2NvdW50c193ZWVrbHl9CgpkYWlseV9tb2RlX3NoYXJlcyA8LSBkYWlseV9tb2RlX3NoYXJlcyAlPiUKICBmaWx0ZXIoZGF5ICE9IHRvZGF5KCkpICU+JSAKICBhZGRfd2Vla19sYWJlbCgpIAoKCndlZWtseV9tb2RhbF9jb3VudHNfbG9uZyA8LSBkYWlseV9tb2RlX3NoYXJlcyAlPiUgCiAgZ3JvdXBfYnkod2Vla19sYWJlbCkgJT4lCiAgc2VsZWN0KC11c2VyX2lkLCAtd2Vla2RheSwgLWRheSwgLWFjdGl2ZSwgLXdlZWtfc3RhcnQpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbikpICU+JQogIG1lbHQodmFyaWFibGUubmFtZT0nTW9kZScsIHZhbHVlLm5hbWU9J0Rpc3QnKSAlPiUKICByZW5hbWUoV2Vlaz13ZWVrX2xhYmVsKSAlPiUKICBtdXRhdGUoTW9kZSA9IHVubGlzdChNYXAoZnVuY3Rpb24gKHgpIHhbMV0sIHN0cmluZ3I6OnN0cl9zcGxpdChNb2RlLCAnXycpKSkpICU+JQogIG11dGF0ZShNb2RlID0gaTE4biR0KE1vZGUpKQoKY29udHJvbF92YWx1ZXMgPC0gd2Vla2x5X21vZGFsX2NvdW50c19sb25nICU+JSBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChXZWVrLCAnMjAxOScpKSAlPiUgcmVuYW1lKGN0cmxfZGlzdCA9IERpc3QpICU+JSBzZWxlY3QoLVdlZWspCgp3ZWVrbHlfbW9kYWxfY291bnRzX2xvbmcgPC0gd2Vla2x5X21vZGFsX2NvdW50c19sb25nICU+JQogIGxlZnRfam9pbihjb250cm9sX3ZhbHVlcywgYnk9J01vZGUnKSAlPiUKICBtdXRhdGUocGNfY2hhbmdlPURpc3QvY3RybF9kaXN0LTEpCgpwcmludCgKICBnZ3Bsb3Qod2Vla2x5X21vZGFsX2NvdW50c19sb25nLCBhZXMoeD1XZWVrLCB5PXBjX2NoYW5nZSwgY29sb3I9TW9kZSwgZ3JvdXA9TW9kZSwgc2hhcGU9TW9kZSkpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApLCBjb2xvcj0nIzU1NTU1NScpICsgCiAgZ2VvbV9saW5lKHNpemU9MC41KSArCiAgZ2VvbV9wb2ludChzaXplPTMpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT1pMThuJHQoJyUgQ2hhbmdlIGluIGF2ZXJhZ2UgZGFpbHkgZGlzdGFuY2UnKSwgYnJlYWtzID1zZXEoLTEsNCwwLjIpLCBsYWJlbHMgPSBwZXJjZW50KSArCiAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lPWkxOG4kdCgnV2VlaycpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZT1pMThuJHQoJ01vZGUnKSkKKQogIApgYGAKCgoKIyMgYHIgaTE4biR0KCdOb3JtYWxpemVkIGFnYWluc3QgdGhlIGJhc2VsaW5lIHBlcmlvZCcpYAoKYGBge3IsIG1vZGVfc2hhcmVzX3NvY2lvX2Vjb25vbWljLCBlY2hvPUYsIHdhcm5pbmc9RiwgZmlnLmhvbGQ9J2hvbGQnLCBvdXQud2lkdGg9IjUwJSJ9CgpwcmV0dHlfdmFyaWFibGVfbmFtZXM9IGMoCiAgYWdlX2dyb3Vwcz0iQWdlIiwKICBlZHVjYXRpb249J0VkdWNhdGlvbicsCiAgZW1wbG95bWVudF8xPSdNYWluIGVtcGxveW1lbnQnLAogIGdlbmRlcj0nR2VuZGVyJywKICBob3VzZWhvbGRfc2l6ZSA9ICdISCBzaXplJywKICBpbmNvbWUgPSdJbmNvbWUnLAogIGlzX3N3aXNzPSdOYXRpb25hbGl0eScsCiAgbGFuZ3VhZ2U9J0xhbmd1YWdlJywKICBvd25fY2FyPSdBY2Nlc3MgdG8gY2FyJywKICBrYW50b25fbmFtZT0nS2FudG9uJwopCgpzZV92YXJpYWJsZXMgPSBjb3ZpZF9wYXJ0aWNpcGFudHNfbG9uZyAlPiUgCiAgcmVtb3ZlX21pc3NpbmcoKSAlPiUKICBtdXRhdGUodmFyaWFibGUxPXByZXR0eV92YXJpYWJsZV9uYW1lc1t2YXJpYWJsZV0pICU+JQogIG11dGF0ZSh2YXJpYWJsZTEgPSBpMThuJHQodmFyaWFibGUxKSwgdmFsdWUyID0gYXMuZmFjdG9yKHVubGlzdChsYXBwbHkodmFsdWUyLCBpMThuJHQpKSkpCgpzdGF0c19oaXN0b2dyYW1fdmFsdWVzIDwtIGRhaWx5X21vZGVfc2hhcmVzICU+JSAgIAogIHNlbGVjdCh1c2VyX2lkLCBXZWVrPXdlZWtfbGFiZWwsIFRvdGFsKSAlPiUKICBsZWZ0X2pvaW4oc2VfdmFyaWFibGVzLCBieT1jKCd1c2VyX2lkJz0ncGFydGljaXBhbnRfSUQnKSkgJT4lCiAgZ3JvdXBfYnkoV2VlaywgdmFyaWFibGUxLCB2YWx1ZSwgdmFsdWUyKSAgJT4lIAogIHN1bW1hcml6ZShhdmdfZGFpbHlfZGlzdCA9IG1lYW4oVG90YWwpLCBuX3BhcnRpY2lwYW50cz1uX2Rpc3RpbmN0KHVzZXJfaWQpKSAlPiUgCiAgcmVtb3ZlX21pc3NpbmcoKSAlPiUKICBhcnJhbmdlKHZhcmlhYmxlMSwgdmFsdWUpCgpjb250cm9sX3N0YXRzX2hpc3RvZ3JhbV92YWx1ZXMgPC0gc3RhdHNfaGlzdG9ncmFtX3ZhbHVlcyAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChXZWVrLCAnMjAxOScpKSAlPiUgCiAgcmVuYW1lKGN0cmxfZGlzdCA9IGF2Z19kYWlseV9kaXN0KSAlPiUgCiAgc2VsZWN0KC1XZWVrLCAtbl9wYXJ0aWNpcGFudHMpIAoKCgpyZWxhdGl2ZV9zdGF0c19oaXN0b2dyYW1fdmFsdWVzIDwtIHN0YXRzX2hpc3RvZ3JhbV92YWx1ZXMgJT4lIAogIGxlZnRfam9pbihjb250cm9sX3N0YXRzX2hpc3RvZ3JhbV92YWx1ZXMpICU+JSAKICBtdXRhdGUocGNfY2hhbmdlX2Rpc3Q9YXZnX2RhaWx5X2Rpc3QvY3RybF9kaXN0LTEpICU+JSAKICBzZWxlY3QoLWN0cmxfZGlzdCkKCnZhcmlhYmxlc190b19wbG90ID0gdW5pcXVlKChyZWxhdGl2ZV9zdGF0c19oaXN0b2dyYW1fdmFsdWVzICU+JSBmaWx0ZXIodmFyaWFibGUxICE9ICdLYW50b24nICYgdmFyaWFibGUxICE9ICdDYW50b24nKSkkdmFyaWFibGUxKQoKZm9yKHYgaW4gdmFyaWFibGVzX3RvX3Bsb3QpIHsKICB2YXJpYWJsZV9kZiA8LSByZWxhdGl2ZV9zdGF0c19oaXN0b2dyYW1fdmFsdWVzICU+JSAKICAgIGZpbHRlcih2YXJpYWJsZTEgPT12ICYgIXN0cmluZ3I6OnN0cl9kZXRlY3QoV2VlaywgJzIwMTknKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBtdXRhdGUodmFsdWUyID0gYXMuZmFjdG9yKGFzLmNoYXJhY3Rlcih2YWx1ZTIpKSkgJT4lCiAgICBhcnJhbmdlKHZhbHVlKSAlPiUKICAgIG11dGF0ZSh2YWx1ZV9mID0gZmN0X3Jlb3JkZXIodmFsdWUyLCBhcy5udW1lcmljKHZhbHVlKSkpCiAgCiAgcHJpbnQoZ2dwbG90KHZhcmlhYmxlX2RmLCBhZXMoeCA9IFdlZWssIHkgPSBwY19jaGFuZ2VfZGlzdCwgZmlsbCA9IHJlb3JkZXIodmFsdWVfZiwgdmFsdWUpKQogICAgICAgICApICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScsIHN0YXQgPSAiaWRlbnRpdHkiICkgKyAKICAgICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iRGFyazIiLCBuYW1lPXYsIGFlc3RoZXRpY3MgPSBjKCJjb2xvdXIiLCAiZmlsbCIpLCAKICAgICAgICAgICAgICAgICAgICAgZ3VpZGU9Z3VpZGVfbGVnZW5kKHJldmVyc2U9RikpICsKCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT1pMThuJHQoJyUgQ2hhbmdlIEttIFRyYXZlbGxlZCcpLCBsYWJlbHMgPSBzY2FsZXM6OmxhYmVsX3BlcmNlbnQoYWNjdXJhY3k9MSksIGJyZWFrcz1zZXEoLTEsIDAsIDAuMikpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTgpKSArCiAgICBsYWJzKHRpdGxlPXYsIHk9aTE4biR0KCclIENoYW5nZScpLCB4PWkxOG4kdCgnV2VlaycpKQogICAgCiAgKQp9CmBgYAoKLS0tLS0tCgojIGByIGkxOG4kdCgnUmVkdWN0aW9uIGluIGtpbG9tZXRlcnMgdHJhdmVsbGVkIGJ5IENhbnRvbicpYAoKYGBge3IsIGthbnRvbmFsX2Rpc3RhbmNlX3RhYmxlIH0KI0thbnRvbmFsIERpc3RhbmNlCgpsaWJyYXJ5KGthYmxlRXh0cmEpCgoKcGNfY2hhbmdlX2thbnRvbmFsX2Rpc3RhbmNlIDwtIHJlbGF0aXZlX3N0YXRzX2hpc3RvZ3JhbV92YWx1ZXMgJT4lIAogIGZpbHRlcih2YXJpYWJsZTEgPT0gJ0thbnRvbicgfCB2YXJpYWJsZTEgPT0gJ0NhbnRvbicpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHNlbGVjdChLYW50b249dmFsdWUyLCBXZWVrLCBwY19jaGFuZ2VfZGlzdCwgbl9wYXJ0aWNpcGFudHMpICU+JSAKICBncm91cF9ieShLYW50b24pICU+JSBtdXRhdGUoTj1sYXN0KG5fcGFydGljaXBhbnRzKSkgJT4lCiAgZGNhc3QoS2FudG9uICsgTiB+IFdlZWssIHZhbHVlLnZhcj1jKCdwY19jaGFuZ2VfZGlzdCcpKSAlPiUKICBzZWxlY3QoLWMoMykpICU+JQogIGZpbHRlcihOPjUpICU+JQogIG11dGF0ZV9hdCh2YXJzKGNvbnRhaW5zKCctJykpLCB+IGFzLmludGVnZXIoLioxMDApKQoKY29sbmFtZXMocGNfY2hhbmdlX2thbnRvbmFsX2Rpc3RhbmNlKSA8LSBNYXAoZnVuY3Rpb24oeCkgc3RyaW5ncjo6c3RyX3NwbGl0KHgsICdfJylbWzFdXVsxXSwgY29sbmFtZXMocGNfY2hhbmdlX2thbnRvbmFsX2Rpc3RhbmNlKSkKY29sbmFtZXMocGNfY2hhbmdlX2thbnRvbmFsX2Rpc3RhbmNlKVsxXSA8LSBpMThuJHQoY29sbmFtZXMocGNfY2hhbmdlX2thbnRvbmFsX2Rpc3RhbmNlKVsxXSkKb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICctJykKCmNyZWF0ZV9rYW50b25hbF90YWJsZSA8LSBmdW5jdGlvbiAoZGYsIGZtdCkgewogIHJldHVybiAoa25pdHI6OmthYmxlKGRmLCBmbXQsIAogICAgICAgICAgICAgICBkaWdpdHM9MCwgY2FwdGlvbiA9IGkxOG4kdCgnJSBDaGFuZ2UgaW4ga2lsb21ldGVycyB0cmF2ZWxsZWQgYnkgaG9tZSBjYW50b24nKSwKICAgICAgICAgICAgICAgYWxpZ24gPSBjKCdsJywgcmVwKCdyJywgbmNvbChwY19jaGFuZ2Vfa2FudG9uYWxfZGlzdGFuY2UpKSkKICAgICAgICAgICAgICAgKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYpICU+JQogICAgY29sdW1uX3NwZWMoYygxLDIpLCBib2xkPVQpICU+JQogICAgY29sbGFwc2Vfcm93cyhjb2x1bW5zID0gMToyLCBsYXRleF9obGluZT0nbWFqb3InKQogICkKfQoKdGFibGUwX3RleCA8LSBjcmVhdGVfa2FudG9uYWxfdGFibGUocGNfY2hhbmdlX2thbnRvbmFsX2Rpc3RhbmNlLCAnbGF0ZXgnKQpjYXQodGFibGUwX3RleCxmaWxlPXBhc3RlMCgicmVwb3J0cy90YWJsZXMvIiwgZm9ybWF0KHRvZGF5KCksIGZvcm1hdD0iJVlfJW1fJWQiKSwgIl9rYW50b25hbF9kaXN0YW5jZS50ZXgiKSxzZXA9IlxuIikKCnRhYmxlMF9odG1sIDwtIGNyZWF0ZV9rYW50b25hbF90YWJsZShwY19jaGFuZ2Vfa2FudG9uYWxfZGlzdGFuY2UsICdodG1sJykKdGFibGUwX2h0bWwKCmBgYAogCi0tLS0tLQoKIyBgciBpMThuJHQoJ0FjdGl2aXR5IHNwYWNlIGFuZCBkYWlseSB0cmF2ZWwgcmFkaXVzJylgCgpgciBpMThuJHQoJ2FjdGl2aXR5X3NwYWNlX3RleHQnKWAKCiAKYGBge3IsIGFjdGl2aXR5X3NwYWNlX3NldHVwLCBlY2hvPUYsIHdhcm5pbmc9Rn0KCgpwYWxldHRlMSA8LSBicmV3ZXJfcGFsKHBhbGV0dGU9J0RhcmsyJykoNykKd2Vla19jb2xvcnMgPC0gYyhwYWxldHRlMVsxXSwgJ2RhcmtncmV5JywgcGFsZXR0ZTFbM10sIHBhbGV0dGUxWzddLCBwYWxldHRlMVs2XSkKICAKCmRhaWx5X2FjdGl2aXR5X3NwYWNlcyRkYXRlX2ZpbHRlciA8LSBkYWlseV9hY3Rpdml0eV9zcGFjZXMkd2Vla19zdGFydCA8ICB5bWQoJzIwMjAtMDEtMDEnKSB8IGRhaWx5X2FjdGl2aXR5X3NwYWNlcyR3ZWVrX3N0YXJ0ID49ICB5bWQoJzIwMjAtMDMtMDInKQoKZGFpbHlfYWN0aXZpdHlfc3BhY2VzMSA8LSBkYWlseV9hY3Rpdml0eV9zcGFjZXMgJT4lIAogIGZpbHRlcihkYXRlX2ZpbHRlcikgJT4lCiAgYWRkX3dlZWtfbGFiZWwoKSAlPiUKICBhcnJhbmdlKHdlZWtfc3RhcnQpICU+JQogIGdyb3VwX2J5KHVzZXJfaWQsIHdlZWtfc3RhcnQsIHdlZWtfbGFiZWwsIHdlZWtkYXkpICU+JSAKICBzdW1tYXJpemUoZWxsaXBzZV9hcmVhMT1tZWFuKHRpZHlyOjpyZXBsYWNlX25hKGVsbGlwc2VfYXJlYSwgMCksIG5hLnJtPTApKSAlPiUgCiAgbXV0YXRlKHdlZWtkYXkgPSBzdHJpbmdyOjpzdHJfdG9fdGl0bGUod2Vla2RheSkpICU+JSAKICAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZSh3ZWVrX3JhbmsgPSB3ZWVrX3N0YXJ0ICU+JSBkZXNjKCkgJT4lIGRlbnNlX3JhbmsoKSkgJT4lIAogIG11dGF0ZSh3ZWVrX2dyb3VwID0gZmN0X3Jlb3JkZXIoY2FzZV93aGVuKAogICAgeWVhcih3ZWVrX3N0YXJ0KSA9PSAnMjAxOScgfiBhcy5jaGFyYWN0ZXIod2Vla19sYWJlbCksCiAgICB3ZWVrX3JhbmsgPD0gMyB+IGFzLmNoYXJhY3Rlcih3ZWVrX2xhYmVsKSwgCiAgICBUIH4gaTE4biR0KCdJbnRlcm1lZGlhdGUgd2Vla3MnKQogICksIHdlZWtfc3RhcnQpKQogIAoKd2Vla2x5X2Rpc3RfcGxvdCA8LSBnZ3Bsb3QoZGFpbHlfYWN0aXZpdHlfc3BhY2VzMSkgKwogIGdlb21fZGVuc2l0eShhZXMoeD1lbGxpcHNlX2FyZWExLCBjb2xvcj13ZWVrX2dyb3VwLCBmaWxsPXdlZWtfZ3JvdXAsIGdyb3VwPXdlZWtfbGFiZWwpLCBhbHBoYT0wLjA1KSArIAogIHNjYWxlX3hfY29udGludW91cyh0cmFucz1sb2cxMF90cmFucygpLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoMS8oMTAwMF40KSwgMS8oMTAwMF4yKSwgMS8oMTBeMiksIDEsIDEwMCwgMTAwMDApLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnMCcsICcxIG1eMicsICcxMDAgbV4yJywgJzEga21eMicsICcxMDAga21eMicsICcxMCwwMDAga21eMicpCiAgKSArCiAgbGFicyh0aXRsZT1pMThuJHQoJ0Rpc3RyaWJ1dGlvbiBvZiBhdmVyYWdlIGRhaWx5IGFjdGl2aXR5IHNwYWNlcycpLAogICAgICAgeD1pMThuJHQoJ0FyZWEgKGxvZyB0cmFuc2Zvcm1lZCknKSwKICAgICAgIHk9aTE4biR0KCdEZW5zaXR5JyksCiAgICAgICBjYXB0aW9uPWkxOG4kdCgnQXZlcmFnZSBvZiB0aGUgZGFpbHkgOTUlIGNvbmRpZmRlbmNlIGVsbGlwc2VcbndlaWdodGVkIGJ5IHRoZSBhY3Rpdml0eV9kdXJhdGlvbicpCiAgKSArIAogIGZhY2V0X3dyYXAoLn53ZWVrZGF5KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSBpMThuJHQoIldlZWsiKSwgdmFsdWVzID0gd2Vla19jb2xvcnMsYWVzdGhldGljcyA9IGMoImNvbG91ciIsICJmaWxsIikgKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCgp3ZWVrbHlfZGlzdF9wbG90CgpgYGAKCgpgYGB7ciwgYWN0aXZpdHlfc3BhY2VzX3RhYmxlfQpkYWlseV9hY3Rpdml0eV9zcGFjZXNfdGFibGUgPC0gZGFpbHlfYWN0aXZpdHlfc3BhY2VzICU+JSBhc190aWJibGUoKSAlPiUKICBhZGRfd2Vla19sYWJlbCgpICU+JSAKICBncm91cF9ieSh3ZWVrX2xhYmVsLCB3ZWVrZGF5KSAlPiUKICBzZWxlY3QoLXVzZXJfaWQsIC13ZWVrX3N0YXJ0KSAlPiUKICBzdW1tYXJpemUoCiAgICBtZWFuX2FzcGFjZT1tZWFuKGVsbGlwc2VfYXJlYSwgbmEucm09VCksIAogICAgbWVhbl9tYXhfcmFkaXVzPW1lYW4obWF4X3JhZGl1cywgbmEucm09VCkvMTAwMCwgCiAgICBtZWFuX25fYWN0aXZpdGllcz1tZWFuKG5fYWN0aXZpdGllcyksIAogICAgbl9wYXJ0aWNpcGFudHM9bigpKSAlPiUKICBncm91cF9ieSh3ZWVrZGF5KSAlPiUKICBtdXRhdGUoCiAgICBwY19jaGFuZ2Vfc3BhY2UgPSBtZWFuX2FzcGFjZSAvIGZpcnN0KG1lYW5fYXNwYWNlKSAtIDEsICNub3JtYWxpemUgYnkgdGhlIGZpcnN0IHZhbHVlIGluIHRoYXQgZ3JvdXAgLSBzaG91bGQgd29yayBpZiB3ZWVrX3N0YXJ0IGlzIG9yZGVyZWQKICAgIHBjX2NoYW5nZV9yYWRpdXMgPSBtZWFuX21heF9yYWRpdXMgLyBmaXJzdChtZWFuX21heF9yYWRpdXMpIC0gMSwgI25vcm1hbGl6ZSBieSB0aGUgZmlyc3QgdmFsdWUgaW4gdGhhdCBncm91cCAtIHNob3VsZCB3b3JrIGlmIHdlZWtfc3RhcnQgaXMgb3JkZXJlZAogICAgcGNfY2hhbmdlX24gPSBtZWFuX25fYWN0aXZpdGllcyAvIGZpcnN0KG1lYW5fbl9hY3Rpdml0aWVzKSAtIDEKICApICU+JQogIG11dGF0ZSgKICAgIHBjX2NoYW5nZV9zcGFjZSA9IHNwcmludGYoJyUuMGYlJScsIHBjX2NoYW5nZV9zcGFjZSAqIDEwMCksCiAgICBwY19jaGFuZ2VfcmFkaXVzID0gc3ByaW50ZignJS4wZiUlJywgcGNfY2hhbmdlX3JhZGl1cyAqIDEwMCksCiAgICBwY19jaGFuZ2VfbiA9IHNwcmludGYoJyUuMGYlJScsIHBjX2NoYW5nZV9uICogMTAwKQogICklPiUgCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdCh3ZWVrX2xhYmVsLCB3ZWVrZGF5LCBtZWFuX25fYWN0aXZpdGllcywgcGNfY2hhbmdlX24sIG1lYW5fYXNwYWNlLCBwY19jaGFuZ2Vfc3BhY2UsIG1lYW5fbWF4X3JhZGl1cywgcGNfY2hhbmdlX3JhZGl1cykKCmRhaWx5X2FjdGl2aXR5X3NwYWNlc190YWJsZSRwY19jaGFuZ2VfbltkYWlseV9hY3Rpdml0eV9zcGFjZXNfdGFibGUkd2Vla19zdGFydCA9PSAnQ29udHJvbCddID0gJy0nCmRhaWx5X2FjdGl2aXR5X3NwYWNlc190YWJsZSRwY19jaGFuZ2Vfc3BhY2VbZGFpbHlfYWN0aXZpdHlfc3BhY2VzX3RhYmxlJHdlZWtfc3RhcnQgPT0gJ0NvbnRyb2wnXSA9ICctJwpkYWlseV9hY3Rpdml0eV9zcGFjZXNfdGFibGUkcGNfY2hhbmdlX3JhZGl1c1tkYWlseV9hY3Rpdml0eV9zcGFjZXNfdGFibGUkd2Vla19zdGFydCA9PSAnQ29udHJvbCddID0gJy0nCgpvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gJy0nKQoKY3JlYXRlX2Ffc3BhY2VzX3RhYmxlIDwtIGZ1bmN0aW9uIChkZiwgZm10KSB7CiAgcmV0dXJuIChrbml0cjo6a2FibGUoZGYsICBmbXQsIGJvb2t0YWJzID0gVCwKICAgICAgICAgICAgICAgZGlnaXRzPWMoMCwwLDIsMCwyLDAsMiwwKSwgY2FwdGlvbiA9IGkxOG4kdCgnJSBDaGFuZ2UgaW4gYWN0aXZpdHkgc3BhY2UgYXJlYScpLAogICAgICAgICAgICAgICBjb2wubmFtZXMgPSBsYXBwbHkoYygnV2VlaycsICdXZWVrZGF5JywgJyMgQWN0aXZpdGllcy9kYXknLCAnQ2hhbmdlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdBcmVhIChrbV4yXiknLCAnQ2hhbmdlJywgJ0RhaWx5IFJhZGl1cyAoa20pJywgJ0NoYW5nZScpLCBpMThuJHQpLAogICAgICAgICAgICAgICBhbGlnbiA9IGMoJ2wnLCAnbCcsIHJlcCgncicsIG5jb2woZGFpbHlfYWN0aXZpdHlfc3BhY2VzX3RhYmxlKSkpCiAgICApICU+JQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRikgJT4lCiAgICBjb2x1bW5fc3BlYygxLCBib2xkPVQpICU+JQogICAgY29sbGFwc2Vfcm93cyhjb2x1bW5zID0gMToxLCBsYXRleF9obGluZT0nbWFqb3InKQogICkKfQoKdGFibGUxX3RleCA8LSBjcmVhdGVfYV9zcGFjZXNfdGFibGUoZGFpbHlfYWN0aXZpdHlfc3BhY2VzX3RhYmxlLCAnbGF0ZXgnKQpjYXQodGFibGUxX3RleCxmaWxlPXBhc3RlMCgicmVwb3J0cy90YWJsZXMvIiwgZm9ybWF0KHRvZGF5KCksIGZvcm1hdD0iJVlfJW1fJWQiKSwgIl9hY3Rpdml0eV9zcGFjZXMudGV4Iiksc2VwPSJcbiIpCgp0YWJsZTFfaHRtbCA8LSBjcmVhdGVfYV9zcGFjZXNfdGFibGUoZGFpbHlfYWN0aXZpdHlfc3BhY2VzX3RhYmxlLCAnaHRtbCcpCgoKCnRhYmxlMV9odG1sCgpgYGAKCgpgYGB7ciwgaG91cmx5X2NvdW50c30KCnNjYWxlZF9ob3VybHlfY291bnRzIDwtIGRhaWx5X2hvdXJseV9jb3VudHMgJT4lIAogIGZpbHRlcih3ZWVrX3N0YXJ0IDwgeW1kKCcyMDIwLTAxLTAxJykgfCB3ZWVrX3N0YXJ0ID49IHltZCgnMjAyMC0wMy0wMicpKSAlPiUKICBhZGRfd2Vla19sYWJlbCgpICU+JSAKICBtdXRhdGUod2Vla19yYW5rID0gd2Vla19zdGFydCAlPiUgZGVzYygpICU+JSBkZW5zZV9yYW5rKCkpICU+JSAKICBtdXRhdGUod2Vla19ncm91cCA9IGZjdF9yZW9yZGVyKGNhc2Vfd2hlbigKICAgIHllYXIod2Vla19zdGFydCkgPT0gJzIwMTknIH4gYXMuY2hhcmFjdGVyKHdlZWtfbGFiZWwpLAogICAgd2Vla19yYW5rIDw9IDMgfiBhcy5jaGFyYWN0ZXIod2Vla19sYWJlbCksIAogICAgVCB+IGkxOG4kdCgnSW50ZXJtZWRpYXRlIHdlZWtzJykKICApLCB3ZWVrX3N0YXJ0KSkgJT4lCiAgbGVmdF9qb2luKHBhcnRpY2lwYW50c19wZXJfZGF5LCBieT1jKCdkYXkxJz0nZGF5JykpICU+JQogIG11dGF0ZShzY2FsZWRfbl90cmlwcyA9IG5fdHJpcHMvbnVtX3BhcnRpY2lwYW50cyAqIDEwMDApICU+JSAgI211bHRpcGx5IGJ5IHRoZSBwb3B1bGF0aW9uIG9mIHN3aXR6ZXJsYW5kCiAgbXV0YXRlKHJvbGxpbmdfc2NhbGVkX25fdHJpcHM9em9vOjpyb2xsbWVhbihzY2FsZWRfbl90cmlwcywzLGZpbGw9TkEsIGFsaWduID0gImNlbnRlciIpKSAlPiUKICBmaWx0ZXIoaG91cjEgPiA0KSAlPiUKICBncm91cF9ieSh3ZWVrX2xhYmVsLCB3ZWVrX3N0YXJ0LCB3ZWVrX2dyb3VwLCB3ZWVrZGF5LCBtb2RlLCBob3VyMSkgJT4lCiAgc3VtbWFyaXplKAogICAgc2NhbGVkX25fdHJpcHM9bWVhbihzY2FsZWRfbl90cmlwcywgbmEucm09VCksIAogICAgcm9sbGluZ19zY2FsZWRfbl90cmlwcz1tZWFuKHJvbGxpbmdfc2NhbGVkX25fdHJpcHMsIG5hLnJtPVQpKSAlPiUgCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KG1vZGUpICU+JQogIG11dGF0ZSgKICAgIG5fbWF4PW1heChzY2FsZWRfbl90cmlwcywgbmEucm09VCksCiAgICByb2xsaW5nX21heD1tYXgocm9sbGluZ19zY2FsZWRfbl90cmlwcywgbmEucm09VCkKICApIAoKdG90YWxfc2NhbGVkX2hvdXJseV9jb3VudHMgPC0gc2NhbGVkX2hvdXJseV9jb3VudHMgJT4lCiAgZ3JvdXBfYnkod2Vla19sYWJlbCwgd2Vla19zdGFydCwgd2Vla19ncm91cCwgd2Vla2RheSwgaG91cjEpICU+JQogIHN1bW1hcml6ZSgKICAgIHNjYWxlZF9uX3RyaXBzPXN1bShzY2FsZWRfbl90cmlwcyksCiAgICByb2xsaW5nX3NjYWxlZF9uX3RyaXBzPXN1bShyb2xsaW5nX3NjYWxlZF9uX3RyaXBzLCBuYS5ybT1UKQogICklPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKAogICAgbl9tYXg9bWF4KHNjYWxlZF9uX3RyaXBzLCBuYS5ybT1UKSwKICAgIHJvbGxpbmdfbWF4PW1heChyb2xsaW5nX3NjYWxlZF9uX3RyaXBzLCBuYS5ybT1UKQogICkgCgpgYGAKCi0tLS0tLQoKIyAgYHIgaTE4biR0KCdIb3VybHkgQ291bnRzJylgCmByIGkxOG4kdCgnaG91cmx5X2NvdW50c190ZXh0JylgCgpgYGB7ciwgaG91cmx5X2NvdW50c19wbG90fQoKcHJpbnQoZ2dwbG90KHRvdGFsX3NjYWxlZF9ob3VybHlfY291bnRzKSArCiAgZ2VvbV9saW5lKGFlcyh4PWhvdXIxLCB5PXNjYWxlZF9uX3RyaXBzL25fbWF4LCBjb2xvcj13ZWVrX2dyb3VwLCBncm91cD13ZWVrX2xhYmVsKSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lPWkxOG4kdCgnSG91cicpLCBicmVha3M9c2VxKDAsMjMsMiksIGxpbWl0cyA9IGMoNCwyNCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT1pMThuJHQoJ051bWJlciBvZiBzdGFydGVkIHRyaXBzIChyZWxhdGl2ZSB0byBtYXggdmFsdWUpJyksIGJyZWFrcz1zZXEoMCwxLDAuMikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9IGkxOG4kdCgiV2VlayIpLCB2YWx1ZXMgPSB3ZWVrX2NvbG9ycyApICsgCiAgZmFjZXRfd3JhcCgufndlZWtkYXkpICsKICBsYWJzKHRpdGxlPWkxOG4kdCgnSG91cmx5IHRyaXAgY291bnQgKFRvdGFsKScpLAogICAgICAgY2FwdGlvbj1pMThuJHQoJ05vcm1hbGl6ZWQgYnkgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyB0cmF2ZWxsaW5nIHBlciBkYXlcbkNvdW50cyBiZXR3ZWVuIG1pZG5pZ2h0IGFuZCA0YW0gZXhsY3VkZWQnKQogICkgCikKCmBgYAoKYGBge3IsIG1vZGVfaG91cmx5X2NvdW50c30KCmZvciAodF9tb2RlIGluIGMoJ0NhcicsICdXYWxrJywgJ1RyYWluJywgJ0JpY3ljbGUnLCAnTG9jYWwgUFQnKSkgewogIHByaW50KAogICAgZ2dwbG90KHNjYWxlZF9ob3VybHlfY291bnRzICU+JSBmaWx0ZXIobW9kZT09dF9tb2RlKSkgKwogICAgICBnZW9tX2xpbmUoYWVzKHg9aG91cjEsIHk9c2NhbGVkX25fdHJpcHMvbl9tYXgsIGNvbG9yPXdlZWtfZ3JvdXAsIGdyb3VwPXdlZWtfbGFiZWwpKSArCiAgICAgIHNjYWxlX3hfY29udGludW91cyhuYW1lPWkxOG4kdCgnSG91cicpLCBicmVha3M9c2VxKDAsMjQsMiksIGxpbWl0cyA9IGMoNCwyNCkpICsKICAgICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9aTE4biR0KCdOdW1iZXIgb2Ygc3RhcnRlZCB0cmlwcyAocmVsYXRpdmUgdG8gbWF4IHZhbHVlKScpKSArCiAgICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gaTE4biR0KCJXZWVrIiksIHZhbHVlcyA9IHdlZWtfY29sb3JzICkgKyAKICAgICAgZmFjZXRfd3JhcCgufndlZWtkYXkpICsKICAgICAgbGFicyh0aXRsZT1zcHJpbnRmKCclcyAoJXMpJywgaTE4biR0KCdIb3VybHkgdHJpcCBjb3VudCcpLCBpMThuJHQodF9tb2RlKSksCiAgICAgICAgICAgY2FwdGlvbj1pMThuJHQoJ05vcm1hbGl6ZWQgYnkgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyB0cmF2ZWxsaW5nIHBlciBkYXlcbkNvdW50cyBiZXR3ZWVuIG1pZG5pZ2h0IGFuZCA0YW0gZXhsY3VkZWQnKSkgCiAgKQp9CiAgCmBgYAoK