Chapter 2
返済の重さを知る
0%
〜15% 安全圏
〜25% やや負担
25%+ 危険
Chapter 3
このままだと…純資産の推移
ライフイベント設定(ONで費用を貯蓄から差し引く)
Chapter 4
余剰資金をどう動かすか?
📈 投資シミュレーションを重ねる
余剰資金を想定利回りで複利運用した場合の純資産ライン
繰上げ返済シミュレーション
JASSO方式(期間短縮型):月額の整数倍を一括返済。複数回の繰上げを追加できます。
📋 返済スケジュール詳細・シナリオ比較
▼
CgoKJ3VzZSBzdHJpY3QnOwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICDlpajlrabph5Hjgrfjg5/jg6Xjg6zjg7zjgr/jg7wgdjMg4oCUIEphdmFTY3JpcHQKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8vIOKUgOKUgCDnirbmhYsg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNvbnN0IFMgPSB7CiAgdXNlR3Jvc3M6IGZhbHNlLCBncm9zc1k6IDM1MDAwMDAsCiAgaW5jb21lOiAyMjAwMDAsIGNvc3Q6IDEzMDAwMCwgZ3JhZDogMjIsCiAgYm9udXNNOiAzLCBib251c1k6IDY2MDAwMCwKICBpbnZSZXQ6IDUuMCwKICB1c2VUMjogdHJ1ZSwgIHQyTW9udGhseTogNTAwMDAsIHQyU3R1ZHlNOiA0OCwKICB0MkRpcmVjdFA6IG51bGwsICAgLy8g56ys5LqM56iuIOe3j+mhjeebtOaOpeWFpeWKm++8iG51bGw95pyI6aGNw5fmnJ/plpPjgafoqIjnrpfvvIkKICB0MlJhdGVzOiBbMC41LCAwLjUsIDAuNSwgMC41XSwKICB0MkZpeGVkUmF0ZTogMS4wLCAgLy8g5Zu65a6adnPlpInli5Xmr5TovIPjgr/jg5bnlKjjg7vni6znq4vlhaXlipsKICB1c2VUMTogZmFsc2UsIHQxTW9udGhseTogNDUwMDAsIHQxU3R1ZHlNOiA0OCwKICB0MURpcmVjdFA6IG51bGwsICAgLy8g56ys5LiA56iuIOe3j+mhjeebtOaOpeWFpeWKmwogIGV2Q2FyOiAgICAgIHtvbjpmYWxzZSxhZ2U6MjYsY29zdDoyMDB9LAogIGV2TWFycmlhZ2U6IHtvbjp0cnVlLCBhZ2U6MjgsY29zdDozMDB9LAogIGV2Q2hpbGQ6ICAgIHtvbjp0cnVlLCBhZ2U6MzAsY29zdDo1MH0sCiAgZXZIb3VzZTogICAge29uOnRydWUsIGFnZTozMyxjb3N0OjUwMH0sCiAgc2hvd0ludjogZmFsc2UsCiAgcHJlcGF5czogW10sICAgLy8gW3tyb3VuZHM6MTIsIG1vbnRoOjEyfSwgLi4uXSDopIfmlbDnubDkuIrjgZIKICBkZXBSYXRlOiAwLjM1LAp9OwoKLy8g4pSA4pSAIOWumuaVsCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLy8gSkFTU0/ov5TpgoTmnIjpoY3jg4bjg7zjg5bjg6vvvIjlgJ/lhaXnt4/poY0g4oaSIOaomea6luaciOizpui/lOmChOmhje+8iQovLyDigLvjgZPjgozjga8i6L+U5riI5pyf6ZaTIuOCkumAhueul+OBmeOCi+OBn+OCgeOBruODhuODvOODluODq+OAguaciOaVsD1mbG9vcijlhYPph5EvYmFzZSnDlzEyCmNvbnN0IEpBU1NPX1RBQkxFID0gWwogIHttYXg6ICAyMDAwMDAsYmFzZTogMzAwMDB9LHttYXg6ICA0MDAwMDAsYmFzZTogNDAwMDB9LHttYXg6ICA1MDAwMDAsYmFzZTogNTAwMDB9LAogIHttYXg6ICA2MDAwMDAsYmFzZTogNjAwMDB9LHttYXg6ICA3MDAwMDAsYmFzZTogNzAwMDB9LHttYXg6ICA5MDAwMDAsYmFzZTogODAwMDB9LAogIHttYXg6IDExMDAwMDAsYmFzZTogOTAwMDB9LHttYXg6IDEzMDAwMDAsYmFzZToxMDAwMDB9LHttYXg6IDE1MDAwMDAsYmFzZToxMTAwMDB9LAogIHttYXg6IDE3MDAwMDAsYmFzZToxMjAwMDB9LHttYXg6IDE5MDAwMDAsYmFzZToxMzAwMDB9LHttYXg6IDIxMDAwMDAsYmFzZToxNDAwMDB9LAogIHttYXg6IDIzMDAwMDAsYmFzZToxNTAwMDB9LHttYXg6IDI1MDAwMDAsYmFzZToxNjAwMDB9LHttYXg6IDM0MDAwMDAsYmFzZToxNzAwMDB9LAogIC8vIDMsNDAwLDAwMeWGhuS7peS4iiDihpIg57eP6aGN44GuMS8yMApdOwovLyBKQVNTT+aomea6luaciOizpui/lOmChOmhje+8iOesrOS4gOeoruODu+esrOS6jOeoruWFsemAmuOBrui/lOa4iOacn+mWk+eul+WHuuOBq+S9v+eUqO+8iQpmdW5jdGlvbiBnZXRKYXNzb0Jhc2UocHJpbmNpcGFsKSB7CiAgaWYocHJpbmNpcGFsIDw9IDApIHJldHVybiAwOwogIGNvbnN0IGVudHJ5ID0gSkFTU09fVEFCTEUuZmluZChlPT5wcmluY2lwYWw8PWUubWF4KTsKICByZXR1cm4gZW50cnkgPyBlbnRyeS5iYXNlIDogTWF0aC5mbG9vcihwcmluY2lwYWwvMjApOwp9Ci8vIOWAn+WFpee3j+mhjeOBi+OCiei/lOa4iOacn+mWk++8iOaciOaVsO+8ieOCkueul+WHugpmdW5jdGlvbiBjYWxjUmVwYXlNb250aHMocHJpbmNpcGFsKSB7CiAgaWYocHJpbmNpcGFsIDw9IDApIHJldHVybiAwOwogIGNvbnN0IGJhc2UgPSBnZXRKYXNzb0Jhc2UocHJpbmNpcGFsKTsKICByZXR1cm4gTWF0aC5tYXgoTWF0aC5mbG9vcihwcmluY2lwYWwvYmFzZSksIDEpICogMTI7Cn0KLy8g5YWD5Yip5Z2H562J6L+U5riI44Gu5pyI6aGN6KiI566X77yIUE1U77yJCmZ1bmN0aW9uIGNhbGNQTVQocHJpbmNpcGFsLCBhbm51YWxSYXRlLCBtb250aHMpIHsKICBpZihwcmluY2lwYWwgPD0gMCB8fCBtb250aHMgPD0gMCkgcmV0dXJuIDA7CiAgaWYoYW5udWFsUmF0ZSA8IDFlLTEwKSByZXR1cm4gTWF0aC5jZWlsKHByaW5jaXBhbC9tb250aHMpOwogIGNvbnN0IG1yID0gYW5udWFsUmF0ZS8xMDAvMTI7CiAgcmV0dXJuIE1hdGguY2VpbChwcmluY2lwYWwgKiBtciAqIE1hdGgucG93KDErbXIsbW9udGhzKSAvIChNYXRoLnBvdygxK21yLG1vbnRocyktMSkpOwp9Cgpjb25zdCBTVFVEWV9PUFRTID0gW3t2OjM2LGw6JzPlubQnfSx7djo0OCxsOic05bm0J30se3Y6NzIsbDonNuW5tCd9XTsKY29uc3QgUEVSSU9EX0xCTFMgPSBbJ+esrDHmnJ/vvIgx44CcNeW5tOebru+8iScsJ+esrDLmnJ/vvIg244CcMTDlubTnm67vvIknLCfnrKwz5pyf77yIMTHjgJwxNeW5tOebru+8iScsJ+esrDTmnJ/vvIgxNuOAnDIw5bm055uu77yJJ107CmNvbnN0IEVWX0RFRlMgPSBbCiAge2tleTonZXZDYXInLCAgICAgIGljb246J/CfmpcnLG5hbWU6J+ODnuOCpOOCq+ODvOizvOWFpScsICAgbm90ZTon5Lit5Y+kMTAw5LiH44Cc5paw6LuKMjUw5LiH5YaGJ30sCiAge2tleTonZXZNYXJyaWFnZScsIGljb246J/Cfko0nLG5hbWU6J+e1kOWpmicsICAgICAgICAgICBub3RlOiflubPlnYczMDDkuIflhobvvIjjg5Hjg7zjg4bjgqPovrzjgb/vvIknfSwKICB7a2V5OidldkNoaWxkJywgICAgaWNvbjon8J+RticsbmFtZTon56ysMeWtkOiqleeUnycsICAgICAgIG5vdGU6J+WHuueUo+iyu+eUqOe0hDUw5LiH5YaGJ30sCiAge2tleTonZXZIb3VzZScsICAgIGljb246J/Cfj6AnLG5hbWU6J+S9j+WuheizvOWFpe+8iOmgremHke+8iScsIG5vdGU6J+eJqeS7tuS+oeagvOOBrjIwJeOBjOebruWuiSd9LApdOwoKLy8g4pSA4pSAIOODpuODvOODhuOCo+ODquODhuOCoyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKY29uc3QgZm10ICA9IG4gPT4gTWF0aC5yb3VuZChuKS50b0xvY2FsZVN0cmluZygnamEtSlAnKSArICflhoYnOwpjb25zdCBmbXRNID0gbiA9PiB7CiAgY29uc3QgYSA9IE1hdGguYWJzKG4pOwogIGlmKGEgPCAxMDAwKSAgIHJldHVybiBNYXRoLnJvdW5kKG4pLnRvTG9jYWxlU3RyaW5nKCdqYS1KUCcpICsgJ+WGhic7CiAgaWYoYSA8IDEwMDAwKSAgcmV0dXJuIChuLzEwMDApLnRvRml4ZWQoMSkgKyAn5Y2D5YaGJzsKICBpZihhIDwgMTAwMDAwKSByZXR1cm4gKG4vMTAwMDApLnRvRml4ZWQoMikgKyAn5LiH5YaGJzsKICBpZihhIDwgMTAwMDAwMClyZXR1cm4gKG4vMTAwMDApLnRvRml4ZWQoMSkgKyAn5LiH5YaGJzsKICByZXR1cm4gTWF0aC5yb3VuZChuLzEwMDAwKS50b0xvY2FsZVN0cmluZygnamEtSlAnKSArICfkuIflhoYnOwp9Owpjb25zdCBmbXRSID0gciA9PiByLnRvRml4ZWQoMykgKyAnJSc7CmNvbnN0IGVsICAgPSBpZCA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CmNvbnN0IGNsciAgPSBpZCA9PiB7IGNvbnN0IGU9ZWwoaWQpOyBpZihlKSBlLmlubmVySFRNTD0nJzsgfTsKCi8vIOKUgOKUgCDnqI7oqIjnrpfvvIjmiYvlj5bjgormjqjlrprvvInilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLy8g5YmN5o+QOiDkvJrnpL7lk6HvvIjntabkuI7miYDlvpfogIXvvInjgIHos57kuI7lkKvjgoDlubTlj47lhaXlipvjgIE0MOats+acqua6gAovLyDnpL7kvJrkv53pmbo6IOWOmueUn+W5tOmHkTkuMTUl77yI5LiK6ZmQNjUw5Y2D5YaGL+aciO+8ieOAgeWBpeW6t+S/nemZujQuOTUl77yI5LiK6ZmQMSwzOTDljYPlhoYv5pyI77yJ44CB6ZuH55So5L+d6Zm6MC41JQovLyDntabkuI7miYDlvpfmjqfpmaQ6IOS7pOWSjDjlubTmlLnmraPlvozvvIjkuIvpmZA3NOS4h+WGhu+8iQovLyDln7rnpI7mjqfpmaQ6IOS7pOWSjDjlubTmlLnmraPlvozvvIjmnIDlpKcxMDTkuIflhobvvIkKLy8g5L2P5rCR56iOOiAxMCUgKyDlnYfnrYnlibI1LDAwMOWGhu+8iOS9j+awkeeojuWfuuekjuaOp+mZpDQz5LiH5YaG77yJCi8vIOaJgOW+l+eojjog5b6p6IiI54m55Yil5omA5b6X56iOMi4xJeWQqwpmdW5jdGlvbiBjYWxjVGFrZUhvbWUoZ3Jvc3MpIHsKICAvLyDilIDilIAg56S+5Lya5L+d6Zm65paZIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIGNvbnN0IG1Hcm9zcyAgID0gZ3Jvc3MgLyAxMjsgIC8vIOaciOWPjui/keS8vO+8iOiznuS4jui+vOOBv+W5tOWPjsO3MTLvvIkKICAvLyDljprnlJ/lubTph5E6IOiiq+S/nemZuuiAheiyoOaLhTkuMTUl44CB5qiZ5rqW5aCx6YWs5pyI6aGN5LiK6ZmQNjUwLDAwMOWGhgogIGNvbnN0IHBlbnNpb24gID0gTWF0aC5taW4obUdyb3NzLCA2NTAwMDApICAgKiAwLjA5MTUgKiAxMjsKICAvLyDlgaXlurfkv53pmbrvvIjlhajlm73lubPlnYc5Ljkl44Gu5Yq05L2/5oqY5Y2KPTQuOTUl77yJ44CB5qiZ5rqW5aCx6YWs5pyI6aGN5LiK6ZmQMSwzOTAsMDAw5YaGCiAgY29uc3QgaGVhbHRoICAgPSBNYXRoLm1pbihtR3Jvc3MsIDEzOTAwMDApICAqIDAuMDQ5NSAqIDEyOwogIC8vIOmbh+eUqOS/nemZujog5LiA6Iis5LqL5qWtIOiiq+S/nemZuuiAheiyoOaLhTAuNSUKICBjb25zdCBlbXBsb3kgICA9IGdyb3NzICogMC4wMDU7CiAgY29uc3Qgc25zICAgICAgPSBNYXRoLnJvdW5kKHBlbnNpb24gKyBoZWFsdGggKyBlbXBsb3kpOwoKICAvLyDilIDilIAg57Wm5LiO5omA5b6X5o6n6Zmk77yI5Luk5ZKMOOW5tOaUueato+W+jOOAgeS4i+mZkDc05LiH5YaG77yJ4pSA4pSA4pSA4pSACiAgbGV0IGRlZDsKICBpZihncm9zcyA8PSAxNjI1MDAwKSAgICAgIGRlZCA9IDc0MDAwMDsKICBlbHNlIGlmKGdyb3NzIDw9IDE4MDAwMDApIGRlZCA9IGdyb3NzICogMC40ICsgOTAwMDA7CiAgZWxzZSBpZihncm9zcyA8PSAzNjAwMDAwKSBkZWQgPSBncm9zcyAqIDAuMyArIDI3MDAwMDsKICBlbHNlIGlmKGdyb3NzIDw9IDY2MDAwMDApIGRlZCA9IGdyb3NzICogMC4yICsgNjMwMDAwOwogIGVsc2UgaWYoZ3Jvc3MgPD0gODUwMDAwMCkgZGVkID0gZ3Jvc3MgKiAwLjEgKyAxMjkwMDAwOwogIGVsc2UgICAgICAgICAgICAgICAgICAgICAgZGVkID0gMjE0MDAwMDsgIC8vIOS4iumZkAogIGNvbnN0IGluY29tZSA9IE1hdGgubWF4KDAsIGdyb3NzIC0gZGVkKTsKCiAgLy8g4pSA4pSAIOaJgOW+l+eoju+8iOWfuuekjuaOp+mZpOacgOWkpzEwNOS4h+WGhuODu+W+qeiIiOeJueWIpeaJgOW+l+eojjIuMSXlkKvvvIkKICBsZXQgYmFzaWNJVDsKICBpZihpbmNvbWUgPD0gMjQwMDAwMDApICAgICAgYmFzaWNJVCA9IDEwNDAwMDA7CiAgZWxzZSBpZihpbmNvbWUgPD0gMjQ1MDAwMDApIGJhc2ljSVQgPSA2NDAwMDA7CiAgZWxzZSBpZihpbmNvbWUgPD0gMjUwMDAwMDApIGJhc2ljSVQgPSAzMjAwMDA7CiAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljSVQgPSAwOwogIGNvbnN0IHRheGFibGVJVCA9IE1hdGgubWF4KDAsIGluY29tZSAtIHNucyAtIGJhc2ljSVQpOwogIGxldCB0YXggPSAwOwogIGlmKHRheGFibGVJVCA8PSAxOTUwMDAwKSAgICAgICB0YXggPSB0YXhhYmxlSVQgKiAwLjA1OwogIGVsc2UgaWYodGF4YWJsZUlUIDw9IDMzMDAwMDApICB0YXggPSB0YXhhYmxlSVQgKiAwLjEwIC0gOTc1MDA7CiAgZWxzZSBpZih0YXhhYmxlSVQgPD0gNjk1MDAwMCkgIHRheCA9IHRheGFibGVJVCAqIDAuMjAgLSA0Mjc1MDA7CiAgZWxzZSBpZih0YXhhYmxlSVQgPD0gOTAwMDAwMCkgIHRheCA9IHRheGFibGVJVCAqIDAuMjMgLSA2MzYwMDA7CiAgZWxzZSBpZih0YXhhYmxlSVQgPD0gMTgwMDAwMDApIHRheCA9IHRheGFibGVJVCAqIDAuMzMgLSAxNTM2MDAwOwogIGVsc2UgaWYodGF4YWJsZUlUIDw9IDQwMDAwMDAwKSB0YXggPSB0YXhhYmxlSVQgKiAwLjQwIC0gMjc5NjAwMDsKICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgdGF4ID0gdGF4YWJsZUlUICogMC40NSAtIDQ3OTYwMDA7CiAgdGF4ID0gTWF0aC5yb3VuZCh0YXggKiAxLjAyMSk7ICAvLyDlvqnoiIjnibnliKXmiYDlvpfnqI4KCiAgLy8g4pSA4pSAIOS9j+awkeeoju+8iOaJgOW+l+WJsjEwJSArIOWdh+etieWJsjUsMDAw5YaG44CB5Z+656SO5o6n6ZmkNDPkuIflhobvvIkKICBjb25zdCB0YXhhYmxlTFQgPSBNYXRoLm1heCgwLCBpbmNvbWUgLSBzbnMgLSA0MzAwMDApOwogIGNvbnN0IHJlc2lkZW50ICA9IE1hdGgucm91bmQodGF4YWJsZUxUICogMC4xMCArIDUwMDApOwoKICByZXR1cm4gTWF0aC5yb3VuZChncm9zcyAtIHNucyAtIHRheCAtIHJlc2lkZW50KTsKfQoKLy8g4pSA4pSAIOaNrue9ruWIqeaBr++8iOWNkualreW+jDbjg7bmnIjjga7njLbkuojmnJ/plpPjgavnmbrnlJ/jgZnjgovopIfliKnliKnmga/vvInilIDilIAKZnVuY3Rpb24gY2FsY0RlZmVySW50ZXJlc3QocHJpbmNpcGFsLCBhbm51YWxSYXRlKSB7CiAgaWYoYW5udWFsUmF0ZSA8IDFlLTEwKSByZXR1cm4gMDsKICByZXR1cm4gTWF0aC5yb3VuZChwcmluY2lwYWwgKiAoTWF0aC5wb3coMSArIGFubnVhbFJhdGUvMTAwLzEyLCA2KSAtIDEpKTsKfQoKLy8g4pSA4pSAIFQy44K544Kx44K444Ol44O844Or77yI5YWD5Yip5Z2H562J44O75aSJ5YuV6YeR5Yip5a++5b+c44O75o2u572u5Yip5oGv6L6844G/77yJ4pSA4pSACi8vIHByaW5jaXBhbCAgICA6IOWAn+WFpeWFg+mHkQovLyByZXBheU1vbnRocyAgOiDov5TmuIjmnJ/plpPvvIjmnIjmlbDvvIkKLy8gcmF0ZVNlZyAgICAgIDogW3tzbTrplovlp4vmnIgsIHJhdGU65bm0546HJX1dCi8vIGRlZmVySW50ZXJlc3Q6IOaNrue9ruWIqeaBr++8iOWFg+mHkeOBq+S4iuS5l+OBm+OBl+OBpui/lOa4iO+8iQpmdW5jdGlvbiBidWlsZFQyKHByaW5jaXBhbCwgcmVwYXlNb250aHMsIHJhdGVTZWcsIGRlZmVySW50ZXJlc3Q9MCkgewogIGNvbnN0IHNjaGVkPVtdOwogIGxldCBiYWwgPSBwcmluY2lwYWwgKyBkZWZlckludGVyZXN0OwogIGxldCByZW1haW5NID0gcmVwYXlNb250aHM7CiAgbGV0IGN1clJhdGUgPSByYXRlU2VnWzBdLnJhdGU7CiAgbGV0IGN1clBheU0gPSBjYWxjUE1UKGJhbCwgY3VyUmF0ZSwgcmVtYWluTSk7CgogIGZvcihsZXQgbT0xOyBiYWw+MC41ICYmIHJlbWFpbk0+MDsgbSsrKXsKICAgIGNvbnN0IHNlZz1bLi4ucmF0ZVNlZ10ucmV2ZXJzZSgpLmZpbmQocz0+cy5zbTxtKXx8cmF0ZVNlZ1swXTsKICAgIC8vIOmHkeWIqeacn+mWk+OBjOWkieOCj+OBo+OBn+OCiVBNVOOCkuWGjeioiOeul++8iOWkieWLlemHkeWIqeOBruWun+aMmeWLle+8iQogICAgaWYoc2VnLnJhdGUgIT09IGN1clJhdGUpewogICAgICBjdXJSYXRlID0gc2VnLnJhdGU7CiAgICAgIGN1clBheU0gPSBjYWxjUE1UKGJhbCwgY3VyUmF0ZSwgcmVtYWluTSk7CiAgICB9CiAgICBjb25zdCBtciA9IGN1clJhdGUvMTAwLzEyOwogICAgY29uc3QgaW50ZXJlc3QgPSBNYXRoLnJvdW5kKGJhbCptcik7CiAgICBjb25zdCBwcmkgPSBNYXRoLm1pbihNYXRoLm1heChjdXJQYXlNIC0gaW50ZXJlc3QsIDEpLCBiYWwpOwogICAgYmFsID0gTWF0aC5tYXgoMCwgYmFsIC0gcHJpKTsKICAgIHNjaGVkLnB1c2goe20sIHBheTpwcmkraW50ZXJlc3QsIGludDppbnRlcmVzdCwgcHJpLCBiYWwsIGlzUHJlcGF5OmZhbHNlfSk7CiAgICByZW1haW5NLS07CiAgfQogIHJldHVybiBzY2hlZDsKfQoKLy8g4pSA4pSAIFQy44K544Kx44K444Ol44O844Or77yI57mw5LiK44GS44GC44KK44O76KSH5pWw5Zue5a++5b+c77yJ4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8vIHByZXBheXM6IFt7cm91bmRzOk4sIG1vbnRoOk19LCAuLi5dIOaciOmghuOBq+OCveODvOODiOOBl+OBpumBqeeUqApmdW5jdGlvbiBidWlsZFQyV2l0aFByZXBheShwcmluY2lwYWwsIHJlcGF5TW9udGhzLCByYXRlU2VnLCBkZWZlckludGVyZXN0LCBwcmVwYXlzKSB7CiAgY29uc3Qgc29ydGVkUFAgPSBbLi4ucHJlcGF5c10uc29ydCgoYSxiKT0+YS5tb250aC1iLm1vbnRoKTsKICBjb25zdCBzY2hlZD1bXTsKICBsZXQgYmFsID0gcHJpbmNpcGFsICsgZGVmZXJJbnRlcmVzdDsKICBsZXQgcmVtYWluTSA9IHJlcGF5TW9udGhzOwogIGxldCBjdXJSYXRlID0gcmF0ZVNlZ1swXS5yYXRlOwogIGxldCBjdXJQYXlNID0gY2FsY1BNVChiYWwsIGN1clJhdGUsIHJlbWFpbk0pOwoKICBmb3IobGV0IG09MTsgYmFsPjAuNSAmJiByZW1haW5NPjA7IG0rKyl7CiAgICBjb25zdCBzZWc9Wy4uLnJhdGVTZWddLnJldmVyc2UoKS5maW5kKHM9PnMuc208bSl8fHJhdGVTZWdbMF07CiAgICBpZihzZWcucmF0ZSAhPT0gY3VyUmF0ZSl7CiAgICAgIGN1clJhdGUgPSBzZWcucmF0ZTsKICAgICAgY3VyUGF5TSA9IGNhbGNQTVQoYmFsLCBjdXJSYXRlLCByZW1haW5NKTsKICAgIH0KICAgIGNvbnN0IG1yID0gY3VyUmF0ZS8xMDAvMTI7CiAgICBjb25zdCBpbnRlcmVzdCA9IE1hdGgucm91bmQoYmFsKm1yKTsKICAgIGNvbnN0IHByaSA9IE1hdGgubWluKE1hdGgubWF4KGN1clBheU0gLSBpbnRlcmVzdCwgMSksIGJhbCk7CiAgICBiYWwgPSBNYXRoLm1heCgwLCBiYWwgLSBwcmkpOwogICAgc2NoZWQucHVzaCh7bSwgcGF5OnByaStpbnRlcmVzdCwgaW50OmludGVyZXN0LCBwcmksIGJhbCwgaXNQcmVwYXk6ZmFsc2V9KTsKICAgIHJlbWFpbk0tLTsKICAgIC8vIOOBneOBruaciOOBq+Wun+aWveOBmeOCi+WFqOe5sOS4iuOBkuOCkumBqeeUqAogICAgZm9yKGNvbnN0IHBwIG9mIHNvcnRlZFBQKXsKICAgICAgaWYocHAubW9udGg9PT1tICYmIHBwLnJvdW5kcz4wICYmIGJhbD4wKXsKICAgICAgICBjb25zdCBwcEFtdCA9IE1hdGgubWluKGN1clBheU0gKiBwcC5yb3VuZHMsIGJhbCk7CiAgICAgICAgY29uc3Qgc2tpcHBlZCA9IE1hdGguZmxvb3IocHBBbXQgLyBjdXJQYXlNKTsKICAgICAgICBjb25zdCBhY3R1YWxQUCA9IE1hdGgubWluKHNraXBwZWQgKiBjdXJQYXlNLCBiYWwpOwogICAgICAgIGlmKGFjdHVhbFBQID4gMCl7CiAgICAgICAgICBiYWwgPSBNYXRoLm1heCgwLCBiYWwgLSBhY3R1YWxQUCk7CiAgICAgICAgICByZW1haW5NID0gTWF0aC5tYXgoMCwgcmVtYWluTSAtIHNraXBwZWQpOwogICAgICAgICAgc2NoZWQucHVzaCh7bSwgcGF5OmFjdHVhbFBQLCBpbnQ6MCwgcHJpOmFjdHVhbFBQLCBiYWwsIGlzUHJlcGF5OnRydWUsIHJvdW5kczpza2lwcGVkfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBzY2hlZDsKfQoKLy8g4pSA4pSAIFQx44K544Kx44K444Ol44O844Or77yI5YWD6YeR5Z2H562J44O754Sh5Yip5oGv77yJ4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIGJ1aWxkVDEocHJpbmNpcGFsLCBzdHVkeU1vbnRocykgewogIC8vIEpBU1NP56ys5LiA56iu77yaY2FsY1JlcGF5TW9udGhz44Gn6L+U5riI5pyf6ZaT77yI5pyI5pWw77yJ44KS566X5Ye644GX44CB5YWD6YeR44KS44Gd44Gu5pyI5pWw44Gn5Z2H562J5Ymy44KKCiAgY29uc3QgbW9udGhzID0gY2FsY1JlcGF5TW9udGhzKHByaW5jaXBhbCk7CiAgaWYobW9udGhzIDw9IDApIHJldHVybiBbXTsKICBjb25zdCBtb250aGx5QmFzZSA9IE1hdGguY2VpbChwcmluY2lwYWwgLyBtb250aHMpOwogIGNvbnN0IHNjaGVkPVtdOwogIGxldCBiYWw9cHJpbmNpcGFsOwogIGZvcihsZXQgbT0xOyBiYWw+MC41ICYmIG08PW1vbnRocys1OyBtKyspewogICAgY29uc3QgcGFpZD1NYXRoLm1pbihtb250aGx5QmFzZSxiYWwpOwogICAgYmFsPU1hdGgubWF4KDAsYmFsLXBhaWQpOwogICAgc2NoZWQucHVzaCh7bSwgcGF5OnBhaWQsIGludDowLCBwcmk6cGFpZCwgYmFsLCBpc1ByZXBheTpmYWxzZX0pOwogIH0KICByZXR1cm4gc2NoZWQ7Cn0KCi8vIOKUgOKUgCDlrp/lirnmnIjlj47vvIjnqI4v44Oc44O844OK44K56L6844G/77yJ4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIGdldE1vbnRobHlJbmMoKSB7CiAgY29uc3QgYmFzZSA9IFMudXNlR3Jvc3MgPyBNYXRoLnJvdW5kKGNhbGNUYWtlSG9tZShTLmdyb3NzWSkvMTIpIDogUy5pbmNvbWU7CiAgY29uc3QgYm9udXMgPSBTLnVzZUdyb3NzID8gMCA6IFMuYm9udXNZOwogIHJldHVybiBiYXNlICsgTWF0aC5yb3VuZChib251cy8xMik7Cn0KCi8vIOKUgOKUgCDliKnnjofjgrvjgrDjg6Hjg7Pjg4gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIGdldFJhdGVTZWcoKSB7CiAgcmV0dXJuIFswLDEsMiwzXS5tYXAoaT0+KHtzbTppKjYwLCByYXRlOlMudDJSYXRlc1tpXX0pKTsKfQoKLy8g4pSA4pSAIOODoeOCpOODs+ioiOeulyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gY2FsY0FsbCgpIHsKICBjb25zdCBtSW5jICAgICAgPSBnZXRNb250aGx5SW5jKCk7CiAgLy8g55u05o6l5YWl5Yqb44GM44GC44KM44Gw44Gd44Gh44KJ44KS5YSq5YWI44CB44Gq44GR44KM44Gw5pyI6aGNw5fmnJ/plpMKICBjb25zdCB0MlBwYWwgICAgPSBTLnVzZVQyID8gKFMudDJEaXJlY3RQID8/IFMudDJNb250aGx5ICogUy50MlN0dWR5TSkgOiAwOwogIGNvbnN0IHQxUHBhbCAgICA9IFMudXNlVDEgPyAoUy50MURpcmVjdFAgPz8gUy50MU1vbnRobHkgKiBTLnQxU3R1ZHlNKSA6IDA7CiAgY29uc3QgcmF0ZVNlZyAgID0gZ2V0UmF0ZVNlZygpOwoKICAvLyBUMuOCueOCseOCuOODpeODvOODqwogIGxldCB0MlNjaGVkPVtdLCB0MlBheU09MCwgdDJUb3RhbEludD0wLCB0MlJlcGF5TW9udGhzPTAsIHQyRGVmZXJJbnQ9MDsKICBpZihTLnVzZVQyICYmIHQyUHBhbD4wKXsKICAgIC8vIEpBU1NP56ys5LqM56iu44Gu6L+U5riI5pyf6ZaT44KS5YCf5YWl57eP6aGN44GL44KJ566X5Ye6CiAgICB0MlJlcGF5TW9udGhzID0gY2FsY1JlcGF5TW9udGhzKHQyUHBhbCk7CiAgICAvLyDmja7nva7liKnmga/vvIjljZLmpa3lvow244O25pyI44Gu54y25LqI5pyf6ZaT77yJ44KS6KiI566X44GX44Gm5YWD6YeR44Gr5LiK5LmX44GbCiAgICB0MkRlZmVySW50ID0gY2FsY0RlZmVySW50ZXJlc3QodDJQcGFsLCByYXRlU2VnWzBdLnJhdGUpOwogICAgdDJTY2hlZCA9IGJ1aWxkVDIodDJQcGFsLCB0MlJlcGF5TW9udGhzLCByYXRlU2VnLCB0MkRlZmVySW50KTsKICAgIHQyUGF5TSA9IHQyU2NoZWQubGVuZ3RoID4gMCA/IHQyU2NoZWRbMF0ucGF5IDogMDsKICAgIHQyVG90YWxJbnQgPSB0MlNjaGVkLnJlZHVjZSgoYSxyKT0+YStyLmludCwgMCk7CiAgfQoKICAvLyBUMeOCueOCseOCuOODpeODvOODqwogIGxldCB0MVNjaGVkPVtdLCB0MVBheU09MDsKICBpZihTLnVzZVQxICYmIHQxUHBhbD4wKXsKICAgIHQxU2NoZWQgPSBidWlsZFQxKHQxUHBhbCwgUy50MVN0dWR5TSk7CiAgICB0MVBheU0gID0gdDFTY2hlZC5sZW5ndGg+MCA/IHQxU2NoZWRbMF0ucGF5IDogMDsKICB9CgogIGNvbnN0IG1vbnRobHlSZXBheSA9IHQyUGF5TSArIHQxUGF5TTsKICBjb25zdCBtb250aGx5U3VycCAgPSBtSW5jIC0gUy5jb3N0IC0gbW9udGhseVJlcGF5OwogIGNvbnN0IHJlcGF5TSAgICAgICA9IE1hdGgubWF4KHQyU2NoZWQubGVuZ3RoLCB0MVNjaGVkLmxlbmd0aCk7CiAgY29uc3QgcmVwYXlFbmRBZ2UgID0gUy5ncmFkICsgTWF0aC5jZWlsKHJlcGF5TS8xMik7CiAgY29uc3QgcmVwYXlSYXRpbyAgID0gbUluYz4wID8gbW9udGhseVJlcGF5L21JbmMqMTAwIDogMDsKCiAgLy8g5bm05Yil44OH44O844K/77yI56ys5LqM56iu5a6M5riIKzXlubTjgpLnorrkv53vvIkKICBjb25zdCB0MlJlcGF5WXJzID0gUy51c2VUMiA/IE1hdGguY2VpbCgoUy51c2VUMiA/IHQyU2NoZWQubGVuZ3RoIDogMCkgLyAxMikgOiAwOwogIGNvbnN0IG1heFlycyA9IE1hdGgubWF4KHQyUmVwYXlZcnMgKyA1LCBNYXRoLmNlaWwocmVwYXlNLzEyKSwgMTApOwogIGNvbnN0IGFjdGl2ZUV2ID0gRVZfREVGUy5tYXAoZD0+U1tkLmtleV0pLmZpbHRlcihlPT5lLm9uKTsKICBjb25zdCB5ZWFybHlEYXRhID0gQXJyYXkuZnJvbSh7bGVuZ3RoOm1heFlyc30sKF8saSk9PnsKICAgIGNvbnN0IHlyPWkrMSwgYWdlPVMuZ3JhZCt5ciwgbT15cioxMjsKICAgIGNvbnN0IGdyb3NzID0gbW9udGhseVN1cnA+MCA/IG1vbnRobHlTdXJwKm0gOiAwOwogICAgY29uc3QgZXZDb3N0ID0gYWN0aXZlRXYuZmlsdGVyKGU9PmUuYWdlPD1hZ2UpLnJlZHVjZSgocyxlKT0+cytlLmNvc3QqMTAwMDAsMCk7CiAgICBjb25zdCBzYXZpbmdzID0gZ3Jvc3MgLSBldkNvc3Q7CiAgICBjb25zdCB0MkJhbCA9IHQyU2NoZWRbTWF0aC5taW4obS0xLHQyU2NoZWQubGVuZ3RoLTEpXT8uYmFsIHx8IDA7CiAgICBjb25zdCB0MUJhbCA9IHQxU2NoZWRbTWF0aC5taW4obS0xLHQxU2NoZWQubGVuZ3RoLTEpXT8uYmFsIHx8IDA7CiAgICBjb25zdCB0b3RhbERlYnQgPSB0MkJhbCt0MUJhbDsKICAgIGNvbnN0IG5ldCA9IHNhdmluZ3MgLSB0b3RhbERlYnQ7CiAgICAvLyDmipXos4fmmYIKICAgIGNvbnN0IHM0aSA9IE1hdGgubWF4KDAsbW9udGhseVN1cnApOwogICAgY29uc3QgbXJJID0gUy5pbnZSZXQvMTAwLzEyOwogICAgY29uc3QgaW52RyA9IHM0aT4wID8gKG1yST4wID8gczRpKihNYXRoLnBvdygxK21ySSxtKS0xKS9tckkgOiBzNGkqbSkgOiAwOwogICAgY29uc3QgaW52TmV0ID0gaW52RyAtIGV2Q29zdCAtIHRvdGFsRGVidDsKICAgIGNvbnN0IGV2VGhpc1lyID0gRVZfREVGUy5maWx0ZXIoZD0+U1tkLmtleV0ub24gJiYgU1tkLmtleV0uYWdlPT09YWdlKTsKICAgIGNvbnN0IGV2SWNvbiAgID0gZXZUaGlzWXIubGVuZ3RoID8gZXZUaGlzWXJbMF0uaWNvbiA6IG51bGw7CiAgICByZXR1cm4ge3lyLGFnZSxzYXZpbmdzLGdyb3NzLGV2Q29zdCx0b3RhbERlYnQsbmV0LGludk5ldCxldkljb24sZXZUaGlzWXJ9OwogIH0pOwoKICAvLyDjg57jgqTjg6vjgrnjg4jjg7zjg7PvvIg15bm05Yi744G/77yJCiAgY29uc3QgbWlsZXN0b25lcyA9IFs1LDEwLDE1LDIwXS5tYXAoeXI9PnsKICAgIGNvbnN0IGFnZT1TLmdyYWQreXIsIG09eXIqMTI7CiAgICBjb25zdCBncm9zcz0gbW9udGhseVN1cnA+MCA/IG1vbnRobHlTdXJwKm0gOiAwOwogICAgY29uc3QgZXZDb3N0PSBhY3RpdmVFdi5maWx0ZXIoZT0+ZS5hZ2U8PWFnZSkucmVkdWNlKChzLGUpPT5zK2UuY29zdCoxMDAwMCwwKTsKICAgIGNvbnN0IHNhdmluZ3M9IGdyb3NzLWV2Q29zdDsKICAgIGNvbnN0IHQyQmFsID0gdDJTY2hlZFtNYXRoLm1pbihtLTEsdDJTY2hlZC5sZW5ndGgtMSldPy5iYWx8fDA7CiAgICBjb25zdCB0MUJhbCA9IHQxU2NoZWRbTWF0aC5taW4obS0xLHQxU2NoZWQubGVuZ3RoLTEpXT8uYmFsfHwwOwogICAgY29uc3QgdG90YWxEZWJ0PXQyQmFsK3QxQmFsOwogICAgY29uc3QgbmV0PXNhdmluZ3MtdG90YWxEZWJ0OwogICAgY29uc3QgcHJldkFnZT1TLmdyYWQrKHlyLTUpOwogICAgY29uc3QgZXZXaW5kb3c9RVZfREVGUy5maWx0ZXIoZD0+U1tkLmtleV0ub24gJiYgU1tkLmtleV0uYWdlPnByZXZBZ2UgJiYgU1tkLmtleV0uYWdlPD1hZ2UpOwogICAgcmV0dXJuIHt5cixhZ2Usc2F2aW5ncyxncm9zcyxldkNvc3QsdG90YWxEZWJ0LG5ldCxldldpbmRvd307CiAgfSk7CgogIC8vIOe5sOS4iuOBkui/lOa4iO+8iOikh+aVsOWbnu+8iQogIGxldCBwcmVwYXlSZXN1bHQ9bnVsbDsKICBpZihTLnVzZVQyICYmIHQyUHBhbD4wICYmIFMucHJlcGF5cy5sZW5ndGg+MCl7CiAgICBjb25zdCBwcFNjaGVkPWJ1aWxkVDJXaXRoUHJlcGF5KHQyUHBhbCx0MlJlcGF5TW9udGhzLHJhdGVTZWcsdDJEZWZlckludCxTLnByZXBheXMpOwogICAgY29uc3QgcHBJbnQ9cHBTY2hlZC5maWx0ZXIocj0+IXIuaXNQcmVwYXkpLnJlZHVjZSgoYSxyKT0+YStyLmludCwwKTsKICAgIGNvbnN0IHNhdmVkPXQyVG90YWxJbnQtcHBJbnQ7CiAgICBjb25zdCBzaG9ydGVuTT10MlNjaGVkLmxlbmd0aCAtIHBwU2NoZWQuZmlsdGVyKHI9PiFyLmlzUHJlcGF5KS5sZW5ndGg7CiAgICAvLyBJUlLvvIjliqDph43lubPlnYfvvIkKICAgIGxldCB3U3VtPTAsIHdUb3Q9MDsKICAgIHJhdGVTZWcuZm9yRWFjaCgoc2VnLGkpPT57CiAgICAgIGNvbnN0IG5leHQ9cmF0ZVNlZ1tpKzFdPy5zbT8/OTk5OTk7CiAgICAgIGNvbnN0IGJhc2VJPXQyU2NoZWQuZmlsdGVyKHI9PiFyLmlzUHJlcGF5JiZyLm0tMT49c2VnLnNtJiZyLm0tMTxuZXh0KS5yZWR1Y2UoKHMscik9PnMrci5pbnQsMCk7CiAgICAgIGNvbnN0IHBwST1wcFNjaGVkLmZpbHRlcihyPT4hci5pc1ByZXBheSYmci5tLTE+PXNlZy5zbSYmci5tLTE8bmV4dCkucmVkdWNlKChzLHIpPT5zK3IuaW50LDApOwogICAgICBjb25zdCB3PU1hdGgubWF4KDAsYmFzZUktcHBJKTsKICAgICAgd1N1bSs9c2VnLnJhdGUqdzsgd1RvdCs9dzsKICAgIH0pOwogICAgY29uc3QgaXJyQW5uID0gd1RvdD4wID8gd1N1bS93VG90IDogbnVsbDsKICAgIHByZXBheVJlc3VsdD17c2F2ZWQsc2hvcnRlbk0saXJyQW5uLHBwU2NoZWQscHBJbnQsYmFzZUludDp0MlRvdGFsSW50fTsKICB9CgogIHJldHVybiB7CiAgICBtSW5jLHQyUHBhbCx0MVBwYWwsCiAgICB0MlNjaGVkLHQxU2NoZWQsdDJQYXlNLHQxUGF5TSx0MlRvdGFsSW50LHQyUmVwYXlNb250aHMsdDJEZWZlckludCwKICAgIG1vbnRobHlSZXBheSxtb250aGx5U3VycCxyZXBheU0scmVwYXlFbmRBZ2UscmVwYXlSYXRpbywKICAgIHllYXJseURhdGEsbWlsZXN0b25lcyxwcmVwYXlSZXN1bHQsCiAgICBhY3RpdmVFdiwgcmF0ZVNlZywKICB9Owp9Ci8vIOKUgOKUgCBTVkfjg4Hjg6Pjg7zjg4jnlJ/miJAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyDntJTos4fnlKPmjqjnp7vjg4Hjg6Pjg7zjg4gKLy8g5LiK5pa55ZCROiDosq/ok4TvvIjmraPvvIk9IOOCueOCq+OCpOODluODq+ODvAovLyDkuIvmlrnlkJE6IOWlqOWtpumHkeaui+mrmO+8iOi1pO+8iSsg6LKv6JOE5LiN6Laz77yI57Sr77yJ44KS56mN44G/6YeN44Gt57im5qOSCmZ1bmN0aW9uIHN2Z05ldFdvcnRoKGRhdGEsIHNob3dJbnYsIHJlcGF5RW5kQWdlKSB7CiAgaWYoIWRhdGF8fCFkYXRhLmxlbmd0aCkgcmV0dXJuICcnOwogIGNvbnN0IFc9NjYwLCBIPTI0MDsKICBjb25zdCBQQUQ9e2w6NTIscjoxNix0OjQ2LGI6MzR9OwogIGNvbnN0IGdXPVctUEFELmwtUEFELnIsIGdIPUgtUEFELnQtUEFELmI7CiAgY29uc3QgeWVhcnM9ZGF0YS5sZW5ndGg7CiAgY29uc3Qgc2xvdFc9Z1cveWVhcnM7CiAgY29uc3QgYmFyVz1NYXRoLm1heCgzLHNsb3RXKjAuNTUpOwoKICAvLyDjgrnjgrHjg7zjg6voqIjnrpcKICAvLyDmraPmlrnlkJE6IOiyr+iThCjmraMp44O75oqV6LOH57SU6LOH55SjKOatoykKICAvLyDosqDmlrnlkJE6IOWlqOWtpumHkeaui+mrmCjkuIvlkJHjgY0pICsg6LKv6JOE5LiN6LazKOOBneOBruS4i+OBq+epjeOBv+mHjeOBrSkKICBjb25zdCBtYXhQb3M9TWF0aC5tYXgoLi4uZGF0YS5tYXAoZD0+TWF0aC5tYXgoCiAgICBkLnNhdmluZ3M+MD9kLnNhdmluZ3M6MCwKICAgIHNob3dJbnY/KGQuaW52TmV0PjA/ZC5pbnZOZXQ6MCk6MAogICkpLDEpOwogIGNvbnN0IG1pbk5lZz1NYXRoLm1pbiguLi5kYXRhLm1hcChkPT57CiAgICAvLyDnqY3jgb/ph43jga3jga7kuIDnlarkuIsgPSAtKOWlqOWtpumHkeaui+mrmCArIOiyr+iThOS4jei2sykKICAgIGNvbnN0IHN0YWNrQm90PS0oKGQudG90YWxEZWJ0fHwwKStNYXRoLm1heCgwLC0oZC5zYXZpbmdzfHwwKSkpOwogICAgcmV0dXJuIE1hdGgubWluKHN0YWNrQm90LCBzaG93SW52PyhkLmludk5ldHx8MCk6MCwgZC5uZXR8fDApOwogIH0pLDApOwogIGNvbnN0IHRvdGFsUmFuZ2U9bWF4UG9zLW1pbk5lZ3x8MTsKICBjb25zdCBheFk9UEFELnQrZ0gqKG1heFBvcy90b3RhbFJhbmdlKTsgLy8gMOODqeOCpOODs+OBrnnluqfmqJkKICBjb25zdCBzYz12PT5heFktKHYvdG90YWxSYW5nZSkqZ0g7ICAgICAgLy8g5YCk4oaSee+8iOatoz3kuIrjgIHosqA95LiL77yJCiAgY29uc3QgY2w9eT0+TWF0aC5tYXgoUEFELnQsTWF0aC5taW4oSC1QQUQuYix5KSk7CiAgY29uc3QgY3g9aT0+UEFELmwraSpzbG90VytzbG90Vy8yOwogIGxldCBwPVtdOwoKICAvLyDjgrDjg6rjg4Pjg4kKICBjb25zdCBncmlkVmFscz1bMCwwLjI1LDAuNSwwLjc1LDFdLm1hcChyPT5tYXhQb3Mqcik7CiAgaWYobWluTmVnPDApewogICAgZ3JpZFZhbHMucHVzaChtaW5OZWcqMC41LCBtaW5OZWcpOwogIH0KICBncmlkVmFscy5mb3JFYWNoKHY9PnsKICAgIGNvbnN0IHk9c2Modik7CiAgICBpZih5PFBBRC50LTJ8fHk+SC1QQUQuYisyKSByZXR1cm47CiAgICBjb25zdCBpc1plcm89KE1hdGguYWJzKHYpPDEpOwogICAgcC5wdXNoKCgnPGxpbmUgeDE9IicgKyAoUEFELmwpICsgJyIgeDI9IicgKyAoVy1QQUQucikgKyAnIiB5MT0iJyArICh5LnRvRml4ZWQoMSkpICsgJyIgeTI9IicgKyAoeS50b0ZpeGVkKDEpKSArICciIHN0cm9rZT0iJyArIChpc1plcm8/J3ZhcigtLWJkMiwgI2QxZDVkYiknOid2YXIoLS1iZCwgI2U1ZTdlYiknKSArICciIHN0cm9rZS13aWR0aD0iJyArIChpc1plcm8/MS41OjAuNSkgKyAnIiAnICsgKCFpc1plcm8/J3N0cm9rZS1kYXNoYXJyYXk9IjQsNCInOicnKSArICcvPicpKTsKICAgIHAucHVzaCgoJzx0ZXh0IHg9IicgKyAoUEFELmwtNCkgKyAnIiB5PSInICsgKCh5KzMpLnRvRml4ZWQoMSkpICsgJyIgZm9udC1zaXplPSI3IiBmaWxsPSJ2YXIoLS10NCwgIzljYTNhZikiIHRleHQtYW5jaG9yPSJlbmQiPicgKyAoZm10TSh2KSkgKyAnPC90ZXh0PicpKTsKICB9KTsKCiAgLy8g4pSA4pSAIOajkuOCsOODqeODleaPj+eUuyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICBkYXRhLmZvckVhY2goKGQsaSk9PnsKICAgIGNvbnN0IHg9Y3goaSktYmFyVy8yOwogICAgY29uc3QgZGVidD1kLnRvdGFsRGVidHx8MDsKICAgIGNvbnN0IGRlZmljaXQ9TWF0aC5tYXgoMCwtKGQuc2F2aW5nc3x8MCkpOyAvLyDosq/ok4TkuI3otrPjga7ntbblr77lgKQKICAgIGNvbnN0IHNhdmluZz1NYXRoLm1heCgwLGQuc2F2aW5nc3x8MCk7CgogICAgLy8g4pGgIOiyr+iThO+8iOato++8iTogMOODqeOCpOODs+OBi+OCieS4iuWQkeOBjeODu+OCueOCq+OCpOODluODq+ODvAogICAgaWYoc2F2aW5nPjApewogICAgICBjb25zdCBoPXNhdmluZy90b3RhbFJhbmdlKmdIOwogICAgICBwLnB1c2goKCc8cmVjdCB4PSInICsgKHgudG9GaXhlZCgxKSkgKyAnIiB5PSInICsgKChheFktaCkudG9GaXhlZCgxKSkgKyAnIiB3aWR0aD0iJyArIChiYXJXLnRvRml4ZWQoMSkpICsgJyIgaGVpZ2h0PSInICsgKGgudG9GaXhlZCgxKSkgKyAnIiBmaWxsPSJ2YXIoLS1za3ksICMwMjg0YzcpIiBvcGFjaXR5PSIuNzIiIHJ4PSIxLjUiLz4nKSk7CiAgICB9CgogICAgLy8g4pGhIOWlqOWtpumHkeaui+mrmDogMOODqeOCpOODs+OBi+OCieS4i+WQkeOBjeODu+i1pAogICAgaWYoZGVidD4wKXsKICAgICAgY29uc3QgaD1kZWJ0L3RvdGFsUmFuZ2UqZ0g7CiAgICAgIHAucHVzaCgoJzxyZWN0IHg9IicgKyAoeC50b0ZpeGVkKDEpKSArICciIHk9IicgKyAoYXhZLnRvRml4ZWQoMSkpICsgJyIgd2lkdGg9IicgKyAoYmFyVy50b0ZpeGVkKDEpKSArICciIGhlaWdodD0iJyArIChoLnRvRml4ZWQoMSkpICsgJyIgZmlsbD0idmFyKC0tcmVkLCAjZGMyNjI2KSIgb3BhY2l0eT0iLjUyIiByeD0iMS41Ii8+JykpOwoKICAgICAgLy8g4pGiIOiyr+iThOS4jei2szog5aWo5a2m6YeR5q6L6auY44OQ44O844Gu5LiL44Gr56mN44G/6YeN44Gt44O757SrCiAgICAgIGlmKGRlZmljaXQ+MCl7CiAgICAgICAgY29uc3QgaDI9ZGVmaWNpdC90b3RhbFJhbmdlKmdIOwogICAgICAgIGNvbnN0IHkyPWF4WStoOwogICAgICAgIHAucHVzaCgoJzxyZWN0IHg9IicgKyAoeC50b0ZpeGVkKDEpKSArICciIHk9IicgKyAoeTIudG9GaXhlZCgxKSkgKyAnIiB3aWR0aD0iJyArIChiYXJXLnRvRml4ZWQoMSkpICsgJyIgaGVpZ2h0PSInICsgKGgyLnRvRml4ZWQoMSkpICsgJyIgZmlsbD0idmFyKC0tcHVyLCAjN2MzYWVkKSIgb3BhY2l0eT0iLjY1IiByeD0iMS41Ii8+JykpOwogICAgICB9CiAgICB9IGVsc2UgaWYoZGVmaWNpdD4wKXsKICAgICAgLy8g5aWo5a2m6YeR44Gq44GX44O76LKv6JOE5LiN6Laz44Gu44G/CiAgICAgIGNvbnN0IGgyPWRlZmljaXQvdG90YWxSYW5nZSpnSDsKICAgICAgcC5wdXNoKCgnPHJlY3QgeD0iJyArICh4LnRvRml4ZWQoMSkpICsgJyIgeT0iJyArIChheFkudG9GaXhlZCgxKSkgKyAnIiB3aWR0aD0iJyArIChiYXJXLnRvRml4ZWQoMSkpICsgJyIgaGVpZ2h0PSInICsgKGgyLnRvRml4ZWQoMSkpICsgJyIgZmlsbD0idmFyKC0tcHVyLCAjN2MzYWVkKSIgb3BhY2l0eT0iLjY1IiByeD0iMS41Ii8+JykpOwogICAgfQogIH0pOwoKICAvLyDlpajlrabph5Hov5TmuIjlrozkuobjg57jg7zjgqvjg7zvvIjnuKbnt5rvvIvjg6njg5njg6vvvIkKICBpZihyZXBheUVuZEFnZSl7CiAgICBjb25zdCByZXBheUlkeD1kYXRhLmZpbmRJbmRleChkPT5kLmFnZT09PXJlcGF5RW5kQWdlKTsKICAgIGlmKHJlcGF5SWR4Pj0wKXsKICAgICAgY29uc3Qgcng9Y3gocmVwYXlJZHgpLnRvRml4ZWQoMSk7CiAgICAgIHAucHVzaCgoJzxsaW5lIHgxPSInICsgKHJ4KSArICciIHgyPSInICsgKHJ4KSArICciIHkxPSInICsgKFBBRC50KSArICciIHkyPSInICsgKChILVBBRC5iKS50b0ZpeGVkKDEpKSArICciIHN0cm9rZT0idmFyKC0tZ3JlZW4sICMwNTk2NjkpIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNSwzIiBvcGFjaXR5PSIuOCIvPicpKTsKICAgICAgcC5wdXNoKCgnPHJlY3QgeD0iJyArICgrcngtMjApICsgJyIgeT0iJyArIChQQUQudCkgKyAnIiB3aWR0aD0iNDAiIGhlaWdodD0iMTEiIGZpbGw9InZhcigtLWJnLCAjZmZmZmZmKSIgb3BhY2l0eT0iLjg1IiByeD0iMyIvPicpKTsKICAgICAgcC5wdXNoKCgnPHRleHQgeD0iJyArIChyeCkgKyAnIiB5PSInICsgKFBBRC50KzgpICsgJyIgZm9udC1zaXplPSI3LjUiIGZpbGw9InZhcigtLWdyZWVuLCAjMDU5NjY5KSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+4pyTIOWujOa4iDwvdGV4dD4nKSk7CiAgICB9CiAgfQoKICAvLyDlubTpvaLjg6njg5njg6vjg7vjg6njgqTjg5XjgqTjg5njg7Pjg4jjgqLjgqTjgrPjg7MKICBkYXRhLmZvckVhY2goKGQsaSk9PnsKICAgIGNvbnN0IHNob3dMYmw9eWVhcnM8PTEyfHxpJTI9PT0wfHxpPT09eWVhcnMtMTsKICAgIGlmKHNob3dMYmwpIHAucHVzaCgoJzx0ZXh0IHg9IicgKyAoY3goaSkudG9GaXhlZCgxKSkgKyAnIiB5PSInICsgKChILVBBRC5iKzEyKS50b0ZpeGVkKDEpKSArICciIGZvbnQtc2l6ZT0iNyIgZmlsbD0idmFyKC0tdDQsICM5Y2EzYWYpIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4nICsgKGQuYWdlKSArICfmrbM8L3RleHQ+JykpOwogICAgaWYoZC5ldkljb24pIHAucHVzaCgoJzx0ZXh0IHg9IicgKyAoY3goaSkudG9GaXhlZCgxKSkgKyAnIiB5PSInICsgKChILVBBRC5iKzIpLnRvRml4ZWQoMSkpICsgJyIgZm9udC1zaXplPSI5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0icG9pbnRlci1ldmVudHM6bm9uZSI+JyArIChkLmV2SWNvbikgKyAnPC90ZXh0PicpKTsKICB9KTsKCiAgLy8g57SU6LOH55Sj44Op44Kk44Oz77yI56C057ea44O76buE6Imy77yJKyDjg4njg4Pjg4jvvIjjg6njgqTjg7Pjga/mo5Ljga7miYvliY3jgavmj4/nlLvvvIkKICBjb25zdCBucD1kYXRhLm1hcCgoZCxpKT0+KChpPT09MD8nTSc6J0wnKSArIChjeChpKS50b0ZpeGVkKDEpKSArICcsJyArIChjbChzYyhkLm5ldHx8MCkpLnRvRml4ZWQoMSkpKSkuam9pbignICcpOwogIHAucHVzaCgoJzxwYXRoIGQ9IicgKyAobnApICsgJyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJ2YXIoLS13YXJuLCAjZDk3NzA2KSIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI1LDMiIG9wYWNpdHk9Ii45Ii8+JykpOwogIGRhdGEuZm9yRWFjaCgoZCxpKT0+ewogICAgY29uc3QgaXNQb3M9KGQubmV0fHwwKT49MDsKICAgIHAucHVzaCgoJzxjaXJjbGUgY3g9IicgKyAoY3goaSkudG9GaXhlZCgxKSkgKyAnIiBjeT0iJyArIChjbChzYyhkLm5ldHx8MCkpLnRvRml4ZWQoMSkpICsgJyIgcj0iMi41IiBmaWxsPSInICsgKGlzUG9zPyd2YXIoLS1ncmVlbiwgIzA1OTY2OSknOid2YXIoLS1yZWQsICNkYzI2MjYpJykgKyAnIiBzdHJva2U9InZhcigtLWJnLCAjZmZmZmZmKSIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4nKSk7CiAgfSk7CgogIC8vIOaKleizh+aZgue0lOizh+eUo+ODqeOCpOODs++8iOe3keWun+e3mu+8iQogIGlmKHNob3dJbnYpewogICAgY29uc3QgaXA9ZGF0YS5tYXAoKGQsaSk9PigoaT09PTA/J00nOidMJykgKyAoY3goaSkudG9GaXhlZCgxKSkgKyAnLCcgKyAoY2woc2MoZC5pbnZOZXR8fDApKS50b0ZpeGVkKDEpKSkpLmpvaW4oJyAnKTsKICAgIHAucHVzaCgoJzxwYXRoIGQ9IicgKyAoaXApICsgJyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJ2YXIoLS1ncmVlbiwgIzA1OTY2OSkiIHN0cm9rZS13aWR0aD0iMiIgb3BhY2l0eT0iLjg1Ii8+JykpOwogIH0KCiAgLy8g5Yeh5L6L77yI44OB44Oj44O844OI5LiK6YOo77yJCiAgY29uc3QgTD1QQUQubCwgTFk9MTA7CiAgbGV0IGx4PUw7CiAgcC5wdXNoKCgnPHJlY3QgeD0iJyArIChseCkgKyAnIiB5PSInICsgKExZKSArICciIHdpZHRoPSI3IiBoZWlnaHQ9IjciIGZpbGw9InZhcigtLXNreSwgIzAyODRjNykiIHJ4PSIxLjUiIG9wYWNpdHk9Ii43NSIvPjx0ZXh0IHg9IicgKyAobHgrMTApICsgJyIgeT0iJyArIChMWSs2LjUpICsgJyIgZm9udC1zaXplPSI3LjUiIGZpbGw9InZhcigtLXQ0LCAjOWNhM2FmKSI+6LKv6JOEPC90ZXh0PicpKTsgbHgrPTQ0OwogIHAucHVzaCgoJzxyZWN0IHg9IicgKyAobHgpICsgJyIgeT0iJyArIChMWSkgKyAnIiB3aWR0aD0iNyIgaGVpZ2h0PSI3IiBmaWxsPSJ2YXIoLS1yZWQsICNkYzI2MjYpIiByeD0iMS41IiBvcGFjaXR5PSIuNTUiLz48dGV4dCB4PSInICsgKGx4KzEwKSArICciIHk9IicgKyAoTFkrNi41KSArICciIGZvbnQtc2l6ZT0iNy41IiBmaWxsPSJ2YXIoLS10NCwgIzljYTNhZikiPuWlqOWtpumHkeaui+mrmDwvdGV4dD4nKSk7IGx4Kz03MjsKICBwLnB1c2goKCc8cmVjdCB4PSInICsgKGx4KSArICciIHk9IicgKyAoTFkpICsgJyIgd2lkdGg9IjciIGhlaWdodD0iNyIgZmlsbD0idmFyKC0tcHVyLCAjN2MzYWVkKSIgcng9IjEuNSIgb3BhY2l0eT0iLjY1Ii8+PHRleHQgeD0iJyArIChseCsxMCkgKyAnIiB5PSInICsgKExZKzYuNSkgKyAnIiBmb250LXNpemU9IjcuNSIgZmlsbD0idmFyKC0tdDQsICM5Y2EzYWYpIj7osq/ok4TkuI3otrM8L3RleHQ+JykpOyBseCs9NjI7CiAgcC5wdXNoKCgnPGNpcmNsZSBjeD0iJyArIChseCszLjUpICsgJyIgY3k9IicgKyAoTFkrMy41KSArICciIHI9IjMiIGZpbGw9InZhcigtLXdhcm4sICNkOTc3MDYpIi8+PHRleHQgeD0iJyArIChseCsxMCkgKyAnIiB5PSInICsgKExZKzYuNSkgKyAnIiBmb250LXNpemU9IjcuNSIgZmlsbD0idmFyKC0tdDQsICM5Y2EzYWYpIj7ntJTos4fnlKM8L3RleHQ+JykpOyBseCs9NDY7CiAgcC5wdXNoKCgnPGxpbmUgeDE9IicgKyAobHgpICsgJyIgeTE9IicgKyAoTFkrMy41KSArICciIHgyPSInICsgKGx4KzEwKSArICciIHkyPSInICsgKExZKzMuNSkgKyAnIiBzdHJva2U9InZhcigtLWdyZWVuLCAjMDU5NjY5KSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjQsMiIvPjx0ZXh0IHg9IicgKyAobHgrMTMpICsgJyIgeT0iJyArIChMWSs2LjUpICsgJyIgZm9udC1zaXplPSI3LjUiIGZpbGw9InZhcigtLWdyZWVuLCAjMDU5NjY5KSI+5a6M5riIPC90ZXh0PicpKTsgbHgrPTQwOwogIGlmKHNob3dJbnYpewogICAgcC5wdXNoKCgnPGxpbmUgeDE9IicgKyAobHgpICsgJyIgeTE9IicgKyAoTFkrMy41KSArICciIHgyPSInICsgKGx4KzEyKSArICciIHkyPSInICsgKExZKzMuNSkgKyAnIiBzdHJva2U9InZhcigtLWdyZWVuLCAjMDU5NjY5KSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iJyArIChseCsxNSkgKyAnIiB5PSInICsgKExZKzYuNSkgKyAnIiBmb250LXNpemU9IjcuNSIgZmlsbD0idmFyKC0tZ3JlZW4sICMwNTk2NjkpIj7ntJTos4fnlKPvvIjmipXos4fmmYLvvIk8L3RleHQ+JykpOwogIH0KCiAgcmV0dXJuICgnPHN2ZyB2aWV3Qm94PSIwIDAgJyArIChXKSArICcgJyArIChIKSArICciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJSI+JyArIChwLmpvaW4oJycpKSArICc8L3N2Zz4nKTsKfQoKLy8g5oqV6LOH5q+U6LyD44OB44Oj44O844OI77yI5L2Z5Ymw6LOH6YeR44Gu6YGL55So44K344Of44Ol44Os44O844K344On44Oz77yJCmZ1bmN0aW9uIHN2Z0ludmVzdENvbXAoc3VycCwgaW52UmV0LCBkZXBSYXRlLCByZXBheU0pIHsKICBpZihzdXJwPD0wKSByZXR1cm4gJyc7CiAgY29uc3QgVz02NjAsIEg9MTc4OwogIGNvbnN0IFBBRD17bDo1MixyOjE2LHQ6NDAsYjoyOH07CiAgY29uc3QgZ1c9Vy1QQUQubC1QQUQuciwgZ0g9SC1QQUQudC1QQUQuYjsKICBjb25zdCB5ZWFycz1NYXRoLmNlaWwocmVwYXlNLzEyKXx8MTsKICBjb25zdCBtckk9aW52UmV0LzEwMC8xMiwgbXJEPWRlcFJhdGUvMTAwLzEyOwogIGNvbnN0IHB0cz1BcnJheS5mcm9tKHtsZW5ndGg6eWVhcnMrMX0sKF8saSk9PnsKICAgIGNvbnN0IG09aSoxMjsKICAgIGNvbnN0IGludj1tckk+MD9zdXJwKihNYXRoLnBvdygxK21ySSxtKS0xKS9tckk6c3VycCptOwogICAgY29uc3QgZGVwPW1yRD4wP3N1cnAqKE1hdGgucG93KDErbXJELG0pLTEpL21yRDpzdXJwKm07CiAgICBjb25zdCBjYXNoPXN1cnAqbTsKICAgIHJldHVybntpLGludixkZXAsY2FzaH07CiAgfSk7CiAgY29uc3QgbWF4Vj1NYXRoLm1heCguLi5wdHMubWFwKHA9PnAuaW52KSwxKTsKICBjb25zdCBzYz12PT5nSC12L21heFYqZ0g7CiAgY29uc3QgY3g9aT0+UEFELmwraSooZ1cveWVhcnMpOwogIGNvbnN0IGN5PXY9PlBBRC50K01hdGgubWF4KDAsTWF0aC5taW4oZ0gsc2ModikpKTsKICAvLyDjgrDjg6rjg4Pjg4kKICBsZXQgcD1bXTsKICBbMCwwLjI1LDAuNSwwLjc1LDFdLmZvckVhY2gocj0+ewogICAgY29uc3QgeT1QQUQudCtnSC1yKmdIOwogICAgcC5wdXNoKCgnPGxpbmUgeDE9IicgKyAoUEFELmwpICsgJyIgeDI9IicgKyAoVy1QQUQucikgKyAnIiB5MT0iJyArICh5LnRvRml4ZWQoMSkpICsgJyIgeTI9IicgKyAoeS50b0ZpeGVkKDEpKSArICciIHN0cm9rZT0iJyArIChyPT09MD8ndmFyKC0tYmQyLCAjZDFkNWRiKSc6J3ZhcigtLWJkLCAjZTVlN2ViKScpICsgJyIgc3Ryb2tlLXdpZHRoPSInICsgKHI9PT0wPzE6MC41KSArICciICcgKyAociE9PTAmJnIhPT0xPydzdHJva2UtZGFzaGFycmF5PSI0LDQiJzonJykgKyAnLz4nKSk7CiAgICBpZihyPjApIHAucHVzaCgoJzx0ZXh0IHg9IicgKyAoUEFELmwtNCkgKyAnIiB5PSInICsgKCh5KzMpLnRvRml4ZWQoMSkpICsgJyIgZm9udC1zaXplPSI3IiBmaWxsPSJ2YXIoLS10NCwgIzljYTNhZikiIHRleHQtYW5jaG9yPSJlbmQiPicgKyAoZm10TShtYXhWKnIpKSArICc8L3RleHQ+JykpOwogIH0pOwogIC8vIOODneODquODqeOCpOODswogIGNvbnN0IG1rTGluZT0oa2V5LHN0cm9rZSxzdyxkYXNoKT0+ewogICAgY29uc3QgZD1wdHMubWFwKChwdCxpKT0+KChpPT09MD8nTSc6J0wnKSArIChjeChpKS50b0ZpeGVkKDEpKSArICcsJyArIChjeShwdFtrZXldKS50b0ZpeGVkKDEpKSkpLmpvaW4oJyAnKTsKICAgIHJldHVybiAoJzxwYXRoIGQ9IicgKyAoZCkgKyAnIiBmaWxsPSJub25lIiBzdHJva2U9IicgKyAoc3Ryb2tlKSArICciIHN0cm9rZS13aWR0aD0iJyArIChzdykgKyAnIiAnICsgKGRhc2g/J3N0cm9rZS1kYXNoYXJyYXk9IicgKyAoZGFzaCkgKyAnIic6JycpICsgJyBvcGFjaXR5PSIuOSIvPicpOwogIH07CiAgcC5wdXNoKG1rTGluZSgnaW52JywndmFyKC0tZ3JlZW4sICMwNTk2NjkpJywyLjIsJycpKTsKICBwLnB1c2gobWtMaW5lKCdkZXAnLCd2YXIoLS1hY2MsICMyNTYzZWIpJywxLjYsJzUsMycpKTsKICBwLnB1c2gobWtMaW5lKCdjYXNoJywndmFyKC0tdDQsICM5Y2EzYWYpJywxLCczLDMnKSk7CiAgLy8g5bm06b2i44Op44OZ44OrCiAgcHRzLmZvckVhY2goKHB0LGkpPT57CiAgICBpZihpJU1hdGguY2VpbCh5ZWFycy81KT09PTB8fGk9PT15ZWFycyl7CiAgICAgIHAucHVzaCgoJzx0ZXh0IHg9IicgKyAoY3goaSkudG9GaXhlZCgxKSkgKyAnIiB5PSInICsgKChILVBBRC5iKzExKS50b0ZpeGVkKDEpKSArICciIGZvbnQtc2l6ZT0iNyIgZmlsbD0idmFyKC0tdDQsICM5Y2EzYWYpIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4nICsgKFMuZ3JhZCtpKSArICfmrbM8L3RleHQ+JykpOwogICAgfQogIH0pOwogIC8vIOacgOe1guWApAogIGNvbnN0IGxhc3Q9cHRzW3B0cy5sZW5ndGgtMV07CiAgcC5wdXNoKCgnPHRleHQgeD0iJyArICgoVy1QQUQuci0yKS50b0ZpeGVkKDEpKSArICciIHk9IicgKyAoY3kobGFzdC5pbnYpLnRvRml4ZWQoMSkpICsgJyIgZm9udC1zaXplPSI4IiBmaWxsPSJ2YXIoLS1ncmVlbiwgIzA1OTY2OSkiIHRleHQtYW5jaG9yPSJlbmQiIGZvbnQtd2VpZ2h0PSI3MDAiPicgKyAoZm10TShsYXN0LmludikpICsgJzwvdGV4dD4nKSk7CiAgcC5wdXNoKCgnPHRleHQgeD0iJyArICgoVy1QQUQuci0yKS50b0ZpeGVkKDEpKSArICciIHk9IicgKyAoKGN5KGxhc3QuZGVwKSsxMCkudG9GaXhlZCgxKSkgKyAnIiBmb250LXNpemU9IjgiIGZpbGw9InZhcigtLWFjYywgIzI1NjNlYikiIHRleHQtYW5jaG9yPSJlbmQiPicgKyAoZm10TShsYXN0LmRlcCkpICsgJzwvdGV4dD4nKSk7CiAgLy8g5Yeh5L6LCiAgY29uc3QgTD1QQUQubCwgTFk9MTA7CiAgcC5wdXNoKCgnPGxpbmUgeDE9IicgKyAoTCkgKyAnIiB5MT0iJyArIChMWSszKSArICciIHgyPSInICsgKEwrMTQpICsgJyIgeTI9IicgKyAoTFkrMykgKyAnIiBzdHJva2U9InZhcigtLWdyZWVuLCAjMDU5NjY5KSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iJyArIChMKzE3KSArICciIHk9IicgKyAoTFkrNi41KSArICciIGZvbnQtc2l6ZT0iNy41IiBmaWxsPSJ2YXIoLS1ncmVlbiwgIzA1OTY2OSkiPuaKleizh++8iCcgKyAoaW52UmV0KSArICcl77yJPC90ZXh0PicpKTsKICBwLnB1c2goKCc8bGluZSB4MT0iJyArIChMKzgwKSArICciIHkxPSInICsgKExZKzMpICsgJyIgeDI9IicgKyAoTCs5NCkgKyAnIiB5Mj0iJyArIChMWSszKSArICciIHN0cm9rZT0idmFyKC0tYWNjLCAjMjU2M2ViKSIgc3Ryb2tlLXdpZHRoPSIxLjYiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMyIvPjx0ZXh0IHg9IicgKyAoTCs5NykgKyAnIiB5PSInICsgKExZKzYuNSkgKyAnIiBmb250LXNpemU9IjcuNSIgZmlsbD0idmFyKC0tdDQsICM5Y2EzYWYpIj7lrprmnJ/poJDph5HvvIgnICsgKGRlcFJhdGUpICsgJyXvvIk8L3RleHQ+JykpOwogIHAucHVzaCgoJzxsaW5lIHgxPSInICsgKEwrMTg1KSArICciIHkxPSInICsgKExZKzMpICsgJyIgeDI9IicgKyAoTCsxOTkpICsgJyIgeTI9IicgKyAoTFkrMykgKyAnIiBzdHJva2U9InZhcigtLXQ0LCAjOWNhM2FmKSIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtZGFzaGFycmF5PSIzLDMiLz48dGV4dCB4PSInICsgKEwrMjAyKSArICciIHk9IicgKyAoTFkrNi41KSArICciIGZvbnQtc2l6ZT0iNy41IiBmaWxsPSJ2YXIoLS10NCwgIzljYTNhZikiPuepjeeri+OBruOBvzwvdGV4dD4nKSk7CiAgcmV0dXJuICgnPHN2ZyB2aWV3Qm94PSIwIDAgJyArIChXKSArICcgJyArIChIKSArICciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJSI+JyArIChwLmpvaW4oJycpKSArICc8L3N2Zz4nKTsKfQoKLy8g6L+U5riI5q6L6auY44OB44Oj44O844OI77yIQ2hhcHRlcjXvvIkKZnVuY3Rpb24gc3ZnUmVwYXlCYWxhbmNlKHQyU2NoZWQsIHQxU2NoZWQsIHJhdGVTZWcpIHsKICBjb25zdCBtYXhNPU1hdGgubWF4KHQyU2NoZWQubGVuZ3RoLCB0MVNjaGVkLmxlbmd0aCk7CiAgaWYobWF4TT09PTApIHJldHVybiAnJzsKICBjb25zdCBXPTY2MCwgSD0xNzA7CiAgY29uc3QgUEFEPXtsOjUyLHI6MTYsdDozOCxiOjI4fTsKICBjb25zdCBnVz1XLVBBRC5sLVBBRC5yLCBnSD1ILVBBRC50LVBBRC5iOwogIGNvbnN0IG1heFY9TWF0aC5tYXgoLi4uWy4uLnQyU2NoZWQsLi4udDFTY2hlZF0ubWFwKHI9PnIuYmFsKSwxKTsKICBjb25zdCBzY1g9bT0+KFBBRC5sKyhtLTEpL21heE0qZ1cpOwogIGNvbnN0IHNjWT12PT5QQUQudCtnSC12L21heFYqZ0g7CiAgbGV0IHA9W107CiAgLy8g44Kw44Oq44OD44OJCiAgWzAsMC41LDFdLmZvckVhY2gocj0+ewogICAgY29uc3QgeT1QQUQudCtnSC1yKmdIOwogICAgcC5wdXNoKCgnPGxpbmUgeDE9IicgKyAoUEFELmwpICsgJyIgeDI9IicgKyAoVy1QQUQucikgKyAnIiB5MT0iJyArICh5LnRvRml4ZWQoMSkpICsgJyIgeTI9IicgKyAoeS50b0ZpeGVkKDEpKSArICciIHN0cm9rZT0iJyArIChyPT09MD8ndmFyKC0tYmQyLCAjZDFkNWRiKSc6J3ZhcigtLWJkLCAjZTVlN2ViKScpICsgJyIgc3Ryb2tlLXdpZHRoPSInICsgKHI9PT0wPzE6MC41KSArICciIHN0cm9rZS1kYXNoYXJyYXk9IicgKyAocj09PTA/J25vbmUnOic0LDQnKSArICciLz4nKSk7CiAgICBwLnB1c2goKCc8dGV4dCB4PSInICsgKFBBRC5sLTQpICsgJyIgeT0iJyArICgoeSszKS50b0ZpeGVkKDEpKSArICciIGZvbnQtc2l6ZT0iNyIgZmlsbD0idmFyKC0tdDQsICM5Y2EzYWYpIiB0ZXh0LWFuY2hvcj0iZW5kIj4nICsgKGZtdE0obWF4VipyKSkgKyAnPC90ZXh0PicpKTsKICB9KTsKICAvLyDnrKzkuoznqK4g6YeR5Yip5aSJ5pu044Oe44O844Kr44O877yI57im57ea77yL5paw6YeR5Yip44Op44OZ44Or77yJCiAgaWYocmF0ZVNlZyAmJiB0MlNjaGVkLmxlbmd0aCl7CiAgICByYXRlU2VnLnNsaWNlKDEpLmZvckVhY2goc2VnPT57CiAgICAgIGlmKHNlZy5zbT49bWF4TSkgcmV0dXJuOwogICAgICBjb25zdCB4PShQQUQubCtzZWcuc20vbWF4TSpnVykudG9GaXhlZCgxKTsKICAgICAgcC5wdXNoKCgnPGxpbmUgeDE9IicgKyAoeCkgKyAnIiB4Mj0iJyArICh4KSArICciIHkxPSInICsgKFBBRC50KSArICciIHkyPSInICsgKChQQUQudCtnSCkudG9GaXhlZCgxKSkgKyAnIiBzdHJva2U9InZhcigtLXJlZCwgI2RjMjYyNikiIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLWRhc2hhcnJheT0iMywyIiBvcGFjaXR5PSIuNTUiLz4nKSk7CiAgICAgIHAucHVzaCgoJzxyZWN0IHg9IicgKyAoK3gtMTQpICsgJyIgeT0iJyArIChQQUQudC0xKSArICciIHdpZHRoPSIyOCIgaGVpZ2h0PSIxMCIgZmlsbD0idmFyKC0tYmcsICNmZmZmZmYpIiBvcGFjaXR5PSIuODUiIHJ4PSIyIi8+JykpOwogICAgICBwLnB1c2goKCc8dGV4dCB4PSInICsgKHgpICsgJyIgeT0iJyArIChQQUQudCs3KSArICciIGZvbnQtc2l6ZT0iNyIgZmlsbD0idmFyKC0tcmVkLCAjZGMyNjI2KSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+4pa8JyArIChzZWcucmF0ZSkgKyAnJTwvdGV4dD4nKSk7CiAgICB9KTsKICAgIC8vIOesrOS6jOeoriDlrozmuIjjg57jg7zjgqvjg7wKICAgIGNvbnN0IHQyRW5kTT10MlNjaGVkLmxlbmd0aDsKICAgIGlmKHQyRW5kTTxtYXhNKXsKICAgICAgY29uc3QgZXg9KFBBRC5sK3QyRW5kTS9tYXhNKmdXKS50b0ZpeGVkKDEpOwogICAgICBwLnB1c2goKCc8bGluZSB4MT0iJyArIChleCkgKyAnIiB4Mj0iJyArIChleCkgKyAnIiB5MT0iJyArIChQQUQudCkgKyAnIiB5Mj0iJyArICgoUEFELnQrZ0gpLnRvRml4ZWQoMSkpICsgJyIgc3Ryb2tlPSJ2YXIoLS1yZWQsICNkYzI2MjYpIiBzdHJva2Utd2lkdGg9IjEuMiIgc3Ryb2tlLWRhc2hhcnJheT0iNCwyIiBvcGFjaXR5PSIuNyIvPicpKTsKICAgICAgcC5wdXNoKCgnPHRleHQgeD0iJyArIChleCkgKyAnIiB5PSInICsgKFBBRC50KzcpICsgJyIgZm9udC1zaXplPSI3IiBmaWxsPSJ2YXIoLS1yZWQsICNkYzI2MjYpIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7lrozmuIg8L3RleHQ+JykpOwogICAgfQogIH0KICAvLyDnrKzkuIDnqK4g5a6M5riI44Oe44O844Kr44O877yIVDLjgajpgZXjgYbloLTlkIjjga7jgb/vvIkKICBpZih0MVNjaGVkLmxlbmd0aCAmJiB0MVNjaGVkLmxlbmd0aCE9PXQyU2NoZWQubGVuZ3RoKXsKICAgIGNvbnN0IHQxRW5kTT10MVNjaGVkLmxlbmd0aDsKICAgIGlmKHQxRW5kTTxtYXhNKXsKICAgICAgY29uc3QgZXg9KFBBRC5sK3QxRW5kTS9tYXhNKmdXKS50b0ZpeGVkKDEpOwogICAgICBwLnB1c2goKCc8bGluZSB4MT0iJyArIChleCkgKyAnIiB4Mj0iJyArIChleCkgKyAnIiB5MT0iJyArIChQQUQudCkgKyAnIiB5Mj0iJyArICgoUEFELnQrZ0gpLnRvRml4ZWQoMSkpICsgJyIgc3Ryb2tlPSJ2YXIoLS1hY2MsICMyNTYzZWIpIiBzdHJva2Utd2lkdGg9IjEuMiIgc3Ryb2tlLWRhc2hhcnJheT0iNCwyIiBvcGFjaXR5PSIuNyIvPicpKTsKICAgICAgcC5wdXNoKCgnPHRleHQgeD0iJyArIChleCkgKyAnIiB5PSInICsgKChQQUQudCsxNikudG9GaXhlZCgxKSkgKyAnIiBmb250LXNpemU9IjciIGZpbGw9InZhcigtLWFjYywgIzI1NjNlYikiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuWujOa4iDwvdGV4dD4nKSk7CiAgICB9CiAgfQogIC8vIOaui+mrmOODqeOCpOODswogIGlmKHQyU2NoZWQubGVuZ3RoKXsKICAgIGNvbnN0IGQ9dDJTY2hlZC5tYXAoKHIsaSk9PigoaT09PTA/J00nOidMJykgKyAoc2NYKHIubSkudG9GaXhlZCgxKSkgKyAnLCcgKyAoc2NZKHIuYmFsKS50b0ZpeGVkKDEpKSkpLmpvaW4oJyAnKTsKICAgIHAucHVzaCgoJzxwYXRoIGQ9IicgKyAoZCkgKyAnIiBmaWxsPSJub25lIiBzdHJva2U9InZhcigtLXJlZCwgI2RjMjYyNikiIHN0cm9rZS13aWR0aD0iMS44IiBvcGFjaXR5PSIuODUiLz4nKSk7CiAgICBwLnB1c2goKCc8dGV4dCB4PSInICsgKChXLVBBRC5yKSkgKyAnIiB5PSInICsgKFBBRC50KzgpICsgJyIgZm9udC1zaXplPSI3LjUiIGZpbGw9InZhcigtLXJlZCwgI2RjMjYyNikiIHRleHQtYW5jaG9yPSJlbmQiPuesrOS6jOeorjwvdGV4dD4nKSk7CiAgfQogIGlmKHQxU2NoZWQubGVuZ3RoKXsKICAgIGNvbnN0IGQ9dDFTY2hlZC5tYXAoKHIsaSk9PigoaT09PTA/J00nOidMJykgKyAoc2NYKHIubSkudG9GaXhlZCgxKSkgKyAnLCcgKyAoc2NZKHIuYmFsKS50b0ZpeGVkKDEpKSkpLmpvaW4oJyAnKTsKICAgIHAucHVzaCgoJzxwYXRoIGQ9IicgKyAoZCkgKyAnIiBmaWxsPSJub25lIiBzdHJva2U9InZhcigtLWFjYywgIzI1NjNlYikiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtZGFzaGFycmF5PSI1LDMiIG9wYWNpdHk9Ii44NSIvPicpKTsKICAgIHAucHVzaCgoJzx0ZXh0IHg9IicgKyAoKFctUEFELnIpKSArICciIHk9IicgKyAoKFBBRC50KzE4KS50b0ZpeGVkKDEpKSArICciIGZvbnQtc2l6ZT0iNy41IiBmaWxsPSJ2YXIoLS1hY2MsICMyNTYzZWIpIiB0ZXh0LWFuY2hvcj0iZW5kIj7nrKzkuIDnqK48L3RleHQ+JykpOwogIH0KICAvLyDlubTjg6njg5njg6sKICBjb25zdCB5cnM9TWF0aC5jZWlsKG1heE0vMTIpOwogIGZvcihsZXQgeT0wO3k8PXlyczt5Kz1NYXRoLmNlaWwoeXJzLzgpKXsKICAgIGNvbnN0IHg9UEFELmwreSoxMi9tYXhNKmdXOwogICAgcC5wdXNoKCgnPHRleHQgeD0iJyArICh4LnRvRml4ZWQoMSkpICsgJyIgeT0iJyArICgoSC1QQUQuYisxMSkudG9GaXhlZCgxKSkgKyAnIiBmb250LXNpemU9IjciIGZpbGw9InZhcigtLXQ0LCAjOWNhM2FmKSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+JyArIChTLmdyYWQreSkgKyAn5q2zPC90ZXh0PicpKTsKICB9CiAgcmV0dXJuICgnPHN2ZyB2aWV3Qm94PSIwIDAgJyArIChXKSArICcgJyArIChIKSArICciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJSI+JyArIChwLmpvaW4oJycpKSArICc8L3N2Zz4nKTsKfQovLyDilIDilIAg6KmV5L6h44Ot44K444OD44KvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBnZXRSYXRpb0V2YWwocikgewogIGlmKHI8MTApICByZXR1cm57bGFiZWw6J+S9meijleOBguOCiicsICBjb2xvcjondmFyKC0tZ3JlZW4sICMwNTk2NjkpJyxkZXRhaWw6J+i/lOa4iOiyoOaLheOBr+i7veOBhOeKtuaFi+OBp+OBmeOAguiyr+iThOODu+aKleizh+OBq+WbnuOBmeS9meijleOBjOOBguOCiuOBvuOBmeOAgicsaWNvbjon4pyFJ307CiAgaWYocjwxNSkgIHJldHVybntsYWJlbDon5a6J5YWo5ZyPJywgICAgY29sb3I6J3ZhcigtLWFjYywgIzI1NjNlYiknLCAgZGV0YWlsOifmqJnmupbnmoTjgarov5TmuIjmr5TnjofjgafjgZnjgILnhKHnkIbjgarjgY/ov5TmuIjjgpLntprjgZHjgonjgozjgb7jgZnjgIInLGljb246J/CflLUnfTsKICBpZihyPDI1KSAgcmV0dXJue2xhYmVsOifjgoTjgoTosqDmi4UnLCAgY29sb3I6J3ZhcigtLXdhcm4sICNkOTc3MDYpJywgZGV0YWlsOifjgoTjgoTosqDmi4XjgYzph43jgYTnirbmhYvjgafjgZnjgILjg6njgqTjg5XjgqTjg5njg7Pjg4jjgajph43jgarjgovjgajlrrboqIjjgYzljrPjgZfjgY/jgarjgorjgb7jgZnjgIInLGljb246J+KaoO+4jyd9OwogIGlmKHI8MzUpICByZXR1cm57bGFiZWw6J+WNsemZuuODqeOCpOODsycsY29sb3I6J3ZhcigtLW9yYSwgI2VhNTgwYyknLCAgZGV0YWlsOifosqDmi4XjgYzph43jgYTnirbmhYvjgafjgZnjgILnubDkuIrjgZLov5TmuIjjgYvmlK/lh7rliYrmuJvjgpLmpJzoqI7jgZfjgabjgY/jgaDjgZXjgYTjgIInLGljb246J/CflLYnfTsKICByZXR1cm4gICAgICB7bGFiZWw6J+imgeimi+ebtOOBlycsICAgICAgY29sb3I6J3ZhcigtLXJlZCwgI2RjMjYyNiknLCAgZGV0YWlsOifov5TmuIjmr5TnjofjgYzpq5jjgZnjgY7jgb7jgZnjgILlrrboqIjjgYzpgLzov6vjgZnjgovjg6rjgrnjgq/jgYzjgYLjgorjgb7jgZnjgIInLGljb246J/CfmqgnfTsKfQoKLy8g4pSA4pSAIENoYXB0ZXIyIOabtOaWsCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gdXBkQ2gyKFIpIHsKICBjb25zdCBldj1nZXRSYXRpb0V2YWwoUi5yZXBheVJhdGlvKTsKICAvLyDntbHoqIjjgqvjg7zjg4kKICBlbCgnc3RhdC1ncmlkJykuaW5uZXJIVE1MPSgnXG4gICAgPGRpdiBjbGFzcz0ic2MiPjxkaXYgY2xhc3M9InNjLWxibCI+5aWo5a2m6YeR5Ymy5ZCIPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPSJzYy12YWwiIHN0eWxlPSJjb2xvcjonICsgKGV2LmNvbG9yKSArICciPicgKyAoUi5yZXBheVJhdGlvLnRvRml4ZWQoMSkpICsgJyU8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9InNjLXN1YiI+JyArIChldi5sYWJlbCkgKyAnPC9kaXY+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz0ic2MiPjxkaXYgY2xhc3M9InNjLWxibCI+5pyI6ZaT5L2Z5YmwPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPSJzYy12YWwiIHN0eWxlPSJjb2xvcjonICsgKFIubW9udGhseVN1cnA+PTA/J3ZhcigtLWdyZWVuKSc6J3ZhcigtLXJlZCknKSArICciPicgKyAoZm10TShSLm1vbnRobHlTdXJwKSkgKyAnPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPSJzYy1zdWIiPuaciOWPji3nlJ/mtLvosrst6L+U5riIPC9kaXY+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz0ic2MiPjxkaXYgY2xhc3M9InNjLWxibCI+5a6M5riI6KaL6L6844G/5bm06b2iPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPSJzYy12YWwiIHN0eWxlPSJjb2xvcjp2YXIoLS1za3kpIj4nICsgKFIucmVwYXlFbmRBZ2UpICsgJ+atszwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz0ic2Mtc3ViIj7ljZLmpa0nICsgKFMuZ3JhZCkgKyAn5q2zKycgKyAoTWF0aC5jZWlsKFIucmVwYXlNLzEyKSkgKyAn5bm0PC9kaXY+PC9kaXY+Jyk7CiAgLy8g44Ky44O844K4CiAgZWwoJ2dhdWdlLW5lZWRsZScpLnN0eWxlLmxlZnQgPSBNYXRoLm1pbihSLnJlcGF5UmF0aW8vNDAqMTAwLDk4KSsnJSc7CiAgLy8g6KmV5L6h44OQ44OK44O8CiAgZWwoJ2V2YWwtYmFubmVyJykuaW5uZXJIVE1MPSgnPGRpdiBjbGFzcz0iZXYtYmFuIiBzdHlsZT0iYmFja2dyb3VuZDonICsgKGV2LmNvbG9yKSArICcxODtib3JkZXItY29sb3I6JyArIChldi5jb2xvcikgKyAnIj5cbiAgICA8c3Ryb25nIHN0eWxlPSJjb2xvcjonICsgKGV2LmNvbG9yKSArICciPicgKyAoZXYuaWNvbikgKyAnIOWlqOWtpumHkeWJsuWQiCAnICsgKFIucmVwYXlSYXRpby50b0ZpeGVkKDEpKSArICclIOKGkiAnICsgKGV2LmxhYmVsKSArICc8L3N0cm9uZz5cbiAgICAnICsgKFIuZGV0YWlsfHxldi5kZXRhaWwpICsgJzwvZGl2PicpOwogIC8vIOODqeOCpOODleOCpOODmeODs+ODiOmHjeikh+itpuWRigogIGNvbnN0IGFjdGl2ZUV2PUVWX0RFRlMuZmlsdGVyKGQ9PlNbZC5rZXldLm9uKTsKICBjb25zdCBvdmVybGFwcz1hY3RpdmVFdi5maWx0ZXIoZT0+U1tlLmtleV0uYWdlPFIucmVwYXlFbmRBZ2UpOwogIGlmKG92ZXJsYXBzLmxlbmd0aCl7CiAgICBlbCgnb3ZlcmxhcC13YXJuJykuaW5uZXJIVE1MPSgnPGRpdiBjbGFzcz0iYWwgYWwtdyI+PGI+4pqg77iPIOi/lOa4iOacn+mWk+S4reOBq+mHjeOBquOCi+ODqeOCpOODleOCpOODmeODs+ODiDwvYj48YnI+JykrCiAgICAgIG92ZXJsYXBzLm1hcChlPT4oJ+ODuycgKyAoZS5pY29uKSArICcgJyArIChlLm5hbWUpICsgJ++8iCcgKyAoU1tlLmtleV0uYWdlKSArICfmrbPpoIPvvInjgYzov5TmuIjmnJ/plpPkuK3jgavph43jgarjgorjgb7jgZknKSkuam9pbignPGJyPicpKygnPC9kaXY+Jyk7CiAgfSBlbHNlIHsgZWwoJ292ZXJsYXAtd2FybicpLmlubmVySFRNTD0nJzsgfQogIC8vIENUQQogIGNvbnN0IGV4dHJhPU1hdGgucm91bmQoKChSLnQyU2NoZWRbMF0/LnBheXx8MCkqMzYpLzEyLzEwMDAwKSoxMDAwMDsKICBlbCgnY3RhLWJveCcpLmlubmVySFRNTD0oJzxkaXYgY2xhc3M9ImN0YSI+XG4gICAgPGRpdiBjbGFzcz0iY3RhLXQiPuOBguOBqCcgKyAoTWF0aC5taW4oMyxNYXRoLmNlaWwoUi5yZXBheU0vMTIpKSkgKyAn5bm05pep44GP6L+U44GZ44Gr44Gv77yfPC9kaXY+XG4gICAgPGRpdiBjbGFzcz0iY3RhLWIiPuW5tOWPjiA8YiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlIj4rJyArIChmbXRNKGV4dHJhKSkgKyAnPC9iPiDlopfjgoTjgZnjgYvjgIHnubDkuIrjgZLov5TmuIjvvIhDaGFwdGVyIDTvvInjgpLmtLvnlKjjgZnjgovjgZPjgajjgaflrp/nj77jgafjgY3jgb7jgZnjgII8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPSJjdGEtbGlua3MiPlxuICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9ImN0YS1hIGN0YS1hcCI+5bm05Y+O44KS5LiK44GS44KL5pa55rOVIOKGkjwvYT5cbiAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJjdGEtYSBjdGEtYWciPuWJr+alreODu+i7ouiBt+OCkuaknOiojuOBmeOCiyDihpI8L2E+XG4gICAgPC9kaXY+PC9kaXY+Jyk7Cn0KCi8vIOKUgOKUgCBDaGFwdGVyMyDmm7TmlrAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIHVwZENoMyhSKSB7CiAgLy8g44Op44Kk44OV44Kk44OZ44Oz44OI44Kr44O844OJCiAgbGV0IGV2SHRtbD0nJzsKICBFVl9ERUZTLmZvckVhY2goZD0+ewogICAgY29uc3QgZXY9U1tkLmtleV07CiAgICBldkh0bWwrPSgnPGRpdiBjbGFzcz0iZXYtY2FyZCAnICsgKGV2Lm9uPydvbic6JycpICsgJyIgaWQ9ImV2LScgKyAoZC5rZXkpICsgJyI+XG4gICAgICA8ZGl2IGNsYXNzPSJldi1oZCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9InRiICcgKyAoZXYub24/J29uLXknOicnKSArICciIG9uY2xpY2s9InRvZ2dsZUV2KFwnJyArIChkLmtleSkgKyAnXCcpIiBzdHlsZT0iZmxleC1zaHJpbms6MCI+JyArIChldi5vbj8nT04nOidPRkYnKSArICc8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9ImV2LWljbyI+JyArIChkLmljb24pICsgJzwvc3Bhbj5cbiAgICAgICAgPGRpdj48ZGl2IGNsYXNzPSJldi1ubSI+JyArIChkLm5hbWUpICsgJzwvZGl2PjxkaXYgY2xhc3M9ImV2LW50Ij4nICsgKGQubm90ZSkgKyAnPC9kaXY+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgICcgKyAoZXYub24/JzxkaXYgY2xhc3M9ImV2LWN0cmwiPlxuICAgICAgICA8ZGl2PjxkaXYgY2xhc3M9ImV2LXN0ZXAtbGJsIj7lubTpvaI8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSJldi1zdGVwIj5cbiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iYWRqRXYoXCcnICsgKGQua2V5KSArICdcJyxcJ2FnZVwnLC0xKSI+4oiSPC9idXR0b24+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiB2YWx1ZT0iJyArIChldi5hZ2UpICsgJyIgbWluPSIxOCIgbWF4PSI2MCJcbiAgICAgICAgICAgICAgb25jaGFuZ2U9InNldEV2QWdlKFwnJyArIChkLmtleSkgKyAnXCcsK3RoaXMudmFsdWUpIj5cbiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iYWRqRXYoXCcnICsgKGQua2V5KSArICdcJyxcJ2FnZVwnLDEpIj7vvIs8L2J1dHRvbj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBweDtjb2xvcjp2YXIoLS10NCk7bWFyZ2luLWxlZnQ6MnB4Ij7mrbM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+PC9kaXY+XG4gICAgICAgIDxkaXY+PGRpdiBjbGFzcz0iZXYtc3RlcC1sYmwiPuiyu+eUqO+8iOS4h+WGhu+8iTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9ImV2LXN0ZXAiPlxuICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJhZGpFdihcJycgKyAoZC5rZXkpICsgJ1wnLFwnY29zdFwnLC0xKSI+4oiSPC9idXR0b24+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiB2YWx1ZT0iJyArIChldi5jb3N0KSArICciIG1pbj0iMCIgbWF4PSI1MDAwIiBzdGVwPSIxIlxuICAgICAgICAgICAgICBvbmNoYW5nZT0iU1tcJycgKyAoZC5rZXkpICsgJ1wnXS5jb3N0PSt0aGlzLnZhbHVlO3JlbmRlcigpIj5cbiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iYWRqRXYoXCcnICsgKGQua2V5KSArICdcJyxcJ2Nvc3RcJywxKSI+77yLPC9idXR0b24+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHg7Y29sb3I6dmFyKC0tdDQpO21hcmdpbi1sZWZ0OjJweCI+5LiHPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PjwvZGl2PlxuICAgICAgPC9kaXY+JzonJykgKyAnXG4gICAgPC9kaXY+Jyk7CiAgfSk7CiAgZWwoJ2V2LWdyaWQnKS5pbm5lckhUTUw9ZXZIdG1sOwoKICBjb25zdCB0b3RhbEV2Q29zdD1FVl9ERUZTLmZpbHRlcihkPT5TW2Qua2V5XS5vbikucmVkdWNlKChzLGQpPT5zK1NbZC5rZXldLmNvc3QqMTAwMDAsMCk7CiAgZWwoJ2V2LXRvdGFsLXdhcm4nKS5pbm5lckhUTUw9dG90YWxFdkNvc3Q+MD8oJzxkaXYgY2xhc3M9ImFsIGFsLXciIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEwcHgiPuODqeOCpOODleOCpOODmeODs+ODiOiyu+eUqOWQiOioiCA8Yj4nICsgKGZtdE0odG90YWxFdkNvc3QpKSArICc8L2I+IOOCkuiyr+iThOOBi+OCieW3ruOBl+W8leOBhOOBpuippueul+OBl+OBpuOBhOOBvuOBmTwvZGl2PicpOicnOwoKICAvLyDntJTos4fnlKPjgrDjg6njg5UKICBlbCgnbnctY2hhcnQnKS5pbm5lckhUTUw9Y2hhcnRXcmFwKHN2Z05ldFdvcnRoKFIueWVhcmx5RGF0YSwgUy5zaG93SW52LCBSLnJlcGF5RW5kQWdlKSwn57SU6LOH55Sj44Gu5o6o56e7Jyk7CgogIC8vIOOCv+OCpOODoOODqeOCpOODswogIGNvbnN0IGljb25zPVsn8J+MsScsJ/Cfj4MnLCfwn5K8Jywn8J+PoSddOwogIGxldCB0bEh0bWw9Jyc7CiAgUi5taWxlc3RvbmVzLmZvckVhY2goKG1zLGlkeCk9PnsKICAgIGNvbnN0IGRvbmU9bXMudG90YWxEZWJ0PDEwMDA7CiAgICBjb25zdCBuYz1tcy5uZXQ+PTA/J3ZhcigtLWdyZWVuKSc6J3ZhcigtLXJlZCknOwogICAgY29uc3QgZXZCYWRnZXM9bXMuZXZXaW5kb3cubWFwKGQ9PignPHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0td2Fybi1zKTtjb2xvcjp2YXIoLS13YXJuKTtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoxcHggN3B4O2ZvbnQtc2l6ZToxMHB4O2ZvbnQtd2VpZ2h0OjcwMCI+JyArIChkLmljb24pICsgJyAnICsgKGQubmFtZSkgKyAnPC9zcGFuPicpKS5qb2luKCcnKTsKICAgIHRsSHRtbCs9KCc8ZGl2IGNsYXNzPSJ0bC1pdGVtIj5cbiAgICAgIDxkaXYgY2xhc3M9InRsLWRjIj5cbiAgICAgICAgPGRpdiBjbGFzcz0idGwtZG90ICcgKyAoZG9uZT8nZG9uZSc6JycpICsgJyI+JyArIChpY29uc1tpZHhdKSArICc8L2Rpdj5cbiAgICAgICAgJyArIChpZHg8Mz8nPGRpdiBjbGFzcz0idGwtbG4iPjwvZGl2Pic6JycpICsgJ1xuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPSJ0bC1ib2R5Ij5cbiAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbi1ib3R0b206NHB4Ij5cbiAgICAgICAgICA8c3BhbiBjbGFzcz0idGwtYWdlIj4nICsgKG1zLmFnZSkgKyAn5q2zPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0bC1zdWIiPu+8iCcgKyAobXMueXIpICsgJ+W5tOW+jO+8iTwvc3Bhbj5cbiAgICAgICAgICAnICsgKGRvbmU/JzxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWdyZWVuLXMpO2NvbG9yOnZhcigtLWdyZWVuKTtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoxcHggN3B4O2ZvbnQtc2l6ZToxMHB4O2ZvbnQtd2VpZ2h0OjcwMCI+4pyFIOWujOa4iO+8gTwvc3Bhbj4nOicnKSArICdcbiAgICAgICAgICAnICsgKGV2QmFkZ2VzKSArICdcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9InRsLWNhcmQiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9InRsLW51bXMiPlxuICAgICAgICAgICAgJyArIChtcy5ncm9zcz4wPyc8ZGl2PjxkaXYgY2xhc3M9InRsLW4tbGJsIj7osq/ok4TntK/oqIg8L2Rpdj48ZGl2IGNsYXNzPSJ0bC1uLXZhbCIgc3R5bGU9ImNvbG9yOnZhcigtLXRlYWwpIj4nICsgKGZtdE0obXMuZ3Jvc3MpKSArICc8L2Rpdj48L2Rpdj4nOicnKSArICdcbiAgICAgICAgICAgICcgKyAobXMuZXZDb3N0PjA/JzxkaXY+PGRpdiBjbGFzcz0idGwtbi1sYmwiPuODqeOCpOODleiyu+eUqO+8iOW3ruW8le+8iTwvZGl2PjxkaXYgY2xhc3M9InRsLW4tdmFsIiBzdHlsZT0iY29sb3I6dmFyKC0td2FybikiPuKIkicgKyAoZm10TShtcy5ldkNvc3QpKSArICc8L2Rpdj48L2Rpdj4nOicnKSArICdcbiAgICAgICAgICAgICcgKyAoIWRvbmU/JzxkaXY+PGRpdiBjbGFzcz0idGwtbi1sYmwiPuWlqOWtpumHkeaui+mrmDwvZGl2PjxkaXYgY2xhc3M9InRsLW4tdmFsIiBzdHlsZT0iY29sb3I6dmFyKC0tcmVkKSI+JyArIChmbXRNKG1zLnRvdGFsRGVidCkpICsgJzwvZGl2PjwvZGl2Pic6JycpICsgJ1xuICAgICAgICAgICAgPGRpdj48ZGl2IGNsYXNzPSJ0bC1uLWxibCI+57SU6LOH55Sj77yI5qaC566X77yJPC9kaXY+PGRpdiBjbGFzcz0idGwtbi12YWwiIHN0eWxlPSJjb2xvcjonICsgKG5jKSArICc7Zm9udC1zaXplOjE1cHgiPicgKyAobXMubmV0Pj0wPycrJzonJykgKyAoZm10TShtcy5uZXQpKSArICc8L2Rpdj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4nKTsKICB9KTsKICBlbCgndGltZWxpbmUnKS5pbm5lckhUTUw9dGxIdG1sOwoKICAvLyDosq/ok4TkuI3otrPorablkYrvvIjosq/ok4TjgYzjg57jgqTjg4rjgrnjgavjgarjgovlubTpvaLvvIkKICBjb25zdCBkZWZpY2l0WXJzPVIueWVhcmx5RGF0YS5maWx0ZXIoZD0+KGQuc2F2aW5nc3x8MCk8MCk7CiAgY29uc3Qgcmlza0VsPWVsKCdudy1yaXNrLXdhcm4nKTsKICBpZihyaXNrRWwpewogICAgaWYoZGVmaWNpdFlycy5sZW5ndGg+MCl7CiAgICAgIGNvbnN0IGZpcnN0RGVmPWRlZmljaXRZcnNbMF07CiAgICAgIHJpc2tFbC5pbm5lckhUTUw9KCc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLW9yYS1zKTtib3JkZXI6MnB4IHNvbGlkIHZhcigtLW9yYSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWQpO3BhZGRpbmc6MTZweCAxOHB4O21hcmdpbjowIDI4cHggMCI+XG4gICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjkwMDtjb2xvcjp2YXIoLS1vcmEpO21hcmdpbi1ib3R0b206NHB4Ij7imqDvuI8gJyArIChmaXJzdERlZi5hZ2UpICsgJ+ats+mgg+OBi+OCieizh+mHkeS9meWKm+OBjOiWhOOBj+OBquOCi+imi+i+vOOBv+OBp+OBmTwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTFweDtjb2xvcjp2YXIoLS10Mik7bGluZS1oZWlnaHQ6MS42Ij7nj77lnKjjga7lj47mlK/jgafjga/jgIEnICsgKGZpcnN0RGVmLmFnZSkgKyAn5q2z6aCD44GrPGIgc3R5bGU9ImNvbG9yOnZhcigtLW9yYSkiPuiyr+iThOOBjOW6leOCkuOBpOOBjzwvYj7jgrfjg4rjg6rjgqrjgYzmg7PlrprjgZXjgozjgb7jgZnjgILlj47lhaXlopfliqDjgIHnlJ/mtLvosrvjga7opovnm7TjgZfjgIHjgb7jgZ/jga/jg6njgqTjg5XjgqTjg5njg7Pjg4jjga7jgr/jgqTjg5/jg7PjgrDoqr/mlbTjgafmlLnlloTjgafjgY3jgb7jgZnjgII8L2Rpdj5cbiAgICAgIDwvZGl2PicpOwogICAgfSBlbHNlIHsKICAgICAgcmlza0VsLmlubmVySFRNTD0nJzsKICAgIH0KICB9Cn0KCi8vIOKUgOKUgCBDaGFwdGVyNCDmm7TmlrAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIHVwZENoNChSKSB7CiAgLy8g5oqV6LOH44OB44Oj44O844OICiAgY29uc3Qgc3VycDRpbnY9TWF0aC5tYXgoMCxSLm1vbnRobHlTdXJwKTsKICBpZihTLnNob3dJbnYgJiYgc3VycDRpbnY+MCl7CiAgICBlbCgnaW52LWNoYXJ0LXdyYXAnKS5pbm5lckhUTUw9KCdcbiAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206NnB4O2ZvbnQtc2l6ZToxMXB4O2NvbG9yOnZhcigtLXQzKSI+XG4gICAgICAgIOaciDxiIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2U7Y29sb3I6dmFyKC0tdDEpIj4nICsgKGZtdE0oc3VycDRpbnYpKSArICc8L2I+44Gu5L2Z5Ymw6LOH6YeR44KSJyArIChTLmludlJldCkgKyAnJeOBp+ikh+WIqemBi+eUqOOBmeOCi+OBqOKAplxuICAgICAgPC9kaXY+XG4gICAgICAnICsgKGNoYXJ0V3JhcChzdmdJbnZlc3RDb21wKHN1cnA0aW52LFMuaW52UmV0LFMuZGVwUmF0ZSxSLnJlcGF5TSksJ+aKleizh+OCt+ODn+ODpeODrOODvOOCt+ODp+ODsycpKSk7CiAgfSBlbHNlIGlmKCFTLnNob3dJbnYpewogICAgZWwoJ2ludi1jaGFydC13cmFwJykuaW5uZXJIVE1MPScnOwogIH0gZWxzZSB7CiAgICBlbCgnaW52LWNoYXJ0LXdyYXAnKS5pbm5lckhUTUw9KCc8ZGl2IGNsYXNzPSJhbCBhbC13Ij7mnIjplpPkvZnlibDjgYzjg57jgqTjg4rjgrnjga7jgZ/jgoHmipXos4fjgrfjg5/jg6Xjg6zjg7zjgrfjg6fjg7PjgpLooajnpLrjgafjgY3jgb7jgZvjgpPjgILlj47lhaXjg7vnlJ/mtLvosrvjgpLopovnm7TjgZfjgabjgY/jgaDjgZXjgYTjgII8L2Rpdj4nKTsKICB9CgogIC8vIOe5sOS4iuOBkui/lOa4iFVJ77yI6KSH5pWw5Zue77yJCiAgcmVuZGVyUHJlcGF5VUkoUik7CgogIC8vIOe5sOS4iuOBkui/lOa4iOe1kOaenAogIGlmKCFSLnByZXBheVJlc3VsdCB8fCBTLnByZXBheXMubGVuZ3RoPT09MCl7CiAgICBlbCgnaXJyLXJlc3VsdCcpLmlubmVySFRNTD0oJzxkaXYgY2xhc3M9ImFsIGFsLWkiPuOAjOe5sOS4iuOBkui/lOa4iOOCkui/veWKoOOAjeOBp+OAgeevgOe0hOOBp+OBjeOCi+WIqeaBr+OBqElSUu+8iOWun+izquWIqeWbnuOCiu+8ieOCkuioiOeul+OBp+OBjeOBvuOBmeOAgjwvZGl2PicpOwogICAgZWwoJ3ZlcmRpY3QtZ3JpZCcpLmlubmVySFRNTD0nJzsKICAgIHJldHVybjsKICB9CiAgY29uc3QgcHI9Ui5wcmVwYXlSZXN1bHQ7CiAgY29uc3QgaXJyQ29sb3I9cHIuaXJyQW5uIT1udWxsPyhwci5pcnJBbm4+Uy5pbnZSZXQ/J3ZhcigtLWdyZWVuKSc6cHIuaXJyQW5uPlMuZGVwUmF0ZT8ndmFyKC0td2FybiknOid2YXIoLS10MyknKTondmFyKC0tdDMpJzsKICBlbCgnaXJyLXJlc3VsdCcpLmlubmVySFRNTD0oJ1xuICAgIDxkaXYgY2xhc3M9Imlyci1jYXJkIj5cbiAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmciAxZnI7Z2FwOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4Ij5cbiAgICAgICAgPGRpdj48ZGl2IGNsYXNzPSJpcnItbGJsIj7nr4DntITjgafjgY3jgovnt4/liKnmga88L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSJpcnItbWFpbiIgc3R5bGU9ImNvbG9yOnZhcigtLWdyZWVuKTtmb250LXNpemU6MjJweCI+JyArIChmbXRNKHByLnNhdmVkKSkgKyAnPC9kaXY+PC9kaXY+XG4gICAgICAgIDxkaXY+PGRpdiBjbGFzcz0iaXJyLWxibCI+6L+U5riI5pyf6ZaT44Gu55+t57iuPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz0iaXJyLW1haW4iIHN0eWxlPSJjb2xvcjp2YXIoLS1hY2MpO2ZvbnQtc2l6ZToyMnB4Ij4nICsgKHByLnNob3J0ZW5NKSArICfjg7bmnIg8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSJpcnItbGJsIj4nICsgKE1hdGguZmxvb3IocHIuc2hvcnRlbk0vMTIpKSArICflubQnICsgKHByLnNob3J0ZW5NJTEyKSArICfjg7bmnIg8L2Rpdj48L2Rpdj5cbiAgICAgICAgPGRpdj48ZGl2IGNsYXNzPSJpcnItbGJsIj5JUlLvvIjlrp/os6rliKnlm57jgorvvIk8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSJpcnItbWFpbiIgc3R5bGU9ImNvbG9yOicgKyAoaXJyQ29sb3IpICsgJztmb250LXNpemU6MjJweCI+JyArIChwci5pcnJBbm4hPW51bGw/cHIuaXJyQW5uLnRvRml4ZWQoMykrJyUnOifigJQnKSArICc8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSJpcnItbGJsIj7nubDkuIrjgZLov5TmuIjjga7lrp/lirnjg6rjgr/jg7zjg7M8L2Rpdj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT0ib3ZlcmZsb3cteDphdXRvIj5cbiAgICAgIDx0YWJsZSBjbGFzcz0iY21wLXRibCI+XG4gICAgICAgIDx0aGVhZD48dHI+PHRoPuavlOi8g+mgheebrjwvdGg+PHRoPue5sOS4iuOBkuOBquOBlzwvdGg+PHRoPue5sOS4iuOBkuOBguOCijwvdGg+PHRoPuW3rumhjTwvdGg+PC90cj48L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyPjx0ZD7nt4/ov5TmuIjpoY08L3RkPjx0ZD4nICsgKGZtdE0oUi50MlBwYWwrcHIuYmFzZUludCkpICsgJzwvdGQ+PHRkPicgKyAoZm10TShSLnQyUHBhbCtwci5wcEludCkpICsgJzwvdGQ+XG4gICAgICAgICAgICA8dGQgc3R5bGU9ImNvbG9yOnZhcigtLWdyZWVuKTtmb250LXdlaWdodDo3MDAiPuKIkicgKyAoZm10TShwci5zYXZlZCkpICsgJzwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkPuOBhuOBoeWIqeaBrzwvdGQ+PHRkPicgKyAoZm10TShwci5iYXNlSW50KSkgKyAnPC90ZD48dGQ+JyArIChmbXRNKHByLnBwSW50KSkgKyAnPC90ZD5cbiAgICAgICAgICAgIDx0ZCBzdHlsZT0iY29sb3I6dmFyKC0tZ3JlZW4pO2ZvbnQtd2VpZ2h0OjcwMCI+4oiSJyArIChmbXRNKHByLnNhdmVkKSkgKyAnPC90ZD48L3RyPlxuICAgICAgICAgIDx0cj48dGQ+6L+U5riI5pyf6ZaTPC90ZD48dGQ+JyArIChSLnQyU2NoZWQubGVuZ3RoKSArICfjg7bmnIg8L3RkPlxuICAgICAgICAgICAgPHRkPicgKyAoUi5wcmVwYXlSZXN1bHQucHBTY2hlZC5maWx0ZXIocj0+IXIuaXNQcmVwYXkpLmxlbmd0aCkgKyAn44O25pyIPC90ZD5cbiAgICAgICAgICAgIDx0ZCBzdHlsZT0iY29sb3I6dmFyKC0tYWNjKTtmb250LXdlaWdodDo3MDAiPuKIkicgKyAocHIuc2hvcnRlbk0pICsgJ+ODtuaciDwvdGQ+PC90cj5cbiAgICAgICAgICA8dHI+PHRkPuWumuacn+mgkOmHkeOBqOOBruavlOi8gzwvdGQ+PHRkIGNvbHNwYW49IjIiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjp2YXIoLS10MykiPuWumuacn+mgkOmHkScgKyAoUy5kZXBSYXRlKSArICclPC90ZD5cbiAgICAgICAgICAgIDx0ZCBzdHlsZT0iY29sb3I6JyArICgocHIuaXJyQW5ufHwwKT5TLmRlcFJhdGU/J3ZhcigtLWdyZWVuKSc6J3ZhcigtLW9yYSknKSArICc7Zm9udC13ZWlnaHQ6NzAwIj5cbiAgICAgICAgICAgICAgJyArIChwci5pcnJBbm4hPW51bGw/KChwci5pcnJBbm4+Uy5kZXBSYXRlKT8n57mw5LiK44GS44GM5pyJ5YipIOKchSc6J+mgkOmHkeOBjOacieWIqScpOifigJQnKSArICc8L3RkPjwvdHI+XG4gICAgICAgICAgPHRyPjx0ZD7mipXos4fjg6rjgr/jg7zjg7Pjgajjga7mr5TovIM8L3RkPjx0ZCBjb2xzcGFuPSIyIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6dmFyKC0tdDMpIj7mg7PlrponICsgKFMuaW52UmV0KSArICclPC90ZD5cbiAgICAgICAgICAgIDx0ZCBzdHlsZT0iY29sb3I6JyArICgocHIuaXJyQW5ufHwwKT5TLmludlJldD8ndmFyKC0tZ3JlZW4pJzondmFyKC0td2FybiknKSArICc7Zm9udC13ZWlnaHQ6NzAwIj5cbiAgICAgICAgICAgICAgJyArIChwci5pcnJBbm4hPW51bGw/KChwci5pcnJBbm4+Uy5pbnZSZXQpPyfnubDkuIrjgZLjgYzmnInliKkg4pyFJzon5oqV6LOH44GM5pyJ5YipJyk6J+KAlCcpICsgJzwvdGQ+PC90cj5cbiAgICAgICAgPC90Ym9keT48L3RhYmxlPjwvZGl2PlxuICAgIDwvZGl2PicpOwoKICAvLyDliKTmlq3jgqvjg7zjg4kKICBjb25zdCBpcnI9cHIuaXJyQW5ufHwwOwogIGNvbnN0IHZkPWlycj5TLmludlJldD8KICAgIFt7aWNvOifinIUnLHQ6J+e5sOS4iuOBkui/lOa4iOOCkuWEquWFiCcsYjooJ0lSUiAnICsgKGlyci50b0ZpeGVkKDIpKSArICclIOOBr+aDs+WumuaKleizh+WIqeWbnuOCiicgKyAoUy5pbnZSZXQpICsgJyUg44KS5LiK5Zue44Gj44Gm44GE44G+44GZ44CC57mw5LiK44GS6L+U5riI44GM5pyA44KC56K65a6f44Gq44Oq44K/44O844Oz44Gn44GZ44CCJyksY29sOid2YXIoLS1ncmVlbi1zKScsYmM6J3ZhcigtLWdyZWVuKSd9LAogICAgIHtpY286J/Cfk4wnLHQ6J+e5sOS4iuOBkuWujOS6huW+jOOBq+aKleizh+OBuCcsYjon57mw5LiK44GS44Gn6L+U5riI44KS57WC44GI44Gf5b6M44CB5ZCM44GY6YeR6aGN44KS5oqV6LOH44Gr5Zue44GZ44Go44GV44KJ44Gr6LOH55Sj44GM5aKX44GI44G+44GZ44CCJyxjb2w6J3ZhcigtLWFjYy1zKScsYmM6J3ZhcigtLWFjYyknfV06CiAgICBbe2ljbzon8J+TiCcsdDon5oqV6LOH44KS5YSq5YWI44GZ44KL6YG45oqe44KCJyxiOign5oOz5a6a5oqV6LOH5Yip5Zue44KKJyArIChTLmludlJldCkgKyAnJSA+IElSUiAnICsgKGlyci50b0ZpeGVkKDIpKSArICcl44CC6ZW35pyf5oqV6LOH44Gu44G744GG44GM44Oq44K/44O844Oz44GM5pyf5b6F44Gn44GN44G+44GZ44CCJyksY29sOid2YXIoLS1hY2MtcyknLGJjOid2YXIoLS1hY2MpJ30sCiAgICAge2ljbzon8J+SoScsdDon57mw5LiK44GS44Gv44CM56K65a6f44Gq44Oq44K/44O844Oz44CNJyxiOifmipXos4fjgavjga/jg6rjgrnjgq/jgYzjgYLjgorjgb7jgZnjgYzjgIHnubDkuIrjgZLov5TmuIjjga/norrlrp/jgavliKnmga/jgpLnr4DntITjgafjgY3jgb7jgZnjgILjg6rjgrnjgq/oqLHlrrnluqbjgafliKTmlq3jgpLjgIInLGNvbDondmFyKC0td2Fybi1zKScsYmM6J3ZhcigtLXdhcm4pJ31dOwogIGVsKCd2ZXJkaWN0LWdyaWQnKS5pbm5lckhUTUw9dmQubWFwKHY9PignPGRpdiBjbGFzcz0idmQtY2FyZCIgc3R5bGU9ImJhY2tncm91bmQ6JyArICh2LmNvbCkgKyAnO2JvcmRlci1jb2xvcjonICsgKHYuYmMpICsgJzU1Ij5cbiAgICA8ZGl2IGNsYXNzPSJ2ZC1pY28iPicgKyAodi5pY28pICsgJzwvZGl2PjxkaXYgY2xhc3M9InZkLXQiIHN0eWxlPSJjb2xvcjonICsgKHYuYmMpICsgJyI+JyArICh2LnQpICsgJzwvZGl2PlxuICAgIDxkaXYgY2xhc3M9InZkLWIiPicgKyAodi5iKSArICc8L2Rpdj48L2Rpdj4nKSkuam9pbignJyk7Cn0KCi8vIOKUgOKUgCBDaGFwdGVyNe+8iOips+e0sO+8ieabtOaWsCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gdXBkQ2g1KFIpIHsKICAvLyDov5TmuIjjgrnjgrHjgrjjg6Xjg7zjg6sKICBjb25zdCBzaG93VDI9Uy51c2VUMiYmUi50MlNjaGVkLmxlbmd0aD4wOwogIGNvbnN0IHNob3dUMT1TLnVzZVQxJiZSLnQxU2NoZWQubGVuZ3RoPjA7CiAgY29uc3QgbWF4TT1NYXRoLm1heChSLnQyU2NoZWQubGVuZ3RoLFIudDFTY2hlZC5sZW5ndGgpOwogIGxldCByb3dzPScnLCBwcmV2WXI9LTE7CiAgZm9yKGxldCBpPTA7aTxtYXhNO2krKyl7CiAgICBjb25zdCB0Mj1SLnQyU2NoZWRbaV0sIHQxPVIudDFTY2hlZFtpXTsKICAgIGNvbnN0IG09KHQyfHx0MSkubTsKICAgIGNvbnN0IHlyPU1hdGguY2VpbChtLzEyKTsKICAgIGlmKHlyIT09cHJldllyKXsgcm93cys9KCc8dHIgY2xhc3M9InlyLXJvdyI+PHRkIGNvbHNwYW49Ijk5IiBzdHlsZT0icGFkZGluZzozcHggOHB4O2ZvbnQtc2l6ZTo5cHg7Y29sb3I6dmFyKC0tdDMpIj4nICsgKHlyKSArICflubTnm67vvIgnICsgKFMuZ3JhZCt5cikgKyAn5q2z77yJPC90ZD48L3RyPicpOyBwcmV2WXI9eXI7IH0KICAgIC8vIOe5sOS4iuOBkuihjOOCueOCreODg+ODl++8iOWIpeihjOOBp+ihqOekuu+8iQogICAgY29uc3QgaXNQUD10Mj8uaXNQcmVwYXk7CiAgICByb3dzKz0oJzx0ciAnICsgKGlzUFA/J2NsYXNzPSJwcC1yb3ciJzonJykgKyAnPlxuICAgICAgPHRkPicgKyAoaXNQUD8n4oaR57mw5LiKJzptKSArICc8L3RkPlxuICAgICAgJyArIChzaG93VDI/Jzx0ZD4nICsgKGZtdE0odDI/LnBheXx8MCkpICsgJzwvdGQ+PHRkIHN0eWxlPSJjb2xvcjp2YXIoLS10MykiPicgKyAoZm10TSh0Mj8uaW50fHwwKSkgKyAnPC90ZD48dGQ+JyArICh0Mj9mbXRNKHQyLmJhbCk6JycpICsgJzwvdGQ+JzonJykgKyAnXG4gICAgICAnICsgKHNob3dUMT8nPHRkPicgKyAoZm10TSh0MT8ucGF5fHwwKSkgKyAnPC90ZD48dGQ+JyArICh0MT9mbXRNKHQxLmJhbCk6JycpICsgJzwvdGQ+JzonJykgKyAnXG4gICAgICA8dGQgc3R5bGU9ImZvbnQtd2VpZ2h0OjcwMCI+JyArIChmbXRNKCh0Mj8ucGF5fHwwKSsodDE/LnBheXx8MCkpKSArICc8L3RkPlxuICAgIDwvdHI+Jyk7CiAgICBpZihpPjI0MCkgeyByb3dzKz0oJzx0cj48dGQgY29sc3Bhbj0iOTkiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjZweDtjb2xvcjp2YXIoLS10Myk7Zm9udC1zaXplOjEwcHgiPuS7pemZjeecgeeVpe+8iCcgKyAobWF4TS0yNDEpICsgJ+ihjO+8iTwvdGQ+PC90cj4nKTsgYnJlYWs7IH0KICB9CiAgZWwoJ2R0YWItc2NoZWQtYm9keScpLmlubmVySFRNTD0oJ1xuICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206OHB4Ij5cbiAgICAgICcgKyAoY2hhcnRXcmFwKHN2Z1JlcGF5QmFsYW5jZShSLnQyU2NoZWQsUi50MVNjaGVkLFIucmF0ZVNlZyksJ+i/lOa4iOaui+mrmOOBruaOqOenuycpKSArICdcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPSJzY2hlZC13cmFwIiBzdHlsZT0ibWF4LWhlaWdodDo0MDBweDtvdmVyZmxvdy15OmF1dG8iPlxuICAgIDx0YWJsZSBjbGFzcz0ic2NoZWQtdGJsIj48dGhlYWQ+PHRyPlxuICAgICAgPHRoPuaciDwvdGg+XG4gICAgICAnICsgKHNob3dUMj8nPHRoPuesrOS6jOeorui/lOa4iOmhjTwvdGg+PHRoPuOBhuOBoeWIqeaBrzwvdGg+PHRoPuesrOS6jOeoruaui+mrmDwvdGg+JzonJykgKyAnXG4gICAgICAnICsgKHNob3dUMT8nPHRoPuesrOS4gOeorui/lOa4iOmhjTwvdGg+PHRoPuesrOS4gOeoruaui+mrmDwvdGg+JzonJykgKyAnXG4gICAgICA8dGg+5pyI44CF6L+U5riI6aGNPC90aD5cbiAgICA8L3RyPjwvdGhlYWQ+PHRib2R5PicgKyAocm93cykgKyAnPC90Ym9keT48L3RhYmxlPjwvZGl2PicpOwoKICAvLyDjgrfjg4rjg6rjgqrmr5TovIMKICBjb25zdCBzY2VuUmF0ZXM9WzAuNSwxLjAsMS41LDIuMCwzLjBdOwogIGxldCBzY2VuUm93cz1zY2VuUmF0ZXMubWFwKHI9PnsKICAgIGNvbnN0IHNlZz1be3NtOjAscmF0ZTpyfSx7c206NjAscmF0ZTpyfSx7c206MTIwLHJhdGU6cn0se3NtOjE4MCxyYXRlOnJ9XTsKICAgIGNvbnN0IHJlcGF5TSA9IFIudDJSZXBheU1vbnRocyB8fCBjYWxjUmVwYXlNb250aHMoUi50MlBwYWwpOwogICAgY29uc3QgZGVmZXJJID0gY2FsY0RlZmVySW50ZXJlc3QoUi50MlBwYWwsIHIpOwogICAgY29uc3Qgc2M9YnVpbGRUMihSLnQyUHBhbCwgcmVwYXlNLCBzZWcsIGRlZmVySSk7CiAgICBjb25zdCB0b3RhbEludD1zYy5yZWR1Y2UoKGEseCk9PmEreC5pbnQsMCk7CiAgICBjb25zdCB0b3RhbFBheT1SLnQyUHBhbCt0b3RhbEludDsKICAgIGNvbnN0IG1vbnRocz1zYy5sZW5ndGg7CiAgICByZXR1cm4gKCc8dHIgJyArIChyPT09MS41PydzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1hY2Mtcyk7Zm9udC13ZWlnaHQ6NzAwIic6JycpICsgJz48dGQ+JyArIChyKSArICclPC90ZD48dGQ+JyArIChmbXRNKHRvdGFsUGF5KSkgKyAnPC90ZD48dGQ+JyArIChmbXRNKHRvdGFsSW50KSkgKyAnPC90ZD48dGQ+JyArIChtb250aHMpICsgJ+ODtuaciO+8iCcgKyAoTWF0aC5jZWlsKG1vbnRocy8xMikpICsgJ+W5tO+8iTwvdGQ+PC90cj4nKTsKICB9KS5qb2luKCcnKTsKICBlbCgnZHRhYi1zY2VuLWJvZHknKS5pbm5lckhUTUw9KCdcbiAgICA8cCBzdHlsZT0iZm9udC1zaXplOjExcHg7Y29sb3I6dmFyKC0tdDMpO21hcmdpbi1ib3R0b206MTBweCI+56ys5LqM56iu5aWo5a2m6YeR44Gu6YeR5Yip44GM5aSJ44KP44Gj44Gf5aC05ZCI44Gu57eP6L+U5riI6aGN44Gu5q+U6LyD44Gn44GZ44CC54++5Zyo44Gu6Kit5a6a77yIJyArIChTLnQyUmF0ZXNbMF0pICsgJyXjgJzvvInjga/lvLfoqr/ooajnpLrjgII8L3A+XG4gICAgPGRpdiBjbGFzcz0ic2NoZWQtd3JhcCI+XG4gICAgPHRhYmxlIGNsYXNzPSJjbXAtdGJsIj48dGhlYWQ+PHRyPjx0aD7pgannlKjph5HliKk8L3RoPjx0aD7nt4/ov5TmuIjpoY08L3RoPjx0aD7nt4/liKnmga88L3RoPjx0aD7ov5TmuIjmnJ/plpM8L3RoPjwvdHI+PC90aGVhZD5cbiAgICA8dGJvZHk+JyArIChzY2VuUm93cykgKyAnPC90Ym9keT48L3RhYmxlPjwvZGl2PicpOwp9CgovLyDilIDilIAg5Zu65a6adnPlpInli5Ug5q+U6LyD44OB44Oj44O844OIIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiB1cGRDaDVGaXhWYXIoUikgewogIGNvbnN0IHdyYXA9ZWwoJ2R0YWItZml4dmFyLWJvZHknKTsKICBpZighd3JhcHx8IVIudDJQcGFsKSByZXR1cm47CiAgY29uc3QgcmVwYXlNPVIudDJSZXBheU1vbnRoczsKICAvLyDlpInli5Xph5HliKnjgrfjg4rjg6rjgqrvvIjnj77lnKjjga7oqK3lrprvvIkKICBjb25zdCB2YXJTZWc9Ui5yYXRlU2VnOwogIGNvbnN0IHZhclNjaGVkPVIudDJTY2hlZDsKICAvLyDlm7rlrprph5HliKnlhaXlipvmrITjgpLlhYjjgavmj4/nlLvvvIjlhaXlipvlgKTjgpIgUy50MkZpeGVkUmF0ZSDjgafnrqHnkIbvvIkKICBjb25zdCBmaXhSYXRlPVMudDJGaXhlZFJhdGU7CiAgY29uc3QgZml4U2VnPVt7c206MCxyYXRlOmZpeFJhdGV9LHtzbTo2MCxyYXRlOmZpeFJhdGV9LHtzbToxMjAscmF0ZTpmaXhSYXRlfSx7c206MTgwLHJhdGU6Zml4UmF0ZX1dOwogIGNvbnN0IGZpeERlZmVyST1jYWxjRGVmZXJJbnRlcmVzdChSLnQyUHBhbCxmaXhSYXRlKTsKICBjb25zdCBmaXhTY2hlZD1idWlsZFQyKFIudDJQcGFsLHJlcGF5TSxmaXhTZWcsZml4RGVmZXJJKTsKICBjb25zdCB2YXJUb3RhbEludD12YXJTY2hlZC5yZWR1Y2UoKGEscik9PmErci5pbnQsMCk7CiAgY29uc3QgZml4VG90YWxJbnQ9Zml4U2NoZWQucmVkdWNlKChhLHIpPT5hK3IuaW50LDApOwogIGNvbnN0IGRpZmY9dmFyVG90YWxJbnQtZml4VG90YWxJbnQ7CiAgY29uc3Qgc3ZnPXN2Z0ZpeFZhckNvbXBhcmUodmFyU2NoZWQsZml4U2NoZWQsdmFyU2VnLGZpeFJhdGUsUi50MlBwYWwpOwogIHdyYXAuaW5uZXJIVE1MPSgnXG4gICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTJweDttYXJnaW4tdG9wOjEycHg7bWFyZ2luLWJvdHRvbToxMnB4O2ZsZXgtd3JhcDp3cmFwIj5cbiAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtjb2xvcjp2YXIoLS10Myk7Zm9udC13ZWlnaHQ6NzAwIj7mr5TovIPjgZnjgovlm7rlrprph5HliKk8L3NwYW4+XG4gICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo2cHgiPlxuICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIG1heD0iMTAiIHN0ZXA9IjAuMDEiIHZhbHVlPSInICsgKGZpeFJhdGUpICsgJyJcbiAgICAgICAgICBzdHlsZT0id2lkdGg6NzJweDtwYWRkaW5nOjRweCA4cHg7Ym9yZGVyOjEuNXB4IHNvbGlkIHZhcigtLWFjYyk7Ym9yZGVyLXJhZGl1czo2cHg7YmFja2dyb3VuZDp2YXIoLS1iZyk7Y29sb3I6dmFyKC0tdDEpO2ZvbnQtc2l6ZToxM3B4O3RleHQtYWxpZ246cmlnaHQ7b3V0bGluZTpub25lO2ZvbnQtd2VpZ2h0OjcwMCJcbiAgICAgICAgICBvbmNoYW5nZT0iUy50MkZpeGVkUmF0ZT1wYXJzZUZsb2F0KHRoaXMudmFsdWUpfHwwO3VwZENoNUZpeFZhcih3aW5kb3cuX2xhc3RSKSI+XG4gICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10MikiPiUgLyDlubQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBweDtjb2xvcjp2YXIoLS10NCkiPu+8iOWkieWLlemHkeWIqeOBruioreWumuOBqOOBr+eLrOeri+OBl+OBpuavlOi8g+OBp+OBjeOBvuOBme+8iTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjE2cHg7ZmxleC13cmFwOndyYXA7bWFyZ2luLWJvdHRvbToxMnB4Ij5cbiAgICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmcyKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJkKTtib3JkZXItcmFkaXVzOnZhcigtLXJhZC1zKTtwYWRkaW5nOjEwcHggMTRweDtmbGV4OjE7bWluLXdpZHRoOjEyMHB4Ij5cbiAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOjEwcHg7Y29sb3I6dmFyKC0tdDMpIj7lpInli5Xph5HliKkg57eP5Yip5oGvPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OjkwMDtmb250LWZhbWlseTptb25vc3BhY2U7Y29sb3I6JyArIChkaWZmPjA/J3ZhcigtLXJlZCknOid2YXIoLS1ncmVlbiknKSArICciPicgKyAoZm10TSh2YXJUb3RhbEludCkpICsgJzwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnMik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1iZCk7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWQtcyk7cGFkZGluZzoxMHB4IDE0cHg7ZmxleDoxO21pbi13aWR0aDoxMjBweCI+XG4gICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2NvbG9yOnZhcigtLXQzKSI+5Zu65a6aJyArIChmaXhSYXRlKSArICclIOe3j+WIqeaBrzwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTZweDtmb250LXdlaWdodDo5MDA7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2NvbG9yOnZhcigtLXQxKSI+JyArIChmbXRNKGZpeFRvdGFsSW50KSkgKyAnPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmcyKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJkKTtib3JkZXItcmFkaXVzOnZhcigtLXJhZC1zKTtwYWRkaW5nOjEwcHggMTRweDtmbGV4OjE7bWluLXdpZHRoOjEyMHB4Ij5cbiAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOjEwcHg7Y29sb3I6dmFyKC0tdDMpIj7lt67poY3vvIjlpInli5XiiJLlm7rlrprvvIk8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOjE2cHg7Zm9udC13ZWlnaHQ6OTAwO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtjb2xvcjonICsgKGRpZmY+MD8ndmFyKC0tcmVkKSc6J3ZhcigtLWdyZWVuKScpICsgJyI+JyArIChkaWZmPj0wPycrJzonJykgKyAoZm10TShkaWZmKSkgKyAnPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAnICsgKGNoYXJ0V3JhcChzdmcsJ+WbuuWumumHkeWIqSB2cyDlpInli5Xph5HliKkg5q6L6auY5q+U6LyDJykpKTsKfQoKZnVuY3Rpb24gc3ZnRml4VmFyQ29tcGFyZSh2YXJTY2hlZCwgZml4U2NoZWQsIHJhdGVTZWcsIGZpeFJhdGUsIHBwYWwpIHsKICBjb25zdCBXPTY2MCwgSD0xNzU7CiAgY29uc3QgUEFEPXtsOjUyLHI6MTYsdDozNixiOjI4fTsKICBjb25zdCBnVz1XLVBBRC5sLVBBRC5yLCBnSD1ILVBBRC50LVBBRC5iOwogIGNvbnN0IG1heE09TWF0aC5tYXgodmFyU2NoZWQubGVuZ3RoLGZpeFNjaGVkLmxlbmd0aCk7CiAgaWYoIW1heE0pIHJldHVybiAnJzsKICBjb25zdCBtYXhWPU1hdGgubWF4KC4uLlsuLi52YXJTY2hlZCwuLi5maXhTY2hlZF0ubWFwKHI9PnIuYmFsKSxwcGFsLDEpOwogIGNvbnN0IHNjWD1tPT5QQUQubCsobS0xKS9tYXhNKmdXOwogIGNvbnN0IHNjWT12PT5QQUQudCtnSC12L21heFYqZ0g7CiAgbGV0IHA9W107CiAgLy8g44Kw44Oq44OD44OJCiAgWzAsMC41LDFdLmZvckVhY2gocj0+ewogICAgY29uc3QgeT1QQUQudCtnSC1yKmdIOwogICAgcC5wdXNoKCgnPGxpbmUgeDE9IicgKyAoUEFELmwpICsgJyIgeDI9IicgKyAoVy1QQUQucikgKyAnIiB5MT0iJyArICh5LnRvRml4ZWQoMSkpICsgJyIgeTI9IicgKyAoeS50b0ZpeGVkKDEpKSArICciIHN0cm9rZT0iJyArIChyPT09MD8ndmFyKC0tYmQyLCAjZDFkNWRiKSc6J3ZhcigtLWJkLCAjZTVlN2ViKScpICsgJyIgc3Ryb2tlLXdpZHRoPSInICsgKHI9PT0wPzE6MC41KSArICciIHN0cm9rZS1kYXNoYXJyYXk9IicgKyAocj09PTA/J25vbmUnOic0LDQnKSArICciLz4nKSk7CiAgICBwLnB1c2goKCc8dGV4dCB4PSInICsgKFBBRC5sLTQpICsgJyIgeT0iJyArICgoeSszKS50b0ZpeGVkKDEpKSArICciIGZvbnQtc2l6ZT0iNyIgZmlsbD0idmFyKC0tdDQsICM5Y2EzYWYpIiB0ZXh0LWFuY2hvcj0iZW5kIj4nICsgKGZtdE0obWF4VipyKSkgKyAnPC90ZXh0PicpKTsKICB9KTsKICAvLyDlpInli5Xph5HliKnjga7mnJ/plpPljLrliIfjgornuKbnt5oKICByYXRlU2VnLnNsaWNlKDEpLmZvckVhY2goc2VnPT57CiAgICBjb25zdCB4PVBBRC5sK3NlZy5zbS9tYXhNKmdXOwogICAgcC5wdXNoKCgnPGxpbmUgeDE9IicgKyAoeC50b0ZpeGVkKDEpKSArICciIHgyPSInICsgKHgudG9GaXhlZCgxKSkgKyAnIiB5MT0iJyArIChQQUQudCkgKyAnIiB5Mj0iJyArICgoUEFELnQrZ0gpLnRvRml4ZWQoMSkpICsgJyIgc3Ryb2tlPSJ2YXIoLS10NCwgIzljYTNhZikiIHN0cm9rZS13aWR0aD0iMC44IiBzdHJva2UtZGFzaGFycmF5PSIzLDMiIG9wYWNpdHk9Ii41Ii8+JykpOwogICAgcC5wdXNoKCgnPHRleHQgeD0iJyArICh4LnRvRml4ZWQoMSkpICsgJyIgeT0iJyArIChQQUQudCs4KSArICciIGZvbnQtc2l6ZT0iNyIgZmlsbD0idmFyKC0tdDQsICM5Y2EzYWYpIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4nICsgKHNlZy5yYXRlKSArICclPC90ZXh0PicpKTsKICB9KTsKICAvLyDlm7rlrprph5HliKnjg6njgqTjg7PvvIjpnZLlrp/nt5rvvIkKICBpZihmaXhTY2hlZC5sZW5ndGgpewogICAgY29uc3QgZD1maXhTY2hlZC5tYXAoKHIsaSk9PigoaT09PTA/J00nOidMJykgKyAoc2NYKHIubSkudG9GaXhlZCgxKSkgKyAnLCcgKyAoc2NZKHIuYmFsKS50b0ZpeGVkKDEpKSkpLmpvaW4oJyAnKTsKICAgIHAucHVzaCgoJzxwYXRoIGQ9IicgKyAoZCkgKyAnIiBmaWxsPSJub25lIiBzdHJva2U9InZhcigtLWFjYywgIzI1NjNlYikiIHN0cm9rZS13aWR0aD0iMiIgb3BhY2l0eT0iLjg1Ii8+JykpOwogICAgcC5wdXNoKCgnPHRleHQgeD0iJyArICgoVy1QQUQuci0yKSkgKyAnIiB5PSInICsgKFBBRC50KzgpICsgJyIgZm9udC1zaXplPSI3LjUiIGZpbGw9InZhcigtLWFjYywgIzI1NjNlYikiIHRleHQtYW5jaG9yPSJlbmQiPuWbuuWumicgKyAoZml4UmF0ZSkgKyAnJTwvdGV4dD4nKSk7CiAgfQogIC8vIOWkieWLlemHkeWIqeODqeOCpOODs++8iOi1pOWun+e3mu+8iQogIGlmKHZhclNjaGVkLmxlbmd0aCl7CiAgICBjb25zdCBkPXZhclNjaGVkLmZpbHRlcihyPT4hci5pc1ByZXBheSkubWFwKChyLGkpPT4oKGk9PT0wPydNJzonTCcpICsgKHNjWChyLm0pLnRvRml4ZWQoMSkpICsgJywnICsgKHNjWShyLmJhbCkudG9GaXhlZCgxKSkpKS5qb2luKCcgJyk7CiAgICBwLnB1c2goKCc8cGF0aCBkPSInICsgKGQpICsgJyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJ2YXIoLS1yZWQsICNkYzI2MjYpIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1kYXNoYXJyYXk9IjYsMyIgb3BhY2l0eT0iLjg1Ii8+JykpOwogICAgcC5wdXNoKCgnPHRleHQgeD0iJyArICgoVy1QQUQuci0yKSkgKyAnIiB5PSInICsgKFBBRC50KzE4KSArICciIGZvbnQtc2l6ZT0iNy41IiBmaWxsPSJ2YXIoLS1yZWQsICNkYzI2MjYpIiB0ZXh0LWFuY2hvcj0iZW5kIj7lpInli5XvvIjnj77lnKjoqK3lrprvvIk8L3RleHQ+JykpOwogIH0KICAvLyDlubTjg6njg5njg6sKICBjb25zdCB5cnM9TWF0aC5jZWlsKG1heE0vMTIpOwogIGZvcihsZXQgeT0wO3k8PXlyczt5Kz1NYXRoLmNlaWwoeXJzLzgpKXsKICAgIGNvbnN0IHg9UEFELmwreSoxMi9tYXhNKmdXOwogICAgcC5wdXNoKCgnPHRleHQgeD0iJyArICh4LnRvRml4ZWQoMSkpICsgJyIgeT0iJyArICgoSC1QQUQuYisxMSkudG9GaXhlZCgxKSkgKyAnIiBmb250LXNpemU9IjciIGZpbGw9InZhcigtLXQ0LCAjOWNhM2FmKSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+JyArIChTLmdyYWQreSkgKyAn5q2zPC90ZXh0PicpKTsKICB9CiAgcmV0dXJuICgnPHN2ZyB2aWV3Qm94PSIwIDAgJyArIChXKSArICcgJyArIChIKSArICciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJSI+JyArIChwLmpvaW4oJycpKSArICc8L3N2Zz4nKTsKfQoKLy8g4pSA4pSAIOW3puODkeODjeODq+ihqOekuuabtOaWsCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gdXBkTGVmdChSKSB7CiAgLy8g5omL5Y+W44KK5pyI5Y+O5o+b566X6KGo56S6CiAgaWYoUy51c2VHcm9zcyl7CiAgICBjb25zdCBkZXJpdmVkPU1hdGgucm91bmQoY2FsY1Rha2VIb21lKFMuZ3Jvc3NZKS8xMik7CiAgICBlbCgnZGVyaXZlZC1kaXNwJykudGV4dENvbnRlbnQ9KCfihpIg5omL5Y+W44KK5pyI5Y+OIOe0hCAnICsgKGZtdE0oZGVyaXZlZCkpICsgJ++8iOeojuODu+ekvuS/neaOp+mZpOW+jO+8iScpOwogIH0KICAvLyBUMi9UMeWQiOioiO+8iOebtOaOpeWFpeWKm+aZguOBr+e3j+mhjeOCkuiJsuS7mOOBjeOBp+ihqOekuu+8iQogIGlmKFMudXNlVDIpewogICAgY29uc3QgcHBhbCA9IFMudDJEaXJlY3RQID8/IFMudDJNb250aGx5ICogUy50MlN0dWR5TTsKICAgIGVsKCd0Mi10b3RhbCcpLmlubmVySFRNTCA9IFMudDJEaXJlY3RQIT1udWxsCiAgICAgID8gKCflgJ/lhaXnt4/poY0gPGIgc3R5bGU9ImNvbG9yOnZhcigtLWFjYykiPicgKyAoZm10TShwcGFsKSkgKyAnPC9iPiA8c3BhbiBzdHlsZT0iY29sb3I6dmFyKC0tdDQpO2ZvbnQtc2l6ZToxMHB4Ij7vvIjnm7TmjqXlhaXlipvvvIk8L3NwYW4+JykKICAgICAgOiAoJ+WAn+WFpee3j+mhjSAnICsgKGZtdE0ocHBhbCkpICsgJ++8iCcgKyAoUy50Mk1vbnRobHkudG9Mb2NhbGVTdHJpbmcoKSkgKyAn5YaGw5cnICsgKFMudDJTdHVkeU0pICsgJ+ODtuaciO+8iScpOwogIH0KICBpZihTLnVzZVQxKXsKICAgIGNvbnN0IHBwYWwgPSBTLnQxRGlyZWN0UCA/PyBTLnQxTW9udGhseSAqIFMudDFTdHVkeU07CiAgICBlbCgndDEtdG90YWwnKS5pbm5lckhUTUwgPSBTLnQxRGlyZWN0UCE9bnVsbAogICAgICA/ICgn5YCf5YWl57eP6aGNIDxiIHN0eWxlPSJjb2xvcjp2YXIoLS1hY2MpIj4nICsgKGZtdE0ocHBhbCkpICsgJzwvYj4gPHNwYW4gc3R5bGU9ImNvbG9yOnZhcigtLXQ0KTtmb250LXNpemU6MTBweCI+77yI55u05o6l5YWl5Yqb77yJPC9zcGFuPicpCiAgICAgIDogKCflgJ/lhaXnt4/poY0gJyArIChmbXRNKHBwYWwpKSArICfvvIgnICsgKFMudDFNb250aGx5LnRvTG9jYWxlU3RyaW5nKCkpICsgJ+WGhsOXJyArIChTLnQxU3R1ZHlNKSArICfjg7bmnIjvvIknKTsKICB9CiAgLy8g44Oc44O844OK44K544OS44Oz44OICiAgaWYoIVMudXNlR3Jvc3MpIGVsKCdib24taGludCcpLnRleHRDb250ZW50PSgn4omIICcgKyAoZm10TShTLmJvbnVzWSkpICsgJyAnICsgKFMuYm9udXNNIT1udWxsPyfvvIjmnIjlj47DlycrUy5ib251c00rJ+ODtuaciO+8iSc6J++8iOaJi+WLleWFpeWKm++8iScpKTsKfQoKLy8g4pSA4pSAIOODoeOCpOODs+ODrOODs+ODgOODvCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gcmVuZGVyKCkgewogIC8vIOODgeODo+ODvOODiElE44K544OI44Ki44KS44Oq44K744OD44OI77yI5q+O5Zue5YaN5qeL56+J77yJCiAgX2NoYXJ0U3RvcmUgPSB7fTsKICBfY2hhcnRJZCA9IDA7CiAgY29uc3QgUj1jYWxjQWxsKCk7CiAgd2luZG93Ll9sYXN0Uj1SOyAvLyDlm7rlrpp2c+WkieWLleOCv+ODluOBrueLrOeri+abtOaWsOeUqAogIHVwZExlZnQoUik7CiAgdXBkQ2gyKFIpOwogIHVwZENoMyhSKTsKICB1cGRDaDQoUik7CiAgLy8gQ2hhcHRlcjXjga/lsZXplovmmYLjga7jgb/mm7TmlrAKICBpZihlbCgnZHRsLWInKS5jbGFzc0xpc3QuY29udGFpbnMoJ29wZW4nKSkgdXBkQ2g1KFIpOwogIHVwZGF0ZVVSTCgpOwp9Ci8vIOKUgOKUgCDjgrnjg6njgqTjg4Djg7zlkIzmnJ8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNvbnN0IFNMSURFUlMgPSB7CiAgaW5jOiAge3NsOidzbC1pbmMnLCAgbmk6J25pLWluYycsICBtaW46ODAwMDAsICBtYXg6NzAwMDAwLCAgc3RlcDo1MDAwLAogICAgICAgICBzZXQ6dj0+e1MuaW5jb21lPXY7Uy5ib251c1k9TWF0aC5yb3VuZCh2KihTLmJvbnVzTT8/MykpO3VwZEJvbnVzQ2hpcHMoKTt9IH0sCiAgZ3JzOiAge3NsOidzbC1ncnMnLCAgbmk6J25pLWdycycsICBtaW46MTAwMDAwMCxtYXg6MTUwMDAwMDAsc3RlcDoxMDAwMDAsICBzZXQ6dj0+Uy5ncm9zc1k9dn0sCiAgY29zdDoge3NsOidzbC1jb3N0Jywgbmk6J25pLWNvc3QnLCBtaW46NTAwMDAsICBtYXg6NDAwMDAwLCAgc3RlcDo1MDAwLCAgICBzZXQ6dj0+Uy5jb3N0PXZ9LAogIGdyYWQ6IHtzbDonc2wtZ3JhZCcsIG5pOiduaS1ncmFkJywgbWluOjE4LCAgICAgbWF4OjMwLCAgICAgIHN0ZXA6MSwgICAgICAgc2V0OnY9PlMuZ3JhZD12fSwKICBpbnY6ICB7c2w6J3NsLWludicsICBuaTonbmktaW52JywgIG1pbjowLCAgICAgIG1heDoxNSwgICAgICBzdGVwOjAuNSwgICAgIHNldDp2PT5TLmludlJldD12fSwKfTsKZnVuY3Rpb24gc3Yoa2V5LCB2YWwpIHsKICBjb25zdCBkZWY9U0xJREVSU1trZXldOwogIGNvbnN0IHY9cGFyc2VGbG9hdCh2YWwpOwogIGlmKGlzTmFOKHYpKSByZXR1cm47CiAgY29uc3QgY2xhbXBlZD1NYXRoLm1pbihkZWYubWF4LE1hdGgubWF4KGRlZi5taW4sdikpOwogIGRlZi5zZXQoY2xhbXBlZCk7CiAgZWwoZGVmLnNsKS52YWx1ZT1jbGFtcGVkOwogIGVsKGRlZi5uaSkudmFsdWU9Y2xhbXBlZDsKICByZW5kZXIoKTsKfQoKLy8g4pSA4pSAIOWAn+WFpee3j+mhjSDnm7TmjqXlhaXlipsg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIHNldFQyRGlyZWN0KG1hbikgewogIFMudDJEaXJlY3RQID0gKG1hbj4wKSA/IG1hbioxMDAwMCA6IG51bGw7CiAgY29uc3QgcnN0PWVsKCd0Mi1kaXJlY3QtcmVzZXQnKTsgaWYocnN0KSByc3Quc3R5bGUuZGlzcGxheT1TLnQyRGlyZWN0UCE9bnVsbD8nJzonbm9uZSc7CiAgY29uc3QgaW5wPWVsKCduaS10Mi1kaXJlY3QnKTsKICBpZihpbnApIGlucC5zdHlsZS5ib3JkZXJDb2xvcj1TLnQyRGlyZWN0UCE9bnVsbD8ndmFyKC0tYWNjKSc6J3ZhcigtLWJkMiknOwogIHJlbmRlcigpOwp9CmZ1bmN0aW9uIGNsZWFyVDJEaXJlY3QoKSB7CiAgUy50MkRpcmVjdFA9bnVsbDsKICBjb25zdCBpbnA9ZWwoJ25pLXQyLWRpcmVjdCcpOyBpZihpbnApe2lucC52YWx1ZT0nJztpbnAuc3R5bGUuYm9yZGVyQ29sb3I9J3ZhcigtLWJkMiknO30KICBjb25zdCByc3Q9ZWwoJ3QyLWRpcmVjdC1yZXNldCcpOyBpZihyc3QpIHJzdC5zdHlsZS5kaXNwbGF5PSdub25lJzsKICByZW5kZXIoKTsKfQpmdW5jdGlvbiBzZXRUMURpcmVjdChtYW4pIHsKICBTLnQxRGlyZWN0UCA9IChtYW4+MCkgPyBtYW4qMTAwMDAgOiBudWxsOwogIGNvbnN0IHJzdD1lbCgndDEtZGlyZWN0LXJlc2V0Jyk7IGlmKHJzdCkgcnN0LnN0eWxlLmRpc3BsYXk9Uy50MURpcmVjdFAhPW51bGw/Jyc6J25vbmUnOwogIGNvbnN0IGlucD1lbCgnbmktdDEtZGlyZWN0Jyk7CiAgaWYoaW5wKSBpbnAuc3R5bGUuYm9yZGVyQ29sb3I9Uy50MURpcmVjdFAhPW51bGw/J3ZhcigtLWFjYyknOid2YXIoLS1iZDIpJzsKICByZW5kZXIoKTsKfQpmdW5jdGlvbiBjbGVhclQxRGlyZWN0KCkgewogIFMudDFEaXJlY3RQPW51bGw7CiAgY29uc3QgaW5wPWVsKCduaS10MS1kaXJlY3QnKTsgaWYoaW5wKXtpbnAudmFsdWU9Jyc7aW5wLnN0eWxlLmJvcmRlckNvbG9yPSd2YXIoLS1iZDIpJzt9CiAgY29uc3QgcnN0PWVsKCd0MS1kaXJlY3QtcmVzZXQnKTsgaWYocnN0KSByc3Quc3R5bGUuZGlzcGxheT0nbm9uZSc7CiAgcmVuZGVyKCk7Cn0KCi8vIOKUgOKUgCDph5HliKnjg5fjg6rjgrvjg4Pjg4gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIHNldFJhdGVQcmVzZXQocikgewogIFMudDJSYXRlcz1bcixyLHIscl07CiAgYnVpbGRSYXRlSW5wdXRzKCk7CiAgLy8g44OB44OD44OX44Gu44Ki44Kv44OG44Kj44OW54q25oWL44KS5pu05pawCiAgZWwoJ3JhdGUtY2hpcHMnKT8ucXVlcnlTZWxlY3RvckFsbCgnLmNoJykuZm9yRWFjaChidG49PnsKICAgIGJ0bi5jbGFzc05hbWU9J2NoJysocGFyc2VGbG9hdChidG4udGV4dENvbnRlbnQpPT09cj8nIGFjdCc6JycpOwogIH0pOwogIHJlbmRlcigpOwp9CgovLyDilIDilIAg57mw5LiK44GS6L+U5riIIOi/veWKoO+8j+WJiumZpCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gYWRkUHJlcGF5KCkgewogIGNvbnN0IGRlZmF1bHRNb250aCA9IFMucHJlcGF5cy5sZW5ndGg+MAogICAgPyBNYXRoLm1pbihTLnByZXBheXNbUy5wcmVwYXlzLmxlbmd0aC0xXS5tb250aCsxMiwgMTIwKQogICAgOiAxMjsKICBTLnByZXBheXMucHVzaCh7cm91bmRzOjEyLCBtb250aDpkZWZhdWx0TW9udGh9KTsKICByZW5kZXIoKTsKfQpmdW5jdGlvbiByZW1vdmVQcmVwYXkoaSkgewogIFMucHJlcGF5cy5zcGxpY2UoaSwxKTsKICByZW5kZXIoKTsKfQpmdW5jdGlvbiByZW5kZXJQcmVwYXlVSShSKSB7CiAgY29uc3Qgd3JhcD1lbCgncHJlcGF5LWxpc3QnKTsKICBpZighd3JhcCkgcmV0dXJuOwogIGlmKFMucHJlcGF5cy5sZW5ndGg9PT0wKXsgd3JhcC5pbm5lckhUTUw9Jyc7IHJldHVybjsgfQogIGNvbnN0IG1heE09TWF0aC5tYXgoUi50MlJlcGF5TW9udGhzfHwyNDAsMSk7CiAgd3JhcC5pbm5lckhUTUw9Uy5wcmVwYXlzLm1hcCgocHAsaSk9PnsKICAgIC8vIOOBneOBruaciOOBrui/lOa4iOmhjeOCkuWPluW+l+OBl+OBpuODkuODs+ODiOihqOekugogICAgY29uc3QgaWR4PU1hdGgubWluKHBwLm1vbnRoLTEsIFIudDJTY2hlZC5sZW5ndGgtMSk7CiAgICBjb25zdCByb3c9Ui50MlNjaGVkW2lkeF07CiAgICBjb25zdCBwYXlIaW50PXJvdyA/ICgn5pyI6aGNICcgKyAoZm10TShyb3cucGF5KSkgKyAnIMOXICcgKyAocHAucm91bmRzKSArICflm54g77ydIOe0hCcgKyAoZm10TShyb3cucGF5KnBwLnJvdW5kcykpKSA6ICcnOwogICAgcmV0dXJuICgnPGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1iZCk7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWQtcyk7cGFkZGluZzoxMnB4O21hcmdpbi1ib3R0b206OHB4O2JhY2tncm91bmQ6dmFyKC0tY2FyZCkiPlxuICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjttYXJnaW4tYm90dG9tOjhweCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0tYWNjKSI+57mw5LiK44GSICcgKyAoaSsxKSArICflm57nm648L3NwYW4+XG4gICAgICAgIDxidXR0b24gb25jbGljaz0icmVtb3ZlUHJlcGF5KCcgKyAoaSkgKyAnKSIgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O3BhZGRpbmc6MnB4IDhweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJkMik7Ym9yZGVyLXJhZGl1czoxMHB4O2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6dmFyKC0tdDMpO2N1cnNvcjpwb2ludGVyIj7inJUg5YmK6ZmkPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9ImlnIiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo2cHgiPlxuICAgICAgICA8ZGl2IGNsYXNzPSJpbCIgc3R5bGU9ImZvbnQtc2l6ZToxMHB4Ij7nubDkuIrjgZLlm57mlbDvvIjmnIjpoY3jga7kvZXlm57liIbvvIk8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0ic3Itcm93Ij5cbiAgICAgICAgICA8aW5wdXQgdHlwZT0icmFuZ2UiIG1pbj0iMSIgbWF4PSIxMjAiIHN0ZXA9IjEiIHZhbHVlPSInICsgKHBwLnJvdW5kcykgKyAnIlxuICAgICAgICAgICAgb25pbnB1dD0iUy5wcmVwYXlzWycgKyAoaSkgKyAnXS5yb3VuZHM9K3RoaXMudmFsdWU7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCduaS1wcHItJyArIChpKSArICdcJykudmFsdWU9dGhpcy52YWx1ZSJcbiAgICAgICAgICAgIG9uY2hhbmdlPSJyZW5kZXIoKSI+XG4gICAgICAgICAgPGlucHV0IGlkPSJuaS1wcHItJyArIChpKSArICciIHR5cGU9Im51bWJlciIgbWluPSIxIiBtYXg9IjEyMCIgc3RlcD0iMSIgdmFsdWU9IicgKyAocHAucm91bmRzKSArICciXG4gICAgICAgICAgICBvbmNoYW5nZT0iUy5wcmVwYXlzWycgKyAoaSkgKyAnXS5yb3VuZHM9TWF0aC5tYXgoMSwrdGhpcy52YWx1ZSk7cmVuZGVyKCkiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdSI+5Zue5YiGPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz0iaWciIHN0eWxlPSJtYXJnaW4tYm90dG9tOjRweCI+XG4gICAgICAgIDxkaXYgY2xhc3M9ImlsIiBzdHlsZT0iZm9udC1zaXplOjEwcHgiPuWun+aWveOCv+OCpOODn+ODs+OCsO+8iOi/lOa4iOmWi+Wni+OBi+OCie+8iTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPSJzci1yb3ciPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYW5nZSIgbWluPSIxIiBtYXg9IicgKyAobWF4TSkgKyAnIiBzdGVwPSIxIiB2YWx1ZT0iJyArIChNYXRoLm1pbihwcC5tb250aCxtYXhNKSkgKyAnIlxuICAgICAgICAgICAgb25pbnB1dD0iUy5wcmVwYXlzWycgKyAoaSkgKyAnXS5tb250aD0rdGhpcy52YWx1ZTtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcJ25pLXBwbS0nICsgKGkpICsgJ1wnKS52YWx1ZT10aGlzLnZhbHVlIlxuICAgICAgICAgICAgb25jaGFuZ2U9InJlbmRlcigpIj5cbiAgICAgICAgICA8aW5wdXQgaWQ9Im5pLXBwbS0nICsgKGkpICsgJyIgdHlwZT0ibnVtYmVyIiBtaW49IjEiIG1heD0iJyArIChtYXhNKSArICciIHN0ZXA9IjEiIHZhbHVlPSInICsgKE1hdGgubWluKHBwLm1vbnRoLG1heE0pKSArICciXG4gICAgICAgICAgICBvbmNoYW5nZT0iUy5wcmVwYXlzWycgKyAoaSkgKyAnXS5tb250aD1NYXRoLm1heCgxLCt0aGlzLnZhbHVlKTtyZW5kZXIoKSI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9InN1Ij7jg7bmnIjlvow8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAnICsgKHBheUhpbnQ/JzxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2NvbG9yOnZhcigtLWFjYyk7bWFyZ2luLXRvcDoycHgiPvCfkqEgJyArIChwYXlIaW50KSArICc8L2Rpdj4nOicnKSArICdcbiAgICA8L2Rpdj4nKTsKICB9KS5qb2luKCcnKTsKfQoKLy8g4pSA4pSAIOODiOOCsOODq+ezuyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gc2V0VXNlR3Jvc3ModikgewogIFMudXNlR3Jvc3M9djsKICBlbCgnYnRuLWdyb3NzLW9uJykuY2xhc3NOYW1lID0ndGInKyh2Pycgb24nOicnKTsKICBlbCgnYnRuLWdyb3NzLW9mZicpLmNsYXNzTmFtZT0ndGInKyh2PycnOicgb24nKTsKICBlbCgnaW5wLW1vbnRobHknKS5zdHlsZS5kaXNwbGF5PXY/J25vbmUnOicnOwogIGVsKCdpbnAtZ3Jvc3MnKS5zdHlsZS5kaXNwbGF5PXY/Jyc6J25vbmUnOwogIGVsKCdib251cy1zZWMnKS5zdHlsZS5kaXNwbGF5PXY/J25vbmUnOicnOwogIHJlbmRlcigpOwp9CmZ1bmN0aW9uIHRvZ2dsZVQyKCkgewogIFMudXNlVDI9IVMudXNlVDI7CiAgZWwoJ2J0bi10MicpLmNsYXNzTmFtZT0ndGInKyhTLnVzZVQyPycgb24tZyc6JycpOwogIGVsKCdidG4tdDInKS50ZXh0Q29udGVudD1TLnVzZVQyPyfliKnnlKjjgYLjgoonOifliKnnlKjjgarjgZcnOwogIGVsKCd0Mi1jZmcnKS5zdHlsZS5kaXNwbGF5PVMudXNlVDI/Jyc6J25vbmUnOwogIHJlbmRlcigpOwp9CmZ1bmN0aW9uIHRvZ2dsZVQxKCkgewogIFMudXNlVDE9IVMudXNlVDE7CiAgZWwoJ2J0bi10MScpLmNsYXNzTmFtZT0ndGInKyhTLnVzZVQxPycgb24tZyc6JycpOwogIGVsKCdidG4tdDEnKS50ZXh0Q29udGVudD1TLnVzZVQxPyfliKnnlKjjgYLjgoonOifliKnnlKjjgarjgZcnOwogIGVsKCd0MS1jZmcnKS5zdHlsZS5kaXNwbGF5PVMudXNlVDE/Jyc6J25vbmUnOwogIHJlbmRlcigpOwp9CmZ1bmN0aW9uIHRvZ2dsZUFkdigpIHsKICBjb25zdCBoPWVsKCdhZHYtaCcpLCBiPWVsKCdhZHYtYicpOwogIGguY2xhc3NMaXN0LnRvZ2dsZSgnb3BlbicpOyBiLmNsYXNzTGlzdC50b2dnbGUoJ29wZW4nKTsKfQpmdW5jdGlvbiB0b2dnbGVJbnYoKSB7CiAgUy5zaG93SW52PSFTLnNob3dJbnY7CiAgZWwoJ2J0bi1pbnYnKS5jbGFzc05hbWU9J3RiJysoUy5zaG93SW52Pycgb24nOicnKTsKICBlbCgnYnRuLWludicpLnRleHRDb250ZW50PVMuc2hvd0ludj8nT04nOidPRkYnOwogIHJlbmRlcigpOwp9CmZ1bmN0aW9uIHRvZ2dsZUR0bCgpIHsKICBjb25zdCBoPWVsKCdkdGwtaCcpLCBiPWVsKCdkdGwtYicpOwogIGguY2xhc3NMaXN0LnRvZ2dsZSgnb3BlbicpOyBiLmNsYXNzTGlzdC50b2dnbGUoJ29wZW4nKTsKICBpZihiLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpKSB1cGRDaDUoY2FsY0FsbCgpKTsKfQpmdW5jdGlvbiBzZXREdGFiKHRhYikgewogIFsnc2NoZWQnLCdzY2VuJywnZml4dmFyJ10uZm9yRWFjaCh0PT57CiAgICBjb25zdCBidG49ZWwoKCdkdC0nICsgKHQpKSk7IGlmKGJ0bikgYnRuLmNsYXNzTmFtZT0ndGInKyh0PT09dGFiPycgb24nOicnKTsKICAgIGNvbnN0IGJvZHk9ZWwoKCdkdGFiLScgKyAodCkgKyAnLWJvZHknKSk7IGlmKGJvZHkpIGJvZHkuc3R5bGUuZGlzcGxheT10PT09dGFiPycnOidub25lJzsKICB9KTsKICBpZih0YWI9PT0nZml4dmFyJykgdXBkQ2g1Rml4VmFyKGNhbGNBbGwoKSk7Cn0KCi8vIOKUgOKUgCDjg5zjg7zjg4rjgrkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIHNldEJvbnVzTShtKSB7CiAgUy5ib251c009bTsKICBTLmJvbnVzWT1NYXRoLnJvdW5kKFMuaW5jb21lKm0pOwogIGVsKCduaS1ib24nKS52YWx1ZT1TLmJvbnVzWTsKICB1cGRCb251c0NoaXBzKCk7CiAgcmVuZGVyKCk7Cn0KZnVuY3Rpb24gdXBkQm9udXNDaGlwcygpIHsKICBjb25zdCBjaGlwcz1lbCgnYm9udXMtY2hpcHMnKTsKICBpZighY2hpcHMpIHJldHVybjsKICBjaGlwcy5xdWVyeVNlbGVjdG9yQWxsKCcuY2gnKS5mb3JFYWNoKChidG4saSk9PnsKICAgIGNvbnN0IG1zPVswLDIsMyw0LDVdW2ldOwogICAgYnRuLmNsYXNzTmFtZT0nY2gnKyhTLmJvbnVzTT09PW1zPycgYWN0JzonJyk7CiAgfSk7Cn0KCi8vIOKUgOKUgCDjg6njgqTjg5XjgqTjg5njg7Pjg4gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIHRvZ2dsZUV2KGtleSkgewogIFNba2V5XS5vbj0hU1trZXldLm9uOwogIHJlbmRlcigpOwp9CmZ1bmN0aW9uIHNldEV2QWdlKGtleSwgbmV3QWdlKSB7CiAgU1trZXldLmFnZT1NYXRoLm1heCgxOCxNYXRoLm1pbig2MCxuZXdBZ2UpKTsKICBpZihrZXk9PT0nZXZNYXJyaWFnZScpewogICAgUy5ldkNoaWxkLmFnZT1NYXRoLm1heChTLmV2Q2hpbGQuYWdlLFMuZXZNYXJyaWFnZS5hZ2UrMik7CiAgICBTLmV2SG91c2UuYWdlPU1hdGgubWF4KFMuZXZIb3VzZS5hZ2UsUy5ldk1hcnJpYWdlLmFnZSs1KTsKICB9CiAgcmVuZGVyKCk7Cn0KZnVuY3Rpb24gYWRqRXYoa2V5LCBmaWVsZCwgZGVsdGEpIHsKICBpZihmaWVsZD09PSdhZ2UnKXsKICAgIHNldEV2QWdlKGtleSwgU1trZXldLmFnZSArIGRlbHRhKTsKICB9IGVsc2UgewogICAgLy8g6LK755So44Gu5Yi744G/5bmF44KS54++5Zyo5YCk44Gr5b+c44GY44Gm5aSJ44GI44KLCiAgICBjb25zdCBjdXIgPSBTW2tleV0uY29zdDsKICAgIGxldCBzdGVwOwogICAgaWYoY3VyIDwgNTApICAgICAgIHN0ZXAgPSAxMDsKICAgIGVsc2UgaWYoY3VyIDwgMTUwKSBzdGVwID0gMjU7CiAgICBlbHNlIGlmKGN1ciA8IDMwMCkgc3RlcCA9IDUwOwogICAgZWxzZSAgICAgICAgICAgICAgIHN0ZXAgPSAxMDA7CiAgICBTW2tleV0uY29zdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDUwMDAsIGN1ciArIGRlbHRhICogc3RlcCkpOwogICAgcmVuZGVyKCk7CiAgfQp9CgovLyDilIDilIAg6YeR5Yip5YWl5Yqb44Gu55Sf5oiQIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBidWlsZFJhdGVJbnB1dHMoKSB7CiAgY29uc3QgZGl2PWVsKCdyYXRlLWlucHV0cycpOwogIGlmKCFkaXYpIHJldHVybjsKICBkaXYuaW5uZXJIVE1MPVBFUklPRF9MQkxTLm1hcCgobGJsLGkpPT4oJ1xuICAgIDxkaXYgY2xhc3M9ImlnIiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo4cHgiPlxuICAgICAgPGRpdiBjbGFzcz0iaWwiIHN0eWxlPSJmb250LXNpemU6MTBweCI+JyArIChsYmwpICsgJzwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz0ic3Itcm93Ij5cbiAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwIiBzdGVwPSIwLjAwMSIgdmFsdWU9IicgKyAoUy50MlJhdGVzW2ldKSArICciXG4gICAgICAgICAgc3R5bGU9IndpZHRoOjgwcHg7cGFkZGluZzo0cHggNnB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYmQyKTtib3JkZXItcmFkaXVzOjRweDtiYWNrZ3JvdW5kOnZhcigtLWJnKTtjb2xvcjp2YXIoLS10MSk7Zm9udC1zaXplOjEycHg7dGV4dC1hbGlnbjpyaWdodDtvdXRsaW5lOm5vbmUiXG4gICAgICAgICAgb25jaGFuZ2U9IlMudDJSYXRlc1snICsgKGkpICsgJ109cGFyc2VGbG9hdCh0aGlzLnZhbHVlKXx8MDtyZW5kZXIoKSI+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJzdSI+JSAvIOW5tDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PicpKS5qb2luKCcnKTsKfQoKLy8g4pSA4pSAIFVSTOWFseaciSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gdXBkYXRlVVJMKCkgewogIC8vIGhpc3RvcnkucmVwbGFjZVN0YXRlIOOBr+S9v+OCj+OBquOBhO+8iFNXRUxM44GuQUpBWOODiuODk+OCsuODvOOCt+ODp+ODs+OCkuiqpOS9nOWLleOBleOBm+OCi+OBn+OCge+8iQogIHRyeXsgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnc2Nob2xfdjMnLCBKU09OLnN0cmluZ2lmeShTKSk7IH1jYXRjaHt9Cn0KZnVuY3Rpb24gYnVpbGRTaGFyZVBhcmFtcygpIHsKICBjb25zdCBwPW5ldyBVUkxTZWFyY2hQYXJhbXMoewogICAgdWc6IFMudXNlR3Jvc3M/MTowLCBpbmM6Uy5pbmNvbWUsIGdyczpTLmdyb3NzWSwKICAgIGNvc3Q6Uy5jb3N0LCBncmFkOlMuZ3JhZCwKICAgIHQybTpTLnQyTW9udGhseSwgdDJzOlMudDJTdHVkeU0sIHV0MjpTLnVzZVQyPzE6MCwKICAgIHQxbTpTLnQxTW9udGhseSwgdDFzOlMudDFTdHVkeU0sIHV0MTpTLnVzZVQxPzE6MCwKICAgIGJvbjpTLmJvbnVzWSwgaW52cjpTLmludlJldCwgdDJmcjpTLnQyRml4ZWRSYXRlLAogICAgcHA6ZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KFMucHJlcGF5cykpLAogIH0pOwogIHJldHVybiBwLnRvU3RyaW5nKCk7Cn0KZnVuY3Rpb24gbG9hZEZyb21VUkwoKSB7CiAgY29uc3QgcD1uZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCk7CiAgY29uc3Qgc3M9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnc2Nob2xfdjMnKTsKICAvLyBVUkzjg5Hjg6njg6Hjg7zjgr/jgYznqbrjgafjgoLjgrvjg4Pjgrfjg6fjg7PjgYzjgYLjgozjgbDlvqnlhYMKICBpZighcC50b1N0cmluZygpICYmIHNzKXsgdHJ5e09iamVjdC5hc3NpZ24oUyxKU09OLnBhcnNlKHNzKSk7fWNhdGNoe30gfQogIGlmKHAuZ2V0KCd1ZycpIT1udWxsKSBTLnVzZUdyb3NzPXAuZ2V0KCd1ZycpPT09JzEnOwogIGlmKHAuZ2V0KCdpbmMnKSkgIFMuaW5jb21lICAgICA9K3AuZ2V0KCdpbmMnKTsKICBpZihwLmdldCgnZ3JzJykpICBTLmdyb3NzWSAgICAgPStwLmdldCgnZ3JzJyk7CiAgaWYocC5nZXQoJ2Nvc3QnKSkgUy5jb3N0ICAgICAgID0rcC5nZXQoJ2Nvc3QnKTsKICBpZihwLmdldCgnZ3JhZCcpKSBTLmdyYWQgICAgICAgPStwLmdldCgnZ3JhZCcpOwogIGlmKHAuZ2V0KCd0Mm0nKSkgIFMudDJNb250aGx5ICA9K3AuZ2V0KCd0Mm0nKTsKICBpZihwLmdldCgndDJzJykpICBTLnQyU3R1ZHlNICAgPStwLmdldCgndDJzJyk7CiAgaWYocC5nZXQoJ3V0MicpIT1udWxsKSBTLnVzZVQyID1wLmdldCgndXQyJyk9PT0nMSc7CiAgaWYocC5nZXQoJ3QxbScpKSAgUy50MU1vbnRobHkgID0rcC5nZXQoJ3QxbScpOwogIGlmKHAuZ2V0KCd0MXMnKSkgIFMudDFTdHVkeU0gICA9K3AuZ2V0KCd0MXMnKTsKICBpZihwLmdldCgndXQxJykhPW51bGwpIFMudXNlVDEgPXAuZ2V0KCd1dDEnKT09PScxJzsKICBpZihwLmdldCgnYm9uJykpICBTLmJvbnVzWSAgICAgPStwLmdldCgnYm9uJyk7CiAgaWYocC5nZXQoJ2ludnInKSkgUy5pbnZSZXQgICAgICA9K3AuZ2V0KCdpbnZyJyk7CiAgaWYocC5nZXQoJ3QyZnInKSkgUy50MkZpeGVkUmF0ZT0rcC5nZXQoJ3QyZnInKTsKICBpZihwLmdldCgncHAnKSkgICB0cnl7IFMucHJlcGF5cz1KU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudChwLmdldCgncHAnKSkpfHxbXTsgfWNhdGNoe30KfQphc3luYyBmdW5jdGlvbiBjb3B5U2hhcmVVUkwoKSB7CiAgY29uc3QgYnRuPWVsKCdzaGFyZS1idG4nKTsKICBjb25zdCBzaGFyZVVSTD1sb2NhdGlvbi5vcmlnaW4rbG9jYXRpb24ucGF0aG5hbWUrJz8nK2J1aWxkU2hhcmVQYXJhbXMoKTsKICB0cnl7CiAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzaGFyZVVSTCk7CiAgICBidG4udGV4dENvbnRlbnQ9J+KchSDjgrPjg5Tjg7zjgZfjgb7jgZfjgZ/vvIEnOwogIH1jYXRjaHsKICAgIHByb21wdCgnVVJM44KS44Kz44OU44O844GX44Gm44GP44Gg44GV44GE77yaJyxzaGFyZVVSTCk7CiAgfQogIHNldFRpbWVvdXQoKCk9PntidG4udGV4dENvbnRlbnQ9J/CflJcg44GT44Gu6Kit5a6a44KSVVJM44Gn44K344Kn44KiJzt9LDIwMDApOwp9CgovLyDilIDilIAg5YWl5Yqb5YCk44KSRE9N44Gr5Y+N5pig77yI54q25oWL4oaSVUnvvIkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIHN5bmNTdGF0ZVRvRE9NKCkgewogIC8vIOOCueODqeOCpOODgOODvAogIE9iamVjdC5lbnRyaWVzKFNMSURFUlMpLmZvckVhY2goKFtrZXksZGVmXSk9PnsKICAgIGNvbnN0IHZhbD1rZXk9PT0naW5jJz9TLmluY29tZTprZXk9PT0nZ3JzJz9TLmdyb3NzWTprZXk9PT0nY29zdCc/Uy5jb3N0OgogICAgICAgICAgICAgIGtleT09PSdncmFkJz9TLmdyYWQ6Uy5pbnZSZXQ7CiAgICBpZihlbChkZWYuc2wpKSBlbChkZWYuc2wpLnZhbHVlPXZhbDsKICAgIGlmKGVsKGRlZi5uaSkpIGVsKGRlZi5uaSkudmFsdWU9dmFsOwogIH0pOwogIC8vIOOCu+ODrOOCr+ODiAogIGlmKGVsKCdzZWwtdDJtJykpIGVsKCdzZWwtdDJtJykudmFsdWU9Uy50Mk1vbnRobHk7CiAgaWYoZWwoJ3NlbC10MnMnKSkgZWwoJ3NlbC10MnMnKS52YWx1ZT1TLnQyU3R1ZHlNOwogIGlmKGVsKCdzZWwtdDFtJykpIGVsKCdzZWwtdDFtJykudmFsdWU9Uy50MU1vbnRobHk7CiAgaWYoZWwoJ3NlbC10MXMnKSkgZWwoJ3NlbC10MXMnKS52YWx1ZT1TLnQxU3R1ZHlNOwogIGlmKGVsKCduaS1ib24nKSkgIGVsKCduaS1ib24nKS52YWx1ZT1TLmJvbnVzWTsKICAvLyDjg4jjgrDjg6sKICBzZXRVc2VHcm9zcyhTLnVzZUdyb3NzKTsKICBpZighUy51c2VUMikgdG9nZ2xlVDIoKTsKICBpZihTLnVzZVQxKSAgdG9nZ2xlVDEoKTsKICB1cGRCb251c0NoaXBzKCk7CiAgLy8g44Oc44O844OK44K544K744Kv44K344On44OzCiAgZWwoJ2JvbnVzLXNlYycpLnN0eWxlLmRpc3BsYXk9Uy51c2VHcm9zcz8nbm9uZSc6Jyc7Cn0KCi8vIOKUgOKUgCDjg4Hjg6Pjg7zjg4jjg6njg4Pjg5Hjg7zvvIjjgq/jg6rjg4Pjgq/jgafmi6HlpKfvvIkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8vIFNWR+OCkuWxnuaAp+OBq+Wfi+OCgei+vOOBvuOBmklE44K544OI44Ki44Gn566h55CGCmxldCBfY2hhcnRTdG9yZSA9IHt9OwpsZXQgX2NoYXJ0SWQgPSAwOwoKZnVuY3Rpb24gY2hhcnRXcmFwKHN2Z0h0bWwsIHRpdGxlPScnKSB7CiAgaWYoIXN2Z0h0bWwpIHJldHVybiAnJzsKICBjb25zdCBpZCA9ICsrX2NoYXJ0SWQ7CiAgX2NoYXJ0U3RvcmVbaWRdID0ge2h0bWw6IHN2Z0h0bWwsIHRpdGxlfTsKICByZXR1cm4gKCc8ZGl2IGNsYXNzPSJjaGFydC1ib3gtd3JhcCIgb25jbGljaz0ib3BlbkNoYXJ0QnlJZCgnICsgKGlkKSArICcpIj4nICsgKHN2Z0h0bWwpICsgJzwvZGl2PicpOwp9CgpmdW5jdGlvbiBvcGVuQ2hhcnRCeUlkKGlkKSB7CiAgY29uc3QgYyA9IF9jaGFydFN0b3JlW2lkXTsKICBpZihjKSBvcGVuQ2hhcnRNb2RhbChjLmh0bWwsIGMudGl0bGUpOwp9CgovLyDilIDilIAg44OB44Oj44O844OI44Oi44O844OA44OrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBvcGVuQ2hhcnRNb2RhbChzdmdIdG1sLCB0aXRsZT0nJykgewogIGNvbnN0IG09ZWwoJ2NoYXJ0LW1vZGFsJyk7CiAgZWwoJ2NoYXJ0LW1vZGFsLXRpdGxlJykudGV4dENvbnRlbnQ9dGl0bGU7CiAgZWwoJ2NoYXJ0LW1vZGFsLWJvZHknKS5pbm5lckhUTUw9c3ZnSHRtbDsKICBtLnN0eWxlLmRpc3BsYXk9J2ZsZXgnOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLF9tb2RhbEVzYyk7Cn0KZnVuY3Rpb24gY2xvc2VDaGFydE1vZGFsKCkgewogIGVsKCdjaGFydC1tb2RhbCcpLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLF9tb2RhbEVzYyk7Cn0KZnVuY3Rpb24gX21vZGFsRXNjKGUpeyBpZihlLmtleT09PSdFc2NhcGUnKSBjbG9zZUNoYXJ0TW9kYWwoKTsgfQoKLy8g4pSA4pSAIOODhuODvOODnuODiOOCsOODqyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gYXBwbHlUaGVtZShtb2RlKSB7CiAgLy8gbW9kZTogJ2xpZ2h0JyB8ICdkYXJrJyB8ICdhdXRvJwogIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Nob2wtc2ltJyk7CiAgcm9vdC5jbGFzc0xpc3QucmVtb3ZlKCdkYXJrJywnbGlnaHQnKTsKICBpZihtb2RlPT09J2RhcmsnKSAgcm9vdC5jbGFzc0xpc3QuYWRkKCdkYXJrJyk7CiAgaWYobW9kZT09PSdsaWdodCcpIHJvb3QuY2xhc3NMaXN0LmFkZCgnbGlnaHQnKTsKICBjb25zdCBidG4gPSBlbCgndGhlbWUtYnRuJyk7CiAgaWYoYnRuKXsKICAgIGJ0bi50ZXh0Q29udGVudCA9IG1vZGU9PT0nZGFyaycgPyAn8J+MmScgOiBtb2RlPT09J2xpZ2h0JyA/ICfimIDvuI8nIDogJ/CfjJMnOwogICAgYnRuLnRpdGxlID0gbW9kZT09PSdkYXJrJyA/ICfjg6njgqTjg4jjg6Ljg7zjg4njgavliIfjgormm7/jgYgnIDogbW9kZT09PSdsaWdodCcgPyAn44OA44O844Kv44Oi44O844OJ44Gr5YiH44KK5pu/44GIJyA6ICfjg4bjg7zjg57liIfjgormm7/jgYgnOwogIH0KICB0cnl7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzY2hvbF90aGVtZScsIG1vZGUpOyB9Y2F0Y2h7fQp9CmZ1bmN0aW9uIHRvZ2dsZVRoZW1lKCkgewogIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Nob2wtc2ltJyk7CiAgLy8gZGFyayDihpIgbGlnaHQg4oaSIGRhcmsg44Gu44K344Oz44OX44Or44OI44Kw44OrCiAgY29uc3QgaXNEYXJrID0gcm9vdC5jbGFzc0xpc3QuY29udGFpbnMoJ2RhcmsnKSB8fAogICAgKCFyb290LmNsYXNzTGlzdC5jb250YWlucygnbGlnaHQnKSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspJykubWF0Y2hlcyk7CiAgYXBwbHlUaGVtZShpc0RhcmsgPyAnbGlnaHQnIDogJ2RhcmsnKTsKfQoKLy8g4pSA4pSAIOWIneacn+WMliDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gaW5pdCgpIHsKICAvLyDjgrPjg7Pjg4bjg4rjgYzlrZjlnKjjgZnjgovjgYvnorroqo0KICBpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjaG9sLXNpbScpKXsKICAgIGNvbnNvbGUud2Fybignc2Nob2wtc2ltIGNvbnRhaW5lciBub3QgZm91bmQnKTsKICAgIHJldHVybjsKICB9CiAgdHJ5IHsKICAgIC8vIOODhuODvOODnuW+qeWFg++8iOaJi+WLleioreWumuOCkuWEquWFiOOAgeOBquOBkeOCjOOBsCBhdXRv77yJCiAgICBsZXQgc2F2ZWRUaGVtZSA9ICdhdXRvJzsKICAgIHRyeXsgc2F2ZWRUaGVtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzY2hvbF90aGVtZScpIHx8ICdhdXRvJzsgfWNhdGNoe30KICAgIGFwcGx5VGhlbWUoc2F2ZWRUaGVtZSk7CiAgICBsb2FkRnJvbVVSTCgpOwogICAgYnVpbGRSYXRlSW5wdXRzKCk7CiAgICBzeW5jU3RhdGVUb0RPTSgpOwogICAgcmVuZGVyKCk7CiAgICBjb25zb2xlLmxvZygn5aWo5a2m6YeR44K344Of44Ol44Os44O844K/44O8IHYzOiDliJ3mnJ/ljJblrozkuoYnKTsKICB9IGNhdGNoKGUpIHsKICAgIGNvbnNvbGUuZXJyb3IoJ+WlqOWtpumHkeOCt+ODn+ODpeODrOODvOOCv+ODvCB2MyDliJ3mnJ/ljJbjgqjjg6njg7w6JywgZS5tZXNzYWdlKTsKICB9Cn0KCi8vIERPTUNvbnRlbnRMb2FkZWQg44GoIOOCv+OCpOODoOOCouOCpuODiOS9teeUqO+8iFdvcmRQcmVzc+S6kuaPm+aAp++8iQppZihkb2N1bWVudC5yZWFkeVN0YXRlPT09J2xvYWRpbmcnKXsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdCk7Cn0gZWxzZSB7CiAgLy8g5pei44Gr6Kqt44G/6L6844G/5a6M5LqG44GX44Gm44GE44KL5aC05ZCICiAgaW5pdCgpOwp9Ci8vIOODleOCqeODvOODq+ODkOODg+OCrzog5b+144Gu44Gf44KBNTAwbXPjgaflho3oqabooYwKc2V0VGltZW91dCgoKT0+ewogIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY2hvbC1zaW0nKSYmIXdpbmRvdy5fc2Nob2xJbml0RG9uZSl7CiAgICB3aW5kb3cuX3NjaG9sSW5pdERvbmU9dHJ1ZTsKICAgIGluaXQoKTsKICB9Cn0sIDUwMCk7CgovLyDilIDilIAgV29yZFByZXNz5LqS5o+b5oCnOiDlhajjgqTjg7Pjg6njgqTjg7Pjg4/jg7Pjg4njg6njg7zplqLmlbDjgpJ3aW5kb3fjgavnmbvpjLIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACihmdW5jdGlvbigpewogIHZhciBmbnM9W3N2LHJlbmRlcixhZGpFdix0b2dnbGVFdixzZXRFdkFnZSxhZGRQcmVwYXkscmVtb3ZlUHJlcGF5LGJ1aWxkU2hhcmVQYXJhbXMsCiAgICAgICAgICAgc2V0RHRhYixvcGVuQ2hhcnRCeUlkLGNsb3NlQ2hhcnRNb2RhbCxzZXRVc2VHcm9zcyx0b2dnbGVJbnYsCiAgICAgICAgICAgYXBwbHlUaGVtZSxjbGVhclQxRGlyZWN0LGNsZWFyVDJEaXJlY3Qsc2V0Qm9udXNNLHNldFQxRGlyZWN0LAogICAgICAgICAgIHNldFQyRGlyZWN0LHNldFJhdGVQcmVzZXQsdG9nZ2xlQWR2LHRvZ2dsZUR0bCx0b2dnbGVUMSx0b2dnbGVUMiwKICAgICAgICAgICB0b2dnbGVUaGVtZSxjb3B5U2hhcmVVUkwsdXBkQ2g1Rml4VmFyXTsKICBmbnMuZm9yRWFjaChmdW5jdGlvbihmbil7IGlmKGZuJiZmbi5uYW1lKSB3aW5kb3dbZm4ubmFtZV09Zm47IH0pOwogIHdpbmRvdy5TPVM7IC8vIFPjgqrjg5bjgrjjgqfjgq/jg4jjgoLjgqLjgq/jgrvjgrnlj6/og73jgasKfSkoKTsK
