From e26cc36d7c6906cc4accbe38981ef36c89c10fe0 Mon Sep 17 00:00:00 2001 From: Flancian <0@flancia.org> Date: Fri, 7 May 2021 21:33:26 +0200 Subject: [PATCH 1/2] Wow, forgot to use 'git mv', previous changelists are [[cursed]]. Will still revert journals to [[iso 8601]] after this commit. --- 0-5-6.md => 0 5 6.md | 0 0oo-li.md => 0oo li.md | 0 1-rule.md => 1 rule.md | 0 10-happier.md => 10 happier.md | 0 ...-aegis-rim.md => 13 sentinels aegis rim.md | 0 17-40.md => 17 40.md | 0 ...pe-scare.md => 1989 chilean grape scare.md | 0 2020-04-03.md => 2020 04 03.md | 0 2020-04-05.md => 2020 04 05.md | 0 2020-04-06.md => 2020 04 06.md | 0 2020-04-07.md => 2020 04 07.md | 0 2020-04-09.md => 2020 04 09.md | 0 2020-04-10.md => 2020 04 10.md | 0 2020-04-11.md => 2020 04 11.md | 0 2020-04-12.md => 2020 04 12.md | 0 2020-04-13.md => 2020 04 13.md | 0 2020-04-17.md => 2020 04 17.md | 0 2020-04-18.md => 2020 04 18.md | 0 2020-04-19.md => 2020 04 19.md | 0 2020-04-22.md => 2020 04 22.md | 0 2020-04-23.md => 2020 04 23.md | 0 2020-04-24.md => 2020 04 24.md | 0 2020-04-25.md => 2020 04 25.md | 0 2020-04-26.md => 2020 04 26.md | 0 2020-04-27.md => 2020 04 27.md | 0 2020-05-01.md => 2020 05 01.md | 0 2020-05-02.md => 2020 05 02.md | 0 2020-05-03.md => 2020 05 03.md | 0 2020-05-04.md => 2020 05 04.md | 0 2020-05-05.md => 2020 05 05.md | 0 2020-05-06.md => 2020 05 06.md | 0 2020-05-07.md => 2020 05 07.md | 0 2020-05-08.md => 2020 05 08.md | 0 2020-05-09.md => 2020 05 09.md | 0 2020-05-10.md => 2020 05 10.md | 0 2020-05-15.md => 2020 05 15.md | 0 2020-05-16.md => 2020 05 16.md | 0 2020-05-17.md => 2020 05 17.md | 0 2020-05-18.md => 2020 05 18.md | 0 2020-05-19.md => 2020 05 19.md | 0 2020-05-20.md => 2020 05 20.md | 0 2020-05-21.md => 2020 05 21.md | 0 2020-05-22.md => 2020 05 22.md | 0 2020-05-23.md => 2020 05 23.md | 0 2020-05-24.md => 2020 05 24.md | 0 2020-06-01.md => 2020 06 01.md | 0 2020-06-02.md => 2020 06 02.md | 0 2020-06-03.md => 2020 06 03.md | 0 2020-06-04.md => 2020 06 04.md | 0 2020-06-06.md => 2020 06 06.md | 0 2020-06-07.md => 2020 06 07.md | 0 2020-06-08.md => 2020 06 08.md | 0 2020-06-09.md => 2020 06 09.md | 0 2020-06-10.md => 2020 06 10.md | 0 2020-06-11.md => 2020 06 11.md | 0 2020-06-12.md => 2020 06 12.md | 0 2020-06-13.md => 2020 06 13.md | 0 2020-06-14.md => 2020 06 14.md | 0 2020-06-15.md => 2020 06 15.md | 0 2020-06-16.md => 2020 06 16.md | 0 2020-06-17.md => 2020 06 17.md | 0 2020-06-18.md => 2020 06 18.md | 0 2020-06-19.md => 2020 06 19.md | 0 2020-06-20.md => 2020 06 20.md | 0 2020-06-21.md => 2020 06 21.md | 0 2020-06-24.md => 2020 06 24.md | 0 2020-06-27.md => 2020 06 27.md | 0 2020-06-28.md => 2020 06 28.md | 0 2020-06-29.md => 2020 06 29.md | 0 2020-07-04.md => 2020 07 04.md | 0 2020-07-05.md => 2020 07 05.md | 0 2020-07-06.md => 2020 07 06.md | 0 2020-07-07.md => 2020 07 07.md | 0 2020-07-08.md => 2020 07 08.md | 0 2020-07-09.md => 2020 07 09.md | 0 2020-07-10.md => 2020 07 10.md | 0 2020-07-11.md => 2020 07 11.md | 0 2020-07-12.md => 2020 07 12.md | 0 2020-07-14.md => 2020 07 14.md | 0 2020-07-15.md => 2020 07 15.md | 0 2020-07-16.md => 2020 07 16.md | 0 2020-07-17.md => 2020 07 17.md | 0 2020-07-18.md => 2020 07 18.md | 0 2020-07-19.md => 2020 07 19.md | 0 2020-07-20.md => 2020 07 20.md | 0 2020-07-21.md => 2020 07 21.md | 0 2020-07-22.md => 2020 07 22.md | 0 2020-07-23.md => 2020 07 23.md | 0 2020-07-24.md => 2020 07 24.md | 0 2020-07-25.md => 2020 07 25.md | 0 2020-07-26.md => 2020 07 26.md | 0 2020-07-27.md => 2020 07 27.md | 0 2020-07-29.md => 2020 07 29.md | 0 2020-07-30.md => 2020 07 30.md | 0 2020-07-31.md => 2020 07 31.md | 0 2020-08-01.md => 2020 08 01.md | 0 2020-08-02.md => 2020 08 02.md | 0 2020-08-03.md => 2020 08 03.md | 0 2020-08-04.md => 2020 08 04.md | 0 2020-08-05.md => 2020 08 05.md | 0 2020-08-06.md => 2020 08 06.md | 0 2020-08-07.md => 2020 08 07.md | 0 2020-08-08.md => 2020 08 08.md | 0 2020-08-09.md => 2020 08 09.md | 0 2020-08-10.md => 2020 08 10.md | 0 2020-08-11.md => 2020 08 11.md | 0 2020-08-12.md => 2020 08 12.md | 0 2020-08-13.md => 2020 08 13.md | 0 2020-08-14.md => 2020 08 14.md | 0 2020-08-15.md => 2020 08 15.md | 0 2020-08-16.md => 2020 08 16.md | 0 2020-08-17.md => 2020 08 17.md | 0 2020-08-18.md => 2020 08 18.md | 0 2020-08-19.md => 2020 08 19.md | 0 2020-08-20.md => 2020 08 20.md | 0 2020-08-21.md => 2020 08 21.md | 0 2020-08-22.md => 2020 08 22.md | 0 2020-08-23.md => 2020 08 23.md | 0 2020-08-24.md => 2020 08 24.md | 0 2020-08-25.md => 2020 08 25.md | 0 2020-08-26.md => 2020 08 26.md | 0 2020-08-27.md => 2020 08 27.md | 0 2020-08-28.md => 2020 08 28.md | 0 2020-08-29.md => 2020 08 29.md | 0 2020-08-30.md => 2020 08 30.md | 0 2020-08-31.md => 2020 08 31.md | 0 2020-09-01.md => 2020 09 01.md | 0 2020-09-02.md => 2020 09 02.md | 0 2020-09-03.md => 2020 09 03.md | 0 2020-09-04.md => 2020 09 04.md | 0 2020-09-05.md => 2020 09 05.md | 0 2020-09-06.md => 2020 09 06.md | 0 2020-09-07.md => 2020 09 07.md | 0 2020-09-08.md => 2020 09 08.md | 0 2020-09-09.md => 2020 09 09.md | 0 2020-09-10.md => 2020 09 10.md | 0 2020-09-11.md => 2020 09 11.md | 0 2020-09-12.md => 2020 09 12.md | 0 2020-09-13.md => 2020 09 13.md | 0 2020-09-14.md => 2020 09 14.md | 0 2020-09-15.md => 2020 09 15.md | 0 2020-09-16.md => 2020 09 16.md | 0 2020-09-17.md => 2020 09 17.md | 0 2020-09-18.md => 2020 09 18.md | 0 2020-09-19.md => 2020 09 19.md | 0 2020-09-20.md => 2020 09 20.md | 0 2020-09-21.md => 2020 09 21.md | 0 2020-09-22.md => 2020 09 22.md | 0 2020-09-23.md => 2020 09 23.md | 0 2020-09-24.md => 2020 09 24.md | 0 2020-09-25.md => 2020 09 25.md | 0 2020-09-26.md => 2020 09 26.md | 0 2020-09-27.md => 2020 09 27.md | 0 2020-09-28.md => 2020 09 28.md | 0 2020-09-29.md => 2020 09 29.md | 0 2020-09-30.md => 2020 09 30.md | 0 2020-10-01.md => 2020 10 01.md | 0 2020-10-02.md => 2020 10 02.md | 0 2020-10-03.md => 2020 10 03.md | 0 2020-10-04.md => 2020 10 04.md | 0 2020-10-05.md => 2020 10 05.md | 0 2020-10-06.md => 2020 10 06.md | 0 2020-10-07.md => 2020 10 07.md | 0 2020-10-08.md => 2020 10 08.md | 0 2020-10-09.md => 2020 10 09.md | 0 2020-10-10.md => 2020 10 10.md | 0 2020-10-11.md => 2020 10 11.md | 0 2020-10-12.md => 2020 10 12.md | 0 2020-10-13.md => 2020 10 13.md | 0 2020-10-14.md => 2020 10 14.md | 0 2020-10-15.md => 2020 10 15.md | 0 2020-10-16.md => 2020 10 16.md | 0 2020-10-17.md => 2020 10 17.md | 0 2020-10-18.md => 2020 10 18.md | 0 2020-10-19.md => 2020 10 19.md | 0 2020-10-20.md => 2020 10 20.md | 0 2020-10-21.md => 2020 10 21.md | 0 2020-10-22.md => 2020 10 22.md | 0 2020-10-23.md => 2020 10 23.md | 0 2020-10-24.md => 2020 10 24.md | 0 2020-10-25.md => 2020 10 25.md | 0 2020-10-26.md => 2020 10 26.md | 0 2020-10-27.md => 2020 10 27.md | 0 2020-10-28.md => 2020 10 28.md | 0 2020-10-29.md => 2020 10 29.md | 0 2020-10-30.md => 2020 10 30.md | 0 2020-10-31.md => 2020 10 31.md | 0 2020-11-01.md => 2020 11 01.md | 0 2020-11-02.md => 2020 11 02.md | 0 2020-11-03.md => 2020 11 03.md | 0 2020-11-04.md => 2020 11 04.md | 0 2020-11-05.md => 2020 11 05.md | 0 2020-11-06.md => 2020 11 06.md | 0 2020-11-07.md => 2020 11 07.md | 0 2020-11-08.md => 2020 11 08.md | 0 2020-11-09.md => 2020 11 09.md | 0 2020-11-10.md => 2020 11 10.md | 0 2020-11-11.md => 2020 11 11.md | 0 2020-11-12.md => 2020 11 12.md | 0 2020-11-13.md => 2020 11 13.md | 0 2020-11-14.md => 2020 11 14.md | 0 2020-11-15.md => 2020 11 15.md | 0 2020-11-16.md => 2020 11 16.md | 0 2020-11-17.md => 2020 11 17.md | 0 2020-11-18.md => 2020 11 18.md | 0 2020-11-19.md => 2020 11 19.md | 0 2020-11-20.md => 2020 11 20.md | 0 2020-11-21.md => 2020 11 21.md | 0 2020-11-22.md => 2020 11 22.md | 0 2020-11-23.md => 2020 11 23.md | 0 2020-11-24.md => 2020 11 24.md | 0 2020-11-25.md => 2020 11 25.md | 0 2020-11-26.md => 2020 11 26.md | 0 2020-11-27.md => 2020 11 27.md | 0 2020-11-28.md => 2020 11 28.md | 0 2020-11-29.md => 2020 11 29.md | 0 2020-11-30.md => 2020 11 30.md | 0 2020-12-01.md => 2020 12 01.md | 0 2020-12-02.md => 2020 12 02.md | 0 2020-12-03.md => 2020 12 03.md | 0 2020-12-04.md => 2020 12 04.md | 0 2020-12-05.md => 2020 12 05.md | 0 2020-12-06.md => 2020 12 06.md | 0 2020-12-07.md => 2020 12 07.md | 0 2020-12-08.md => 2020 12 08.md | 0 2020-12-09.md => 2020 12 09.md | 0 2020-12-10.md => 2020 12 10.md | 0 2020-12-11.md => 2020 12 11.md | 0 2020-12-12.md => 2020 12 12.md | 0 2020-12-13.md => 2020 12 13.md | 0 2020-12-14.md => 2020 12 14.md | 0 2020-12-15.md => 2020 12 15.md | 0 2020-12-16.md => 2020 12 16.md | 0 2020-12-17.md => 2020 12 17.md | 0 2020-12-18.md => 2020 12 18.md | 0 2020-12-19.md => 2020 12 19.md | 0 2020-12-20.md => 2020 12 20.md | 0 2020-12-21.md => 2020 12 21.md | 0 2020-12-22.md => 2020 12 22.md | 0 2020-12-23.md => 2020 12 23.md | 0 2020-12-24.md => 2020 12 24.md | 0 2020-12-25.md => 2020 12 25.md | 0 2020-12-26.md => 2020 12 26.md | 0 2020-12-27.md => 2020 12 27.md | 0 2020-12-28.md => 2020 12 28.md | 0 2020-12-29.md => 2020 12 29.md | 0 2020-12-30.md => 2020 12 30.md | 0 2020-12-31.md => 2020 12 31.md | 0 2021-01-01.md => 2021 01 01.md | 0 2021-01-02.md => 2021 01 02.md | 0 2021-01-03.md => 2021 01 03.md | 0 2021-01-04.md => 2021 01 04.md | 0 2021-01-05.md => 2021 01 05.md | 0 2021-01-06.md => 2021 01 06.md | 0 2021-01-07.md => 2021 01 07.md | 0 2021-01-08.md => 2021 01 08.md | 0 2021-01-09.md => 2021 01 09.md | 0 2021-01-10.md => 2021 01 10.md | 0 2021-01-11.md => 2021 01 11.md | 0 2021-01-12.md => 2021 01 12.md | 0 2021-01-13.md => 2021 01 13.md | 0 2021-01-14.md => 2021 01 14.md | 0 2021-01-15.md => 2021 01 15.md | 0 2021-01-16.md => 2021 01 16.md | 0 2021-01-17.md => 2021 01 17.md | 0 2021-01-18.md => 2021 01 18.md | 0 2021-01-19.md => 2021 01 19.md | 0 2021-01-20.md => 2021 01 20.md | 0 2021-01-21.md => 2021 01 21.md | 0 2021-01-22.md => 2021 01 22.md | 0 2021-01-23.md => 2021 01 23.md | 0 2021-01-24.md => 2021 01 24.md | 0 2021-01-25.md => 2021 01 25.md | 0 2021-01-26.md => 2021 01 26.md | 0 2021-01-27.md => 2021 01 27.md | 0 2021-01-28.md => 2021 01 28.md | 0 2021-01-29.md => 2021 01 29.md | 0 2021-01-30.md => 2021 01 30.md | 0 2021-01-31.md => 2021 01 31.md | 0 2021-02-01.md => 2021 02 01.md | 0 2021-02-02.md => 2021 02 02.md | 0 2021-02-03.md => 2021 02 03.md | 0 2021-02-04.md => 2021 02 04.md | 0 2021-02-05.md => 2021 02 05.md | 0 2021-02-06.md => 2021 02 06.md | 0 2021-02-07.md => 2021 02 07.md | 0 2021-02-08.md => 2021 02 08.md | 0 2021-02-09.md => 2021 02 09.md | 0 2021-02-10.md => 2021 02 10.md | 0 2021-02-11.md => 2021 02 11.md | 0 2021-02-12.md => 2021 02 12.md | 0 2021-02-13.md => 2021 02 13.md | 0 2021-02-14.md => 2021 02 14.md | 0 2021-02-15.md => 2021 02 15.md | 0 2021-02-16.md => 2021 02 16.md | 0 2021-02-17.md => 2021 02 17.md | 0 2021-02-18.md => 2021 02 18.md | 0 2021-02-19.md => 2021 02 19.md | 0 2021-02-20.md => 2021 02 20.md | 0 2021-02-21.md => 2021 02 21.md | 0 2021-02-22.md => 2021 02 22.md | 0 2021-02-23.md => 2021 02 23.md | 0 2021-02-24.md => 2021 02 24.md | 0 2021-02-25.md => 2021 02 25.md | 0 2021-02-26.md => 2021 02 26.md | 0 2021-02-27.md => 2021 02 27.md | 0 2021-02-28.md => 2021 02 28.md | 0 2021-03-01.md => 2021 03 01.md | 0 2021-03-02.md => 2021 03 02.md | 0 2021-03-03.md => 2021 03 03.md | 0 2021-03-04.md => 2021 03 04.md | 0 2021-03-05.md => 2021 03 05.md | 0 2021-03-06.md => 2021 03 06.md | 0 2021-03-07.md => 2021 03 07.md | 0 2021-03-08.md => 2021 03 08.md | 0 2021-03-09.md => 2021 03 09.md | 0 2021-03-10.md => 2021 03 10.md | 0 2021-03-11.md => 2021 03 11.md | 0 2021-03-12.md => 2021 03 12.md | 0 2021-03-13.md => 2021 03 13.md | 0 2021-03-14.md => 2021 03 14.md | 0 2021-03-15.md => 2021 03 15.md | 0 2021-03-16.md => 2021 03 16.md | 0 2021-03-17.md => 2021 03 17.md | 0 2021-03-18.md => 2021 03 18.md | 0 2021-03-19.md => 2021 03 19.md | 0 2021-03-20.md => 2021 03 20.md | 0 2021-03-21.md => 2021 03 21.md | 0 2021-03-22.md => 2021 03 22.md | 0 2021-03-23.md => 2021 03 23.md | 0 2021-03-24.md => 2021 03 24.md | 0 2021-03-25.md => 2021 03 25.md | 0 2021-03-26.md => 2021 03 26.md | 0 2021-03-27.md => 2021 03 27.md | 0 2021-03-28.md => 2021 03 28.md | 0 2021-03-29.md => 2021 03 29.md | 0 2021-03-30.md => 2021 03 30.md | 0 2021-03-31.md => 2021 03 31.md | 0 2021-04-01.md => 2021 04 01.md | 0 2021-04-02.md => 2021 04 02.md | 0 2021-04-03.md => 2021 04 03.md | 0 2021-04-05.md => 2021 04 05.md | 0 2021-04-06.md => 2021 04 06.md | 0 2021-04-07.md => 2021 04 07.md | 0 2021-04-08.md => 2021 04 08.md | 0 2021-04-09.md => 2021 04 09.md | 0 2021-04-10.md => 2021 04 10.md | 0 2021-04-11.md => 2021 04 11.md | 0 2021-04-12.md => 2021 04 12.md | 0 2021-04-13.md => 2021 04 13.md | 0 2021-04-14.md => 2021 04 14.md | 0 2021-04-15.md => 2021 04 15.md | 0 2021-04-16.md => 2021 04 16.md | 0 2021-04-17.md => 2021 04 17.md | 0 2021-04-18.md => 2021 04 18.md | 0 2021-04-19.md => 2021 04 19.md | 0 2021-04-20.md => 2021 04 20.md | 0 2021-04-21.md => 2021 04 21.md | 0 2021-04-22.md => 2021 04 22.md | 0 2021-04-23.md => 2021 04 23.md | 0 2021-04-24.md => 2021 04 24.md | 0 2021-04-25.md => 2021 04 25.md | 0 2021-04-27.md => 2021 04 27.md | 0 2021-04-28.md => 2021 04 28.md | 0 2021-04-29.md => 2021 04 29.md | 0 2021-04-30.md => 2021 04 30.md | 0 2021-05-01.md => 2021 05 01.md | 0 2021-05-02.md => 2021 05 02.md | 0 2021-05-03.md => 2021 05 03.md | 0 2021-05-04.md => 2021 05 04.md | 0 2021-05-05.md => 2021 05 05.md | 0 2021-05-06.md => 2021 05 06.md | 0 2021-05-07.md => 2021 05 07.md | 0 2021-eneri.md => 2021 eneri.md | 0 ...1 storming of the united states capitol.md | 0 ...inute-pomodoro.md => 50 minute pomodoro.md | 0 ...o-para-armar.md => 62 modelo para armar.md | 0 80-time.md => 80 time.md | 0 ...our-minds.md => a bicycle for our minds.md | 0 ...scourse.md => a cheatsheet on discourse.md | 0 ...borg-manifesto.md => a cyborg manifesto.md | 0 ...ation of the independence of cyberspace.md | 0 a-fika-monster.md => a fika monster.md | 0 a-fortiori.md => a fortiori.md | 0 ...ury-romance.md => a glastonbury romance.md | 0 ...md => a naive plan for a freer internet.md | 0 a-neither.md => a neither.md | 0 ...-of-science.md => a new kind of science.md | 0 ... taking problem and a proposed solution.md | 0 ...ttern-language.md => a pattern language.md | 0 a-typo.md => a typo.md | 0 ...iew of the agora at a node is a comonad.md | 0 a-yawning-cat.md => a yawning cat.md | 0 aaron-swartz.md => aaron swartz.md | 0 ...-the-state.md => abolition of the state.md | 0 aborto-legal.md => aborto legal.md | 0 abstract-fairy.md => abstract fairy.md | 0 aby-warburg.md => aby warburg.md | 0 ...an-legends.md => academic urban legends.md | 0 aceite-de-coco.md => aceite de coco.md | 0 acid-banger.md => acid banger.md | 0 act-well.md => act well.md | 0 active-recall.md => active recall.md | 0 acts-of-flancia.md => acts of flancia.md | 0 adam-fitchett.md => adam fitchett.md | 0 add-service.md => add service.md | 0 addheader-py.md => addheader py.md | 0 ...iphosphate.md => adenosine triphosphate.md | 0 adriene-mishler.md => adriene mishler.md | 0 ...lity.md => adversarial interoperability.md | 0 advisory-opinion.md => advisory opinion.md | 0 adán-buenosayres.md => adán buenosayres.md | 0 agnes-cameron.md => agnes cameron.md | 0 agnès-varda.md => agnès varda.md | 0 agora-0-5-1.md => agora 0 5 1.md | 0 agora-action.md => agora action.md | 0 agora-actions.md => agora actions.md | 0 agora-algorithm.md => agora algorithm.md | 0 agora-bot.md => agora bot.md | 0 agora-bridge.md => agora bridge.md | 0 agora-cli.md => agora cli.md | 0 agora-client.md => agora client.md | 0 agora-clients.md => agora clients.md | 0 agora-comments.md => agora comments.md | 0 agora convention.md | 12 ---------- agora-ctzn.md => agora ctzn.md | 0 agora-design.md => agora design.md | 0 agora-development.md => agora development.md | 0 agora-discuss.md => agora discuss.md | 0 agora-editor.md => agora editor.md | 0 agora-editors.md => agora editors.md | 0 agora-embed.md => agora embed.md | 0 agora-es.md => agora es.md | 0 agora-ext.md => agora ext.md | 0 ...e-requests.md => agora feature requests.md | 0 ...ation.md => agora fediverse integration.md | 0 agora-feeds.md => agora feeds.md | 0 agora-for-ea.md => agora for ea.md | 0 ...zzy-matching.md => agora fuzzy matching.md | 0 agora-fw.md => agora fw.md | 0 ...ration.md => agora go links integration.md | 0 agora-graph.md => agora graph.md | 0 agora-graphs.md => agora graphs.md | 0 agora-help.md => agora help.md | 0 agora-hn.md => agora hn.md | 0 agora-howto.md => agora howto.md | 0 agora-hub.md => agora hub.md | 0 ...tion.md => agora hypothesis integration.md | 0 agora-hypothesis.md => agora hypothesis.md | 0 agora-install.md => agora install.md | 0 agora-integration.md => agora integration.md | 0 agora-js.md => agora js.md | 0 agora-like.md => agora like.md | 0 agora-links.md => agora links.md | 0 ...ration.md => agora mastodon integration.md | 0 agora-music.md => agora music.md | 0 agora-pkmchat.md => agora pkmchat.md | 0 agora-plan.md => agora plan.md | 0 agora-polls.md => agora polls.md | 0 agora-promnesia.md => agora promnesia.md | 0 agora-protocol.md => agora protocol.md | 0 agora-publishing.md => agora publishing.md | 0 agora-push.md => agora push.md | 0 ...a-reading-club.md => agora reading club.md | 0 agora-recipes.md => agora recipes.md | 0 agora-repository.md => agora repository.md | 0 agora-rfc.md => agora rfc.md | 0 agora-rfcs.md => agora rfcs.md | 0 agora-seach.md => agora seach.md | 0 agora-search.md => agora search.md | 0 agora-server.md => agora server.md | 0 agora-settings.md => agora settings.md | 0 agora-setup.md => agora setup.md | 0 agora-slides.md => agora slides.md | 0 ...a-tree-example.md => agora tree example.md | 0 agora-trees.md => agora trees.md | 0 ...gration.md => agora twitter integration.md | 0 agora-v0-5.md => agora v0 5.md | 0 agora-v1.md => agora v1.md | 0 agora-version.md => agora version.md | 0 agora-vscode.md => agora vscode.md | 0 agora-wiki.md => agora wiki.md | 0 agora-yaml.md => agora yaml.md | 0 ...gration.md => agora youtube integration.md | 0 agora-convention.md | 2 -- ...-bohm-effect.md => aharonov bohm effect.md | 0 ai-dungeon.md => ai dungeon.md | 0 airto-moreira.md => airto moreira.md | 0 alan-laidlaw.md => alan laidlaw.md | 0 alan-watts.md => alan watts.md | 0 ...o-barabasi.md => albert laszlo barabasi.md | 0 albin-zollinger.md => albin zollinger.md | 0 alexander-huber.md => alexander huber.md | 0 algernon-argument.md => algernon argument.md | 0 ali-abdaal.md => ali abdaal.md | 0 ...about-circuits.md => all about circuits.md | 0 all-day.md => all day.md | 0 all-night.md => all night.md | 0 ...-wikilinks.md => all possible wikilinks.md | 0 all-together-now.md => all together now.md | 0 ...ows-parties.md => all tomorrows parties.md | 0 ...-of-the-cave.md => allegory of the cave.md | 0 alvin-zollinger.md => alvin zollinger.md | 0 amateur-utopian.md => amateur utopian.md | 0 amit-dutta.md => amit dutta.md | 0 ...iento.md => américa latina en movimiento.md | 0 an-agora.md => an agora.md | 0 ....md => an open letter to an open nation.md | 0 ana-roxanne.md => ana roxanne.md | 0 ana-ulin.md => ana ulin.md | 0 anar-chi-st.md => anar chi st.md | 0 ...talist.md => anarcho anarcho capitalist.md | 0 ...cho-capitalism.md => anarcho capitalism.md | 0 anarcho-communism.md => anarcho communism.md | 0 ...cho-syncretism.md => anarcho syncretism.md | 0 anarchy-in-action.md => anarchy in action.md | 0 andi-nachon.md => andi nachon.md | 0 andrei-ciortea.md => andrei ciortea.md | 0 andrew-burton.md => andrew burton.md | 0 andrew-marantz.md => andrew marantz.md | 0 andrew-yang.md => andrew yang.md | 0 andy-matuschak.md => andy matuschak.md | 0 anil-seth.md => anil seth.md | 0 anirudh-badri.md => anirudh badri.md | 0 anna-gat.md => anna gat.md | 0 ...-science.md => annotated hub of science.md | 0 ...tion-standard.md => annotation standard.md | 0 anti-civ.md => anti civ.md | 0 anti-fascist.md => anti fascist.md | 0 anti-libraries.md => anti libraries.md | 0 apache-marmotta.md => apache marmotta.md | 0 ...er-de-grandes.md => aprender de grandes.md | 0 arabian-nights.md => arabian nights.md | 0 arcades-project.md => arcades project.md | 0 ...rgentina has some vaporwave powerhouses.md | 0 armengol-altayo.md => armengol altayo.md | 0 armengol-flancian.md => armengol flancian.md | 0 armengol-lorand.md => armengol lorand.md | 0 arnold-schrijver.md => arnold schrijver.md | 0 art-blakey.md => art blakey.md | 0 ...peddakotla.md => arti walker peddakotla.md | 0 asado-verbal.md => asado verbal.md | 0 astor-piazzolla.md => astor piazzolla.md | 0 async-art.md => async art.md | 0 async-chat.md => async chat.md | 0 at-the-dam.md => at the dam.md | 0 athens-research.md => athens research.md | 0 atomic-search.md => atomic search.md | 0 attack-on-titan.md => attack on titan.md | 0 audio-recorder.md => audio recorder.md | 0 ...ellect.md => augmenting human intellect.md | 0 ...mit-messages.md => auto commit messages.md | 0 auto-push.md => auto push.md | 0 auto-wikilinking.md => auto wikilinking.md | 0 aventine-keyhole.md => aventine keyhole.md | 0 avi-weiss.md => avi weiss.md | 0 ...ome-foundation.md => awesome foundation.md | 0 ayn-rand.md => ayn rand.md | 0 azlen-elza.md => azlen elza.md | 0 b-a.md => b a.md | 0 b-enterprises.md => b enterprises.md | 0 back-problems.md => back problems.md | 0 balafon-sketches.md => balafon sketches.md | 0 bart-kosko.md => bart kosko.md | 0 basic-income.md => basic income.md | 0 bassel-khartabil.md => bassel khartabil.md | 0 ...dyrrhachium.md => battle of dyrrhachium.md | 0 ...-of-pharsalus.md => battle of pharsalus.md | 0 beaker-browser.md => beaker browser.md | 0 ...-of-good-news.md => bearer of good news.md | 0 being-open.md => being open.md | 0 bell-evans.md => bell evans.md | 0 ben-chase.md => ben chase.md | 0 ben-congdon.md => ben congdon.md | 0 ben-shapiro.md => ben shapiro.md | 0 ...ini-fettuccini.md => bendini fettuccini.md | 0 benedict-lau.md => benedict lau.md | 0 ...life.md => benefolent director for life.md | 0 ...life.md => benevolent dictator for life.md | 0 ...life.md => benevolent director for life.md | 0 benjamin-franklin.md => benjamin franklin.md | 0 ...st-group.md => berkeley anarchist group.md | 0 ...-sci-fi-movies.md => best sci fi movies.md | 0 better-ranking.md => better ranking.md | 0 big-blue-button.md => big blue button.md | 0 big-in-japan.md => big in japan.md | 0 bill-evans.md => bill evans.md | 0 bill-seitz.md => bill seitz.md | 0 binding-chaos.md => binding chaos.md | 0 bird-feeder.md => bird feeder.md | 0 blackbox-exporter.md => blackbox exporter.md | 0 blob-opera.md => blob opera.md | 0 block-references.md => block references.md | 0 ...cken-farm.md => blockchain chicken farm.md | 0 blue-lp.md => blue lp.md | 0 blue-oak.md => blue oak.md | 0 bodhisattva-vow.md => bodhisattva vow.md | 0 bolo-bolo.md => bolo bolo.md | 0 book-club.md => book club.md | 0 ...f-the-new-sun.md => book of the new sun.md | 0 boos-did-911.md => boos did 911.md | 0 borges-por-piglia.md => borges por piglia.md | 0 boris-mann.md => boris mann.md | 0 botsin-space.md => botsin space.md | 0 ...g-concertos.md => brandenburg concertos.md | 0 brassica-oleracea.md => brassica oleracea.md | 0 breath-of-desire.md => breath of desire.md | 0 bret-weinstein.md => bret weinstein.md | 0 brian-kernighan.md => brian kernighan.md | 0 brian-moriarty.md => brian moriarty.md | 0 bright-mind.md => bright mind.md | 0 brontë-sisters.md => brontë sisters.md | 0 ...r-mfc-l2710dw.md => brother mfc l2710dw.md | 0 brown-noise.md => brown noise.md | 0 brownian-motion.md => brownian motion.md | 0 browser-extension.md => browser extension.md | 0 ...ser-extensions.md => browser extensions.md | 0 bruno-winck.md => bruno winck.md | 0 buddhist-geeks.md => buddhist geeks.md | 0 buenos-aires.md => buenos aires.md | 0 build-bridges.md => build bridges.md | 0 building-an-agora.md => building an agora.md | 0 burma-shave.md => burma shave.md | 0 burning-bridges.md => burning bridges.md | 0 ...buscarle profesor de inglés online a mamá.md | 0 busy-cafe.md => busy cafe.md | 0 ...ras-and-lenses.md => cameras and lenses.md | 0 ...your-heart.md => can t break your heart.md | 0 ...head.md => can t get you out of my head.md | 0 ...-your-heart.md => cant break your heart.md | 0 ...-head.md => cant get you out of my head.md | 0 capsule-wardrobe.md => capsule wardrobe.md | 0 caramel-city.md => caramel city.md | 0 ....md => care home that looks like a town.md | 0 carlo-ginzburg.md => carlo ginzburg.md | 0 carrot-cake.md => carrot cake.md | 0 casa-común.md => casa común.md | 0 casio-fw-91.md => casio fw 91.md | 0 cat-heroin.md => cat heroin.md | 0 cat-roulette.md => cat roulette.md | 0 cat-vibing.md => cat vibing.md | 0 ...evices.md => catalog of missing devices.md | 0 ...ers.md => category theory for engineers.md | 0 ...s.md => category theory for programmers.md | 0 category-theory.md => category theory.md | 0 caterina-barbieri.md => caterina barbieri.md | 0 ...d => center for land use interpretation.md | 0 ...ator.md => central mid levels escalator.md | 0 chandra-easton.md => chandra easton.md | 0 change-the-world.md => change the world.md | 0 charles-stanhop.md => charles stanhop.md | 0 charles-stanhope.md => charles stanhope.md | 0 chat-mode.md => chat mode.md | 0 ...ham-house-rule.md => chatham house rule.md | 0 ...ting-with-glue.md => chatting with glue.md | 0 cheeses-of-europe.md => cheeses of europe.md | 0 chemical-freeze.md => chemical freeze.md | 0 chess-hypothesis.md => chess hypothesis.md | 0 ...terton-s-fence.md => chesterton s fence.md | 0 chestertons-fence.md => chestertons fence.md | 0 ...ion.md => china a century of revolution.md | 0 chongli-qin.md => chongli qin.md | 0 ...se-the-closest.md => choose the closest.md | 0 ...venture.md => choose your own adventure.md | 0 chris-aldrich.md => chris aldrich.md | 0 chris moyé.md | 4 ---- chris-moyé.md | 2 -- ... => christopher alexander reading group.md | 0 ...r-alexander.md => christopher alexander.md | 0 ...stopher-priest.md => christopher priest.md | 0 ...ote-desktop.md => chrome remote desktop.md | 0 ...-and-sheemish.md => chu bu and sheemish.md | 0 chögyam-trungpa.md => chögyam trungpa.md | 0 ...sicians.md => cimbalom street musicians.md | 0 cinco-años.md => cinco años.md | 0 clay-shirky.md => clay shirky.md | 0 cleo-from-5-to-7.md => cleo from 5 to 7.md | 0 ...d-management.md => clipboard management.md | 0 closer-to-truth.md => closer to truth.md | 0 coconut-oil.md => coconut oil.md | 0 code-server.md => code server.md | 0 codex-editor.md => codex editor.md | 0 coding-projects.md => coding projects.md | 0 cognitive-load.md => cognitive load.md | 0 colin-the-mathmo.md => colin the mathmo.md | 0 colin-turner.md => colin turner.md | 0 colin-ward.md => colin ward.md | 0 colors-of-noise.md => colors of noise.md | 0 command-k.md => command k.md | 0 ...-interface.md => command line interface.md | 0 commit-template.md => commit template.md | 0 complainer-bot.md => complainer bot.md | 0 ....md => complementary cognitive artifact.md | 0 ...md => complementary cognitive artifacts.md | 0 complex-system.md => complex system.md | 0 ...osite-go-links.md => composite go links.md | 0 computer-system.md => computer system.md | 0 ...eativity.md => computers and creativity.md | 0 ...ques and models of computer programming.md | 0 ...ct-vs-mistake.md => conflict vs mistake.md | 0 connor-st-george.md => connor st george.md | 0 conscious-beings.md => conscious beings.md | 0 context-collapse.md => context collapse.md | 0 ...losophy.md => controversy in philosophy.md | 0 ...-myself.md => conversations with myself.md | 0 cookie-clicker.md => cookie clicker.md | 0 cool-retro-term.md => cool retro term.md | 0 ...lving.md => cooperative problem solving.md | 0 ...ative-systems.md => cooperative systems.md | 0 ...on-problems.md => coordination problems.md | 0 coreutils-decoded.md => coreutils decoded.md | 0 cory-doctorow.md => cory doctorow.md | 0 ...t-my-blessings.md => count my blessings.md | 0 covid-19-game.md => covid 19 game.md | 0 covid-19.md => covid 19.md | 0 covid-tracker.md => covid tracker.md | 0 crack-azw.md => crack azw.md | 0 ...d => creamy ricotta pasta with broccoli.md | 0 ...ttribution sharealike 4 0 international.md | 0 creative-commons.md => creative commons.md | 0 ...er-coops.md => critique of worker coops.md | 0 ...dsourced-chess.md => crowdsourced chess.md | 0 ...ilesystem.md => crowdsourced filesystem.md | 0 ...ourced-search.md => crowdsourced search.md | 0 crush-capitalism.md => crush capitalism.md | 0 cultural-shift.md => cultural shift.md | 0 curtin-yarvin.md => curtin yarvin.md | 0 ...surveillant.md => cybenetic surveillant.md | 0 ...eminist-index.md => cyberfeminist index.md | 0 ...rnetic-toaster.md => cybernetic toaster.md | 0 cyborg-manifesto.md => cyborg manifesto.md | 0 d-annunzio.md => d annunzio.md | 0 d-p.md => d p.md | 0 d-t-suzuki.md => d t suzuki.md | 0 ...-gardens.md => dahlem botanical gardens.md | 0 ...as-buyers-club.md => dallas buyers club.md | 0 dan-brown.md => dan brown.md | 0 dan-harris.md => dan harris.md | 0 dan-squier.md => dan squier.md | 0 dan-whaley.md => dan whaley.md | 0 ...gol-altayo.md => daniel armengol altayo.md | 0 daniel-slutsky.md => daniel slutsky.md | 0 danielle-baskin.md => danielle baskin.md | 0 dark-horse-duo.md => dark horse duo.md | 0 dark-mode.md => dark mode.md | 0 daryl-davis.md => daryl davis.md | 0 data-runner.md => data runner.md | 0 david-allen.md => david allen.md | 0 david-eagleman.md => david eagleman.md | 0 david-gelernter.md => david gelernter.md | 0 david-krakauer.md => david krakauer.md | 0 david-mynors.md => david mynors.md | 0 day-job.md => day job.md | 0 ...-of-being-wild.md => days of being wild.md | 0 decision-theory.md => decision theory.md | 0 ...md => deconstructing sensory experience.md | 0 ...-yourself.md => deconstructing yourself.md | 0 default-action.md => default action.md | 0 default-actions.md => default actions.md | 0 ...mode-network.md => default mode network.md | 0 defcon-radio.md => defcon radio.md | 0 ...eralism.md => democractic confederalism.md | 0 democracy-earth.md => democracy earth.md | 0 dennis-ritchie.md => dennis ritchie.md | 0 denny-vrandecic.md => denny vrandecic.md | 0 denny-vrandečić.md => denny vrandečić.md | 0 ...e-capitalism.md => deprecate capitalism.md | 0 derrick-broze.md => derrick broze.md | 0 desire-paths.md => desire paths.md | 0 devine-lu-linvega.md => devine lu linvega.md | 0 ...ectical-method.md => dialectical method.md | 0 ...tion.md => digital garden configuration.md | 0 ...tandards.md => digital garden standards.md | 0 digital-garden.md => digital garden.md | 0 digital-gardeners.md => digital gardeners.md | 0 digital-gardens.md => digital gardens.md | 0 ding-levery.md => ding levery.md | 0 ...clic-graph.md => directed acyclic graph.md | 0 ...m-flancia.md => dispatches from flancia.md | 0 ...d-cognition.md => distributed cognition.md | 0 ...e-grap.md => distributed knowledge grap.md | 0 ...graph.md => distributed knowledge graph.md | 0 ...d => distributed public knowledge graph.md | 0 ...ginal-sin.md => divinity 2 original sin.md | 0 do-done-trees.md => do done trees.md | 0 dockside-market.md => dockside market.md | 0 doctor-who.md => doctor who.md | 0 document-mode.md => document mode.md | 0 doing-good-better.md => doing good better.md | 0 dollar-auction.md => dollar auction.md | 0 don-hopkins.md => don hopkins.md | 0 ...make-me-think.md => don t make me think.md | 0 donate-25.md => donate 25.md | 0 ...ltruism.md => donate effective altruism.md | 0 ...ive-directly.md => donate give directly.md | 0 donna-haraway.md => donna haraway.md | 0 dos-minutos.md => dos minutos.md | 0 double-crux.md => double crux.md | 0 doug-engelbart.md => doug engelbart.md | 0 douglas-adams.md => douglas adams.md | 0 douglas-crockford.md => douglas crockford.md | 0 douglas-crowford.md => douglas crowford.md | 0 douglas-rushkoff.md => douglas rushkoff.md | 0 downward-dog.md => downward dog.md | 0 dr-kvj.md => dr kvj.md | 0 ...rate-roberts.md => dread pirate roberts.md | 0 drive-safe-homie.md => drive safe homie.md | 0 ...distraction.md => driven to distraction.md | 0 duncan-jones.md => duncan jones.md | 0 dust-theory.md => dust theory.md | 0 dweb-principles.md => dweb principles.md | 0 dylan-steck.md => dylan steck.md | 0 ...omizo-flancian.md => dyokomizo flancian.md | 0 e-c-b.md => e c b.md | 0 e-c-s.md => e c s.md | 0 eagxvirtual-2020.md => eagxvirtual 2020.md | 0 eberhard-licht.md => eberhard licht.md | 0 ...erty.md => ecmascript internal property.md | 0 eddie-higgins.md => eddie higgins.md | 0 edge-of-chaos.md => edge of chaos.md | 0 edges-of-illusion.md => edges of illusion.md | 0 ...uism-talk.md => effective altruism talk.md | 0 ...ctive-altruism.md => effective altruism.md | 0 ...rtless-contact.md => effortless contact.md | 0 eggy-egregore.md => eggy egregore.md | 0 ...-conflict.md => egypt ethiopia conflict.md | 0 ...-poetry.md => eighteenth century poetry.md | 0 eishin-school.md => eishin school.md | 0 el-baile-moderno.md => el baile moderno.md | 0 el-bolsón.md => el bolsón.md | 0 ...e-brown.md => el candor del padre brown.md | 0 el-casal-catalá.md => el casal catalá.md | 0 ...el-coyote.md => el evangelio del coyote.md | 0 el-narrador.md => el narrador.md | 0 ...l problema son las piedras en el camino.md | 0 ....md => el pueblo unido jamás será vencido.md | 0 ...on.md => electronic frontier foundation.md | 0 elinor-ostrom.md => elinor ostrom.md | 0 ...ace-capitalism.md => embrace capitalism.md | 0 emerald-tablet.md => emerald tablet.md | 0 emmy-noether.md => emmy noether.md | 0 empresas-b.md => empresas b.md | 0 emre-ergin.md => emre ergin.md | 0 ...-un-agora.md => en flancia hay un agora.md | 0 ...a of world problems and human potential.md | 0 ...ms.md => encyclopedia of world problems.md | 0 ...othesis.md => entropic brain hypothesis.md | 0 ...-forecasting.md => epidemic forecasting.md | 0 eric-freeman.md => eric freeman.md | 0 eric-hoffer.md => eric hoffer.md | 0 eric-linus-kaplan.md => eric linus kaplan.md | 0 eric-r-weinstein.md => eric r weinstein.md | 0 eric-raymond.md => eric raymond.md | 0 ...md => eric weinstein with brian keating.md | 0 eric-weinstein.md => eric weinstein.md | 0 ....md => eric weistein with brian keating.md | 0 erik-d-kennedy.md => erik d kennedy.md | 0 erik-kennedy.md => erik kennedy.md | 0 ...na.md => escenas de la novela argentina.md | 0 ...itos-herèticos.md => escritos herèticos.md | 0 ...itos-heréticos.md => escritos heréticos.md | 0 ...-aprendices.md => escuela de aprendices.md | 0 eternal-september.md => eternal september.md | 0 ethan-plante.md => ethan plante.md | 0 etherpad-plugins.md => etherpad plugins.md | 0 ...rpad-wikilinks.md => etherpad wikilinks.md | 0 ethical-license.md => ethical license.md | 0 evan-thompson.md => evan thompson.md | 0 ...utive-bathroom.md => executive bathroom.md | 0 exists-forall.md => exists forall.md | 0 ...twork.md => experimental social network.md | 0 ...le-redirects.md => extensible redirects.md | 0 ...tension.md => external chrome extension.md | 0 extropian-net.md => extropian net.md | 0 f-s-b.md => f s b.md | 0 fabien-gandon.md => fabien gandon.md | 0 ...ne.md => facebook is a doomsday machine.md | 0 favourite-things.md => favourite things.md | 0 feature-requests.md => feature requests.md | 0 ...f-the-agora.md => features of the agora.md | 0 ...ry-14th,-2020.md => february 14th, 2020.md | 0 ...ted-ecosystem.md => federated ecosystem.md | 0 ...d-ecosystems.md => federated ecosystems.md | 0 federated-wiki.md => federated wiki.md | 0 fediverse-party.md => fediverse party.md | 0 fediverse-space.md => fediverse space.md | 0 fediverse-stoa.md => fediverse stoa.md | 0 fedstoa-bugs.md => fedstoa bugs.md | 0 felix-hoesch.md => felix hoesch.md | 0 feynman-lectures.md => feynman lectures.md | 0 ...international.md => fifth international.md | 0 fifth-precept.md => fifth precept.md | 0 ...rastination.md => fight procrastination.md | 0 ...> filosofía para los retos contemporáneos.md | 0 final-del-juego.md => final del juego.md | 0 firefox-nightly.md => firefox nightly.md | 0 firefox-qa.md => firefox qa.md | 0 first-stoa.md => first stoa.md | 0 fission-talks.md => fission talks.md | 0 ...ion-whitepaper.md => fission whitepaper.md | 0 five-o-clock.md => five o clock.md | 0 fix-500s.md => fix 500s.md | 0 fixing-it.md => fixing it.md | 0 fka-twigs.md => fka twigs.md | 0 flaeky-pancako.md => flaeky pancako.md | 0 flags-of-flancia.md => flags of flancia.md | 0 ...on-engraving.md => flammarion engraving.md | 0 ...cia-collective.md => flancia collective.md | 0 flancia-coop.md => flancia coop.md | 0 flancia-es.md => flancia es.md | 0 ...cia-foundation.md => flancia foundation.md | 0 flancia-goals.md => flancia goals.md | 0 ...cia-governance.md => flancia governance.md | 0 flancia-narrative.md => flancia narrative.md | 0 flancia-org.md => flancia org.md | 0 flancia-procedure.md => flancia procedure.md | 0 flancia-subtitles.md => flancia subtitles.md | 0 flancia-the-game.md => flancia the game.md | 0 ...radise of those that might have thrived.md | 0 flancian-feedback.md => flancian feedback.md | 0 ...merveilles.md => flancian in merveilles.md | 0 flaneur-browser.md => flaneur browser.md | 0 ...nana-bread.md => flourless banana bread.md | 0 flower-sermon.md => flower sermon.md | 0 foam-config.md => foam config.md | 0 foam-settings.md => foam settings.md | 0 foam-workspace.md => foam workspace.md | 0 focal-point.md => focal point.md | 0 ...ehavior-model.md => fogg behavior model.md | 0 font-of-augurs.md => font of augurs.md | 0 ...cted-graphs.md => force directed graphs.md | 0 force-graph.md => force graph.md | 0 forge-fed.md => forge fed.md | 0 formal-logic.md => formal logic.md | 0 ...urtlenecks.md => foucault s turtlenecks.md | 0 ...turtlenecks.md => foucaults turtlenecks.md | 0 four-quadrants.md => four quadrants.md | 0 four-quartets.md => four quartets.md | 0 ...nternational.md => fourth international.md | 0 ...k-lloyd-wright.md => frank lloyd wright.md | 0 frantz-fanon.md => frantz fanon.md | 0 françoise-hardy.md => françoise hardy.md | 0 fred-bednarski.md => fred bednarski.md | 0 free-time.md => free time.md | 0 ...t.md => free universal construction kit.md | 0 ...-world-charter.md => free world charter.md | 0 front-matter.md => front matter.md | 0 full-throttle.md => full throttle.md | 0 ...ly automated luxury gay space communism.md | 0 ...ació-joan-miró.md => fundació joan miró.md | 0 future-project.md => future project.md | 0 fuzzy-thinker.md => fuzzy thinker.md | 0 g-i.md => g i.md | 0 game-b.md => game b.md | 0 game-of-life.md => game of life.md | 0 ...ing-paths.md => garden of forking paths.md | 0 ...ith-gans.md => garment design with gans.md | 0 gather-town.md => gather town.md | 0 ...ty.md => gauge fields knots and gravity.md | 0 ...ity.md => gauge fields nots and gravity.md | 0 gauge-theory.md => gauge theory.md | 0 gen-studio.md => gen studio.md | 0 gene-wolfe.md => gene wolfe.md | 0 gentle-revolution.md => gentle revolution.md | 0 geometric-unity.md => geometric unity.md | 0 george-handel.md => george handel.md | 0 georgo-vassilis.md => georgo vassilis.md | 0 gerald-sussman.md => gerald sussman.md | 0 gerhard-zorn.md => gerhard zorn.md | 0 gerry-garbulsky.md => gerry garbulsky.md | 0 ...g-things-done.md => getting things done.md | 0 ghost-knowledge.md => ghost knowledge.md | 0 ...t-global-graph.md => giant global graph.md | 0 gift-idea.md => gift idea.md | 0 git-alias.md => git alias.md | 0 git-bug.md => git bug.md | 0 git-config.md => git config.md | 0 git-on-ipfs.md => git on ipfs.md | 0 git-ship.md => git ship.md | 0 git-stoa.md => git stoa.md | 0 give-directly.md => give directly.md | 0 giving-pledge.md => giving pledge.md | 0 ...ng-what-we-can.md => giving what we can.md | 0 ... making via local economic transactions.md | 0 ...uality.md => global economic inequality.md | 0 ...d => global health and development fund.md | 0 ...itute.md => global priorities institute.md | 0 go-link.md => go link.md | 0 go-run.md => go run.md | 0 good-time.md => good time.md | 0 good-titles.md => good titles.md | 0 goodreads-bridge.md => goodreads bridge.md | 0 goodreads-export.md => goodreads export.md | 0 ...-alternatives.md => google alternatives.md | 0 google-keep.md => google keep.md | 0 gopher-like.md => gopher like.md | 0 gordon-brander.md => gordon brander.md | 0 ...uploader-cli.md => gphotos uploader cli.md | 0 gpt-2.md => gpt 2.md | 0 gpt-3.md => gpt 3.md | 0 gray-card.md => gray card.md | 0 great-news.md => great news.md | 0 great-open-source.md => great open source.md | 0 green-yoga.md => green yoga.md | 0 greg-egan.md => greg egan.md | 0 gregory-bateson.md => gregory bateson.md | 0 groundhog-day.md => groundhog day.md | 0 ...ties.md => growing artificial societies.md | 0 ...to.md => guerilla open access manifesto.md | 0 gyuri-lajos.md => gyuri lajos.md | 0 habitat-67.md => habitat 67.md | 0 hack-the-planet.md => hack the planet.md | 0 hacker-manifesto.md => hacker manifesto.md | 0 hacker-news.md => hacker news.md | 0 ...ckers heroes of the computer revolution.md | 0 hans-widmer.md => hans widmer.md | 0 harvey-michael.md => harvey michael.md | 0 hashing-function.md => hashing function.md | 0 heather-marsh.md => heather marsh.md | 0 help-others.md => help others.md | 0 herbert simon.md | 5 ----- herbert-simon.md | 2 -- ...l-of-ostropol.md => hershel of ostropol.md | 0 ...l-ontology.md => heterarchical ontology.md | 0 ...s-in-firefox.md => hide tabs in firefox.md | 0 ...s-worldview.md => high stakes worldview.md | 0 hillel-the-elder.md => hillel the elder.md | 0 ...md => historias de cronopios y de famas.md | 0 historical-agora.md => historical agora.md | 0 hn-alternatives.md => hn alternatives.md | 0 ...ollern-castle.md => hohenzollern castle.md | 0 ...hype-for-art.md => hope or hype for art.md | 0 housing-underlay.md => housing underlay.md | 0 how-it-should-be.md => how it should be.md | 0 ...en.md => how many tabs do you have open.md | 0 ...tech-loses-out.md => how tech loses out.md | 0 ...flancian.md => how to become a flancian.md | 0 ...ple.md => how to feed 10 billion people.md | 0 how-to-gpt-2.md => how to gpt 2.md | 0 ...to-learn-scala.md => how to learn scala.md | 0 ...thing.md => how to make almost anything.md | 0 ...to-read-a-book.md => how to read a book.md | 0 ...a-book.md => how to self publish a book.md | 0 ...ountry.md => how to start a new country.md | 0 ...nux.md => how to write a caron in linux.md | 0 hubert-dreyfus.md => hubert dreyfus.md | 0 huerta-común.md => huerta común.md | 0 ...action.md => human computer interaction.md | 0 human-right.md => human right.md | 0 human-rights.md => human rights.md | 0 humane-tech.md => humane tech.md | 0 hype-man.md => hype man.md | 0 hypercore-proto.md => hypercore proto.md | 0 ...rcore-protocol.md => hypercore protocol.md | 0 ...rlink-delusion.md => hyperlink delusion.md | 0 ...is-extension.md => hypothesis extension.md | 0 hypothesis-intro.md => hypothesis intro.md | 0 ...oam-bridge.md => hypothesis roam bridge.md | 0 i-ching-lite.md => i ching lite.md | 0 i-ching.md => i ching.md | 0 ...node in the agora all day and all night.md | 0 ...hts.md => i ll kill your shining lights.md | 0 ...ers the same way that others inspire me.md | 0 iap-2021.md => iap 2021.md | 0 idea-market.md => idea market.md | 0 ...> if i had the means i d build an agora.md | 0 ...ant-to-share.md => if you want to share.md | 0 igor-lenterman.md => igor lenterman.md | 0 ijeoma-oluo.md => ijeoma oluo.md | 0 ikko-tanaka.md => ikko tanaka.md | 0 immers-space.md => immers space.md | 0 ...-tracker.md => imperial college tracker.md | 0 ...ntention.md => implementation intention.md | 0 in-an-endearing.md => in an endearing.md | 0 in-buddha-s-words.md => in buddha s words.md | 0 ... in flancia there are no walled gardens.md | 0 ...gora.md => in flancia there is an agora.md | 0 ...of-idleness.md => in praise of idleness.md | 0 in-the-arcades.md => in the arcades.md | 0 ...> in the beginning was the command line.md | 0 in-the-wilderless.md => in the wilderless.md | 0 indie-hackers.md => indie hackers.md | 0 indie-web.md => indie web.md | 0 indra-s-net.md => indra s net.md | 0 indra's-net.md => indra's net.md | 0 indras-net.md => indras net.md | 0 infinity-project.md => infinity project.md | 0 ...mental.md => information as fundamental.md | 0 ...md => innovation information initiative.md | 0 instant-commons.md => instant commons.md | 0 ...stinctive sleeping and resting postures.md | 0 ...-repository.md => integrated repository.md | 0 ...utomation.md => intent based automation.md | 0 ...tomation.md => intent driven automation.md | 0 ...ional-society.md => intentional society.md | 0 inter-wiki.md => inter wiki.md | 0 ...ph.md => interactive philosophers graph.md | 0 ...tension.md => internal chrome extension.md | 0 internet-citizen.md => internet citizen.md | 0 ...-renaissance.md => internet renaissance.md | 0 ...-mind-map.md => interplanetary mind map.md | 0 ...ywiki.md => ipfs backend for tiddlywiki.md | 0 iron-absorption.md => iron absorption.md | 0 iso-8601.md => iso 8601.md | 0 isomorphic-git.md => isomorphic git.md | 0 ivan-herman.md => ivan herman.md | 0 izzy-swart.md => izzy swart.md | 0 j-posadas.md => j posadas.md | 0 jack-park.md => jack park.md | 0 james-baker.md => james baker.md | 0 james-fodor.md => james fodor.md | 0 james-gleick.md => james gleick.md | 0 janique-behman.md => janique behman.md | 0 jarke-wharton.md => jarke wharton.md | 0 jarkko-oikarinen.md => jarkko oikarinen.md | 0 ...ript-subnodes.md => javascript subnodes.md | 0 ...ois-lyotard.md => jean françois lyotard.md | 0 jean-michel-jarre.md => jean michel jarre.md | 0 jed-mckenna.md => jed mckenna.md | 0 jeff-tang.md => jeff tang.md | 0 jennifer-rygh.md => jennifer rygh.md | 0 jerry-michalski.md => jerry michalski.md | 0 jesse-li.md => jesse li.md | 0 jevons-paradox.md => jevons paradox.md | 0 jitsi-meet.md => jitsi meet.md | 0 joan-miro.md => joan miro.md | 0 joel-gustafson.md => joel gustafson.md | 0 joey-savoie.md => joey savoie.md | 0 john-brown.md => john brown.md | 0 john-cowper-powys.md => john cowper powys.md | 0 john-ii-komnenos.md => john ii komnenos.md | 0 john-ingalls.md => john ingalls.md | 0 john-perry-barlow.md => john perry barlow.md | 0 johnny-mnemonic.md => johnny mnemonic.md | 0 jonathan-aquino.md => jonathan aquino.md | 0 ...-the-utopian.md => jonathan the utopian.md | 0 jordan-peterson.md => jordan peterson.md | 0 jorge-bolet.md => jorge bolet.md | 0 jorge-luis-borges.md => jorge luis borges.md | 0 joscha-bach.md => joscha bach.md | 0 js-subnodes.md => js subnodes.md | 0 json-ld.md => json ld.md | 0 ...-carlos-onetti.md => juan carlos onetti.md | 0 ...ose-fernandez.md => juan jose fernandez.md | 0 juan-sasturain.md => juan sasturain.md | 0 jud-brewer.md => jud brewer.md | 0 julia-serano.md => julia serano.md | 0 juliana-barwick.md => juliana barwick.md | 0 julio-cortázar.md => julio cortázar.md | 0 julio-jcortázar.md => julio jcortázar.md | 0 jumpsuit-chic.md => jumpsuit chic.md | 0 ...futurist.md => karl marx technofuturist.md | 0 ...icoss-flancian.md => karlicoss flancian.md | 0 karthikk-vijay.md => karthikk vijay.md | 0 ...s-the-world.md => kasparov vs the world.md | 0 keith-johnstone.md => keith johnstone.md | 0 ken-wilber.md => ken wilber.md | 0 key-lime-pie.md => key lime pie.md | 0 killing-rage.md => killing rage.md | 0 ...phetamines.md => know your amphetamines.md | 0 knowledge-bases.md => knowledge bases.md | 0 ...res-group.md => knowledge futures group.md | 0 ...md => knowledge management applications.md | 0 kyosaku-jon.md => kyosaku jon.md | 0 ...> l allegro il penseroso ed il moderato.md | 0 la-vida-breve.md => la vida breve.md | 0 laarc-io.md => laarc io.md | 0 lady-murasaki.md => lady murasaki.md | 0 lago-atitlán.md => lago atitlán.md | 0 lake-atitlán.md => lake atitlán.md | 0 lambda-calculus.md => lambda calculus.md | 0 ...ness.md => land of silence and darkness.md | 0 landauer-limit.md => landauer limit.md | 0 langston-hughes.md => langston hughes.md | 0 language-games.md => language games.md | 0 ...ix.md => language learning with netflix.md | 0 latent-compass.md => latent compass.md | 0 ...datalog-today.md => learn datalog today.md | 0 learning-rust.md => learning rust.md | 0 learning-to-learn.md => learning to learn.md | 0 ...t-anarchist.md => left market anarchist.md | 0 ...uaje-universal.md => lenguaje universal.md | 0 lenovo-p14.md => lenovo p14.md | 0 leon-trotsky.md => leon trotsky.md | 0 less-wrong.md => less wrong.md | 0 let-me-know.md => let me know.md | 0 let-us-be-one.md => let us be one.md | 0 letter-wiki.md => letter wiki.md | 0 ...ein-distance.md => levenshtein distance.md | 0 levi-hart.md => levi hart.md | 0 lex-fridman.md => lex fridman.md | 0 lex-maria.md => lex maria.md | 0 liminal-warmth.md => liminal warmth.md | 0 lindy-effect.md => lindy effect.md | 0 lingua-franca.md => lingua franca.md | 0 ...nces.md => linguistic example sentences.md | 0 ...-go-along.md => link it as you go along.md | 0 link-rot.md => link rot.md | 0 linus-torvalds.md => linus torvalds.md | 0 liquid-democracy.md => liquid democracy.md | 0 ...s-of-lists.md => list of lists of lists.md | 0 list-of-lists.md => list of lists.md | 0 ...-of-lists.md => lists of lists of lists.md | 0 lists-of-lists.md => lists of lists.md | 0 live-redesign.md => live redesign.md | 0 live-tooting.md => live tooting.md | 0 lobste-rs.md => lobste rs.md | 0 lonesome-no-more.md => lonesome no more.md | 0 lord-enki.md => lord enki.md | 0 ...terrestres.md => los oficios terrestres.md | 0 los-olimareños.md => los olimareños.md | 0 lost-and-found.md => lost and found.md | 0 ...-us-apart.md => love will tear us apart.md | 0 lower-back-pain.md => lower back pain.md | 0 loyd-blankenship.md => loyd blankenship.md | 0 luca-landucci.md => luca landucci.md | 0 lucid-innocence.md => lucid innocence.md | 0 ...-communism.md => luxury space communism.md | 0 lyn-hejinian.md => lyn hejinian.md | 0 m-prime.md => m prime.md | 0 m.-b..md => m. b..md | 0 ...nio-fernandez.md => macedonio fernandez.md | 0 ...nio-fernández.md => macedonio fernández.md | 0 ...-and-honey.md => madness rack and honey.md | 0 maintain-my-body.md => maintain my body.md | 0 ...md => make up links that dont exist yet.md | 0 malcolm-x.md => malcolm x.md | 0 ...led-in-transit.md => mangled in transit.md | 0 ...mocracy.md => manipulation of democracy.md | 0 ...e-fediverse.md => mapping the fediverse.md | 0 marcelo-tinelli.md => marcelo tinelli.md | 0 margaret-warren.md => margaret warren.md | 0 marina-garcés.md => marina garcés.md | 0 markdown-links.md => markdown links.md | 0 markdown-on-git.md => markdown on git.md | 0 markov-blankets.md => markov blankets.md | 0 marroni-cake.md => marroni cake.md | 0 martin-gardner.md => martin gardner.md | 0 ...in-luther-king.md => martin luther king.md | 0 marxist-thinkers.md => marxist thinkers.md | 0 mary-lattimore.md => mary lattimore.md | 0 masa-de-tarta.md => masa de tarta.md | 0 mastodon-bot.md => mastodon bot.md | 0 mastodon-clients.md => mastodon clients.md | 0 mastodon-instance.md => mastodon instance.md | 0 ...odon-instances.md => mastodon instances.md | 0 ...ematical-logic.md => mathematical logic.md | 0 ...al-universe.md => mathematical universe.md | 0 mathew-lowry.md => mathew lowry.md | 0 matrix-agora.md => matrix agora.md | 0 matrix-bot.md => matrix bot.md | 0 max-stauffer.md => max stauffer.md | 0 ...lly-inclusive.md => maximally inclusive.md | 0 mechanical-monk.md => mechanical monk.md | 0 ...s-on-moloch.md => meditations on moloch.md | 0 meet-coop.md => meet coop.md | 0 mehr-als-wohnen.md => mehr als wohnen.md | 0 meme-traditions.md => meme traditions.md | 0 memories-of-green.md => memories of green.md | 0 mental-nodes.md => mental nodes.md | 0 mental-state.md => mental state.md | 0 mercury-fountain.md => mercury fountain.md | 0 ...magical-themas.md => metamagical themas.md | 0 metasj-flancian.md => metasj flancian.md | 0 method-of-loci.md => method of loci.md | 0 michael-aird.md => michael aird.md | 0 michael-graham.md => michael graham.md | 0 michael-ocean.md => michael ocean.md | 0 michael-taft.md => michael taft.md | 0 ...-de-montaigne.md => michel de montaigne.md | 0 michel-foucault.md => michel foucault.md | 0 micro-pub.md => micro pub.md | 0 ...est-hits.md => mid career greatest hits.md | 0 middle-way.md => middle way.md | 0 ...world.md => midnight in a perfect world.md | 0 ...s-martinez.md => miguel marcos martinez.md | 0 ...ntmihalyi.md => mihaly csikszentmihalyi.md | 0 mike-elias.md => mike elias.md | 0 mind-merge.md => mind merge.md | 0 mind-over-chatter.md => mind over chatter.md | 0 mind-palace.md => mind palace.md | 0 ...md => mind uploading and the revolution.md | 0 missing-devices.md => missing devices.md | 0 missing-semester.md => missing semester.md | 0 ml5-js.md => ml5 js.md | 0 moa-party.md => moa party.md | 0 moa-polls.md => moa polls.md | 0 mob-mentality.md => mob mentality.md | 0 ...l-of-the-world.md => model of the world.md | 0 molchat-doma.md => molchat doma.md | 0 molly-mielke.md => molly mielke.md | 0 money-free-world.md => money free world.md | 0 moon-ribas.md => moon ribas.md | 0 moral-principles.md => moral principles.md | 0 mort-garson.md => mort garson.md | 0 mr-random.md => mr random.md | 0 muhammad-ﷺ.md => muhammad ﷺ.md | 0 multiplayer-roam.md => multiplayer roam.md | 0 muscle-wiki.md => muscle wiki.md | 0 musgum-huts.md => musgum huts.md | 0 music-for-plants.md => music for plants.md | 0 ...ourite-things.md => my favourite things.md | 0 my-goal-in-life.md => my goal in life.md | 0 mycroft-ai.md => mycroft ai.md | 0 nadia-eghbal.md => nadia eghbal.md | 0 ...mal-thing.md => name place animal thing.md | 0 nano-page.md => nano page.md | 0 nathan-schneider.md => nathan schneider.md | 0 neal-stephenson.md => neal stephenson.md | 0 ...ts.md => necklace of community projects.md | 0 neil-harbisson.md => neil harbisson.md | 0 ...ld-unite.md => nerds of the world unite.md | 0 ness-labs.md => ness labs.md | 0 nestor-makhno.md => nestor makhno.md | 0 nettie-lagace.md => nettie lagace.md | 0 network-science.md => network science.md | 0 never-known.md => never known.md | 0 never-wrote.md => never wrote.md | 0 new-games.md => new games.md | 0 new-music.md => new music.md | 0 ...ike-problems.md => newcomblike problems.md | 0 next-action.md => next action.md | 0 nft-storage.md => nft storage.md | 0 nick-bostrom.md => nick bostrom.md | 0 nick-cammarata.md => nick cammarata.md | 0 nick-szabo.md => nick szabo.md | 0 nick-vujicic.md => nick vujicic.md | 0 nikolai-kingsley.md => nikolai kingsley.md | 0 no-yoga-robots.md => no yoga robots.md | 0 nobu-hibiki.md => nobu hibiki.md | 0 ...rgos.md => noche de los bastones largos.md | 0 node-js.md => node js.md | 0 node-outlines.md => node outlines.md | 0 node-permutations.md => node permutations.md | 0 nodes-outlines.md => nodes outlines.md | 0 noise-colors.md => noise colors.md | 0 non-profit.md => non profit.md | 0 ...ally.md => not organized hierarchically.md | 0 ...rm.md => notes on the synthesis of form.md | 0 nunca-me-faltes.md => nunca me faltes.md | 0 object-of-design.md => object of design.md | 0 ocarina-of-time.md => ocarina of time.md | 0 offline-twitter.md => offline twitter.md | 0 olga-babeeva.md => olga babeeva.md | 0 oliver-sauter.md => oliver sauter.md | 0 omar-rizwan.md => omar rizwan.md | 0 ...lding-bridges.md => on building bridges.md | 0 on-cringe.md => on cringe.md | 0 on-tyranny.md => on tyranny.md | 0 ...the-agora.md => onboarding to the agora.md | 0 only-flans.md => only flans.md | 0 open-borders.md => open borders.md | 0 open-collective.md => open collective.md | 0 open-ethics.md => open ethics.md | 0 ...raph-protocol.md => open graph protocol.md | 0 open-graph.md => open graph.md | 0 open-home.md => open home.md | 0 ...etter-to-foam.md => open letter to foam.md | 0 open-nation.md => open nation.md | 0 open-protocols.md => open protocols.md | 0 open-search.md => open search.md | 0 ...monitoring.md => open source monitoring.md | 0 open-source.md => open source.md | 0 open-street-map.md => open street map.md | 0 open-syllabus.md => open syllabus.md | 0 ...ance.md => operation unified assistance.md | 0 opus-populi.md => opus populi.md | 0 orbit-db.md => orbit db.md | 0 ...e-terciopelo.md => orejas de terciopelo.md | 0 org-mode.md => org mode.md | 0 org-roam.md => org roam.md | 0 origin-story.md => origin story.md | 0 orphan-machine.md => orphan machine.md | 0 ...=> orthodox jews that wear 80s clothing.md | 0 other-agoras.md => other agoras.md | 0 our-flancia.md => our flancia.md | 0 out-of-memory.md => out of memory.md | 0 ...ffect.md => outgroup homogeneity effect.md | 0 p-and-h.md => p and h.md | 0 p-c.md => p c.md | 0 pandemic-game.md => pandemic game.md | 0 ...erancia.md => paradoja de la tolerancia.md | 0 ...of-tolerance.md => paradox of tolerance.md | 0 parasite-alchemy.md => parasite alchemy.md | 0 pareto-efficiency.md => pareto efficiency.md | 0 ...nking.md => part of the reason thinking.md | 0 ...-of-the-reason.md => part of the reason.md | 0 pasta-frola.md => pasta frola.md | 0 ...ng-group.md => patterning reading group.md | 0 paul-frazee.md => paul frazee.md | 0 pdb-post-morte.md => pdb post morte.md | 0 pdb-postmortem.md => pdb postmortem.md | 0 peace-piece.md => peace piece.md | 0 ...t.md => pearson correlation coefficient.md | 0 pee-zombie.md => pee zombie.md | 0 pen-coded.md => pen coded.md | 0 ...pera-ad-astra.md => per aspera ad astra.md | 0 ...onjunto.md => pernambuco e seu conjunto.md | 0 ... => persistent non symbolic experiences.md | 0 ...-from-porlock.md => person from porlock.md | 0 ...amic-media.md => personal dynamic media.md | 0 ...ge-graph.md => personal knowledge graph.md | 0 ...ent.md => personal knowledge management.md | 0 ...ment.md => personal knowledge managment.md | 0 peter-limberg.md => peter limberg.md | 0 peter-singer.md => peter singer.md | 0 peter-thiel.md => peter thiel.md | 0 ...ižek-debate.md => peterson žižek debate.md | 0 petter-johansson.md => petter johansson.md | 0 philip-k-dick.md => philip k dick.md | 0 philosopher-life.md => philosopher life.md | 0 ...n-alerting.md => philosophy on alerting.md | 0 ...a-francesca.md => piero della francesca.md | 0 ...fore-shortcuts.md => pinafore shortcuts.md | 0 place-subreddit.md => place subreddit.md | 0 places for the soul.md | 22 +++++++++++++++++++ places-for-the-soul.md | 22 ------------------- plan-9.md => plan 9.md | 0 planet-hof.md => planet hof.md | 0 planet-hopf.md => planet hopf.md | 0 planned-action.md => planned action.md | 0 planned-actions.md => planned actions.md | 0 platonic-ideal.md => platonic ideal.md | 0 platonic-intent.md => platonic intent.md | 0 platos-dialogues.md => platos dialogues.md | 0 ...n.md => poema de la infancia de alguien.md | 0 pokemon-mode.md => pokemon mode.md | 0 ...doro-technique.md => pomodoro technique.md | 0 post-racial.md => post racial.md | 0 post-scarcity.md => post scarcity.md | 0 ...-revolution.md => postponing revolution.md | 0 pottery-simulator.md => pottery simulator.md | 0 ...identities.md => predictable identities.md | 0 ...on-framework.md => prediction framework.md | 0 ...predictions as a substitute for reviews.md | 0 ...t-problem.md => principal agent problem.md | 0 ...e-of-charity.md => principle of charity.md | 0 ...taivaanlintu.md => prinssi taivaanlintu.md | 0 prisión-perpetua.md => prisión perpetua.md | 0 ...-universals.md => problem of universals.md | 0 problem-solving.md => problem solving.md | 0 ...ation-diary.md => procrastination diary.md | 0 ...ational.md => progressive international.md | 0 project-gemini.md => project gemini.md | 0 promnesia-agora.md => promnesia agora.md | 0 promnesia-config.md => promnesia config.md | 0 ...e-config.md => promnesia example config.md | 0 promnesia-howto.md => promnesia howto.md | 0 promnesia-sources.md => promnesia sources.md | 0 proof-game.md => proof game.md | 0 proper-subset.md => proper subset.md | 0 proposition-joe.md => proposition joe.md | 0 ...perity-license.md => prosperity license.md | 0 ...license.md => prosperity public license.md | 0 protocol-labs.md => protocol labs.md | 0 ...platforms.md => protocols not platforms.md | 0 protopoi-org.md => protopoi org.md | 0 ...eading-club.md => protopoi reading club.md | 0 protopoi-space.md => protopoi space.md | 0 proyecto-morcilla.md => proyecto morcilla.md | 0 proyecto-nocilla.md => proyecto nocilla.md | 0 public-key.md => public key.md | 0 public-keys.md => public keys.md | 0 public-utility.md => public utility.md | 0 pull-and-push.md => pull and push.md | 0 pull-links.md => pull links.md | 0 pulled-links.md => pulled links.md | 0 pulled-nodes.md => pulled nodes.md | 0 pumpkin-soup.md => pumpkin soup.md | 0 ... an existing repository to a new remote.md | 0 push-and-pull.md => push and pull.md | 0 ...-down-automata.md => push down automata.md | 0 py-subnodes.md => py subnodes.md | 0 ...notations.md => python type annotations.md | 0 query-language.md => query language.md | 0 quick-capture.md => quick capture.md | 0 radical-candor.md => radical candor.md | 0 rainbow-folding.md => rainbow folding.md | 0 rainbow-williams.md => rainbow williams.md | 0 ...er-maria-rilke.md => rainer maria rilke.md | 0 ralph-hodgson.md => ralph hodgson.md | 0 ramon-alonso.md => ramon alonso.md | 0 ranking-algorithm.md => ranking algorithm.md | 0 raymond-williams.md => raymond williams.md | 0 ...=> rdf 1 1 concepts and abstract syntax.md | 0 rdf-1-1-primer.md => rdf 1 1 primer.md | 0 rdf-1-1-semantics.md => rdf 1 1 semantics.md | 0 ...1-1-test-cases.md => rdf 1 1 test cases.md | 0 ...1-1-xml-syntax.md => rdf 1 1 xml syntax.md | 0 rdf-grapher.md => rdf grapher.md | 0 rdf-schema-1-1.md => rdf schema 1 1.md | 0 ...n-format.md => rdf serialization format.md | 0 ...formats.md => rdf serialization formats.md | 0 reading-alexander.md => reading alexander.md | 0 reading-club.md => reading club.md | 0 reading-protopoi.md => reading protopoi.md | 0 ...e-2020.md => reading vacation june 2020.md | 0 ...-co-op-stories.md => real co op stories.md | 0 real-coop-stories.md => real coop stories.md | 0 ...able-movement.md => reasonable movement.md | 0 recipe-gate.md => recipe gate.md | 0 red-oak.md => red oak.md | 0 red-star.md => red star.md | 0 ...latory-capture.md => regulatory capture.md | 0 ...-a-spof.md => removing google as a spof.md | 0 rent-free.md => rent free.md | 0 ...ram.md => resources to learn to program.md | 0 ...evision.md => restore etherpad revision.md | 0 ...cial-network.md => retro social network.md | 0 ricardo-piglia.md => ricardo piglia.md | 0 riccardo-ferreti.md => riccardo ferreti.md | 0 riccardo-ferretti.md => riccardo ferretti.md | 0 richard-dawkins.md => richard dawkins.md | 0 richard-feynman.md => richard feynman.md | 0 richard-stallman.md => richard stallman.md | 0 right-livelihood.md => right livelihood.md | 0 right-speech.md => right speech.md | 0 ritmo-de-la-noche.md => ritmo de la noche.md | 0 rival-voices.md => rival voices.md | 0 rna-memory.md => rna memory.md | 0 roam-backup.md => roam backup.md | 0 roam-exporter.md => roam exporter.md | 0 roam-go-links.md => roam go links.md | 0 roam-like.md => roam like.md | 0 roam-likes.md => roam likes.md | 0 roam-multiplayer.md => roam multiplayer.md | 0 roam-research.md => roam research.md | 0 roam-to-git.md => roam to git.md | 0 roaman-agora.md => roaman agora.md | 0 rob-sanderson.md => rob sanderson.md | 0 ...ers-cave-study.md => robbers cave study.md | 0 robert-axelrod.md => robert axelrod.md | 0 roberto-arlt.md => roberto arlt.md | 0 robin-hanson.md => robin hanson.md | 0 ...s-socrates.md => robofriend as socrates.md | 0 ...s-socrates.md => robofriend is socrates.md | 0 roborock-s6.md => roborock s6.md | 0 rodolfo-ocampo.md => rodolfo ocampo.md | 0 rodrigo-baraglia.md => rodrigo baraglia.md | 0 rokos-basilisk.md => rokos basilisk.md | 0 role-model.md => role model.md | 0 role-models.md => role models.md | 0 ...sicians.md => romanian street musicians.md | 0 ...iod-poetry.md => romantic period poetry.md | 0 romina-wainberg.md => romina wainberg.md | 0 root-nodes.md => root nodes.md | 0 ross-perot.md => ross perot.md | 0 ruben-verborgh.md => ruben verborgh.md | 0 run-run-run.md => run run run.md | 0 ...conjugations.md => russell conjugations.md | 0 rutger-bregman.md => rutger bregman.md | 0 ruth-catlow.md => ruth catlow.md | 0 ryo-fukui.md => ryo fukui.md | 0 s-y.md => s y.md | 0 s.-s..md => s. s..md | 0 saint-simon.md => saint simon.md | 0 sam-harris.md => sam harris.md | 0 samanta-schweblin.md => samanta schweblin.md | 0 same-as.md => same as.md | 0 ...nkin-iii.md => samuel edward konkin iii.md | 0 samuel-johnson.md => samuel johnson.md | 0 samuel-klein.md => samuel klein.md | 0 ...a-fe-institute.md => santa fe institute.md | 0 santa-maría.md => santa maría.md | 0 sarah-friend.md => sarah friend.md | 0 sarah-of-the-past.md => sarah of the past.md | 0 sarah schwettmann.md | 2 -- sarah-schwettmann.md | 2 -- ...-revolution.md => satyagraha revolution.md | 0 saul-williams.md => saul williams.md | 0 scattered-minds.md => scattered minds.md | 0 schelling-point.md => schelling point.md | 0 ...ldenzucker-com.md => schuldenzucker com.md | 0 sci-fi.md => sci fi.md | 0 ...ficial.md => sciences of the artificial.md | 0 scott-alexander.md => scott alexander.md | 0 ...search and annotation are complementary.md | 0 search-engine.md => search engine.md | 0 sebastian-gandera.md => sebastian gandera.md | 0 second-brain.md => second brain.md | 0 second-stoa.md => second stoa.md | 0 secular-buddhism.md => secular buddhism.md | 0 secular-buddhist.md => secular buddhist.md | 0 ...-like-a-state.md => seeing like a state.md | 0 ...d => self organizing intelligent matter.md | 0 ...> semantic modeling of narrative events.md | 0 ...ic-narratives.md => semantic narratives.md | 0 ...ic-versioning.md => semantic versioning.md | 0 ...d => senior software engineer interview.md | 0 sensible-urls.md => sensible urls.md | 0 sequential-wiki.md => sequential wiki.md | 0 ...gsberg.md => seven bridges of königsberg.md | 0 ...tips-for-geeks.md => sex tips for geeks.md | 0 sharing-economy.md => sharing economy.md | 0 shi-ne.md => shi ne.md | 0 shinzen-young.md => shinzen young.md | 0 shirtless-guy.md => shirtless guy.md | 0 shu-omi.md => shu omi.md | 0 side-projects.md => side projects.md | 0 siedlung-halen.md => siedlung halen.md | 0 sign-up.md => sign up.md | 0 ...is-a-commons.md => silence is a commons.md | 0 silver-ladders.md => silver ladders.md | 0 ...ted-annealing.md => simulated annealing.md | 0 sistema-b.md => sistema b.md | 0 sister-sites.md => sister sites.md | 0 ...ngineer.md => site reliability engineer.md | 0 ...ring.md => site reliability engineering.md | 0 slate-star-codex.md => slate star codex.md | 0 slavoj-zizek.md => slavoj zizek.md | 0 slavoj-žižek.md => slavoj žižek.md | 0 sleeper-trains.md => sleeper trains.md | 0 slow-focus.md => slow focus.md | 0 small-axe.md => small axe.md | 0 smart-agora.md => smart agora.md | 0 smarter-than-me.md => smarter than me.md | 0 snorri-sturluson.md => snorri sturluson.md | 0 ...ce.md => so you want to talk about race.md | 0 social-algorithm.md => social algorithm.md | 0 social-coop.md => social coop.md | 0 ...d => social distributed knowledge graph.md | 0 ...edge-graph.md => social knowledge graph.md | 0 ...d => social knowledge graphs discussion.md | 0 ...hists.md => social media for anarchists.md | 0 social-network.md => social network.md | 0 ...eb-protocols.md => social web protocols.md | 0 socrates-figures.md => socrates figures.md | 0 solomon-naim.md => solomon naim.md | 0 soma-fm.md => soma fm.md | 0 ...ia.md => some possible paths to flancia.md | 0 ...gs must be believed in order to be seen.md | 0 ...s i feel as if i am struck by lightning.md | 0 ...ds-of-the-dawn.md => sounds of the dawn.md | 0 space-flower.md => space flower.md | 0 ...ng.md => speech and language processing.md | 0 ssh-keys.md => ssh keys.md | 0 ....md => st benedict rule for monasteries.md | 0 ...d => st benedict s rule for monasteries.md | 0 stack-exchange.md => stack exchange.md | 0 stack-overflow.md => stack overflow.md | 0 ...ff-properties.md => standoff properties.md | 0 ...ldenzucker.md => steffen schuldenzucker.md | 0 stephen-batchelor.md => stephen batchelor.md | 0 stephen-crane.md => stephen crane.md | 0 stephen-downes.md => stephen downes.md | 0 stephen-wolfram.md => stephen wolfram.md | 0 steve-blank.md => steve blank.md | 0 steve-mcqueen.md => steve mcqueen.md | 0 steve-roach.md => steve roach.md | 0 steve-wozniak.md => steve wozniak.md | 0 steven-fan.md => steven fan.md | 0 steven-levy.md => steven levy.md | 0 stoa-of-attalos.md => stoa of attalos.md | 0 stoa-poikile.md => stoa poikile.md | 0 ...n-diversity.md => strength in diversity.md | 0 ...-by-lightning.md => struck by lightning.md | 0 ...d interpretation of classical mechanics.md | 0 ...and interpretation of computer programs.md | 0 sun-salutations.md => sun salutations.md | 0 surplus-value.md => surplus value.md | 0 ...orts.md => survey of annotation efforts.md | 0 susan-stebbing.md => susan stebbing.md | 0 swiss-wiring-code.md => swiss wiring code.md | 0 syrian-uprising.md => syrian uprising.md | 0 t-s-eliot.md => t s eliot.md | 0 ta-eis-heauton.md => ta eis heauton.md | 0 ta-heis-heauton.md => ta heis heauton.md | 0 ...side.md => take a walk on the wild side.md | 0 ...of-programming.md => tao of programming.md | 0 tapir-whorf.md => tapir whorf.md | 0 taxonomy-of-ideas.md => taxonomy of ideas.md | 0 te-quiero.md => te quiero.md | 0 team-human.md => team human.md | 0 tectonic-shift.md => tectonic shift.md | 0 ted-nelson.md => ted nelson.md | 0 ...-discounting.md => temporal discounting.md | 0 teodor-heggelund.md => teodor heggelund.md | 0 ...ective.md => terrorism is not effective.md | 0 ...structivo.md => terrorismo constructivo.md | 0 test-for-tld.md => test for tld.md | 0 ...pace-grouping.md => tetraspace grouping.md | 0 ...ity.md => the agora is a liminal entity.md | 0 ...d => the agora is a markdown convention.md | 0 ... is a platform for studying convergence.md | 0 ...work built by the people for the people.md | 0 ...er-app.md => the agora is a twitter app.md | 0 ... agora is an old kind of social network.md | 0 ...cades-project.md => the arcades project.md | 0 ...rkets.md => the architecture of markets.md | 0 ...rchitecture of open source applications.md | 0 ...e-new-sun.md => the book of the new sun.md | 0 ...-unknowing.md => the cloud of unknowing.md | 0 ...k.md => the effective altruism handbook.md | 0 the-end.md => the end.md | 0 ...uitable-prose.md => the equitable prose.md | 0 ...tion.md => the evolution of cooperation.md | 0 ...nding-circle.md => the expanding circle.md | 0 the-expanse.md => the expanse.md | 0 ...nt.md => the fable of the dragon tyrant.md | 0 the-federation.md => the federation.md | 0 ...paths.md => the garden of forking paths.md | 0 the-gift.md => the gift.md | 0 ....md => the girl who stole my tamagotchi.md | 0 the-great-reset.md => the great reset.md | 0 ...-2020.md => the great tab purge of 2020.md | 0 ... hyperbolic geometry of dmt experiences.md | 0 ...k-delusion.md => the hyperlink delusion.md | 0 ...f-the-world.md => the idea of the world.md | 0 ...al-web.md => the intelligent social web.md | 0 the-island.md => the island.md | 0 ...kind-in-yellow.md => the kind in yellow.md | 0 ...king-in-yellow.md => the king in yellow.md | 0 ...ou-can-save.md => the life you can save.md | 0 ...little-schemer.md => the little schemer.md | 0 ...ttle-schemerh.md => the little schemerh.md | 0 the-machine.md => the machine.md | 0 ...castle.md => the man in the high castle.md | 0 ...thursday.md => the man who was thursday.md | 0 the-narrator.md => the narrator.md | 0 ...t ai winter wil lbe due to energy costs.md | 0 the-open-boat.md => the open boat.md | 0 ...he people united will never be defeated.md | 0 the-productivists.md => the productivists.md | 0 ....md => the revolution will be annotated.md | 0 ... => the rise of made in china diplomacy.md | 0 ...ment.md => the science of enlightenment.md | 0 the-selfish-gene.md => the selfish gene.md | 0 ...gs.md => the set of all possible things.md | 0 ...oftware shall be used for good not evil.md | 0 ...dividual.md => the sovereign individual.md | 0 ...-swartz.md => the story of aaron swartz.md | 0 ...ization.md => the story of civilization.md | 0 ...ding.md => the timeless way of building.md | 0 ...ess.md => the universal laws of success.md | 0 ...ishness.md => the virtue of selfishness.md | 0 the-wire.md => the wire.md | 0 the-word-fuck.md => the word fuck.md | 0 ...t in the age of mechanical reproduction.md | 0 the-world-at-war.md => the world at war.md | 0 ...lly.md => the year of living biblically.md | 0 theory-of-forms.md => theory of forms.md | 0 theproject-is.md => theproject is.md | 0 ...hesis.md => thesis antithesis synthesis.md | 0 think-about.md => think about.md | 0 ...percussion.md => third coast percussion.md | 0 third-stoa.md => third stoa.md | 0 thomas-gray.md => thomas gray.md | 0 thomas-lisankie.md => thomas lisankie.md | 0 ...ore's-utopia.md => thomas more's utopia.md | 0 thomas-szasz.md => thomas szasz.md | 0 thor-ciphers.md => thor ciphers.md | 0 ...ght-experiment.md => thought experiment.md | 0 thread-helper.md => thread helper.md | 0 thread-mode.md => thread mode.md | 0 tillie-kottmann.md => tillie kottmann.md | 0 tim-berners-lee.md => tim berners lee.md | 0 tiny-desk.md => tiny desk.md | 0 ...ess.md => tit for that with forgiveness.md | 0 tit-for-that.md => tit for that.md | 0 ...-pigs.md => to live and think like pigs.md | 0 todd-carpenter.md => todd carpenter.md | 0 tokyo-school.md => tokyo school.md | 0 ...s-of-the-agora.md => tools of the agora.md | 0 toot-cli.md => toot cli.md | 0 torta-base.md => torta base.md | 0 towards-an-agora.md => towards an agora.md | 0 town-hall.md => town hall.md | 0 ...nguage.md => trace programming language.md | 0 ...tive-go-links.md => transitive go links.md | 0 tree-notation.md => tree notation.md | 0 tree-shaping.md => tree shaping.md | 0 tree-simulator.md => tree simulator.md | 0 tree-structure.md => tree structure.md | 0 ...mats.md => tree structured file formats.md | 0 tree-structures.md => tree structures.md | 0 tree-style-tab.md => tree style tab.md | 0 tree-style-tabs.md => tree style tabs.md | 0 true-colors.md => true colors.md | 0 true-colours.md => true colours.md | 0 true-names.md => true names.md | 0 try-yoga.md => try yoga.md | 0 ...yam-guebrou.md => tsegue maryam guebrou.md | 0 tv-series.md => tv series.md | 0 ...e-first-time.md => twice the first time.md | 0 ...gration.md => twitter agora integration.md | 0 ...n-agora.md => twitter could be an agora.md | 0 twitter-d-d-roles.md => twitter d d roles.md | 0 twitter-embeds.md => twitter embeds.md | 0 ...requests.md => twitter feature requests.md | 0 twitter-go-links.md => twitter go links.md | 0 twitter-outage.md => twitter outage.md | 0 twitter-report.md => twitter report.md | 0 twitter-to-roam.md => twitter to roam.md | 0 twitter-todo.md => twitter todo.md | 0 twitter-zhuangzi.md => twitter zhuangzi.md | 0 tyler-alterman.md => tyler alterman.md | 0 tymothy-snyder.md => tymothy snyder.md | 0 ubi-zurich.md => ubi zurich.md | 0 ultra-fractal.md => ultra fractal.md | 0 ...=> un goals for sustainable development.md | 0 un-goals.md => un goals.md | 0 un-mundo-común.md => un mundo común.md | 0 un-objectives.md => un objectives.md | 0 unfair-privilege.md => unfair privilege.md | 0 unicode-arrows.md => unicode arrows.md | 0 unicode-slugify.md => unicode slugify.md | 0 ...box-startup.md => unified inbox startup.md | 0 ...laboration.md => units of collaboration.md | 0 ...sic-income.md => universal basic income.md | 0 ...l-paperclips.md => universal paperclips.md | 0 unix-philosophy.md => unix philosophy.md | 0 ...e-project.md => unnamed culture project.md | 0 ...rvations.md => unqualified reservations.md | 0 untitled-1.md => untitled 1.md | 0 untitled-2.md => untitled 2.md | 0 untitled-3.md => untitled 3.md | 0 ...ade-capitalism.md => upgrade capitalism.md | 0 ...ul-definitions.md => useful definitions.md | 0 user-links.md => user links.md | 0 using-the-agora.md => using the agora.md | 0 utopia-coffee.md => utopia coffee.md | 0 ...-for-realists.md => utopia for realists.md | 0 vacation-2020.md => vacation 2020.md | 0 val-flores.md => val flores.md | 0 vc-space.md => vc space.md | 0 vickrey-auction.md => vickrey auction.md | 0 vicrey-auction.md => vicrey auction.md | 0 victor-hugo.md => victor hugo.md | 0 vijay-shankar-v.md => vijay shankar v.md | 0 ville-radieuse.md => ville radieuse.md | 0 vinay-gupta.md => vinay gupta.md | 0 ...fakhoury-horn.md => vince fakhoury horn.md | 0 ...ent-revolution.md => violent revolution.md | 0 virtual-bolo.md => virtual bolo.md | 0 virtue-signaling.md => virtue signaling.md | 0 vocdoni-io.md => vocdoni io.md | 0 ...-de-cleyre-.md => voltairine de cleyre .md | 0 vscode-extension.md => vscode extension.md | 0 ...ettings-sync.md => vscode settings sync.md | 0 walter-benjamin.md => walter benjamin.md | 0 ward-cunningham.md => ward cunningham.md | 0 warren-mcculloch.md => warren mcculloch.md | 0 waterfall-chart.md => waterfall chart.md | 0 waterfall-charts.md => waterfall charts.md | 0 web-annotations.md => web annotations.md | 0 web-browser.md => web browser.md | 0 web-browsers.md => web browsers.md | 0 web-dubois.md => web dubois.md | 0 web-extension.md => web extension.md | 0 web-extensions.md => web extensions.md | 0 web-monetization.md => web monetization.md | 0 week-12.md => week 12.md | 0 weekend-11.md => weekend 11.md | 0 weekend-17.md => weekend 17.md | 0 weekend-wednesday.md => weekend wednesday.md | 0 weekly-plan.md => weekly plan.md | 0 weekly-reviews.md => weekly reviews.md | 0 welkin-core.md => welkin core.md | 0 wendy-doniger.md => wendy doniger.md | 0 wendy-hanamura.md => wendy hanamura.md | 0 ...=> what i do with my time on wednesdays.md | 0 ...> what is a distributed knowledge graph.md | 0 ...flancia-like.md => what is flancia like.md | 0 ...-shape-are-you.md => what shape are you.md | 0 what-the-hell.md => what the hell.md | 0 ...wrong.md => where did software go wrong.md | 0 ...ther languages should you learn and why.md | 0 ...ping-privilege.md => whipping privilege.md | 0 ...-buddhist.md => why i am not a buddhist.md | 0 ... worker cooperatives are a bad strategy.md | 0 wiki-engines.md => wiki engines.md | 0 wiki-modes.md => wiki modes.md | 0 ...-integration.md => wikidata integration.md | 0 ...ta-subsetting.md => wikidata subsetting.md | 0 wikilinked-tools.md => wikilinked tools.md | 0 wikilinking-tools.md => wikilinking tools.md | 0 ...s-everywhere.md => wikilinks everywhere.md | 0 will-walker.md => will walker.md | 0 william-james.md => william james.md | 0 william-macaskill.md => william macaskill.md | 0 ...an-der-gaast.md => wilmer van der gaast.md | 0 window-manager.md => window manager.md | 0 ...enstein plays chess with marcel duchamp.md | 0 ...ys-chess.md => wittgenstein plays chess.md | 0 ...in-protocol.md => wittgenstein protocol.md | 0 wonder-me.md => wonder me.md | 0 wong-kar-wai.md => wong kar wai.md | 0 work-after-work.md => work after work.md | 0 work-in-progress.md => work in progress.md | 0 work-in-public.md => work in public.md | 0 working-in-public.md => working in public.md | 0 world-building.md => world building.md | 0 world-improvement.md => world improvement.md | 0 ...chool.md => world university and school.md | 0 worry-dream.md => worry dream.md | 0 write-freely.md => write freely.md | 0 ...emory.md => writing is an aid to memory.md | 0 wu-ming.md => wu ming.md | 0 x-frame.md => x frame.md | 0 yancey-strickler.md => yancey strickler.md | 0 yoga-15.md => yoga 15.md | 0 yoga-17.md => yoga 17.md | 0 yoga-arrive.md => yoga arrive.md | 0 yoga-arrivr.md => yoga arrivr.md | 0 yoga-breath.md => yoga breath.md | 0 yoga-butt-kicking.md => yoga butt kicking.md | 0 ...-spinal-health.md => yoga spinal health.md | 0 yoga-with-adriene.md => yoga with adriene.md | 0 yotam-ottolenghi.md => yotam ottolenghi.md | 0 youtube-channel.md => youtube channel.md | 0 yuval-noah-harari.md => yuval noah harari.md | 0 ...geist-movement.md => zeitgeist movement.md | 0 ...r-s-mind.md => zen mind beginner s mind.md | 0 zeta-mask-yo.md => zeta mask yo.md | 0 zoom-games.md => zoom games.md | 0 ...matrix-bridge.md => zulip matrix bridge.md | 0 1916 files changed, 22 insertions(+), 53 deletions(-) rename 0-5-6.md => 0 5 6.md (100%) rename 0oo-li.md => 0oo li.md (100%) rename 1-rule.md => 1 rule.md (100%) rename 10-happier.md => 10 happier.md (100%) rename 13-sentinels-aegis-rim.md => 13 sentinels aegis rim.md (100%) rename 17-40.md => 17 40.md (100%) rename 1989-chilean-grape-scare.md => 1989 chilean grape scare.md (100%) rename 2020-04-03.md => 2020 04 03.md (100%) rename 2020-04-05.md => 2020 04 05.md (100%) rename 2020-04-06.md => 2020 04 06.md (100%) rename 2020-04-07.md => 2020 04 07.md (100%) rename 2020-04-09.md => 2020 04 09.md (100%) rename 2020-04-10.md => 2020 04 10.md (100%) rename 2020-04-11.md => 2020 04 11.md (100%) rename 2020-04-12.md => 2020 04 12.md (100%) rename 2020-04-13.md => 2020 04 13.md (100%) rename 2020-04-17.md => 2020 04 17.md (100%) rename 2020-04-18.md => 2020 04 18.md (100%) rename 2020-04-19.md => 2020 04 19.md (100%) rename 2020-04-22.md => 2020 04 22.md (100%) rename 2020-04-23.md => 2020 04 23.md (100%) rename 2020-04-24.md => 2020 04 24.md (100%) rename 2020-04-25.md => 2020 04 25.md (100%) rename 2020-04-26.md => 2020 04 26.md (100%) rename 2020-04-27.md => 2020 04 27.md (100%) rename 2020-05-01.md => 2020 05 01.md (100%) rename 2020-05-02.md => 2020 05 02.md (100%) rename 2020-05-03.md => 2020 05 03.md (100%) rename 2020-05-04.md => 2020 05 04.md (100%) rename 2020-05-05.md => 2020 05 05.md (100%) rename 2020-05-06.md => 2020 05 06.md (100%) rename 2020-05-07.md => 2020 05 07.md (100%) rename 2020-05-08.md => 2020 05 08.md (100%) rename 2020-05-09.md => 2020 05 09.md (100%) rename 2020-05-10.md => 2020 05 10.md (100%) rename 2020-05-15.md => 2020 05 15.md (100%) rename 2020-05-16.md => 2020 05 16.md (100%) rename 2020-05-17.md => 2020 05 17.md (100%) rename 2020-05-18.md => 2020 05 18.md (100%) rename 2020-05-19.md => 2020 05 19.md (100%) rename 2020-05-20.md => 2020 05 20.md (100%) rename 2020-05-21.md => 2020 05 21.md (100%) rename 2020-05-22.md => 2020 05 22.md (100%) rename 2020-05-23.md => 2020 05 23.md (100%) rename 2020-05-24.md => 2020 05 24.md (100%) rename 2020-06-01.md => 2020 06 01.md (100%) rename 2020-06-02.md => 2020 06 02.md (100%) rename 2020-06-03.md => 2020 06 03.md (100%) rename 2020-06-04.md => 2020 06 04.md (100%) rename 2020-06-06.md => 2020 06 06.md (100%) rename 2020-06-07.md => 2020 06 07.md (100%) rename 2020-06-08.md => 2020 06 08.md (100%) rename 2020-06-09.md => 2020 06 09.md (100%) rename 2020-06-10.md => 2020 06 10.md (100%) rename 2020-06-11.md => 2020 06 11.md (100%) rename 2020-06-12.md => 2020 06 12.md (100%) rename 2020-06-13.md => 2020 06 13.md (100%) rename 2020-06-14.md => 2020 06 14.md (100%) rename 2020-06-15.md => 2020 06 15.md (100%) rename 2020-06-16.md => 2020 06 16.md (100%) rename 2020-06-17.md => 2020 06 17.md (100%) rename 2020-06-18.md => 2020 06 18.md (100%) rename 2020-06-19.md => 2020 06 19.md (100%) rename 2020-06-20.md => 2020 06 20.md (100%) rename 2020-06-21.md => 2020 06 21.md (100%) rename 2020-06-24.md => 2020 06 24.md (100%) rename 2020-06-27.md => 2020 06 27.md (100%) rename 2020-06-28.md => 2020 06 28.md (100%) rename 2020-06-29.md => 2020 06 29.md (100%) rename 2020-07-04.md => 2020 07 04.md (100%) rename 2020-07-05.md => 2020 07 05.md (100%) rename 2020-07-06.md => 2020 07 06.md (100%) rename 2020-07-07.md => 2020 07 07.md (100%) rename 2020-07-08.md => 2020 07 08.md (100%) rename 2020-07-09.md => 2020 07 09.md (100%) rename 2020-07-10.md => 2020 07 10.md (100%) rename 2020-07-11.md => 2020 07 11.md (100%) rename 2020-07-12.md => 2020 07 12.md (100%) rename 2020-07-14.md => 2020 07 14.md (100%) rename 2020-07-15.md => 2020 07 15.md (100%) rename 2020-07-16.md => 2020 07 16.md (100%) rename 2020-07-17.md => 2020 07 17.md (100%) rename 2020-07-18.md => 2020 07 18.md (100%) rename 2020-07-19.md => 2020 07 19.md (100%) rename 2020-07-20.md => 2020 07 20.md (100%) rename 2020-07-21.md => 2020 07 21.md (100%) rename 2020-07-22.md => 2020 07 22.md (100%) rename 2020-07-23.md => 2020 07 23.md (100%) rename 2020-07-24.md => 2020 07 24.md (100%) rename 2020-07-25.md => 2020 07 25.md (100%) rename 2020-07-26.md => 2020 07 26.md (100%) rename 2020-07-27.md => 2020 07 27.md (100%) rename 2020-07-29.md => 2020 07 29.md (100%) rename 2020-07-30.md => 2020 07 30.md (100%) rename 2020-07-31.md => 2020 07 31.md (100%) rename 2020-08-01.md => 2020 08 01.md (100%) rename 2020-08-02.md => 2020 08 02.md (100%) rename 2020-08-03.md => 2020 08 03.md (100%) rename 2020-08-04.md => 2020 08 04.md (100%) rename 2020-08-05.md => 2020 08 05.md (100%) rename 2020-08-06.md => 2020 08 06.md (100%) rename 2020-08-07.md => 2020 08 07.md (100%) rename 2020-08-08.md => 2020 08 08.md (100%) rename 2020-08-09.md => 2020 08 09.md (100%) rename 2020-08-10.md => 2020 08 10.md (100%) rename 2020-08-11.md => 2020 08 11.md (100%) rename 2020-08-12.md => 2020 08 12.md (100%) rename 2020-08-13.md => 2020 08 13.md (100%) rename 2020-08-14.md => 2020 08 14.md (100%) rename 2020-08-15.md => 2020 08 15.md (100%) rename 2020-08-16.md => 2020 08 16.md (100%) rename 2020-08-17.md => 2020 08 17.md (100%) rename 2020-08-18.md => 2020 08 18.md (100%) rename 2020-08-19.md => 2020 08 19.md (100%) rename 2020-08-20.md => 2020 08 20.md (100%) rename 2020-08-21.md => 2020 08 21.md (100%) rename 2020-08-22.md => 2020 08 22.md (100%) rename 2020-08-23.md => 2020 08 23.md (100%) rename 2020-08-24.md => 2020 08 24.md (100%) rename 2020-08-25.md => 2020 08 25.md (100%) rename 2020-08-26.md => 2020 08 26.md (100%) rename 2020-08-27.md => 2020 08 27.md (100%) rename 2020-08-28.md => 2020 08 28.md (100%) rename 2020-08-29.md => 2020 08 29.md (100%) rename 2020-08-30.md => 2020 08 30.md (100%) rename 2020-08-31.md => 2020 08 31.md (100%) rename 2020-09-01.md => 2020 09 01.md (100%) rename 2020-09-02.md => 2020 09 02.md (100%) rename 2020-09-03.md => 2020 09 03.md (100%) rename 2020-09-04.md => 2020 09 04.md (100%) rename 2020-09-05.md => 2020 09 05.md (100%) rename 2020-09-06.md => 2020 09 06.md (100%) rename 2020-09-07.md => 2020 09 07.md (100%) rename 2020-09-08.md => 2020 09 08.md (100%) rename 2020-09-09.md => 2020 09 09.md (100%) rename 2020-09-10.md => 2020 09 10.md (100%) rename 2020-09-11.md => 2020 09 11.md (100%) rename 2020-09-12.md => 2020 09 12.md (100%) rename 2020-09-13.md => 2020 09 13.md (100%) rename 2020-09-14.md => 2020 09 14.md (100%) rename 2020-09-15.md => 2020 09 15.md (100%) rename 2020-09-16.md => 2020 09 16.md (100%) rename 2020-09-17.md => 2020 09 17.md (100%) rename 2020-09-18.md => 2020 09 18.md (100%) rename 2020-09-19.md => 2020 09 19.md (100%) rename 2020-09-20.md => 2020 09 20.md (100%) rename 2020-09-21.md => 2020 09 21.md (100%) rename 2020-09-22.md => 2020 09 22.md (100%) rename 2020-09-23.md => 2020 09 23.md (100%) rename 2020-09-24.md => 2020 09 24.md (100%) rename 2020-09-25.md => 2020 09 25.md (100%) rename 2020-09-26.md => 2020 09 26.md (100%) rename 2020-09-27.md => 2020 09 27.md (100%) rename 2020-09-28.md => 2020 09 28.md (100%) rename 2020-09-29.md => 2020 09 29.md (100%) rename 2020-09-30.md => 2020 09 30.md (100%) rename 2020-10-01.md => 2020 10 01.md (100%) rename 2020-10-02.md => 2020 10 02.md (100%) rename 2020-10-03.md => 2020 10 03.md (100%) rename 2020-10-04.md => 2020 10 04.md (100%) rename 2020-10-05.md => 2020 10 05.md (100%) rename 2020-10-06.md => 2020 10 06.md (100%) rename 2020-10-07.md => 2020 10 07.md (100%) rename 2020-10-08.md => 2020 10 08.md (100%) rename 2020-10-09.md => 2020 10 09.md (100%) rename 2020-10-10.md => 2020 10 10.md (100%) rename 2020-10-11.md => 2020 10 11.md (100%) rename 2020-10-12.md => 2020 10 12.md (100%) rename 2020-10-13.md => 2020 10 13.md (100%) rename 2020-10-14.md => 2020 10 14.md (100%) rename 2020-10-15.md => 2020 10 15.md (100%) rename 2020-10-16.md => 2020 10 16.md (100%) rename 2020-10-17.md => 2020 10 17.md (100%) rename 2020-10-18.md => 2020 10 18.md (100%) rename 2020-10-19.md => 2020 10 19.md (100%) rename 2020-10-20.md => 2020 10 20.md (100%) rename 2020-10-21.md => 2020 10 21.md (100%) rename 2020-10-22.md => 2020 10 22.md (100%) rename 2020-10-23.md => 2020 10 23.md (100%) rename 2020-10-24.md => 2020 10 24.md (100%) rename 2020-10-25.md => 2020 10 25.md (100%) rename 2020-10-26.md => 2020 10 26.md (100%) rename 2020-10-27.md => 2020 10 27.md (100%) rename 2020-10-28.md => 2020 10 28.md (100%) rename 2020-10-29.md => 2020 10 29.md (100%) rename 2020-10-30.md => 2020 10 30.md (100%) rename 2020-10-31.md => 2020 10 31.md (100%) rename 2020-11-01.md => 2020 11 01.md (100%) rename 2020-11-02.md => 2020 11 02.md (100%) rename 2020-11-03.md => 2020 11 03.md (100%) rename 2020-11-04.md => 2020 11 04.md (100%) rename 2020-11-05.md => 2020 11 05.md (100%) rename 2020-11-06.md => 2020 11 06.md (100%) rename 2020-11-07.md => 2020 11 07.md (100%) rename 2020-11-08.md => 2020 11 08.md (100%) rename 2020-11-09.md => 2020 11 09.md (100%) rename 2020-11-10.md => 2020 11 10.md (100%) rename 2020-11-11.md => 2020 11 11.md (100%) rename 2020-11-12.md => 2020 11 12.md (100%) rename 2020-11-13.md => 2020 11 13.md (100%) rename 2020-11-14.md => 2020 11 14.md (100%) rename 2020-11-15.md => 2020 11 15.md (100%) rename 2020-11-16.md => 2020 11 16.md (100%) rename 2020-11-17.md => 2020 11 17.md (100%) rename 2020-11-18.md => 2020 11 18.md (100%) rename 2020-11-19.md => 2020 11 19.md (100%) rename 2020-11-20.md => 2020 11 20.md (100%) rename 2020-11-21.md => 2020 11 21.md (100%) rename 2020-11-22.md => 2020 11 22.md (100%) rename 2020-11-23.md => 2020 11 23.md (100%) rename 2020-11-24.md => 2020 11 24.md (100%) rename 2020-11-25.md => 2020 11 25.md (100%) rename 2020-11-26.md => 2020 11 26.md (100%) rename 2020-11-27.md => 2020 11 27.md (100%) rename 2020-11-28.md => 2020 11 28.md (100%) rename 2020-11-29.md => 2020 11 29.md (100%) rename 2020-11-30.md => 2020 11 30.md (100%) rename 2020-12-01.md => 2020 12 01.md (100%) rename 2020-12-02.md => 2020 12 02.md (100%) rename 2020-12-03.md => 2020 12 03.md (100%) rename 2020-12-04.md => 2020 12 04.md (100%) rename 2020-12-05.md => 2020 12 05.md (100%) rename 2020-12-06.md => 2020 12 06.md (100%) rename 2020-12-07.md => 2020 12 07.md (100%) rename 2020-12-08.md => 2020 12 08.md (100%) rename 2020-12-09.md => 2020 12 09.md (100%) rename 2020-12-10.md => 2020 12 10.md (100%) rename 2020-12-11.md => 2020 12 11.md (100%) rename 2020-12-12.md => 2020 12 12.md (100%) rename 2020-12-13.md => 2020 12 13.md (100%) rename 2020-12-14.md => 2020 12 14.md (100%) rename 2020-12-15.md => 2020 12 15.md (100%) rename 2020-12-16.md => 2020 12 16.md (100%) rename 2020-12-17.md => 2020 12 17.md (100%) rename 2020-12-18.md => 2020 12 18.md (100%) rename 2020-12-19.md => 2020 12 19.md (100%) rename 2020-12-20.md => 2020 12 20.md (100%) rename 2020-12-21.md => 2020 12 21.md (100%) rename 2020-12-22.md => 2020 12 22.md (100%) rename 2020-12-23.md => 2020 12 23.md (100%) rename 2020-12-24.md => 2020 12 24.md (100%) rename 2020-12-25.md => 2020 12 25.md (100%) rename 2020-12-26.md => 2020 12 26.md (100%) rename 2020-12-27.md => 2020 12 27.md (100%) rename 2020-12-28.md => 2020 12 28.md (100%) rename 2020-12-29.md => 2020 12 29.md (100%) rename 2020-12-30.md => 2020 12 30.md (100%) rename 2020-12-31.md => 2020 12 31.md (100%) rename 2021-01-01.md => 2021 01 01.md (100%) rename 2021-01-02.md => 2021 01 02.md (100%) rename 2021-01-03.md => 2021 01 03.md (100%) rename 2021-01-04.md => 2021 01 04.md (100%) rename 2021-01-05.md => 2021 01 05.md (100%) rename 2021-01-06.md => 2021 01 06.md (100%) rename 2021-01-07.md => 2021 01 07.md (100%) rename 2021-01-08.md => 2021 01 08.md (100%) rename 2021-01-09.md => 2021 01 09.md (100%) rename 2021-01-10.md => 2021 01 10.md (100%) rename 2021-01-11.md => 2021 01 11.md (100%) rename 2021-01-12.md => 2021 01 12.md (100%) rename 2021-01-13.md => 2021 01 13.md (100%) rename 2021-01-14.md => 2021 01 14.md (100%) rename 2021-01-15.md => 2021 01 15.md (100%) rename 2021-01-16.md => 2021 01 16.md (100%) rename 2021-01-17.md => 2021 01 17.md (100%) rename 2021-01-18.md => 2021 01 18.md (100%) rename 2021-01-19.md => 2021 01 19.md (100%) rename 2021-01-20.md => 2021 01 20.md (100%) rename 2021-01-21.md => 2021 01 21.md (100%) rename 2021-01-22.md => 2021 01 22.md (100%) rename 2021-01-23.md => 2021 01 23.md (100%) rename 2021-01-24.md => 2021 01 24.md (100%) rename 2021-01-25.md => 2021 01 25.md (100%) rename 2021-01-26.md => 2021 01 26.md (100%) rename 2021-01-27.md => 2021 01 27.md (100%) rename 2021-01-28.md => 2021 01 28.md (100%) rename 2021-01-29.md => 2021 01 29.md (100%) rename 2021-01-30.md => 2021 01 30.md (100%) rename 2021-01-31.md => 2021 01 31.md (100%) rename 2021-02-01.md => 2021 02 01.md (100%) rename 2021-02-02.md => 2021 02 02.md (100%) rename 2021-02-03.md => 2021 02 03.md (100%) rename 2021-02-04.md => 2021 02 04.md (100%) rename 2021-02-05.md => 2021 02 05.md (100%) rename 2021-02-06.md => 2021 02 06.md (100%) rename 2021-02-07.md => 2021 02 07.md (100%) rename 2021-02-08.md => 2021 02 08.md (100%) rename 2021-02-09.md => 2021 02 09.md (100%) rename 2021-02-10.md => 2021 02 10.md (100%) rename 2021-02-11.md => 2021 02 11.md (100%) rename 2021-02-12.md => 2021 02 12.md (100%) rename 2021-02-13.md => 2021 02 13.md (100%) rename 2021-02-14.md => 2021 02 14.md (100%) rename 2021-02-15.md => 2021 02 15.md (100%) rename 2021-02-16.md => 2021 02 16.md (100%) rename 2021-02-17.md => 2021 02 17.md (100%) rename 2021-02-18.md => 2021 02 18.md (100%) rename 2021-02-19.md => 2021 02 19.md (100%) rename 2021-02-20.md => 2021 02 20.md (100%) rename 2021-02-21.md => 2021 02 21.md (100%) rename 2021-02-22.md => 2021 02 22.md (100%) rename 2021-02-23.md => 2021 02 23.md (100%) rename 2021-02-24.md => 2021 02 24.md (100%) rename 2021-02-25.md => 2021 02 25.md (100%) rename 2021-02-26.md => 2021 02 26.md (100%) rename 2021-02-27.md => 2021 02 27.md (100%) rename 2021-02-28.md => 2021 02 28.md (100%) rename 2021-03-01.md => 2021 03 01.md (100%) rename 2021-03-02.md => 2021 03 02.md (100%) rename 2021-03-03.md => 2021 03 03.md (100%) rename 2021-03-04.md => 2021 03 04.md (100%) rename 2021-03-05.md => 2021 03 05.md (100%) rename 2021-03-06.md => 2021 03 06.md (100%) rename 2021-03-07.md => 2021 03 07.md (100%) rename 2021-03-08.md => 2021 03 08.md (100%) rename 2021-03-09.md => 2021 03 09.md (100%) rename 2021-03-10.md => 2021 03 10.md (100%) rename 2021-03-11.md => 2021 03 11.md (100%) rename 2021-03-12.md => 2021 03 12.md (100%) rename 2021-03-13.md => 2021 03 13.md (100%) rename 2021-03-14.md => 2021 03 14.md (100%) rename 2021-03-15.md => 2021 03 15.md (100%) rename 2021-03-16.md => 2021 03 16.md (100%) rename 2021-03-17.md => 2021 03 17.md (100%) rename 2021-03-18.md => 2021 03 18.md (100%) rename 2021-03-19.md => 2021 03 19.md (100%) rename 2021-03-20.md => 2021 03 20.md (100%) rename 2021-03-21.md => 2021 03 21.md (100%) rename 2021-03-22.md => 2021 03 22.md (100%) rename 2021-03-23.md => 2021 03 23.md (100%) rename 2021-03-24.md => 2021 03 24.md (100%) rename 2021-03-25.md => 2021 03 25.md (100%) rename 2021-03-26.md => 2021 03 26.md (100%) rename 2021-03-27.md => 2021 03 27.md (100%) rename 2021-03-28.md => 2021 03 28.md (100%) rename 2021-03-29.md => 2021 03 29.md (100%) rename 2021-03-30.md => 2021 03 30.md (100%) rename 2021-03-31.md => 2021 03 31.md (100%) rename 2021-04-01.md => 2021 04 01.md (100%) rename 2021-04-02.md => 2021 04 02.md (100%) rename 2021-04-03.md => 2021 04 03.md (100%) rename 2021-04-05.md => 2021 04 05.md (100%) rename 2021-04-06.md => 2021 04 06.md (100%) rename 2021-04-07.md => 2021 04 07.md (100%) rename 2021-04-08.md => 2021 04 08.md (100%) rename 2021-04-09.md => 2021 04 09.md (100%) rename 2021-04-10.md => 2021 04 10.md (100%) rename 2021-04-11.md => 2021 04 11.md (100%) rename 2021-04-12.md => 2021 04 12.md (100%) rename 2021-04-13.md => 2021 04 13.md (100%) rename 2021-04-14.md => 2021 04 14.md (100%) rename 2021-04-15.md => 2021 04 15.md (100%) rename 2021-04-16.md => 2021 04 16.md (100%) rename 2021-04-17.md => 2021 04 17.md (100%) rename 2021-04-18.md => 2021 04 18.md (100%) rename 2021-04-19.md => 2021 04 19.md (100%) rename 2021-04-20.md => 2021 04 20.md (100%) rename 2021-04-21.md => 2021 04 21.md (100%) rename 2021-04-22.md => 2021 04 22.md (100%) rename 2021-04-23.md => 2021 04 23.md (100%) rename 2021-04-24.md => 2021 04 24.md (100%) rename 2021-04-25.md => 2021 04 25.md (100%) rename 2021-04-27.md => 2021 04 27.md (100%) rename 2021-04-28.md => 2021 04 28.md (100%) rename 2021-04-29.md => 2021 04 29.md (100%) rename 2021-04-30.md => 2021 04 30.md (100%) rename 2021-05-01.md => 2021 05 01.md (100%) rename 2021-05-02.md => 2021 05 02.md (100%) rename 2021-05-03.md => 2021 05 03.md (100%) rename 2021-05-04.md => 2021 05 04.md (100%) rename 2021-05-05.md => 2021 05 05.md (100%) rename 2021-05-06.md => 2021 05 06.md (100%) rename 2021-05-07.md => 2021 05 07.md (100%) rename 2021-eneri.md => 2021 eneri.md (100%) rename 2021-storming-of-the-united-states-capitol.md => 2021 storming of the united states capitol.md (100%) rename 50-minute-pomodoro.md => 50 minute pomodoro.md (100%) rename 62-modelo-para-armar.md => 62 modelo para armar.md (100%) rename 80-time.md => 80 time.md (100%) rename a-bicycle-for-our-minds.md => a bicycle for our minds.md (100%) rename a-cheatsheet-on-discourse.md => a cheatsheet on discourse.md (100%) rename a-cyborg-manifesto.md => a cyborg manifesto.md (100%) rename a-declaration-of-the-independence-of-cyberspace.md => a declaration of the independence of cyberspace.md (100%) rename a-fika-monster.md => a fika monster.md (100%) rename a-fortiori.md => a fortiori.md (100%) rename a-glastonbury-romance.md => a glastonbury romance.md (100%) rename a-naive-plan-for-a-freer-internet.md => a naive plan for a freer internet.md (100%) rename a-neither.md => a neither.md (100%) rename a-new-kind-of-science.md => a new kind of science.md (100%) rename a-note-taking-problem-and-a-proposed-solution.md => a note taking problem and a proposed solution.md (100%) rename a-pattern-language.md => a pattern language.md (100%) rename a-typo.md => a typo.md (100%) rename a-view-of-the-agora-at-a-node-is-a-comonad.md => a view of the agora at a node is a comonad.md (100%) rename a-yawning-cat.md => a yawning cat.md (100%) rename aaron-swartz.md => aaron swartz.md (100%) rename abolition-of-the-state.md => abolition of the state.md (100%) rename aborto-legal.md => aborto legal.md (100%) rename abstract-fairy.md => abstract fairy.md (100%) rename aby-warburg.md => aby warburg.md (100%) rename academic-urban-legends.md => academic urban legends.md (100%) rename aceite-de-coco.md => aceite de coco.md (100%) rename acid-banger.md => acid banger.md (100%) rename act-well.md => act well.md (100%) rename active-recall.md => active recall.md (100%) rename acts-of-flancia.md => acts of flancia.md (100%) rename adam-fitchett.md => adam fitchett.md (100%) rename add-service.md => add service.md (100%) rename addheader-py.md => addheader py.md (100%) rename adenosine-triphosphate.md => adenosine triphosphate.md (100%) rename adriene-mishler.md => adriene mishler.md (100%) rename adversarial-interoperability.md => adversarial interoperability.md (100%) rename advisory-opinion.md => advisory opinion.md (100%) rename adán-buenosayres.md => adán buenosayres.md (100%) rename agnes-cameron.md => agnes cameron.md (100%) rename agnès-varda.md => agnès varda.md (100%) rename agora-0-5-1.md => agora 0 5 1.md (100%) rename agora-action.md => agora action.md (100%) rename agora-actions.md => agora actions.md (100%) rename agora-algorithm.md => agora algorithm.md (100%) rename agora-bot.md => agora bot.md (100%) rename agora-bridge.md => agora bridge.md (100%) rename agora-cli.md => agora cli.md (100%) rename agora-client.md => agora client.md (100%) rename agora-clients.md => agora clients.md (100%) rename agora-comments.md => agora comments.md (100%) rename agora-ctzn.md => agora ctzn.md (100%) rename agora-design.md => agora design.md (100%) rename agora-development.md => agora development.md (100%) rename agora-discuss.md => agora discuss.md (100%) rename agora-editor.md => agora editor.md (100%) rename agora-editors.md => agora editors.md (100%) rename agora-embed.md => agora embed.md (100%) rename agora-es.md => agora es.md (100%) rename agora-ext.md => agora ext.md (100%) rename agora-feature-requests.md => agora feature requests.md (100%) rename agora-fediverse-integration.md => agora fediverse integration.md (100%) rename agora-feeds.md => agora feeds.md (100%) rename agora-for-ea.md => agora for ea.md (100%) rename agora-fuzzy-matching.md => agora fuzzy matching.md (100%) rename agora-fw.md => agora fw.md (100%) rename agora-go-links-integration.md => agora go links integration.md (100%) rename agora-graph.md => agora graph.md (100%) rename agora-graphs.md => agora graphs.md (100%) rename agora-help.md => agora help.md (100%) rename agora-hn.md => agora hn.md (100%) rename agora-howto.md => agora howto.md (100%) rename agora-hub.md => agora hub.md (100%) rename agora-hypothesis-integration.md => agora hypothesis integration.md (100%) rename agora-hypothesis.md => agora hypothesis.md (100%) rename agora-install.md => agora install.md (100%) rename agora-integration.md => agora integration.md (100%) rename agora-js.md => agora js.md (100%) rename agora-like.md => agora like.md (100%) rename agora-links.md => agora links.md (100%) rename agora-mastodon-integration.md => agora mastodon integration.md (100%) rename agora-music.md => agora music.md (100%) rename agora-pkmchat.md => agora pkmchat.md (100%) rename agora-plan.md => agora plan.md (100%) rename agora-polls.md => agora polls.md (100%) rename agora-promnesia.md => agora promnesia.md (100%) rename agora-protocol.md => agora protocol.md (100%) rename agora-publishing.md => agora publishing.md (100%) rename agora-push.md => agora push.md (100%) rename agora-reading-club.md => agora reading club.md (100%) rename agora-recipes.md => agora recipes.md (100%) rename agora-repository.md => agora repository.md (100%) rename agora-rfc.md => agora rfc.md (100%) rename agora-rfcs.md => agora rfcs.md (100%) rename agora-seach.md => agora seach.md (100%) rename agora-search.md => agora search.md (100%) rename agora-server.md => agora server.md (100%) rename agora-settings.md => agora settings.md (100%) rename agora-setup.md => agora setup.md (100%) rename agora-slides.md => agora slides.md (100%) rename agora-tree-example.md => agora tree example.md (100%) rename agora-trees.md => agora trees.md (100%) rename agora-twitter-integration.md => agora twitter integration.md (100%) rename agora-v0-5.md => agora v0 5.md (100%) rename agora-v1.md => agora v1.md (100%) rename agora-version.md => agora version.md (100%) rename agora-vscode.md => agora vscode.md (100%) rename agora-wiki.md => agora wiki.md (100%) rename agora-yaml.md => agora yaml.md (100%) rename agora-youtube-integration.md => agora youtube integration.md (100%) delete mode 100644 agora-convention.md rename aharonov-bohm-effect.md => aharonov bohm effect.md (100%) rename ai-dungeon.md => ai dungeon.md (100%) rename airto-moreira.md => airto moreira.md (100%) rename alan-laidlaw.md => alan laidlaw.md (100%) rename alan-watts.md => alan watts.md (100%) rename albert-laszlo-barabasi.md => albert laszlo barabasi.md (100%) rename albin-zollinger.md => albin zollinger.md (100%) rename alexander-huber.md => alexander huber.md (100%) rename algernon-argument.md => algernon argument.md (100%) rename ali-abdaal.md => ali abdaal.md (100%) rename all-about-circuits.md => all about circuits.md (100%) rename all-day.md => all day.md (100%) rename all-night.md => all night.md (100%) rename all-possible-wikilinks.md => all possible wikilinks.md (100%) rename all-together-now.md => all together now.md (100%) rename all-tomorrows-parties.md => all tomorrows parties.md (100%) rename allegory-of-the-cave.md => allegory of the cave.md (100%) rename alvin-zollinger.md => alvin zollinger.md (100%) rename amateur-utopian.md => amateur utopian.md (100%) rename amit-dutta.md => amit dutta.md (100%) rename américa-latina-en-movimiento.md => américa latina en movimiento.md (100%) rename an-agora.md => an agora.md (100%) rename an-open-letter-to-an-open-nation.md => an open letter to an open nation.md (100%) rename ana-roxanne.md => ana roxanne.md (100%) rename ana-ulin.md => ana ulin.md (100%) rename anar-chi-st.md => anar chi st.md (100%) rename anarcho-anarcho-capitalist.md => anarcho anarcho capitalist.md (100%) rename anarcho-capitalism.md => anarcho capitalism.md (100%) rename anarcho-communism.md => anarcho communism.md (100%) rename anarcho-syncretism.md => anarcho syncretism.md (100%) rename anarchy-in-action.md => anarchy in action.md (100%) rename andi-nachon.md => andi nachon.md (100%) rename andrei-ciortea.md => andrei ciortea.md (100%) rename andrew-burton.md => andrew burton.md (100%) rename andrew-marantz.md => andrew marantz.md (100%) rename andrew-yang.md => andrew yang.md (100%) rename andy-matuschak.md => andy matuschak.md (100%) rename anil-seth.md => anil seth.md (100%) rename anirudh-badri.md => anirudh badri.md (100%) rename anna-gat.md => anna gat.md (100%) rename annotated-hub-of-science.md => annotated hub of science.md (100%) rename annotation-standard.md => annotation standard.md (100%) rename anti-civ.md => anti civ.md (100%) rename anti-fascist.md => anti fascist.md (100%) rename anti-libraries.md => anti libraries.md (100%) rename apache-marmotta.md => apache marmotta.md (100%) rename aprender-de-grandes.md => aprender de grandes.md (100%) rename arabian-nights.md => arabian nights.md (100%) rename arcades-project.md => arcades project.md (100%) rename argentina-has-some-vaporwave-powerhouses.md => argentina has some vaporwave powerhouses.md (100%) rename armengol-altayo.md => armengol altayo.md (100%) rename armengol-flancian.md => armengol flancian.md (100%) rename armengol-lorand.md => armengol lorand.md (100%) rename arnold-schrijver.md => arnold schrijver.md (100%) rename art-blakey.md => art blakey.md (100%) rename arti-walker-peddakotla.md => arti walker peddakotla.md (100%) rename asado-verbal.md => asado verbal.md (100%) rename astor-piazzolla.md => astor piazzolla.md (100%) rename async-art.md => async art.md (100%) rename async-chat.md => async chat.md (100%) rename at-the-dam.md => at the dam.md (100%) rename athens-research.md => athens research.md (100%) rename atomic-search.md => atomic search.md (100%) rename attack-on-titan.md => attack on titan.md (100%) rename audio-recorder.md => audio recorder.md (100%) rename augmenting-human-intellect.md => augmenting human intellect.md (100%) rename auto-commit-messages.md => auto commit messages.md (100%) rename auto-push.md => auto push.md (100%) rename auto-wikilinking.md => auto wikilinking.md (100%) rename aventine-keyhole.md => aventine keyhole.md (100%) rename avi-weiss.md => avi weiss.md (100%) rename awesome-foundation.md => awesome foundation.md (100%) rename ayn-rand.md => ayn rand.md (100%) rename azlen-elza.md => azlen elza.md (100%) rename b-a.md => b a.md (100%) rename b-enterprises.md => b enterprises.md (100%) rename back-problems.md => back problems.md (100%) rename balafon-sketches.md => balafon sketches.md (100%) rename bart-kosko.md => bart kosko.md (100%) rename basic-income.md => basic income.md (100%) rename bassel-khartabil.md => bassel khartabil.md (100%) rename battle-of-dyrrhachium.md => battle of dyrrhachium.md (100%) rename battle-of-pharsalus.md => battle of pharsalus.md (100%) rename beaker-browser.md => beaker browser.md (100%) rename bearer-of-good-news.md => bearer of good news.md (100%) rename being-open.md => being open.md (100%) rename bell-evans.md => bell evans.md (100%) rename ben-chase.md => ben chase.md (100%) rename ben-congdon.md => ben congdon.md (100%) rename ben-shapiro.md => ben shapiro.md (100%) rename bendini-fettuccini.md => bendini fettuccini.md (100%) rename benedict-lau.md => benedict lau.md (100%) rename benefolent-director-for-life.md => benefolent director for life.md (100%) rename benevolent-dictator-for-life.md => benevolent dictator for life.md (100%) rename benevolent-director-for-life.md => benevolent director for life.md (100%) rename benjamin-franklin.md => benjamin franklin.md (100%) rename berkeley-anarchist-group.md => berkeley anarchist group.md (100%) rename best-sci-fi-movies.md => best sci fi movies.md (100%) rename better-ranking.md => better ranking.md (100%) rename big-blue-button.md => big blue button.md (100%) rename big-in-japan.md => big in japan.md (100%) rename bill-evans.md => bill evans.md (100%) rename bill-seitz.md => bill seitz.md (100%) rename binding-chaos.md => binding chaos.md (100%) rename bird-feeder.md => bird feeder.md (100%) rename blackbox-exporter.md => blackbox exporter.md (100%) rename blob-opera.md => blob opera.md (100%) rename block-references.md => block references.md (100%) rename blockchain-chicken-farm.md => blockchain chicken farm.md (100%) rename blue-lp.md => blue lp.md (100%) rename blue-oak.md => blue oak.md (100%) rename bodhisattva-vow.md => bodhisattva vow.md (100%) rename bolo-bolo.md => bolo bolo.md (100%) rename book-club.md => book club.md (100%) rename book-of-the-new-sun.md => book of the new sun.md (100%) rename boos-did-911.md => boos did 911.md (100%) rename borges-por-piglia.md => borges por piglia.md (100%) rename boris-mann.md => boris mann.md (100%) rename botsin-space.md => botsin space.md (100%) rename brandenburg-concertos.md => brandenburg concertos.md (100%) rename brassica-oleracea.md => brassica oleracea.md (100%) rename breath-of-desire.md => breath of desire.md (100%) rename bret-weinstein.md => bret weinstein.md (100%) rename brian-kernighan.md => brian kernighan.md (100%) rename brian-moriarty.md => brian moriarty.md (100%) rename bright-mind.md => bright mind.md (100%) rename brontë-sisters.md => brontë sisters.md (100%) rename brother-mfc-l2710dw.md => brother mfc l2710dw.md (100%) rename brown-noise.md => brown noise.md (100%) rename brownian-motion.md => brownian motion.md (100%) rename browser-extension.md => browser extension.md (100%) rename browser-extensions.md => browser extensions.md (100%) rename bruno-winck.md => bruno winck.md (100%) rename buddhist-geeks.md => buddhist geeks.md (100%) rename buenos-aires.md => buenos aires.md (100%) rename build-bridges.md => build bridges.md (100%) rename building-an-agora.md => building an agora.md (100%) rename burma-shave.md => burma shave.md (100%) rename burning-bridges.md => burning bridges.md (100%) rename buscarle-profesor-de-inglés-online-a-mamá.md => buscarle profesor de inglés online a mamá.md (100%) rename busy-cafe.md => busy cafe.md (100%) rename cameras-and-lenses.md => cameras and lenses.md (100%) rename can-t-break-your-heart.md => can t break your heart.md (100%) rename can-t-get-you-out-of-my-head.md => can t get you out of my head.md (100%) rename cant-break-your-heart.md => cant break your heart.md (100%) rename cant-get-you-out-of-my-head.md => cant get you out of my head.md (100%) rename capsule-wardrobe.md => capsule wardrobe.md (100%) rename caramel-city.md => caramel city.md (100%) rename care-home-that-looks-like-a-town.md => care home that looks like a town.md (100%) rename carlo-ginzburg.md => carlo ginzburg.md (100%) rename carrot-cake.md => carrot cake.md (100%) rename casa-común.md => casa común.md (100%) rename casio-fw-91.md => casio fw 91.md (100%) rename cat-heroin.md => cat heroin.md (100%) rename cat-roulette.md => cat roulette.md (100%) rename cat-vibing.md => cat vibing.md (100%) rename catalog-of-missing-devices.md => catalog of missing devices.md (100%) rename category-theory-for-engineers.md => category theory for engineers.md (100%) rename category-theory-for-programmers.md => category theory for programmers.md (100%) rename category-theory.md => category theory.md (100%) rename caterina-barbieri.md => caterina barbieri.md (100%) rename center-for-land-use-interpretation.md => center for land use interpretation.md (100%) rename central-mid-levels-escalator.md => central mid levels escalator.md (100%) rename chandra-easton.md => chandra easton.md (100%) rename change-the-world.md => change the world.md (100%) rename charles-stanhop.md => charles stanhop.md (100%) rename charles-stanhope.md => charles stanhope.md (100%) rename chat-mode.md => chat mode.md (100%) rename chatham-house-rule.md => chatham house rule.md (100%) rename chatting-with-glue.md => chatting with glue.md (100%) rename cheeses-of-europe.md => cheeses of europe.md (100%) rename chemical-freeze.md => chemical freeze.md (100%) rename chess-hypothesis.md => chess hypothesis.md (100%) rename chesterton-s-fence.md => chesterton s fence.md (100%) rename chestertons-fence.md => chestertons fence.md (100%) rename china-a-century-of-revolution.md => china a century of revolution.md (100%) rename chongli-qin.md => chongli qin.md (100%) rename choose-the-closest.md => choose the closest.md (100%) rename choose-your-own-adventure.md => choose your own adventure.md (100%) rename chris-aldrich.md => chris aldrich.md (100%) delete mode 100644 chris-moyé.md rename christopher-alexander-reading-group.md => christopher alexander reading group.md (100%) rename christopher-alexander.md => christopher alexander.md (100%) rename christopher-priest.md => christopher priest.md (100%) rename chrome-remote-desktop.md => chrome remote desktop.md (100%) rename chu-bu-and-sheemish.md => chu bu and sheemish.md (100%) rename chögyam-trungpa.md => chögyam trungpa.md (100%) rename cimbalom-street-musicians.md => cimbalom street musicians.md (100%) rename cinco-años.md => cinco años.md (100%) rename clay-shirky.md => clay shirky.md (100%) rename cleo-from-5-to-7.md => cleo from 5 to 7.md (100%) rename clipboard-management.md => clipboard management.md (100%) rename closer-to-truth.md => closer to truth.md (100%) rename coconut-oil.md => coconut oil.md (100%) rename code-server.md => code server.md (100%) rename codex-editor.md => codex editor.md (100%) rename coding-projects.md => coding projects.md (100%) rename cognitive-load.md => cognitive load.md (100%) rename colin-the-mathmo.md => colin the mathmo.md (100%) rename colin-turner.md => colin turner.md (100%) rename colin-ward.md => colin ward.md (100%) rename colors-of-noise.md => colors of noise.md (100%) rename command-k.md => command k.md (100%) rename command-line-interface.md => command line interface.md (100%) rename commit-template.md => commit template.md (100%) rename complainer-bot.md => complainer bot.md (100%) rename complementary-cognitive-artifact.md => complementary cognitive artifact.md (100%) rename complementary-cognitive-artifacts.md => complementary cognitive artifacts.md (100%) rename complex-system.md => complex system.md (100%) rename composite-go-links.md => composite go links.md (100%) rename computer-system.md => computer system.md (100%) rename computers-and-creativity.md => computers and creativity.md (100%) rename concepts-techniques-and-models-of-computer-programming.md => concepts techniques and models of computer programming.md (100%) rename conflict-vs-mistake.md => conflict vs mistake.md (100%) rename connor-st-george.md => connor st george.md (100%) rename conscious-beings.md => conscious beings.md (100%) rename context-collapse.md => context collapse.md (100%) rename controversy-in-philosophy.md => controversy in philosophy.md (100%) rename conversations-with-myself.md => conversations with myself.md (100%) rename cookie-clicker.md => cookie clicker.md (100%) rename cool-retro-term.md => cool retro term.md (100%) rename cooperative-problem-solving.md => cooperative problem solving.md (100%) rename cooperative-systems.md => cooperative systems.md (100%) rename coordination-problems.md => coordination problems.md (100%) rename coreutils-decoded.md => coreutils decoded.md (100%) rename cory-doctorow.md => cory doctorow.md (100%) rename count-my-blessings.md => count my blessings.md (100%) rename covid-19-game.md => covid 19 game.md (100%) rename covid-19.md => covid 19.md (100%) rename covid-tracker.md => covid tracker.md (100%) rename crack-azw.md => crack azw.md (100%) rename creamy-ricotta-pasta-with-broccoli.md => creamy ricotta pasta with broccoli.md (100%) rename creative-commons-attribution-sharealike-4-0-international.md => creative commons attribution sharealike 4 0 international.md (100%) rename creative-commons.md => creative commons.md (100%) rename critique-of-worker-coops.md => critique of worker coops.md (100%) rename crowdsourced-chess.md => crowdsourced chess.md (100%) rename crowdsourced-filesystem.md => crowdsourced filesystem.md (100%) rename crowdsourced-search.md => crowdsourced search.md (100%) rename crush-capitalism.md => crush capitalism.md (100%) rename cultural-shift.md => cultural shift.md (100%) rename curtin-yarvin.md => curtin yarvin.md (100%) rename cybenetic-surveillant.md => cybenetic surveillant.md (100%) rename cyberfeminist-index.md => cyberfeminist index.md (100%) rename cybernetic-toaster.md => cybernetic toaster.md (100%) rename cyborg-manifesto.md => cyborg manifesto.md (100%) rename d-annunzio.md => d annunzio.md (100%) rename d-p.md => d p.md (100%) rename d-t-suzuki.md => d t suzuki.md (100%) rename dahlem-botanical-gardens.md => dahlem botanical gardens.md (100%) rename dallas-buyers-club.md => dallas buyers club.md (100%) rename dan-brown.md => dan brown.md (100%) rename dan-harris.md => dan harris.md (100%) rename dan-squier.md => dan squier.md (100%) rename dan-whaley.md => dan whaley.md (100%) rename daniel-armengol-altayo.md => daniel armengol altayo.md (100%) rename daniel-slutsky.md => daniel slutsky.md (100%) rename danielle-baskin.md => danielle baskin.md (100%) rename dark-horse-duo.md => dark horse duo.md (100%) rename dark-mode.md => dark mode.md (100%) rename daryl-davis.md => daryl davis.md (100%) rename data-runner.md => data runner.md (100%) rename david-allen.md => david allen.md (100%) rename david-eagleman.md => david eagleman.md (100%) rename david-gelernter.md => david gelernter.md (100%) rename david-krakauer.md => david krakauer.md (100%) rename david-mynors.md => david mynors.md (100%) rename day-job.md => day job.md (100%) rename days-of-being-wild.md => days of being wild.md (100%) rename decision-theory.md => decision theory.md (100%) rename deconstructing-sensory-experience.md => deconstructing sensory experience.md (100%) rename deconstructing-yourself.md => deconstructing yourself.md (100%) rename default-action.md => default action.md (100%) rename default-actions.md => default actions.md (100%) rename default-mode-network.md => default mode network.md (100%) rename defcon-radio.md => defcon radio.md (100%) rename democractic-confederalism.md => democractic confederalism.md (100%) rename democracy-earth.md => democracy earth.md (100%) rename dennis-ritchie.md => dennis ritchie.md (100%) rename denny-vrandecic.md => denny vrandecic.md (100%) rename denny-vrandečić.md => denny vrandečić.md (100%) rename deprecate-capitalism.md => deprecate capitalism.md (100%) rename derrick-broze.md => derrick broze.md (100%) rename desire-paths.md => desire paths.md (100%) rename devine-lu-linvega.md => devine lu linvega.md (100%) rename dialectical-method.md => dialectical method.md (100%) rename digital-garden-configuration.md => digital garden configuration.md (100%) rename digital-garden-standards.md => digital garden standards.md (100%) rename digital-garden.md => digital garden.md (100%) rename digital-gardeners.md => digital gardeners.md (100%) rename digital-gardens.md => digital gardens.md (100%) rename ding-levery.md => ding levery.md (100%) rename directed-acyclic-graph.md => directed acyclic graph.md (100%) rename dispatches-from-flancia.md => dispatches from flancia.md (100%) rename distributed-cognition.md => distributed cognition.md (100%) rename distributed-knowledge-grap.md => distributed knowledge grap.md (100%) rename distributed-knowledge-graph.md => distributed knowledge graph.md (100%) rename distributed-public-knowledge-graph.md => distributed public knowledge graph.md (100%) rename divinity-2-original-sin.md => divinity 2 original sin.md (100%) rename do-done-trees.md => do done trees.md (100%) rename dockside-market.md => dockside market.md (100%) rename doctor-who.md => doctor who.md (100%) rename document-mode.md => document mode.md (100%) rename doing-good-better.md => doing good better.md (100%) rename dollar-auction.md => dollar auction.md (100%) rename don-hopkins.md => don hopkins.md (100%) rename don-t-make-me-think.md => don t make me think.md (100%) rename donate-25.md => donate 25.md (100%) rename donate-effective-altruism.md => donate effective altruism.md (100%) rename donate-give-directly.md => donate give directly.md (100%) rename donna-haraway.md => donna haraway.md (100%) rename dos-minutos.md => dos minutos.md (100%) rename double-crux.md => double crux.md (100%) rename doug-engelbart.md => doug engelbart.md (100%) rename douglas-adams.md => douglas adams.md (100%) rename douglas-crockford.md => douglas crockford.md (100%) rename douglas-crowford.md => douglas crowford.md (100%) rename douglas-rushkoff.md => douglas rushkoff.md (100%) rename downward-dog.md => downward dog.md (100%) rename dr-kvj.md => dr kvj.md (100%) rename dread-pirate-roberts.md => dread pirate roberts.md (100%) rename drive-safe-homie.md => drive safe homie.md (100%) rename driven-to-distraction.md => driven to distraction.md (100%) rename duncan-jones.md => duncan jones.md (100%) rename dust-theory.md => dust theory.md (100%) rename dweb-principles.md => dweb principles.md (100%) rename dylan-steck.md => dylan steck.md (100%) rename dyokomizo-flancian.md => dyokomizo flancian.md (100%) rename e-c-b.md => e c b.md (100%) rename e-c-s.md => e c s.md (100%) rename eagxvirtual-2020.md => eagxvirtual 2020.md (100%) rename eberhard-licht.md => eberhard licht.md (100%) rename ecmascript-internal-property.md => ecmascript internal property.md (100%) rename eddie-higgins.md => eddie higgins.md (100%) rename edge-of-chaos.md => edge of chaos.md (100%) rename edges-of-illusion.md => edges of illusion.md (100%) rename effective-altruism-talk.md => effective altruism talk.md (100%) rename effective-altruism.md => effective altruism.md (100%) rename effortless-contact.md => effortless contact.md (100%) rename eggy-egregore.md => eggy egregore.md (100%) rename egypt-ethiopia-conflict.md => egypt ethiopia conflict.md (100%) rename eighteenth-century-poetry.md => eighteenth century poetry.md (100%) rename eishin-school.md => eishin school.md (100%) rename el-baile-moderno.md => el baile moderno.md (100%) rename el-bolsón.md => el bolsón.md (100%) rename el-candor-del-padre-brown.md => el candor del padre brown.md (100%) rename el-casal-catalá.md => el casal catalá.md (100%) rename el-evangelio-del-coyote.md => el evangelio del coyote.md (100%) rename el-narrador.md => el narrador.md (100%) rename el-problema-son-las-piedras-en-el-camino.md => el problema son las piedras en el camino.md (100%) rename el-pueblo-unido-jamás-será-vencido.md => el pueblo unido jamás será vencido.md (100%) rename electronic-frontier-foundation.md => electronic frontier foundation.md (100%) rename elinor-ostrom.md => elinor ostrom.md (100%) rename embrace-capitalism.md => embrace capitalism.md (100%) rename emerald-tablet.md => emerald tablet.md (100%) rename emmy-noether.md => emmy noether.md (100%) rename empresas-b.md => empresas b.md (100%) rename emre-ergin.md => emre ergin.md (100%) rename en-flancia-hay-un-agora.md => en flancia hay un agora.md (100%) rename encyclopedia-of-world-problems-and-human-potential.md => encyclopedia of world problems and human potential.md (100%) rename encyclopedia-of-world-problems.md => encyclopedia of world problems.md (100%) rename entropic-brain-hypothesis.md => entropic brain hypothesis.md (100%) rename epidemic-forecasting.md => epidemic forecasting.md (100%) rename eric-freeman.md => eric freeman.md (100%) rename eric-hoffer.md => eric hoffer.md (100%) rename eric-linus-kaplan.md => eric linus kaplan.md (100%) rename eric-r-weinstein.md => eric r weinstein.md (100%) rename eric-raymond.md => eric raymond.md (100%) rename eric-weinstein-with-brian-keating.md => eric weinstein with brian keating.md (100%) rename eric-weinstein.md => eric weinstein.md (100%) rename eric-weistein-with-brian-keating.md => eric weistein with brian keating.md (100%) rename erik-d-kennedy.md => erik d kennedy.md (100%) rename erik-kennedy.md => erik kennedy.md (100%) rename escenas-de-la-novela-argentina.md => escenas de la novela argentina.md (100%) rename escritos-herèticos.md => escritos herèticos.md (100%) rename escritos-heréticos.md => escritos heréticos.md (100%) rename escuela-de-aprendices.md => escuela de aprendices.md (100%) rename eternal-september.md => eternal september.md (100%) rename ethan-plante.md => ethan plante.md (100%) rename etherpad-plugins.md => etherpad plugins.md (100%) rename etherpad-wikilinks.md => etherpad wikilinks.md (100%) rename ethical-license.md => ethical license.md (100%) rename evan-thompson.md => evan thompson.md (100%) rename executive-bathroom.md => executive bathroom.md (100%) rename exists-forall.md => exists forall.md (100%) rename experimental-social-network.md => experimental social network.md (100%) rename extensible-redirects.md => extensible redirects.md (100%) rename external-chrome-extension.md => external chrome extension.md (100%) rename extropian-net.md => extropian net.md (100%) rename f-s-b.md => f s b.md (100%) rename fabien-gandon.md => fabien gandon.md (100%) rename facebook-is-a-doomsday-machine.md => facebook is a doomsday machine.md (100%) rename favourite-things.md => favourite things.md (100%) rename feature-requests.md => feature requests.md (100%) rename features-of-the-agora.md => features of the agora.md (100%) rename february-14th,-2020.md => february 14th, 2020.md (100%) rename federated-ecosystem.md => federated ecosystem.md (100%) rename federated-ecosystems.md => federated ecosystems.md (100%) rename federated-wiki.md => federated wiki.md (100%) rename fediverse-party.md => fediverse party.md (100%) rename fediverse-space.md => fediverse space.md (100%) rename fediverse-stoa.md => fediverse stoa.md (100%) rename fedstoa-bugs.md => fedstoa bugs.md (100%) rename felix-hoesch.md => felix hoesch.md (100%) rename feynman-lectures.md => feynman lectures.md (100%) rename fifth-international.md => fifth international.md (100%) rename fifth-precept.md => fifth precept.md (100%) rename fight-procrastination.md => fight procrastination.md (100%) rename filosofía-para-los-retos-contemporáneos.md => filosofía para los retos contemporáneos.md (100%) rename final-del-juego.md => final del juego.md (100%) rename firefox-nightly.md => firefox nightly.md (100%) rename firefox-qa.md => firefox qa.md (100%) rename first-stoa.md => first stoa.md (100%) rename fission-talks.md => fission talks.md (100%) rename fission-whitepaper.md => fission whitepaper.md (100%) rename five-o-clock.md => five o clock.md (100%) rename fix-500s.md => fix 500s.md (100%) rename fixing-it.md => fixing it.md (100%) rename fka-twigs.md => fka twigs.md (100%) rename flaeky-pancako.md => flaeky pancako.md (100%) rename flags-of-flancia.md => flags of flancia.md (100%) rename flammarion-engraving.md => flammarion engraving.md (100%) rename flancia-collective.md => flancia collective.md (100%) rename flancia-coop.md => flancia coop.md (100%) rename flancia-es.md => flancia es.md (100%) rename flancia-foundation.md => flancia foundation.md (100%) rename flancia-goals.md => flancia goals.md (100%) rename flancia-governance.md => flancia governance.md (100%) rename flancia-narrative.md => flancia narrative.md (100%) rename flancia-org.md => flancia org.md (100%) rename flancia-procedure.md => flancia procedure.md (100%) rename flancia-subtitles.md => flancia subtitles.md (100%) rename flancia-the-game.md => flancia the game.md (100%) rename flancia,-or-the-paradise-of-those-that-might-have-thrived.md => flancia, or the paradise of those that might have thrived.md (100%) rename flancian-feedback.md => flancian feedback.md (100%) rename flancian-in-merveilles.md => flancian in merveilles.md (100%) rename flaneur-browser.md => flaneur browser.md (100%) rename flourless-banana-bread.md => flourless banana bread.md (100%) rename flower-sermon.md => flower sermon.md (100%) rename foam-config.md => foam config.md (100%) rename foam-settings.md => foam settings.md (100%) rename foam-workspace.md => foam workspace.md (100%) rename focal-point.md => focal point.md (100%) rename fogg-behavior-model.md => fogg behavior model.md (100%) rename font-of-augurs.md => font of augurs.md (100%) rename force-directed-graphs.md => force directed graphs.md (100%) rename force-graph.md => force graph.md (100%) rename forge-fed.md => forge fed.md (100%) rename formal-logic.md => formal logic.md (100%) rename foucault-s-turtlenecks.md => foucault s turtlenecks.md (100%) rename foucaults-turtlenecks.md => foucaults turtlenecks.md (100%) rename four-quadrants.md => four quadrants.md (100%) rename four-quartets.md => four quartets.md (100%) rename fourth-international.md => fourth international.md (100%) rename frank-lloyd-wright.md => frank lloyd wright.md (100%) rename frantz-fanon.md => frantz fanon.md (100%) rename françoise-hardy.md => françoise hardy.md (100%) rename fred-bednarski.md => fred bednarski.md (100%) rename free-time.md => free time.md (100%) rename free-universal-construction-kit.md => free universal construction kit.md (100%) rename free-world-charter.md => free world charter.md (100%) rename front-matter.md => front matter.md (100%) rename full-throttle.md => full throttle.md (100%) rename fully-automated-luxury-gay-space-communism.md => fully automated luxury gay space communism.md (100%) rename fundació-joan-miró.md => fundació joan miró.md (100%) rename future-project.md => future project.md (100%) rename fuzzy-thinker.md => fuzzy thinker.md (100%) rename g-i.md => g i.md (100%) rename game-b.md => game b.md (100%) rename game-of-life.md => game of life.md (100%) rename garden-of-forking-paths.md => garden of forking paths.md (100%) rename garment-design-with-gans.md => garment design with gans.md (100%) rename gather-town.md => gather town.md (100%) rename gauge-fields-knots-and-gravity.md => gauge fields knots and gravity.md (100%) rename gauge-fields-nots-and-gravity.md => gauge fields nots and gravity.md (100%) rename gauge-theory.md => gauge theory.md (100%) rename gen-studio.md => gen studio.md (100%) rename gene-wolfe.md => gene wolfe.md (100%) rename gentle-revolution.md => gentle revolution.md (100%) rename geometric-unity.md => geometric unity.md (100%) rename george-handel.md => george handel.md (100%) rename georgo-vassilis.md => georgo vassilis.md (100%) rename gerald-sussman.md => gerald sussman.md (100%) rename gerhard-zorn.md => gerhard zorn.md (100%) rename gerry-garbulsky.md => gerry garbulsky.md (100%) rename getting-things-done.md => getting things done.md (100%) rename ghost-knowledge.md => ghost knowledge.md (100%) rename giant-global-graph.md => giant global graph.md (100%) rename gift-idea.md => gift idea.md (100%) rename git-alias.md => git alias.md (100%) rename git-bug.md => git bug.md (100%) rename git-config.md => git config.md (100%) rename git-on-ipfs.md => git on ipfs.md (100%) rename git-ship.md => git ship.md (100%) rename git-stoa.md => git stoa.md (100%) rename give-directly.md => give directly.md (100%) rename giving-pledge.md => giving pledge.md (100%) rename giving-what-we-can.md => giving what we can.md (100%) rename global-decision-making-via-local-economic-transactions.md => global decision making via local economic transactions.md (100%) rename global-economic-inequality.md => global economic inequality.md (100%) rename global-health-and-development-fund.md => global health and development fund.md (100%) rename global-priorities-institute.md => global priorities institute.md (100%) rename go-link.md => go link.md (100%) rename go-run.md => go run.md (100%) rename good-time.md => good time.md (100%) rename good-titles.md => good titles.md (100%) rename goodreads-bridge.md => goodreads bridge.md (100%) rename goodreads-export.md => goodreads export.md (100%) rename google-alternatives.md => google alternatives.md (100%) rename google-keep.md => google keep.md (100%) rename gopher-like.md => gopher like.md (100%) rename gordon-brander.md => gordon brander.md (100%) rename gphotos-uploader-cli.md => gphotos uploader cli.md (100%) rename gpt-2.md => gpt 2.md (100%) rename gpt-3.md => gpt 3.md (100%) rename gray-card.md => gray card.md (100%) rename great-news.md => great news.md (100%) rename great-open-source.md => great open source.md (100%) rename green-yoga.md => green yoga.md (100%) rename greg-egan.md => greg egan.md (100%) rename gregory-bateson.md => gregory bateson.md (100%) rename groundhog-day.md => groundhog day.md (100%) rename growing-artificial-societies.md => growing artificial societies.md (100%) rename guerilla-open-access-manifesto.md => guerilla open access manifesto.md (100%) rename gyuri-lajos.md => gyuri lajos.md (100%) rename habitat-67.md => habitat 67.md (100%) rename hack-the-planet.md => hack the planet.md (100%) rename hacker-manifesto.md => hacker manifesto.md (100%) rename hacker-news.md => hacker news.md (100%) rename hackers-heroes-of-the-computer-revolution.md => hackers heroes of the computer revolution.md (100%) rename hans-widmer.md => hans widmer.md (100%) rename harvey-michael.md => harvey michael.md (100%) rename hashing-function.md => hashing function.md (100%) rename heather-marsh.md => heather marsh.md (100%) rename help-others.md => help others.md (100%) delete mode 100644 herbert-simon.md rename hershel-of-ostropol.md => hershel of ostropol.md (100%) rename heterarchical-ontology.md => heterarchical ontology.md (100%) rename hide-tabs-in-firefox.md => hide tabs in firefox.md (100%) rename high-stakes-worldview.md => high stakes worldview.md (100%) rename hillel-the-elder.md => hillel the elder.md (100%) rename historias-de-cronopios-y-de-famas.md => historias de cronopios y de famas.md (100%) rename historical-agora.md => historical agora.md (100%) rename hn-alternatives.md => hn alternatives.md (100%) rename hohenzollern-castle.md => hohenzollern castle.md (100%) rename hope-or-hype-for-art.md => hope or hype for art.md (100%) rename housing-underlay.md => housing underlay.md (100%) rename how-it-should-be.md => how it should be.md (100%) rename how-many-tabs-do-you-have-open.md => how many tabs do you have open.md (100%) rename how-tech-loses-out.md => how tech loses out.md (100%) rename how-to-become-a-flancian.md => how to become a flancian.md (100%) rename how-to-feed-10-billion-people.md => how to feed 10 billion people.md (100%) rename how-to-gpt-2.md => how to gpt 2.md (100%) rename how-to-learn-scala.md => how to learn scala.md (100%) rename how-to-make-almost-anything.md => how to make almost anything.md (100%) rename how-to-read-a-book.md => how to read a book.md (100%) rename how-to-self-publish-a-book.md => how to self publish a book.md (100%) rename how-to-start-a-new-country.md => how to start a new country.md (100%) rename how-to-write-a-caron-in-linux.md => how to write a caron in linux.md (100%) rename hubert-dreyfus.md => hubert dreyfus.md (100%) rename huerta-común.md => huerta común.md (100%) rename human-computer-interaction.md => human computer interaction.md (100%) rename human-right.md => human right.md (100%) rename human-rights.md => human rights.md (100%) rename humane-tech.md => humane tech.md (100%) rename hype-man.md => hype man.md (100%) rename hypercore-proto.md => hypercore proto.md (100%) rename hypercore-protocol.md => hypercore protocol.md (100%) rename hyperlink-delusion.md => hyperlink delusion.md (100%) rename hypothesis-extension.md => hypothesis extension.md (100%) rename hypothesis-intro.md => hypothesis intro.md (100%) rename hypothesis-roam-bridge.md => hypothesis roam bridge.md (100%) rename i-ching-lite.md => i ching lite.md (100%) rename i-ching.md => i ching.md (100%) rename i-could-node-in-the-agora-all-day-and-all-night.md => i could node in the agora all day and all night.md (100%) rename i-ll-kill-your-shining-lights.md => i ll kill your shining lights.md (100%) rename i-want-to-inspire-others-the-same-way-that-others-inspire-me.md => i want to inspire others the same way that others inspire me.md (100%) rename iap-2021.md => iap 2021.md (100%) rename idea-market.md => idea market.md (100%) rename if-i-had-the-means-i-d-build-an-agora.md => if i had the means i d build an agora.md (100%) rename if-you-want-to-share.md => if you want to share.md (100%) rename igor-lenterman.md => igor lenterman.md (100%) rename ijeoma-oluo.md => ijeoma oluo.md (100%) rename ikko-tanaka.md => ikko tanaka.md (100%) rename immers-space.md => immers space.md (100%) rename imperial-college-tracker.md => imperial college tracker.md (100%) rename implementation-intention.md => implementation intention.md (100%) rename in-an-endearing.md => in an endearing.md (100%) rename in-buddha-s-words.md => in buddha s words.md (100%) rename in-flancia-there-are-no-walled-gardens.md => in flancia there are no walled gardens.md (100%) rename in-flancia-there-is-an-agora.md => in flancia there is an agora.md (100%) rename in-praise-of-idleness.md => in praise of idleness.md (100%) rename in-the-arcades.md => in the arcades.md (100%) rename in-the-beginning-was-the-command-line.md => in the beginning was the command line.md (100%) rename in-the-wilderless.md => in the wilderless.md (100%) rename indie-hackers.md => indie hackers.md (100%) rename indie-web.md => indie web.md (100%) rename indra-s-net.md => indra s net.md (100%) rename indra's-net.md => indra's net.md (100%) rename indras-net.md => indras net.md (100%) rename infinity-project.md => infinity project.md (100%) rename information-as-fundamental.md => information as fundamental.md (100%) rename innovation-information-initiative.md => innovation information initiative.md (100%) rename instant-commons.md => instant commons.md (100%) rename instinctive-sleeping-and-resting-postures.md => instinctive sleeping and resting postures.md (100%) rename integrated-repository.md => integrated repository.md (100%) rename intent-based-automation.md => intent based automation.md (100%) rename intent-driven-automation.md => intent driven automation.md (100%) rename intentional-society.md => intentional society.md (100%) rename inter-wiki.md => inter wiki.md (100%) rename interactive-philosophers-graph.md => interactive philosophers graph.md (100%) rename internal-chrome-extension.md => internal chrome extension.md (100%) rename internet-citizen.md => internet citizen.md (100%) rename internet-renaissance.md => internet renaissance.md (100%) rename interplanetary-mind-map.md => interplanetary mind map.md (100%) rename ipfs-backend-for-tiddlywiki.md => ipfs backend for tiddlywiki.md (100%) rename iron-absorption.md => iron absorption.md (100%) rename iso-8601.md => iso 8601.md (100%) rename isomorphic-git.md => isomorphic git.md (100%) rename ivan-herman.md => ivan herman.md (100%) rename izzy-swart.md => izzy swart.md (100%) rename j-posadas.md => j posadas.md (100%) rename jack-park.md => jack park.md (100%) rename james-baker.md => james baker.md (100%) rename james-fodor.md => james fodor.md (100%) rename james-gleick.md => james gleick.md (100%) rename janique-behman.md => janique behman.md (100%) rename jarke-wharton.md => jarke wharton.md (100%) rename jarkko-oikarinen.md => jarkko oikarinen.md (100%) rename javascript-subnodes.md => javascript subnodes.md (100%) rename jean-françois-lyotard.md => jean françois lyotard.md (100%) rename jean-michel-jarre.md => jean michel jarre.md (100%) rename jed-mckenna.md => jed mckenna.md (100%) rename jeff-tang.md => jeff tang.md (100%) rename jennifer-rygh.md => jennifer rygh.md (100%) rename jerry-michalski.md => jerry michalski.md (100%) rename jesse-li.md => jesse li.md (100%) rename jevons-paradox.md => jevons paradox.md (100%) rename jitsi-meet.md => jitsi meet.md (100%) rename joan-miro.md => joan miro.md (100%) rename joel-gustafson.md => joel gustafson.md (100%) rename joey-savoie.md => joey savoie.md (100%) rename john-brown.md => john brown.md (100%) rename john-cowper-powys.md => john cowper powys.md (100%) rename john-ii-komnenos.md => john ii komnenos.md (100%) rename john-ingalls.md => john ingalls.md (100%) rename john-perry-barlow.md => john perry barlow.md (100%) rename johnny-mnemonic.md => johnny mnemonic.md (100%) rename jonathan-aquino.md => jonathan aquino.md (100%) rename jonathan-the-utopian.md => jonathan the utopian.md (100%) rename jordan-peterson.md => jordan peterson.md (100%) rename jorge-bolet.md => jorge bolet.md (100%) rename jorge-luis-borges.md => jorge luis borges.md (100%) rename joscha-bach.md => joscha bach.md (100%) rename js-subnodes.md => js subnodes.md (100%) rename json-ld.md => json ld.md (100%) rename juan-carlos-onetti.md => juan carlos onetti.md (100%) rename juan-jose-fernandez.md => juan jose fernandez.md (100%) rename juan-sasturain.md => juan sasturain.md (100%) rename jud-brewer.md => jud brewer.md (100%) rename julia-serano.md => julia serano.md (100%) rename juliana-barwick.md => juliana barwick.md (100%) rename julio-cortázar.md => julio cortázar.md (100%) rename julio-jcortázar.md => julio jcortázar.md (100%) rename jumpsuit-chic.md => jumpsuit chic.md (100%) rename karl-marx-technofuturist.md => karl marx technofuturist.md (100%) rename karlicoss-flancian.md => karlicoss flancian.md (100%) rename karthikk-vijay.md => karthikk vijay.md (100%) rename kasparov-vs-the-world.md => kasparov vs the world.md (100%) rename keith-johnstone.md => keith johnstone.md (100%) rename ken-wilber.md => ken wilber.md (100%) rename key-lime-pie.md => key lime pie.md (100%) rename killing-rage.md => killing rage.md (100%) rename know-your-amphetamines.md => know your amphetamines.md (100%) rename knowledge-bases.md => knowledge bases.md (100%) rename knowledge-futures-group.md => knowledge futures group.md (100%) rename knowledge-management-applications.md => knowledge management applications.md (100%) rename kyosaku-jon.md => kyosaku jon.md (100%) rename l-allegro-il-penseroso-ed-il-moderato.md => l allegro il penseroso ed il moderato.md (100%) rename la-vida-breve.md => la vida breve.md (100%) rename laarc-io.md => laarc io.md (100%) rename lady-murasaki.md => lady murasaki.md (100%) rename lago-atitlán.md => lago atitlán.md (100%) rename lake-atitlán.md => lake atitlán.md (100%) rename lambda-calculus.md => lambda calculus.md (100%) rename land-of-silence-and-darkness.md => land of silence and darkness.md (100%) rename landauer-limit.md => landauer limit.md (100%) rename langston-hughes.md => langston hughes.md (100%) rename language-games.md => language games.md (100%) rename language-learning-with-netflix.md => language learning with netflix.md (100%) rename latent-compass.md => latent compass.md (100%) rename learn-datalog-today.md => learn datalog today.md (100%) rename learning-rust.md => learning rust.md (100%) rename learning-to-learn.md => learning to learn.md (100%) rename left-market-anarchist.md => left market anarchist.md (100%) rename lenguaje-universal.md => lenguaje universal.md (100%) rename lenovo-p14.md => lenovo p14.md (100%) rename leon-trotsky.md => leon trotsky.md (100%) rename less-wrong.md => less wrong.md (100%) rename let-me-know.md => let me know.md (100%) rename let-us-be-one.md => let us be one.md (100%) rename letter-wiki.md => letter wiki.md (100%) rename levenshtein-distance.md => levenshtein distance.md (100%) rename levi-hart.md => levi hart.md (100%) rename lex-fridman.md => lex fridman.md (100%) rename lex-maria.md => lex maria.md (100%) rename liminal-warmth.md => liminal warmth.md (100%) rename lindy-effect.md => lindy effect.md (100%) rename lingua-franca.md => lingua franca.md (100%) rename linguistic-example-sentences.md => linguistic example sentences.md (100%) rename link-it-as-you-go-along.md => link it as you go along.md (100%) rename link-rot.md => link rot.md (100%) rename linus-torvalds.md => linus torvalds.md (100%) rename liquid-democracy.md => liquid democracy.md (100%) rename list-of-lists-of-lists.md => list of lists of lists.md (100%) rename list-of-lists.md => list of lists.md (100%) rename lists-of-lists-of-lists.md => lists of lists of lists.md (100%) rename lists-of-lists.md => lists of lists.md (100%) rename live-redesign.md => live redesign.md (100%) rename live-tooting.md => live tooting.md (100%) rename lobste-rs.md => lobste rs.md (100%) rename lonesome-no-more.md => lonesome no more.md (100%) rename lord-enki.md => lord enki.md (100%) rename los-oficios-terrestres.md => los oficios terrestres.md (100%) rename los-olimareños.md => los olimareños.md (100%) rename lost-and-found.md => lost and found.md (100%) rename love-will-tear-us-apart.md => love will tear us apart.md (100%) rename lower-back-pain.md => lower back pain.md (100%) rename loyd-blankenship.md => loyd blankenship.md (100%) rename luca-landucci.md => luca landucci.md (100%) rename lucid-innocence.md => lucid innocence.md (100%) rename luxury-space-communism.md => luxury space communism.md (100%) rename lyn-hejinian.md => lyn hejinian.md (100%) rename m-prime.md => m prime.md (100%) rename m.-b..md => m. b..md (100%) rename macedonio-fernandez.md => macedonio fernandez.md (100%) rename macedonio-fernández.md => macedonio fernández.md (100%) rename madness-rack-and-honey.md => madness rack and honey.md (100%) rename maintain-my-body.md => maintain my body.md (100%) rename make-up-links-that-dont-exist-yet.md => make up links that dont exist yet.md (100%) rename malcolm-x.md => malcolm x.md (100%) rename mangled-in-transit.md => mangled in transit.md (100%) rename manipulation-of-democracy.md => manipulation of democracy.md (100%) rename mapping-the-fediverse.md => mapping the fediverse.md (100%) rename marcelo-tinelli.md => marcelo tinelli.md (100%) rename margaret-warren.md => margaret warren.md (100%) rename marina-garcés.md => marina garcés.md (100%) rename markdown-links.md => markdown links.md (100%) rename markdown-on-git.md => markdown on git.md (100%) rename markov-blankets.md => markov blankets.md (100%) rename marroni-cake.md => marroni cake.md (100%) rename martin-gardner.md => martin gardner.md (100%) rename martin-luther-king.md => martin luther king.md (100%) rename marxist-thinkers.md => marxist thinkers.md (100%) rename mary-lattimore.md => mary lattimore.md (100%) rename masa-de-tarta.md => masa de tarta.md (100%) rename mastodon-bot.md => mastodon bot.md (100%) rename mastodon-clients.md => mastodon clients.md (100%) rename mastodon-instance.md => mastodon instance.md (100%) rename mastodon-instances.md => mastodon instances.md (100%) rename mathematical-logic.md => mathematical logic.md (100%) rename mathematical-universe.md => mathematical universe.md (100%) rename mathew-lowry.md => mathew lowry.md (100%) rename matrix-agora.md => matrix agora.md (100%) rename matrix-bot.md => matrix bot.md (100%) rename max-stauffer.md => max stauffer.md (100%) rename maximally-inclusive.md => maximally inclusive.md (100%) rename mechanical-monk.md => mechanical monk.md (100%) rename meditations-on-moloch.md => meditations on moloch.md (100%) rename meet-coop.md => meet coop.md (100%) rename mehr-als-wohnen.md => mehr als wohnen.md (100%) rename meme-traditions.md => meme traditions.md (100%) rename memories-of-green.md => memories of green.md (100%) rename mental-nodes.md => mental nodes.md (100%) rename mental-state.md => mental state.md (100%) rename mercury-fountain.md => mercury fountain.md (100%) rename metamagical-themas.md => metamagical themas.md (100%) rename metasj-flancian.md => metasj flancian.md (100%) rename method-of-loci.md => method of loci.md (100%) rename michael-aird.md => michael aird.md (100%) rename michael-graham.md => michael graham.md (100%) rename michael-ocean.md => michael ocean.md (100%) rename michael-taft.md => michael taft.md (100%) rename michel-de-montaigne.md => michel de montaigne.md (100%) rename michel-foucault.md => michel foucault.md (100%) rename micro-pub.md => micro pub.md (100%) rename mid-career-greatest-hits.md => mid career greatest hits.md (100%) rename middle-way.md => middle way.md (100%) rename midnight-in-a-perfect-world.md => midnight in a perfect world.md (100%) rename miguel-marcos-martinez.md => miguel marcos martinez.md (100%) rename mihaly-csikszentmihalyi.md => mihaly csikszentmihalyi.md (100%) rename mike-elias.md => mike elias.md (100%) rename mind-merge.md => mind merge.md (100%) rename mind-over-chatter.md => mind over chatter.md (100%) rename mind-palace.md => mind palace.md (100%) rename mind-uploading-and-the-revolution.md => mind uploading and the revolution.md (100%) rename missing-devices.md => missing devices.md (100%) rename missing-semester.md => missing semester.md (100%) rename ml5-js.md => ml5 js.md (100%) rename moa-party.md => moa party.md (100%) rename moa-polls.md => moa polls.md (100%) rename mob-mentality.md => mob mentality.md (100%) rename model-of-the-world.md => model of the world.md (100%) rename molchat-doma.md => molchat doma.md (100%) rename molly-mielke.md => molly mielke.md (100%) rename money-free-world.md => money free world.md (100%) rename moon-ribas.md => moon ribas.md (100%) rename moral-principles.md => moral principles.md (100%) rename mort-garson.md => mort garson.md (100%) rename mr-random.md => mr random.md (100%) rename muhammad-ﷺ.md => muhammad ﷺ.md (100%) rename multiplayer-roam.md => multiplayer roam.md (100%) rename muscle-wiki.md => muscle wiki.md (100%) rename musgum-huts.md => musgum huts.md (100%) rename music-for-plants.md => music for plants.md (100%) rename my-favourite-things.md => my favourite things.md (100%) rename my-goal-in-life.md => my goal in life.md (100%) rename mycroft-ai.md => mycroft ai.md (100%) rename nadia-eghbal.md => nadia eghbal.md (100%) rename name-place-animal-thing.md => name place animal thing.md (100%) rename nano-page.md => nano page.md (100%) rename nathan-schneider.md => nathan schneider.md (100%) rename neal-stephenson.md => neal stephenson.md (100%) rename necklace-of-community-projects.md => necklace of community projects.md (100%) rename neil-harbisson.md => neil harbisson.md (100%) rename nerds-of-the-world-unite.md => nerds of the world unite.md (100%) rename ness-labs.md => ness labs.md (100%) rename nestor-makhno.md => nestor makhno.md (100%) rename nettie-lagace.md => nettie lagace.md (100%) rename network-science.md => network science.md (100%) rename never-known.md => never known.md (100%) rename never-wrote.md => never wrote.md (100%) rename new-games.md => new games.md (100%) rename new-music.md => new music.md (100%) rename newcomblike-problems.md => newcomblike problems.md (100%) rename next-action.md => next action.md (100%) rename nft-storage.md => nft storage.md (100%) rename nick-bostrom.md => nick bostrom.md (100%) rename nick-cammarata.md => nick cammarata.md (100%) rename nick-szabo.md => nick szabo.md (100%) rename nick-vujicic.md => nick vujicic.md (100%) rename nikolai-kingsley.md => nikolai kingsley.md (100%) rename no-yoga-robots.md => no yoga robots.md (100%) rename nobu-hibiki.md => nobu hibiki.md (100%) rename noche-de-los-bastones-largos.md => noche de los bastones largos.md (100%) rename node-js.md => node js.md (100%) rename node-outlines.md => node outlines.md (100%) rename node-permutations.md => node permutations.md (100%) rename nodes-outlines.md => nodes outlines.md (100%) rename noise-colors.md => noise colors.md (100%) rename non-profit.md => non profit.md (100%) rename not-organized-hierarchically.md => not organized hierarchically.md (100%) rename notes-on-the-synthesis-of-form.md => notes on the synthesis of form.md (100%) rename nunca-me-faltes.md => nunca me faltes.md (100%) rename object-of-design.md => object of design.md (100%) rename ocarina-of-time.md => ocarina of time.md (100%) rename offline-twitter.md => offline twitter.md (100%) rename olga-babeeva.md => olga babeeva.md (100%) rename oliver-sauter.md => oliver sauter.md (100%) rename omar-rizwan.md => omar rizwan.md (100%) rename on-building-bridges.md => on building bridges.md (100%) rename on-cringe.md => on cringe.md (100%) rename on-tyranny.md => on tyranny.md (100%) rename onboarding-to-the-agora.md => onboarding to the agora.md (100%) rename only-flans.md => only flans.md (100%) rename open-borders.md => open borders.md (100%) rename open-collective.md => open collective.md (100%) rename open-ethics.md => open ethics.md (100%) rename open-graph-protocol.md => open graph protocol.md (100%) rename open-graph.md => open graph.md (100%) rename open-home.md => open home.md (100%) rename open-letter-to-foam.md => open letter to foam.md (100%) rename open-nation.md => open nation.md (100%) rename open-protocols.md => open protocols.md (100%) rename open-search.md => open search.md (100%) rename open-source-monitoring.md => open source monitoring.md (100%) rename open-source.md => open source.md (100%) rename open-street-map.md => open street map.md (100%) rename open-syllabus.md => open syllabus.md (100%) rename operation-unified-assistance.md => operation unified assistance.md (100%) rename opus-populi.md => opus populi.md (100%) rename orbit-db.md => orbit db.md (100%) rename orejas-de-terciopelo.md => orejas de terciopelo.md (100%) rename org-mode.md => org mode.md (100%) rename org-roam.md => org roam.md (100%) rename origin-story.md => origin story.md (100%) rename orphan-machine.md => orphan machine.md (100%) rename orthodox-jews-that-wear-80s-clothing.md => orthodox jews that wear 80s clothing.md (100%) rename other-agoras.md => other agoras.md (100%) rename our-flancia.md => our flancia.md (100%) rename out-of-memory.md => out of memory.md (100%) rename outgroup-homogeneity-effect.md => outgroup homogeneity effect.md (100%) rename p-and-h.md => p and h.md (100%) rename p-c.md => p c.md (100%) rename pandemic-game.md => pandemic game.md (100%) rename paradoja-de-la-tolerancia.md => paradoja de la tolerancia.md (100%) rename paradox-of-tolerance.md => paradox of tolerance.md (100%) rename parasite-alchemy.md => parasite alchemy.md (100%) rename pareto-efficiency.md => pareto efficiency.md (100%) rename part-of-the-reason-thinking.md => part of the reason thinking.md (100%) rename part-of-the-reason.md => part of the reason.md (100%) rename pasta-frola.md => pasta frola.md (100%) rename patterning-reading-group.md => patterning reading group.md (100%) rename paul-frazee.md => paul frazee.md (100%) rename pdb-post-morte.md => pdb post morte.md (100%) rename pdb-postmortem.md => pdb postmortem.md (100%) rename peace-piece.md => peace piece.md (100%) rename pearson-correlation-coefficient.md => pearson correlation coefficient.md (100%) rename pee-zombie.md => pee zombie.md (100%) rename pen-coded.md => pen coded.md (100%) rename per-aspera-ad-astra.md => per aspera ad astra.md (100%) rename pernambuco-e-seu-conjunto.md => pernambuco e seu conjunto.md (100%) rename persistent-non-symbolic-experiences.md => persistent non symbolic experiences.md (100%) rename person-from-porlock.md => person from porlock.md (100%) rename personal-dynamic-media.md => personal dynamic media.md (100%) rename personal-knowledge-graph.md => personal knowledge graph.md (100%) rename personal-knowledge-management.md => personal knowledge management.md (100%) rename personal-knowledge-managment.md => personal knowledge managment.md (100%) rename peter-limberg.md => peter limberg.md (100%) rename peter-singer.md => peter singer.md (100%) rename peter-thiel.md => peter thiel.md (100%) rename peterson-žižek-debate.md => peterson žižek debate.md (100%) rename petter-johansson.md => petter johansson.md (100%) rename philip-k-dick.md => philip k dick.md (100%) rename philosopher-life.md => philosopher life.md (100%) rename philosophy-on-alerting.md => philosophy on alerting.md (100%) rename piero-della-francesca.md => piero della francesca.md (100%) rename pinafore-shortcuts.md => pinafore shortcuts.md (100%) rename place-subreddit.md => place subreddit.md (100%) delete mode 100644 places-for-the-soul.md rename plan-9.md => plan 9.md (100%) rename planet-hof.md => planet hof.md (100%) rename planet-hopf.md => planet hopf.md (100%) rename planned-action.md => planned action.md (100%) rename planned-actions.md => planned actions.md (100%) rename platonic-ideal.md => platonic ideal.md (100%) rename platonic-intent.md => platonic intent.md (100%) rename platos-dialogues.md => platos dialogues.md (100%) rename poema-de-la-infancia-de-alguien.md => poema de la infancia de alguien.md (100%) rename pokemon-mode.md => pokemon mode.md (100%) rename pomodoro-technique.md => pomodoro technique.md (100%) rename post-racial.md => post racial.md (100%) rename post-scarcity.md => post scarcity.md (100%) rename postponing-revolution.md => postponing revolution.md (100%) rename pottery-simulator.md => pottery simulator.md (100%) rename predictable-identities.md => predictable identities.md (100%) rename prediction-framework.md => prediction framework.md (100%) rename predictions-as-a-substitute-for-reviews.md => predictions as a substitute for reviews.md (100%) rename principal-agent-problem.md => principal agent problem.md (100%) rename principle-of-charity.md => principle of charity.md (100%) rename prinssi-taivaanlintu.md => prinssi taivaanlintu.md (100%) rename prisión-perpetua.md => prisión perpetua.md (100%) rename problem-of-universals.md => problem of universals.md (100%) rename problem-solving.md => problem solving.md (100%) rename procrastination-diary.md => procrastination diary.md (100%) rename progressive-international.md => progressive international.md (100%) rename project-gemini.md => project gemini.md (100%) rename promnesia-agora.md => promnesia agora.md (100%) rename promnesia-config.md => promnesia config.md (100%) rename promnesia-example-config.md => promnesia example config.md (100%) rename promnesia-howto.md => promnesia howto.md (100%) rename promnesia-sources.md => promnesia sources.md (100%) rename proof-game.md => proof game.md (100%) rename proper-subset.md => proper subset.md (100%) rename proposition-joe.md => proposition joe.md (100%) rename prosperity-license.md => prosperity license.md (100%) rename prosperity-public-license.md => prosperity public license.md (100%) rename protocol-labs.md => protocol labs.md (100%) rename protocols-not-platforms.md => protocols not platforms.md (100%) rename protopoi-org.md => protopoi org.md (100%) rename protopoi-reading-club.md => protopoi reading club.md (100%) rename protopoi-space.md => protopoi space.md (100%) rename proyecto-morcilla.md => proyecto morcilla.md (100%) rename proyecto-nocilla.md => proyecto nocilla.md (100%) rename public-key.md => public key.md (100%) rename public-keys.md => public keys.md (100%) rename public-utility.md => public utility.md (100%) rename pull-and-push.md => pull and push.md (100%) rename pull-links.md => pull links.md (100%) rename pulled-links.md => pulled links.md (100%) rename pulled-nodes.md => pulled nodes.md (100%) rename pumpkin-soup.md => pumpkin soup.md (100%) rename push-an-existing-repository-to-a-new-remote.md => push an existing repository to a new remote.md (100%) rename push-and-pull.md => push and pull.md (100%) rename push-down-automata.md => push down automata.md (100%) rename py-subnodes.md => py subnodes.md (100%) rename python-type-annotations.md => python type annotations.md (100%) rename query-language.md => query language.md (100%) rename quick-capture.md => quick capture.md (100%) rename radical-candor.md => radical candor.md (100%) rename rainbow-folding.md => rainbow folding.md (100%) rename rainbow-williams.md => rainbow williams.md (100%) rename rainer-maria-rilke.md => rainer maria rilke.md (100%) rename ralph-hodgson.md => ralph hodgson.md (100%) rename ramon-alonso.md => ramon alonso.md (100%) rename ranking-algorithm.md => ranking algorithm.md (100%) rename raymond-williams.md => raymond williams.md (100%) rename rdf-1-1-concepts-and-abstract-syntax.md => rdf 1 1 concepts and abstract syntax.md (100%) rename rdf-1-1-primer.md => rdf 1 1 primer.md (100%) rename rdf-1-1-semantics.md => rdf 1 1 semantics.md (100%) rename rdf-1-1-test-cases.md => rdf 1 1 test cases.md (100%) rename rdf-1-1-xml-syntax.md => rdf 1 1 xml syntax.md (100%) rename rdf-grapher.md => rdf grapher.md (100%) rename rdf-schema-1-1.md => rdf schema 1 1.md (100%) rename rdf-serialization-format.md => rdf serialization format.md (100%) rename rdf-serialization-formats.md => rdf serialization formats.md (100%) rename reading-alexander.md => reading alexander.md (100%) rename reading-club.md => reading club.md (100%) rename reading-protopoi.md => reading protopoi.md (100%) rename reading-vacation-june-2020.md => reading vacation june 2020.md (100%) rename real-co-op-stories.md => real co op stories.md (100%) rename real-coop-stories.md => real coop stories.md (100%) rename reasonable-movement.md => reasonable movement.md (100%) rename recipe-gate.md => recipe gate.md (100%) rename red-oak.md => red oak.md (100%) rename red-star.md => red star.md (100%) rename regulatory-capture.md => regulatory capture.md (100%) rename removing-google-as-a-spof.md => removing google as a spof.md (100%) rename rent-free.md => rent free.md (100%) rename resources-to-learn-to-program.md => resources to learn to program.md (100%) rename restore-etherpad-revision.md => restore etherpad revision.md (100%) rename retro-social-network.md => retro social network.md (100%) rename ricardo-piglia.md => ricardo piglia.md (100%) rename riccardo-ferreti.md => riccardo ferreti.md (100%) rename riccardo-ferretti.md => riccardo ferretti.md (100%) rename richard-dawkins.md => richard dawkins.md (100%) rename richard-feynman.md => richard feynman.md (100%) rename richard-stallman.md => richard stallman.md (100%) rename right-livelihood.md => right livelihood.md (100%) rename right-speech.md => right speech.md (100%) rename ritmo-de-la-noche.md => ritmo de la noche.md (100%) rename rival-voices.md => rival voices.md (100%) rename rna-memory.md => rna memory.md (100%) rename roam-backup.md => roam backup.md (100%) rename roam-exporter.md => roam exporter.md (100%) rename roam-go-links.md => roam go links.md (100%) rename roam-like.md => roam like.md (100%) rename roam-likes.md => roam likes.md (100%) rename roam-multiplayer.md => roam multiplayer.md (100%) rename roam-research.md => roam research.md (100%) rename roam-to-git.md => roam to git.md (100%) rename roaman-agora.md => roaman agora.md (100%) rename rob-sanderson.md => rob sanderson.md (100%) rename robbers-cave-study.md => robbers cave study.md (100%) rename robert-axelrod.md => robert axelrod.md (100%) rename roberto-arlt.md => roberto arlt.md (100%) rename robin-hanson.md => robin hanson.md (100%) rename robofriend-as-socrates.md => robofriend as socrates.md (100%) rename robofriend-is-socrates.md => robofriend is socrates.md (100%) rename roborock-s6.md => roborock s6.md (100%) rename rodolfo-ocampo.md => rodolfo ocampo.md (100%) rename rodrigo-baraglia.md => rodrigo baraglia.md (100%) rename rokos-basilisk.md => rokos basilisk.md (100%) rename role-model.md => role model.md (100%) rename role-models.md => role models.md (100%) rename romanian-street-musicians.md => romanian street musicians.md (100%) rename romantic-period-poetry.md => romantic period poetry.md (100%) rename romina-wainberg.md => romina wainberg.md (100%) rename root-nodes.md => root nodes.md (100%) rename ross-perot.md => ross perot.md (100%) rename ruben-verborgh.md => ruben verborgh.md (100%) rename run-run-run.md => run run run.md (100%) rename russell-conjugations.md => russell conjugations.md (100%) rename rutger-bregman.md => rutger bregman.md (100%) rename ruth-catlow.md => ruth catlow.md (100%) rename ryo-fukui.md => ryo fukui.md (100%) rename s-y.md => s y.md (100%) rename s.-s..md => s. s..md (100%) rename saint-simon.md => saint simon.md (100%) rename sam-harris.md => sam harris.md (100%) rename samanta-schweblin.md => samanta schweblin.md (100%) rename same-as.md => same as.md (100%) rename samuel-edward-konkin-iii.md => samuel edward konkin iii.md (100%) rename samuel-johnson.md => samuel johnson.md (100%) rename samuel-klein.md => samuel klein.md (100%) rename santa-fe-institute.md => santa fe institute.md (100%) rename santa-maría.md => santa maría.md (100%) rename sarah-friend.md => sarah friend.md (100%) rename sarah-of-the-past.md => sarah of the past.md (100%) delete mode 100644 sarah-schwettmann.md rename satyagraha-revolution.md => satyagraha revolution.md (100%) rename saul-williams.md => saul williams.md (100%) rename scattered-minds.md => scattered minds.md (100%) rename schelling-point.md => schelling point.md (100%) rename schuldenzucker-com.md => schuldenzucker com.md (100%) rename sci-fi.md => sci fi.md (100%) rename sciences-of-the-artificial.md => sciences of the artificial.md (100%) rename scott-alexander.md => scott alexander.md (100%) rename search-and-annotation-are-complementary.md => search and annotation are complementary.md (100%) rename search-engine.md => search engine.md (100%) rename sebastian-gandera.md => sebastian gandera.md (100%) rename second-brain.md => second brain.md (100%) rename second-stoa.md => second stoa.md (100%) rename secular-buddhism.md => secular buddhism.md (100%) rename secular-buddhist.md => secular buddhist.md (100%) rename seeing-like-a-state.md => seeing like a state.md (100%) rename self-organizing-intelligent-matter.md => self organizing intelligent matter.md (100%) rename semantic-modeling-of-narrative-events.md => semantic modeling of narrative events.md (100%) rename semantic-narratives.md => semantic narratives.md (100%) rename semantic-versioning.md => semantic versioning.md (100%) rename senior-software-engineer-interview.md => senior software engineer interview.md (100%) rename sensible-urls.md => sensible urls.md (100%) rename sequential-wiki.md => sequential wiki.md (100%) rename seven-bridges-of-königsberg.md => seven bridges of königsberg.md (100%) rename sex-tips-for-geeks.md => sex tips for geeks.md (100%) rename sharing-economy.md => sharing economy.md (100%) rename shi-ne.md => shi ne.md (100%) rename shinzen-young.md => shinzen young.md (100%) rename shirtless-guy.md => shirtless guy.md (100%) rename shu-omi.md => shu omi.md (100%) rename side-projects.md => side projects.md (100%) rename siedlung-halen.md => siedlung halen.md (100%) rename sign-up.md => sign up.md (100%) rename silence-is-a-commons.md => silence is a commons.md (100%) rename silver-ladders.md => silver ladders.md (100%) rename simulated-annealing.md => simulated annealing.md (100%) rename sistema-b.md => sistema b.md (100%) rename sister-sites.md => sister sites.md (100%) rename site-reliability-engineer.md => site reliability engineer.md (100%) rename site-reliability-engineering.md => site reliability engineering.md (100%) rename slate-star-codex.md => slate star codex.md (100%) rename slavoj-zizek.md => slavoj zizek.md (100%) rename slavoj-žižek.md => slavoj žižek.md (100%) rename sleeper-trains.md => sleeper trains.md (100%) rename slow-focus.md => slow focus.md (100%) rename small-axe.md => small axe.md (100%) rename smart-agora.md => smart agora.md (100%) rename smarter-than-me.md => smarter than me.md (100%) rename snorri-sturluson.md => snorri sturluson.md (100%) rename so-you-want-to-talk-about-race.md => so you want to talk about race.md (100%) rename social-algorithm.md => social algorithm.md (100%) rename social-coop.md => social coop.md (100%) rename social-distributed-knowledge-graph.md => social distributed knowledge graph.md (100%) rename social-knowledge-graph.md => social knowledge graph.md (100%) rename social-knowledge-graphs-discussion.md => social knowledge graphs discussion.md (100%) rename social-media-for-anarchists.md => social media for anarchists.md (100%) rename social-network.md => social network.md (100%) rename social-web-protocols.md => social web protocols.md (100%) rename socrates-figures.md => socrates figures.md (100%) rename solomon-naim.md => solomon naim.md (100%) rename soma-fm.md => soma fm.md (100%) rename some-possible-paths-to-flancia.md => some possible paths to flancia.md (100%) rename some-things-must-be-believed-in-order-to-be-seen.md => some things must be believed in order to be seen.md (100%) rename sometimes-i-feel-as-if-i-am-struck-by-lightning.md => sometimes i feel as if i am struck by lightning.md (100%) rename sounds-of-the-dawn.md => sounds of the dawn.md (100%) rename space-flower.md => space flower.md (100%) rename speech-and-language-processing.md => speech and language processing.md (100%) rename ssh-keys.md => ssh keys.md (100%) rename st-benedict-rule-for-monasteries.md => st benedict rule for monasteries.md (100%) rename st-benedict-s-rule-for-monasteries.md => st benedict s rule for monasteries.md (100%) rename stack-exchange.md => stack exchange.md (100%) rename stack-overflow.md => stack overflow.md (100%) rename standoff-properties.md => standoff properties.md (100%) rename steffen-schuldenzucker.md => steffen schuldenzucker.md (100%) rename stephen-batchelor.md => stephen batchelor.md (100%) rename stephen-crane.md => stephen crane.md (100%) rename stephen-downes.md => stephen downes.md (100%) rename stephen-wolfram.md => stephen wolfram.md (100%) rename steve-blank.md => steve blank.md (100%) rename steve-mcqueen.md => steve mcqueen.md (100%) rename steve-roach.md => steve roach.md (100%) rename steve-wozniak.md => steve wozniak.md (100%) rename steven-fan.md => steven fan.md (100%) rename steven-levy.md => steven levy.md (100%) rename stoa-of-attalos.md => stoa of attalos.md (100%) rename stoa-poikile.md => stoa poikile.md (100%) rename strength-in-diversity.md => strength in diversity.md (100%) rename struck-by-lightning.md => struck by lightning.md (100%) rename structure-and-interpretation-of-classical-mechanics.md => structure and interpretation of classical mechanics.md (100%) rename structure-and-interpretation-of-computer-programs.md => structure and interpretation of computer programs.md (100%) rename sun-salutations.md => sun salutations.md (100%) rename surplus-value.md => surplus value.md (100%) rename survey-of-annotation-efforts.md => survey of annotation efforts.md (100%) rename susan-stebbing.md => susan stebbing.md (100%) rename swiss-wiring-code.md => swiss wiring code.md (100%) rename syrian-uprising.md => syrian uprising.md (100%) rename t-s-eliot.md => t s eliot.md (100%) rename ta-eis-heauton.md => ta eis heauton.md (100%) rename ta-heis-heauton.md => ta heis heauton.md (100%) rename take-a-walk-on-the-wild-side.md => take a walk on the wild side.md (100%) rename tao-of-programming.md => tao of programming.md (100%) rename tapir-whorf.md => tapir whorf.md (100%) rename taxonomy-of-ideas.md => taxonomy of ideas.md (100%) rename te-quiero.md => te quiero.md (100%) rename team-human.md => team human.md (100%) rename tectonic-shift.md => tectonic shift.md (100%) rename ted-nelson.md => ted nelson.md (100%) rename temporal-discounting.md => temporal discounting.md (100%) rename teodor-heggelund.md => teodor heggelund.md (100%) rename terrorism-is-not-effective.md => terrorism is not effective.md (100%) rename terrorismo-constructivo.md => terrorismo constructivo.md (100%) rename test-for-tld.md => test for tld.md (100%) rename tetraspace-grouping.md => tetraspace grouping.md (100%) rename the-agora-is-a-liminal-entity.md => the agora is a liminal entity.md (100%) rename the-agora-is-a-markdown-convention.md => the agora is a markdown convention.md (100%) rename the-agora-is-a-platform-for-studying-convergence.md => the agora is a platform for studying convergence.md (100%) rename the-agora-is-a-social-network-built-by-the-people-for-the-people.md => the agora is a social network built by the people for the people.md (100%) rename the-agora-is-a-twitter-app.md => the agora is a twitter app.md (100%) rename the-agora-is-an-old-kind-of-social-network.md => the agora is an old kind of social network.md (100%) rename the-arcades-project.md => the arcades project.md (100%) rename the-architecture-of-markets.md => the architecture of markets.md (100%) rename the-architecture-of-open-source-applications.md => the architecture of open source applications.md (100%) rename the-book-of-the-new-sun.md => the book of the new sun.md (100%) rename the-cloud-of-unknowing.md => the cloud of unknowing.md (100%) rename the-effective-altruism-handbook.md => the effective altruism handbook.md (100%) rename the-end.md => the end.md (100%) rename the-equitable-prose.md => the equitable prose.md (100%) rename the-evolution-of-cooperation.md => the evolution of cooperation.md (100%) rename the-expanding-circle.md => the expanding circle.md (100%) rename the-expanse.md => the expanse.md (100%) rename the-fable-of-the-dragon-tyrant.md => the fable of the dragon tyrant.md (100%) rename the-federation.md => the federation.md (100%) rename the-garden-of-forking-paths.md => the garden of forking paths.md (100%) rename the-gift.md => the gift.md (100%) rename the-girl-who-stole-my-tamagotchi.md => the girl who stole my tamagotchi.md (100%) rename the-great-reset.md => the great reset.md (100%) rename the-great-tab-purge-of-2020.md => the great tab purge of 2020.md (100%) rename the-hyperbolic-geometry-of-dmt-experiences.md => the hyperbolic geometry of dmt experiences.md (100%) rename the-hyperlink-delusion.md => the hyperlink delusion.md (100%) rename the-idea-of-the-world.md => the idea of the world.md (100%) rename the-intelligent-social-web.md => the intelligent social web.md (100%) rename the-island.md => the island.md (100%) rename the-kind-in-yellow.md => the kind in yellow.md (100%) rename the-king-in-yellow.md => the king in yellow.md (100%) rename the-life-you-can-save.md => the life you can save.md (100%) rename the-little-schemer.md => the little schemer.md (100%) rename the-little-schemerh.md => the little schemerh.md (100%) rename the-machine.md => the machine.md (100%) rename the-man-in-the-high-castle.md => the man in the high castle.md (100%) rename the-man-who-was-thursday.md => the man who was thursday.md (100%) rename the-narrator.md => the narrator.md (100%) rename the-next-ai-winter-wil-lbe-due-to-energy-costs.md => the next ai winter wil lbe due to energy costs.md (100%) rename the-open-boat.md => the open boat.md (100%) rename the-people-united-will-never-be-defeated.md => the people united will never be defeated.md (100%) rename the-productivists.md => the productivists.md (100%) rename the-revolution-will-be-annotated.md => the revolution will be annotated.md (100%) rename the-rise-of-made-in-china-diplomacy.md => the rise of made in china diplomacy.md (100%) rename the-science-of-enlightenment.md => the science of enlightenment.md (100%) rename the-selfish-gene.md => the selfish gene.md (100%) rename the-set-of-all-possible-things.md => the set of all possible things.md (100%) rename the-software-shall-be-used-for-good-not-evil.md => the software shall be used for good not evil.md (100%) rename the-sovereign-individual.md => the sovereign individual.md (100%) rename the-story-of-aaron-swartz.md => the story of aaron swartz.md (100%) rename the-story-of-civilization.md => the story of civilization.md (100%) rename the-timeless-way-of-building.md => the timeless way of building.md (100%) rename the-universal-laws-of-success.md => the universal laws of success.md (100%) rename the-virtue-of-selfishness.md => the virtue of selfishness.md (100%) rename the-wire.md => the wire.md (100%) rename the-word-fuck.md => the word fuck.md (100%) rename the-work-of-art-in-the-age-of-mechanical-reproduction.md => the work of art in the age of mechanical reproduction.md (100%) rename the-world-at-war.md => the world at war.md (100%) rename the-year-of-living-biblically.md => the year of living biblically.md (100%) rename theory-of-forms.md => theory of forms.md (100%) rename theproject-is.md => theproject is.md (100%) rename thesis-antithesis-synthesis.md => thesis antithesis synthesis.md (100%) rename think-about.md => think about.md (100%) rename third-coast-percussion.md => third coast percussion.md (100%) rename third-stoa.md => third stoa.md (100%) rename thomas-gray.md => thomas gray.md (100%) rename thomas-lisankie.md => thomas lisankie.md (100%) rename thomas-more's-utopia.md => thomas more's utopia.md (100%) rename thomas-szasz.md => thomas szasz.md (100%) rename thor-ciphers.md => thor ciphers.md (100%) rename thought-experiment.md => thought experiment.md (100%) rename thread-helper.md => thread helper.md (100%) rename thread-mode.md => thread mode.md (100%) rename tillie-kottmann.md => tillie kottmann.md (100%) rename tim-berners-lee.md => tim berners lee.md (100%) rename tiny-desk.md => tiny desk.md (100%) rename tit-for-that-with-forgiveness.md => tit for that with forgiveness.md (100%) rename tit-for-that.md => tit for that.md (100%) rename to-live-and-think-like-pigs.md => to live and think like pigs.md (100%) rename todd-carpenter.md => todd carpenter.md (100%) rename tokyo-school.md => tokyo school.md (100%) rename tools-of-the-agora.md => tools of the agora.md (100%) rename toot-cli.md => toot cli.md (100%) rename torta-base.md => torta base.md (100%) rename towards-an-agora.md => towards an agora.md (100%) rename town-hall.md => town hall.md (100%) rename trace-programming-language.md => trace programming language.md (100%) rename transitive-go-links.md => transitive go links.md (100%) rename tree-notation.md => tree notation.md (100%) rename tree-shaping.md => tree shaping.md (100%) rename tree-simulator.md => tree simulator.md (100%) rename tree-structure.md => tree structure.md (100%) rename tree-structured-file-formats.md => tree structured file formats.md (100%) rename tree-structures.md => tree structures.md (100%) rename tree-style-tab.md => tree style tab.md (100%) rename tree-style-tabs.md => tree style tabs.md (100%) rename true-colors.md => true colors.md (100%) rename true-colours.md => true colours.md (100%) rename true-names.md => true names.md (100%) rename try-yoga.md => try yoga.md (100%) rename tsegue-maryam-guebrou.md => tsegue maryam guebrou.md (100%) rename tv-series.md => tv series.md (100%) rename twice-the-first-time.md => twice the first time.md (100%) rename twitter-agora-integration.md => twitter agora integration.md (100%) rename twitter-could-be-an-agora.md => twitter could be an agora.md (100%) rename twitter-d-d-roles.md => twitter d d roles.md (100%) rename twitter-embeds.md => twitter embeds.md (100%) rename twitter-feature-requests.md => twitter feature requests.md (100%) rename twitter-go-links.md => twitter go links.md (100%) rename twitter-outage.md => twitter outage.md (100%) rename twitter-report.md => twitter report.md (100%) rename twitter-to-roam.md => twitter to roam.md (100%) rename twitter-todo.md => twitter todo.md (100%) rename twitter-zhuangzi.md => twitter zhuangzi.md (100%) rename tyler-alterman.md => tyler alterman.md (100%) rename tymothy-snyder.md => tymothy snyder.md (100%) rename ubi-zurich.md => ubi zurich.md (100%) rename ultra-fractal.md => ultra fractal.md (100%) rename un-goals-for-sustainable-development.md => un goals for sustainable development.md (100%) rename un-goals.md => un goals.md (100%) rename un-mundo-común.md => un mundo común.md (100%) rename un-objectives.md => un objectives.md (100%) rename unfair-privilege.md => unfair privilege.md (100%) rename unicode-arrows.md => unicode arrows.md (100%) rename unicode-slugify.md => unicode slugify.md (100%) rename unified-inbox-startup.md => unified inbox startup.md (100%) rename units-of-collaboration.md => units of collaboration.md (100%) rename universal-basic-income.md => universal basic income.md (100%) rename universal-paperclips.md => universal paperclips.md (100%) rename unix-philosophy.md => unix philosophy.md (100%) rename unnamed-culture-project.md => unnamed culture project.md (100%) rename unqualified-reservations.md => unqualified reservations.md (100%) rename untitled-1.md => untitled 1.md (100%) rename untitled-2.md => untitled 2.md (100%) rename untitled-3.md => untitled 3.md (100%) rename upgrade-capitalism.md => upgrade capitalism.md (100%) rename useful-definitions.md => useful definitions.md (100%) rename user-links.md => user links.md (100%) rename using-the-agora.md => using the agora.md (100%) rename utopia-coffee.md => utopia coffee.md (100%) rename utopia-for-realists.md => utopia for realists.md (100%) rename vacation-2020.md => vacation 2020.md (100%) rename val-flores.md => val flores.md (100%) rename vc-space.md => vc space.md (100%) rename vickrey-auction.md => vickrey auction.md (100%) rename vicrey-auction.md => vicrey auction.md (100%) rename victor-hugo.md => victor hugo.md (100%) rename vijay-shankar-v.md => vijay shankar v.md (100%) rename ville-radieuse.md => ville radieuse.md (100%) rename vinay-gupta.md => vinay gupta.md (100%) rename vince-fakhoury-horn.md => vince fakhoury horn.md (100%) rename violent-revolution.md => violent revolution.md (100%) rename virtual-bolo.md => virtual bolo.md (100%) rename virtue-signaling.md => virtue signaling.md (100%) rename vocdoni-io.md => vocdoni io.md (100%) rename voltairine-de-cleyre-.md => voltairine de cleyre .md (100%) rename vscode-extension.md => vscode extension.md (100%) rename vscode-settings-sync.md => vscode settings sync.md (100%) rename walter-benjamin.md => walter benjamin.md (100%) rename ward-cunningham.md => ward cunningham.md (100%) rename warren-mcculloch.md => warren mcculloch.md (100%) rename waterfall-chart.md => waterfall chart.md (100%) rename waterfall-charts.md => waterfall charts.md (100%) rename web-annotations.md => web annotations.md (100%) rename web-browser.md => web browser.md (100%) rename web-browsers.md => web browsers.md (100%) rename web-dubois.md => web dubois.md (100%) rename web-extension.md => web extension.md (100%) rename web-extensions.md => web extensions.md (100%) rename web-monetization.md => web monetization.md (100%) rename week-12.md => week 12.md (100%) rename weekend-11.md => weekend 11.md (100%) rename weekend-17.md => weekend 17.md (100%) rename weekend-wednesday.md => weekend wednesday.md (100%) rename weekly-plan.md => weekly plan.md (100%) rename weekly-reviews.md => weekly reviews.md (100%) rename welkin-core.md => welkin core.md (100%) rename wendy-doniger.md => wendy doniger.md (100%) rename wendy-hanamura.md => wendy hanamura.md (100%) rename what-i-do-with-my-time-on-wednesdays.md => what i do with my time on wednesdays.md (100%) rename what-is-a-distributed-knowledge-graph.md => what is a distributed knowledge graph.md (100%) rename what-is-flancia-like.md => what is flancia like.md (100%) rename what-shape-are-you.md => what shape are you.md (100%) rename what-the-hell.md => what the hell.md (100%) rename where-did-software-go-wrong.md => where did software go wrong.md (100%) rename which-other-languages-should-you-learn-and-why.md => which other languages should you learn and why.md (100%) rename whipping-privilege.md => whipping privilege.md (100%) rename why-i-am-not-a-buddhist.md => why i am not a buddhist.md (100%) rename why-worker-cooperatives-are-a-bad-strategy.md => why worker cooperatives are a bad strategy.md (100%) rename wiki-engines.md => wiki engines.md (100%) rename wiki-modes.md => wiki modes.md (100%) rename wikidata-integration.md => wikidata integration.md (100%) rename wikidata-subsetting.md => wikidata subsetting.md (100%) rename wikilinked-tools.md => wikilinked tools.md (100%) rename wikilinking-tools.md => wikilinking tools.md (100%) rename wikilinks-everywhere.md => wikilinks everywhere.md (100%) rename will-walker.md => will walker.md (100%) rename william-james.md => william james.md (100%) rename william-macaskill.md => william macaskill.md (100%) rename wilmer-van-der-gaast.md => wilmer van der gaast.md (100%) rename window-manager.md => window manager.md (100%) rename wittgenstein-plays-chess-with-marcel-duchamp.md => wittgenstein plays chess with marcel duchamp.md (100%) rename wittgenstein-plays-chess.md => wittgenstein plays chess.md (100%) rename wittgenstein-protocol.md => wittgenstein protocol.md (100%) rename wonder-me.md => wonder me.md (100%) rename wong-kar-wai.md => wong kar wai.md (100%) rename work-after-work.md => work after work.md (100%) rename work-in-progress.md => work in progress.md (100%) rename work-in-public.md => work in public.md (100%) rename working-in-public.md => working in public.md (100%) rename world-building.md => world building.md (100%) rename world-improvement.md => world improvement.md (100%) rename world-university-and-school.md => world university and school.md (100%) rename worry-dream.md => worry dream.md (100%) rename write-freely.md => write freely.md (100%) rename writing-is-an-aid-to-memory.md => writing is an aid to memory.md (100%) rename wu-ming.md => wu ming.md (100%) rename x-frame.md => x frame.md (100%) rename yancey-strickler.md => yancey strickler.md (100%) rename yoga-15.md => yoga 15.md (100%) rename yoga-17.md => yoga 17.md (100%) rename yoga-arrive.md => yoga arrive.md (100%) rename yoga-arrivr.md => yoga arrivr.md (100%) rename yoga-breath.md => yoga breath.md (100%) rename yoga-butt-kicking.md => yoga butt kicking.md (100%) rename yoga-spinal-health.md => yoga spinal health.md (100%) rename yoga-with-adriene.md => yoga with adriene.md (100%) rename yotam-ottolenghi.md => yotam ottolenghi.md (100%) rename youtube-channel.md => youtube channel.md (100%) rename yuval-noah-harari.md => yuval noah harari.md (100%) rename zeitgeist-movement.md => zeitgeist movement.md (100%) rename zen-mind-beginner-s-mind.md => zen mind beginner s mind.md (100%) rename zeta-mask-yo.md => zeta mask yo.md (100%) rename zoom-games.md => zoom games.md (100%) rename zulip-matrix-bridge.md => zulip matrix bridge.md (100%) diff --git a/0-5-6.md b/0 5 6.md similarity index 100% rename from 0-5-6.md rename to 0 5 6.md diff --git a/0oo-li.md b/0oo li.md similarity index 100% rename from 0oo-li.md rename to 0oo li.md diff --git a/1-rule.md b/1 rule.md similarity index 100% rename from 1-rule.md rename to 1 rule.md diff --git a/10-happier.md b/10 happier.md similarity index 100% rename from 10-happier.md rename to 10 happier.md diff --git a/13-sentinels-aegis-rim.md b/13 sentinels aegis rim.md similarity index 100% rename from 13-sentinels-aegis-rim.md rename to 13 sentinels aegis rim.md diff --git a/17-40.md b/17 40.md similarity index 100% rename from 17-40.md rename to 17 40.md diff --git a/1989-chilean-grape-scare.md b/1989 chilean grape scare.md similarity index 100% rename from 1989-chilean-grape-scare.md rename to 1989 chilean grape scare.md diff --git a/2020-04-03.md b/2020 04 03.md similarity index 100% rename from 2020-04-03.md rename to 2020 04 03.md diff --git a/2020-04-05.md b/2020 04 05.md similarity index 100% rename from 2020-04-05.md rename to 2020 04 05.md diff --git a/2020-04-06.md b/2020 04 06.md similarity index 100% rename from 2020-04-06.md rename to 2020 04 06.md diff --git a/2020-04-07.md b/2020 04 07.md similarity index 100% rename from 2020-04-07.md rename to 2020 04 07.md diff --git a/2020-04-09.md b/2020 04 09.md similarity index 100% rename from 2020-04-09.md rename to 2020 04 09.md diff --git a/2020-04-10.md b/2020 04 10.md similarity index 100% rename from 2020-04-10.md rename to 2020 04 10.md diff --git a/2020-04-11.md b/2020 04 11.md similarity index 100% rename from 2020-04-11.md rename to 2020 04 11.md diff --git a/2020-04-12.md b/2020 04 12.md similarity index 100% rename from 2020-04-12.md rename to 2020 04 12.md diff --git a/2020-04-13.md b/2020 04 13.md similarity index 100% rename from 2020-04-13.md rename to 2020 04 13.md diff --git a/2020-04-17.md b/2020 04 17.md similarity index 100% rename from 2020-04-17.md rename to 2020 04 17.md diff --git a/2020-04-18.md b/2020 04 18.md similarity index 100% rename from 2020-04-18.md rename to 2020 04 18.md diff --git a/2020-04-19.md b/2020 04 19.md similarity index 100% rename from 2020-04-19.md rename to 2020 04 19.md diff --git a/2020-04-22.md b/2020 04 22.md similarity index 100% rename from 2020-04-22.md rename to 2020 04 22.md diff --git a/2020-04-23.md b/2020 04 23.md similarity index 100% rename from 2020-04-23.md rename to 2020 04 23.md diff --git a/2020-04-24.md b/2020 04 24.md similarity index 100% rename from 2020-04-24.md rename to 2020 04 24.md diff --git a/2020-04-25.md b/2020 04 25.md similarity index 100% rename from 2020-04-25.md rename to 2020 04 25.md diff --git a/2020-04-26.md b/2020 04 26.md similarity index 100% rename from 2020-04-26.md rename to 2020 04 26.md diff --git a/2020-04-27.md b/2020 04 27.md similarity index 100% rename from 2020-04-27.md rename to 2020 04 27.md diff --git a/2020-05-01.md b/2020 05 01.md similarity index 100% rename from 2020-05-01.md rename to 2020 05 01.md diff --git a/2020-05-02.md b/2020 05 02.md similarity index 100% rename from 2020-05-02.md rename to 2020 05 02.md diff --git a/2020-05-03.md b/2020 05 03.md similarity index 100% rename from 2020-05-03.md rename to 2020 05 03.md diff --git a/2020-05-04.md b/2020 05 04.md similarity index 100% rename from 2020-05-04.md rename to 2020 05 04.md diff --git a/2020-05-05.md b/2020 05 05.md similarity index 100% rename from 2020-05-05.md rename to 2020 05 05.md diff --git a/2020-05-06.md b/2020 05 06.md similarity index 100% rename from 2020-05-06.md rename to 2020 05 06.md diff --git a/2020-05-07.md b/2020 05 07.md similarity index 100% rename from 2020-05-07.md rename to 2020 05 07.md diff --git a/2020-05-08.md b/2020 05 08.md similarity index 100% rename from 2020-05-08.md rename to 2020 05 08.md diff --git a/2020-05-09.md b/2020 05 09.md similarity index 100% rename from 2020-05-09.md rename to 2020 05 09.md diff --git a/2020-05-10.md b/2020 05 10.md similarity index 100% rename from 2020-05-10.md rename to 2020 05 10.md diff --git a/2020-05-15.md b/2020 05 15.md similarity index 100% rename from 2020-05-15.md rename to 2020 05 15.md diff --git a/2020-05-16.md b/2020 05 16.md similarity index 100% rename from 2020-05-16.md rename to 2020 05 16.md diff --git a/2020-05-17.md b/2020 05 17.md similarity index 100% rename from 2020-05-17.md rename to 2020 05 17.md diff --git a/2020-05-18.md b/2020 05 18.md similarity index 100% rename from 2020-05-18.md rename to 2020 05 18.md diff --git a/2020-05-19.md b/2020 05 19.md similarity index 100% rename from 2020-05-19.md rename to 2020 05 19.md diff --git a/2020-05-20.md b/2020 05 20.md similarity index 100% rename from 2020-05-20.md rename to 2020 05 20.md diff --git a/2020-05-21.md b/2020 05 21.md similarity index 100% rename from 2020-05-21.md rename to 2020 05 21.md diff --git a/2020-05-22.md b/2020 05 22.md similarity index 100% rename from 2020-05-22.md rename to 2020 05 22.md diff --git a/2020-05-23.md b/2020 05 23.md similarity index 100% rename from 2020-05-23.md rename to 2020 05 23.md diff --git a/2020-05-24.md b/2020 05 24.md similarity index 100% rename from 2020-05-24.md rename to 2020 05 24.md diff --git a/2020-06-01.md b/2020 06 01.md similarity index 100% rename from 2020-06-01.md rename to 2020 06 01.md diff --git a/2020-06-02.md b/2020 06 02.md similarity index 100% rename from 2020-06-02.md rename to 2020 06 02.md diff --git a/2020-06-03.md b/2020 06 03.md similarity index 100% rename from 2020-06-03.md rename to 2020 06 03.md diff --git a/2020-06-04.md b/2020 06 04.md similarity index 100% rename from 2020-06-04.md rename to 2020 06 04.md diff --git a/2020-06-06.md b/2020 06 06.md similarity index 100% rename from 2020-06-06.md rename to 2020 06 06.md diff --git a/2020-06-07.md b/2020 06 07.md similarity index 100% rename from 2020-06-07.md rename to 2020 06 07.md diff --git a/2020-06-08.md b/2020 06 08.md similarity index 100% rename from 2020-06-08.md rename to 2020 06 08.md diff --git a/2020-06-09.md b/2020 06 09.md similarity index 100% rename from 2020-06-09.md rename to 2020 06 09.md diff --git a/2020-06-10.md b/2020 06 10.md similarity index 100% rename from 2020-06-10.md rename to 2020 06 10.md diff --git a/2020-06-11.md b/2020 06 11.md similarity index 100% rename from 2020-06-11.md rename to 2020 06 11.md diff --git a/2020-06-12.md b/2020 06 12.md similarity index 100% rename from 2020-06-12.md rename to 2020 06 12.md diff --git a/2020-06-13.md b/2020 06 13.md similarity index 100% rename from 2020-06-13.md rename to 2020 06 13.md diff --git a/2020-06-14.md b/2020 06 14.md similarity index 100% rename from 2020-06-14.md rename to 2020 06 14.md diff --git a/2020-06-15.md b/2020 06 15.md similarity index 100% rename from 2020-06-15.md rename to 2020 06 15.md diff --git a/2020-06-16.md b/2020 06 16.md similarity index 100% rename from 2020-06-16.md rename to 2020 06 16.md diff --git a/2020-06-17.md b/2020 06 17.md similarity index 100% rename from 2020-06-17.md rename to 2020 06 17.md diff --git a/2020-06-18.md b/2020 06 18.md similarity index 100% rename from 2020-06-18.md rename to 2020 06 18.md diff --git a/2020-06-19.md b/2020 06 19.md similarity index 100% rename from 2020-06-19.md rename to 2020 06 19.md diff --git a/2020-06-20.md b/2020 06 20.md similarity index 100% rename from 2020-06-20.md rename to 2020 06 20.md diff --git a/2020-06-21.md b/2020 06 21.md similarity index 100% rename from 2020-06-21.md rename to 2020 06 21.md diff --git a/2020-06-24.md b/2020 06 24.md similarity index 100% rename from 2020-06-24.md rename to 2020 06 24.md diff --git a/2020-06-27.md b/2020 06 27.md similarity index 100% rename from 2020-06-27.md rename to 2020 06 27.md diff --git a/2020-06-28.md b/2020 06 28.md similarity index 100% rename from 2020-06-28.md rename to 2020 06 28.md diff --git a/2020-06-29.md b/2020 06 29.md similarity index 100% rename from 2020-06-29.md rename to 2020 06 29.md diff --git a/2020-07-04.md b/2020 07 04.md similarity index 100% rename from 2020-07-04.md rename to 2020 07 04.md diff --git a/2020-07-05.md b/2020 07 05.md similarity index 100% rename from 2020-07-05.md rename to 2020 07 05.md diff --git a/2020-07-06.md b/2020 07 06.md similarity index 100% rename from 2020-07-06.md rename to 2020 07 06.md diff --git a/2020-07-07.md b/2020 07 07.md similarity index 100% rename from 2020-07-07.md rename to 2020 07 07.md diff --git a/2020-07-08.md b/2020 07 08.md similarity index 100% rename from 2020-07-08.md rename to 2020 07 08.md diff --git a/2020-07-09.md b/2020 07 09.md similarity index 100% rename from 2020-07-09.md rename to 2020 07 09.md diff --git a/2020-07-10.md b/2020 07 10.md similarity index 100% rename from 2020-07-10.md rename to 2020 07 10.md diff --git a/2020-07-11.md b/2020 07 11.md similarity index 100% rename from 2020-07-11.md rename to 2020 07 11.md diff --git a/2020-07-12.md b/2020 07 12.md similarity index 100% rename from 2020-07-12.md rename to 2020 07 12.md diff --git a/2020-07-14.md b/2020 07 14.md similarity index 100% rename from 2020-07-14.md rename to 2020 07 14.md diff --git a/2020-07-15.md b/2020 07 15.md similarity index 100% rename from 2020-07-15.md rename to 2020 07 15.md diff --git a/2020-07-16.md b/2020 07 16.md similarity index 100% rename from 2020-07-16.md rename to 2020 07 16.md diff --git a/2020-07-17.md b/2020 07 17.md similarity index 100% rename from 2020-07-17.md rename to 2020 07 17.md diff --git a/2020-07-18.md b/2020 07 18.md similarity index 100% rename from 2020-07-18.md rename to 2020 07 18.md diff --git a/2020-07-19.md b/2020 07 19.md similarity index 100% rename from 2020-07-19.md rename to 2020 07 19.md diff --git a/2020-07-20.md b/2020 07 20.md similarity index 100% rename from 2020-07-20.md rename to 2020 07 20.md diff --git a/2020-07-21.md b/2020 07 21.md similarity index 100% rename from 2020-07-21.md rename to 2020 07 21.md diff --git a/2020-07-22.md b/2020 07 22.md similarity index 100% rename from 2020-07-22.md rename to 2020 07 22.md diff --git a/2020-07-23.md b/2020 07 23.md similarity index 100% rename from 2020-07-23.md rename to 2020 07 23.md diff --git a/2020-07-24.md b/2020 07 24.md similarity index 100% rename from 2020-07-24.md rename to 2020 07 24.md diff --git a/2020-07-25.md b/2020 07 25.md similarity index 100% rename from 2020-07-25.md rename to 2020 07 25.md diff --git a/2020-07-26.md b/2020 07 26.md similarity index 100% rename from 2020-07-26.md rename to 2020 07 26.md diff --git a/2020-07-27.md b/2020 07 27.md similarity index 100% rename from 2020-07-27.md rename to 2020 07 27.md diff --git a/2020-07-29.md b/2020 07 29.md similarity index 100% rename from 2020-07-29.md rename to 2020 07 29.md diff --git a/2020-07-30.md b/2020 07 30.md similarity index 100% rename from 2020-07-30.md rename to 2020 07 30.md diff --git a/2020-07-31.md b/2020 07 31.md similarity index 100% rename from 2020-07-31.md rename to 2020 07 31.md diff --git a/2020-08-01.md b/2020 08 01.md similarity index 100% rename from 2020-08-01.md rename to 2020 08 01.md diff --git a/2020-08-02.md b/2020 08 02.md similarity index 100% rename from 2020-08-02.md rename to 2020 08 02.md diff --git a/2020-08-03.md b/2020 08 03.md similarity index 100% rename from 2020-08-03.md rename to 2020 08 03.md diff --git a/2020-08-04.md b/2020 08 04.md similarity index 100% rename from 2020-08-04.md rename to 2020 08 04.md diff --git a/2020-08-05.md b/2020 08 05.md similarity index 100% rename from 2020-08-05.md rename to 2020 08 05.md diff --git a/2020-08-06.md b/2020 08 06.md similarity index 100% rename from 2020-08-06.md rename to 2020 08 06.md diff --git a/2020-08-07.md b/2020 08 07.md similarity index 100% rename from 2020-08-07.md rename to 2020 08 07.md diff --git a/2020-08-08.md b/2020 08 08.md similarity index 100% rename from 2020-08-08.md rename to 2020 08 08.md diff --git a/2020-08-09.md b/2020 08 09.md similarity index 100% rename from 2020-08-09.md rename to 2020 08 09.md diff --git a/2020-08-10.md b/2020 08 10.md similarity index 100% rename from 2020-08-10.md rename to 2020 08 10.md diff --git a/2020-08-11.md b/2020 08 11.md similarity index 100% rename from 2020-08-11.md rename to 2020 08 11.md diff --git a/2020-08-12.md b/2020 08 12.md similarity index 100% rename from 2020-08-12.md rename to 2020 08 12.md diff --git a/2020-08-13.md b/2020 08 13.md similarity index 100% rename from 2020-08-13.md rename to 2020 08 13.md diff --git a/2020-08-14.md b/2020 08 14.md similarity index 100% rename from 2020-08-14.md rename to 2020 08 14.md diff --git a/2020-08-15.md b/2020 08 15.md similarity index 100% rename from 2020-08-15.md rename to 2020 08 15.md diff --git a/2020-08-16.md b/2020 08 16.md similarity index 100% rename from 2020-08-16.md rename to 2020 08 16.md diff --git a/2020-08-17.md b/2020 08 17.md similarity index 100% rename from 2020-08-17.md rename to 2020 08 17.md diff --git a/2020-08-18.md b/2020 08 18.md similarity index 100% rename from 2020-08-18.md rename to 2020 08 18.md diff --git a/2020-08-19.md b/2020 08 19.md similarity index 100% rename from 2020-08-19.md rename to 2020 08 19.md diff --git a/2020-08-20.md b/2020 08 20.md similarity index 100% rename from 2020-08-20.md rename to 2020 08 20.md diff --git a/2020-08-21.md b/2020 08 21.md similarity index 100% rename from 2020-08-21.md rename to 2020 08 21.md diff --git a/2020-08-22.md b/2020 08 22.md similarity index 100% rename from 2020-08-22.md rename to 2020 08 22.md diff --git a/2020-08-23.md b/2020 08 23.md similarity index 100% rename from 2020-08-23.md rename to 2020 08 23.md diff --git a/2020-08-24.md b/2020 08 24.md similarity index 100% rename from 2020-08-24.md rename to 2020 08 24.md diff --git a/2020-08-25.md b/2020 08 25.md similarity index 100% rename from 2020-08-25.md rename to 2020 08 25.md diff --git a/2020-08-26.md b/2020 08 26.md similarity index 100% rename from 2020-08-26.md rename to 2020 08 26.md diff --git a/2020-08-27.md b/2020 08 27.md similarity index 100% rename from 2020-08-27.md rename to 2020 08 27.md diff --git a/2020-08-28.md b/2020 08 28.md similarity index 100% rename from 2020-08-28.md rename to 2020 08 28.md diff --git a/2020-08-29.md b/2020 08 29.md similarity index 100% rename from 2020-08-29.md rename to 2020 08 29.md diff --git a/2020-08-30.md b/2020 08 30.md similarity index 100% rename from 2020-08-30.md rename to 2020 08 30.md diff --git a/2020-08-31.md b/2020 08 31.md similarity index 100% rename from 2020-08-31.md rename to 2020 08 31.md diff --git a/2020-09-01.md b/2020 09 01.md similarity index 100% rename from 2020-09-01.md rename to 2020 09 01.md diff --git a/2020-09-02.md b/2020 09 02.md similarity index 100% rename from 2020-09-02.md rename to 2020 09 02.md diff --git a/2020-09-03.md b/2020 09 03.md similarity index 100% rename from 2020-09-03.md rename to 2020 09 03.md diff --git a/2020-09-04.md b/2020 09 04.md similarity index 100% rename from 2020-09-04.md rename to 2020 09 04.md diff --git a/2020-09-05.md b/2020 09 05.md similarity index 100% rename from 2020-09-05.md rename to 2020 09 05.md diff --git a/2020-09-06.md b/2020 09 06.md similarity index 100% rename from 2020-09-06.md rename to 2020 09 06.md diff --git a/2020-09-07.md b/2020 09 07.md similarity index 100% rename from 2020-09-07.md rename to 2020 09 07.md diff --git a/2020-09-08.md b/2020 09 08.md similarity index 100% rename from 2020-09-08.md rename to 2020 09 08.md diff --git a/2020-09-09.md b/2020 09 09.md similarity index 100% rename from 2020-09-09.md rename to 2020 09 09.md diff --git a/2020-09-10.md b/2020 09 10.md similarity index 100% rename from 2020-09-10.md rename to 2020 09 10.md diff --git a/2020-09-11.md b/2020 09 11.md similarity index 100% rename from 2020-09-11.md rename to 2020 09 11.md diff --git a/2020-09-12.md b/2020 09 12.md similarity index 100% rename from 2020-09-12.md rename to 2020 09 12.md diff --git a/2020-09-13.md b/2020 09 13.md similarity index 100% rename from 2020-09-13.md rename to 2020 09 13.md diff --git a/2020-09-14.md b/2020 09 14.md similarity index 100% rename from 2020-09-14.md rename to 2020 09 14.md diff --git a/2020-09-15.md b/2020 09 15.md similarity index 100% rename from 2020-09-15.md rename to 2020 09 15.md diff --git a/2020-09-16.md b/2020 09 16.md similarity index 100% rename from 2020-09-16.md rename to 2020 09 16.md diff --git a/2020-09-17.md b/2020 09 17.md similarity index 100% rename from 2020-09-17.md rename to 2020 09 17.md diff --git a/2020-09-18.md b/2020 09 18.md similarity index 100% rename from 2020-09-18.md rename to 2020 09 18.md diff --git a/2020-09-19.md b/2020 09 19.md similarity index 100% rename from 2020-09-19.md rename to 2020 09 19.md diff --git a/2020-09-20.md b/2020 09 20.md similarity index 100% rename from 2020-09-20.md rename to 2020 09 20.md diff --git a/2020-09-21.md b/2020 09 21.md similarity index 100% rename from 2020-09-21.md rename to 2020 09 21.md diff --git a/2020-09-22.md b/2020 09 22.md similarity index 100% rename from 2020-09-22.md rename to 2020 09 22.md diff --git a/2020-09-23.md b/2020 09 23.md similarity index 100% rename from 2020-09-23.md rename to 2020 09 23.md diff --git a/2020-09-24.md b/2020 09 24.md similarity index 100% rename from 2020-09-24.md rename to 2020 09 24.md diff --git a/2020-09-25.md b/2020 09 25.md similarity index 100% rename from 2020-09-25.md rename to 2020 09 25.md diff --git a/2020-09-26.md b/2020 09 26.md similarity index 100% rename from 2020-09-26.md rename to 2020 09 26.md diff --git a/2020-09-27.md b/2020 09 27.md similarity index 100% rename from 2020-09-27.md rename to 2020 09 27.md diff --git a/2020-09-28.md b/2020 09 28.md similarity index 100% rename from 2020-09-28.md rename to 2020 09 28.md diff --git a/2020-09-29.md b/2020 09 29.md similarity index 100% rename from 2020-09-29.md rename to 2020 09 29.md diff --git a/2020-09-30.md b/2020 09 30.md similarity index 100% rename from 2020-09-30.md rename to 2020 09 30.md diff --git a/2020-10-01.md b/2020 10 01.md similarity index 100% rename from 2020-10-01.md rename to 2020 10 01.md diff --git a/2020-10-02.md b/2020 10 02.md similarity index 100% rename from 2020-10-02.md rename to 2020 10 02.md diff --git a/2020-10-03.md b/2020 10 03.md similarity index 100% rename from 2020-10-03.md rename to 2020 10 03.md diff --git a/2020-10-04.md b/2020 10 04.md similarity index 100% rename from 2020-10-04.md rename to 2020 10 04.md diff --git a/2020-10-05.md b/2020 10 05.md similarity index 100% rename from 2020-10-05.md rename to 2020 10 05.md diff --git a/2020-10-06.md b/2020 10 06.md similarity index 100% rename from 2020-10-06.md rename to 2020 10 06.md diff --git a/2020-10-07.md b/2020 10 07.md similarity index 100% rename from 2020-10-07.md rename to 2020 10 07.md diff --git a/2020-10-08.md b/2020 10 08.md similarity index 100% rename from 2020-10-08.md rename to 2020 10 08.md diff --git a/2020-10-09.md b/2020 10 09.md similarity index 100% rename from 2020-10-09.md rename to 2020 10 09.md diff --git a/2020-10-10.md b/2020 10 10.md similarity index 100% rename from 2020-10-10.md rename to 2020 10 10.md diff --git a/2020-10-11.md b/2020 10 11.md similarity index 100% rename from 2020-10-11.md rename to 2020 10 11.md diff --git a/2020-10-12.md b/2020 10 12.md similarity index 100% rename from 2020-10-12.md rename to 2020 10 12.md diff --git a/2020-10-13.md b/2020 10 13.md similarity index 100% rename from 2020-10-13.md rename to 2020 10 13.md diff --git a/2020-10-14.md b/2020 10 14.md similarity index 100% rename from 2020-10-14.md rename to 2020 10 14.md diff --git a/2020-10-15.md b/2020 10 15.md similarity index 100% rename from 2020-10-15.md rename to 2020 10 15.md diff --git a/2020-10-16.md b/2020 10 16.md similarity index 100% rename from 2020-10-16.md rename to 2020 10 16.md diff --git a/2020-10-17.md b/2020 10 17.md similarity index 100% rename from 2020-10-17.md rename to 2020 10 17.md diff --git a/2020-10-18.md b/2020 10 18.md similarity index 100% rename from 2020-10-18.md rename to 2020 10 18.md diff --git a/2020-10-19.md b/2020 10 19.md similarity index 100% rename from 2020-10-19.md rename to 2020 10 19.md diff --git a/2020-10-20.md b/2020 10 20.md similarity index 100% rename from 2020-10-20.md rename to 2020 10 20.md diff --git a/2020-10-21.md b/2020 10 21.md similarity index 100% rename from 2020-10-21.md rename to 2020 10 21.md diff --git a/2020-10-22.md b/2020 10 22.md similarity index 100% rename from 2020-10-22.md rename to 2020 10 22.md diff --git a/2020-10-23.md b/2020 10 23.md similarity index 100% rename from 2020-10-23.md rename to 2020 10 23.md diff --git a/2020-10-24.md b/2020 10 24.md similarity index 100% rename from 2020-10-24.md rename to 2020 10 24.md diff --git a/2020-10-25.md b/2020 10 25.md similarity index 100% rename from 2020-10-25.md rename to 2020 10 25.md diff --git a/2020-10-26.md b/2020 10 26.md similarity index 100% rename from 2020-10-26.md rename to 2020 10 26.md diff --git a/2020-10-27.md b/2020 10 27.md similarity index 100% rename from 2020-10-27.md rename to 2020 10 27.md diff --git a/2020-10-28.md b/2020 10 28.md similarity index 100% rename from 2020-10-28.md rename to 2020 10 28.md diff --git a/2020-10-29.md b/2020 10 29.md similarity index 100% rename from 2020-10-29.md rename to 2020 10 29.md diff --git a/2020-10-30.md b/2020 10 30.md similarity index 100% rename from 2020-10-30.md rename to 2020 10 30.md diff --git a/2020-10-31.md b/2020 10 31.md similarity index 100% rename from 2020-10-31.md rename to 2020 10 31.md diff --git a/2020-11-01.md b/2020 11 01.md similarity index 100% rename from 2020-11-01.md rename to 2020 11 01.md diff --git a/2020-11-02.md b/2020 11 02.md similarity index 100% rename from 2020-11-02.md rename to 2020 11 02.md diff --git a/2020-11-03.md b/2020 11 03.md similarity index 100% rename from 2020-11-03.md rename to 2020 11 03.md diff --git a/2020-11-04.md b/2020 11 04.md similarity index 100% rename from 2020-11-04.md rename to 2020 11 04.md diff --git a/2020-11-05.md b/2020 11 05.md similarity index 100% rename from 2020-11-05.md rename to 2020 11 05.md diff --git a/2020-11-06.md b/2020 11 06.md similarity index 100% rename from 2020-11-06.md rename to 2020 11 06.md diff --git a/2020-11-07.md b/2020 11 07.md similarity index 100% rename from 2020-11-07.md rename to 2020 11 07.md diff --git a/2020-11-08.md b/2020 11 08.md similarity index 100% rename from 2020-11-08.md rename to 2020 11 08.md diff --git a/2020-11-09.md b/2020 11 09.md similarity index 100% rename from 2020-11-09.md rename to 2020 11 09.md diff --git a/2020-11-10.md b/2020 11 10.md similarity index 100% rename from 2020-11-10.md rename to 2020 11 10.md diff --git a/2020-11-11.md b/2020 11 11.md similarity index 100% rename from 2020-11-11.md rename to 2020 11 11.md diff --git a/2020-11-12.md b/2020 11 12.md similarity index 100% rename from 2020-11-12.md rename to 2020 11 12.md diff --git a/2020-11-13.md b/2020 11 13.md similarity index 100% rename from 2020-11-13.md rename to 2020 11 13.md diff --git a/2020-11-14.md b/2020 11 14.md similarity index 100% rename from 2020-11-14.md rename to 2020 11 14.md diff --git a/2020-11-15.md b/2020 11 15.md similarity index 100% rename from 2020-11-15.md rename to 2020 11 15.md diff --git a/2020-11-16.md b/2020 11 16.md similarity index 100% rename from 2020-11-16.md rename to 2020 11 16.md diff --git a/2020-11-17.md b/2020 11 17.md similarity index 100% rename from 2020-11-17.md rename to 2020 11 17.md diff --git a/2020-11-18.md b/2020 11 18.md similarity index 100% rename from 2020-11-18.md rename to 2020 11 18.md diff --git a/2020-11-19.md b/2020 11 19.md similarity index 100% rename from 2020-11-19.md rename to 2020 11 19.md diff --git a/2020-11-20.md b/2020 11 20.md similarity index 100% rename from 2020-11-20.md rename to 2020 11 20.md diff --git a/2020-11-21.md b/2020 11 21.md similarity index 100% rename from 2020-11-21.md rename to 2020 11 21.md diff --git a/2020-11-22.md b/2020 11 22.md similarity index 100% rename from 2020-11-22.md rename to 2020 11 22.md diff --git a/2020-11-23.md b/2020 11 23.md similarity index 100% rename from 2020-11-23.md rename to 2020 11 23.md diff --git a/2020-11-24.md b/2020 11 24.md similarity index 100% rename from 2020-11-24.md rename to 2020 11 24.md diff --git a/2020-11-25.md b/2020 11 25.md similarity index 100% rename from 2020-11-25.md rename to 2020 11 25.md diff --git a/2020-11-26.md b/2020 11 26.md similarity index 100% rename from 2020-11-26.md rename to 2020 11 26.md diff --git a/2020-11-27.md b/2020 11 27.md similarity index 100% rename from 2020-11-27.md rename to 2020 11 27.md diff --git a/2020-11-28.md b/2020 11 28.md similarity index 100% rename from 2020-11-28.md rename to 2020 11 28.md diff --git a/2020-11-29.md b/2020 11 29.md similarity index 100% rename from 2020-11-29.md rename to 2020 11 29.md diff --git a/2020-11-30.md b/2020 11 30.md similarity index 100% rename from 2020-11-30.md rename to 2020 11 30.md diff --git a/2020-12-01.md b/2020 12 01.md similarity index 100% rename from 2020-12-01.md rename to 2020 12 01.md diff --git a/2020-12-02.md b/2020 12 02.md similarity index 100% rename from 2020-12-02.md rename to 2020 12 02.md diff --git a/2020-12-03.md b/2020 12 03.md similarity index 100% rename from 2020-12-03.md rename to 2020 12 03.md diff --git a/2020-12-04.md b/2020 12 04.md similarity index 100% rename from 2020-12-04.md rename to 2020 12 04.md diff --git a/2020-12-05.md b/2020 12 05.md similarity index 100% rename from 2020-12-05.md rename to 2020 12 05.md diff --git a/2020-12-06.md b/2020 12 06.md similarity index 100% rename from 2020-12-06.md rename to 2020 12 06.md diff --git a/2020-12-07.md b/2020 12 07.md similarity index 100% rename from 2020-12-07.md rename to 2020 12 07.md diff --git a/2020-12-08.md b/2020 12 08.md similarity index 100% rename from 2020-12-08.md rename to 2020 12 08.md diff --git a/2020-12-09.md b/2020 12 09.md similarity index 100% rename from 2020-12-09.md rename to 2020 12 09.md diff --git a/2020-12-10.md b/2020 12 10.md similarity index 100% rename from 2020-12-10.md rename to 2020 12 10.md diff --git a/2020-12-11.md b/2020 12 11.md similarity index 100% rename from 2020-12-11.md rename to 2020 12 11.md diff --git a/2020-12-12.md b/2020 12 12.md similarity index 100% rename from 2020-12-12.md rename to 2020 12 12.md diff --git a/2020-12-13.md b/2020 12 13.md similarity index 100% rename from 2020-12-13.md rename to 2020 12 13.md diff --git a/2020-12-14.md b/2020 12 14.md similarity index 100% rename from 2020-12-14.md rename to 2020 12 14.md diff --git a/2020-12-15.md b/2020 12 15.md similarity index 100% rename from 2020-12-15.md rename to 2020 12 15.md diff --git a/2020-12-16.md b/2020 12 16.md similarity index 100% rename from 2020-12-16.md rename to 2020 12 16.md diff --git a/2020-12-17.md b/2020 12 17.md similarity index 100% rename from 2020-12-17.md rename to 2020 12 17.md diff --git a/2020-12-18.md b/2020 12 18.md similarity index 100% rename from 2020-12-18.md rename to 2020 12 18.md diff --git a/2020-12-19.md b/2020 12 19.md similarity index 100% rename from 2020-12-19.md rename to 2020 12 19.md diff --git a/2020-12-20.md b/2020 12 20.md similarity index 100% rename from 2020-12-20.md rename to 2020 12 20.md diff --git a/2020-12-21.md b/2020 12 21.md similarity index 100% rename from 2020-12-21.md rename to 2020 12 21.md diff --git a/2020-12-22.md b/2020 12 22.md similarity index 100% rename from 2020-12-22.md rename to 2020 12 22.md diff --git a/2020-12-23.md b/2020 12 23.md similarity index 100% rename from 2020-12-23.md rename to 2020 12 23.md diff --git a/2020-12-24.md b/2020 12 24.md similarity index 100% rename from 2020-12-24.md rename to 2020 12 24.md diff --git a/2020-12-25.md b/2020 12 25.md similarity index 100% rename from 2020-12-25.md rename to 2020 12 25.md diff --git a/2020-12-26.md b/2020 12 26.md similarity index 100% rename from 2020-12-26.md rename to 2020 12 26.md diff --git a/2020-12-27.md b/2020 12 27.md similarity index 100% rename from 2020-12-27.md rename to 2020 12 27.md diff --git a/2020-12-28.md b/2020 12 28.md similarity index 100% rename from 2020-12-28.md rename to 2020 12 28.md diff --git a/2020-12-29.md b/2020 12 29.md similarity index 100% rename from 2020-12-29.md rename to 2020 12 29.md diff --git a/2020-12-30.md b/2020 12 30.md similarity index 100% rename from 2020-12-30.md rename to 2020 12 30.md diff --git a/2020-12-31.md b/2020 12 31.md similarity index 100% rename from 2020-12-31.md rename to 2020 12 31.md diff --git a/2021-01-01.md b/2021 01 01.md similarity index 100% rename from 2021-01-01.md rename to 2021 01 01.md diff --git a/2021-01-02.md b/2021 01 02.md similarity index 100% rename from 2021-01-02.md rename to 2021 01 02.md diff --git a/2021-01-03.md b/2021 01 03.md similarity index 100% rename from 2021-01-03.md rename to 2021 01 03.md diff --git a/2021-01-04.md b/2021 01 04.md similarity index 100% rename from 2021-01-04.md rename to 2021 01 04.md diff --git a/2021-01-05.md b/2021 01 05.md similarity index 100% rename from 2021-01-05.md rename to 2021 01 05.md diff --git a/2021-01-06.md b/2021 01 06.md similarity index 100% rename from 2021-01-06.md rename to 2021 01 06.md diff --git a/2021-01-07.md b/2021 01 07.md similarity index 100% rename from 2021-01-07.md rename to 2021 01 07.md diff --git a/2021-01-08.md b/2021 01 08.md similarity index 100% rename from 2021-01-08.md rename to 2021 01 08.md diff --git a/2021-01-09.md b/2021 01 09.md similarity index 100% rename from 2021-01-09.md rename to 2021 01 09.md diff --git a/2021-01-10.md b/2021 01 10.md similarity index 100% rename from 2021-01-10.md rename to 2021 01 10.md diff --git a/2021-01-11.md b/2021 01 11.md similarity index 100% rename from 2021-01-11.md rename to 2021 01 11.md diff --git a/2021-01-12.md b/2021 01 12.md similarity index 100% rename from 2021-01-12.md rename to 2021 01 12.md diff --git a/2021-01-13.md b/2021 01 13.md similarity index 100% rename from 2021-01-13.md rename to 2021 01 13.md diff --git a/2021-01-14.md b/2021 01 14.md similarity index 100% rename from 2021-01-14.md rename to 2021 01 14.md diff --git a/2021-01-15.md b/2021 01 15.md similarity index 100% rename from 2021-01-15.md rename to 2021 01 15.md diff --git a/2021-01-16.md b/2021 01 16.md similarity index 100% rename from 2021-01-16.md rename to 2021 01 16.md diff --git a/2021-01-17.md b/2021 01 17.md similarity index 100% rename from 2021-01-17.md rename to 2021 01 17.md diff --git a/2021-01-18.md b/2021 01 18.md similarity index 100% rename from 2021-01-18.md rename to 2021 01 18.md diff --git a/2021-01-19.md b/2021 01 19.md similarity index 100% rename from 2021-01-19.md rename to 2021 01 19.md diff --git a/2021-01-20.md b/2021 01 20.md similarity index 100% rename from 2021-01-20.md rename to 2021 01 20.md diff --git a/2021-01-21.md b/2021 01 21.md similarity index 100% rename from 2021-01-21.md rename to 2021 01 21.md diff --git a/2021-01-22.md b/2021 01 22.md similarity index 100% rename from 2021-01-22.md rename to 2021 01 22.md diff --git a/2021-01-23.md b/2021 01 23.md similarity index 100% rename from 2021-01-23.md rename to 2021 01 23.md diff --git a/2021-01-24.md b/2021 01 24.md similarity index 100% rename from 2021-01-24.md rename to 2021 01 24.md diff --git a/2021-01-25.md b/2021 01 25.md similarity index 100% rename from 2021-01-25.md rename to 2021 01 25.md diff --git a/2021-01-26.md b/2021 01 26.md similarity index 100% rename from 2021-01-26.md rename to 2021 01 26.md diff --git a/2021-01-27.md b/2021 01 27.md similarity index 100% rename from 2021-01-27.md rename to 2021 01 27.md diff --git a/2021-01-28.md b/2021 01 28.md similarity index 100% rename from 2021-01-28.md rename to 2021 01 28.md diff --git a/2021-01-29.md b/2021 01 29.md similarity index 100% rename from 2021-01-29.md rename to 2021 01 29.md diff --git a/2021-01-30.md b/2021 01 30.md similarity index 100% rename from 2021-01-30.md rename to 2021 01 30.md diff --git a/2021-01-31.md b/2021 01 31.md similarity index 100% rename from 2021-01-31.md rename to 2021 01 31.md diff --git a/2021-02-01.md b/2021 02 01.md similarity index 100% rename from 2021-02-01.md rename to 2021 02 01.md diff --git a/2021-02-02.md b/2021 02 02.md similarity index 100% rename from 2021-02-02.md rename to 2021 02 02.md diff --git a/2021-02-03.md b/2021 02 03.md similarity index 100% rename from 2021-02-03.md rename to 2021 02 03.md diff --git a/2021-02-04.md b/2021 02 04.md similarity index 100% rename from 2021-02-04.md rename to 2021 02 04.md diff --git a/2021-02-05.md b/2021 02 05.md similarity index 100% rename from 2021-02-05.md rename to 2021 02 05.md diff --git a/2021-02-06.md b/2021 02 06.md similarity index 100% rename from 2021-02-06.md rename to 2021 02 06.md diff --git a/2021-02-07.md b/2021 02 07.md similarity index 100% rename from 2021-02-07.md rename to 2021 02 07.md diff --git a/2021-02-08.md b/2021 02 08.md similarity index 100% rename from 2021-02-08.md rename to 2021 02 08.md diff --git a/2021-02-09.md b/2021 02 09.md similarity index 100% rename from 2021-02-09.md rename to 2021 02 09.md diff --git a/2021-02-10.md b/2021 02 10.md similarity index 100% rename from 2021-02-10.md rename to 2021 02 10.md diff --git a/2021-02-11.md b/2021 02 11.md similarity index 100% rename from 2021-02-11.md rename to 2021 02 11.md diff --git a/2021-02-12.md b/2021 02 12.md similarity index 100% rename from 2021-02-12.md rename to 2021 02 12.md diff --git a/2021-02-13.md b/2021 02 13.md similarity index 100% rename from 2021-02-13.md rename to 2021 02 13.md diff --git a/2021-02-14.md b/2021 02 14.md similarity index 100% rename from 2021-02-14.md rename to 2021 02 14.md diff --git a/2021-02-15.md b/2021 02 15.md similarity index 100% rename from 2021-02-15.md rename to 2021 02 15.md diff --git a/2021-02-16.md b/2021 02 16.md similarity index 100% rename from 2021-02-16.md rename to 2021 02 16.md diff --git a/2021-02-17.md b/2021 02 17.md similarity index 100% rename from 2021-02-17.md rename to 2021 02 17.md diff --git a/2021-02-18.md b/2021 02 18.md similarity index 100% rename from 2021-02-18.md rename to 2021 02 18.md diff --git a/2021-02-19.md b/2021 02 19.md similarity index 100% rename from 2021-02-19.md rename to 2021 02 19.md diff --git a/2021-02-20.md b/2021 02 20.md similarity index 100% rename from 2021-02-20.md rename to 2021 02 20.md diff --git a/2021-02-21.md b/2021 02 21.md similarity index 100% rename from 2021-02-21.md rename to 2021 02 21.md diff --git a/2021-02-22.md b/2021 02 22.md similarity index 100% rename from 2021-02-22.md rename to 2021 02 22.md diff --git a/2021-02-23.md b/2021 02 23.md similarity index 100% rename from 2021-02-23.md rename to 2021 02 23.md diff --git a/2021-02-24.md b/2021 02 24.md similarity index 100% rename from 2021-02-24.md rename to 2021 02 24.md diff --git a/2021-02-25.md b/2021 02 25.md similarity index 100% rename from 2021-02-25.md rename to 2021 02 25.md diff --git a/2021-02-26.md b/2021 02 26.md similarity index 100% rename from 2021-02-26.md rename to 2021 02 26.md diff --git a/2021-02-27.md b/2021 02 27.md similarity index 100% rename from 2021-02-27.md rename to 2021 02 27.md diff --git a/2021-02-28.md b/2021 02 28.md similarity index 100% rename from 2021-02-28.md rename to 2021 02 28.md diff --git a/2021-03-01.md b/2021 03 01.md similarity index 100% rename from 2021-03-01.md rename to 2021 03 01.md diff --git a/2021-03-02.md b/2021 03 02.md similarity index 100% rename from 2021-03-02.md rename to 2021 03 02.md diff --git a/2021-03-03.md b/2021 03 03.md similarity index 100% rename from 2021-03-03.md rename to 2021 03 03.md diff --git a/2021-03-04.md b/2021 03 04.md similarity index 100% rename from 2021-03-04.md rename to 2021 03 04.md diff --git a/2021-03-05.md b/2021 03 05.md similarity index 100% rename from 2021-03-05.md rename to 2021 03 05.md diff --git a/2021-03-06.md b/2021 03 06.md similarity index 100% rename from 2021-03-06.md rename to 2021 03 06.md diff --git a/2021-03-07.md b/2021 03 07.md similarity index 100% rename from 2021-03-07.md rename to 2021 03 07.md diff --git a/2021-03-08.md b/2021 03 08.md similarity index 100% rename from 2021-03-08.md rename to 2021 03 08.md diff --git a/2021-03-09.md b/2021 03 09.md similarity index 100% rename from 2021-03-09.md rename to 2021 03 09.md diff --git a/2021-03-10.md b/2021 03 10.md similarity index 100% rename from 2021-03-10.md rename to 2021 03 10.md diff --git a/2021-03-11.md b/2021 03 11.md similarity index 100% rename from 2021-03-11.md rename to 2021 03 11.md diff --git a/2021-03-12.md b/2021 03 12.md similarity index 100% rename from 2021-03-12.md rename to 2021 03 12.md diff --git a/2021-03-13.md b/2021 03 13.md similarity index 100% rename from 2021-03-13.md rename to 2021 03 13.md diff --git a/2021-03-14.md b/2021 03 14.md similarity index 100% rename from 2021-03-14.md rename to 2021 03 14.md diff --git a/2021-03-15.md b/2021 03 15.md similarity index 100% rename from 2021-03-15.md rename to 2021 03 15.md diff --git a/2021-03-16.md b/2021 03 16.md similarity index 100% rename from 2021-03-16.md rename to 2021 03 16.md diff --git a/2021-03-17.md b/2021 03 17.md similarity index 100% rename from 2021-03-17.md rename to 2021 03 17.md diff --git a/2021-03-18.md b/2021 03 18.md similarity index 100% rename from 2021-03-18.md rename to 2021 03 18.md diff --git a/2021-03-19.md b/2021 03 19.md similarity index 100% rename from 2021-03-19.md rename to 2021 03 19.md diff --git a/2021-03-20.md b/2021 03 20.md similarity index 100% rename from 2021-03-20.md rename to 2021 03 20.md diff --git a/2021-03-21.md b/2021 03 21.md similarity index 100% rename from 2021-03-21.md rename to 2021 03 21.md diff --git a/2021-03-22.md b/2021 03 22.md similarity index 100% rename from 2021-03-22.md rename to 2021 03 22.md diff --git a/2021-03-23.md b/2021 03 23.md similarity index 100% rename from 2021-03-23.md rename to 2021 03 23.md diff --git a/2021-03-24.md b/2021 03 24.md similarity index 100% rename from 2021-03-24.md rename to 2021 03 24.md diff --git a/2021-03-25.md b/2021 03 25.md similarity index 100% rename from 2021-03-25.md rename to 2021 03 25.md diff --git a/2021-03-26.md b/2021 03 26.md similarity index 100% rename from 2021-03-26.md rename to 2021 03 26.md diff --git a/2021-03-27.md b/2021 03 27.md similarity index 100% rename from 2021-03-27.md rename to 2021 03 27.md diff --git a/2021-03-28.md b/2021 03 28.md similarity index 100% rename from 2021-03-28.md rename to 2021 03 28.md diff --git a/2021-03-29.md b/2021 03 29.md similarity index 100% rename from 2021-03-29.md rename to 2021 03 29.md diff --git a/2021-03-30.md b/2021 03 30.md similarity index 100% rename from 2021-03-30.md rename to 2021 03 30.md diff --git a/2021-03-31.md b/2021 03 31.md similarity index 100% rename from 2021-03-31.md rename to 2021 03 31.md diff --git a/2021-04-01.md b/2021 04 01.md similarity index 100% rename from 2021-04-01.md rename to 2021 04 01.md diff --git a/2021-04-02.md b/2021 04 02.md similarity index 100% rename from 2021-04-02.md rename to 2021 04 02.md diff --git a/2021-04-03.md b/2021 04 03.md similarity index 100% rename from 2021-04-03.md rename to 2021 04 03.md diff --git a/2021-04-05.md b/2021 04 05.md similarity index 100% rename from 2021-04-05.md rename to 2021 04 05.md diff --git a/2021-04-06.md b/2021 04 06.md similarity index 100% rename from 2021-04-06.md rename to 2021 04 06.md diff --git a/2021-04-07.md b/2021 04 07.md similarity index 100% rename from 2021-04-07.md rename to 2021 04 07.md diff --git a/2021-04-08.md b/2021 04 08.md similarity index 100% rename from 2021-04-08.md rename to 2021 04 08.md diff --git a/2021-04-09.md b/2021 04 09.md similarity index 100% rename from 2021-04-09.md rename to 2021 04 09.md diff --git a/2021-04-10.md b/2021 04 10.md similarity index 100% rename from 2021-04-10.md rename to 2021 04 10.md diff --git a/2021-04-11.md b/2021 04 11.md similarity index 100% rename from 2021-04-11.md rename to 2021 04 11.md diff --git a/2021-04-12.md b/2021 04 12.md similarity index 100% rename from 2021-04-12.md rename to 2021 04 12.md diff --git a/2021-04-13.md b/2021 04 13.md similarity index 100% rename from 2021-04-13.md rename to 2021 04 13.md diff --git a/2021-04-14.md b/2021 04 14.md similarity index 100% rename from 2021-04-14.md rename to 2021 04 14.md diff --git a/2021-04-15.md b/2021 04 15.md similarity index 100% rename from 2021-04-15.md rename to 2021 04 15.md diff --git a/2021-04-16.md b/2021 04 16.md similarity index 100% rename from 2021-04-16.md rename to 2021 04 16.md diff --git a/2021-04-17.md b/2021 04 17.md similarity index 100% rename from 2021-04-17.md rename to 2021 04 17.md diff --git a/2021-04-18.md b/2021 04 18.md similarity index 100% rename from 2021-04-18.md rename to 2021 04 18.md diff --git a/2021-04-19.md b/2021 04 19.md similarity index 100% rename from 2021-04-19.md rename to 2021 04 19.md diff --git a/2021-04-20.md b/2021 04 20.md similarity index 100% rename from 2021-04-20.md rename to 2021 04 20.md diff --git a/2021-04-21.md b/2021 04 21.md similarity index 100% rename from 2021-04-21.md rename to 2021 04 21.md diff --git a/2021-04-22.md b/2021 04 22.md similarity index 100% rename from 2021-04-22.md rename to 2021 04 22.md diff --git a/2021-04-23.md b/2021 04 23.md similarity index 100% rename from 2021-04-23.md rename to 2021 04 23.md diff --git a/2021-04-24.md b/2021 04 24.md similarity index 100% rename from 2021-04-24.md rename to 2021 04 24.md diff --git a/2021-04-25.md b/2021 04 25.md similarity index 100% rename from 2021-04-25.md rename to 2021 04 25.md diff --git a/2021-04-27.md b/2021 04 27.md similarity index 100% rename from 2021-04-27.md rename to 2021 04 27.md diff --git a/2021-04-28.md b/2021 04 28.md similarity index 100% rename from 2021-04-28.md rename to 2021 04 28.md diff --git a/2021-04-29.md b/2021 04 29.md similarity index 100% rename from 2021-04-29.md rename to 2021 04 29.md diff --git a/2021-04-30.md b/2021 04 30.md similarity index 100% rename from 2021-04-30.md rename to 2021 04 30.md diff --git a/2021-05-01.md b/2021 05 01.md similarity index 100% rename from 2021-05-01.md rename to 2021 05 01.md diff --git a/2021-05-02.md b/2021 05 02.md similarity index 100% rename from 2021-05-02.md rename to 2021 05 02.md diff --git a/2021-05-03.md b/2021 05 03.md similarity index 100% rename from 2021-05-03.md rename to 2021 05 03.md diff --git a/2021-05-04.md b/2021 05 04.md similarity index 100% rename from 2021-05-04.md rename to 2021 05 04.md diff --git a/2021-05-05.md b/2021 05 05.md similarity index 100% rename from 2021-05-05.md rename to 2021 05 05.md diff --git a/2021-05-06.md b/2021 05 06.md similarity index 100% rename from 2021-05-06.md rename to 2021 05 06.md diff --git a/2021-05-07.md b/2021 05 07.md similarity index 100% rename from 2021-05-07.md rename to 2021 05 07.md diff --git a/2021-eneri.md b/2021 eneri.md similarity index 100% rename from 2021-eneri.md rename to 2021 eneri.md diff --git a/2021-storming-of-the-united-states-capitol.md b/2021 storming of the united states capitol.md similarity index 100% rename from 2021-storming-of-the-united-states-capitol.md rename to 2021 storming of the united states capitol.md diff --git a/50-minute-pomodoro.md b/50 minute pomodoro.md similarity index 100% rename from 50-minute-pomodoro.md rename to 50 minute pomodoro.md diff --git a/62-modelo-para-armar.md b/62 modelo para armar.md similarity index 100% rename from 62-modelo-para-armar.md rename to 62 modelo para armar.md diff --git a/80-time.md b/80 time.md similarity index 100% rename from 80-time.md rename to 80 time.md diff --git a/a-bicycle-for-our-minds.md b/a bicycle for our minds.md similarity index 100% rename from a-bicycle-for-our-minds.md rename to a bicycle for our minds.md diff --git a/a-cheatsheet-on-discourse.md b/a cheatsheet on discourse.md similarity index 100% rename from a-cheatsheet-on-discourse.md rename to a cheatsheet on discourse.md diff --git a/a-cyborg-manifesto.md b/a cyborg manifesto.md similarity index 100% rename from a-cyborg-manifesto.md rename to a cyborg manifesto.md diff --git a/a-declaration-of-the-independence-of-cyberspace.md b/a declaration of the independence of cyberspace.md similarity index 100% rename from a-declaration-of-the-independence-of-cyberspace.md rename to a declaration of the independence of cyberspace.md diff --git a/a-fika-monster.md b/a fika monster.md similarity index 100% rename from a-fika-monster.md rename to a fika monster.md diff --git a/a-fortiori.md b/a fortiori.md similarity index 100% rename from a-fortiori.md rename to a fortiori.md diff --git a/a-glastonbury-romance.md b/a glastonbury romance.md similarity index 100% rename from a-glastonbury-romance.md rename to a glastonbury romance.md diff --git a/a-naive-plan-for-a-freer-internet.md b/a naive plan for a freer internet.md similarity index 100% rename from a-naive-plan-for-a-freer-internet.md rename to a naive plan for a freer internet.md diff --git a/a-neither.md b/a neither.md similarity index 100% rename from a-neither.md rename to a neither.md diff --git a/a-new-kind-of-science.md b/a new kind of science.md similarity index 100% rename from a-new-kind-of-science.md rename to a new kind of science.md diff --git a/a-note-taking-problem-and-a-proposed-solution.md b/a note taking problem and a proposed solution.md similarity index 100% rename from a-note-taking-problem-and-a-proposed-solution.md rename to a note taking problem and a proposed solution.md diff --git a/a-pattern-language.md b/a pattern language.md similarity index 100% rename from a-pattern-language.md rename to a pattern language.md diff --git a/a-typo.md b/a typo.md similarity index 100% rename from a-typo.md rename to a typo.md diff --git a/a-view-of-the-agora-at-a-node-is-a-comonad.md b/a view of the agora at a node is a comonad.md similarity index 100% rename from a-view-of-the-agora-at-a-node-is-a-comonad.md rename to a view of the agora at a node is a comonad.md diff --git a/a-yawning-cat.md b/a yawning cat.md similarity index 100% rename from a-yawning-cat.md rename to a yawning cat.md diff --git a/aaron-swartz.md b/aaron swartz.md similarity index 100% rename from aaron-swartz.md rename to aaron swartz.md diff --git a/abolition-of-the-state.md b/abolition of the state.md similarity index 100% rename from abolition-of-the-state.md rename to abolition of the state.md diff --git a/aborto-legal.md b/aborto legal.md similarity index 100% rename from aborto-legal.md rename to aborto legal.md diff --git a/abstract-fairy.md b/abstract fairy.md similarity index 100% rename from abstract-fairy.md rename to abstract fairy.md diff --git a/aby-warburg.md b/aby warburg.md similarity index 100% rename from aby-warburg.md rename to aby warburg.md diff --git a/academic-urban-legends.md b/academic urban legends.md similarity index 100% rename from academic-urban-legends.md rename to academic urban legends.md diff --git a/aceite-de-coco.md b/aceite de coco.md similarity index 100% rename from aceite-de-coco.md rename to aceite de coco.md diff --git a/acid-banger.md b/acid banger.md similarity index 100% rename from acid-banger.md rename to acid banger.md diff --git a/act-well.md b/act well.md similarity index 100% rename from act-well.md rename to act well.md diff --git a/active-recall.md b/active recall.md similarity index 100% rename from active-recall.md rename to active recall.md diff --git a/acts-of-flancia.md b/acts of flancia.md similarity index 100% rename from acts-of-flancia.md rename to acts of flancia.md diff --git a/adam-fitchett.md b/adam fitchett.md similarity index 100% rename from adam-fitchett.md rename to adam fitchett.md diff --git a/add-service.md b/add service.md similarity index 100% rename from add-service.md rename to add service.md diff --git a/addheader-py.md b/addheader py.md similarity index 100% rename from addheader-py.md rename to addheader py.md diff --git a/adenosine-triphosphate.md b/adenosine triphosphate.md similarity index 100% rename from adenosine-triphosphate.md rename to adenosine triphosphate.md diff --git a/adriene-mishler.md b/adriene mishler.md similarity index 100% rename from adriene-mishler.md rename to adriene mishler.md diff --git a/adversarial-interoperability.md b/adversarial interoperability.md similarity index 100% rename from adversarial-interoperability.md rename to adversarial interoperability.md diff --git a/advisory-opinion.md b/advisory opinion.md similarity index 100% rename from advisory-opinion.md rename to advisory opinion.md diff --git a/adán-buenosayres.md b/adán buenosayres.md similarity index 100% rename from adán-buenosayres.md rename to adán buenosayres.md diff --git a/agnes-cameron.md b/agnes cameron.md similarity index 100% rename from agnes-cameron.md rename to agnes cameron.md diff --git a/agnès-varda.md b/agnès varda.md similarity index 100% rename from agnès-varda.md rename to agnès varda.md diff --git a/agora-0-5-1.md b/agora 0 5 1.md similarity index 100% rename from agora-0-5-1.md rename to agora 0 5 1.md diff --git a/agora-action.md b/agora action.md similarity index 100% rename from agora-action.md rename to agora action.md diff --git a/agora-actions.md b/agora actions.md similarity index 100% rename from agora-actions.md rename to agora actions.md diff --git a/agora-algorithm.md b/agora algorithm.md similarity index 100% rename from agora-algorithm.md rename to agora algorithm.md diff --git a/agora-bot.md b/agora bot.md similarity index 100% rename from agora-bot.md rename to agora bot.md diff --git a/agora-bridge.md b/agora bridge.md similarity index 100% rename from agora-bridge.md rename to agora bridge.md diff --git a/agora-cli.md b/agora cli.md similarity index 100% rename from agora-cli.md rename to agora cli.md diff --git a/agora-client.md b/agora client.md similarity index 100% rename from agora-client.md rename to agora client.md diff --git a/agora-clients.md b/agora clients.md similarity index 100% rename from agora-clients.md rename to agora clients.md diff --git a/agora-comments.md b/agora comments.md similarity index 100% rename from agora-comments.md rename to agora comments.md diff --git a/agora convention.md b/agora convention.md index af60c9e12..e860a2508 100644 --- a/agora convention.md +++ b/agora convention.md @@ -1,14 +1,2 @@ # agora convention -- a [[set]] - - The [[agora]] at its deepest is a convention. A set of optional actions you can choose to take in given [[contexts]]. - - This agora [[node]] represents the set of those actions. Read on to know them all :) - - To propose a convention, please contribute to this list by writing in it or pushing to it. - - [[wittgenstein protocol]] - - The [[agora]] itself it is a convention. - - I define an [[agora]] to be any space that strives to be optimally amenable to cooperation. - - I see the [[agora]] as a set of explicit [[contracts]]. - - [[pull]] - - [[push]] - - [[go]] - diff --git a/agora-ctzn.md b/agora ctzn.md similarity index 100% rename from agora-ctzn.md rename to agora ctzn.md diff --git a/agora-design.md b/agora design.md similarity index 100% rename from agora-design.md rename to agora design.md diff --git a/agora-development.md b/agora development.md similarity index 100% rename from agora-development.md rename to agora development.md diff --git a/agora-discuss.md b/agora discuss.md similarity index 100% rename from agora-discuss.md rename to agora discuss.md diff --git a/agora-editor.md b/agora editor.md similarity index 100% rename from agora-editor.md rename to agora editor.md diff --git a/agora-editors.md b/agora editors.md similarity index 100% rename from agora-editors.md rename to agora editors.md diff --git a/agora-embed.md b/agora embed.md similarity index 100% rename from agora-embed.md rename to agora embed.md diff --git a/agora-es.md b/agora es.md similarity index 100% rename from agora-es.md rename to agora es.md diff --git a/agora-ext.md b/agora ext.md similarity index 100% rename from agora-ext.md rename to agora ext.md diff --git a/agora-feature-requests.md b/agora feature requests.md similarity index 100% rename from agora-feature-requests.md rename to agora feature requests.md diff --git a/agora-fediverse-integration.md b/agora fediverse integration.md similarity index 100% rename from agora-fediverse-integration.md rename to agora fediverse integration.md diff --git a/agora-feeds.md b/agora feeds.md similarity index 100% rename from agora-feeds.md rename to agora feeds.md diff --git a/agora-for-ea.md b/agora for ea.md similarity index 100% rename from agora-for-ea.md rename to agora for ea.md diff --git a/agora-fuzzy-matching.md b/agora fuzzy matching.md similarity index 100% rename from agora-fuzzy-matching.md rename to agora fuzzy matching.md diff --git a/agora-fw.md b/agora fw.md similarity index 100% rename from agora-fw.md rename to agora fw.md diff --git a/agora-go-links-integration.md b/agora go links integration.md similarity index 100% rename from agora-go-links-integration.md rename to agora go links integration.md diff --git a/agora-graph.md b/agora graph.md similarity index 100% rename from agora-graph.md rename to agora graph.md diff --git a/agora-graphs.md b/agora graphs.md similarity index 100% rename from agora-graphs.md rename to agora graphs.md diff --git a/agora-help.md b/agora help.md similarity index 100% rename from agora-help.md rename to agora help.md diff --git a/agora-hn.md b/agora hn.md similarity index 100% rename from agora-hn.md rename to agora hn.md diff --git a/agora-howto.md b/agora howto.md similarity index 100% rename from agora-howto.md rename to agora howto.md diff --git a/agora-hub.md b/agora hub.md similarity index 100% rename from agora-hub.md rename to agora hub.md diff --git a/agora-hypothesis-integration.md b/agora hypothesis integration.md similarity index 100% rename from agora-hypothesis-integration.md rename to agora hypothesis integration.md diff --git a/agora-hypothesis.md b/agora hypothesis.md similarity index 100% rename from agora-hypothesis.md rename to agora hypothesis.md diff --git a/agora-install.md b/agora install.md similarity index 100% rename from agora-install.md rename to agora install.md diff --git a/agora-integration.md b/agora integration.md similarity index 100% rename from agora-integration.md rename to agora integration.md diff --git a/agora-js.md b/agora js.md similarity index 100% rename from agora-js.md rename to agora js.md diff --git a/agora-like.md b/agora like.md similarity index 100% rename from agora-like.md rename to agora like.md diff --git a/agora-links.md b/agora links.md similarity index 100% rename from agora-links.md rename to agora links.md diff --git a/agora-mastodon-integration.md b/agora mastodon integration.md similarity index 100% rename from agora-mastodon-integration.md rename to agora mastodon integration.md diff --git a/agora-music.md b/agora music.md similarity index 100% rename from agora-music.md rename to agora music.md diff --git a/agora-pkmchat.md b/agora pkmchat.md similarity index 100% rename from agora-pkmchat.md rename to agora pkmchat.md diff --git a/agora-plan.md b/agora plan.md similarity index 100% rename from agora-plan.md rename to agora plan.md diff --git a/agora-polls.md b/agora polls.md similarity index 100% rename from agora-polls.md rename to agora polls.md diff --git a/agora-promnesia.md b/agora promnesia.md similarity index 100% rename from agora-promnesia.md rename to agora promnesia.md diff --git a/agora-protocol.md b/agora protocol.md similarity index 100% rename from agora-protocol.md rename to agora protocol.md diff --git a/agora-publishing.md b/agora publishing.md similarity index 100% rename from agora-publishing.md rename to agora publishing.md diff --git a/agora-push.md b/agora push.md similarity index 100% rename from agora-push.md rename to agora push.md diff --git a/agora-reading-club.md b/agora reading club.md similarity index 100% rename from agora-reading-club.md rename to agora reading club.md diff --git a/agora-recipes.md b/agora recipes.md similarity index 100% rename from agora-recipes.md rename to agora recipes.md diff --git a/agora-repository.md b/agora repository.md similarity index 100% rename from agora-repository.md rename to agora repository.md diff --git a/agora-rfc.md b/agora rfc.md similarity index 100% rename from agora-rfc.md rename to agora rfc.md diff --git a/agora-rfcs.md b/agora rfcs.md similarity index 100% rename from agora-rfcs.md rename to agora rfcs.md diff --git a/agora-seach.md b/agora seach.md similarity index 100% rename from agora-seach.md rename to agora seach.md diff --git a/agora-search.md b/agora search.md similarity index 100% rename from agora-search.md rename to agora search.md diff --git a/agora-server.md b/agora server.md similarity index 100% rename from agora-server.md rename to agora server.md diff --git a/agora-settings.md b/agora settings.md similarity index 100% rename from agora-settings.md rename to agora settings.md diff --git a/agora-setup.md b/agora setup.md similarity index 100% rename from agora-setup.md rename to agora setup.md diff --git a/agora-slides.md b/agora slides.md similarity index 100% rename from agora-slides.md rename to agora slides.md diff --git a/agora-tree-example.md b/agora tree example.md similarity index 100% rename from agora-tree-example.md rename to agora tree example.md diff --git a/agora-trees.md b/agora trees.md similarity index 100% rename from agora-trees.md rename to agora trees.md diff --git a/agora-twitter-integration.md b/agora twitter integration.md similarity index 100% rename from agora-twitter-integration.md rename to agora twitter integration.md diff --git a/agora-v0-5.md b/agora v0 5.md similarity index 100% rename from agora-v0-5.md rename to agora v0 5.md diff --git a/agora-v1.md b/agora v1.md similarity index 100% rename from agora-v1.md rename to agora v1.md diff --git a/agora-version.md b/agora version.md similarity index 100% rename from agora-version.md rename to agora version.md diff --git a/agora-vscode.md b/agora vscode.md similarity index 100% rename from agora-vscode.md rename to agora vscode.md diff --git a/agora-wiki.md b/agora wiki.md similarity index 100% rename from agora-wiki.md rename to agora wiki.md diff --git a/agora-yaml.md b/agora yaml.md similarity index 100% rename from agora-yaml.md rename to agora yaml.md diff --git a/agora-youtube-integration.md b/agora youtube integration.md similarity index 100% rename from agora-youtube-integration.md rename to agora youtube integration.md diff --git a/agora-convention.md b/agora-convention.md deleted file mode 100644 index e860a2508..000000000 --- a/agora-convention.md +++ /dev/null @@ -1,2 +0,0 @@ -# agora convention - diff --git a/aharonov-bohm-effect.md b/aharonov bohm effect.md similarity index 100% rename from aharonov-bohm-effect.md rename to aharonov bohm effect.md diff --git a/ai-dungeon.md b/ai dungeon.md similarity index 100% rename from ai-dungeon.md rename to ai dungeon.md diff --git a/airto-moreira.md b/airto moreira.md similarity index 100% rename from airto-moreira.md rename to airto moreira.md diff --git a/alan-laidlaw.md b/alan laidlaw.md similarity index 100% rename from alan-laidlaw.md rename to alan laidlaw.md diff --git a/alan-watts.md b/alan watts.md similarity index 100% rename from alan-watts.md rename to alan watts.md diff --git a/albert-laszlo-barabasi.md b/albert laszlo barabasi.md similarity index 100% rename from albert-laszlo-barabasi.md rename to albert laszlo barabasi.md diff --git a/albin-zollinger.md b/albin zollinger.md similarity index 100% rename from albin-zollinger.md rename to albin zollinger.md diff --git a/alexander-huber.md b/alexander huber.md similarity index 100% rename from alexander-huber.md rename to alexander huber.md diff --git a/algernon-argument.md b/algernon argument.md similarity index 100% rename from algernon-argument.md rename to algernon argument.md diff --git a/ali-abdaal.md b/ali abdaal.md similarity index 100% rename from ali-abdaal.md rename to ali abdaal.md diff --git a/all-about-circuits.md b/all about circuits.md similarity index 100% rename from all-about-circuits.md rename to all about circuits.md diff --git a/all-day.md b/all day.md similarity index 100% rename from all-day.md rename to all day.md diff --git a/all-night.md b/all night.md similarity index 100% rename from all-night.md rename to all night.md diff --git a/all-possible-wikilinks.md b/all possible wikilinks.md similarity index 100% rename from all-possible-wikilinks.md rename to all possible wikilinks.md diff --git a/all-together-now.md b/all together now.md similarity index 100% rename from all-together-now.md rename to all together now.md diff --git a/all-tomorrows-parties.md b/all tomorrows parties.md similarity index 100% rename from all-tomorrows-parties.md rename to all tomorrows parties.md diff --git a/allegory-of-the-cave.md b/allegory of the cave.md similarity index 100% rename from allegory-of-the-cave.md rename to allegory of the cave.md diff --git a/alvin-zollinger.md b/alvin zollinger.md similarity index 100% rename from alvin-zollinger.md rename to alvin zollinger.md diff --git a/amateur-utopian.md b/amateur utopian.md similarity index 100% rename from amateur-utopian.md rename to amateur utopian.md diff --git a/amit-dutta.md b/amit dutta.md similarity index 100% rename from amit-dutta.md rename to amit dutta.md diff --git a/américa-latina-en-movimiento.md b/américa latina en movimiento.md similarity index 100% rename from américa-latina-en-movimiento.md rename to américa latina en movimiento.md diff --git a/an-agora.md b/an agora.md similarity index 100% rename from an-agora.md rename to an agora.md diff --git a/an-open-letter-to-an-open-nation.md b/an open letter to an open nation.md similarity index 100% rename from an-open-letter-to-an-open-nation.md rename to an open letter to an open nation.md diff --git a/ana-roxanne.md b/ana roxanne.md similarity index 100% rename from ana-roxanne.md rename to ana roxanne.md diff --git a/ana-ulin.md b/ana ulin.md similarity index 100% rename from ana-ulin.md rename to ana ulin.md diff --git a/anar-chi-st.md b/anar chi st.md similarity index 100% rename from anar-chi-st.md rename to anar chi st.md diff --git a/anarcho-anarcho-capitalist.md b/anarcho anarcho capitalist.md similarity index 100% rename from anarcho-anarcho-capitalist.md rename to anarcho anarcho capitalist.md diff --git a/anarcho-capitalism.md b/anarcho capitalism.md similarity index 100% rename from anarcho-capitalism.md rename to anarcho capitalism.md diff --git a/anarcho-communism.md b/anarcho communism.md similarity index 100% rename from anarcho-communism.md rename to anarcho communism.md diff --git a/anarcho-syncretism.md b/anarcho syncretism.md similarity index 100% rename from anarcho-syncretism.md rename to anarcho syncretism.md diff --git a/anarchy-in-action.md b/anarchy in action.md similarity index 100% rename from anarchy-in-action.md rename to anarchy in action.md diff --git a/andi-nachon.md b/andi nachon.md similarity index 100% rename from andi-nachon.md rename to andi nachon.md diff --git a/andrei-ciortea.md b/andrei ciortea.md similarity index 100% rename from andrei-ciortea.md rename to andrei ciortea.md diff --git a/andrew-burton.md b/andrew burton.md similarity index 100% rename from andrew-burton.md rename to andrew burton.md diff --git a/andrew-marantz.md b/andrew marantz.md similarity index 100% rename from andrew-marantz.md rename to andrew marantz.md diff --git a/andrew-yang.md b/andrew yang.md similarity index 100% rename from andrew-yang.md rename to andrew yang.md diff --git a/andy-matuschak.md b/andy matuschak.md similarity index 100% rename from andy-matuschak.md rename to andy matuschak.md diff --git a/anil-seth.md b/anil seth.md similarity index 100% rename from anil-seth.md rename to anil seth.md diff --git a/anirudh-badri.md b/anirudh badri.md similarity index 100% rename from anirudh-badri.md rename to anirudh badri.md diff --git a/anna-gat.md b/anna gat.md similarity index 100% rename from anna-gat.md rename to anna gat.md diff --git a/annotated-hub-of-science.md b/annotated hub of science.md similarity index 100% rename from annotated-hub-of-science.md rename to annotated hub of science.md diff --git a/annotation-standard.md b/annotation standard.md similarity index 100% rename from annotation-standard.md rename to annotation standard.md diff --git a/anti-civ.md b/anti civ.md similarity index 100% rename from anti-civ.md rename to anti civ.md diff --git a/anti-fascist.md b/anti fascist.md similarity index 100% rename from anti-fascist.md rename to anti fascist.md diff --git a/anti-libraries.md b/anti libraries.md similarity index 100% rename from anti-libraries.md rename to anti libraries.md diff --git a/apache-marmotta.md b/apache marmotta.md similarity index 100% rename from apache-marmotta.md rename to apache marmotta.md diff --git a/aprender-de-grandes.md b/aprender de grandes.md similarity index 100% rename from aprender-de-grandes.md rename to aprender de grandes.md diff --git a/arabian-nights.md b/arabian nights.md similarity index 100% rename from arabian-nights.md rename to arabian nights.md diff --git a/arcades-project.md b/arcades project.md similarity index 100% rename from arcades-project.md rename to arcades project.md diff --git a/argentina-has-some-vaporwave-powerhouses.md b/argentina has some vaporwave powerhouses.md similarity index 100% rename from argentina-has-some-vaporwave-powerhouses.md rename to argentina has some vaporwave powerhouses.md diff --git a/armengol-altayo.md b/armengol altayo.md similarity index 100% rename from armengol-altayo.md rename to armengol altayo.md diff --git a/armengol-flancian.md b/armengol flancian.md similarity index 100% rename from armengol-flancian.md rename to armengol flancian.md diff --git a/armengol-lorand.md b/armengol lorand.md similarity index 100% rename from armengol-lorand.md rename to armengol lorand.md diff --git a/arnold-schrijver.md b/arnold schrijver.md similarity index 100% rename from arnold-schrijver.md rename to arnold schrijver.md diff --git a/art-blakey.md b/art blakey.md similarity index 100% rename from art-blakey.md rename to art blakey.md diff --git a/arti-walker-peddakotla.md b/arti walker peddakotla.md similarity index 100% rename from arti-walker-peddakotla.md rename to arti walker peddakotla.md diff --git a/asado-verbal.md b/asado verbal.md similarity index 100% rename from asado-verbal.md rename to asado verbal.md diff --git a/astor-piazzolla.md b/astor piazzolla.md similarity index 100% rename from astor-piazzolla.md rename to astor piazzolla.md diff --git a/async-art.md b/async art.md similarity index 100% rename from async-art.md rename to async art.md diff --git a/async-chat.md b/async chat.md similarity index 100% rename from async-chat.md rename to async chat.md diff --git a/at-the-dam.md b/at the dam.md similarity index 100% rename from at-the-dam.md rename to at the dam.md diff --git a/athens-research.md b/athens research.md similarity index 100% rename from athens-research.md rename to athens research.md diff --git a/atomic-search.md b/atomic search.md similarity index 100% rename from atomic-search.md rename to atomic search.md diff --git a/attack-on-titan.md b/attack on titan.md similarity index 100% rename from attack-on-titan.md rename to attack on titan.md diff --git a/audio-recorder.md b/audio recorder.md similarity index 100% rename from audio-recorder.md rename to audio recorder.md diff --git a/augmenting-human-intellect.md b/augmenting human intellect.md similarity index 100% rename from augmenting-human-intellect.md rename to augmenting human intellect.md diff --git a/auto-commit-messages.md b/auto commit messages.md similarity index 100% rename from auto-commit-messages.md rename to auto commit messages.md diff --git a/auto-push.md b/auto push.md similarity index 100% rename from auto-push.md rename to auto push.md diff --git a/auto-wikilinking.md b/auto wikilinking.md similarity index 100% rename from auto-wikilinking.md rename to auto wikilinking.md diff --git a/aventine-keyhole.md b/aventine keyhole.md similarity index 100% rename from aventine-keyhole.md rename to aventine keyhole.md diff --git a/avi-weiss.md b/avi weiss.md similarity index 100% rename from avi-weiss.md rename to avi weiss.md diff --git a/awesome-foundation.md b/awesome foundation.md similarity index 100% rename from awesome-foundation.md rename to awesome foundation.md diff --git a/ayn-rand.md b/ayn rand.md similarity index 100% rename from ayn-rand.md rename to ayn rand.md diff --git a/azlen-elza.md b/azlen elza.md similarity index 100% rename from azlen-elza.md rename to azlen elza.md diff --git a/b-a.md b/b a.md similarity index 100% rename from b-a.md rename to b a.md diff --git a/b-enterprises.md b/b enterprises.md similarity index 100% rename from b-enterprises.md rename to b enterprises.md diff --git a/back-problems.md b/back problems.md similarity index 100% rename from back-problems.md rename to back problems.md diff --git a/balafon-sketches.md b/balafon sketches.md similarity index 100% rename from balafon-sketches.md rename to balafon sketches.md diff --git a/bart-kosko.md b/bart kosko.md similarity index 100% rename from bart-kosko.md rename to bart kosko.md diff --git a/basic-income.md b/basic income.md similarity index 100% rename from basic-income.md rename to basic income.md diff --git a/bassel-khartabil.md b/bassel khartabil.md similarity index 100% rename from bassel-khartabil.md rename to bassel khartabil.md diff --git a/battle-of-dyrrhachium.md b/battle of dyrrhachium.md similarity index 100% rename from battle-of-dyrrhachium.md rename to battle of dyrrhachium.md diff --git a/battle-of-pharsalus.md b/battle of pharsalus.md similarity index 100% rename from battle-of-pharsalus.md rename to battle of pharsalus.md diff --git a/beaker-browser.md b/beaker browser.md similarity index 100% rename from beaker-browser.md rename to beaker browser.md diff --git a/bearer-of-good-news.md b/bearer of good news.md similarity index 100% rename from bearer-of-good-news.md rename to bearer of good news.md diff --git a/being-open.md b/being open.md similarity index 100% rename from being-open.md rename to being open.md diff --git a/bell-evans.md b/bell evans.md similarity index 100% rename from bell-evans.md rename to bell evans.md diff --git a/ben-chase.md b/ben chase.md similarity index 100% rename from ben-chase.md rename to ben chase.md diff --git a/ben-congdon.md b/ben congdon.md similarity index 100% rename from ben-congdon.md rename to ben congdon.md diff --git a/ben-shapiro.md b/ben shapiro.md similarity index 100% rename from ben-shapiro.md rename to ben shapiro.md diff --git a/bendini-fettuccini.md b/bendini fettuccini.md similarity index 100% rename from bendini-fettuccini.md rename to bendini fettuccini.md diff --git a/benedict-lau.md b/benedict lau.md similarity index 100% rename from benedict-lau.md rename to benedict lau.md diff --git a/benefolent-director-for-life.md b/benefolent director for life.md similarity index 100% rename from benefolent-director-for-life.md rename to benefolent director for life.md diff --git a/benevolent-dictator-for-life.md b/benevolent dictator for life.md similarity index 100% rename from benevolent-dictator-for-life.md rename to benevolent dictator for life.md diff --git a/benevolent-director-for-life.md b/benevolent director for life.md similarity index 100% rename from benevolent-director-for-life.md rename to benevolent director for life.md diff --git a/benjamin-franklin.md b/benjamin franklin.md similarity index 100% rename from benjamin-franklin.md rename to benjamin franklin.md diff --git a/berkeley-anarchist-group.md b/berkeley anarchist group.md similarity index 100% rename from berkeley-anarchist-group.md rename to berkeley anarchist group.md diff --git a/best-sci-fi-movies.md b/best sci fi movies.md similarity index 100% rename from best-sci-fi-movies.md rename to best sci fi movies.md diff --git a/better-ranking.md b/better ranking.md similarity index 100% rename from better-ranking.md rename to better ranking.md diff --git a/big-blue-button.md b/big blue button.md similarity index 100% rename from big-blue-button.md rename to big blue button.md diff --git a/big-in-japan.md b/big in japan.md similarity index 100% rename from big-in-japan.md rename to big in japan.md diff --git a/bill-evans.md b/bill evans.md similarity index 100% rename from bill-evans.md rename to bill evans.md diff --git a/bill-seitz.md b/bill seitz.md similarity index 100% rename from bill-seitz.md rename to bill seitz.md diff --git a/binding-chaos.md b/binding chaos.md similarity index 100% rename from binding-chaos.md rename to binding chaos.md diff --git a/bird-feeder.md b/bird feeder.md similarity index 100% rename from bird-feeder.md rename to bird feeder.md diff --git a/blackbox-exporter.md b/blackbox exporter.md similarity index 100% rename from blackbox-exporter.md rename to blackbox exporter.md diff --git a/blob-opera.md b/blob opera.md similarity index 100% rename from blob-opera.md rename to blob opera.md diff --git a/block-references.md b/block references.md similarity index 100% rename from block-references.md rename to block references.md diff --git a/blockchain-chicken-farm.md b/blockchain chicken farm.md similarity index 100% rename from blockchain-chicken-farm.md rename to blockchain chicken farm.md diff --git a/blue-lp.md b/blue lp.md similarity index 100% rename from blue-lp.md rename to blue lp.md diff --git a/blue-oak.md b/blue oak.md similarity index 100% rename from blue-oak.md rename to blue oak.md diff --git a/bodhisattva-vow.md b/bodhisattva vow.md similarity index 100% rename from bodhisattva-vow.md rename to bodhisattva vow.md diff --git a/bolo-bolo.md b/bolo bolo.md similarity index 100% rename from bolo-bolo.md rename to bolo bolo.md diff --git a/book-club.md b/book club.md similarity index 100% rename from book-club.md rename to book club.md diff --git a/book-of-the-new-sun.md b/book of the new sun.md similarity index 100% rename from book-of-the-new-sun.md rename to book of the new sun.md diff --git a/boos-did-911.md b/boos did 911.md similarity index 100% rename from boos-did-911.md rename to boos did 911.md diff --git a/borges-por-piglia.md b/borges por piglia.md similarity index 100% rename from borges-por-piglia.md rename to borges por piglia.md diff --git a/boris-mann.md b/boris mann.md similarity index 100% rename from boris-mann.md rename to boris mann.md diff --git a/botsin-space.md b/botsin space.md similarity index 100% rename from botsin-space.md rename to botsin space.md diff --git a/brandenburg-concertos.md b/brandenburg concertos.md similarity index 100% rename from brandenburg-concertos.md rename to brandenburg concertos.md diff --git a/brassica-oleracea.md b/brassica oleracea.md similarity index 100% rename from brassica-oleracea.md rename to brassica oleracea.md diff --git a/breath-of-desire.md b/breath of desire.md similarity index 100% rename from breath-of-desire.md rename to breath of desire.md diff --git a/bret-weinstein.md b/bret weinstein.md similarity index 100% rename from bret-weinstein.md rename to bret weinstein.md diff --git a/brian-kernighan.md b/brian kernighan.md similarity index 100% rename from brian-kernighan.md rename to brian kernighan.md diff --git a/brian-moriarty.md b/brian moriarty.md similarity index 100% rename from brian-moriarty.md rename to brian moriarty.md diff --git a/bright-mind.md b/bright mind.md similarity index 100% rename from bright-mind.md rename to bright mind.md diff --git a/brontë-sisters.md b/brontë sisters.md similarity index 100% rename from brontë-sisters.md rename to brontë sisters.md diff --git a/brother-mfc-l2710dw.md b/brother mfc l2710dw.md similarity index 100% rename from brother-mfc-l2710dw.md rename to brother mfc l2710dw.md diff --git a/brown-noise.md b/brown noise.md similarity index 100% rename from brown-noise.md rename to brown noise.md diff --git a/brownian-motion.md b/brownian motion.md similarity index 100% rename from brownian-motion.md rename to brownian motion.md diff --git a/browser-extension.md b/browser extension.md similarity index 100% rename from browser-extension.md rename to browser extension.md diff --git a/browser-extensions.md b/browser extensions.md similarity index 100% rename from browser-extensions.md rename to browser extensions.md diff --git a/bruno-winck.md b/bruno winck.md similarity index 100% rename from bruno-winck.md rename to bruno winck.md diff --git a/buddhist-geeks.md b/buddhist geeks.md similarity index 100% rename from buddhist-geeks.md rename to buddhist geeks.md diff --git a/buenos-aires.md b/buenos aires.md similarity index 100% rename from buenos-aires.md rename to buenos aires.md diff --git a/build-bridges.md b/build bridges.md similarity index 100% rename from build-bridges.md rename to build bridges.md diff --git a/building-an-agora.md b/building an agora.md similarity index 100% rename from building-an-agora.md rename to building an agora.md diff --git a/burma-shave.md b/burma shave.md similarity index 100% rename from burma-shave.md rename to burma shave.md diff --git a/burning-bridges.md b/burning bridges.md similarity index 100% rename from burning-bridges.md rename to burning bridges.md diff --git a/buscarle-profesor-de-inglés-online-a-mamá.md b/buscarle profesor de inglés online a mamá.md similarity index 100% rename from buscarle-profesor-de-inglés-online-a-mamá.md rename to buscarle profesor de inglés online a mamá.md diff --git a/busy-cafe.md b/busy cafe.md similarity index 100% rename from busy-cafe.md rename to busy cafe.md diff --git a/cameras-and-lenses.md b/cameras and lenses.md similarity index 100% rename from cameras-and-lenses.md rename to cameras and lenses.md diff --git a/can-t-break-your-heart.md b/can t break your heart.md similarity index 100% rename from can-t-break-your-heart.md rename to can t break your heart.md diff --git a/can-t-get-you-out-of-my-head.md b/can t get you out of my head.md similarity index 100% rename from can-t-get-you-out-of-my-head.md rename to can t get you out of my head.md diff --git a/cant-break-your-heart.md b/cant break your heart.md similarity index 100% rename from cant-break-your-heart.md rename to cant break your heart.md diff --git a/cant-get-you-out-of-my-head.md b/cant get you out of my head.md similarity index 100% rename from cant-get-you-out-of-my-head.md rename to cant get you out of my head.md diff --git a/capsule-wardrobe.md b/capsule wardrobe.md similarity index 100% rename from capsule-wardrobe.md rename to capsule wardrobe.md diff --git a/caramel-city.md b/caramel city.md similarity index 100% rename from caramel-city.md rename to caramel city.md diff --git a/care-home-that-looks-like-a-town.md b/care home that looks like a town.md similarity index 100% rename from care-home-that-looks-like-a-town.md rename to care home that looks like a town.md diff --git a/carlo-ginzburg.md b/carlo ginzburg.md similarity index 100% rename from carlo-ginzburg.md rename to carlo ginzburg.md diff --git a/carrot-cake.md b/carrot cake.md similarity index 100% rename from carrot-cake.md rename to carrot cake.md diff --git a/casa-común.md b/casa común.md similarity index 100% rename from casa-común.md rename to casa común.md diff --git a/casio-fw-91.md b/casio fw 91.md similarity index 100% rename from casio-fw-91.md rename to casio fw 91.md diff --git a/cat-heroin.md b/cat heroin.md similarity index 100% rename from cat-heroin.md rename to cat heroin.md diff --git a/cat-roulette.md b/cat roulette.md similarity index 100% rename from cat-roulette.md rename to cat roulette.md diff --git a/cat-vibing.md b/cat vibing.md similarity index 100% rename from cat-vibing.md rename to cat vibing.md diff --git a/catalog-of-missing-devices.md b/catalog of missing devices.md similarity index 100% rename from catalog-of-missing-devices.md rename to catalog of missing devices.md diff --git a/category-theory-for-engineers.md b/category theory for engineers.md similarity index 100% rename from category-theory-for-engineers.md rename to category theory for engineers.md diff --git a/category-theory-for-programmers.md b/category theory for programmers.md similarity index 100% rename from category-theory-for-programmers.md rename to category theory for programmers.md diff --git a/category-theory.md b/category theory.md similarity index 100% rename from category-theory.md rename to category theory.md diff --git a/caterina-barbieri.md b/caterina barbieri.md similarity index 100% rename from caterina-barbieri.md rename to caterina barbieri.md diff --git a/center-for-land-use-interpretation.md b/center for land use interpretation.md similarity index 100% rename from center-for-land-use-interpretation.md rename to center for land use interpretation.md diff --git a/central-mid-levels-escalator.md b/central mid levels escalator.md similarity index 100% rename from central-mid-levels-escalator.md rename to central mid levels escalator.md diff --git a/chandra-easton.md b/chandra easton.md similarity index 100% rename from chandra-easton.md rename to chandra easton.md diff --git a/change-the-world.md b/change the world.md similarity index 100% rename from change-the-world.md rename to change the world.md diff --git a/charles-stanhop.md b/charles stanhop.md similarity index 100% rename from charles-stanhop.md rename to charles stanhop.md diff --git a/charles-stanhope.md b/charles stanhope.md similarity index 100% rename from charles-stanhope.md rename to charles stanhope.md diff --git a/chat-mode.md b/chat mode.md similarity index 100% rename from chat-mode.md rename to chat mode.md diff --git a/chatham-house-rule.md b/chatham house rule.md similarity index 100% rename from chatham-house-rule.md rename to chatham house rule.md diff --git a/chatting-with-glue.md b/chatting with glue.md similarity index 100% rename from chatting-with-glue.md rename to chatting with glue.md diff --git a/cheeses-of-europe.md b/cheeses of europe.md similarity index 100% rename from cheeses-of-europe.md rename to cheeses of europe.md diff --git a/chemical-freeze.md b/chemical freeze.md similarity index 100% rename from chemical-freeze.md rename to chemical freeze.md diff --git a/chess-hypothesis.md b/chess hypothesis.md similarity index 100% rename from chess-hypothesis.md rename to chess hypothesis.md diff --git a/chesterton-s-fence.md b/chesterton s fence.md similarity index 100% rename from chesterton-s-fence.md rename to chesterton s fence.md diff --git a/chestertons-fence.md b/chestertons fence.md similarity index 100% rename from chestertons-fence.md rename to chestertons fence.md diff --git a/china-a-century-of-revolution.md b/china a century of revolution.md similarity index 100% rename from china-a-century-of-revolution.md rename to china a century of revolution.md diff --git a/chongli-qin.md b/chongli qin.md similarity index 100% rename from chongli-qin.md rename to chongli qin.md diff --git a/choose-the-closest.md b/choose the closest.md similarity index 100% rename from choose-the-closest.md rename to choose the closest.md diff --git a/choose-your-own-adventure.md b/choose your own adventure.md similarity index 100% rename from choose-your-own-adventure.md rename to choose your own adventure.md diff --git a/chris-aldrich.md b/chris aldrich.md similarity index 100% rename from chris-aldrich.md rename to chris aldrich.md diff --git a/chris moyé.md b/chris moyé.md index e60522db3..8bb8b6b1a 100644 --- a/chris moyé.md +++ b/chris moyé.md @@ -1,6 +1,2 @@ # chris moyé -- a [[person]] - - [[twitter]] https://twitter.com/chrismoye_esq - - told me of [[cent]] - diff --git a/chris-moyé.md b/chris-moyé.md deleted file mode 100644 index 8bb8b6b1a..000000000 --- a/chris-moyé.md +++ /dev/null @@ -1,2 +0,0 @@ -# chris moyé - diff --git a/christopher-alexander-reading-group.md b/christopher alexander reading group.md similarity index 100% rename from christopher-alexander-reading-group.md rename to christopher alexander reading group.md diff --git a/christopher-alexander.md b/christopher alexander.md similarity index 100% rename from christopher-alexander.md rename to christopher alexander.md diff --git a/christopher-priest.md b/christopher priest.md similarity index 100% rename from christopher-priest.md rename to christopher priest.md diff --git a/chrome-remote-desktop.md b/chrome remote desktop.md similarity index 100% rename from chrome-remote-desktop.md rename to chrome remote desktop.md diff --git a/chu-bu-and-sheemish.md b/chu bu and sheemish.md similarity index 100% rename from chu-bu-and-sheemish.md rename to chu bu and sheemish.md diff --git a/chögyam-trungpa.md b/chögyam trungpa.md similarity index 100% rename from chögyam-trungpa.md rename to chögyam trungpa.md diff --git a/cimbalom-street-musicians.md b/cimbalom street musicians.md similarity index 100% rename from cimbalom-street-musicians.md rename to cimbalom street musicians.md diff --git a/cinco-años.md b/cinco años.md similarity index 100% rename from cinco-años.md rename to cinco años.md diff --git a/clay-shirky.md b/clay shirky.md similarity index 100% rename from clay-shirky.md rename to clay shirky.md diff --git a/cleo-from-5-to-7.md b/cleo from 5 to 7.md similarity index 100% rename from cleo-from-5-to-7.md rename to cleo from 5 to 7.md diff --git a/clipboard-management.md b/clipboard management.md similarity index 100% rename from clipboard-management.md rename to clipboard management.md diff --git a/closer-to-truth.md b/closer to truth.md similarity index 100% rename from closer-to-truth.md rename to closer to truth.md diff --git a/coconut-oil.md b/coconut oil.md similarity index 100% rename from coconut-oil.md rename to coconut oil.md diff --git a/code-server.md b/code server.md similarity index 100% rename from code-server.md rename to code server.md diff --git a/codex-editor.md b/codex editor.md similarity index 100% rename from codex-editor.md rename to codex editor.md diff --git a/coding-projects.md b/coding projects.md similarity index 100% rename from coding-projects.md rename to coding projects.md diff --git a/cognitive-load.md b/cognitive load.md similarity index 100% rename from cognitive-load.md rename to cognitive load.md diff --git a/colin-the-mathmo.md b/colin the mathmo.md similarity index 100% rename from colin-the-mathmo.md rename to colin the mathmo.md diff --git a/colin-turner.md b/colin turner.md similarity index 100% rename from colin-turner.md rename to colin turner.md diff --git a/colin-ward.md b/colin ward.md similarity index 100% rename from colin-ward.md rename to colin ward.md diff --git a/colors-of-noise.md b/colors of noise.md similarity index 100% rename from colors-of-noise.md rename to colors of noise.md diff --git a/command-k.md b/command k.md similarity index 100% rename from command-k.md rename to command k.md diff --git a/command-line-interface.md b/command line interface.md similarity index 100% rename from command-line-interface.md rename to command line interface.md diff --git a/commit-template.md b/commit template.md similarity index 100% rename from commit-template.md rename to commit template.md diff --git a/complainer-bot.md b/complainer bot.md similarity index 100% rename from complainer-bot.md rename to complainer bot.md diff --git a/complementary-cognitive-artifact.md b/complementary cognitive artifact.md similarity index 100% rename from complementary-cognitive-artifact.md rename to complementary cognitive artifact.md diff --git a/complementary-cognitive-artifacts.md b/complementary cognitive artifacts.md similarity index 100% rename from complementary-cognitive-artifacts.md rename to complementary cognitive artifacts.md diff --git a/complex-system.md b/complex system.md similarity index 100% rename from complex-system.md rename to complex system.md diff --git a/composite-go-links.md b/composite go links.md similarity index 100% rename from composite-go-links.md rename to composite go links.md diff --git a/computer-system.md b/computer system.md similarity index 100% rename from computer-system.md rename to computer system.md diff --git a/computers-and-creativity.md b/computers and creativity.md similarity index 100% rename from computers-and-creativity.md rename to computers and creativity.md diff --git a/concepts-techniques-and-models-of-computer-programming.md b/concepts techniques and models of computer programming.md similarity index 100% rename from concepts-techniques-and-models-of-computer-programming.md rename to concepts techniques and models of computer programming.md diff --git a/conflict-vs-mistake.md b/conflict vs mistake.md similarity index 100% rename from conflict-vs-mistake.md rename to conflict vs mistake.md diff --git a/connor-st-george.md b/connor st george.md similarity index 100% rename from connor-st-george.md rename to connor st george.md diff --git a/conscious-beings.md b/conscious beings.md similarity index 100% rename from conscious-beings.md rename to conscious beings.md diff --git a/context-collapse.md b/context collapse.md similarity index 100% rename from context-collapse.md rename to context collapse.md diff --git a/controversy-in-philosophy.md b/controversy in philosophy.md similarity index 100% rename from controversy-in-philosophy.md rename to controversy in philosophy.md diff --git a/conversations-with-myself.md b/conversations with myself.md similarity index 100% rename from conversations-with-myself.md rename to conversations with myself.md diff --git a/cookie-clicker.md b/cookie clicker.md similarity index 100% rename from cookie-clicker.md rename to cookie clicker.md diff --git a/cool-retro-term.md b/cool retro term.md similarity index 100% rename from cool-retro-term.md rename to cool retro term.md diff --git a/cooperative-problem-solving.md b/cooperative problem solving.md similarity index 100% rename from cooperative-problem-solving.md rename to cooperative problem solving.md diff --git a/cooperative-systems.md b/cooperative systems.md similarity index 100% rename from cooperative-systems.md rename to cooperative systems.md diff --git a/coordination-problems.md b/coordination problems.md similarity index 100% rename from coordination-problems.md rename to coordination problems.md diff --git a/coreutils-decoded.md b/coreutils decoded.md similarity index 100% rename from coreutils-decoded.md rename to coreutils decoded.md diff --git a/cory-doctorow.md b/cory doctorow.md similarity index 100% rename from cory-doctorow.md rename to cory doctorow.md diff --git a/count-my-blessings.md b/count my blessings.md similarity index 100% rename from count-my-blessings.md rename to count my blessings.md diff --git a/covid-19-game.md b/covid 19 game.md similarity index 100% rename from covid-19-game.md rename to covid 19 game.md diff --git a/covid-19.md b/covid 19.md similarity index 100% rename from covid-19.md rename to covid 19.md diff --git a/covid-tracker.md b/covid tracker.md similarity index 100% rename from covid-tracker.md rename to covid tracker.md diff --git a/crack-azw.md b/crack azw.md similarity index 100% rename from crack-azw.md rename to crack azw.md diff --git a/creamy-ricotta-pasta-with-broccoli.md b/creamy ricotta pasta with broccoli.md similarity index 100% rename from creamy-ricotta-pasta-with-broccoli.md rename to creamy ricotta pasta with broccoli.md diff --git a/creative-commons-attribution-sharealike-4-0-international.md b/creative commons attribution sharealike 4 0 international.md similarity index 100% rename from creative-commons-attribution-sharealike-4-0-international.md rename to creative commons attribution sharealike 4 0 international.md diff --git a/creative-commons.md b/creative commons.md similarity index 100% rename from creative-commons.md rename to creative commons.md diff --git a/critique-of-worker-coops.md b/critique of worker coops.md similarity index 100% rename from critique-of-worker-coops.md rename to critique of worker coops.md diff --git a/crowdsourced-chess.md b/crowdsourced chess.md similarity index 100% rename from crowdsourced-chess.md rename to crowdsourced chess.md diff --git a/crowdsourced-filesystem.md b/crowdsourced filesystem.md similarity index 100% rename from crowdsourced-filesystem.md rename to crowdsourced filesystem.md diff --git a/crowdsourced-search.md b/crowdsourced search.md similarity index 100% rename from crowdsourced-search.md rename to crowdsourced search.md diff --git a/crush-capitalism.md b/crush capitalism.md similarity index 100% rename from crush-capitalism.md rename to crush capitalism.md diff --git a/cultural-shift.md b/cultural shift.md similarity index 100% rename from cultural-shift.md rename to cultural shift.md diff --git a/curtin-yarvin.md b/curtin yarvin.md similarity index 100% rename from curtin-yarvin.md rename to curtin yarvin.md diff --git a/cybenetic-surveillant.md b/cybenetic surveillant.md similarity index 100% rename from cybenetic-surveillant.md rename to cybenetic surveillant.md diff --git a/cyberfeminist-index.md b/cyberfeminist index.md similarity index 100% rename from cyberfeminist-index.md rename to cyberfeminist index.md diff --git a/cybernetic-toaster.md b/cybernetic toaster.md similarity index 100% rename from cybernetic-toaster.md rename to cybernetic toaster.md diff --git a/cyborg-manifesto.md b/cyborg manifesto.md similarity index 100% rename from cyborg-manifesto.md rename to cyborg manifesto.md diff --git a/d-annunzio.md b/d annunzio.md similarity index 100% rename from d-annunzio.md rename to d annunzio.md diff --git a/d-p.md b/d p.md similarity index 100% rename from d-p.md rename to d p.md diff --git a/d-t-suzuki.md b/d t suzuki.md similarity index 100% rename from d-t-suzuki.md rename to d t suzuki.md diff --git a/dahlem-botanical-gardens.md b/dahlem botanical gardens.md similarity index 100% rename from dahlem-botanical-gardens.md rename to dahlem botanical gardens.md diff --git a/dallas-buyers-club.md b/dallas buyers club.md similarity index 100% rename from dallas-buyers-club.md rename to dallas buyers club.md diff --git a/dan-brown.md b/dan brown.md similarity index 100% rename from dan-brown.md rename to dan brown.md diff --git a/dan-harris.md b/dan harris.md similarity index 100% rename from dan-harris.md rename to dan harris.md diff --git a/dan-squier.md b/dan squier.md similarity index 100% rename from dan-squier.md rename to dan squier.md diff --git a/dan-whaley.md b/dan whaley.md similarity index 100% rename from dan-whaley.md rename to dan whaley.md diff --git a/daniel-armengol-altayo.md b/daniel armengol altayo.md similarity index 100% rename from daniel-armengol-altayo.md rename to daniel armengol altayo.md diff --git a/daniel-slutsky.md b/daniel slutsky.md similarity index 100% rename from daniel-slutsky.md rename to daniel slutsky.md diff --git a/danielle-baskin.md b/danielle baskin.md similarity index 100% rename from danielle-baskin.md rename to danielle baskin.md diff --git a/dark-horse-duo.md b/dark horse duo.md similarity index 100% rename from dark-horse-duo.md rename to dark horse duo.md diff --git a/dark-mode.md b/dark mode.md similarity index 100% rename from dark-mode.md rename to dark mode.md diff --git a/daryl-davis.md b/daryl davis.md similarity index 100% rename from daryl-davis.md rename to daryl davis.md diff --git a/data-runner.md b/data runner.md similarity index 100% rename from data-runner.md rename to data runner.md diff --git a/david-allen.md b/david allen.md similarity index 100% rename from david-allen.md rename to david allen.md diff --git a/david-eagleman.md b/david eagleman.md similarity index 100% rename from david-eagleman.md rename to david eagleman.md diff --git a/david-gelernter.md b/david gelernter.md similarity index 100% rename from david-gelernter.md rename to david gelernter.md diff --git a/david-krakauer.md b/david krakauer.md similarity index 100% rename from david-krakauer.md rename to david krakauer.md diff --git a/david-mynors.md b/david mynors.md similarity index 100% rename from david-mynors.md rename to david mynors.md diff --git a/day-job.md b/day job.md similarity index 100% rename from day-job.md rename to day job.md diff --git a/days-of-being-wild.md b/days of being wild.md similarity index 100% rename from days-of-being-wild.md rename to days of being wild.md diff --git a/decision-theory.md b/decision theory.md similarity index 100% rename from decision-theory.md rename to decision theory.md diff --git a/deconstructing-sensory-experience.md b/deconstructing sensory experience.md similarity index 100% rename from deconstructing-sensory-experience.md rename to deconstructing sensory experience.md diff --git a/deconstructing-yourself.md b/deconstructing yourself.md similarity index 100% rename from deconstructing-yourself.md rename to deconstructing yourself.md diff --git a/default-action.md b/default action.md similarity index 100% rename from default-action.md rename to default action.md diff --git a/default-actions.md b/default actions.md similarity index 100% rename from default-actions.md rename to default actions.md diff --git a/default-mode-network.md b/default mode network.md similarity index 100% rename from default-mode-network.md rename to default mode network.md diff --git a/defcon-radio.md b/defcon radio.md similarity index 100% rename from defcon-radio.md rename to defcon radio.md diff --git a/democractic-confederalism.md b/democractic confederalism.md similarity index 100% rename from democractic-confederalism.md rename to democractic confederalism.md diff --git a/democracy-earth.md b/democracy earth.md similarity index 100% rename from democracy-earth.md rename to democracy earth.md diff --git a/dennis-ritchie.md b/dennis ritchie.md similarity index 100% rename from dennis-ritchie.md rename to dennis ritchie.md diff --git a/denny-vrandecic.md b/denny vrandecic.md similarity index 100% rename from denny-vrandecic.md rename to denny vrandecic.md diff --git a/denny-vrandečić.md b/denny vrandečić.md similarity index 100% rename from denny-vrandečić.md rename to denny vrandečić.md diff --git a/deprecate-capitalism.md b/deprecate capitalism.md similarity index 100% rename from deprecate-capitalism.md rename to deprecate capitalism.md diff --git a/derrick-broze.md b/derrick broze.md similarity index 100% rename from derrick-broze.md rename to derrick broze.md diff --git a/desire-paths.md b/desire paths.md similarity index 100% rename from desire-paths.md rename to desire paths.md diff --git a/devine-lu-linvega.md b/devine lu linvega.md similarity index 100% rename from devine-lu-linvega.md rename to devine lu linvega.md diff --git a/dialectical-method.md b/dialectical method.md similarity index 100% rename from dialectical-method.md rename to dialectical method.md diff --git a/digital-garden-configuration.md b/digital garden configuration.md similarity index 100% rename from digital-garden-configuration.md rename to digital garden configuration.md diff --git a/digital-garden-standards.md b/digital garden standards.md similarity index 100% rename from digital-garden-standards.md rename to digital garden standards.md diff --git a/digital-garden.md b/digital garden.md similarity index 100% rename from digital-garden.md rename to digital garden.md diff --git a/digital-gardeners.md b/digital gardeners.md similarity index 100% rename from digital-gardeners.md rename to digital gardeners.md diff --git a/digital-gardens.md b/digital gardens.md similarity index 100% rename from digital-gardens.md rename to digital gardens.md diff --git a/ding-levery.md b/ding levery.md similarity index 100% rename from ding-levery.md rename to ding levery.md diff --git a/directed-acyclic-graph.md b/directed acyclic graph.md similarity index 100% rename from directed-acyclic-graph.md rename to directed acyclic graph.md diff --git a/dispatches-from-flancia.md b/dispatches from flancia.md similarity index 100% rename from dispatches-from-flancia.md rename to dispatches from flancia.md diff --git a/distributed-cognition.md b/distributed cognition.md similarity index 100% rename from distributed-cognition.md rename to distributed cognition.md diff --git a/distributed-knowledge-grap.md b/distributed knowledge grap.md similarity index 100% rename from distributed-knowledge-grap.md rename to distributed knowledge grap.md diff --git a/distributed-knowledge-graph.md b/distributed knowledge graph.md similarity index 100% rename from distributed-knowledge-graph.md rename to distributed knowledge graph.md diff --git a/distributed-public-knowledge-graph.md b/distributed public knowledge graph.md similarity index 100% rename from distributed-public-knowledge-graph.md rename to distributed public knowledge graph.md diff --git a/divinity-2-original-sin.md b/divinity 2 original sin.md similarity index 100% rename from divinity-2-original-sin.md rename to divinity 2 original sin.md diff --git a/do-done-trees.md b/do done trees.md similarity index 100% rename from do-done-trees.md rename to do done trees.md diff --git a/dockside-market.md b/dockside market.md similarity index 100% rename from dockside-market.md rename to dockside market.md diff --git a/doctor-who.md b/doctor who.md similarity index 100% rename from doctor-who.md rename to doctor who.md diff --git a/document-mode.md b/document mode.md similarity index 100% rename from document-mode.md rename to document mode.md diff --git a/doing-good-better.md b/doing good better.md similarity index 100% rename from doing-good-better.md rename to doing good better.md diff --git a/dollar-auction.md b/dollar auction.md similarity index 100% rename from dollar-auction.md rename to dollar auction.md diff --git a/don-hopkins.md b/don hopkins.md similarity index 100% rename from don-hopkins.md rename to don hopkins.md diff --git a/don-t-make-me-think.md b/don t make me think.md similarity index 100% rename from don-t-make-me-think.md rename to don t make me think.md diff --git a/donate-25.md b/donate 25.md similarity index 100% rename from donate-25.md rename to donate 25.md diff --git a/donate-effective-altruism.md b/donate effective altruism.md similarity index 100% rename from donate-effective-altruism.md rename to donate effective altruism.md diff --git a/donate-give-directly.md b/donate give directly.md similarity index 100% rename from donate-give-directly.md rename to donate give directly.md diff --git a/donna-haraway.md b/donna haraway.md similarity index 100% rename from donna-haraway.md rename to donna haraway.md diff --git a/dos-minutos.md b/dos minutos.md similarity index 100% rename from dos-minutos.md rename to dos minutos.md diff --git a/double-crux.md b/double crux.md similarity index 100% rename from double-crux.md rename to double crux.md diff --git a/doug-engelbart.md b/doug engelbart.md similarity index 100% rename from doug-engelbart.md rename to doug engelbart.md diff --git a/douglas-adams.md b/douglas adams.md similarity index 100% rename from douglas-adams.md rename to douglas adams.md diff --git a/douglas-crockford.md b/douglas crockford.md similarity index 100% rename from douglas-crockford.md rename to douglas crockford.md diff --git a/douglas-crowford.md b/douglas crowford.md similarity index 100% rename from douglas-crowford.md rename to douglas crowford.md diff --git a/douglas-rushkoff.md b/douglas rushkoff.md similarity index 100% rename from douglas-rushkoff.md rename to douglas rushkoff.md diff --git a/downward-dog.md b/downward dog.md similarity index 100% rename from downward-dog.md rename to downward dog.md diff --git a/dr-kvj.md b/dr kvj.md similarity index 100% rename from dr-kvj.md rename to dr kvj.md diff --git a/dread-pirate-roberts.md b/dread pirate roberts.md similarity index 100% rename from dread-pirate-roberts.md rename to dread pirate roberts.md diff --git a/drive-safe-homie.md b/drive safe homie.md similarity index 100% rename from drive-safe-homie.md rename to drive safe homie.md diff --git a/driven-to-distraction.md b/driven to distraction.md similarity index 100% rename from driven-to-distraction.md rename to driven to distraction.md diff --git a/duncan-jones.md b/duncan jones.md similarity index 100% rename from duncan-jones.md rename to duncan jones.md diff --git a/dust-theory.md b/dust theory.md similarity index 100% rename from dust-theory.md rename to dust theory.md diff --git a/dweb-principles.md b/dweb principles.md similarity index 100% rename from dweb-principles.md rename to dweb principles.md diff --git a/dylan-steck.md b/dylan steck.md similarity index 100% rename from dylan-steck.md rename to dylan steck.md diff --git a/dyokomizo-flancian.md b/dyokomizo flancian.md similarity index 100% rename from dyokomizo-flancian.md rename to dyokomizo flancian.md diff --git a/e-c-b.md b/e c b.md similarity index 100% rename from e-c-b.md rename to e c b.md diff --git a/e-c-s.md b/e c s.md similarity index 100% rename from e-c-s.md rename to e c s.md diff --git a/eagxvirtual-2020.md b/eagxvirtual 2020.md similarity index 100% rename from eagxvirtual-2020.md rename to eagxvirtual 2020.md diff --git a/eberhard-licht.md b/eberhard licht.md similarity index 100% rename from eberhard-licht.md rename to eberhard licht.md diff --git a/ecmascript-internal-property.md b/ecmascript internal property.md similarity index 100% rename from ecmascript-internal-property.md rename to ecmascript internal property.md diff --git a/eddie-higgins.md b/eddie higgins.md similarity index 100% rename from eddie-higgins.md rename to eddie higgins.md diff --git a/edge-of-chaos.md b/edge of chaos.md similarity index 100% rename from edge-of-chaos.md rename to edge of chaos.md diff --git a/edges-of-illusion.md b/edges of illusion.md similarity index 100% rename from edges-of-illusion.md rename to edges of illusion.md diff --git a/effective-altruism-talk.md b/effective altruism talk.md similarity index 100% rename from effective-altruism-talk.md rename to effective altruism talk.md diff --git a/effective-altruism.md b/effective altruism.md similarity index 100% rename from effective-altruism.md rename to effective altruism.md diff --git a/effortless-contact.md b/effortless contact.md similarity index 100% rename from effortless-contact.md rename to effortless contact.md diff --git a/eggy-egregore.md b/eggy egregore.md similarity index 100% rename from eggy-egregore.md rename to eggy egregore.md diff --git a/egypt-ethiopia-conflict.md b/egypt ethiopia conflict.md similarity index 100% rename from egypt-ethiopia-conflict.md rename to egypt ethiopia conflict.md diff --git a/eighteenth-century-poetry.md b/eighteenth century poetry.md similarity index 100% rename from eighteenth-century-poetry.md rename to eighteenth century poetry.md diff --git a/eishin-school.md b/eishin school.md similarity index 100% rename from eishin-school.md rename to eishin school.md diff --git a/el-baile-moderno.md b/el baile moderno.md similarity index 100% rename from el-baile-moderno.md rename to el baile moderno.md diff --git a/el-bolsón.md b/el bolsón.md similarity index 100% rename from el-bolsón.md rename to el bolsón.md diff --git a/el-candor-del-padre-brown.md b/el candor del padre brown.md similarity index 100% rename from el-candor-del-padre-brown.md rename to el candor del padre brown.md diff --git a/el-casal-catalá.md b/el casal catalá.md similarity index 100% rename from el-casal-catalá.md rename to el casal catalá.md diff --git a/el-evangelio-del-coyote.md b/el evangelio del coyote.md similarity index 100% rename from el-evangelio-del-coyote.md rename to el evangelio del coyote.md diff --git a/el-narrador.md b/el narrador.md similarity index 100% rename from el-narrador.md rename to el narrador.md diff --git a/el-problema-son-las-piedras-en-el-camino.md b/el problema son las piedras en el camino.md similarity index 100% rename from el-problema-son-las-piedras-en-el-camino.md rename to el problema son las piedras en el camino.md diff --git a/el-pueblo-unido-jamás-será-vencido.md b/el pueblo unido jamás será vencido.md similarity index 100% rename from el-pueblo-unido-jamás-será-vencido.md rename to el pueblo unido jamás será vencido.md diff --git a/electronic-frontier-foundation.md b/electronic frontier foundation.md similarity index 100% rename from electronic-frontier-foundation.md rename to electronic frontier foundation.md diff --git a/elinor-ostrom.md b/elinor ostrom.md similarity index 100% rename from elinor-ostrom.md rename to elinor ostrom.md diff --git a/embrace-capitalism.md b/embrace capitalism.md similarity index 100% rename from embrace-capitalism.md rename to embrace capitalism.md diff --git a/emerald-tablet.md b/emerald tablet.md similarity index 100% rename from emerald-tablet.md rename to emerald tablet.md diff --git a/emmy-noether.md b/emmy noether.md similarity index 100% rename from emmy-noether.md rename to emmy noether.md diff --git a/empresas-b.md b/empresas b.md similarity index 100% rename from empresas-b.md rename to empresas b.md diff --git a/emre-ergin.md b/emre ergin.md similarity index 100% rename from emre-ergin.md rename to emre ergin.md diff --git a/en-flancia-hay-un-agora.md b/en flancia hay un agora.md similarity index 100% rename from en-flancia-hay-un-agora.md rename to en flancia hay un agora.md diff --git a/encyclopedia-of-world-problems-and-human-potential.md b/encyclopedia of world problems and human potential.md similarity index 100% rename from encyclopedia-of-world-problems-and-human-potential.md rename to encyclopedia of world problems and human potential.md diff --git a/encyclopedia-of-world-problems.md b/encyclopedia of world problems.md similarity index 100% rename from encyclopedia-of-world-problems.md rename to encyclopedia of world problems.md diff --git a/entropic-brain-hypothesis.md b/entropic brain hypothesis.md similarity index 100% rename from entropic-brain-hypothesis.md rename to entropic brain hypothesis.md diff --git a/epidemic-forecasting.md b/epidemic forecasting.md similarity index 100% rename from epidemic-forecasting.md rename to epidemic forecasting.md diff --git a/eric-freeman.md b/eric freeman.md similarity index 100% rename from eric-freeman.md rename to eric freeman.md diff --git a/eric-hoffer.md b/eric hoffer.md similarity index 100% rename from eric-hoffer.md rename to eric hoffer.md diff --git a/eric-linus-kaplan.md b/eric linus kaplan.md similarity index 100% rename from eric-linus-kaplan.md rename to eric linus kaplan.md diff --git a/eric-r-weinstein.md b/eric r weinstein.md similarity index 100% rename from eric-r-weinstein.md rename to eric r weinstein.md diff --git a/eric-raymond.md b/eric raymond.md similarity index 100% rename from eric-raymond.md rename to eric raymond.md diff --git a/eric-weinstein-with-brian-keating.md b/eric weinstein with brian keating.md similarity index 100% rename from eric-weinstein-with-brian-keating.md rename to eric weinstein with brian keating.md diff --git a/eric-weinstein.md b/eric weinstein.md similarity index 100% rename from eric-weinstein.md rename to eric weinstein.md diff --git a/eric-weistein-with-brian-keating.md b/eric weistein with brian keating.md similarity index 100% rename from eric-weistein-with-brian-keating.md rename to eric weistein with brian keating.md diff --git a/erik-d-kennedy.md b/erik d kennedy.md similarity index 100% rename from erik-d-kennedy.md rename to erik d kennedy.md diff --git a/erik-kennedy.md b/erik kennedy.md similarity index 100% rename from erik-kennedy.md rename to erik kennedy.md diff --git a/escenas-de-la-novela-argentina.md b/escenas de la novela argentina.md similarity index 100% rename from escenas-de-la-novela-argentina.md rename to escenas de la novela argentina.md diff --git a/escritos-herèticos.md b/escritos herèticos.md similarity index 100% rename from escritos-herèticos.md rename to escritos herèticos.md diff --git a/escritos-heréticos.md b/escritos heréticos.md similarity index 100% rename from escritos-heréticos.md rename to escritos heréticos.md diff --git a/escuela-de-aprendices.md b/escuela de aprendices.md similarity index 100% rename from escuela-de-aprendices.md rename to escuela de aprendices.md diff --git a/eternal-september.md b/eternal september.md similarity index 100% rename from eternal-september.md rename to eternal september.md diff --git a/ethan-plante.md b/ethan plante.md similarity index 100% rename from ethan-plante.md rename to ethan plante.md diff --git a/etherpad-plugins.md b/etherpad plugins.md similarity index 100% rename from etherpad-plugins.md rename to etherpad plugins.md diff --git a/etherpad-wikilinks.md b/etherpad wikilinks.md similarity index 100% rename from etherpad-wikilinks.md rename to etherpad wikilinks.md diff --git a/ethical-license.md b/ethical license.md similarity index 100% rename from ethical-license.md rename to ethical license.md diff --git a/evan-thompson.md b/evan thompson.md similarity index 100% rename from evan-thompson.md rename to evan thompson.md diff --git a/executive-bathroom.md b/executive bathroom.md similarity index 100% rename from executive-bathroom.md rename to executive bathroom.md diff --git a/exists-forall.md b/exists forall.md similarity index 100% rename from exists-forall.md rename to exists forall.md diff --git a/experimental-social-network.md b/experimental social network.md similarity index 100% rename from experimental-social-network.md rename to experimental social network.md diff --git a/extensible-redirects.md b/extensible redirects.md similarity index 100% rename from extensible-redirects.md rename to extensible redirects.md diff --git a/external-chrome-extension.md b/external chrome extension.md similarity index 100% rename from external-chrome-extension.md rename to external chrome extension.md diff --git a/extropian-net.md b/extropian net.md similarity index 100% rename from extropian-net.md rename to extropian net.md diff --git a/f-s-b.md b/f s b.md similarity index 100% rename from f-s-b.md rename to f s b.md diff --git a/fabien-gandon.md b/fabien gandon.md similarity index 100% rename from fabien-gandon.md rename to fabien gandon.md diff --git a/facebook-is-a-doomsday-machine.md b/facebook is a doomsday machine.md similarity index 100% rename from facebook-is-a-doomsday-machine.md rename to facebook is a doomsday machine.md diff --git a/favourite-things.md b/favourite things.md similarity index 100% rename from favourite-things.md rename to favourite things.md diff --git a/feature-requests.md b/feature requests.md similarity index 100% rename from feature-requests.md rename to feature requests.md diff --git a/features-of-the-agora.md b/features of the agora.md similarity index 100% rename from features-of-the-agora.md rename to features of the agora.md diff --git a/february-14th,-2020.md b/february 14th, 2020.md similarity index 100% rename from february-14th,-2020.md rename to february 14th, 2020.md diff --git a/federated-ecosystem.md b/federated ecosystem.md similarity index 100% rename from federated-ecosystem.md rename to federated ecosystem.md diff --git a/federated-ecosystems.md b/federated ecosystems.md similarity index 100% rename from federated-ecosystems.md rename to federated ecosystems.md diff --git a/federated-wiki.md b/federated wiki.md similarity index 100% rename from federated-wiki.md rename to federated wiki.md diff --git a/fediverse-party.md b/fediverse party.md similarity index 100% rename from fediverse-party.md rename to fediverse party.md diff --git a/fediverse-space.md b/fediverse space.md similarity index 100% rename from fediverse-space.md rename to fediverse space.md diff --git a/fediverse-stoa.md b/fediverse stoa.md similarity index 100% rename from fediverse-stoa.md rename to fediverse stoa.md diff --git a/fedstoa-bugs.md b/fedstoa bugs.md similarity index 100% rename from fedstoa-bugs.md rename to fedstoa bugs.md diff --git a/felix-hoesch.md b/felix hoesch.md similarity index 100% rename from felix-hoesch.md rename to felix hoesch.md diff --git a/feynman-lectures.md b/feynman lectures.md similarity index 100% rename from feynman-lectures.md rename to feynman lectures.md diff --git a/fifth-international.md b/fifth international.md similarity index 100% rename from fifth-international.md rename to fifth international.md diff --git a/fifth-precept.md b/fifth precept.md similarity index 100% rename from fifth-precept.md rename to fifth precept.md diff --git a/fight-procrastination.md b/fight procrastination.md similarity index 100% rename from fight-procrastination.md rename to fight procrastination.md diff --git a/filosofía-para-los-retos-contemporáneos.md b/filosofía para los retos contemporáneos.md similarity index 100% rename from filosofía-para-los-retos-contemporáneos.md rename to filosofía para los retos contemporáneos.md diff --git a/final-del-juego.md b/final del juego.md similarity index 100% rename from final-del-juego.md rename to final del juego.md diff --git a/firefox-nightly.md b/firefox nightly.md similarity index 100% rename from firefox-nightly.md rename to firefox nightly.md diff --git a/firefox-qa.md b/firefox qa.md similarity index 100% rename from firefox-qa.md rename to firefox qa.md diff --git a/first-stoa.md b/first stoa.md similarity index 100% rename from first-stoa.md rename to first stoa.md diff --git a/fission-talks.md b/fission talks.md similarity index 100% rename from fission-talks.md rename to fission talks.md diff --git a/fission-whitepaper.md b/fission whitepaper.md similarity index 100% rename from fission-whitepaper.md rename to fission whitepaper.md diff --git a/five-o-clock.md b/five o clock.md similarity index 100% rename from five-o-clock.md rename to five o clock.md diff --git a/fix-500s.md b/fix 500s.md similarity index 100% rename from fix-500s.md rename to fix 500s.md diff --git a/fixing-it.md b/fixing it.md similarity index 100% rename from fixing-it.md rename to fixing it.md diff --git a/fka-twigs.md b/fka twigs.md similarity index 100% rename from fka-twigs.md rename to fka twigs.md diff --git a/flaeky-pancako.md b/flaeky pancako.md similarity index 100% rename from flaeky-pancako.md rename to flaeky pancako.md diff --git a/flags-of-flancia.md b/flags of flancia.md similarity index 100% rename from flags-of-flancia.md rename to flags of flancia.md diff --git a/flammarion-engraving.md b/flammarion engraving.md similarity index 100% rename from flammarion-engraving.md rename to flammarion engraving.md diff --git a/flancia-collective.md b/flancia collective.md similarity index 100% rename from flancia-collective.md rename to flancia collective.md diff --git a/flancia-coop.md b/flancia coop.md similarity index 100% rename from flancia-coop.md rename to flancia coop.md diff --git a/flancia-es.md b/flancia es.md similarity index 100% rename from flancia-es.md rename to flancia es.md diff --git a/flancia-foundation.md b/flancia foundation.md similarity index 100% rename from flancia-foundation.md rename to flancia foundation.md diff --git a/flancia-goals.md b/flancia goals.md similarity index 100% rename from flancia-goals.md rename to flancia goals.md diff --git a/flancia-governance.md b/flancia governance.md similarity index 100% rename from flancia-governance.md rename to flancia governance.md diff --git a/flancia-narrative.md b/flancia narrative.md similarity index 100% rename from flancia-narrative.md rename to flancia narrative.md diff --git a/flancia-org.md b/flancia org.md similarity index 100% rename from flancia-org.md rename to flancia org.md diff --git a/flancia-procedure.md b/flancia procedure.md similarity index 100% rename from flancia-procedure.md rename to flancia procedure.md diff --git a/flancia-subtitles.md b/flancia subtitles.md similarity index 100% rename from flancia-subtitles.md rename to flancia subtitles.md diff --git a/flancia-the-game.md b/flancia the game.md similarity index 100% rename from flancia-the-game.md rename to flancia the game.md diff --git a/flancia,-or-the-paradise-of-those-that-might-have-thrived.md b/flancia, or the paradise of those that might have thrived.md similarity index 100% rename from flancia,-or-the-paradise-of-those-that-might-have-thrived.md rename to flancia, or the paradise of those that might have thrived.md diff --git a/flancian-feedback.md b/flancian feedback.md similarity index 100% rename from flancian-feedback.md rename to flancian feedback.md diff --git a/flancian-in-merveilles.md b/flancian in merveilles.md similarity index 100% rename from flancian-in-merveilles.md rename to flancian in merveilles.md diff --git a/flaneur-browser.md b/flaneur browser.md similarity index 100% rename from flaneur-browser.md rename to flaneur browser.md diff --git a/flourless-banana-bread.md b/flourless banana bread.md similarity index 100% rename from flourless-banana-bread.md rename to flourless banana bread.md diff --git a/flower-sermon.md b/flower sermon.md similarity index 100% rename from flower-sermon.md rename to flower sermon.md diff --git a/foam-config.md b/foam config.md similarity index 100% rename from foam-config.md rename to foam config.md diff --git a/foam-settings.md b/foam settings.md similarity index 100% rename from foam-settings.md rename to foam settings.md diff --git a/foam-workspace.md b/foam workspace.md similarity index 100% rename from foam-workspace.md rename to foam workspace.md diff --git a/focal-point.md b/focal point.md similarity index 100% rename from focal-point.md rename to focal point.md diff --git a/fogg-behavior-model.md b/fogg behavior model.md similarity index 100% rename from fogg-behavior-model.md rename to fogg behavior model.md diff --git a/font-of-augurs.md b/font of augurs.md similarity index 100% rename from font-of-augurs.md rename to font of augurs.md diff --git a/force-directed-graphs.md b/force directed graphs.md similarity index 100% rename from force-directed-graphs.md rename to force directed graphs.md diff --git a/force-graph.md b/force graph.md similarity index 100% rename from force-graph.md rename to force graph.md diff --git a/forge-fed.md b/forge fed.md similarity index 100% rename from forge-fed.md rename to forge fed.md diff --git a/formal-logic.md b/formal logic.md similarity index 100% rename from formal-logic.md rename to formal logic.md diff --git a/foucault-s-turtlenecks.md b/foucault s turtlenecks.md similarity index 100% rename from foucault-s-turtlenecks.md rename to foucault s turtlenecks.md diff --git a/foucaults-turtlenecks.md b/foucaults turtlenecks.md similarity index 100% rename from foucaults-turtlenecks.md rename to foucaults turtlenecks.md diff --git a/four-quadrants.md b/four quadrants.md similarity index 100% rename from four-quadrants.md rename to four quadrants.md diff --git a/four-quartets.md b/four quartets.md similarity index 100% rename from four-quartets.md rename to four quartets.md diff --git a/fourth-international.md b/fourth international.md similarity index 100% rename from fourth-international.md rename to fourth international.md diff --git a/frank-lloyd-wright.md b/frank lloyd wright.md similarity index 100% rename from frank-lloyd-wright.md rename to frank lloyd wright.md diff --git a/frantz-fanon.md b/frantz fanon.md similarity index 100% rename from frantz-fanon.md rename to frantz fanon.md diff --git a/françoise-hardy.md b/françoise hardy.md similarity index 100% rename from françoise-hardy.md rename to françoise hardy.md diff --git a/fred-bednarski.md b/fred bednarski.md similarity index 100% rename from fred-bednarski.md rename to fred bednarski.md diff --git a/free-time.md b/free time.md similarity index 100% rename from free-time.md rename to free time.md diff --git a/free-universal-construction-kit.md b/free universal construction kit.md similarity index 100% rename from free-universal-construction-kit.md rename to free universal construction kit.md diff --git a/free-world-charter.md b/free world charter.md similarity index 100% rename from free-world-charter.md rename to free world charter.md diff --git a/front-matter.md b/front matter.md similarity index 100% rename from front-matter.md rename to front matter.md diff --git a/full-throttle.md b/full throttle.md similarity index 100% rename from full-throttle.md rename to full throttle.md diff --git a/fully-automated-luxury-gay-space-communism.md b/fully automated luxury gay space communism.md similarity index 100% rename from fully-automated-luxury-gay-space-communism.md rename to fully automated luxury gay space communism.md diff --git a/fundació-joan-miró.md b/fundació joan miró.md similarity index 100% rename from fundació-joan-miró.md rename to fundació joan miró.md diff --git a/future-project.md b/future project.md similarity index 100% rename from future-project.md rename to future project.md diff --git a/fuzzy-thinker.md b/fuzzy thinker.md similarity index 100% rename from fuzzy-thinker.md rename to fuzzy thinker.md diff --git a/g-i.md b/g i.md similarity index 100% rename from g-i.md rename to g i.md diff --git a/game-b.md b/game b.md similarity index 100% rename from game-b.md rename to game b.md diff --git a/game-of-life.md b/game of life.md similarity index 100% rename from game-of-life.md rename to game of life.md diff --git a/garden-of-forking-paths.md b/garden of forking paths.md similarity index 100% rename from garden-of-forking-paths.md rename to garden of forking paths.md diff --git a/garment-design-with-gans.md b/garment design with gans.md similarity index 100% rename from garment-design-with-gans.md rename to garment design with gans.md diff --git a/gather-town.md b/gather town.md similarity index 100% rename from gather-town.md rename to gather town.md diff --git a/gauge-fields-knots-and-gravity.md b/gauge fields knots and gravity.md similarity index 100% rename from gauge-fields-knots-and-gravity.md rename to gauge fields knots and gravity.md diff --git a/gauge-fields-nots-and-gravity.md b/gauge fields nots and gravity.md similarity index 100% rename from gauge-fields-nots-and-gravity.md rename to gauge fields nots and gravity.md diff --git a/gauge-theory.md b/gauge theory.md similarity index 100% rename from gauge-theory.md rename to gauge theory.md diff --git a/gen-studio.md b/gen studio.md similarity index 100% rename from gen-studio.md rename to gen studio.md diff --git a/gene-wolfe.md b/gene wolfe.md similarity index 100% rename from gene-wolfe.md rename to gene wolfe.md diff --git a/gentle-revolution.md b/gentle revolution.md similarity index 100% rename from gentle-revolution.md rename to gentle revolution.md diff --git a/geometric-unity.md b/geometric unity.md similarity index 100% rename from geometric-unity.md rename to geometric unity.md diff --git a/george-handel.md b/george handel.md similarity index 100% rename from george-handel.md rename to george handel.md diff --git a/georgo-vassilis.md b/georgo vassilis.md similarity index 100% rename from georgo-vassilis.md rename to georgo vassilis.md diff --git a/gerald-sussman.md b/gerald sussman.md similarity index 100% rename from gerald-sussman.md rename to gerald sussman.md diff --git a/gerhard-zorn.md b/gerhard zorn.md similarity index 100% rename from gerhard-zorn.md rename to gerhard zorn.md diff --git a/gerry-garbulsky.md b/gerry garbulsky.md similarity index 100% rename from gerry-garbulsky.md rename to gerry garbulsky.md diff --git a/getting-things-done.md b/getting things done.md similarity index 100% rename from getting-things-done.md rename to getting things done.md diff --git a/ghost-knowledge.md b/ghost knowledge.md similarity index 100% rename from ghost-knowledge.md rename to ghost knowledge.md diff --git a/giant-global-graph.md b/giant global graph.md similarity index 100% rename from giant-global-graph.md rename to giant global graph.md diff --git a/gift-idea.md b/gift idea.md similarity index 100% rename from gift-idea.md rename to gift idea.md diff --git a/git-alias.md b/git alias.md similarity index 100% rename from git-alias.md rename to git alias.md diff --git a/git-bug.md b/git bug.md similarity index 100% rename from git-bug.md rename to git bug.md diff --git a/git-config.md b/git config.md similarity index 100% rename from git-config.md rename to git config.md diff --git a/git-on-ipfs.md b/git on ipfs.md similarity index 100% rename from git-on-ipfs.md rename to git on ipfs.md diff --git a/git-ship.md b/git ship.md similarity index 100% rename from git-ship.md rename to git ship.md diff --git a/git-stoa.md b/git stoa.md similarity index 100% rename from git-stoa.md rename to git stoa.md diff --git a/give-directly.md b/give directly.md similarity index 100% rename from give-directly.md rename to give directly.md diff --git a/giving-pledge.md b/giving pledge.md similarity index 100% rename from giving-pledge.md rename to giving pledge.md diff --git a/giving-what-we-can.md b/giving what we can.md similarity index 100% rename from giving-what-we-can.md rename to giving what we can.md diff --git a/global-decision-making-via-local-economic-transactions.md b/global decision making via local economic transactions.md similarity index 100% rename from global-decision-making-via-local-economic-transactions.md rename to global decision making via local economic transactions.md diff --git a/global-economic-inequality.md b/global economic inequality.md similarity index 100% rename from global-economic-inequality.md rename to global economic inequality.md diff --git a/global-health-and-development-fund.md b/global health and development fund.md similarity index 100% rename from global-health-and-development-fund.md rename to global health and development fund.md diff --git a/global-priorities-institute.md b/global priorities institute.md similarity index 100% rename from global-priorities-institute.md rename to global priorities institute.md diff --git a/go-link.md b/go link.md similarity index 100% rename from go-link.md rename to go link.md diff --git a/go-run.md b/go run.md similarity index 100% rename from go-run.md rename to go run.md diff --git a/good-time.md b/good time.md similarity index 100% rename from good-time.md rename to good time.md diff --git a/good-titles.md b/good titles.md similarity index 100% rename from good-titles.md rename to good titles.md diff --git a/goodreads-bridge.md b/goodreads bridge.md similarity index 100% rename from goodreads-bridge.md rename to goodreads bridge.md diff --git a/goodreads-export.md b/goodreads export.md similarity index 100% rename from goodreads-export.md rename to goodreads export.md diff --git a/google-alternatives.md b/google alternatives.md similarity index 100% rename from google-alternatives.md rename to google alternatives.md diff --git a/google-keep.md b/google keep.md similarity index 100% rename from google-keep.md rename to google keep.md diff --git a/gopher-like.md b/gopher like.md similarity index 100% rename from gopher-like.md rename to gopher like.md diff --git a/gordon-brander.md b/gordon brander.md similarity index 100% rename from gordon-brander.md rename to gordon brander.md diff --git a/gphotos-uploader-cli.md b/gphotos uploader cli.md similarity index 100% rename from gphotos-uploader-cli.md rename to gphotos uploader cli.md diff --git a/gpt-2.md b/gpt 2.md similarity index 100% rename from gpt-2.md rename to gpt 2.md diff --git a/gpt-3.md b/gpt 3.md similarity index 100% rename from gpt-3.md rename to gpt 3.md diff --git a/gray-card.md b/gray card.md similarity index 100% rename from gray-card.md rename to gray card.md diff --git a/great-news.md b/great news.md similarity index 100% rename from great-news.md rename to great news.md diff --git a/great-open-source.md b/great open source.md similarity index 100% rename from great-open-source.md rename to great open source.md diff --git a/green-yoga.md b/green yoga.md similarity index 100% rename from green-yoga.md rename to green yoga.md diff --git a/greg-egan.md b/greg egan.md similarity index 100% rename from greg-egan.md rename to greg egan.md diff --git a/gregory-bateson.md b/gregory bateson.md similarity index 100% rename from gregory-bateson.md rename to gregory bateson.md diff --git a/groundhog-day.md b/groundhog day.md similarity index 100% rename from groundhog-day.md rename to groundhog day.md diff --git a/growing-artificial-societies.md b/growing artificial societies.md similarity index 100% rename from growing-artificial-societies.md rename to growing artificial societies.md diff --git a/guerilla-open-access-manifesto.md b/guerilla open access manifesto.md similarity index 100% rename from guerilla-open-access-manifesto.md rename to guerilla open access manifesto.md diff --git a/gyuri-lajos.md b/gyuri lajos.md similarity index 100% rename from gyuri-lajos.md rename to gyuri lajos.md diff --git a/habitat-67.md b/habitat 67.md similarity index 100% rename from habitat-67.md rename to habitat 67.md diff --git a/hack-the-planet.md b/hack the planet.md similarity index 100% rename from hack-the-planet.md rename to hack the planet.md diff --git a/hacker-manifesto.md b/hacker manifesto.md similarity index 100% rename from hacker-manifesto.md rename to hacker manifesto.md diff --git a/hacker-news.md b/hacker news.md similarity index 100% rename from hacker-news.md rename to hacker news.md diff --git a/hackers-heroes-of-the-computer-revolution.md b/hackers heroes of the computer revolution.md similarity index 100% rename from hackers-heroes-of-the-computer-revolution.md rename to hackers heroes of the computer revolution.md diff --git a/hans-widmer.md b/hans widmer.md similarity index 100% rename from hans-widmer.md rename to hans widmer.md diff --git a/harvey-michael.md b/harvey michael.md similarity index 100% rename from harvey-michael.md rename to harvey michael.md diff --git a/hashing-function.md b/hashing function.md similarity index 100% rename from hashing-function.md rename to hashing function.md diff --git a/heather-marsh.md b/heather marsh.md similarity index 100% rename from heather-marsh.md rename to heather marsh.md diff --git a/help-others.md b/help others.md similarity index 100% rename from help-others.md rename to help others.md diff --git a/herbert simon.md b/herbert simon.md index 19827022a..8ce0917e9 100644 --- a/herbert simon.md +++ b/herbert simon.md @@ -1,7 +1,2 @@ # herbert simon -- a [[person]] - - [[wp]] https://en.wikipedia.org/wiki/Herbert_A._Simon - - [[economist]] [[political scientist]] [[cognitive psychologist]] - - [[go]] [[wp]] - diff --git a/herbert-simon.md b/herbert-simon.md deleted file mode 100644 index 8ce0917e9..000000000 --- a/herbert-simon.md +++ /dev/null @@ -1,2 +0,0 @@ -# herbert simon - diff --git a/hershel-of-ostropol.md b/hershel of ostropol.md similarity index 100% rename from hershel-of-ostropol.md rename to hershel of ostropol.md diff --git a/heterarchical-ontology.md b/heterarchical ontology.md similarity index 100% rename from heterarchical-ontology.md rename to heterarchical ontology.md diff --git a/hide-tabs-in-firefox.md b/hide tabs in firefox.md similarity index 100% rename from hide-tabs-in-firefox.md rename to hide tabs in firefox.md diff --git a/high-stakes-worldview.md b/high stakes worldview.md similarity index 100% rename from high-stakes-worldview.md rename to high stakes worldview.md diff --git a/hillel-the-elder.md b/hillel the elder.md similarity index 100% rename from hillel-the-elder.md rename to hillel the elder.md diff --git a/historias-de-cronopios-y-de-famas.md b/historias de cronopios y de famas.md similarity index 100% rename from historias-de-cronopios-y-de-famas.md rename to historias de cronopios y de famas.md diff --git a/historical-agora.md b/historical agora.md similarity index 100% rename from historical-agora.md rename to historical agora.md diff --git a/hn-alternatives.md b/hn alternatives.md similarity index 100% rename from hn-alternatives.md rename to hn alternatives.md diff --git a/hohenzollern-castle.md b/hohenzollern castle.md similarity index 100% rename from hohenzollern-castle.md rename to hohenzollern castle.md diff --git a/hope-or-hype-for-art.md b/hope or hype for art.md similarity index 100% rename from hope-or-hype-for-art.md rename to hope or hype for art.md diff --git a/housing-underlay.md b/housing underlay.md similarity index 100% rename from housing-underlay.md rename to housing underlay.md diff --git a/how-it-should-be.md b/how it should be.md similarity index 100% rename from how-it-should-be.md rename to how it should be.md diff --git a/how-many-tabs-do-you-have-open.md b/how many tabs do you have open.md similarity index 100% rename from how-many-tabs-do-you-have-open.md rename to how many tabs do you have open.md diff --git a/how-tech-loses-out.md b/how tech loses out.md similarity index 100% rename from how-tech-loses-out.md rename to how tech loses out.md diff --git a/how-to-become-a-flancian.md b/how to become a flancian.md similarity index 100% rename from how-to-become-a-flancian.md rename to how to become a flancian.md diff --git a/how-to-feed-10-billion-people.md b/how to feed 10 billion people.md similarity index 100% rename from how-to-feed-10-billion-people.md rename to how to feed 10 billion people.md diff --git a/how-to-gpt-2.md b/how to gpt 2.md similarity index 100% rename from how-to-gpt-2.md rename to how to gpt 2.md diff --git a/how-to-learn-scala.md b/how to learn scala.md similarity index 100% rename from how-to-learn-scala.md rename to how to learn scala.md diff --git a/how-to-make-almost-anything.md b/how to make almost anything.md similarity index 100% rename from how-to-make-almost-anything.md rename to how to make almost anything.md diff --git a/how-to-read-a-book.md b/how to read a book.md similarity index 100% rename from how-to-read-a-book.md rename to how to read a book.md diff --git a/how-to-self-publish-a-book.md b/how to self publish a book.md similarity index 100% rename from how-to-self-publish-a-book.md rename to how to self publish a book.md diff --git a/how-to-start-a-new-country.md b/how to start a new country.md similarity index 100% rename from how-to-start-a-new-country.md rename to how to start a new country.md diff --git a/how-to-write-a-caron-in-linux.md b/how to write a caron in linux.md similarity index 100% rename from how-to-write-a-caron-in-linux.md rename to how to write a caron in linux.md diff --git a/hubert-dreyfus.md b/hubert dreyfus.md similarity index 100% rename from hubert-dreyfus.md rename to hubert dreyfus.md diff --git a/huerta-común.md b/huerta común.md similarity index 100% rename from huerta-común.md rename to huerta común.md diff --git a/human-computer-interaction.md b/human computer interaction.md similarity index 100% rename from human-computer-interaction.md rename to human computer interaction.md diff --git a/human-right.md b/human right.md similarity index 100% rename from human-right.md rename to human right.md diff --git a/human-rights.md b/human rights.md similarity index 100% rename from human-rights.md rename to human rights.md diff --git a/humane-tech.md b/humane tech.md similarity index 100% rename from humane-tech.md rename to humane tech.md diff --git a/hype-man.md b/hype man.md similarity index 100% rename from hype-man.md rename to hype man.md diff --git a/hypercore-proto.md b/hypercore proto.md similarity index 100% rename from hypercore-proto.md rename to hypercore proto.md diff --git a/hypercore-protocol.md b/hypercore protocol.md similarity index 100% rename from hypercore-protocol.md rename to hypercore protocol.md diff --git a/hyperlink-delusion.md b/hyperlink delusion.md similarity index 100% rename from hyperlink-delusion.md rename to hyperlink delusion.md diff --git a/hypothesis-extension.md b/hypothesis extension.md similarity index 100% rename from hypothesis-extension.md rename to hypothesis extension.md diff --git a/hypothesis-intro.md b/hypothesis intro.md similarity index 100% rename from hypothesis-intro.md rename to hypothesis intro.md diff --git a/hypothesis-roam-bridge.md b/hypothesis roam bridge.md similarity index 100% rename from hypothesis-roam-bridge.md rename to hypothesis roam bridge.md diff --git a/i-ching-lite.md b/i ching lite.md similarity index 100% rename from i-ching-lite.md rename to i ching lite.md diff --git a/i-ching.md b/i ching.md similarity index 100% rename from i-ching.md rename to i ching.md diff --git a/i-could-node-in-the-agora-all-day-and-all-night.md b/i could node in the agora all day and all night.md similarity index 100% rename from i-could-node-in-the-agora-all-day-and-all-night.md rename to i could node in the agora all day and all night.md diff --git a/i-ll-kill-your-shining-lights.md b/i ll kill your shining lights.md similarity index 100% rename from i-ll-kill-your-shining-lights.md rename to i ll kill your shining lights.md diff --git a/i-want-to-inspire-others-the-same-way-that-others-inspire-me.md b/i want to inspire others the same way that others inspire me.md similarity index 100% rename from i-want-to-inspire-others-the-same-way-that-others-inspire-me.md rename to i want to inspire others the same way that others inspire me.md diff --git a/iap-2021.md b/iap 2021.md similarity index 100% rename from iap-2021.md rename to iap 2021.md diff --git a/idea-market.md b/idea market.md similarity index 100% rename from idea-market.md rename to idea market.md diff --git a/if-i-had-the-means-i-d-build-an-agora.md b/if i had the means i d build an agora.md similarity index 100% rename from if-i-had-the-means-i-d-build-an-agora.md rename to if i had the means i d build an agora.md diff --git a/if-you-want-to-share.md b/if you want to share.md similarity index 100% rename from if-you-want-to-share.md rename to if you want to share.md diff --git a/igor-lenterman.md b/igor lenterman.md similarity index 100% rename from igor-lenterman.md rename to igor lenterman.md diff --git a/ijeoma-oluo.md b/ijeoma oluo.md similarity index 100% rename from ijeoma-oluo.md rename to ijeoma oluo.md diff --git a/ikko-tanaka.md b/ikko tanaka.md similarity index 100% rename from ikko-tanaka.md rename to ikko tanaka.md diff --git a/immers-space.md b/immers space.md similarity index 100% rename from immers-space.md rename to immers space.md diff --git a/imperial-college-tracker.md b/imperial college tracker.md similarity index 100% rename from imperial-college-tracker.md rename to imperial college tracker.md diff --git a/implementation-intention.md b/implementation intention.md similarity index 100% rename from implementation-intention.md rename to implementation intention.md diff --git a/in-an-endearing.md b/in an endearing.md similarity index 100% rename from in-an-endearing.md rename to in an endearing.md diff --git a/in-buddha-s-words.md b/in buddha s words.md similarity index 100% rename from in-buddha-s-words.md rename to in buddha s words.md diff --git a/in-flancia-there-are-no-walled-gardens.md b/in flancia there are no walled gardens.md similarity index 100% rename from in-flancia-there-are-no-walled-gardens.md rename to in flancia there are no walled gardens.md diff --git a/in-flancia-there-is-an-agora.md b/in flancia there is an agora.md similarity index 100% rename from in-flancia-there-is-an-agora.md rename to in flancia there is an agora.md diff --git a/in-praise-of-idleness.md b/in praise of idleness.md similarity index 100% rename from in-praise-of-idleness.md rename to in praise of idleness.md diff --git a/in-the-arcades.md b/in the arcades.md similarity index 100% rename from in-the-arcades.md rename to in the arcades.md diff --git a/in-the-beginning-was-the-command-line.md b/in the beginning was the command line.md similarity index 100% rename from in-the-beginning-was-the-command-line.md rename to in the beginning was the command line.md diff --git a/in-the-wilderless.md b/in the wilderless.md similarity index 100% rename from in-the-wilderless.md rename to in the wilderless.md diff --git a/indie-hackers.md b/indie hackers.md similarity index 100% rename from indie-hackers.md rename to indie hackers.md diff --git a/indie-web.md b/indie web.md similarity index 100% rename from indie-web.md rename to indie web.md diff --git a/indra-s-net.md b/indra s net.md similarity index 100% rename from indra-s-net.md rename to indra s net.md diff --git a/indra's-net.md b/indra's net.md similarity index 100% rename from indra's-net.md rename to indra's net.md diff --git a/indras-net.md b/indras net.md similarity index 100% rename from indras-net.md rename to indras net.md diff --git a/infinity-project.md b/infinity project.md similarity index 100% rename from infinity-project.md rename to infinity project.md diff --git a/information-as-fundamental.md b/information as fundamental.md similarity index 100% rename from information-as-fundamental.md rename to information as fundamental.md diff --git a/innovation-information-initiative.md b/innovation information initiative.md similarity index 100% rename from innovation-information-initiative.md rename to innovation information initiative.md diff --git a/instant-commons.md b/instant commons.md similarity index 100% rename from instant-commons.md rename to instant commons.md diff --git a/instinctive-sleeping-and-resting-postures.md b/instinctive sleeping and resting postures.md similarity index 100% rename from instinctive-sleeping-and-resting-postures.md rename to instinctive sleeping and resting postures.md diff --git a/integrated-repository.md b/integrated repository.md similarity index 100% rename from integrated-repository.md rename to integrated repository.md diff --git a/intent-based-automation.md b/intent based automation.md similarity index 100% rename from intent-based-automation.md rename to intent based automation.md diff --git a/intent-driven-automation.md b/intent driven automation.md similarity index 100% rename from intent-driven-automation.md rename to intent driven automation.md diff --git a/intentional-society.md b/intentional society.md similarity index 100% rename from intentional-society.md rename to intentional society.md diff --git a/inter-wiki.md b/inter wiki.md similarity index 100% rename from inter-wiki.md rename to inter wiki.md diff --git a/interactive-philosophers-graph.md b/interactive philosophers graph.md similarity index 100% rename from interactive-philosophers-graph.md rename to interactive philosophers graph.md diff --git a/internal-chrome-extension.md b/internal chrome extension.md similarity index 100% rename from internal-chrome-extension.md rename to internal chrome extension.md diff --git a/internet-citizen.md b/internet citizen.md similarity index 100% rename from internet-citizen.md rename to internet citizen.md diff --git a/internet-renaissance.md b/internet renaissance.md similarity index 100% rename from internet-renaissance.md rename to internet renaissance.md diff --git a/interplanetary-mind-map.md b/interplanetary mind map.md similarity index 100% rename from interplanetary-mind-map.md rename to interplanetary mind map.md diff --git a/ipfs-backend-for-tiddlywiki.md b/ipfs backend for tiddlywiki.md similarity index 100% rename from ipfs-backend-for-tiddlywiki.md rename to ipfs backend for tiddlywiki.md diff --git a/iron-absorption.md b/iron absorption.md similarity index 100% rename from iron-absorption.md rename to iron absorption.md diff --git a/iso-8601.md b/iso 8601.md similarity index 100% rename from iso-8601.md rename to iso 8601.md diff --git a/isomorphic-git.md b/isomorphic git.md similarity index 100% rename from isomorphic-git.md rename to isomorphic git.md diff --git a/ivan-herman.md b/ivan herman.md similarity index 100% rename from ivan-herman.md rename to ivan herman.md diff --git a/izzy-swart.md b/izzy swart.md similarity index 100% rename from izzy-swart.md rename to izzy swart.md diff --git a/j-posadas.md b/j posadas.md similarity index 100% rename from j-posadas.md rename to j posadas.md diff --git a/jack-park.md b/jack park.md similarity index 100% rename from jack-park.md rename to jack park.md diff --git a/james-baker.md b/james baker.md similarity index 100% rename from james-baker.md rename to james baker.md diff --git a/james-fodor.md b/james fodor.md similarity index 100% rename from james-fodor.md rename to james fodor.md diff --git a/james-gleick.md b/james gleick.md similarity index 100% rename from james-gleick.md rename to james gleick.md diff --git a/janique-behman.md b/janique behman.md similarity index 100% rename from janique-behman.md rename to janique behman.md diff --git a/jarke-wharton.md b/jarke wharton.md similarity index 100% rename from jarke-wharton.md rename to jarke wharton.md diff --git a/jarkko-oikarinen.md b/jarkko oikarinen.md similarity index 100% rename from jarkko-oikarinen.md rename to jarkko oikarinen.md diff --git a/javascript-subnodes.md b/javascript subnodes.md similarity index 100% rename from javascript-subnodes.md rename to javascript subnodes.md diff --git a/jean-françois-lyotard.md b/jean françois lyotard.md similarity index 100% rename from jean-françois-lyotard.md rename to jean françois lyotard.md diff --git a/jean-michel-jarre.md b/jean michel jarre.md similarity index 100% rename from jean-michel-jarre.md rename to jean michel jarre.md diff --git a/jed-mckenna.md b/jed mckenna.md similarity index 100% rename from jed-mckenna.md rename to jed mckenna.md diff --git a/jeff-tang.md b/jeff tang.md similarity index 100% rename from jeff-tang.md rename to jeff tang.md diff --git a/jennifer-rygh.md b/jennifer rygh.md similarity index 100% rename from jennifer-rygh.md rename to jennifer rygh.md diff --git a/jerry-michalski.md b/jerry michalski.md similarity index 100% rename from jerry-michalski.md rename to jerry michalski.md diff --git a/jesse-li.md b/jesse li.md similarity index 100% rename from jesse-li.md rename to jesse li.md diff --git a/jevons-paradox.md b/jevons paradox.md similarity index 100% rename from jevons-paradox.md rename to jevons paradox.md diff --git a/jitsi-meet.md b/jitsi meet.md similarity index 100% rename from jitsi-meet.md rename to jitsi meet.md diff --git a/joan-miro.md b/joan miro.md similarity index 100% rename from joan-miro.md rename to joan miro.md diff --git a/joel-gustafson.md b/joel gustafson.md similarity index 100% rename from joel-gustafson.md rename to joel gustafson.md diff --git a/joey-savoie.md b/joey savoie.md similarity index 100% rename from joey-savoie.md rename to joey savoie.md diff --git a/john-brown.md b/john brown.md similarity index 100% rename from john-brown.md rename to john brown.md diff --git a/john-cowper-powys.md b/john cowper powys.md similarity index 100% rename from john-cowper-powys.md rename to john cowper powys.md diff --git a/john-ii-komnenos.md b/john ii komnenos.md similarity index 100% rename from john-ii-komnenos.md rename to john ii komnenos.md diff --git a/john-ingalls.md b/john ingalls.md similarity index 100% rename from john-ingalls.md rename to john ingalls.md diff --git a/john-perry-barlow.md b/john perry barlow.md similarity index 100% rename from john-perry-barlow.md rename to john perry barlow.md diff --git a/johnny-mnemonic.md b/johnny mnemonic.md similarity index 100% rename from johnny-mnemonic.md rename to johnny mnemonic.md diff --git a/jonathan-aquino.md b/jonathan aquino.md similarity index 100% rename from jonathan-aquino.md rename to jonathan aquino.md diff --git a/jonathan-the-utopian.md b/jonathan the utopian.md similarity index 100% rename from jonathan-the-utopian.md rename to jonathan the utopian.md diff --git a/jordan-peterson.md b/jordan peterson.md similarity index 100% rename from jordan-peterson.md rename to jordan peterson.md diff --git a/jorge-bolet.md b/jorge bolet.md similarity index 100% rename from jorge-bolet.md rename to jorge bolet.md diff --git a/jorge-luis-borges.md b/jorge luis borges.md similarity index 100% rename from jorge-luis-borges.md rename to jorge luis borges.md diff --git a/joscha-bach.md b/joscha bach.md similarity index 100% rename from joscha-bach.md rename to joscha bach.md diff --git a/js-subnodes.md b/js subnodes.md similarity index 100% rename from js-subnodes.md rename to js subnodes.md diff --git a/json-ld.md b/json ld.md similarity index 100% rename from json-ld.md rename to json ld.md diff --git a/juan-carlos-onetti.md b/juan carlos onetti.md similarity index 100% rename from juan-carlos-onetti.md rename to juan carlos onetti.md diff --git a/juan-jose-fernandez.md b/juan jose fernandez.md similarity index 100% rename from juan-jose-fernandez.md rename to juan jose fernandez.md diff --git a/juan-sasturain.md b/juan sasturain.md similarity index 100% rename from juan-sasturain.md rename to juan sasturain.md diff --git a/jud-brewer.md b/jud brewer.md similarity index 100% rename from jud-brewer.md rename to jud brewer.md diff --git a/julia-serano.md b/julia serano.md similarity index 100% rename from julia-serano.md rename to julia serano.md diff --git a/juliana-barwick.md b/juliana barwick.md similarity index 100% rename from juliana-barwick.md rename to juliana barwick.md diff --git a/julio-cortázar.md b/julio cortázar.md similarity index 100% rename from julio-cortázar.md rename to julio cortázar.md diff --git a/julio-jcortázar.md b/julio jcortázar.md similarity index 100% rename from julio-jcortázar.md rename to julio jcortázar.md diff --git a/jumpsuit-chic.md b/jumpsuit chic.md similarity index 100% rename from jumpsuit-chic.md rename to jumpsuit chic.md diff --git a/karl-marx-technofuturist.md b/karl marx technofuturist.md similarity index 100% rename from karl-marx-technofuturist.md rename to karl marx technofuturist.md diff --git a/karlicoss-flancian.md b/karlicoss flancian.md similarity index 100% rename from karlicoss-flancian.md rename to karlicoss flancian.md diff --git a/karthikk-vijay.md b/karthikk vijay.md similarity index 100% rename from karthikk-vijay.md rename to karthikk vijay.md diff --git a/kasparov-vs-the-world.md b/kasparov vs the world.md similarity index 100% rename from kasparov-vs-the-world.md rename to kasparov vs the world.md diff --git a/keith-johnstone.md b/keith johnstone.md similarity index 100% rename from keith-johnstone.md rename to keith johnstone.md diff --git a/ken-wilber.md b/ken wilber.md similarity index 100% rename from ken-wilber.md rename to ken wilber.md diff --git a/key-lime-pie.md b/key lime pie.md similarity index 100% rename from key-lime-pie.md rename to key lime pie.md diff --git a/killing-rage.md b/killing rage.md similarity index 100% rename from killing-rage.md rename to killing rage.md diff --git a/know-your-amphetamines.md b/know your amphetamines.md similarity index 100% rename from know-your-amphetamines.md rename to know your amphetamines.md diff --git a/knowledge-bases.md b/knowledge bases.md similarity index 100% rename from knowledge-bases.md rename to knowledge bases.md diff --git a/knowledge-futures-group.md b/knowledge futures group.md similarity index 100% rename from knowledge-futures-group.md rename to knowledge futures group.md diff --git a/knowledge-management-applications.md b/knowledge management applications.md similarity index 100% rename from knowledge-management-applications.md rename to knowledge management applications.md diff --git a/kyosaku-jon.md b/kyosaku jon.md similarity index 100% rename from kyosaku-jon.md rename to kyosaku jon.md diff --git a/l-allegro-il-penseroso-ed-il-moderato.md b/l allegro il penseroso ed il moderato.md similarity index 100% rename from l-allegro-il-penseroso-ed-il-moderato.md rename to l allegro il penseroso ed il moderato.md diff --git a/la-vida-breve.md b/la vida breve.md similarity index 100% rename from la-vida-breve.md rename to la vida breve.md diff --git a/laarc-io.md b/laarc io.md similarity index 100% rename from laarc-io.md rename to laarc io.md diff --git a/lady-murasaki.md b/lady murasaki.md similarity index 100% rename from lady-murasaki.md rename to lady murasaki.md diff --git a/lago-atitlán.md b/lago atitlán.md similarity index 100% rename from lago-atitlán.md rename to lago atitlán.md diff --git a/lake-atitlán.md b/lake atitlán.md similarity index 100% rename from lake-atitlán.md rename to lake atitlán.md diff --git a/lambda-calculus.md b/lambda calculus.md similarity index 100% rename from lambda-calculus.md rename to lambda calculus.md diff --git a/land-of-silence-and-darkness.md b/land of silence and darkness.md similarity index 100% rename from land-of-silence-and-darkness.md rename to land of silence and darkness.md diff --git a/landauer-limit.md b/landauer limit.md similarity index 100% rename from landauer-limit.md rename to landauer limit.md diff --git a/langston-hughes.md b/langston hughes.md similarity index 100% rename from langston-hughes.md rename to langston hughes.md diff --git a/language-games.md b/language games.md similarity index 100% rename from language-games.md rename to language games.md diff --git a/language-learning-with-netflix.md b/language learning with netflix.md similarity index 100% rename from language-learning-with-netflix.md rename to language learning with netflix.md diff --git a/latent-compass.md b/latent compass.md similarity index 100% rename from latent-compass.md rename to latent compass.md diff --git a/learn-datalog-today.md b/learn datalog today.md similarity index 100% rename from learn-datalog-today.md rename to learn datalog today.md diff --git a/learning-rust.md b/learning rust.md similarity index 100% rename from learning-rust.md rename to learning rust.md diff --git a/learning-to-learn.md b/learning to learn.md similarity index 100% rename from learning-to-learn.md rename to learning to learn.md diff --git a/left-market-anarchist.md b/left market anarchist.md similarity index 100% rename from left-market-anarchist.md rename to left market anarchist.md diff --git a/lenguaje-universal.md b/lenguaje universal.md similarity index 100% rename from lenguaje-universal.md rename to lenguaje universal.md diff --git a/lenovo-p14.md b/lenovo p14.md similarity index 100% rename from lenovo-p14.md rename to lenovo p14.md diff --git a/leon-trotsky.md b/leon trotsky.md similarity index 100% rename from leon-trotsky.md rename to leon trotsky.md diff --git a/less-wrong.md b/less wrong.md similarity index 100% rename from less-wrong.md rename to less wrong.md diff --git a/let-me-know.md b/let me know.md similarity index 100% rename from let-me-know.md rename to let me know.md diff --git a/let-us-be-one.md b/let us be one.md similarity index 100% rename from let-us-be-one.md rename to let us be one.md diff --git a/letter-wiki.md b/letter wiki.md similarity index 100% rename from letter-wiki.md rename to letter wiki.md diff --git a/levenshtein-distance.md b/levenshtein distance.md similarity index 100% rename from levenshtein-distance.md rename to levenshtein distance.md diff --git a/levi-hart.md b/levi hart.md similarity index 100% rename from levi-hart.md rename to levi hart.md diff --git a/lex-fridman.md b/lex fridman.md similarity index 100% rename from lex-fridman.md rename to lex fridman.md diff --git a/lex-maria.md b/lex maria.md similarity index 100% rename from lex-maria.md rename to lex maria.md diff --git a/liminal-warmth.md b/liminal warmth.md similarity index 100% rename from liminal-warmth.md rename to liminal warmth.md diff --git a/lindy-effect.md b/lindy effect.md similarity index 100% rename from lindy-effect.md rename to lindy effect.md diff --git a/lingua-franca.md b/lingua franca.md similarity index 100% rename from lingua-franca.md rename to lingua franca.md diff --git a/linguistic-example-sentences.md b/linguistic example sentences.md similarity index 100% rename from linguistic-example-sentences.md rename to linguistic example sentences.md diff --git a/link-it-as-you-go-along.md b/link it as you go along.md similarity index 100% rename from link-it-as-you-go-along.md rename to link it as you go along.md diff --git a/link-rot.md b/link rot.md similarity index 100% rename from link-rot.md rename to link rot.md diff --git a/linus-torvalds.md b/linus torvalds.md similarity index 100% rename from linus-torvalds.md rename to linus torvalds.md diff --git a/liquid-democracy.md b/liquid democracy.md similarity index 100% rename from liquid-democracy.md rename to liquid democracy.md diff --git a/list-of-lists-of-lists.md b/list of lists of lists.md similarity index 100% rename from list-of-lists-of-lists.md rename to list of lists of lists.md diff --git a/list-of-lists.md b/list of lists.md similarity index 100% rename from list-of-lists.md rename to list of lists.md diff --git a/lists-of-lists-of-lists.md b/lists of lists of lists.md similarity index 100% rename from lists-of-lists-of-lists.md rename to lists of lists of lists.md diff --git a/lists-of-lists.md b/lists of lists.md similarity index 100% rename from lists-of-lists.md rename to lists of lists.md diff --git a/live-redesign.md b/live redesign.md similarity index 100% rename from live-redesign.md rename to live redesign.md diff --git a/live-tooting.md b/live tooting.md similarity index 100% rename from live-tooting.md rename to live tooting.md diff --git a/lobste-rs.md b/lobste rs.md similarity index 100% rename from lobste-rs.md rename to lobste rs.md diff --git a/lonesome-no-more.md b/lonesome no more.md similarity index 100% rename from lonesome-no-more.md rename to lonesome no more.md diff --git a/lord-enki.md b/lord enki.md similarity index 100% rename from lord-enki.md rename to lord enki.md diff --git a/los-oficios-terrestres.md b/los oficios terrestres.md similarity index 100% rename from los-oficios-terrestres.md rename to los oficios terrestres.md diff --git a/los-olimareños.md b/los olimareños.md similarity index 100% rename from los-olimareños.md rename to los olimareños.md diff --git a/lost-and-found.md b/lost and found.md similarity index 100% rename from lost-and-found.md rename to lost and found.md diff --git a/love-will-tear-us-apart.md b/love will tear us apart.md similarity index 100% rename from love-will-tear-us-apart.md rename to love will tear us apart.md diff --git a/lower-back-pain.md b/lower back pain.md similarity index 100% rename from lower-back-pain.md rename to lower back pain.md diff --git a/loyd-blankenship.md b/loyd blankenship.md similarity index 100% rename from loyd-blankenship.md rename to loyd blankenship.md diff --git a/luca-landucci.md b/luca landucci.md similarity index 100% rename from luca-landucci.md rename to luca landucci.md diff --git a/lucid-innocence.md b/lucid innocence.md similarity index 100% rename from lucid-innocence.md rename to lucid innocence.md diff --git a/luxury-space-communism.md b/luxury space communism.md similarity index 100% rename from luxury-space-communism.md rename to luxury space communism.md diff --git a/lyn-hejinian.md b/lyn hejinian.md similarity index 100% rename from lyn-hejinian.md rename to lyn hejinian.md diff --git a/m-prime.md b/m prime.md similarity index 100% rename from m-prime.md rename to m prime.md diff --git a/m.-b..md b/m. b..md similarity index 100% rename from m.-b..md rename to m. b..md diff --git a/macedonio-fernandez.md b/macedonio fernandez.md similarity index 100% rename from macedonio-fernandez.md rename to macedonio fernandez.md diff --git a/macedonio-fernández.md b/macedonio fernández.md similarity index 100% rename from macedonio-fernández.md rename to macedonio fernández.md diff --git a/madness-rack-and-honey.md b/madness rack and honey.md similarity index 100% rename from madness-rack-and-honey.md rename to madness rack and honey.md diff --git a/maintain-my-body.md b/maintain my body.md similarity index 100% rename from maintain-my-body.md rename to maintain my body.md diff --git a/make-up-links-that-dont-exist-yet.md b/make up links that dont exist yet.md similarity index 100% rename from make-up-links-that-dont-exist-yet.md rename to make up links that dont exist yet.md diff --git a/malcolm-x.md b/malcolm x.md similarity index 100% rename from malcolm-x.md rename to malcolm x.md diff --git a/mangled-in-transit.md b/mangled in transit.md similarity index 100% rename from mangled-in-transit.md rename to mangled in transit.md diff --git a/manipulation-of-democracy.md b/manipulation of democracy.md similarity index 100% rename from manipulation-of-democracy.md rename to manipulation of democracy.md diff --git a/mapping-the-fediverse.md b/mapping the fediverse.md similarity index 100% rename from mapping-the-fediverse.md rename to mapping the fediverse.md diff --git a/marcelo-tinelli.md b/marcelo tinelli.md similarity index 100% rename from marcelo-tinelli.md rename to marcelo tinelli.md diff --git a/margaret-warren.md b/margaret warren.md similarity index 100% rename from margaret-warren.md rename to margaret warren.md diff --git a/marina-garcés.md b/marina garcés.md similarity index 100% rename from marina-garcés.md rename to marina garcés.md diff --git a/markdown-links.md b/markdown links.md similarity index 100% rename from markdown-links.md rename to markdown links.md diff --git a/markdown-on-git.md b/markdown on git.md similarity index 100% rename from markdown-on-git.md rename to markdown on git.md diff --git a/markov-blankets.md b/markov blankets.md similarity index 100% rename from markov-blankets.md rename to markov blankets.md diff --git a/marroni-cake.md b/marroni cake.md similarity index 100% rename from marroni-cake.md rename to marroni cake.md diff --git a/martin-gardner.md b/martin gardner.md similarity index 100% rename from martin-gardner.md rename to martin gardner.md diff --git a/martin-luther-king.md b/martin luther king.md similarity index 100% rename from martin-luther-king.md rename to martin luther king.md diff --git a/marxist-thinkers.md b/marxist thinkers.md similarity index 100% rename from marxist-thinkers.md rename to marxist thinkers.md diff --git a/mary-lattimore.md b/mary lattimore.md similarity index 100% rename from mary-lattimore.md rename to mary lattimore.md diff --git a/masa-de-tarta.md b/masa de tarta.md similarity index 100% rename from masa-de-tarta.md rename to masa de tarta.md diff --git a/mastodon-bot.md b/mastodon bot.md similarity index 100% rename from mastodon-bot.md rename to mastodon bot.md diff --git a/mastodon-clients.md b/mastodon clients.md similarity index 100% rename from mastodon-clients.md rename to mastodon clients.md diff --git a/mastodon-instance.md b/mastodon instance.md similarity index 100% rename from mastodon-instance.md rename to mastodon instance.md diff --git a/mastodon-instances.md b/mastodon instances.md similarity index 100% rename from mastodon-instances.md rename to mastodon instances.md diff --git a/mathematical-logic.md b/mathematical logic.md similarity index 100% rename from mathematical-logic.md rename to mathematical logic.md diff --git a/mathematical-universe.md b/mathematical universe.md similarity index 100% rename from mathematical-universe.md rename to mathematical universe.md diff --git a/mathew-lowry.md b/mathew lowry.md similarity index 100% rename from mathew-lowry.md rename to mathew lowry.md diff --git a/matrix-agora.md b/matrix agora.md similarity index 100% rename from matrix-agora.md rename to matrix agora.md diff --git a/matrix-bot.md b/matrix bot.md similarity index 100% rename from matrix-bot.md rename to matrix bot.md diff --git a/max-stauffer.md b/max stauffer.md similarity index 100% rename from max-stauffer.md rename to max stauffer.md diff --git a/maximally-inclusive.md b/maximally inclusive.md similarity index 100% rename from maximally-inclusive.md rename to maximally inclusive.md diff --git a/mechanical-monk.md b/mechanical monk.md similarity index 100% rename from mechanical-monk.md rename to mechanical monk.md diff --git a/meditations-on-moloch.md b/meditations on moloch.md similarity index 100% rename from meditations-on-moloch.md rename to meditations on moloch.md diff --git a/meet-coop.md b/meet coop.md similarity index 100% rename from meet-coop.md rename to meet coop.md diff --git a/mehr-als-wohnen.md b/mehr als wohnen.md similarity index 100% rename from mehr-als-wohnen.md rename to mehr als wohnen.md diff --git a/meme-traditions.md b/meme traditions.md similarity index 100% rename from meme-traditions.md rename to meme traditions.md diff --git a/memories-of-green.md b/memories of green.md similarity index 100% rename from memories-of-green.md rename to memories of green.md diff --git a/mental-nodes.md b/mental nodes.md similarity index 100% rename from mental-nodes.md rename to mental nodes.md diff --git a/mental-state.md b/mental state.md similarity index 100% rename from mental-state.md rename to mental state.md diff --git a/mercury-fountain.md b/mercury fountain.md similarity index 100% rename from mercury-fountain.md rename to mercury fountain.md diff --git a/metamagical-themas.md b/metamagical themas.md similarity index 100% rename from metamagical-themas.md rename to metamagical themas.md diff --git a/metasj-flancian.md b/metasj flancian.md similarity index 100% rename from metasj-flancian.md rename to metasj flancian.md diff --git a/method-of-loci.md b/method of loci.md similarity index 100% rename from method-of-loci.md rename to method of loci.md diff --git a/michael-aird.md b/michael aird.md similarity index 100% rename from michael-aird.md rename to michael aird.md diff --git a/michael-graham.md b/michael graham.md similarity index 100% rename from michael-graham.md rename to michael graham.md diff --git a/michael-ocean.md b/michael ocean.md similarity index 100% rename from michael-ocean.md rename to michael ocean.md diff --git a/michael-taft.md b/michael taft.md similarity index 100% rename from michael-taft.md rename to michael taft.md diff --git a/michel-de-montaigne.md b/michel de montaigne.md similarity index 100% rename from michel-de-montaigne.md rename to michel de montaigne.md diff --git a/michel-foucault.md b/michel foucault.md similarity index 100% rename from michel-foucault.md rename to michel foucault.md diff --git a/micro-pub.md b/micro pub.md similarity index 100% rename from micro-pub.md rename to micro pub.md diff --git a/mid-career-greatest-hits.md b/mid career greatest hits.md similarity index 100% rename from mid-career-greatest-hits.md rename to mid career greatest hits.md diff --git a/middle-way.md b/middle way.md similarity index 100% rename from middle-way.md rename to middle way.md diff --git a/midnight-in-a-perfect-world.md b/midnight in a perfect world.md similarity index 100% rename from midnight-in-a-perfect-world.md rename to midnight in a perfect world.md diff --git a/miguel-marcos-martinez.md b/miguel marcos martinez.md similarity index 100% rename from miguel-marcos-martinez.md rename to miguel marcos martinez.md diff --git a/mihaly-csikszentmihalyi.md b/mihaly csikszentmihalyi.md similarity index 100% rename from mihaly-csikszentmihalyi.md rename to mihaly csikszentmihalyi.md diff --git a/mike-elias.md b/mike elias.md similarity index 100% rename from mike-elias.md rename to mike elias.md diff --git a/mind-merge.md b/mind merge.md similarity index 100% rename from mind-merge.md rename to mind merge.md diff --git a/mind-over-chatter.md b/mind over chatter.md similarity index 100% rename from mind-over-chatter.md rename to mind over chatter.md diff --git a/mind-palace.md b/mind palace.md similarity index 100% rename from mind-palace.md rename to mind palace.md diff --git a/mind-uploading-and-the-revolution.md b/mind uploading and the revolution.md similarity index 100% rename from mind-uploading-and-the-revolution.md rename to mind uploading and the revolution.md diff --git a/missing-devices.md b/missing devices.md similarity index 100% rename from missing-devices.md rename to missing devices.md diff --git a/missing-semester.md b/missing semester.md similarity index 100% rename from missing-semester.md rename to missing semester.md diff --git a/ml5-js.md b/ml5 js.md similarity index 100% rename from ml5-js.md rename to ml5 js.md diff --git a/moa-party.md b/moa party.md similarity index 100% rename from moa-party.md rename to moa party.md diff --git a/moa-polls.md b/moa polls.md similarity index 100% rename from moa-polls.md rename to moa polls.md diff --git a/mob-mentality.md b/mob mentality.md similarity index 100% rename from mob-mentality.md rename to mob mentality.md diff --git a/model-of-the-world.md b/model of the world.md similarity index 100% rename from model-of-the-world.md rename to model of the world.md diff --git a/molchat-doma.md b/molchat doma.md similarity index 100% rename from molchat-doma.md rename to molchat doma.md diff --git a/molly-mielke.md b/molly mielke.md similarity index 100% rename from molly-mielke.md rename to molly mielke.md diff --git a/money-free-world.md b/money free world.md similarity index 100% rename from money-free-world.md rename to money free world.md diff --git a/moon-ribas.md b/moon ribas.md similarity index 100% rename from moon-ribas.md rename to moon ribas.md diff --git a/moral-principles.md b/moral principles.md similarity index 100% rename from moral-principles.md rename to moral principles.md diff --git a/mort-garson.md b/mort garson.md similarity index 100% rename from mort-garson.md rename to mort garson.md diff --git a/mr-random.md b/mr random.md similarity index 100% rename from mr-random.md rename to mr random.md diff --git a/muhammad-ﷺ.md b/muhammad ﷺ.md similarity index 100% rename from muhammad-ﷺ.md rename to muhammad ﷺ.md diff --git a/multiplayer-roam.md b/multiplayer roam.md similarity index 100% rename from multiplayer-roam.md rename to multiplayer roam.md diff --git a/muscle-wiki.md b/muscle wiki.md similarity index 100% rename from muscle-wiki.md rename to muscle wiki.md diff --git a/musgum-huts.md b/musgum huts.md similarity index 100% rename from musgum-huts.md rename to musgum huts.md diff --git a/music-for-plants.md b/music for plants.md similarity index 100% rename from music-for-plants.md rename to music for plants.md diff --git a/my-favourite-things.md b/my favourite things.md similarity index 100% rename from my-favourite-things.md rename to my favourite things.md diff --git a/my-goal-in-life.md b/my goal in life.md similarity index 100% rename from my-goal-in-life.md rename to my goal in life.md diff --git a/mycroft-ai.md b/mycroft ai.md similarity index 100% rename from mycroft-ai.md rename to mycroft ai.md diff --git a/nadia-eghbal.md b/nadia eghbal.md similarity index 100% rename from nadia-eghbal.md rename to nadia eghbal.md diff --git a/name-place-animal-thing.md b/name place animal thing.md similarity index 100% rename from name-place-animal-thing.md rename to name place animal thing.md diff --git a/nano-page.md b/nano page.md similarity index 100% rename from nano-page.md rename to nano page.md diff --git a/nathan-schneider.md b/nathan schneider.md similarity index 100% rename from nathan-schneider.md rename to nathan schneider.md diff --git a/neal-stephenson.md b/neal stephenson.md similarity index 100% rename from neal-stephenson.md rename to neal stephenson.md diff --git a/necklace-of-community-projects.md b/necklace of community projects.md similarity index 100% rename from necklace-of-community-projects.md rename to necklace of community projects.md diff --git a/neil-harbisson.md b/neil harbisson.md similarity index 100% rename from neil-harbisson.md rename to neil harbisson.md diff --git a/nerds-of-the-world-unite.md b/nerds of the world unite.md similarity index 100% rename from nerds-of-the-world-unite.md rename to nerds of the world unite.md diff --git a/ness-labs.md b/ness labs.md similarity index 100% rename from ness-labs.md rename to ness labs.md diff --git a/nestor-makhno.md b/nestor makhno.md similarity index 100% rename from nestor-makhno.md rename to nestor makhno.md diff --git a/nettie-lagace.md b/nettie lagace.md similarity index 100% rename from nettie-lagace.md rename to nettie lagace.md diff --git a/network-science.md b/network science.md similarity index 100% rename from network-science.md rename to network science.md diff --git a/never-known.md b/never known.md similarity index 100% rename from never-known.md rename to never known.md diff --git a/never-wrote.md b/never wrote.md similarity index 100% rename from never-wrote.md rename to never wrote.md diff --git a/new-games.md b/new games.md similarity index 100% rename from new-games.md rename to new games.md diff --git a/new-music.md b/new music.md similarity index 100% rename from new-music.md rename to new music.md diff --git a/newcomblike-problems.md b/newcomblike problems.md similarity index 100% rename from newcomblike-problems.md rename to newcomblike problems.md diff --git a/next-action.md b/next action.md similarity index 100% rename from next-action.md rename to next action.md diff --git a/nft-storage.md b/nft storage.md similarity index 100% rename from nft-storage.md rename to nft storage.md diff --git a/nick-bostrom.md b/nick bostrom.md similarity index 100% rename from nick-bostrom.md rename to nick bostrom.md diff --git a/nick-cammarata.md b/nick cammarata.md similarity index 100% rename from nick-cammarata.md rename to nick cammarata.md diff --git a/nick-szabo.md b/nick szabo.md similarity index 100% rename from nick-szabo.md rename to nick szabo.md diff --git a/nick-vujicic.md b/nick vujicic.md similarity index 100% rename from nick-vujicic.md rename to nick vujicic.md diff --git a/nikolai-kingsley.md b/nikolai kingsley.md similarity index 100% rename from nikolai-kingsley.md rename to nikolai kingsley.md diff --git a/no-yoga-robots.md b/no yoga robots.md similarity index 100% rename from no-yoga-robots.md rename to no yoga robots.md diff --git a/nobu-hibiki.md b/nobu hibiki.md similarity index 100% rename from nobu-hibiki.md rename to nobu hibiki.md diff --git a/noche-de-los-bastones-largos.md b/noche de los bastones largos.md similarity index 100% rename from noche-de-los-bastones-largos.md rename to noche de los bastones largos.md diff --git a/node-js.md b/node js.md similarity index 100% rename from node-js.md rename to node js.md diff --git a/node-outlines.md b/node outlines.md similarity index 100% rename from node-outlines.md rename to node outlines.md diff --git a/node-permutations.md b/node permutations.md similarity index 100% rename from node-permutations.md rename to node permutations.md diff --git a/nodes-outlines.md b/nodes outlines.md similarity index 100% rename from nodes-outlines.md rename to nodes outlines.md diff --git a/noise-colors.md b/noise colors.md similarity index 100% rename from noise-colors.md rename to noise colors.md diff --git a/non-profit.md b/non profit.md similarity index 100% rename from non-profit.md rename to non profit.md diff --git a/not-organized-hierarchically.md b/not organized hierarchically.md similarity index 100% rename from not-organized-hierarchically.md rename to not organized hierarchically.md diff --git a/notes-on-the-synthesis-of-form.md b/notes on the synthesis of form.md similarity index 100% rename from notes-on-the-synthesis-of-form.md rename to notes on the synthesis of form.md diff --git a/nunca-me-faltes.md b/nunca me faltes.md similarity index 100% rename from nunca-me-faltes.md rename to nunca me faltes.md diff --git a/object-of-design.md b/object of design.md similarity index 100% rename from object-of-design.md rename to object of design.md diff --git a/ocarina-of-time.md b/ocarina of time.md similarity index 100% rename from ocarina-of-time.md rename to ocarina of time.md diff --git a/offline-twitter.md b/offline twitter.md similarity index 100% rename from offline-twitter.md rename to offline twitter.md diff --git a/olga-babeeva.md b/olga babeeva.md similarity index 100% rename from olga-babeeva.md rename to olga babeeva.md diff --git a/oliver-sauter.md b/oliver sauter.md similarity index 100% rename from oliver-sauter.md rename to oliver sauter.md diff --git a/omar-rizwan.md b/omar rizwan.md similarity index 100% rename from omar-rizwan.md rename to omar rizwan.md diff --git a/on-building-bridges.md b/on building bridges.md similarity index 100% rename from on-building-bridges.md rename to on building bridges.md diff --git a/on-cringe.md b/on cringe.md similarity index 100% rename from on-cringe.md rename to on cringe.md diff --git a/on-tyranny.md b/on tyranny.md similarity index 100% rename from on-tyranny.md rename to on tyranny.md diff --git a/onboarding-to-the-agora.md b/onboarding to the agora.md similarity index 100% rename from onboarding-to-the-agora.md rename to onboarding to the agora.md diff --git a/only-flans.md b/only flans.md similarity index 100% rename from only-flans.md rename to only flans.md diff --git a/open-borders.md b/open borders.md similarity index 100% rename from open-borders.md rename to open borders.md diff --git a/open-collective.md b/open collective.md similarity index 100% rename from open-collective.md rename to open collective.md diff --git a/open-ethics.md b/open ethics.md similarity index 100% rename from open-ethics.md rename to open ethics.md diff --git a/open-graph-protocol.md b/open graph protocol.md similarity index 100% rename from open-graph-protocol.md rename to open graph protocol.md diff --git a/open-graph.md b/open graph.md similarity index 100% rename from open-graph.md rename to open graph.md diff --git a/open-home.md b/open home.md similarity index 100% rename from open-home.md rename to open home.md diff --git a/open-letter-to-foam.md b/open letter to foam.md similarity index 100% rename from open-letter-to-foam.md rename to open letter to foam.md diff --git a/open-nation.md b/open nation.md similarity index 100% rename from open-nation.md rename to open nation.md diff --git a/open-protocols.md b/open protocols.md similarity index 100% rename from open-protocols.md rename to open protocols.md diff --git a/open-search.md b/open search.md similarity index 100% rename from open-search.md rename to open search.md diff --git a/open-source-monitoring.md b/open source monitoring.md similarity index 100% rename from open-source-monitoring.md rename to open source monitoring.md diff --git a/open-source.md b/open source.md similarity index 100% rename from open-source.md rename to open source.md diff --git a/open-street-map.md b/open street map.md similarity index 100% rename from open-street-map.md rename to open street map.md diff --git a/open-syllabus.md b/open syllabus.md similarity index 100% rename from open-syllabus.md rename to open syllabus.md diff --git a/operation-unified-assistance.md b/operation unified assistance.md similarity index 100% rename from operation-unified-assistance.md rename to operation unified assistance.md diff --git a/opus-populi.md b/opus populi.md similarity index 100% rename from opus-populi.md rename to opus populi.md diff --git a/orbit-db.md b/orbit db.md similarity index 100% rename from orbit-db.md rename to orbit db.md diff --git a/orejas-de-terciopelo.md b/orejas de terciopelo.md similarity index 100% rename from orejas-de-terciopelo.md rename to orejas de terciopelo.md diff --git a/org-mode.md b/org mode.md similarity index 100% rename from org-mode.md rename to org mode.md diff --git a/org-roam.md b/org roam.md similarity index 100% rename from org-roam.md rename to org roam.md diff --git a/origin-story.md b/origin story.md similarity index 100% rename from origin-story.md rename to origin story.md diff --git a/orphan-machine.md b/orphan machine.md similarity index 100% rename from orphan-machine.md rename to orphan machine.md diff --git a/orthodox-jews-that-wear-80s-clothing.md b/orthodox jews that wear 80s clothing.md similarity index 100% rename from orthodox-jews-that-wear-80s-clothing.md rename to orthodox jews that wear 80s clothing.md diff --git a/other-agoras.md b/other agoras.md similarity index 100% rename from other-agoras.md rename to other agoras.md diff --git a/our-flancia.md b/our flancia.md similarity index 100% rename from our-flancia.md rename to our flancia.md diff --git a/out-of-memory.md b/out of memory.md similarity index 100% rename from out-of-memory.md rename to out of memory.md diff --git a/outgroup-homogeneity-effect.md b/outgroup homogeneity effect.md similarity index 100% rename from outgroup-homogeneity-effect.md rename to outgroup homogeneity effect.md diff --git a/p-and-h.md b/p and h.md similarity index 100% rename from p-and-h.md rename to p and h.md diff --git a/p-c.md b/p c.md similarity index 100% rename from p-c.md rename to p c.md diff --git a/pandemic-game.md b/pandemic game.md similarity index 100% rename from pandemic-game.md rename to pandemic game.md diff --git a/paradoja-de-la-tolerancia.md b/paradoja de la tolerancia.md similarity index 100% rename from paradoja-de-la-tolerancia.md rename to paradoja de la tolerancia.md diff --git a/paradox-of-tolerance.md b/paradox of tolerance.md similarity index 100% rename from paradox-of-tolerance.md rename to paradox of tolerance.md diff --git a/parasite-alchemy.md b/parasite alchemy.md similarity index 100% rename from parasite-alchemy.md rename to parasite alchemy.md diff --git a/pareto-efficiency.md b/pareto efficiency.md similarity index 100% rename from pareto-efficiency.md rename to pareto efficiency.md diff --git a/part-of-the-reason-thinking.md b/part of the reason thinking.md similarity index 100% rename from part-of-the-reason-thinking.md rename to part of the reason thinking.md diff --git a/part-of-the-reason.md b/part of the reason.md similarity index 100% rename from part-of-the-reason.md rename to part of the reason.md diff --git a/pasta-frola.md b/pasta frola.md similarity index 100% rename from pasta-frola.md rename to pasta frola.md diff --git a/patterning-reading-group.md b/patterning reading group.md similarity index 100% rename from patterning-reading-group.md rename to patterning reading group.md diff --git a/paul-frazee.md b/paul frazee.md similarity index 100% rename from paul-frazee.md rename to paul frazee.md diff --git a/pdb-post-morte.md b/pdb post morte.md similarity index 100% rename from pdb-post-morte.md rename to pdb post morte.md diff --git a/pdb-postmortem.md b/pdb postmortem.md similarity index 100% rename from pdb-postmortem.md rename to pdb postmortem.md diff --git a/peace-piece.md b/peace piece.md similarity index 100% rename from peace-piece.md rename to peace piece.md diff --git a/pearson-correlation-coefficient.md b/pearson correlation coefficient.md similarity index 100% rename from pearson-correlation-coefficient.md rename to pearson correlation coefficient.md diff --git a/pee-zombie.md b/pee zombie.md similarity index 100% rename from pee-zombie.md rename to pee zombie.md diff --git a/pen-coded.md b/pen coded.md similarity index 100% rename from pen-coded.md rename to pen coded.md diff --git a/per-aspera-ad-astra.md b/per aspera ad astra.md similarity index 100% rename from per-aspera-ad-astra.md rename to per aspera ad astra.md diff --git a/pernambuco-e-seu-conjunto.md b/pernambuco e seu conjunto.md similarity index 100% rename from pernambuco-e-seu-conjunto.md rename to pernambuco e seu conjunto.md diff --git a/persistent-non-symbolic-experiences.md b/persistent non symbolic experiences.md similarity index 100% rename from persistent-non-symbolic-experiences.md rename to persistent non symbolic experiences.md diff --git a/person-from-porlock.md b/person from porlock.md similarity index 100% rename from person-from-porlock.md rename to person from porlock.md diff --git a/personal-dynamic-media.md b/personal dynamic media.md similarity index 100% rename from personal-dynamic-media.md rename to personal dynamic media.md diff --git a/personal-knowledge-graph.md b/personal knowledge graph.md similarity index 100% rename from personal-knowledge-graph.md rename to personal knowledge graph.md diff --git a/personal-knowledge-management.md b/personal knowledge management.md similarity index 100% rename from personal-knowledge-management.md rename to personal knowledge management.md diff --git a/personal-knowledge-managment.md b/personal knowledge managment.md similarity index 100% rename from personal-knowledge-managment.md rename to personal knowledge managment.md diff --git a/peter-limberg.md b/peter limberg.md similarity index 100% rename from peter-limberg.md rename to peter limberg.md diff --git a/peter-singer.md b/peter singer.md similarity index 100% rename from peter-singer.md rename to peter singer.md diff --git a/peter-thiel.md b/peter thiel.md similarity index 100% rename from peter-thiel.md rename to peter thiel.md diff --git a/peterson-žižek-debate.md b/peterson žižek debate.md similarity index 100% rename from peterson-žižek-debate.md rename to peterson žižek debate.md diff --git a/petter-johansson.md b/petter johansson.md similarity index 100% rename from petter-johansson.md rename to petter johansson.md diff --git a/philip-k-dick.md b/philip k dick.md similarity index 100% rename from philip-k-dick.md rename to philip k dick.md diff --git a/philosopher-life.md b/philosopher life.md similarity index 100% rename from philosopher-life.md rename to philosopher life.md diff --git a/philosophy-on-alerting.md b/philosophy on alerting.md similarity index 100% rename from philosophy-on-alerting.md rename to philosophy on alerting.md diff --git a/piero-della-francesca.md b/piero della francesca.md similarity index 100% rename from piero-della-francesca.md rename to piero della francesca.md diff --git a/pinafore-shortcuts.md b/pinafore shortcuts.md similarity index 100% rename from pinafore-shortcuts.md rename to pinafore shortcuts.md diff --git a/place-subreddit.md b/place subreddit.md similarity index 100% rename from place-subreddit.md rename to place subreddit.md diff --git a/places for the soul.md b/places for the soul.md index e69de29bb..41df83fcf 100644 --- a/places for the soul.md +++ b/places for the soul.md @@ -0,0 +1,22 @@ +# places for the soul + +- a [[documentary]] + - about [[christopher alexander]] + - [[go]] https://vimeo.com/ondemand/placesforthesoul + - "life can't be produced from a drawing -- it can only be produced through a process" + - the [[tokyo school]] was designed with "full participation from teachers and students". the person who drove the project (high school principal) found him through [[the oregon experiment]]. + - [[homeless shelter]] + - [[san jose]] + - [[housing for independent people]] + - small windows + - [[trusses]] were a contentious point + - very complex + - introduced delays, which resulted in the shelter not being ready for winter + - [[wholeness]] is the name of the quality here -- is it the same as the [[nameless quality]] in [[the timeless way of building]]? + - (some people aren't driven by) "an all consuming desire to produce wholeness" + - [[dead zones]] + - "people over there look like they're in [[alphaville]]" + - "absolute intent to destroy emotion" + - [[aside]] + - I wonder if alexander liked the voiceover, it sounds a bit robotic to me + - I would totally go on a walking tour with [[christopher alexander]] diff --git a/places-for-the-soul.md b/places-for-the-soul.md deleted file mode 100644 index 41df83fcf..000000000 --- a/places-for-the-soul.md +++ /dev/null @@ -1,22 +0,0 @@ -# places for the soul - -- a [[documentary]] - - about [[christopher alexander]] - - [[go]] https://vimeo.com/ondemand/placesforthesoul - - "life can't be produced from a drawing -- it can only be produced through a process" - - the [[tokyo school]] was designed with "full participation from teachers and students". the person who drove the project (high school principal) found him through [[the oregon experiment]]. - - [[homeless shelter]] - - [[san jose]] - - [[housing for independent people]] - - small windows - - [[trusses]] were a contentious point - - very complex - - introduced delays, which resulted in the shelter not being ready for winter - - [[wholeness]] is the name of the quality here -- is it the same as the [[nameless quality]] in [[the timeless way of building]]? - - (some people aren't driven by) "an all consuming desire to produce wholeness" - - [[dead zones]] - - "people over there look like they're in [[alphaville]]" - - "absolute intent to destroy emotion" - - [[aside]] - - I wonder if alexander liked the voiceover, it sounds a bit robotic to me - - I would totally go on a walking tour with [[christopher alexander]] diff --git a/plan-9.md b/plan 9.md similarity index 100% rename from plan-9.md rename to plan 9.md diff --git a/planet-hof.md b/planet hof.md similarity index 100% rename from planet-hof.md rename to planet hof.md diff --git a/planet-hopf.md b/planet hopf.md similarity index 100% rename from planet-hopf.md rename to planet hopf.md diff --git a/planned-action.md b/planned action.md similarity index 100% rename from planned-action.md rename to planned action.md diff --git a/planned-actions.md b/planned actions.md similarity index 100% rename from planned-actions.md rename to planned actions.md diff --git a/platonic-ideal.md b/platonic ideal.md similarity index 100% rename from platonic-ideal.md rename to platonic ideal.md diff --git a/platonic-intent.md b/platonic intent.md similarity index 100% rename from platonic-intent.md rename to platonic intent.md diff --git a/platos-dialogues.md b/platos dialogues.md similarity index 100% rename from platos-dialogues.md rename to platos dialogues.md diff --git a/poema-de-la-infancia-de-alguien.md b/poema de la infancia de alguien.md similarity index 100% rename from poema-de-la-infancia-de-alguien.md rename to poema de la infancia de alguien.md diff --git a/pokemon-mode.md b/pokemon mode.md similarity index 100% rename from pokemon-mode.md rename to pokemon mode.md diff --git a/pomodoro-technique.md b/pomodoro technique.md similarity index 100% rename from pomodoro-technique.md rename to pomodoro technique.md diff --git a/post-racial.md b/post racial.md similarity index 100% rename from post-racial.md rename to post racial.md diff --git a/post-scarcity.md b/post scarcity.md similarity index 100% rename from post-scarcity.md rename to post scarcity.md diff --git a/postponing-revolution.md b/postponing revolution.md similarity index 100% rename from postponing-revolution.md rename to postponing revolution.md diff --git a/pottery-simulator.md b/pottery simulator.md similarity index 100% rename from pottery-simulator.md rename to pottery simulator.md diff --git a/predictable-identities.md b/predictable identities.md similarity index 100% rename from predictable-identities.md rename to predictable identities.md diff --git a/prediction-framework.md b/prediction framework.md similarity index 100% rename from prediction-framework.md rename to prediction framework.md diff --git a/predictions-as-a-substitute-for-reviews.md b/predictions as a substitute for reviews.md similarity index 100% rename from predictions-as-a-substitute-for-reviews.md rename to predictions as a substitute for reviews.md diff --git a/principal-agent-problem.md b/principal agent problem.md similarity index 100% rename from principal-agent-problem.md rename to principal agent problem.md diff --git a/principle-of-charity.md b/principle of charity.md similarity index 100% rename from principle-of-charity.md rename to principle of charity.md diff --git a/prinssi-taivaanlintu.md b/prinssi taivaanlintu.md similarity index 100% rename from prinssi-taivaanlintu.md rename to prinssi taivaanlintu.md diff --git a/prisión-perpetua.md b/prisión perpetua.md similarity index 100% rename from prisión-perpetua.md rename to prisión perpetua.md diff --git a/problem-of-universals.md b/problem of universals.md similarity index 100% rename from problem-of-universals.md rename to problem of universals.md diff --git a/problem-solving.md b/problem solving.md similarity index 100% rename from problem-solving.md rename to problem solving.md diff --git a/procrastination-diary.md b/procrastination diary.md similarity index 100% rename from procrastination-diary.md rename to procrastination diary.md diff --git a/progressive-international.md b/progressive international.md similarity index 100% rename from progressive-international.md rename to progressive international.md diff --git a/project-gemini.md b/project gemini.md similarity index 100% rename from project-gemini.md rename to project gemini.md diff --git a/promnesia-agora.md b/promnesia agora.md similarity index 100% rename from promnesia-agora.md rename to promnesia agora.md diff --git a/promnesia-config.md b/promnesia config.md similarity index 100% rename from promnesia-config.md rename to promnesia config.md diff --git a/promnesia-example-config.md b/promnesia example config.md similarity index 100% rename from promnesia-example-config.md rename to promnesia example config.md diff --git a/promnesia-howto.md b/promnesia howto.md similarity index 100% rename from promnesia-howto.md rename to promnesia howto.md diff --git a/promnesia-sources.md b/promnesia sources.md similarity index 100% rename from promnesia-sources.md rename to promnesia sources.md diff --git a/proof-game.md b/proof game.md similarity index 100% rename from proof-game.md rename to proof game.md diff --git a/proper-subset.md b/proper subset.md similarity index 100% rename from proper-subset.md rename to proper subset.md diff --git a/proposition-joe.md b/proposition joe.md similarity index 100% rename from proposition-joe.md rename to proposition joe.md diff --git a/prosperity-license.md b/prosperity license.md similarity index 100% rename from prosperity-license.md rename to prosperity license.md diff --git a/prosperity-public-license.md b/prosperity public license.md similarity index 100% rename from prosperity-public-license.md rename to prosperity public license.md diff --git a/protocol-labs.md b/protocol labs.md similarity index 100% rename from protocol-labs.md rename to protocol labs.md diff --git a/protocols-not-platforms.md b/protocols not platforms.md similarity index 100% rename from protocols-not-platforms.md rename to protocols not platforms.md diff --git a/protopoi-org.md b/protopoi org.md similarity index 100% rename from protopoi-org.md rename to protopoi org.md diff --git a/protopoi-reading-club.md b/protopoi reading club.md similarity index 100% rename from protopoi-reading-club.md rename to protopoi reading club.md diff --git a/protopoi-space.md b/protopoi space.md similarity index 100% rename from protopoi-space.md rename to protopoi space.md diff --git a/proyecto-morcilla.md b/proyecto morcilla.md similarity index 100% rename from proyecto-morcilla.md rename to proyecto morcilla.md diff --git a/proyecto-nocilla.md b/proyecto nocilla.md similarity index 100% rename from proyecto-nocilla.md rename to proyecto nocilla.md diff --git a/public-key.md b/public key.md similarity index 100% rename from public-key.md rename to public key.md diff --git a/public-keys.md b/public keys.md similarity index 100% rename from public-keys.md rename to public keys.md diff --git a/public-utility.md b/public utility.md similarity index 100% rename from public-utility.md rename to public utility.md diff --git a/pull-and-push.md b/pull and push.md similarity index 100% rename from pull-and-push.md rename to pull and push.md diff --git a/pull-links.md b/pull links.md similarity index 100% rename from pull-links.md rename to pull links.md diff --git a/pulled-links.md b/pulled links.md similarity index 100% rename from pulled-links.md rename to pulled links.md diff --git a/pulled-nodes.md b/pulled nodes.md similarity index 100% rename from pulled-nodes.md rename to pulled nodes.md diff --git a/pumpkin-soup.md b/pumpkin soup.md similarity index 100% rename from pumpkin-soup.md rename to pumpkin soup.md diff --git a/push-an-existing-repository-to-a-new-remote.md b/push an existing repository to a new remote.md similarity index 100% rename from push-an-existing-repository-to-a-new-remote.md rename to push an existing repository to a new remote.md diff --git a/push-and-pull.md b/push and pull.md similarity index 100% rename from push-and-pull.md rename to push and pull.md diff --git a/push-down-automata.md b/push down automata.md similarity index 100% rename from push-down-automata.md rename to push down automata.md diff --git a/py-subnodes.md b/py subnodes.md similarity index 100% rename from py-subnodes.md rename to py subnodes.md diff --git a/python-type-annotations.md b/python type annotations.md similarity index 100% rename from python-type-annotations.md rename to python type annotations.md diff --git a/query-language.md b/query language.md similarity index 100% rename from query-language.md rename to query language.md diff --git a/quick-capture.md b/quick capture.md similarity index 100% rename from quick-capture.md rename to quick capture.md diff --git a/radical-candor.md b/radical candor.md similarity index 100% rename from radical-candor.md rename to radical candor.md diff --git a/rainbow-folding.md b/rainbow folding.md similarity index 100% rename from rainbow-folding.md rename to rainbow folding.md diff --git a/rainbow-williams.md b/rainbow williams.md similarity index 100% rename from rainbow-williams.md rename to rainbow williams.md diff --git a/rainer-maria-rilke.md b/rainer maria rilke.md similarity index 100% rename from rainer-maria-rilke.md rename to rainer maria rilke.md diff --git a/ralph-hodgson.md b/ralph hodgson.md similarity index 100% rename from ralph-hodgson.md rename to ralph hodgson.md diff --git a/ramon-alonso.md b/ramon alonso.md similarity index 100% rename from ramon-alonso.md rename to ramon alonso.md diff --git a/ranking-algorithm.md b/ranking algorithm.md similarity index 100% rename from ranking-algorithm.md rename to ranking algorithm.md diff --git a/raymond-williams.md b/raymond williams.md similarity index 100% rename from raymond-williams.md rename to raymond williams.md diff --git a/rdf-1-1-concepts-and-abstract-syntax.md b/rdf 1 1 concepts and abstract syntax.md similarity index 100% rename from rdf-1-1-concepts-and-abstract-syntax.md rename to rdf 1 1 concepts and abstract syntax.md diff --git a/rdf-1-1-primer.md b/rdf 1 1 primer.md similarity index 100% rename from rdf-1-1-primer.md rename to rdf 1 1 primer.md diff --git a/rdf-1-1-semantics.md b/rdf 1 1 semantics.md similarity index 100% rename from rdf-1-1-semantics.md rename to rdf 1 1 semantics.md diff --git a/rdf-1-1-test-cases.md b/rdf 1 1 test cases.md similarity index 100% rename from rdf-1-1-test-cases.md rename to rdf 1 1 test cases.md diff --git a/rdf-1-1-xml-syntax.md b/rdf 1 1 xml syntax.md similarity index 100% rename from rdf-1-1-xml-syntax.md rename to rdf 1 1 xml syntax.md diff --git a/rdf-grapher.md b/rdf grapher.md similarity index 100% rename from rdf-grapher.md rename to rdf grapher.md diff --git a/rdf-schema-1-1.md b/rdf schema 1 1.md similarity index 100% rename from rdf-schema-1-1.md rename to rdf schema 1 1.md diff --git a/rdf-serialization-format.md b/rdf serialization format.md similarity index 100% rename from rdf-serialization-format.md rename to rdf serialization format.md diff --git a/rdf-serialization-formats.md b/rdf serialization formats.md similarity index 100% rename from rdf-serialization-formats.md rename to rdf serialization formats.md diff --git a/reading-alexander.md b/reading alexander.md similarity index 100% rename from reading-alexander.md rename to reading alexander.md diff --git a/reading-club.md b/reading club.md similarity index 100% rename from reading-club.md rename to reading club.md diff --git a/reading-protopoi.md b/reading protopoi.md similarity index 100% rename from reading-protopoi.md rename to reading protopoi.md diff --git a/reading-vacation-june-2020.md b/reading vacation june 2020.md similarity index 100% rename from reading-vacation-june-2020.md rename to reading vacation june 2020.md diff --git a/real-co-op-stories.md b/real co op stories.md similarity index 100% rename from real-co-op-stories.md rename to real co op stories.md diff --git a/real-coop-stories.md b/real coop stories.md similarity index 100% rename from real-coop-stories.md rename to real coop stories.md diff --git a/reasonable-movement.md b/reasonable movement.md similarity index 100% rename from reasonable-movement.md rename to reasonable movement.md diff --git a/recipe-gate.md b/recipe gate.md similarity index 100% rename from recipe-gate.md rename to recipe gate.md diff --git a/red-oak.md b/red oak.md similarity index 100% rename from red-oak.md rename to red oak.md diff --git a/red-star.md b/red star.md similarity index 100% rename from red-star.md rename to red star.md diff --git a/regulatory-capture.md b/regulatory capture.md similarity index 100% rename from regulatory-capture.md rename to regulatory capture.md diff --git a/removing-google-as-a-spof.md b/removing google as a spof.md similarity index 100% rename from removing-google-as-a-spof.md rename to removing google as a spof.md diff --git a/rent-free.md b/rent free.md similarity index 100% rename from rent-free.md rename to rent free.md diff --git a/resources-to-learn-to-program.md b/resources to learn to program.md similarity index 100% rename from resources-to-learn-to-program.md rename to resources to learn to program.md diff --git a/restore-etherpad-revision.md b/restore etherpad revision.md similarity index 100% rename from restore-etherpad-revision.md rename to restore etherpad revision.md diff --git a/retro-social-network.md b/retro social network.md similarity index 100% rename from retro-social-network.md rename to retro social network.md diff --git a/ricardo-piglia.md b/ricardo piglia.md similarity index 100% rename from ricardo-piglia.md rename to ricardo piglia.md diff --git a/riccardo-ferreti.md b/riccardo ferreti.md similarity index 100% rename from riccardo-ferreti.md rename to riccardo ferreti.md diff --git a/riccardo-ferretti.md b/riccardo ferretti.md similarity index 100% rename from riccardo-ferretti.md rename to riccardo ferretti.md diff --git a/richard-dawkins.md b/richard dawkins.md similarity index 100% rename from richard-dawkins.md rename to richard dawkins.md diff --git a/richard-feynman.md b/richard feynman.md similarity index 100% rename from richard-feynman.md rename to richard feynman.md diff --git a/richard-stallman.md b/richard stallman.md similarity index 100% rename from richard-stallman.md rename to richard stallman.md diff --git a/right-livelihood.md b/right livelihood.md similarity index 100% rename from right-livelihood.md rename to right livelihood.md diff --git a/right-speech.md b/right speech.md similarity index 100% rename from right-speech.md rename to right speech.md diff --git a/ritmo-de-la-noche.md b/ritmo de la noche.md similarity index 100% rename from ritmo-de-la-noche.md rename to ritmo de la noche.md diff --git a/rival-voices.md b/rival voices.md similarity index 100% rename from rival-voices.md rename to rival voices.md diff --git a/rna-memory.md b/rna memory.md similarity index 100% rename from rna-memory.md rename to rna memory.md diff --git a/roam-backup.md b/roam backup.md similarity index 100% rename from roam-backup.md rename to roam backup.md diff --git a/roam-exporter.md b/roam exporter.md similarity index 100% rename from roam-exporter.md rename to roam exporter.md diff --git a/roam-go-links.md b/roam go links.md similarity index 100% rename from roam-go-links.md rename to roam go links.md diff --git a/roam-like.md b/roam like.md similarity index 100% rename from roam-like.md rename to roam like.md diff --git a/roam-likes.md b/roam likes.md similarity index 100% rename from roam-likes.md rename to roam likes.md diff --git a/roam-multiplayer.md b/roam multiplayer.md similarity index 100% rename from roam-multiplayer.md rename to roam multiplayer.md diff --git a/roam-research.md b/roam research.md similarity index 100% rename from roam-research.md rename to roam research.md diff --git a/roam-to-git.md b/roam to git.md similarity index 100% rename from roam-to-git.md rename to roam to git.md diff --git a/roaman-agora.md b/roaman agora.md similarity index 100% rename from roaman-agora.md rename to roaman agora.md diff --git a/rob-sanderson.md b/rob sanderson.md similarity index 100% rename from rob-sanderson.md rename to rob sanderson.md diff --git a/robbers-cave-study.md b/robbers cave study.md similarity index 100% rename from robbers-cave-study.md rename to robbers cave study.md diff --git a/robert-axelrod.md b/robert axelrod.md similarity index 100% rename from robert-axelrod.md rename to robert axelrod.md diff --git a/roberto-arlt.md b/roberto arlt.md similarity index 100% rename from roberto-arlt.md rename to roberto arlt.md diff --git a/robin-hanson.md b/robin hanson.md similarity index 100% rename from robin-hanson.md rename to robin hanson.md diff --git a/robofriend-as-socrates.md b/robofriend as socrates.md similarity index 100% rename from robofriend-as-socrates.md rename to robofriend as socrates.md diff --git a/robofriend-is-socrates.md b/robofriend is socrates.md similarity index 100% rename from robofriend-is-socrates.md rename to robofriend is socrates.md diff --git a/roborock-s6.md b/roborock s6.md similarity index 100% rename from roborock-s6.md rename to roborock s6.md diff --git a/rodolfo-ocampo.md b/rodolfo ocampo.md similarity index 100% rename from rodolfo-ocampo.md rename to rodolfo ocampo.md diff --git a/rodrigo-baraglia.md b/rodrigo baraglia.md similarity index 100% rename from rodrigo-baraglia.md rename to rodrigo baraglia.md diff --git a/rokos-basilisk.md b/rokos basilisk.md similarity index 100% rename from rokos-basilisk.md rename to rokos basilisk.md diff --git a/role-model.md b/role model.md similarity index 100% rename from role-model.md rename to role model.md diff --git a/role-models.md b/role models.md similarity index 100% rename from role-models.md rename to role models.md diff --git a/romanian-street-musicians.md b/romanian street musicians.md similarity index 100% rename from romanian-street-musicians.md rename to romanian street musicians.md diff --git a/romantic-period-poetry.md b/romantic period poetry.md similarity index 100% rename from romantic-period-poetry.md rename to romantic period poetry.md diff --git a/romina-wainberg.md b/romina wainberg.md similarity index 100% rename from romina-wainberg.md rename to romina wainberg.md diff --git a/root-nodes.md b/root nodes.md similarity index 100% rename from root-nodes.md rename to root nodes.md diff --git a/ross-perot.md b/ross perot.md similarity index 100% rename from ross-perot.md rename to ross perot.md diff --git a/ruben-verborgh.md b/ruben verborgh.md similarity index 100% rename from ruben-verborgh.md rename to ruben verborgh.md diff --git a/run-run-run.md b/run run run.md similarity index 100% rename from run-run-run.md rename to run run run.md diff --git a/russell-conjugations.md b/russell conjugations.md similarity index 100% rename from russell-conjugations.md rename to russell conjugations.md diff --git a/rutger-bregman.md b/rutger bregman.md similarity index 100% rename from rutger-bregman.md rename to rutger bregman.md diff --git a/ruth-catlow.md b/ruth catlow.md similarity index 100% rename from ruth-catlow.md rename to ruth catlow.md diff --git a/ryo-fukui.md b/ryo fukui.md similarity index 100% rename from ryo-fukui.md rename to ryo fukui.md diff --git a/s-y.md b/s y.md similarity index 100% rename from s-y.md rename to s y.md diff --git a/s.-s..md b/s. s..md similarity index 100% rename from s.-s..md rename to s. s..md diff --git a/saint-simon.md b/saint simon.md similarity index 100% rename from saint-simon.md rename to saint simon.md diff --git a/sam-harris.md b/sam harris.md similarity index 100% rename from sam-harris.md rename to sam harris.md diff --git a/samanta-schweblin.md b/samanta schweblin.md similarity index 100% rename from samanta-schweblin.md rename to samanta schweblin.md diff --git a/same-as.md b/same as.md similarity index 100% rename from same-as.md rename to same as.md diff --git a/samuel-edward-konkin-iii.md b/samuel edward konkin iii.md similarity index 100% rename from samuel-edward-konkin-iii.md rename to samuel edward konkin iii.md diff --git a/samuel-johnson.md b/samuel johnson.md similarity index 100% rename from samuel-johnson.md rename to samuel johnson.md diff --git a/samuel-klein.md b/samuel klein.md similarity index 100% rename from samuel-klein.md rename to samuel klein.md diff --git a/santa-fe-institute.md b/santa fe institute.md similarity index 100% rename from santa-fe-institute.md rename to santa fe institute.md diff --git a/santa-maría.md b/santa maría.md similarity index 100% rename from santa-maría.md rename to santa maría.md diff --git a/sarah-friend.md b/sarah friend.md similarity index 100% rename from sarah-friend.md rename to sarah friend.md diff --git a/sarah-of-the-past.md b/sarah of the past.md similarity index 100% rename from sarah-of-the-past.md rename to sarah of the past.md diff --git a/sarah schwettmann.md b/sarah schwettmann.md index dd0ae0437..153b8f58e 100644 --- a/sarah schwettmann.md +++ b/sarah schwettmann.md @@ -1,4 +1,2 @@ # sarah schwettmann -- [[pull]] [[cogconfluence]] - diff --git a/sarah-schwettmann.md b/sarah-schwettmann.md deleted file mode 100644 index 153b8f58e..000000000 --- a/sarah-schwettmann.md +++ /dev/null @@ -1,2 +0,0 @@ -# sarah schwettmann - diff --git a/satyagraha-revolution.md b/satyagraha revolution.md similarity index 100% rename from satyagraha-revolution.md rename to satyagraha revolution.md diff --git a/saul-williams.md b/saul williams.md similarity index 100% rename from saul-williams.md rename to saul williams.md diff --git a/scattered-minds.md b/scattered minds.md similarity index 100% rename from scattered-minds.md rename to scattered minds.md diff --git a/schelling-point.md b/schelling point.md similarity index 100% rename from schelling-point.md rename to schelling point.md diff --git a/schuldenzucker-com.md b/schuldenzucker com.md similarity index 100% rename from schuldenzucker-com.md rename to schuldenzucker com.md diff --git a/sci-fi.md b/sci fi.md similarity index 100% rename from sci-fi.md rename to sci fi.md diff --git a/sciences-of-the-artificial.md b/sciences of the artificial.md similarity index 100% rename from sciences-of-the-artificial.md rename to sciences of the artificial.md diff --git a/scott-alexander.md b/scott alexander.md similarity index 100% rename from scott-alexander.md rename to scott alexander.md diff --git a/search-and-annotation-are-complementary.md b/search and annotation are complementary.md similarity index 100% rename from search-and-annotation-are-complementary.md rename to search and annotation are complementary.md diff --git a/search-engine.md b/search engine.md similarity index 100% rename from search-engine.md rename to search engine.md diff --git a/sebastian-gandera.md b/sebastian gandera.md similarity index 100% rename from sebastian-gandera.md rename to sebastian gandera.md diff --git a/second-brain.md b/second brain.md similarity index 100% rename from second-brain.md rename to second brain.md diff --git a/second-stoa.md b/second stoa.md similarity index 100% rename from second-stoa.md rename to second stoa.md diff --git a/secular-buddhism.md b/secular buddhism.md similarity index 100% rename from secular-buddhism.md rename to secular buddhism.md diff --git a/secular-buddhist.md b/secular buddhist.md similarity index 100% rename from secular-buddhist.md rename to secular buddhist.md diff --git a/seeing-like-a-state.md b/seeing like a state.md similarity index 100% rename from seeing-like-a-state.md rename to seeing like a state.md diff --git a/self-organizing-intelligent-matter.md b/self organizing intelligent matter.md similarity index 100% rename from self-organizing-intelligent-matter.md rename to self organizing intelligent matter.md diff --git a/semantic-modeling-of-narrative-events.md b/semantic modeling of narrative events.md similarity index 100% rename from semantic-modeling-of-narrative-events.md rename to semantic modeling of narrative events.md diff --git a/semantic-narratives.md b/semantic narratives.md similarity index 100% rename from semantic-narratives.md rename to semantic narratives.md diff --git a/semantic-versioning.md b/semantic versioning.md similarity index 100% rename from semantic-versioning.md rename to semantic versioning.md diff --git a/senior-software-engineer-interview.md b/senior software engineer interview.md similarity index 100% rename from senior-software-engineer-interview.md rename to senior software engineer interview.md diff --git a/sensible-urls.md b/sensible urls.md similarity index 100% rename from sensible-urls.md rename to sensible urls.md diff --git a/sequential-wiki.md b/sequential wiki.md similarity index 100% rename from sequential-wiki.md rename to sequential wiki.md diff --git a/seven-bridges-of-königsberg.md b/seven bridges of königsberg.md similarity index 100% rename from seven-bridges-of-königsberg.md rename to seven bridges of königsberg.md diff --git a/sex-tips-for-geeks.md b/sex tips for geeks.md similarity index 100% rename from sex-tips-for-geeks.md rename to sex tips for geeks.md diff --git a/sharing-economy.md b/sharing economy.md similarity index 100% rename from sharing-economy.md rename to sharing economy.md diff --git a/shi-ne.md b/shi ne.md similarity index 100% rename from shi-ne.md rename to shi ne.md diff --git a/shinzen-young.md b/shinzen young.md similarity index 100% rename from shinzen-young.md rename to shinzen young.md diff --git a/shirtless-guy.md b/shirtless guy.md similarity index 100% rename from shirtless-guy.md rename to shirtless guy.md diff --git a/shu-omi.md b/shu omi.md similarity index 100% rename from shu-omi.md rename to shu omi.md diff --git a/side-projects.md b/side projects.md similarity index 100% rename from side-projects.md rename to side projects.md diff --git a/siedlung-halen.md b/siedlung halen.md similarity index 100% rename from siedlung-halen.md rename to siedlung halen.md diff --git a/sign-up.md b/sign up.md similarity index 100% rename from sign-up.md rename to sign up.md diff --git a/silence-is-a-commons.md b/silence is a commons.md similarity index 100% rename from silence-is-a-commons.md rename to silence is a commons.md diff --git a/silver-ladders.md b/silver ladders.md similarity index 100% rename from silver-ladders.md rename to silver ladders.md diff --git a/simulated-annealing.md b/simulated annealing.md similarity index 100% rename from simulated-annealing.md rename to simulated annealing.md diff --git a/sistema-b.md b/sistema b.md similarity index 100% rename from sistema-b.md rename to sistema b.md diff --git a/sister-sites.md b/sister sites.md similarity index 100% rename from sister-sites.md rename to sister sites.md diff --git a/site-reliability-engineer.md b/site reliability engineer.md similarity index 100% rename from site-reliability-engineer.md rename to site reliability engineer.md diff --git a/site-reliability-engineering.md b/site reliability engineering.md similarity index 100% rename from site-reliability-engineering.md rename to site reliability engineering.md diff --git a/slate-star-codex.md b/slate star codex.md similarity index 100% rename from slate-star-codex.md rename to slate star codex.md diff --git a/slavoj-zizek.md b/slavoj zizek.md similarity index 100% rename from slavoj-zizek.md rename to slavoj zizek.md diff --git a/slavoj-žižek.md b/slavoj žižek.md similarity index 100% rename from slavoj-žižek.md rename to slavoj žižek.md diff --git a/sleeper-trains.md b/sleeper trains.md similarity index 100% rename from sleeper-trains.md rename to sleeper trains.md diff --git a/slow-focus.md b/slow focus.md similarity index 100% rename from slow-focus.md rename to slow focus.md diff --git a/small-axe.md b/small axe.md similarity index 100% rename from small-axe.md rename to small axe.md diff --git a/smart-agora.md b/smart agora.md similarity index 100% rename from smart-agora.md rename to smart agora.md diff --git a/smarter-than-me.md b/smarter than me.md similarity index 100% rename from smarter-than-me.md rename to smarter than me.md diff --git a/snorri-sturluson.md b/snorri sturluson.md similarity index 100% rename from snorri-sturluson.md rename to snorri sturluson.md diff --git a/so-you-want-to-talk-about-race.md b/so you want to talk about race.md similarity index 100% rename from so-you-want-to-talk-about-race.md rename to so you want to talk about race.md diff --git a/social-algorithm.md b/social algorithm.md similarity index 100% rename from social-algorithm.md rename to social algorithm.md diff --git a/social-coop.md b/social coop.md similarity index 100% rename from social-coop.md rename to social coop.md diff --git a/social-distributed-knowledge-graph.md b/social distributed knowledge graph.md similarity index 100% rename from social-distributed-knowledge-graph.md rename to social distributed knowledge graph.md diff --git a/social-knowledge-graph.md b/social knowledge graph.md similarity index 100% rename from social-knowledge-graph.md rename to social knowledge graph.md diff --git a/social-knowledge-graphs-discussion.md b/social knowledge graphs discussion.md similarity index 100% rename from social-knowledge-graphs-discussion.md rename to social knowledge graphs discussion.md diff --git a/social-media-for-anarchists.md b/social media for anarchists.md similarity index 100% rename from social-media-for-anarchists.md rename to social media for anarchists.md diff --git a/social-network.md b/social network.md similarity index 100% rename from social-network.md rename to social network.md diff --git a/social-web-protocols.md b/social web protocols.md similarity index 100% rename from social-web-protocols.md rename to social web protocols.md diff --git a/socrates-figures.md b/socrates figures.md similarity index 100% rename from socrates-figures.md rename to socrates figures.md diff --git a/solomon-naim.md b/solomon naim.md similarity index 100% rename from solomon-naim.md rename to solomon naim.md diff --git a/soma-fm.md b/soma fm.md similarity index 100% rename from soma-fm.md rename to soma fm.md diff --git a/some-possible-paths-to-flancia.md b/some possible paths to flancia.md similarity index 100% rename from some-possible-paths-to-flancia.md rename to some possible paths to flancia.md diff --git a/some-things-must-be-believed-in-order-to-be-seen.md b/some things must be believed in order to be seen.md similarity index 100% rename from some-things-must-be-believed-in-order-to-be-seen.md rename to some things must be believed in order to be seen.md diff --git a/sometimes-i-feel-as-if-i-am-struck-by-lightning.md b/sometimes i feel as if i am struck by lightning.md similarity index 100% rename from sometimes-i-feel-as-if-i-am-struck-by-lightning.md rename to sometimes i feel as if i am struck by lightning.md diff --git a/sounds-of-the-dawn.md b/sounds of the dawn.md similarity index 100% rename from sounds-of-the-dawn.md rename to sounds of the dawn.md diff --git a/space-flower.md b/space flower.md similarity index 100% rename from space-flower.md rename to space flower.md diff --git a/speech-and-language-processing.md b/speech and language processing.md similarity index 100% rename from speech-and-language-processing.md rename to speech and language processing.md diff --git a/ssh-keys.md b/ssh keys.md similarity index 100% rename from ssh-keys.md rename to ssh keys.md diff --git a/st-benedict-rule-for-monasteries.md b/st benedict rule for monasteries.md similarity index 100% rename from st-benedict-rule-for-monasteries.md rename to st benedict rule for monasteries.md diff --git a/st-benedict-s-rule-for-monasteries.md b/st benedict s rule for monasteries.md similarity index 100% rename from st-benedict-s-rule-for-monasteries.md rename to st benedict s rule for monasteries.md diff --git a/stack-exchange.md b/stack exchange.md similarity index 100% rename from stack-exchange.md rename to stack exchange.md diff --git a/stack-overflow.md b/stack overflow.md similarity index 100% rename from stack-overflow.md rename to stack overflow.md diff --git a/standoff-properties.md b/standoff properties.md similarity index 100% rename from standoff-properties.md rename to standoff properties.md diff --git a/steffen-schuldenzucker.md b/steffen schuldenzucker.md similarity index 100% rename from steffen-schuldenzucker.md rename to steffen schuldenzucker.md diff --git a/stephen-batchelor.md b/stephen batchelor.md similarity index 100% rename from stephen-batchelor.md rename to stephen batchelor.md diff --git a/stephen-crane.md b/stephen crane.md similarity index 100% rename from stephen-crane.md rename to stephen crane.md diff --git a/stephen-downes.md b/stephen downes.md similarity index 100% rename from stephen-downes.md rename to stephen downes.md diff --git a/stephen-wolfram.md b/stephen wolfram.md similarity index 100% rename from stephen-wolfram.md rename to stephen wolfram.md diff --git a/steve-blank.md b/steve blank.md similarity index 100% rename from steve-blank.md rename to steve blank.md diff --git a/steve-mcqueen.md b/steve mcqueen.md similarity index 100% rename from steve-mcqueen.md rename to steve mcqueen.md diff --git a/steve-roach.md b/steve roach.md similarity index 100% rename from steve-roach.md rename to steve roach.md diff --git a/steve-wozniak.md b/steve wozniak.md similarity index 100% rename from steve-wozniak.md rename to steve wozniak.md diff --git a/steven-fan.md b/steven fan.md similarity index 100% rename from steven-fan.md rename to steven fan.md diff --git a/steven-levy.md b/steven levy.md similarity index 100% rename from steven-levy.md rename to steven levy.md diff --git a/stoa-of-attalos.md b/stoa of attalos.md similarity index 100% rename from stoa-of-attalos.md rename to stoa of attalos.md diff --git a/stoa-poikile.md b/stoa poikile.md similarity index 100% rename from stoa-poikile.md rename to stoa poikile.md diff --git a/strength-in-diversity.md b/strength in diversity.md similarity index 100% rename from strength-in-diversity.md rename to strength in diversity.md diff --git a/struck-by-lightning.md b/struck by lightning.md similarity index 100% rename from struck-by-lightning.md rename to struck by lightning.md diff --git a/structure-and-interpretation-of-classical-mechanics.md b/structure and interpretation of classical mechanics.md similarity index 100% rename from structure-and-interpretation-of-classical-mechanics.md rename to structure and interpretation of classical mechanics.md diff --git a/structure-and-interpretation-of-computer-programs.md b/structure and interpretation of computer programs.md similarity index 100% rename from structure-and-interpretation-of-computer-programs.md rename to structure and interpretation of computer programs.md diff --git a/sun-salutations.md b/sun salutations.md similarity index 100% rename from sun-salutations.md rename to sun salutations.md diff --git a/surplus-value.md b/surplus value.md similarity index 100% rename from surplus-value.md rename to surplus value.md diff --git a/survey-of-annotation-efforts.md b/survey of annotation efforts.md similarity index 100% rename from survey-of-annotation-efforts.md rename to survey of annotation efforts.md diff --git a/susan-stebbing.md b/susan stebbing.md similarity index 100% rename from susan-stebbing.md rename to susan stebbing.md diff --git a/swiss-wiring-code.md b/swiss wiring code.md similarity index 100% rename from swiss-wiring-code.md rename to swiss wiring code.md diff --git a/syrian-uprising.md b/syrian uprising.md similarity index 100% rename from syrian-uprising.md rename to syrian uprising.md diff --git a/t-s-eliot.md b/t s eliot.md similarity index 100% rename from t-s-eliot.md rename to t s eliot.md diff --git a/ta-eis-heauton.md b/ta eis heauton.md similarity index 100% rename from ta-eis-heauton.md rename to ta eis heauton.md diff --git a/ta-heis-heauton.md b/ta heis heauton.md similarity index 100% rename from ta-heis-heauton.md rename to ta heis heauton.md diff --git a/take-a-walk-on-the-wild-side.md b/take a walk on the wild side.md similarity index 100% rename from take-a-walk-on-the-wild-side.md rename to take a walk on the wild side.md diff --git a/tao-of-programming.md b/tao of programming.md similarity index 100% rename from tao-of-programming.md rename to tao of programming.md diff --git a/tapir-whorf.md b/tapir whorf.md similarity index 100% rename from tapir-whorf.md rename to tapir whorf.md diff --git a/taxonomy-of-ideas.md b/taxonomy of ideas.md similarity index 100% rename from taxonomy-of-ideas.md rename to taxonomy of ideas.md diff --git a/te-quiero.md b/te quiero.md similarity index 100% rename from te-quiero.md rename to te quiero.md diff --git a/team-human.md b/team human.md similarity index 100% rename from team-human.md rename to team human.md diff --git a/tectonic-shift.md b/tectonic shift.md similarity index 100% rename from tectonic-shift.md rename to tectonic shift.md diff --git a/ted-nelson.md b/ted nelson.md similarity index 100% rename from ted-nelson.md rename to ted nelson.md diff --git a/temporal-discounting.md b/temporal discounting.md similarity index 100% rename from temporal-discounting.md rename to temporal discounting.md diff --git a/teodor-heggelund.md b/teodor heggelund.md similarity index 100% rename from teodor-heggelund.md rename to teodor heggelund.md diff --git a/terrorism-is-not-effective.md b/terrorism is not effective.md similarity index 100% rename from terrorism-is-not-effective.md rename to terrorism is not effective.md diff --git a/terrorismo-constructivo.md b/terrorismo constructivo.md similarity index 100% rename from terrorismo-constructivo.md rename to terrorismo constructivo.md diff --git a/test-for-tld.md b/test for tld.md similarity index 100% rename from test-for-tld.md rename to test for tld.md diff --git a/tetraspace-grouping.md b/tetraspace grouping.md similarity index 100% rename from tetraspace-grouping.md rename to tetraspace grouping.md diff --git a/the-agora-is-a-liminal-entity.md b/the agora is a liminal entity.md similarity index 100% rename from the-agora-is-a-liminal-entity.md rename to the agora is a liminal entity.md diff --git a/the-agora-is-a-markdown-convention.md b/the agora is a markdown convention.md similarity index 100% rename from the-agora-is-a-markdown-convention.md rename to the agora is a markdown convention.md diff --git a/the-agora-is-a-platform-for-studying-convergence.md b/the agora is a platform for studying convergence.md similarity index 100% rename from the-agora-is-a-platform-for-studying-convergence.md rename to the agora is a platform for studying convergence.md diff --git a/the-agora-is-a-social-network-built-by-the-people-for-the-people.md b/the agora is a social network built by the people for the people.md similarity index 100% rename from the-agora-is-a-social-network-built-by-the-people-for-the-people.md rename to the agora is a social network built by the people for the people.md diff --git a/the-agora-is-a-twitter-app.md b/the agora is a twitter app.md similarity index 100% rename from the-agora-is-a-twitter-app.md rename to the agora is a twitter app.md diff --git a/the-agora-is-an-old-kind-of-social-network.md b/the agora is an old kind of social network.md similarity index 100% rename from the-agora-is-an-old-kind-of-social-network.md rename to the agora is an old kind of social network.md diff --git a/the-arcades-project.md b/the arcades project.md similarity index 100% rename from the-arcades-project.md rename to the arcades project.md diff --git a/the-architecture-of-markets.md b/the architecture of markets.md similarity index 100% rename from the-architecture-of-markets.md rename to the architecture of markets.md diff --git a/the-architecture-of-open-source-applications.md b/the architecture of open source applications.md similarity index 100% rename from the-architecture-of-open-source-applications.md rename to the architecture of open source applications.md diff --git a/the-book-of-the-new-sun.md b/the book of the new sun.md similarity index 100% rename from the-book-of-the-new-sun.md rename to the book of the new sun.md diff --git a/the-cloud-of-unknowing.md b/the cloud of unknowing.md similarity index 100% rename from the-cloud-of-unknowing.md rename to the cloud of unknowing.md diff --git a/the-effective-altruism-handbook.md b/the effective altruism handbook.md similarity index 100% rename from the-effective-altruism-handbook.md rename to the effective altruism handbook.md diff --git a/the-end.md b/the end.md similarity index 100% rename from the-end.md rename to the end.md diff --git a/the-equitable-prose.md b/the equitable prose.md similarity index 100% rename from the-equitable-prose.md rename to the equitable prose.md diff --git a/the-evolution-of-cooperation.md b/the evolution of cooperation.md similarity index 100% rename from the-evolution-of-cooperation.md rename to the evolution of cooperation.md diff --git a/the-expanding-circle.md b/the expanding circle.md similarity index 100% rename from the-expanding-circle.md rename to the expanding circle.md diff --git a/the-expanse.md b/the expanse.md similarity index 100% rename from the-expanse.md rename to the expanse.md diff --git a/the-fable-of-the-dragon-tyrant.md b/the fable of the dragon tyrant.md similarity index 100% rename from the-fable-of-the-dragon-tyrant.md rename to the fable of the dragon tyrant.md diff --git a/the-federation.md b/the federation.md similarity index 100% rename from the-federation.md rename to the federation.md diff --git a/the-garden-of-forking-paths.md b/the garden of forking paths.md similarity index 100% rename from the-garden-of-forking-paths.md rename to the garden of forking paths.md diff --git a/the-gift.md b/the gift.md similarity index 100% rename from the-gift.md rename to the gift.md diff --git a/the-girl-who-stole-my-tamagotchi.md b/the girl who stole my tamagotchi.md similarity index 100% rename from the-girl-who-stole-my-tamagotchi.md rename to the girl who stole my tamagotchi.md diff --git a/the-great-reset.md b/the great reset.md similarity index 100% rename from the-great-reset.md rename to the great reset.md diff --git a/the-great-tab-purge-of-2020.md b/the great tab purge of 2020.md similarity index 100% rename from the-great-tab-purge-of-2020.md rename to the great tab purge of 2020.md diff --git a/the-hyperbolic-geometry-of-dmt-experiences.md b/the hyperbolic geometry of dmt experiences.md similarity index 100% rename from the-hyperbolic-geometry-of-dmt-experiences.md rename to the hyperbolic geometry of dmt experiences.md diff --git a/the-hyperlink-delusion.md b/the hyperlink delusion.md similarity index 100% rename from the-hyperlink-delusion.md rename to the hyperlink delusion.md diff --git a/the-idea-of-the-world.md b/the idea of the world.md similarity index 100% rename from the-idea-of-the-world.md rename to the idea of the world.md diff --git a/the-intelligent-social-web.md b/the intelligent social web.md similarity index 100% rename from the-intelligent-social-web.md rename to the intelligent social web.md diff --git a/the-island.md b/the island.md similarity index 100% rename from the-island.md rename to the island.md diff --git a/the-kind-in-yellow.md b/the kind in yellow.md similarity index 100% rename from the-kind-in-yellow.md rename to the kind in yellow.md diff --git a/the-king-in-yellow.md b/the king in yellow.md similarity index 100% rename from the-king-in-yellow.md rename to the king in yellow.md diff --git a/the-life-you-can-save.md b/the life you can save.md similarity index 100% rename from the-life-you-can-save.md rename to the life you can save.md diff --git a/the-little-schemer.md b/the little schemer.md similarity index 100% rename from the-little-schemer.md rename to the little schemer.md diff --git a/the-little-schemerh.md b/the little schemerh.md similarity index 100% rename from the-little-schemerh.md rename to the little schemerh.md diff --git a/the-machine.md b/the machine.md similarity index 100% rename from the-machine.md rename to the machine.md diff --git a/the-man-in-the-high-castle.md b/the man in the high castle.md similarity index 100% rename from the-man-in-the-high-castle.md rename to the man in the high castle.md diff --git a/the-man-who-was-thursday.md b/the man who was thursday.md similarity index 100% rename from the-man-who-was-thursday.md rename to the man who was thursday.md diff --git a/the-narrator.md b/the narrator.md similarity index 100% rename from the-narrator.md rename to the narrator.md diff --git a/the-next-ai-winter-wil-lbe-due-to-energy-costs.md b/the next ai winter wil lbe due to energy costs.md similarity index 100% rename from the-next-ai-winter-wil-lbe-due-to-energy-costs.md rename to the next ai winter wil lbe due to energy costs.md diff --git a/the-open-boat.md b/the open boat.md similarity index 100% rename from the-open-boat.md rename to the open boat.md diff --git a/the-people-united-will-never-be-defeated.md b/the people united will never be defeated.md similarity index 100% rename from the-people-united-will-never-be-defeated.md rename to the people united will never be defeated.md diff --git a/the-productivists.md b/the productivists.md similarity index 100% rename from the-productivists.md rename to the productivists.md diff --git a/the-revolution-will-be-annotated.md b/the revolution will be annotated.md similarity index 100% rename from the-revolution-will-be-annotated.md rename to the revolution will be annotated.md diff --git a/the-rise-of-made-in-china-diplomacy.md b/the rise of made in china diplomacy.md similarity index 100% rename from the-rise-of-made-in-china-diplomacy.md rename to the rise of made in china diplomacy.md diff --git a/the-science-of-enlightenment.md b/the science of enlightenment.md similarity index 100% rename from the-science-of-enlightenment.md rename to the science of enlightenment.md diff --git a/the-selfish-gene.md b/the selfish gene.md similarity index 100% rename from the-selfish-gene.md rename to the selfish gene.md diff --git a/the-set-of-all-possible-things.md b/the set of all possible things.md similarity index 100% rename from the-set-of-all-possible-things.md rename to the set of all possible things.md diff --git a/the-software-shall-be-used-for-good-not-evil.md b/the software shall be used for good not evil.md similarity index 100% rename from the-software-shall-be-used-for-good-not-evil.md rename to the software shall be used for good not evil.md diff --git a/the-sovereign-individual.md b/the sovereign individual.md similarity index 100% rename from the-sovereign-individual.md rename to the sovereign individual.md diff --git a/the-story-of-aaron-swartz.md b/the story of aaron swartz.md similarity index 100% rename from the-story-of-aaron-swartz.md rename to the story of aaron swartz.md diff --git a/the-story-of-civilization.md b/the story of civilization.md similarity index 100% rename from the-story-of-civilization.md rename to the story of civilization.md diff --git a/the-timeless-way-of-building.md b/the timeless way of building.md similarity index 100% rename from the-timeless-way-of-building.md rename to the timeless way of building.md diff --git a/the-universal-laws-of-success.md b/the universal laws of success.md similarity index 100% rename from the-universal-laws-of-success.md rename to the universal laws of success.md diff --git a/the-virtue-of-selfishness.md b/the virtue of selfishness.md similarity index 100% rename from the-virtue-of-selfishness.md rename to the virtue of selfishness.md diff --git a/the-wire.md b/the wire.md similarity index 100% rename from the-wire.md rename to the wire.md diff --git a/the-word-fuck.md b/the word fuck.md similarity index 100% rename from the-word-fuck.md rename to the word fuck.md diff --git a/the-work-of-art-in-the-age-of-mechanical-reproduction.md b/the work of art in the age of mechanical reproduction.md similarity index 100% rename from the-work-of-art-in-the-age-of-mechanical-reproduction.md rename to the work of art in the age of mechanical reproduction.md diff --git a/the-world-at-war.md b/the world at war.md similarity index 100% rename from the-world-at-war.md rename to the world at war.md diff --git a/the-year-of-living-biblically.md b/the year of living biblically.md similarity index 100% rename from the-year-of-living-biblically.md rename to the year of living biblically.md diff --git a/theory-of-forms.md b/theory of forms.md similarity index 100% rename from theory-of-forms.md rename to theory of forms.md diff --git a/theproject-is.md b/theproject is.md similarity index 100% rename from theproject-is.md rename to theproject is.md diff --git a/thesis-antithesis-synthesis.md b/thesis antithesis synthesis.md similarity index 100% rename from thesis-antithesis-synthesis.md rename to thesis antithesis synthesis.md diff --git a/think-about.md b/think about.md similarity index 100% rename from think-about.md rename to think about.md diff --git a/third-coast-percussion.md b/third coast percussion.md similarity index 100% rename from third-coast-percussion.md rename to third coast percussion.md diff --git a/third-stoa.md b/third stoa.md similarity index 100% rename from third-stoa.md rename to third stoa.md diff --git a/thomas-gray.md b/thomas gray.md similarity index 100% rename from thomas-gray.md rename to thomas gray.md diff --git a/thomas-lisankie.md b/thomas lisankie.md similarity index 100% rename from thomas-lisankie.md rename to thomas lisankie.md diff --git a/thomas-more's-utopia.md b/thomas more's utopia.md similarity index 100% rename from thomas-more's-utopia.md rename to thomas more's utopia.md diff --git a/thomas-szasz.md b/thomas szasz.md similarity index 100% rename from thomas-szasz.md rename to thomas szasz.md diff --git a/thor-ciphers.md b/thor ciphers.md similarity index 100% rename from thor-ciphers.md rename to thor ciphers.md diff --git a/thought-experiment.md b/thought experiment.md similarity index 100% rename from thought-experiment.md rename to thought experiment.md diff --git a/thread-helper.md b/thread helper.md similarity index 100% rename from thread-helper.md rename to thread helper.md diff --git a/thread-mode.md b/thread mode.md similarity index 100% rename from thread-mode.md rename to thread mode.md diff --git a/tillie-kottmann.md b/tillie kottmann.md similarity index 100% rename from tillie-kottmann.md rename to tillie kottmann.md diff --git a/tim-berners-lee.md b/tim berners lee.md similarity index 100% rename from tim-berners-lee.md rename to tim berners lee.md diff --git a/tiny-desk.md b/tiny desk.md similarity index 100% rename from tiny-desk.md rename to tiny desk.md diff --git a/tit-for-that-with-forgiveness.md b/tit for that with forgiveness.md similarity index 100% rename from tit-for-that-with-forgiveness.md rename to tit for that with forgiveness.md diff --git a/tit-for-that.md b/tit for that.md similarity index 100% rename from tit-for-that.md rename to tit for that.md diff --git a/to-live-and-think-like-pigs.md b/to live and think like pigs.md similarity index 100% rename from to-live-and-think-like-pigs.md rename to to live and think like pigs.md diff --git a/todd-carpenter.md b/todd carpenter.md similarity index 100% rename from todd-carpenter.md rename to todd carpenter.md diff --git a/tokyo-school.md b/tokyo school.md similarity index 100% rename from tokyo-school.md rename to tokyo school.md diff --git a/tools-of-the-agora.md b/tools of the agora.md similarity index 100% rename from tools-of-the-agora.md rename to tools of the agora.md diff --git a/toot-cli.md b/toot cli.md similarity index 100% rename from toot-cli.md rename to toot cli.md diff --git a/torta-base.md b/torta base.md similarity index 100% rename from torta-base.md rename to torta base.md diff --git a/towards-an-agora.md b/towards an agora.md similarity index 100% rename from towards-an-agora.md rename to towards an agora.md diff --git a/town-hall.md b/town hall.md similarity index 100% rename from town-hall.md rename to town hall.md diff --git a/trace-programming-language.md b/trace programming language.md similarity index 100% rename from trace-programming-language.md rename to trace programming language.md diff --git a/transitive-go-links.md b/transitive go links.md similarity index 100% rename from transitive-go-links.md rename to transitive go links.md diff --git a/tree-notation.md b/tree notation.md similarity index 100% rename from tree-notation.md rename to tree notation.md diff --git a/tree-shaping.md b/tree shaping.md similarity index 100% rename from tree-shaping.md rename to tree shaping.md diff --git a/tree-simulator.md b/tree simulator.md similarity index 100% rename from tree-simulator.md rename to tree simulator.md diff --git a/tree-structure.md b/tree structure.md similarity index 100% rename from tree-structure.md rename to tree structure.md diff --git a/tree-structured-file-formats.md b/tree structured file formats.md similarity index 100% rename from tree-structured-file-formats.md rename to tree structured file formats.md diff --git a/tree-structures.md b/tree structures.md similarity index 100% rename from tree-structures.md rename to tree structures.md diff --git a/tree-style-tab.md b/tree style tab.md similarity index 100% rename from tree-style-tab.md rename to tree style tab.md diff --git a/tree-style-tabs.md b/tree style tabs.md similarity index 100% rename from tree-style-tabs.md rename to tree style tabs.md diff --git a/true-colors.md b/true colors.md similarity index 100% rename from true-colors.md rename to true colors.md diff --git a/true-colours.md b/true colours.md similarity index 100% rename from true-colours.md rename to true colours.md diff --git a/true-names.md b/true names.md similarity index 100% rename from true-names.md rename to true names.md diff --git a/try-yoga.md b/try yoga.md similarity index 100% rename from try-yoga.md rename to try yoga.md diff --git a/tsegue-maryam-guebrou.md b/tsegue maryam guebrou.md similarity index 100% rename from tsegue-maryam-guebrou.md rename to tsegue maryam guebrou.md diff --git a/tv-series.md b/tv series.md similarity index 100% rename from tv-series.md rename to tv series.md diff --git a/twice-the-first-time.md b/twice the first time.md similarity index 100% rename from twice-the-first-time.md rename to twice the first time.md diff --git a/twitter-agora-integration.md b/twitter agora integration.md similarity index 100% rename from twitter-agora-integration.md rename to twitter agora integration.md diff --git a/twitter-could-be-an-agora.md b/twitter could be an agora.md similarity index 100% rename from twitter-could-be-an-agora.md rename to twitter could be an agora.md diff --git a/twitter-d-d-roles.md b/twitter d d roles.md similarity index 100% rename from twitter-d-d-roles.md rename to twitter d d roles.md diff --git a/twitter-embeds.md b/twitter embeds.md similarity index 100% rename from twitter-embeds.md rename to twitter embeds.md diff --git a/twitter-feature-requests.md b/twitter feature requests.md similarity index 100% rename from twitter-feature-requests.md rename to twitter feature requests.md diff --git a/twitter-go-links.md b/twitter go links.md similarity index 100% rename from twitter-go-links.md rename to twitter go links.md diff --git a/twitter-outage.md b/twitter outage.md similarity index 100% rename from twitter-outage.md rename to twitter outage.md diff --git a/twitter-report.md b/twitter report.md similarity index 100% rename from twitter-report.md rename to twitter report.md diff --git a/twitter-to-roam.md b/twitter to roam.md similarity index 100% rename from twitter-to-roam.md rename to twitter to roam.md diff --git a/twitter-todo.md b/twitter todo.md similarity index 100% rename from twitter-todo.md rename to twitter todo.md diff --git a/twitter-zhuangzi.md b/twitter zhuangzi.md similarity index 100% rename from twitter-zhuangzi.md rename to twitter zhuangzi.md diff --git a/tyler-alterman.md b/tyler alterman.md similarity index 100% rename from tyler-alterman.md rename to tyler alterman.md diff --git a/tymothy-snyder.md b/tymothy snyder.md similarity index 100% rename from tymothy-snyder.md rename to tymothy snyder.md diff --git a/ubi-zurich.md b/ubi zurich.md similarity index 100% rename from ubi-zurich.md rename to ubi zurich.md diff --git a/ultra-fractal.md b/ultra fractal.md similarity index 100% rename from ultra-fractal.md rename to ultra fractal.md diff --git a/un-goals-for-sustainable-development.md b/un goals for sustainable development.md similarity index 100% rename from un-goals-for-sustainable-development.md rename to un goals for sustainable development.md diff --git a/un-goals.md b/un goals.md similarity index 100% rename from un-goals.md rename to un goals.md diff --git a/un-mundo-común.md b/un mundo común.md similarity index 100% rename from un-mundo-común.md rename to un mundo común.md diff --git a/un-objectives.md b/un objectives.md similarity index 100% rename from un-objectives.md rename to un objectives.md diff --git a/unfair-privilege.md b/unfair privilege.md similarity index 100% rename from unfair-privilege.md rename to unfair privilege.md diff --git a/unicode-arrows.md b/unicode arrows.md similarity index 100% rename from unicode-arrows.md rename to unicode arrows.md diff --git a/unicode-slugify.md b/unicode slugify.md similarity index 100% rename from unicode-slugify.md rename to unicode slugify.md diff --git a/unified-inbox-startup.md b/unified inbox startup.md similarity index 100% rename from unified-inbox-startup.md rename to unified inbox startup.md diff --git a/units-of-collaboration.md b/units of collaboration.md similarity index 100% rename from units-of-collaboration.md rename to units of collaboration.md diff --git a/universal-basic-income.md b/universal basic income.md similarity index 100% rename from universal-basic-income.md rename to universal basic income.md diff --git a/universal-paperclips.md b/universal paperclips.md similarity index 100% rename from universal-paperclips.md rename to universal paperclips.md diff --git a/unix-philosophy.md b/unix philosophy.md similarity index 100% rename from unix-philosophy.md rename to unix philosophy.md diff --git a/unnamed-culture-project.md b/unnamed culture project.md similarity index 100% rename from unnamed-culture-project.md rename to unnamed culture project.md diff --git a/unqualified-reservations.md b/unqualified reservations.md similarity index 100% rename from unqualified-reservations.md rename to unqualified reservations.md diff --git a/untitled-1.md b/untitled 1.md similarity index 100% rename from untitled-1.md rename to untitled 1.md diff --git a/untitled-2.md b/untitled 2.md similarity index 100% rename from untitled-2.md rename to untitled 2.md diff --git a/untitled-3.md b/untitled 3.md similarity index 100% rename from untitled-3.md rename to untitled 3.md diff --git a/upgrade-capitalism.md b/upgrade capitalism.md similarity index 100% rename from upgrade-capitalism.md rename to upgrade capitalism.md diff --git a/useful-definitions.md b/useful definitions.md similarity index 100% rename from useful-definitions.md rename to useful definitions.md diff --git a/user-links.md b/user links.md similarity index 100% rename from user-links.md rename to user links.md diff --git a/using-the-agora.md b/using the agora.md similarity index 100% rename from using-the-agora.md rename to using the agora.md diff --git a/utopia-coffee.md b/utopia coffee.md similarity index 100% rename from utopia-coffee.md rename to utopia coffee.md diff --git a/utopia-for-realists.md b/utopia for realists.md similarity index 100% rename from utopia-for-realists.md rename to utopia for realists.md diff --git a/vacation-2020.md b/vacation 2020.md similarity index 100% rename from vacation-2020.md rename to vacation 2020.md diff --git a/val-flores.md b/val flores.md similarity index 100% rename from val-flores.md rename to val flores.md diff --git a/vc-space.md b/vc space.md similarity index 100% rename from vc-space.md rename to vc space.md diff --git a/vickrey-auction.md b/vickrey auction.md similarity index 100% rename from vickrey-auction.md rename to vickrey auction.md diff --git a/vicrey-auction.md b/vicrey auction.md similarity index 100% rename from vicrey-auction.md rename to vicrey auction.md diff --git a/victor-hugo.md b/victor hugo.md similarity index 100% rename from victor-hugo.md rename to victor hugo.md diff --git a/vijay-shankar-v.md b/vijay shankar v.md similarity index 100% rename from vijay-shankar-v.md rename to vijay shankar v.md diff --git a/ville-radieuse.md b/ville radieuse.md similarity index 100% rename from ville-radieuse.md rename to ville radieuse.md diff --git a/vinay-gupta.md b/vinay gupta.md similarity index 100% rename from vinay-gupta.md rename to vinay gupta.md diff --git a/vince-fakhoury-horn.md b/vince fakhoury horn.md similarity index 100% rename from vince-fakhoury-horn.md rename to vince fakhoury horn.md diff --git a/violent-revolution.md b/violent revolution.md similarity index 100% rename from violent-revolution.md rename to violent revolution.md diff --git a/virtual-bolo.md b/virtual bolo.md similarity index 100% rename from virtual-bolo.md rename to virtual bolo.md diff --git a/virtue-signaling.md b/virtue signaling.md similarity index 100% rename from virtue-signaling.md rename to virtue signaling.md diff --git a/vocdoni-io.md b/vocdoni io.md similarity index 100% rename from vocdoni-io.md rename to vocdoni io.md diff --git a/voltairine-de-cleyre-.md b/voltairine de cleyre .md similarity index 100% rename from voltairine-de-cleyre-.md rename to voltairine de cleyre .md diff --git a/vscode-extension.md b/vscode extension.md similarity index 100% rename from vscode-extension.md rename to vscode extension.md diff --git a/vscode-settings-sync.md b/vscode settings sync.md similarity index 100% rename from vscode-settings-sync.md rename to vscode settings sync.md diff --git a/walter-benjamin.md b/walter benjamin.md similarity index 100% rename from walter-benjamin.md rename to walter benjamin.md diff --git a/ward-cunningham.md b/ward cunningham.md similarity index 100% rename from ward-cunningham.md rename to ward cunningham.md diff --git a/warren-mcculloch.md b/warren mcculloch.md similarity index 100% rename from warren-mcculloch.md rename to warren mcculloch.md diff --git a/waterfall-chart.md b/waterfall chart.md similarity index 100% rename from waterfall-chart.md rename to waterfall chart.md diff --git a/waterfall-charts.md b/waterfall charts.md similarity index 100% rename from waterfall-charts.md rename to waterfall charts.md diff --git a/web-annotations.md b/web annotations.md similarity index 100% rename from web-annotations.md rename to web annotations.md diff --git a/web-browser.md b/web browser.md similarity index 100% rename from web-browser.md rename to web browser.md diff --git a/web-browsers.md b/web browsers.md similarity index 100% rename from web-browsers.md rename to web browsers.md diff --git a/web-dubois.md b/web dubois.md similarity index 100% rename from web-dubois.md rename to web dubois.md diff --git a/web-extension.md b/web extension.md similarity index 100% rename from web-extension.md rename to web extension.md diff --git a/web-extensions.md b/web extensions.md similarity index 100% rename from web-extensions.md rename to web extensions.md diff --git a/web-monetization.md b/web monetization.md similarity index 100% rename from web-monetization.md rename to web monetization.md diff --git a/week-12.md b/week 12.md similarity index 100% rename from week-12.md rename to week 12.md diff --git a/weekend-11.md b/weekend 11.md similarity index 100% rename from weekend-11.md rename to weekend 11.md diff --git a/weekend-17.md b/weekend 17.md similarity index 100% rename from weekend-17.md rename to weekend 17.md diff --git a/weekend-wednesday.md b/weekend wednesday.md similarity index 100% rename from weekend-wednesday.md rename to weekend wednesday.md diff --git a/weekly-plan.md b/weekly plan.md similarity index 100% rename from weekly-plan.md rename to weekly plan.md diff --git a/weekly-reviews.md b/weekly reviews.md similarity index 100% rename from weekly-reviews.md rename to weekly reviews.md diff --git a/welkin-core.md b/welkin core.md similarity index 100% rename from welkin-core.md rename to welkin core.md diff --git a/wendy-doniger.md b/wendy doniger.md similarity index 100% rename from wendy-doniger.md rename to wendy doniger.md diff --git a/wendy-hanamura.md b/wendy hanamura.md similarity index 100% rename from wendy-hanamura.md rename to wendy hanamura.md diff --git a/what-i-do-with-my-time-on-wednesdays.md b/what i do with my time on wednesdays.md similarity index 100% rename from what-i-do-with-my-time-on-wednesdays.md rename to what i do with my time on wednesdays.md diff --git a/what-is-a-distributed-knowledge-graph.md b/what is a distributed knowledge graph.md similarity index 100% rename from what-is-a-distributed-knowledge-graph.md rename to what is a distributed knowledge graph.md diff --git a/what-is-flancia-like.md b/what is flancia like.md similarity index 100% rename from what-is-flancia-like.md rename to what is flancia like.md diff --git a/what-shape-are-you.md b/what shape are you.md similarity index 100% rename from what-shape-are-you.md rename to what shape are you.md diff --git a/what-the-hell.md b/what the hell.md similarity index 100% rename from what-the-hell.md rename to what the hell.md diff --git a/where-did-software-go-wrong.md b/where did software go wrong.md similarity index 100% rename from where-did-software-go-wrong.md rename to where did software go wrong.md diff --git a/which-other-languages-should-you-learn-and-why.md b/which other languages should you learn and why.md similarity index 100% rename from which-other-languages-should-you-learn-and-why.md rename to which other languages should you learn and why.md diff --git a/whipping-privilege.md b/whipping privilege.md similarity index 100% rename from whipping-privilege.md rename to whipping privilege.md diff --git a/why-i-am-not-a-buddhist.md b/why i am not a buddhist.md similarity index 100% rename from why-i-am-not-a-buddhist.md rename to why i am not a buddhist.md diff --git a/why-worker-cooperatives-are-a-bad-strategy.md b/why worker cooperatives are a bad strategy.md similarity index 100% rename from why-worker-cooperatives-are-a-bad-strategy.md rename to why worker cooperatives are a bad strategy.md diff --git a/wiki-engines.md b/wiki engines.md similarity index 100% rename from wiki-engines.md rename to wiki engines.md diff --git a/wiki-modes.md b/wiki modes.md similarity index 100% rename from wiki-modes.md rename to wiki modes.md diff --git a/wikidata-integration.md b/wikidata integration.md similarity index 100% rename from wikidata-integration.md rename to wikidata integration.md diff --git a/wikidata-subsetting.md b/wikidata subsetting.md similarity index 100% rename from wikidata-subsetting.md rename to wikidata subsetting.md diff --git a/wikilinked-tools.md b/wikilinked tools.md similarity index 100% rename from wikilinked-tools.md rename to wikilinked tools.md diff --git a/wikilinking-tools.md b/wikilinking tools.md similarity index 100% rename from wikilinking-tools.md rename to wikilinking tools.md diff --git a/wikilinks-everywhere.md b/wikilinks everywhere.md similarity index 100% rename from wikilinks-everywhere.md rename to wikilinks everywhere.md diff --git a/will-walker.md b/will walker.md similarity index 100% rename from will-walker.md rename to will walker.md diff --git a/william-james.md b/william james.md similarity index 100% rename from william-james.md rename to william james.md diff --git a/william-macaskill.md b/william macaskill.md similarity index 100% rename from william-macaskill.md rename to william macaskill.md diff --git a/wilmer-van-der-gaast.md b/wilmer van der gaast.md similarity index 100% rename from wilmer-van-der-gaast.md rename to wilmer van der gaast.md diff --git a/window-manager.md b/window manager.md similarity index 100% rename from window-manager.md rename to window manager.md diff --git a/wittgenstein-plays-chess-with-marcel-duchamp.md b/wittgenstein plays chess with marcel duchamp.md similarity index 100% rename from wittgenstein-plays-chess-with-marcel-duchamp.md rename to wittgenstein plays chess with marcel duchamp.md diff --git a/wittgenstein-plays-chess.md b/wittgenstein plays chess.md similarity index 100% rename from wittgenstein-plays-chess.md rename to wittgenstein plays chess.md diff --git a/wittgenstein-protocol.md b/wittgenstein protocol.md similarity index 100% rename from wittgenstein-protocol.md rename to wittgenstein protocol.md diff --git a/wonder-me.md b/wonder me.md similarity index 100% rename from wonder-me.md rename to wonder me.md diff --git a/wong-kar-wai.md b/wong kar wai.md similarity index 100% rename from wong-kar-wai.md rename to wong kar wai.md diff --git a/work-after-work.md b/work after work.md similarity index 100% rename from work-after-work.md rename to work after work.md diff --git a/work-in-progress.md b/work in progress.md similarity index 100% rename from work-in-progress.md rename to work in progress.md diff --git a/work-in-public.md b/work in public.md similarity index 100% rename from work-in-public.md rename to work in public.md diff --git a/working-in-public.md b/working in public.md similarity index 100% rename from working-in-public.md rename to working in public.md diff --git a/world-building.md b/world building.md similarity index 100% rename from world-building.md rename to world building.md diff --git a/world-improvement.md b/world improvement.md similarity index 100% rename from world-improvement.md rename to world improvement.md diff --git a/world-university-and-school.md b/world university and school.md similarity index 100% rename from world-university-and-school.md rename to world university and school.md diff --git a/worry-dream.md b/worry dream.md similarity index 100% rename from worry-dream.md rename to worry dream.md diff --git a/write-freely.md b/write freely.md similarity index 100% rename from write-freely.md rename to write freely.md diff --git a/writing-is-an-aid-to-memory.md b/writing is an aid to memory.md similarity index 100% rename from writing-is-an-aid-to-memory.md rename to writing is an aid to memory.md diff --git a/wu-ming.md b/wu ming.md similarity index 100% rename from wu-ming.md rename to wu ming.md diff --git a/x-frame.md b/x frame.md similarity index 100% rename from x-frame.md rename to x frame.md diff --git a/yancey-strickler.md b/yancey strickler.md similarity index 100% rename from yancey-strickler.md rename to yancey strickler.md diff --git a/yoga-15.md b/yoga 15.md similarity index 100% rename from yoga-15.md rename to yoga 15.md diff --git a/yoga-17.md b/yoga 17.md similarity index 100% rename from yoga-17.md rename to yoga 17.md diff --git a/yoga-arrive.md b/yoga arrive.md similarity index 100% rename from yoga-arrive.md rename to yoga arrive.md diff --git a/yoga-arrivr.md b/yoga arrivr.md similarity index 100% rename from yoga-arrivr.md rename to yoga arrivr.md diff --git a/yoga-breath.md b/yoga breath.md similarity index 100% rename from yoga-breath.md rename to yoga breath.md diff --git a/yoga-butt-kicking.md b/yoga butt kicking.md similarity index 100% rename from yoga-butt-kicking.md rename to yoga butt kicking.md diff --git a/yoga-spinal-health.md b/yoga spinal health.md similarity index 100% rename from yoga-spinal-health.md rename to yoga spinal health.md diff --git a/yoga-with-adriene.md b/yoga with adriene.md similarity index 100% rename from yoga-with-adriene.md rename to yoga with adriene.md diff --git a/yotam-ottolenghi.md b/yotam ottolenghi.md similarity index 100% rename from yotam-ottolenghi.md rename to yotam ottolenghi.md diff --git a/youtube-channel.md b/youtube channel.md similarity index 100% rename from youtube-channel.md rename to youtube channel.md diff --git a/yuval-noah-harari.md b/yuval noah harari.md similarity index 100% rename from yuval-noah-harari.md rename to yuval noah harari.md diff --git a/zeitgeist-movement.md b/zeitgeist movement.md similarity index 100% rename from zeitgeist-movement.md rename to zeitgeist movement.md diff --git a/zen-mind-beginner-s-mind.md b/zen mind beginner s mind.md similarity index 100% rename from zen-mind-beginner-s-mind.md rename to zen mind beginner s mind.md diff --git a/zeta-mask-yo.md b/zeta mask yo.md similarity index 100% rename from zeta-mask-yo.md rename to zeta mask yo.md diff --git a/zoom-games.md b/zoom games.md similarity index 100% rename from zoom-games.md rename to zoom games.md diff --git a/zulip-matrix-bridge.md b/zulip matrix bridge.md similarity index 100% rename from zulip-matrix-bridge.md rename to zulip matrix bridge.md From 421490270b39672561c035f01ea4eb1fa996e116 Mon Sep 17 00:00:00 2001 From: Flancian <0@flancia.org> Date: Fri, 7 May 2021 21:35:43 +0200 Subject: [PATCH 2/2] Iso 8601 for dates. --- .obsidian/config | 1 + .obsidian/plugins/obsidian-git/main.js | 6523 ++++++++++++++++++ .obsidian/plugins/obsidian-git/manifest.json | 8 + .obsidian/workspace | 111 + 2020 04 03.md => 2020-04-03.md | 0 2020 04 05.md => 2020-04-05.md | 0 2020 04 06.md => 2020-04-06.md | 0 2020 04 07.md => 2020-04-07.md | 0 2020 04 09.md => 2020-04-09.md | 0 2020 04 10.md => 2020-04-10.md | 0 2020 04 11.md => 2020-04-11.md | 0 2020 04 12.md => 2020-04-12.md | 0 2020 04 13.md => 2020-04-13.md | 0 2020 04 17.md => 2020-04-17.md | 0 2020 04 18.md => 2020-04-18.md | 0 2020 04 19.md => 2020-04-19.md | 0 2020 04 22.md => 2020-04-22.md | 0 2020 04 23.md => 2020-04-23.md | 0 2020 04 24.md => 2020-04-24.md | 0 2020 04 25.md => 2020-04-25.md | 0 2020 04 26.md => 2020-04-26.md | 0 2020 04 27.md => 2020-04-27.md | 0 2020 05 01.md => 2020-05-01.md | 0 2020 05 02.md => 2020-05-02.md | 0 2020 05 03.md => 2020-05-03.md | 0 2020 05 04.md => 2020-05-04.md | 0 2020 05 05.md => 2020-05-05.md | 0 2020 05 06.md => 2020-05-06.md | 0 2020 05 07.md => 2020-05-07.md | 0 2020 05 08.md => 2020-05-08.md | 0 2020 05 09.md => 2020-05-09.md | 0 2020 05 10.md => 2020-05-10.md | 0 2020 05 15.md => 2020-05-15.md | 0 2020 05 16.md => 2020-05-16.md | 0 2020 05 17.md => 2020-05-17.md | 0 2020 05 18.md => 2020-05-18.md | 0 2020 05 19.md => 2020-05-19.md | 0 2020 05 20.md => 2020-05-20.md | 0 2020 05 21.md => 2020-05-21.md | 0 2020 05 22.md => 2020-05-22.md | 0 2020 05 23.md => 2020-05-23.md | 0 2020 05 24.md => 2020-05-24.md | 0 2020 06 01.md => 2020-06-01.md | 0 2020 06 02.md => 2020-06-02.md | 0 2020 06 03.md => 2020-06-03.md | 0 2020 06 04.md => 2020-06-04.md | 0 2020 06 06.md => 2020-06-06.md | 0 2020 06 07.md => 2020-06-07.md | 0 2020 06 08.md => 2020-06-08.md | 0 2020 06 09.md => 2020-06-09.md | 0 2020 06 10.md => 2020-06-10.md | 0 2020 06 11.md => 2020-06-11.md | 0 2020 06 12.md => 2020-06-12.md | 0 2020 06 13.md => 2020-06-13.md | 0 2020 06 14.md => 2020-06-14.md | 0 2020 06 15.md => 2020-06-15.md | 0 2020 06 16.md => 2020-06-16.md | 0 2020 06 17.md => 2020-06-17.md | 0 2020 06 18.md => 2020-06-18.md | 0 2020 06 19.md => 2020-06-19.md | 0 2020 06 20.md => 2020-06-20.md | 0 2020 06 21.md => 2020-06-21.md | 0 2020 06 24.md => 2020-06-24.md | 0 2020 06 27.md => 2020-06-27.md | 0 2020 06 28.md => 2020-06-28.md | 0 2020 06 29.md => 2020-06-29.md | 0 2020 07 04.md => 2020-07-04.md | 0 2020 07 05.md => 2020-07-05.md | 0 2020 07 06.md => 2020-07-06.md | 0 2020 07 07.md => 2020-07-07.md | 0 2020 07 08.md => 2020-07-08.md | 0 2020 07 09.md => 2020-07-09.md | 0 2020 07 10.md => 2020-07-10.md | 0 2020 07 11.md => 2020-07-11.md | 0 2020 07 12.md => 2020-07-12.md | 0 2020 07 14.md => 2020-07-14.md | 0 2020 07 15.md => 2020-07-15.md | 0 2020 07 16.md => 2020-07-16.md | 0 2020 07 17.md => 2020-07-17.md | 0 2020 07 18.md => 2020-07-18.md | 0 2020 07 19.md => 2020-07-19.md | 0 2020 07 20.md => 2020-07-20.md | 0 2020 07 21.md => 2020-07-21.md | 0 2020 07 22.md => 2020-07-22.md | 0 2020 07 23.md => 2020-07-23.md | 0 2020 07 24.md => 2020-07-24.md | 0 2020 07 25.md => 2020-07-25.md | 0 2020 07 26.md => 2020-07-26.md | 0 2020 07 27.md => 2020-07-27.md | 0 2020 07 29.md => 2020-07-29.md | 0 2020 07 30.md => 2020-07-30.md | 0 2020 07 31.md => 2020-07-31.md | 0 2020 08 01.md => 2020-08-01.md | 0 2020 08 02.md => 2020-08-02.md | 0 2020 08 03.md => 2020-08-03.md | 0 2020 08 04.md => 2020-08-04.md | 0 2020 08 05.md => 2020-08-05.md | 0 2020 08 06.md => 2020-08-06.md | 0 2020 08 07.md => 2020-08-07.md | 0 2020 08 08.md => 2020-08-08.md | 0 2020 08 09.md => 2020-08-09.md | 0 2020 08 10.md => 2020-08-10.md | 0 2020 08 11.md => 2020-08-11.md | 0 2020 08 12.md => 2020-08-12.md | 0 2020 08 13.md => 2020-08-13.md | 0 2020 08 14.md => 2020-08-14.md | 0 2020 08 15.md => 2020-08-15.md | 0 2020 08 16.md => 2020-08-16.md | 0 2020 08 17.md => 2020-08-17.md | 0 2020 08 18.md => 2020-08-18.md | 0 2020 08 19.md => 2020-08-19.md | 0 2020 08 20.md => 2020-08-20.md | 0 2020 08 21.md => 2020-08-21.md | 0 2020 08 22.md => 2020-08-22.md | 0 2020 08 23.md => 2020-08-23.md | 0 2020 08 24.md => 2020-08-24.md | 0 2020 08 25.md => 2020-08-25.md | 0 2020 08 26.md => 2020-08-26.md | 0 2020 08 27.md => 2020-08-27.md | 0 2020 08 28.md => 2020-08-28.md | 0 2020 08 29.md => 2020-08-29.md | 0 2020 08 30.md => 2020-08-30.md | 0 2020 08 31.md => 2020-08-31.md | 0 2020 09 01.md => 2020-09-01.md | 0 2020 09 02.md => 2020-09-02.md | 0 2020 09 03.md => 2020-09-03.md | 0 2020 09 04.md => 2020-09-04.md | 0 2020 09 05.md => 2020-09-05.md | 0 2020 09 06.md => 2020-09-06.md | 0 2020 09 07.md => 2020-09-07.md | 0 2020 09 08.md => 2020-09-08.md | 0 2020 09 09.md => 2020-09-09.md | 0 2020 09 10.md => 2020-09-10.md | 0 2020 09 11.md => 2020-09-11.md | 0 2020 09 12.md => 2020-09-12.md | 0 2020 09 13.md => 2020-09-13.md | 0 2020 09 14.md => 2020-09-14.md | 0 2020 09 15.md => 2020-09-15.md | 0 2020 09 16.md => 2020-09-16.md | 0 2020 09 17.md => 2020-09-17.md | 0 2020 09 18.md => 2020-09-18.md | 0 2020 09 19.md => 2020-09-19.md | 0 2020 09 20.md => 2020-09-20.md | 0 2020 09 21.md => 2020-09-21.md | 0 2020 09 22.md => 2020-09-22.md | 0 2020 09 23.md => 2020-09-23.md | 0 2020 09 24.md => 2020-09-24.md | 0 2020 09 25.md => 2020-09-25.md | 0 2020 09 26.md => 2020-09-26.md | 0 2020 09 27.md => 2020-09-27.md | 0 2020 09 28.md => 2020-09-28.md | 0 2020 09 29.md => 2020-09-29.md | 0 2020 09 30.md => 2020-09-30.md | 0 2020 10 01.md => 2020-10-01.md | 0 2020 10 02.md => 2020-10-02.md | 0 2020 10 03.md => 2020-10-03.md | 0 2020 10 04.md => 2020-10-04.md | 0 2020 10 05.md => 2020-10-05.md | 0 2020 10 06.md => 2020-10-06.md | 0 2020 10 07.md => 2020-10-07.md | 0 2020 10 08.md => 2020-10-08.md | 0 2020 10 09.md => 2020-10-09.md | 0 2020 10 10.md => 2020-10-10.md | 0 2020 10 11.md => 2020-10-11.md | 0 2020 10 12.md => 2020-10-12.md | 0 2020 10 13.md => 2020-10-13.md | 0 2020 10 14.md => 2020-10-14.md | 0 2020 10 15.md => 2020-10-15.md | 0 2020 10 16.md => 2020-10-16.md | 0 2020 10 17.md => 2020-10-17.md | 0 2020 10 18.md => 2020-10-18.md | 0 2020 10 19.md => 2020-10-19.md | 0 2020 10 20.md => 2020-10-20.md | 0 2020 10 21.md => 2020-10-21.md | 0 2020 10 22.md => 2020-10-22.md | 0 2020 10 23.md => 2020-10-23.md | 0 2020 10 24.md => 2020-10-24.md | 0 2020 10 25.md => 2020-10-25.md | 0 2020 10 26.md => 2020-10-26.md | 0 2020 10 27.md => 2020-10-27.md | 0 2020 10 28.md => 2020-10-28.md | 0 2020 10 29.md => 2020-10-29.md | 0 2020 10 30.md => 2020-10-30.md | 0 2020 10 31.md => 2020-10-31.md | 0 2020 11 01.md => 2020-11-01.md | 0 2020 11 02.md => 2020-11-02.md | 0 2020 11 03.md => 2020-11-03.md | 0 2020 11 04.md => 2020-11-04.md | 0 2020 11 05.md => 2020-11-05.md | 0 2020 11 06.md => 2020-11-06.md | 0 2020 11 07.md => 2020-11-07.md | 0 2020 11 08.md => 2020-11-08.md | 0 2020 11 09.md => 2020-11-09.md | 0 2020 11 10.md => 2020-11-10.md | 0 2020 11 11.md => 2020-11-11.md | 0 2020 11 12.md => 2020-11-12.md | 0 2020 11 13.md => 2020-11-13.md | 0 2020 11 14.md => 2020-11-14.md | 0 2020 11 15.md => 2020-11-15.md | 0 2020 11 16.md => 2020-11-16.md | 0 2020 11 17.md => 2020-11-17.md | 0 2020 11 18.md => 2020-11-18.md | 0 2020 11 19.md => 2020-11-19.md | 0 2020 11 20.md => 2020-11-20.md | 0 2020 11 21.md => 2020-11-21.md | 0 2020 11 22.md => 2020-11-22.md | 0 2020 11 23.md => 2020-11-23.md | 0 2020 11 24.md => 2020-11-24.md | 0 2020 11 25.md => 2020-11-25.md | 0 2020 11 26.md => 2020-11-26.md | 0 2020 11 27.md => 2020-11-27.md | 0 2020 11 28.md => 2020-11-28.md | 0 2020 11 29.md => 2020-11-29.md | 0 2020 11 30.md => 2020-11-30.md | 0 2020 12 01.md => 2020-12-01.md | 0 2020 12 02.md => 2020-12-02.md | 0 2020 12 03.md => 2020-12-03.md | 0 2020 12 04.md => 2020-12-04.md | 0 2020 12 05.md => 2020-12-05.md | 0 2020 12 06.md => 2020-12-06.md | 0 2020 12 07.md => 2020-12-07.md | 0 2020 12 08.md => 2020-12-08.md | 0 2020 12 09.md => 2020-12-09.md | 0 2020 12 10.md => 2020-12-10.md | 0 2020 12 11.md => 2020-12-11.md | 0 2020 12 12.md => 2020-12-12.md | 0 2020 12 13.md => 2020-12-13.md | 0 2020 12 14.md => 2020-12-14.md | 0 2020 12 15.md => 2020-12-15.md | 0 2020 12 16.md => 2020-12-16.md | 0 2020 12 17.md => 2020-12-17.md | 0 2020 12 18.md => 2020-12-18.md | 0 2020 12 19.md => 2020-12-19.md | 0 2020 12 20.md => 2020-12-20.md | 0 2020 12 21.md => 2020-12-21.md | 0 2020 12 22.md => 2020-12-22.md | 0 2020 12 23.md => 2020-12-23.md | 0 2020 12 24.md => 2020-12-24.md | 0 2020 12 25.md => 2020-12-25.md | 0 2020 12 26.md => 2020-12-26.md | 0 2020 12 27.md => 2020-12-27.md | 0 2020 12 28.md => 2020-12-28.md | 0 2020 12 29.md => 2020-12-29.md | 0 2020 12 30.md => 2020-12-30.md | 0 2020 12 31.md => 2020-12-31.md | 0 2021 01 01.md => 2021-01-01.md | 0 2021 01 02.md => 2021-01-02.md | 0 2021 01 03.md => 2021-01-03.md | 0 2021 01 04.md => 2021-01-04.md | 0 2021 01 05.md => 2021-01-05.md | 0 2021 01 06.md => 2021-01-06.md | 0 2021 01 07.md => 2021-01-07.md | 0 2021 01 08.md => 2021-01-08.md | 0 2021 01 09.md => 2021-01-09.md | 0 2021 01 10.md => 2021-01-10.md | 0 2021 01 11.md => 2021-01-11.md | 0 2021 01 12.md => 2021-01-12.md | 0 2021 01 13.md => 2021-01-13.md | 0 2021 01 14.md => 2021-01-14.md | 0 2021 01 15.md => 2021-01-15.md | 0 2021 01 16.md => 2021-01-16.md | 0 2021 01 17.md => 2021-01-17.md | 0 2021 01 18.md => 2021-01-18.md | 0 2021 01 19.md => 2021-01-19.md | 0 2021 01 20.md => 2021-01-20.md | 0 2021 01 21.md => 2021-01-21.md | 0 2021 01 22.md => 2021-01-22.md | 0 2021 01 23.md => 2021-01-23.md | 0 2021 01 24.md => 2021-01-24.md | 0 2021 01 25.md => 2021-01-25.md | 0 2021 01 26.md => 2021-01-26.md | 0 2021 01 27.md => 2021-01-27.md | 0 2021 01 28.md => 2021-01-28.md | 0 2021 01 29.md => 2021-01-29.md | 0 2021 01 30.md => 2021-01-30.md | 0 2021 01 31.md => 2021-01-31.md | 0 2021 02 01.md => 2021-02-01.md | 0 2021 02 02.md => 2021-02-02.md | 0 2021 02 03.md => 2021-02-03.md | 0 2021 02 04.md => 2021-02-04.md | 0 2021 02 05.md => 2021-02-05.md | 0 2021 02 06.md => 2021-02-06.md | 0 2021 02 07.md => 2021-02-07.md | 0 2021 02 08.md => 2021-02-08.md | 0 2021 02 09.md => 2021-02-09.md | 0 2021 02 10.md => 2021-02-10.md | 0 2021 02 11.md => 2021-02-11.md | 0 2021 02 12.md => 2021-02-12.md | 0 2021 02 13.md => 2021-02-13.md | 0 2021 02 14.md => 2021-02-14.md | 0 2021 02 15.md => 2021-02-15.md | 0 2021 02 16.md => 2021-02-16.md | 0 2021 02 17.md => 2021-02-17.md | 0 2021 02 18.md => 2021-02-18.md | 0 2021 02 19.md => 2021-02-19.md | 0 2021 02 20.md => 2021-02-20.md | 0 2021 02 21.md => 2021-02-21.md | 0 2021 02 22.md => 2021-02-22.md | 0 2021 02 23.md => 2021-02-23.md | 0 2021 02 24.md => 2021-02-24.md | 0 2021 02 25.md => 2021-02-25.md | 0 2021 02 26.md => 2021-02-26.md | 0 2021 02 27.md => 2021-02-27.md | 0 2021 02 28.md => 2021-02-28.md | 0 2021 03 01.md => 2021-03-01.md | 0 2021 03 02.md => 2021-03-02.md | 0 2021 03 03.md => 2021-03-03.md | 0 2021 03 04.md => 2021-03-04.md | 0 2021 03 05.md => 2021-03-05.md | 0 2021 03 06.md => 2021-03-06.md | 0 2021 03 07.md => 2021-03-07.md | 0 2021 03 08.md => 2021-03-08.md | 0 2021 03 09.md => 2021-03-09.md | 0 2021 03 10.md => 2021-03-10.md | 0 2021 03 11.md => 2021-03-11.md | 0 2021 03 12.md => 2021-03-12.md | 0 2021 03 13.md => 2021-03-13.md | 0 2021 03 14.md => 2021-03-14.md | 0 2021 03 15.md => 2021-03-15.md | 0 2021 03 16.md => 2021-03-16.md | 0 2021 03 17.md => 2021-03-17.md | 0 2021 03 18.md => 2021-03-18.md | 0 2021 03 19.md => 2021-03-19.md | 0 2021 03 20.md => 2021-03-20.md | 0 2021 03 21.md => 2021-03-21.md | 0 2021 03 22.md => 2021-03-22.md | 0 2021 03 23.md => 2021-03-23.md | 0 2021 03 24.md => 2021-03-24.md | 0 2021 03 25.md => 2021-03-25.md | 0 2021 03 26.md => 2021-03-26.md | 0 2021 03 27.md => 2021-03-27.md | 0 2021 03 28.md => 2021-03-28.md | 0 2021 03 29.md => 2021-03-29.md | 0 2021 03 30.md => 2021-03-30.md | 0 2021 03 31.md => 2021-03-31.md | 0 2021 04 01.md => 2021-04-01.md | 0 2021 04 02.md => 2021-04-02.md | 0 2021 04 03.md => 2021-04-03.md | 0 2021 04 05.md => 2021-04-05.md | 0 2021 04 06.md => 2021-04-06.md | 0 2021 04 07.md => 2021-04-07.md | 0 2021 04 08.md => 2021-04-08.md | 0 2021 04 09.md => 2021-04-09.md | 0 2021 04 10.md => 2021-04-10.md | 0 2021 04 11.md => 2021-04-11.md | 0 2021 04 12.md => 2021-04-12.md | 0 2021 04 13.md => 2021-04-13.md | 0 2021 04 14.md => 2021-04-14.md | 0 2021 04 15.md => 2021-04-15.md | 0 2021 04 16.md => 2021-04-16.md | 0 2021 04 17.md => 2021-04-17.md | 0 2021 04 18.md => 2021-04-18.md | 0 2021 04 19.md => 2021-04-19.md | 0 2021 04 20.md => 2021-04-20.md | 0 2021 04 21.md => 2021-04-21.md | 0 2021 04 22.md => 2021-04-22.md | 0 2021 04 23.md => 2021-04-23.md | 0 2021 04 24.md => 2021-04-24.md | 0 2021 04 25.md => 2021-04-25.md | 0 2021 04 27.md => 2021-04-27.md | 0 2021 04 28.md => 2021-04-28.md | 0 2021 04 29.md => 2021-04-29.md | 0 2021 04 30.md => 2021-04-30.md | 0 2021 05 01.md => 2021-05-01.md | 0 2021 05 02.md => 2021-05-02.md | 0 2021 05 03.md => 2021-05-03.md | 0 2021 05 04.md => 2021-05-04.md | 0 2021 05 05.md => 2021-05-05.md | 0 2021 05 06.md => 2021-05-06.md | 0 2021 05 07.md => 2021-05-07.md | 0 370 files changed, 6643 insertions(+) create mode 100644 .obsidian/config create mode 100644 .obsidian/plugins/obsidian-git/main.js create mode 100644 .obsidian/plugins/obsidian-git/manifest.json create mode 100644 .obsidian/workspace rename 2020 04 03.md => 2020-04-03.md (100%) rename 2020 04 05.md => 2020-04-05.md (100%) rename 2020 04 06.md => 2020-04-06.md (100%) rename 2020 04 07.md => 2020-04-07.md (100%) rename 2020 04 09.md => 2020-04-09.md (100%) rename 2020 04 10.md => 2020-04-10.md (100%) rename 2020 04 11.md => 2020-04-11.md (100%) rename 2020 04 12.md => 2020-04-12.md (100%) rename 2020 04 13.md => 2020-04-13.md (100%) rename 2020 04 17.md => 2020-04-17.md (100%) rename 2020 04 18.md => 2020-04-18.md (100%) rename 2020 04 19.md => 2020-04-19.md (100%) rename 2020 04 22.md => 2020-04-22.md (100%) rename 2020 04 23.md => 2020-04-23.md (100%) rename 2020 04 24.md => 2020-04-24.md (100%) rename 2020 04 25.md => 2020-04-25.md (100%) rename 2020 04 26.md => 2020-04-26.md (100%) rename 2020 04 27.md => 2020-04-27.md (100%) rename 2020 05 01.md => 2020-05-01.md (100%) rename 2020 05 02.md => 2020-05-02.md (100%) rename 2020 05 03.md => 2020-05-03.md (100%) rename 2020 05 04.md => 2020-05-04.md (100%) rename 2020 05 05.md => 2020-05-05.md (100%) rename 2020 05 06.md => 2020-05-06.md (100%) rename 2020 05 07.md => 2020-05-07.md (100%) rename 2020 05 08.md => 2020-05-08.md (100%) rename 2020 05 09.md => 2020-05-09.md (100%) rename 2020 05 10.md => 2020-05-10.md (100%) rename 2020 05 15.md => 2020-05-15.md (100%) rename 2020 05 16.md => 2020-05-16.md (100%) rename 2020 05 17.md => 2020-05-17.md (100%) rename 2020 05 18.md => 2020-05-18.md (100%) rename 2020 05 19.md => 2020-05-19.md (100%) rename 2020 05 20.md => 2020-05-20.md (100%) rename 2020 05 21.md => 2020-05-21.md (100%) rename 2020 05 22.md => 2020-05-22.md (100%) rename 2020 05 23.md => 2020-05-23.md (100%) rename 2020 05 24.md => 2020-05-24.md (100%) rename 2020 06 01.md => 2020-06-01.md (100%) rename 2020 06 02.md => 2020-06-02.md (100%) rename 2020 06 03.md => 2020-06-03.md (100%) rename 2020 06 04.md => 2020-06-04.md (100%) rename 2020 06 06.md => 2020-06-06.md (100%) rename 2020 06 07.md => 2020-06-07.md (100%) rename 2020 06 08.md => 2020-06-08.md (100%) rename 2020 06 09.md => 2020-06-09.md (100%) rename 2020 06 10.md => 2020-06-10.md (100%) rename 2020 06 11.md => 2020-06-11.md (100%) rename 2020 06 12.md => 2020-06-12.md (100%) rename 2020 06 13.md => 2020-06-13.md (100%) rename 2020 06 14.md => 2020-06-14.md (100%) rename 2020 06 15.md => 2020-06-15.md (100%) rename 2020 06 16.md => 2020-06-16.md (100%) rename 2020 06 17.md => 2020-06-17.md (100%) rename 2020 06 18.md => 2020-06-18.md (100%) rename 2020 06 19.md => 2020-06-19.md (100%) rename 2020 06 20.md => 2020-06-20.md (100%) rename 2020 06 21.md => 2020-06-21.md (100%) rename 2020 06 24.md => 2020-06-24.md (100%) rename 2020 06 27.md => 2020-06-27.md (100%) rename 2020 06 28.md => 2020-06-28.md (100%) rename 2020 06 29.md => 2020-06-29.md (100%) rename 2020 07 04.md => 2020-07-04.md (100%) rename 2020 07 05.md => 2020-07-05.md (100%) rename 2020 07 06.md => 2020-07-06.md (100%) rename 2020 07 07.md => 2020-07-07.md (100%) rename 2020 07 08.md => 2020-07-08.md (100%) rename 2020 07 09.md => 2020-07-09.md (100%) rename 2020 07 10.md => 2020-07-10.md (100%) rename 2020 07 11.md => 2020-07-11.md (100%) rename 2020 07 12.md => 2020-07-12.md (100%) rename 2020 07 14.md => 2020-07-14.md (100%) rename 2020 07 15.md => 2020-07-15.md (100%) rename 2020 07 16.md => 2020-07-16.md (100%) rename 2020 07 17.md => 2020-07-17.md (100%) rename 2020 07 18.md => 2020-07-18.md (100%) rename 2020 07 19.md => 2020-07-19.md (100%) rename 2020 07 20.md => 2020-07-20.md (100%) rename 2020 07 21.md => 2020-07-21.md (100%) rename 2020 07 22.md => 2020-07-22.md (100%) rename 2020 07 23.md => 2020-07-23.md (100%) rename 2020 07 24.md => 2020-07-24.md (100%) rename 2020 07 25.md => 2020-07-25.md (100%) rename 2020 07 26.md => 2020-07-26.md (100%) rename 2020 07 27.md => 2020-07-27.md (100%) rename 2020 07 29.md => 2020-07-29.md (100%) rename 2020 07 30.md => 2020-07-30.md (100%) rename 2020 07 31.md => 2020-07-31.md (100%) rename 2020 08 01.md => 2020-08-01.md (100%) rename 2020 08 02.md => 2020-08-02.md (100%) rename 2020 08 03.md => 2020-08-03.md (100%) rename 2020 08 04.md => 2020-08-04.md (100%) rename 2020 08 05.md => 2020-08-05.md (100%) rename 2020 08 06.md => 2020-08-06.md (100%) rename 2020 08 07.md => 2020-08-07.md (100%) rename 2020 08 08.md => 2020-08-08.md (100%) rename 2020 08 09.md => 2020-08-09.md (100%) rename 2020 08 10.md => 2020-08-10.md (100%) rename 2020 08 11.md => 2020-08-11.md (100%) rename 2020 08 12.md => 2020-08-12.md (100%) rename 2020 08 13.md => 2020-08-13.md (100%) rename 2020 08 14.md => 2020-08-14.md (100%) rename 2020 08 15.md => 2020-08-15.md (100%) rename 2020 08 16.md => 2020-08-16.md (100%) rename 2020 08 17.md => 2020-08-17.md (100%) rename 2020 08 18.md => 2020-08-18.md (100%) rename 2020 08 19.md => 2020-08-19.md (100%) rename 2020 08 20.md => 2020-08-20.md (100%) rename 2020 08 21.md => 2020-08-21.md (100%) rename 2020 08 22.md => 2020-08-22.md (100%) rename 2020 08 23.md => 2020-08-23.md (100%) rename 2020 08 24.md => 2020-08-24.md (100%) rename 2020 08 25.md => 2020-08-25.md (100%) rename 2020 08 26.md => 2020-08-26.md (100%) rename 2020 08 27.md => 2020-08-27.md (100%) rename 2020 08 28.md => 2020-08-28.md (100%) rename 2020 08 29.md => 2020-08-29.md (100%) rename 2020 08 30.md => 2020-08-30.md (100%) rename 2020 08 31.md => 2020-08-31.md (100%) rename 2020 09 01.md => 2020-09-01.md (100%) rename 2020 09 02.md => 2020-09-02.md (100%) rename 2020 09 03.md => 2020-09-03.md (100%) rename 2020 09 04.md => 2020-09-04.md (100%) rename 2020 09 05.md => 2020-09-05.md (100%) rename 2020 09 06.md => 2020-09-06.md (100%) rename 2020 09 07.md => 2020-09-07.md (100%) rename 2020 09 08.md => 2020-09-08.md (100%) rename 2020 09 09.md => 2020-09-09.md (100%) rename 2020 09 10.md => 2020-09-10.md (100%) rename 2020 09 11.md => 2020-09-11.md (100%) rename 2020 09 12.md => 2020-09-12.md (100%) rename 2020 09 13.md => 2020-09-13.md (100%) rename 2020 09 14.md => 2020-09-14.md (100%) rename 2020 09 15.md => 2020-09-15.md (100%) rename 2020 09 16.md => 2020-09-16.md (100%) rename 2020 09 17.md => 2020-09-17.md (100%) rename 2020 09 18.md => 2020-09-18.md (100%) rename 2020 09 19.md => 2020-09-19.md (100%) rename 2020 09 20.md => 2020-09-20.md (100%) rename 2020 09 21.md => 2020-09-21.md (100%) rename 2020 09 22.md => 2020-09-22.md (100%) rename 2020 09 23.md => 2020-09-23.md (100%) rename 2020 09 24.md => 2020-09-24.md (100%) rename 2020 09 25.md => 2020-09-25.md (100%) rename 2020 09 26.md => 2020-09-26.md (100%) rename 2020 09 27.md => 2020-09-27.md (100%) rename 2020 09 28.md => 2020-09-28.md (100%) rename 2020 09 29.md => 2020-09-29.md (100%) rename 2020 09 30.md => 2020-09-30.md (100%) rename 2020 10 01.md => 2020-10-01.md (100%) rename 2020 10 02.md => 2020-10-02.md (100%) rename 2020 10 03.md => 2020-10-03.md (100%) rename 2020 10 04.md => 2020-10-04.md (100%) rename 2020 10 05.md => 2020-10-05.md (100%) rename 2020 10 06.md => 2020-10-06.md (100%) rename 2020 10 07.md => 2020-10-07.md (100%) rename 2020 10 08.md => 2020-10-08.md (100%) rename 2020 10 09.md => 2020-10-09.md (100%) rename 2020 10 10.md => 2020-10-10.md (100%) rename 2020 10 11.md => 2020-10-11.md (100%) rename 2020 10 12.md => 2020-10-12.md (100%) rename 2020 10 13.md => 2020-10-13.md (100%) rename 2020 10 14.md => 2020-10-14.md (100%) rename 2020 10 15.md => 2020-10-15.md (100%) rename 2020 10 16.md => 2020-10-16.md (100%) rename 2020 10 17.md => 2020-10-17.md (100%) rename 2020 10 18.md => 2020-10-18.md (100%) rename 2020 10 19.md => 2020-10-19.md (100%) rename 2020 10 20.md => 2020-10-20.md (100%) rename 2020 10 21.md => 2020-10-21.md (100%) rename 2020 10 22.md => 2020-10-22.md (100%) rename 2020 10 23.md => 2020-10-23.md (100%) rename 2020 10 24.md => 2020-10-24.md (100%) rename 2020 10 25.md => 2020-10-25.md (100%) rename 2020 10 26.md => 2020-10-26.md (100%) rename 2020 10 27.md => 2020-10-27.md (100%) rename 2020 10 28.md => 2020-10-28.md (100%) rename 2020 10 29.md => 2020-10-29.md (100%) rename 2020 10 30.md => 2020-10-30.md (100%) rename 2020 10 31.md => 2020-10-31.md (100%) rename 2020 11 01.md => 2020-11-01.md (100%) rename 2020 11 02.md => 2020-11-02.md (100%) rename 2020 11 03.md => 2020-11-03.md (100%) rename 2020 11 04.md => 2020-11-04.md (100%) rename 2020 11 05.md => 2020-11-05.md (100%) rename 2020 11 06.md => 2020-11-06.md (100%) rename 2020 11 07.md => 2020-11-07.md (100%) rename 2020 11 08.md => 2020-11-08.md (100%) rename 2020 11 09.md => 2020-11-09.md (100%) rename 2020 11 10.md => 2020-11-10.md (100%) rename 2020 11 11.md => 2020-11-11.md (100%) rename 2020 11 12.md => 2020-11-12.md (100%) rename 2020 11 13.md => 2020-11-13.md (100%) rename 2020 11 14.md => 2020-11-14.md (100%) rename 2020 11 15.md => 2020-11-15.md (100%) rename 2020 11 16.md => 2020-11-16.md (100%) rename 2020 11 17.md => 2020-11-17.md (100%) rename 2020 11 18.md => 2020-11-18.md (100%) rename 2020 11 19.md => 2020-11-19.md (100%) rename 2020 11 20.md => 2020-11-20.md (100%) rename 2020 11 21.md => 2020-11-21.md (100%) rename 2020 11 22.md => 2020-11-22.md (100%) rename 2020 11 23.md => 2020-11-23.md (100%) rename 2020 11 24.md => 2020-11-24.md (100%) rename 2020 11 25.md => 2020-11-25.md (100%) rename 2020 11 26.md => 2020-11-26.md (100%) rename 2020 11 27.md => 2020-11-27.md (100%) rename 2020 11 28.md => 2020-11-28.md (100%) rename 2020 11 29.md => 2020-11-29.md (100%) rename 2020 11 30.md => 2020-11-30.md (100%) rename 2020 12 01.md => 2020-12-01.md (100%) rename 2020 12 02.md => 2020-12-02.md (100%) rename 2020 12 03.md => 2020-12-03.md (100%) rename 2020 12 04.md => 2020-12-04.md (100%) rename 2020 12 05.md => 2020-12-05.md (100%) rename 2020 12 06.md => 2020-12-06.md (100%) rename 2020 12 07.md => 2020-12-07.md (100%) rename 2020 12 08.md => 2020-12-08.md (100%) rename 2020 12 09.md => 2020-12-09.md (100%) rename 2020 12 10.md => 2020-12-10.md (100%) rename 2020 12 11.md => 2020-12-11.md (100%) rename 2020 12 12.md => 2020-12-12.md (100%) rename 2020 12 13.md => 2020-12-13.md (100%) rename 2020 12 14.md => 2020-12-14.md (100%) rename 2020 12 15.md => 2020-12-15.md (100%) rename 2020 12 16.md => 2020-12-16.md (100%) rename 2020 12 17.md => 2020-12-17.md (100%) rename 2020 12 18.md => 2020-12-18.md (100%) rename 2020 12 19.md => 2020-12-19.md (100%) rename 2020 12 20.md => 2020-12-20.md (100%) rename 2020 12 21.md => 2020-12-21.md (100%) rename 2020 12 22.md => 2020-12-22.md (100%) rename 2020 12 23.md => 2020-12-23.md (100%) rename 2020 12 24.md => 2020-12-24.md (100%) rename 2020 12 25.md => 2020-12-25.md (100%) rename 2020 12 26.md => 2020-12-26.md (100%) rename 2020 12 27.md => 2020-12-27.md (100%) rename 2020 12 28.md => 2020-12-28.md (100%) rename 2020 12 29.md => 2020-12-29.md (100%) rename 2020 12 30.md => 2020-12-30.md (100%) rename 2020 12 31.md => 2020-12-31.md (100%) rename 2021 01 01.md => 2021-01-01.md (100%) rename 2021 01 02.md => 2021-01-02.md (100%) rename 2021 01 03.md => 2021-01-03.md (100%) rename 2021 01 04.md => 2021-01-04.md (100%) rename 2021 01 05.md => 2021-01-05.md (100%) rename 2021 01 06.md => 2021-01-06.md (100%) rename 2021 01 07.md => 2021-01-07.md (100%) rename 2021 01 08.md => 2021-01-08.md (100%) rename 2021 01 09.md => 2021-01-09.md (100%) rename 2021 01 10.md => 2021-01-10.md (100%) rename 2021 01 11.md => 2021-01-11.md (100%) rename 2021 01 12.md => 2021-01-12.md (100%) rename 2021 01 13.md => 2021-01-13.md (100%) rename 2021 01 14.md => 2021-01-14.md (100%) rename 2021 01 15.md => 2021-01-15.md (100%) rename 2021 01 16.md => 2021-01-16.md (100%) rename 2021 01 17.md => 2021-01-17.md (100%) rename 2021 01 18.md => 2021-01-18.md (100%) rename 2021 01 19.md => 2021-01-19.md (100%) rename 2021 01 20.md => 2021-01-20.md (100%) rename 2021 01 21.md => 2021-01-21.md (100%) rename 2021 01 22.md => 2021-01-22.md (100%) rename 2021 01 23.md => 2021-01-23.md (100%) rename 2021 01 24.md => 2021-01-24.md (100%) rename 2021 01 25.md => 2021-01-25.md (100%) rename 2021 01 26.md => 2021-01-26.md (100%) rename 2021 01 27.md => 2021-01-27.md (100%) rename 2021 01 28.md => 2021-01-28.md (100%) rename 2021 01 29.md => 2021-01-29.md (100%) rename 2021 01 30.md => 2021-01-30.md (100%) rename 2021 01 31.md => 2021-01-31.md (100%) rename 2021 02 01.md => 2021-02-01.md (100%) rename 2021 02 02.md => 2021-02-02.md (100%) rename 2021 02 03.md => 2021-02-03.md (100%) rename 2021 02 04.md => 2021-02-04.md (100%) rename 2021 02 05.md => 2021-02-05.md (100%) rename 2021 02 06.md => 2021-02-06.md (100%) rename 2021 02 07.md => 2021-02-07.md (100%) rename 2021 02 08.md => 2021-02-08.md (100%) rename 2021 02 09.md => 2021-02-09.md (100%) rename 2021 02 10.md => 2021-02-10.md (100%) rename 2021 02 11.md => 2021-02-11.md (100%) rename 2021 02 12.md => 2021-02-12.md (100%) rename 2021 02 13.md => 2021-02-13.md (100%) rename 2021 02 14.md => 2021-02-14.md (100%) rename 2021 02 15.md => 2021-02-15.md (100%) rename 2021 02 16.md => 2021-02-16.md (100%) rename 2021 02 17.md => 2021-02-17.md (100%) rename 2021 02 18.md => 2021-02-18.md (100%) rename 2021 02 19.md => 2021-02-19.md (100%) rename 2021 02 20.md => 2021-02-20.md (100%) rename 2021 02 21.md => 2021-02-21.md (100%) rename 2021 02 22.md => 2021-02-22.md (100%) rename 2021 02 23.md => 2021-02-23.md (100%) rename 2021 02 24.md => 2021-02-24.md (100%) rename 2021 02 25.md => 2021-02-25.md (100%) rename 2021 02 26.md => 2021-02-26.md (100%) rename 2021 02 27.md => 2021-02-27.md (100%) rename 2021 02 28.md => 2021-02-28.md (100%) rename 2021 03 01.md => 2021-03-01.md (100%) rename 2021 03 02.md => 2021-03-02.md (100%) rename 2021 03 03.md => 2021-03-03.md (100%) rename 2021 03 04.md => 2021-03-04.md (100%) rename 2021 03 05.md => 2021-03-05.md (100%) rename 2021 03 06.md => 2021-03-06.md (100%) rename 2021 03 07.md => 2021-03-07.md (100%) rename 2021 03 08.md => 2021-03-08.md (100%) rename 2021 03 09.md => 2021-03-09.md (100%) rename 2021 03 10.md => 2021-03-10.md (100%) rename 2021 03 11.md => 2021-03-11.md (100%) rename 2021 03 12.md => 2021-03-12.md (100%) rename 2021 03 13.md => 2021-03-13.md (100%) rename 2021 03 14.md => 2021-03-14.md (100%) rename 2021 03 15.md => 2021-03-15.md (100%) rename 2021 03 16.md => 2021-03-16.md (100%) rename 2021 03 17.md => 2021-03-17.md (100%) rename 2021 03 18.md => 2021-03-18.md (100%) rename 2021 03 19.md => 2021-03-19.md (100%) rename 2021 03 20.md => 2021-03-20.md (100%) rename 2021 03 21.md => 2021-03-21.md (100%) rename 2021 03 22.md => 2021-03-22.md (100%) rename 2021 03 23.md => 2021-03-23.md (100%) rename 2021 03 24.md => 2021-03-24.md (100%) rename 2021 03 25.md => 2021-03-25.md (100%) rename 2021 03 26.md => 2021-03-26.md (100%) rename 2021 03 27.md => 2021-03-27.md (100%) rename 2021 03 28.md => 2021-03-28.md (100%) rename 2021 03 29.md => 2021-03-29.md (100%) rename 2021 03 30.md => 2021-03-30.md (100%) rename 2021 03 31.md => 2021-03-31.md (100%) rename 2021 04 01.md => 2021-04-01.md (100%) rename 2021 04 02.md => 2021-04-02.md (100%) rename 2021 04 03.md => 2021-04-03.md (100%) rename 2021 04 05.md => 2021-04-05.md (100%) rename 2021 04 06.md => 2021-04-06.md (100%) rename 2021 04 07.md => 2021-04-07.md (100%) rename 2021 04 08.md => 2021-04-08.md (100%) rename 2021 04 09.md => 2021-04-09.md (100%) rename 2021 04 10.md => 2021-04-10.md (100%) rename 2021 04 11.md => 2021-04-11.md (100%) rename 2021 04 12.md => 2021-04-12.md (100%) rename 2021 04 13.md => 2021-04-13.md (100%) rename 2021 04 14.md => 2021-04-14.md (100%) rename 2021 04 15.md => 2021-04-15.md (100%) rename 2021 04 16.md => 2021-04-16.md (100%) rename 2021 04 17.md => 2021-04-17.md (100%) rename 2021 04 18.md => 2021-04-18.md (100%) rename 2021 04 19.md => 2021-04-19.md (100%) rename 2021 04 20.md => 2021-04-20.md (100%) rename 2021 04 21.md => 2021-04-21.md (100%) rename 2021 04 22.md => 2021-04-22.md (100%) rename 2021 04 23.md => 2021-04-23.md (100%) rename 2021 04 24.md => 2021-04-24.md (100%) rename 2021 04 25.md => 2021-04-25.md (100%) rename 2021 04 27.md => 2021-04-27.md (100%) rename 2021 04 28.md => 2021-04-28.md (100%) rename 2021 04 29.md => 2021-04-29.md (100%) rename 2021 04 30.md => 2021-04-30.md (100%) rename 2021 05 01.md => 2021-05-01.md (100%) rename 2021 05 02.md => 2021-05-02.md (100%) rename 2021 05 03.md => 2021-05-03.md (100%) rename 2021 05 04.md => 2021-05-04.md (100%) rename 2021 05 05.md => 2021-05-05.md (100%) rename 2021 05 06.md => 2021-05-06.md (100%) rename 2021 05 07.md => 2021-05-07.md (100%) diff --git a/.obsidian/config b/.obsidian/config new file mode 100644 index 000000000..05b6d2862 --- /dev/null +++ b/.obsidian/config @@ -0,0 +1 @@ +{"pluginEnabledStatus":{"file-explorer":true,"global-search":true,"switcher":true,"graph":true,"backlink":true,"command-palette":true,"markdown-importer":true,"word-count":true,"open-with-default-app":true,"file-recovery":true,"daily-notes":true,"templates":true,"random-note":true,"outline":true,"audio-recorder":true,"starred":true,"page-preview":true,"tag-pane":false},"vimMode":true,"strictLineBreaks":false,"enabledPlugins":[],"hotkeys":{"daily-notes":[{"modifiers":["Alt"],"key":"D"}],"daily-notes:goto-prev":[{"modifiers":["Alt"],"key":"Y"}],"daily-notes:goto-next":[{"modifiers":["Alt"],"key":"T"}]}} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-git/main.js b/.obsidian/plugins/obsidian-git/main.js new file mode 100644 index 000000000..843fc65f1 --- /dev/null +++ b/.obsidian/plugins/obsidian-git/main.js @@ -0,0 +1,6523 @@ +'use strict'; + +var child_process_1 = require('child_process'); +var obsidian = require('obsidian'); +var fs_1 = require('fs'); +var tty = require('tty'); +var util$1 = require('util'); +var os = require('os'); + +function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + +var child_process_1__default = /*#__PURE__*/_interopDefaultLegacy(child_process_1); +var fs_1__default = /*#__PURE__*/_interopDefaultLegacy(fs_1); +var tty__default = /*#__PURE__*/_interopDefaultLegacy(tty); +var util__default = /*#__PURE__*/_interopDefaultLegacy(util$1); +var os__default = /*#__PURE__*/_interopDefaultLegacy(os); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +function __spreadArray(to, from) { + for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) + to[j] = from[i]; + return to; +} + +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +function createCommonjsModule(fn, basedir, module) { + return module = { + path: basedir, + exports: {}, + require: function (path, base) { + return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); + } + }, fn(module, module.exports), module.exports; +} + +function commonjsRequire () { + throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); +} + +var gitError = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitError = void 0; +/** + * The `GitError` is thrown when the underlying `git` process throws a + * fatal exception (eg an `ENOENT` exception when attempting to use a + * non-writable directory as the root for your repo), and acts as the + * base class for more specific errors thrown by the parsing of the + * git response or errors in the configuration of the task about to + * be run. + * + * When an exception is thrown, pending tasks in the same instance will + * not be executed. The recommended way to run a series of tasks that + * can independently fail without needing to prevent future tasks from + * running is to catch them individually: + * + * ```typescript + import { gitP, SimpleGit, GitError, PullResult } from 'simple-git'; + + function catchTask (e: GitError) { + return e. + } + + const git = gitP(repoWorkingDir); + const pulled: PullResult | GitError = await git.pull().catch(catchTask); + const pushed: string | GitError = await git.pushTags().catch(catchTask); + ``` + */ +class GitError extends Error { + constructor(task, message) { + super(message); + this.task = task; + Object.setPrototypeOf(this, new.target.prototype); + } +} +exports.GitError = GitError; +//# sourceMappingURL=git-error.js.map +}); + +var gitResponseError = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitResponseError = void 0; + +/** + * The `GitResponseError` is the wrapper for a parsed response that is treated as + * a fatal error, for example attempting a `merge` can leave the repo in a corrupted + * state when there are conflicts so the task will reject rather than resolve. + * + * For example, catching the merge conflict exception: + * + * ```typescript + import { gitP, SimpleGit, GitResponseError, MergeSummary } from 'simple-git'; + + const git = gitP(repoRoot); + const mergeOptions: string[] = ['--no-ff', 'other-branch']; + const mergeSummary: MergeSummary = await git.merge(mergeOptions) + .catch((e: GitResponseError) => e.git); + + if (mergeSummary.failed) { + // deal with the error + } + ``` + */ +class GitResponseError extends gitError.GitError { + constructor( + /** + * `.git` access the parsed response that is treated as being an error + */ + git, message) { + super(undefined, message || String(git)); + this.git = git; + } +} +exports.GitResponseError = GitResponseError; +//# sourceMappingURL=git-response-error.js.map +}); + +var gitConstructError = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitConstructError = void 0; + +/** + * The `GitConstructError` is thrown when an error occurs in the constructor + * of the `simple-git` instance itself. Most commonly as a result of using + * a `baseDir` option that points to a folder that either does not exist, + * or cannot be read by the user the node script is running as. + * + * Check the `.message` property for more detail including the properties + * passed to the constructor. + */ +class GitConstructError extends gitError.GitError { + constructor(config, message) { + super(undefined, message); + this.config = config; + } +} +exports.GitConstructError = GitConstructError; +//# sourceMappingURL=git-construct-error.js.map +}); + +var gitPluginError = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitPluginError = void 0; + +class GitPluginError extends gitError.GitError { + constructor(task, plugin, message) { + super(task, message); + this.task = task; + this.plugin = plugin; + Object.setPrototypeOf(this, new.target.prototype); + } +} +exports.GitPluginError = GitPluginError; +//# sourceMappingURL=git-plugin-error.js.map +}); + +var taskConfigurationError = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TaskConfigurationError = void 0; + +/** + * The `TaskConfigurationError` is thrown when a command was incorrectly + * configured. An error of this kind means that no attempt was made to + * run your command through the underlying `git` binary. + * + * Check the `.message` property for more detail on why your configuration + * resulted in an error. + */ +class TaskConfigurationError extends gitError.GitError { + constructor(message) { + super(undefined, message); + } +} +exports.TaskConfigurationError = TaskConfigurationError; +//# sourceMappingURL=task-configuration-error.js.map +}); + +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var w = d * 7; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +var ms = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); +} + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + */ + +function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = ms; + createDebug.destroy = destroy; + + Object.keys(env).forEach(key => { + createDebug[key] = env[key]; + }); + + /** + * The currently active debug mode names, and names to skip. + */ + + createDebug.names = []; + createDebug.skips = []; + + /** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + createDebug.formatters = {}; + + /** + * Selects a color for a debug namespace + * @param {String} namespace The namespace string for the for the debug instance to be colored + * @return {Number|String} An ANSI color code for the given namespace + * @api private + */ + function selectColor(namespace) { + let hash = 0; + + for (let i = 0; i < namespace.length; i++) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + + /** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + + function debug(...args) { + // Disabled? + if (!debug.enabled) { + return; + } + + const self = debug; + + // Set `diff` timestamp + const curr = Number(new Date()); + const ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + args[0] = createDebug.coerce(args[0]); + + if (typeof args[0] !== 'string') { + // Anything else let's inspect with %O + args.unshift('%O'); + } + + // Apply any `formatters` transformations + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + // If we encounter an escaped % then don't increase the array index + if (match === '%%') { + return '%'; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === 'function') { + const val = args[index]; + match = formatter.call(self, val); + + // Now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // Apply env-specific formatting (colors, etc.) + createDebug.formatArgs.call(self, args); + + const logFn = self.log || createDebug.log; + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.useColors = createDebug.useColors(); + debug.color = createDebug.selectColor(namespace); + debug.extend = extend; + debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. + + Object.defineProperty(debug, 'enabled', { + enumerable: true, + configurable: false, + get: () => enableOverride === null ? createDebug.enabled(namespace) : enableOverride, + set: v => { + enableOverride = v; + } + }); + + // Env-specific initialization logic for debug instances + if (typeof createDebug.init === 'function') { + createDebug.init(debug); + } + + return debug; + } + + function extend(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + + /** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + function enable(namespaces) { + createDebug.save(namespaces); + + createDebug.names = []; + createDebug.skips = []; + + let i; + const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + const len = split.length; + + for (i = 0; i < len; i++) { + if (!split[i]) { + // ignore empty strings + continue; + } + + namespaces = split[i].replace(/\*/g, '.*?'); + + if (namespaces[0] === '-') { + createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + createDebug.names.push(new RegExp('^' + namespaces + '$')); + } + } + } + + /** + * Disable debug output. + * + * @return {String} namespaces + * @api public + */ + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) + ].join(','); + createDebug.enable(''); + return namespaces; + } + + /** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + function enabled(name) { + if (name[name.length - 1] === '*') { + return true; + } + + let i; + let len; + + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + + return false; + } + + /** + * Convert regexp to namespace + * + * @param {RegExp} regxep + * @return {String} namespace + * @api private + */ + function toNamespace(regexp) { + return regexp.toString() + .substring(2, regexp.toString().length - 2) + .replace(/\.\*\?$/, '*'); + } + + /** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + + /** + * XXX DO NOT USE. This is a temporary stub function. + * XXX It WILL be removed in the next major release. + */ + function destroy() { + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + + createDebug.enable(createDebug.load()); + + return createDebug; +} + +var common = setup; + +var browser = createCommonjsModule(function (module, exports) { +/* eslint-env browser */ + +/** + * This is the web browser implementation of `debug()`. + */ + +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = localstorage(); +exports.destroy = (() => { + let warned = false; + + return () => { + if (!warned) { + warned = true; + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + }; +})(); + +/** + * Colors. + */ + +exports.colors = [ + '#0000CC', + '#0000FF', + '#0033CC', + '#0033FF', + '#0066CC', + '#0066FF', + '#0099CC', + '#0099FF', + '#00CC00', + '#00CC33', + '#00CC66', + '#00CC99', + '#00CCCC', + '#00CCFF', + '#3300CC', + '#3300FF', + '#3333CC', + '#3333FF', + '#3366CC', + '#3366FF', + '#3399CC', + '#3399FF', + '#33CC00', + '#33CC33', + '#33CC66', + '#33CC99', + '#33CCCC', + '#33CCFF', + '#6600CC', + '#6600FF', + '#6633CC', + '#6633FF', + '#66CC00', + '#66CC33', + '#9900CC', + '#9900FF', + '#9933CC', + '#9933FF', + '#99CC00', + '#99CC33', + '#CC0000', + '#CC0033', + '#CC0066', + '#CC0099', + '#CC00CC', + '#CC00FF', + '#CC3300', + '#CC3333', + '#CC3366', + '#CC3399', + '#CC33CC', + '#CC33FF', + '#CC6600', + '#CC6633', + '#CC9900', + '#CC9933', + '#CCCC00', + '#CCCC33', + '#FF0000', + '#FF0033', + '#FF0066', + '#FF0099', + '#FF00CC', + '#FF00FF', + '#FF3300', + '#FF3333', + '#FF3366', + '#FF3399', + '#FF33CC', + '#FF33FF', + '#FF6600', + '#FF6633', + '#FF9900', + '#FF9933', + '#FFCC00', + '#FFCC33' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +// eslint-disable-next-line complexity +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { + return true; + } + + // Internet Explorer and Edge do not support colors. + if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + + // Is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // Is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // Double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + args[0] = (this.useColors ? '%c' : '') + + this.namespace + + (this.useColors ? ' %c' : ' ') + + args[0] + + (this.useColors ? '%c ' : ' ') + + '+' + module.exports.humanize(this.diff); + + if (!this.useColors) { + return; + } + + const c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit'); + + // The final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, match => { + if (match === '%%') { + return; + } + index++; + if (match === '%c') { + // We only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.debug()` when available. + * No-op when `console.debug` is not a "function". + * If `console.debug` is not available, falls back + * to `console.log`. + * + * @api public + */ +exports.log = console.debug || console.log || (() => {}); + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem('debug', namespaces); + } else { + exports.storage.removeItem('debug'); + } + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ +function load() { + let r; + try { + r = exports.storage.getItem('debug'); + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context + // The Browser also has localStorage in the global context. + return localStorage; + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } +} + +module.exports = common(exports); + +const {formatters} = module.exports; + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +formatters.j = function (v) { + try { + return JSON.stringify(v); + } catch (error) { + return '[UnexpectedJSONParseError]: ' + error.message; + } +}; +}); + +var hasFlag = (flag, argv = process.argv) => { + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const position = argv.indexOf(prefix + flag); + const terminatorPosition = argv.indexOf('--'); + return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); +}; + +const {env} = process; + +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false') || + hasFlag('color=never')) { + forceColor = 0; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = 1; +} + +if ('FORCE_COLOR' in env) { + if (env.FORCE_COLOR === 'true') { + forceColor = 1; + } else if (env.FORCE_COLOR === 'false') { + forceColor = 0; + } else { + forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); + } +} + +function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} + +function supportsColor(haveStream, streamIsTTY) { + if (forceColor === 0) { + return 0; + } + + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } + + if (hasFlag('color=256')) { + return 2; + } + + if (haveStream && !streamIsTTY && forceColor === undefined) { + return 0; + } + + const min = forceColor || 0; + + if (env.TERM === 'dumb') { + return min; + } + + if (process.platform === 'win32') { + // Windows 10 build 10586 is the first Windows release that supports 256 colors. + // Windows 10 build 14931 is the first release that supports 16m/TrueColor. + const osRelease = os__default['default'].release().split('.'); + if ( + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + + return 1; + } + + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } + + return min; + } + + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + + if (env.COLORTERM === 'truecolor') { + return 3; + } + + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } + + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + + if ('COLORTERM' in env) { + return 1; + } + + return min; +} + +function getSupportLevel(stream) { + const level = supportsColor(stream, stream && stream.isTTY); + return translateLevel(level); +} + +var supportsColor_1 = { + supportsColor: getSupportLevel, + stdout: translateLevel(supportsColor(true, tty__default['default'].isatty(1))), + stderr: translateLevel(supportsColor(true, tty__default['default'].isatty(2))) +}; + +var node = createCommonjsModule(function (module, exports) { +/** + * Module dependencies. + */ + + + + +/** + * This is the Node.js implementation of `debug()`. + */ + +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.destroy = util__default['default'].deprecate( + () => {}, + 'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.' +); + +/** + * Colors. + */ + +exports.colors = [6, 2, 3, 4, 5, 1]; + +try { + // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json) + // eslint-disable-next-line import/no-extraneous-dependencies + const supportsColor = supportsColor_1; + + if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { + exports.colors = [ + 20, + 21, + 26, + 27, + 32, + 33, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 56, + 57, + 62, + 63, + 68, + 69, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 92, + 93, + 98, + 99, + 112, + 113, + 128, + 129, + 134, + 135, + 148, + 149, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 178, + 179, + 184, + 185, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 214, + 215, + 220, + 221 + ]; + } +} catch (error) { + // Swallow - we only care if `supports-color` is available; it doesn't have to be. +} + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(key => { + return /^debug_/i.test(key); +}).reduce((obj, key) => { + // Camel-case + const prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, (_, k) => { + return k.toUpperCase(); + }); + + // Coerce string value into JS value + let val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) { + val = true; + } else if (/^(no|off|false|disabled)$/i.test(val)) { + val = false; + } else if (val === 'null') { + val = null; + } else { + val = Number(val); + } + + obj[prop] = val; + return obj; +}, {}); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts ? + Boolean(exports.inspectOpts.colors) : + tty__default['default'].isatty(process.stderr.fd); +} + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + const {namespace: name, useColors} = this; + + if (useColors) { + const c = this.color; + const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c); + const prefix = ` ${colorCode};1m${name} \u001B[0m`; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m'); + } else { + args[0] = getDate() + name + ' ' + args[0]; + } +} + +function getDate() { + if (exports.inspectOpts.hideDate) { + return ''; + } + return new Date().toISOString() + ' '; +} + +/** + * Invokes `util.format()` with the specified arguments and writes to stderr. + */ + +function log(...args) { + return process.stderr.write(util__default['default'].format(...args) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + if (namespaces) { + process.env.DEBUG = namespaces; + } else { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init(debug) { + debug.inspectOpts = {}; + + const keys = Object.keys(exports.inspectOpts); + for (let i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +module.exports = common(exports); + +const {formatters} = module.exports; + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +formatters.o = function (v) { + this.inspectOpts.colors = this.useColors; + return util__default['default'].inspect(v, this.inspectOpts) + .split('\n') + .map(str => str.trim()) + .join(' '); +}; + +/** + * Map %O to `util.inspect()`, allowing multiple lines if needed. + */ + +formatters.O = function (v) { + this.inspectOpts.colors = this.useColors; + return util__default['default'].inspect(v, this.inspectOpts); +}; +}); + +var src$2 = createCommonjsModule(function (module) { +/** + * Detect Electron renderer / nwjs process, which is node, but we should + * treat as a browser. + */ + +if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) { + module.exports = browser; +} else { + module.exports = node; +} +}); + +var src$1 = createCommonjsModule(function (module, exports) { +var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); + +const debug_1 = __importDefault(src$2); +const log = debug_1.default('@kwsites/file-exists'); +function check(path, isFile, isDirectory) { + log(`checking %s`, path); + try { + const stat = fs_1__default['default'].statSync(path); + if (stat.isFile() && isFile) { + log(`[OK] path represents a file`); + return true; + } + if (stat.isDirectory() && isDirectory) { + log(`[OK] path represents a directory`); + return true; + } + log(`[FAIL] path represents something other than a file or directory`); + return false; + } + catch (e) { + if (e.code === 'ENOENT') { + log(`[FAIL] path is not accessible: %o`, e); + return false; + } + log(`[FATAL] %o`, e); + throw e; + } +} +/** + * Synchronous validation of a path existing either as a file or as a directory. + * + * @param {string} path The path to check + * @param {number} type One or both of the exported numeric constants + */ +function exists(path, type = exports.READABLE) { + return check(path, (type & exports.FILE) > 0, (type & exports.FOLDER) > 0); +} +exports.exists = exists; +/** + * Constant representing a file + */ +exports.FILE = 1; +/** + * Constant representing a folder + */ +exports.FOLDER = 2; +/** + * Constant representing either a file or a folder + */ +exports.READABLE = exports.FILE + exports.FOLDER; +//# sourceMappingURL=index.js.map +}); + +var dist$1 = createCommonjsModule(function (module, exports) { +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(src$1); +//# sourceMappingURL=index.js.map +}); + +var util = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.bufferToString = exports.prefixedArray = exports.asNumber = exports.asStringArray = exports.asArray = exports.objectToString = exports.remove = exports.including = exports.append = exports.folderExists = exports.forEachLineWithContent = exports.toLinesWithContent = exports.last = exports.first = exports.splitOn = exports.isUserFunction = exports.asFunction = exports.NOOP = void 0; + +const NOOP = () => { +}; +exports.NOOP = NOOP; +/** + * Returns either the source argument when it is a `Function`, or the default + * `NOOP` function constant + */ +function asFunction(source) { + return typeof source === 'function' ? source : exports.NOOP; +} +exports.asFunction = asFunction; +/** + * Determines whether the supplied argument is both a function, and is not + * the `NOOP` function. + */ +function isUserFunction(source) { + return (typeof source === 'function' && source !== exports.NOOP); +} +exports.isUserFunction = isUserFunction; +function splitOn(input, char) { + const index = input.indexOf(char); + if (index <= 0) { + return [input, '']; + } + return [ + input.substr(0, index), + input.substr(index + 1), + ]; +} +exports.splitOn = splitOn; +function first(input, offset = 0) { + return isArrayLike(input) && input.length > offset ? input[offset] : undefined; +} +exports.first = first; +function last(input, offset = 0) { + if (isArrayLike(input) && input.length > offset) { + return input[input.length - 1 - offset]; + } +} +exports.last = last; +function isArrayLike(input) { + return !!(input && typeof input.length === 'number'); +} +function toLinesWithContent(input, trimmed = true, separator = '\n') { + return input.split(separator) + .reduce((output, line) => { + const lineContent = trimmed ? line.trim() : line; + if (lineContent) { + output.push(lineContent); + } + return output; + }, []); +} +exports.toLinesWithContent = toLinesWithContent; +function forEachLineWithContent(input, callback) { + return toLinesWithContent(input, true).map(line => callback(line)); +} +exports.forEachLineWithContent = forEachLineWithContent; +function folderExists(path) { + return dist$1.exists(path, dist$1.FOLDER); +} +exports.folderExists = folderExists; +/** + * Adds `item` into the `target` `Array` or `Set` when it is not already present and returns the `item`. + */ +function append(target, item) { + if (Array.isArray(target)) { + if (!target.includes(item)) { + target.push(item); + } + } + else { + target.add(item); + } + return item; +} +exports.append = append; +/** + * Adds `item` into the `target` `Array` when it is not already present and returns the `target`. + */ +function including(target, item) { + if (Array.isArray(target) && !target.includes(item)) { + target.push(item); + } + return target; +} +exports.including = including; +function remove(target, item) { + if (Array.isArray(target)) { + const index = target.indexOf(item); + if (index >= 0) { + target.splice(index, 1); + } + } + else { + target.delete(item); + } + return item; +} +exports.remove = remove; +exports.objectToString = Object.prototype.toString.call.bind(Object.prototype.toString); +function asArray(source) { + return Array.isArray(source) ? source : [source]; +} +exports.asArray = asArray; +function asStringArray(source) { + return asArray(source).map(String); +} +exports.asStringArray = asStringArray; +function asNumber(source, onNaN = 0) { + if (source == null) { + return onNaN; + } + const num = parseInt(source, 10); + return isNaN(num) ? onNaN : num; +} +exports.asNumber = asNumber; +function prefixedArray(input, prefix) { + const output = []; + for (let i = 0, max = input.length; i < max; i++) { + output.push(prefix, input[i]); + } + return output; +} +exports.prefixedArray = prefixedArray; +function bufferToString(input) { + return (Array.isArray(input) ? Buffer.concat(input) : input).toString('utf-8'); +} +exports.bufferToString = bufferToString; +//# sourceMappingURL=util.js.map +}); + +var argumentFilters = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.filterHasLength = exports.filterFunction = exports.filterPlainObject = exports.filterStringOrStringArray = exports.filterStringArray = exports.filterString = exports.filterPrimitives = exports.filterArray = exports.filterType = void 0; + +function filterType(input, filter, def) { + if (filter(input)) { + return input; + } + return (arguments.length > 2) ? def : undefined; +} +exports.filterType = filterType; +const filterArray = (input) => { + return Array.isArray(input); +}; +exports.filterArray = filterArray; +function filterPrimitives(input, omit) { + return /number|string|boolean/.test(typeof input) && (!omit || !omit.includes((typeof input))); +} +exports.filterPrimitives = filterPrimitives; +const filterString = (input) => { + return typeof input === 'string'; +}; +exports.filterString = filterString; +const filterStringArray = (input) => { + return Array.isArray(input) && input.every(exports.filterString); +}; +exports.filterStringArray = filterStringArray; +const filterStringOrStringArray = (input) => { + return exports.filterString(input) || (Array.isArray(input) && input.every(exports.filterString)); +}; +exports.filterStringOrStringArray = filterStringOrStringArray; +function filterPlainObject(input) { + return !!input && util.objectToString(input) === '[object Object]'; +} +exports.filterPlainObject = filterPlainObject; +function filterFunction(input) { + return typeof input === 'function'; +} +exports.filterFunction = filterFunction; +const filterHasLength = (input) => { + if (input == null || 'number|boolean|function'.includes(typeof input)) { + return false; + } + return Array.isArray(input) || typeof input === 'string' || typeof input.length === 'number'; +}; +exports.filterHasLength = filterHasLength; +//# sourceMappingURL=argument-filters.js.map +}); + +var exitCodes = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ExitCodes = void 0; +(function (ExitCodes) { + ExitCodes[ExitCodes["SUCCESS"] = 0] = "SUCCESS"; + ExitCodes[ExitCodes["ERROR"] = 1] = "ERROR"; + ExitCodes[ExitCodes["UNCLEAN"] = 128] = "UNCLEAN"; +})(exports.ExitCodes || (exports.ExitCodes = {})); +//# sourceMappingURL=exit-codes.js.map +}); + +var gitOutputStreams = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitOutputStreams = void 0; +class GitOutputStreams { + constructor(stdOut, stdErr) { + this.stdOut = stdOut; + this.stdErr = stdErr; + } + asStrings() { + return new GitOutputStreams(this.stdOut.toString('utf8'), this.stdErr.toString('utf8')); + } +} +exports.GitOutputStreams = GitOutputStreams; +//# sourceMappingURL=git-output-streams.js.map +}); + +var lineParser = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RemoteLineParser = exports.LineParser = void 0; +class LineParser { + constructor(regExp, useMatches) { + this.matches = []; + this.parse = (line, target) => { + this.resetMatches(); + if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) { + return false; + } + return this.useMatches(target, this.prepareMatches()) !== false; + }; + this._regExp = Array.isArray(regExp) ? regExp : [regExp]; + if (useMatches) { + this.useMatches = useMatches; + } + } + // @ts-ignore + useMatches(target, match) { + throw new Error(`LineParser:useMatches not implemented`); + } + resetMatches() { + this.matches.length = 0; + } + prepareMatches() { + return this.matches; + } + addMatch(reg, index, line) { + const matched = line && reg.exec(line); + if (matched) { + this.pushMatch(index, matched); + } + return !!matched; + } + pushMatch(_index, matched) { + this.matches.push(...matched.slice(1)); + } +} +exports.LineParser = LineParser; +class RemoteLineParser extends LineParser { + addMatch(reg, index, line) { + return /^remote:\s/.test(String(line)) && super.addMatch(reg, index, line); + } + pushMatch(index, matched) { + if (index > 0 || matched.length > 1) { + super.pushMatch(index, matched); + } + } +} +exports.RemoteLineParser = RemoteLineParser; +//# sourceMappingURL=line-parser.js.map +}); + +var simpleGitOptions = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createInstanceConfig = void 0; +const defaultOptions = { + binary: 'git', + maxConcurrentProcesses: 5, + config: [], +}; +function createInstanceConfig(...options) { + const baseDir = process.cwd(); + const config = Object.assign(Object.assign({ baseDir }, defaultOptions), ...(options.filter(o => typeof o === 'object' && o))); + config.baseDir = config.baseDir || baseDir; + return config; +} +exports.createInstanceConfig = createInstanceConfig; +//# sourceMappingURL=simple-git-options.js.map +}); + +var taskOptions = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.trailingFunctionArgument = exports.trailingOptionsArgument = exports.getTrailingOptions = exports.appendTaskOptions = void 0; + + +function appendTaskOptions(options, commands = []) { + if (!argumentFilters.filterPlainObject(options)) { + return commands; + } + return Object.keys(options).reduce((commands, key) => { + const value = options[key]; + if (argumentFilters.filterPrimitives(value, ['boolean'])) { + commands.push(key + '=' + value); + } + else { + commands.push(key); + } + return commands; + }, commands); +} +exports.appendTaskOptions = appendTaskOptions; +function getTrailingOptions(args, initialPrimitive = 0, objectOnly = false) { + const command = []; + for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) { + if ('string|number'.includes(typeof args[i])) { + command.push(String(args[i])); + } + } + appendTaskOptions(trailingOptionsArgument(args), command); + if (!objectOnly) { + command.push(...trailingArrayArgument(args)); + } + return command; +} +exports.getTrailingOptions = getTrailingOptions; +function trailingArrayArgument(args) { + const hasTrailingCallback = typeof util.last(args) === 'function'; + return argumentFilters.filterType(util.last(args, hasTrailingCallback ? 1 : 0), argumentFilters.filterArray, []); +} +/** + * Given any number of arguments, returns the trailing options argument, ignoring a trailing function argument + * if there is one. When not found, the return value is null. + */ +function trailingOptionsArgument(args) { + const hasTrailingCallback = argumentFilters.filterFunction(util.last(args)); + return argumentFilters.filterType(util.last(args, hasTrailingCallback ? 1 : 0), argumentFilters.filterPlainObject); +} +exports.trailingOptionsArgument = trailingOptionsArgument; +/** + * Returns either the source argument when it is a `Function`, or the default + * `NOOP` function constant + */ +function trailingFunctionArgument(args, includeNoop = true) { + const callback = util.asFunction(util.last(args)); + return includeNoop || util.isUserFunction(callback) ? callback : undefined; +} +exports.trailingFunctionArgument = trailingFunctionArgument; +//# sourceMappingURL=task-options.js.map +}); + +var taskParser = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseStringResponse = exports.callTaskParser = void 0; + +function callTaskParser(parser, streams) { + return parser(streams.stdOut, streams.stdErr); +} +exports.callTaskParser = callTaskParser; +function parseStringResponse(result, parsers, ...texts) { + texts.forEach(text => { + for (let lines = util.toLinesWithContent(text), i = 0, max = lines.length; i < max; i++) { + const line = (offset = 0) => { + if ((i + offset) >= max) { + return; + } + return lines[i + offset]; + }; + parsers.some(({ parse }) => parse(line, result)); + } + }); + return result; +} +exports.parseStringResponse = parseStringResponse; +//# sourceMappingURL=task-parser.js.map +}); + +var utils = createCommonjsModule(function (module, exports) { +var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (commonjsGlobal && commonjsGlobal.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(argumentFilters, exports); +__exportStar(exitCodes, exports); +__exportStar(gitOutputStreams, exports); +__exportStar(lineParser, exports); +__exportStar(simpleGitOptions, exports); +__exportStar(taskOptions, exports); +__exportStar(taskParser, exports); +__exportStar(util, exports); +//# sourceMappingURL=index.js.map +}); + +var checkIsRepo = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.checkIsBareRepoTask = exports.checkIsRepoRootTask = exports.checkIsRepoTask = exports.CheckRepoActions = void 0; + +var CheckRepoActions; +(function (CheckRepoActions) { + CheckRepoActions["BARE"] = "bare"; + CheckRepoActions["IN_TREE"] = "tree"; + CheckRepoActions["IS_REPO_ROOT"] = "root"; +})(CheckRepoActions = exports.CheckRepoActions || (exports.CheckRepoActions = {})); +const onError = ({ exitCode }, error, done, fail) => { + if (exitCode === utils.ExitCodes.UNCLEAN && isNotRepoMessage(error)) { + return done(Buffer.from('false')); + } + fail(error); +}; +const parser = (text) => { + return text.trim() === 'true'; +}; +function checkIsRepoTask(action) { + switch (action) { + case CheckRepoActions.BARE: + return checkIsBareRepoTask(); + case CheckRepoActions.IS_REPO_ROOT: + return checkIsRepoRootTask(); + } + const commands = ['rev-parse', '--is-inside-work-tree']; + return { + commands, + format: 'utf-8', + onError, + parser, + }; +} +exports.checkIsRepoTask = checkIsRepoTask; +function checkIsRepoRootTask() { + const commands = ['rev-parse', '--git-dir']; + return { + commands, + format: 'utf-8', + onError, + parser(path) { + return /^\.(git)?$/.test(path.trim()); + }, + }; +} +exports.checkIsRepoRootTask = checkIsRepoRootTask; +function checkIsBareRepoTask() { + const commands = ['rev-parse', '--is-bare-repository']; + return { + commands, + format: 'utf-8', + onError, + parser, + }; +} +exports.checkIsBareRepoTask = checkIsBareRepoTask; +function isNotRepoMessage(error) { + return /(Not a git repository|Kein Git-Repository)/i.test(String(error)); +} +//# sourceMappingURL=check-is-repo.js.map +}); + +var CleanSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.cleanSummaryParser = exports.CleanResponse = void 0; + +class CleanResponse { + constructor(dryRun) { + this.dryRun = dryRun; + this.paths = []; + this.files = []; + this.folders = []; + } +} +exports.CleanResponse = CleanResponse; +const removalRegexp = /^[a-z]+\s*/i; +const dryRunRemovalRegexp = /^[a-z]+\s+[a-z]+\s*/i; +const isFolderRegexp = /\/$/; +function cleanSummaryParser(dryRun, text) { + const summary = new CleanResponse(dryRun); + const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp; + utils.toLinesWithContent(text).forEach(line => { + const removed = line.replace(regexp, ''); + summary.paths.push(removed); + (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed); + }); + return summary; +} +exports.cleanSummaryParser = cleanSummaryParser; +//# sourceMappingURL=CleanSummary.js.map +}); + +var task = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isEmptyTask = exports.isBufferTask = exports.straightThroughBufferTask = exports.straightThroughStringTask = exports.configurationErrorTask = exports.adhocExecTask = exports.EMPTY_COMMANDS = void 0; + +exports.EMPTY_COMMANDS = []; +function adhocExecTask(parser) { + return { + commands: exports.EMPTY_COMMANDS, + format: 'utf-8', + parser, + }; +} +exports.adhocExecTask = adhocExecTask; +function configurationErrorTask(error) { + return { + commands: exports.EMPTY_COMMANDS, + format: 'utf-8', + parser() { + throw typeof error === 'string' ? new taskConfigurationError.TaskConfigurationError(error) : error; + } + }; +} +exports.configurationErrorTask = configurationErrorTask; +function straightThroughStringTask(commands, trimmed = false) { + return { + commands, + format: 'utf-8', + parser(text) { + return trimmed ? String(text).trim() : text; + }, + }; +} +exports.straightThroughStringTask = straightThroughStringTask; +function straightThroughBufferTask(commands) { + return { + commands, + format: 'buffer', + parser(buffer) { + return buffer; + }, + }; +} +exports.straightThroughBufferTask = straightThroughBufferTask; +function isBufferTask(task) { + return task.format === 'buffer'; +} +exports.isBufferTask = isBufferTask; +function isEmptyTask(task) { + return !task.commands.length; +} +exports.isEmptyTask = isEmptyTask; +//# sourceMappingURL=task.js.map +}); + +var clean = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isCleanOptionsArray = exports.cleanTask = exports.cleanWithOptionsTask = exports.CleanOptions = exports.CONFIG_ERROR_UNKNOWN_OPTION = exports.CONFIG_ERROR_MODE_REQUIRED = exports.CONFIG_ERROR_INTERACTIVE_MODE = void 0; + + + +exports.CONFIG_ERROR_INTERACTIVE_MODE = 'Git clean interactive mode is not supported'; +exports.CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter ("n" or "f") is required'; +exports.CONFIG_ERROR_UNKNOWN_OPTION = 'Git clean unknown option found in: '; +/** + * All supported option switches available for use in a `git.clean` operation + */ +var CleanOptions; +(function (CleanOptions) { + CleanOptions["DRY_RUN"] = "n"; + CleanOptions["FORCE"] = "f"; + CleanOptions["IGNORED_INCLUDED"] = "x"; + CleanOptions["IGNORED_ONLY"] = "X"; + CleanOptions["EXCLUDING"] = "e"; + CleanOptions["QUIET"] = "q"; + CleanOptions["RECURSIVE"] = "d"; +})(CleanOptions = exports.CleanOptions || (exports.CleanOptions = {})); +const CleanOptionValues = new Set(['i', ...utils.asStringArray(Object.values(CleanOptions))]); +function cleanWithOptionsTask(mode, customArgs) { + const { cleanMode, options, valid } = getCleanOptions(mode); + if (!cleanMode) { + return task.configurationErrorTask(exports.CONFIG_ERROR_MODE_REQUIRED); + } + if (!valid.options) { + return task.configurationErrorTask(exports.CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode)); + } + options.push(...customArgs); + if (options.some(isInteractiveMode)) { + return task.configurationErrorTask(exports.CONFIG_ERROR_INTERACTIVE_MODE); + } + return cleanTask(cleanMode, options); +} +exports.cleanWithOptionsTask = cleanWithOptionsTask; +function cleanTask(mode, customArgs) { + const commands = ['clean', `-${mode}`, ...customArgs]; + return { + commands, + format: 'utf-8', + parser(text) { + return CleanSummary.cleanSummaryParser(mode === CleanOptions.DRY_RUN, text); + } + }; +} +exports.cleanTask = cleanTask; +function isCleanOptionsArray(input) { + return Array.isArray(input) && input.every(test => CleanOptionValues.has(test)); +} +exports.isCleanOptionsArray = isCleanOptionsArray; +function getCleanOptions(input) { + let cleanMode; + let options = []; + let valid = { cleanMode: false, options: true }; + input.replace(/[^a-z]i/g, '').split('').forEach(char => { + if (isCleanMode(char)) { + cleanMode = char; + valid.cleanMode = true; + } + else { + valid.options = valid.options && isKnownOption(options[options.length] = (`-${char}`)); + } + }); + return { + cleanMode, + options, + valid, + }; +} +function isCleanMode(cleanMode) { + return cleanMode === CleanOptions.FORCE || cleanMode === CleanOptions.DRY_RUN; +} +function isKnownOption(option) { + return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1)); +} +function isInteractiveMode(option) { + if (/^-[^\-]/.test(option)) { + return option.indexOf('i') > 0; + } + return option === '--interactive'; +} +//# sourceMappingURL=clean.js.map +}); + +var reset = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getResetMode = exports.resetTask = exports.ResetMode = void 0; + +var ResetMode; +(function (ResetMode) { + ResetMode["MIXED"] = "mixed"; + ResetMode["SOFT"] = "soft"; + ResetMode["HARD"] = "hard"; + ResetMode["MERGE"] = "merge"; + ResetMode["KEEP"] = "keep"; +})(ResetMode = exports.ResetMode || (exports.ResetMode = {})); +const ResetModes = Array.from(Object.values(ResetMode)); +function resetTask(mode, customArgs) { + const commands = ['reset']; + if (isValidResetMode(mode)) { + commands.push(`--${mode}`); + } + commands.push(...customArgs); + return task.straightThroughStringTask(commands); +} +exports.resetTask = resetTask; +function getResetMode(mode) { + if (isValidResetMode(mode)) { + return mode; + } + switch (typeof mode) { + case 'string': + case 'undefined': + return ResetMode.SOFT; + } + return; +} +exports.getResetMode = getResetMode; +function isValidResetMode(mode) { + return ResetModes.includes(mode); +} +//# sourceMappingURL=reset.js.map +}); + +var api_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); + + + + + + + + +const api = { + CheckRepoActions: checkIsRepo.CheckRepoActions, + CleanOptions: clean.CleanOptions, + GitConstructError: gitConstructError.GitConstructError, + GitError: gitError.GitError, + GitPluginError: gitPluginError.GitPluginError, + GitResponseError: gitResponseError.GitResponseError, + ResetMode: reset.ResetMode, + TaskConfigurationError: taskConfigurationError.TaskConfigurationError, +}; +exports.default = api; +//# sourceMappingURL=api.js.map +}); + +var commandConfigPrefixingPlugin_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.commandConfigPrefixingPlugin = void 0; + +function commandConfigPrefixingPlugin(configuration) { + const prefix = utils.prefixedArray(configuration, '-c'); + return { + type: 'spawn.args', + action(data) { + return [...prefix, ...data]; + }, + }; +} +exports.commandConfigPrefixingPlugin = commandConfigPrefixingPlugin; +//# sourceMappingURL=command-config-prefixing-plugin.js.map +}); + +var errorDetection_plugin = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.errorDetectionPlugin = exports.errorDetectionHandler = void 0; + +function isTaskError(result) { + return !!(result.exitCode && result.stdErr.length); +} +function getErrorMessage(result) { + return Buffer.concat([...result.stdOut, ...result.stdErr]); +} +function errorDetectionHandler(overwrite = false, isError = isTaskError, errorMessage = getErrorMessage) { + return (error, result) => { + if ((!overwrite && error) || !isError(result)) { + return error; + } + return errorMessage(result); + }; +} +exports.errorDetectionHandler = errorDetectionHandler; +function errorDetectionPlugin(config) { + return { + type: 'task.error', + action(data, context) { + const error = config(data.error, { + stdErr: context.stdErr, + stdOut: context.stdOut, + exitCode: context.exitCode + }); + if (Buffer.isBuffer(error)) { + return { error: new gitError.GitError(undefined, error.toString('utf-8')) }; + } + return { + error + }; + }, + }; +} +exports.errorDetectionPlugin = errorDetectionPlugin; +//# sourceMappingURL=error-detection.plugin.js.map +}); + +var pluginStore = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PluginStore = void 0; + +class PluginStore { + constructor() { + this.plugins = new Set(); + } + add(plugin) { + const plugins = []; + utils.asArray(plugin).forEach(plugin => plugin && this.plugins.add(utils.append(plugins, plugin))); + return () => { + plugins.forEach(plugin => this.plugins.delete(plugin)); + }; + } + exec(type, data, context) { + let output = data; + const contextual = Object.freeze(Object.create(context)); + for (const plugin of this.plugins) { + if (plugin.type === type) { + output = plugin.action(output, contextual); + } + } + return output; + } +} +exports.PluginStore = PluginStore; +//# sourceMappingURL=plugin-store.js.map +}); + +var progressMonitorPlugin_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.progressMonitorPlugin = void 0; + +function progressMonitorPlugin(progress) { + const progressCommand = '--progress'; + const progressMethods = ['checkout', 'clone', 'fetch', 'pull', 'push']; + const onProgress = { + type: 'spawn.after', + action(_data, context) { + var _a; + if (!context.commands.includes(progressCommand)) { + return; + } + (_a = context.spawned.stderr) === null || _a === void 0 ? void 0 : _a.on('data', (chunk) => { + const message = /^([a-zA-Z ]+):\s*(\d+)% \((\d+)\/(\d+)\)/.exec(chunk.toString('utf8')); + if (!message) { + return; + } + progress({ + method: context.method, + stage: progressEventStage(message[1]), + progress: utils.asNumber(message[2]), + processed: utils.asNumber(message[3]), + total: utils.asNumber(message[4]), + }); + }); + } + }; + const onArgs = { + type: 'spawn.args', + action(args, context) { + if (!progressMethods.includes(context.method)) { + return args; + } + return utils.including(args, progressCommand); + } + }; + return [onArgs, onProgress]; +} +exports.progressMonitorPlugin = progressMonitorPlugin; +function progressEventStage(input) { + return String(input.toLowerCase().split(' ', 1)) || 'unknown'; +} +//# sourceMappingURL=progress-monitor-plugin.js.map +}); + +var simpleGitPlugin = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=simple-git-plugin.js.map +}); + +var timoutPlugin = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.timeoutPlugin = void 0; + +function timeoutPlugin({ block }) { + if (block > 0) { + return { + type: 'spawn.after', + action(_data, context) { + var _a, _b; + let timeout; + function wait() { + timeout && clearTimeout(timeout); + timeout = setTimeout(kill, block); + } + function stop() { + var _a, _b; + (_a = context.spawned.stdout) === null || _a === void 0 ? void 0 : _a.off('data', wait); + (_b = context.spawned.stderr) === null || _b === void 0 ? void 0 : _b.off('data', wait); + context.spawned.off('exit', stop); + context.spawned.off('close', stop); + } + function kill() { + stop(); + context.kill(new gitPluginError.GitPluginError(undefined, 'timeout', `block timeout reached`)); + } + (_a = context.spawned.stdout) === null || _a === void 0 ? void 0 : _a.on('data', wait); + (_b = context.spawned.stderr) === null || _b === void 0 ? void 0 : _b.on('data', wait); + context.spawned.on('exit', stop); + context.spawned.on('close', stop); + wait(); + } + }; + } +} +exports.timeoutPlugin = timeoutPlugin; +//# sourceMappingURL=timout-plugin.js.map +}); + +var plugins = createCommonjsModule(function (module, exports) { +var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (commonjsGlobal && commonjsGlobal.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(commandConfigPrefixingPlugin_1, exports); +__exportStar(errorDetection_plugin, exports); +__exportStar(pluginStore, exports); +__exportStar(progressMonitorPlugin_1, exports); +__exportStar(simpleGitPlugin, exports); +__exportStar(timoutPlugin, exports); +//# sourceMappingURL=index.js.map +}); + +var gitLogger = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitLogger = exports.createLogger = void 0; + + +src$2.default.formatters.L = (value) => String(utils.filterHasLength(value) ? value.length : '-'); +src$2.default.formatters.B = (value) => { + if (Buffer.isBuffer(value)) { + return value.toString('utf8'); + } + return utils.objectToString(value); +}; +function createLog() { + return src$2.default('simple-git'); +} +function prefixedLogger(to, prefix, forward) { + if (!prefix || !String(prefix).replace(/\s*/, '')) { + return !forward ? to : (message, ...args) => { + to(message, ...args); + forward(message, ...args); + }; + } + return (message, ...args) => { + to(`%s ${message}`, prefix, ...args); + if (forward) { + forward(message, ...args); + } + }; +} +function childLoggerName(name, childDebugger, { namespace: parentNamespace }) { + if (typeof name === 'string') { + return name; + } + const childNamespace = childDebugger && childDebugger.namespace || ''; + if (childNamespace.startsWith(parentNamespace)) { + return childNamespace.substr(parentNamespace.length + 1); + } + return childNamespace || parentNamespace; +} +function createLogger(label, verbose, initialStep, infoDebugger = createLog()) { + const labelPrefix = label && `[${label}]` || ''; + const spawned = []; + const debugDebugger = (typeof verbose === 'string') ? infoDebugger.extend(verbose) : verbose; + const key = childLoggerName(utils.filterType(verbose, utils.filterString), debugDebugger, infoDebugger); + return step(initialStep); + function sibling(name, initial) { + return utils.append(spawned, createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)); + } + function step(phase) { + const stepPrefix = phase && `[${phase}]` || ''; + const debug = debugDebugger && prefixedLogger(debugDebugger, stepPrefix) || utils.NOOP; + const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug); + return Object.assign(debugDebugger ? debug : info, { + label, + sibling, + info, + step, + }); + } +} +exports.createLogger = createLogger; +/** + * The `GitLogger` is used by the main `SimpleGit` runner to handle logging + * any warnings or errors. + */ +class GitLogger { + constructor(_out = createLog()) { + this._out = _out; + this.error = prefixedLogger(_out, '[ERROR]'); + this.warn = prefixedLogger(_out, '[WARN]'); + } + silent(silence = false) { + if (silence !== this._out.enabled) { + return; + } + const { namespace } = this._out; + const env = (process.env.DEBUG || '').split(',').filter(s => !!s); + const hasOn = env.includes(namespace); + const hasOff = env.includes(`-${namespace}`); + // enabling the log + if (!silence) { + if (hasOff) { + utils.remove(env, `-${namespace}`); + } + else { + env.push(namespace); + } + } + else { + if (hasOn) { + utils.remove(env, namespace); + } + else { + env.push(`-${namespace}`); + } + } + src$2.default.enable(env.join(',')); + } +} +exports.GitLogger = GitLogger; +//# sourceMappingURL=git-logger.js.map +}); + +var tasksPendingQueue = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TasksPendingQueue = void 0; + + +class TasksPendingQueue { + constructor(logLabel = 'GitExecutor') { + this.logLabel = logLabel; + this._queue = new Map(); + } + withProgress(task) { + return this._queue.get(task); + } + createProgress(task) { + const name = TasksPendingQueue.getName(task.commands[0]); + const logger = gitLogger.createLogger(this.logLabel, name); + return { + task, + logger, + name, + }; + } + push(task) { + const progress = this.createProgress(task); + progress.logger('Adding task to the queue, commands = %o', task.commands); + this._queue.set(task, progress); + return progress; + } + fatal(err) { + for (const [task, { logger }] of Array.from(this._queue.entries())) { + if (task === err.task) { + logger.info(`Failed %o`, err); + logger(`Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`); + } + else { + logger.info(`A fatal exception occurred in a previous task, the queue has been purged: %o`, err.message); + } + this.complete(task); + } + if (this._queue.size !== 0) { + throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`); + } + } + complete(task) { + const progress = this.withProgress(task); + if (progress) { + this._queue.delete(task); + } + } + attempt(task) { + const progress = this.withProgress(task); + if (!progress) { + throw new gitError.GitError(undefined, 'TasksPendingQueue: attempt called for an unknown task'); + } + progress.logger('Starting task'); + return progress; + } + static getName(name = 'empty') { + return `task:${name}:${++TasksPendingQueue.counter}`; + } +} +exports.TasksPendingQueue = TasksPendingQueue; +TasksPendingQueue.counter = 0; +//# sourceMappingURL=tasks-pending-queue.js.map +}); + +var gitExecutorChain = createCommonjsModule(function (module, exports) { +var __awaiter = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitExecutorChain = void 0; + + + + + +class GitExecutorChain { + constructor(_executor, _scheduler, _plugins) { + this._executor = _executor; + this._scheduler = _scheduler; + this._plugins = _plugins; + this._chain = Promise.resolve(); + this._queue = new tasksPendingQueue.TasksPendingQueue(); + } + get binary() { + return this._executor.binary; + } + get cwd() { + return this._executor.cwd; + } + get env() { + return this._executor.env; + } + get outputHandler() { + return this._executor.outputHandler; + } + chain() { + return this; + } + push(task) { + this._queue.push(task); + return this._chain = this._chain.then(() => this.attemptTask(task)); + } + attemptTask(task$1) { + return __awaiter(this, void 0, void 0, function* () { + const onScheduleComplete = yield this._scheduler.next(); + const onQueueComplete = () => this._queue.complete(task$1); + try { + const { logger } = this._queue.attempt(task$1); + return yield (task.isEmptyTask(task$1) + ? this.attemptEmptyTask(task$1, logger) + : this.attemptRemoteTask(task$1, logger)); + } + catch (e) { + throw this.onFatalException(task$1, e); + } + finally { + onQueueComplete(); + onScheduleComplete(); + } + }); + } + onFatalException(task, e) { + const gitError$1 = (e instanceof gitError.GitError) ? Object.assign(e, { task }) : new gitError.GitError(task, e && String(e)); + this._chain = Promise.resolve(); + this._queue.fatal(gitError$1); + return gitError$1; + } + attemptRemoteTask(task$1, logger) { + return __awaiter(this, void 0, void 0, function* () { + const args = this._plugins.exec('spawn.args', [...task$1.commands], pluginContext(task$1, task$1.commands)); + const raw = yield this.gitResponse(task$1, this.binary, args, this.outputHandler, logger.step('SPAWN')); + const outputStreams = yield this.handleTaskData(task$1, args, raw, logger.step('HANDLE')); + logger(`passing response to task's parser as a %s`, task$1.format); + if (task.isBufferTask(task$1)) { + return utils.callTaskParser(task$1.parser, outputStreams); + } + return utils.callTaskParser(task$1.parser, outputStreams.asStrings()); + }); + } + attemptEmptyTask(task, logger) { + return __awaiter(this, void 0, void 0, function* () { + logger(`empty task bypassing child process to call to task's parser`); + return task.parser(); + }); + } + handleTaskData(task, args, result, logger) { + const { exitCode, rejection, stdOut, stdErr } = result; + return new Promise((done, fail) => { + logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode); + const { error } = this._plugins.exec('task.error', { error: rejection }, Object.assign(Object.assign({}, pluginContext(task, args)), result)); + if (error && task.onError) { + logger.info(`exitCode=%s handling with custom error handler`); + return task.onError(result, error, (newStdOut) => { + logger.info(`custom error handler treated as success`); + logger(`custom error returned a %s`, utils.objectToString(newStdOut)); + done(new utils.GitOutputStreams(Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut, Buffer.concat(stdErr))); + }, fail); + } + if (error) { + logger.info(`handling as error: exitCode=%s stdErr=%s rejection=%o`, exitCode, stdErr.length, rejection); + return fail(error); + } + logger.info(`retrieving task output complete`); + done(new utils.GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr))); + }); + } + gitResponse(task, command, args, outputHandler, logger) { + return __awaiter(this, void 0, void 0, function* () { + const outputLogger = logger.sibling('output'); + const spawnOptions = { + cwd: this.cwd, + env: this.env, + windowsHide: true, + }; + return new Promise((done) => { + const stdOut = []; + const stdErr = []; + let attempted = false; + let rejection; + function attemptClose(exitCode, event = 'retry') { + // closing when there is content, terminate immediately + if (attempted || stdErr.length || stdOut.length) { + logger.info(`exitCode=%s event=%s rejection=%o`, exitCode, event, rejection); + done({ + stdOut, + stdErr, + exitCode, + rejection, + }); + attempted = true; + } + // first attempt at closing but no content yet, wait briefly for the close/exit that may follow + if (!attempted) { + attempted = true; + setTimeout(() => attemptClose(exitCode, 'deferred'), 50); + logger('received %s event before content on stdOut/stdErr', event); + } + } + logger.info(`%s %o`, command, args); + logger('%O', spawnOptions); + const spawned = child_process_1__default['default'].spawn(command, args, spawnOptions); + spawned.stdout.on('data', onDataReceived(stdOut, 'stdOut', logger, outputLogger.step('stdOut'))); + spawned.stderr.on('data', onDataReceived(stdErr, 'stdErr', logger, outputLogger.step('stdErr'))); + spawned.on('error', onErrorReceived(stdErr, logger)); + spawned.on('close', (code) => attemptClose(code, 'close')); + spawned.on('exit', (code) => attemptClose(code, 'exit')); + if (outputHandler) { + logger(`Passing child process stdOut/stdErr to custom outputHandler`); + outputHandler(command, spawned.stdout, spawned.stderr, [...args]); + } + this._plugins.exec('spawn.after', undefined, Object.assign(Object.assign({}, pluginContext(task, args)), { spawned, kill(reason) { + if (spawned.killed) { + return; + } + rejection = reason; + spawned.kill('SIGINT'); + } })); + }); + }); + } +} +exports.GitExecutorChain = GitExecutorChain; +function pluginContext(task, commands) { + return { + method: utils.first(task.commands) || '', + commands, + }; +} +function onErrorReceived(target, logger) { + return (err) => { + logger(`[ERROR] child process exception %o`, err); + target.push(Buffer.from(String(err.stack), 'ascii')); + }; +} +function onDataReceived(target, name, logger, output) { + return (buffer) => { + logger(`%s received %L bytes`, name, buffer); + output(`%B`, buffer); + target.push(buffer); + }; +} +//# sourceMappingURL=git-executor-chain.js.map +}); + +var gitExecutor = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitExecutor = void 0; + +class GitExecutor { + constructor(binary = 'git', cwd, _scheduler, _plugins) { + this.binary = binary; + this.cwd = cwd; + this._scheduler = _scheduler; + this._plugins = _plugins; + this._chain = new gitExecutorChain.GitExecutorChain(this, this._scheduler, this._plugins); + } + chain() { + return new gitExecutorChain.GitExecutorChain(this, this._scheduler, this._plugins); + } + push(task) { + return this._chain.push(task); + } +} +exports.GitExecutor = GitExecutor; +//# sourceMappingURL=git-executor.js.map +}); + +var taskCallback_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.taskCallback = void 0; + + +function taskCallback(task, response, callback = utils.NOOP) { + const onSuccess = (data) => { + callback(null, data); + }; + const onError = (err) => { + if ((err === null || err === void 0 ? void 0 : err.task) === task) { + if (err instanceof gitResponseError.GitResponseError) { + return callback(addDeprecationNoticeToError(err)); + } + callback(err); + } + }; + response.then(onSuccess, onError); +} +exports.taskCallback = taskCallback; +function addDeprecationNoticeToError(err) { + let log = (name) => { + console.warn(`simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`); + log = utils.NOOP; + }; + return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {})); + function descriptorReducer(all, name) { + if (name in err) { + return all; + } + all[name] = { + enumerable: false, + configurable: false, + get() { + log(name); + return err.git[name]; + }, + }; + return all; + } +} +//# sourceMappingURL=task-callback.js.map +}); + +var parseRemoteObjects = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.remoteMessagesObjectParsers = void 0; + +function objectEnumerationResult(remoteMessages) { + return (remoteMessages.objects = remoteMessages.objects || { + compressing: 0, + counting: 0, + enumerating: 0, + packReused: 0, + reused: { count: 0, delta: 0 }, + total: { count: 0, delta: 0 } + }); +} +function asObjectCount(source) { + const count = /^\s*(\d+)/.exec(source); + const delta = /delta (\d+)/i.exec(source); + return { + count: utils.asNumber(count && count[1] || '0'), + delta: utils.asNumber(delta && delta[1] || '0'), + }; +} +exports.remoteMessagesObjectParsers = [ + new utils.RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, (result, [action, count]) => { + const key = action.toLowerCase(); + const enumeration = objectEnumerationResult(result.remoteMessages); + Object.assign(enumeration, { [key]: utils.asNumber(count) }); + }), + new utils.RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, (result, [action, count]) => { + const key = action.toLowerCase(); + const enumeration = objectEnumerationResult(result.remoteMessages); + Object.assign(enumeration, { [key]: utils.asNumber(count) }); + }), + new utils.RemoteLineParser(/total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, (result, [total, reused, packReused]) => { + const objects = objectEnumerationResult(result.remoteMessages); + objects.total = asObjectCount(total); + objects.reused = asObjectCount(reused); + objects.packReused = utils.asNumber(packReused); + }), +]; +//# sourceMappingURL=parse-remote-objects.js.map +}); + +var parseRemoteMessages_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RemoteMessageSummary = exports.parseRemoteMessages = void 0; + + +const parsers = [ + new utils.RemoteLineParser(/^remote:\s*(.+)$/, (result, [text]) => { + result.remoteMessages.all.push(text.trim()); + return false; + }), + ...parseRemoteObjects.remoteMessagesObjectParsers, + new utils.RemoteLineParser([/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], (result, [pullRequestUrl]) => { + result.remoteMessages.pullRequestUrl = pullRequestUrl; + }), + new utils.RemoteLineParser([/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], (result, [count, summary, url]) => { + result.remoteMessages.vulnerabilities = { + count: utils.asNumber(count), + summary, + url, + }; + }), +]; +function parseRemoteMessages(_stdOut, stdErr) { + return utils.parseStringResponse({ remoteMessages: new RemoteMessageSummary() }, parsers, stdErr); +} +exports.parseRemoteMessages = parseRemoteMessages; +class RemoteMessageSummary { + constructor() { + this.all = []; + } +} +exports.RemoteMessageSummary = RemoteMessageSummary; +//# sourceMappingURL=parse-remote-messages.js.map +}); + +var parsePush = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parsePushDetail = exports.parsePushResult = void 0; + + +function pushResultPushedItem(local, remote, status) { + const deleted = status.includes('deleted'); + const tag = status.includes('tag') || /^refs\/tags/.test(local); + const alreadyUpdated = !status.includes('new'); + return { + deleted, + tag, + branch: !tag, + new: !alreadyUpdated, + alreadyUpdated, + local, + remote, + }; +} +const parsers = [ + new utils.LineParser(/^Pushing to (.+)$/, (result, [repo]) => { + result.repo = repo; + }), + new utils.LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => { + result.ref = Object.assign(Object.assign({}, (result.ref || {})), { local }); + }), + new utils.LineParser(/^[*-=]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => { + result.pushed.push(pushResultPushedItem(local, remote, type)); + }), + new utils.LineParser(/^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, (result, [local, remote, remoteName]) => { + result.branch = Object.assign(Object.assign({}, (result.branch || {})), { local, + remote, + remoteName }); + }), + new utils.LineParser(/^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, (result, [local, remote, from, to]) => { + result.update = { + head: { + local, + remote, + }, + hash: { + from, + to, + }, + }; + }), +]; +const parsePushResult = (stdOut, stdErr) => { + const pushDetail = exports.parsePushDetail(stdOut, stdErr); + const responseDetail = parseRemoteMessages_1.parseRemoteMessages(stdOut, stdErr); + return Object.assign(Object.assign({}, pushDetail), responseDetail); +}; +exports.parsePushResult = parsePushResult; +const parsePushDetail = (stdOut, stdErr) => { + return utils.parseStringResponse({ pushed: [] }, parsers, stdOut, stdErr); +}; +exports.parsePushDetail = parsePushDetail; +//# sourceMappingURL=parse-push.js.map +}); + +var push = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.pushTask = exports.pushTagsTask = void 0; + + +function pushTagsTask(ref = {}, customArgs) { + utils.append(customArgs, '--tags'); + return pushTask(ref, customArgs); +} +exports.pushTagsTask = pushTagsTask; +function pushTask(ref = {}, customArgs) { + const commands = ['push', ...customArgs]; + if (ref.branch) { + commands.splice(1, 0, ref.branch); + } + if (ref.remote) { + commands.splice(1, 0, ref.remote); + } + utils.remove(commands, '-v'); + utils.append(commands, '--verbose'); + utils.append(commands, '--porcelain'); + return { + commands, + format: 'utf-8', + parser: parsePush.parsePushResult, + }; +} +exports.pushTask = pushTask; +//# sourceMappingURL=push.js.map +}); + +var simpleGitApi = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SimpleGitApi = void 0; + + + + +class SimpleGitApi { + constructor(_executor) { + this._executor = _executor; + } + _runTask(task, then) { + const chain = this._executor.chain(); + const promise = chain.push(task); + if (then) { + taskCallback_1.taskCallback(task, promise, then); + } + return Object.create(this, { + then: { value: promise.then.bind(promise) }, + catch: { value: promise.catch.bind(promise) }, + _executor: { value: chain }, + }); + } + add(files) { + return this._runTask(task.straightThroughStringTask(['add', ...utils.asArray(files)]), utils.trailingFunctionArgument(arguments)); + } + push() { + const task = push.pushTask({ + remote: utils.filterType(arguments[0], utils.filterString), + branch: utils.filterType(arguments[1], utils.filterString), + }, utils.getTrailingOptions(arguments)); + return this._runTask(task, utils.trailingFunctionArgument(arguments)); + } +} +exports.SimpleGitApi = SimpleGitApi; +//# sourceMappingURL=simple-git-api.js.map +}); + +var dist = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createDeferred = exports.deferred = void 0; +/** + * Creates a new `DeferredPromise` + * + * ```typescript + import {deferred} from '@kwsites/promise-deferred`; + ``` + */ +function deferred() { + let done; + let fail; + let status = 'pending'; + const promise = new Promise((_done, _fail) => { + done = _done; + fail = _fail; + }); + return { + promise, + done(result) { + if (status === 'pending') { + status = 'resolved'; + done(result); + } + }, + fail(error) { + if (status === 'pending') { + status = 'rejected'; + fail(error); + } + }, + get fulfilled() { + return status !== 'pending'; + }, + get status() { + return status; + }, + }; +} +exports.deferred = deferred; +/** + * Alias of the exported `deferred` function, to help consumers wanting to use `deferred` as the + * local variable name rather than the factory import name, without needing to rename on import. + * + * ```typescript + import {createDeferred} from '@kwsites/promise-deferred`; + ``` + */ +exports.createDeferred = deferred; +/** + * Default export allows use as: + * + * ```typescript + import deferred from '@kwsites/promise-deferred`; + ``` + */ +exports.default = deferred; +//# sourceMappingURL=index.js.map +}); + +var scheduler = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Scheduler = void 0; + + + +const createScheduledTask = (() => { + let id = 0; + return () => { + id++; + const { promise, done } = dist.createDeferred(); + return { + promise, + done, + id, + }; + }; +})(); +class Scheduler { + constructor(concurrency = 2) { + this.concurrency = concurrency; + this.logger = gitLogger.createLogger('', 'scheduler'); + this.pending = []; + this.running = []; + this.logger(`Constructed, concurrency=%s`, concurrency); + } + schedule() { + if (!this.pending.length || this.running.length >= this.concurrency) { + this.logger(`Schedule attempt ignored, pending=%s running=%s concurrency=%s`, this.pending.length, this.running.length, this.concurrency); + return; + } + const task = utils.append(this.running, this.pending.shift()); + this.logger(`Attempting id=%s`, task.id); + task.done(() => { + this.logger(`Completing id=`, task.id); + utils.remove(this.running, task); + this.schedule(); + }); + } + next() { + const { promise, id } = utils.append(this.pending, createScheduledTask()); + this.logger(`Scheduling id=%s`, id); + this.schedule(); + return promise; + } +} +exports.Scheduler = Scheduler; +//# sourceMappingURL=scheduler.js.map +}); + +var applyPatch = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.applyPatchTask = void 0; + +function applyPatchTask(patches, customArgs) { + return task.straightThroughStringTask(['apply', ...customArgs, ...patches]); +} +exports.applyPatchTask = applyPatchTask; +//# sourceMappingURL=apply-patch.js.map +}); + +var BranchDeleteSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isSingleBranchDeleteFailure = exports.branchDeletionFailure = exports.branchDeletionSuccess = exports.BranchDeletionBatch = void 0; +class BranchDeletionBatch { + constructor() { + this.all = []; + this.branches = {}; + this.errors = []; + } + get success() { + return !this.errors.length; + } +} +exports.BranchDeletionBatch = BranchDeletionBatch; +function branchDeletionSuccess(branch, hash) { + return { + branch, hash, success: true, + }; +} +exports.branchDeletionSuccess = branchDeletionSuccess; +function branchDeletionFailure(branch) { + return { + branch, hash: null, success: false, + }; +} +exports.branchDeletionFailure = branchDeletionFailure; +function isSingleBranchDeleteFailure(test) { + return test.success; +} +exports.isSingleBranchDeleteFailure = isSingleBranchDeleteFailure; +//# sourceMappingURL=BranchDeleteSummary.js.map +}); + +var parseBranchDelete = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.hasBranchDeletionError = exports.parseBranchDeletions = void 0; + + +const deleteSuccessRegex = /(\S+)\s+\(\S+\s([^)]+)\)/; +const deleteErrorRegex = /^error[^']+'([^']+)'/m; +const parsers = [ + new utils.LineParser(deleteSuccessRegex, (result, [branch, hash]) => { + const deletion = BranchDeleteSummary.branchDeletionSuccess(branch, hash); + result.all.push(deletion); + result.branches[branch] = deletion; + }), + new utils.LineParser(deleteErrorRegex, (result, [branch]) => { + const deletion = BranchDeleteSummary.branchDeletionFailure(branch); + result.errors.push(deletion); + result.all.push(deletion); + result.branches[branch] = deletion; + }), +]; +const parseBranchDeletions = (stdOut, stdErr) => { + return utils.parseStringResponse(new BranchDeleteSummary.BranchDeletionBatch(), parsers, stdOut, stdErr); +}; +exports.parseBranchDeletions = parseBranchDeletions; +function hasBranchDeletionError(data, processExitCode) { + return processExitCode === utils.ExitCodes.ERROR && deleteErrorRegex.test(data); +} +exports.hasBranchDeletionError = hasBranchDeletionError; +//# sourceMappingURL=parse-branch-delete.js.map +}); + +var BranchSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BranchSummaryResult = void 0; +class BranchSummaryResult { + constructor() { + this.all = []; + this.branches = {}; + this.current = ''; + this.detached = false; + } + push(current, detached, name, commit, label) { + if (current) { + this.detached = detached; + this.current = name; + } + this.all.push(name); + this.branches[name] = { + current: current, + name: name, + commit: commit, + label: label + }; + } +} +exports.BranchSummaryResult = BranchSummaryResult; +//# sourceMappingURL=BranchSummary.js.map +}); + +var parseBranch = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseBranchSummary = void 0; + + +const parsers = [ + new utils.LineParser(/^(\*\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, (result, [current, name, commit, label]) => { + result.push(!!current, true, name, commit, label); + }), + new utils.LineParser(/^(\*\s)?(\S+)\s+([a-z0-9]+)\s(.*)$/s, (result, [current, name, commit, label]) => { + result.push(!!current, false, name, commit, label); + }) +]; +function parseBranchSummary(stdOut) { + return utils.parseStringResponse(new BranchSummary.BranchSummaryResult(), parsers, stdOut); +} +exports.parseBranchSummary = parseBranchSummary; +//# sourceMappingURL=parse-branch.js.map +}); + +var branch = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.deleteBranchTask = exports.deleteBranchesTask = exports.branchLocalTask = exports.branchTask = exports.containsDeleteBranchCommand = void 0; + + + + +function containsDeleteBranchCommand(commands) { + const deleteCommands = ['-d', '-D', '--delete']; + return commands.some(command => deleteCommands.includes(command)); +} +exports.containsDeleteBranchCommand = containsDeleteBranchCommand; +function branchTask(customArgs) { + const isDelete = containsDeleteBranchCommand(customArgs); + const commands = ['branch', ...customArgs]; + if (commands.length === 1) { + commands.push('-a'); + } + if (!commands.includes('-v')) { + commands.splice(1, 0, '-v'); + } + return { + format: 'utf-8', + commands, + parser(stdOut, stdErr) { + if (isDelete) { + return parseBranchDelete.parseBranchDeletions(stdOut, stdErr).all[0]; + } + return parseBranch.parseBranchSummary(stdOut); + }, + }; +} +exports.branchTask = branchTask; +function branchLocalTask() { + const parser = parseBranch.parseBranchSummary; + return { + format: 'utf-8', + commands: ['branch', '-v'], + parser, + }; +} +exports.branchLocalTask = branchLocalTask; +function deleteBranchesTask(branches, forceDelete = false) { + return { + format: 'utf-8', + commands: ['branch', '-v', forceDelete ? '-D' : '-d', ...branches], + parser(stdOut, stdErr) { + return parseBranchDelete.parseBranchDeletions(stdOut, stdErr); + }, + onError({ exitCode, stdOut }, error, done, fail) { + if (!parseBranchDelete.hasBranchDeletionError(String(error), exitCode)) { + return fail(error); + } + done(stdOut); + }, + }; +} +exports.deleteBranchesTask = deleteBranchesTask; +function deleteBranchTask(branch, forceDelete = false) { + const task = { + format: 'utf-8', + commands: ['branch', '-v', forceDelete ? '-D' : '-d', branch], + parser(stdOut, stdErr) { + return parseBranchDelete.parseBranchDeletions(stdOut, stdErr).branches[branch]; + }, + onError({ exitCode, stdErr, stdOut }, error, _, fail) { + if (!parseBranchDelete.hasBranchDeletionError(String(error), exitCode)) { + return fail(error); + } + throw new gitResponseError.GitResponseError(task.parser(utils.bufferToString(stdOut), utils.bufferToString(stdErr)), String(error)); + }, + }; + return task; +} +exports.deleteBranchTask = deleteBranchTask; +//# sourceMappingURL=branch.js.map +}); + +var CheckIgnore = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseCheckIgnore = void 0; +/** + * Parser for the `check-ignore` command - returns each file as a string array + */ +const parseCheckIgnore = (text) => { + return text.split(/\n/g) + .map(line => line.trim()) + .filter(file => !!file); +}; +exports.parseCheckIgnore = parseCheckIgnore; +//# sourceMappingURL=CheckIgnore.js.map +}); + +var checkIgnore = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.checkIgnoreTask = void 0; + +function checkIgnoreTask(paths) { + return { + commands: ['check-ignore', ...paths], + format: 'utf-8', + parser: CheckIgnore.parseCheckIgnore, + }; +} +exports.checkIgnoreTask = checkIgnoreTask; +//# sourceMappingURL=check-ignore.js.map +}); + +var clone = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.cloneMirrorTask = exports.cloneTask = void 0; + + +function cloneTask(repo, directory, customArgs) { + const commands = ['clone', ...customArgs]; + if (typeof repo === 'string') { + commands.push(repo); + } + if (typeof directory === 'string') { + commands.push(directory); + } + return task.straightThroughStringTask(commands); +} +exports.cloneTask = cloneTask; +function cloneMirrorTask(repo, directory, customArgs) { + utils.append(customArgs, '--mirror'); + return cloneTask(repo, directory, customArgs); +} +exports.cloneMirrorTask = cloneMirrorTask; +//# sourceMappingURL=clone.js.map +}); + +var ConfigList_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.configListParser = exports.ConfigList = void 0; + +class ConfigList { + constructor() { + this.files = []; + this.values = Object.create(null); + } + get all() { + if (!this._all) { + this._all = this.files.reduce((all, file) => { + return Object.assign(all, this.values[file]); + }, {}); + } + return this._all; + } + addFile(file) { + if (!(file in this.values)) { + const latest = utils.last(this.files); + this.values[file] = latest ? Object.create(this.values[latest]) : {}; + this.files.push(file); + } + return this.values[file]; + } + addValue(file, key, value) { + const values = this.addFile(file); + if (!values.hasOwnProperty(key)) { + values[key] = value; + } + else if (Array.isArray(values[key])) { + values[key].push(value); + } + else { + values[key] = [values[key], value]; + } + this._all = undefined; + } +} +exports.ConfigList = ConfigList; +function configListParser(text) { + const config = new ConfigList(); + const lines = text.split('\0'); + for (let i = 0, max = lines.length - 1; i < max;) { + const file = configFilePath(lines[i++]); + const [key, value] = utils.splitOn(lines[i++], '\n'); + config.addValue(file, key, value); + } + return config; +} +exports.configListParser = configListParser; +function configFilePath(filePath) { + return filePath.replace(/^(file):/, ''); +} +//# sourceMappingURL=ConfigList.js.map +}); + +var config = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.listConfigTask = exports.addConfigTask = void 0; + +function addConfigTask(key, value, append = false) { + const commands = ['config', '--local']; + if (append) { + commands.push('--add'); + } + commands.push(key, value); + return { + commands, + format: 'utf-8', + parser(text) { + return text; + } + }; +} +exports.addConfigTask = addConfigTask; +function listConfigTask() { + return { + commands: ['config', '--list', '--show-origin', '--null'], + format: 'utf-8', + parser(text) { + return ConfigList_1.configListParser(text); + }, + }; +} +exports.listConfigTask = listConfigTask; +//# sourceMappingURL=config.js.map +}); + +var parseCommit = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseCommitResult = void 0; + +const parsers = [ + new utils.LineParser(/\[([^\s]+)( \([^)]+\))? ([^\]]+)/, (result, [branch, root, commit]) => { + result.branch = branch; + result.commit = commit; + result.root = !!root; + }), + new utils.LineParser(/\s*Author:\s(.+)/i, (result, [author]) => { + const parts = author.split('<'); + const email = parts.pop(); + if (!email || !email.includes('@')) { + return; + } + result.author = { + email: email.substr(0, email.length - 1), + name: parts.join('<').trim() + }; + }), + new utils.LineParser(/(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, (result, [changes, insertions, deletions]) => { + result.summary.changes = parseInt(changes, 10) || 0; + result.summary.insertions = parseInt(insertions, 10) || 0; + result.summary.deletions = parseInt(deletions, 10) || 0; + }), + new utils.LineParser(/^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, (result, [changes, lines, direction]) => { + result.summary.changes = parseInt(changes, 10) || 0; + const count = parseInt(lines, 10) || 0; + if (direction === '-') { + result.summary.deletions = count; + } + else if (direction === '+') { + result.summary.insertions = count; + } + }), +]; +function parseCommitResult(stdOut) { + const result = { + author: null, + branch: '', + commit: '', + root: false, + summary: { + changes: 0, + insertions: 0, + deletions: 0, + }, + }; + return utils.parseStringResponse(result, parsers, stdOut); +} +exports.parseCommitResult = parseCommitResult; +//# sourceMappingURL=parse-commit.js.map +}); + +var commit = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.commitTask = void 0; + +function commitTask(message, files, customArgs) { + const commands = ['commit']; + message.forEach((m) => commands.push('-m', m)); + commands.push(...files, ...customArgs); + return { + commands, + format: 'utf-8', + parser: parseCommit.parseCommitResult, + }; +} +exports.commitTask = commitTask; +//# sourceMappingURL=commit.js.map +}); + +var DiffSummary_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DiffSummary = void 0; +/*** + * The DiffSummary is returned as a response to getting `git().status()` + */ +class DiffSummary { + constructor() { + this.changed = 0; + this.deletions = 0; + this.insertions = 0; + this.files = []; + } +} +exports.DiffSummary = DiffSummary; +//# sourceMappingURL=DiffSummary.js.map +}); + +var parseDiffSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseDiffResult = void 0; + +function parseDiffResult(stdOut) { + const lines = stdOut.trim().split('\n'); + const status = new DiffSummary_1.DiffSummary(); + readSummaryLine(status, lines.pop()); + for (let i = 0, max = lines.length; i < max; i++) { + const line = lines[i]; + textFileChange(line, status) || binaryFileChange(line, status); + } + return status; +} +exports.parseDiffResult = parseDiffResult; +function readSummaryLine(status, summary) { + (summary || '') + .trim() + .split(', ') + .forEach(function (text) { + const summary = /(\d+)\s([a-z]+)/.exec(text); + if (!summary) { + return; + } + summaryType(status, summary[2], parseInt(summary[1], 10)); + }); +} +function summaryType(status, key, value) { + const match = (/([a-z]+?)s?\b/.exec(key)); + if (!match || !statusUpdate[match[1]]) { + return; + } + statusUpdate[match[1]](status, value); +} +const statusUpdate = { + file(status, value) { + status.changed = value; + }, + deletion(status, value) { + status.deletions = value; + }, + insertion(status, value) { + status.insertions = value; + } +}; +function textFileChange(input, { files }) { + const line = input.trim().match(/^(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/); + if (line) { + var alterations = (line[3] || '').trim(); + files.push({ + file: line[1].trim(), + changes: parseInt(line[2], 10), + insertions: alterations.replace(/-/g, '').length, + deletions: alterations.replace(/\+/g, '').length, + binary: false + }); + return true; + } + return false; +} +function binaryFileChange(input, { files }) { + const line = input.match(/^(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)$/); + if (line) { + files.push({ + file: line[1].trim(), + before: +line[2], + after: +line[3], + binary: true + }); + return true; + } + return false; +} +//# sourceMappingURL=parse-diff-summary.js.map +}); + +var diff = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.diffSummaryTask = void 0; + +function diffSummaryTask(customArgs) { + return { + commands: ['diff', '--stat=4096', ...customArgs], + format: 'utf-8', + parser(stdOut) { + return parseDiffSummary.parseDiffResult(stdOut); + } + }; +} +exports.diffSummaryTask = diffSummaryTask; +//# sourceMappingURL=diff.js.map +}); + +var parseFetch = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseFetchResult = void 0; + +const parsers = [ + new utils.LineParser(/From (.+)$/, (result, [remote]) => { + result.remote = remote; + }), + new utils.LineParser(/\* \[new branch]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { + result.branches.push({ + name, + tracking, + }); + }), + new utils.LineParser(/\* \[new tag]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { + result.tags.push({ + name, + tracking, + }); + }) +]; +function parseFetchResult(stdOut, stdErr) { + const result = { + raw: stdOut, + remote: null, + branches: [], + tags: [], + }; + return utils.parseStringResponse(result, parsers, stdOut, stdErr); +} +exports.parseFetchResult = parseFetchResult; +//# sourceMappingURL=parse-fetch.js.map +}); + +var fetch = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fetchTask = void 0; + +function fetchTask(remote, branch, customArgs) { + const commands = ['fetch', ...customArgs]; + if (remote && branch) { + commands.push(remote, branch); + } + return { + commands, + format: 'utf-8', + parser: parseFetch.parseFetchResult, + }; +} +exports.fetchTask = fetchTask; +//# sourceMappingURL=fetch.js.map +}); + +var hashObject = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.hashObjectTask = void 0; + +/** + * Task used by `git.hashObject` + */ +function hashObjectTask(filePath, write) { + const commands = ['hash-object', filePath]; + if (write) { + commands.push('-w'); + } + return task.straightThroughStringTask(commands, true); +} +exports.hashObjectTask = hashObjectTask; +//# sourceMappingURL=hash-object.js.map +}); + +var InitSummary_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseInit = exports.InitSummary = void 0; +class InitSummary { + constructor(bare, path, existing, gitDir) { + this.bare = bare; + this.path = path; + this.existing = existing; + this.gitDir = gitDir; + } +} +exports.InitSummary = InitSummary; +const initResponseRegex = /^Init.+ repository in (.+)$/; +const reInitResponseRegex = /^Rein.+ in (.+)$/; +function parseInit(bare, path, text) { + const response = String(text).trim(); + let result; + if ((result = initResponseRegex.exec(response))) { + return new InitSummary(bare, path, false, result[1]); + } + if ((result = reInitResponseRegex.exec(response))) { + return new InitSummary(bare, path, true, result[1]); + } + let gitDir = ''; + const tokens = response.split(' '); + while (tokens.length) { + const token = tokens.shift(); + if (token === 'in') { + gitDir = tokens.join(' '); + break; + } + } + return new InitSummary(bare, path, /^re/i.test(response), gitDir); +} +exports.parseInit = parseInit; +//# sourceMappingURL=InitSummary.js.map +}); + +var init = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.initTask = void 0; + +const bareCommand = '--bare'; +function hasBareCommand(command) { + return command.includes(bareCommand); +} +function initTask(bare = false, path, customArgs) { + const commands = ['init', ...customArgs]; + if (bare && !hasBareCommand(commands)) { + commands.splice(1, 0, bareCommand); + } + return { + commands, + format: 'utf-8', + parser(text) { + return InitSummary_1.parseInit(commands.includes('--bare'), path, text); + } + }; +} +exports.initTask = initTask; +//# sourceMappingURL=init.js.map +}); + +var parseListLogSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createListLogSummaryParser = exports.SPLITTER = exports.COMMIT_BOUNDARY = exports.START_BOUNDARY = void 0; + + +exports.START_BOUNDARY = 'òòòòòò '; +exports.COMMIT_BOUNDARY = ' òò'; +exports.SPLITTER = ' ò '; +const defaultFieldNames = ['hash', 'date', 'message', 'refs', 'author_name', 'author_email']; +function lineBuilder(tokens, fields) { + return fields.reduce((line, field, index) => { + line[field] = tokens[index] || ''; + return line; + }, Object.create({ diff: null })); +} +function createListLogSummaryParser(splitter = exports.SPLITTER, fields = defaultFieldNames) { + return function (stdOut) { + const all = utils.toLinesWithContent(stdOut, true, exports.START_BOUNDARY) + .map(function (item) { + const lineDetail = item.trim().split(exports.COMMIT_BOUNDARY); + const listLogLine = lineBuilder(lineDetail[0].trim().split(splitter), fields); + if (lineDetail.length > 1 && !!lineDetail[1].trim()) { + listLogLine.diff = parseDiffSummary.parseDiffResult(lineDetail[1]); + } + return listLogLine; + }); + return { + all, + latest: all.length && all[0] || null, + total: all.length, + }; + }; +} +exports.createListLogSummaryParser = createListLogSummaryParser; +//# sourceMappingURL=parse-list-log-summary.js.map +}); + +var log = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.logTask = exports.parseLogOptions = void 0; + + +var excludeOptions; +(function (excludeOptions) { + excludeOptions[excludeOptions["--pretty"] = 0] = "--pretty"; + excludeOptions[excludeOptions["max-count"] = 1] = "max-count"; + excludeOptions[excludeOptions["maxCount"] = 2] = "maxCount"; + excludeOptions[excludeOptions["n"] = 3] = "n"; + excludeOptions[excludeOptions["file"] = 4] = "file"; + excludeOptions[excludeOptions["format"] = 5] = "format"; + excludeOptions[excludeOptions["from"] = 6] = "from"; + excludeOptions[excludeOptions["to"] = 7] = "to"; + excludeOptions[excludeOptions["splitter"] = 8] = "splitter"; + excludeOptions[excludeOptions["symmetric"] = 9] = "symmetric"; + excludeOptions[excludeOptions["multiLine"] = 10] = "multiLine"; + excludeOptions[excludeOptions["strictDate"] = 11] = "strictDate"; +})(excludeOptions || (excludeOptions = {})); +function prettyFormat(format, splitter) { + const fields = []; + const formatStr = []; + Object.keys(format).forEach((field) => { + fields.push(field); + formatStr.push(String(format[field])); + }); + return [ + fields, formatStr.join(splitter) + ]; +} +function userOptions(input) { + const output = Object.assign({}, input); + Object.keys(input).forEach(key => { + if (key in excludeOptions) { + delete output[key]; + } + }); + return output; +} +function parseLogOptions(opt = {}, customArgs = []) { + const splitter = opt.splitter || parseListLogSummary.SPLITTER; + const format = opt.format || { + hash: '%H', + date: opt.strictDate === false ? '%ai' : '%aI', + message: '%s', + refs: '%D', + body: opt.multiLine ? '%B' : '%b', + author_name: '%aN', + author_email: '%ae' + }; + const [fields, formatStr] = prettyFormat(format, splitter); + const suffix = []; + const command = [ + `--pretty=format:${parseListLogSummary.START_BOUNDARY}${formatStr}${parseListLogSummary.COMMIT_BOUNDARY}`, + ...customArgs, + ]; + const maxCount = opt.n || opt['max-count'] || opt.maxCount; + if (maxCount) { + command.push(`--max-count=${maxCount}`); + } + if (opt.from && opt.to) { + const rangeOperator = (opt.symmetric !== false) ? '...' : '..'; + suffix.push(`${opt.from}${rangeOperator}${opt.to}`); + } + if (opt.file) { + suffix.push('--follow', opt.file); + } + utils.appendTaskOptions(userOptions(opt), command); + return { + fields, + splitter, + commands: [ + ...command, + ...suffix, + ], + }; +} +exports.parseLogOptions = parseLogOptions; +function logTask(splitter, fields, customArgs) { + return { + commands: ['log', ...customArgs], + format: 'utf-8', + parser: parseListLogSummary.createListLogSummaryParser(splitter, fields), + }; +} +exports.logTask = logTask; +//# sourceMappingURL=log.js.map +}); + +var MergeSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MergeSummaryDetail = exports.MergeSummaryConflict = void 0; +class MergeSummaryConflict { + constructor(reason, file = null, meta) { + this.reason = reason; + this.file = file; + this.meta = meta; + } + toString() { + return `${this.file}:${this.reason}`; + } +} +exports.MergeSummaryConflict = MergeSummaryConflict; +class MergeSummaryDetail { + constructor() { + this.conflicts = []; + this.merges = []; + this.result = 'success'; + } + get failed() { + return this.conflicts.length > 0; + } + get reason() { + return this.result; + } + toString() { + if (this.conflicts.length) { + return `CONFLICTS: ${this.conflicts.join(', ')}`; + } + return 'OK'; + } +} +exports.MergeSummaryDetail = MergeSummaryDetail; +//# sourceMappingURL=MergeSummary.js.map +}); + +var PullSummary_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PullSummary = void 0; +class PullSummary { + constructor() { + this.remoteMessages = { + all: [], + }; + this.created = []; + this.deleted = []; + this.files = []; + this.deletions = {}; + this.insertions = {}; + this.summary = { + changes: 0, + deletions: 0, + insertions: 0, + }; + } +} +exports.PullSummary = PullSummary; +//# sourceMappingURL=PullSummary.js.map +}); + +var parsePull = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parsePullResult = exports.parsePullDetail = void 0; + + + +const FILE_UPDATE_REGEX = /^\s*(.+?)\s+\|\s+\d+\s*(\+*)(-*)/; +const SUMMARY_REGEX = /(\d+)\D+((\d+)\D+\(\+\))?(\D+(\d+)\D+\(-\))?/; +const ACTION_REGEX = /^(create|delete) mode \d+ (.+)/; +const parsers = [ + new utils.LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => { + result.files.push(file); + if (insertions) { + result.insertions[file] = insertions.length; + } + if (deletions) { + result.deletions[file] = deletions.length; + } + }), + new utils.LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => { + if (insertions !== undefined || deletions !== undefined) { + result.summary.changes = +changes || 0; + result.summary.insertions = +insertions || 0; + result.summary.deletions = +deletions || 0; + return true; + } + return false; + }), + new utils.LineParser(ACTION_REGEX, (result, [action, file]) => { + utils.append(result.files, file); + utils.append((action === 'create') ? result.created : result.deleted, file); + }), +]; +const parsePullDetail = (stdOut, stdErr) => { + return utils.parseStringResponse(new PullSummary_1.PullSummary(), parsers, stdOut, stdErr); +}; +exports.parsePullDetail = parsePullDetail; +const parsePullResult = (stdOut, stdErr) => { + return Object.assign(new PullSummary_1.PullSummary(), exports.parsePullDetail(stdOut, stdErr), parseRemoteMessages_1.parseRemoteMessages(stdOut, stdErr)); +}; +exports.parsePullResult = parsePullResult; +//# sourceMappingURL=parse-pull.js.map +}); + +var parseMerge = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseMergeDetail = exports.parseMergeResult = void 0; + + + +const parsers = [ + new utils.LineParser(/^Auto-merging\s+(.+)$/, (summary, [autoMerge]) => { + summary.merges.push(autoMerge); + }), + new utils.LineParser(/^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, (summary, [reason, file]) => { + summary.conflicts.push(new MergeSummary.MergeSummaryConflict(reason, file)); + }), + new utils.LineParser(/^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, (summary, [reason, file, deleteRef]) => { + summary.conflicts.push(new MergeSummary.MergeSummaryConflict(reason, file, { deleteRef })); + }), + new utils.LineParser(/^CONFLICT\s+\((.+)\):/, (summary, [reason]) => { + summary.conflicts.push(new MergeSummary.MergeSummaryConflict(reason, null)); + }), + new utils.LineParser(/^Automatic merge failed;\s+(.+)$/, (summary, [result]) => { + summary.result = result; + }), +]; +/** + * Parse the complete response from `git.merge` + */ +const parseMergeResult = (stdOut, stdErr) => { + return Object.assign(exports.parseMergeDetail(stdOut, stdErr), parsePull.parsePullResult(stdOut, stdErr)); +}; +exports.parseMergeResult = parseMergeResult; +/** + * Parse the merge specific detail (ie: not the content also available in the pull detail) from `git.mnerge` + * @param stdOut + */ +const parseMergeDetail = (stdOut) => { + return utils.parseStringResponse(new MergeSummary.MergeSummaryDetail(), parsers, stdOut); +}; +exports.parseMergeDetail = parseMergeDetail; +//# sourceMappingURL=parse-merge.js.map +}); + +var merge = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mergeTask = void 0; + + + +function mergeTask(customArgs) { + if (!customArgs.length) { + return task.configurationErrorTask('Git.merge requires at least one option'); + } + return { + commands: ['merge', ...customArgs], + format: 'utf-8', + parser(stdOut, stdErr) { + const merge = parseMerge.parseMergeResult(stdOut, stdErr); + if (merge.failed) { + throw new gitResponseError.GitResponseError(merge); + } + return merge; + } + }; +} +exports.mergeTask = mergeTask; +//# sourceMappingURL=merge.js.map +}); + +var parseMove = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseMoveResult = void 0; + +const parsers = [ + new utils.LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => { + result.moves.push({ from, to }); + }), +]; +function parseMoveResult(stdOut) { + return utils.parseStringResponse({ moves: [] }, parsers, stdOut); +} +exports.parseMoveResult = parseMoveResult; +//# sourceMappingURL=parse-move.js.map +}); + +var move = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.moveTask = void 0; + + +function moveTask(from, to) { + return { + commands: ['mv', '-v', ...utils.asArray(from), to], + format: 'utf-8', + parser: parseMove.parseMoveResult, + }; +} +exports.moveTask = moveTask; +//# sourceMappingURL=move.js.map +}); + +var pull = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.pullTask = void 0; + +function pullTask(remote, branch, customArgs) { + const commands = ['pull', ...customArgs]; + if (remote && branch) { + commands.splice(1, 0, remote, branch); + } + return { + commands, + format: 'utf-8', + parser(stdOut, stdErr) { + return parsePull.parsePullResult(stdOut, stdErr); + } + }; +} +exports.pullTask = pullTask; +//# sourceMappingURL=pull.js.map +}); + +var GetRemoteSummary = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseGetRemotesVerbose = exports.parseGetRemotes = void 0; + +function parseGetRemotes(text) { + const remotes = {}; + forEach(text, ([name]) => remotes[name] = { name }); + return Object.values(remotes); +} +exports.parseGetRemotes = parseGetRemotes; +function parseGetRemotesVerbose(text) { + const remotes = {}; + forEach(text, ([name, url, purpose]) => { + if (!remotes.hasOwnProperty(name)) { + remotes[name] = { + name: name, + refs: { fetch: '', push: '' }, + }; + } + if (purpose && url) { + remotes[name].refs[purpose.replace(/[^a-z]/g, '')] = url; + } + }); + return Object.values(remotes); +} +exports.parseGetRemotesVerbose = parseGetRemotesVerbose; +function forEach(text, handler) { + utils.forEachLineWithContent(text, (line) => handler(line.split(/\s+/))); +} +//# sourceMappingURL=GetRemoteSummary.js.map +}); + +var remote = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.removeRemoteTask = exports.remoteTask = exports.listRemotesTask = exports.getRemotesTask = exports.addRemoteTask = void 0; + + +function addRemoteTask(remoteName, remoteRepo, customArgs = []) { + return task.straightThroughStringTask(['remote', 'add', ...customArgs, remoteName, remoteRepo]); +} +exports.addRemoteTask = addRemoteTask; +function getRemotesTask(verbose) { + const commands = ['remote']; + if (verbose) { + commands.push('-v'); + } + return { + commands, + format: 'utf-8', + parser: verbose ? GetRemoteSummary.parseGetRemotesVerbose : GetRemoteSummary.parseGetRemotes, + }; +} +exports.getRemotesTask = getRemotesTask; +function listRemotesTask(customArgs = []) { + const commands = [...customArgs]; + if (commands[0] !== 'ls-remote') { + commands.unshift('ls-remote'); + } + return task.straightThroughStringTask(commands); +} +exports.listRemotesTask = listRemotesTask; +function remoteTask(customArgs = []) { + const commands = [...customArgs]; + if (commands[0] !== 'remote') { + commands.unshift('remote'); + } + return task.straightThroughStringTask(commands); +} +exports.remoteTask = remoteTask; +function removeRemoteTask(remoteName) { + return task.straightThroughStringTask(['remote', 'remove', remoteName]); +} +exports.removeRemoteTask = removeRemoteTask; +//# sourceMappingURL=remote.js.map +}); + +var stashList = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.stashListTask = void 0; + + +function stashListTask(opt = {}, customArgs) { + const options = log.parseLogOptions(opt); + const parser = parseListLogSummary.createListLogSummaryParser(options.splitter, options.fields); + return { + commands: ['stash', 'list', ...options.commands, ...customArgs], + format: 'utf-8', + parser, + }; +} +exports.stashListTask = stashListTask; +//# sourceMappingURL=stash-list.js.map +}); + +var FileStatusSummary_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FileStatusSummary = exports.fromPathRegex = void 0; +exports.fromPathRegex = /^(.+) -> (.+)$/; +class FileStatusSummary { + constructor(path, index, working_dir) { + this.path = path; + this.index = index; + this.working_dir = working_dir; + if ('R' === (index + working_dir)) { + const detail = exports.fromPathRegex.exec(path) || [null, path, path]; + this.from = detail[1] || ''; + this.path = detail[2] || ''; + } + } +} +exports.FileStatusSummary = FileStatusSummary; +//# sourceMappingURL=FileStatusSummary.js.map +}); + +var StatusSummary_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseStatusSummary = exports.StatusSummary = void 0; + + +/** + * The StatusSummary is returned as a response to getting `git().status()` + */ +class StatusSummary { + constructor() { + this.not_added = []; + this.conflicted = []; + this.created = []; + this.deleted = []; + this.modified = []; + this.renamed = []; + /** + * All files represented as an array of objects containing the `path` and status in `index` and + * in the `working_dir`. + */ + this.files = []; + this.staged = []; + /** + * Number of commits ahead of the tracked branch + */ + this.ahead = 0; + /** + *Number of commits behind the tracked branch + */ + this.behind = 0; + /** + * Name of the current branch + */ + this.current = null; + /** + * Name of the branch being tracked + */ + this.tracking = null; + } + /** + * Gets whether this StatusSummary represents a clean working branch. + */ + isClean() { + return !this.files.length; + } +} +exports.StatusSummary = StatusSummary; +var PorcelainFileStatus; +(function (PorcelainFileStatus) { + PorcelainFileStatus["ADDED"] = "A"; + PorcelainFileStatus["DELETED"] = "D"; + PorcelainFileStatus["MODIFIED"] = "M"; + PorcelainFileStatus["RENAMED"] = "R"; + PorcelainFileStatus["COPIED"] = "C"; + PorcelainFileStatus["UNMERGED"] = "U"; + PorcelainFileStatus["UNTRACKED"] = "?"; + PorcelainFileStatus["IGNORED"] = "!"; + PorcelainFileStatus["NONE"] = " "; +})(PorcelainFileStatus || (PorcelainFileStatus = {})); +function renamedFile(line) { + const detail = /^(.+) -> (.+)$/.exec(line); + if (!detail) { + return { + from: line, to: line + }; + } + return { + from: String(detail[1]), + to: String(detail[2]), + }; +} +function parser(indexX, indexY, handler) { + return [`${indexX}${indexY}`, handler]; +} +function conflicts(indexX, ...indexY) { + return indexY.map(y => parser(indexX, y, (result, file) => utils.append(result.conflicted, file))); +} +const parsers = new Map([ + parser(PorcelainFileStatus.NONE, PorcelainFileStatus.ADDED, (result, file) => utils.append(result.created, file)), + parser(PorcelainFileStatus.NONE, PorcelainFileStatus.DELETED, (result, file) => utils.append(result.deleted, file)), + parser(PorcelainFileStatus.NONE, PorcelainFileStatus.MODIFIED, (result, file) => utils.append(result.modified, file)), + parser(PorcelainFileStatus.ADDED, PorcelainFileStatus.NONE, (result, file) => utils.append(result.created, file) && utils.append(result.staged, file)), + parser(PorcelainFileStatus.ADDED, PorcelainFileStatus.MODIFIED, (result, file) => utils.append(result.created, file) && utils.append(result.staged, file) && utils.append(result.modified, file)), + parser(PorcelainFileStatus.DELETED, PorcelainFileStatus.NONE, (result, file) => utils.append(result.deleted, file) && utils.append(result.staged, file)), + parser(PorcelainFileStatus.MODIFIED, PorcelainFileStatus.NONE, (result, file) => utils.append(result.modified, file) && utils.append(result.staged, file)), + parser(PorcelainFileStatus.MODIFIED, PorcelainFileStatus.MODIFIED, (result, file) => utils.append(result.modified, file) && utils.append(result.staged, file)), + parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.NONE, (result, file) => { + utils.append(result.renamed, renamedFile(file)); + }), + parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.MODIFIED, (result, file) => { + const renamed = renamedFile(file); + utils.append(result.renamed, renamed); + utils.append(result.modified, renamed.to); + }), + parser(PorcelainFileStatus.UNTRACKED, PorcelainFileStatus.UNTRACKED, (result, file) => utils.append(result.not_added, file)), + ...conflicts(PorcelainFileStatus.ADDED, PorcelainFileStatus.ADDED, PorcelainFileStatus.UNMERGED), + ...conflicts(PorcelainFileStatus.DELETED, PorcelainFileStatus.DELETED, PorcelainFileStatus.UNMERGED), + ...conflicts(PorcelainFileStatus.UNMERGED, PorcelainFileStatus.ADDED, PorcelainFileStatus.DELETED, PorcelainFileStatus.UNMERGED), + ['##', (result, line) => { + const aheadReg = /ahead (\d+)/; + const behindReg = /behind (\d+)/; + const currentReg = /^(.+?(?=(?:\.{3}|\s|$)))/; + const trackingReg = /\.{3}(\S*)/; + const onEmptyBranchReg = /\son\s([\S]+)$/; + let regexResult; + regexResult = aheadReg.exec(line); + result.ahead = regexResult && +regexResult[1] || 0; + regexResult = behindReg.exec(line); + result.behind = regexResult && +regexResult[1] || 0; + regexResult = currentReg.exec(line); + result.current = regexResult && regexResult[1]; + regexResult = trackingReg.exec(line); + result.tracking = regexResult && regexResult[1]; + regexResult = onEmptyBranchReg.exec(line); + result.current = regexResult && regexResult[1] || result.current; + }] +]); +const parseStatusSummary = function (text) { + const lines = text.trim().split('\n'); + const status = new StatusSummary(); + for (let i = 0, l = lines.length; i < l; i++) { + splitLine(status, lines[i]); + } + return status; +}; +exports.parseStatusSummary = parseStatusSummary; +function splitLine(result, lineStr) { + const trimmed = lineStr.trim(); + switch (' ') { + case trimmed.charAt(2): + return data(trimmed.charAt(0), trimmed.charAt(1), trimmed.substr(3)); + case trimmed.charAt(1): + return data(PorcelainFileStatus.NONE, trimmed.charAt(0), trimmed.substr(2)); + default: + return; + } + function data(index, workingDir, path) { + const raw = `${index}${workingDir}`; + const handler = parsers.get(raw); + if (handler) { + handler(result, path); + } + if (raw !== '##') { + result.files.push(new FileStatusSummary_1.FileStatusSummary(path, index, workingDir)); + } + } +} +//# sourceMappingURL=StatusSummary.js.map +}); + +var status = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.statusTask = void 0; + +function statusTask(customArgs) { + return { + format: 'utf-8', + commands: ['status', '--porcelain', '-b', '-u', ...customArgs], + parser(text) { + return StatusSummary_1.parseStatusSummary(text); + } + }; +} +exports.statusTask = statusTask; +//# sourceMappingURL=status.js.map +}); + +var subModule = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.updateSubModuleTask = exports.subModuleTask = exports.initSubModuleTask = exports.addSubModuleTask = void 0; + +function addSubModuleTask(repo, path) { + return subModuleTask(['add', repo, path]); +} +exports.addSubModuleTask = addSubModuleTask; +function initSubModuleTask(customArgs) { + return subModuleTask(['init', ...customArgs]); +} +exports.initSubModuleTask = initSubModuleTask; +function subModuleTask(customArgs) { + const commands = [...customArgs]; + if (commands[0] !== 'submodule') { + commands.unshift('submodule'); + } + return task.straightThroughStringTask(commands); +} +exports.subModuleTask = subModuleTask; +function updateSubModuleTask(customArgs) { + return subModuleTask(['update', ...customArgs]); +} +exports.updateSubModuleTask = updateSubModuleTask; +//# sourceMappingURL=sub-module.js.map +}); + +var TagList_1 = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseTagList = exports.TagList = void 0; +class TagList { + constructor(all, latest) { + this.all = all; + this.latest = latest; + } +} +exports.TagList = TagList; +const parseTagList = function (data, customSort = false) { + const tags = data + .split('\n') + .map(trimmed) + .filter(Boolean); + if (!customSort) { + tags.sort(function (tagA, tagB) { + const partsA = tagA.split('.'); + const partsB = tagB.split('.'); + if (partsA.length === 1 || partsB.length === 1) { + return singleSorted(toNumber(partsA[0]), toNumber(partsB[0])); + } + for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) { + const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i])); + if (diff) { + return diff; + } + } + return 0; + }); + } + const latest = customSort ? tags[0] : [...tags].reverse().find((tag) => tag.indexOf('.') >= 0); + return new TagList(tags, latest); +}; +exports.parseTagList = parseTagList; +function singleSorted(a, b) { + const aIsNum = isNaN(a); + const bIsNum = isNaN(b); + if (aIsNum !== bIsNum) { + return aIsNum ? 1 : -1; + } + return aIsNum ? sorted(a, b) : 0; +} +function sorted(a, b) { + return a === b ? 0 : a > b ? 1 : -1; +} +function trimmed(input) { + return input.trim(); +} +function toNumber(input) { + if (typeof input === 'string') { + return parseInt(input.replace(/^\D+/g, ''), 10) || 0; + } + return 0; +} +//# sourceMappingURL=TagList.js.map +}); + +var tag = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.addAnnotatedTagTask = exports.addTagTask = exports.tagListTask = void 0; + +/** + * Task used by `git.tags` + */ +function tagListTask(customArgs = []) { + const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option)); + return { + format: 'utf-8', + commands: ['tag', '-l', ...customArgs], + parser(text) { + return TagList_1.parseTagList(text, hasCustomSort); + }, + }; +} +exports.tagListTask = tagListTask; +/** + * Task used by `git.addTag` + */ +function addTagTask(name) { + return { + format: 'utf-8', + commands: ['tag', name], + parser() { + return { name }; + } + }; +} +exports.addTagTask = addTagTask; +/** + * Task used by `git.addTag` + */ +function addAnnotatedTagTask(name, tagMessage) { + return { + format: 'utf-8', + commands: ['tag', '-a', '-m', tagMessage, name], + parser() { + return { name }; + } + }; +} +exports.addAnnotatedTagTask = addAnnotatedTagTask; +//# sourceMappingURL=tag.js.map +}); + +const {GitExecutor} = gitExecutor; +const {SimpleGitApi} = simpleGitApi; + +const {Scheduler} = scheduler; +const {GitLogger} = gitLogger; +const {adhocExecTask, configurationErrorTask} = task; +const { + NOOP, + asArray, + filterArray, + filterPrimitives, + filterString, + filterStringOrStringArray, + filterType, + folderExists, + getTrailingOptions, + trailingFunctionArgument, + trailingOptionsArgument +} = utils; +const {applyPatchTask} = applyPatch; +const {branchTask, branchLocalTask, deleteBranchesTask, deleteBranchTask} = branch; +const {checkIgnoreTask} = checkIgnore; +const {checkIsRepoTask} = checkIsRepo; +const {cloneTask, cloneMirrorTask} = clone; +const {addConfigTask, listConfigTask} = config; +const {cleanWithOptionsTask, isCleanOptionsArray} = clean; +const {commitTask} = commit; +const {diffSummaryTask} = diff; +const {fetchTask} = fetch; +const {hashObjectTask} = hashObject; +const {initTask} = init; +const {logTask, parseLogOptions} = log; +const {mergeTask} = merge; +const {moveTask} = move; +const {pullTask} = pull; +const {pushTagsTask} = push; +const {addRemoteTask, getRemotesTask, listRemotesTask, remoteTask, removeRemoteTask} = remote; +const {getResetMode, resetTask} = reset; +const {stashListTask} = stashList; +const {statusTask} = status; +const {addSubModuleTask, initSubModuleTask, subModuleTask, updateSubModuleTask} = subModule; +const {addAnnotatedTagTask, addTagTask, tagListTask} = tag; +const {straightThroughBufferTask, straightThroughStringTask} = task; + +function Git (options, plugins) { + this._executor = new GitExecutor( + options.binary, options.baseDir, + new Scheduler(options.maxConcurrentProcesses), plugins, + ); + this._logger = new GitLogger(); +} + +(Git.prototype = Object.create(SimpleGitApi.prototype)).constructor = Git; + +/** + * Logging utility for printing out info or error messages to the user + * @type {GitLogger} + * @private + */ +Git.prototype._logger = null; + +/** + * Sets the path to a custom git binary, should either be `git` when there is an installation of git available on + * the system path, or a fully qualified path to the executable. + * + * @param {string} command + * @returns {Git} + */ +Git.prototype.customBinary = function (command) { + this._executor.binary = command; + return this; +}; + +/** + * Sets an environment variable for the spawned child process, either supply both a name and value as strings or + * a single object to entirely replace the current environment variables. + * + * @param {string|Object} name + * @param {string} [value] + * @returns {Git} + */ +Git.prototype.env = function (name, value) { + if (arguments.length === 1 && typeof name === 'object') { + this._executor.env = name; + } else { + (this._executor.env = this._executor.env || {})[name] = value; + } + + return this; +}; + +/** + * Sets the working directory of the subsequent commands. + */ +Git.prototype.cwd = function (workingDirectory) { + const task = (typeof workingDirectory !== 'string') + ? configurationErrorTask('Git.cwd: workingDirectory must be supplied as a string') + : adhocExecTask(() => { + if (!folderExists(workingDirectory)) { + throw new Error(`Git.cwd: cannot change to non-directory "${ workingDirectory }"`); + } + + return (this._executor.cwd = workingDirectory); + }); + + return this._runTask(task, trailingFunctionArgument(arguments) || NOOP); +}; + +/** + * Sets a handler function to be called whenever a new child process is created, the handler function will be called + * with the name of the command being run and the stdout & stderr streams used by the ChildProcess. + * + * @example + * require('simple-git') + * .outputHandler(function (command, stdout, stderr) { + * stdout.pipe(process.stdout); + * }) + * .checkout('https://github.com/user/repo.git'); + * + * @see https://nodejs.org/api/child_process.html#child_process_class_childprocess + * @see https://nodejs.org/api/stream.html#stream_class_stream_readable + * @param {Function} outputHandler + * @returns {Git} + */ +Git.prototype.outputHandler = function (outputHandler) { + this._executor.outputHandler = outputHandler; + return this; +}; + +/** + * Initialize a git repo + * + * @param {Boolean} [bare=false] + * @param {Function} [then] + */ +Git.prototype.init = function (bare, then) { + return this._runTask( + initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Check the status of the local repo + */ +Git.prototype.status = function () { + return this._runTask( + statusTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * List the stash(s) of the local repo + */ +Git.prototype.stashList = function (options) { + return this._runTask( + stashListTask( + trailingOptionsArgument(arguments) || {}, + filterArray(options) && options || [] + ), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Stash the local repo + * + * @param {Object|Array} [options] + * @param {Function} [then] + */ +Git.prototype.stash = function (options, then) { + return this._runTask( + straightThroughStringTask(['stash', ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments), + ); +}; + +function createCloneTask (api, task, repoPath, localPath) { + if (typeof repoPath !== 'string') { + return configurationErrorTask(`git.${ api }() requires a string 'repoPath'`); + } + + return task(repoPath, filterType(localPath, filterString), getTrailingOptions(arguments)); +} + + +/** + * Clone a git repo + */ +Git.prototype.clone = function () { + return this._runTask( + createCloneTask('clone', cloneTask, ...arguments), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Mirror a git repo + */ +Git.prototype.mirror = function () { + return this._runTask( + createCloneTask('mirror', cloneMirrorTask, ...arguments), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Moves one or more files to a new destination. + * + * @see https://git-scm.com/docs/git-mv + * + * @param {string|string[]} from + * @param {string} to + */ +Git.prototype.mv = function (from, to) { + return this._runTask(moveTask(from, to), trailingFunctionArgument(arguments)); +}; + +/** + * Internally uses pull and tags to get the list of tags then checks out the latest tag. + * + * @param {Function} [then] + */ +Git.prototype.checkoutLatestTag = function (then) { + var git = this; + return this.pull(function () { + git.tags(function (err, tags) { + git.checkout(tags.latest, then); + }); + }); +}; + +/** + * Commits changes in the current working directory - when specific file paths are supplied, only changes on those + * files will be committed. + * + * @param {string|string[]} message + * @param {string|string[]} [files] + * @param {Object} [options] + * @param {Function} [then] + */ +Git.prototype.commit = function (message, files, options, then) { + const next = trailingFunctionArgument(arguments); + const messages = []; + + if (filterStringOrStringArray(message)) { + messages.push(...asArray(message)); + } else { + console.warn('simple-git deprecation notice: git.commit: requires the commit message to be supplied as a string/string[], this will be an error in version 3'); + } + + return this._runTask( + commitTask( + messages, + asArray(filterType(files, filterStringOrStringArray, [])), + [...filterType(options, filterArray, []), ...getTrailingOptions(arguments, 0, true)] + ), + next + ); +}; + +/** + * Pull the updated contents of the current repo + */ +Git.prototype.pull = function (remote, branch, options, then) { + return this._runTask( + pullTask(filterType(remote, filterString), filterType(branch, filterString), getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Fetch the updated contents of the current repo. + * + * @example + * .fetch('upstream', 'master') // fetches from master on remote named upstream + * .fetch(function () {}) // runs fetch against default remote and branch and calls function + * + * @param {string} [remote] + * @param {string} [branch] + */ +Git.prototype.fetch = function (remote, branch) { + return this._runTask( + fetchTask(filterType(remote, filterString), filterType(branch, filterString), getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Disables/enables the use of the console for printing warnings and errors, by default messages are not shown in + * a production environment. + * + * @param {boolean} silence + * @returns {Git} + */ +Git.prototype.silent = function (silence) { + console.warn('simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3'); + this._logger.silent(!!silence); + return this; +}; + +/** + * List all tags. When using git 2.7.0 or above, include an options object with `"--sort": "property-name"` to + * sort the tags by that property instead of using the default semantic versioning sort. + * + * Note, supplying this option when it is not supported by your Git version will cause the operation to fail. + * + * @param {Object} [options] + * @param {Function} [then] + */ +Git.prototype.tags = function (options, then) { + return this._runTask( + tagListTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Rebases the current working copy. Options can be supplied either as an array of string parameters + * to be sent to the `git rebase` command, or a standard options object. + */ +Git.prototype.rebase = function () { + return this._runTask( + straightThroughStringTask(['rebase', ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments) + ); +}; + +/** + * Reset a repo + */ +Git.prototype.reset = function (mode) { + return this._runTask( + resetTask(getResetMode(mode), getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Revert one or more commits in the local working copy + */ +Git.prototype.revert = function (commit) { + const next = trailingFunctionArgument(arguments); + + if (typeof commit !== 'string') { + return this._runTask( + configurationErrorTask('Commit must be a string'), + next, + ); + } + + return this._runTask( + straightThroughStringTask(['revert', ...getTrailingOptions(arguments, 0, true), commit]), + next + ); +}; + +/** + * Add a lightweight tag to the head of the current branch + */ +Git.prototype.addTag = function (name) { + const task = (typeof name === 'string') + ? addTagTask(name) + : configurationErrorTask('Git.addTag requires a tag name'); + + return this._runTask(task, trailingFunctionArgument(arguments)); +}; + +/** + * Add an annotated tag to the head of the current branch + */ +Git.prototype.addAnnotatedTag = function (tagName, tagMessage) { + return this._runTask( + addAnnotatedTagTask(tagName, tagMessage), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Check out a tag or revision, any number of additional arguments can be passed to the `git checkout` command + * by supplying either a string or array of strings as the first argument. + */ +Git.prototype.checkout = function () { + const commands = ['checkout', ...getTrailingOptions(arguments, true)]; + return this._runTask( + straightThroughStringTask(commands), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Check out a remote branch + * + * @param {string} branchName name of branch + * @param {string} startPoint (e.g origin/development) + * @param {Function} [then] + */ +Git.prototype.checkoutBranch = function (branchName, startPoint, then) { + return this.checkout(['-b', branchName, startPoint], trailingFunctionArgument(arguments)); +}; + +/** + * Check out a local branch + */ +Git.prototype.checkoutLocalBranch = function (branchName, then) { + return this.checkout(['-b', branchName], trailingFunctionArgument(arguments)); +}; + +/** + * Delete a local branch + */ +Git.prototype.deleteLocalBranch = function (branchName, forceDelete, then) { + return this._runTask( + deleteBranchTask(branchName, typeof forceDelete === "boolean" ? forceDelete : false), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Delete one or more local branches + */ +Git.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) { + return this._runTask( + deleteBranchesTask(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), + trailingFunctionArgument(arguments), + ); +}; + +/** + * List all branches + * + * @param {Object | string[]} [options] + * @param {Function} [then] + */ +Git.prototype.branch = function (options, then) { + return this._runTask( + branchTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Return list of local branches + * + * @param {Function} [then] + */ +Git.prototype.branchLocal = function (then) { + return this._runTask( + branchLocalTask(), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Add config to local git instance + * + * @param {string} key configuration key (e.g user.name) + * @param {string} value for the given key (e.g your name) + * @param {boolean} [append=false] optionally append the key/value pair (equivalent of passing `--add` option). + * @param {Function} [then] + */ +Git.prototype.addConfig = function (key, value, append, then) { + return this._runTask( + addConfigTask(key, value, typeof append === "boolean" ? append : false), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.listConfig = function () { + return this._runTask(listConfigTask(), trailingFunctionArgument(arguments)); +}; + +/** + * Executes any command against the git binary. + */ +Git.prototype.raw = function (commands) { + const createRestCommands = !Array.isArray(commands); + const command = [].slice.call(createRestCommands ? arguments : commands, 0); + + for (let i = 0; i < command.length && createRestCommands; i++) { + if (!filterPrimitives(command[i])) { + command.splice(i, command.length - i); + break; + } + } + + command.push( + ...getTrailingOptions(arguments, 0, true), + ); + + var next = trailingFunctionArgument(arguments); + + if (!command.length) { + return this._runTask( + configurationErrorTask('Raw: must supply one or more command to execute'), + next, + ); + } + + return this._runTask(straightThroughStringTask(command), next); +}; + +Git.prototype.submoduleAdd = function (repo, path, then) { + return this._runTask( + addSubModuleTask(repo, path), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.submoduleUpdate = function (args, then) { + return this._runTask( + updateSubModuleTask(getTrailingOptions(arguments, true)), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.submoduleInit = function (args, then) { + return this._runTask( + initSubModuleTask(getTrailingOptions(arguments, true)), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.subModule = function (options, then) { + return this._runTask( + subModuleTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.listRemote = function () { + return this._runTask( + listRemotesTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Adds a remote to the list of remotes. + */ +Git.prototype.addRemote = function (remoteName, remoteRepo, then) { + return this._runTask( + addRemoteTask(remoteName, remoteRepo, getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Removes an entry by name from the list of remotes. + */ +Git.prototype.removeRemote = function (remoteName, then) { + return this._runTask( + removeRemoteTask(remoteName), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Gets the currently available remotes, setting the optional verbose argument to true includes additional + * detail on the remotes themselves. + */ +Git.prototype.getRemotes = function (verbose, then) { + return this._runTask( + getRemotesTask(verbose === true), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Compute object ID from a file + */ +Git.prototype.hashObject = function (path, write) { + return this._runTask( + hashObjectTask(path, write === true), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Call any `git remote` function with arguments passed as an array of strings. + * + * @param {string[]} options + * @param {Function} [then] + */ +Git.prototype.remote = function (options, then) { + return this._runTask( + remoteTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Merges from one branch to another, equivalent to running `git merge ${from} $[to}`, the `options` argument can + * either be an array of additional parameters to pass to the command or null / omitted to be ignored. + * + * @param {string} from + * @param {string} to + */ +Git.prototype.mergeFromTo = function (from, to) { + if (!(filterString(from) && filterString(to))) { + return this._runTask(configurationErrorTask( + `Git.mergeFromTo requires that the 'from' and 'to' arguments are supplied as strings` + )); + } + + return this._runTask( + mergeTask([from, to, ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments, false), + ); +}; + +/** + * Runs a merge, `options` can be either an array of arguments + * supported by the [`git merge`](https://git-scm.com/docs/git-merge) + * or an options object. + * + * Conflicts during the merge result in an error response, + * the response type whether it was an error or success will be a MergeSummary instance. + * When successful, the MergeSummary has all detail from a the PullSummary + * + * @param {Object | string[]} [options] + * @param {Function} [then] + * @returns {*} + * + * @see ./responses/MergeSummary.js + * @see ./responses/PullSummary.js + */ +Git.prototype.merge = function () { + return this._runTask( + mergeTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Call any `git tag` function with arguments passed as an array of strings. + * + * @param {string[]} options + * @param {Function} [then] + */ +Git.prototype.tag = function (options, then) { + const command = getTrailingOptions(arguments); + + if (command[0] !== 'tag') { + command.unshift('tag'); + } + + return this._runTask( + straightThroughStringTask(command), + trailingFunctionArgument(arguments) + ); +}; + +/** + * Updates repository server info + * + * @param {Function} [then] + */ +Git.prototype.updateServerInfo = function (then) { + return this._runTask( + straightThroughStringTask(['update-server-info']), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Pushes the current tag changes to a remote which can be either a URL or named remote. When not specified uses the + * default configured remote spec. + * + * @param {string} [remote] + * @param {Function} [then] + */ +Git.prototype.pushTags = function (remote, then) { + const task = pushTagsTask({remote: filterType(remote, filterString)}, getTrailingOptions(arguments)); + + return this._runTask(task, trailingFunctionArgument(arguments)); +}; + +/** + * Removes the named files from source control. + */ +Git.prototype.rm = function (files) { + return this._runTask( + straightThroughStringTask(['rm', '-f', ...asArray(files)]), + trailingFunctionArgument(arguments) + ); +}; + +/** + * Removes the named files from source control but keeps them on disk rather than deleting them entirely. To + * completely remove the files, use `rm`. + * + * @param {string|string[]} files + */ +Git.prototype.rmKeepLocal = function (files) { + return this._runTask( + straightThroughStringTask(['rm', '--cached', ...asArray(files)]), + trailingFunctionArgument(arguments) + ); +}; + +/** + * Returns a list of objects in a tree based on commit hash. Passing in an object hash returns the object's content, + * size, and type. + * + * Passing "-p" will instruct cat-file to determine the object type, and display its formatted contents. + * + * @param {string[]} [options] + * @param {Function} [then] + */ +Git.prototype.catFile = function (options, then) { + return this._catFile('utf-8', arguments); +}; + +Git.prototype.binaryCatFile = function () { + return this._catFile('buffer', arguments); +}; + +Git.prototype._catFile = function (format, args) { + var handler = trailingFunctionArgument(args); + var command = ['cat-file']; + var options = args[0]; + + if (typeof options === 'string') { + return this._runTask( + configurationErrorTask('Git.catFile: options must be supplied as an array of strings'), + handler, + ); + } + + if (Array.isArray(options)) { + command.push.apply(command, options); + } + + const task = format === 'buffer' + ? straightThroughBufferTask(command) + : straightThroughStringTask(command); + + return this._runTask(task, handler); +}; + +Git.prototype.diff = function (options, then) { + const command = ['diff', ...getTrailingOptions(arguments)]; + + if (typeof options === 'string') { + command.splice(1, 0, options); + this._logger.warn('Git#diff: supplying options as a single string is now deprecated, switch to an array of strings'); + } + + return this._runTask( + straightThroughStringTask(command), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.diffSummary = function () { + return this._runTask( + diffSummaryTask(getTrailingOptions(arguments, 1)), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.applyPatch = function (patches) { + const task = !filterStringOrStringArray(patches) + ? configurationErrorTask(`git.applyPatch requires one or more string patches as the first argument`) + : applyPatchTask(asArray(patches), getTrailingOptions([].slice.call(arguments, 1))); + + return this._runTask( + task, + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.revparse = function () { + const commands = ['rev-parse', ...getTrailingOptions(arguments, true)]; + return this._runTask( + straightThroughStringTask(commands, true), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Show various types of objects, for example the file at a certain commit + * + * @param {string[]} [options] + * @param {Function} [then] + */ +Git.prototype.show = function (options, then) { + return this._runTask( + straightThroughStringTask(['show', ...getTrailingOptions(arguments, 1)]), + trailingFunctionArgument(arguments) + ); +}; + +/** + */ +Git.prototype.clean = function (mode, options, then) { + const usingCleanOptionsArray = isCleanOptionsArray(mode); + const cleanMode = usingCleanOptionsArray && mode.join('') || filterType(mode, filterString) || ''; + const customArgs = getTrailingOptions([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0)); + + return this._runTask( + cleanWithOptionsTask(cleanMode, customArgs), + trailingFunctionArgument(arguments), + ); +}; + +/** + * Call a simple function at the next step in the chain. + * @param {Function} [then] + */ +Git.prototype.exec = function (then) { + const task = { + commands: [], + format: 'utf-8', + parser () { + if (typeof then === 'function') { + then(); + } + } + }; + + return this._runTask(task); +}; + +/** + * Show commit logs from `HEAD` to the first commit. + * If provided between `options.from` and `options.to` tags or branch. + * + * Additionally you can provide options.file, which is the path to a file in your repository. Then only this file will be considered. + * + * To use a custom splitter in the log format, set `options.splitter` to be the string the log should be split on. + * + * Options can also be supplied as a standard options object for adding custom properties supported by the git log command. + * For any other set of options, supply options as an array of strings to be appended to the git log command. + */ +Git.prototype.log = function (options) { + const next = trailingFunctionArgument(arguments); + + if (filterString(arguments[0]) && filterString(arguments[1])) { + return this._runTask( + configurationErrorTask(`git.log(string, string) should be replaced with git.log({ from: string, to: string })`), + next + ); + } + + const parsedOptions = parseLogOptions( + trailingOptionsArgument(arguments) || {}, + filterArray(options) && options || [] + ); + + return this._runTask( + logTask(parsedOptions.splitter, parsedOptions.fields, parsedOptions.commands), + next, + ) +}; + +/** + * Clears the queue of pending commands and returns the wrapper instance for chaining. + * + * @returns {Git} + */ +Git.prototype.clearQueue = function () { + // TODO: + // this._executor.clear(); + return this; +}; + +/** + * Check if a pathname or pathnames are excluded by .gitignore + * + * @param {string|string[]} pathnames + * @param {Function} [then] + */ +Git.prototype.checkIgnore = function (pathnames, then) { + return this._runTask( + checkIgnoreTask(asArray((filterType(pathnames, filterStringOrStringArray, [])))), + trailingFunctionArgument(arguments), + ); +}; + +Git.prototype.checkIsRepo = function (checkType, then) { + return this._runTask( + checkIsRepoTask(filterType(checkType, filterString)), + trailingFunctionArgument(arguments), + ); +}; + +var git = Git; + +var gitFactory = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.gitInstanceFactory = exports.gitExportFactory = exports.esModuleFactory = void 0; + + + + +/** + * Adds the necessary properties to the supplied object to enable it for use as + * the default export of a module. + * + * Eg: `module.exports = esModuleFactory({ something () {} })` + */ +function esModuleFactory(defaultExport) { + return Object.defineProperties(defaultExport, { + __esModule: { value: true }, + default: { value: defaultExport }, + }); +} +exports.esModuleFactory = esModuleFactory; +function gitExportFactory(factory, extra) { + return Object.assign(function (...args) { + return factory.apply(null, args); + }, api_1.default, extra || {}); +} +exports.gitExportFactory = gitExportFactory; +function gitInstanceFactory(baseDir, options) { + const plugins$1 = new plugins.PluginStore(); + const config = utils.createInstanceConfig(baseDir && (typeof baseDir === 'string' ? { baseDir } : baseDir) || {}, options); + if (!utils.folderExists(config.baseDir)) { + throw new api_1.default.GitConstructError(config, `Cannot use simple-git on a directory that does not exist`); + } + if (Array.isArray(config.config)) { + plugins$1.add(plugins.commandConfigPrefixingPlugin(config.config)); + } + config.progress && plugins$1.add(plugins.progressMonitorPlugin(config.progress)); + config.timeout && plugins$1.add(plugins.timeoutPlugin(config.timeout)); + plugins$1.add(plugins.errorDetectionPlugin(plugins.errorDetectionHandler(true))); + config.errors && plugins$1.add(plugins.errorDetectionPlugin(config.errors)); + return new git(config, plugins$1); +} +exports.gitInstanceFactory = gitInstanceFactory; +//# sourceMappingURL=git-factory.js.map +}); + +var promiseWrapped = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports, "__esModule", { value: true }); +exports.gitP = void 0; + + +const functionNamesBuilderApi = [ + 'customBinary', 'env', 'outputHandler', 'silent', +]; +const functionNamesPromiseApi = [ + 'add', + 'addAnnotatedTag', + 'addConfig', + 'addRemote', + 'addTag', + 'applyPatch', + 'binaryCatFile', + 'branch', + 'branchLocal', + 'catFile', + 'checkIgnore', + 'checkIsRepo', + 'checkout', + 'checkoutBranch', + 'checkoutLatestTag', + 'checkoutLocalBranch', + 'clean', + 'clone', + 'commit', + 'cwd', + 'deleteLocalBranch', + 'deleteLocalBranches', + 'diff', + 'diffSummary', + 'exec', + 'fetch', + 'getRemotes', + 'init', + 'listConfig', + 'listRemote', + 'log', + 'merge', + 'mergeFromTo', + 'mirror', + 'mv', + 'pull', + 'push', + 'pushTags', + 'raw', + 'rebase', + 'remote', + 'removeRemote', + 'reset', + 'revert', + 'revparse', + 'rm', + 'rmKeepLocal', + 'show', + 'stash', + 'stashList', + 'status', + 'subModule', + 'submoduleAdd', + 'submoduleInit', + 'submoduleUpdate', + 'tag', + 'tags', + 'updateServerInfo' +]; +function gitP(...args) { + let git; + let chain = Promise.resolve(); + try { + git = gitFactory.gitInstanceFactory(...args); + } + catch (e) { + chain = Promise.reject(e); + } + function builderReturn() { + return promiseApi; + } + function chainReturn() { + return chain; + } + const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce((api, name) => { + const isAsync = functionNamesPromiseApi.includes(name); + const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api); + const alternative = isAsync ? chainReturn : builderReturn; + Object.defineProperty(api, name, { + enumerable: false, + configurable: false, + value: git ? valid : alternative, + }); + return api; + }, {}); + return promiseApi; + function asyncWrapper(fn, git) { + return function (...args) { + if (typeof args[args.length] === 'function') { + throw new TypeError('Promise interface requires that handlers are not supplied inline, ' + + 'trailing function not allowed in call to ' + fn); + } + return chain.then(function () { + return new Promise(function (resolve, reject) { + const callback = (err, result) => { + if (err) { + return reject(toError(err)); + } + resolve(result); + }; + args.push(callback); + git[fn].apply(git, args); + }); + }); + }; + } + function syncWrapper(fn, git, api) { + return (...args) => { + git[fn](...args); + return api; + }; + } +} +exports.gitP = gitP; +function toError(error) { + if (error instanceof Error) { + return error; + } + if (typeof error === 'string') { + return new Error(error); + } + return new gitResponseError.GitResponseError(error); +} +//# sourceMappingURL=promise-wrapped.js.map +}); + +const {gitP} = promiseWrapped; +const {esModuleFactory, gitInstanceFactory, gitExportFactory} = gitFactory; + +var src = esModuleFactory( + gitExportFactory(gitInstanceFactory, {gitP}) +); + +var PluginState; +(function (PluginState) { + PluginState[PluginState["idle"] = 0] = "idle"; + PluginState[PluginState["status"] = 1] = "status"; + PluginState[PluginState["pull"] = 2] = "pull"; + PluginState[PluginState["add"] = 3] = "add"; + PluginState[PluginState["commit"] = 4] = "commit"; + PluginState[PluginState["push"] = 5] = "push"; + PluginState[PluginState["conflicted"] = 6] = "conflicted"; +})(PluginState || (PluginState = {})); +var DEFAULT_SETTINGS = { + commitMessage: "vault backup: {{date}}", + commitDateFormat: "YYYY-MM-DD HH:mm:ss", + autoSaveInterval: 0, + autoPullInterval: 0, + autoPullOnBoot: false, + disablePush: false, + pullBeforePush: true, + disablePopups: false, + listChangedFilesInMessageBody: false, + showStatusBar: true, + lastAutoBackUp: "", + lastAutoPull: "" +}; +var ObsidianGit = /** @class */ (function (_super) { + __extends(ObsidianGit, _super); + function ObsidianGit() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.gitReady = false; + _this.promiseQueue = new PromiseQueue(); + _this.conflictOutputFile = "conflict-files-obsidian-git.md"; + return _this; + // endregion: displaying / formatting stuff + } + ObsidianGit.prototype.setState = function (state) { + var _a; + this.state = state; + (_a = this.statusBar) === null || _a === void 0 ? void 0 : _a.display(); + }; + ObsidianGit.prototype.onload = function () { + return __awaiter(this, void 0, void 0, function () { + var statusBarEl; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log('loading ' + this.manifest.name + " plugin"); + return [4 /*yield*/, this.loadSettings()]; + case 1: + _a.sent(); + this.addSettingTab(new ObsidianGitSettingsTab(this.app, this)); + this.addCommand({ + id: "pull", + name: "Pull from remote repository", + callback: function () { return _this.promiseQueue.addTask(function () { return _this.pullChangesFromRemote(); }); }, + }); + this.addCommand({ + id: "push", + name: "Commit *all* changes and push to remote repository", + callback: function () { return _this.promiseQueue.addTask(function () { return _this.createBackup(false); }); } + }); + this.addCommand({ + id: "commit-push-specified-message", + name: "Commit and push all changes with specified message", + callback: function () { return new CustomMessageModal(_this).open(); } + }); + this.addCommand({ + id: "list-changed-files", + name: "List changed files", + callback: function () { return __awaiter(_this, void 0, void 0, function () { + var status; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.git.status()]; + case 1: + status = _a.sent(); + new ChangedFilesModal(this, status.files).open(); + return [2 /*return*/]; + } + }); + }); } + }); + if (this.settings.showStatusBar) { + statusBarEl = this.addStatusBarItem(); + this.statusBar = new StatusBar(statusBarEl, this); + this.registerInterval(window.setInterval(function () { return _this.statusBar.display(); }, 1000)); + } + this.init(); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.onunload = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + window.clearTimeout(this.timeoutIDBackup); + window.clearTimeout(this.timeoutIDPull); + console.log('unloading ' + this.manifest.name + " plugin"); + return [2 /*return*/]; + }); + }); + }; + ObsidianGit.prototype.loadSettings = function () { + return __awaiter(this, void 0, void 0, function () { + var _a, _b, _c, _d; + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + _a = this; + _c = (_b = Object).assign; + _d = [{}, DEFAULT_SETTINGS]; + return [4 /*yield*/, this.loadData()]; + case 1: + _a.settings = _c.apply(_b, _d.concat([_e.sent()])); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.saveSettings = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.saveData(this.settings)]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.init = function () { + return __awaiter(this, void 0, void 0, function () { + var adapter, path, isValidRepo, now, last, diff, now, last, diff, error_1; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!this.isGitInstalled()) { + this.displayError("Cannot run git command"); + return [2 /*return*/]; + } + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + adapter = this.app.vault.adapter; + path = adapter.getBasePath(); + this.git = src(path); + return [4 /*yield*/, this.git.checkIsRepo()]; + case 2: + isValidRepo = _a.sent(); + if (!isValidRepo) { + this.displayError("Valid git repository not found."); + } + else { + this.gitReady = true; + this.setState(PluginState.idle); + if (this.settings.autoPullOnBoot) { + this.promiseQueue.addTask(function () { return _this.pullChangesFromRemote(); }); + } + if (this.settings.autoSaveInterval > 0) { + now = new Date(); + last = new Date(this.settings.lastAutoBackUp); + diff = this.settings.autoSaveInterval - (Math.round(((now.getTime() - last.getTime()) / 1000) / 60)); + this.startAutoBackup(diff <= 0 ? 0 : diff); + } + if (this.settings.autoPullInterval > 0) { + now = new Date(); + last = new Date(this.settings.lastAutoPull); + diff = this.settings.autoPullInterval - (Math.round(((now.getTime() - last.getTime()) / 1000) / 60)); + this.startAutoPull(diff <= 0 ? 0 : diff); + } + } + return [3 /*break*/, 4]; + case 3: + error_1 = _a.sent(); + this.displayError(error_1); + console.error(error_1); + return [3 /*break*/, 4]; + case 4: return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.pullChangesFromRemote = function () { + return __awaiter(this, void 0, void 0, function () { + var filesUpdated, status; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!!this.gitReady) return [3 /*break*/, 2]; + return [4 /*yield*/, this.init()]; + case 1: + _a.sent(); + _a.label = 2; + case 2: + if (!this.gitReady) + return [2 /*return*/]; + return [4 /*yield*/, this.pull()]; + case 3: + filesUpdated = _a.sent(); + if (filesUpdated > 0) { + this.displayMessage("Pulled new changes. " + filesUpdated + " files updated"); + } + else { + this.displayMessage("Everything is up-to-date"); + } + return [4 /*yield*/, this.git.status()]; + case 4: + status = _a.sent(); + if (status.conflicted.length > 0) { + this.displayError("You have " + status.conflicted.length + " conflict files"); + } + this.lastUpdate = Date.now(); + this.setState(PluginState.idle); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.createBackup = function (fromAutoBackup, commitMessage) { + return __awaiter(this, void 0, void 0, function () { + var status, file, changedFiles, trackingBranch, currentBranch, remoteChangedFiles, pulledFilesLength, remoteChangedFiles_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!!this.gitReady) return [3 /*break*/, 2]; + return [4 /*yield*/, this.init()]; + case 1: + _a.sent(); + _a.label = 2; + case 2: + if (!this.gitReady) + return [2 /*return*/]; + this.setState(PluginState.status); + return [4 /*yield*/, this.git.status()]; + case 3: + status = _a.sent(); + if (!!fromAutoBackup) return [3 /*break*/, 5]; + file = this.app.vault.getAbstractFileByPath(this.conflictOutputFile); + return [4 /*yield*/, this.app.vault.delete(file)]; + case 4: + _a.sent(); + _a.label = 5; + case 5: + // check for conflict files on auto backup + if (fromAutoBackup && status.conflicted.length > 0) { + this.setState(PluginState.idle); + this.displayError("Did not commit, because you have " + status.conflicted.length + " conflict files. Please resolve them and commit per command."); + this.handleConflict(status.conflicted); + return [2 /*return*/]; + } + return [4 /*yield*/, this.git.status()]; + case 6: + changedFiles = (_a.sent()).files; + if (!(changedFiles.length !== 0)) return [3 /*break*/, 10]; + return [4 /*yield*/, this.add()]; + case 7: + _a.sent(); + return [4 /*yield*/, this.git.status()]; + case 8: + status = _a.sent(); + return [4 /*yield*/, this.commit(commitMessage)]; + case 9: + _a.sent(); + this.lastUpdate = Date.now(); + this.displayMessage("Committed " + status.staged.length + " files"); + return [3 /*break*/, 11]; + case 10: + this.displayMessage("No changes to commit"); + _a.label = 11; + case 11: + if (!!this.settings.disablePush) return [3 /*break*/, 21]; + trackingBranch = status.tracking; + currentBranch = status.current; + if (!trackingBranch) { + this.displayError("Did not push. No upstream branch is set! See README for instructions", 10000); + this.setState(PluginState.idle); + return [2 /*return*/]; + } + return [4 /*yield*/, this.git.diffSummary([currentBranch, trackingBranch])]; + case 12: + remoteChangedFiles = (_a.sent()).changed; + if (!(remoteChangedFiles > 0)) return [3 /*break*/, 20]; + if (!this.settings.pullBeforePush) return [3 /*break*/, 14]; + return [4 /*yield*/, this.pull()]; + case 13: + pulledFilesLength = _a.sent(); + if (pulledFilesLength > 0) { + this.displayMessage("Pulled " + pulledFilesLength + " files from remote"); + } + _a.label = 14; + case 14: return [4 /*yield*/, this.git.status()]; + case 15: + // Refresh because of pull + status = _a.sent(); + if (!(status.conflicted.length > 0)) return [3 /*break*/, 16]; + this.displayError("Cannot push. You have " + status.conflicted.length + " conflict files"); + this.handleConflict(status.conflicted); + return [2 /*return*/]; + case 16: return [4 /*yield*/, this.git.diffSummary([currentBranch, trackingBranch])]; + case 17: + remoteChangedFiles_1 = (_a.sent()).changed; + return [4 /*yield*/, this.push()]; + case 18: + _a.sent(); + this.displayMessage("Pushed " + remoteChangedFiles_1 + " files to remote"); + _a.label = 19; + case 19: return [3 /*break*/, 21]; + case 20: + this.displayMessage("No changes to push"); + _a.label = 21; + case 21: + this.setState(PluginState.idle); + return [2 /*return*/]; + } + }); + }); + }; + // region: main methods + ObsidianGit.prototype.isGitInstalled = function () { + // https://github.com/steveukx/git-js/issues/402 + var command = child_process_1.spawnSync('git', ['--version'], { + stdio: 'ignore' + }); + if (command.error) { + console.error(command.error); + return false; + } + return true; + }; + ObsidianGit.prototype.add = function () { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.setState(PluginState.add); + return [4 /*yield*/, this.git.add("./*", function (err) { + return err && _this.displayError("Cannot add files: " + err.message); + })]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.commit = function (message) { + return __awaiter(this, void 0, void 0, function () { + var commitMessage, _a, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + this.setState(PluginState.commit); + if (!(message !== null && message !== void 0)) return [3 /*break*/, 1]; + _a = message; + return [3 /*break*/, 3]; + case 1: return [4 /*yield*/, this.formatCommitMessage(this.settings.commitMessage)]; + case 2: + _a = _c.sent(); + _c.label = 3; + case 3: + commitMessage = _a; + if (!this.settings.listChangedFilesInMessageBody) return [3 /*break*/, 5]; + _b = [commitMessage, "Affected files:"]; + return [4 /*yield*/, this.git.status()]; + case 4: + commitMessage = _b.concat([(_c.sent()).staged.join("\n")]); + _c.label = 5; + case 5: return [4 /*yield*/, this.git.commit(commitMessage)]; + case 6: + _c.sent(); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.push = function () { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.setState(PluginState.push); + return [4 /*yield*/, this.git.env(__assign(__assign({}, process.env), { "OBSIDIAN_GIT": 1 })).push(function (err) { + err && _this.displayError("Push failed " + err.message); + })]; + case 1: + _a.sent(); + this.lastUpdate = Date.now(); + return [2 /*return*/]; + } + }); + }); + }; + ObsidianGit.prototype.pull = function () { + return __awaiter(this, void 0, void 0, function () { + var pullResult; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.setState(PluginState.pull); + return [4 /*yield*/, this.git.pull(["--no-rebase"], function (err) { return __awaiter(_this, void 0, void 0, function () { + var status_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!err) return [3 /*break*/, 2]; + this.displayError("Pull failed " + err.message); + return [4 /*yield*/, this.git.status()]; + case 1: + status_1 = _a.sent(); + if (status_1.conflicted.length > 0) { + this.handleConflict(status_1.conflicted); + } + _a.label = 2; + case 2: return [2 /*return*/]; + } + }); + }); })]; + case 1: + pullResult = _a.sent(); + this.lastUpdate = Date.now(); + return [2 /*return*/, pullResult.files.length]; + } + }); + }); + }; + // endregion: main methods + ObsidianGit.prototype.startAutoBackup = function (minutes) { + var _this = this; + this.timeoutIDBackup = window.setTimeout(function () { + _this.promiseQueue.addTask(function () { return _this.createBackup(true); }); + _this.settings.lastAutoBackUp = new Date().toString(); + _this.saveSettings(); + _this.startAutoBackup(); + }, (minutes !== null && minutes !== void 0 ? minutes : this.settings.autoSaveInterval) * 60000); + }; + ObsidianGit.prototype.startAutoPull = function (minutes) { + var _this = this; + this.timeoutIDPull = window.setTimeout(function () { + _this.promiseQueue.addTask(function () { return _this.pullChangesFromRemote(); }); + _this.settings.lastAutoPull = new Date().toString(); + _this.saveSettings(); + _this.startAutoPull(); + }, (minutes !== null && minutes !== void 0 ? minutes : this.settings.autoPullInterval) * 60000); + }; + ObsidianGit.prototype.clearAutoBackup = function () { + if (this.timeoutIDBackup) { + window.clearTimeout(this.timeoutIDBackup); + return true; + } + return false; + }; + ObsidianGit.prototype.clearAutoPull = function () { + if (this.timeoutIDPull) { + window.clearTimeout(this.timeoutIDPull); + return true; + } + return false; + }; + ObsidianGit.prototype.handleConflict = function (conflicted) { + return __awaiter(this, void 0, void 0, function () { + var lines; + var _this = this; + return __generator(this, function (_a) { + this.setState(PluginState.conflicted); + lines = __spreadArray([ + "# Conflict files", + "Please resolve them and commit per command (This file will be deleted before the commit)." + ], conflicted.map(function (e) { + var file = _this.app.vault.getAbstractFileByPath(e); + if (file instanceof obsidian.TFile) { + var link = _this.app.metadataCache.fileToLinktext(file, "/"); + return "- [[" + link + "]]"; + } + else { + return "- Not a file: " + e; + } + })); + this.writeAndOpenFile(lines.join("\n")); + return [2 /*return*/]; + }); + }); + }; + ObsidianGit.prototype.writeAndOpenFile = function (text) { + return __awaiter(this, void 0, void 0, function () { + var fileIsAlreadyOpened; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.app.vault.adapter.write(this.conflictOutputFile, text)]; + case 1: + _a.sent(); + fileIsAlreadyOpened = false; + this.app.workspace.iterateAllLeaves(function (leaf) { + if (leaf.getDisplayText() != "" && _this.conflictOutputFile.startsWith(leaf.getDisplayText())) { + fileIsAlreadyOpened = true; + } + }); + if (!fileIsAlreadyOpened) { + this.app.workspace.openLinkText(this.conflictOutputFile, "/", true); + } + return [2 /*return*/]; + } + }); + }); + }; + // region: displaying / formatting messages + ObsidianGit.prototype.displayMessage = function (message, timeout) { + var _a; + if (timeout === void 0) { timeout = 4 * 1000; } + (_a = this.statusBar) === null || _a === void 0 ? void 0 : _a.displayMessage(message.toLowerCase(), timeout); + if (!this.settings.disablePopups) { + new obsidian.Notice(message); + } + console.log("git obsidian message: " + message); + }; + ObsidianGit.prototype.displayError = function (message, timeout) { + var _a; + if (timeout === void 0) { timeout = 0; } + new obsidian.Notice(message); + console.log("git obsidian error: " + message); + (_a = this.statusBar) === null || _a === void 0 ? void 0 : _a.displayMessage(message.toLowerCase(), timeout); + }; + ObsidianGit.prototype.formatCommitMessage = function (template) { + return __awaiter(this, void 0, void 0, function () { + var status_2, numFiles, status_3, changeset_1, chunks, _i, _a, _b, action, files_1, files, moment; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + if (!template.includes("{{numFiles}}")) return [3 /*break*/, 2]; + return [4 /*yield*/, this.git.status()]; + case 1: + status_2 = _c.sent(); + numFiles = status_2.files.length; + template = template.replace("{{numFiles}}", String(numFiles)); + _c.label = 2; + case 2: + if (!template.includes("{{files}}")) return [3 /*break*/, 4]; + return [4 /*yield*/, this.git.status()]; + case 3: + status_3 = _c.sent(); + changeset_1 = {}; + status_3.files.forEach(function (value) { + if (value.index in changeset_1) { + changeset_1[value.index].push(value.path); + } + else { + changeset_1[value.index] = [value.path]; + } + }); + chunks = []; + for (_i = 0, _a = Object.entries(changeset_1); _i < _a.length; _i++) { + _b = _a[_i], action = _b[0], files_1 = _b[1]; + chunks.push(action + " " + files_1.join(" ")); + } + files = chunks.join(", "); + template = template.replace("{{files}}", files); + _c.label = 4; + case 4: + moment = window.moment; + return [2 /*return*/, template.replace("{{date}}", moment().format(this.settings.commitDateFormat))]; + } + }); + }); + }; + return ObsidianGit; +}(obsidian.Plugin)); +var ObsidianGitSettingsTab = /** @class */ (function (_super) { + __extends(ObsidianGitSettingsTab, _super); + function ObsidianGitSettingsTab() { + return _super !== null && _super.apply(this, arguments) || this; + } + ObsidianGitSettingsTab.prototype.display = function () { + var _this = this; + var containerEl = this.containerEl; + var plugin = this.plugin; + containerEl.empty(); + containerEl.createEl("h2", { text: "Git Backup settings" }); + new obsidian.Setting(containerEl) + .setName("Vault backup interval (minutes)") + .setDesc("Commit and push changes every X minutes. To disable automatic backup, specify negative value or zero (default)") + .addText(function (text) { + return text + .setValue(String(plugin.settings.autoSaveInterval)) + .onChange(function (value) { + if (!isNaN(Number(value))) { + plugin.settings.autoSaveInterval = Number(value); + plugin.saveSettings(); + if (plugin.settings.autoSaveInterval > 0) { + plugin.clearAutoBackup(); + plugin.startAutoBackup(plugin.settings.autoSaveInterval); + new obsidian.Notice("Automatic backup enabled! Every " + plugin.settings.autoSaveInterval + " minutes."); + } + else if (plugin.settings.autoSaveInterval <= 0 && + plugin.timeoutIDBackup) { + plugin.clearAutoBackup() && + new obsidian.Notice("Automatic backup disabled!"); + } + } + else { + new obsidian.Notice("Please specify a valid number."); + } + }); + }); + new obsidian.Setting(containerEl) + .setName("Auto pull interval (minutes)") + .setDesc("Pull changes every X minutes. To disable automatic pull, specify negative value or zero (default)") + .addText(function (text) { + return text + .setValue(String(plugin.settings.autoPullInterval)) + .onChange(function (value) { + if (!isNaN(Number(value))) { + plugin.settings.autoPullInterval = Number(value); + plugin.saveSettings(); + if (plugin.settings.autoPullInterval > 0) { + plugin.clearAutoPull(); + plugin.startAutoPull(plugin.settings.autoSaveInterval); + new obsidian.Notice("Automatic pull enabled! Every " + plugin.settings.autoPullInterval + " minutes."); + } + else if (plugin.settings.autoPullInterval <= 0 && + plugin.timeoutIDPull) { + plugin.clearAutoPull() && + new obsidian.Notice("Automatic pull disabled!"); + } + } + else { + new obsidian.Notice("Please specify a valid number."); + } + }); + }); + new obsidian.Setting(containerEl) + .setName("Commit message") + .setDesc("Specify custom commit message. Available placeholders: {{date}}" + + " (see below) and {{numFiles}} (number of changed files in the commit)") + .addText(function (text) { + return text + .setPlaceholder("vault backup") + .setValue(plugin.settings.commitMessage + ? plugin.settings.commitMessage + : "") + .onChange(function (value) { + plugin.settings.commitMessage = value; + plugin.saveSettings(); + }); + }); + new obsidian.Setting(containerEl) + .setName("{{date}} placeholder format") + .setDesc('Specify custom date format. E.g. "YYYY-MM-DD HH:mm:ss"') + .addText(function (text) { + return text + .setPlaceholder(plugin.settings.commitDateFormat) + .setValue(plugin.settings.commitDateFormat) + .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + plugin.settings.commitDateFormat = value; + return [4 /*yield*/, plugin.saveSettings()]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); }); + }); + new obsidian.Setting(containerEl) + .setName("Preview commit message") + .addButton(function (button) { + return button.setButtonText("Preview").onClick(function () { return __awaiter(_this, void 0, void 0, function () { + var commitMessagePreview; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, plugin.formatCommitMessage(plugin.settings.commitMessage)]; + case 1: + commitMessagePreview = _a.sent(); + new obsidian.Notice("" + commitMessagePreview); + return [2 /*return*/]; + } + }); + }); }); + }); + new obsidian.Setting(containerEl) + .setName("List filenames affected by commit in the commit body") + .addToggle(function (toggle) { + return toggle + .setValue(plugin.settings.listChangedFilesInMessageBody) + .onChange(function (value) { + plugin.settings.listChangedFilesInMessageBody = value; + plugin.saveSettings(); + }); + }); + new obsidian.Setting(containerEl) + .setName("Current branch") + .setDesc("Switch to a different branch") + .addDropdown(function (dropdown) { return __awaiter(_this, void 0, void 0, function () { + var branchInfo, _i, _a, branch; + var _this = this; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, plugin.git.branchLocal()]; + case 1: + branchInfo = _b.sent(); + for (_i = 0, _a = branchInfo.all; _i < _a.length; _i++) { + branch = _a[_i]; + dropdown.addOption(branch, branch); + } + dropdown.setValue(branchInfo.current); + dropdown.onChange(function (option) { return __awaiter(_this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, plugin.git.checkout(option, [], function (err) { return __awaiter(_this, void 0, void 0, function () { + return __generator(this, function (_a) { + if (err) { + new obsidian.Notice(err.message); + dropdown.setValue(branchInfo.current); + } + else { + new obsidian.Notice("Checked out to " + option); + } + return [2 /*return*/]; + }); + }); })]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); }); + return [2 /*return*/]; + } + }); + }); }); + new obsidian.Setting(containerEl) + .setName("Pull updates on startup") + .setDesc("Automatically pull updates when Obsidian starts") + .addToggle(function (toggle) { + return toggle + .setValue(plugin.settings.autoPullOnBoot) + .onChange(function (value) { + plugin.settings.autoPullOnBoot = value; + plugin.saveSettings(); + }); + }); + new obsidian.Setting(containerEl) + .setName("Disable push") + .setDesc("Do not push changes to the remote repository") + .addToggle(function (toggle) { + return toggle + .setValue(plugin.settings.disablePush) + .onChange(function (value) { + plugin.settings.disablePush = value; + plugin.saveSettings(); + }); + }); + new obsidian.Setting(containerEl) + .setName("Pull changes before push") + .setDesc("Commit -> pull -> push (Only if pushing is enabled)") + .addToggle(function (toggle) { + return toggle + .setValue(plugin.settings.pullBeforePush) + .onChange(function (value) { + plugin.settings.pullBeforePush = value; + plugin.saveSettings(); + }); + }); + new obsidian.Setting(containerEl) + .setName("Disable notifications") + .setDesc("Disable notifications for git operations to minimize distraction (refer to status bar for updates)") + .addToggle(function (toggle) { + return toggle + .setValue(plugin.settings.disablePopups) + .onChange(function (value) { + plugin.settings.disablePopups = value; + plugin.saveSettings(); + }); + }); + new obsidian.Setting(containerEl) + .setName("Show status bar") + .setDesc("Obsidian must be restarted for the changes to take affect") + .addToggle(function (toggle) { + return toggle + .setValue(plugin.settings.showStatusBar) + .onChange(function (value) { + plugin.settings.showStatusBar = value; + plugin.saveSettings(); + }); + }); + }; + return ObsidianGitSettingsTab; +}(obsidian.PluginSettingTab)); +var StatusBar = /** @class */ (function () { + function StatusBar(statusBarEl, plugin) { + this.messages = []; + this.statusBarEl = statusBarEl; + this.plugin = plugin; + } + StatusBar.prototype.displayMessage = function (message, timeout) { + this.messages.push({ + message: "git: " + message.slice(0, 100), + timeout: timeout, + }); + this.display(); + }; + StatusBar.prototype.display = function () { + if (this.messages.length > 0 && !this.currentMessage) { + this.currentMessage = this.messages.shift(); + this.statusBarEl.setText(this.currentMessage.message); + this.lastMessageTimestamp = Date.now(); + } + else if (this.currentMessage) { + var messageAge = Date.now() - this.lastMessageTimestamp; + if (messageAge >= this.currentMessage.timeout) { + this.currentMessage = null; + this.lastMessageTimestamp = null; + } + } + else { + this.displayState(); + } + }; + StatusBar.prototype.displayState = function () { + switch (this.plugin.state) { + case PluginState.idle: + this.displayFromNow(this.plugin.lastUpdate); + break; + case PluginState.status: + this.statusBarEl.setText("git: checking repo status.."); + break; + case PluginState.add: + this.statusBarEl.setText("git: adding files to repo.."); + break; + case PluginState.commit: + this.statusBarEl.setText("git: committing changes.."); + break; + case PluginState.push: + this.statusBarEl.setText("git: pushing changes.."); + break; + case PluginState.pull: + this.statusBarEl.setText("git: pulling changes.."); + break; + case PluginState.conflicted: + this.statusBarEl.setText("git: you have conflict files.."); + break; + default: + this.statusBarEl.setText("git: failed on initialization!"); + break; + } + }; + StatusBar.prototype.displayFromNow = function (timestamp) { + if (timestamp) { + var moment_1 = window.moment; + var fromNow = moment_1(timestamp).fromNow(); + this.statusBarEl.setText("git: last update " + fromNow + ".."); + } + else { + this.statusBarEl.setText("git: ready"); + } + }; + return StatusBar; +}()); +var CustomMessageModal = /** @class */ (function (_super) { + __extends(CustomMessageModal, _super); + function CustomMessageModal(plugin) { + var _this = _super.call(this, plugin.app) || this; + _this.plugin = plugin; + _this.setPlaceholder("Type your message and select optional the version with the added date."); + return _this; + } + CustomMessageModal.prototype.getSuggestions = function (query) { + var date = window.moment().format(this.plugin.settings.commitDateFormat); + if (query == "") + query = "..."; + return [query, date + ": " + query, query + ": " + date]; + }; + CustomMessageModal.prototype.renderSuggestion = function (value, el) { + el.innerText = value; + }; + CustomMessageModal.prototype.onChooseSuggestion = function (item, _) { + var _this = this; + this.plugin.promiseQueue.addTask(function () { return _this.plugin.createBackup(false, item); }); + }; + return CustomMessageModal; +}(obsidian.SuggestModal)); +var ChangedFilesModal = /** @class */ (function (_super) { + __extends(ChangedFilesModal, _super); + function ChangedFilesModal(plugin, changedFiles) { + var _this = _super.call(this, plugin.app) || this; + _this.plugin = plugin; + _this.changedFiles = changedFiles; + _this.setPlaceholder("Not supported files will be opened by default app!"); + return _this; + } + ChangedFilesModal.prototype.getItems = function () { + return this.changedFiles; + }; + ChangedFilesModal.prototype.getItemText = function (item) { + if (item.index == "?" && item.working_dir == "?") { + return "Untracked | " + item.path; + } + var working_dir = ""; + var index = ""; + if (item.working_dir != " ") + working_dir = "Working dir: " + item.working_dir + " "; + if (item.index != " ") + index = "Index: " + item.index; + return "" + working_dir + index + " | " + item.path; + }; + ChangedFilesModal.prototype.onChooseItem = function (item, _) { + if (this.plugin.app.metadataCache.getFirstLinkpathDest(item.path, "") == null) { + this.app.openWithDefaultApp(item.path); + } + else { + this.plugin.app.workspace.openLinkText(item.path, "/"); + } + }; + return ChangedFilesModal; +}(obsidian.FuzzySuggestModal)); +var PromiseQueue = /** @class */ (function () { + function PromiseQueue() { + this.tasks = []; + } + PromiseQueue.prototype.addTask = function (task) { + this.tasks.push(task); + if (this.tasks.length === 1) { + this.handleTask(); + } + }; + PromiseQueue.prototype.handleTask = function () { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + if (this.tasks.length > 0) { + this.tasks[0]().finally(function () { + _this.tasks.shift(); + _this.handleTask(); + }); + } + return [2 /*return*/]; + }); + }); + }; + return PromiseQueue; +}()); + +module.exports = ObsidianGit; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZXJyb3JzL2dpdC1lcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZXJyb3JzL2dpdC1yZXNwb25zZS1lcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZXJyb3JzL2dpdC1jb25zdHJ1Y3QtZXJyb3IuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL2Vycm9ycy9naXQtcGx1Z2luLWVycm9yLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9lcnJvcnMvdGFzay1jb25maWd1cmF0aW9uLWVycm9yLmpzIiwibm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9jb21tb24uanMiLCJub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvaGFzLWZsYWcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3VwcG9ydHMtY29sb3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCJub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0Brd3NpdGVzL2ZpbGUtZXhpc3RzL2Rpc3Qvc3JjL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0Brd3NpdGVzL2ZpbGUtZXhpc3RzL2Rpc3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL3V0aWwuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL2FyZ3VtZW50LWZpbHRlcnMuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL2V4aXQtY29kZXMuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL2dpdC1vdXRwdXQtc3RyZWFtcy5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdXRpbHMvbGluZS1wYXJzZXIuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3V0aWxzL3NpbXBsZS1naXQtb3B0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdXRpbHMvdGFzay1vcHRpb25zLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi91dGlscy90YXNrLXBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdXRpbHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2NoZWNrLWlzLXJlcG8uanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9DbGVhblN1bW1hcnkuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL3Rhc2suanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2NsZWFuLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9yZXNldC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvYXBpLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wbHVnaW5zL2NvbW1hbmQtY29uZmlnLXByZWZpeGluZy1wbHVnaW4uanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BsdWdpbnMvZXJyb3ItZGV0ZWN0aW9uLnBsdWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGx1Z2lucy9wbHVnaW4tc3RvcmUuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BsdWdpbnMvcHJvZ3Jlc3MtbW9uaXRvci1wbHVnaW4uanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BsdWdpbnMvc2ltcGxlLWdpdC1wbHVnaW4uanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BsdWdpbnMvdGltb3V0LXBsdWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGx1Z2lucy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvZ2l0LWxvZ2dlci5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcnVubmVycy90YXNrcy1wZW5kaW5nLXF1ZXVlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9ydW5uZXJzL2dpdC1leGVjdXRvci1jaGFpbi5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcnVubmVycy9naXQtZXhlY3V0b3IuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2stY2FsbGJhY2suanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtcmVtb3RlLW9iamVjdHMuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtcmVtb3RlLW1lc3NhZ2VzLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLXB1c2guanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL3B1c2guanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3NpbXBsZS1naXQtYXBpLmpzIiwibm9kZV9tb2R1bGVzL0Brd3NpdGVzL3Byb21pc2UtZGVmZXJyZWQvZGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcnVubmVycy9zY2hlZHVsZXIuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2FwcGx5LXBhdGNoLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvQnJhbmNoRGVsZXRlU3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1icmFuY2gtZGVsZXRlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvQnJhbmNoU3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1icmFuY2guanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2JyYW5jaC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcmVzcG9uc2VzL0NoZWNrSWdub3JlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9jaGVjay1pZ25vcmUuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL2Nsb25lLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvQ29uZmlnTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvY29uZmlnLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLWNvbW1pdC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvY29tbWl0LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvRGlmZlN1bW1hcnkuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3BhcnNlcnMvcGFyc2UtZGlmZi1zdW1tYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9kaWZmLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLWZldGNoLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9mZXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvaGFzaC1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9Jbml0U3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvaW5pdC5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1saXN0LWxvZy1zdW1tYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9sb2cuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9NZXJnZVN1bW1hcnkuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9QdWxsU3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1wdWxsLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9wYXJzZXJzL3BhcnNlLW1lcmdlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9tZXJnZS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcGFyc2Vycy9wYXJzZS1tb3ZlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9tb3ZlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9wdWxsLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvR2V0UmVtb3RlU3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvdGFza3MvcmVtb3RlLmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9zdGFzaC1saXN0LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9yZXNwb25zZXMvRmlsZVN0YXR1c1N1bW1hcnkuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9TdGF0dXNTdW1tYXJ5LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy9zdGF0dXMuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Rhc2tzL3N1Yi1tb2R1bGUuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvbGliL3Jlc3BvbnNlcy9UYWdMaXN0LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi90YXNrcy90YWcuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvZ2l0LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1naXQvc3JjL2xpYi9naXQtZmFjdG9yeS5qcyIsIm5vZGVfbW9kdWxlcy9zaW1wbGUtZ2l0L3NyYy9saWIvcnVubmVycy9wcm9taXNlLXdyYXBwZWQuanMiLCJub2RlX21vZHVsZXMvc2ltcGxlLWdpdC9zcmMvaW5kZXguanMiLCJtYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tKSB7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKylcclxuICAgICAgICB0b1tqXSA9IGZyb21baV07XHJcbiAgICByZXR1cm4gdG87XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuR2l0RXJyb3IgPSB2b2lkIDA7XG4vKipcbiAqIFRoZSBgR2l0RXJyb3JgIGlzIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIGBnaXRgIHByb2Nlc3MgdGhyb3dzIGFcbiAqIGZhdGFsIGV4Y2VwdGlvbiAoZWcgYW4gYEVOT0VOVGAgZXhjZXB0aW9uIHdoZW4gYXR0ZW1wdGluZyB0byB1c2UgYVxuICogbm9uLXdyaXRhYmxlIGRpcmVjdG9yeSBhcyB0aGUgcm9vdCBmb3IgeW91ciByZXBvKSwgYW5kIGFjdHMgYXMgdGhlXG4gKiBiYXNlIGNsYXNzIGZvciBtb3JlIHNwZWNpZmljIGVycm9ycyB0aHJvd24gYnkgdGhlIHBhcnNpbmcgb2YgdGhlXG4gKiBnaXQgcmVzcG9uc2Ugb3IgZXJyb3JzIGluIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSB0YXNrIGFib3V0IHRvXG4gKiBiZSBydW4uXG4gKlxuICogV2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCBwZW5kaW5nIHRhc2tzIGluIHRoZSBzYW1lIGluc3RhbmNlIHdpbGxcbiAqIG5vdCBiZSBleGVjdXRlZC4gVGhlIHJlY29tbWVuZGVkIHdheSB0byBydW4gYSBzZXJpZXMgb2YgdGFza3MgdGhhdFxuICogY2FuIGluZGVwZW5kZW50bHkgZmFpbCB3aXRob3V0IG5lZWRpbmcgdG8gcHJldmVudCBmdXR1cmUgdGFza3MgZnJvbVxuICogcnVubmluZyBpcyB0byBjYXRjaCB0aGVtIGluZGl2aWR1YWxseTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gaW1wb3J0IHsgZ2l0UCwgU2ltcGxlR2l0LCBHaXRFcnJvciwgUHVsbFJlc3VsdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuXG4gZnVuY3Rpb24gY2F0Y2hUYXNrIChlOiBHaXRFcnJvcikge1xuICAgcmV0dXJuIGUuXG4gfVxuXG4gY29uc3QgZ2l0ID0gZ2l0UChyZXBvV29ya2luZ0Rpcik7XG4gY29uc3QgcHVsbGVkOiBQdWxsUmVzdWx0IHwgR2l0RXJyb3IgPSBhd2FpdCBnaXQucHVsbCgpLmNhdGNoKGNhdGNoVGFzayk7XG4gY29uc3QgcHVzaGVkOiBzdHJpbmcgfCBHaXRFcnJvciA9IGF3YWl0IGdpdC5wdXNoVGFncygpLmNhdGNoKGNhdGNoVGFzayk7XG4gYGBgXG4gKi9cbmNsYXNzIEdpdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHRhc2ssIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMudGFzayA9IHRhc2s7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBuZXcudGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgfVxufVxuZXhwb3J0cy5HaXRFcnJvciA9IEdpdEVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0LWVycm9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HaXRSZXNwb25zZUVycm9yID0gdm9pZCAwO1xuY29uc3QgZ2l0X2Vycm9yXzEgPSByZXF1aXJlKFwiLi9naXQtZXJyb3JcIik7XG4vKipcbiAqIFRoZSBgR2l0UmVzcG9uc2VFcnJvcmAgaXMgdGhlIHdyYXBwZXIgZm9yIGEgcGFyc2VkIHJlc3BvbnNlIHRoYXQgaXMgdHJlYXRlZCBhc1xuICogYSBmYXRhbCBlcnJvciwgZm9yIGV4YW1wbGUgYXR0ZW1wdGluZyBhIGBtZXJnZWAgY2FuIGxlYXZlIHRoZSByZXBvIGluIGEgY29ycnVwdGVkXG4gKiBzdGF0ZSB3aGVuIHRoZXJlIGFyZSBjb25mbGljdHMgc28gdGhlIHRhc2sgd2lsbCByZWplY3QgcmF0aGVyIHRoYW4gcmVzb2x2ZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgY2F0Y2hpbmcgdGhlIG1lcmdlIGNvbmZsaWN0IGV4Y2VwdGlvbjpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gaW1wb3J0IHsgZ2l0UCwgU2ltcGxlR2l0LCBHaXRSZXNwb25zZUVycm9yLCBNZXJnZVN1bW1hcnkgfSBmcm9tICdzaW1wbGUtZ2l0JztcblxuIGNvbnN0IGdpdCA9IGdpdFAocmVwb1Jvb3QpO1xuIGNvbnN0IG1lcmdlT3B0aW9uczogc3RyaW5nW10gPSBbJy0tbm8tZmYnLCAnb3RoZXItYnJhbmNoJ107XG4gY29uc3QgbWVyZ2VTdW1tYXJ5OiBNZXJnZVN1bW1hcnkgPSBhd2FpdCBnaXQubWVyZ2UobWVyZ2VPcHRpb25zKVxuICAgICAgLmNhdGNoKChlOiBHaXRSZXNwb25zZUVycm9yPE1lcmdlU3VtbWFyeT4pID0+IGUuZ2l0KTtcblxuIGlmIChtZXJnZVN1bW1hcnkuZmFpbGVkKSB7XG4gICAvLyBkZWFsIHdpdGggdGhlIGVycm9yXG4gfVxuIGBgYFxuICovXG5jbGFzcyBHaXRSZXNwb25zZUVycm9yIGV4dGVuZHMgZ2l0X2Vycm9yXzEuR2l0RXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIGAuZ2l0YCBhY2Nlc3MgdGhlIHBhcnNlZCByZXNwb25zZSB0aGF0IGlzIHRyZWF0ZWQgYXMgYmVpbmcgYW4gZXJyb3JcbiAgICAgKi9cbiAgICBnaXQsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIodW5kZWZpbmVkLCBtZXNzYWdlIHx8IFN0cmluZyhnaXQpKTtcbiAgICAgICAgdGhpcy5naXQgPSBnaXQ7XG4gICAgfVxufVxuZXhwb3J0cy5HaXRSZXNwb25zZUVycm9yID0gR2l0UmVzcG9uc2VFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdpdC1yZXNwb25zZS1lcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuR2l0Q29uc3RydWN0RXJyb3IgPSB2b2lkIDA7XG5jb25zdCBnaXRfZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2dpdC1lcnJvclwiKTtcbi8qKlxuICogVGhlIGBHaXRDb25zdHJ1Y3RFcnJvcmAgaXMgdGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGluIHRoZSBjb25zdHJ1Y3RvclxuICogb2YgdGhlIGBzaW1wbGUtZ2l0YCBpbnN0YW5jZSBpdHNlbGYuIE1vc3QgY29tbW9ubHkgYXMgYSByZXN1bHQgb2YgdXNpbmdcbiAqIGEgYGJhc2VEaXJgIG9wdGlvbiB0aGF0IHBvaW50cyB0byBhIGZvbGRlciB0aGF0IGVpdGhlciBkb2VzIG5vdCBleGlzdCxcbiAqIG9yIGNhbm5vdCBiZSByZWFkIGJ5IHRoZSB1c2VyIHRoZSBub2RlIHNjcmlwdCBpcyBydW5uaW5nIGFzLlxuICpcbiAqIENoZWNrIHRoZSBgLm1lc3NhZ2VgIHByb3BlcnR5IGZvciBtb3JlIGRldGFpbCBpbmNsdWRpbmcgdGhlIHByb3BlcnRpZXNcbiAqIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gKi9cbmNsYXNzIEdpdENvbnN0cnVjdEVycm9yIGV4dGVuZHMgZ2l0X2Vycm9yXzEuR2l0RXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZywgbWVzc2FnZSkge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsIG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB9XG59XG5leHBvcnRzLkdpdENvbnN0cnVjdEVycm9yID0gR2l0Q29uc3RydWN0RXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1naXQtY29uc3RydWN0LWVycm9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HaXRQbHVnaW5FcnJvciA9IHZvaWQgMDtcbmNvbnN0IGdpdF9lcnJvcl8xID0gcmVxdWlyZShcIi4vZ2l0LWVycm9yXCIpO1xuY2xhc3MgR2l0UGx1Z2luRXJyb3IgZXh0ZW5kcyBnaXRfZXJyb3JfMS5HaXRFcnJvciB7XG4gICAgY29uc3RydWN0b3IodGFzaywgcGx1Z2luLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKHRhc2ssIG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnRhc2sgPSB0YXNrO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIG5ldy50YXJnZXQucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkdpdFBsdWdpbkVycm9yID0gR2l0UGx1Z2luRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1naXQtcGx1Z2luLWVycm9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UYXNrQ29uZmlndXJhdGlvbkVycm9yID0gdm9pZCAwO1xuY29uc3QgZ2l0X2Vycm9yXzEgPSByZXF1aXJlKFwiLi9naXQtZXJyb3JcIik7XG4vKipcbiAqIFRoZSBgVGFza0NvbmZpZ3VyYXRpb25FcnJvcmAgaXMgdGhyb3duIHdoZW4gYSBjb21tYW5kIHdhcyBpbmNvcnJlY3RseVxuICogY29uZmlndXJlZC4gQW4gZXJyb3Igb2YgdGhpcyBraW5kIG1lYW5zIHRoYXQgbm8gYXR0ZW1wdCB3YXMgbWFkZSB0b1xuICogcnVuIHlvdXIgY29tbWFuZCB0aHJvdWdoIHRoZSB1bmRlcmx5aW5nIGBnaXRgIGJpbmFyeS5cbiAqXG4gKiBDaGVjayB0aGUgYC5tZXNzYWdlYCBwcm9wZXJ0eSBmb3IgbW9yZSBkZXRhaWwgb24gd2h5IHlvdXIgY29uZmlndXJhdGlvblxuICogcmVzdWx0ZWQgaW4gYW4gZXJyb3IuXG4gKi9cbmNsYXNzIFRhc2tDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBnaXRfZXJyb3JfMS5HaXRFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsIG1lc3NhZ2UpO1xuICAgIH1cbn1cbmV4cG9ydHMuVGFza0NvbmZpZ3VyYXRpb25FcnJvciA9IFRhc2tDb25maWd1cmF0aW9uRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXNrLWNvbmZpZ3VyYXRpb24tZXJyb3IuanMubWFwIiwiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXG5cdFx0ZnVuY3Rpb24gZGVidWcoLi4uYXJncykge1xuXHRcdFx0Ly8gRGlzYWJsZWQ/XG5cdFx0XHRpZiAoIWRlYnVnLmVuYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzZWxmID0gZGVidWc7XG5cblx0XHRcdC8vIFNldCBgZGlmZmAgdGltZXN0YW1wXG5cdFx0XHRjb25zdCBjdXJyID0gTnVtYmVyKG5ldyBEYXRlKCkpO1xuXHRcdFx0Y29uc3QgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuXHRcdFx0c2VsZi5kaWZmID0gbXM7XG5cdFx0XHRzZWxmLnByZXYgPSBwcmV2VGltZTtcblx0XHRcdHNlbGYuY3VyciA9IGN1cnI7XG5cdFx0XHRwcmV2VGltZSA9IGN1cnI7XG5cblx0XHRcdGFyZ3NbMF0gPSBjcmVhdGVEZWJ1Zy5jb2VyY2UoYXJnc1swXSk7XG5cblx0XHRcdGlmICh0eXBlb2YgYXJnc1swXSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cblx0XHRcdFx0YXJncy51bnNoaWZ0KCclTycpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuXHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCAobWF0Y2gsIGZvcm1hdCkgPT4ge1xuXHRcdFx0XHQvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0XHRcdHJldHVybiAnJSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0Y29uc3QgZm9ybWF0dGVyID0gY3JlYXRlRGVidWcuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdGNvbnN0IHZhbCA9IGFyZ3NbaW5kZXhdO1xuXHRcdFx0XHRcdG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuXHRcdFx0XHRcdC8vIE5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcblx0XHRcdFx0XHRhcmdzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHRcdFx0aW5kZXgtLTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcblx0XHRcdGNyZWF0ZURlYnVnLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuXHRcdFx0Y29uc3QgbG9nRm4gPSBzZWxmLmxvZyB8fCBjcmVhdGVEZWJ1Zy5sb2c7XG5cdFx0XHRsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcblx0XHR9XG5cblx0XHRkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdFx0ZGVidWcudXNlQ29sb3JzID0gY3JlYXRlRGVidWcudXNlQ29sb3JzKCk7XG5cdFx0ZGVidWcuY29sb3IgPSBjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXHRcdGRlYnVnLmV4dGVuZCA9IGV4dGVuZDtcblx0XHRkZWJ1Zy5kZXN0cm95ID0gY3JlYXRlRGVidWcuZGVzdHJveTsgLy8gWFhYIFRlbXBvcmFyeS4gV2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVidWcsICdlbmFibGVkJywge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6ICgpID0+IGVuYWJsZU92ZXJyaWRlID09PSBudWxsID8gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpIDogZW5hYmxlT3ZlcnJpZGUsXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zdWJzdHIoMSkgKyAnJCcpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG5cdCpcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBkaXNhYmxlKCkge1xuXHRcdGNvbnN0IG5hbWVzcGFjZXMgPSBbXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5uYW1lcy5tYXAodG9OYW1lc3BhY2UpLFxuXHRcdFx0Li4uY3JlYXRlRGVidWcuc2tpcHMubWFwKHRvTmFtZXNwYWNlKS5tYXAobmFtZXNwYWNlID0+ICctJyArIG5hbWVzcGFjZSlcblx0XHRdLmpvaW4oJywnKTtcblx0XHRjcmVhdGVEZWJ1Zy5lbmFibGUoJycpO1xuXHRcdHJldHVybiBuYW1lc3BhY2VzO1xuXHR9XG5cblx0LyoqXG5cdCogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0KiBAcmV0dXJuIHtCb29sZWFufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuXHRcdGlmIChuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcqJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0bGV0IGk7XG5cdFx0bGV0IGxlbjtcblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQqIENvbnZlcnQgcmVnZXhwIHRvIG5hbWVzcGFjZVxuXHQqXG5cdCogQHBhcmFtIHtSZWdFeHB9IHJlZ3hlcFxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHRvTmFtZXNwYWNlKHJlZ2V4cCkge1xuXHRcdHJldHVybiByZWdleHAudG9TdHJpbmcoKVxuXHRcdFx0LnN1YnN0cmluZygyLCByZWdleHAudG9TdHJpbmcoKS5sZW5ndGggLSAyKVxuXHRcdFx0LnJlcGxhY2UoL1xcLlxcKlxcPyQvLCAnKicpO1xuXHR9XG5cblx0LyoqXG5cdCogQ29lcmNlIGB2YWxgLlxuXHQqXG5cdCogQHBhcmFtIHtNaXhlZH0gdmFsXG5cdCogQHJldHVybiB7TWl4ZWR9XG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcblx0XHRpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHQvKipcblx0KiBYWFggRE8gTk9UIFVTRS4gVGhpcyBpcyBhIHRlbXBvcmFyeSBzdHViIGZ1bmN0aW9uLlxuXHQqIFhYWCBJdCBXSUxMIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblx0Ki9cblx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0fVxuXG5cdGNyZWF0ZURlYnVnLmVuYWJsZShjcmVhdGVEZWJ1Zy5sb2FkKCkpO1xuXG5cdHJldHVybiBjcmVhdGVEZWJ1Zztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXR1cDtcbiIsIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGZsYWcsIGFyZ3YgPSBwcm9jZXNzLmFyZ3YpID0+IHtcblx0Y29uc3QgcHJlZml4ID0gZmxhZy5zdGFydHNXaXRoKCctJykgPyAnJyA6IChmbGFnLmxlbmd0aCA9PT0gMSA/ICctJyA6ICctLScpO1xuXHRjb25zdCBwb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcblx0Y29uc3QgdGVybWluYXRvclBvc2l0aW9uID0gYXJndi5pbmRleE9mKCctLScpO1xuXHRyZXR1cm4gcG9zaXRpb24gIT09IC0xICYmICh0ZXJtaW5hdG9yUG9zaXRpb24gPT09IC0xIHx8IHBvc2l0aW9uIDwgdGVybWluYXRvclBvc2l0aW9uKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBvcyA9IHJlcXVpcmUoJ29zJyk7XG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IGhhc0ZsYWcgPSByZXF1aXJlKCdoYXMtZmxhZycpO1xuXG5jb25zdCB7ZW52fSA9IHByb2Nlc3M7XG5cbmxldCBmb3JjZUNvbG9yO1xuaWYgKGhhc0ZsYWcoJ25vLWNvbG9yJykgfHxcblx0aGFzRmxhZygnbm8tY29sb3JzJykgfHxcblx0aGFzRmxhZygnY29sb3I9ZmFsc2UnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1uZXZlcicpKSB7XG5cdGZvcmNlQ29sb3IgPSAwO1xufSBlbHNlIGlmIChoYXNGbGFnKCdjb2xvcicpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9ycycpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPXRydWUnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1hbHdheXMnKSkge1xuXHRmb3JjZUNvbG9yID0gMTtcbn1cblxuaWYgKCdGT1JDRV9DT0xPUicgaW4gZW52KSB7XG5cdGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICd0cnVlJykge1xuXHRcdGZvcmNlQ29sb3IgPSAxO1xuXHR9IGVsc2UgaWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ2ZhbHNlJykge1xuXHRcdGZvcmNlQ29sb3IgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdGZvcmNlQ29sb3IgPSBlbnYuRk9SQ0VfQ09MT1IubGVuZ3RoID09PSAwID8gMSA6IE1hdGgubWluKHBhcnNlSW50KGVudi5GT1JDRV9DT0xPUiwgMTApLCAzKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVMZXZlbChsZXZlbCkge1xuXHRpZiAobGV2ZWwgPT09IDApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGxldmVsLFxuXHRcdGhhc0Jhc2ljOiB0cnVlLFxuXHRcdGhhczI1NjogbGV2ZWwgPj0gMixcblx0XHRoYXMxNm06IGxldmVsID49IDNcblx0fTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNDb2xvcihoYXZlU3RyZWFtLCBzdHJlYW1Jc1RUWSkge1xuXHRpZiAoZm9yY2VDb2xvciA9PT0gMCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTE2bScpIHx8XG5cdFx0aGFzRmxhZygnY29sb3I9ZnVsbCcpIHx8XG5cdFx0aGFzRmxhZygnY29sb3I9dHJ1ZWNvbG9yJykpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmIChoYXNGbGFnKCdjb2xvcj0yNTYnKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKGhhdmVTdHJlYW0gJiYgIXN0cmVhbUlzVFRZICYmIGZvcmNlQ29sb3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y29uc3QgbWluID0gZm9yY2VDb2xvciB8fCAwO1xuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ2R1bWInKSB7XG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxMDU4NiBpcyB0aGUgZmlyc3QgV2luZG93cyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMjU2IGNvbG9ycy5cblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDE0OTMxIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMTZtL1RydWVDb2xvci5cblx0XHRjb25zdCBvc1JlbGVhc2UgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKTtcblx0XHRpZiAoXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzBdKSA+PSAxMCAmJlxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTA1ODZcblx0XHQpIHtcblx0XHRcdHJldHVybiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxNDkzMSA/IDMgOiAyO1xuXHRcdH1cblxuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDSScgaW4gZW52KSB7XG5cdFx0aWYgKFsnVFJBVklTJywgJ0NJUkNMRUNJJywgJ0FQUFZFWU9SJywgJ0dJVExBQl9DSScsICdHSVRIVUJfQUNUSU9OUycsICdCVUlMREtJVEUnXS5zb21lKHNpZ24gPT4gc2lnbiBpbiBlbnYpIHx8IGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKCdURUFNQ0lUWV9WRVJTSU9OJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gL14oOVxcLigwKlsxLTldXFxkKilcXC58XFxkezIsfVxcLikvLnRlc3QoZW52LlRFQU1DSVRZX1ZFUlNJT04pID8gMSA6IDA7XG5cdH1cblxuXHRpZiAoZW52LkNPTE9SVEVSTSA9PT0gJ3RydWVjb2xvcicpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmICgnVEVSTV9QUk9HUkFNJyBpbiBlbnYpIHtcblx0XHRjb25zdCB2ZXJzaW9uID0gcGFyc2VJbnQoKGVudi5URVJNX1BST0dSQU1fVkVSU0lPTiB8fCAnJykuc3BsaXQoJy4nKVswXSwgMTApO1xuXG5cdFx0c3dpdGNoIChlbnYuVEVSTV9QUk9HUkFNKSB7XG5cdFx0XHRjYXNlICdpVGVybS5hcHAnOlxuXHRcdFx0XHRyZXR1cm4gdmVyc2lvbiA+PSAzID8gMyA6IDI7XG5cdFx0XHRjYXNlICdBcHBsZV9UZXJtaW5hbCc6XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0Ly8gTm8gZGVmYXVsdFxuXHRcdH1cblx0fVxuXG5cdGlmICgvLTI1Nihjb2xvcik/JC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoL15zY3JlZW58Xnh0ZXJtfF52dDEwMHxednQyMjB8XnJ4dnR8Y29sb3J8YW5zaXxjeWd3aW58bGludXgvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDT0xPUlRFUk0nIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0cmV0dXJuIG1pbjtcbn1cblxuZnVuY3Rpb24gZ2V0U3VwcG9ydExldmVsKHN0cmVhbSkge1xuXHRjb25zdCBsZXZlbCA9IHN1cHBvcnRzQ29sb3Ioc3RyZWFtLCBzdHJlYW0gJiYgc3RyZWFtLmlzVFRZKTtcblx0cmV0dXJuIHRyYW5zbGF0ZUxldmVsKGxldmVsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHN1cHBvcnRzQ29sb3I6IGdldFN1cHBvcnRMZXZlbCxcblx0c3Rkb3V0OiB0cmFuc2xhdGVMZXZlbChzdXBwb3J0c0NvbG9yKHRydWUsIHR0eS5pc2F0dHkoMSkpKSxcblx0c3RkZXJyOiB0cmFuc2xhdGVMZXZlbChzdXBwb3J0c0NvbG9yKHRydWUsIHR0eS5pc2F0dHkoMikpKVxufTtcbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLmRlc3Ryb3kgPSB1dGlsLmRlcHJlY2F0ZShcblx0KCkgPT4ge30sXG5cdCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJ1xuKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbNiwgMiwgMywgNCwgNSwgMV07XG5cbnRyeSB7XG5cdC8vIE9wdGlvbmFsIGRlcGVuZGVuY3kgKGFzIGluLCBkb2Vzbid0IG5lZWQgdG8gYmUgaW5zdGFsbGVkLCBOT1QgbGlrZSBvcHRpb25hbERlcGVuZGVuY2llcyBpbiBwYWNrYWdlLmpzb24pXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcblx0Y29uc3Qgc3VwcG9ydHNDb2xvciA9IHJlcXVpcmUoJ3N1cHBvcnRzLWNvbG9yJyk7XG5cblx0aWYgKHN1cHBvcnRzQ29sb3IgJiYgKHN1cHBvcnRzQ29sb3Iuc3RkZXJyIHx8IHN1cHBvcnRzQ29sb3IpLmxldmVsID49IDIpIHtcblx0XHRleHBvcnRzLmNvbG9ycyA9IFtcblx0XHRcdDIwLFxuXHRcdFx0MjEsXG5cdFx0XHQyNixcblx0XHRcdDI3LFxuXHRcdFx0MzIsXG5cdFx0XHQzMyxcblx0XHRcdDM4LFxuXHRcdFx0MzksXG5cdFx0XHQ0MCxcblx0XHRcdDQxLFxuXHRcdFx0NDIsXG5cdFx0XHQ0Myxcblx0XHRcdDQ0LFxuXHRcdFx0NDUsXG5cdFx0XHQ1Nixcblx0XHRcdDU3LFxuXHRcdFx0NjIsXG5cdFx0XHQ2Myxcblx0XHRcdDY4LFxuXHRcdFx0NjksXG5cdFx0XHQ3NCxcblx0XHRcdDc1LFxuXHRcdFx0NzYsXG5cdFx0XHQ3Nyxcblx0XHRcdDc4LFxuXHRcdFx0NzksXG5cdFx0XHQ4MCxcblx0XHRcdDgxLFxuXHRcdFx0OTIsXG5cdFx0XHQ5Myxcblx0XHRcdDk4LFxuXHRcdFx0OTksXG5cdFx0XHQxMTIsXG5cdFx0XHQxMTMsXG5cdFx0XHQxMjgsXG5cdFx0XHQxMjksXG5cdFx0XHQxMzQsXG5cdFx0XHQxMzUsXG5cdFx0XHQxNDgsXG5cdFx0XHQxNDksXG5cdFx0XHQxNjAsXG5cdFx0XHQxNjEsXG5cdFx0XHQxNjIsXG5cdFx0XHQxNjMsXG5cdFx0XHQxNjQsXG5cdFx0XHQxNjUsXG5cdFx0XHQxNjYsXG5cdFx0XHQxNjcsXG5cdFx0XHQxNjgsXG5cdFx0XHQxNjksXG5cdFx0XHQxNzAsXG5cdFx0XHQxNzEsXG5cdFx0XHQxNzIsXG5cdFx0XHQxNzMsXG5cdFx0XHQxNzgsXG5cdFx0XHQxNzksXG5cdFx0XHQxODQsXG5cdFx0XHQxODUsXG5cdFx0XHQxOTYsXG5cdFx0XHQxOTcsXG5cdFx0XHQxOTgsXG5cdFx0XHQxOTksXG5cdFx0XHQyMDAsXG5cdFx0XHQyMDEsXG5cdFx0XHQyMDIsXG5cdFx0XHQyMDMsXG5cdFx0XHQyMDQsXG5cdFx0XHQyMDUsXG5cdFx0XHQyMDYsXG5cdFx0XHQyMDcsXG5cdFx0XHQyMDgsXG5cdFx0XHQyMDksXG5cdFx0XHQyMTQsXG5cdFx0XHQyMTUsXG5cdFx0XHQyMjAsXG5cdFx0XHQyMjFcblx0XHRdO1xuXHR9XG59IGNhdGNoIChlcnJvcikge1xuXHQvLyBTd2FsbG93IC0gd2Ugb25seSBjYXJlIGlmIGBzdXBwb3J0cy1jb2xvcmAgaXMgYXZhaWxhYmxlOyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUuXG59XG5cbi8qKlxuICogQnVpbGQgdXAgdGhlIGRlZmF1bHQgYGluc3BlY3RPcHRzYCBvYmplY3QgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqICAgJCBERUJVR19DT0xPUlM9bm8gREVCVUdfREVQVEg9MTAgREVCVUdfU0hPV19ISURERU49ZW5hYmxlZCBub2RlIHNjcmlwdC5qc1xuICovXG5cbmV4cG9ydHMuaW5zcGVjdE9wdHMgPSBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikuZmlsdGVyKGtleSA9PiB7XG5cdHJldHVybiAvXmRlYnVnXy9pLnRlc3Qoa2V5KTtcbn0pLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcblx0Ly8gQ2FtZWwtY2FzZVxuXHRjb25zdCBwcm9wID0ga2V5XG5cdFx0LnN1YnN0cmluZyg2KVxuXHRcdC50b0xvd2VyQ2FzZSgpXG5cdFx0LnJlcGxhY2UoL18oW2Etel0pL2csIChfLCBrKSA9PiB7XG5cdFx0XHRyZXR1cm4gay50b1VwcGVyQ2FzZSgpO1xuXHRcdH0pO1xuXG5cdC8vIENvZXJjZSBzdHJpbmcgdmFsdWUgaW50byBKUyB2YWx1ZVxuXHRsZXQgdmFsID0gcHJvY2Vzcy5lbnZba2V5XTtcblx0aWYgKC9eKHllc3xvbnx0cnVlfGVuYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdHZhbCA9IHRydWU7XG5cdH0gZWxzZSBpZiAoL14obm98b2ZmfGZhbHNlfGRpc2FibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSBmYWxzZTtcblx0fSBlbHNlIGlmICh2YWwgPT09ICdudWxsJykge1xuXHRcdHZhbCA9IG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0dmFsID0gTnVtYmVyKHZhbCk7XG5cdH1cblxuXHRvYmpbcHJvcF0gPSB2YWw7XG5cdHJldHVybiBvYmo7XG59LCB7fSk7XG5cbi8qKlxuICogSXMgc3Rkb3V0IGEgVFRZPyBDb2xvcmVkIG91dHB1dCBpcyBlbmFibGVkIHdoZW4gYHRydWVgLlxuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0cmV0dXJuICdjb2xvcnMnIGluIGV4cG9ydHMuaW5zcGVjdE9wdHMgP1xuXHRcdEJvb2xlYW4oZXhwb3J0cy5pbnNwZWN0T3B0cy5jb2xvcnMpIDpcblx0XHR0dHkuaXNhdHR5KHByb2Nlc3Muc3RkZXJyLmZkKTtcbn1cblxuLyoqXG4gKiBBZGRzIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0Y29uc3Qge25hbWVzcGFjZTogbmFtZSwgdXNlQ29sb3JzfSA9IHRoaXM7XG5cblx0aWYgKHVzZUNvbG9ycykge1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNvbG9yO1xuXHRcdGNvbnN0IGNvbG9yQ29kZSA9ICdcXHUwMDFCWzMnICsgKGMgPCA4ID8gYyA6ICc4OzU7JyArIGMpO1xuXHRcdGNvbnN0IHByZWZpeCA9IGAgICR7Y29sb3JDb2RlfTsxbSR7bmFtZX0gXFx1MDAxQlswbWA7XG5cblx0XHRhcmdzWzBdID0gcHJlZml4ICsgYXJnc1swXS5zcGxpdCgnXFxuJykuam9pbignXFxuJyArIHByZWZpeCk7XG5cdFx0YXJncy5wdXNoKGNvbG9yQ29kZSArICdtKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpICsgJ1xcdTAwMUJbMG0nKTtcblx0fSBlbHNlIHtcblx0XHRhcmdzWzBdID0gZ2V0RGF0ZSgpICsgbmFtZSArICcgJyArIGFyZ3NbMF07XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZSgpIHtcblx0aWYgKGV4cG9ydHMuaW5zcGVjdE9wdHMuaGlkZURhdGUpIHtcblx0XHRyZXR1cm4gJyc7XG5cdH1cblx0cmV0dXJuIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSArICcgJztcbn1cblxuLyoqXG4gKiBJbnZva2VzIGB1dGlsLmZvcm1hdCgpYCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFuZCB3cml0ZXMgdG8gc3RkZXJyLlxuICovXG5cbmZ1bmN0aW9uIGxvZyguLi5hcmdzKSB7XG5cdHJldHVybiBwcm9jZXNzLnN0ZGVyci53cml0ZSh1dGlsLmZvcm1hdCguLi5hcmdzKSArICdcXG4nKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHRpZiAobmFtZXNwYWNlcykge1xuXHRcdHByb2Nlc3MuZW52LkRFQlVHID0gbmFtZXNwYWNlcztcblx0fSBlbHNlIHtcblx0XHQvLyBJZiB5b3Ugc2V0IGEgcHJvY2Vzcy5lbnYgZmllbGQgdG8gbnVsbCBvciB1bmRlZmluZWQsIGl0IGdldHMgY2FzdCB0byB0aGVcblx0XHQvLyBzdHJpbmcgJ251bGwnIG9yICd1bmRlZmluZWQnLiBKdXN0IGRlbGV0ZSBpbnN0ZWFkLlxuXHRcdGRlbGV0ZSBwcm9jZXNzLmVudi5ERUJVRztcblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG5cdHJldHVybiBwcm9jZXNzLmVudi5ERUJVRztcbn1cblxuLyoqXG4gKiBJbml0IGxvZ2ljIGZvciBgZGVidWdgIGluc3RhbmNlcy5cbiAqXG4gKiBDcmVhdGUgYSBuZXcgYGluc3BlY3RPcHRzYCBvYmplY3QgaW4gY2FzZSBgdXNlQ29sb3JzYCBpcyBzZXRcbiAqIGRpZmZlcmVudGx5IGZvciBhIHBhcnRpY3VsYXIgYGRlYnVnYCBpbnN0YW5jZS5cbiAqL1xuXG5mdW5jdGlvbiBpbml0KGRlYnVnKSB7XG5cdGRlYnVnLmluc3BlY3RPcHRzID0ge307XG5cblx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHMuaW5zcGVjdE9wdHMpO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRkZWJ1Zy5pbnNwZWN0T3B0c1trZXlzW2ldXSA9IGV4cG9ydHMuaW5zcGVjdE9wdHNba2V5c1tpXV07XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsIG9uIGEgc2luZ2xlIGxpbmUuXG4gKi9cblxuZm9ybWF0dGVycy5vID0gZnVuY3Rpb24gKHYpIHtcblx0dGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblx0cmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKVxuXHRcdC5zcGxpdCgnXFxuJylcblx0XHQubWFwKHN0ciA9PiBzdHIudHJpbSgpKVxuXHRcdC5qb2luKCcgJyk7XG59O1xuXG4vKipcbiAqIE1hcCAlTyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGxvd2luZyBtdWx0aXBsZSBsaW5lcyBpZiBuZWVkZWQuXG4gKi9cblxuZm9ybWF0dGVycy5PID0gZnVuY3Rpb24gKHYpIHtcblx0dGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblx0cmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKTtcbn07XG4iLCIvKipcbiAqIERldGVjdCBFbGVjdHJvbiByZW5kZXJlciAvIG53anMgcHJvY2Vzcywgd2hpY2ggaXMgbm9kZSwgYnV0IHdlIHNob3VsZFxuICogdHJlYXQgYXMgYSBicm93c2VyLlxuICovXG5cbmlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHByb2Nlc3MuYnJvd3NlciA9PT0gdHJ1ZSB8fCBwcm9jZXNzLl9fbndqcykge1xuXHRtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYnJvd3Nlci5qcycpO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL25vZGUuanMnKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IGxvZyA9IGRlYnVnXzEuZGVmYXVsdCgnQGt3c2l0ZXMvZmlsZS1leGlzdHMnKTtcbmZ1bmN0aW9uIGNoZWNrKHBhdGgsIGlzRmlsZSwgaXNEaXJlY3RvcnkpIHtcbiAgICBsb2coYGNoZWNraW5nICVzYCwgcGF0aCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdCA9IGZzXzEuc3RhdFN5bmMocGF0aCk7XG4gICAgICAgIGlmIChzdGF0LmlzRmlsZSgpICYmIGlzRmlsZSkge1xuICAgICAgICAgICAgbG9nKGBbT0tdIHBhdGggcmVwcmVzZW50cyBhIGZpbGVgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkgJiYgaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIGxvZyhgW09LXSBwYXRoIHJlcHJlc2VudHMgYSBkaXJlY3RvcnlgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxvZyhgW0ZBSUxdIHBhdGggcmVwcmVzZW50cyBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIGZpbGUgb3IgZGlyZWN0b3J5YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgIGxvZyhgW0ZBSUxdIHBhdGggaXMgbm90IGFjY2Vzc2libGU6ICVvYCwgZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKGBbRkFUQUxdICVvYCwgZSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxufVxuLyoqXG4gKiBTeW5jaHJvbm91cyB2YWxpZGF0aW9uIG9mIGEgcGF0aCBleGlzdGluZyBlaXRoZXIgYXMgYSBmaWxlIG9yIGFzIGEgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZSBPbmUgb3IgYm90aCBvZiB0aGUgZXhwb3J0ZWQgbnVtZXJpYyBjb25zdGFudHNcbiAqL1xuZnVuY3Rpb24gZXhpc3RzKHBhdGgsIHR5cGUgPSBleHBvcnRzLlJFQURBQkxFKSB7XG4gICAgcmV0dXJuIGNoZWNrKHBhdGgsICh0eXBlICYgZXhwb3J0cy5GSUxFKSA+IDAsICh0eXBlICYgZXhwb3J0cy5GT0xERVIpID4gMCk7XG59XG5leHBvcnRzLmV4aXN0cyA9IGV4aXN0cztcbi8qKlxuICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgZmlsZVxuICovXG5leHBvcnRzLkZJTEUgPSAxO1xuLyoqXG4gKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBmb2xkZXJcbiAqL1xuZXhwb3J0cy5GT0xERVIgPSAyO1xuLyoqXG4gKiBDb25zdGFudCByZXByZXNlbnRpbmcgZWl0aGVyIGEgZmlsZSBvciBhIGZvbGRlclxuICovXG5leHBvcnRzLlJFQURBQkxFID0gZXhwb3J0cy5GSUxFICsgZXhwb3J0cy5GT0xERVI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmZ1bmN0aW9uIF9fZXhwb3J0KG0pIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydChyZXF1aXJlKFwiLi9zcmNcIikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmJ1ZmZlclRvU3RyaW5nID0gZXhwb3J0cy5wcmVmaXhlZEFycmF5ID0gZXhwb3J0cy5hc051bWJlciA9IGV4cG9ydHMuYXNTdHJpbmdBcnJheSA9IGV4cG9ydHMuYXNBcnJheSA9IGV4cG9ydHMub2JqZWN0VG9TdHJpbmcgPSBleHBvcnRzLnJlbW92ZSA9IGV4cG9ydHMuaW5jbHVkaW5nID0gZXhwb3J0cy5hcHBlbmQgPSBleHBvcnRzLmZvbGRlckV4aXN0cyA9IGV4cG9ydHMuZm9yRWFjaExpbmVXaXRoQ29udGVudCA9IGV4cG9ydHMudG9MaW5lc1dpdGhDb250ZW50ID0gZXhwb3J0cy5sYXN0ID0gZXhwb3J0cy5maXJzdCA9IGV4cG9ydHMuc3BsaXRPbiA9IGV4cG9ydHMuaXNVc2VyRnVuY3Rpb24gPSBleHBvcnRzLmFzRnVuY3Rpb24gPSBleHBvcnRzLk5PT1AgPSB2b2lkIDA7XG5jb25zdCBmaWxlX2V4aXN0c18xID0gcmVxdWlyZShcIkBrd3NpdGVzL2ZpbGUtZXhpc3RzXCIpO1xuY29uc3QgTk9PUCA9ICgpID0+IHtcbn07XG5leHBvcnRzLk5PT1AgPSBOT09QO1xuLyoqXG4gKiBSZXR1cm5zIGVpdGhlciB0aGUgc291cmNlIGFyZ3VtZW50IHdoZW4gaXQgaXMgYSBgRnVuY3Rpb25gLCBvciB0aGUgZGVmYXVsdFxuICogYE5PT1BgIGZ1bmN0aW9uIGNvbnN0YW50XG4gKi9cbmZ1bmN0aW9uIGFzRnVuY3Rpb24oc291cmNlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicgPyBzb3VyY2UgOiBleHBvcnRzLk5PT1A7XG59XG5leHBvcnRzLmFzRnVuY3Rpb24gPSBhc0Z1bmN0aW9uO1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN1cHBsaWVkIGFyZ3VtZW50IGlzIGJvdGggYSBmdW5jdGlvbiwgYW5kIGlzIG5vdFxuICogdGhlIGBOT09QYCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gaXNVc2VyRnVuY3Rpb24oc291cmNlKSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygc291cmNlID09PSAnZnVuY3Rpb24nICYmIHNvdXJjZSAhPT0gZXhwb3J0cy5OT09QKTtcbn1cbmV4cG9ydHMuaXNVc2VyRnVuY3Rpb24gPSBpc1VzZXJGdW5jdGlvbjtcbmZ1bmN0aW9uIHNwbGl0T24oaW5wdXQsIGNoYXIpIHtcbiAgICBjb25zdCBpbmRleCA9IGlucHV0LmluZGV4T2YoY2hhcik7XG4gICAgaWYgKGluZGV4IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIFtpbnB1dCwgJyddO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgICBpbnB1dC5zdWJzdHIoMCwgaW5kZXgpLFxuICAgICAgICBpbnB1dC5zdWJzdHIoaW5kZXggKyAxKSxcbiAgICBdO1xufVxuZXhwb3J0cy5zcGxpdE9uID0gc3BsaXRPbjtcbmZ1bmN0aW9uIGZpcnN0KGlucHV0LCBvZmZzZXQgPSAwKSB7XG4gICAgcmV0dXJuIGlzQXJyYXlMaWtlKGlucHV0KSAmJiBpbnB1dC5sZW5ndGggPiBvZmZzZXQgPyBpbnB1dFtvZmZzZXRdIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0cy5maXJzdCA9IGZpcnN0O1xuZnVuY3Rpb24gbGFzdChpbnB1dCwgb2Zmc2V0ID0gMCkge1xuICAgIGlmIChpc0FycmF5TGlrZShpbnB1dCkgJiYgaW5wdXQubGVuZ3RoID4gb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dFtpbnB1dC5sZW5ndGggLSAxIC0gb2Zmc2V0XTtcbiAgICB9XG59XG5leHBvcnRzLmxhc3QgPSBsYXN0O1xuZnVuY3Rpb24gaXNBcnJheUxpa2UoaW5wdXQpIHtcbiAgICByZXR1cm4gISEoaW5wdXQgJiYgdHlwZW9mIGlucHV0Lmxlbmd0aCA9PT0gJ251bWJlcicpO1xufVxuZnVuY3Rpb24gdG9MaW5lc1dpdGhDb250ZW50KGlucHV0LCB0cmltbWVkID0gdHJ1ZSwgc2VwYXJhdG9yID0gJ1xcbicpIHtcbiAgICByZXR1cm4gaW5wdXQuc3BsaXQoc2VwYXJhdG9yKVxuICAgICAgICAucmVkdWNlKChvdXRwdXQsIGxpbmUpID0+IHtcbiAgICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSB0cmltbWVkID8gbGluZS50cmltKCkgOiBsaW5lO1xuICAgICAgICBpZiAobGluZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKGxpbmVDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0sIFtdKTtcbn1cbmV4cG9ydHMudG9MaW5lc1dpdGhDb250ZW50ID0gdG9MaW5lc1dpdGhDb250ZW50O1xuZnVuY3Rpb24gZm9yRWFjaExpbmVXaXRoQ29udGVudChpbnB1dCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdG9MaW5lc1dpdGhDb250ZW50KGlucHV0LCB0cnVlKS5tYXAobGluZSA9PiBjYWxsYmFjayhsaW5lKSk7XG59XG5leHBvcnRzLmZvckVhY2hMaW5lV2l0aENvbnRlbnQgPSBmb3JFYWNoTGluZVdpdGhDb250ZW50O1xuZnVuY3Rpb24gZm9sZGVyRXhpc3RzKHBhdGgpIHtcbiAgICByZXR1cm4gZmlsZV9leGlzdHNfMS5leGlzdHMocGF0aCwgZmlsZV9leGlzdHNfMS5GT0xERVIpO1xufVxuZXhwb3J0cy5mb2xkZXJFeGlzdHMgPSBmb2xkZXJFeGlzdHM7XG4vKipcbiAqIEFkZHMgYGl0ZW1gIGludG8gdGhlIGB0YXJnZXRgIGBBcnJheWAgb3IgYFNldGAgd2hlbiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGFuZCByZXR1cm5zIHRoZSBgaXRlbWAuXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZCh0YXJnZXQsIGl0ZW0pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGFyZ2V0LmFkZChpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG59XG5leHBvcnRzLmFwcGVuZCA9IGFwcGVuZDtcbi8qKlxuICogQWRkcyBgaXRlbWAgaW50byB0aGUgYHRhcmdldGAgYEFycmF5YCB3aGVuIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgYW5kIHJldHVybnMgdGhlIGB0YXJnZXRgLlxuICovXG5mdW5jdGlvbiBpbmNsdWRpbmcodGFyZ2V0LCBpdGVtKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiAhdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICAgIHRhcmdldC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZXhwb3J0cy5pbmNsdWRpbmcgPSBpbmNsdWRpbmc7XG5mdW5jdGlvbiByZW1vdmUodGFyZ2V0LCBpdGVtKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRhcmdldC5pbmRleE9mKGl0ZW0pO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGFyZ2V0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRhcmdldC5kZWxldGUoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xufVxuZXhwb3J0cy5yZW1vdmUgPSByZW1vdmU7XG5leHBvcnRzLm9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyk7XG5mdW5jdGlvbiBhc0FycmF5KHNvdXJjZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNvdXJjZSkgPyBzb3VyY2UgOiBbc291cmNlXTtcbn1cbmV4cG9ydHMuYXNBcnJheSA9IGFzQXJyYXk7XG5mdW5jdGlvbiBhc1N0cmluZ0FycmF5KHNvdXJjZSkge1xuICAgIHJldHVybiBhc0FycmF5KHNvdXJjZSkubWFwKFN0cmluZyk7XG59XG5leHBvcnRzLmFzU3RyaW5nQXJyYXkgPSBhc1N0cmluZ0FycmF5O1xuZnVuY3Rpb24gYXNOdW1iZXIoc291cmNlLCBvbk5hTiA9IDApIHtcbiAgICBpZiAoc291cmNlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG9uTmFOO1xuICAgIH1cbiAgICBjb25zdCBudW0gPSBwYXJzZUludChzb3VyY2UsIDEwKTtcbiAgICByZXR1cm4gaXNOYU4obnVtKSA/IG9uTmFOIDogbnVtO1xufVxuZXhwb3J0cy5hc051bWJlciA9IGFzTnVtYmVyO1xuZnVuY3Rpb24gcHJlZml4ZWRBcnJheShpbnB1dCwgcHJlZml4KSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIG1heCA9IGlucHV0Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgIG91dHB1dC5wdXNoKHByZWZpeCwgaW5wdXRbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuZXhwb3J0cy5wcmVmaXhlZEFycmF5ID0gcHJlZml4ZWRBcnJheTtcbmZ1bmN0aW9uIGJ1ZmZlclRvU3RyaW5nKGlucHV0KSB7XG4gICAgcmV0dXJuIChBcnJheS5pc0FycmF5KGlucHV0KSA/IEJ1ZmZlci5jb25jYXQoaW5wdXQpIDogaW5wdXQpLnRvU3RyaW5nKCd1dGYtOCcpO1xufVxuZXhwb3J0cy5idWZmZXJUb1N0cmluZyA9IGJ1ZmZlclRvU3RyaW5nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZmlsdGVySGFzTGVuZ3RoID0gZXhwb3J0cy5maWx0ZXJGdW5jdGlvbiA9IGV4cG9ydHMuZmlsdGVyUGxhaW5PYmplY3QgPSBleHBvcnRzLmZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXkgPSBleHBvcnRzLmZpbHRlclN0cmluZ0FycmF5ID0gZXhwb3J0cy5maWx0ZXJTdHJpbmcgPSBleHBvcnRzLmZpbHRlclByaW1pdGl2ZXMgPSBleHBvcnRzLmZpbHRlckFycmF5ID0gZXhwb3J0cy5maWx0ZXJUeXBlID0gdm9pZCAwO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbmZ1bmN0aW9uIGZpbHRlclR5cGUoaW5wdXQsIGZpbHRlciwgZGVmKSB7XG4gICAgaWYgKGZpbHRlcihpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgICByZXR1cm4gKGFyZ3VtZW50cy5sZW5ndGggPiAyKSA/IGRlZiA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydHMuZmlsdGVyVHlwZSA9IGZpbHRlclR5cGU7XG5jb25zdCBmaWx0ZXJBcnJheSA9IChpbnB1dCkgPT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KTtcbn07XG5leHBvcnRzLmZpbHRlckFycmF5ID0gZmlsdGVyQXJyYXk7XG5mdW5jdGlvbiBmaWx0ZXJQcmltaXRpdmVzKGlucHV0LCBvbWl0KSB7XG4gICAgcmV0dXJuIC9udW1iZXJ8c3RyaW5nfGJvb2xlYW4vLnRlc3QodHlwZW9mIGlucHV0KSAmJiAoIW9taXQgfHwgIW9taXQuaW5jbHVkZXMoKHR5cGVvZiBpbnB1dCkpKTtcbn1cbmV4cG9ydHMuZmlsdGVyUHJpbWl0aXZlcyA9IGZpbHRlclByaW1pdGl2ZXM7XG5jb25zdCBmaWx0ZXJTdHJpbmcgPSAoaW5wdXQpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJztcbn07XG5leHBvcnRzLmZpbHRlclN0cmluZyA9IGZpbHRlclN0cmluZztcbmNvbnN0IGZpbHRlclN0cmluZ0FycmF5ID0gKGlucHV0KSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIGlucHV0LmV2ZXJ5KGV4cG9ydHMuZmlsdGVyU3RyaW5nKTtcbn07XG5leHBvcnRzLmZpbHRlclN0cmluZ0FycmF5ID0gZmlsdGVyU3RyaW5nQXJyYXk7XG5jb25zdCBmaWx0ZXJTdHJpbmdPclN0cmluZ0FycmF5ID0gKGlucHV0KSA9PiB7XG4gICAgcmV0dXJuIGV4cG9ydHMuZmlsdGVyU3RyaW5nKGlucHV0KSB8fCAoQXJyYXkuaXNBcnJheShpbnB1dCkgJiYgaW5wdXQuZXZlcnkoZXhwb3J0cy5maWx0ZXJTdHJpbmcpKTtcbn07XG5leHBvcnRzLmZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXkgPSBmaWx0ZXJTdHJpbmdPclN0cmluZ0FycmF5O1xuZnVuY3Rpb24gZmlsdGVyUGxhaW5PYmplY3QoaW5wdXQpIHtcbiAgICByZXR1cm4gISFpbnB1dCAmJiB1dGlsXzEub2JqZWN0VG9TdHJpbmcoaW5wdXQpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cbmV4cG9ydHMuZmlsdGVyUGxhaW5PYmplY3QgPSBmaWx0ZXJQbGFpbk9iamVjdDtcbmZ1bmN0aW9uIGZpbHRlckZ1bmN0aW9uKGlucHV0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZmlsdGVyRnVuY3Rpb24gPSBmaWx0ZXJGdW5jdGlvbjtcbmNvbnN0IGZpbHRlckhhc0xlbmd0aCA9IChpbnB1dCkgPT4ge1xuICAgIGlmIChpbnB1dCA9PSBudWxsIHx8ICdudW1iZXJ8Ym9vbGVhbnxmdW5jdGlvbicuaW5jbHVkZXModHlwZW9mIGlucHV0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSB8fCB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBpbnB1dC5sZW5ndGggPT09ICdudW1iZXInO1xufTtcbmV4cG9ydHMuZmlsdGVySGFzTGVuZ3RoID0gZmlsdGVySGFzTGVuZ3RoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJndW1lbnQtZmlsdGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRXhpdENvZGVzID0gdm9pZCAwO1xuLyoqXG4gKiBLbm93biBwcm9jZXNzIGV4aXQgY29kZXMgdXNlZCBieSB0aGUgdGFzayBwYXJzZXJzIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGVycm9yXG4gKiB3YXMgb25lIHRoZXkgY2FuIGF1dG9tYXRpY2FsbHkgaGFuZGxlXG4gKi9cbnZhciBFeGl0Q29kZXM7XG4oZnVuY3Rpb24gKEV4aXRDb2Rlcykge1xuICAgIEV4aXRDb2Rlc1tFeGl0Q29kZXNbXCJTVUNDRVNTXCJdID0gMF0gPSBcIlNVQ0NFU1NcIjtcbiAgICBFeGl0Q29kZXNbRXhpdENvZGVzW1wiRVJST1JcIl0gPSAxXSA9IFwiRVJST1JcIjtcbiAgICBFeGl0Q29kZXNbRXhpdENvZGVzW1wiVU5DTEVBTlwiXSA9IDEyOF0gPSBcIlVOQ0xFQU5cIjtcbn0pKEV4aXRDb2RlcyA9IGV4cG9ydHMuRXhpdENvZGVzIHx8IChleHBvcnRzLkV4aXRDb2RlcyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leGl0LWNvZGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HaXRPdXRwdXRTdHJlYW1zID0gdm9pZCAwO1xuY2xhc3MgR2l0T3V0cHV0U3RyZWFtcyB7XG4gICAgY29uc3RydWN0b3Ioc3RkT3V0LCBzdGRFcnIpIHtcbiAgICAgICAgdGhpcy5zdGRPdXQgPSBzdGRPdXQ7XG4gICAgICAgIHRoaXMuc3RkRXJyID0gc3RkRXJyO1xuICAgIH1cbiAgICBhc1N0cmluZ3MoKSB7XG4gICAgICAgIHJldHVybiBuZXcgR2l0T3V0cHV0U3RyZWFtcyh0aGlzLnN0ZE91dC50b1N0cmluZygndXRmOCcpLCB0aGlzLnN0ZEVyci50b1N0cmluZygndXRmOCcpKTtcbiAgICB9XG59XG5leHBvcnRzLkdpdE91dHB1dFN0cmVhbXMgPSBHaXRPdXRwdXRTdHJlYW1zO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0LW91dHB1dC1zdHJlYW1zLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZW1vdGVMaW5lUGFyc2VyID0gZXhwb3J0cy5MaW5lUGFyc2VyID0gdm9pZCAwO1xuY2xhc3MgTGluZVBhcnNlciB7XG4gICAgY29uc3RydWN0b3IocmVnRXhwLCB1c2VNYXRjaGVzKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlcyA9IFtdO1xuICAgICAgICB0aGlzLnBhcnNlID0gKGxpbmUsIHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNldE1hdGNoZXMoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcmVnRXhwLmV2ZXJ5KChyZWcsIGluZGV4KSA9PiB0aGlzLmFkZE1hdGNoKHJlZywgaW5kZXgsIGxpbmUoaW5kZXgpKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51c2VNYXRjaGVzKHRhcmdldCwgdGhpcy5wcmVwYXJlTWF0Y2hlcygpKSAhPT0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3JlZ0V4cCA9IEFycmF5LmlzQXJyYXkocmVnRXhwKSA/IHJlZ0V4cCA6IFtyZWdFeHBdO1xuICAgICAgICBpZiAodXNlTWF0Y2hlcykge1xuICAgICAgICAgICAgdGhpcy51c2VNYXRjaGVzID0gdXNlTWF0Y2hlcztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdXNlTWF0Y2hlcyh0YXJnZXQsIG1hdGNoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGluZVBhcnNlcjp1c2VNYXRjaGVzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgIH1cbiAgICByZXNldE1hdGNoZXMoKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlcy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICBwcmVwYXJlTWF0Y2hlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcztcbiAgICB9XG4gICAgYWRkTWF0Y2gocmVnLCBpbmRleCwgbGluZSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkID0gbGluZSAmJiByZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaE1hdGNoKGluZGV4LCBtYXRjaGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFtYXRjaGVkO1xuICAgIH1cbiAgICBwdXNoTWF0Y2goX2luZGV4LCBtYXRjaGVkKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlcy5wdXNoKC4uLm1hdGNoZWQuc2xpY2UoMSkpO1xuICAgIH1cbn1cbmV4cG9ydHMuTGluZVBhcnNlciA9IExpbmVQYXJzZXI7XG5jbGFzcyBSZW1vdGVMaW5lUGFyc2VyIGV4dGVuZHMgTGluZVBhcnNlciB7XG4gICAgYWRkTWF0Y2gocmVnLCBpbmRleCwgbGluZSkge1xuICAgICAgICByZXR1cm4gL15yZW1vdGU6XFxzLy50ZXN0KFN0cmluZyhsaW5lKSkgJiYgc3VwZXIuYWRkTWF0Y2gocmVnLCBpbmRleCwgbGluZSk7XG4gICAgfVxuICAgIHB1c2hNYXRjaChpbmRleCwgbWF0Y2hlZCkge1xuICAgICAgICBpZiAoaW5kZXggPiAwIHx8IG1hdGNoZWQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgc3VwZXIucHVzaE1hdGNoKGluZGV4LCBtYXRjaGVkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuUmVtb3RlTGluZVBhcnNlciA9IFJlbW90ZUxpbmVQYXJzZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5lLXBhcnNlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlSW5zdGFuY2VDb25maWcgPSB2b2lkIDA7XG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBiaW5hcnk6ICdnaXQnLFxuICAgIG1heENvbmN1cnJlbnRQcm9jZXNzZXM6IDUsXG4gICAgY29uZmlnOiBbXSxcbn07XG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZUNvbmZpZyguLi5vcHRpb25zKSB7XG4gICAgY29uc3QgYmFzZURpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgYmFzZURpciB9LCBkZWZhdWx0T3B0aW9ucyksIC4uLihvcHRpb25zLmZpbHRlcihvID0+IHR5cGVvZiBvID09PSAnb2JqZWN0JyAmJiBvKSkpO1xuICAgIGNvbmZpZy5iYXNlRGlyID0gY29uZmlnLmJhc2VEaXIgfHwgYmFzZURpcjtcbiAgICByZXR1cm4gY29uZmlnO1xufVxuZXhwb3J0cy5jcmVhdGVJbnN0YW5jZUNvbmZpZyA9IGNyZWF0ZUluc3RhbmNlQ29uZmlnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2ltcGxlLWdpdC1vcHRpb25zLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQgPSBleHBvcnRzLnRyYWlsaW5nT3B0aW9uc0FyZ3VtZW50ID0gZXhwb3J0cy5nZXRUcmFpbGluZ09wdGlvbnMgPSBleHBvcnRzLmFwcGVuZFRhc2tPcHRpb25zID0gdm9pZCAwO1xuY29uc3QgYXJndW1lbnRfZmlsdGVyc18xID0gcmVxdWlyZShcIi4vYXJndW1lbnQtZmlsdGVyc1wiKTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5mdW5jdGlvbiBhcHBlbmRUYXNrT3B0aW9ucyhvcHRpb25zLCBjb21tYW5kcyA9IFtdKSB7XG4gICAgaWYgKCFhcmd1bWVudF9maWx0ZXJzXzEuZmlsdGVyUGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMob3B0aW9ucykucmVkdWNlKChjb21tYW5kcywga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uc1trZXldO1xuICAgICAgICBpZiAoYXJndW1lbnRfZmlsdGVyc18xLmZpbHRlclByaW1pdGl2ZXModmFsdWUsIFsnYm9vbGVhbiddKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaChrZXkgKyAnPScgKyB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgIH0sIGNvbW1hbmRzKTtcbn1cbmV4cG9ydHMuYXBwZW5kVGFza09wdGlvbnMgPSBhcHBlbmRUYXNrT3B0aW9ucztcbmZ1bmN0aW9uIGdldFRyYWlsaW5nT3B0aW9ucyhhcmdzLCBpbml0aWFsUHJpbWl0aXZlID0gMCwgb2JqZWN0T25seSA9IGZhbHNlKSB7XG4gICAgY29uc3QgY29tbWFuZCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBpbml0aWFsUHJpbWl0aXZlIDwgMCA/IGFyZ3MubGVuZ3RoIDogaW5pdGlhbFByaW1pdGl2ZTsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgIGlmICgnc3RyaW5nfG51bWJlcicuaW5jbHVkZXModHlwZW9mIGFyZ3NbaV0pKSB7XG4gICAgICAgICAgICBjb21tYW5kLnB1c2goU3RyaW5nKGFyZ3NbaV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBlbmRUYXNrT3B0aW9ucyh0cmFpbGluZ09wdGlvbnNBcmd1bWVudChhcmdzKSwgY29tbWFuZCk7XG4gICAgaWYgKCFvYmplY3RPbmx5KSB7XG4gICAgICAgIGNvbW1hbmQucHVzaCguLi50cmFpbGluZ0FycmF5QXJndW1lbnQoYXJncykpO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWFuZDtcbn1cbmV4cG9ydHMuZ2V0VHJhaWxpbmdPcHRpb25zID0gZ2V0VHJhaWxpbmdPcHRpb25zO1xuZnVuY3Rpb24gdHJhaWxpbmdBcnJheUFyZ3VtZW50KGFyZ3MpIHtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NhbGxiYWNrID0gdHlwZW9mIHV0aWxfMS5sYXN0KGFyZ3MpID09PSAnZnVuY3Rpb24nO1xuICAgIHJldHVybiBhcmd1bWVudF9maWx0ZXJzXzEuZmlsdGVyVHlwZSh1dGlsXzEubGFzdChhcmdzLCBoYXNUcmFpbGluZ0NhbGxiYWNrID8gMSA6IDApLCBhcmd1bWVudF9maWx0ZXJzXzEuZmlsdGVyQXJyYXksIFtdKTtcbn1cbi8qKlxuICogR2l2ZW4gYW55IG51bWJlciBvZiBhcmd1bWVudHMsIHJldHVybnMgdGhlIHRyYWlsaW5nIG9wdGlvbnMgYXJndW1lbnQsIGlnbm9yaW5nIGEgdHJhaWxpbmcgZnVuY3Rpb24gYXJndW1lbnRcbiAqIGlmIHRoZXJlIGlzIG9uZS4gV2hlbiBub3QgZm91bmQsIHRoZSByZXR1cm4gdmFsdWUgaXMgbnVsbC5cbiAqL1xuZnVuY3Rpb24gdHJhaWxpbmdPcHRpb25zQXJndW1lbnQoYXJncykge1xuICAgIGNvbnN0IGhhc1RyYWlsaW5nQ2FsbGJhY2sgPSBhcmd1bWVudF9maWx0ZXJzXzEuZmlsdGVyRnVuY3Rpb24odXRpbF8xLmxhc3QoYXJncykpO1xuICAgIHJldHVybiBhcmd1bWVudF9maWx0ZXJzXzEuZmlsdGVyVHlwZSh1dGlsXzEubGFzdChhcmdzLCBoYXNUcmFpbGluZ0NhbGxiYWNrID8gMSA6IDApLCBhcmd1bWVudF9maWx0ZXJzXzEuZmlsdGVyUGxhaW5PYmplY3QpO1xufVxuZXhwb3J0cy50cmFpbGluZ09wdGlvbnNBcmd1bWVudCA9IHRyYWlsaW5nT3B0aW9uc0FyZ3VtZW50O1xuLyoqXG4gKiBSZXR1cm5zIGVpdGhlciB0aGUgc291cmNlIGFyZ3VtZW50IHdoZW4gaXQgaXMgYSBgRnVuY3Rpb25gLCBvciB0aGUgZGVmYXVsdFxuICogYE5PT1BgIGZ1bmN0aW9uIGNvbnN0YW50XG4gKi9cbmZ1bmN0aW9uIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmdzLCBpbmNsdWRlTm9vcCA9IHRydWUpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHV0aWxfMS5hc0Z1bmN0aW9uKHV0aWxfMS5sYXN0KGFyZ3MpKTtcbiAgICByZXR1cm4gaW5jbHVkZU5vb3AgfHwgdXRpbF8xLmlzVXNlckZ1bmN0aW9uKGNhbGxiYWNrKSA/IGNhbGxiYWNrIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0cy50cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQgPSB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXNrLW9wdGlvbnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlU3RyaW5nUmVzcG9uc2UgPSBleHBvcnRzLmNhbGxUYXNrUGFyc2VyID0gdm9pZCAwO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbmZ1bmN0aW9uIGNhbGxUYXNrUGFyc2VyKHBhcnNlciwgc3RyZWFtcykge1xuICAgIHJldHVybiBwYXJzZXIoc3RyZWFtcy5zdGRPdXQsIHN0cmVhbXMuc3RkRXJyKTtcbn1cbmV4cG9ydHMuY2FsbFRhc2tQYXJzZXIgPSBjYWxsVGFza1BhcnNlcjtcbmZ1bmN0aW9uIHBhcnNlU3RyaW5nUmVzcG9uc2UocmVzdWx0LCBwYXJzZXJzLCAuLi50ZXh0cykge1xuICAgIHRleHRzLmZvckVhY2godGV4dCA9PiB7XG4gICAgICAgIGZvciAobGV0IGxpbmVzID0gdXRpbF8xLnRvTGluZXNXaXRoQ29udGVudCh0ZXh0KSwgaSA9IDAsIG1heCA9IGxpbmVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gKG9mZnNldCA9IDApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoKGkgKyBvZmZzZXQpID49IG1heCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBsaW5lc1tpICsgb2Zmc2V0XTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBwYXJzZXJzLnNvbWUoKHsgcGFyc2UgfSkgPT4gcGFyc2UobGluZSwgcmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5wYXJzZVN0cmluZ1Jlc3BvbnNlID0gcGFyc2VTdHJpbmdSZXNwb25zZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhc2stcGFyc2VyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vYXJndW1lbnQtZmlsdGVyc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZXhpdC1jb2Rlc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZ2l0LW91dHB1dC1zdHJlYW1zXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9saW5lLXBhcnNlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2ltcGxlLWdpdC1vcHRpb25zXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi90YXNrLW9wdGlvbnNcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3Rhc2stcGFyc2VyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi91dGlsXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jaGVja0lzQmFyZVJlcG9UYXNrID0gZXhwb3J0cy5jaGVja0lzUmVwb1Jvb3RUYXNrID0gZXhwb3J0cy5jaGVja0lzUmVwb1Rhc2sgPSBleHBvcnRzLkNoZWNrUmVwb0FjdGlvbnMgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xudmFyIENoZWNrUmVwb0FjdGlvbnM7XG4oZnVuY3Rpb24gKENoZWNrUmVwb0FjdGlvbnMpIHtcbiAgICBDaGVja1JlcG9BY3Rpb25zW1wiQkFSRVwiXSA9IFwiYmFyZVwiO1xuICAgIENoZWNrUmVwb0FjdGlvbnNbXCJJTl9UUkVFXCJdID0gXCJ0cmVlXCI7XG4gICAgQ2hlY2tSZXBvQWN0aW9uc1tcIklTX1JFUE9fUk9PVFwiXSA9IFwicm9vdFwiO1xufSkoQ2hlY2tSZXBvQWN0aW9ucyA9IGV4cG9ydHMuQ2hlY2tSZXBvQWN0aW9ucyB8fCAoZXhwb3J0cy5DaGVja1JlcG9BY3Rpb25zID0ge30pKTtcbmNvbnN0IG9uRXJyb3IgPSAoeyBleGl0Q29kZSB9LCBlcnJvciwgZG9uZSwgZmFpbCkgPT4ge1xuICAgIGlmIChleGl0Q29kZSA9PT0gdXRpbHNfMS5FeGl0Q29kZXMuVU5DTEVBTiAmJiBpc05vdFJlcG9NZXNzYWdlKGVycm9yKSkge1xuICAgICAgICByZXR1cm4gZG9uZShCdWZmZXIuZnJvbSgnZmFsc2UnKSk7XG4gICAgfVxuICAgIGZhaWwoZXJyb3IpO1xufTtcbmNvbnN0IHBhcnNlciA9ICh0ZXh0KSA9PiB7XG4gICAgcmV0dXJuIHRleHQudHJpbSgpID09PSAndHJ1ZSc7XG59O1xuZnVuY3Rpb24gY2hlY2tJc1JlcG9UYXNrKGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgQ2hlY2tSZXBvQWN0aW9ucy5CQVJFOlxuICAgICAgICAgICAgcmV0dXJuIGNoZWNrSXNCYXJlUmVwb1Rhc2soKTtcbiAgICAgICAgY2FzZSBDaGVja1JlcG9BY3Rpb25zLklTX1JFUE9fUk9PVDpcbiAgICAgICAgICAgIHJldHVybiBjaGVja0lzUmVwb1Jvb3RUYXNrKCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbW1hbmRzID0gWydyZXYtcGFyc2UnLCAnLS1pcy1pbnNpZGUtd29yay10cmVlJ107XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgb25FcnJvcixcbiAgICAgICAgcGFyc2VyLFxuICAgIH07XG59XG5leHBvcnRzLmNoZWNrSXNSZXBvVGFzayA9IGNoZWNrSXNSZXBvVGFzaztcbmZ1bmN0aW9uIGNoZWNrSXNSZXBvUm9vdFRhc2soKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbJ3Jldi1wYXJzZScsICctLWdpdC1kaXInXTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBvbkVycm9yLFxuICAgICAgICBwYXJzZXIocGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eXFwuKGdpdCk/JC8udGVzdChwYXRoLnRyaW0oKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmV4cG9ydHMuY2hlY2tJc1JlcG9Sb290VGFzayA9IGNoZWNrSXNSZXBvUm9vdFRhc2s7XG5mdW5jdGlvbiBjaGVja0lzQmFyZVJlcG9UYXNrKCkge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydyZXYtcGFyc2UnLCAnLS1pcy1iYXJlLXJlcG9zaXRvcnknXTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBvbkVycm9yLFxuICAgICAgICBwYXJzZXIsXG4gICAgfTtcbn1cbmV4cG9ydHMuY2hlY2tJc0JhcmVSZXBvVGFzayA9IGNoZWNrSXNCYXJlUmVwb1Rhc2s7XG5mdW5jdGlvbiBpc05vdFJlcG9NZXNzYWdlKGVycm9yKSB7XG4gICAgcmV0dXJuIC8oTm90IGEgZ2l0IHJlcG9zaXRvcnl8S2VpbiBHaXQtUmVwb3NpdG9yeSkvaS50ZXN0KFN0cmluZyhlcnJvcikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hlY2staXMtcmVwby5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2xlYW5TdW1tYXJ5UGFyc2VyID0gZXhwb3J0cy5DbGVhblJlc3BvbnNlID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNsYXNzIENsZWFuUmVzcG9uc2Uge1xuICAgIGNvbnN0cnVjdG9yKGRyeVJ1bikge1xuICAgICAgICB0aGlzLmRyeVJ1biA9IGRyeVJ1bjtcbiAgICAgICAgdGhpcy5wYXRocyA9IFtdO1xuICAgICAgICB0aGlzLmZpbGVzID0gW107XG4gICAgICAgIHRoaXMuZm9sZGVycyA9IFtdO1xuICAgIH1cbn1cbmV4cG9ydHMuQ2xlYW5SZXNwb25zZSA9IENsZWFuUmVzcG9uc2U7XG5jb25zdCByZW1vdmFsUmVnZXhwID0gL15bYS16XStcXHMqL2k7XG5jb25zdCBkcnlSdW5SZW1vdmFsUmVnZXhwID0gL15bYS16XStcXHMrW2Etel0rXFxzKi9pO1xuY29uc3QgaXNGb2xkZXJSZWdleHAgPSAvXFwvJC87XG5mdW5jdGlvbiBjbGVhblN1bW1hcnlQYXJzZXIoZHJ5UnVuLCB0ZXh0KSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IG5ldyBDbGVhblJlc3BvbnNlKGRyeVJ1bik7XG4gICAgY29uc3QgcmVnZXhwID0gZHJ5UnVuID8gZHJ5UnVuUmVtb3ZhbFJlZ2V4cCA6IHJlbW92YWxSZWdleHA7XG4gICAgdXRpbHNfMS50b0xpbmVzV2l0aENvbnRlbnQodGV4dCkuZm9yRWFjaChsaW5lID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGxpbmUucmVwbGFjZShyZWdleHAsICcnKTtcbiAgICAgICAgc3VtbWFyeS5wYXRocy5wdXNoKHJlbW92ZWQpO1xuICAgICAgICAoaXNGb2xkZXJSZWdleHAudGVzdChyZW1vdmVkKSA/IHN1bW1hcnkuZm9sZGVycyA6IHN1bW1hcnkuZmlsZXMpLnB1c2gocmVtb3ZlZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG59XG5leHBvcnRzLmNsZWFuU3VtbWFyeVBhcnNlciA9IGNsZWFuU3VtbWFyeVBhcnNlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsZWFuU3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNFbXB0eVRhc2sgPSBleHBvcnRzLmlzQnVmZmVyVGFzayA9IGV4cG9ydHMuc3RyYWlnaHRUaHJvdWdoQnVmZmVyVGFzayA9IGV4cG9ydHMuc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayA9IGV4cG9ydHMuY29uZmlndXJhdGlvbkVycm9yVGFzayA9IGV4cG9ydHMuYWRob2NFeGVjVGFzayA9IGV4cG9ydHMuRU1QVFlfQ09NTUFORFMgPSB2b2lkIDA7XG5jb25zdCB0YXNrX2NvbmZpZ3VyYXRpb25fZXJyb3JfMSA9IHJlcXVpcmUoXCIuLi9lcnJvcnMvdGFzay1jb25maWd1cmF0aW9uLWVycm9yXCIpO1xuZXhwb3J0cy5FTVBUWV9DT01NQU5EUyA9IFtdO1xuZnVuY3Rpb24gYWRob2NFeGVjVGFzayhwYXJzZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogZXhwb3J0cy5FTVBUWV9DT01NQU5EUyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIsXG4gICAgfTtcbn1cbmV4cG9ydHMuYWRob2NFeGVjVGFzayA9IGFkaG9jRXhlY1Rhc2s7XG5mdW5jdGlvbiBjb25maWd1cmF0aW9uRXJyb3JUYXNrKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHM6IGV4cG9ydHMuRU1QVFlfQ09NTUFORFMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyKCkge1xuICAgICAgICAgICAgdGhyb3cgdHlwZW9mIGVycm9yID09PSAnc3RyaW5nJyA/IG5ldyB0YXNrX2NvbmZpZ3VyYXRpb25fZXJyb3JfMS5UYXNrQ29uZmlndXJhdGlvbkVycm9yKGVycm9yKSA6IGVycm9yO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMuY29uZmlndXJhdGlvbkVycm9yVGFzayA9IGNvbmZpZ3VyYXRpb25FcnJvclRhc2s7XG5mdW5jdGlvbiBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzLCB0cmltbWVkID0gZmFsc2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIodGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWQgPyBTdHJpbmcodGV4dCkudHJpbSgpIDogdGV4dDtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0cy5zdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrID0gc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzaztcbmZ1bmN0aW9uIHN0cmFpZ2h0VGhyb3VnaEJ1ZmZlclRhc2soY29tbWFuZHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAnYnVmZmVyJyxcbiAgICAgICAgcGFyc2VyKGJ1ZmZlcikge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0cy5zdHJhaWdodFRocm91Z2hCdWZmZXJUYXNrID0gc3RyYWlnaHRUaHJvdWdoQnVmZmVyVGFzaztcbmZ1bmN0aW9uIGlzQnVmZmVyVGFzayh0YXNrKSB7XG4gICAgcmV0dXJuIHRhc2suZm9ybWF0ID09PSAnYnVmZmVyJztcbn1cbmV4cG9ydHMuaXNCdWZmZXJUYXNrID0gaXNCdWZmZXJUYXNrO1xuZnVuY3Rpb24gaXNFbXB0eVRhc2sodGFzaykge1xuICAgIHJldHVybiAhdGFzay5jb21tYW5kcy5sZW5ndGg7XG59XG5leHBvcnRzLmlzRW1wdHlUYXNrID0gaXNFbXB0eVRhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXNrLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0NsZWFuT3B0aW9uc0FycmF5ID0gZXhwb3J0cy5jbGVhblRhc2sgPSBleHBvcnRzLmNsZWFuV2l0aE9wdGlvbnNUYXNrID0gZXhwb3J0cy5DbGVhbk9wdGlvbnMgPSBleHBvcnRzLkNPTkZJR19FUlJPUl9VTktOT1dOX09QVElPTiA9IGV4cG9ydHMuQ09ORklHX0VSUk9SX01PREVfUkVRVUlSRUQgPSBleHBvcnRzLkNPTkZJR19FUlJPUl9JTlRFUkFDVElWRV9NT0RFID0gdm9pZCAwO1xuY29uc3QgQ2xlYW5TdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcmVzcG9uc2VzL0NsZWFuU3VtbWFyeVwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCB0YXNrXzEgPSByZXF1aXJlKFwiLi90YXNrXCIpO1xuZXhwb3J0cy5DT05GSUdfRVJST1JfSU5URVJBQ1RJVkVfTU9ERSA9ICdHaXQgY2xlYW4gaW50ZXJhY3RpdmUgbW9kZSBpcyBub3Qgc3VwcG9ydGVkJztcbmV4cG9ydHMuQ09ORklHX0VSUk9SX01PREVfUkVRVUlSRUQgPSAnR2l0IGNsZWFuIG1vZGUgcGFyYW1ldGVyIChcIm5cIiBvciBcImZcIikgaXMgcmVxdWlyZWQnO1xuZXhwb3J0cy5DT05GSUdfRVJST1JfVU5LTk9XTl9PUFRJT04gPSAnR2l0IGNsZWFuIHVua25vd24gb3B0aW9uIGZvdW5kIGluOiAnO1xuLyoqXG4gKiBBbGwgc3VwcG9ydGVkIG9wdGlvbiBzd2l0Y2hlcyBhdmFpbGFibGUgZm9yIHVzZSBpbiBhIGBnaXQuY2xlYW5gIG9wZXJhdGlvblxuICovXG52YXIgQ2xlYW5PcHRpb25zO1xuKGZ1bmN0aW9uIChDbGVhbk9wdGlvbnMpIHtcbiAgICBDbGVhbk9wdGlvbnNbXCJEUllfUlVOXCJdID0gXCJuXCI7XG4gICAgQ2xlYW5PcHRpb25zW1wiRk9SQ0VcIl0gPSBcImZcIjtcbiAgICBDbGVhbk9wdGlvbnNbXCJJR05PUkVEX0lOQ0xVREVEXCJdID0gXCJ4XCI7XG4gICAgQ2xlYW5PcHRpb25zW1wiSUdOT1JFRF9PTkxZXCJdID0gXCJYXCI7XG4gICAgQ2xlYW5PcHRpb25zW1wiRVhDTFVESU5HXCJdID0gXCJlXCI7XG4gICAgQ2xlYW5PcHRpb25zW1wiUVVJRVRcIl0gPSBcInFcIjtcbiAgICBDbGVhbk9wdGlvbnNbXCJSRUNVUlNJVkVcIl0gPSBcImRcIjtcbn0pKENsZWFuT3B0aW9ucyA9IGV4cG9ydHMuQ2xlYW5PcHRpb25zIHx8IChleHBvcnRzLkNsZWFuT3B0aW9ucyA9IHt9KSk7XG5jb25zdCBDbGVhbk9wdGlvblZhbHVlcyA9IG5ldyBTZXQoWydpJywgLi4udXRpbHNfMS5hc1N0cmluZ0FycmF5KE9iamVjdC52YWx1ZXMoQ2xlYW5PcHRpb25zKSldKTtcbmZ1bmN0aW9uIGNsZWFuV2l0aE9wdGlvbnNUYXNrKG1vZGUsIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCB7IGNsZWFuTW9kZSwgb3B0aW9ucywgdmFsaWQgfSA9IGdldENsZWFuT3B0aW9ucyhtb2RlKTtcbiAgICBpZiAoIWNsZWFuTW9kZSkge1xuICAgICAgICByZXR1cm4gdGFza18xLmNvbmZpZ3VyYXRpb25FcnJvclRhc2soZXhwb3J0cy5DT05GSUdfRVJST1JfTU9ERV9SRVFVSVJFRCk7XG4gICAgfVxuICAgIGlmICghdmFsaWQub3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGFza18xLmNvbmZpZ3VyYXRpb25FcnJvclRhc2soZXhwb3J0cy5DT05GSUdfRVJST1JfVU5LTk9XTl9PUFRJT04gKyBKU09OLnN0cmluZ2lmeShtb2RlKSk7XG4gICAgfVxuICAgIG9wdGlvbnMucHVzaCguLi5jdXN0b21BcmdzKTtcbiAgICBpZiAob3B0aW9ucy5zb21lKGlzSW50ZXJhY3RpdmVNb2RlKSkge1xuICAgICAgICByZXR1cm4gdGFza18xLmNvbmZpZ3VyYXRpb25FcnJvclRhc2soZXhwb3J0cy5DT05GSUdfRVJST1JfSU5URVJBQ1RJVkVfTU9ERSk7XG4gICAgfVxuICAgIHJldHVybiBjbGVhblRhc2soY2xlYW5Nb2RlLCBvcHRpb25zKTtcbn1cbmV4cG9ydHMuY2xlYW5XaXRoT3B0aW9uc1Rhc2sgPSBjbGVhbldpdGhPcHRpb25zVGFzaztcbmZ1bmN0aW9uIGNsZWFuVGFzayhtb2RlLCBjdXN0b21BcmdzKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbJ2NsZWFuJywgYC0ke21vZGV9YCwgLi4uY3VzdG9tQXJnc107XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyKHRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBDbGVhblN1bW1hcnlfMS5jbGVhblN1bW1hcnlQYXJzZXIobW9kZSA9PT0gQ2xlYW5PcHRpb25zLkRSWV9SVU4sIHRleHQpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMuY2xlYW5UYXNrID0gY2xlYW5UYXNrO1xuZnVuY3Rpb24gaXNDbGVhbk9wdGlvbnNBcnJheShpbnB1dCkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSAmJiBpbnB1dC5ldmVyeSh0ZXN0ID0+IENsZWFuT3B0aW9uVmFsdWVzLmhhcyh0ZXN0KSk7XG59XG5leHBvcnRzLmlzQ2xlYW5PcHRpb25zQXJyYXkgPSBpc0NsZWFuT3B0aW9uc0FycmF5O1xuZnVuY3Rpb24gZ2V0Q2xlYW5PcHRpb25zKGlucHV0KSB7XG4gICAgbGV0IGNsZWFuTW9kZTtcbiAgICBsZXQgb3B0aW9ucyA9IFtdO1xuICAgIGxldCB2YWxpZCA9IHsgY2xlYW5Nb2RlOiBmYWxzZSwgb3B0aW9uczogdHJ1ZSB9O1xuICAgIGlucHV0LnJlcGxhY2UoL1teYS16XWkvZywgJycpLnNwbGl0KCcnKS5mb3JFYWNoKGNoYXIgPT4ge1xuICAgICAgICBpZiAoaXNDbGVhbk1vZGUoY2hhcikpIHtcbiAgICAgICAgICAgIGNsZWFuTW9kZSA9IGNoYXI7XG4gICAgICAgICAgICB2YWxpZC5jbGVhbk1vZGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsaWQub3B0aW9ucyA9IHZhbGlkLm9wdGlvbnMgJiYgaXNLbm93bk9wdGlvbihvcHRpb25zW29wdGlvbnMubGVuZ3RoXSA9IChgLSR7Y2hhcn1gKSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjbGVhbk1vZGUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHZhbGlkLFxuICAgIH07XG59XG5mdW5jdGlvbiBpc0NsZWFuTW9kZShjbGVhbk1vZGUpIHtcbiAgICByZXR1cm4gY2xlYW5Nb2RlID09PSBDbGVhbk9wdGlvbnMuRk9SQ0UgfHwgY2xlYW5Nb2RlID09PSBDbGVhbk9wdGlvbnMuRFJZX1JVTjtcbn1cbmZ1bmN0aW9uIGlzS25vd25PcHRpb24ob3B0aW9uKSB7XG4gICAgcmV0dXJuIC9eLVthLXpdJC9pLnRlc3Qob3B0aW9uKSAmJiBDbGVhbk9wdGlvblZhbHVlcy5oYXMob3B0aW9uLmNoYXJBdCgxKSk7XG59XG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlTW9kZShvcHRpb24pIHtcbiAgICBpZiAoL14tW15cXC1dLy50ZXN0KG9wdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi5pbmRleE9mKCdpJykgPiAwO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9uID09PSAnLS1pbnRlcmFjdGl2ZSc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jbGVhbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0UmVzZXRNb2RlID0gZXhwb3J0cy5yZXNldFRhc2sgPSBleHBvcnRzLlJlc2V0TW9kZSA9IHZvaWQgMDtcbmNvbnN0IHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG52YXIgUmVzZXRNb2RlO1xuKGZ1bmN0aW9uIChSZXNldE1vZGUpIHtcbiAgICBSZXNldE1vZGVbXCJNSVhFRFwiXSA9IFwibWl4ZWRcIjtcbiAgICBSZXNldE1vZGVbXCJTT0ZUXCJdID0gXCJzb2Z0XCI7XG4gICAgUmVzZXRNb2RlW1wiSEFSRFwiXSA9IFwiaGFyZFwiO1xuICAgIFJlc2V0TW9kZVtcIk1FUkdFXCJdID0gXCJtZXJnZVwiO1xuICAgIFJlc2V0TW9kZVtcIktFRVBcIl0gPSBcImtlZXBcIjtcbn0pKFJlc2V0TW9kZSA9IGV4cG9ydHMuUmVzZXRNb2RlIHx8IChleHBvcnRzLlJlc2V0TW9kZSA9IHt9KSk7XG5jb25zdCBSZXNldE1vZGVzID0gQXJyYXkuZnJvbShPYmplY3QudmFsdWVzKFJlc2V0TW9kZSkpO1xuZnVuY3Rpb24gcmVzZXRUYXNrKG1vZGUsIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsncmVzZXQnXTtcbiAgICBpZiAoaXNWYWxpZFJlc2V0TW9kZShtb2RlKSkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKGAtLSR7bW9kZX1gKTtcbiAgICB9XG4gICAgY29tbWFuZHMucHVzaCguLi5jdXN0b21BcmdzKTtcbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMpO1xufVxuZXhwb3J0cy5yZXNldFRhc2sgPSByZXNldFRhc2s7XG5mdW5jdGlvbiBnZXRSZXNldE1vZGUobW9kZSkge1xuICAgIGlmIChpc1ZhbGlkUmVzZXRNb2RlKG1vZGUpKSB7XG4gICAgICAgIHJldHVybiBtb2RlO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGVvZiBtb2RlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICByZXR1cm4gUmVzZXRNb2RlLlNPRlQ7XG4gICAgfVxuICAgIHJldHVybjtcbn1cbmV4cG9ydHMuZ2V0UmVzZXRNb2RlID0gZ2V0UmVzZXRNb2RlO1xuZnVuY3Rpb24gaXNWYWxpZFJlc2V0TW9kZShtb2RlKSB7XG4gICAgcmV0dXJuIFJlc2V0TW9kZXMuaW5jbHVkZXMobW9kZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNldC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGdpdF9jb25zdHJ1Y3RfZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2Vycm9ycy9naXQtY29uc3RydWN0LWVycm9yXCIpO1xuY29uc3QgZ2l0X2Vycm9yXzEgPSByZXF1aXJlKFwiLi9lcnJvcnMvZ2l0LWVycm9yXCIpO1xuY29uc3QgZ2l0X3BsdWdpbl9lcnJvcl8xID0gcmVxdWlyZShcIi4vZXJyb3JzL2dpdC1wbHVnaW4tZXJyb3JcIik7XG5jb25zdCBnaXRfcmVzcG9uc2VfZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2Vycm9ycy9naXQtcmVzcG9uc2UtZXJyb3JcIik7XG5jb25zdCB0YXNrX2NvbmZpZ3VyYXRpb25fZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2Vycm9ycy90YXNrLWNvbmZpZ3VyYXRpb24tZXJyb3JcIik7XG5jb25zdCBjaGVja19pc19yZXBvXzEgPSByZXF1aXJlKFwiLi90YXNrcy9jaGVjay1pcy1yZXBvXCIpO1xuY29uc3QgY2xlYW5fMSA9IHJlcXVpcmUoXCIuL3Rhc2tzL2NsZWFuXCIpO1xuY29uc3QgcmVzZXRfMSA9IHJlcXVpcmUoXCIuL3Rhc2tzL3Jlc2V0XCIpO1xuY29uc3QgYXBpID0ge1xuICAgIENoZWNrUmVwb0FjdGlvbnM6IGNoZWNrX2lzX3JlcG9fMS5DaGVja1JlcG9BY3Rpb25zLFxuICAgIENsZWFuT3B0aW9uczogY2xlYW5fMS5DbGVhbk9wdGlvbnMsXG4gICAgR2l0Q29uc3RydWN0RXJyb3I6IGdpdF9jb25zdHJ1Y3RfZXJyb3JfMS5HaXRDb25zdHJ1Y3RFcnJvcixcbiAgICBHaXRFcnJvcjogZ2l0X2Vycm9yXzEuR2l0RXJyb3IsXG4gICAgR2l0UGx1Z2luRXJyb3I6IGdpdF9wbHVnaW5fZXJyb3JfMS5HaXRQbHVnaW5FcnJvcixcbiAgICBHaXRSZXNwb25zZUVycm9yOiBnaXRfcmVzcG9uc2VfZXJyb3JfMS5HaXRSZXNwb25zZUVycm9yLFxuICAgIFJlc2V0TW9kZTogcmVzZXRfMS5SZXNldE1vZGUsXG4gICAgVGFza0NvbmZpZ3VyYXRpb25FcnJvcjogdGFza19jb25maWd1cmF0aW9uX2Vycm9yXzEuVGFza0NvbmZpZ3VyYXRpb25FcnJvcixcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBhcGk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcGkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbW1hbmRDb25maWdQcmVmaXhpbmdQbHVnaW4gPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gY29tbWFuZENvbmZpZ1ByZWZpeGluZ1BsdWdpbihjb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgcHJlZml4ID0gdXRpbHNfMS5wcmVmaXhlZEFycmF5KGNvbmZpZ3VyYXRpb24sICctYycpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdzcGF3bi5hcmdzJyxcbiAgICAgICAgYWN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBbLi4ucHJlZml4LCAuLi5kYXRhXTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0cy5jb21tYW5kQ29uZmlnUHJlZml4aW5nUGx1Z2luID0gY29tbWFuZENvbmZpZ1ByZWZpeGluZ1BsdWdpbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbW1hbmQtY29uZmlnLXByZWZpeGluZy1wbHVnaW4uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmVycm9yRGV0ZWN0aW9uUGx1Z2luID0gZXhwb3J0cy5lcnJvckRldGVjdGlvbkhhbmRsZXIgPSB2b2lkIDA7XG5jb25zdCBnaXRfZXJyb3JfMSA9IHJlcXVpcmUoXCIuLi9lcnJvcnMvZ2l0LWVycm9yXCIpO1xuZnVuY3Rpb24gaXNUYXNrRXJyb3IocmVzdWx0KSB7XG4gICAgcmV0dXJuICEhKHJlc3VsdC5leGl0Q29kZSAmJiByZXN1bHQuc3RkRXJyLmxlbmd0aCk7XG59XG5mdW5jdGlvbiBnZXRFcnJvck1lc3NhZ2UocmVzdWx0KSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoWy4uLnJlc3VsdC5zdGRPdXQsIC4uLnJlc3VsdC5zdGRFcnJdKTtcbn1cbmZ1bmN0aW9uIGVycm9yRGV0ZWN0aW9uSGFuZGxlcihvdmVyd3JpdGUgPSBmYWxzZSwgaXNFcnJvciA9IGlzVGFza0Vycm9yLCBlcnJvck1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2UpIHtcbiAgICByZXR1cm4gKGVycm9yLCByZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKCghb3ZlcndyaXRlICYmIGVycm9yKSB8fCAhaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZShyZXN1bHQpO1xuICAgIH07XG59XG5leHBvcnRzLmVycm9yRGV0ZWN0aW9uSGFuZGxlciA9IGVycm9yRGV0ZWN0aW9uSGFuZGxlcjtcbmZ1bmN0aW9uIGVycm9yRGV0ZWN0aW9uUGx1Z2luKGNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICd0YXNrLmVycm9yJyxcbiAgICAgICAgYWN0aW9uKGRhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gY29uZmlnKGRhdGEuZXJyb3IsIHtcbiAgICAgICAgICAgICAgICBzdGRFcnI6IGNvbnRleHQuc3RkRXJyLFxuICAgICAgICAgICAgICAgIHN0ZE91dDogY29udGV4dC5zdGRPdXQsXG4gICAgICAgICAgICAgICAgZXhpdENvZGU6IGNvbnRleHQuZXhpdENvZGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IGdpdF9lcnJvcl8xLkdpdEVycm9yKHVuZGVmaW5lZCwgZXJyb3IudG9TdHJpbmcoJ3V0Zi04JykpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnRzLmVycm9yRGV0ZWN0aW9uUGx1Z2luID0gZXJyb3JEZXRlY3Rpb25QbHVnaW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvci1kZXRlY3Rpb24ucGx1Z2luLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5QbHVnaW5TdG9yZSA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jbGFzcyBQbHVnaW5TdG9yZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IG5ldyBTZXQoKTtcbiAgICB9XG4gICAgYWRkKHBsdWdpbikge1xuICAgICAgICBjb25zdCBwbHVnaW5zID0gW107XG4gICAgICAgIHV0aWxzXzEuYXNBcnJheShwbHVnaW4pLmZvckVhY2gocGx1Z2luID0+IHBsdWdpbiAmJiB0aGlzLnBsdWdpbnMuYWRkKHV0aWxzXzEuYXBwZW5kKHBsdWdpbnMsIHBsdWdpbikpKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHBsdWdpbnMuZm9yRWFjaChwbHVnaW4gPT4gdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4pKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZXhlYyh0eXBlLCBkYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIGxldCBvdXRwdXQgPSBkYXRhO1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsID0gT2JqZWN0LmZyZWV6ZShPYmplY3QuY3JlYXRlKGNvbnRleHQpKTtcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKSB7XG4gICAgICAgICAgICBpZiAocGx1Z2luLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBwbHVnaW4uYWN0aW9uKG91dHB1dCwgY29udGV4dHVhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59XG5leHBvcnRzLlBsdWdpblN0b3JlID0gUGx1Z2luU3RvcmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wbHVnaW4tc3RvcmUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnByb2dyZXNzTW9uaXRvclBsdWdpbiA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5mdW5jdGlvbiBwcm9ncmVzc01vbml0b3JQbHVnaW4ocHJvZ3Jlc3MpIHtcbiAgICBjb25zdCBwcm9ncmVzc0NvbW1hbmQgPSAnLS1wcm9ncmVzcyc7XG4gICAgY29uc3QgcHJvZ3Jlc3NNZXRob2RzID0gWydjaGVja291dCcsICdjbG9uZScsICdmZXRjaCcsICdwdWxsJywgJ3B1c2gnXTtcbiAgICBjb25zdCBvblByb2dyZXNzID0ge1xuICAgICAgICB0eXBlOiAnc3Bhd24uYWZ0ZXInLFxuICAgICAgICBhY3Rpb24oX2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGlmICghY29udGV4dC5jb21tYW5kcy5pbmNsdWRlcyhwcm9ncmVzc0NvbW1hbmQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKF9hID0gY29udGV4dC5zcGF3bmVkLnN0ZGVycikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IC9eKFthLXpBLVogXSspOlxccyooXFxkKyklIFxcKChcXGQrKVxcLyhcXGQrKVxcKS8uZXhlYyhjaHVuay50b1N0cmluZygndXRmOCcpKTtcbiAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9ncmVzcyh7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogY29udGV4dC5tZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHN0YWdlOiBwcm9ncmVzc0V2ZW50U3RhZ2UobWVzc2FnZVsxXSksXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiB1dGlsc18xLmFzTnVtYmVyKG1lc3NhZ2VbMl0pLFxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQ6IHV0aWxzXzEuYXNOdW1iZXIobWVzc2FnZVszXSksXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsOiB1dGlsc18xLmFzTnVtYmVyKG1lc3NhZ2VbNF0pLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IG9uQXJncyA9IHtcbiAgICAgICAgdHlwZTogJ3NwYXduLmFyZ3MnLFxuICAgICAgICBhY3Rpb24oYXJncywgY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKCFwcm9ncmVzc01ldGhvZHMuaW5jbHVkZXMoY29udGV4dC5tZXRob2QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXRpbHNfMS5pbmNsdWRpbmcoYXJncywgcHJvZ3Jlc3NDb21tYW5kKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFtvbkFyZ3MsIG9uUHJvZ3Jlc3NdO1xufVxuZXhwb3J0cy5wcm9ncmVzc01vbml0b3JQbHVnaW4gPSBwcm9ncmVzc01vbml0b3JQbHVnaW47XG5mdW5jdGlvbiBwcm9ncmVzc0V2ZW50U3RhZ2UoaW5wdXQpIHtcbiAgICByZXR1cm4gU3RyaW5nKGlucHV0LnRvTG93ZXJDYXNlKCkuc3BsaXQoJyAnLCAxKSkgfHwgJ3Vua25vd24nO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvZ3Jlc3MtbW9uaXRvci1wbHVnaW4uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaW1wbGUtZ2l0LXBsdWdpbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudGltZW91dFBsdWdpbiA9IHZvaWQgMDtcbmNvbnN0IGdpdF9wbHVnaW5fZXJyb3JfMSA9IHJlcXVpcmUoXCIuLi9lcnJvcnMvZ2l0LXBsdWdpbi1lcnJvclwiKTtcbmZ1bmN0aW9uIHRpbWVvdXRQbHVnaW4oeyBibG9jayB9KSB7XG4gICAgaWYgKGJsb2NrID4gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ3NwYXduLmFmdGVyJyxcbiAgICAgICAgICAgIGFjdGlvbihfZGF0YSwgY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICAgICAgbGV0IHRpbWVvdXQ7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gd2FpdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dCAmJiBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGtpbGwsIGJsb2NrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICAgICAgKF9hID0gY29udGV4dC5zcGF3bmVkLnN0ZG91dCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9mZignZGF0YScsIHdhaXQpO1xuICAgICAgICAgICAgICAgICAgICAoX2IgPSBjb250ZXh0LnNwYXduZWQuc3RkZXJyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iub2ZmKCdkYXRhJywgd2FpdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3Bhd25lZC5vZmYoJ2V4aXQnLCBzdG9wKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zcGF3bmVkLm9mZignY2xvc2UnLCBzdG9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24ga2lsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmtpbGwobmV3IGdpdF9wbHVnaW5fZXJyb3JfMS5HaXRQbHVnaW5FcnJvcih1bmRlZmluZWQsICd0aW1lb3V0JywgYGJsb2NrIHRpbWVvdXQgcmVhY2hlZGApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKF9hID0gY29udGV4dC5zcGF3bmVkLnN0ZG91dCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uKCdkYXRhJywgd2FpdCk7XG4gICAgICAgICAgICAgICAgKF9iID0gY29udGV4dC5zcGF3bmVkLnN0ZGVycikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm9uKCdkYXRhJywgd2FpdCk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zcGF3bmVkLm9uKCdleGl0Jywgc3RvcCk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zcGF3bmVkLm9uKCdjbG9zZScsIHN0b3ApO1xuICAgICAgICAgICAgICAgIHdhaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnRzLnRpbWVvdXRQbHVnaW4gPSB0aW1lb3V0UGx1Z2luO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltb3V0LXBsdWdpbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbW1hbmQtY29uZmlnLXByZWZpeGluZy1wbHVnaW5cIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2Vycm9yLWRldGVjdGlvbi5wbHVnaW5cIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3BsdWdpbi1zdG9yZVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vcHJvZ3Jlc3MtbW9uaXRvci1wbHVnaW5cIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3NpbXBsZS1naXQtcGx1Z2luXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi90aW1vdXQtcGx1Z2luXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HaXRMb2dnZXIgPSBleHBvcnRzLmNyZWF0ZUxvZ2dlciA9IHZvaWQgMDtcbmNvbnN0IGRlYnVnXzEgPSByZXF1aXJlKFwiZGVidWdcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5kZWJ1Z18xLmRlZmF1bHQuZm9ybWF0dGVycy5MID0gKHZhbHVlKSA9PiBTdHJpbmcodXRpbHNfMS5maWx0ZXJIYXNMZW5ndGgodmFsdWUpID8gdmFsdWUubGVuZ3RoIDogJy0nKTtcbmRlYnVnXzEuZGVmYXVsdC5mb3JtYXR0ZXJzLkIgPSAodmFsdWUpID0+IHtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICB9XG4gICAgcmV0dXJuIHV0aWxzXzEub2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZUxvZygpIHtcbiAgICByZXR1cm4gZGVidWdfMS5kZWZhdWx0KCdzaW1wbGUtZ2l0Jyk7XG59XG5mdW5jdGlvbiBwcmVmaXhlZExvZ2dlcih0bywgcHJlZml4LCBmb3J3YXJkKSB7XG4gICAgaWYgKCFwcmVmaXggfHwgIVN0cmluZyhwcmVmaXgpLnJlcGxhY2UoL1xccyovLCAnJykpIHtcbiAgICAgICAgcmV0dXJuICFmb3J3YXJkID8gdG8gOiAobWVzc2FnZSwgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgdG8obWVzc2FnZSwgLi4uYXJncyk7XG4gICAgICAgICAgICBmb3J3YXJkKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gKG1lc3NhZ2UsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgdG8oYCVzICR7bWVzc2FnZX1gLCBwcmVmaXgsIC4uLmFyZ3MpO1xuICAgICAgICBpZiAoZm9yd2FyZCkge1xuICAgICAgICAgICAgZm9yd2FyZChtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjaGlsZExvZ2dlck5hbWUobmFtZSwgY2hpbGREZWJ1Z2dlciwgeyBuYW1lc3BhY2U6IHBhcmVudE5hbWVzcGFjZSB9KSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGROYW1lc3BhY2UgPSBjaGlsZERlYnVnZ2VyICYmIGNoaWxkRGVidWdnZXIubmFtZXNwYWNlIHx8ICcnO1xuICAgIGlmIChjaGlsZE5hbWVzcGFjZS5zdGFydHNXaXRoKHBhcmVudE5hbWVzcGFjZSkpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkTmFtZXNwYWNlLnN1YnN0cihwYXJlbnROYW1lc3BhY2UubGVuZ3RoICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBjaGlsZE5hbWVzcGFjZSB8fCBwYXJlbnROYW1lc3BhY2U7XG59XG5mdW5jdGlvbiBjcmVhdGVMb2dnZXIobGFiZWwsIHZlcmJvc2UsIGluaXRpYWxTdGVwLCBpbmZvRGVidWdnZXIgPSBjcmVhdGVMb2coKSkge1xuICAgIGNvbnN0IGxhYmVsUHJlZml4ID0gbGFiZWwgJiYgYFske2xhYmVsfV1gIHx8ICcnO1xuICAgIGNvbnN0IHNwYXduZWQgPSBbXTtcbiAgICBjb25zdCBkZWJ1Z0RlYnVnZ2VyID0gKHR5cGVvZiB2ZXJib3NlID09PSAnc3RyaW5nJykgPyBpbmZvRGVidWdnZXIuZXh0ZW5kKHZlcmJvc2UpIDogdmVyYm9zZTtcbiAgICBjb25zdCBrZXkgPSBjaGlsZExvZ2dlck5hbWUodXRpbHNfMS5maWx0ZXJUeXBlKHZlcmJvc2UsIHV0aWxzXzEuZmlsdGVyU3RyaW5nKSwgZGVidWdEZWJ1Z2dlciwgaW5mb0RlYnVnZ2VyKTtcbiAgICByZXR1cm4gc3RlcChpbml0aWFsU3RlcCk7XG4gICAgZnVuY3Rpb24gc2libGluZyhuYW1lLCBpbml0aWFsKSB7XG4gICAgICAgIHJldHVybiB1dGlsc18xLmFwcGVuZChzcGF3bmVkLCBjcmVhdGVMb2dnZXIobGFiZWwsIGtleS5yZXBsYWNlKC9eW146XSsvLCBuYW1lKSwgaW5pdGlhbCwgaW5mb0RlYnVnZ2VyKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0ZXAocGhhc2UpIHtcbiAgICAgICAgY29uc3Qgc3RlcFByZWZpeCA9IHBoYXNlICYmIGBbJHtwaGFzZX1dYCB8fCAnJztcbiAgICAgICAgY29uc3QgZGVidWcgPSBkZWJ1Z0RlYnVnZ2VyICYmIHByZWZpeGVkTG9nZ2VyKGRlYnVnRGVidWdnZXIsIHN0ZXBQcmVmaXgpIHx8IHV0aWxzXzEuTk9PUDtcbiAgICAgICAgY29uc3QgaW5mbyA9IHByZWZpeGVkTG9nZ2VyKGluZm9EZWJ1Z2dlciwgYCR7bGFiZWxQcmVmaXh9ICR7c3RlcFByZWZpeH1gLCBkZWJ1Zyk7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGRlYnVnRGVidWdnZXIgPyBkZWJ1ZyA6IGluZm8sIHtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgc2libGluZyxcbiAgICAgICAgICAgIGluZm8sXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLmNyZWF0ZUxvZ2dlciA9IGNyZWF0ZUxvZ2dlcjtcbi8qKlxuICogVGhlIGBHaXRMb2dnZXJgIGlzIHVzZWQgYnkgdGhlIG1haW4gYFNpbXBsZUdpdGAgcnVubmVyIHRvIGhhbmRsZSBsb2dnaW5nXG4gKiBhbnkgd2FybmluZ3Mgb3IgZXJyb3JzLlxuICovXG5jbGFzcyBHaXRMb2dnZXIge1xuICAgIGNvbnN0cnVjdG9yKF9vdXQgPSBjcmVhdGVMb2coKSkge1xuICAgICAgICB0aGlzLl9vdXQgPSBfb3V0O1xuICAgICAgICB0aGlzLmVycm9yID0gcHJlZml4ZWRMb2dnZXIoX291dCwgJ1tFUlJPUl0nKTtcbiAgICAgICAgdGhpcy53YXJuID0gcHJlZml4ZWRMb2dnZXIoX291dCwgJ1tXQVJOXScpO1xuICAgIH1cbiAgICBzaWxlbnQoc2lsZW5jZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChzaWxlbmNlICE9PSB0aGlzLl9vdXQuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbmFtZXNwYWNlIH0gPSB0aGlzLl9vdXQ7XG4gICAgICAgIGNvbnN0IGVudiA9IChwcm9jZXNzLmVudi5ERUJVRyB8fCAnJykuc3BsaXQoJywnKS5maWx0ZXIocyA9PiAhIXMpO1xuICAgICAgICBjb25zdCBoYXNPbiA9IGVudi5pbmNsdWRlcyhuYW1lc3BhY2UpO1xuICAgICAgICBjb25zdCBoYXNPZmYgPSBlbnYuaW5jbHVkZXMoYC0ke25hbWVzcGFjZX1gKTtcbiAgICAgICAgLy8gZW5hYmxpbmcgdGhlIGxvZ1xuICAgICAgICBpZiAoIXNpbGVuY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPZmYpIHtcbiAgICAgICAgICAgICAgICB1dGlsc18xLnJlbW92ZShlbnYsIGAtJHtuYW1lc3BhY2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbnYucHVzaChuYW1lc3BhY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhhc09uKSB7XG4gICAgICAgICAgICAgICAgdXRpbHNfMS5yZW1vdmUoZW52LCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZW52LnB1c2goYC0ke25hbWVzcGFjZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z18xLmRlZmF1bHQuZW5hYmxlKGVudi5qb2luKCcsJykpO1xuICAgIH1cbn1cbmV4cG9ydHMuR2l0TG9nZ2VyID0gR2l0TG9nZ2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0LWxvZ2dlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVGFza3NQZW5kaW5nUXVldWUgPSB2b2lkIDA7XG5jb25zdCBnaXRfZXJyb3JfMSA9IHJlcXVpcmUoXCIuLi9lcnJvcnMvZ2l0LWVycm9yXCIpO1xuY29uc3QgZ2l0X2xvZ2dlcl8xID0gcmVxdWlyZShcIi4uL2dpdC1sb2dnZXJcIik7XG5jbGFzcyBUYXNrc1BlbmRpbmdRdWV1ZSB7XG4gICAgY29uc3RydWN0b3IobG9nTGFiZWwgPSAnR2l0RXhlY3V0b3InKSB7XG4gICAgICAgIHRoaXMubG9nTGFiZWwgPSBsb2dMYWJlbDtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIHdpdGhQcm9ncmVzcyh0YXNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWV1ZS5nZXQodGFzayk7XG4gICAgfVxuICAgIGNyZWF0ZVByb2dyZXNzKHRhc2spIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IFRhc2tzUGVuZGluZ1F1ZXVlLmdldE5hbWUodGFzay5jb21tYW5kc1swXSk7XG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGdpdF9sb2dnZXJfMS5jcmVhdGVMb2dnZXIodGhpcy5sb2dMYWJlbCwgbmFtZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YXNrLFxuICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVzaCh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzcyh0YXNrKTtcbiAgICAgICAgcHJvZ3Jlc3MubG9nZ2VyKCdBZGRpbmcgdGFzayB0byB0aGUgcXVldWUsIGNvbW1hbmRzID0gJW8nLCB0YXNrLmNvbW1hbmRzKTtcbiAgICAgICAgdGhpcy5fcXVldWUuc2V0KHRhc2ssIHByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzO1xuICAgIH1cbiAgICBmYXRhbChlcnIpIHtcbiAgICAgICAgZm9yIChjb25zdCBbdGFzaywgeyBsb2dnZXIgfV0gb2YgQXJyYXkuZnJvbSh0aGlzLl9xdWV1ZS5lbnRyaWVzKCkpKSB7XG4gICAgICAgICAgICBpZiAodGFzayA9PT0gZXJyLnRhc2spIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgRmFpbGVkICVvYCwgZXJyKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIoYEZhdGFsIGV4Y2VwdGlvbiwgYW55IGFzLXlldCB1bi1zdGFydGVkIHRhc2tzIHJ1biB0aHJvdWdoIHRoaXMgZXhlY3V0b3Igd2lsbCBub3QgYmUgYXR0ZW1wdGVkYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgQSBmYXRhbCBleGNlcHRpb24gb2NjdXJyZWQgaW4gYSBwcmV2aW91cyB0YXNrLCB0aGUgcXVldWUgaGFzIGJlZW4gcHVyZ2VkOiAlb2AsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29tcGxldGUodGFzayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3F1ZXVlLnNpemUgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVldWUgc2l6ZSBzaG91bGQgYmUgemVybyBhZnRlciBmYXRhbDogJHt0aGlzLl9xdWV1ZS5zaXplfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBsZXRlKHRhc2spIHtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aGlzLndpdGhQcm9ncmVzcyh0YXNrKTtcbiAgICAgICAgaWYgKHByb2dyZXNzKSB7XG4gICAgICAgICAgICB0aGlzLl9xdWV1ZS5kZWxldGUodGFzayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXR0ZW1wdCh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy53aXRoUHJvZ3Jlc3ModGFzayk7XG4gICAgICAgIGlmICghcHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBnaXRfZXJyb3JfMS5HaXRFcnJvcih1bmRlZmluZWQsICdUYXNrc1BlbmRpbmdRdWV1ZTogYXR0ZW1wdCBjYWxsZWQgZm9yIGFuIHVua25vd24gdGFzaycpO1xuICAgICAgICB9XG4gICAgICAgIHByb2dyZXNzLmxvZ2dlcignU3RhcnRpbmcgdGFzaycpO1xuICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gICAgfVxuICAgIHN0YXRpYyBnZXROYW1lKG5hbWUgPSAnZW1wdHknKSB7XG4gICAgICAgIHJldHVybiBgdGFzazoke25hbWV9OiR7KytUYXNrc1BlbmRpbmdRdWV1ZS5jb3VudGVyfWA7XG4gICAgfVxufVxuZXhwb3J0cy5UYXNrc1BlbmRpbmdRdWV1ZSA9IFRhc2tzUGVuZGluZ1F1ZXVlO1xuVGFza3NQZW5kaW5nUXVldWUuY291bnRlciA9IDA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXNrcy1wZW5kaW5nLXF1ZXVlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkdpdEV4ZWN1dG9yQ2hhaW4gPSB2b2lkIDA7XG5jb25zdCBjaGlsZF9wcm9jZXNzXzEgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTtcbmNvbnN0IGdpdF9lcnJvcl8xID0gcmVxdWlyZShcIi4uL2Vycm9ycy9naXQtZXJyb3JcIik7XG5jb25zdCB0YXNrXzEgPSByZXF1aXJlKFwiLi4vdGFza3MvdGFza1wiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCB0YXNrc19wZW5kaW5nX3F1ZXVlXzEgPSByZXF1aXJlKFwiLi90YXNrcy1wZW5kaW5nLXF1ZXVlXCIpO1xuY2xhc3MgR2l0RXhlY3V0b3JDaGFpbiB7XG4gICAgY29uc3RydWN0b3IoX2V4ZWN1dG9yLCBfc2NoZWR1bGVyLCBfcGx1Z2lucykge1xuICAgICAgICB0aGlzLl9leGVjdXRvciA9IF9leGVjdXRvcjtcbiAgICAgICAgdGhpcy5fc2NoZWR1bGVyID0gX3NjaGVkdWxlcjtcbiAgICAgICAgdGhpcy5fcGx1Z2lucyA9IF9wbHVnaW5zO1xuICAgICAgICB0aGlzLl9jaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IG5ldyB0YXNrc19wZW5kaW5nX3F1ZXVlXzEuVGFza3NQZW5kaW5nUXVldWUoKTtcbiAgICB9XG4gICAgZ2V0IGJpbmFyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dG9yLmJpbmFyeTtcbiAgICB9XG4gICAgZ2V0IGN3ZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dG9yLmN3ZDtcbiAgICB9XG4gICAgZ2V0IGVudigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dG9yLmVudjtcbiAgICB9XG4gICAgZ2V0IG91dHB1dEhhbmRsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGVjdXRvci5vdXRwdXRIYW5kbGVyO1xuICAgIH1cbiAgICBjaGFpbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHB1c2godGFzaykge1xuICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKHRhc2spO1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hhaW4gPSB0aGlzLl9jaGFpbi50aGVuKCgpID0+IHRoaXMuYXR0ZW1wdFRhc2sodGFzaykpO1xuICAgIH1cbiAgICBhdHRlbXB0VGFzayh0YXNrKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBvblNjaGVkdWxlQ29tcGxldGUgPSB5aWVsZCB0aGlzLl9zY2hlZHVsZXIubmV4dCgpO1xuICAgICAgICAgICAgY29uc3Qgb25RdWV1ZUNvbXBsZXRlID0gKCkgPT4gdGhpcy5fcXVldWUuY29tcGxldGUodGFzayk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSB0aGlzLl9xdWV1ZS5hdHRlbXB0KHRhc2spO1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCAodGFza18xLmlzRW1wdHlUYXNrKHRhc2spXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5hdHRlbXB0RW1wdHlUYXNrKHRhc2ssIGxvZ2dlcilcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmF0dGVtcHRSZW1vdGVUYXNrKHRhc2ssIGxvZ2dlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLm9uRmF0YWxFeGNlcHRpb24odGFzaywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBvblF1ZXVlQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICBvblNjaGVkdWxlQ29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uRmF0YWxFeGNlcHRpb24odGFzaywgZSkge1xuICAgICAgICBjb25zdCBnaXRFcnJvciA9IChlIGluc3RhbmNlb2YgZ2l0X2Vycm9yXzEuR2l0RXJyb3IpID8gT2JqZWN0LmFzc2lnbihlLCB7IHRhc2sgfSkgOiBuZXcgZ2l0X2Vycm9yXzEuR2l0RXJyb3IodGFzaywgZSAmJiBTdHJpbmcoZSkpO1xuICAgICAgICB0aGlzLl9jaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLl9xdWV1ZS5mYXRhbChnaXRFcnJvcik7XG4gICAgICAgIHJldHVybiBnaXRFcnJvcjtcbiAgICB9XG4gICAgYXR0ZW1wdFJlbW90ZVRhc2sodGFzaywgbG9nZ2VyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5fcGx1Z2lucy5leGVjKCdzcGF3bi5hcmdzJywgWy4uLnRhc2suY29tbWFuZHNdLCBwbHVnaW5Db250ZXh0KHRhc2ssIHRhc2suY29tbWFuZHMpKTtcbiAgICAgICAgICAgIGNvbnN0IHJhdyA9IHlpZWxkIHRoaXMuZ2l0UmVzcG9uc2UodGFzaywgdGhpcy5iaW5hcnksIGFyZ3MsIHRoaXMub3V0cHV0SGFuZGxlciwgbG9nZ2VyLnN0ZXAoJ1NQQVdOJykpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U3RyZWFtcyA9IHlpZWxkIHRoaXMuaGFuZGxlVGFza0RhdGEodGFzaywgYXJncywgcmF3LCBsb2dnZXIuc3RlcCgnSEFORExFJykpO1xuICAgICAgICAgICAgbG9nZ2VyKGBwYXNzaW5nIHJlc3BvbnNlIHRvIHRhc2sncyBwYXJzZXIgYXMgYSAlc2AsIHRhc2suZm9ybWF0KTtcbiAgICAgICAgICAgIGlmICh0YXNrXzEuaXNCdWZmZXJUYXNrKHRhc2spKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzXzEuY2FsbFRhc2tQYXJzZXIodGFzay5wYXJzZXIsIG91dHB1dFN0cmVhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHV0aWxzXzEuY2FsbFRhc2tQYXJzZXIodGFzay5wYXJzZXIsIG91dHB1dFN0cmVhbXMuYXNTdHJpbmdzKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXR0ZW1wdEVtcHR5VGFzayh0YXNrLCBsb2dnZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxvZ2dlcihgZW1wdHkgdGFzayBieXBhc3NpbmcgY2hpbGQgcHJvY2VzcyB0byBjYWxsIHRvIHRhc2sncyBwYXJzZXJgKTtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLnBhcnNlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlVGFza0RhdGEodGFzaywgYXJncywgcmVzdWx0LCBsb2dnZXIpIHtcbiAgICAgICAgY29uc3QgeyBleGl0Q29kZSwgcmVqZWN0aW9uLCBzdGRPdXQsIHN0ZEVyciB9ID0gcmVzdWx0O1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGRvbmUsIGZhaWwpID0+IHtcbiAgICAgICAgICAgIGxvZ2dlcihgUHJlcGFyaW5nIHRvIGhhbmRsZSBwcm9jZXNzIHJlc3BvbnNlIGV4aXRDb2RlPSVkIHN0ZE91dD1gLCBleGl0Q29kZSk7XG4gICAgICAgICAgICBjb25zdCB7IGVycm9yIH0gPSB0aGlzLl9wbHVnaW5zLmV4ZWMoJ3Rhc2suZXJyb3InLCB7IGVycm9yOiByZWplY3Rpb24gfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwbHVnaW5Db250ZXh0KHRhc2ssIGFyZ3MpKSwgcmVzdWx0KSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgdGFzay5vbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYGV4aXRDb2RlPSVzIGhhbmRsaW5nIHdpdGggY3VzdG9tIGVycm9yIGhhbmRsZXJgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5vbkVycm9yKHJlc3VsdCwgZXJyb3IsIChuZXdTdGRPdXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYGN1c3RvbSBlcnJvciBoYW5kbGVyIHRyZWF0ZWQgYXMgc3VjY2Vzc2ApO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIoYGN1c3RvbSBlcnJvciByZXR1cm5lZCBhICVzYCwgdXRpbHNfMS5vYmplY3RUb1N0cmluZyhuZXdTdGRPdXQpKTtcbiAgICAgICAgICAgICAgICAgICAgZG9uZShuZXcgdXRpbHNfMS5HaXRPdXRwdXRTdHJlYW1zKEFycmF5LmlzQXJyYXkobmV3U3RkT3V0KSA/IEJ1ZmZlci5jb25jYXQobmV3U3RkT3V0KSA6IG5ld1N0ZE91dCwgQnVmZmVyLmNvbmNhdChzdGRFcnIpKSk7XG4gICAgICAgICAgICAgICAgfSwgZmFpbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgaGFuZGxpbmcgYXMgZXJyb3I6IGV4aXRDb2RlPSVzIHN0ZEVycj0lcyByZWplY3Rpb249JW9gLCBleGl0Q29kZSwgc3RkRXJyLmxlbmd0aCwgcmVqZWN0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgcmV0cmlldmluZyB0YXNrIG91dHB1dCBjb21wbGV0ZWApO1xuICAgICAgICAgICAgZG9uZShuZXcgdXRpbHNfMS5HaXRPdXRwdXRTdHJlYW1zKEJ1ZmZlci5jb25jYXQoc3RkT3V0KSwgQnVmZmVyLmNvbmNhdChzdGRFcnIpKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnaXRSZXNwb25zZSh0YXNrLCBjb21tYW5kLCBhcmdzLCBvdXRwdXRIYW5kbGVyLCBsb2dnZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dExvZ2dlciA9IGxvZ2dlci5zaWJsaW5nKCdvdXRwdXQnKTtcbiAgICAgICAgICAgIGNvbnN0IHNwYXduT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgICAgICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgICAgICAgICAgd2luZG93c0hpZGU6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChkb25lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RkT3V0ID0gW107XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RkRXJyID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGF0dGVtcHRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCByZWplY3Rpb247XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gYXR0ZW1wdENsb3NlKGV4aXRDb2RlLCBldmVudCA9ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2luZyB3aGVuIHRoZXJlIGlzIGNvbnRlbnQsIHRlcm1pbmF0ZSBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdGVkIHx8IHN0ZEVyci5sZW5ndGggfHwgc3RkT3V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYGV4aXRDb2RlPSVzIGV2ZW50PSVzIHJlamVjdGlvbj0lb2AsIGV4aXRDb2RlLCBldmVudCwgcmVqZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZE91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRFcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdENvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgYXQgY2xvc2luZyBidXQgbm8gY29udGVudCB5ZXQsIHdhaXQgYnJpZWZseSBmb3IgdGhlIGNsb3NlL2V4aXQgdGhhdCBtYXkgZm9sbG93XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXR0ZW1wdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBhdHRlbXB0Q2xvc2UoZXhpdENvZGUsICdkZWZlcnJlZCcpLCA1MCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIoJ3JlY2VpdmVkICVzIGV2ZW50IGJlZm9yZSBjb250ZW50IG9uIHN0ZE91dC9zdGRFcnInLCBldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCVzICVvYCwgY29tbWFuZCwgYXJncyk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyKCclTycsIHNwYXduT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3Bhd25lZCA9IGNoaWxkX3Byb2Nlc3NfMS5zcGF3bihjb21tYW5kLCBhcmdzLCBzcGF3bk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHNwYXduZWQuc3Rkb3V0Lm9uKCdkYXRhJywgb25EYXRhUmVjZWl2ZWQoc3RkT3V0LCAnc3RkT3V0JywgbG9nZ2VyLCBvdXRwdXRMb2dnZXIuc3RlcCgnc3RkT3V0JykpKTtcbiAgICAgICAgICAgICAgICBzcGF3bmVkLnN0ZGVyci5vbignZGF0YScsIG9uRGF0YVJlY2VpdmVkKHN0ZEVyciwgJ3N0ZEVycicsIGxvZ2dlciwgb3V0cHV0TG9nZ2VyLnN0ZXAoJ3N0ZEVycicpKSk7XG4gICAgICAgICAgICAgICAgc3Bhd25lZC5vbignZXJyb3InLCBvbkVycm9yUmVjZWl2ZWQoc3RkRXJyLCBsb2dnZXIpKTtcbiAgICAgICAgICAgICAgICBzcGF3bmVkLm9uKCdjbG9zZScsIChjb2RlKSA9PiBhdHRlbXB0Q2xvc2UoY29kZSwgJ2Nsb3NlJykpO1xuICAgICAgICAgICAgICAgIHNwYXduZWQub24oJ2V4aXQnLCAoY29kZSkgPT4gYXR0ZW1wdENsb3NlKGNvZGUsICdleGl0JykpO1xuICAgICAgICAgICAgICAgIGlmIChvdXRwdXRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlcihgUGFzc2luZyBjaGlsZCBwcm9jZXNzIHN0ZE91dC9zdGRFcnIgdG8gY3VzdG9tIG91dHB1dEhhbmRsZXJgKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlcihjb21tYW5kLCBzcGF3bmVkLnN0ZG91dCwgc3Bhd25lZC5zdGRlcnIsIFsuLi5hcmdzXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3BsdWdpbnMuZXhlYygnc3Bhd24uYWZ0ZXInLCB1bmRlZmluZWQsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGx1Z2luQ29udGV4dCh0YXNrLCBhcmdzKSksIHsgc3Bhd25lZCwga2lsbChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGF3bmVkLmtpbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGlvbiA9IHJlYXNvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYXduZWQua2lsbCgnU0lHSU5UJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gfSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuR2l0RXhlY3V0b3JDaGFpbiA9IEdpdEV4ZWN1dG9yQ2hhaW47XG5mdW5jdGlvbiBwbHVnaW5Db250ZXh0KHRhc2ssIGNvbW1hbmRzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWV0aG9kOiB1dGlsc18xLmZpcnN0KHRhc2suY29tbWFuZHMpIHx8ICcnLFxuICAgICAgICBjb21tYW5kcyxcbiAgICB9O1xufVxuZnVuY3Rpb24gb25FcnJvclJlY2VpdmVkKHRhcmdldCwgbG9nZ2VyKSB7XG4gICAgcmV0dXJuIChlcnIpID0+IHtcbiAgICAgICAgbG9nZ2VyKGBbRVJST1JdIGNoaWxkIHByb2Nlc3MgZXhjZXB0aW9uICVvYCwgZXJyKTtcbiAgICAgICAgdGFyZ2V0LnB1c2goQnVmZmVyLmZyb20oU3RyaW5nKGVyci5zdGFjayksICdhc2NpaScpKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gb25EYXRhUmVjZWl2ZWQodGFyZ2V0LCBuYW1lLCBsb2dnZXIsIG91dHB1dCkge1xuICAgIHJldHVybiAoYnVmZmVyKSA9PiB7XG4gICAgICAgIGxvZ2dlcihgJXMgcmVjZWl2ZWQgJUwgYnl0ZXNgLCBuYW1lLCBidWZmZXIpO1xuICAgICAgICBvdXRwdXQoYCVCYCwgYnVmZmVyKTtcbiAgICAgICAgdGFyZ2V0LnB1c2goYnVmZmVyKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0LWV4ZWN1dG9yLWNoYWluLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HaXRFeGVjdXRvciA9IHZvaWQgMDtcbmNvbnN0IGdpdF9leGVjdXRvcl9jaGFpbl8xID0gcmVxdWlyZShcIi4vZ2l0LWV4ZWN1dG9yLWNoYWluXCIpO1xuY2xhc3MgR2l0RXhlY3V0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGJpbmFyeSA9ICdnaXQnLCBjd2QsIF9zY2hlZHVsZXIsIF9wbHVnaW5zKSB7XG4gICAgICAgIHRoaXMuYmluYXJ5ID0gYmluYXJ5O1xuICAgICAgICB0aGlzLmN3ZCA9IGN3ZDtcbiAgICAgICAgdGhpcy5fc2NoZWR1bGVyID0gX3NjaGVkdWxlcjtcbiAgICAgICAgdGhpcy5fcGx1Z2lucyA9IF9wbHVnaW5zO1xuICAgICAgICB0aGlzLl9jaGFpbiA9IG5ldyBnaXRfZXhlY3V0b3JfY2hhaW5fMS5HaXRFeGVjdXRvckNoYWluKHRoaXMsIHRoaXMuX3NjaGVkdWxlciwgdGhpcy5fcGx1Z2lucyk7XG4gICAgfVxuICAgIGNoYWluKCkge1xuICAgICAgICByZXR1cm4gbmV3IGdpdF9leGVjdXRvcl9jaGFpbl8xLkdpdEV4ZWN1dG9yQ2hhaW4odGhpcywgdGhpcy5fc2NoZWR1bGVyLCB0aGlzLl9wbHVnaW5zKTtcbiAgICB9XG4gICAgcHVzaCh0YXNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFpbi5wdXNoKHRhc2spO1xuICAgIH1cbn1cbmV4cG9ydHMuR2l0RXhlY3V0b3IgPSBHaXRFeGVjdXRvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdpdC1leGVjdXRvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudGFza0NhbGxiYWNrID0gdm9pZCAwO1xuY29uc3QgZ2l0X3Jlc3BvbnNlX2Vycm9yXzEgPSByZXF1aXJlKFwiLi9lcnJvcnMvZ2l0LXJlc3BvbnNlLWVycm9yXCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuZnVuY3Rpb24gdGFza0NhbGxiYWNrKHRhc2ssIHJlc3BvbnNlLCBjYWxsYmFjayA9IHV0aWxzXzEuTk9PUCkge1xuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgIH07XG4gICAgY29uc3Qgb25FcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgaWYgKChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIudGFzaykgPT09IHRhc2spIHtcbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBnaXRfcmVzcG9uc2VfZXJyb3JfMS5HaXRSZXNwb25zZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGFkZERlcHJlY2F0aW9uTm90aWNlVG9FcnJvcihlcnIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJlc3BvbnNlLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKTtcbn1cbmV4cG9ydHMudGFza0NhbGxiYWNrID0gdGFza0NhbGxiYWNrO1xuZnVuY3Rpb24gYWRkRGVwcmVjYXRpb25Ob3RpY2VUb0Vycm9yKGVycikge1xuICAgIGxldCBsb2cgPSAobmFtZSkgPT4ge1xuICAgICAgICBjb25zb2xlLndhcm4oYHNpbXBsZS1naXQgZGVwcmVjYXRpb24gbm90aWNlOiBhY2Nlc3NpbmcgR2l0UmVzcG9uc2VFcnJvci4ke25hbWV9IHNob3VsZCBiZSBHaXRSZXNwb25zZUVycm9yLmdpdC4ke25hbWV9LCB0aGlzIHdpbGwgbm8gbG9uZ2VyIGJlIGF2YWlsYWJsZSBpbiB2ZXJzaW9uIDNgKTtcbiAgICAgICAgbG9nID0gdXRpbHNfMS5OT09QO1xuICAgIH07XG4gICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZXJyLCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnIuZ2l0KS5yZWR1Y2UoZGVzY3JpcHRvclJlZHVjZXIsIHt9KSk7XG4gICAgZnVuY3Rpb24gZGVzY3JpcHRvclJlZHVjZXIoYWxsLCBuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lIGluIGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGFsbDtcbiAgICAgICAgfVxuICAgICAgICBhbGxbbmFtZV0gPSB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgbG9nKG5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnIuZ2l0W25hbWVdO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGFsbDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXNrLWNhbGxiYWNrLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZW1vdGVNZXNzYWdlc09iamVjdFBhcnNlcnMgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gb2JqZWN0RW51bWVyYXRpb25SZXN1bHQocmVtb3RlTWVzc2FnZXMpIHtcbiAgICByZXR1cm4gKHJlbW90ZU1lc3NhZ2VzLm9iamVjdHMgPSByZW1vdGVNZXNzYWdlcy5vYmplY3RzIHx8IHtcbiAgICAgICAgY29tcHJlc3Npbmc6IDAsXG4gICAgICAgIGNvdW50aW5nOiAwLFxuICAgICAgICBlbnVtZXJhdGluZzogMCxcbiAgICAgICAgcGFja1JldXNlZDogMCxcbiAgICAgICAgcmV1c2VkOiB7IGNvdW50OiAwLCBkZWx0YTogMCB9LFxuICAgICAgICB0b3RhbDogeyBjb3VudDogMCwgZGVsdGE6IDAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gYXNPYmplY3RDb3VudChzb3VyY2UpIHtcbiAgICBjb25zdCBjb3VudCA9IC9eXFxzKihcXGQrKS8uZXhlYyhzb3VyY2UpO1xuICAgIGNvbnN0IGRlbHRhID0gL2RlbHRhIChcXGQrKS9pLmV4ZWMoc291cmNlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb3VudDogdXRpbHNfMS5hc051bWJlcihjb3VudCAmJiBjb3VudFsxXSB8fCAnMCcpLFxuICAgICAgICBkZWx0YTogdXRpbHNfMS5hc051bWJlcihkZWx0YSAmJiBkZWx0YVsxXSB8fCAnMCcpLFxuICAgIH07XG59XG5leHBvcnRzLnJlbW90ZU1lc3NhZ2VzT2JqZWN0UGFyc2VycyA9IFtcbiAgICBuZXcgdXRpbHNfMS5SZW1vdGVMaW5lUGFyc2VyKC9ecmVtb3RlOlxccyooZW51bWVyYXRpbmd8Y291bnRpbmd8Y29tcHJlc3NpbmcpIG9iamVjdHM6IChcXGQrKSwvaSwgKHJlc3VsdCwgW2FjdGlvbiwgY291bnRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGFjdGlvbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBlbnVtZXJhdGlvbiA9IG9iamVjdEVudW1lcmF0aW9uUmVzdWx0KHJlc3VsdC5yZW1vdGVNZXNzYWdlcyk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZW51bWVyYXRpb24sIHsgW2tleV06IHV0aWxzXzEuYXNOdW1iZXIoY291bnQpIH0pO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLlJlbW90ZUxpbmVQYXJzZXIoL15yZW1vdGU6XFxzKihlbnVtZXJhdGluZ3xjb3VudGluZ3xjb21wcmVzc2luZykgb2JqZWN0czogXFxkKyUgXFwoXFxkK1xcLyhcXGQrKVxcKSwvaSwgKHJlc3VsdCwgW2FjdGlvbiwgY291bnRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGFjdGlvbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBlbnVtZXJhdGlvbiA9IG9iamVjdEVudW1lcmF0aW9uUmVzdWx0KHJlc3VsdC5yZW1vdGVNZXNzYWdlcyk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZW51bWVyYXRpb24sIHsgW2tleV06IHV0aWxzXzEuYXNOdW1iZXIoY291bnQpIH0pO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLlJlbW90ZUxpbmVQYXJzZXIoL3RvdGFsIChbXixdKyksIHJldXNlZCAoW14sXSspLCBwYWNrLXJldXNlZCAoXFxkKykvaSwgKHJlc3VsdCwgW3RvdGFsLCByZXVzZWQsIHBhY2tSZXVzZWRdKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iamVjdHMgPSBvYmplY3RFbnVtZXJhdGlvblJlc3VsdChyZXN1bHQucmVtb3RlTWVzc2FnZXMpO1xuICAgICAgICBvYmplY3RzLnRvdGFsID0gYXNPYmplY3RDb3VudCh0b3RhbCk7XG4gICAgICAgIG9iamVjdHMucmV1c2VkID0gYXNPYmplY3RDb3VudChyZXVzZWQpO1xuICAgICAgICBvYmplY3RzLnBhY2tSZXVzZWQgPSB1dGlsc18xLmFzTnVtYmVyKHBhY2tSZXVzZWQpO1xuICAgIH0pLFxuXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLXJlbW90ZS1vYmplY3RzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZW1vdGVNZXNzYWdlU3VtbWFyeSA9IGV4cG9ydHMucGFyc2VSZW1vdGVNZXNzYWdlcyA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwYXJzZV9yZW1vdGVfb2JqZWN0c18xID0gcmVxdWlyZShcIi4vcGFyc2UtcmVtb3RlLW9iamVjdHNcIik7XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLlJlbW90ZUxpbmVQYXJzZXIoL15yZW1vdGU6XFxzKiguKykkLywgKHJlc3VsdCwgW3RleHRdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5yZW1vdGVNZXNzYWdlcy5hbGwucHVzaCh0ZXh0LnRyaW0oKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KSxcbiAgICAuLi5wYXJzZV9yZW1vdGVfb2JqZWN0c18xLnJlbW90ZU1lc3NhZ2VzT2JqZWN0UGFyc2VycyxcbiAgICBuZXcgdXRpbHNfMS5SZW1vdGVMaW5lUGFyc2VyKFsvY3JlYXRlIGEgKD86cHVsbHxtZXJnZSkgcmVxdWVzdC9pLCAvXFxzKGh0dHBzPzpcXC9cXC9cXFMrKSQvXSwgKHJlc3VsdCwgW3B1bGxSZXF1ZXN0VXJsXSkgPT4ge1xuICAgICAgICByZXN1bHQucmVtb3RlTWVzc2FnZXMucHVsbFJlcXVlc3RVcmwgPSBwdWxsUmVxdWVzdFVybDtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5SZW1vdGVMaW5lUGFyc2VyKFsvZm91bmQgKFxcZCspIHZ1bG5lcmFiaWxpdGllcy4rXFwoKFteKV0rKVxcKS9pLCAvXFxzKGh0dHBzPzpcXC9cXC9cXFMrKSQvXSwgKHJlc3VsdCwgW2NvdW50LCBzdW1tYXJ5LCB1cmxdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5yZW1vdGVNZXNzYWdlcy52dWxuZXJhYmlsaXRpZXMgPSB7XG4gICAgICAgICAgICBjb3VudDogdXRpbHNfMS5hc051bWJlcihjb3VudCksXG4gICAgICAgICAgICBzdW1tYXJ5LFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICB9O1xuICAgIH0pLFxuXTtcbmZ1bmN0aW9uIHBhcnNlUmVtb3RlTWVzc2FnZXMoX3N0ZE91dCwgc3RkRXJyKSB7XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZSh7IHJlbW90ZU1lc3NhZ2VzOiBuZXcgUmVtb3RlTWVzc2FnZVN1bW1hcnkoKSB9LCBwYXJzZXJzLCBzdGRFcnIpO1xufVxuZXhwb3J0cy5wYXJzZVJlbW90ZU1lc3NhZ2VzID0gcGFyc2VSZW1vdGVNZXNzYWdlcztcbmNsYXNzIFJlbW90ZU1lc3NhZ2VTdW1tYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hbGwgPSBbXTtcbiAgICB9XG59XG5leHBvcnRzLlJlbW90ZU1lc3NhZ2VTdW1tYXJ5ID0gUmVtb3RlTWVzc2FnZVN1bW1hcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1yZW1vdGUtbWVzc2FnZXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlUHVzaERldGFpbCA9IGV4cG9ydHMucGFyc2VQdXNoUmVzdWx0ID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNvbnN0IHBhcnNlX3JlbW90ZV9tZXNzYWdlc18xID0gcmVxdWlyZShcIi4vcGFyc2UtcmVtb3RlLW1lc3NhZ2VzXCIpO1xuZnVuY3Rpb24gcHVzaFJlc3VsdFB1c2hlZEl0ZW0obG9jYWwsIHJlbW90ZSwgc3RhdHVzKSB7XG4gICAgY29uc3QgZGVsZXRlZCA9IHN0YXR1cy5pbmNsdWRlcygnZGVsZXRlZCcpO1xuICAgIGNvbnN0IHRhZyA9IHN0YXR1cy5pbmNsdWRlcygndGFnJykgfHwgL15yZWZzXFwvdGFncy8udGVzdChsb2NhbCk7XG4gICAgY29uc3QgYWxyZWFkeVVwZGF0ZWQgPSAhc3RhdHVzLmluY2x1ZGVzKCduZXcnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZWxldGVkLFxuICAgICAgICB0YWcsXG4gICAgICAgIGJyYW5jaDogIXRhZyxcbiAgICAgICAgbmV3OiAhYWxyZWFkeVVwZGF0ZWQsXG4gICAgICAgIGFscmVhZHlVcGRhdGVkLFxuICAgICAgICBsb2NhbCxcbiAgICAgICAgcmVtb3RlLFxuICAgIH07XG59XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL15QdXNoaW5nIHRvICguKykkLywgKHJlc3VsdCwgW3JlcG9dKSA9PiB7XG4gICAgICAgIHJlc3VsdC5yZXBvID0gcmVwbztcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9edXBkYXRpbmcgbG9jYWwgdHJhY2tpbmcgcmVmICcoLispJy8sIChyZXN1bHQsIFtsb2NhbF0pID0+IHtcbiAgICAgICAgcmVzdWx0LnJlZiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHJlc3VsdC5yZWYgfHwge30pKSwgeyBsb2NhbCB9KTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eWyotPV1cXHMrKFteOl0rKTooXFxTKylcXHMrXFxbKC4rKV0kLywgKHJlc3VsdCwgW2xvY2FsLCByZW1vdGUsIHR5cGVdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoZWQucHVzaChwdXNoUmVzdWx0UHVzaGVkSXRlbShsb2NhbCwgcmVtb3RlLCB0eXBlKSk7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXkJyYW5jaCAnKFteJ10rKScgc2V0IHVwIHRvIHRyYWNrIHJlbW90ZSBicmFuY2ggJyhbXiddKyknIGZyb20gJyhbXiddKyknLywgKHJlc3VsdCwgW2xvY2FsLCByZW1vdGUsIHJlbW90ZU5hbWVdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5icmFuY2ggPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIChyZXN1bHQuYnJhbmNoIHx8IHt9KSksIHsgbG9jYWwsXG4gICAgICAgICAgICByZW1vdGUsXG4gICAgICAgICAgICByZW1vdGVOYW1lIH0pO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL14oW146XSspOihcXFMrKVxccysoW2EtejAtOV0rKVxcLlxcLihbYS16MC05XSspJC8sIChyZXN1bHQsIFtsb2NhbCwgcmVtb3RlLCBmcm9tLCB0b10pID0+IHtcbiAgICAgICAgcmVzdWx0LnVwZGF0ZSA9IHtcbiAgICAgICAgICAgIGhlYWQ6IHtcbiAgICAgICAgICAgICAgICBsb2NhbCxcbiAgICAgICAgICAgICAgICByZW1vdGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGFzaDoge1xuICAgICAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0pLFxuXTtcbmNvbnN0IHBhcnNlUHVzaFJlc3VsdCA9IChzdGRPdXQsIHN0ZEVycikgPT4ge1xuICAgIGNvbnN0IHB1c2hEZXRhaWwgPSBleHBvcnRzLnBhcnNlUHVzaERldGFpbChzdGRPdXQsIHN0ZEVycik7XG4gICAgY29uc3QgcmVzcG9uc2VEZXRhaWwgPSBwYXJzZV9yZW1vdGVfbWVzc2FnZXNfMS5wYXJzZVJlbW90ZU1lc3NhZ2VzKHN0ZE91dCwgc3RkRXJyKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwdXNoRGV0YWlsKSwgcmVzcG9uc2VEZXRhaWwpO1xufTtcbmV4cG9ydHMucGFyc2VQdXNoUmVzdWx0ID0gcGFyc2VQdXNoUmVzdWx0O1xuY29uc3QgcGFyc2VQdXNoRGV0YWlsID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZSh7IHB1c2hlZDogW10gfSwgcGFyc2Vycywgc3RkT3V0LCBzdGRFcnIpO1xufTtcbmV4cG9ydHMucGFyc2VQdXNoRGV0YWlsID0gcGFyc2VQdXNoRGV0YWlsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2UtcHVzaC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHVzaFRhc2sgPSBleHBvcnRzLnB1c2hUYWdzVGFzayA9IHZvaWQgMDtcbmNvbnN0IHBhcnNlX3B1c2hfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLXB1c2hcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gcHVzaFRhZ3NUYXNrKHJlZiA9IHt9LCBjdXN0b21BcmdzKSB7XG4gICAgdXRpbHNfMS5hcHBlbmQoY3VzdG9tQXJncywgJy0tdGFncycpO1xuICAgIHJldHVybiBwdXNoVGFzayhyZWYsIGN1c3RvbUFyZ3MpO1xufVxuZXhwb3J0cy5wdXNoVGFnc1Rhc2sgPSBwdXNoVGFnc1Rhc2s7XG5mdW5jdGlvbiBwdXNoVGFzayhyZWYgPSB7fSwgY3VzdG9tQXJncykge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydwdXNoJywgLi4uY3VzdG9tQXJnc107XG4gICAgaWYgKHJlZi5icmFuY2gpIHtcbiAgICAgICAgY29tbWFuZHMuc3BsaWNlKDEsIDAsIHJlZi5icmFuY2gpO1xuICAgIH1cbiAgICBpZiAocmVmLnJlbW90ZSkge1xuICAgICAgICBjb21tYW5kcy5zcGxpY2UoMSwgMCwgcmVmLnJlbW90ZSk7XG4gICAgfVxuICAgIHV0aWxzXzEucmVtb3ZlKGNvbW1hbmRzLCAnLXYnKTtcbiAgICB1dGlsc18xLmFwcGVuZChjb21tYW5kcywgJy0tdmVyYm9zZScpO1xuICAgIHV0aWxzXzEuYXBwZW5kKGNvbW1hbmRzLCAnLS1wb3JjZWxhaW4nKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXI6IHBhcnNlX3B1c2hfMS5wYXJzZVB1c2hSZXN1bHQsXG4gICAgfTtcbn1cbmV4cG9ydHMucHVzaFRhc2sgPSBwdXNoVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXB1c2guanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNpbXBsZUdpdEFwaSA9IHZvaWQgMDtcbmNvbnN0IHRhc2tfY2FsbGJhY2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2stY2FsbGJhY2tcIik7XG5jb25zdCBwdXNoXzEgPSByZXF1aXJlKFwiLi90YXNrcy9wdXNoXCIpO1xuY29uc3QgdGFza18xID0gcmVxdWlyZShcIi4vdGFza3MvdGFza1wiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmNsYXNzIFNpbXBsZUdpdEFwaSB7XG4gICAgY29uc3RydWN0b3IoX2V4ZWN1dG9yKSB7XG4gICAgICAgIHRoaXMuX2V4ZWN1dG9yID0gX2V4ZWN1dG9yO1xuICAgIH1cbiAgICBfcnVuVGFzayh0YXNrLCB0aGVuKSB7XG4gICAgICAgIGNvbnN0IGNoYWluID0gdGhpcy5fZXhlY3V0b3IuY2hhaW4oKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGNoYWluLnB1c2godGFzayk7XG4gICAgICAgIGlmICh0aGVuKSB7XG4gICAgICAgICAgICB0YXNrX2NhbGxiYWNrXzEudGFza0NhbGxiYWNrKHRhc2ssIHByb21pc2UsIHRoZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMsIHtcbiAgICAgICAgICAgIHRoZW46IHsgdmFsdWU6IHByb21pc2UudGhlbi5iaW5kKHByb21pc2UpIH0sXG4gICAgICAgICAgICBjYXRjaDogeyB2YWx1ZTogcHJvbWlzZS5jYXRjaC5iaW5kKHByb21pc2UpIH0sXG4gICAgICAgICAgICBfZXhlY3V0b3I6IHsgdmFsdWU6IGNoYWluIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhZGQoZmlsZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2sodGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydhZGQnLCAuLi51dGlsc18xLmFzQXJyYXkoZmlsZXMpXSksIHV0aWxzXzEudHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xuICAgIH1cbiAgICBwdXNoKCkge1xuICAgICAgICBjb25zdCB0YXNrID0gcHVzaF8xLnB1c2hUYXNrKHtcbiAgICAgICAgICAgIHJlbW90ZTogdXRpbHNfMS5maWx0ZXJUeXBlKGFyZ3VtZW50c1swXSwgdXRpbHNfMS5maWx0ZXJTdHJpbmcpLFxuICAgICAgICAgICAgYnJhbmNoOiB1dGlsc18xLmZpbHRlclR5cGUoYXJndW1lbnRzWzFdLCB1dGlsc18xLmZpbHRlclN0cmluZyksXG4gICAgICAgIH0sIHV0aWxzXzEuZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCB1dGlsc18xLnRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpKTtcbiAgICB9XG59XG5leHBvcnRzLlNpbXBsZUdpdEFwaSA9IFNpbXBsZUdpdEFwaTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpbXBsZS1naXQtYXBpLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVEZWZlcnJlZCA9IGV4cG9ydHMuZGVmZXJyZWQgPSB2b2lkIDA7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYERlZmVycmVkUHJvbWlzZWBcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gaW1wb3J0IHtkZWZlcnJlZH0gZnJvbSAnQGt3c2l0ZXMvcHJvbWlzZS1kZWZlcnJlZGA7XG4gYGBgXG4gKi9cbmZ1bmN0aW9uIGRlZmVycmVkKCkge1xuICAgIGxldCBkb25lO1xuICAgIGxldCBmYWlsO1xuICAgIGxldCBzdGF0dXMgPSAncGVuZGluZyc7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChfZG9uZSwgX2ZhaWwpID0+IHtcbiAgICAgICAgZG9uZSA9IF9kb25lO1xuICAgICAgICBmYWlsID0gX2ZhaWw7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZSxcbiAgICAgICAgZG9uZShyZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgPT09ICdwZW5kaW5nJykge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdyZXNvbHZlZCc7XG4gICAgICAgICAgICAgICAgZG9uZShyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBmYWlsKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSAncGVuZGluZycpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAncmVqZWN0ZWQnO1xuICAgICAgICAgICAgICAgIGZhaWwoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXQgZnVsZmlsbGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1cyAhPT0gJ3BlbmRpbmcnO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgc3RhdHVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0cy5kZWZlcnJlZCA9IGRlZmVycmVkO1xuLyoqXG4gKiBBbGlhcyBvZiB0aGUgZXhwb3J0ZWQgYGRlZmVycmVkYCBmdW5jdGlvbiwgdG8gaGVscCBjb25zdW1lcnMgd2FudGluZyB0byB1c2UgYGRlZmVycmVkYCBhcyB0aGVcbiAqIGxvY2FsIHZhcmlhYmxlIG5hbWUgcmF0aGVyIHRoYW4gdGhlIGZhY3RvcnkgaW1wb3J0IG5hbWUsIHdpdGhvdXQgbmVlZGluZyB0byByZW5hbWUgb24gaW1wb3J0LlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiBpbXBvcnQge2NyZWF0ZURlZmVycmVkfSBmcm9tICdAa3dzaXRlcy9wcm9taXNlLWRlZmVycmVkYDtcbiBgYGBcbiAqL1xuZXhwb3J0cy5jcmVhdGVEZWZlcnJlZCA9IGRlZmVycmVkO1xuLyoqXG4gKiBEZWZhdWx0IGV4cG9ydCBhbGxvd3MgdXNlIGFzOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiBpbXBvcnQgZGVmZXJyZWQgZnJvbSAnQGt3c2l0ZXMvcHJvbWlzZS1kZWZlcnJlZGA7XG4gYGBgXG4gKi9cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmVycmVkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNjaGVkdWxlciA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwcm9taXNlX2RlZmVycmVkXzEgPSByZXF1aXJlKFwiQGt3c2l0ZXMvcHJvbWlzZS1kZWZlcnJlZFwiKTtcbmNvbnN0IGdpdF9sb2dnZXJfMSA9IHJlcXVpcmUoXCIuLi9naXQtbG9nZ2VyXCIpO1xuY29uc3QgY3JlYXRlU2NoZWR1bGVkVGFzayA9ICgoKSA9PiB7XG4gICAgbGV0IGlkID0gMDtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZCsrO1xuICAgICAgICBjb25zdCB7IHByb21pc2UsIGRvbmUgfSA9IHByb21pc2VfZGVmZXJyZWRfMS5jcmVhdGVEZWZlcnJlZCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJvbWlzZSxcbiAgICAgICAgICAgIGRvbmUsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgfTtcbiAgICB9O1xufSkoKTtcbmNsYXNzIFNjaGVkdWxlciB7XG4gICAgY29uc3RydWN0b3IoY29uY3VycmVuY3kgPSAyKSB7XG4gICAgICAgIHRoaXMuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBnaXRfbG9nZ2VyXzEuY3JlYXRlTG9nZ2VyKCcnLCAnc2NoZWR1bGVyJyk7XG4gICAgICAgIHRoaXMucGVuZGluZyA9IFtdO1xuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBbXTtcbiAgICAgICAgdGhpcy5sb2dnZXIoYENvbnN0cnVjdGVkLCBjb25jdXJyZW5jeT0lc2AsIGNvbmN1cnJlbmN5KTtcbiAgICB9XG4gICAgc2NoZWR1bGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nLmxlbmd0aCB8fCB0aGlzLnJ1bm5pbmcubGVuZ3RoID49IHRoaXMuY29uY3VycmVuY3kpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyKGBTY2hlZHVsZSBhdHRlbXB0IGlnbm9yZWQsIHBlbmRpbmc9JXMgcnVubmluZz0lcyBjb25jdXJyZW5jeT0lc2AsIHRoaXMucGVuZGluZy5sZW5ndGgsIHRoaXMucnVubmluZy5sZW5ndGgsIHRoaXMuY29uY3VycmVuY3kpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhc2sgPSB1dGlsc18xLmFwcGVuZCh0aGlzLnJ1bm5pbmcsIHRoaXMucGVuZGluZy5zaGlmdCgpKTtcbiAgICAgICAgdGhpcy5sb2dnZXIoYEF0dGVtcHRpbmcgaWQ9JXNgLCB0YXNrLmlkKTtcbiAgICAgICAgdGFzay5kb25lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyKGBDb21wbGV0aW5nIGlkPWAsIHRhc2suaWQpO1xuICAgICAgICAgICAgdXRpbHNfMS5yZW1vdmUodGhpcy5ydW5uaW5nLCB0YXNrKTtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSwgaWQgfSA9IHV0aWxzXzEuYXBwZW5kKHRoaXMucGVuZGluZywgY3JlYXRlU2NoZWR1bGVkVGFzaygpKTtcbiAgICAgICAgdGhpcy5sb2dnZXIoYFNjaGVkdWxpbmcgaWQ9JXNgLCBpZCk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxufVxuZXhwb3J0cy5TY2hlZHVsZXIgPSBTY2hlZHVsZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2hlZHVsZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFwcGx5UGF0Y2hUYXNrID0gdm9pZCAwO1xuY29uc3QgdGFza18xID0gcmVxdWlyZShcIi4vdGFza1wiKTtcbmZ1bmN0aW9uIGFwcGx5UGF0Y2hUYXNrKHBhdGNoZXMsIGN1c3RvbUFyZ3MpIHtcbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydhcHBseScsIC4uLmN1c3RvbUFyZ3MsIC4uLnBhdGNoZXNdKTtcbn1cbmV4cG9ydHMuYXBwbHlQYXRjaFRhc2sgPSBhcHBseVBhdGNoVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwcGx5LXBhdGNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc1NpbmdsZUJyYW5jaERlbGV0ZUZhaWx1cmUgPSBleHBvcnRzLmJyYW5jaERlbGV0aW9uRmFpbHVyZSA9IGV4cG9ydHMuYnJhbmNoRGVsZXRpb25TdWNjZXNzID0gZXhwb3J0cy5CcmFuY2hEZWxldGlvbkJhdGNoID0gdm9pZCAwO1xuY2xhc3MgQnJhbmNoRGVsZXRpb25CYXRjaCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYWxsID0gW107XG4gICAgICAgIHRoaXMuYnJhbmNoZXMgPSB7fTtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICB9XG4gICAgZ2V0IHN1Y2Nlc3MoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5lcnJvcnMubGVuZ3RoO1xuICAgIH1cbn1cbmV4cG9ydHMuQnJhbmNoRGVsZXRpb25CYXRjaCA9IEJyYW5jaERlbGV0aW9uQmF0Y2g7XG5mdW5jdGlvbiBicmFuY2hEZWxldGlvblN1Y2Nlc3MoYnJhbmNoLCBoYXNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYnJhbmNoLCBoYXNoLCBzdWNjZXNzOiB0cnVlLFxuICAgIH07XG59XG5leHBvcnRzLmJyYW5jaERlbGV0aW9uU3VjY2VzcyA9IGJyYW5jaERlbGV0aW9uU3VjY2VzcztcbmZ1bmN0aW9uIGJyYW5jaERlbGV0aW9uRmFpbHVyZShicmFuY2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBicmFuY2gsIGhhc2g6IG51bGwsIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIH07XG59XG5leHBvcnRzLmJyYW5jaERlbGV0aW9uRmFpbHVyZSA9IGJyYW5jaERlbGV0aW9uRmFpbHVyZTtcbmZ1bmN0aW9uIGlzU2luZ2xlQnJhbmNoRGVsZXRlRmFpbHVyZSh0ZXN0KSB7XG4gICAgcmV0dXJuIHRlc3Quc3VjY2Vzcztcbn1cbmV4cG9ydHMuaXNTaW5nbGVCcmFuY2hEZWxldGVGYWlsdXJlID0gaXNTaW5nbGVCcmFuY2hEZWxldGVGYWlsdXJlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJhbmNoRGVsZXRlU3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaGFzQnJhbmNoRGVsZXRpb25FcnJvciA9IGV4cG9ydHMucGFyc2VCcmFuY2hEZWxldGlvbnMgPSB2b2lkIDA7XG5jb25zdCBCcmFuY2hEZWxldGVTdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcmVzcG9uc2VzL0JyYW5jaERlbGV0ZVN1bW1hcnlcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgZGVsZXRlU3VjY2Vzc1JlZ2V4ID0gLyhcXFMrKVxccytcXChcXFMrXFxzKFteKV0rKVxcKS87XG5jb25zdCBkZWxldGVFcnJvclJlZ2V4ID0gL15lcnJvclteJ10rJyhbXiddKyknL207XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoZGVsZXRlU3VjY2Vzc1JlZ2V4LCAocmVzdWx0LCBbYnJhbmNoLCBoYXNoXSkgPT4ge1xuICAgICAgICBjb25zdCBkZWxldGlvbiA9IEJyYW5jaERlbGV0ZVN1bW1hcnlfMS5icmFuY2hEZWxldGlvblN1Y2Nlc3MoYnJhbmNoLCBoYXNoKTtcbiAgICAgICAgcmVzdWx0LmFsbC5wdXNoKGRlbGV0aW9uKTtcbiAgICAgICAgcmVzdWx0LmJyYW5jaGVzW2JyYW5jaF0gPSBkZWxldGlvbjtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKGRlbGV0ZUVycm9yUmVnZXgsIChyZXN1bHQsIFticmFuY2hdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlbGV0aW9uID0gQnJhbmNoRGVsZXRlU3VtbWFyeV8xLmJyYW5jaERlbGV0aW9uRmFpbHVyZShicmFuY2gpO1xuICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2goZGVsZXRpb24pO1xuICAgICAgICByZXN1bHQuYWxsLnB1c2goZGVsZXRpb24pO1xuICAgICAgICByZXN1bHQuYnJhbmNoZXNbYnJhbmNoXSA9IGRlbGV0aW9uO1xuICAgIH0pLFxuXTtcbmNvbnN0IHBhcnNlQnJhbmNoRGVsZXRpb25zID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZShuZXcgQnJhbmNoRGVsZXRlU3VtbWFyeV8xLkJyYW5jaERlbGV0aW9uQmF0Y2goKSwgcGFyc2Vycywgc3RkT3V0LCBzdGRFcnIpO1xufTtcbmV4cG9ydHMucGFyc2VCcmFuY2hEZWxldGlvbnMgPSBwYXJzZUJyYW5jaERlbGV0aW9ucztcbmZ1bmN0aW9uIGhhc0JyYW5jaERlbGV0aW9uRXJyb3IoZGF0YSwgcHJvY2Vzc0V4aXRDb2RlKSB7XG4gICAgcmV0dXJuIHByb2Nlc3NFeGl0Q29kZSA9PT0gdXRpbHNfMS5FeGl0Q29kZXMuRVJST1IgJiYgZGVsZXRlRXJyb3JSZWdleC50ZXN0KGRhdGEpO1xufVxuZXhwb3J0cy5oYXNCcmFuY2hEZWxldGlvbkVycm9yID0gaGFzQnJhbmNoRGVsZXRpb25FcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLWJyYW5jaC1kZWxldGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJyYW5jaFN1bW1hcnlSZXN1bHQgPSB2b2lkIDA7XG5jbGFzcyBCcmFuY2hTdW1tYXJ5UmVzdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hbGwgPSBbXTtcbiAgICAgICAgdGhpcy5icmFuY2hlcyA9IHt9O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSAnJztcbiAgICAgICAgdGhpcy5kZXRhY2hlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBwdXNoKGN1cnJlbnQsIGRldGFjaGVkLCBuYW1lLCBjb21taXQsIGxhYmVsKSB7XG4gICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaGVkID0gZGV0YWNoZWQ7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsLnB1c2gobmFtZSk7XG4gICAgICAgIHRoaXMuYnJhbmNoZXNbbmFtZV0gPSB7XG4gICAgICAgICAgICBjdXJyZW50OiBjdXJyZW50LFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGNvbW1pdDogY29tbWl0LFxuICAgICAgICAgICAgbGFiZWw6IGxhYmVsXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5CcmFuY2hTdW1tYXJ5UmVzdWx0ID0gQnJhbmNoU3VtbWFyeVJlc3VsdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyYW5jaFN1bW1hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlQnJhbmNoU3VtbWFyeSA9IHZvaWQgMDtcbmNvbnN0IEJyYW5jaFN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvQnJhbmNoU3VtbWFyeVwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL14oXFwqXFxzKT9cXCgoPzpIRUFEICk/ZGV0YWNoZWQgKD86ZnJvbXxhdCkgKFxcUyspXFwpXFxzKyhbYS16MC05XSspXFxzKC4qKSQvLCAocmVzdWx0LCBbY3VycmVudCwgbmFtZSwgY29tbWl0LCBsYWJlbF0pID0+IHtcbiAgICAgICAgcmVzdWx0LnB1c2goISFjdXJyZW50LCB0cnVlLCBuYW1lLCBjb21taXQsIGxhYmVsKTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eKFxcKlxccyk/KFxcUyspXFxzKyhbYS16MC05XSspXFxzKC4qKSQvcywgKHJlc3VsdCwgW2N1cnJlbnQsIG5hbWUsIGNvbW1pdCwgbGFiZWxdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCEhY3VycmVudCwgZmFsc2UsIG5hbWUsIGNvbW1pdCwgbGFiZWwpO1xuICAgIH0pXG5dO1xuZnVuY3Rpb24gcGFyc2VCcmFuY2hTdW1tYXJ5KHN0ZE91dCkge1xuICAgIHJldHVybiB1dGlsc18xLnBhcnNlU3RyaW5nUmVzcG9uc2UobmV3IEJyYW5jaFN1bW1hcnlfMS5CcmFuY2hTdW1tYXJ5UmVzdWx0KCksIHBhcnNlcnMsIHN0ZE91dCk7XG59XG5leHBvcnRzLnBhcnNlQnJhbmNoU3VtbWFyeSA9IHBhcnNlQnJhbmNoU3VtbWFyeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLWJyYW5jaC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVsZXRlQnJhbmNoVGFzayA9IGV4cG9ydHMuZGVsZXRlQnJhbmNoZXNUYXNrID0gZXhwb3J0cy5icmFuY2hMb2NhbFRhc2sgPSBleHBvcnRzLmJyYW5jaFRhc2sgPSBleHBvcnRzLmNvbnRhaW5zRGVsZXRlQnJhbmNoQ29tbWFuZCA9IHZvaWQgMDtcbmNvbnN0IGdpdF9yZXNwb25zZV9lcnJvcl8xID0gcmVxdWlyZShcIi4uL2Vycm9ycy9naXQtcmVzcG9uc2UtZXJyb3JcIik7XG5jb25zdCBwYXJzZV9icmFuY2hfZGVsZXRlXzEgPSByZXF1aXJlKFwiLi4vcGFyc2Vycy9wYXJzZS1icmFuY2gtZGVsZXRlXCIpO1xuY29uc3QgcGFyc2VfYnJhbmNoXzEgPSByZXF1aXJlKFwiLi4vcGFyc2Vycy9wYXJzZS1icmFuY2hcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gY29udGFpbnNEZWxldGVCcmFuY2hDb21tYW5kKGNvbW1hbmRzKSB7XG4gICAgY29uc3QgZGVsZXRlQ29tbWFuZHMgPSBbJy1kJywgJy1EJywgJy0tZGVsZXRlJ107XG4gICAgcmV0dXJuIGNvbW1hbmRzLnNvbWUoY29tbWFuZCA9PiBkZWxldGVDb21tYW5kcy5pbmNsdWRlcyhjb21tYW5kKSk7XG59XG5leHBvcnRzLmNvbnRhaW5zRGVsZXRlQnJhbmNoQ29tbWFuZCA9IGNvbnRhaW5zRGVsZXRlQnJhbmNoQ29tbWFuZDtcbmZ1bmN0aW9uIGJyYW5jaFRhc2soY3VzdG9tQXJncykge1xuICAgIGNvbnN0IGlzRGVsZXRlID0gY29udGFpbnNEZWxldGVCcmFuY2hDb21tYW5kKGN1c3RvbUFyZ3MpO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydicmFuY2gnLCAuLi5jdXN0b21BcmdzXTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJy1hJyk7XG4gICAgfVxuICAgIGlmICghY29tbWFuZHMuaW5jbHVkZXMoJy12JykpIHtcbiAgICAgICAgY29tbWFuZHMuc3BsaWNlKDEsIDAsICctdicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBwYXJzZXIoc3RkT3V0LCBzdGRFcnIpIHtcbiAgICAgICAgICAgIGlmIChpc0RlbGV0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZV9icmFuY2hfZGVsZXRlXzEucGFyc2VCcmFuY2hEZWxldGlvbnMoc3RkT3V0LCBzdGRFcnIpLmFsbFswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJzZV9icmFuY2hfMS5wYXJzZUJyYW5jaFN1bW1hcnkoc3RkT3V0KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0cy5icmFuY2hUYXNrID0gYnJhbmNoVGFzaztcbmZ1bmN0aW9uIGJyYW5jaExvY2FsVGFzaygpIHtcbiAgICBjb25zdCBwYXJzZXIgPSBwYXJzZV9icmFuY2hfMS5wYXJzZUJyYW5jaFN1bW1hcnk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBjb21tYW5kczogWydicmFuY2gnLCAnLXYnXSxcbiAgICAgICAgcGFyc2VyLFxuICAgIH07XG59XG5leHBvcnRzLmJyYW5jaExvY2FsVGFzayA9IGJyYW5jaExvY2FsVGFzaztcbmZ1bmN0aW9uIGRlbGV0ZUJyYW5jaGVzVGFzayhicmFuY2hlcywgZm9yY2VEZWxldGUgPSBmYWxzZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgY29tbWFuZHM6IFsnYnJhbmNoJywgJy12JywgZm9yY2VEZWxldGUgPyAnLUQnIDogJy1kJywgLi4uYnJhbmNoZXNdLFxuICAgICAgICBwYXJzZXIoc3RkT3V0LCBzdGRFcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZV9icmFuY2hfZGVsZXRlXzEucGFyc2VCcmFuY2hEZWxldGlvbnMoc3RkT3V0LCBzdGRFcnIpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yKHsgZXhpdENvZGUsIHN0ZE91dCB9LCBlcnJvciwgZG9uZSwgZmFpbCkge1xuICAgICAgICAgICAgaWYgKCFwYXJzZV9icmFuY2hfZGVsZXRlXzEuaGFzQnJhbmNoRGVsZXRpb25FcnJvcihTdHJpbmcoZXJyb3IpLCBleGl0Q29kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb25lKHN0ZE91dCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmV4cG9ydHMuZGVsZXRlQnJhbmNoZXNUYXNrID0gZGVsZXRlQnJhbmNoZXNUYXNrO1xuZnVuY3Rpb24gZGVsZXRlQnJhbmNoVGFzayhicmFuY2gsIGZvcmNlRGVsZXRlID0gZmFsc2UpIHtcbiAgICBjb25zdCB0YXNrID0ge1xuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIGNvbW1hbmRzOiBbJ2JyYW5jaCcsICctdicsIGZvcmNlRGVsZXRlID8gJy1EJyA6ICctZCcsIGJyYW5jaF0sXG4gICAgICAgIHBhcnNlcihzdGRPdXQsIHN0ZEVycikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlX2JyYW5jaF9kZWxldGVfMS5wYXJzZUJyYW5jaERlbGV0aW9ucyhzdGRPdXQsIHN0ZEVycikuYnJhbmNoZXNbYnJhbmNoXTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcih7IGV4aXRDb2RlLCBzdGRFcnIsIHN0ZE91dCB9LCBlcnJvciwgXywgZmFpbCkge1xuICAgICAgICAgICAgaWYgKCFwYXJzZV9icmFuY2hfZGVsZXRlXzEuaGFzQnJhbmNoRGVsZXRpb25FcnJvcihTdHJpbmcoZXJyb3IpLCBleGl0Q29kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgZ2l0X3Jlc3BvbnNlX2Vycm9yXzEuR2l0UmVzcG9uc2VFcnJvcih0YXNrLnBhcnNlcih1dGlsc18xLmJ1ZmZlclRvU3RyaW5nKHN0ZE91dCksIHV0aWxzXzEuYnVmZmVyVG9TdHJpbmcoc3RkRXJyKSksIFN0cmluZyhlcnJvcikpO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIHRhc2s7XG59XG5leHBvcnRzLmRlbGV0ZUJyYW5jaFRhc2sgPSBkZWxldGVCcmFuY2hUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJhbmNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZUNoZWNrSWdub3JlID0gdm9pZCAwO1xuLyoqXG4gKiBQYXJzZXIgZm9yIHRoZSBgY2hlY2staWdub3JlYCBjb21tYW5kIC0gcmV0dXJucyBlYWNoIGZpbGUgYXMgYSBzdHJpbmcgYXJyYXlcbiAqL1xuY29uc3QgcGFyc2VDaGVja0lnbm9yZSA9ICh0ZXh0KSA9PiB7XG4gICAgcmV0dXJuIHRleHQuc3BsaXQoL1xcbi9nKVxuICAgICAgICAubWFwKGxpbmUgPT4gbGluZS50cmltKCkpXG4gICAgICAgIC5maWx0ZXIoZmlsZSA9PiAhIWZpbGUpO1xufTtcbmV4cG9ydHMucGFyc2VDaGVja0lnbm9yZSA9IHBhcnNlQ2hlY2tJZ25vcmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGVja0lnbm9yZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2hlY2tJZ25vcmVUYXNrID0gdm9pZCAwO1xuY29uc3QgQ2hlY2tJZ25vcmVfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvQ2hlY2tJZ25vcmVcIik7XG5mdW5jdGlvbiBjaGVja0lnbm9yZVRhc2socGF0aHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogWydjaGVjay1pZ25vcmUnLCAuLi5wYXRoc10sXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyOiBDaGVja0lnbm9yZV8xLnBhcnNlQ2hlY2tJZ25vcmUsXG4gICAgfTtcbn1cbmV4cG9ydHMuY2hlY2tJZ25vcmVUYXNrID0gY2hlY2tJZ25vcmVUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hlY2staWdub3JlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jbG9uZU1pcnJvclRhc2sgPSBleHBvcnRzLmNsb25lVGFzayA9IHZvaWQgMDtcbmNvbnN0IHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gY2xvbmVUYXNrKHJlcG8sIGRpcmVjdG9yeSwgY3VzdG9tQXJncykge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydjbG9uZScsIC4uLmN1c3RvbUFyZ3NdO1xuICAgIGlmICh0eXBlb2YgcmVwbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaChyZXBvKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkaXJlY3RvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goZGlyZWN0b3J5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhc2tfMS5zdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzKTtcbn1cbmV4cG9ydHMuY2xvbmVUYXNrID0gY2xvbmVUYXNrO1xuZnVuY3Rpb24gY2xvbmVNaXJyb3JUYXNrKHJlcG8sIGRpcmVjdG9yeSwgY3VzdG9tQXJncykge1xuICAgIHV0aWxzXzEuYXBwZW5kKGN1c3RvbUFyZ3MsICctLW1pcnJvcicpO1xuICAgIHJldHVybiBjbG9uZVRhc2socmVwbywgZGlyZWN0b3J5LCBjdXN0b21BcmdzKTtcbn1cbmV4cG9ydHMuY2xvbmVNaXJyb3JUYXNrID0gY2xvbmVNaXJyb3JUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xvbmUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbmZpZ0xpc3RQYXJzZXIgPSBleHBvcnRzLkNvbmZpZ0xpc3QgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY2xhc3MgQ29uZmlnTGlzdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH1cbiAgICBnZXQgYWxsKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2FsbCkge1xuICAgICAgICAgICAgdGhpcy5fYWxsID0gdGhpcy5maWxlcy5yZWR1Y2UoKGFsbCwgZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFsbCwgdGhpcy52YWx1ZXNbZmlsZV0pO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGw7XG4gICAgfVxuICAgIGFkZEZpbGUoZmlsZSkge1xuICAgICAgICBpZiAoIShmaWxlIGluIHRoaXMudmFsdWVzKSkge1xuICAgICAgICAgICAgY29uc3QgbGF0ZXN0ID0gdXRpbHNfMS5sYXN0KHRoaXMuZmlsZXMpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZXNbZmlsZV0gPSBsYXRlc3QgPyBPYmplY3QuY3JlYXRlKHRoaXMudmFsdWVzW2xhdGVzdF0pIDoge307XG4gICAgICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzW2ZpbGVdO1xuICAgIH1cbiAgICBhZGRWYWx1ZShmaWxlLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuYWRkRmlsZShmaWxlKTtcbiAgICAgICAgaWYgKCF2YWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlc1trZXldKSkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IFt2YWx1ZXNba2V5XSwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FsbCA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG5leHBvcnRzLkNvbmZpZ0xpc3QgPSBDb25maWdMaXN0O1xuZnVuY3Rpb24gY29uZmlnTGlzdFBhcnNlcih0ZXh0KSB7XG4gICAgY29uc3QgY29uZmlnID0gbmV3IENvbmZpZ0xpc3QoKTtcbiAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcMCcpO1xuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBsaW5lcy5sZW5ndGggLSAxOyBpIDwgbWF4Oykge1xuICAgICAgICBjb25zdCBmaWxlID0gY29uZmlnRmlsZVBhdGgobGluZXNbaSsrXSk7XG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHV0aWxzXzEuc3BsaXRPbihsaW5lc1tpKytdLCAnXFxuJyk7XG4gICAgICAgIGNvbmZpZy5hZGRWYWx1ZShmaWxlLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmV4cG9ydHMuY29uZmlnTGlzdFBhcnNlciA9IGNvbmZpZ0xpc3RQYXJzZXI7XG5mdW5jdGlvbiBjb25maWdGaWxlUGF0aChmaWxlUGF0aCkge1xuICAgIHJldHVybiBmaWxlUGF0aC5yZXBsYWNlKC9eKGZpbGUpOi8sICcnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbmZpZ0xpc3QuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmxpc3RDb25maWdUYXNrID0gZXhwb3J0cy5hZGRDb25maWdUYXNrID0gdm9pZCAwO1xuY29uc3QgQ29uZmlnTGlzdF8xID0gcmVxdWlyZShcIi4uL3Jlc3BvbnNlcy9Db25maWdMaXN0XCIpO1xuZnVuY3Rpb24gYWRkQ29uZmlnVGFzayhrZXksIHZhbHVlLCBhcHBlbmQgPSBmYWxzZSkge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydjb25maWcnLCAnLS1sb2NhbCddO1xuICAgIGlmIChhcHBlbmQpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnLS1hZGQnKTtcbiAgICB9XG4gICAgY29tbWFuZHMucHVzaChrZXksIHZhbHVlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIodGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5hZGRDb25maWdUYXNrID0gYWRkQ29uZmlnVGFzaztcbmZ1bmN0aW9uIGxpc3RDb25maWdUYXNrKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzOiBbJ2NvbmZpZycsICctLWxpc3QnLCAnLS1zaG93LW9yaWdpbicsICctLW51bGwnXSxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIodGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIENvbmZpZ0xpc3RfMS5jb25maWdMaXN0UGFyc2VyKHRleHQpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnRzLmxpc3RDb25maWdUYXNrID0gbGlzdENvbmZpZ1Rhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25maWcuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlQ29tbWl0UmVzdWx0ID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNvbnN0IHBhcnNlcnMgPSBbXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXFxbKFteXFxzXSspKCBcXChbXildK1xcKSk/IChbXlxcXV0rKS8sIChyZXN1bHQsIFticmFuY2gsIHJvb3QsIGNvbW1pdF0pID0+IHtcbiAgICAgICAgcmVzdWx0LmJyYW5jaCA9IGJyYW5jaDtcbiAgICAgICAgcmVzdWx0LmNvbW1pdCA9IGNvbW1pdDtcbiAgICAgICAgcmVzdWx0LnJvb3QgPSAhIXJvb3Q7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXFxzKkF1dGhvcjpcXHMoLispL2ksIChyZXN1bHQsIFthdXRob3JdKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gYXV0aG9yLnNwbGl0KCc8Jyk7XG4gICAgICAgIGNvbnN0IGVtYWlsID0gcGFydHMucG9wKCk7XG4gICAgICAgIGlmICghZW1haWwgfHwgIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQuYXV0aG9yID0ge1xuICAgICAgICAgICAgZW1haWw6IGVtYWlsLnN1YnN0cigwLCBlbWFpbC5sZW5ndGggLSAxKSxcbiAgICAgICAgICAgIG5hbWU6IHBhcnRzLmpvaW4oJzwnKS50cmltKClcbiAgICAgICAgfTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC8oXFxkKylbXixdKig/OixcXHMqKFxcZCspW14sXSopKD86LFxccyooXFxkKykpL2csIChyZXN1bHQsIFtjaGFuZ2VzLCBpbnNlcnRpb25zLCBkZWxldGlvbnNdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5zdW1tYXJ5LmNoYW5nZXMgPSBwYXJzZUludChjaGFuZ2VzLCAxMCkgfHwgMDtcbiAgICAgICAgcmVzdWx0LnN1bW1hcnkuaW5zZXJ0aW9ucyA9IHBhcnNlSW50KGluc2VydGlvbnMsIDEwKSB8fCAwO1xuICAgICAgICByZXN1bHQuc3VtbWFyeS5kZWxldGlvbnMgPSBwYXJzZUludChkZWxldGlvbnMsIDEwKSB8fCAwO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL14oXFxkKylbXixdKig/OixcXHMqKFxcZCspW14oXStcXCgoWystXSkpPy8sIChyZXN1bHQsIFtjaGFuZ2VzLCBsaW5lcywgZGlyZWN0aW9uXSkgPT4ge1xuICAgICAgICByZXN1bHQuc3VtbWFyeS5jaGFuZ2VzID0gcGFyc2VJbnQoY2hhbmdlcywgMTApIHx8IDA7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcGFyc2VJbnQobGluZXMsIDEwKSB8fCAwO1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnLScpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdW1tYXJ5LmRlbGV0aW9ucyA9IGNvdW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJysnKSB7XG4gICAgICAgICAgICByZXN1bHQuc3VtbWFyeS5pbnNlcnRpb25zID0gY291bnQ7XG4gICAgICAgIH1cbiAgICB9KSxcbl07XG5mdW5jdGlvbiBwYXJzZUNvbW1pdFJlc3VsdChzdGRPdXQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIGF1dGhvcjogbnVsbCxcbiAgICAgICAgYnJhbmNoOiAnJyxcbiAgICAgICAgY29tbWl0OiAnJyxcbiAgICAgICAgcm9vdDogZmFsc2UsXG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIGNoYW5nZXM6IDAsXG4gICAgICAgICAgICBpbnNlcnRpb25zOiAwLFxuICAgICAgICAgICAgZGVsZXRpb25zOiAwLFxuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZShyZXN1bHQsIHBhcnNlcnMsIHN0ZE91dCk7XG59XG5leHBvcnRzLnBhcnNlQ29tbWl0UmVzdWx0ID0gcGFyc2VDb21taXRSZXN1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1jb21taXQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbW1pdFRhc2sgPSB2b2lkIDA7XG5jb25zdCBwYXJzZV9jb21taXRfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLWNvbW1pdFwiKTtcbmZ1bmN0aW9uIGNvbW1pdFRhc2sobWVzc2FnZSwgZmlsZXMsIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsnY29tbWl0J107XG4gICAgbWVzc2FnZS5mb3JFYWNoKChtKSA9PiBjb21tYW5kcy5wdXNoKCctbScsIG0pKTtcbiAgICBjb21tYW5kcy5wdXNoKC4uLmZpbGVzLCAuLi5jdXN0b21BcmdzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXI6IHBhcnNlX2NvbW1pdF8xLnBhcnNlQ29tbWl0UmVzdWx0LFxuICAgIH07XG59XG5leHBvcnRzLmNvbW1pdFRhc2sgPSBjb21taXRUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbWl0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaWZmU3VtbWFyeSA9IHZvaWQgMDtcbi8qKipcbiAqIFRoZSBEaWZmU3VtbWFyeSBpcyByZXR1cm5lZCBhcyBhIHJlc3BvbnNlIHRvIGdldHRpbmcgYGdpdCgpLnN0YXR1cygpYFxuICovXG5jbGFzcyBEaWZmU3VtbWFyeSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IDA7XG4gICAgICAgIHRoaXMuZGVsZXRpb25zID0gMDtcbiAgICAgICAgdGhpcy5pbnNlcnRpb25zID0gMDtcbiAgICAgICAgdGhpcy5maWxlcyA9IFtdO1xuICAgIH1cbn1cbmV4cG9ydHMuRGlmZlN1bW1hcnkgPSBEaWZmU3VtbWFyeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpZmZTdW1tYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZURpZmZSZXN1bHQgPSB2b2lkIDA7XG5jb25zdCBEaWZmU3VtbWFyeV8xID0gcmVxdWlyZShcIi4uL3Jlc3BvbnNlcy9EaWZmU3VtbWFyeVwiKTtcbmZ1bmN0aW9uIHBhcnNlRGlmZlJlc3VsdChzdGRPdXQpIHtcbiAgICBjb25zdCBsaW5lcyA9IHN0ZE91dC50cmltKCkuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBEaWZmU3VtbWFyeV8xLkRpZmZTdW1tYXJ5KCk7XG4gICAgcmVhZFN1bW1hcnlMaW5lKHN0YXR1cywgbGluZXMucG9wKCkpO1xuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBsaW5lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG4gICAgICAgIHRleHRGaWxlQ2hhbmdlKGxpbmUsIHN0YXR1cykgfHwgYmluYXJ5RmlsZUNoYW5nZShsaW5lLCBzdGF0dXMpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdHVzO1xufVxuZXhwb3J0cy5wYXJzZURpZmZSZXN1bHQgPSBwYXJzZURpZmZSZXN1bHQ7XG5mdW5jdGlvbiByZWFkU3VtbWFyeUxpbmUoc3RhdHVzLCBzdW1tYXJ5KSB7XG4gICAgKHN1bW1hcnkgfHwgJycpXG4gICAgICAgIC50cmltKClcbiAgICAgICAgLnNwbGl0KCcsICcpXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPSAvKFxcZCspXFxzKFthLXpdKykvLmV4ZWModGV4dCk7XG4gICAgICAgIGlmICghc3VtbWFyeSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1bW1hcnlUeXBlKHN0YXR1cywgc3VtbWFyeVsyXSwgcGFyc2VJbnQoc3VtbWFyeVsxXSwgMTApKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHN1bW1hcnlUeXBlKHN0YXR1cywga2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IG1hdGNoID0gKC8oW2Etel0rPylzP1xcYi8uZXhlYyhrZXkpKTtcbiAgICBpZiAoIW1hdGNoIHx8ICFzdGF0dXNVcGRhdGVbbWF0Y2hbMV1dKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdHVzVXBkYXRlW21hdGNoWzFdXShzdGF0dXMsIHZhbHVlKTtcbn1cbmNvbnN0IHN0YXR1c1VwZGF0ZSA9IHtcbiAgICBmaWxlKHN0YXR1cywgdmFsdWUpIHtcbiAgICAgICAgc3RhdHVzLmNoYW5nZWQgPSB2YWx1ZTtcbiAgICB9LFxuICAgIGRlbGV0aW9uKHN0YXR1cywgdmFsdWUpIHtcbiAgICAgICAgc3RhdHVzLmRlbGV0aW9ucyA9IHZhbHVlO1xuICAgIH0sXG4gICAgaW5zZXJ0aW9uKHN0YXR1cywgdmFsdWUpIHtcbiAgICAgICAgc3RhdHVzLmluc2VydGlvbnMgPSB2YWx1ZTtcbiAgICB9XG59O1xuZnVuY3Rpb24gdGV4dEZpbGVDaGFuZ2UoaW5wdXQsIHsgZmlsZXMgfSkge1xuICAgIGNvbnN0IGxpbmUgPSBpbnB1dC50cmltKCkubWF0Y2goL14oLispXFxzK1xcfFxccysoXFxkKykoXFxzK1srXFwtXSspPyQvKTtcbiAgICBpZiAobGluZSkge1xuICAgICAgICB2YXIgYWx0ZXJhdGlvbnMgPSAobGluZVszXSB8fCAnJykudHJpbSgpO1xuICAgICAgICBmaWxlcy5wdXNoKHtcbiAgICAgICAgICAgIGZpbGU6IGxpbmVbMV0udHJpbSgpLFxuICAgICAgICAgICAgY2hhbmdlczogcGFyc2VJbnQobGluZVsyXSwgMTApLFxuICAgICAgICAgICAgaW5zZXJ0aW9uczogYWx0ZXJhdGlvbnMucmVwbGFjZSgvLS9nLCAnJykubGVuZ3RoLFxuICAgICAgICAgICAgZGVsZXRpb25zOiBhbHRlcmF0aW9ucy5yZXBsYWNlKC9cXCsvZywgJycpLmxlbmd0aCxcbiAgICAgICAgICAgIGJpbmFyeTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBiaW5hcnlGaWxlQ2hhbmdlKGlucHV0LCB7IGZpbGVzIH0pIHtcbiAgICBjb25zdCBsaW5lID0gaW5wdXQubWF0Y2goL14oLispIFxcfFxccytCaW4gKFswLTkuXSspIC0+IChbMC05Ll0rKSAoW2Etel0rKSQvKTtcbiAgICBpZiAobGluZSkge1xuICAgICAgICBmaWxlcy5wdXNoKHtcbiAgICAgICAgICAgIGZpbGU6IGxpbmVbMV0udHJpbSgpLFxuICAgICAgICAgICAgYmVmb3JlOiArbGluZVsyXSxcbiAgICAgICAgICAgIGFmdGVyOiArbGluZVszXSxcbiAgICAgICAgICAgIGJpbmFyeTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLWRpZmYtc3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGlmZlN1bW1hcnlUYXNrID0gdm9pZCAwO1xuY29uc3QgcGFyc2VfZGlmZl9zdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcGFyc2Vycy9wYXJzZS1kaWZmLXN1bW1hcnlcIik7XG5mdW5jdGlvbiBkaWZmU3VtbWFyeVRhc2soY3VzdG9tQXJncykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzOiBbJ2RpZmYnLCAnLS1zdGF0PTQwOTYnLCAuLi5jdXN0b21BcmdzXSxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIoc3RkT3V0KSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VfZGlmZl9zdW1tYXJ5XzEucGFyc2VEaWZmUmVzdWx0KHN0ZE91dCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5kaWZmU3VtbWFyeVRhc2sgPSBkaWZmU3VtbWFyeVRhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWZmLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZUZldGNoUmVzdWx0ID0gdm9pZCAwO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNvbnN0IHBhcnNlcnMgPSBbXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvRnJvbSAoLispJC8sIChyZXN1bHQsIFtyZW1vdGVdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5yZW1vdGUgPSByZW1vdGU7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXFwqIFxcW25ldyBicmFuY2hdXFxzKyhcXFMrKVxccyotPiAoLispJC8sIChyZXN1bHQsIFtuYW1lLCB0cmFja2luZ10pID0+IHtcbiAgICAgICAgcmVzdWx0LmJyYW5jaGVzLnB1c2goe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRyYWNraW5nLFxuICAgICAgICB9KTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9cXCogXFxbbmV3IHRhZ11cXHMrKFxcUyspXFxzKi0+ICguKykkLywgKHJlc3VsdCwgW25hbWUsIHRyYWNraW5nXSkgPT4ge1xuICAgICAgICByZXN1bHQudGFncy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0cmFja2luZyxcbiAgICAgICAgfSk7XG4gICAgfSlcbl07XG5mdW5jdGlvbiBwYXJzZUZldGNoUmVzdWx0KHN0ZE91dCwgc3RkRXJyKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICByYXc6IHN0ZE91dCxcbiAgICAgICAgcmVtb3RlOiBudWxsLFxuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICAgIHRhZ3M6IFtdLFxuICAgIH07XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZShyZXN1bHQsIHBhcnNlcnMsIHN0ZE91dCwgc3RkRXJyKTtcbn1cbmV4cG9ydHMucGFyc2VGZXRjaFJlc3VsdCA9IHBhcnNlRmV0Y2hSZXN1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1mZXRjaC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZmV0Y2hUYXNrID0gdm9pZCAwO1xuY29uc3QgcGFyc2VfZmV0Y2hfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLWZldGNoXCIpO1xuZnVuY3Rpb24gZmV0Y2hUYXNrKHJlbW90ZSwgYnJhbmNoLCBjdXN0b21BcmdzKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbJ2ZldGNoJywgLi4uY3VzdG9tQXJnc107XG4gICAgaWYgKHJlbW90ZSAmJiBicmFuY2gpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaChyZW1vdGUsIGJyYW5jaCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcjogcGFyc2VfZmV0Y2hfMS5wYXJzZUZldGNoUmVzdWx0LFxuICAgIH07XG59XG5leHBvcnRzLmZldGNoVGFzayA9IGZldGNoVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZldGNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5oYXNoT2JqZWN0VGFzayA9IHZvaWQgMDtcbmNvbnN0IHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG4vKipcbiAqIFRhc2sgdXNlZCBieSBgZ2l0Lmhhc2hPYmplY3RgXG4gKi9cbmZ1bmN0aW9uIGhhc2hPYmplY3RUYXNrKGZpbGVQYXRoLCB3cml0ZSkge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gWydoYXNoLW9iamVjdCcsIGZpbGVQYXRoXTtcbiAgICBpZiAod3JpdGUpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnLXcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhc2tfMS5zdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzLCB0cnVlKTtcbn1cbmV4cG9ydHMuaGFzaE9iamVjdFRhc2sgPSBoYXNoT2JqZWN0VGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2gtb2JqZWN0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZUluaXQgPSBleHBvcnRzLkluaXRTdW1tYXJ5ID0gdm9pZCAwO1xuY2xhc3MgSW5pdFN1bW1hcnkge1xuICAgIGNvbnN0cnVjdG9yKGJhcmUsIHBhdGgsIGV4aXN0aW5nLCBnaXREaXIpIHtcbiAgICAgICAgdGhpcy5iYXJlID0gYmFyZTtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5leGlzdGluZyA9IGV4aXN0aW5nO1xuICAgICAgICB0aGlzLmdpdERpciA9IGdpdERpcjtcbiAgICB9XG59XG5leHBvcnRzLkluaXRTdW1tYXJ5ID0gSW5pdFN1bW1hcnk7XG5jb25zdCBpbml0UmVzcG9uc2VSZWdleCA9IC9eSW5pdC4rIHJlcG9zaXRvcnkgaW4gKC4rKSQvO1xuY29uc3QgcmVJbml0UmVzcG9uc2VSZWdleCA9IC9eUmVpbi4rIGluICguKykkLztcbmZ1bmN0aW9uIHBhcnNlSW5pdChiYXJlLCBwYXRoLCB0ZXh0KSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBTdHJpbmcodGV4dCkudHJpbSgpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKChyZXN1bHQgPSBpbml0UmVzcG9uc2VSZWdleC5leGVjKHJlc3BvbnNlKSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbml0U3VtbWFyeShiYXJlLCBwYXRoLCBmYWxzZSwgcmVzdWx0WzFdKTtcbiAgICB9XG4gICAgaWYgKChyZXN1bHQgPSByZUluaXRSZXNwb25zZVJlZ2V4LmV4ZWMocmVzcG9uc2UpKSkge1xuICAgICAgICByZXR1cm4gbmV3IEluaXRTdW1tYXJ5KGJhcmUsIHBhdGgsIHRydWUsIHJlc3VsdFsxXSk7XG4gICAgfVxuICAgIGxldCBnaXREaXIgPSAnJztcbiAgICBjb25zdCB0b2tlbnMgPSByZXNwb25zZS5zcGxpdCgnICcpO1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KCk7XG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ2luJykge1xuICAgICAgICAgICAgZ2l0RGlyID0gdG9rZW5zLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW5pdFN1bW1hcnkoYmFyZSwgcGF0aCwgL15yZS9pLnRlc3QocmVzcG9uc2UpLCBnaXREaXIpO1xufVxuZXhwb3J0cy5wYXJzZUluaXQgPSBwYXJzZUluaXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jbml0U3VtbWFyeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaW5pdFRhc2sgPSB2b2lkIDA7XG5jb25zdCBJbml0U3VtbWFyeV8xID0gcmVxdWlyZShcIi4uL3Jlc3BvbnNlcy9Jbml0U3VtbWFyeVwiKTtcbmNvbnN0IGJhcmVDb21tYW5kID0gJy0tYmFyZSc7XG5mdW5jdGlvbiBoYXNCYXJlQ29tbWFuZChjb21tYW5kKSB7XG4gICAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoYmFyZUNvbW1hbmQpO1xufVxuZnVuY3Rpb24gaW5pdFRhc2soYmFyZSA9IGZhbHNlLCBwYXRoLCBjdXN0b21BcmdzKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbJ2luaXQnLCAuLi5jdXN0b21BcmdzXTtcbiAgICBpZiAoYmFyZSAmJiAhaGFzQmFyZUNvbW1hbmQoY29tbWFuZHMpKSB7XG4gICAgICAgIGNvbW1hbmRzLnNwbGljZSgxLCAwLCBiYXJlQ29tbWFuZCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcih0ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gSW5pdFN1bW1hcnlfMS5wYXJzZUluaXQoY29tbWFuZHMuaW5jbHVkZXMoJy0tYmFyZScpLCBwYXRoLCB0ZXh0KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnRzLmluaXRUYXNrID0gaW5pdFRhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbml0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVMaXN0TG9nU3VtbWFyeVBhcnNlciA9IGV4cG9ydHMuU1BMSVRURVIgPSBleHBvcnRzLkNPTU1JVF9CT1VOREFSWSA9IGV4cG9ydHMuU1RBUlRfQk9VTkRBUlkgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgcGFyc2VfZGlmZl9zdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi9wYXJzZS1kaWZmLXN1bW1hcnlcIik7XG5leHBvcnRzLlNUQVJUX0JPVU5EQVJZID0gJ8Oyw7LDssOyw7LDsiAnO1xuZXhwb3J0cy5DT01NSVRfQk9VTkRBUlkgPSAnIMOyw7InO1xuZXhwb3J0cy5TUExJVFRFUiA9ICcgw7IgJztcbmNvbnN0IGRlZmF1bHRGaWVsZE5hbWVzID0gWydoYXNoJywgJ2RhdGUnLCAnbWVzc2FnZScsICdyZWZzJywgJ2F1dGhvcl9uYW1lJywgJ2F1dGhvcl9lbWFpbCddO1xuZnVuY3Rpb24gbGluZUJ1aWxkZXIodG9rZW5zLCBmaWVsZHMpIHtcbiAgICByZXR1cm4gZmllbGRzLnJlZHVjZSgobGluZSwgZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICAgIGxpbmVbZmllbGRdID0gdG9rZW5zW2luZGV4XSB8fCAnJztcbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfSwgT2JqZWN0LmNyZWF0ZSh7IGRpZmY6IG51bGwgfSkpO1xufVxuZnVuY3Rpb24gY3JlYXRlTGlzdExvZ1N1bW1hcnlQYXJzZXIoc3BsaXR0ZXIgPSBleHBvcnRzLlNQTElUVEVSLCBmaWVsZHMgPSBkZWZhdWx0RmllbGROYW1lcykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RkT3V0KSB7XG4gICAgICAgIGNvbnN0IGFsbCA9IHV0aWxzXzEudG9MaW5lc1dpdGhDb250ZW50KHN0ZE91dCwgdHJ1ZSwgZXhwb3J0cy5TVEFSVF9CT1VOREFSWSlcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVEZXRhaWwgPSBpdGVtLnRyaW0oKS5zcGxpdChleHBvcnRzLkNPTU1JVF9CT1VOREFSWSk7XG4gICAgICAgICAgICBjb25zdCBsaXN0TG9nTGluZSA9IGxpbmVCdWlsZGVyKGxpbmVEZXRhaWxbMF0udHJpbSgpLnNwbGl0KHNwbGl0dGVyKSwgZmllbGRzKTtcbiAgICAgICAgICAgIGlmIChsaW5lRGV0YWlsLmxlbmd0aCA+IDEgJiYgISFsaW5lRGV0YWlsWzFdLnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIGxpc3RMb2dMaW5lLmRpZmYgPSBwYXJzZV9kaWZmX3N1bW1hcnlfMS5wYXJzZURpZmZSZXN1bHQobGluZURldGFpbFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbGlzdExvZ0xpbmU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsLFxuICAgICAgICAgICAgbGF0ZXN0OiBhbGwubGVuZ3RoICYmIGFsbFswXSB8fCBudWxsLFxuICAgICAgICAgICAgdG90YWw6IGFsbC5sZW5ndGgsXG4gICAgICAgIH07XG4gICAgfTtcbn1cbmV4cG9ydHMuY3JlYXRlTGlzdExvZ1N1bW1hcnlQYXJzZXIgPSBjcmVhdGVMaXN0TG9nU3VtbWFyeVBhcnNlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLWxpc3QtbG9nLXN1bW1hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmxvZ1Rhc2sgPSBleHBvcnRzLnBhcnNlTG9nT3B0aW9ucyA9IHZvaWQgMDtcbmNvbnN0IHBhcnNlX2xpc3RfbG9nX3N1bW1hcnlfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLWxpc3QtbG9nLXN1bW1hcnlcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xudmFyIGV4Y2x1ZGVPcHRpb25zO1xuKGZ1bmN0aW9uIChleGNsdWRlT3B0aW9ucykge1xuICAgIGV4Y2x1ZGVPcHRpb25zW2V4Y2x1ZGVPcHRpb25zW1wiLS1wcmV0dHlcIl0gPSAwXSA9IFwiLS1wcmV0dHlcIjtcbiAgICBleGNsdWRlT3B0aW9uc1tleGNsdWRlT3B0aW9uc1tcIm1heC1jb3VudFwiXSA9IDFdID0gXCJtYXgtY291bnRcIjtcbiAgICBleGNsdWRlT3B0aW9uc1tleGNsdWRlT3B0aW9uc1tcIm1heENvdW50XCJdID0gMl0gPSBcIm1heENvdW50XCI7XG4gICAgZXhjbHVkZU9wdGlvbnNbZXhjbHVkZU9wdGlvbnNbXCJuXCJdID0gM10gPSBcIm5cIjtcbiAgICBleGNsdWRlT3B0aW9uc1tleGNsdWRlT3B0aW9uc1tcImZpbGVcIl0gPSA0XSA9IFwiZmlsZVwiO1xuICAgIGV4Y2x1ZGVPcHRpb25zW2V4Y2x1ZGVPcHRpb25zW1wiZm9ybWF0XCJdID0gNV0gPSBcImZvcm1hdFwiO1xuICAgIGV4Y2x1ZGVPcHRpb25zW2V4Y2x1ZGVPcHRpb25zW1wiZnJvbVwiXSA9IDZdID0gXCJmcm9tXCI7XG4gICAgZXhjbHVkZU9wdGlvbnNbZXhjbHVkZU9wdGlvbnNbXCJ0b1wiXSA9IDddID0gXCJ0b1wiO1xuICAgIGV4Y2x1ZGVPcHRpb25zW2V4Y2x1ZGVPcHRpb25zW1wic3BsaXR0ZXJcIl0gPSA4XSA9IFwic3BsaXR0ZXJcIjtcbiAgICBleGNsdWRlT3B0aW9uc1tleGNsdWRlT3B0aW9uc1tcInN5bW1ldHJpY1wiXSA9IDldID0gXCJzeW1tZXRyaWNcIjtcbiAgICBleGNsdWRlT3B0aW9uc1tleGNsdWRlT3B0aW9uc1tcIm11bHRpTGluZVwiXSA9IDEwXSA9IFwibXVsdGlMaW5lXCI7XG4gICAgZXhjbHVkZU9wdGlvbnNbZXhjbHVkZU9wdGlvbnNbXCJzdHJpY3REYXRlXCJdID0gMTFdID0gXCJzdHJpY3REYXRlXCI7XG59KShleGNsdWRlT3B0aW9ucyB8fCAoZXhjbHVkZU9wdGlvbnMgPSB7fSkpO1xuZnVuY3Rpb24gcHJldHR5Rm9ybWF0KGZvcm1hdCwgc3BsaXR0ZXIpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBbXTtcbiAgICBjb25zdCBmb3JtYXRTdHIgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhmb3JtYXQpLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgZm9ybWF0U3RyLnB1c2goU3RyaW5nKGZvcm1hdFtmaWVsZF0pKTtcbiAgICB9KTtcbiAgICByZXR1cm4gW1xuICAgICAgICBmaWVsZHMsIGZvcm1hdFN0ci5qb2luKHNwbGl0dGVyKVxuICAgIF07XG59XG5mdW5jdGlvbiB1c2VyT3B0aW9ucyhpbnB1dCkge1xuICAgIGNvbnN0IG91dHB1dCA9IE9iamVjdC5hc3NpZ24oe30sIGlucHV0KTtcbiAgICBPYmplY3Qua2V5cyhpbnB1dCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIGV4Y2x1ZGVPcHRpb25zKSB7XG4gICAgICAgICAgICBkZWxldGUgb3V0cHV0W2tleV07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuZnVuY3Rpb24gcGFyc2VMb2dPcHRpb25zKG9wdCA9IHt9LCBjdXN0b21BcmdzID0gW10pIHtcbiAgICBjb25zdCBzcGxpdHRlciA9IG9wdC5zcGxpdHRlciB8fCBwYXJzZV9saXN0X2xvZ19zdW1tYXJ5XzEuU1BMSVRURVI7XG4gICAgY29uc3QgZm9ybWF0ID0gb3B0LmZvcm1hdCB8fCB7XG4gICAgICAgIGhhc2g6ICclSCcsXG4gICAgICAgIGRhdGU6IG9wdC5zdHJpY3REYXRlID09PSBmYWxzZSA/ICclYWknIDogJyVhSScsXG4gICAgICAgIG1lc3NhZ2U6ICclcycsXG4gICAgICAgIHJlZnM6ICclRCcsXG4gICAgICAgIGJvZHk6IG9wdC5tdWx0aUxpbmUgPyAnJUInIDogJyViJyxcbiAgICAgICAgYXV0aG9yX25hbWU6ICclYU4nLFxuICAgICAgICBhdXRob3JfZW1haWw6ICclYWUnXG4gICAgfTtcbiAgICBjb25zdCBbZmllbGRzLCBmb3JtYXRTdHJdID0gcHJldHR5Rm9ybWF0KGZvcm1hdCwgc3BsaXR0ZXIpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IFtdO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBbXG4gICAgICAgIGAtLXByZXR0eT1mb3JtYXQ6JHtwYXJzZV9saXN0X2xvZ19zdW1tYXJ5XzEuU1RBUlRfQk9VTkRBUll9JHtmb3JtYXRTdHJ9JHtwYXJzZV9saXN0X2xvZ19zdW1tYXJ5XzEuQ09NTUlUX0JPVU5EQVJZfWAsXG4gICAgICAgIC4uLmN1c3RvbUFyZ3MsXG4gICAgXTtcbiAgICBjb25zdCBtYXhDb3VudCA9IG9wdC5uIHx8IG9wdFsnbWF4LWNvdW50J10gfHwgb3B0Lm1heENvdW50O1xuICAgIGlmIChtYXhDb3VudCkge1xuICAgICAgICBjb21tYW5kLnB1c2goYC0tbWF4LWNvdW50PSR7bWF4Q291bnR9YCk7XG4gICAgfVxuICAgIGlmIChvcHQuZnJvbSAmJiBvcHQudG8pIHtcbiAgICAgICAgY29uc3QgcmFuZ2VPcGVyYXRvciA9IChvcHQuc3ltbWV0cmljICE9PSBmYWxzZSkgPyAnLi4uJyA6ICcuLic7XG4gICAgICAgIHN1ZmZpeC5wdXNoKGAke29wdC5mcm9tfSR7cmFuZ2VPcGVyYXRvcn0ke29wdC50b31gKTtcbiAgICB9XG4gICAgaWYgKG9wdC5maWxlKSB7XG4gICAgICAgIHN1ZmZpeC5wdXNoKCctLWZvbGxvdycsIG9wdC5maWxlKTtcbiAgICB9XG4gICAgdXRpbHNfMS5hcHBlbmRUYXNrT3B0aW9ucyh1c2VyT3B0aW9ucyhvcHQpLCBjb21tYW5kKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmaWVsZHMsXG4gICAgICAgIHNwbGl0dGVyLFxuICAgICAgICBjb21tYW5kczogW1xuICAgICAgICAgICAgLi4uY29tbWFuZCxcbiAgICAgICAgICAgIC4uLnN1ZmZpeCxcbiAgICAgICAgXSxcbiAgICB9O1xufVxuZXhwb3J0cy5wYXJzZUxvZ09wdGlvbnMgPSBwYXJzZUxvZ09wdGlvbnM7XG5mdW5jdGlvbiBsb2dUYXNrKHNwbGl0dGVyLCBmaWVsZHMsIGN1c3RvbUFyZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogWydsb2cnLCAuLi5jdXN0b21BcmdzXSxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXI6IHBhcnNlX2xpc3RfbG9nX3N1bW1hcnlfMS5jcmVhdGVMaXN0TG9nU3VtbWFyeVBhcnNlcihzcGxpdHRlciwgZmllbGRzKSxcbiAgICB9O1xufVxuZXhwb3J0cy5sb2dUYXNrID0gbG9nVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTWVyZ2VTdW1tYXJ5RGV0YWlsID0gZXhwb3J0cy5NZXJnZVN1bW1hcnlDb25mbGljdCA9IHZvaWQgMDtcbmNsYXNzIE1lcmdlU3VtbWFyeUNvbmZsaWN0IHtcbiAgICBjb25zdHJ1Y3RvcihyZWFzb24sIGZpbGUgPSBudWxsLCBtZXRhKSB7XG4gICAgICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICAgICAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgICAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZmlsZX06JHt0aGlzLnJlYXNvbn1gO1xuICAgIH1cbn1cbmV4cG9ydHMuTWVyZ2VTdW1tYXJ5Q29uZmxpY3QgPSBNZXJnZVN1bW1hcnlDb25mbGljdDtcbmNsYXNzIE1lcmdlU3VtbWFyeURldGFpbCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29uZmxpY3RzID0gW107XG4gICAgICAgIHRoaXMubWVyZ2VzID0gW107XG4gICAgICAgIHRoaXMucmVzdWx0ID0gJ3N1Y2Nlc3MnO1xuICAgIH1cbiAgICBnZXQgZmFpbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25mbGljdHMubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgZ2V0IHJlYXNvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmxpY3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGBDT05GTElDVFM6ICR7dGhpcy5jb25mbGljdHMuam9pbignLCAnKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnT0snO1xuICAgIH1cbn1cbmV4cG9ydHMuTWVyZ2VTdW1tYXJ5RGV0YWlsID0gTWVyZ2VTdW1tYXJ5RGV0YWlsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWVyZ2VTdW1tYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5QdWxsU3VtbWFyeSA9IHZvaWQgMDtcbmNsYXNzIFB1bGxTdW1tYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5yZW1vdGVNZXNzYWdlcyA9IHtcbiAgICAgICAgICAgIGFsbDogW10sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY3JlYXRlZCA9IFtdO1xuICAgICAgICB0aGlzLmRlbGV0ZWQgPSBbXTtcbiAgICAgICAgdGhpcy5maWxlcyA9IFtdO1xuICAgICAgICB0aGlzLmRlbGV0aW9ucyA9IHt9O1xuICAgICAgICB0aGlzLmluc2VydGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5ID0ge1xuICAgICAgICAgICAgY2hhbmdlczogMCxcbiAgICAgICAgICAgIGRlbGV0aW9uczogMCxcbiAgICAgICAgICAgIGluc2VydGlvbnM6IDAsXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5QdWxsU3VtbWFyeSA9IFB1bGxTdW1tYXJ5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHVsbFN1bW1hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlUHVsbFJlc3VsdCA9IGV4cG9ydHMucGFyc2VQdWxsRGV0YWlsID0gdm9pZCAwO1xuY29uc3QgUHVsbFN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuLi9yZXNwb25zZXMvUHVsbFN1bW1hcnlcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgcGFyc2VfcmVtb3RlX21lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9wYXJzZS1yZW1vdGUtbWVzc2FnZXNcIik7XG5jb25zdCBGSUxFX1VQREFURV9SRUdFWCA9IC9eXFxzKiguKz8pXFxzK1xcfFxccytcXGQrXFxzKihcXCsqKSgtKikvO1xuY29uc3QgU1VNTUFSWV9SRUdFWCA9IC8oXFxkKylcXEQrKChcXGQrKVxcRCtcXChcXCtcXCkpPyhcXEQrKFxcZCspXFxEK1xcKC1cXCkpPy87XG5jb25zdCBBQ1RJT05fUkVHRVggPSAvXihjcmVhdGV8ZGVsZXRlKSBtb2RlIFxcZCsgKC4rKS87XG5jb25zdCBwYXJzZXJzID0gW1xuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoRklMRV9VUERBVEVfUkVHRVgsIChyZXN1bHQsIFtmaWxlLCBpbnNlcnRpb25zLCBkZWxldGlvbnNdKSA9PiB7XG4gICAgICAgIHJlc3VsdC5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICBpZiAoaW5zZXJ0aW9ucykge1xuICAgICAgICAgICAgcmVzdWx0Lmluc2VydGlvbnNbZmlsZV0gPSBpbnNlcnRpb25zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVsZXRpb25zKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVsZXRpb25zW2ZpbGVdID0gZGVsZXRpb25zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoU1VNTUFSWV9SRUdFWCwgKHJlc3VsdCwgW2NoYW5nZXMsICwgaW5zZXJ0aW9ucywgLCBkZWxldGlvbnNdKSA9PiB7XG4gICAgICAgIGlmIChpbnNlcnRpb25zICE9PSB1bmRlZmluZWQgfHwgZGVsZXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdW1tYXJ5LmNoYW5nZXMgPSArY2hhbmdlcyB8fCAwO1xuICAgICAgICAgICAgcmVzdWx0LnN1bW1hcnkuaW5zZXJ0aW9ucyA9ICtpbnNlcnRpb25zIHx8IDA7XG4gICAgICAgICAgICByZXN1bHQuc3VtbWFyeS5kZWxldGlvbnMgPSArZGVsZXRpb25zIHx8IDA7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcihBQ1RJT05fUkVHRVgsIChyZXN1bHQsIFthY3Rpb24sIGZpbGVdKSA9PiB7XG4gICAgICAgIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5maWxlcywgZmlsZSk7XG4gICAgICAgIHV0aWxzXzEuYXBwZW5kKChhY3Rpb24gPT09ICdjcmVhdGUnKSA/IHJlc3VsdC5jcmVhdGVkIDogcmVzdWx0LmRlbGV0ZWQsIGZpbGUpO1xuICAgIH0pLFxuXTtcbmNvbnN0IHBhcnNlUHVsbERldGFpbCA9IChzdGRPdXQsIHN0ZEVycikgPT4ge1xuICAgIHJldHVybiB1dGlsc18xLnBhcnNlU3RyaW5nUmVzcG9uc2UobmV3IFB1bGxTdW1tYXJ5XzEuUHVsbFN1bW1hcnkoKSwgcGFyc2Vycywgc3RkT3V0LCBzdGRFcnIpO1xufTtcbmV4cG9ydHMucGFyc2VQdWxsRGV0YWlsID0gcGFyc2VQdWxsRGV0YWlsO1xuY29uc3QgcGFyc2VQdWxsUmVzdWx0ID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFB1bGxTdW1tYXJ5XzEuUHVsbFN1bW1hcnkoKSwgZXhwb3J0cy5wYXJzZVB1bGxEZXRhaWwoc3RkT3V0LCBzdGRFcnIpLCBwYXJzZV9yZW1vdGVfbWVzc2FnZXNfMS5wYXJzZVJlbW90ZU1lc3NhZ2VzKHN0ZE91dCwgc3RkRXJyKSk7XG59O1xuZXhwb3J0cy5wYXJzZVB1bGxSZXN1bHQgPSBwYXJzZVB1bGxSZXN1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1wdWxsLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZU1lcmdlRGV0YWlsID0gZXhwb3J0cy5wYXJzZU1lcmdlUmVzdWx0ID0gdm9pZCAwO1xuY29uc3QgTWVyZ2VTdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcmVzcG9uc2VzL01lcmdlU3VtbWFyeVwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBwYXJzZV9wdWxsXzEgPSByZXF1aXJlKFwiLi9wYXJzZS1wdWxsXCIpO1xuY29uc3QgcGFyc2VycyA9IFtcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eQXV0by1tZXJnaW5nXFxzKyguKykkLywgKHN1bW1hcnksIFthdXRvTWVyZ2VdKSA9PiB7XG4gICAgICAgIHN1bW1hcnkubWVyZ2VzLnB1c2goYXV0b01lcmdlKTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eQ09ORkxJQ1RcXHMrXFwoKC4rKVxcKTogTWVyZ2UgY29uZmxpY3QgaW4gKC4rKSQvLCAoc3VtbWFyeSwgW3JlYXNvbiwgZmlsZV0pID0+IHtcbiAgICAgICAgc3VtbWFyeS5jb25mbGljdHMucHVzaChuZXcgTWVyZ2VTdW1tYXJ5XzEuTWVyZ2VTdW1tYXJ5Q29uZmxpY3QocmVhc29uLCBmaWxlKSk7XG4gICAgfSksXG4gICAgbmV3IHV0aWxzXzEuTGluZVBhcnNlcigvXkNPTkZMSUNUXFxzK1xcKCguK1xcL2RlbGV0ZSlcXCk6ICguKykgZGVsZXRlZCBpbiAoLispIGFuZC8sIChzdW1tYXJ5LCBbcmVhc29uLCBmaWxlLCBkZWxldGVSZWZdKSA9PiB7XG4gICAgICAgIHN1bW1hcnkuY29uZmxpY3RzLnB1c2gobmV3IE1lcmdlU3VtbWFyeV8xLk1lcmdlU3VtbWFyeUNvbmZsaWN0KHJlYXNvbiwgZmlsZSwgeyBkZWxldGVSZWYgfSkpO1xuICAgIH0pLFxuICAgIG5ldyB1dGlsc18xLkxpbmVQYXJzZXIoL15DT05GTElDVFxccytcXCgoLispXFwpOi8sIChzdW1tYXJ5LCBbcmVhc29uXSkgPT4ge1xuICAgICAgICBzdW1tYXJ5LmNvbmZsaWN0cy5wdXNoKG5ldyBNZXJnZVN1bW1hcnlfMS5NZXJnZVN1bW1hcnlDb25mbGljdChyZWFzb24sIG51bGwpKTtcbiAgICB9KSxcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eQXV0b21hdGljIG1lcmdlIGZhaWxlZDtcXHMrKC4rKSQvLCAoc3VtbWFyeSwgW3Jlc3VsdF0pID0+IHtcbiAgICAgICAgc3VtbWFyeS5yZXN1bHQgPSByZXN1bHQ7XG4gICAgfSksXG5dO1xuLyoqXG4gKiBQYXJzZSB0aGUgY29tcGxldGUgcmVzcG9uc2UgZnJvbSBgZ2l0Lm1lcmdlYFxuICovXG5jb25zdCBwYXJzZU1lcmdlUmVzdWx0ID0gKHN0ZE91dCwgc3RkRXJyKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZXhwb3J0cy5wYXJzZU1lcmdlRGV0YWlsKHN0ZE91dCwgc3RkRXJyKSwgcGFyc2VfcHVsbF8xLnBhcnNlUHVsbFJlc3VsdChzdGRPdXQsIHN0ZEVycikpO1xufTtcbmV4cG9ydHMucGFyc2VNZXJnZVJlc3VsdCA9IHBhcnNlTWVyZ2VSZXN1bHQ7XG4vKipcbiAqIFBhcnNlIHRoZSBtZXJnZSBzcGVjaWZpYyBkZXRhaWwgKGllOiBub3QgdGhlIGNvbnRlbnQgYWxzbyBhdmFpbGFibGUgaW4gdGhlIHB1bGwgZGV0YWlsKSBmcm9tIGBnaXQubW5lcmdlYFxuICogQHBhcmFtIHN0ZE91dFxuICovXG5jb25zdCBwYXJzZU1lcmdlRGV0YWlsID0gKHN0ZE91dCkgPT4ge1xuICAgIHJldHVybiB1dGlsc18xLnBhcnNlU3RyaW5nUmVzcG9uc2UobmV3IE1lcmdlU3VtbWFyeV8xLk1lcmdlU3VtbWFyeURldGFpbCgpLCBwYXJzZXJzLCBzdGRPdXQpO1xufTtcbmV4cG9ydHMucGFyc2VNZXJnZURldGFpbCA9IHBhcnNlTWVyZ2VEZXRhaWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1tZXJnZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubWVyZ2VUYXNrID0gdm9pZCAwO1xuY29uc3QgZ2l0X3Jlc3BvbnNlX2Vycm9yXzEgPSByZXF1aXJlKFwiLi4vZXJyb3JzL2dpdC1yZXNwb25zZS1lcnJvclwiKTtcbmNvbnN0IHBhcnNlX21lcmdlXzEgPSByZXF1aXJlKFwiLi4vcGFyc2Vycy9wYXJzZS1tZXJnZVwiKTtcbmNvbnN0IHRhc2tfMSA9IHJlcXVpcmUoXCIuL3Rhc2tcIik7XG5mdW5jdGlvbiBtZXJnZVRhc2soY3VzdG9tQXJncykge1xuICAgIGlmICghY3VzdG9tQXJncy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRhc2tfMS5jb25maWd1cmF0aW9uRXJyb3JUYXNrKCdHaXQubWVyZ2UgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIG9wdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogWydtZXJnZScsIC4uLmN1c3RvbUFyZ3NdLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcihzdGRPdXQsIHN0ZEVycikge1xuICAgICAgICAgICAgY29uc3QgbWVyZ2UgPSBwYXJzZV9tZXJnZV8xLnBhcnNlTWVyZ2VSZXN1bHQoc3RkT3V0LCBzdGRFcnIpO1xuICAgICAgICAgICAgaWYgKG1lcmdlLmZhaWxlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBnaXRfcmVzcG9uc2VfZXJyb3JfMS5HaXRSZXNwb25zZUVycm9yKG1lcmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXJnZTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnRzLm1lcmdlVGFzayA9IG1lcmdlVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lcmdlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZU1vdmVSZXN1bHQgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgcGFyc2VycyA9IFtcbiAgICBuZXcgdXRpbHNfMS5MaW5lUGFyc2VyKC9eUmVuYW1pbmcgKC4rKSB0byAoLispJC8sIChyZXN1bHQsIFtmcm9tLCB0b10pID0+IHtcbiAgICAgICAgcmVzdWx0Lm1vdmVzLnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICB9KSxcbl07XG5mdW5jdGlvbiBwYXJzZU1vdmVSZXN1bHQoc3RkT3V0KSB7XG4gICAgcmV0dXJuIHV0aWxzXzEucGFyc2VTdHJpbmdSZXNwb25zZSh7IG1vdmVzOiBbXSB9LCBwYXJzZXJzLCBzdGRPdXQpO1xufVxuZXhwb3J0cy5wYXJzZU1vdmVSZXN1bHQgPSBwYXJzZU1vdmVSZXN1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1tb3ZlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5tb3ZlVGFzayA9IHZvaWQgMDtcbmNvbnN0IHBhcnNlX21vdmVfMSA9IHJlcXVpcmUoXCIuLi9wYXJzZXJzL3BhcnNlLW1vdmVcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gbW92ZVRhc2soZnJvbSwgdG8pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogWydtdicsICctdicsIC4uLnV0aWxzXzEuYXNBcnJheShmcm9tKSwgdG9dLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcjogcGFyc2VfbW92ZV8xLnBhcnNlTW92ZVJlc3VsdCxcbiAgICB9O1xufVxuZXhwb3J0cy5tb3ZlVGFzayA9IG1vdmVUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW92ZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHVsbFRhc2sgPSB2b2lkIDA7XG5jb25zdCBwYXJzZV9wdWxsXzEgPSByZXF1aXJlKFwiLi4vcGFyc2Vycy9wYXJzZS1wdWxsXCIpO1xuZnVuY3Rpb24gcHVsbFRhc2socmVtb3RlLCBicmFuY2gsIGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsncHVsbCcsIC4uLmN1c3RvbUFyZ3NdO1xuICAgIGlmIChyZW1vdGUgJiYgYnJhbmNoKSB7XG4gICAgICAgIGNvbW1hbmRzLnNwbGljZSgxLCAwLCByZW1vdGUsIGJyYW5jaCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIHBhcnNlcihzdGRPdXQsIHN0ZEVycikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlX3B1bGxfMS5wYXJzZVB1bGxSZXN1bHQoc3RkT3V0LCBzdGRFcnIpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMucHVsbFRhc2sgPSBwdWxsVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXB1bGwuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlR2V0UmVtb3Rlc1ZlcmJvc2UgPSBleHBvcnRzLnBhcnNlR2V0UmVtb3RlcyA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5mdW5jdGlvbiBwYXJzZUdldFJlbW90ZXModGV4dCkge1xuICAgIGNvbnN0IHJlbW90ZXMgPSB7fTtcbiAgICBmb3JFYWNoKHRleHQsIChbbmFtZV0pID0+IHJlbW90ZXNbbmFtZV0gPSB7IG5hbWUgfSk7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVtb3Rlcyk7XG59XG5leHBvcnRzLnBhcnNlR2V0UmVtb3RlcyA9IHBhcnNlR2V0UmVtb3RlcztcbmZ1bmN0aW9uIHBhcnNlR2V0UmVtb3Rlc1ZlcmJvc2UodGV4dCkge1xuICAgIGNvbnN0IHJlbW90ZXMgPSB7fTtcbiAgICBmb3JFYWNoKHRleHQsIChbbmFtZSwgdXJsLCBwdXJwb3NlXSkgPT4ge1xuICAgICAgICBpZiAoIXJlbW90ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIHJlbW90ZXNbbmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICByZWZzOiB7IGZldGNoOiAnJywgcHVzaDogJycgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHB1cnBvc2UgJiYgdXJsKSB7XG4gICAgICAgICAgICByZW1vdGVzW25hbWVdLnJlZnNbcHVycG9zZS5yZXBsYWNlKC9bXmEtel0vZywgJycpXSA9IHVybDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJlbW90ZXMpO1xufVxuZXhwb3J0cy5wYXJzZUdldFJlbW90ZXNWZXJib3NlID0gcGFyc2VHZXRSZW1vdGVzVmVyYm9zZTtcbmZ1bmN0aW9uIGZvckVhY2godGV4dCwgaGFuZGxlcikge1xuICAgIHV0aWxzXzEuZm9yRWFjaExpbmVXaXRoQ29udGVudCh0ZXh0LCAobGluZSkgPT4gaGFuZGxlcihsaW5lLnNwbGl0KC9cXHMrLykpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdldFJlbW90ZVN1bW1hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlbW92ZVJlbW90ZVRhc2sgPSBleHBvcnRzLnJlbW90ZVRhc2sgPSBleHBvcnRzLmxpc3RSZW1vdGVzVGFzayA9IGV4cG9ydHMuZ2V0UmVtb3Rlc1Rhc2sgPSBleHBvcnRzLmFkZFJlbW90ZVRhc2sgPSB2b2lkIDA7XG5jb25zdCBHZXRSZW1vdGVTdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi4vcmVzcG9uc2VzL0dldFJlbW90ZVN1bW1hcnlcIik7XG5jb25zdCB0YXNrXzEgPSByZXF1aXJlKFwiLi90YXNrXCIpO1xuZnVuY3Rpb24gYWRkUmVtb3RlVGFzayhyZW1vdGVOYW1lLCByZW1vdGVSZXBvLCBjdXN0b21BcmdzID0gW10pIHtcbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydyZW1vdGUnLCAnYWRkJywgLi4uY3VzdG9tQXJncywgcmVtb3RlTmFtZSwgcmVtb3RlUmVwb10pO1xufVxuZXhwb3J0cy5hZGRSZW1vdGVUYXNrID0gYWRkUmVtb3RlVGFzaztcbmZ1bmN0aW9uIGdldFJlbW90ZXNUYXNrKHZlcmJvc2UpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsncmVtb3RlJ107XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnLXYnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgICAgcGFyc2VyOiB2ZXJib3NlID8gR2V0UmVtb3RlU3VtbWFyeV8xLnBhcnNlR2V0UmVtb3Rlc1ZlcmJvc2UgOiBHZXRSZW1vdGVTdW1tYXJ5XzEucGFyc2VHZXRSZW1vdGVzLFxuICAgIH07XG59XG5leHBvcnRzLmdldFJlbW90ZXNUYXNrID0gZ2V0UmVtb3Rlc1Rhc2s7XG5mdW5jdGlvbiBsaXN0UmVtb3Rlc1Rhc2soY3VzdG9tQXJncyA9IFtdKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBbLi4uY3VzdG9tQXJnc107XG4gICAgaWYgKGNvbW1hbmRzWzBdICE9PSAnbHMtcmVtb3RlJykge1xuICAgICAgICBjb21tYW5kcy51bnNoaWZ0KCdscy1yZW1vdGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhc2tfMS5zdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzKTtcbn1cbmV4cG9ydHMubGlzdFJlbW90ZXNUYXNrID0gbGlzdFJlbW90ZXNUYXNrO1xuZnVuY3Rpb24gcmVtb3RlVGFzayhjdXN0b21BcmdzID0gW10pIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsuLi5jdXN0b21BcmdzXTtcbiAgICBpZiAoY29tbWFuZHNbMF0gIT09ICdyZW1vdGUnKSB7XG4gICAgICAgIGNvbW1hbmRzLnVuc2hpZnQoJ3JlbW90ZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMpO1xufVxuZXhwb3J0cy5yZW1vdGVUYXNrID0gcmVtb3RlVGFzaztcbmZ1bmN0aW9uIHJlbW92ZVJlbW90ZVRhc2socmVtb3RlTmFtZSkge1xuICAgIHJldHVybiB0YXNrXzEuc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhbJ3JlbW90ZScsICdyZW1vdmUnLCByZW1vdGVOYW1lXSk7XG59XG5leHBvcnRzLnJlbW92ZVJlbW90ZVRhc2sgPSByZW1vdmVSZW1vdGVUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVtb3RlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdGFzaExpc3RUYXNrID0gdm9pZCAwO1xuY29uc3QgcGFyc2VfbGlzdF9sb2dfc3VtbWFyeV8xID0gcmVxdWlyZShcIi4uL3BhcnNlcnMvcGFyc2UtbGlzdC1sb2ctc3VtbWFyeVwiKTtcbmNvbnN0IGxvZ18xID0gcmVxdWlyZShcIi4vbG9nXCIpO1xuZnVuY3Rpb24gc3Rhc2hMaXN0VGFzayhvcHQgPSB7fSwgY3VzdG9tQXJncykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBsb2dfMS5wYXJzZUxvZ09wdGlvbnMob3B0KTtcbiAgICBjb25zdCBwYXJzZXIgPSBwYXJzZV9saXN0X2xvZ19zdW1tYXJ5XzEuY3JlYXRlTGlzdExvZ1N1bW1hcnlQYXJzZXIob3B0aW9ucy5zcGxpdHRlciwgb3B0aW9ucy5maWVsZHMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmRzOiBbJ3N0YXNoJywgJ2xpc3QnLCAuLi5vcHRpb25zLmNvbW1hbmRzLCAuLi5jdXN0b21BcmdzXSxcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBwYXJzZXIsXG4gICAgfTtcbn1cbmV4cG9ydHMuc3Rhc2hMaXN0VGFzayA9IHN0YXNoTGlzdFRhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGFzaC1saXN0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5GaWxlU3RhdHVzU3VtbWFyeSA9IGV4cG9ydHMuZnJvbVBhdGhSZWdleCA9IHZvaWQgMDtcbmV4cG9ydHMuZnJvbVBhdGhSZWdleCA9IC9eKC4rKSAtPiAoLispJC87XG5jbGFzcyBGaWxlU3RhdHVzU3VtbWFyeSB7XG4gICAgY29uc3RydWN0b3IocGF0aCwgaW5kZXgsIHdvcmtpbmdfZGlyKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy53b3JraW5nX2RpciA9IHdvcmtpbmdfZGlyO1xuICAgICAgICBpZiAoJ1InID09PSAoaW5kZXggKyB3b3JraW5nX2RpcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbCA9IGV4cG9ydHMuZnJvbVBhdGhSZWdleC5leGVjKHBhdGgpIHx8IFtudWxsLCBwYXRoLCBwYXRoXTtcbiAgICAgICAgICAgIHRoaXMuZnJvbSA9IGRldGFpbFsxXSB8fCAnJztcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IGRldGFpbFsyXSB8fCAnJztcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuRmlsZVN0YXR1c1N1bW1hcnkgPSBGaWxlU3RhdHVzU3VtbWFyeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbGVTdGF0dXNTdW1tYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZVN0YXR1c1N1bW1hcnkgPSBleHBvcnRzLlN0YXR1c1N1bW1hcnkgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgRmlsZVN0YXR1c1N1bW1hcnlfMSA9IHJlcXVpcmUoXCIuL0ZpbGVTdGF0dXNTdW1tYXJ5XCIpO1xuLyoqXG4gKiBUaGUgU3RhdHVzU3VtbWFyeSBpcyByZXR1cm5lZCBhcyBhIHJlc3BvbnNlIHRvIGdldHRpbmcgYGdpdCgpLnN0YXR1cygpYFxuICovXG5jbGFzcyBTdGF0dXNTdW1tYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ub3RfYWRkZWQgPSBbXTtcbiAgICAgICAgdGhpcy5jb25mbGljdGVkID0gW107XG4gICAgICAgIHRoaXMuY3JlYXRlZCA9IFtdO1xuICAgICAgICB0aGlzLmRlbGV0ZWQgPSBbXTtcbiAgICAgICAgdGhpcy5tb2RpZmllZCA9IFtdO1xuICAgICAgICB0aGlzLnJlbmFtZWQgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbCBmaWxlcyByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGBwYXRoYCBhbmQgc3RhdHVzIGluIGBpbmRleGAgYW5kXG4gICAgICAgICAqIGluIHRoZSBgd29ya2luZ19kaXJgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWxlcyA9IFtdO1xuICAgICAgICB0aGlzLnN0YWdlZCA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTnVtYmVyIG9mIGNvbW1pdHMgYWhlYWQgb2YgdGhlIHRyYWNrZWQgYnJhbmNoXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFoZWFkID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqTnVtYmVyIG9mIGNvbW1pdHMgYmVoaW5kIHRoZSB0cmFja2VkIGJyYW5jaFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iZWhpbmQgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogTmFtZSBvZiB0aGUgY3VycmVudCBicmFuY2hcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOYW1lIG9mIHRoZSBicmFuY2ggYmVpbmcgdHJhY2tlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmFja2luZyA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGlzIFN0YXR1c1N1bW1hcnkgcmVwcmVzZW50cyBhIGNsZWFuIHdvcmtpbmcgYnJhbmNoLlxuICAgICAqL1xuICAgIGlzQ2xlYW4oKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5maWxlcy5sZW5ndGg7XG4gICAgfVxufVxuZXhwb3J0cy5TdGF0dXNTdW1tYXJ5ID0gU3RhdHVzU3VtbWFyeTtcbnZhciBQb3JjZWxhaW5GaWxlU3RhdHVzO1xuKGZ1bmN0aW9uIChQb3JjZWxhaW5GaWxlU3RhdHVzKSB7XG4gICAgUG9yY2VsYWluRmlsZVN0YXR1c1tcIkFEREVEXCJdID0gXCJBXCI7XG4gICAgUG9yY2VsYWluRmlsZVN0YXR1c1tcIkRFTEVURURcIl0gPSBcIkRcIjtcbiAgICBQb3JjZWxhaW5GaWxlU3RhdHVzW1wiTU9ESUZJRURcIl0gPSBcIk1cIjtcbiAgICBQb3JjZWxhaW5GaWxlU3RhdHVzW1wiUkVOQU1FRFwiXSA9IFwiUlwiO1xuICAgIFBvcmNlbGFpbkZpbGVTdGF0dXNbXCJDT1BJRURcIl0gPSBcIkNcIjtcbiAgICBQb3JjZWxhaW5GaWxlU3RhdHVzW1wiVU5NRVJHRURcIl0gPSBcIlVcIjtcbiAgICBQb3JjZWxhaW5GaWxlU3RhdHVzW1wiVU5UUkFDS0VEXCJdID0gXCI/XCI7XG4gICAgUG9yY2VsYWluRmlsZVN0YXR1c1tcIklHTk9SRURcIl0gPSBcIiFcIjtcbiAgICBQb3JjZWxhaW5GaWxlU3RhdHVzW1wiTk9ORVwiXSA9IFwiIFwiO1xufSkoUG9yY2VsYWluRmlsZVN0YXR1cyB8fCAoUG9yY2VsYWluRmlsZVN0YXR1cyA9IHt9KSk7XG5mdW5jdGlvbiByZW5hbWVkRmlsZShsaW5lKSB7XG4gICAgY29uc3QgZGV0YWlsID0gL14oLispIC0+ICguKykkLy5leGVjKGxpbmUpO1xuICAgIGlmICghZGV0YWlsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmcm9tOiBsaW5lLCB0bzogbGluZVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiBTdHJpbmcoZGV0YWlsWzFdKSxcbiAgICAgICAgdG86IFN0cmluZyhkZXRhaWxbMl0pLFxuICAgIH07XG59XG5mdW5jdGlvbiBwYXJzZXIoaW5kZXhYLCBpbmRleFksIGhhbmRsZXIpIHtcbiAgICByZXR1cm4gW2Ake2luZGV4WH0ke2luZGV4WX1gLCBoYW5kbGVyXTtcbn1cbmZ1bmN0aW9uIGNvbmZsaWN0cyhpbmRleFgsIC4uLmluZGV4WSkge1xuICAgIHJldHVybiBpbmRleFkubWFwKHkgPT4gcGFyc2VyKGluZGV4WCwgeSwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0LmNvbmZsaWN0ZWQsIGZpbGUpKSk7XG59XG5jb25zdCBwYXJzZXJzID0gbmV3IE1hcChbXG4gICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuTk9ORSwgUG9yY2VsYWluRmlsZVN0YXR1cy5BRERFRCwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0LmNyZWF0ZWQsIGZpbGUpKSxcbiAgICBwYXJzZXIoUG9yY2VsYWluRmlsZVN0YXR1cy5OT05FLCBQb3JjZWxhaW5GaWxlU3RhdHVzLkRFTEVURUQsIChyZXN1bHQsIGZpbGUpID0+IHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5kZWxldGVkLCBmaWxlKSksXG4gICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuTk9ORSwgUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0Lm1vZGlmaWVkLCBmaWxlKSksXG4gICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuQURERUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuTk9ORSwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0LmNyZWF0ZWQsIGZpbGUpICYmIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5zdGFnZWQsIGZpbGUpKSxcbiAgICBwYXJzZXIoUG9yY2VsYWluRmlsZVN0YXR1cy5BRERFRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0LmNyZWF0ZWQsIGZpbGUpICYmIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5zdGFnZWQsIGZpbGUpICYmIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5tb2RpZmllZCwgZmlsZSkpLFxuICAgIHBhcnNlcihQb3JjZWxhaW5GaWxlU3RhdHVzLkRFTEVURUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuTk9ORSwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0LmRlbGV0ZWQsIGZpbGUpICYmIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5zdGFnZWQsIGZpbGUpKSxcbiAgICBwYXJzZXIoUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5OT05FLCAocmVzdWx0LCBmaWxlKSA9PiB1dGlsc18xLmFwcGVuZChyZXN1bHQubW9kaWZpZWQsIGZpbGUpICYmIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5zdGFnZWQsIGZpbGUpKSxcbiAgICBwYXJzZXIoUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgKHJlc3VsdCwgZmlsZSkgPT4gdXRpbHNfMS5hcHBlbmQocmVzdWx0Lm1vZGlmaWVkLCBmaWxlKSAmJiB1dGlsc18xLmFwcGVuZChyZXN1bHQuc3RhZ2VkLCBmaWxlKSksXG4gICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuUkVOQU1FRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5OT05FLCAocmVzdWx0LCBmaWxlKSA9PiB7XG4gICAgICAgIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5yZW5hbWVkLCByZW5hbWVkRmlsZShmaWxlKSk7XG4gICAgfSksXG4gICAgcGFyc2VyKFBvcmNlbGFpbkZpbGVTdGF0dXMuUkVOQU1FRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5NT0RJRklFRCwgKHJlc3VsdCwgZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCByZW5hbWVkID0gcmVuYW1lZEZpbGUoZmlsZSk7XG4gICAgICAgIHV0aWxzXzEuYXBwZW5kKHJlc3VsdC5yZW5hbWVkLCByZW5hbWVkKTtcbiAgICAgICAgdXRpbHNfMS5hcHBlbmQocmVzdWx0Lm1vZGlmaWVkLCByZW5hbWVkLnRvKTtcbiAgICB9KSxcbiAgICBwYXJzZXIoUG9yY2VsYWluRmlsZVN0YXR1cy5VTlRSQUNLRUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuVU5UUkFDS0VELCAocmVzdWx0LCBmaWxlKSA9PiB1dGlsc18xLmFwcGVuZChyZXN1bHQubm90X2FkZGVkLCBmaWxlKSksXG4gICAgLi4uY29uZmxpY3RzKFBvcmNlbGFpbkZpbGVTdGF0dXMuQURERUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuQURERUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuVU5NRVJHRUQpLFxuICAgIC4uLmNvbmZsaWN0cyhQb3JjZWxhaW5GaWxlU3RhdHVzLkRFTEVURUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuREVMRVRFRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5VTk1FUkdFRCksXG4gICAgLi4uY29uZmxpY3RzKFBvcmNlbGFpbkZpbGVTdGF0dXMuVU5NRVJHRUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuQURERUQsIFBvcmNlbGFpbkZpbGVTdGF0dXMuREVMRVRFRCwgUG9yY2VsYWluRmlsZVN0YXR1cy5VTk1FUkdFRCksXG4gICAgWycjIycsIChyZXN1bHQsIGxpbmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFoZWFkUmVnID0gL2FoZWFkIChcXGQrKS87XG4gICAgICAgICAgICBjb25zdCBiZWhpbmRSZWcgPSAvYmVoaW5kIChcXGQrKS87XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UmVnID0gL14oLis/KD89KD86XFwuezN9fFxcc3wkKSkpLztcbiAgICAgICAgICAgIGNvbnN0IHRyYWNraW5nUmVnID0gL1xcLnszfShcXFMqKS87XG4gICAgICAgICAgICBjb25zdCBvbkVtcHR5QnJhbmNoUmVnID0gL1xcc29uXFxzKFtcXFNdKykkLztcbiAgICAgICAgICAgIGxldCByZWdleFJlc3VsdDtcbiAgICAgICAgICAgIHJlZ2V4UmVzdWx0ID0gYWhlYWRSZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgICAgIHJlc3VsdC5haGVhZCA9IHJlZ2V4UmVzdWx0ICYmICtyZWdleFJlc3VsdFsxXSB8fCAwO1xuICAgICAgICAgICAgcmVnZXhSZXN1bHQgPSBiZWhpbmRSZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgICAgIHJlc3VsdC5iZWhpbmQgPSByZWdleFJlc3VsdCAmJiArcmVnZXhSZXN1bHRbMV0gfHwgMDtcbiAgICAgICAgICAgIHJlZ2V4UmVzdWx0ID0gY3VycmVudFJlZy5leGVjKGxpbmUpO1xuICAgICAgICAgICAgcmVzdWx0LmN1cnJlbnQgPSByZWdleFJlc3VsdCAmJiByZWdleFJlc3VsdFsxXTtcbiAgICAgICAgICAgIHJlZ2V4UmVzdWx0ID0gdHJhY2tpbmdSZWcuZXhlYyhsaW5lKTtcbiAgICAgICAgICAgIHJlc3VsdC50cmFja2luZyA9IHJlZ2V4UmVzdWx0ICYmIHJlZ2V4UmVzdWx0WzFdO1xuICAgICAgICAgICAgcmVnZXhSZXN1bHQgPSBvbkVtcHR5QnJhbmNoUmVnLmV4ZWMobGluZSk7XG4gICAgICAgICAgICByZXN1bHQuY3VycmVudCA9IHJlZ2V4UmVzdWx0ICYmIHJlZ2V4UmVzdWx0WzFdIHx8IHJlc3VsdC5jdXJyZW50O1xuICAgICAgICB9XVxuXSk7XG5jb25zdCBwYXJzZVN0YXR1c1N1bW1hcnkgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgIGNvbnN0IGxpbmVzID0gdGV4dC50cmltKCkuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBTdGF0dXNTdW1tYXJ5KCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgc3BsaXRMaW5lKHN0YXR1cywgbGluZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdHVzO1xufTtcbmV4cG9ydHMucGFyc2VTdGF0dXNTdW1tYXJ5ID0gcGFyc2VTdGF0dXNTdW1tYXJ5O1xuZnVuY3Rpb24gc3BsaXRMaW5lKHJlc3VsdCwgbGluZVN0cikge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lU3RyLnRyaW0oKTtcbiAgICBzd2l0Y2ggKCcgJykge1xuICAgICAgICBjYXNlIHRyaW1tZWQuY2hhckF0KDIpOlxuICAgICAgICAgICAgcmV0dXJuIGRhdGEodHJpbW1lZC5jaGFyQXQoMCksIHRyaW1tZWQuY2hhckF0KDEpLCB0cmltbWVkLnN1YnN0cigzKSk7XG4gICAgICAgIGNhc2UgdHJpbW1lZC5jaGFyQXQoMSk6XG4gICAgICAgICAgICByZXR1cm4gZGF0YShQb3JjZWxhaW5GaWxlU3RhdHVzLk5PTkUsIHRyaW1tZWQuY2hhckF0KDApLCB0cmltbWVkLnN1YnN0cigyKSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRhdGEoaW5kZXgsIHdvcmtpbmdEaXIsIHBhdGgpIHtcbiAgICAgICAgY29uc3QgcmF3ID0gYCR7aW5kZXh9JHt3b3JraW5nRGlyfWA7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBwYXJzZXJzLmdldChyYXcpO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlcihyZXN1bHQsIHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyYXcgIT09ICcjIycpIHtcbiAgICAgICAgICAgIHJlc3VsdC5maWxlcy5wdXNoKG5ldyBGaWxlU3RhdHVzU3VtbWFyeV8xLkZpbGVTdGF0dXNTdW1tYXJ5KHBhdGgsIGluZGV4LCB3b3JraW5nRGlyKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGF0dXNTdW1tYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdGF0dXNUYXNrID0gdm9pZCAwO1xuY29uc3QgU3RhdHVzU3VtbWFyeV8xID0gcmVxdWlyZShcIi4uL3Jlc3BvbnNlcy9TdGF0dXNTdW1tYXJ5XCIpO1xuZnVuY3Rpb24gc3RhdHVzVGFzayhjdXN0b21BcmdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0OiAndXRmLTgnLFxuICAgICAgICBjb21tYW5kczogWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nLCAnLWInLCAnLXUnLCAuLi5jdXN0b21BcmdzXSxcbiAgICAgICAgcGFyc2VyKHRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXNTdW1tYXJ5XzEucGFyc2VTdGF0dXNTdW1tYXJ5KHRleHQpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMuc3RhdHVzVGFzayA9IHN0YXR1c1Rhc2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGF0dXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVwZGF0ZVN1Yk1vZHVsZVRhc2sgPSBleHBvcnRzLnN1Yk1vZHVsZVRhc2sgPSBleHBvcnRzLmluaXRTdWJNb2R1bGVUYXNrID0gZXhwb3J0cy5hZGRTdWJNb2R1bGVUYXNrID0gdm9pZCAwO1xuY29uc3QgdGFza18xID0gcmVxdWlyZShcIi4vdGFza1wiKTtcbmZ1bmN0aW9uIGFkZFN1Yk1vZHVsZVRhc2socmVwbywgcGF0aCkge1xuICAgIHJldHVybiBzdWJNb2R1bGVUYXNrKFsnYWRkJywgcmVwbywgcGF0aF0pO1xufVxuZXhwb3J0cy5hZGRTdWJNb2R1bGVUYXNrID0gYWRkU3ViTW9kdWxlVGFzaztcbmZ1bmN0aW9uIGluaXRTdWJNb2R1bGVUYXNrKGN1c3RvbUFyZ3MpIHtcbiAgICByZXR1cm4gc3ViTW9kdWxlVGFzayhbJ2luaXQnLCAuLi5jdXN0b21BcmdzXSk7XG59XG5leHBvcnRzLmluaXRTdWJNb2R1bGVUYXNrID0gaW5pdFN1Yk1vZHVsZVRhc2s7XG5mdW5jdGlvbiBzdWJNb2R1bGVUYXNrKGN1c3RvbUFyZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFsuLi5jdXN0b21BcmdzXTtcbiAgICBpZiAoY29tbWFuZHNbMF0gIT09ICdzdWJtb2R1bGUnKSB7XG4gICAgICAgIGNvbW1hbmRzLnVuc2hpZnQoJ3N1Ym1vZHVsZScpO1xuICAgIH1cbiAgICByZXR1cm4gdGFza18xLnN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMpO1xufVxuZXhwb3J0cy5zdWJNb2R1bGVUYXNrID0gc3ViTW9kdWxlVGFzaztcbmZ1bmN0aW9uIHVwZGF0ZVN1Yk1vZHVsZVRhc2soY3VzdG9tQXJncykge1xuICAgIHJldHVybiBzdWJNb2R1bGVUYXNrKFsndXBkYXRlJywgLi4uY3VzdG9tQXJnc10pO1xufVxuZXhwb3J0cy51cGRhdGVTdWJNb2R1bGVUYXNrID0gdXBkYXRlU3ViTW9kdWxlVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1Yi1tb2R1bGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlVGFnTGlzdCA9IGV4cG9ydHMuVGFnTGlzdCA9IHZvaWQgMDtcbmNsYXNzIFRhZ0xpc3Qge1xuICAgIGNvbnN0cnVjdG9yKGFsbCwgbGF0ZXN0KSB7XG4gICAgICAgIHRoaXMuYWxsID0gYWxsO1xuICAgICAgICB0aGlzLmxhdGVzdCA9IGxhdGVzdDtcbiAgICB9XG59XG5leHBvcnRzLlRhZ0xpc3QgPSBUYWdMaXN0O1xuY29uc3QgcGFyc2VUYWdMaXN0ID0gZnVuY3Rpb24gKGRhdGEsIGN1c3RvbVNvcnQgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRhZ3MgPSBkYXRhXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLm1hcCh0cmltbWVkKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmICghY3VzdG9tU29ydCkge1xuICAgICAgICB0YWdzLnNvcnQoZnVuY3Rpb24gKHRhZ0EsIHRhZ0IpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzQSA9IHRhZ0Euc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzQiA9IHRhZ0Iuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGlmIChwYXJ0c0EubGVuZ3RoID09PSAxIHx8IHBhcnRzQi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2luZ2xlU29ydGVkKHRvTnVtYmVyKHBhcnRzQVswXSksIHRvTnVtYmVyKHBhcnRzQlswXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBNYXRoLm1heChwYXJ0c0EubGVuZ3RoLCBwYXJ0c0IubGVuZ3RoKTsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBzb3J0ZWQodG9OdW1iZXIocGFydHNBW2ldKSwgdG9OdW1iZXIocGFydHNCW2ldKSk7XG4gICAgICAgICAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBsYXRlc3QgPSBjdXN0b21Tb3J0ID8gdGFnc1swXSA6IFsuLi50YWdzXS5yZXZlcnNlKCkuZmluZCgodGFnKSA9PiB0YWcuaW5kZXhPZignLicpID49IDApO1xuICAgIHJldHVybiBuZXcgVGFnTGlzdCh0YWdzLCBsYXRlc3QpO1xufTtcbmV4cG9ydHMucGFyc2VUYWdMaXN0ID0gcGFyc2VUYWdMaXN0O1xuZnVuY3Rpb24gc2luZ2xlU29ydGVkKGEsIGIpIHtcbiAgICBjb25zdCBhSXNOdW0gPSBpc05hTihhKTtcbiAgICBjb25zdCBiSXNOdW0gPSBpc05hTihiKTtcbiAgICBpZiAoYUlzTnVtICE9PSBiSXNOdW0pIHtcbiAgICAgICAgcmV0dXJuIGFJc051bSA/IDEgOiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIGFJc051bSA/IHNvcnRlZChhLCBiKSA6IDA7XG59XG5mdW5jdGlvbiBzb3J0ZWQoYSwgYikge1xuICAgIHJldHVybiBhID09PSBiID8gMCA6IGEgPiBiID8gMSA6IC0xO1xufVxuZnVuY3Rpb24gdHJpbW1lZChpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dC50cmltKCk7XG59XG5mdW5jdGlvbiB0b051bWJlcihpbnB1dCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChpbnB1dC5yZXBsYWNlKC9eXFxEKy9nLCAnJyksIDEwKSB8fCAwO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhZ0xpc3QuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFkZEFubm90YXRlZFRhZ1Rhc2sgPSBleHBvcnRzLmFkZFRhZ1Rhc2sgPSBleHBvcnRzLnRhZ0xpc3RUYXNrID0gdm9pZCAwO1xuY29uc3QgVGFnTGlzdF8xID0gcmVxdWlyZShcIi4uL3Jlc3BvbnNlcy9UYWdMaXN0XCIpO1xuLyoqXG4gKiBUYXNrIHVzZWQgYnkgYGdpdC50YWdzYFxuICovXG5mdW5jdGlvbiB0YWdMaXN0VGFzayhjdXN0b21BcmdzID0gW10pIHtcbiAgICBjb25zdCBoYXNDdXN0b21Tb3J0ID0gY3VzdG9tQXJncy5zb21lKChvcHRpb24pID0+IC9eLS1zb3J0PS8udGVzdChvcHRpb24pKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIGNvbW1hbmRzOiBbJ3RhZycsICctbCcsIC4uLmN1c3RvbUFyZ3NdLFxuICAgICAgICBwYXJzZXIodGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIFRhZ0xpc3RfMS5wYXJzZVRhZ0xpc3QodGV4dCwgaGFzQ3VzdG9tU29ydCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmV4cG9ydHMudGFnTGlzdFRhc2sgPSB0YWdMaXN0VGFzaztcbi8qKlxuICogVGFzayB1c2VkIGJ5IGBnaXQuYWRkVGFnYFxuICovXG5mdW5jdGlvbiBhZGRUYWdUYXNrKG5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIGNvbW1hbmRzOiBbJ3RhZycsIG5hbWVdLFxuICAgICAgICBwYXJzZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lIH07XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5hZGRUYWdUYXNrID0gYWRkVGFnVGFzaztcbi8qKlxuICogVGFzayB1c2VkIGJ5IGBnaXQuYWRkVGFnYFxuICovXG5mdW5jdGlvbiBhZGRBbm5vdGF0ZWRUYWdUYXNrKG5hbWUsIHRhZ01lc3NhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6ICd1dGYtOCcsXG4gICAgICAgIGNvbW1hbmRzOiBbJ3RhZycsICctYScsICctbScsIHRhZ01lc3NhZ2UsIG5hbWVdLFxuICAgICAgICBwYXJzZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lIH07XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5hZGRBbm5vdGF0ZWRUYWdUYXNrID0gYWRkQW5ub3RhdGVkVGFnVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhZy5qcy5tYXAiLCJjb25zdCB7R2l0RXhlY3V0b3J9ID0gcmVxdWlyZSgnLi9saWIvcnVubmVycy9naXQtZXhlY3V0b3InKTtcbmNvbnN0IHtTaW1wbGVHaXRBcGl9ID0gcmVxdWlyZSgnLi9saWIvc2ltcGxlLWdpdC1hcGknKTtcblxuY29uc3Qge1NjaGVkdWxlcn0gPSByZXF1aXJlKCcuL2xpYi9ydW5uZXJzL3NjaGVkdWxlcicpO1xuY29uc3Qge0dpdExvZ2dlcn0gPSByZXF1aXJlKCcuL2xpYi9naXQtbG9nZ2VyJyk7XG5jb25zdCB7YWRob2NFeGVjVGFzaywgY29uZmlndXJhdGlvbkVycm9yVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy90YXNrJyk7XG5jb25zdCB7XG4gICBOT09QLFxuICAgYXNBcnJheSxcbiAgIGZpbHRlckFycmF5LFxuICAgZmlsdGVyUHJpbWl0aXZlcyxcbiAgIGZpbHRlclN0cmluZyxcbiAgIGZpbHRlclN0cmluZ09yU3RyaW5nQXJyYXksXG4gICBmaWx0ZXJUeXBlLFxuICAgZm9sZGVyRXhpc3RzLFxuICAgZ2V0VHJhaWxpbmdPcHRpb25zLFxuICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50LFxuICAgdHJhaWxpbmdPcHRpb25zQXJndW1lbnRcbn0gPSByZXF1aXJlKCcuL2xpYi91dGlscycpO1xuY29uc3Qge2FwcGx5UGF0Y2hUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2FwcGx5LXBhdGNoJylcbmNvbnN0IHticmFuY2hUYXNrLCBicmFuY2hMb2NhbFRhc2ssIGRlbGV0ZUJyYW5jaGVzVGFzaywgZGVsZXRlQnJhbmNoVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9icmFuY2gnKTtcbmNvbnN0IHtjaGVja0lnbm9yZVRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvY2hlY2staWdub3JlJyk7XG5jb25zdCB7Y2hlY2tJc1JlcG9UYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2NoZWNrLWlzLXJlcG8nKTtcbmNvbnN0IHtjbG9uZVRhc2ssIGNsb25lTWlycm9yVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9jbG9uZScpO1xuY29uc3Qge2FkZENvbmZpZ1Rhc2ssIGxpc3RDb25maWdUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2NvbmZpZycpO1xuY29uc3Qge2NsZWFuV2l0aE9wdGlvbnNUYXNrLCBpc0NsZWFuT3B0aW9uc0FycmF5fSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2NsZWFuJyk7XG5jb25zdCB7Y29tbWl0VGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9jb21taXQnKTtcbmNvbnN0IHtkaWZmU3VtbWFyeVRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvZGlmZicpO1xuY29uc3Qge2ZldGNoVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9mZXRjaCcpO1xuY29uc3Qge2hhc2hPYmplY3RUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL2hhc2gtb2JqZWN0Jyk7XG5jb25zdCB7aW5pdFRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvaW5pdCcpO1xuY29uc3Qge2xvZ1Rhc2ssIHBhcnNlTG9nT3B0aW9uc30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9sb2cnKTtcbmNvbnN0IHttZXJnZVRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvbWVyZ2UnKTtcbmNvbnN0IHttb3ZlVGFza30gPSByZXF1aXJlKFwiLi9saWIvdGFza3MvbW92ZVwiKTtcbmNvbnN0IHtwdWxsVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9wdWxsJyk7XG5jb25zdCB7cHVzaFRhZ3NUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3B1c2gnKTtcbmNvbnN0IHthZGRSZW1vdGVUYXNrLCBnZXRSZW1vdGVzVGFzaywgbGlzdFJlbW90ZXNUYXNrLCByZW1vdGVUYXNrLCByZW1vdmVSZW1vdGVUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3JlbW90ZScpO1xuY29uc3Qge2dldFJlc2V0TW9kZSwgcmVzZXRUYXNrfSA9IHJlcXVpcmUoJy4vbGliL3Rhc2tzL3Jlc2V0Jyk7XG5jb25zdCB7c3Rhc2hMaXN0VGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9zdGFzaC1saXN0Jyk7XG5jb25zdCB7c3RhdHVzVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9zdGF0dXMnKTtcbmNvbnN0IHthZGRTdWJNb2R1bGVUYXNrLCBpbml0U3ViTW9kdWxlVGFzaywgc3ViTW9kdWxlVGFzaywgdXBkYXRlU3ViTW9kdWxlVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy9zdWItbW9kdWxlJyk7XG5jb25zdCB7YWRkQW5ub3RhdGVkVGFnVGFzaywgYWRkVGFnVGFzaywgdGFnTGlzdFRhc2t9ID0gcmVxdWlyZSgnLi9saWIvdGFza3MvdGFnJyk7XG5jb25zdCB7c3RyYWlnaHRUaHJvdWdoQnVmZmVyVGFzaywgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFza30gPSByZXF1aXJlKCcuL2xpYi90YXNrcy90YXNrJyk7XG5cbmZ1bmN0aW9uIEdpdCAob3B0aW9ucywgcGx1Z2lucykge1xuICAgdGhpcy5fZXhlY3V0b3IgPSBuZXcgR2l0RXhlY3V0b3IoXG4gICAgICBvcHRpb25zLmJpbmFyeSwgb3B0aW9ucy5iYXNlRGlyLFxuICAgICAgbmV3IFNjaGVkdWxlcihvcHRpb25zLm1heENvbmN1cnJlbnRQcm9jZXNzZXMpLCBwbHVnaW5zLFxuICAgKTtcbiAgIHRoaXMuX2xvZ2dlciA9IG5ldyBHaXRMb2dnZXIoKTtcbn1cblxuKEdpdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNpbXBsZUdpdEFwaS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IEdpdDtcblxuLyoqXG4gKiBMb2dnaW5nIHV0aWxpdHkgZm9yIHByaW50aW5nIG91dCBpbmZvIG9yIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSB1c2VyXG4gKiBAdHlwZSB7R2l0TG9nZ2VyfVxuICogQHByaXZhdGVcbiAqL1xuR2l0LnByb3RvdHlwZS5fbG9nZ2VyID0gbnVsbDtcblxuLyoqXG4gKiBTZXRzIHRoZSBwYXRoIHRvIGEgY3VzdG9tIGdpdCBiaW5hcnksIHNob3VsZCBlaXRoZXIgYmUgYGdpdGAgd2hlbiB0aGVyZSBpcyBhbiBpbnN0YWxsYXRpb24gb2YgZ2l0IGF2YWlsYWJsZSBvblxuICogdGhlIHN5c3RlbSBwYXRoLCBvciBhIGZ1bGx5IHF1YWxpZmllZCBwYXRoIHRvIHRoZSBleGVjdXRhYmxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kXG4gKiBAcmV0dXJucyB7R2l0fVxuICovXG5HaXQucHJvdG90eXBlLmN1c3RvbUJpbmFyeSA9IGZ1bmN0aW9uIChjb21tYW5kKSB7XG4gICB0aGlzLl9leGVjdXRvci5iaW5hcnkgPSBjb21tYW5kO1xuICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MsIGVpdGhlciBzdXBwbHkgYm90aCBhIG5hbWUgYW5kIHZhbHVlIGFzIHN0cmluZ3Mgb3JcbiAqIGEgc2luZ2xlIG9iamVjdCB0byBlbnRpcmVseSByZXBsYWNlIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdXG4gKiBAcmV0dXJucyB7R2l0fVxuICovXG5HaXQucHJvdG90eXBlLmVudiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLl9leGVjdXRvci5lbnYgPSBuYW1lO1xuICAgfSBlbHNlIHtcbiAgICAgICh0aGlzLl9leGVjdXRvci5lbnYgPSB0aGlzLl9leGVjdXRvci5lbnYgfHwge30pW25hbWVdID0gdmFsdWU7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgc3Vic2VxdWVudCBjb21tYW5kcy5cbiAqL1xuR2l0LnByb3RvdHlwZS5jd2QgPSBmdW5jdGlvbiAod29ya2luZ0RpcmVjdG9yeSkge1xuICAgY29uc3QgdGFzayA9ICh0eXBlb2Ygd29ya2luZ0RpcmVjdG9yeSAhPT0gJ3N0cmluZycpXG4gICAgICA/IGNvbmZpZ3VyYXRpb25FcnJvclRhc2soJ0dpdC5jd2Q6IHdvcmtpbmdEaXJlY3RvcnkgbXVzdCBiZSBzdXBwbGllZCBhcyBhIHN0cmluZycpXG4gICAgICA6IGFkaG9jRXhlY1Rhc2soKCkgPT4ge1xuICAgICAgICAgaWYgKCFmb2xkZXJFeGlzdHMod29ya2luZ0RpcmVjdG9yeSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0LmN3ZDogY2Fubm90IGNoYW5nZSB0byBub24tZGlyZWN0b3J5IFwiJHsgd29ya2luZ0RpcmVjdG9yeSB9XCJgKTtcbiAgICAgICAgIH1cblxuICAgICAgICAgcmV0dXJuICh0aGlzLl9leGVjdXRvci5jd2QgPSB3b3JraW5nRGlyZWN0b3J5KTtcbiAgICAgIH0pO1xuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSB8fCBOT09QKTtcbn07XG5cbi8qKlxuICogU2V0cyBhIGhhbmRsZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGEgbmV3IGNoaWxkIHByb2Nlc3MgaXMgY3JlYXRlZCwgdGhlIGhhbmRsZXIgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWRcbiAqIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgYmVpbmcgcnVuIGFuZCB0aGUgc3Rkb3V0ICYgc3RkZXJyIHN0cmVhbXMgdXNlZCBieSB0aGUgQ2hpbGRQcm9jZXNzLlxuICpcbiAqIEBleGFtcGxlXG4gKiByZXF1aXJlKCdzaW1wbGUtZ2l0JylcbiAqICAgIC5vdXRwdXRIYW5kbGVyKGZ1bmN0aW9uIChjb21tYW5kLCBzdGRvdXQsIHN0ZGVycikge1xuICogICAgICAgc3Rkb3V0LnBpcGUocHJvY2Vzcy5zdGRvdXQpO1xuICogICAgfSlcbiAqICAgIC5jaGVja291dCgnaHR0cHM6Ly9naXRodWIuY29tL3VzZXIvcmVwby5naXQnKTtcbiAqXG4gKiBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvY2hpbGRfcHJvY2Vzcy5odG1sI2NoaWxkX3Byb2Nlc3NfY2xhc3NfY2hpbGRwcm9jZXNzXG4gKiBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvc3RyZWFtLmh0bWwjc3RyZWFtX2NsYXNzX3N0cmVhbV9yZWFkYWJsZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3V0cHV0SGFuZGxlclxuICogQHJldHVybnMge0dpdH1cbiAqL1xuR2l0LnByb3RvdHlwZS5vdXRwdXRIYW5kbGVyID0gZnVuY3Rpb24gKG91dHB1dEhhbmRsZXIpIHtcbiAgIHRoaXMuX2V4ZWN1dG9yLm91dHB1dEhhbmRsZXIgPSBvdXRwdXRIYW5kbGVyO1xuICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBnaXQgcmVwb1xuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2JhcmU9ZmFsc2VdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKGJhcmUsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgaW5pdFRhc2soYmFyZSA9PT0gdHJ1ZSwgdGhpcy5fZXhlY3V0b3IuY3dkLCBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIGxvY2FsIHJlcG9cbiAqL1xuR2l0LnByb3RvdHlwZS5zdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0YXR1c1Rhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBMaXN0IHRoZSBzdGFzaChzKSBvZiB0aGUgbG9jYWwgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLnN0YXNoTGlzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0YXNoTGlzdFRhc2soXG4gICAgICAgICB0cmFpbGluZ09wdGlvbnNBcmd1bWVudChhcmd1bWVudHMpIHx8IHt9LFxuICAgICAgICAgZmlsdGVyQXJyYXkob3B0aW9ucykgJiYgb3B0aW9ucyB8fCBbXVxuICAgICAgKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogU3Rhc2ggdGhlIGxvY2FsIHJlcG9cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5zdGFzaCA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydzdGFzaCcsIC4uLmdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpXSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVDbG9uZVRhc2sgKGFwaSwgdGFzaywgcmVwb1BhdGgsIGxvY2FsUGF0aCkge1xuICAgaWYgKHR5cGVvZiByZXBvUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBjb25maWd1cmF0aW9uRXJyb3JUYXNrKGBnaXQuJHsgYXBpIH0oKSByZXF1aXJlcyBhIHN0cmluZyAncmVwb1BhdGgnYCk7XG4gICB9XG5cbiAgIHJldHVybiB0YXNrKHJlcG9QYXRoLCBmaWx0ZXJUeXBlKGxvY2FsUGF0aCwgZmlsdGVyU3RyaW5nKSwgZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpO1xufVxuXG5cbi8qKlxuICogQ2xvbmUgYSBnaXQgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBjcmVhdGVDbG9uZVRhc2soJ2Nsb25lJywgY2xvbmVUYXNrLCAuLi5hcmd1bWVudHMpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBNaXJyb3IgYSBnaXQgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLm1pcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgY3JlYXRlQ2xvbmVUYXNrKCdtaXJyb3InLCBjbG9uZU1pcnJvclRhc2ssIC4uLmFyZ3VtZW50cyksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIE1vdmVzIG9uZSBvciBtb3JlIGZpbGVzIHRvIGEgbmV3IGRlc3RpbmF0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1tdlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBmcm9tXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9cbiAqL1xuR2l0LnByb3RvdHlwZS5tdiA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2sobW92ZVRhc2soZnJvbSwgdG8pLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSk7XG59O1xuXG4vKipcbiAqIEludGVybmFsbHkgdXNlcyBwdWxsIGFuZCB0YWdzIHRvIGdldCB0aGUgbGlzdCBvZiB0YWdzIHRoZW4gY2hlY2tzIG91dCB0aGUgbGF0ZXN0IHRhZy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5jaGVja291dExhdGVzdFRhZyA9IGZ1bmN0aW9uICh0aGVuKSB7XG4gICB2YXIgZ2l0ID0gdGhpcztcbiAgIHJldHVybiB0aGlzLnB1bGwoZnVuY3Rpb24gKCkge1xuICAgICAgZ2l0LnRhZ3MoZnVuY3Rpb24gKGVyciwgdGFncykge1xuICAgICAgICAgZ2l0LmNoZWNrb3V0KHRhZ3MubGF0ZXN0LCB0aGVuKTtcbiAgICAgIH0pO1xuICAgfSk7XG59O1xuXG4vKipcbiAqIENvbW1pdHMgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAtIHdoZW4gc3BlY2lmaWMgZmlsZSBwYXRocyBhcmUgc3VwcGxpZWQsIG9ubHkgY2hhbmdlcyBvbiB0aG9zZVxuICogZmlsZXMgd2lsbCBiZSBjb21taXR0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IG1lc3NhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbZmlsZXNdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5jb21taXQgPSBmdW5jdGlvbiAobWVzc2FnZSwgZmlsZXMsIG9wdGlvbnMsIHRoZW4pIHtcbiAgIGNvbnN0IG5leHQgPSB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKTtcbiAgIGNvbnN0IG1lc3NhZ2VzID0gW107XG5cbiAgIGlmIChmaWx0ZXJTdHJpbmdPclN0cmluZ0FycmF5KG1lc3NhZ2UpKSB7XG4gICAgICBtZXNzYWdlcy5wdXNoKC4uLmFzQXJyYXkobWVzc2FnZSkpO1xuICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2Fybignc2ltcGxlLWdpdCBkZXByZWNhdGlvbiBub3RpY2U6IGdpdC5jb21taXQ6IHJlcXVpcmVzIHRoZSBjb21taXQgbWVzc2FnZSB0byBiZSBzdXBwbGllZCBhcyBhIHN0cmluZy9zdHJpbmdbXSwgdGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIHZlcnNpb24gMycpO1xuICAgfVxuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGNvbW1pdFRhc2soXG4gICAgICAgICBtZXNzYWdlcyxcbiAgICAgICAgIGFzQXJyYXkoZmlsdGVyVHlwZShmaWxlcywgZmlsdGVyU3RyaW5nT3JTdHJpbmdBcnJheSwgW10pKSxcbiAgICAgICAgIFsuLi5maWx0ZXJUeXBlKG9wdGlvbnMsIGZpbHRlckFycmF5LCBbXSksIC4uLmdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMsIDAsIHRydWUpXVxuICAgICAgKSxcbiAgICAgIG5leHRcbiAgICk7XG59O1xuXG4vKipcbiAqIFB1bGwgdGhlIHVwZGF0ZWQgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLnB1bGwgPSBmdW5jdGlvbiAocmVtb3RlLCBicmFuY2gsIG9wdGlvbnMsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgcHVsbFRhc2soZmlsdGVyVHlwZShyZW1vdGUsIGZpbHRlclN0cmluZyksIGZpbHRlclR5cGUoYnJhbmNoLCBmaWx0ZXJTdHJpbmcpLCBnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIEZldGNoIHRoZSB1cGRhdGVkIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IHJlcG8uXG4gKlxuICogQGV4YW1wbGVcbiAqICAgLmZldGNoKCd1cHN0cmVhbScsICdtYXN0ZXInKSAvLyBmZXRjaGVzIGZyb20gbWFzdGVyIG9uIHJlbW90ZSBuYW1lZCB1cHN0cmVhbVxuICogICAuZmV0Y2goZnVuY3Rpb24gKCkge30pIC8vIHJ1bnMgZmV0Y2ggYWdhaW5zdCBkZWZhdWx0IHJlbW90ZSBhbmQgYnJhbmNoIGFuZCBjYWxscyBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcmVtb3RlXVxuICogQHBhcmFtIHtzdHJpbmd9IFticmFuY2hdXG4gKi9cbkdpdC5wcm90b3R5cGUuZmV0Y2ggPSBmdW5jdGlvbiAocmVtb3RlLCBicmFuY2gpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgZmV0Y2hUYXNrKGZpbHRlclR5cGUocmVtb3RlLCBmaWx0ZXJTdHJpbmcpLCBmaWx0ZXJUeXBlKGJyYW5jaCwgZmlsdGVyU3RyaW5nKSwgZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBEaXNhYmxlcy9lbmFibGVzIHRoZSB1c2Ugb2YgdGhlIGNvbnNvbGUgZm9yIHByaW50aW5nIHdhcm5pbmdzIGFuZCBlcnJvcnMsIGJ5IGRlZmF1bHQgbWVzc2FnZXMgYXJlIG5vdCBzaG93biBpblxuICogYSBwcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2lsZW5jZVxuICogQHJldHVybnMge0dpdH1cbiAqL1xuR2l0LnByb3RvdHlwZS5zaWxlbnQgPSBmdW5jdGlvbiAoc2lsZW5jZSkge1xuICAgY29uc29sZS53YXJuKCdzaW1wbGUtZ2l0IGRlcHJlY2F0aW9uIG5vdGljZTogZ2l0LnNpbGVudDogbG9nZ2luZyBzaG91bGQgYmUgY29uZmlndXJlZCB1c2luZyB0aGUgYGRlYnVnYCBsaWJyYXJ5IC8gYERFQlVHYCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIHZlcnNpb24gMycpO1xuICAgdGhpcy5fbG9nZ2VyLnNpbGVudCghIXNpbGVuY2UpO1xuICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIExpc3QgYWxsIHRhZ3MuIFdoZW4gdXNpbmcgZ2l0IDIuNy4wIG9yIGFib3ZlLCBpbmNsdWRlIGFuIG9wdGlvbnMgb2JqZWN0IHdpdGggYFwiLS1zb3J0XCI6IFwicHJvcGVydHktbmFtZVwiYCB0b1xuICogc29ydCB0aGUgdGFncyBieSB0aGF0IHByb3BlcnR5IGluc3RlYWQgb2YgdXNpbmcgdGhlIGRlZmF1bHQgc2VtYW50aWMgdmVyc2lvbmluZyBzb3J0LlxuICpcbiAqIE5vdGUsIHN1cHBseWluZyB0aGlzIG9wdGlvbiB3aGVuIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgeW91ciBHaXQgdmVyc2lvbiB3aWxsIGNhdXNlIHRoZSBvcGVyYXRpb24gdG8gZmFpbC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS50YWdzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgdGFnTGlzdFRhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBSZWJhc2VzIHRoZSBjdXJyZW50IHdvcmtpbmcgY29weS4gT3B0aW9ucyBjYW4gYmUgc3VwcGxpZWQgZWl0aGVyIGFzIGFuIGFycmF5IG9mIHN0cmluZyBwYXJhbWV0ZXJzXG4gKiB0byBiZSBzZW50IHRvIHRoZSBgZ2l0IHJlYmFzZWAgY29tbWFuZCwgb3IgYSBzdGFuZGFyZCBvcHRpb25zIG9iamVjdC5cbiAqL1xuR2l0LnByb3RvdHlwZS5yZWJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydyZWJhc2UnLCAuLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKV0pLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cylcbiAgICk7XG59O1xuXG4vKipcbiAqIFJlc2V0IGEgcmVwb1xuICovXG5HaXQucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgcmVzZXRUYXNrKGdldFJlc2V0TW9kZShtb2RlKSwgZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cykpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBSZXZlcnQgb25lIG9yIG1vcmUgY29tbWl0cyBpbiB0aGUgbG9jYWwgd29ya2luZyBjb3B5XG4gKi9cbkdpdC5wcm90b3R5cGUucmV2ZXJ0ID0gZnVuY3Rpb24gKGNvbW1pdCkge1xuICAgY29uc3QgbmV4dCA9IHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpO1xuXG4gICBpZiAodHlwZW9mIGNvbW1pdCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgICAgY29uZmlndXJhdGlvbkVycm9yVGFzaygnQ29tbWl0IG11c3QgYmUgYSBzdHJpbmcnKSxcbiAgICAgICAgIG5leHQsXG4gICAgICApO1xuICAgfVxuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydyZXZlcnQnLCAuLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCAwLCB0cnVlKSwgY29tbWl0XSksXG4gICAgICBuZXh0XG4gICApO1xufTtcblxuLyoqXG4gKiBBZGQgYSBsaWdodHdlaWdodCB0YWcgdG8gdGhlIGhlYWQgb2YgdGhlIGN1cnJlbnQgYnJhbmNoXG4gKi9cbkdpdC5wcm90b3R5cGUuYWRkVGFnID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgIGNvbnN0IHRhc2sgPSAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKVxuICAgICAgPyBhZGRUYWdUYXNrKG5hbWUpXG4gICAgICA6IGNvbmZpZ3VyYXRpb25FcnJvclRhc2soJ0dpdC5hZGRUYWcgcmVxdWlyZXMgYSB0YWcgbmFtZScpO1xuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSk7XG59O1xuXG4vKipcbiAqIEFkZCBhbiBhbm5vdGF0ZWQgdGFnIHRvIHRoZSBoZWFkIG9mIHRoZSBjdXJyZW50IGJyYW5jaFxuICovXG5HaXQucHJvdG90eXBlLmFkZEFubm90YXRlZFRhZyA9IGZ1bmN0aW9uICh0YWdOYW1lLCB0YWdNZXNzYWdlKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGFkZEFubm90YXRlZFRhZ1Rhc2sodGFnTmFtZSwgdGFnTWVzc2FnZSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIENoZWNrIG91dCBhIHRhZyBvciByZXZpc2lvbiwgYW55IG51bWJlciBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIHRvIHRoZSBgZ2l0IGNoZWNrb3V0YCBjb21tYW5kXG4gKiBieSBzdXBwbHlpbmcgZWl0aGVyIGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LlxuICovXG5HaXQucHJvdG90eXBlLmNoZWNrb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgY29uc3QgY29tbWFuZHMgPSBbJ2NoZWNrb3V0JywgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgdHJ1ZSldO1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmRzKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgb3V0IGEgcmVtb3RlIGJyYW5jaFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBicmFuY2hOYW1lIG5hbWUgb2YgYnJhbmNoXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RhcnRQb2ludCAoZS5nIG9yaWdpbi9kZXZlbG9wbWVudClcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmNoZWNrb3V0QnJhbmNoID0gZnVuY3Rpb24gKGJyYW5jaE5hbWUsIHN0YXJ0UG9pbnQsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLmNoZWNrb3V0KFsnLWInLCBicmFuY2hOYW1lLCBzdGFydFBvaW50XSwgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuLyoqXG4gKiBDaGVjayBvdXQgYSBsb2NhbCBicmFuY2hcbiAqL1xuR2l0LnByb3RvdHlwZS5jaGVja291dExvY2FsQnJhbmNoID0gZnVuY3Rpb24gKGJyYW5jaE5hbWUsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLmNoZWNrb3V0KFsnLWInLCBicmFuY2hOYW1lXSwgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuLyoqXG4gKiBEZWxldGUgYSBsb2NhbCBicmFuY2hcbiAqL1xuR2l0LnByb3RvdHlwZS5kZWxldGVMb2NhbEJyYW5jaCA9IGZ1bmN0aW9uIChicmFuY2hOYW1lLCBmb3JjZURlbGV0ZSwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBkZWxldGVCcmFuY2hUYXNrKGJyYW5jaE5hbWUsIHR5cGVvZiBmb3JjZURlbGV0ZSA9PT0gXCJib29sZWFuXCIgPyBmb3JjZURlbGV0ZSA6IGZhbHNlKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogRGVsZXRlIG9uZSBvciBtb3JlIGxvY2FsIGJyYW5jaGVzXG4gKi9cbkdpdC5wcm90b3R5cGUuZGVsZXRlTG9jYWxCcmFuY2hlcyA9IGZ1bmN0aW9uIChicmFuY2hOYW1lcywgZm9yY2VEZWxldGUsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgZGVsZXRlQnJhbmNoZXNUYXNrKGJyYW5jaE5hbWVzLCB0eXBlb2YgZm9yY2VEZWxldGUgPT09IFwiYm9vbGVhblwiID8gZm9yY2VEZWxldGUgOiBmYWxzZSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIExpc3QgYWxsIGJyYW5jaGVzXG4gKlxuICogQHBhcmFtIHtPYmplY3QgfCBzdHJpbmdbXX0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5icmFuY2ggPSBmdW5jdGlvbiAob3B0aW9ucywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBicmFuY2hUYXNrKGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGxpc3Qgb2YgbG9jYWwgYnJhbmNoZXNcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5icmFuY2hMb2NhbCA9IGZ1bmN0aW9uICh0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGJyYW5jaExvY2FsVGFzaygpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBBZGQgY29uZmlnIHRvIGxvY2FsIGdpdCBpbnN0YW5jZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgY29uZmlndXJhdGlvbiBrZXkgKGUuZyB1c2VyLm5hbWUpXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgKGUuZyB5b3VyIG5hbWUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcHBlbmQ9ZmFsc2VdIG9wdGlvbmFsbHkgYXBwZW5kIHRoZSBrZXkvdmFsdWUgcGFpciAoZXF1aXZhbGVudCBvZiBwYXNzaW5nIGAtLWFkZGAgb3B0aW9uKS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmFkZENvbmZpZyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlLCBhcHBlbmQsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgYWRkQ29uZmlnVGFzayhrZXksIHZhbHVlLCB0eXBlb2YgYXBwZW5kID09PSBcImJvb2xlYW5cIiA/IGFwcGVuZCA6IGZhbHNlKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbkdpdC5wcm90b3R5cGUubGlzdENvbmZpZyA9IGZ1bmN0aW9uICgpIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKGxpc3RDb25maWdUYXNrKCksIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpKTtcbn07XG5cbi8qKlxuICogRXhlY3V0ZXMgYW55IGNvbW1hbmQgYWdhaW5zdCB0aGUgZ2l0IGJpbmFyeS5cbiAqL1xuR2l0LnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbiAoY29tbWFuZHMpIHtcbiAgIGNvbnN0IGNyZWF0ZVJlc3RDb21tYW5kcyA9ICFBcnJheS5pc0FycmF5KGNvbW1hbmRzKTtcbiAgIGNvbnN0IGNvbW1hbmQgPSBbXS5zbGljZS5jYWxsKGNyZWF0ZVJlc3RDb21tYW5kcyA/IGFyZ3VtZW50cyA6IGNvbW1hbmRzLCAwKTtcblxuICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tYW5kLmxlbmd0aCAmJiBjcmVhdGVSZXN0Q29tbWFuZHM7IGkrKykge1xuICAgICAgaWYgKCFmaWx0ZXJQcmltaXRpdmVzKGNvbW1hbmRbaV0pKSB7XG4gICAgICAgICBjb21tYW5kLnNwbGljZShpLCBjb21tYW5kLmxlbmd0aCAtIGkpO1xuICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICB9XG5cbiAgIGNvbW1hbmQucHVzaChcbiAgICAgIC4uLmdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMsIDAsIHRydWUpLFxuICAgKTtcblxuICAgdmFyIG5leHQgPSB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKTtcblxuICAgaWYgKCFjb21tYW5kLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICBjb25maWd1cmF0aW9uRXJyb3JUYXNrKCdSYXc6IG11c3Qgc3VwcGx5IG9uZSBvciBtb3JlIGNvbW1hbmQgdG8gZXhlY3V0ZScpLFxuICAgICAgICAgbmV4dCxcbiAgICAgICk7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZCksIG5leHQpO1xufTtcblxuR2l0LnByb3RvdHlwZS5zdWJtb2R1bGVBZGQgPSBmdW5jdGlvbiAocmVwbywgcGF0aCwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBhZGRTdWJNb2R1bGVUYXNrKHJlcG8sIHBhdGgpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuR2l0LnByb3RvdHlwZS5zdWJtb2R1bGVVcGRhdGUgPSBmdW5jdGlvbiAoYXJncywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICB1cGRhdGVTdWJNb2R1bGVUYXNrKGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMsIHRydWUpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuc3VibW9kdWxlSW5pdCA9IGZ1bmN0aW9uIChhcmdzLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGluaXRTdWJNb2R1bGVUYXNrKGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMsIHRydWUpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuc3ViTW9kdWxlID0gZnVuY3Rpb24gKG9wdGlvbnMsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgc3ViTW9kdWxlVGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG5HaXQucHJvdG90eXBlLmxpc3RSZW1vdGUgPSBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGxpc3RSZW1vdGVzVGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIEFkZHMgYSByZW1vdGUgdG8gdGhlIGxpc3Qgb2YgcmVtb3Rlcy5cbiAqL1xuR2l0LnByb3RvdHlwZS5hZGRSZW1vdGUgPSBmdW5jdGlvbiAocmVtb3RlTmFtZSwgcmVtb3RlUmVwbywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBhZGRSZW1vdGVUYXNrKHJlbW90ZU5hbWUsIHJlbW90ZVJlcG8sIGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhbiBlbnRyeSBieSBuYW1lIGZyb20gdGhlIGxpc3Qgb2YgcmVtb3Rlcy5cbiAqL1xuR2l0LnByb3RvdHlwZS5yZW1vdmVSZW1vdGUgPSBmdW5jdGlvbiAocmVtb3RlTmFtZSwgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICByZW1vdmVSZW1vdGVUYXNrKHJlbW90ZU5hbWUpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIHJlbW90ZXMsIHNldHRpbmcgdGhlIG9wdGlvbmFsIHZlcmJvc2UgYXJndW1lbnQgdG8gdHJ1ZSBpbmNsdWRlcyBhZGRpdGlvbmFsXG4gKiBkZXRhaWwgb24gdGhlIHJlbW90ZXMgdGhlbXNlbHZlcy5cbiAqL1xuR2l0LnByb3RvdHlwZS5nZXRSZW1vdGVzID0gZnVuY3Rpb24gKHZlcmJvc2UsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgZ2V0UmVtb3Rlc1Rhc2sodmVyYm9zZSA9PT0gdHJ1ZSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIENvbXB1dGUgb2JqZWN0IElEIGZyb20gYSBmaWxlXG4gKi9cbkdpdC5wcm90b3R5cGUuaGFzaE9iamVjdCA9IGZ1bmN0aW9uIChwYXRoLCB3cml0ZSkge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBoYXNoT2JqZWN0VGFzayhwYXRoLCB3cml0ZSA9PT0gdHJ1ZSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIENhbGwgYW55IGBnaXQgcmVtb3RlYCBmdW5jdGlvbiB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcHRpb25zXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS5yZW1vdGUgPSBmdW5jdGlvbiAob3B0aW9ucywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICByZW1vdGVUYXNrKGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogTWVyZ2VzIGZyb20gb25lIGJyYW5jaCB0byBhbm90aGVyLCBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgYGdpdCBtZXJnZSAke2Zyb219ICRbdG99YCwgdGhlIGBvcHRpb25zYCBhcmd1bWVudCBjYW5cbiAqIGVpdGhlciBiZSBhbiBhcnJheSBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgY29tbWFuZCBvciBudWxsIC8gb21pdHRlZCB0byBiZSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9cbiAqL1xuR2l0LnByb3RvdHlwZS5tZXJnZUZyb21UbyA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgaWYgKCEoZmlsdGVyU3RyaW5nKGZyb20pICYmIGZpbHRlclN0cmluZyh0bykpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcnVuVGFzayhjb25maWd1cmF0aW9uRXJyb3JUYXNrKFxuICAgICAgICAgYEdpdC5tZXJnZUZyb21UbyByZXF1aXJlcyB0aGF0IHRoZSAnZnJvbScgYW5kICd0bycgYXJndW1lbnRzIGFyZSBzdXBwbGllZCBhcyBzdHJpbmdzYFxuICAgICAgKSk7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgbWVyZ2VUYXNrKFtmcm9tLCB0bywgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cyldKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMsIGZhbHNlKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIFJ1bnMgYSBtZXJnZSwgYG9wdGlvbnNgIGNhbiBiZSBlaXRoZXIgYW4gYXJyYXkgb2YgYXJndW1lbnRzXG4gKiBzdXBwb3J0ZWQgYnkgdGhlIFtgZ2l0IG1lcmdlYF0oaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1tZXJnZSlcbiAqIG9yIGFuIG9wdGlvbnMgb2JqZWN0LlxuICpcbiAqIENvbmZsaWN0cyBkdXJpbmcgdGhlIG1lcmdlIHJlc3VsdCBpbiBhbiBlcnJvciByZXNwb25zZSxcbiAqIHRoZSByZXNwb25zZSB0eXBlIHdoZXRoZXIgaXQgd2FzIGFuIGVycm9yIG9yIHN1Y2Nlc3Mgd2lsbCBiZSBhIE1lcmdlU3VtbWFyeSBpbnN0YW5jZS5cbiAqIFdoZW4gc3VjY2Vzc2Z1bCwgdGhlIE1lcmdlU3VtbWFyeSBoYXMgYWxsIGRldGFpbCBmcm9tIGEgdGhlIFB1bGxTdW1tYXJ5XG4gKlxuICogQHBhcmFtIHtPYmplY3QgfCBzdHJpbmdbXX0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqIEByZXR1cm5zIHsqfVxuICpcbiAqIEBzZWUgLi9yZXNwb25zZXMvTWVyZ2VTdW1tYXJ5LmpzXG4gKiBAc2VlIC4vcmVzcG9uc2VzL1B1bGxTdW1tYXJ5LmpzXG4gKi9cbkdpdC5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIG1lcmdlVGFzayhnZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzKSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG4vKipcbiAqIENhbGwgYW55IGBnaXQgdGFnYCBmdW5jdGlvbiB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcHRpb25zXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS50YWcgPSBmdW5jdGlvbiAob3B0aW9ucywgdGhlbikge1xuICAgY29uc3QgY29tbWFuZCA9IGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpO1xuXG4gICBpZiAoY29tbWFuZFswXSAhPT0gJ3RhZycpIHtcbiAgICAgIGNvbW1hbmQudW5zaGlmdCgndGFnJyk7XG4gICB9XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhjb21tYW5kKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKiBVcGRhdGVzIHJlcG9zaXRvcnkgc2VydmVyIGluZm9cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdGhlbl1cbiAqL1xuR2l0LnByb3RvdHlwZS51cGRhdGVTZXJ2ZXJJbmZvID0gZnVuY3Rpb24gKHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgc3RyYWlnaHRUaHJvdWdoU3RyaW5nVGFzayhbJ3VwZGF0ZS1zZXJ2ZXItaW5mbyddKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogUHVzaGVzIHRoZSBjdXJyZW50IHRhZyBjaGFuZ2VzIHRvIGEgcmVtb3RlIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBVUkwgb3IgbmFtZWQgcmVtb3RlLiBXaGVuIG5vdCBzcGVjaWZpZWQgdXNlcyB0aGVcbiAqIGRlZmF1bHQgY29uZmlndXJlZCByZW1vdGUgc3BlYy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3JlbW90ZV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLnB1c2hUYWdzID0gZnVuY3Rpb24gKHJlbW90ZSwgdGhlbikge1xuICAgY29uc3QgdGFzayA9IHB1c2hUYWdzVGFzayh7cmVtb3RlOiBmaWx0ZXJUeXBlKHJlbW90ZSwgZmlsdGVyU3RyaW5nKX0sIGdldFRyYWlsaW5nT3B0aW9ucyhhcmd1bWVudHMpKTtcblxuICAgcmV0dXJuIHRoaXMuX3J1blRhc2sodGFzaywgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cykpO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBuYW1lZCBmaWxlcyBmcm9tIHNvdXJjZSBjb250cm9sLlxuICovXG5HaXQucHJvdG90eXBlLnJtID0gZnVuY3Rpb24gKGZpbGVzKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydybScsICctZicsIC4uLmFzQXJyYXkoZmlsZXMpXSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgbmFtZWQgZmlsZXMgZnJvbSBzb3VyY2UgY29udHJvbCBidXQga2VlcHMgdGhlbSBvbiBkaXNrIHJhdGhlciB0aGFuIGRlbGV0aW5nIHRoZW0gZW50aXJlbHkuIFRvXG4gKiBjb21wbGV0ZWx5IHJlbW92ZSB0aGUgZmlsZXMsIHVzZSBgcm1gLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBmaWxlc1xuICovXG5HaXQucHJvdG90eXBlLnJtS2VlcExvY2FsID0gZnVuY3Rpb24gKGZpbGVzKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydybScsICctLWNhY2hlZCcsIC4uLmFzQXJyYXkoZmlsZXMpXSksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKVxuICAgKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cyBpbiBhIHRyZWUgYmFzZWQgb24gY29tbWl0IGhhc2guIFBhc3NpbmcgaW4gYW4gb2JqZWN0IGhhc2ggcmV0dXJucyB0aGUgb2JqZWN0J3MgY29udGVudCxcbiAqIHNpemUsIGFuZCB0eXBlLlxuICpcbiAqIFBhc3NpbmcgXCItcFwiIHdpbGwgaW5zdHJ1Y3QgY2F0LWZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBvYmplY3QgdHlwZSwgYW5kIGRpc3BsYXkgaXRzIGZvcm1hdHRlZCBjb250ZW50cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmNhdEZpbGUgPSBmdW5jdGlvbiAob3B0aW9ucywgdGhlbikge1xuICAgcmV0dXJuIHRoaXMuX2NhdEZpbGUoJ3V0Zi04JywgYXJndW1lbnRzKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuYmluYXJ5Q2F0RmlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgIHJldHVybiB0aGlzLl9jYXRGaWxlKCdidWZmZXInLCBhcmd1bWVudHMpO1xufTtcblxuR2l0LnByb3RvdHlwZS5fY2F0RmlsZSA9IGZ1bmN0aW9uIChmb3JtYXQsIGFyZ3MpIHtcbiAgIHZhciBoYW5kbGVyID0gdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3MpO1xuICAgdmFyIGNvbW1hbmQgPSBbJ2NhdC1maWxlJ107XG4gICB2YXIgb3B0aW9ucyA9IGFyZ3NbMF07XG5cbiAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgICAgY29uZmlndXJhdGlvbkVycm9yVGFzaygnR2l0LmNhdEZpbGU6IG9wdGlvbnMgbXVzdCBiZSBzdXBwbGllZCBhcyBhbiBhcnJheSBvZiBzdHJpbmdzJyksXG4gICAgICAgICBoYW5kbGVyLFxuICAgICAgKTtcbiAgIH1cblxuICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICAgIGNvbW1hbmQucHVzaC5hcHBseShjb21tYW5kLCBvcHRpb25zKTtcbiAgIH1cblxuICAgY29uc3QgdGFzayA9IGZvcm1hdCA9PT0gJ2J1ZmZlcidcbiAgICAgID8gc3RyYWlnaHRUaHJvdWdoQnVmZmVyVGFzayhjb21tYW5kKVxuICAgICAgOiBzdHJhaWdodFRocm91Z2hTdHJpbmdUYXNrKGNvbW1hbmQpO1xuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayh0YXNrLCBoYW5kbGVyKTtcbn07XG5cbkdpdC5wcm90b3R5cGUuZGlmZiA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICBjb25zdCBjb21tYW5kID0gWydkaWZmJywgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cyldO1xuXG4gICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb21tYW5kLnNwbGljZSgxLCAwLCBvcHRpb25zKTtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdHaXQjZGlmZjogc3VwcGx5aW5nIG9wdGlvbnMgYXMgYSBzaW5nbGUgc3RyaW5nIGlzIG5vdyBkZXByZWNhdGVkLCBzd2l0Y2ggdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgfVxuXG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZCksXG4gICAgICB0cmFpbGluZ0Z1bmN0aW9uQXJndW1lbnQoYXJndW1lbnRzKSxcbiAgICk7XG59O1xuXG5HaXQucHJvdG90eXBlLmRpZmZTdW1tYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICBkaWZmU3VtbWFyeVRhc2soZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgMSkpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuR2l0LnByb3RvdHlwZS5hcHBseVBhdGNoID0gZnVuY3Rpb24gKHBhdGNoZXMpIHtcbiAgIGNvbnN0IHRhc2sgPSAhZmlsdGVyU3RyaW5nT3JTdHJpbmdBcnJheShwYXRjaGVzKVxuICAgICAgPyBjb25maWd1cmF0aW9uRXJyb3JUYXNrKGBnaXQuYXBwbHlQYXRjaCByZXF1aXJlcyBvbmUgb3IgbW9yZSBzdHJpbmcgcGF0Y2hlcyBhcyB0aGUgZmlyc3QgYXJndW1lbnRgKVxuICAgICAgOiBhcHBseVBhdGNoVGFzayhhc0FycmF5KHBhdGNoZXMpLCBnZXRUcmFpbGluZ09wdGlvbnMoW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSk7XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgdGFzayxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn1cblxuR2l0LnByb3RvdHlwZS5yZXZwYXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgIGNvbnN0IGNvbW1hbmRzID0gWydyZXYtcGFyc2UnLCAuLi5nZXRUcmFpbGluZ09wdGlvbnMoYXJndW1lbnRzLCB0cnVlKV07XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soY29tbWFuZHMsIHRydWUpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuLyoqXG4gKiBTaG93IHZhcmlvdXMgdHlwZXMgb2Ygb2JqZWN0cywgZm9yIGV4YW1wbGUgdGhlIGZpbGUgYXQgYSBjZXJ0YWluIGNvbW1pdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uIChvcHRpb25zLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIHN0cmFpZ2h0VGhyb3VnaFN0cmluZ1Rhc2soWydzaG93JywgLi4uZ2V0VHJhaWxpbmdPcHRpb25zKGFyZ3VtZW50cywgMSldKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpXG4gICApO1xufTtcblxuLyoqXG4gKi9cbkdpdC5wcm90b3R5cGUuY2xlYW4gPSBmdW5jdGlvbiAobW9kZSwgb3B0aW9ucywgdGhlbikge1xuICAgY29uc3QgdXNpbmdDbGVhbk9wdGlvbnNBcnJheSA9IGlzQ2xlYW5PcHRpb25zQXJyYXkobW9kZSk7XG4gICBjb25zdCBjbGVhbk1vZGUgPSB1c2luZ0NsZWFuT3B0aW9uc0FycmF5ICYmIG1vZGUuam9pbignJykgfHwgZmlsdGVyVHlwZShtb2RlLCBmaWx0ZXJTdHJpbmcpIHx8ICcnO1xuICAgY29uc3QgY3VzdG9tQXJncyA9IGdldFRyYWlsaW5nT3B0aW9ucyhbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgdXNpbmdDbGVhbk9wdGlvbnNBcnJheSA/IDEgOiAwKSk7XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgY2xlYW5XaXRoT3B0aW9uc1Rhc2soY2xlYW5Nb2RlLCBjdXN0b21BcmdzKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbi8qKlxuICogQ2FsbCBhIHNpbXBsZSBmdW5jdGlvbiBhdCB0aGUgbmV4dCBzdGVwIGluIHRoZSBjaGFpbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFt0aGVuXVxuICovXG5HaXQucHJvdG90eXBlLmV4ZWMgPSBmdW5jdGlvbiAodGhlbikge1xuICAgY29uc3QgdGFzayA9IHtcbiAgICAgIGNvbW1hbmRzOiBbXSxcbiAgICAgIGZvcm1hdDogJ3V0Zi04JyxcbiAgICAgIHBhcnNlciAoKSB7XG4gICAgICAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoZW4oKTtcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgIH07XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKHRhc2spO1xufTtcblxuLyoqXG4gKiBTaG93IGNvbW1pdCBsb2dzIGZyb20gYEhFQURgIHRvIHRoZSBmaXJzdCBjb21taXQuXG4gKiBJZiBwcm92aWRlZCBiZXR3ZWVuIGBvcHRpb25zLmZyb21gIGFuZCBgb3B0aW9ucy50b2AgdGFncyBvciBicmFuY2guXG4gKlxuICogQWRkaXRpb25hbGx5IHlvdSBjYW4gcHJvdmlkZSBvcHRpb25zLmZpbGUsIHdoaWNoIGlzIHRoZSBwYXRoIHRvIGEgZmlsZSBpbiB5b3VyIHJlcG9zaXRvcnkuIFRoZW4gb25seSB0aGlzIGZpbGUgd2lsbCBiZSBjb25zaWRlcmVkLlxuICpcbiAqIFRvIHVzZSBhIGN1c3RvbSBzcGxpdHRlciBpbiB0aGUgbG9nIGZvcm1hdCwgc2V0IGBvcHRpb25zLnNwbGl0dGVyYCB0byBiZSB0aGUgc3RyaW5nIHRoZSBsb2cgc2hvdWxkIGJlIHNwbGl0IG9uLlxuICpcbiAqIE9wdGlvbnMgY2FuIGFsc28gYmUgc3VwcGxpZWQgYXMgYSBzdGFuZGFyZCBvcHRpb25zIG9iamVjdCBmb3IgYWRkaW5nIGN1c3RvbSBwcm9wZXJ0aWVzIHN1cHBvcnRlZCBieSB0aGUgZ2l0IGxvZyBjb21tYW5kLlxuICogRm9yIGFueSBvdGhlciBzZXQgb2Ygb3B0aW9ucywgc3VwcGx5IG9wdGlvbnMgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBiZSBhcHBlbmRlZCB0byB0aGUgZ2l0IGxvZyBjb21tYW5kLlxuICovXG5HaXQucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICBjb25zdCBuZXh0ID0gdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyk7XG5cbiAgIGlmIChmaWx0ZXJTdHJpbmcoYXJndW1lbnRzWzBdKSAmJiBmaWx0ZXJTdHJpbmcoYXJndW1lbnRzWzFdKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3J1blRhc2soXG4gICAgICAgICBjb25maWd1cmF0aW9uRXJyb3JUYXNrKGBnaXQubG9nKHN0cmluZywgc3RyaW5nKSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBnaXQubG9nKHsgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nIH0pYCksXG4gICAgICAgICBuZXh0XG4gICAgICApO1xuICAgfVxuXG4gICBjb25zdCBwYXJzZWRPcHRpb25zID0gcGFyc2VMb2dPcHRpb25zKFxuICAgICAgdHJhaWxpbmdPcHRpb25zQXJndW1lbnQoYXJndW1lbnRzKSB8fCB7fSxcbiAgICAgIGZpbHRlckFycmF5KG9wdGlvbnMpICYmIG9wdGlvbnMgfHwgW11cbiAgICk7XG5cbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgbG9nVGFzayhwYXJzZWRPcHRpb25zLnNwbGl0dGVyLCBwYXJzZWRPcHRpb25zLmZpZWxkcywgcGFyc2VkT3B0aW9ucy5jb21tYW5kcyksXG4gICAgICBuZXh0LFxuICAgKVxufTtcblxuLyoqXG4gKiBDbGVhcnMgdGhlIHF1ZXVlIG9mIHBlbmRpbmcgY29tbWFuZHMgYW5kIHJldHVybnMgdGhlIHdyYXBwZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICpcbiAqIEByZXR1cm5zIHtHaXR9XG4gKi9cbkdpdC5wcm90b3R5cGUuY2xlYXJRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgIC8vIFRPRE86XG4gICAvLyB0aGlzLl9leGVjdXRvci5jbGVhcigpO1xuICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGEgcGF0aG5hbWUgb3IgcGF0aG5hbWVzIGFyZSBleGNsdWRlZCBieSAuZ2l0aWdub3JlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IHBhdGhuYW1lc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW3RoZW5dXG4gKi9cbkdpdC5wcm90b3R5cGUuY2hlY2tJZ25vcmUgPSBmdW5jdGlvbiAocGF0aG5hbWVzLCB0aGVuKSB7XG4gICByZXR1cm4gdGhpcy5fcnVuVGFzayhcbiAgICAgIGNoZWNrSWdub3JlVGFzayhhc0FycmF5KChmaWx0ZXJUeXBlKHBhdGhuYW1lcywgZmlsdGVyU3RyaW5nT3JTdHJpbmdBcnJheSwgW10pKSkpLFxuICAgICAgdHJhaWxpbmdGdW5jdGlvbkFyZ3VtZW50KGFyZ3VtZW50cyksXG4gICApO1xufTtcblxuR2l0LnByb3RvdHlwZS5jaGVja0lzUmVwbyA9IGZ1bmN0aW9uIChjaGVja1R5cGUsIHRoZW4pIHtcbiAgIHJldHVybiB0aGlzLl9ydW5UYXNrKFxuICAgICAgY2hlY2tJc1JlcG9UYXNrKGZpbHRlclR5cGUoY2hlY2tUeXBlLCBmaWx0ZXJTdHJpbmcpKSxcbiAgICAgIHRyYWlsaW5nRnVuY3Rpb25Bcmd1bWVudChhcmd1bWVudHMpLFxuICAgKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gR2l0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdpdEluc3RhbmNlRmFjdG9yeSA9IGV4cG9ydHMuZ2l0RXhwb3J0RmFjdG9yeSA9IGV4cG9ydHMuZXNNb2R1bGVGYWN0b3J5ID0gdm9pZCAwO1xuY29uc3QgYXBpXzEgPSByZXF1aXJlKFwiLi9hcGlcIik7XG5jb25zdCBwbHVnaW5zXzEgPSByZXF1aXJlKFwiLi9wbHVnaW5zXCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuY29uc3QgR2l0ID0gcmVxdWlyZSgnLi4vZ2l0Jyk7XG4vKipcbiAqIEFkZHMgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzIHRvIHRoZSBzdXBwbGllZCBvYmplY3QgdG8gZW5hYmxlIGl0IGZvciB1c2UgYXNcbiAqIHRoZSBkZWZhdWx0IGV4cG9ydCBvZiBhIG1vZHVsZS5cbiAqXG4gKiBFZzogYG1vZHVsZS5leHBvcnRzID0gZXNNb2R1bGVGYWN0b3J5KHsgc29tZXRoaW5nICgpIHt9IH0pYFxuICovXG5mdW5jdGlvbiBlc01vZHVsZUZhY3RvcnkoZGVmYXVsdEV4cG9ydCkge1xuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkZWZhdWx0RXhwb3J0LCB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHsgdmFsdWU6IHRydWUgfSxcbiAgICAgICAgZGVmYXVsdDogeyB2YWx1ZTogZGVmYXVsdEV4cG9ydCB9LFxuICAgIH0pO1xufVxuZXhwb3J0cy5lc01vZHVsZUZhY3RvcnkgPSBlc01vZHVsZUZhY3Rvcnk7XG5mdW5jdGlvbiBnaXRFeHBvcnRGYWN0b3J5KGZhY3RvcnksIGV4dHJhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGZhY3RvcnkuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSwgYXBpXzEuZGVmYXVsdCwgZXh0cmEgfHwge30pO1xufVxuZXhwb3J0cy5naXRFeHBvcnRGYWN0b3J5ID0gZ2l0RXhwb3J0RmFjdG9yeTtcbmZ1bmN0aW9uIGdpdEluc3RhbmNlRmFjdG9yeShiYXNlRGlyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcGx1Z2lucyA9IG5ldyBwbHVnaW5zXzEuUGx1Z2luU3RvcmUoKTtcbiAgICBjb25zdCBjb25maWcgPSB1dGlsc18xLmNyZWF0ZUluc3RhbmNlQ29uZmlnKGJhc2VEaXIgJiYgKHR5cGVvZiBiYXNlRGlyID09PSAnc3RyaW5nJyA/IHsgYmFzZURpciB9IDogYmFzZURpcikgfHwge30sIG9wdGlvbnMpO1xuICAgIGlmICghdXRpbHNfMS5mb2xkZXJFeGlzdHMoY29uZmlnLmJhc2VEaXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBhcGlfMS5kZWZhdWx0LkdpdENvbnN0cnVjdEVycm9yKGNvbmZpZywgYENhbm5vdCB1c2Ugc2ltcGxlLWdpdCBvbiBhIGRpcmVjdG9yeSB0aGF0IGRvZXMgbm90IGV4aXN0YCk7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5jb25maWcpKSB7XG4gICAgICAgIHBsdWdpbnMuYWRkKHBsdWdpbnNfMS5jb21tYW5kQ29uZmlnUHJlZml4aW5nUGx1Z2luKGNvbmZpZy5jb25maWcpKTtcbiAgICB9XG4gICAgY29uZmlnLnByb2dyZXNzICYmIHBsdWdpbnMuYWRkKHBsdWdpbnNfMS5wcm9ncmVzc01vbml0b3JQbHVnaW4oY29uZmlnLnByb2dyZXNzKSk7XG4gICAgY29uZmlnLnRpbWVvdXQgJiYgcGx1Z2lucy5hZGQocGx1Z2luc18xLnRpbWVvdXRQbHVnaW4oY29uZmlnLnRpbWVvdXQpKTtcbiAgICBwbHVnaW5zLmFkZChwbHVnaW5zXzEuZXJyb3JEZXRlY3Rpb25QbHVnaW4ocGx1Z2luc18xLmVycm9yRGV0ZWN0aW9uSGFuZGxlcih0cnVlKSkpO1xuICAgIGNvbmZpZy5lcnJvcnMgJiYgcGx1Z2lucy5hZGQocGx1Z2luc18xLmVycm9yRGV0ZWN0aW9uUGx1Z2luKGNvbmZpZy5lcnJvcnMpKTtcbiAgICByZXR1cm4gbmV3IEdpdChjb25maWcsIHBsdWdpbnMpO1xufVxuZXhwb3J0cy5naXRJbnN0YW5jZUZhY3RvcnkgPSBnaXRJbnN0YW5jZUZhY3Rvcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1naXQtZmFjdG9yeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2l0UCA9IHZvaWQgMDtcbmNvbnN0IGdpdF9yZXNwb25zZV9lcnJvcl8xID0gcmVxdWlyZShcIi4uL2Vycm9ycy9naXQtcmVzcG9uc2UtZXJyb3JcIik7XG5jb25zdCBnaXRfZmFjdG9yeV8xID0gcmVxdWlyZShcIi4uL2dpdC1mYWN0b3J5XCIpO1xuY29uc3QgZnVuY3Rpb25OYW1lc0J1aWxkZXJBcGkgPSBbXG4gICAgJ2N1c3RvbUJpbmFyeScsICdlbnYnLCAnb3V0cHV0SGFuZGxlcicsICdzaWxlbnQnLFxuXTtcbmNvbnN0IGZ1bmN0aW9uTmFtZXNQcm9taXNlQXBpID0gW1xuICAgICdhZGQnLFxuICAgICdhZGRBbm5vdGF0ZWRUYWcnLFxuICAgICdhZGRDb25maWcnLFxuICAgICdhZGRSZW1vdGUnLFxuICAgICdhZGRUYWcnLFxuICAgICdhcHBseVBhdGNoJyxcbiAgICAnYmluYXJ5Q2F0RmlsZScsXG4gICAgJ2JyYW5jaCcsXG4gICAgJ2JyYW5jaExvY2FsJyxcbiAgICAnY2F0RmlsZScsXG4gICAgJ2NoZWNrSWdub3JlJyxcbiAgICAnY2hlY2tJc1JlcG8nLFxuICAgICdjaGVja291dCcsXG4gICAgJ2NoZWNrb3V0QnJhbmNoJyxcbiAgICAnY2hlY2tvdXRMYXRlc3RUYWcnLFxuICAgICdjaGVja291dExvY2FsQnJhbmNoJyxcbiAgICAnY2xlYW4nLFxuICAgICdjbG9uZScsXG4gICAgJ2NvbW1pdCcsXG4gICAgJ2N3ZCcsXG4gICAgJ2RlbGV0ZUxvY2FsQnJhbmNoJyxcbiAgICAnZGVsZXRlTG9jYWxCcmFuY2hlcycsXG4gICAgJ2RpZmYnLFxuICAgICdkaWZmU3VtbWFyeScsXG4gICAgJ2V4ZWMnLFxuICAgICdmZXRjaCcsXG4gICAgJ2dldFJlbW90ZXMnLFxuICAgICdpbml0JyxcbiAgICAnbGlzdENvbmZpZycsXG4gICAgJ2xpc3RSZW1vdGUnLFxuICAgICdsb2cnLFxuICAgICdtZXJnZScsXG4gICAgJ21lcmdlRnJvbVRvJyxcbiAgICAnbWlycm9yJyxcbiAgICAnbXYnLFxuICAgICdwdWxsJyxcbiAgICAncHVzaCcsXG4gICAgJ3B1c2hUYWdzJyxcbiAgICAncmF3JyxcbiAgICAncmViYXNlJyxcbiAgICAncmVtb3RlJyxcbiAgICAncmVtb3ZlUmVtb3RlJyxcbiAgICAncmVzZXQnLFxuICAgICdyZXZlcnQnLFxuICAgICdyZXZwYXJzZScsXG4gICAgJ3JtJyxcbiAgICAncm1LZWVwTG9jYWwnLFxuICAgICdzaG93JyxcbiAgICAnc3Rhc2gnLFxuICAgICdzdGFzaExpc3QnLFxuICAgICdzdGF0dXMnLFxuICAgICdzdWJNb2R1bGUnLFxuICAgICdzdWJtb2R1bGVBZGQnLFxuICAgICdzdWJtb2R1bGVJbml0JyxcbiAgICAnc3VibW9kdWxlVXBkYXRlJyxcbiAgICAndGFnJyxcbiAgICAndGFncycsXG4gICAgJ3VwZGF0ZVNlcnZlckluZm8nXG5dO1xuZnVuY3Rpb24gZ2l0UCguLi5hcmdzKSB7XG4gICAgbGV0IGdpdDtcbiAgICBsZXQgY2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB0cnkge1xuICAgICAgICBnaXQgPSBnaXRfZmFjdG9yeV8xLmdpdEluc3RhbmNlRmFjdG9yeSguLi5hcmdzKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgY2hhaW4gPSBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYnVpbGRlclJldHVybigpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VBcGk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoYWluUmV0dXJuKCkge1xuICAgICAgICByZXR1cm4gY2hhaW47XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VBcGkgPSBbLi4uZnVuY3Rpb25OYW1lc0J1aWxkZXJBcGksIC4uLmZ1bmN0aW9uTmFtZXNQcm9taXNlQXBpXS5yZWR1Y2UoKGFwaSwgbmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBpc0FzeW5jID0gZnVuY3Rpb25OYW1lc1Byb21pc2VBcGkuaW5jbHVkZXMobmFtZSk7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gaXNBc3luYyA/IGFzeW5jV3JhcHBlcihuYW1lLCBnaXQpIDogc3luY1dyYXBwZXIobmFtZSwgZ2l0LCBhcGkpO1xuICAgICAgICBjb25zdCBhbHRlcm5hdGl2ZSA9IGlzQXN5bmMgPyBjaGFpblJldHVybiA6IGJ1aWxkZXJSZXR1cm47XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcGksIG5hbWUsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBnaXQgPyB2YWxpZCA6IGFsdGVybmF0aXZlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LCB7fSk7XG4gICAgcmV0dXJuIHByb21pc2VBcGk7XG4gICAgZnVuY3Rpb24gYXN5bmNXcmFwcGVyKGZuLCBnaXQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGhdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvbWlzZSBpbnRlcmZhY2UgcmVxdWlyZXMgdGhhdCBoYW5kbGVycyBhcmUgbm90IHN1cHBsaWVkIGlubGluZSwgJyArXG4gICAgICAgICAgICAgICAgICAgICd0cmFpbGluZyBmdW5jdGlvbiBub3QgYWxsb3dlZCBpbiBjYWxsIHRvICcgKyBmbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2hhaW4udGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KHRvRXJyb3IoZXJyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIGdpdFtmbl0uYXBwbHkoZ2l0LCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzeW5jV3JhcHBlcihmbiwgZ2l0LCBhcGkpIHtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICBnaXRbZm5dKC4uLmFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnRzLmdpdFAgPSBnaXRQO1xuZnVuY3Rpb24gdG9FcnJvcihlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihlcnJvcik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgZ2l0X3Jlc3BvbnNlX2Vycm9yXzEuR2l0UmVzcG9uc2VFcnJvcihlcnJvcik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm9taXNlLXdyYXBwZWQuanMubWFwIiwiXG5jb25zdCB7Z2l0UH0gPSByZXF1aXJlKCcuL2xpYi9ydW5uZXJzL3Byb21pc2Utd3JhcHBlZCcpO1xuY29uc3Qge2VzTW9kdWxlRmFjdG9yeSwgZ2l0SW5zdGFuY2VGYWN0b3J5LCBnaXRFeHBvcnRGYWN0b3J5fSA9IHJlcXVpcmUoJy4vbGliL2dpdC1mYWN0b3J5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZXNNb2R1bGVGYWN0b3J5KFxuICAgZ2l0RXhwb3J0RmFjdG9yeShnaXRJbnN0YW5jZUZhY3RvcnksIHtnaXRQfSlcbik7XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgRmlsZVN5c3RlbUFkYXB0ZXIsIEZ1enp5U3VnZ2VzdE1vZGFsLCBOb3RpY2UsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgU3VnZ2VzdE1vZGFsLCBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHNpbXBsZUdpdCwgeyBGaWxlU3RhdHVzUmVzdWx0LCBTaW1wbGVHaXQgfSBmcm9tIFwic2ltcGxlLWdpdFwiO1xuXG5lbnVtIFBsdWdpblN0YXRlIHtcbiAgICBpZGxlLFxuICAgIHN0YXR1cyxcbiAgICBwdWxsLFxuICAgIGFkZCxcbiAgICBjb21taXQsXG4gICAgcHVzaCxcbiAgICBjb25mbGljdGVkLFxufVxuaW50ZXJmYWNlIE9ic2lkaWFuR2l0U2V0dGluZ3Mge1xuICAgIGNvbW1pdE1lc3NhZ2U6IHN0cmluZztcbiAgICBjb21taXREYXRlRm9ybWF0OiBzdHJpbmc7XG4gICAgYXV0b1NhdmVJbnRlcnZhbDogbnVtYmVyO1xuICAgIGF1dG9QdWxsSW50ZXJ2YWw6IG51bWJlcjtcbiAgICBhdXRvUHVsbE9uQm9vdDogYm9vbGVhbjtcbiAgICBkaXNhYmxlUHVzaDogYm9vbGVhbjtcbiAgICBwdWxsQmVmb3JlUHVzaDogYm9vbGVhbjtcbiAgICBkaXNhYmxlUG9wdXBzOiBib29sZWFuO1xuICAgIGxpc3RDaGFuZ2VkRmlsZXNJbk1lc3NhZ2VCb2R5OiBib29sZWFuO1xuICAgIHNob3dTdGF0dXNCYXI6IGJvb2xlYW47XG4gICAgbGFzdEF1dG9CYWNrVXA6IHN0cmluZztcbiAgICBsYXN0QXV0b1B1bGw6IHN0cmluZztcbn1cbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IE9ic2lkaWFuR2l0U2V0dGluZ3MgPSB7XG4gICAgY29tbWl0TWVzc2FnZTogXCJ2YXVsdCBiYWNrdXA6IHt7ZGF0ZX19XCIsXG4gICAgY29tbWl0RGF0ZUZvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tOnNzXCIsXG4gICAgYXV0b1NhdmVJbnRlcnZhbDogMCxcbiAgICBhdXRvUHVsbEludGVydmFsOiAwLFxuICAgIGF1dG9QdWxsT25Cb290OiBmYWxzZSxcbiAgICBkaXNhYmxlUHVzaDogZmFsc2UsXG4gICAgcHVsbEJlZm9yZVB1c2g6IHRydWUsXG4gICAgZGlzYWJsZVBvcHVwczogZmFsc2UsXG4gICAgbGlzdENoYW5nZWRGaWxlc0luTWVzc2FnZUJvZHk6IGZhbHNlLFxuICAgIHNob3dTdGF0dXNCYXI6IHRydWUsXG4gICAgbGFzdEF1dG9CYWNrVXA6IFwiXCIsXG4gICAgbGFzdEF1dG9QdWxsOiBcIlwiXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPYnNpZGlhbkdpdCBleHRlbmRzIFBsdWdpbiB7XG4gICAgZ2l0OiBTaW1wbGVHaXQ7XG4gICAgc2V0dGluZ3M6IE9ic2lkaWFuR2l0U2V0dGluZ3M7XG4gICAgc3RhdHVzQmFyOiBTdGF0dXNCYXI7XG4gICAgc3RhdGU6IFBsdWdpblN0YXRlO1xuICAgIHRpbWVvdXRJREJhY2t1cDogbnVtYmVyO1xuICAgIHRpbWVvdXRJRFB1bGw6IG51bWJlcjtcbiAgICBsYXN0VXBkYXRlOiBudW1iZXI7XG4gICAgZ2l0UmVhZHkgPSBmYWxzZTtcbiAgICBwcm9taXNlUXVldWU6IFByb21pc2VRdWV1ZSA9IG5ldyBQcm9taXNlUXVldWUoKTtcbiAgICBjb25mbGljdE91dHB1dEZpbGUgPSBcImNvbmZsaWN0LWZpbGVzLW9ic2lkaWFuLWdpdC5tZFwiO1xuXG4gICAgc2V0U3RhdGUoc3RhdGU6IFBsdWdpblN0YXRlKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5zdGF0dXNCYXI/LmRpc3BsYXkoKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbmxvYWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdsb2FkaW5nICcgKyB0aGlzLm1hbmlmZXN0Lm5hbWUgKyBcIiBwbHVnaW5cIik7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG5cbiAgICAgICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBPYnNpZGlhbkdpdFNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcInB1bGxcIixcbiAgICAgICAgICAgIG5hbWU6IFwiUHVsbCBmcm9tIHJlbW90ZSByZXBvc2l0b3J5XCIsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PiB0aGlzLnB1bGxDaGFuZ2VzRnJvbVJlbW90ZSgpKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcInB1c2hcIixcbiAgICAgICAgICAgIG5hbWU6IFwiQ29tbWl0ICphbGwqIGNoYW5nZXMgYW5kIHB1c2ggdG8gcmVtb3RlIHJlcG9zaXRvcnlcIixcbiAgICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLnByb21pc2VRdWV1ZS5hZGRUYXNrKCgpID0+IHRoaXMuY3JlYXRlQmFja3VwKGZhbHNlKSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcImNvbW1pdC1wdXNoLXNwZWNpZmllZC1tZXNzYWdlXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkNvbW1pdCBhbmQgcHVzaCBhbGwgY2hhbmdlcyB3aXRoIHNwZWNpZmllZCBtZXNzYWdlXCIsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4gbmV3IEN1c3RvbU1lc3NhZ2VNb2RhbCh0aGlzKS5vcGVuKClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcImxpc3QtY2hhbmdlZC1maWxlc1wiLFxuICAgICAgICAgICAgbmFtZTogXCJMaXN0IGNoYW5nZWQgZmlsZXNcIixcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5naXQuc3RhdHVzKCk7XG4gICAgICAgICAgICAgICAgbmV3IENoYW5nZWRGaWxlc01vZGFsKHRoaXMsIHN0YXR1cy5maWxlcykub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3Muc2hvd1N0YXR1c0Jhcikge1xuICAgICAgICAgICAgLy8gaW5pdCBzdGF0dXNCYXJcbiAgICAgICAgICAgIGxldCBzdGF0dXNCYXJFbCA9IHRoaXMuYWRkU3RhdHVzQmFySXRlbSgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXIgPSBuZXcgU3RhdHVzQmFyKHN0YXR1c0JhckVsLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJJbnRlcnZhbChcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5zdGF0dXNCYXIuZGlzcGxheSgpLCAxMDAwKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIGFzeW5jIG9udW5sb2FkKCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElEQmFja3VwKTtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJRFB1bGwpO1xuICAgICAgICBjb25zb2xlLmxvZygndW5sb2FkaW5nICcgKyB0aGlzLm1hbmlmZXN0Lm5hbWUgKyBcIiBwbHVnaW5cIik7XG4gICAgfVxuICAgIGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG4gICAgfVxuICAgIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNHaXRJbnN0YWxsZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoXCJDYW5ub3QgcnVuIGdpdCBjb21tYW5kXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyBGaWxlU3lzdGVtQWRhcHRlcjtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBhZGFwdGVyLmdldEJhc2VQYXRoKCk7XG5cbiAgICAgICAgICAgIHRoaXMuZ2l0ID0gc2ltcGxlR2l0KHBhdGgpO1xuXG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkUmVwbyA9IGF3YWl0IHRoaXMuZ2l0LmNoZWNrSXNSZXBvKCk7XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZFJlcG8pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihcIlZhbGlkIGdpdCByZXBvc2l0b3J5IG5vdCBmb3VuZC5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2l0UmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5hdXRvUHVsbE9uQm9vdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2VRdWV1ZS5hZGRUYXNrKCgpID0+IHRoaXMucHVsbENoYW5nZXNGcm9tUmVtb3RlKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9TYXZlSW50ZXJ2YWwgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBuZXcgRGF0ZSh0aGlzLnNldHRpbmdzLmxhc3RBdXRvQmFja1VwKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5zZXR0aW5ncy5hdXRvU2F2ZUludGVydmFsIC0gKE1hdGgucm91bmQoKChub3cuZ2V0VGltZSgpIC0gbGFzdC5nZXRUaW1lKCkpIC8gMTAwMCkgLyA2MCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b0JhY2t1cChkaWZmIDw9IDAgPyAwIDogZGlmZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9QdWxsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBuZXcgRGF0ZSh0aGlzLnNldHRpbmdzLmxhc3RBdXRvUHVsbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMuc2V0dGluZ3MuYXV0b1B1bGxJbnRlcnZhbCAtIChNYXRoLnJvdW5kKCgobm93LmdldFRpbWUoKSAtIGxhc3QuZ2V0VGltZSgpKSAvIDEwMDApIC8gNjApKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydEF1dG9QdWxsKGRpZmYgPD0gMCA/IDAgOiBkaWZmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcHVsbENoYW5nZXNGcm9tUmVtb3RlKCk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgICAgIGlmICghdGhpcy5naXRSZWFkeSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZ2l0UmVhZHkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBmaWxlc1VwZGF0ZWQgPSBhd2FpdCB0aGlzLnB1bGwoKTtcbiAgICAgICAgaWYgKGZpbGVzVXBkYXRlZCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU1lc3NhZ2UoYFB1bGxlZCBuZXcgY2hhbmdlcy4gJHtmaWxlc1VwZGF0ZWR9IGZpbGVzIHVwZGF0ZWRgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU1lc3NhZ2UoXCJFdmVyeXRoaW5nIGlzIHVwLXRvLWRhdGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdpdC5zdGF0dXMoKTtcbiAgICAgICAgaWYgKHN0YXR1cy5jb25mbGljdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheUVycm9yKGBZb3UgaGF2ZSAke3N0YXR1cy5jb25mbGljdGVkLmxlbmd0aH0gY29uZmxpY3QgZmlsZXNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuaWRsZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY3JlYXRlQmFja3VwKGZyb21BdXRvQmFja3VwOiBib29sZWFuLCBjb21taXRNZXNzYWdlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5naXRSZWFkeSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmdpdFJlYWR5KSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5zdGF0dXMpO1xuICAgICAgICBsZXQgc3RhdHVzID0gYXdhaXQgdGhpcy5naXQuc3RhdHVzKCk7XG5cblxuICAgICAgICBpZiAoIWZyb21BdXRvQmFja3VwKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHRoaXMuY29uZmxpY3RPdXRwdXRGaWxlKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmRlbGV0ZShmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGZvciBjb25mbGljdCBmaWxlcyBvbiBhdXRvIGJhY2t1cFxuICAgICAgICBpZiAoZnJvbUF1dG9CYWNrdXAgJiYgc3RhdHVzLmNvbmZsaWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5pZGxlKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheUVycm9yKGBEaWQgbm90IGNvbW1pdCwgYmVjYXVzZSB5b3UgaGF2ZSAke3N0YXR1cy5jb25mbGljdGVkLmxlbmd0aH0gY29uZmxpY3QgZmlsZXMuIFBsZWFzZSByZXNvbHZlIHRoZW0gYW5kIGNvbW1pdCBwZXIgY29tbWFuZC5gKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29uZmxpY3Qoc3RhdHVzLmNvbmZsaWN0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hhbmdlZEZpbGVzID0gKGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygpKS5maWxlcztcblxuICAgICAgICBpZiAoY2hhbmdlZEZpbGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGQoKTtcbiAgICAgICAgICAgIHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21taXQoY29tbWl0TWVzc2FnZSk7XG5cbiAgICAgICAgICAgIHRoaXMubGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKGBDb21taXR0ZWQgJHtzdGF0dXMuc3RhZ2VkLmxlbmd0aH0gZmlsZXNgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU1lc3NhZ2UoXCJObyBjaGFuZ2VzIHRvIGNvbW1pdFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5kaXNhYmxlUHVzaCkge1xuICAgICAgICAgICAgY29uc3QgdHJhY2tpbmdCcmFuY2ggPSBzdGF0dXMudHJhY2tpbmc7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50QnJhbmNoID0gc3RhdHVzLmN1cnJlbnQ7XG5cbiAgICAgICAgICAgIGlmICghdHJhY2tpbmdCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihcIkRpZCBub3QgcHVzaC4gTm8gdXBzdHJlYW0gYnJhbmNoIGlzIHNldCEgU2VlIFJFQURNRSBmb3IgaW5zdHJ1Y3Rpb25zXCIsIDEwMDAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmlkbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVtb3RlQ2hhbmdlZEZpbGVzID0gKGF3YWl0IHRoaXMuZ2l0LmRpZmZTdW1tYXJ5KFtjdXJyZW50QnJhbmNoLCB0cmFja2luZ0JyYW5jaF0pKS5jaGFuZ2VkO1xuXG4gICAgICAgICAgICAvLyBQcmV2ZW50IHBsdWdpbiB0byBwdWxsL3B1c2ggYXQgZXZlcnkgY2FsbCBvZiBjcmVhdGVCYWNrdXAuIE9ubHkgaWYgdW5wdXNoZWQgY29tbWl0cyBhcmUgcHJlc2VudFxuICAgICAgICAgICAgaWYgKHJlbW90ZUNoYW5nZWRGaWxlcyA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5wdWxsQmVmb3JlUHVzaCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwdWxsZWRGaWxlc0xlbmd0aCA9IGF3YWl0IHRoaXMucHVsbCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHVsbGVkRmlsZXNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlKGBQdWxsZWQgJHtwdWxsZWRGaWxlc0xlbmd0aH0gZmlsZXMgZnJvbSByZW1vdGVgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggYmVjYXVzZSBvZiBwdWxsXG4gICAgICAgICAgICAgICAgc3RhdHVzID0gYXdhaXQgdGhpcy5naXQuc3RhdHVzKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLmNvbmZsaWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihgQ2Fubm90IHB1c2guIFlvdSBoYXZlICR7c3RhdHVzLmNvbmZsaWN0ZWQubGVuZ3RofSBjb25mbGljdCBmaWxlc2ApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNvbmZsaWN0KHN0YXR1cy5jb25mbGljdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW90ZUNoYW5nZWRGaWxlcyA9IChhd2FpdCB0aGlzLmdpdC5kaWZmU3VtbWFyeShbY3VycmVudEJyYW5jaCwgdHJhY2tpbmdCcmFuY2hdKSkuY2hhbmdlZDtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnB1c2goKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZShgUHVzaGVkICR7cmVtb3RlQ2hhbmdlZEZpbGVzfSBmaWxlcyB0byByZW1vdGVgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheU1lc3NhZ2UoXCJObyBjaGFuZ2VzIHRvIHB1c2hcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5pZGxlKTtcbiAgICB9XG5cblxuICAgIC8vIHJlZ2lvbjogbWFpbiBtZXRob2RzXG5cbiAgICBpc0dpdEluc3RhbGxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3N0ZXZldWt4L2dpdC1qcy9pc3N1ZXMvNDAyXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBzcGF3blN5bmMoJ2dpdCcsIFsnLS12ZXJzaW9uJ10sIHtcbiAgICAgICAgICAgIHN0ZGlvOiAnaWdub3JlJ1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29tbWFuZC5lcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihjb21tYW5kLmVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhc3luYyBhZGQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoUGx1Z2luU3RhdGUuYWRkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5naXQuYWRkKFxuICAgICAgICAgICAgXCIuLypcIixcbiAgICAgICAgICAgIChlcnI6IEVycm9yIHwgbnVsbCkgPT5cbiAgICAgICAgICAgICAgICBlcnIgJiYgdGhpcy5kaXNwbGF5RXJyb3IoYENhbm5vdCBhZGQgZmlsZXM6ICR7ZXJyLm1lc3NhZ2V9YClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhc3luYyBjb21taXQobWVzc2FnZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLmNvbW1pdCk7XG4gICAgICAgIGxldCBjb21taXRNZXNzYWdlOiBzdHJpbmcgfCBzdHJpbmdbXSA9IG1lc3NhZ2UgPz8gYXdhaXQgdGhpcy5mb3JtYXRDb21taXRNZXNzYWdlKHRoaXMuc2V0dGluZ3MuY29tbWl0TWVzc2FnZSk7XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmxpc3RDaGFuZ2VkRmlsZXNJbk1lc3NhZ2VCb2R5KSB7XG4gICAgICAgICAgICBjb21taXRNZXNzYWdlID0gW2NvbW1pdE1lc3NhZ2UsIFwiQWZmZWN0ZWQgZmlsZXM6XCIsIChhd2FpdCB0aGlzLmdpdC5zdGF0dXMoKSkuc3RhZ2VkLmpvaW4oXCJcXG5cIildO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZ2l0LmNvbW1pdChjb21taXRNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBhc3luYyBwdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLnB1c2gpO1xuICAgICAgICBhd2FpdCB0aGlzLmdpdC5lbnYoeyAuLi5wcm9jZXNzLmVudiwgXCJPQlNJRElBTl9HSVRcIjogMSB9KS5wdXNoKFxuICAgICAgICAgICAgKGVycjogRXJyb3IgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgZXJyICYmIHRoaXMuZGlzcGxheUVycm9yKGBQdXNoIGZhaWxlZCAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMubGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcHVsbCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKFBsdWdpblN0YXRlLnB1bGwpO1xuICAgICAgICBjb25zdCBwdWxsUmVzdWx0ID0gYXdhaXQgdGhpcy5naXQucHVsbChbXCItLW5vLXJlYmFzZVwiXSxcbiAgICAgICAgICAgIGFzeW5jIChlcnI6IEVycm9yIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoYFB1bGwgZmFpbGVkICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLmNvbmZsaWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDb25mbGljdChzdGF0dXMuY29uZmxpY3RlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XG4gICAgICAgIHJldHVybiBwdWxsUmVzdWx0LmZpbGVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBlbmRyZWdpb246IG1haW4gbWV0aG9kc1xuXG4gICAgc3RhcnRBdXRvQmFja3VwKG1pbnV0ZXM/OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0SURCYWNrdXAgPSB3aW5kb3cuc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2VRdWV1ZS5hZGRUYXNrKCgpID0+IHRoaXMuY3JlYXRlQmFja3VwKHRydWUpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmxhc3RBdXRvQmFja1VwID0gbmV3IERhdGUoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydEF1dG9CYWNrdXAoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAobWludXRlcyA/PyB0aGlzLnNldHRpbmdzLmF1dG9TYXZlSW50ZXJ2YWwpICogNjAwMDBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGFydEF1dG9QdWxsKG1pbnV0ZXM/OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0SURQdWxsID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PiB0aGlzLnB1bGxDaGFuZ2VzRnJvbVJlbW90ZSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmxhc3RBdXRvUHVsbCA9IG5ldyBEYXRlKCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvUHVsbCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChtaW51dGVzID8/IHRoaXMuc2V0dGluZ3MuYXV0b1B1bGxJbnRlcnZhbCkgKiA2MDAwMFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNsZWFyQXV0b0JhY2t1cCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudGltZW91dElEQmFja3VwKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElEQmFja3VwKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjbGVhckF1dG9QdWxsKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy50aW1lb3V0SURQdWxsKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElEUHVsbCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgaGFuZGxlQ29uZmxpY3QoY29uZmxpY3RlZDogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShQbHVnaW5TdGF0ZS5jb25mbGljdGVkKTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBbXG4gICAgICAgICAgICBcIiMgQ29uZmxpY3QgZmlsZXNcIixcbiAgICAgICAgICAgIFwiUGxlYXNlIHJlc29sdmUgdGhlbSBhbmQgY29tbWl0IHBlciBjb21tYW5kIChUaGlzIGZpbGUgd2lsbCBiZSBkZWxldGVkIGJlZm9yZSB0aGUgY29tbWl0KS5cIixcbiAgICAgICAgICAgIC4uLmNvbmZsaWN0ZWQubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5rID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dChmaWxlLCBcIi9cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgLSBbWyR7bGlua31dXWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAtIE5vdCBhIGZpbGU6ICR7ZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMud3JpdGVBbmRPcGVuRmlsZShsaW5lcy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICBhc3luYyB3cml0ZUFuZE9wZW5GaWxlKHRleHQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLndyaXRlKHRoaXMuY29uZmxpY3RPdXRwdXRGaWxlLCB0ZXh0KTtcblxuICAgICAgICBsZXQgZmlsZUlzQWxyZWFkeU9wZW5lZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UuaXRlcmF0ZUFsbExlYXZlcyhsZWFmID0+IHtcbiAgICAgICAgICAgIGlmIChsZWFmLmdldERpc3BsYXlUZXh0KCkgIT0gXCJcIiAmJiB0aGlzLmNvbmZsaWN0T3V0cHV0RmlsZS5zdGFydHNXaXRoKGxlYWYuZ2V0RGlzcGxheVRleHQoKSkpIHtcbiAgICAgICAgICAgICAgICBmaWxlSXNBbHJlYWR5T3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZmlsZUlzQWxyZWFkeU9wZW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dCh0aGlzLmNvbmZsaWN0T3V0cHV0RmlsZSwgXCIvXCIsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVnaW9uOiBkaXNwbGF5aW5nIC8gZm9ybWF0dGluZyBtZXNzYWdlc1xuICAgIGRpc3BsYXlNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gNCAqIDEwMDApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXNCYXI/LmRpc3BsYXlNZXNzYWdlKG1lc3NhZ2UudG9Mb3dlckNhc2UoKSwgdGltZW91dCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmRpc2FibGVQb3B1cHMpIHtcbiAgICAgICAgICAgIG5ldyBOb3RpY2UobWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgZ2l0IG9ic2lkaWFuIG1lc3NhZ2U6ICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gICAgZGlzcGxheUVycm9yKG1lc3NhZ2U6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgICAgICBuZXcgTm90aWNlKG1lc3NhZ2UpO1xuICAgICAgICBjb25zb2xlLmxvZyhgZ2l0IG9ic2lkaWFuIGVycm9yOiAke21lc3NhZ2V9YCk7XG4gICAgICAgIHRoaXMuc3RhdHVzQmFyPy5kaXNwbGF5TWVzc2FnZShtZXNzYWdlLnRvTG93ZXJDYXNlKCksIHRpbWVvdXQpO1xuICAgIH1cblxuICAgIGFzeW5jIGZvcm1hdENvbW1pdE1lc3NhZ2UodGVtcGxhdGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICh0ZW1wbGF0ZS5pbmNsdWRlcyhcInt7bnVtRmlsZXN9fVwiKSkge1xuICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygpO1xuICAgICAgICAgICAgbGV0IG51bUZpbGVzID0gc3RhdHVzLmZpbGVzLmxlbmd0aDtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZShcInt7bnVtRmlsZXN9fVwiLCBTdHJpbmcobnVtRmlsZXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZW1wbGF0ZS5pbmNsdWRlcyhcInt7ZmlsZXN9fVwiKSkge1xuICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0LnN0YXR1cygpO1xuXG4gICAgICAgICAgICBsZXQgY2hhbmdlc2V0OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdOyB9ID0ge307XG4gICAgICAgICAgICBzdGF0dXMuZmlsZXMuZm9yRWFjaCgodmFsdWU6IEZpbGVTdGF0dXNSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXggaW4gY2hhbmdlc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXNldFt2YWx1ZS5pbmRleF0ucHVzaCh2YWx1ZS5wYXRoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzZXRbdmFsdWUuaW5kZXhdID0gW3ZhbHVlLnBhdGhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgY2h1bmtzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBbYWN0aW9uLCBmaWxlc10gb2YgT2JqZWN0LmVudHJpZXMoY2hhbmdlc2V0KSkge1xuICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGFjdGlvbiArIFwiIFwiICsgZmlsZXMuam9pbihcIiBcIikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmlsZXMgPSBjaHVua3Muam9pbihcIiwgXCIpO1xuXG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoXCJ7e2ZpbGVzfX1cIiwgZmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1vbWVudCA9ICh3aW5kb3cgYXMgYW55KS5tb21lbnQ7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKFxuICAgICAgICAgICAgXCJ7e2RhdGV9fVwiLFxuICAgICAgICAgICAgbW9tZW50KCkuZm9ybWF0KHRoaXMuc2V0dGluZ3MuY29tbWl0RGF0ZUZvcm1hdClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBlbmRyZWdpb246IGRpc3BsYXlpbmcgLyBmb3JtYXR0aW5nIHN0dWZmXG59XG5cblxuY2xhc3MgT2JzaWRpYW5HaXRTZXR0aW5nc1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICAgIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgICAgIGxldCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBwbHVnaW46IE9ic2lkaWFuR2l0ID0gKHRoaXMgYXMgYW55KS5wbHVnaW47XG5cbiAgICAgICAgY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiR2l0IEJhY2t1cCBzZXR0aW5nc1wiIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJWYXVsdCBiYWNrdXAgaW50ZXJ2YWwgKG1pbnV0ZXMpXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICBcIkNvbW1pdCBhbmQgcHVzaCBjaGFuZ2VzIGV2ZXJ5IFggbWludXRlcy4gVG8gZGlzYWJsZSBhdXRvbWF0aWMgYmFja3VwLCBzcGVjaWZ5IG5lZ2F0aXZlIHZhbHVlIG9yIHplcm8gKGRlZmF1bHQpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKFN0cmluZyhwbHVnaW4uc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCkpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbCA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5zZXR0aW5ncy5hdXRvU2F2ZUludGVydmFsID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uY2xlYXJBdXRvQmFja3VwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zdGFydEF1dG9CYWNrdXAocGx1Z2luLnNldHRpbmdzLmF1dG9TYXZlSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEF1dG9tYXRpYyBiYWNrdXAgZW5hYmxlZCEgRXZlcnkgJHtwbHVnaW4uc2V0dGluZ3MuYXV0b1NhdmVJbnRlcnZhbH0gbWludXRlcy5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmF1dG9TYXZlSW50ZXJ2YWwgPD0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4udGltZW91dElEQmFja3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5jbGVhckF1dG9CYWNrdXAoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIkF1dG9tYXRpYyBiYWNrdXAgZGlzYWJsZWQhXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbnVtYmVyLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJBdXRvIHB1bGwgaW50ZXJ2YWwgKG1pbnV0ZXMpXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICBcIlB1bGwgY2hhbmdlcyBldmVyeSBYIG1pbnV0ZXMuIFRvIGRpc2FibGUgYXV0b21hdGljIHB1bGwsIHNwZWNpZnkgbmVnYXRpdmUgdmFsdWUgb3IgemVybyAoZGVmYXVsdClcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUoU3RyaW5nKHBsdWdpbi5zZXR0aW5ncy5hdXRvUHVsbEludGVydmFsKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihOdW1iZXIodmFsdWUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5hdXRvUHVsbEludGVydmFsID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnNldHRpbmdzLmF1dG9QdWxsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5jbGVhckF1dG9QdWxsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zdGFydEF1dG9QdWxsKHBsdWdpbi5zZXR0aW5ncy5hdXRvU2F2ZUludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBBdXRvbWF0aWMgcHVsbCBlbmFibGVkISBFdmVyeSAke3BsdWdpbi5zZXR0aW5ncy5hdXRvUHVsbEludGVydmFsfSBtaW51dGVzLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuYXV0b1B1bGxJbnRlcnZhbCA8PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi50aW1lb3V0SURQdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5jbGVhckF1dG9QdWxsKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJBdXRvbWF0aWMgcHVsbCBkaXNhYmxlZCFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBudW1iZXIuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiQ29tbWl0IG1lc3NhZ2VcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgIFwiU3BlY2lmeSBjdXN0b20gY29tbWl0IG1lc3NhZ2UuIEF2YWlsYWJsZSBwbGFjZWhvbGRlcnM6IHt7ZGF0ZX19XCIgK1xuICAgICAgICAgICAgICAgIFwiIChzZWUgYmVsb3cpIGFuZCB7e251bUZpbGVzfX0gKG51bWJlciBvZiBjaGFuZ2VkIGZpbGVzIGluIHRoZSBjb21taXQpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwidmF1bHQgYmFja3VwXCIpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5jb21taXRNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwbHVnaW4uc2V0dGluZ3MuY29tbWl0TWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5jb21taXRNZXNzYWdlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJ7e2RhdGV9fSBwbGFjZWhvbGRlciBmb3JtYXRcIilcbiAgICAgICAgICAgIC5zZXREZXNjKCdTcGVjaWZ5IGN1c3RvbSBkYXRlIGZvcm1hdC4gRS5nLiBcIllZWVktTU0tREQgSEg6bW06c3NcIicpXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihwbHVnaW4uc2V0dGluZ3MuY29tbWl0RGF0ZUZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5jb21taXREYXRlRm9ybWF0KVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuY29tbWl0RGF0ZUZvcm1hdCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiUHJldmlldyBjb21taXQgbWVzc2FnZVwiKVxuICAgICAgICAgICAgLmFkZEJ1dHRvbigoYnV0dG9uKSA9PlxuICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRCdXR0b25UZXh0KFwiUHJldmlld1wiKS5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1pdE1lc3NhZ2VQcmV2aWV3ID0gYXdhaXQgcGx1Z2luLmZvcm1hdENvbW1pdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuY29tbWl0TWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKGAke2NvbW1pdE1lc3NhZ2VQcmV2aWV3fWApO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJMaXN0IGZpbGVuYW1lcyBhZmZlY3RlZCBieSBjb21taXQgaW4gdGhlIGNvbW1pdCBib2R5XCIpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MubGlzdENoYW5nZWRGaWxlc0luTWVzc2FnZUJvZHkpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5saXN0Q2hhbmdlZEZpbGVzSW5NZXNzYWdlQm9keSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiQ3VycmVudCBicmFuY2hcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiU3dpdGNoIHRvIGEgZGlmZmVyZW50IGJyYW5jaFwiKVxuICAgICAgICAgICAgLmFkZERyb3Bkb3duKGFzeW5jIChkcm9wZG93bikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyYW5jaEluZm8gPSBhd2FpdCBwbHVnaW4uZ2l0LmJyYW5jaExvY2FsKCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgYnJhbmNoSW5mby5hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKGJyYW5jaCwgYnJhbmNoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZHJvcGRvd24uc2V0VmFsdWUoYnJhbmNoSW5mby5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5vbkNoYW5nZShhc3luYyAob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5naXQuY2hlY2tvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24uc2V0VmFsdWUoYnJhbmNoSW5mby5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKGBDaGVja2VkIG91dCB0byAke29wdGlvbn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiUHVsbCB1cGRhdGVzIG9uIHN0YXJ0dXBcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiQXV0b21hdGljYWxseSBwdWxsIHVwZGF0ZXMgd2hlbiBPYnNpZGlhbiBzdGFydHNcIilcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5hdXRvUHVsbE9uQm9vdClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmF1dG9QdWxsT25Cb290ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJEaXNhYmxlIHB1c2hcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiRG8gbm90IHB1c2ggY2hhbmdlcyB0byB0aGUgcmVtb3RlIHJlcG9zaXRvcnlcIilcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5kaXNhYmxlUHVzaClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNldHRpbmdzLmRpc2FibGVQdXNoID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJQdWxsIGNoYW5nZXMgYmVmb3JlIHB1c2hcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiQ29tbWl0IC0+IHB1bGwgLT4gcHVzaCAoT25seSBpZiBwdXNoaW5nIGlzIGVuYWJsZWQpXCIpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwbHVnaW4uc2V0dGluZ3MucHVsbEJlZm9yZVB1c2gpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5wdWxsQmVmb3JlUHVzaCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiRGlzYWJsZSBub3RpZmljYXRpb25zXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICBcIkRpc2FibGUgbm90aWZpY2F0aW9ucyBmb3IgZ2l0IG9wZXJhdGlvbnMgdG8gbWluaW1pemUgZGlzdHJhY3Rpb24gKHJlZmVyIHRvIHN0YXR1cyBiYXIgZm9yIHVwZGF0ZXMpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHBsdWdpbi5zZXR0aW5ncy5kaXNhYmxlUG9wdXBzKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2V0dGluZ3MuZGlzYWJsZVBvcHVwcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiU2hvdyBzdGF0dXMgYmFyXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIk9ic2lkaWFuIG11c3QgYmUgcmVzdGFydGVkIGZvciB0aGUgY2hhbmdlcyB0byB0YWtlIGFmZmVjdFwiKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUocGx1Z2luLnNldHRpbmdzLnNob3dTdGF0dXNCYXIpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy5zaG93U3RhdHVzQmFyID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIFN0YXR1c0Jhck1lc3NhZ2Uge1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICB0aW1lb3V0OiBudW1iZXI7XG59XG5cbmNsYXNzIFN0YXR1c0JhciB7XG4gICAgcHVibGljIG1lc3NhZ2VzOiBTdGF0dXNCYXJNZXNzYWdlW10gPSBbXTtcbiAgICBwdWJsaWMgY3VycmVudE1lc3NhZ2U6IFN0YXR1c0Jhck1lc3NhZ2U7XG4gICAgcHVibGljIGxhc3RNZXNzYWdlVGltZXN0YW1wOiBudW1iZXI7XG5cbiAgICBwcml2YXRlIHN0YXR1c0JhckVsOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIHBsdWdpbjogT2JzaWRpYW5HaXQ7XG5cbiAgICBjb25zdHJ1Y3RvcihzdGF0dXNCYXJFbDogSFRNTEVsZW1lbnQsIHBsdWdpbjogT2JzaWRpYW5HaXQpIHtcbiAgICAgICAgdGhpcy5zdGF0dXNCYXJFbCA9IHN0YXR1c0JhckVsO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcGxheU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCB0aW1lb3V0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBnaXQ6ICR7bWVzc2FnZS5zbGljZSgwLCAxMDApfWAsXG4gICAgICAgICAgICB0aW1lb3V0OiB0aW1lb3V0LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3BsYXkoKSB7XG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VzLmxlbmd0aCA+IDAgJiYgIXRoaXMuY3VycmVudE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLnNldFRleHQodGhpcy5jdXJyZW50TWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHRoaXMubGFzdE1lc3NhZ2VUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VBZ2UgPSBEYXRlLm5vdygpIC0gdGhpcy5sYXN0TWVzc2FnZVRpbWVzdGFtcDtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlQWdlID49IHRoaXMuY3VycmVudE1lc3NhZ2UudGltZW91dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdE1lc3NhZ2VUaW1lc3RhbXAgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5U3RhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGlzcGxheVN0YXRlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGx1Z2luLnN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlIFBsdWdpblN0YXRlLmlkbGU6XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RnJvbU5vdyh0aGlzLnBsdWdpbi5sYXN0VXBkYXRlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGx1Z2luU3RhdGUuc3RhdHVzOlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0VGV4dChcImdpdDogY2hlY2tpbmcgcmVwbyBzdGF0dXMuLlwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGx1Z2luU3RhdGUuYWRkOlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0VGV4dChcImdpdDogYWRkaW5nIGZpbGVzIHRvIHJlcG8uLlwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGx1Z2luU3RhdGUuY29tbWl0OlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0VGV4dChcImdpdDogY29tbWl0dGluZyBjaGFuZ2VzLi5cIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBsdWdpblN0YXRlLnB1c2g6XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5zZXRUZXh0KFwiZ2l0OiBwdXNoaW5nIGNoYW5nZXMuLlwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGx1Z2luU3RhdGUucHVsbDpcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0JhckVsLnNldFRleHQoXCJnaXQ6IHB1bGxpbmcgY2hhbmdlcy4uXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQbHVnaW5TdGF0ZS5jb25mbGljdGVkOlxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQmFyRWwuc2V0VGV4dChcImdpdDogeW91IGhhdmUgY29uZmxpY3QgZmlsZXMuLlwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5zZXRUZXh0KFwiZ2l0OiBmYWlsZWQgb24gaW5pdGlhbGl6YXRpb24hXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNwbGF5RnJvbU5vdyh0aW1lc3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGltZXN0YW1wKSB7XG4gICAgICAgICAgICBsZXQgbW9tZW50ID0gKHdpbmRvdyBhcyBhbnkpLm1vbWVudDtcbiAgICAgICAgICAgIGxldCBmcm9tTm93ID0gbW9tZW50KHRpbWVzdGFtcCkuZnJvbU5vdygpO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5zZXRUZXh0KGBnaXQ6IGxhc3QgdXBkYXRlICR7ZnJvbU5vd30uLmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNCYXJFbC5zZXRUZXh0KGBnaXQ6IHJlYWR5YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDdXN0b21NZXNzYWdlTW9kYWwgZXh0ZW5kcyBTdWdnZXN0TW9kYWw8c3RyaW5nPiB7XG4gICAgcGx1Z2luOiBPYnNpZGlhbkdpdDtcblxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbjogT2JzaWRpYW5HaXQpIHtcbiAgICAgICAgc3VwZXIocGx1Z2luLmFwcCk7XG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICAgICAgICB0aGlzLnNldFBsYWNlaG9sZGVyKFwiVHlwZSB5b3VyIG1lc3NhZ2UgYW5kIHNlbGVjdCBvcHRpb25hbCB0aGUgdmVyc2lvbiB3aXRoIHRoZSBhZGRlZCBkYXRlLlwiKTtcbiAgICB9XG5cblxuICAgIGdldFN1Z2dlc3Rpb25zKHF1ZXJ5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSAod2luZG93IGFzIGFueSkubW9tZW50KCkuZm9ybWF0KHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbW1pdERhdGVGb3JtYXQpO1xuICAgICAgICBpZiAocXVlcnkgPT0gXCJcIikgcXVlcnkgPSBcIi4uLlwiO1xuICAgICAgICByZXR1cm4gW3F1ZXJ5LCBgJHtkYXRlfTogJHtxdWVyeX1gLCBgJHtxdWVyeX06ICR7ZGF0ZX1gXTtcbiAgICB9XG5cbiAgICByZW5kZXJTdWdnZXN0aW9uKHZhbHVlOiBzdHJpbmcsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBlbC5pbm5lclRleHQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBvbkNob29zZVN1Z2dlc3Rpb24oaXRlbTogc3RyaW5nLCBfOiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBsdWdpbi5wcm9taXNlUXVldWUuYWRkVGFzaygoKSA9PiB0aGlzLnBsdWdpbi5jcmVhdGVCYWNrdXAoZmFsc2UsIGl0ZW0pKTtcbiAgICB9XG5cbn1cbmNsYXNzIENoYW5nZWRGaWxlc01vZGFsIGV4dGVuZHMgRnV6enlTdWdnZXN0TW9kYWw8RmlsZVN0YXR1c1Jlc3VsdD4ge1xuICAgIHBsdWdpbjogT2JzaWRpYW5HaXQ7XG4gICAgY2hhbmdlZEZpbGVzOiBGaWxlU3RhdHVzUmVzdWx0W107XG5cbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IE9ic2lkaWFuR2l0LCBjaGFuZ2VkRmlsZXM6IEZpbGVTdGF0dXNSZXN1bHRbXSkge1xuICAgICAgICBzdXBlcihwbHVnaW4uYXBwKTtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgICAgIHRoaXMuY2hhbmdlZEZpbGVzID0gY2hhbmdlZEZpbGVzO1xuICAgICAgICB0aGlzLnNldFBsYWNlaG9sZGVyKFwiTm90IHN1cHBvcnRlZCBmaWxlcyB3aWxsIGJlIG9wZW5lZCBieSBkZWZhdWx0IGFwcCFcIik7XG4gICAgfVxuXG4gICAgZ2V0SXRlbXMoKTogRmlsZVN0YXR1c1Jlc3VsdFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlZEZpbGVzO1xuICAgIH1cblxuICAgIGdldEl0ZW1UZXh0KGl0ZW06IEZpbGVTdGF0dXNSZXN1bHQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoaXRlbS5pbmRleCA9PSBcIj9cIiAmJiBpdGVtLndvcmtpbmdfZGlyID09IFwiP1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYFVudHJhY2tlZCB8ICR7aXRlbS5wYXRofWA7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgd29ya2luZ19kaXIgPSBcIlwiO1xuICAgICAgICBsZXQgaW5kZXggPSBcIlwiO1xuXG4gICAgICAgIGlmIChpdGVtLndvcmtpbmdfZGlyICE9IFwiIFwiKSB3b3JraW5nX2RpciA9IGBXb3JraW5nIGRpcjogJHtpdGVtLndvcmtpbmdfZGlyfSBgO1xuICAgICAgICBpZiAoaXRlbS5pbmRleCAhPSBcIiBcIikgaW5kZXggPSBgSW5kZXg6ICR7aXRlbS5pbmRleH1gO1xuXG4gICAgICAgIHJldHVybiBgJHt3b3JraW5nX2Rpcn0ke2luZGV4fSB8ICR7aXRlbS5wYXRofWA7XG4gICAgfVxuXG4gICAgb25DaG9vc2VJdGVtKGl0ZW06IEZpbGVTdGF0dXNSZXN1bHQsIF86IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBsdWdpbi5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChpdGVtLnBhdGgsIFwiXCIpID09IG51bGwpIHtcbiAgICAgICAgICAgICh0aGlzLmFwcCBhcyBhbnkpLm9wZW5XaXRoRGVmYXVsdEFwcChpdGVtLnBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQoaXRlbS5wYXRoLCBcIi9cIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFByb21pc2VRdWV1ZSB7XG4gICAgdGFza3M6ICgoKSA9PiBQcm9taXNlPGFueT4pW10gPSBbXTtcblxuICAgIGFkZFRhc2sodGFzazogKCkgPT4gUHJvbWlzZTxhbnk+KSB7XG4gICAgICAgIHRoaXMudGFza3MucHVzaCh0YXNrKTtcbiAgICAgICAgaWYgKHRoaXMudGFza3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVRhc2soKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBoYW5kbGVUYXNrKCkge1xuICAgICAgICBpZiAodGhpcy50YXNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnRhc2tzWzBdKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXNrcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVGFzaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59Il0sIm5hbWVzIjpbImdpdF9lcnJvcl8xIiwicmVxdWlyZSQkMCIsIm9zIiwidHR5IiwidXRpbCIsInJlcXVpcmUkJDEiLCJ0aGlzIiwiZnNfMSIsImZpbGVfZXhpc3RzXzEiLCJ1dGlsXzEiLCJhcmd1bWVudF9maWx0ZXJzXzEiLCJyZXF1aXJlJCQyIiwicmVxdWlyZSQkMyIsInJlcXVpcmUkJDQiLCJyZXF1aXJlJCQ1IiwicmVxdWlyZSQkNiIsInJlcXVpcmUkJDciLCJ1dGlsc18xIiwidGFza19jb25maWd1cmF0aW9uX2Vycm9yXzEiLCJ0YXNrXzEiLCJDbGVhblN1bW1hcnlfMSIsImNoZWNrX2lzX3JlcG9fMSIsImNsZWFuXzEiLCJnaXRfY29uc3RydWN0X2Vycm9yXzEiLCJnaXRfcGx1Z2luX2Vycm9yXzEiLCJnaXRfcmVzcG9uc2VfZXJyb3JfMSIsInJlc2V0XzEiLCJkZWJ1Z18xIiwiZ2l0X2xvZ2dlcl8xIiwidGFza3NfcGVuZGluZ19xdWV1ZV8xIiwidGFzayIsImdpdEVycm9yIiwiY2hpbGRfcHJvY2Vzc18xIiwiZ2l0X2V4ZWN1dG9yX2NoYWluXzEiLCJwYXJzZV9yZW1vdGVfb2JqZWN0c18xIiwicGFyc2VfcmVtb3RlX21lc3NhZ2VzXzEiLCJwYXJzZV9wdXNoXzEiLCJ0YXNrX2NhbGxiYWNrXzEiLCJwdXNoXzEiLCJwcm9taXNlX2RlZmVycmVkXzEiLCJCcmFuY2hEZWxldGVTdW1tYXJ5XzEiLCJCcmFuY2hTdW1tYXJ5XzEiLCJwYXJzZV9icmFuY2hfZGVsZXRlXzEiLCJwYXJzZV9icmFuY2hfMSIsIkNoZWNrSWdub3JlXzEiLCJwYXJzZV9jb21taXRfMSIsInBhcnNlX2RpZmZfc3VtbWFyeV8xIiwicGFyc2VfZmV0Y2hfMSIsInBhcnNlX2xpc3RfbG9nX3N1bW1hcnlfMSIsIk1lcmdlU3VtbWFyeV8xIiwicGFyc2VfcHVsbF8xIiwicGFyc2VfbWVyZ2VfMSIsInBhcnNlX21vdmVfMSIsIkdldFJlbW90ZVN1bW1hcnlfMSIsImxvZ18xIiwicmVxdWlyZSQkOCIsInJlcXVpcmUkJDkiLCJyZXF1aXJlJCQxMCIsInJlcXVpcmUkJDExIiwicmVxdWlyZSQkMTIiLCJyZXF1aXJlJCQxMyIsInJlcXVpcmUkJDE0IiwicmVxdWlyZSQkMTUiLCJyZXF1aXJlJCQxNiIsInJlcXVpcmUkJDE3IiwicmVxdWlyZSQkMTgiLCJyZXF1aXJlJCQxOSIsInJlcXVpcmUkJDIwIiwicmVxdWlyZSQkMjEiLCJyZXF1aXJlJCQyMiIsInJlcXVpcmUkJDIzIiwicmVxdWlyZSQkMjQiLCJyZXF1aXJlJCQyNSIsInJlcXVpcmUkJDI2IiwicmVxdWlyZSQkMjciLCJyZXF1aXJlJCQyOCIsInBsdWdpbnMiLCJwbHVnaW5zXzEiLCJHaXQiLCJnaXRfZmFjdG9yeV8xIiwic2ltcGxlR2l0Iiwic3Bhd25TeW5jIiwiVEZpbGUiLCJOb3RpY2UiLCJQbHVnaW4iLCJTZXR0aW5nIiwiUGx1Z2luU2V0dGluZ1RhYiIsIlN1Z2dlc3RNb2RhbCIsIkZ1enp5U3VnZ2VzdE1vZGFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjO0FBQ3pDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNwRixRQUFRLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMxRyxJQUFJLE9BQU8sYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFDRjtBQUNPLFNBQVMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUssSUFBSTtBQUM3QyxRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLCtCQUErQixDQUFDLENBQUM7QUFDbEcsSUFBSSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLElBQUksU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQzNDLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBQ0Q7QUFDTyxJQUFJLFFBQVEsR0FBRyxXQUFXO0FBQ2pDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3JELFFBQVEsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0QsWUFBWSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLFlBQVksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekYsU0FBUztBQUNULFFBQVEsT0FBTyxDQUFDLENBQUM7QUFDakIsTUFBSztBQUNMLElBQUksT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMzQyxFQUFDO0FBNEJEO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUN0RyxRQUFRLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUN0SCxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RSxLQUFLLENBQUMsQ0FBQztBQUNQLENBQUM7QUFDRDtBQUNPLFNBQVMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDM0MsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JILElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sTUFBTSxLQUFLLFVBQVUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0osSUFBSSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0RSxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsRUFBRTtBQUN0QixRQUFRLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUN0RSxRQUFRLE9BQU8sQ0FBQyxFQUFFLElBQUk7QUFDdEIsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6SyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEQsWUFBWSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekIsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07QUFDOUMsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN4RSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUztBQUNqRSxnQkFBZ0I7QUFDaEIsb0JBQW9CLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7QUFDaEksb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDMUcsb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENB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QUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNwQyxHQUFHO0FBQ0gsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDbkIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRTtBQUNyQixFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0IsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDbEIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2QyxHQUFHO0FBQ0gsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDbEIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4QyxHQUFHO0FBQ0gsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDbEIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMxQyxHQUFHO0FBQ0gsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDbEIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMxQyxHQUFHO0FBQ0gsRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDcEIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUU7QUFDcEMsRUFBRSxJQUFJLFFBQVEsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxF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QUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxTQUFTO0FBQ1YsQ0FBQyxT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cEM7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLENBQUMsTUFBTSxhQUFhLEdBQUdILGVBQXlCLENBQUM7QUFDakQ7QUFDQSxDQUFDLElBQUksYUFBYSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxhQUFhLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRTtBQUMxRSxFQUFFLGNBQWMsR0FBRztBQUNuQixHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEVBQUU7QUFDTCxHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdBQUc7QUFDTixHQUFHLEdB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QUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSUEsS0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlKLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxLQUFLQSxLQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUlBLEtBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSUEsS0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNNLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxLQUFLQSxLQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUlBLEtBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoSyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksS0FBS0EsS0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJQSxLQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEssSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLEtBQUtBLEtBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSUEsS0FBTyxD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 diff --git a/.obsidian/plugins/obsidian-git/manifest.json b/.obsidian/plugins/obsidian-git/manifest.json new file mode 100644 index 000000000..5763293ab --- /dev/null +++ b/.obsidian/plugins/obsidian-git/manifest.json @@ -0,0 +1,8 @@ +{ + "id": "obsidian-git", + "name": "Obsidian Git", + "description": "Backup your vault with git.", + "isDesktopOnly": true, + "js": "main.js", + "version": "1.9.0" +} diff --git a/.obsidian/workspace b/.obsidian/workspace new file mode 100644 index 000000000..4bb3aae73 --- /dev/null +++ b/.obsidian/workspace @@ -0,0 +1,111 @@ +{ + "main": { + "id": "dfd308004f3fc7b5", + "type": "split", + "children": [ + { + "id": "3d7c319d327c6624", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "2021-05-07.md", + "mode": "source" + } + } + } + ], + "direction": "vertical" + }, + "left": { + "id": "2faba265b9292c7f", + "type": "split", + "children": [ + { + "id": "f510565592a031af", + "type": "tabs", + "children": [ + { + "id": "961d680309b2af56", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": {} + } + }, + { + "id": "4c9c5d93a7ed714f", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + }, + { + "id": "8af6596dc98ffa6b", + "type": "leaf", + "state": { + "type": "starred", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 300 + }, + "right": { + "id": "afe2921ea1b550bb", + "type": "split", + "children": [ + { + "id": "769f8c6855cce1d4", + "type": "tabs", + "children": [ + { + "id": "30e969c9166f9896", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "2021-05-07.md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "a62fc60423ac06f4", + "type": "leaf", + "state": { + "type": "outline", + "state": { + "file": "2021-05-07.md" + } + } + } + ] + } + ], + "direction": "horizontal", + "width": 300, + "collapsed": true + }, + "active": "3d7c319d327c6624", + "lastOpenFiles": [ + "2021-05-07.md" + ] +} \ No newline at end of file diff --git a/2020 04 03.md b/2020-04-03.md similarity index 100% rename from 2020 04 03.md rename to 2020-04-03.md diff --git a/2020 04 05.md b/2020-04-05.md similarity index 100% rename from 2020 04 05.md rename to 2020-04-05.md diff --git a/2020 04 06.md b/2020-04-06.md similarity index 100% rename from 2020 04 06.md rename to 2020-04-06.md diff --git a/2020 04 07.md b/2020-04-07.md similarity index 100% rename from 2020 04 07.md rename to 2020-04-07.md diff --git a/2020 04 09.md b/2020-04-09.md similarity index 100% rename from 2020 04 09.md rename to 2020-04-09.md diff --git a/2020 04 10.md b/2020-04-10.md similarity index 100% rename from 2020 04 10.md rename to 2020-04-10.md diff --git a/2020 04 11.md b/2020-04-11.md similarity index 100% rename from 2020 04 11.md rename to 2020-04-11.md diff --git a/2020 04 12.md b/2020-04-12.md similarity index 100% rename from 2020 04 12.md rename to 2020-04-12.md diff --git a/2020 04 13.md b/2020-04-13.md similarity index 100% rename from 2020 04 13.md rename to 2020-04-13.md diff --git a/2020 04 17.md b/2020-04-17.md similarity index 100% rename from 2020 04 17.md rename to 2020-04-17.md diff --git a/2020 04 18.md b/2020-04-18.md similarity index 100% rename from 2020 04 18.md rename to 2020-04-18.md diff --git a/2020 04 19.md b/2020-04-19.md similarity index 100% rename from 2020 04 19.md rename to 2020-04-19.md diff --git a/2020 04 22.md b/2020-04-22.md similarity index 100% rename from 2020 04 22.md rename to 2020-04-22.md diff --git a/2020 04 23.md b/2020-04-23.md similarity index 100% rename from 2020 04 23.md rename to 2020-04-23.md diff --git a/2020 04 24.md b/2020-04-24.md similarity index 100% rename from 2020 04 24.md rename to 2020-04-24.md diff --git a/2020 04 25.md b/2020-04-25.md similarity index 100% rename from 2020 04 25.md rename to 2020-04-25.md diff --git a/2020 04 26.md b/2020-04-26.md similarity index 100% rename from 2020 04 26.md rename to 2020-04-26.md diff --git a/2020 04 27.md b/2020-04-27.md similarity index 100% rename from 2020 04 27.md rename to 2020-04-27.md diff --git a/2020 05 01.md b/2020-05-01.md similarity index 100% rename from 2020 05 01.md rename to 2020-05-01.md diff --git a/2020 05 02.md b/2020-05-02.md similarity index 100% rename from 2020 05 02.md rename to 2020-05-02.md diff --git a/2020 05 03.md b/2020-05-03.md similarity index 100% rename from 2020 05 03.md rename to 2020-05-03.md diff --git a/2020 05 04.md b/2020-05-04.md similarity index 100% rename from 2020 05 04.md rename to 2020-05-04.md diff --git a/2020 05 05.md b/2020-05-05.md similarity index 100% rename from 2020 05 05.md rename to 2020-05-05.md diff --git a/2020 05 06.md b/2020-05-06.md similarity index 100% rename from 2020 05 06.md rename to 2020-05-06.md diff --git a/2020 05 07.md b/2020-05-07.md similarity index 100% rename from 2020 05 07.md rename to 2020-05-07.md diff --git a/2020 05 08.md b/2020-05-08.md similarity index 100% rename from 2020 05 08.md rename to 2020-05-08.md diff --git a/2020 05 09.md b/2020-05-09.md similarity index 100% rename from 2020 05 09.md rename to 2020-05-09.md diff --git a/2020 05 10.md b/2020-05-10.md similarity index 100% rename from 2020 05 10.md rename to 2020-05-10.md diff --git a/2020 05 15.md b/2020-05-15.md similarity index 100% rename from 2020 05 15.md rename to 2020-05-15.md diff --git a/2020 05 16.md b/2020-05-16.md similarity index 100% rename from 2020 05 16.md rename to 2020-05-16.md diff --git a/2020 05 17.md b/2020-05-17.md similarity index 100% rename from 2020 05 17.md rename to 2020-05-17.md diff --git a/2020 05 18.md b/2020-05-18.md similarity index 100% rename from 2020 05 18.md rename to 2020-05-18.md diff --git a/2020 05 19.md b/2020-05-19.md similarity index 100% rename from 2020 05 19.md rename to 2020-05-19.md diff --git a/2020 05 20.md b/2020-05-20.md similarity index 100% rename from 2020 05 20.md rename to 2020-05-20.md diff --git a/2020 05 21.md b/2020-05-21.md similarity index 100% rename from 2020 05 21.md rename to 2020-05-21.md diff --git a/2020 05 22.md b/2020-05-22.md similarity index 100% rename from 2020 05 22.md rename to 2020-05-22.md diff --git a/2020 05 23.md b/2020-05-23.md similarity index 100% rename from 2020 05 23.md rename to 2020-05-23.md diff --git a/2020 05 24.md b/2020-05-24.md similarity index 100% rename from 2020 05 24.md rename to 2020-05-24.md diff --git a/2020 06 01.md b/2020-06-01.md similarity index 100% rename from 2020 06 01.md rename to 2020-06-01.md diff --git a/2020 06 02.md b/2020-06-02.md similarity index 100% rename from 2020 06 02.md rename to 2020-06-02.md diff --git a/2020 06 03.md b/2020-06-03.md similarity index 100% rename from 2020 06 03.md rename to 2020-06-03.md diff --git a/2020 06 04.md b/2020-06-04.md similarity index 100% rename from 2020 06 04.md rename to 2020-06-04.md diff --git a/2020 06 06.md b/2020-06-06.md similarity index 100% rename from 2020 06 06.md rename to 2020-06-06.md diff --git a/2020 06 07.md b/2020-06-07.md similarity index 100% rename from 2020 06 07.md rename to 2020-06-07.md diff --git a/2020 06 08.md b/2020-06-08.md similarity index 100% rename from 2020 06 08.md rename to 2020-06-08.md diff --git a/2020 06 09.md b/2020-06-09.md similarity index 100% rename from 2020 06 09.md rename to 2020-06-09.md diff --git a/2020 06 10.md b/2020-06-10.md similarity index 100% rename from 2020 06 10.md rename to 2020-06-10.md diff --git a/2020 06 11.md b/2020-06-11.md similarity index 100% rename from 2020 06 11.md rename to 2020-06-11.md diff --git a/2020 06 12.md b/2020-06-12.md similarity index 100% rename from 2020 06 12.md rename to 2020-06-12.md diff --git a/2020 06 13.md b/2020-06-13.md similarity index 100% rename from 2020 06 13.md rename to 2020-06-13.md diff --git a/2020 06 14.md b/2020-06-14.md similarity index 100% rename from 2020 06 14.md rename to 2020-06-14.md diff --git a/2020 06 15.md b/2020-06-15.md similarity index 100% rename from 2020 06 15.md rename to 2020-06-15.md diff --git a/2020 06 16.md b/2020-06-16.md similarity index 100% rename from 2020 06 16.md rename to 2020-06-16.md diff --git a/2020 06 17.md b/2020-06-17.md similarity index 100% rename from 2020 06 17.md rename to 2020-06-17.md diff --git a/2020 06 18.md b/2020-06-18.md similarity index 100% rename from 2020 06 18.md rename to 2020-06-18.md diff --git a/2020 06 19.md b/2020-06-19.md similarity index 100% rename from 2020 06 19.md rename to 2020-06-19.md diff --git a/2020 06 20.md b/2020-06-20.md similarity index 100% rename from 2020 06 20.md rename to 2020-06-20.md diff --git a/2020 06 21.md b/2020-06-21.md similarity index 100% rename from 2020 06 21.md rename to 2020-06-21.md diff --git a/2020 06 24.md b/2020-06-24.md similarity index 100% rename from 2020 06 24.md rename to 2020-06-24.md diff --git a/2020 06 27.md b/2020-06-27.md similarity index 100% rename from 2020 06 27.md rename to 2020-06-27.md diff --git a/2020 06 28.md b/2020-06-28.md similarity index 100% rename from 2020 06 28.md rename to 2020-06-28.md diff --git a/2020 06 29.md b/2020-06-29.md similarity index 100% rename from 2020 06 29.md rename to 2020-06-29.md diff --git a/2020 07 04.md b/2020-07-04.md similarity index 100% rename from 2020 07 04.md rename to 2020-07-04.md diff --git a/2020 07 05.md b/2020-07-05.md similarity index 100% rename from 2020 07 05.md rename to 2020-07-05.md diff --git a/2020 07 06.md b/2020-07-06.md similarity index 100% rename from 2020 07 06.md rename to 2020-07-06.md diff --git a/2020 07 07.md b/2020-07-07.md similarity index 100% rename from 2020 07 07.md rename to 2020-07-07.md diff --git a/2020 07 08.md b/2020-07-08.md similarity index 100% rename from 2020 07 08.md rename to 2020-07-08.md diff --git a/2020 07 09.md b/2020-07-09.md similarity index 100% rename from 2020 07 09.md rename to 2020-07-09.md diff --git a/2020 07 10.md b/2020-07-10.md similarity index 100% rename from 2020 07 10.md rename to 2020-07-10.md diff --git a/2020 07 11.md b/2020-07-11.md similarity index 100% rename from 2020 07 11.md rename to 2020-07-11.md diff --git a/2020 07 12.md b/2020-07-12.md similarity index 100% rename from 2020 07 12.md rename to 2020-07-12.md diff --git a/2020 07 14.md b/2020-07-14.md similarity index 100% rename from 2020 07 14.md rename to 2020-07-14.md diff --git a/2020 07 15.md b/2020-07-15.md similarity index 100% rename from 2020 07 15.md rename to 2020-07-15.md diff --git a/2020 07 16.md b/2020-07-16.md similarity index 100% rename from 2020 07 16.md rename to 2020-07-16.md diff --git a/2020 07 17.md b/2020-07-17.md similarity index 100% rename from 2020 07 17.md rename to 2020-07-17.md diff --git a/2020 07 18.md b/2020-07-18.md similarity index 100% rename from 2020 07 18.md rename to 2020-07-18.md diff --git a/2020 07 19.md b/2020-07-19.md similarity index 100% rename from 2020 07 19.md rename to 2020-07-19.md diff --git a/2020 07 20.md b/2020-07-20.md similarity index 100% rename from 2020 07 20.md rename to 2020-07-20.md diff --git a/2020 07 21.md b/2020-07-21.md similarity index 100% rename from 2020 07 21.md rename to 2020-07-21.md diff --git a/2020 07 22.md b/2020-07-22.md similarity index 100% rename from 2020 07 22.md rename to 2020-07-22.md diff --git a/2020 07 23.md b/2020-07-23.md similarity index 100% rename from 2020 07 23.md rename to 2020-07-23.md diff --git a/2020 07 24.md b/2020-07-24.md similarity index 100% rename from 2020 07 24.md rename to 2020-07-24.md diff --git a/2020 07 25.md b/2020-07-25.md similarity index 100% rename from 2020 07 25.md rename to 2020-07-25.md diff --git a/2020 07 26.md b/2020-07-26.md similarity index 100% rename from 2020 07 26.md rename to 2020-07-26.md diff --git a/2020 07 27.md b/2020-07-27.md similarity index 100% rename from 2020 07 27.md rename to 2020-07-27.md diff --git a/2020 07 29.md b/2020-07-29.md similarity index 100% rename from 2020 07 29.md rename to 2020-07-29.md diff --git a/2020 07 30.md b/2020-07-30.md similarity index 100% rename from 2020 07 30.md rename to 2020-07-30.md diff --git a/2020 07 31.md b/2020-07-31.md similarity index 100% rename from 2020 07 31.md rename to 2020-07-31.md diff --git a/2020 08 01.md b/2020-08-01.md similarity index 100% rename from 2020 08 01.md rename to 2020-08-01.md diff --git a/2020 08 02.md b/2020-08-02.md similarity index 100% rename from 2020 08 02.md rename to 2020-08-02.md diff --git a/2020 08 03.md b/2020-08-03.md similarity index 100% rename from 2020 08 03.md rename to 2020-08-03.md diff --git a/2020 08 04.md b/2020-08-04.md similarity index 100% rename from 2020 08 04.md rename to 2020-08-04.md diff --git a/2020 08 05.md b/2020-08-05.md similarity index 100% rename from 2020 08 05.md rename to 2020-08-05.md diff --git a/2020 08 06.md b/2020-08-06.md similarity index 100% rename from 2020 08 06.md rename to 2020-08-06.md diff --git a/2020 08 07.md b/2020-08-07.md similarity index 100% rename from 2020 08 07.md rename to 2020-08-07.md diff --git a/2020 08 08.md b/2020-08-08.md similarity index 100% rename from 2020 08 08.md rename to 2020-08-08.md diff --git a/2020 08 09.md b/2020-08-09.md similarity index 100% rename from 2020 08 09.md rename to 2020-08-09.md diff --git a/2020 08 10.md b/2020-08-10.md similarity index 100% rename from 2020 08 10.md rename to 2020-08-10.md diff --git a/2020 08 11.md b/2020-08-11.md similarity index 100% rename from 2020 08 11.md rename to 2020-08-11.md diff --git a/2020 08 12.md b/2020-08-12.md similarity index 100% rename from 2020 08 12.md rename to 2020-08-12.md diff --git a/2020 08 13.md b/2020-08-13.md similarity index 100% rename from 2020 08 13.md rename to 2020-08-13.md diff --git a/2020 08 14.md b/2020-08-14.md similarity index 100% rename from 2020 08 14.md rename to 2020-08-14.md diff --git a/2020 08 15.md b/2020-08-15.md similarity index 100% rename from 2020 08 15.md rename to 2020-08-15.md diff --git a/2020 08 16.md b/2020-08-16.md similarity index 100% rename from 2020 08 16.md rename to 2020-08-16.md diff --git a/2020 08 17.md b/2020-08-17.md similarity index 100% rename from 2020 08 17.md rename to 2020-08-17.md diff --git a/2020 08 18.md b/2020-08-18.md similarity index 100% rename from 2020 08 18.md rename to 2020-08-18.md diff --git a/2020 08 19.md b/2020-08-19.md similarity index 100% rename from 2020 08 19.md rename to 2020-08-19.md diff --git a/2020 08 20.md b/2020-08-20.md similarity index 100% rename from 2020 08 20.md rename to 2020-08-20.md diff --git a/2020 08 21.md b/2020-08-21.md similarity index 100% rename from 2020 08 21.md rename to 2020-08-21.md diff --git a/2020 08 22.md b/2020-08-22.md similarity index 100% rename from 2020 08 22.md rename to 2020-08-22.md diff --git a/2020 08 23.md b/2020-08-23.md similarity index 100% rename from 2020 08 23.md rename to 2020-08-23.md diff --git a/2020 08 24.md b/2020-08-24.md similarity index 100% rename from 2020 08 24.md rename to 2020-08-24.md diff --git a/2020 08 25.md b/2020-08-25.md similarity index 100% rename from 2020 08 25.md rename to 2020-08-25.md diff --git a/2020 08 26.md b/2020-08-26.md similarity index 100% rename from 2020 08 26.md rename to 2020-08-26.md diff --git a/2020 08 27.md b/2020-08-27.md similarity index 100% rename from 2020 08 27.md rename to 2020-08-27.md diff --git a/2020 08 28.md b/2020-08-28.md similarity index 100% rename from 2020 08 28.md rename to 2020-08-28.md diff --git a/2020 08 29.md b/2020-08-29.md similarity index 100% rename from 2020 08 29.md rename to 2020-08-29.md diff --git a/2020 08 30.md b/2020-08-30.md similarity index 100% rename from 2020 08 30.md rename to 2020-08-30.md diff --git a/2020 08 31.md b/2020-08-31.md similarity index 100% rename from 2020 08 31.md rename to 2020-08-31.md diff --git a/2020 09 01.md b/2020-09-01.md similarity index 100% rename from 2020 09 01.md rename to 2020-09-01.md diff --git a/2020 09 02.md b/2020-09-02.md similarity index 100% rename from 2020 09 02.md rename to 2020-09-02.md diff --git a/2020 09 03.md b/2020-09-03.md similarity index 100% rename from 2020 09 03.md rename to 2020-09-03.md diff --git a/2020 09 04.md b/2020-09-04.md similarity index 100% rename from 2020 09 04.md rename to 2020-09-04.md diff --git a/2020 09 05.md b/2020-09-05.md similarity index 100% rename from 2020 09 05.md rename to 2020-09-05.md diff --git a/2020 09 06.md b/2020-09-06.md similarity index 100% rename from 2020 09 06.md rename to 2020-09-06.md diff --git a/2020 09 07.md b/2020-09-07.md similarity index 100% rename from 2020 09 07.md rename to 2020-09-07.md diff --git a/2020 09 08.md b/2020-09-08.md similarity index 100% rename from 2020 09 08.md rename to 2020-09-08.md diff --git a/2020 09 09.md b/2020-09-09.md similarity index 100% rename from 2020 09 09.md rename to 2020-09-09.md diff --git a/2020 09 10.md b/2020-09-10.md similarity index 100% rename from 2020 09 10.md rename to 2020-09-10.md diff --git a/2020 09 11.md b/2020-09-11.md similarity index 100% rename from 2020 09 11.md rename to 2020-09-11.md diff --git a/2020 09 12.md b/2020-09-12.md similarity index 100% rename from 2020 09 12.md rename to 2020-09-12.md diff --git a/2020 09 13.md b/2020-09-13.md similarity index 100% rename from 2020 09 13.md rename to 2020-09-13.md diff --git a/2020 09 14.md b/2020-09-14.md similarity index 100% rename from 2020 09 14.md rename to 2020-09-14.md diff --git a/2020 09 15.md b/2020-09-15.md similarity index 100% rename from 2020 09 15.md rename to 2020-09-15.md diff --git a/2020 09 16.md b/2020-09-16.md similarity index 100% rename from 2020 09 16.md rename to 2020-09-16.md diff --git a/2020 09 17.md b/2020-09-17.md similarity index 100% rename from 2020 09 17.md rename to 2020-09-17.md diff --git a/2020 09 18.md b/2020-09-18.md similarity index 100% rename from 2020 09 18.md rename to 2020-09-18.md diff --git a/2020 09 19.md b/2020-09-19.md similarity index 100% rename from 2020 09 19.md rename to 2020-09-19.md diff --git a/2020 09 20.md b/2020-09-20.md similarity index 100% rename from 2020 09 20.md rename to 2020-09-20.md diff --git a/2020 09 21.md b/2020-09-21.md similarity index 100% rename from 2020 09 21.md rename to 2020-09-21.md diff --git a/2020 09 22.md b/2020-09-22.md similarity index 100% rename from 2020 09 22.md rename to 2020-09-22.md diff --git a/2020 09 23.md b/2020-09-23.md similarity index 100% rename from 2020 09 23.md rename to 2020-09-23.md diff --git a/2020 09 24.md b/2020-09-24.md similarity index 100% rename from 2020 09 24.md rename to 2020-09-24.md diff --git a/2020 09 25.md b/2020-09-25.md similarity index 100% rename from 2020 09 25.md rename to 2020-09-25.md diff --git a/2020 09 26.md b/2020-09-26.md similarity index 100% rename from 2020 09 26.md rename to 2020-09-26.md diff --git a/2020 09 27.md b/2020-09-27.md similarity index 100% rename from 2020 09 27.md rename to 2020-09-27.md diff --git a/2020 09 28.md b/2020-09-28.md similarity index 100% rename from 2020 09 28.md rename to 2020-09-28.md diff --git a/2020 09 29.md b/2020-09-29.md similarity index 100% rename from 2020 09 29.md rename to 2020-09-29.md diff --git a/2020 09 30.md b/2020-09-30.md similarity index 100% rename from 2020 09 30.md rename to 2020-09-30.md diff --git a/2020 10 01.md b/2020-10-01.md similarity index 100% rename from 2020 10 01.md rename to 2020-10-01.md diff --git a/2020 10 02.md b/2020-10-02.md similarity index 100% rename from 2020 10 02.md rename to 2020-10-02.md diff --git a/2020 10 03.md b/2020-10-03.md similarity index 100% rename from 2020 10 03.md rename to 2020-10-03.md diff --git a/2020 10 04.md b/2020-10-04.md similarity index 100% rename from 2020 10 04.md rename to 2020-10-04.md diff --git a/2020 10 05.md b/2020-10-05.md similarity index 100% rename from 2020 10 05.md rename to 2020-10-05.md diff --git a/2020 10 06.md b/2020-10-06.md similarity index 100% rename from 2020 10 06.md rename to 2020-10-06.md diff --git a/2020 10 07.md b/2020-10-07.md similarity index 100% rename from 2020 10 07.md rename to 2020-10-07.md diff --git a/2020 10 08.md b/2020-10-08.md similarity index 100% rename from 2020 10 08.md rename to 2020-10-08.md diff --git a/2020 10 09.md b/2020-10-09.md similarity index 100% rename from 2020 10 09.md rename to 2020-10-09.md diff --git a/2020 10 10.md b/2020-10-10.md similarity index 100% rename from 2020 10 10.md rename to 2020-10-10.md diff --git a/2020 10 11.md b/2020-10-11.md similarity index 100% rename from 2020 10 11.md rename to 2020-10-11.md diff --git a/2020 10 12.md b/2020-10-12.md similarity index 100% rename from 2020 10 12.md rename to 2020-10-12.md diff --git a/2020 10 13.md b/2020-10-13.md similarity index 100% rename from 2020 10 13.md rename to 2020-10-13.md diff --git a/2020 10 14.md b/2020-10-14.md similarity index 100% rename from 2020 10 14.md rename to 2020-10-14.md diff --git a/2020 10 15.md b/2020-10-15.md similarity index 100% rename from 2020 10 15.md rename to 2020-10-15.md diff --git a/2020 10 16.md b/2020-10-16.md similarity index 100% rename from 2020 10 16.md rename to 2020-10-16.md diff --git a/2020 10 17.md b/2020-10-17.md similarity index 100% rename from 2020 10 17.md rename to 2020-10-17.md diff --git a/2020 10 18.md b/2020-10-18.md similarity index 100% rename from 2020 10 18.md rename to 2020-10-18.md diff --git a/2020 10 19.md b/2020-10-19.md similarity index 100% rename from 2020 10 19.md rename to 2020-10-19.md diff --git a/2020 10 20.md b/2020-10-20.md similarity index 100% rename from 2020 10 20.md rename to 2020-10-20.md diff --git a/2020 10 21.md b/2020-10-21.md similarity index 100% rename from 2020 10 21.md rename to 2020-10-21.md diff --git a/2020 10 22.md b/2020-10-22.md similarity index 100% rename from 2020 10 22.md rename to 2020-10-22.md diff --git a/2020 10 23.md b/2020-10-23.md similarity index 100% rename from 2020 10 23.md rename to 2020-10-23.md diff --git a/2020 10 24.md b/2020-10-24.md similarity index 100% rename from 2020 10 24.md rename to 2020-10-24.md diff --git a/2020 10 25.md b/2020-10-25.md similarity index 100% rename from 2020 10 25.md rename to 2020-10-25.md diff --git a/2020 10 26.md b/2020-10-26.md similarity index 100% rename from 2020 10 26.md rename to 2020-10-26.md diff --git a/2020 10 27.md b/2020-10-27.md similarity index 100% rename from 2020 10 27.md rename to 2020-10-27.md diff --git a/2020 10 28.md b/2020-10-28.md similarity index 100% rename from 2020 10 28.md rename to 2020-10-28.md diff --git a/2020 10 29.md b/2020-10-29.md similarity index 100% rename from 2020 10 29.md rename to 2020-10-29.md diff --git a/2020 10 30.md b/2020-10-30.md similarity index 100% rename from 2020 10 30.md rename to 2020-10-30.md diff --git a/2020 10 31.md b/2020-10-31.md similarity index 100% rename from 2020 10 31.md rename to 2020-10-31.md diff --git a/2020 11 01.md b/2020-11-01.md similarity index 100% rename from 2020 11 01.md rename to 2020-11-01.md diff --git a/2020 11 02.md b/2020-11-02.md similarity index 100% rename from 2020 11 02.md rename to 2020-11-02.md diff --git a/2020 11 03.md b/2020-11-03.md similarity index 100% rename from 2020 11 03.md rename to 2020-11-03.md diff --git a/2020 11 04.md b/2020-11-04.md similarity index 100% rename from 2020 11 04.md rename to 2020-11-04.md diff --git a/2020 11 05.md b/2020-11-05.md similarity index 100% rename from 2020 11 05.md rename to 2020-11-05.md diff --git a/2020 11 06.md b/2020-11-06.md similarity index 100% rename from 2020 11 06.md rename to 2020-11-06.md diff --git a/2020 11 07.md b/2020-11-07.md similarity index 100% rename from 2020 11 07.md rename to 2020-11-07.md diff --git a/2020 11 08.md b/2020-11-08.md similarity index 100% rename from 2020 11 08.md rename to 2020-11-08.md diff --git a/2020 11 09.md b/2020-11-09.md similarity index 100% rename from 2020 11 09.md rename to 2020-11-09.md diff --git a/2020 11 10.md b/2020-11-10.md similarity index 100% rename from 2020 11 10.md rename to 2020-11-10.md diff --git a/2020 11 11.md b/2020-11-11.md similarity index 100% rename from 2020 11 11.md rename to 2020-11-11.md diff --git a/2020 11 12.md b/2020-11-12.md similarity index 100% rename from 2020 11 12.md rename to 2020-11-12.md diff --git a/2020 11 13.md b/2020-11-13.md similarity index 100% rename from 2020 11 13.md rename to 2020-11-13.md diff --git a/2020 11 14.md b/2020-11-14.md similarity index 100% rename from 2020 11 14.md rename to 2020-11-14.md diff --git a/2020 11 15.md b/2020-11-15.md similarity index 100% rename from 2020 11 15.md rename to 2020-11-15.md diff --git a/2020 11 16.md b/2020-11-16.md similarity index 100% rename from 2020 11 16.md rename to 2020-11-16.md diff --git a/2020 11 17.md b/2020-11-17.md similarity index 100% rename from 2020 11 17.md rename to 2020-11-17.md diff --git a/2020 11 18.md b/2020-11-18.md similarity index 100% rename from 2020 11 18.md rename to 2020-11-18.md diff --git a/2020 11 19.md b/2020-11-19.md similarity index 100% rename from 2020 11 19.md rename to 2020-11-19.md diff --git a/2020 11 20.md b/2020-11-20.md similarity index 100% rename from 2020 11 20.md rename to 2020-11-20.md diff --git a/2020 11 21.md b/2020-11-21.md similarity index 100% rename from 2020 11 21.md rename to 2020-11-21.md diff --git a/2020 11 22.md b/2020-11-22.md similarity index 100% rename from 2020 11 22.md rename to 2020-11-22.md diff --git a/2020 11 23.md b/2020-11-23.md similarity index 100% rename from 2020 11 23.md rename to 2020-11-23.md diff --git a/2020 11 24.md b/2020-11-24.md similarity index 100% rename from 2020 11 24.md rename to 2020-11-24.md diff --git a/2020 11 25.md b/2020-11-25.md similarity index 100% rename from 2020 11 25.md rename to 2020-11-25.md diff --git a/2020 11 26.md b/2020-11-26.md similarity index 100% rename from 2020 11 26.md rename to 2020-11-26.md diff --git a/2020 11 27.md b/2020-11-27.md similarity index 100% rename from 2020 11 27.md rename to 2020-11-27.md diff --git a/2020 11 28.md b/2020-11-28.md similarity index 100% rename from 2020 11 28.md rename to 2020-11-28.md diff --git a/2020 11 29.md b/2020-11-29.md similarity index 100% rename from 2020 11 29.md rename to 2020-11-29.md diff --git a/2020 11 30.md b/2020-11-30.md similarity index 100% rename from 2020 11 30.md rename to 2020-11-30.md diff --git a/2020 12 01.md b/2020-12-01.md similarity index 100% rename from 2020 12 01.md rename to 2020-12-01.md diff --git a/2020 12 02.md b/2020-12-02.md similarity index 100% rename from 2020 12 02.md rename to 2020-12-02.md diff --git a/2020 12 03.md b/2020-12-03.md similarity index 100% rename from 2020 12 03.md rename to 2020-12-03.md diff --git a/2020 12 04.md b/2020-12-04.md similarity index 100% rename from 2020 12 04.md rename to 2020-12-04.md diff --git a/2020 12 05.md b/2020-12-05.md similarity index 100% rename from 2020 12 05.md rename to 2020-12-05.md diff --git a/2020 12 06.md b/2020-12-06.md similarity index 100% rename from 2020 12 06.md rename to 2020-12-06.md diff --git a/2020 12 07.md b/2020-12-07.md similarity index 100% rename from 2020 12 07.md rename to 2020-12-07.md diff --git a/2020 12 08.md b/2020-12-08.md similarity index 100% rename from 2020 12 08.md rename to 2020-12-08.md diff --git a/2020 12 09.md b/2020-12-09.md similarity index 100% rename from 2020 12 09.md rename to 2020-12-09.md diff --git a/2020 12 10.md b/2020-12-10.md similarity index 100% rename from 2020 12 10.md rename to 2020-12-10.md diff --git a/2020 12 11.md b/2020-12-11.md similarity index 100% rename from 2020 12 11.md rename to 2020-12-11.md diff --git a/2020 12 12.md b/2020-12-12.md similarity index 100% rename from 2020 12 12.md rename to 2020-12-12.md diff --git a/2020 12 13.md b/2020-12-13.md similarity index 100% rename from 2020 12 13.md rename to 2020-12-13.md diff --git a/2020 12 14.md b/2020-12-14.md similarity index 100% rename from 2020 12 14.md rename to 2020-12-14.md diff --git a/2020 12 15.md b/2020-12-15.md similarity index 100% rename from 2020 12 15.md rename to 2020-12-15.md diff --git a/2020 12 16.md b/2020-12-16.md similarity index 100% rename from 2020 12 16.md rename to 2020-12-16.md diff --git a/2020 12 17.md b/2020-12-17.md similarity index 100% rename from 2020 12 17.md rename to 2020-12-17.md diff --git a/2020 12 18.md b/2020-12-18.md similarity index 100% rename from 2020 12 18.md rename to 2020-12-18.md diff --git a/2020 12 19.md b/2020-12-19.md similarity index 100% rename from 2020 12 19.md rename to 2020-12-19.md diff --git a/2020 12 20.md b/2020-12-20.md similarity index 100% rename from 2020 12 20.md rename to 2020-12-20.md diff --git a/2020 12 21.md b/2020-12-21.md similarity index 100% rename from 2020 12 21.md rename to 2020-12-21.md diff --git a/2020 12 22.md b/2020-12-22.md similarity index 100% rename from 2020 12 22.md rename to 2020-12-22.md diff --git a/2020 12 23.md b/2020-12-23.md similarity index 100% rename from 2020 12 23.md rename to 2020-12-23.md diff --git a/2020 12 24.md b/2020-12-24.md similarity index 100% rename from 2020 12 24.md rename to 2020-12-24.md diff --git a/2020 12 25.md b/2020-12-25.md similarity index 100% rename from 2020 12 25.md rename to 2020-12-25.md diff --git a/2020 12 26.md b/2020-12-26.md similarity index 100% rename from 2020 12 26.md rename to 2020-12-26.md diff --git a/2020 12 27.md b/2020-12-27.md similarity index 100% rename from 2020 12 27.md rename to 2020-12-27.md diff --git a/2020 12 28.md b/2020-12-28.md similarity index 100% rename from 2020 12 28.md rename to 2020-12-28.md diff --git a/2020 12 29.md b/2020-12-29.md similarity index 100% rename from 2020 12 29.md rename to 2020-12-29.md diff --git a/2020 12 30.md b/2020-12-30.md similarity index 100% rename from 2020 12 30.md rename to 2020-12-30.md diff --git a/2020 12 31.md b/2020-12-31.md similarity index 100% rename from 2020 12 31.md rename to 2020-12-31.md diff --git a/2021 01 01.md b/2021-01-01.md similarity index 100% rename from 2021 01 01.md rename to 2021-01-01.md diff --git a/2021 01 02.md b/2021-01-02.md similarity index 100% rename from 2021 01 02.md rename to 2021-01-02.md diff --git a/2021 01 03.md b/2021-01-03.md similarity index 100% rename from 2021 01 03.md rename to 2021-01-03.md diff --git a/2021 01 04.md b/2021-01-04.md similarity index 100% rename from 2021 01 04.md rename to 2021-01-04.md diff --git a/2021 01 05.md b/2021-01-05.md similarity index 100% rename from 2021 01 05.md rename to 2021-01-05.md diff --git a/2021 01 06.md b/2021-01-06.md similarity index 100% rename from 2021 01 06.md rename to 2021-01-06.md diff --git a/2021 01 07.md b/2021-01-07.md similarity index 100% rename from 2021 01 07.md rename to 2021-01-07.md diff --git a/2021 01 08.md b/2021-01-08.md similarity index 100% rename from 2021 01 08.md rename to 2021-01-08.md diff --git a/2021 01 09.md b/2021-01-09.md similarity index 100% rename from 2021 01 09.md rename to 2021-01-09.md diff --git a/2021 01 10.md b/2021-01-10.md similarity index 100% rename from 2021 01 10.md rename to 2021-01-10.md diff --git a/2021 01 11.md b/2021-01-11.md similarity index 100% rename from 2021 01 11.md rename to 2021-01-11.md diff --git a/2021 01 12.md b/2021-01-12.md similarity index 100% rename from 2021 01 12.md rename to 2021-01-12.md diff --git a/2021 01 13.md b/2021-01-13.md similarity index 100% rename from 2021 01 13.md rename to 2021-01-13.md diff --git a/2021 01 14.md b/2021-01-14.md similarity index 100% rename from 2021 01 14.md rename to 2021-01-14.md diff --git a/2021 01 15.md b/2021-01-15.md similarity index 100% rename from 2021 01 15.md rename to 2021-01-15.md diff --git a/2021 01 16.md b/2021-01-16.md similarity index 100% rename from 2021 01 16.md rename to 2021-01-16.md diff --git a/2021 01 17.md b/2021-01-17.md similarity index 100% rename from 2021 01 17.md rename to 2021-01-17.md diff --git a/2021 01 18.md b/2021-01-18.md similarity index 100% rename from 2021 01 18.md rename to 2021-01-18.md diff --git a/2021 01 19.md b/2021-01-19.md similarity index 100% rename from 2021 01 19.md rename to 2021-01-19.md diff --git a/2021 01 20.md b/2021-01-20.md similarity index 100% rename from 2021 01 20.md rename to 2021-01-20.md diff --git a/2021 01 21.md b/2021-01-21.md similarity index 100% rename from 2021 01 21.md rename to 2021-01-21.md diff --git a/2021 01 22.md b/2021-01-22.md similarity index 100% rename from 2021 01 22.md rename to 2021-01-22.md diff --git a/2021 01 23.md b/2021-01-23.md similarity index 100% rename from 2021 01 23.md rename to 2021-01-23.md diff --git a/2021 01 24.md b/2021-01-24.md similarity index 100% rename from 2021 01 24.md rename to 2021-01-24.md diff --git a/2021 01 25.md b/2021-01-25.md similarity index 100% rename from 2021 01 25.md rename to 2021-01-25.md diff --git a/2021 01 26.md b/2021-01-26.md similarity index 100% rename from 2021 01 26.md rename to 2021-01-26.md diff --git a/2021 01 27.md b/2021-01-27.md similarity index 100% rename from 2021 01 27.md rename to 2021-01-27.md diff --git a/2021 01 28.md b/2021-01-28.md similarity index 100% rename from 2021 01 28.md rename to 2021-01-28.md diff --git a/2021 01 29.md b/2021-01-29.md similarity index 100% rename from 2021 01 29.md rename to 2021-01-29.md diff --git a/2021 01 30.md b/2021-01-30.md similarity index 100% rename from 2021 01 30.md rename to 2021-01-30.md diff --git a/2021 01 31.md b/2021-01-31.md similarity index 100% rename from 2021 01 31.md rename to 2021-01-31.md diff --git a/2021 02 01.md b/2021-02-01.md similarity index 100% rename from 2021 02 01.md rename to 2021-02-01.md diff --git a/2021 02 02.md b/2021-02-02.md similarity index 100% rename from 2021 02 02.md rename to 2021-02-02.md diff --git a/2021 02 03.md b/2021-02-03.md similarity index 100% rename from 2021 02 03.md rename to 2021-02-03.md diff --git a/2021 02 04.md b/2021-02-04.md similarity index 100% rename from 2021 02 04.md rename to 2021-02-04.md diff --git a/2021 02 05.md b/2021-02-05.md similarity index 100% rename from 2021 02 05.md rename to 2021-02-05.md diff --git a/2021 02 06.md b/2021-02-06.md similarity index 100% rename from 2021 02 06.md rename to 2021-02-06.md diff --git a/2021 02 07.md b/2021-02-07.md similarity index 100% rename from 2021 02 07.md rename to 2021-02-07.md diff --git a/2021 02 08.md b/2021-02-08.md similarity index 100% rename from 2021 02 08.md rename to 2021-02-08.md diff --git a/2021 02 09.md b/2021-02-09.md similarity index 100% rename from 2021 02 09.md rename to 2021-02-09.md diff --git a/2021 02 10.md b/2021-02-10.md similarity index 100% rename from 2021 02 10.md rename to 2021-02-10.md diff --git a/2021 02 11.md b/2021-02-11.md similarity index 100% rename from 2021 02 11.md rename to 2021-02-11.md diff --git a/2021 02 12.md b/2021-02-12.md similarity index 100% rename from 2021 02 12.md rename to 2021-02-12.md diff --git a/2021 02 13.md b/2021-02-13.md similarity index 100% rename from 2021 02 13.md rename to 2021-02-13.md diff --git a/2021 02 14.md b/2021-02-14.md similarity index 100% rename from 2021 02 14.md rename to 2021-02-14.md diff --git a/2021 02 15.md b/2021-02-15.md similarity index 100% rename from 2021 02 15.md rename to 2021-02-15.md diff --git a/2021 02 16.md b/2021-02-16.md similarity index 100% rename from 2021 02 16.md rename to 2021-02-16.md diff --git a/2021 02 17.md b/2021-02-17.md similarity index 100% rename from 2021 02 17.md rename to 2021-02-17.md diff --git a/2021 02 18.md b/2021-02-18.md similarity index 100% rename from 2021 02 18.md rename to 2021-02-18.md diff --git a/2021 02 19.md b/2021-02-19.md similarity index 100% rename from 2021 02 19.md rename to 2021-02-19.md diff --git a/2021 02 20.md b/2021-02-20.md similarity index 100% rename from 2021 02 20.md rename to 2021-02-20.md diff --git a/2021 02 21.md b/2021-02-21.md similarity index 100% rename from 2021 02 21.md rename to 2021-02-21.md diff --git a/2021 02 22.md b/2021-02-22.md similarity index 100% rename from 2021 02 22.md rename to 2021-02-22.md diff --git a/2021 02 23.md b/2021-02-23.md similarity index 100% rename from 2021 02 23.md rename to 2021-02-23.md diff --git a/2021 02 24.md b/2021-02-24.md similarity index 100% rename from 2021 02 24.md rename to 2021-02-24.md diff --git a/2021 02 25.md b/2021-02-25.md similarity index 100% rename from 2021 02 25.md rename to 2021-02-25.md diff --git a/2021 02 26.md b/2021-02-26.md similarity index 100% rename from 2021 02 26.md rename to 2021-02-26.md diff --git a/2021 02 27.md b/2021-02-27.md similarity index 100% rename from 2021 02 27.md rename to 2021-02-27.md diff --git a/2021 02 28.md b/2021-02-28.md similarity index 100% rename from 2021 02 28.md rename to 2021-02-28.md diff --git a/2021 03 01.md b/2021-03-01.md similarity index 100% rename from 2021 03 01.md rename to 2021-03-01.md diff --git a/2021 03 02.md b/2021-03-02.md similarity index 100% rename from 2021 03 02.md rename to 2021-03-02.md diff --git a/2021 03 03.md b/2021-03-03.md similarity index 100% rename from 2021 03 03.md rename to 2021-03-03.md diff --git a/2021 03 04.md b/2021-03-04.md similarity index 100% rename from 2021 03 04.md rename to 2021-03-04.md diff --git a/2021 03 05.md b/2021-03-05.md similarity index 100% rename from 2021 03 05.md rename to 2021-03-05.md diff --git a/2021 03 06.md b/2021-03-06.md similarity index 100% rename from 2021 03 06.md rename to 2021-03-06.md diff --git a/2021 03 07.md b/2021-03-07.md similarity index 100% rename from 2021 03 07.md rename to 2021-03-07.md diff --git a/2021 03 08.md b/2021-03-08.md similarity index 100% rename from 2021 03 08.md rename to 2021-03-08.md diff --git a/2021 03 09.md b/2021-03-09.md similarity index 100% rename from 2021 03 09.md rename to 2021-03-09.md diff --git a/2021 03 10.md b/2021-03-10.md similarity index 100% rename from 2021 03 10.md rename to 2021-03-10.md diff --git a/2021 03 11.md b/2021-03-11.md similarity index 100% rename from 2021 03 11.md rename to 2021-03-11.md diff --git a/2021 03 12.md b/2021-03-12.md similarity index 100% rename from 2021 03 12.md rename to 2021-03-12.md diff --git a/2021 03 13.md b/2021-03-13.md similarity index 100% rename from 2021 03 13.md rename to 2021-03-13.md diff --git a/2021 03 14.md b/2021-03-14.md similarity index 100% rename from 2021 03 14.md rename to 2021-03-14.md diff --git a/2021 03 15.md b/2021-03-15.md similarity index 100% rename from 2021 03 15.md rename to 2021-03-15.md diff --git a/2021 03 16.md b/2021-03-16.md similarity index 100% rename from 2021 03 16.md rename to 2021-03-16.md diff --git a/2021 03 17.md b/2021-03-17.md similarity index 100% rename from 2021 03 17.md rename to 2021-03-17.md diff --git a/2021 03 18.md b/2021-03-18.md similarity index 100% rename from 2021 03 18.md rename to 2021-03-18.md diff --git a/2021 03 19.md b/2021-03-19.md similarity index 100% rename from 2021 03 19.md rename to 2021-03-19.md diff --git a/2021 03 20.md b/2021-03-20.md similarity index 100% rename from 2021 03 20.md rename to 2021-03-20.md diff --git a/2021 03 21.md b/2021-03-21.md similarity index 100% rename from 2021 03 21.md rename to 2021-03-21.md diff --git a/2021 03 22.md b/2021-03-22.md similarity index 100% rename from 2021 03 22.md rename to 2021-03-22.md diff --git a/2021 03 23.md b/2021-03-23.md similarity index 100% rename from 2021 03 23.md rename to 2021-03-23.md diff --git a/2021 03 24.md b/2021-03-24.md similarity index 100% rename from 2021 03 24.md rename to 2021-03-24.md diff --git a/2021 03 25.md b/2021-03-25.md similarity index 100% rename from 2021 03 25.md rename to 2021-03-25.md diff --git a/2021 03 26.md b/2021-03-26.md similarity index 100% rename from 2021 03 26.md rename to 2021-03-26.md diff --git a/2021 03 27.md b/2021-03-27.md similarity index 100% rename from 2021 03 27.md rename to 2021-03-27.md diff --git a/2021 03 28.md b/2021-03-28.md similarity index 100% rename from 2021 03 28.md rename to 2021-03-28.md diff --git a/2021 03 29.md b/2021-03-29.md similarity index 100% rename from 2021 03 29.md rename to 2021-03-29.md diff --git a/2021 03 30.md b/2021-03-30.md similarity index 100% rename from 2021 03 30.md rename to 2021-03-30.md diff --git a/2021 03 31.md b/2021-03-31.md similarity index 100% rename from 2021 03 31.md rename to 2021-03-31.md diff --git a/2021 04 01.md b/2021-04-01.md similarity index 100% rename from 2021 04 01.md rename to 2021-04-01.md diff --git a/2021 04 02.md b/2021-04-02.md similarity index 100% rename from 2021 04 02.md rename to 2021-04-02.md diff --git a/2021 04 03.md b/2021-04-03.md similarity index 100% rename from 2021 04 03.md rename to 2021-04-03.md diff --git a/2021 04 05.md b/2021-04-05.md similarity index 100% rename from 2021 04 05.md rename to 2021-04-05.md diff --git a/2021 04 06.md b/2021-04-06.md similarity index 100% rename from 2021 04 06.md rename to 2021-04-06.md diff --git a/2021 04 07.md b/2021-04-07.md similarity index 100% rename from 2021 04 07.md rename to 2021-04-07.md diff --git a/2021 04 08.md b/2021-04-08.md similarity index 100% rename from 2021 04 08.md rename to 2021-04-08.md diff --git a/2021 04 09.md b/2021-04-09.md similarity index 100% rename from 2021 04 09.md rename to 2021-04-09.md diff --git a/2021 04 10.md b/2021-04-10.md similarity index 100% rename from 2021 04 10.md rename to 2021-04-10.md diff --git a/2021 04 11.md b/2021-04-11.md similarity index 100% rename from 2021 04 11.md rename to 2021-04-11.md diff --git a/2021 04 12.md b/2021-04-12.md similarity index 100% rename from 2021 04 12.md rename to 2021-04-12.md diff --git a/2021 04 13.md b/2021-04-13.md similarity index 100% rename from 2021 04 13.md rename to 2021-04-13.md diff --git a/2021 04 14.md b/2021-04-14.md similarity index 100% rename from 2021 04 14.md rename to 2021-04-14.md diff --git a/2021 04 15.md b/2021-04-15.md similarity index 100% rename from 2021 04 15.md rename to 2021-04-15.md diff --git a/2021 04 16.md b/2021-04-16.md similarity index 100% rename from 2021 04 16.md rename to 2021-04-16.md diff --git a/2021 04 17.md b/2021-04-17.md similarity index 100% rename from 2021 04 17.md rename to 2021-04-17.md diff --git a/2021 04 18.md b/2021-04-18.md similarity index 100% rename from 2021 04 18.md rename to 2021-04-18.md diff --git a/2021 04 19.md b/2021-04-19.md similarity index 100% rename from 2021 04 19.md rename to 2021-04-19.md diff --git a/2021 04 20.md b/2021-04-20.md similarity index 100% rename from 2021 04 20.md rename to 2021-04-20.md diff --git a/2021 04 21.md b/2021-04-21.md similarity index 100% rename from 2021 04 21.md rename to 2021-04-21.md diff --git a/2021 04 22.md b/2021-04-22.md similarity index 100% rename from 2021 04 22.md rename to 2021-04-22.md diff --git a/2021 04 23.md b/2021-04-23.md similarity index 100% rename from 2021 04 23.md rename to 2021-04-23.md diff --git a/2021 04 24.md b/2021-04-24.md similarity index 100% rename from 2021 04 24.md rename to 2021-04-24.md diff --git a/2021 04 25.md b/2021-04-25.md similarity index 100% rename from 2021 04 25.md rename to 2021-04-25.md diff --git a/2021 04 27.md b/2021-04-27.md similarity index 100% rename from 2021 04 27.md rename to 2021-04-27.md diff --git a/2021 04 28.md b/2021-04-28.md similarity index 100% rename from 2021 04 28.md rename to 2021-04-28.md diff --git a/2021 04 29.md b/2021-04-29.md similarity index 100% rename from 2021 04 29.md rename to 2021-04-29.md diff --git a/2021 04 30.md b/2021-04-30.md similarity index 100% rename from 2021 04 30.md rename to 2021-04-30.md diff --git a/2021 05 01.md b/2021-05-01.md similarity index 100% rename from 2021 05 01.md rename to 2021-05-01.md diff --git a/2021 05 02.md b/2021-05-02.md similarity index 100% rename from 2021 05 02.md rename to 2021-05-02.md diff --git a/2021 05 03.md b/2021-05-03.md similarity index 100% rename from 2021 05 03.md rename to 2021-05-03.md diff --git a/2021 05 04.md b/2021-05-04.md similarity index 100% rename from 2021 05 04.md rename to 2021-05-04.md diff --git a/2021 05 05.md b/2021-05-05.md similarity index 100% rename from 2021 05 05.md rename to 2021-05-05.md diff --git a/2021 05 06.md b/2021-05-06.md similarity index 100% rename from 2021 05 06.md rename to 2021-05-06.md diff --git a/2021 05 07.md b/2021-05-07.md similarity index 100% rename from 2021 05 07.md rename to 2021-05-07.md