Submitted URL: https://www.mikiki.tokyo.jp/
Effective URL: https://mikiki.tokyo.jp/
Submission: On March 08 via api from US

Summary

This website contacted 41 IPs in 6 countries across 28 domains to perform 291 HTTP transactions. The main IP is 202.238.151.85, located in Mito, Japan and belongs to IIJ Internet Initiative Japan Inc., JP. The main domain is mikiki.tokyo.jp.
TLS certificate: Issued by Cybertrust Japan SureServer EV CA G3 on March 1st 2021. Valid for: a year.
This is the only time mikiki.tokyo.jp was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
1 8 202.238.151.85 2497 (IIJ Inter...)
4 2a00:1450:400... 15169 (GOOGLE)
114 2.16.107.89 20940 (AKAMAI-ASN1)
1 2a00:1450:400... 15169 (GOOGLE)
4 143.204.209.77 16509 (AMAZON-02)
6 2a00:1450:400... 15169 (GOOGLE)
101 2a00:1450:400... 15169 (GOOGLE)
1 74.114.154.15 2635 (AUTOMATTIC)
1 65.9.96.38 16509 (AMAZON-02)
2 2a00:1450:400... 15169 (GOOGLE)
2 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
2 2a03:2880:f04... 32934 (FACEBOOK)
2 2606:2800:234... 15133 (EDGECAST)
1 65.9.96.29 16509 (AMAZON-02)
1 2600:9000:214... 16509 (AMAZON-02)
1 142.250.185.226 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
10 2a03:2880:f14... 32934 (FACEBOOK)
1 3 183.79.113.119 24572 (YAHOO-JP-...)
1 2a03:2880:f01... 32934 (FACEBOOK)
1 2a03:2880:f01... 32934 (FACEBOOK)
1 104.244.42.136 13414 (TWITTER)
2 182.22.24.252 23816 (YAHOO Yah...)
1 65.9.96.8 16509 (AMAZON-02)
1 172.217.23.98 15169 (GOOGLE)
1 99.84.90.65 16509 (AMAZON-02)
2 151.101.13.19 54113 (FASTLY)
2 13.32.21.90 16509 (AMAZON-02)
2 2a00:1450:400... 15169 (GOOGLE)
1 2 107.178.248.96 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
2 52.203.66.2 14618 (AMAZON-AES)
1 1 142.250.185.98 15169 (GOOGLE)
1 4 35.186.254.217 15169 (GOOGLE)
1 2 63.33.120.132 16509 (AMAZON-02)
2 2 52.214.43.215 16509 (AMAZON-02)
1 104.244.42.131 13414 (TWITTER)
1 1 2a02:2638:1::13 44788 (ASN-CRITE...)
291 41
Apex Domain
Subdomains
Transfer
114 ismcdn.jp
mikiki.ismcdn.jp
5 MB
101 gstatic.com
fonts.gstatic.com
2 MB
10 facebook.com
www.facebook.com
178 KB
8 impact-ad.jp
img.ak.impact-ad.jp
penta.a.one.impact-ad.jp
aw.dw.impact-ad.jp
17 KB
8 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
160 KB
8 mikiki.tokyo.jp
www.mikiki.tokyo.jp
mikiki.tokyo.jp
67 KB
5 doubleclick.net
googleads.g.doubleclick.net
stats.g.doubleclick.net
cm.g.doubleclick.net
8 KB
5 worldshopping.jp
checkout-api.worldshopping.jp
checkout-js.worldshopping.jp
586 KB
5 googleapis.com
fonts.googleapis.com
ajax.googleapis.com
180 KB
4 yahoo.co.jp
yjtag.yahoo.co.jp
b92.yahoo.co.jp
5 KB
4 twitter.com
platform.twitter.com
syndication.twitter.com
analytics.twitter.com
133 KB
3 treasuredata.com
cdn.treasuredata.com
in.treasuredata.com
14 KB
2 adsrvr.org
match.adsrvr.org
917 B
2 demdex.net
dpm.demdex.net
2 KB
2 locize.io
api.locize.io
4 KB
2 fbcdn.net
scontent-frt3-1.xx.fbcdn.net
scontent-frt3-2.xx.fbcdn.net
9 KB
2 google.com
adservice.google.com
www.google.com
351 B
2 google.de
adservice.google.de
www.google.de
907 B
2 googleadservices.com
partner.googleadservices.com
www.googleadservices.com
13 KB
2 facebook.net
connect.facebook.net
62 KB
2 google-analytics.com
www.google-analytics.com
19 KB
1 criteo.com
gum.criteo.com
261 B
1 yimg.jp
s.yimg.jp
7 KB
1 googletagservices.com
www.googletagservices.com
28 KB
1 yjtag.jp
s.yjtag.jp
13 KB
1 getpocket.com
widgets.getpocket.com
1 KB
1 st-hatena.com
b.st-hatena.com
11 KB
1 tumblr.com
platform.tumblr.com
370 B
291 28
Domain Requested by
114 mikiki.ismcdn.jp mikiki.tokyo.jp
mikiki.ismcdn.jp
101 fonts.gstatic.com fonts.googleapis.com
10 www.facebook.com connect.facebook.net
www.facebook.com
7 mikiki.tokyo.jp mikiki.tokyo.jp
ajax.googleapis.com
6 pagead2.googlesyndication.com mikiki.tokyo.jp
pagead2.googlesyndication.com
tpc.googlesyndication.com
4 aw.dw.impact-ad.jp 1 redirects
4 checkout-api.worldshopping.jp mikiki.tokyo.jp
checkout-api.worldshopping.jp
checkout-js.worldshopping.jp
3 yjtag.yahoo.co.jp 1 redirects s.yjtag.jp
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
www.googleadservices.com
3 fonts.googleapis.com mikiki.tokyo.jp
2 match.adsrvr.org 2 redirects
2 dpm.demdex.net 1 redirects
2 in.treasuredata.com cdn.treasuredata.com
2 penta.a.one.impact-ad.jp 1 redirects
2 tpc.googlesyndication.com pagead2.googlesyndication.com
tpc.googlesyndication.com
2 api.locize.io text
2 img.ak.impact-ad.jp mikiki.tokyo.jp
img.ak.impact-ad.jp
2 platform.twitter.com mikiki.tokyo.jp
platform.twitter.com
2 connect.facebook.net mikiki.tokyo.jp
connect.facebook.net
2 www.google-analytics.com mikiki.tokyo.jp
www.google-analytics.com
2 ajax.googleapis.com mikiki.tokyo.jp
1 gum.criteo.com 1 redirects
1 analytics.twitter.com
1 cm.g.doubleclick.net 1 redirects
1 www.google.de
1 www.google.com
1 cdn.treasuredata.com mikiki.tokyo.jp
1 b92.yahoo.co.jp s.yimg.jp
1 www.googleadservices.com s.yjtag.jp
1 checkout-js.worldshopping.jp checkout-api.worldshopping.jp
1 s.yimg.jp s.yjtag.jp
1 syndication.twitter.com platform.twitter.com
1 scontent-frt3-2.xx.fbcdn.net www.facebook.com
1 scontent-frt3-1.xx.fbcdn.net www.facebook.com
1 www.googletagservices.com pagead2.googlesyndication.com
1 adservice.google.com pagead2.googlesyndication.com
1 adservice.google.de pagead2.googlesyndication.com
1 partner.googleadservices.com pagead2.googlesyndication.com
1 s.yjtag.jp mikiki.tokyo.jp
1 widgets.getpocket.com mikiki.tokyo.jp
1 stats.g.doubleclick.net www.google-analytics.com
1 b.st-hatena.com mikiki.tokyo.jp
1 platform.tumblr.com mikiki.tokyo.jp
1 www.mikiki.tokyo.jp 1 redirects
291 44

This site contains links to these domains. Also see Links.

Domain
twitter.com
www.facebook.com
www.instagram.com
www.youtube.com
tower.jp
towershibuya.jp
Subject Issuer Validity Valid
mikiki.tokyo.jp
Cybertrust Japan SureServer EV CA G3
2021-03-01 -
2022-03-31
a year crt.sh
upload.video.google.com
GTS CA 1O1
2021-02-17 -
2021-05-12
3 months crt.sh
*.ismcdn.jp
DigiCert TLS Hybrid ECC SHA384 2020 CA1
2020-11-19 -
2021-11-23
a year crt.sh
*.worldshopping.jp
Amazon
2020-07-03 -
2021-08-03
a year crt.sh
*.g.doubleclick.net
GTS CA 1O1
2021-02-17 -
2021-05-12
3 months crt.sh
*.gstatic.com
GTS CA 1O1
2021-02-17 -
2021-05-12
3 months crt.sh
*.tumblr.com
Sectigo RSA Domain Validation Secure Server CA
2020-03-26 -
2022-06-28
2 years crt.sh
*.b.st-hatena.com
Amazon
2020-10-25 -
2021-11-24
a year crt.sh
*.google-analytics.com
GTS CA 1O1
2021-02-17 -
2021-05-12
3 months crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2021-02-10 -
2021-05-10
3 months crt.sh
*.twimg.com
DigiCert TLS RSA SHA256 2020 CA1
2020-11-05 -
2021-11-09
a year crt.sh
widgets.getpocket.com
Amazon
2020-04-29 -
2021-05-29
a year crt.sh
*.tgm.yahoo-net.jp
Cybertrust Japan SureServer CA G4
2020-03-12 -
2021-04-12
a year crt.sh
*.googleadservices.com
GTS CA 1O1
2021-02-17 -
2021-05-12
3 months crt.sh
*.google.de
GTS CA 1O1
2021-02-23 -
2021-05-18
3 months crt.sh
*.google.com
GTS CA 1O1
2021-02-17 -
2021-05-12
3 months crt.sh
yjtag.yahoo.co.jp
Cybertrust Japan SureServer CA G4
2020-10-04 -
2021-11-04
a year crt.sh
syndication.twitter.com
DigiCert TLS RSA SHA256 2020 CA1
2021-02-05 -
2022-02-04
a year crt.sh
edge01.yahoo.co.jp
Cybertrust Japan SureServer CA G4
2021-02-10 -
2022-03-09
a year crt.sh
www.googleadservices.com
GTS CA 1O1
2021-02-23 -
2021-05-18
3 months crt.sh
*.treasuredata.com
Amazon
2020-10-16 -
2021-11-15
a year crt.sh
img.ak.impact-ad.jp
SECOM Passport for Web SR 3.0 CA
2020-09-15 -
2021-09-30
a year crt.sh
*.locize.app
Amazon
2020-12-09 -
2022-01-07
a year crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2021-02-17 -
2021-05-12
3 months crt.sh
a.one.impact-ad.jp
SECOM Passport for Web SR 3.0 CA
2020-03-17 -
2021-03-31
a year crt.sh
www.google.com
GTS CA 1O1
2021-02-17 -
2021-05-12
3 months crt.sh
www.google.de
GTS CA 1O1
2021-02-17 -
2021-05-12
3 months crt.sh
aw.dw.impact-ad.jp
SECOM Passport for Web SR 3.0 CA
2018-02-09 -
2021-03-31
3 years crt.sh
*.demdex.net
DigiCert TLS RSA SHA256 2020 CA1
2020-12-02 -
2022-01-02
a year crt.sh
*.twitter.com
DigiCert TLS RSA SHA256 2020 CA1
2021-02-05 -
2022-02-04
a year crt.sh

This page contains 7 frames:

Primary Page: https://mikiki.tokyo.jp/
Frame ID: A7200143F9551C9CDA1A107F22CDDB14
Requests: 265 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20210303/r20190131/zrt_lookup.html
Frame ID: 6DC74384727202A89DB7D213E8233DBC
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6762391202596396&output=html&adk=1812271804&adf=3025194257&lmt=1615234972&plat=1%3A16809992%2C2%3A32776%2C8%3A134217728%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32&format=0x0&url=https%3A%2F%2Fmikiki.tokyo.jp%2F&ea=0&flash=0&pra=7&wgl=1&dt=1615234972114&bpp=1&bdt=1257&idt=1&shv=r20210303&cbv=r20190131&ptt=9&saldr=aa&abxe=1&nras=1&correlator=7858236862458&frm=20&pv=2&ga_vid=649973928.1615234972&ga_sid=1615234972&ga_hid=2024170864&ga_fc=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1600&bih=1200&scr_x=0&scr_y=0&eid=42530672%2C21066922%2C21068083&oid=3&pvsid=1284100185698243&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=8192&bc=31&ifi=3&uci=a!3&fsb=1&dtd=18
Frame ID: F8EB51C21E6C9D92EC8BB8C2CB6BD570
Requests: 1 HTTP requests in this frame

Frame: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
Frame ID: 8B64D4649408E946FAE0FC625B7E81AF
Requests: 12 HTTP requests in this frame

Frame: https://platform.twitter.com/widgets/widget_iframe.0edc1ef9f8b82d9b79c6115bda79f63f.html?origin=https%3A%2F%2Fmikiki.tokyo.jp
Frame ID: CE635255F0A055CACBA2BAF5EF55A37C
Requests: 2 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/sodar/sodar2/221/runner.html
Frame ID: 28E6242630256B0A825C01BFC098C6D9
Requests: 2 HTTP requests in this frame

Frame: https://img.ak.impact-ad.jp/ut/pb.html
Frame ID: 9985EC9F5884C9A4D3088FC70CAD1223
Requests: 8 HTTP requests in this frame

Screenshot


Page URL History Show full URLs

  1. https://www.mikiki.tokyo.jp/ HTTP 301
    https://mikiki.tokyo.jp/ Page URL

Page Statistics

291
Requests

100 %
HTTPS

49 %
IPv6

28
Domains

44
Subdomains

41
IPs

6
Countries

8679 kB
Transfer

12120 kB
Size

4
Cookies

Page URL History

This captures the URL locations of the websites, including HTTP redirects and client-side redirects via JavaScript or Meta fields.

  1. https://www.mikiki.tokyo.jp/ HTTP 301
    https://mikiki.tokyo.jp/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 274
  • https://penta.a.one.impact-ad.jp/combo?oid=1ce48bb6b1384539&dd_rft=k&dd_jsonp=a1tracker.cb._10&fu=4cd00445-4b43-4538-aa7f-0783a0f63a3d&src=https%3A%2F%2Fmikiki.tokyo.jp%2F&l=en-us&sr=1600x1200&vp=1600x1200&cd=24-bit&tgsrc=a1common&dsc=Mikiki%E3%81%AF%E3%80%81%E3%82%82%E3%81%A3%E3%81%A8%E8%81%B4%E3%81%8D%E3%81%9F%E3%81%84%E3%80%81%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84%E3%80%81%E6%A5%BD%E3%81%97%E3%81%BF%E3%81%9F%E3%81%84%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%83%E3%82%AF%E3%83%BB%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%83%BB%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7%E3%81%99&dt=Mikiki%20-%20music%20review%20site HTTP 303
  • https://penta.a.one.impact-ad.jp/ul_cb/combo?oid=1ce48bb6b1384539&dd_rft=k&dd_jsonp=a1tracker.cb._10&fu=4cd00445-4b43-4538-aa7f-0783a0f63a3d&src=https%3A%2F%2Fmikiki.tokyo.jp%2F&l=en-us&sr=1600x1200&vp=1600x1200&cd=24-bit&tgsrc=a1common&dsc=Mikiki%E3%81%AF%E3%80%81%E3%82%82%E3%81%A3%E3%81%A8%E8%81%B4%E3%81%8D%E3%81%9F%E3%81%84%E3%80%81%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84%E3%80%81%E6%A5%BD%E3%81%97%E3%81%BF%E3%81%9F%E3%81%84%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%83%E3%82%AF%E3%83%BB%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%83%BB%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7%E3%81%99&dt=Mikiki%20-%20music%20review%20site
Request Chain 284
  • https://cm.g.doubleclick.net/pixel?google_nid=audienceone_dmp&google_cm&google_sc&oid=1ce48bb6b1384539&sp=ddp HTTP 302
  • https://aw.dw.impact-ad.jp/c/map/?cid=CAESEBUc7hoJyJ01sVcDAl2_sSE&google_cver=1&oid=1ce48bb6b1384539&sp=ddp
Request Chain 285
  • https://dpm.demdex.net/ibs:dpid=47438?dpuuid=249e67cf-d690-4bf4-8961-0b419f11adf7&redir=https%3A%2F%2Faw.dw.impact-ad.jp%2Fc%2Fmap%2F%3Fcid%3D%24%7BDD_UUID%7D%26sp%3Daam%26oid%3D1ce48bb6b1384539 HTTP 302
  • https://dpm.demdex.net/demconf.jpg?et:ibs%7cdata:dpid=47438
Request Chain 287
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=vxg9yvd&ttd_tpi=1 HTTP 302
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=vxg9yvd&ttd_tpi=1 HTTP 302
  • https://aw.dw.impact-ad.jp/c/map/?sp=ttd&oid=207d81ffda0cc019&cid=4b72918e-f9de-48f5-9d93-744d641f9ab3
Request Chain 288
  • https://yjtag.yahoo.co.jp/csx?tp=khADDtf HTTP 302
  • https://aw.dw.impact-ad.jp/c/u/?gdpr=1&oid=207d81ffda0cc019&rdr=https%3A%2F%2Fyjtag.yahoo.co.jp%2Fcs%3Fbtt%3D8NV2nuCzcH3ylcKZwz03GfPqu68Ee9LaRqzTgzPRPro%26tp%3DkhADDtf%26uid%3D%7BAONEID%7D HTTP 302
  • https://yjtag.yahoo.co.jp/cs?btt=8NV2nuCzcH3ylcKZwz03GfPqu68Ee9LaRqzTgzPRPro&tp=khADDtf&uid=249e67cf-d690-4bf4-8961-0b419f11adf7
Request Chain 290
  • https://gum.criteo.com/sync?c=333&r=1&u=https%3A%2F%2Faw.dw.impact-ad.jp%2Fc%2Fmap%2F%3Fsp%3Dcro%26oid%3D207d81ffda0cc019%26cid%3D%40USERID%40 HTTP 302
  • https://aw.dw.impact-ad.jp/c/map/?sp=cro&oid=207d81ffda0cc019&cid=

291 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
mikiki.tokyo.jp/
Redirect Chain
  • https://www.mikiki.tokyo.jp/
  • https://mikiki.tokyo.jp/
74 KB
15 KB
Document
General
Full URL
https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
202.238.151.85 Mito, Japan, ASN2497 (IIJ Internet Initiative Japan Inc., JP),
Reverse DNS
85.151.238.202.rev.ismedia.jp
Software
/
Resource Hash
5428dc93c697fb86ac6e41a9a174bf846a6fba3f84428620ff8d7f2d1db206e2
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
mikiki.tokyo.jp
:scheme
https
:path
/
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
none
sec-fetch-mode
navigate
sec-fetch-user
?1
sec-fetch-dest
document
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

content-type
text/html; charset=utf-8
cache-control
max-age=0, private, must-revalidate
x-xss-protection
1; mode=block
x-request-id
213e72ff-86b9-411f-8728-eabdf33bb890
x-frame-options
SAMEORIGIN
x-content-type-options
nosniff
date
Mon, 08 Mar 2021 20:22:50 GMT
x-cache-ttl
300.000
content-encoding
gzip
vary
Accept-Encoding,User-Agent,Cookie
x-cache
MISS
accept-ranges
bytes
strict-transport-security
max-age=31536000

Redirect headers

location
https://mikiki.tokyo.jp/
content-length
0
css
fonts.googleapis.com/
2 KB
619 B
Stylesheet
General
Full URL
https://fonts.googleapis.com/css?family=Oswald
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:82a::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
ESF /
Resource Hash
e12dfaae532b449b71117f29ad43f92b3b87c19509a9b16f91115fd4e07903b4
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

strict-transport-security
max-age=31536000
content-encoding
gzip
x-content-type-options
nosniff
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
x-xss-protection
0
last-modified
Mon, 08 Mar 2021 19:32:55 GMT
server
ESF
date
Mon, 08 Mar 2021 20:22:50 GMT
x-frame-options
SAMEORIGIN
content-type
text/css; charset=utf-8
access-control-allow-origin
*
cache-control
private, max-age=86400, stale-while-revalidate=604800
timing-allow-origin
*
link
<https://fonts.gstatic.com>; rel=preconnect; crossorigin
expires
Mon, 08 Mar 2021 20:22:50 GMT
css
fonts.googleapis.com/
2 KB
614 B
Stylesheet
General
Full URL
https://fonts.googleapis.com/css?family=Roboto
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:82a::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
ESF /
Resource Hash
04f6abfdaebd7170b5c22848a8ab4f2a5e9fcd76276d5de379d5ab0f14645fb2
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

strict-transport-security
max-age=31536000
content-encoding
gzip
x-content-type-options
nosniff
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
x-xss-protection
0
last-modified
Mon, 08 Mar 2021 19:24:24 GMT
server
ESF
date
Mon, 08 Mar 2021 20:22:50 GMT
x-frame-options
SAMEORIGIN
content-type
text/css; charset=utf-8
access-control-allow-origin
*
cache-control
private, max-age=86400, stale-while-revalidate=604800
timing-allow-origin
*
link
<https://fonts.gstatic.com>; rel=preconnect; crossorigin
expires
Mon, 08 Mar 2021 20:22:50 GMT
css2
fonts.googleapis.com/
334 KB
89 KB
Stylesheet
General
Full URL
https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:82a::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
ESF /
Resource Hash
293ffbe64feb5b27df5ce57a4fbe2bb16e2e1b9e4bd0083bdb4a1cd43a5d66a4
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

strict-transport-security
max-age=31536000
content-encoding
gzip
x-content-type-options
nosniff
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
x-xss-protection
0
last-modified
Mon, 08 Mar 2021 20:22:48 GMT
server
ESF
date
Mon, 08 Mar 2021 20:22:50 GMT
x-frame-options
SAMEORIGIN
content-type
text/css; charset=utf-8
access-control-allow-origin
*
cache-control
private, max-age=86400, stale-while-revalidate=604800
timing-allow-origin
*
link
<https://fonts.gstatic.com>; rel=preconnect; crossorigin
expires
Mon, 08 Mar 2021 20:22:50 GMT
base.css
mikiki.ismcdn.jp/resources/mikiki/css/v1/
2 KB
1 KB
Stylesheet
General
Full URL
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/base.css?rd=202101291537
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
04c724885550412912bb7ff469c31abdb1cb26bb955f8a64f9ce07d63b3c94a5
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
7200.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 08 Jul 2020 06:46:49 GMT
x-frame-options
SAMEORIGIN
content-type
text/css; charset=utf-8
cache-control
max-age=19794
strict-transport-security
max-age=31536000
accept-ranges
bytes
vary
Accept-Encoding
content-length
1109
x-xss-protection
1; mode=block
x-request-id
4f1f2710-4468-4fb7-a7dd-2b36f4141f29
common-layout.css
mikiki.ismcdn.jp/resources/mikiki/css/v1/
868 B
759 B
Stylesheet
General
Full URL
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-layout.css?rd=202101291537
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
aa549f020cb9b7f26fafe652ed00ba0591d65a157e065576eb7127027284366a
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
7200.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 08 Jul 2020 06:46:49 GMT
x-frame-options
SAMEORIGIN
content-type
text/css; charset=utf-8
cache-control
max-age=26369
strict-transport-security
max-age=31536000
accept-ranges
bytes
vary
Accept-Encoding
content-length
470
x-xss-protection
1; mode=block
x-request-id
74d5b6f3-8663-4dea-ae8b-bb99e4150e90
common-parts.css
mikiki.ismcdn.jp/resources/mikiki/css/v1/
9 KB
3 KB
Stylesheet
General
Full URL
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-parts.css?rd=202101291537
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
fc8ccc6f466e069973c2f67c1dcaef7a1649d002945f36ab4a5e62d118a4b82f
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
7200.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 08 Jul 2020 06:46:49 GMT
x-frame-options
SAMEORIGIN
content-type
text/css; charset=utf-8
cache-control
max-age=56650
strict-transport-security
max-age=31536000
accept-ranges
bytes
vary
Accept-Encoding
content-length
2273
x-xss-protection
1; mode=block
x-request-id
074afcdd-f691-4b5b-810c-2f1dfe657bff
common-header.css
mikiki.ismcdn.jp/resources/mikiki/css/v1/
8 KB
2 KB
Stylesheet
General
Full URL
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
d40009960425e85ebfa185c2b37f8a5445456d60e1884df6b2a16abeee6a8ac5
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
7200.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 22 Jul 2020 01:47:00 GMT
x-frame-options
SAMEORIGIN
content-type
text/css; charset=utf-8
cache-control
max-age=26104
strict-transport-security
max-age=31536000
accept-ranges
bytes
vary
Accept-Encoding
content-length
2114
x-xss-protection
1; mode=block
x-request-id
1f16792e-92dc-45fb-93af-9c919ce40426
common-aside.css
mikiki.ismcdn.jp/resources/mikiki/css/v1/
10 KB
3 KB
Stylesheet
General
Full URL
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-aside.css?rd=202101291537
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
7c630fa54176d4504683088a10d62d907d03cc21ed0807a5c4b7be57d67aca16
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
7200.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 15 Oct 2020 03:45:52 GMT
x-frame-options
SAMEORIGIN
content-type
text/css; charset=utf-8
cache-control
max-age=16297
strict-transport-security
max-age=31536000
accept-ranges
bytes
vary
Accept-Encoding
content-length
2559
x-xss-protection
1; mode=block
x-request-id
865f9b14-5ed5-48ee-8578-8ec745a4dde6
indexes-main-contents.css
mikiki.ismcdn.jp/resources/mikiki/css/v1/
25 KB
5 KB
Stylesheet
General
Full URL
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/indexes-main-contents.css?rd=202101291537
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f580e9551b54c28bb5d2b080dbdb902d74e971fa30b97ad1edde9478f764a119
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
7200.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 08 Jul 2020 06:46:49 GMT
x-frame-options
SAMEORIGIN
content-type
text/css; charset=utf-8
cache-control
max-age=390
strict-transport-security
max-age=31536000
accept-ranges
bytes
vary
Accept-Encoding
content-length
4791
x-xss-protection
1; mode=block
x-request-id
47131a77-7acc-4abb-85f3-dc4b817236f6
slick.css
mikiki.ismcdn.jp/common/js/v1/lib/slick/
2 KB
763 B
Stylesheet
General
Full URL
https://mikiki.ismcdn.jp/common/js/v1/lib/slick/slick.css?rd=202101291537
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
de1e399b07289f3b0a8d35142e363e128124a1185770e214e25e58030dad48e5
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
last-modified
Thu, 15 Nov 2018 03:55:09 GMT
vary
Accept-Encoding
content-type
text/css
cache-control
max-age=2518687
strict-transport-security
max-age=31536000
accept-ranges
bytes
content-length
569
expires
Wed, 07 Apr 2021 00:00:58 GMT
slick-theme.css
mikiki.ismcdn.jp/common/js/v1/lib/slick/
3 KB
1 KB
Stylesheet
General
Full URL
https://mikiki.ismcdn.jp/common/js/v1/lib/slick/slick-theme.css?rd=202101291537
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
7adaf08052c6a6a0f8a0d0055b4f191fd07389fe41c972b69573472b2ecb406a
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
last-modified
Thu, 15 Nov 2018 04:05:59 GMT
vary
Accept-Encoding
content-type
text/css
cache-control
max-age=2574813
strict-transport-security
max-age=31536000
accept-ranges
bytes
content-length
866
expires
Wed, 07 Apr 2021 15:36:24 GMT
jquery.min.js
ajax.googleapis.com/ajax/libs/jquery/3.5.1/
87 KB
30 KB
Script
General
Full URL
https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80f::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
f7f6a5894f1d19ddad6fa392b2ece2c5e578cbf7da4ea805b6885eb6985b6e3d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 09:50:09 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
210761
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
31021
x-xss-protection
0
last-modified
Fri, 08 May 2020 07:05:03 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
public, max-age=31536000, stale-while-revalidate=2592000
accept-ranges
bytes
timing-allow-origin
*
expires
Sun, 06 Mar 2022 09:50:09 GMT
script
checkout-api.worldshopping.jp/v1/
337 KB
120 KB
Script
General
Full URL
https://checkout-api.worldshopping.jp/v1/script?token=tower_jp
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
143.204.209.77 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-209-77.fra53.r.cloudfront.net
Software
/
Resource Hash
e9151f0be2e82fac91bd31725c80417e92a053c29f53896564843d92b7a2e17e

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:52 GMT
via
1.1 7581b95dc5c9e1ffa79fb8e4b4276bf8.cloudfront.net (CloudFront), 1.1 e7377cc861b31102786678df3616bf69.cloudfront.net (CloudFront)
x-amz-cf-pop
MUC51-C1, FRA53-C1
x-amzn-requestid
093ca3d2-7f84-4da5-870c-5eb4cb32fb98
vary
Accept-Encoding
x-cache
Miss from cloudfront
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
private, no-store, no-cache, must-revalidate
x-amzn-trace-id
Root=1-6046879b-2c44c8ae569a6db75a6d1b85
content-encoding
gzip
x-amz-apigw-id
b4ogYGD4NjMFtAg=
x-amz-cf-id
SAl2BR9CqkXiVE1SKkpuYs_X02yz6vO0CfhYAVQgGuIXTGOcwmvqqg==
img_529745170ef2a3a593e27ea02b6f7cf7295705.jpg
mikiki.ismcdn.jp/mwimgs/5/2/476/
256 KB
257 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/5/2/476/img_529745170ef2a3a593e27ea02b6f7cf7295705.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
06e85a911ce6c882b348be049340002e94f29021782b829135cb6a06c5dc126a
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 07:23:46 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574782
accept-ranges
bytes
content-length
262018
expires
Wed, 07 Apr 2021 15:35:53 GMT
img_aa2fe163414aebaeb1c6c06054f2a7fc240818.jpg
mikiki.ismcdn.jp/mwimgs/a/a/476/
209 KB
210 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/a/a/476/img_aa2fe163414aebaeb1c6c06054f2a7fc240818.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
85014d13d3064f60eb68afe1d0a0d17239d5ec39233912fe1023540b9c2a8580
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 06:59:16 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
214036
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_88034c0f1431d1e128c2745d13fc09f5206334.jpg
mikiki.ismcdn.jp/mwimgs/8/8/476/
179 KB
179 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/8/8/476/img_88034c0f1431d1e128c2745d13fc09f5206334.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
ddca82c37cb7ebc59efbfd254f045e1dc4ea9a3d1b8b3f84a9604cf3a6686ed4
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 06:12:49 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574815
accept-ranges
bytes
content-length
183132
expires
Wed, 07 Apr 2021 15:36:26 GMT
img_1382b10d4545097d993a8e4b8b022f3c195745.jpg
mikiki.ismcdn.jp/mwimgs/1/3/476h/
186 KB
187 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/1/3/476h/img_1382b10d4545097d993a8e4b8b022f3c195745.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
65519f763fa92f366b3b9aa0b8a1f9ec065e4d92e0c88781d72af5e9417b5636
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 06:04:53 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574766
accept-ranges
bytes
content-length
190851
expires
Wed, 07 Apr 2021 15:35:37 GMT
img_40316cba29ca81fdadd85339328fa7e9189240.jpg
mikiki.ismcdn.jp/mwimgs/4/0/476/
162 KB
162 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/4/0/476/img_40316cba29ca81fdadd85339328fa7e9189240.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
83e2cd6fa04cd8999c625da6ad624c57654018285f49ffce092415ab7f8a0bc4
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 05:12:58 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574792
accept-ranges
bytes
content-length
165752
expires
Wed, 07 Apr 2021 15:36:03 GMT
img_f34c4f5ff227999480591efccac73f68439505.jpg
mikiki.ismcdn.jp/mwimgs/f/3/476h/
232 KB
233 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/f/3/476h/img_f34c4f5ff227999480591efccac73f68439505.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
9f6d3417bf40b5daa53bbbdcb5f4baf46eb92f92b540d5f4a544c3abe6286cd8
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 04:16:17 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574757
accept-ranges
bytes
content-length
238056
expires
Wed, 07 Apr 2021 15:35:28 GMT
img_57eab5951a20a9f09436453b2c6850c2236806.jpg
mikiki.ismcdn.jp/mwimgs/5/7/476h/
213 KB
214 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/5/7/476h/img_57eab5951a20a9f09436453b2c6850c2236806.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
7a75a580d464a8e5ac20f33060d954cd0edc04c211283a6f080a2057970e60bc
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 04:07:38 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574779
accept-ranges
bytes
content-length
218507
expires
Wed, 07 Apr 2021 15:35:50 GMT
img_4ab46f473f1e772bfdbdc16a3e850f98444405.jpg
mikiki.ismcdn.jp/mwimgs/4/a/476/
384 KB
385 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/4/a/476/img_4ab46f473f1e772bfdbdc16a3e850f98444405.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
116d2fe7f5ca37e80eb55ebc721d713b9bf3cf85eda5f7350a2fcc5628a7ef1b
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Thu, 18 Feb 2021 01:23:53 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2557442
accept-ranges
bytes
content-length
392966
expires
Wed, 07 Apr 2021 10:46:53 GMT
img_312f6b5af787139e554f2f81c9dea9b3281820.jpg
mikiki.ismcdn.jp/mwimgs/3/1/476/
247 KB
247 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/3/1/476/img_312f6b5af787139e554f2f81c9dea9b3281820.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
c82aea7b23b732a895cb386b03955d0db66902f9ddedcd573a1cb40ae3ad3fb1
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 01 Mar 2021 09:22:47 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
252605
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_628572d8ca2f10a28143f5b5d865cbf3236601.jpg
mikiki.ismcdn.jp/mwimgs/6/2/476/
206 KB
206 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/6/2/476/img_628572d8ca2f10a28143f5b5d865cbf3236601.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
3d66301aeb102b8bde37644ef42624b06a135a427292f22af88cf78b71d24127
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 01 Mar 2021 09:08:17 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
210453
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_529745170ef2a3a593e27ea02b6f7cf7295705.jpg
mikiki.ismcdn.jp/mwimgs/5/2/142/
35 KB
36 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/5/2/142/img_529745170ef2a3a593e27ea02b6f7cf7295705.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
18b18d6751cc5fdd74550eb92e574ad98a5fab307a84d91023639b7055cd5b45
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 07:23:46 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
36192
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_aa2fe163414aebaeb1c6c06054f2a7fc240818.jpg
mikiki.ismcdn.jp/mwimgs/a/a/142/
19 KB
19 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/a/a/142/img_aa2fe163414aebaeb1c6c06054f2a7fc240818.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a16283308237b180c029082634322798e3aedf635f72a84a27f56e66115dceb8
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 06:59:16 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574794
accept-ranges
bytes
content-length
19166
expires
Wed, 07 Apr 2021 15:36:05 GMT
img_88034c0f1431d1e128c2745d13fc09f5206334.jpg
mikiki.ismcdn.jp/mwimgs/8/8/142/
25 KB
25 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/8/8/142/img_88034c0f1431d1e128c2745d13fc09f5206334.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
baefdbc15e796953d1e8095555192afff504fa58726062cc685668446581e54c
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 06:12:49 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574773
accept-ranges
bytes
content-length
25184
expires
Wed, 07 Apr 2021 15:35:44 GMT
img_1382b10d4545097d993a8e4b8b022f3c195745.jpg
mikiki.ismcdn.jp/mwimgs/1/3/142h/
24 KB
24 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/1/3/142h/img_1382b10d4545097d993a8e4b8b022f3c195745.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e8115b1b2482f5026ea4e778c00c95231c78a21593f1b1a9facf235a61de4967
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 06:04:53 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574767
accept-ranges
bytes
content-length
24766
expires
Wed, 07 Apr 2021 15:35:38 GMT
img_40316cba29ca81fdadd85339328fa7e9189240.jpg
mikiki.ismcdn.jp/mwimgs/4/0/142/
19 KB
19 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/4/0/142/img_40316cba29ca81fdadd85339328fa7e9189240.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
3012926ff086726e7240930aece3e3a71e15edced9b43aca206e7d5fa2138bab
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 05:12:58 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574775
accept-ranges
bytes
content-length
19048
expires
Wed, 07 Apr 2021 15:35:46 GMT
img_f34c4f5ff227999480591efccac73f68439505.jpg
mikiki.ismcdn.jp/mwimgs/f/3/142h/
28 KB
29 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/f/3/142h/img_f34c4f5ff227999480591efccac73f68439505.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
31919fe20e249f5d732b3e8601897f5b5b6bf4197e7ad4900856edf1049dcfdd
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 04:16:17 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
28963
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_57eab5951a20a9f09436453b2c6850c2236806.jpg
mikiki.ismcdn.jp/mwimgs/5/7/142h/
25 KB
25 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/5/7/142h/img_57eab5951a20a9f09436453b2c6850c2236806.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
9bf4f70e38e28d8c284338a4d752a4cfc3e7fa9752db9ca5a82d93ee17eacaca
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 04:07:38 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574759
accept-ranges
bytes
content-length
25588
expires
Wed, 07 Apr 2021 15:35:30 GMT
img_4ab46f473f1e772bfdbdc16a3e850f98444405.jpg
mikiki.ismcdn.jp/mwimgs/4/a/142/
43 KB
43 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/4/a/142/img_4ab46f473f1e772bfdbdc16a3e850f98444405.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
d219bf1f4c164ee6d9ab49f6f7e12f0945ce1ee4e4fe5c6a82207f2688a5c9db
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Thu, 18 Feb 2021 01:23:53 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574793
accept-ranges
bytes
content-length
44209
expires
Wed, 07 Apr 2021 15:36:04 GMT
img_312f6b5af787139e554f2f81c9dea9b3281820.jpg
mikiki.ismcdn.jp/mwimgs/3/1/142/
29 KB
30 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/3/1/142/img_312f6b5af787139e554f2f81c9dea9b3281820.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a658b2a574c67e4917286358ce2ac75b57185283ed341580a8e45dd31fd7bbc5
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 01 Mar 2021 09:22:47 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574791
accept-ranges
bytes
content-length
30074
expires
Wed, 07 Apr 2021 15:36:02 GMT
img_628572d8ca2f10a28143f5b5d865cbf3236601.jpg
mikiki.ismcdn.jp/mwimgs/6/2/142/
27 KB
28 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/6/2/142/img_628572d8ca2f10a28143f5b5d865cbf3236601.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
4ba3887eaa97621c2c50c0dc947d30f8eafd03f99e92ab63cc478cc363aad307
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 01 Mar 2021 09:08:17 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574787
accept-ranges
bytes
content-length
28156
expires
Wed, 07 Apr 2021 15:35:58 GMT
img_0f67a4d7dbf0923ec0a37530aa34ef3d350161.jpg
mikiki.ismcdn.jp/mwimgs/0/f/656/
75 KB
75 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/0/f/656/img_0f67a4d7dbf0923ec0a37530aa34ef3d350161.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a968bb0674deb2f0fbd87d865c8c9e4a290e6eae2004004d0d11dc75e37503e5
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 08 Mar 2021 06:13:51 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2557425
accept-ranges
bytes
content-length
76695
expires
Wed, 07 Apr 2021 10:46:36 GMT
img_928d8cc5967a6ba8a6c0f503022d9429600127.jpg
mikiki.ismcdn.jp/mwimgs/9/2/306/
43 KB
43 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/9/2/306/img_928d8cc5967a6ba8a6c0f503022d9429600127.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a82016017984a3dc7fb458b27b0bf0bc16dd611e3eb93b96d1461adbb9afe96f
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Sat, 06 Mar 2021 03:44:49 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2557430
accept-ranges
bytes
content-length
44163
expires
Wed, 07 Apr 2021 10:46:41 GMT
img_ff28c4932c4595c777230005f85f90c2754156.jpg
mikiki.ismcdn.jp/mwimgs/f/f/85/
6 KB
6 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/f/f/85/img_ff28c4932c4595c777230005f85f90c2754156.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
bc74b0db431d81c4e1814d9037a8369fb8765043a0bb9a738cd5c8d76e359ba5
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Sat, 06 Mar 2021 02:59:32 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
6455
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_ffef38e07ce3bce764eaaaec2ab0275c758240.jpg
mikiki.ismcdn.jp/mwimgs/f/f/85/
4 KB
5 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/f/f/85/img_ffef38e07ce3bce764eaaaec2ab0275c758240.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
c1f9261eca11a55a6865ae58bceeba5095f8c2549998d7721c0c86062c0d3bc5
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Fri, 05 Mar 2021 06:52:18 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574776
accept-ranges
bytes
content-length
4500
expires
Wed, 07 Apr 2021 15:35:47 GMT
img_f4588853abe8bc5b61f9ea5f3fa30888309598.jpg
mikiki.ismcdn.jp/mwimgs/f/4/120h/
5 KB
6 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/f/4/120h/img_f4588853abe8bc5b61f9ea5f3fa30888309598.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
76b37efddbdc8f9dccf73391bf1c92a7f3dbb84a51d4ab745bec86a23ec0b9e7
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Wed, 03 Mar 2021 08:45:45 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
5456
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_898a15cb363a41e72ad0a1f3ef9b85ea1352172.jpg
mikiki.ismcdn.jp/mwimgs/8/9/85/
6 KB
6 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/8/9/85/img_898a15cb363a41e72ad0a1f3ef9b85ea1352172.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
b7e766c951df7ba3943e878fd546d7ba1f6acc08a24b399035ea7bd69db64235
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
x-content-type-options
nosniff
last-modified
Wed, 03 Mar 2021 02:10:21 GMT
x-frame-options
SAMEORIGIN
content-type
image/jpeg
cache-control
max-age=2096766
strict-transport-security
max-age=31536000
accept-ranges
bytes
content-length
6028
x-xss-protection
1; mode=block
x-request-id
860713d0-3cb2-4619-873b-c09ccbb911e7
expires
Fri, 02 Apr 2021 02:48:57 GMT
img_34811fe29099a510764904239ac1d582193093.jpg
mikiki.ismcdn.jp/mwimgs/3/4/85/
9 KB
9 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/3/4/85/img_34811fe29099a510764904239ac1d582193093.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
3cfaee78ccbba043c22b71a77b0902312f11ecbb24d7c7d17e4466c83a436859
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Wed, 03 Mar 2021 02:16:49 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
9301
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_1b10d4131513247a404a9ea9d64168fc271117.jpg
mikiki.ismcdn.jp/mwimgs/1/b/85/
3 KB
3 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/1/b/85/img_1b10d4131513247a404a9ea9d64168fc271117.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
87cb574d8e4856f37eecfade92a2ecef0a2f3208b59de8e9a661b88b8f6e5cfd
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Wed, 03 Mar 2021 01:15:32 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
3221
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_33c9300f34e54c4fbac139affbc2ef70476781.jpg
mikiki.ismcdn.jp/mwimgs/3/3/85/
7 KB
7 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/3/3/85/img_33c9300f34e54c4fbac139affbc2ef70476781.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
73212b6cf2268fddef4cb1fd454658a2844db3f087b15f2705667f7e2decfe3c
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Fri, 26 Feb 2021 12:11:42 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2094950
accept-ranges
bytes
content-length
6944
expires
Fri, 02 Apr 2021 02:18:41 GMT
img_4e5cd1d3eaae222e6612692c7f3588671471823.jpg
mikiki.ismcdn.jp/mwimgs/4/e/300/
116 KB
116 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/4/e/300/img_4e5cd1d3eaae222e6612692c7f3588671471823.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
6fdfd0350217e59e5b8781a792f99e5f4948cd61bffd5a2d107050535b742f37
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Fri, 05 Mar 2021 06:48:42 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574783
accept-ranges
bytes
content-length
118544
expires
Wed, 07 Apr 2021 15:35:54 GMT
img_e407779bac19d54f96d4dca7a2d4a999510780.jpg
mikiki.ismcdn.jp/mwimgs/e/4/200h/
20 KB
20 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/e/4/200h/img_e407779bac19d54f96d4dca7a2d4a999510780.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
381815549a234946233ca1d17687706c9237a48bd681d7a7a46839a6fdabd232
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Wed, 03 Mar 2021 04:50:58 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574789
accept-ranges
bytes
content-length
20137
expires
Wed, 07 Apr 2021 15:36:00 GMT
img_e52e9982ed27d81317c7a7c406d11662213422.jpg
mikiki.ismcdn.jp/mwimgs/e/5/300/
19 KB
19 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/e/5/300/img_e52e9982ed27d81317c7a7c406d11662213422.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
7db1a059deb7eaaff84dbc174e217c6beae3119958974191f8ff74035662c7c5
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 10 Nov 2020 10:19:26 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2557423
accept-ranges
bytes
content-length
19418
expires
Wed, 07 Apr 2021 10:46:34 GMT
img_50e819db601ee27e9125c8a8e9c945c0648736.jpg
mikiki.ismcdn.jp/mwimgs/5/0/300/
41 KB
41 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/5/0/300/img_50e819db601ee27e9125c8a8e9c945c0648736.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
74880a11dde584d814bb20e35fa49fc35fee16d0d70739a0f9ec9f42b52e6da6
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 01 Mar 2021 08:47:32 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
41958
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_cdca2e283fcfb4bad846962c0af4f16e174401.jpg
mikiki.ismcdn.jp/mwimgs/c/d/656/
35 KB
36 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/c/d/656/img_cdca2e283fcfb4bad846962c0af4f16e174401.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f70ac3ecd2cc6dced5f0737c0cef21172b32742b6df25d3914d649431b3282a8
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 09:10:47 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
36172
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_0f67a4d7dbf0923ec0a37530aa34ef3d350161.jpg
mikiki.ismcdn.jp/mwimgs/0/f/306/
19 KB
20 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/0/f/306/img_0f67a4d7dbf0923ec0a37530aa34ef3d350161.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
84742406211d501cb400be272ff2541cb471d1ac7f00ca18e9f17994784ab854
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 08 Mar 2021 06:13:51 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
19753
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_6d08563448d20bad9371a7528338bd7d1109338.jpg
mikiki.ismcdn.jp/mwimgs/6/d/306/
87 KB
88 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/6/d/306/img_6d08563448d20bad9371a7528338bd7d1109338.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24311e77bf10fc95e4335c266da892bc5b040c3e75e71610364d4d5e38608d80
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 03:31:02 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
89265
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_be6ddc12a611b0a3192fbeeb988205122287962.jpg
mikiki.ismcdn.jp/mwimgs/b/e/204h/
65 KB
65 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/b/e/204h/img_be6ddc12a611b0a3192fbeeb988205122287962.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
75337859f0f8473575bb917cf9796d617c6f5d1201201857603b54883e862e7a
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 01:56:14 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2557388
accept-ranges
bytes
content-length
66114
expires
Wed, 07 Apr 2021 10:45:59 GMT
img_7b18e9c6f970d7e266171b643112cad41315554.jpg
mikiki.ismcdn.jp/mwimgs/7/b/204h/
28 KB
29 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/7/b/204h/img_7b18e9c6f970d7e266171b643112cad41315554.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
ed44128a6249013474677c66b97ab04b94be57282b3440557aa61373cf391cd4
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 01:30:16 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
29016
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_4e5cd1d3eaae222e6612692c7f3588671471823.jpg
mikiki.ismcdn.jp/mwimgs/4/e/306/
119 KB
120 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/4/e/306/img_4e5cd1d3eaae222e6612692c7f3588671471823.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
12f0516c538da8b778e131b5cc78f3d1704a9aa2ad978c09a0788bcf1eb48c4f
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Fri, 05 Mar 2021 06:48:42 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2557464
accept-ranges
bytes
content-length
121922
expires
Wed, 07 Apr 2021 10:47:15 GMT
img_2125ae47d8382a15892a6f6f38778c7e981925.jpg
mikiki.ismcdn.jp/mwimgs/2/1/204h/
21 KB
22 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/2/1/204h/img_2125ae47d8382a15892a6f6f38778c7e981925.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e9650ac862cd31bc5454fa33b09ea0e9cdced0832046baa3e57b31ab14dee790
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 01 Mar 2021 06:46:38 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
21910
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_296c40f62859ff88cafbdad99e64ba7b1525483.jpg
mikiki.ismcdn.jp/mwimgs/2/9/204h/
37 KB
37 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/2/9/204h/img_296c40f62859ff88cafbdad99e64ba7b1525483.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e403cb530c23803c0b2150054a5bd4f748ddffab53b2f09ccb504797a2799a52
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 01 Mar 2021 05:55:09 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574781
accept-ranges
bytes
content-length
37420
expires
Wed, 07 Apr 2021 15:35:52 GMT
img_06ac6fc8f87a4bf63e6c3bf620e873621926742.jpg
mikiki.ismcdn.jp/mwimgs/0/6/306/
84 KB
85 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/0/6/306/img_06ac6fc8f87a4bf63e6c3bf620e873621926742.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
69820d30b120213adac093371b52bb88a228fb75f70f607fdffb29d647a7c0e3
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 01 Mar 2021 03:42:12 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2557451
accept-ranges
bytes
content-length
86295
expires
Wed, 07 Apr 2021 10:47:02 GMT
img_21f85bb2c3583f5d394099c9ae0d7f961120941.jpg
mikiki.ismcdn.jp/mwimgs/2/1/204h/
33 KB
33 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/2/1/204h/img_21f85bb2c3583f5d394099c9ae0d7f961120941.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
1a308dd0f7c1a198f533fc66b2489ecf916364d4453dcc0f10e81253b07bbc8f
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 01 Mar 2021 01:54:18 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574759
accept-ranges
bytes
content-length
33920
expires
Wed, 07 Apr 2021 15:35:30 GMT
img_e407779bac19d54f96d4dca7a2d4a999510780.jpg
mikiki.ismcdn.jp/mwimgs/e/4/204h/
21 KB
22 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/e/4/204h/img_e407779bac19d54f96d4dca7a2d4a999510780.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
4f195670c50e2fa56f045ca14d786c4516e48680f5d48b932e25223d26c42ea9
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Wed, 03 Mar 2021 04:50:58 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2557433
accept-ranges
bytes
content-length
21809
expires
Wed, 07 Apr 2021 10:46:44 GMT
img_d9af183b9c90b6cacd629b954c4281ee753304.jpg
mikiki.ismcdn.jp/mwimgs/d/9/306/
53 KB
54 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/d/9/306/img_d9af183b9c90b6cacd629b954c4281ee753304.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
52c0ccea6c43f3f55b7b3055fe62633bd098da5bc9f0c0e7dc15351a3ebd8bf5
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Fri, 26 Feb 2021 02:19:31 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
54703
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_1c55528e022adf8230758845df77c168593345.jpg
mikiki.ismcdn.jp/mwimgs/1/c/204h/
19 KB
20 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/1/c/204h/img_1c55528e022adf8230758845df77c168593345.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
c95cc12ff703311f30e416670dd4fb4b53f48228d8252809e9b6793658b820a6
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Fri, 26 Feb 2021 08:43:44 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574786
accept-ranges
bytes
content-length
19913
expires
Wed, 07 Apr 2021 15:35:57 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
140 KB
50 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:827::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
60b55bef2079fa578b7ac3cd7716bf64978dd634eaa7dbb4eabf49a23a3e6bf0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
50418
x-xss-protection
0
server
cafe
etag
1742501760674321009
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Mon, 08 Mar 2021 20:22:51 GMT
img_9fcca91980620231fcce37173aa0dd9137404.jpg
mikiki.tokyo.jp/mwimgs/9/f/-/
36 KB
36 KB
Image
General
Full URL
https://mikiki.tokyo.jp/mwimgs/9/f/-/img_9fcca91980620231fcce37173aa0dd9137404.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
202.238.151.85 Mito, Japan, ASN2497 (IIJ Internet Initiative Japan Inc., JP),
Reverse DNS
85.151.238.202.rev.ismedia.jp
Software
/
Resource Hash
9a3fae2cfb90b70e07d2be716d7a5e0fa03d38187a7b5997f468ad165984daf6
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Fri, 28 Feb 2020 10:40:55 GMT
strict-transport-security
max-age=31536000
x-cache
MISS
content-type
image/jpeg
cache-control
max-age=2592000
accept-ranges
bytes
content-length
36470
expires
Wed, 07 Apr 2021 20:22:51 GMT
img_0f67a4d7dbf0923ec0a37530aa34ef3d350161.jpg
mikiki.ismcdn.jp/mwimgs/0/f/300w/
19 KB
19 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/0/f/300w/img_0f67a4d7dbf0923ec0a37530aa34ef3d350161.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
d715510a3b75dbb49447388a3879adcc2ff16288660edaec33297fdc791e9f14
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 08 Mar 2021 06:13:51 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
19196
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_cdca2e283fcfb4bad846962c0af4f16e174401.jpg
mikiki.ismcdn.jp/mwimgs/c/d/300w/
9 KB
10 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/c/d/300w/img_cdca2e283fcfb4bad846962c0af4f16e174401.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a8fa3a966a15c343e0e0b5345ec3faf05f426953a489a47e120874a8a17a4b06
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 09:10:47 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574771
accept-ranges
bytes
content-length
9588
expires
Wed, 07 Apr 2021 15:35:42 GMT
img_e52e9982ed27d81317c7a7c406d11662213422.jpg
mikiki.ismcdn.jp/mwimgs/e/5/300w/
19 KB
19 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/e/5/300w/img_e52e9982ed27d81317c7a7c406d11662213422.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
7db1a059deb7eaaff84dbc174e217c6beae3119958974191f8ff74035662c7c5
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 10 Nov 2020 10:19:26 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
19418
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_97c2133c5d8b5d072fb75913c93546b8361024.jpg
mikiki.ismcdn.jp/mwimgs/9/7/200h/
11 KB
12 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/9/7/200h/img_97c2133c5d8b5d072fb75913c93546b8361024.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a10d0a9605dae963bb09f894f68440c4fdb763d7812479da03192f29ed604d6c
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Mar 2021 00:58:35 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
11605
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_9851d4908d6952af1d8bb1696f604947894000.jpg
mikiki.ismcdn.jp/mwimgs/9/8/300w/
38 KB
39 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/9/8/300w/img_9851d4908d6952af1d8bb1696f604947894000.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f70dcbde22b510a13b9b6b7b45c10283b117b52beaa988d5572b2309e79f8b70
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 01 Mar 2021 02:44:45 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574815
accept-ranges
bytes
content-length
39240
expires
Wed, 07 Apr 2021 15:36:26 GMT
img_074e23f3d0274ef5dff8608354b7de661498300.jpg
mikiki.ismcdn.jp/mwimgs/0/7/300w/
22 KB
23 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/0/7/300w/img_074e23f3d0274ef5dff8608354b7de661498300.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
8c42b5289a4d8ae62e65b6d66929be24554f30df2489575da558f6fd9ecab17b
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Sat, 27 Feb 2021 02:05:33 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
22974
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_e2e8b94ced8bedc3d8a896aaedb853ec518316.jpg
mikiki.ismcdn.jp/mwimgs/e/2/300w/
34 KB
34 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/e/2/300w/img_e2e8b94ced8bedc3d8a896aaedb853ec518316.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
81364ada25ee1adce36bc949b31a4f62390be00b737360b5bd34f3f8dee3e5f2
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Fri, 26 Feb 2021 02:42:27 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574809
accept-ranges
bytes
content-length
34884
expires
Wed, 07 Apr 2021 15:36:20 GMT
img_cf830c3fa0fd53d6150848ca4002f77c1114386.jpg
mikiki.ismcdn.jp/mwimgs/c/f/300w/
58 KB
59 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/c/f/300w/img_cf830c3fa0fd53d6150848ca4002f77c1114386.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
18726fffed172612c473de6357643cf6ab40f89593715c24de0d0dd4fb3a0053
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 22 Feb 2021 04:10:47 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
59640
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_bec4c3aa9664da4a69da7b5467512178150821.jpg
mikiki.ismcdn.jp/mwimgs/b/e/90/
2 KB
2 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/b/e/90/img_bec4c3aa9664da4a69da7b5467512178150821.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
80c62b0a4e96b17409ffed681d534afb963b4fc5de60f0f4fd041b7f5ae8cf5d
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Wed, 03 Mar 2021 08:12:05 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574791
accept-ranges
bytes
content-length
1952
expires
Wed, 07 Apr 2021 15:36:02 GMT
img_c298d84d003779fa43558636d132dba452965.jpg
mikiki.ismcdn.jp/mwimgs/c/2/90/
2 KB
2 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/c/2/90/img_c298d84d003779fa43558636d132dba452965.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
71566062654b378f99beb62d6276d698d2f07fcb890094b0f47b57038b9ef20a
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Thu, 04 Mar 2021 05:04:21 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574779
accept-ranges
bytes
content-length
2300
expires
Wed, 07 Apr 2021 15:35:50 GMT
img_6ae23b92c5c6bb01646db6c0e56c9d65376925.jpg
mikiki.ismcdn.jp/mwimgs/6/a/90/
7 KB
7 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/6/a/90/img_6ae23b92c5c6bb01646db6c0e56c9d65376925.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
121505befcac12a9d72105f1e6d6477d9206fb49be464203bc91edad32b0488e
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Sat, 27 Feb 2021 15:10:43 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574757
accept-ranges
bytes
content-length
7278
expires
Wed, 07 Apr 2021 15:35:28 GMT
img_902e6148ce6a54e1053ffe51cd16d4d1467856.jpg
mikiki.ismcdn.jp/mwimgs/9/0/90/
4 KB
4 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/9/0/90/img_902e6148ce6a54e1053ffe51cd16d4d1467856.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
903ebcc442e68d7d34c93992f61238cb71bd835750a6eeded77d9263b53404e3
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Wed, 24 Feb 2021 14:25:56 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574786
accept-ranges
bytes
content-length
4150
expires
Wed, 07 Apr 2021 15:35:57 GMT
logo.png
mikiki.ismcdn.jp/common/images/v1/common/
11 KB
11 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/common/images/v1/common/logo.png
Requested by
Host: mikiki.ismcdn.jp
URL: https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
92f43f973ef8f5f77674b630315d12f7c98231781db153f105cfa27892919e5a
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Thu, 03 Apr 2014 04:02:53 GMT
strict-transport-security
max-age=31536000
content-type
image/png
cache-control
max-age=1529996
accept-ranges
bytes
content-length
11549
expires
Fri, 26 Mar 2021 13:22:47 GMT
twitter-64.png
mikiki.ismcdn.jp/common/images/v2/smartphone/
2 KB
2 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/common/images/v2/smartphone/twitter-64.png
Requested by
Host: mikiki.ismcdn.jp
URL: https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
4780e97366c6ff82b5b343790403b4b1ec82d71fbd1ac3197eff58db2a741ff5
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 22 Jan 2018 08:24:35 GMT
strict-transport-security
max-age=31536000
content-type
image/png
cache-control
max-age=1529971
accept-ranges
bytes
content-length
2192
expires
Fri, 26 Mar 2021 13:22:22 GMT
facebook.png
mikiki.ismcdn.jp/common/images/v2/smartphone/
507 B
681 B
Image
General
Full URL
https://mikiki.ismcdn.jp/common/images/v2/smartphone/facebook.png
Requested by
Host: mikiki.ismcdn.jp
URL: https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
0c7f4e126e6aec99c81a4e028af8298f57adb74c076e32b7b26ab2348c583c13
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Thu, 18 Feb 2016 05:21:25 GMT
strict-transport-security
max-age=31536000
content-type
image/png
cache-control
max-age=1413526
accept-ranges
bytes
content-length
507
expires
Thu, 25 Mar 2021 05:01:37 GMT
instagram.png
mikiki.ismcdn.jp/common/images/v2/smartphone/
2 KB
2 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/common/images/v2/smartphone/instagram.png
Requested by
Host: mikiki.ismcdn.jp
URL: https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
038f43445c562255485068792532173e886a194532dbf02ebb2587ffa57ce1b1
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 21 Jul 2020 23:17:34 GMT
strict-transport-security
max-age=31536000
content-type
image/png
cache-control
max-age=1413873
accept-ranges
bytes
content-length
1878
expires
Thu, 25 Mar 2021 05:07:24 GMT
youtube.png
mikiki.ismcdn.jp/common/images/v2/smartphone/
678 B
852 B
Image
General
Full URL
https://mikiki.ismcdn.jp/common/images/v2/smartphone/youtube.png
Requested by
Host: mikiki.ismcdn.jp
URL: https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a3cee1c9cbe0d4fcf88256885309065038c298e4ff9ba69ddb97cf4dc0444b4d
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Thu, 18 Feb 2016 05:25:14 GMT
strict-transport-security
max-age=31536000
content-type
image/png
cache-control
max-age=1529995
accept-ranges
bytes
content-length
678
expires
Fri, 26 Mar 2021 13:22:46 GMT
icon_search.png
mikiki.ismcdn.jp/common/images/v1/common/
845 B
1019 B
Image
General
Full URL
https://mikiki.ismcdn.jp/common/images/v1/common/icon_search.png
Requested by
Host: mikiki.ismcdn.jp
URL: https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
2ff10c6363a69cf8336818b7558b29b70f038943f375fb7f565b952121c7d873
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Wed, 05 Feb 2014 08:45:38 GMT
strict-transport-security
max-age=31536000
content-type
image/png
cache-control
max-age=1529940
accept-ranges
bytes
content-length
845
expires
Fri, 26 Mar 2021 13:21:51 GMT
bg_top_review.png
mikiki.ismcdn.jp/common/images/v1/main_column/
248 B
422 B
Image
General
Full URL
https://mikiki.ismcdn.jp/common/images/v1/main_column/bg_top_review.png
Requested by
Host: mikiki.ismcdn.jp
URL: https://mikiki.ismcdn.jp/resources/mikiki/css/v1/indexes-main-contents.css?rd=202101291537
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
3a1358389b9a4a5a965b07f8383ea26b525d6769215bfdf5f8fefba4281facb7
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/indexes-main-contents.css?rd=202101291537
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Wed, 05 Feb 2014 03:33:46 GMT
strict-transport-security
max-age=31536000
content-type
image/png
cache-control
max-age=2557473
accept-ranges
bytes
content-length
248
expires
Wed, 07 Apr 2021 10:47:24 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.118.woff2
fonts.gstatic.com/s/notosansjp/v28/
13 KB
13 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.118.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
602a5dcd9d2f9dcfbc4d874ca1cb678980d0bd438f059baf655ec1738407dd44
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 09:17:59 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:33:18 GMT
server
sffe
age
385492
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13688
x-xss-protection
0
expires
Fri, 04 Mar 2022 09:17:59 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.119.woff2
fonts.gstatic.com/s/notosansjp/v28/
51 KB
51 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.119.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
07897cb289ad971fc16117c1aa87d8e34b12bebb64c86e12e23da3c3844820d0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:25:51 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:50 GMT
server
sffe
age
7020
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
52024
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:25:51 GMT
KFOmCnqEu92Fr1Mu4mxK.woff2
fonts.gstatic.com/s/roboto/v20/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu4mxK.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css?family=Roboto
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
48c3fa6f86c54f1d9bb519220713d4b0a1f8cd1a589a3c03b9fa82e98ecb13e3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:51:47 GMT
x-content-type-options
nosniff
last-modified
Wed, 24 Jul 2019 01:18:36 GMT
server
sffe
age
5464
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15736
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:51:47 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.119.woff2
fonts.gstatic.com/s/notosansjp/v28/
50 KB
50 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.119.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
839c37491e75f874f27d008facea2ca67a0ee1ac4b4cf08cea849cd867f8a481
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 03:14:19 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:33:20 GMT
server
sffe
age
407312
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
51132
x-xss-protection
0
expires
Fri, 04 Mar 2022 03:14:19 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.116.woff2
fonts.gstatic.com/s/notosansjp/v28/
12 KB
12 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.116.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
b8d0ac62da50fbb0597add996c2b8d95945197f8eba1d0ae58b4c775f36a0682
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 06:40:35 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:33:30 GMT
server
sffe
age
222136
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
12188
x-xss-protection
0
expires
Sun, 06 Mar 2022 06:40:35 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.114.woff2
fonts.gstatic.com/s/notosansjp/v28/
11 KB
12 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.114.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
f79f9e37e32f2b785374b23de144789aa3a51890f6f988f0775b8d314a1031f1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 06:37:27 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:33:34 GMT
server
sffe
age
222324
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
11452
x-xss-protection
0
expires
Sun, 06 Mar 2022 06:37:27 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.118.woff2
fonts.gstatic.com/s/notosansjp/v28/
13 KB
13 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.118.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
17c4f63a5838d55a80ee56b453f14000af4ff8cc00b477d7c0f3f345100630d1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 10:51:15 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:33:39 GMT
server
sffe
age
207096
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13692
x-xss-protection
0
expires
Sun, 06 Mar 2022 10:51:15 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.111.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.111.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
27eb0cd78766a34130a0576edab8a592ac7185cb1392d0f16fb04e858b2e9ec5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:15:40 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:23:06 GMT
server
sffe
age
7631
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14012
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:15:40 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.117.woff2
fonts.gstatic.com/s/notosansjp/v28/
9 KB
10 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.117.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
fa455fe41339aea4896b1bd254c9aaf0526e157ef2987c931fd3fc304e2773ab
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 04:32:52 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:33:39 GMT
server
sffe
age
316199
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
9672
x-xss-protection
0
expires
Sat, 05 Mar 2022 04:32:52 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.113.woff2
fonts.gstatic.com/s/notosansjp/v28/
12 KB
12 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.113.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
bb915b7278248012753d418ea0bf6b8f24ada7be9e8ff65c8f1f93ca5edc30ad
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 07:00:21 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:23:14 GMT
server
sffe
age
307350
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
12532
x-xss-protection
0
expires
Sat, 05 Mar 2022 07:00:21 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.112.woff2
fonts.gstatic.com/s/notosansjp/v28/
12 KB
12 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.112.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a1db447d5fded04e406067127a27914776541c23f49e9bb9a2e11229a8e9267b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 12:57:26 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:11:35 GMT
server
sffe
age
372325
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
12608
x-xss-protection
0
expires
Fri, 04 Mar 2022 12:57:26 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.110.woff2
fonts.gstatic.com/s/notosansjp/v28/
13 KB
13 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.110.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
4dcda0daa519f52435cb137ffbdb0afb5e5ca8129924ea8819525f06c64e2862
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 12:58:00 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:51 GMT
server
sffe
age
372291
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13064
x-xss-protection
0
expires
Fri, 04 Mar 2022 12:58:00 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.98.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.98.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
eca5e4b773a1f5bbcad549433d6f8b1374e1847e3d3ff6de6fdd7a3aa4625cb5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 02:36:24 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:21:11 GMT
server
sffe
age
323187
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15032
x-xss-protection
0
expires
Sat, 05 Mar 2022 02:36:24 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.93.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.93.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
38a465fa1ef5d0746ddaebad5638abc8ba0946f455fb07b60a3c86c209254622
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 11:07:17 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:11:34 GMT
server
sffe
age
206134
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14260
x-xss-protection
0
expires
Sun, 06 Mar 2022 11:07:17 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.28.woff2
fonts.gstatic.com/s/notosansjp/v28/
53 KB
53 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.28.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a6c2ef0e5c0908627f62819d7c68325ea2bac8300aadb8d888e513c0d1de5c91
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:19:04 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:22:47 GMT
server
sffe
age
7427
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
54560
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:19:04 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.107.woff2
fonts.gstatic.com/s/notosansjp/v28/
13 KB
13 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.107.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
40f2416a462edde810a860187b5a9d6cbab3ba506239b57e8336f3ffec695ba3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 21:00:40 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:33:34 GMT
server
sffe
age
429731
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13664
x-xss-protection
0
expires
Thu, 03 Mar 2022 21:00:40 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.90.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.90.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a7f4f3c218bfc61533c17194e7f72767d8407cfaa712d301de5ca05e8b725446
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 05:34:15 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:08:09 GMT
server
sffe
age
398916
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16004
x-xss-protection
0
expires
Fri, 04 Mar 2022 05:34:15 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.115.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.115.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
8b697c38acad2b459608fd707c78357fc6d91dbac39edfcc031f2df5d4798b14
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 10:47:29 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:21:14 GMT
server
sffe
age
207322
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13844
x-xss-protection
0
expires
Sun, 06 Mar 2022 10:47:29 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.117.woff2
fonts.gstatic.com/s/notosansjp/v28/
9 KB
9 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.117.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
ad0f62c75cc9e9553001b7dea1bec37dd09f8eb23e7f11c5256ac3aea219f6d3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 05:53:10 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:14:49 GMT
server
sffe
age
311381
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
9484
x-xss-protection
0
expires
Sat, 05 Mar 2022 05:53:10 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.109.woff2
fonts.gstatic.com/s/notosansjp/v28/
12 KB
12 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.109.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
ef796289bb6aba587bc8a2b913252782dc74f671ffa1adbf4cff2ea98302e68e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 15:24:09 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:23:11 GMT
server
sffe
age
536322
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
11892
x-xss-protection
0
expires
Wed, 02 Mar 2022 15:24:09 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.84.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.84.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
8f0ec2741f6dc9472d183a72eea92897e37c492d39e8e04052e2662162f98575
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 21:02:41 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:18:02 GMT
server
sffe
age
429610
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15360
x-xss-protection
0
expires
Thu, 03 Mar 2022 21:02:41 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.101.woff2
fonts.gstatic.com/s/notosansjp/v28/
13 KB
13 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.101.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
fa376a12bf886dcd556dd537d3dd546e55af1217ea2c05bdc7e5eb628d93fbc8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:27:23 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:14:27 GMT
server
sffe
age
6928
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13428
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:27:23 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.67.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.67.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
02b081c8a5b07b09d49dc204fb78065b2e965fb5a7e01d7cf91f2517efb5f55d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 10:31:01 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:17:13 GMT
server
sffe
age
208310
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14740
x-xss-protection
0
expires
Sun, 06 Mar 2022 10:31:01 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.94.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.94.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
2ed4fad10bde60024d26e14073a9c97f29d65b9d92325bb827270a15814bf32b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 23:49:02 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:21:07 GMT
server
sffe
age
419629
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16416
x-xss-protection
0
expires
Thu, 03 Mar 2022 23:49:02 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.100.woff2
fonts.gstatic.com/s/notosansjp/v28/
17 KB
17 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.100.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
cc85d7665430c72ef49021221536a7b8dcd16e8bc0bc11ceb9bac4aa9f5f75d7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 19:45:23 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:08:08 GMT
server
sffe
age
347848
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17224
x-xss-protection
0
expires
Fri, 04 Mar 2022 19:45:23 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.102.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.102.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
e7d83be9624e15a40f0e9957b7989ee1332316cd4964f0b721650d4704108aee
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 06:09:09 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:11:28 GMT
server
sffe
age
396822
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15008
x-xss-protection
0
expires
Fri, 04 Mar 2022 06:09:09 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.92.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.92.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
ffedbcaa8faa8d35694373e2f95bf9948622de67d7819173ff7e411ed869b452
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 03:12:53 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:11:32 GMT
server
sffe
age
320998
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15952
x-xss-protection
0
expires
Sat, 05 Mar 2022 03:12:53 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.99.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.99.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
9fc9f3ab6d39be9fc3843a4b4100b0b8a088f531c4f8c0e47765f202d555bda2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 13:05:08 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:11:34 GMT
server
sffe
age
371863
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16348
x-xss-protection
0
expires
Fri, 04 Mar 2022 13:05:08 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.108.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.108.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
79e06a61e43a37a2237635ecbf0e6e6f572a57adf6ce5308528f92473f1c9b29
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 07:01:24 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:05:24 GMT
server
sffe
age
307287
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15572
x-xss-protection
0
expires
Sat, 05 Mar 2022 07:01:24 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.105.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.105.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
fe00c4967597e1957d5f28ccbe42785bf265355f54aa2c461047aa853285ba56
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 19:45:23 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:23:08 GMT
server
sffe
age
347848
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13860
x-xss-protection
0
expires
Fri, 04 Mar 2022 19:45:23 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.104.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.104.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
dbb59f6b2042d5f803c0c6752a38625c0dc072eb82837974253ff58d39e0a75f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:38:57 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:33:40 GMT
server
sffe
age
6234
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14332
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:38:57 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.85.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.85.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
704230d3ab92cee78199d3d5067699583b67e5f7dfd17c2fb9ab750b1f3a9b3e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 22:29:18 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:05:26 GMT
server
sffe
age
424413
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14420
x-xss-protection
0
expires
Thu, 03 Mar 2022 22:29:18 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.103.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.103.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
963bc082db73b19b5718958d3a3407e076b033261ad320533a838eff1d39313d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 12:30:33 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:23:12 GMT
server
sffe
age
287538
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13864
x-xss-protection
0
expires
Sat, 05 Mar 2022 12:30:33 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.106.woff2
fonts.gstatic.com/s/notosansjp/v28/
18 KB
18 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.106.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a6cf1be12cedd8831630f680f30bde048e4beb31332e5f0d190b0aeb35c0b1bf
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 20:54:26 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:33:28 GMT
server
sffe
age
430105
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
18112
x-xss-protection
0
expires
Thu, 03 Mar 2022 20:54:26 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.86.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.86.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
dd25286bc9bb33ddf9d164a84c9e655fc3a65a957aeca51805ff7b6d7e0da080
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 06:06:21 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:08:28 GMT
server
sffe
age
396990
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14604
x-xss-protection
0
expires
Fri, 04 Mar 2022 06:06:21 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.87.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.87.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
647dcb241a42cc03a0eadeb25707de5c25891d90a2ad791808a6801de69f43a9
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 22:28:59 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:19:23 GMT
server
sffe
age
424432
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16224
x-xss-protection
0
expires
Thu, 03 Mar 2022 22:28:59 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.65.woff2
fonts.gstatic.com/s/notosansjp/v28/
17 KB
17 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.65.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
780274f8d794f07e4a07104888e0d03562be15e6672490a6e50f11bfdc754cc2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 19:11:30 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:44 GMT
server
sffe
age
4281
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17192
x-xss-protection
0
expires
Tue, 08 Mar 2022 19:11:30 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.116.woff2
fonts.gstatic.com/s/notosansjp/v28/
12 KB
12 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.116.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
1002546098510527be307620ac05e89e6378cd4a320eecea2d350362a0c32cfa
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 07:00:18 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:33:12 GMT
server
sffe
age
307353
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
12224
x-xss-protection
0
expires
Sat, 05 Mar 2022 07:00:18 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.114.woff2
fonts.gstatic.com/s/notosansjp/v28/
11 KB
11 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.114.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
0d8755fdd3ad6a0ad8bff8e51a8272640eaa91023bd8439dcafab5c2788718f7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 06:33:05 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:33:14 GMT
server
sffe
age
222586
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
11508
x-xss-protection
0
expires
Sun, 06 Mar 2022 06:33:05 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.76.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.76.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
ca9b887ba8e20019ba43791cec3453809582a349c65a6b7017c9415b258c8969
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 11:04:43 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:08:39 GMT
server
sffe
age
206288
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15476
x-xss-protection
0
expires
Sun, 06 Mar 2022 11:04:43 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.80.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.80.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
3fa3450b07b49b60756b5d852d67fa58d7769943b290d4294e1f4ea50192c60d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 19:48:49 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:18:01 GMT
server
sffe
age
347642
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15152
x-xss-protection
0
expires
Fri, 04 Mar 2022 19:48:49 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.97.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.97.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
ef4cea46477fae80dea705ec8e2d61f0de2702fccdda594ce3c78f6aa844c8e8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 04:44:46 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:21:09 GMT
server
sffe
age
315485
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14928
x-xss-protection
0
expires
Sat, 05 Mar 2022 04:44:46 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.91.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.91.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
536f8d5b5018ae63d2a2a9f10d32547f1bf071e56657d5a95d167c7624ea97de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 04:35:40 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:08:05 GMT
server
sffe
age
316031
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16308
x-xss-protection
0
expires
Sat, 05 Mar 2022 04:35:40 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.78.woff2
fonts.gstatic.com/s/notosansjp/v28/
17 KB
17 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.78.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
ab83b66e358e5ec4f3e7b58365578e10c833ce55b5d1c0f0f12b36400e6460f3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 05:52:59 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:08:32 GMT
server
sffe
age
311392
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17220
x-xss-protection
0
expires
Sat, 05 Mar 2022 05:52:59 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.77.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.77.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
ffaf3f74081130197ac049dd0660e61af0e07ee8cbd11d50ff4ca19305f9e5e2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 07:27:18 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:18:00 GMT
server
sffe
age
564933
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14712
x-xss-protection
0
expires
Wed, 02 Mar 2022 07:27:18 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.41.woff2
fonts.gstatic.com/s/notosansjp/v28/
58 KB
58 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.41.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
64a730449f44153383afa7df6f6892a1bafc9c59e6941f601e071489cf8a568d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 19:52:23 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:15:04 GMT
server
sffe
age
433828
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
58988
x-xss-protection
0
expires
Thu, 03 Mar 2022 19:52:23 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.40.woff2
fonts.gstatic.com/s/notosansjp/v28/
45 KB
45 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.40.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
3782da43615c58e52f2a390f7b5bebe45564bda62993858cddec99c057e84034
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 09:17:58 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:19 GMT
server
sffe
age
212693
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
46020
x-xss-protection
0
expires
Sun, 06 Mar 2022 09:17:58 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.68.woff2
fonts.gstatic.com/s/notosansjp/v28/
17 KB
18 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.68.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
0319ff9a1d32a340bc3e6380f467f9799c3a1e3e94d1dcede1af2c21e90495f0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 02:04:55 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:14:11 GMT
server
sffe
age
411476
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17896
x-xss-protection
0
expires
Fri, 04 Mar 2022 02:04:55 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.73.woff2
fonts.gstatic.com/s/notosansjp/v28/
17 KB
17 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.73.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
76078be6370f737ef226cd3c7a68d28e522605266a790dda8e9a0a7cf5f33e2e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 01:59:10 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:08:23 GMT
server
sffe
age
411821
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17068
x-xss-protection
0
expires
Fri, 04 Mar 2022 01:59:10 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.95.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.95.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
cd31ca1ac038f9d935e771718d78fd8cd60d151484de4bb6d967853606949f24
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 02:41:53 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:21:12 GMT
server
sffe
age
409258
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15264
x-xss-protection
0
expires
Fri, 04 Mar 2022 02:41:53 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.79.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.79.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
d04526c1417802365f624fe4da7b0c16d0209d262918a0488b9a2afcd6a5faf0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 10:51:57 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:19:42 GMT
server
sffe
age
207054
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16736
x-xss-protection
0
expires
Sun, 06 Mar 2022 10:51:57 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.17.woff2
fonts.gstatic.com/s/notosansjp/v28/
65 KB
65 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.17.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
5b477fb9a62da28bbdeeb604b989a411eac04b2681dc6080710cb011eeb170d1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 11:02:41 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:19:30 GMT
server
sffe
age
206410
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
66356
x-xss-protection
0
expires
Sun, 06 Mar 2022 11:02:41 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.96.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.96.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
f7a01079de31377add99cab5139c7a57065a730623677475acaeb4473c716891
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 03:21:55 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:08:09 GMT
server
sffe
age
320456
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16460
x-xss-protection
0
expires
Sat, 05 Mar 2022 03:21:55 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.81.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.81.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
d53831993057b52e14c5d2d158eb0b4466e1b67b73e0f68c3c868209c71fe881
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 04:13:28 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:08:01 GMT
server
sffe
age
403763
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14652
x-xss-protection
0
expires
Fri, 04 Mar 2022 04:13:28 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.109.woff2
fonts.gstatic.com/s/notosansjp/v28/
12 KB
12 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.109.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
b77c8336090d439fead311869670fad2f967de3919f9f99995e7278e755350c7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 01:47:27 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:05:26 GMT
server
sffe
age
326124
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
11932
x-xss-protection
0
expires
Sat, 05 Mar 2022 01:47:27 GMT
arrow_r_wh.png
mikiki.ismcdn.jp/common/images/v1/main_column/
1 KB
1 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/common/images/v1/main_column/arrow_r_wh.png
Requested by
Host: mikiki.ismcdn.jp
URL: https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-aside.css?rd=202101291537
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a62e1e19f797bae213d9eedb678b29644bfaa6ebfd3532fc2ec9829a44ac2e5c
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-aside.css?rd=202101291537
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Fri, 14 Mar 2014 05:00:57 GMT
strict-transport-security
max-age=31536000
content-type
image/png
cache-control
max-age=1530008
accept-ranges
bytes
content-length
1142
expires
Fri, 26 Mar 2021 13:22:59 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.33.woff2
fonts.gstatic.com/s/notosansjp/v28/
47 KB
47 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.33.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
acdfd379ae0662a62840293b1299de5e454132f948233a00818183abad122162
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 20:08:49 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:22:43 GMT
server
sffe
age
346442
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
47840
x-xss-protection
0
expires
Fri, 04 Mar 2022 20:08:49 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.89.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.89.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
ac69e594b591b52adf10ca552340ca61262b8c9099452e514402ec3ad46ad02d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 19:49:54 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:08:04 GMT
server
sffe
age
347577
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15128
x-xss-protection
0
expires
Fri, 04 Mar 2022 19:49:54 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.101.woff2
fonts.gstatic.com/s/notosansjp/v28/
13 KB
13 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.101.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
399031cf526bda363fcb843695a6687e7d52562a525eb3fc3083d4ca8bff3284
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:09:34 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:07 GMT
server
sffe
age
7997
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13388
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:09:34 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.110.woff2
fonts.gstatic.com/s/notosansjp/v28/
13 KB
13 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.110.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
2a01e79481a158efeaebaa1ebb3ad7824106c1d22d991d83cedfe72a30699aa0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 07:15:37 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:14:47 GMT
server
sffe
age
565634
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13064
x-xss-protection
0
expires
Wed, 02 Mar 2022 07:15:37 GMT
img_5df16effdce95bd5fbd2052998cdedc4143796.jpg
mikiki.ismcdn.jp/mwimgs/5/d/90/
2 KB
2 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/5/d/90/img_5df16effdce95bd5fbd2052998cdedc4143796.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
ed6199d3f98434199672f81bc3d017bf8b39783b55ff20a83d39e9245a45cdfd
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Fri, 19 Feb 2021 07:22:20 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
1680
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_585d479cd1c6848f69af10e4e92d24d025441.jpg
mikiki.ismcdn.jp/mwimgs/5/8/300/
11 KB
11 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/5/8/300/img_585d479cd1c6848f69af10e4e92d24d025441.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
7ab0d37786f689c3f5450e8f9b79587273e43a77c28400b919b8b54cecab303b
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Wed, 23 Dec 2020 07:24:57 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
11535
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_56759d0307034cc3c6cce9e0d9c574c310187.gif
mikiki.ismcdn.jp/mwimgs/5/6/300/
10 KB
10 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/5/6/300/img_56759d0307034cc3c6cce9e0d9c574c310187.gif
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
8e79f0f86567cba4bad1a98a1ab02344283e18b05bebeda53bba3b3ee0d9de6d
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 10 Dec 2019 05:37:14 GMT
strict-transport-security
max-age=31536000
content-type
image/gif
cache-control
max-age=2574814
accept-ranges
bytes
content-length
10187
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_7b5c6b810100e63edf746849754cc2778446.jpg
mikiki.ismcdn.jp/mwimgs/7/b/300/
7 KB
8 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/7/b/300/img_7b5c6b810100e63edf746849754cc2778446.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
35d356b9605183c89a9dbdd9af51d6bf2889cee00bebe8261989c6c25cffcba7
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Fri, 12 Jul 2019 07:23:27 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2557467
accept-ranges
bytes
content-length
7549
expires
Wed, 07 Apr 2021 10:47:18 GMT
img_74defc4e2e700b1564f1d1f1ff01aaba12530.jpg
mikiki.ismcdn.jp/mwimgs/7/4/300/
11 KB
12 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/7/4/300/img_74defc4e2e700b1564f1d1f1ff01aaba12530.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
68ab2e2b626e9146a8e5623a2ea252961aec1cbd2c1a5772ca814d79f1a5ebd1
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Wed, 03 Jul 2019 12:19:18 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
11635
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_4e075572a17b4e2013bbc9511dcf048f19363.jpg
mikiki.ismcdn.jp/mwimgs/4/e/300/
18 KB
18 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/4/e/300/img_4e075572a17b4e2013bbc9511dcf048f19363.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a46ace2a5413297c15a062ee6f63480c2f8367a9c9e890b6239707ad5e2fe198
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 25 Feb 2019 08:06:18 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
18512
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_3aab23d8298ae2095174ddd01e1b88b418525.jpg
mikiki.ismcdn.jp/mwimgs/3/a/300/
17 KB
18 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/3/a/300/img_3aab23d8298ae2095174ddd01e1b88b418525.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
1a797bae9016a965652f72866a9a83bb9d3e6482d398e4f1b47362ba79e59e8f
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 02 Jun 2020 06:48:36 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
17751
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_c89cc54feaf3037beb7aa78bc284a9e115466.jpg
mikiki.ismcdn.jp/mwimgs/c/8/300/
15 KB
15 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/c/8/300/img_c89cc54feaf3037beb7aa78bc284a9e115466.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
75b4819451c72c56bb987fead00c3e70b3cb58662d6772e588c6bb079fd678cc
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Tue, 01 May 2018 05:31:49 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
15117
expires
Wed, 07 Apr 2021 15:36:25 GMT
img_5ac730b3e138f5595b6f959bbb6d26cd16002.jpg
mikiki.ismcdn.jp/mwimgs/5/a/300/
15 KB
15 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/5/a/300/img_5ac730b3e138f5595b6f959bbb6d26cd16002.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
ffd3931ebc92ffc205407140029266f4b893c0cde11b60ec79e2ec65e2cc6d17
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Wed, 09 May 2018 10:11:47 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574786
accept-ranges
bytes
content-length
15610
expires
Wed, 07 Apr 2021 15:35:57 GMT
img_dac41b561645bdd33bf0e4e2e99ab13d12593.jpg
mikiki.ismcdn.jp/mwimgs/d/a/300/
11 KB
11 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/d/a/300/img_dac41b561645bdd33bf0e4e2e99ab13d12593.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
788b50e1f819295a9f72be1bad0e51fb0b08bebb2ce82b0a416eb110eb77dd71
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Mon, 13 Apr 2020 07:44:17 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
11333
expires
Wed, 07 Apr 2021 15:36:25 GMT
change-for-smartphone.png
mikiki.tokyo.jp/common/images/v1/common/
11 KB
11 KB
Image
General
Full URL
https://mikiki.tokyo.jp/common/images/v1/common/change-for-smartphone.png
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
202.238.151.85 Mito, Japan, ASN2497 (IIJ Internet Initiative Japan Inc., JP),
Reverse DNS
85.151.238.202.rev.ismedia.jp
Software
/
Resource Hash
feebc60eac47c130da1c092054b72f88834570a0b6ea0278d607824c35a7a715
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:13:53 GMT
last-modified
Wed, 26 Mar 2014 03:56:22 GMT
strict-transport-security
max-age=31536000
x-cache
HIT
content-type
image/png
cache-control
max-age=2592000
accept-ranges
bytes
content-length
11575
expires
Wed, 07 Apr 2021 20:13:53 GMT
jquery-ui.min.js
ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/
223 KB
60 KB
Script
General
Full URL
https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:82a::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
9671f8be70ad94a5362e60f4656d5d53ba214d32ab70a3f9d1603d7dadf9d1c1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 13:04:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
458287
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
60529
x-xss-protection
0
last-modified
Tue, 03 Mar 2020 19:15:00 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
public, max-age=31536000, stale-while-revalidate=2592000
accept-ranges
bytes
timing-allow-origin
*
expires
Thu, 03 Mar 2022 13:04:44 GMT
jquery.cycle2.min.js
mikiki.ismcdn.jp/common/js/v1/lib/
22 KB
7 KB
Script
General
Full URL
https://mikiki.ismcdn.jp/common/js/v1/lib/jquery.cycle2.min.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
13f57dff9e0354e3eff3e49b137b1ae644afdc03b0de3038fd106f61450712df
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
last-modified
Thu, 06 Feb 2014 11:41:41 GMT
vary
Accept-Encoding
content-type
application/javascript
cache-control
max-age=1409676
strict-transport-security
max-age=31536000
accept-ranges
bytes
x-robots-tag
noindex
content-length
6944
expires
Thu, 25 Mar 2021 03:57:27 GMT
easyselectbox.min.js
mikiki.ismcdn.jp/common/js/v1/lib/
5 KB
2 KB
Script
General
Full URL
https://mikiki.ismcdn.jp/common/js/v1/lib/easyselectbox.min.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
57a97aa24102de07c40b8a02a5ea68bdfc09c9cf72bc59f32359389abdcddd3d
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
last-modified
Mon, 15 Apr 2013 11:20:22 GMT
vary
Accept-Encoding
content-type
application/javascript
cache-control
max-age=1409841
strict-transport-security
max-age=31536000
accept-ranges
bytes
x-robots-tag
noindex
content-length
1747
expires
Thu, 25 Mar 2021 04:00:12 GMT
jquery.tile.js
mikiki.ismcdn.jp/common/js/v1/lib/tile/
894 B
696 B
Script
General
Full URL
https://mikiki.ismcdn.jp/common/js/v1/lib/tile/jquery.tile.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
207214785c1e3df58ae12a6cd49217fd7990f4260b7b45e2710e2bdc97c71c71
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
last-modified
Thu, 01 Aug 2013 04:47:54 GMT
vary
Accept-Encoding
content-type
application/javascript
cache-control
max-age=1409680
strict-transport-security
max-age=31536000
accept-ranges
bytes
x-robots-tag
noindex
content-length
476
expires
Thu, 25 Mar 2021 03:57:31 GMT
jquery.zoomcycle.js
mikiki.ismcdn.jp/resources/mikiki/js/v1/lib/
6 KB
2 KB
Script
General
Full URL
https://mikiki.ismcdn.jp/resources/mikiki/js/v1/lib/jquery.zoomcycle.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
361e88a70c1ddc6a37ca8acda0386d76e35c36ef4f577c21f363b3be6a45971b
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
7200.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 29 Sep 2020 00:47:10 GMT
x-frame-options
SAMEORIGIN
content-type
application/x-javascript; charset=utf-8
cache-control
max-age=51796
strict-transport-security
max-age=31536000
accept-ranges
bytes
x-robots-tag
noindex
vary
Accept-Encoding
content-length
1336
x-xss-protection
1; mode=block
x-request-id
d3ecde75-ef78-4f19-b8e2-904855f130b0
common.js
mikiki.ismcdn.jp/resources/mikiki/js/v1/
10 KB
3 KB
Script
General
Full URL
https://mikiki.ismcdn.jp/resources/mikiki/js/v1/common.js?rd=202101291537
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
1f01d8b5448c4c9c6d510fffd2c76a83dd05655810cafb8b279b66e0bc5cd060
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
7200.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 29 Sep 2020 00:47:10 GMT
x-frame-options
SAMEORIGIN
content-type
application/x-javascript; charset=utf-8
cache-control
max-age=74469
strict-transport-security
max-age=31536000
accept-ranges
bytes
vary
Accept-Encoding
content-length
3101
x-xss-protection
1; mode=block
x-request-id
5ab5ad1b-f6a1-47b0-b0ce-4d057ab6595f
indexes.js
mikiki.ismcdn.jp/resources/mikiki/js/v1/
2 KB
1 KB
Script
General
Full URL
https://mikiki.ismcdn.jp/resources/mikiki/js/v1/indexes.js?rd=202101291537
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
10086058dc794cce0f77a450c0c786a398c69dc3aa8de62577488d01751dc3e4
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
7200.000
date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 29 Sep 2020 00:47:10 GMT
x-frame-options
SAMEORIGIN
content-type
application/x-javascript; charset=utf-8
cache-control
max-age=69177
strict-transport-security
max-age=31536000
accept-ranges
bytes
vary
Accept-Encoding
content-length
927
x-xss-protection
1; mode=block
x-request-id
829fd3a4-c228-4277-927e-0795e04e902d
l.js
mikiki.tokyo.jp/oo/mk/
1 KB
835 B
Script
General
Full URL
https://mikiki.tokyo.jp/oo/mk/l.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
202.238.151.85 Mito, Japan, ASN2497 (IIJ Internet Initiative Japan Inc., JP),
Reverse DNS
85.151.238.202.rev.ismedia.jp
Software
Apache /
Resource Hash
5909f0444c677035061cb1de7123015d564fb2145c0e2078200d65aac3a1af9b
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
last-modified
Thu, 20 Mar 2014 11:41:17 GMT
server
Apache
vary
Accept-Encoding
content-type
text/javascript
cache-control
max-age=604800
strict-transport-security
max-age=31536000
accept-ranges
bytes
content-length
635
expires
Mon, 15 Mar 2021 20:22:51 GMT
share.js
platform.tumblr.com/v1/
96 B
370 B
Script
General
Full URL
https://platform.tumblr.com/v1/share.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
74.114.154.15 Ashburn, United States, ASN2635 (AUTOMATTIC, US),
Reverse DNS
Software
openresty /
Resource Hash
f319b50da1af65c0162ca5c14973a2a15ee89d1d27ab539141c172b9478ee54b

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

pragma
public
date
Mon, 08 Mar 2021 20:22:52 GMT
content-encoding
br
last-modified
Fri, 26 Feb 2021 10:18:31 GMT
server
openresty
etag
W/"6038caf7-60"
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
max-age=3600, immutable
timing-allow-origin
*
expires
Mon, 08 Mar 2021 21:22:52 GMT
bookmark_button.js
b.st-hatena.com/js/
35 KB
11 KB
Script
General
Full URL
https://b.st-hatena.com/js/bookmark_button.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.96.38 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx /
Resource Hash
f5533dc1e890e99b74930d8f462d013ad2aeff9a6fb7f673ce6eba3deb107ae7
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

strict-transport-security
max-age=31536000; includeSubDomains; preload
content-encoding
gzip
etag
W/"603dd641-8af2"
age
34051
x-cache
Hit from cloudfront
access-control-allow-origin
https://b.hatena.ne.jp
last-modified
Tue, 02 Mar 2021 06:08:01 GMT
server
nginx
date
Mon, 08 Mar 2021 10:55:20 GMT
vary
Accept-Encoding
content-type
application/x-javascript
via
1.1 bb390afd921c223e0fe4921fbc23bbe8.cloudfront.net (CloudFront)
cache-control
max-age=86400
x-amz-cf-pop
PRG50-C1
x-amz-cf-id
31qx8i9VsyK9goa_DetqgK-Cpfpm0PsXXQk8KO-gUsW9CtEBHIlg5g==
expires
Tue, 09 Mar 2021 10:55:20 GMT
show_ads_impl_with_ama_fy2019.js
pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/
227 KB
86 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:827::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
c1f6f1027092d281d624e67f9f83460ed291ae367b558c16cd6afad7af5eba1e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:51 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
87278
x-xss-protection
0
server
cafe
etag
4389487008424739880
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600, stale-while-revalidate=3600
timing-allow-origin
*
expires
Mon, 08 Mar 2021 20:22:51 GMT
logo-s.png
mikiki.ismcdn.jp/common/images/v1/common/
2 KB
3 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/common/images/v1/common/logo-s.png
Requested by
Host: mikiki.ismcdn.jp
URL: https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
993a66e17000cec650c6fd7a55332b6e4aa197c5fec6372c391720cecb5d54d1
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-header.css?rd=202101291537
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:51 GMT
last-modified
Thu, 03 Apr 2014 04:13:02 GMT
strict-transport-security
max-age=31536000
content-type
image/png
cache-control
max-age=1411735
accept-ranges
bytes
content-length
2395
expires
Thu, 25 Mar 2021 04:31:46 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.82.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.82.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
be77f2a682264d0193dbec5caf6719e392f56ea86130cafb4adc4b4dba813fc2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 10:31:00 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:19:42 GMT
server
sffe
age
208311
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16136
x-xss-protection
0
expires
Sun, 06 Mar 2022 10:31:00 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.113.woff2
fonts.gstatic.com/s/notosansjp/v28/
12 KB
12 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.113.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
9a2267d25cd1e6879633a573e90a5cd8f406ded9d15f86af3c090f0f43972466
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 06:34:25 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:36 GMT
server
sffe
age
308906
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
12660
x-xss-protection
0
expires
Sat, 05 Mar 2022 06:34:25 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.108.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.108.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
809b23fa3719aa2e2f7948dd598edbd963828447a7e6a975b7c90ca8fdcdaaf4
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:23:23 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:22:54 GMT
server
sffe
age
7168
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15556
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:23:23 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.112.woff2
fonts.gstatic.com/s/notosansjp/v28/
12 KB
12 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.112.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
daf150195be02d40aef144108115e329b6d2befe8b2532f64bad9963facb4b93
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 12:57:38 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:33:11 GMT
server
sffe
age
372313
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
12616
x-xss-protection
0
expires
Fri, 04 Mar 2022 12:57:38 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20210303/r20190131/ Frame 6DC7
11 KB
5 KB
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20210303/r20190131/zrt_lookup.html
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:802::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e78c14aeb9435fd03f67ad2ee4c45e18bfcfc100a4c62c8bd886324ce6296f77
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20210303/r20190131/zrt_lookup.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
sec-fetch-dest
iframe
referer
https://mikiki.tokyo.jp/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
Referer
https://mikiki.tokyo.jp/

Response headers

p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
cross-origin-resource-policy
cross-origin
vary
Accept-Encoding
date
Sun, 07 Mar 2021 20:37:42 GMT
expires
Sun, 21 Mar 2021 20:37:42 GMT
content-type
text/html; charset=UTF-8
etag
14371272352318978350
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
5136
x-xss-protection
0
age
85509
cache-control
public, max-age=1209600
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
analytics.js
www.google-analytics.com/
46 KB
19 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
0f3be44690ae9914ae3e47b7752e1bdea316f09938e9094f99e0de19ccd8987a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Fri, 05 Feb 2021 21:33:27 GMT
server
Golfe2
age
1215
date
Mon, 08 Mar 2021 20:02:36 GMT
vary
Accept-Encoding
content-type
text/javascript
cache-control
public, max-age=7200
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
18980
expires
Mon, 08 Mar 2021 22:02:36 GMT
collect
www.google-analytics.com/j/
4 B
70 B
XHR
General
Full URL
https://www.google-analytics.com/j/collect?v=1&_v=j88&a=2024170864&t=pageview&_s=1&dl=https%3A%2F%2Fmikiki.tokyo.jp%2F&ul=en-us&de=UTF-8&dt=Mikiki%20-%20music%20review%20site&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&_u=IEBAAEABAAAAAC~&jid=30069544&gjid=892501656&cid=649973928.1615234972&tid=UA-48867176-1&_gid=1720696143.1615234972&_r=1&_slc=1&z=1845013153
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:809::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
aec60bc104db041b1512185839f18f52986df7e569e5445f740dd60f763fbca8
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Mon, 08 Mar 2021 20:22:51 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
content-type
text/plain
access-control-allow-origin
https://mikiki.tokyo.jp
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
4
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
stats.g.doubleclick.net/j/
1 B
85 B
XHR
General
Full URL
https://stats.g.doubleclick.net/j/collect?t=dc&aip=1&_r=3&v=1&_v=j88&tid=UA-48867176-1&cid=649973928.1615234972&jid=30069544&gjid=892501656&_gid=1720696143.1615234972&_u=IEBAAEAAAAAAAC~&z=336044354
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c1b::9d Brussels, Belgium, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
strict-transport-security
max-age=10886400; includeSubDomains; preload
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
date
Mon, 08 Mar 2021 20:22:51 GMT
content-type
text/plain
access-control-allow-origin
https://mikiki.tokyo.jp
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
1
expires
Fri, 01 Jan 1990 00:00:00 GMT
m.gif
mikiki.tokyo.jp/oo/mk/
43 B
142 B
Image
General
Full URL
https://mikiki.tokyo.jp/oo/mk/m.gif?media=mikiki.tokyo.jp&skin=indexes%2Fmedia_top&id=&category=&subcategory=&model=&modelid=&host=mikiki.tokyo.jp&path=%2F&rd=0.0655820717256812
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
202.238.151.85 Mito, Japan, ASN2497 (IIJ Internet Initiative Japan Inc., JP),
Reverse DNS
85.151.238.202.rev.ismedia.jp
Software
Apache /
Resource Hash
b1efbaeb8c5ce34e2c6a6492d7aad07daeadfe3e2b4f2360a12bbd756ec23067
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Sun, 23 Oct 2011 00:34:00 GMT
server
Apache
accept-ranges
bytes
content-length
43
strict-transport-security
max-age=31536000
content-type
image/gif
sdk.js
connect.facebook.net/ja_JP/
3 KB
2 KB
Script
General
Full URL
https://connect.facebook.net/ja_JP/sdk.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f045:10:face:b00c:0:3 , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
a0f6d67ca6a7d48faaf6151b3907bddb8e2c050c423ba8348dd6829cd8cc595b
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

strict-transport-security
max-age=31536000; preload; includeSubDomains
content-encoding
gzip
x-content-type-options
nosniff
content-md5
FtpS1gp+GpdGhCdi4fD9kA==
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
1782
x-fb-rlafr
0
x-fb-debug
rTMutPL2X5zLbQlNVeztxiUvM88p4aougHucADlQfsfgTjjpEL8S1XTA/9TjSvzW5nkxJsYIS4Z9FVfjaNwRVA==
x-fb-trip-id
664085054
x-fb-content-md5
5ac86f7952de344ef9cec8890e6fdf1f
x-frame-options
DENY
date
Mon, 08 Mar 2021 20:22:51 GMT
vary
Accept-Encoding
content-type
application/x-javascript; charset=utf-8
access-control-allow-origin
*
access-control-expose-headers
X-FB-Content-MD5
cache-control
public,max-age=1200,stale-while-revalidate=3600
etag
"d86190e30d336954c0dc28d60091b989"
timing-allow-origin
*
priority
u=3,i
expires
Mon, 08 Mar 2021 20:25:57 GMT
sdk.js
connect.facebook.net/ja_JP/
197 KB
60 KB
Script
General
Full URL
https://connect.facebook.net/ja_JP/sdk.js?hash=88a562dfc2480c8ef772655c688a4d87&ua=modern_es6
Requested by
Host: connect.facebook.net
URL: https://connect.facebook.net/ja_JP/sdk.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f045:10:face:b00c:0:3 , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
0e235c65027fd5f1ba0b9f86250a77592a9d3b4fa03b45df3e02251dad244974
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

strict-transport-security
max-age=31536000; preload; includeSubDomains
content-encoding
gzip
x-content-type-options
nosniff
content-md5
jci7qqZ0SmRctiDuhj2V1g==
cross-origin-resource-policy
cross-origin
expires
Tue, 08 Mar 2022 19:15:50 GMT
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
60635
x-fb-rlafr
0
x-fb-debug
rRa/K4saKfKp9L61ckGGxI7AYDpI2cWt1iCGYHpa92ZATD6PvoZZLD5uXEnvuSUrobLyStda7Yn4kohbLBHZyw==
x-fb-trip-id
664085054
x-fb-content-md5
450d591ed48098f1d27f118bfdae3fda
cross-origin-embedder-policy-report-only
require-corp;report-to="coep_report"
date
Mon, 08 Mar 2021 20:22:52 GMT
x-frame-options
DENY
report-to
{"group":"coop_report","max_age":86400,"endpoints":[{"url":"https:\/\/www.facebook.com\/browser_reporting\/"}]}, {"group":"coep_report","max_age":86400,"endpoints":[{"url":"https:\/\/www.facebook.com\/browser_reporting\/"}]}
content-type
application/x-javascript; charset=utf-8
access-control-allow-origin
*
vary
Accept-Encoding
cache-control
public,max-age=31536000,stale-while-revalidate=3600,immutable
origin-trial
AqUfQvNe9Mod+kZ3Qx78GGg2ul4TtHv3l126BaOQCbywgYxRUP0y9rs8/el96V62SmT7ue9StD9aXvYmT3UAAQcAAAB5eyJvcmlnaW4iOiJodHRwczovL2ZhY2Vib29rLmNvbTo0NDMiLCJmZWF0dXJlIjoiQ3Jvc3NPcmlnaW5PcGVuZXJQb2xpY3lSZXBvcnRpbmciLCJleHBpcnkiOjE2MTM0MTE1NzMsImlzU3ViZG9tYWluIjp0cnVlfQ==
etag
"a56298a80b6f2b5aea222ef5750f1515"
timing-allow-origin
*
cross-origin-opener-policy-report-only
same-origin-allow-popups;report-to="coop_report"
access-control-expose-headers
X-FB-Content-MD5
widgets.js
platform.twitter.com/
96 KB
29 KB
Script
General
Full URL
https://platform.twitter.com/widgets.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2606:2800:234:59:254c:406:2366:268c , United States, ASN15133 (EDGECAST, US),
Reverse DNS
Software
ECS (amb/6B89) /
Resource Hash
0ccadac47f8db7d9086cb5d1a3230580ee43e7db056734068ce3785376e90500

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

Date
Mon, 08 Mar 2021 20:22:52 GMT
Content-Encoding
gzip
Last-Modified
Wed, 03 Mar 2021 19:22:22 GMT
Server
ECS (amb/6B89)
Age
1137
Etag
"965fcfc23c3459afe3ebf42b92f31e6d+gzip"
Vary
Accept-Encoding
x-tw-cdn
VZ
P3P
CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=1800
X-Cache
HIT
Access-Control-Allow-Methods
GET
Content-Type
application/javascript; charset=utf-8
Content-Length
29026
btn.js
widgets.getpocket.com/v1/j/
2 KB
1 KB
Script
General
Full URL
https://widgets.getpocket.com/v1/j/btn.js?v=1
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.96.29 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Apache/2.4.25 (Debian) /
Resource Hash
5aa869ba3a3f7a8883a0e6457ebaea6bb7c9069e296bdc166ce30431d318bb90

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 19:29:03 GMT
content-encoding
gzip
last-modified
Mon, 08 Mar 2021 18:23:20 GMT
server
Apache/2.4.25 (Debian)
age
3229
etag
"90b-5bd0a87401600-gzip"
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
access-control-allow-origin
https://pocket.com,https://getpocket.com,https://widgets.getpocket.com
x-amz-cf-pop
PRG50-C1
accept-ranges
bytes
content-length
1037
via
1.1 bb390afd921c223e0fe4921fbc23bbe8.cloudfront.net (CloudFront)
x-amz-cf-id
u1JNRP23fvWdOeBzD8ns2fBmlF7RrOgJCzhfd0ex5OmIuYiKaZpbPw==
tag.js
s.yjtag.jp/
37 KB
13 KB
Script
General
Full URL
https://s.yjtag.jp/tag.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2600:9000:214f:1000:8:dcbf:c740:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
3ea1d47e294e438851d775f2eca7352b4d03cf662e3ad9410f18bae663a380e5

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-amz-version-id
pwVJ8CZ5CzxJk0oranYXZm0CJzsUHSFZ
content-encoding
gzip
last-modified
Mon, 09 Nov 2020 01:50:12 GMT
server
AmazonS3
age
6462
etag
W/"830cee037cbd2937feb368104dc9a35f"
vary
Accept-Encoding
x-cache
Hit from cloudfront
p3p
CP=NOI DSP COR NID
via
1.1 511c8b6c7e903efca023a504d527516b.cloudfront.net (CloudFront)
cache-control
public, max-age=14400
date
Mon, 08 Mar 2021 18:35:10 GMT
x-amz-cf-pop
FRA53-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
zylv-cdJWqEe9vtOPWMrvyfNOtwMTQJEMsgBveW_U8MpoKmmR9ooaQ==
cookie.js
partner.googleadservices.com/gampad/
205 B
645 B
Script
General
Full URL
https://partner.googleadservices.com/gampad/cookie.js?domain=mikiki.tokyo.jp&callback=_gfp_s_&client=ca-pub-6762391202596396
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
142.250.185.226 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s53-in-f2.1e100.net
Software
cafe /
Resource Hash
8142410a7e8adddb1eabb914635504ec09717377d2e14feed9840afbcf00b90d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
content-type
text/javascript; charset=UTF-8
cache-control
private
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
196
x-xss-protection
0
integrator.js
adservice.google.de/adsid/
107 B
799 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=mikiki.tokyo.jp
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:812::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
a4a1824defec1084ca81d496ee77891684c26196924bdc4fc21dd3482ce15e14
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

timing-allow-origin
*
date
Mon, 08 Mar 2021 20:22:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
cache-control
private, no-cache, no-store
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
h3-29="googleads.g.doubleclick.net:443"; ma=2592000,h3-29=":443"; ma=2592000,h3-T051="googleads.g.doubleclick.net:443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43"
content-length
100
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
107 B
243 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=mikiki.tokyo.jp
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:803::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
a4a1824defec1084ca81d496ee77891684c26196924bdc4fc21dd3482ce15e14
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

timing-allow-origin
*
date
Mon, 08 Mar 2021 20:22:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
cache-control
private, no-cache, no-store
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
100
x-xss-protection
0
gen_204
pagead2.googlesyndication.com/pagead/
0
111 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=ach_evt&url=https%3A%2F%2Fmikiki.tokyo.jp%2F&tn=A&ign=false
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:827::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 08 Mar 2021 20:22:52 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, must-revalidate
cross-origin-resource-policy
cross-origin
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame F8EB
54 B
596 B
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6762391202596396&output=html&adk=1812271804&adf=3025194257&lmt=1615234972&plat=1%3A16809992%2C2%3A32776%2C8%3A134217728%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32&format=0x0&url=https%3A%2F%2Fmikiki.tokyo.jp%2F&ea=0&flash=0&pra=7&wgl=1&dt=1615234972114&bpp=1&bdt=1257&idt=1&shv=r20210303&cbv=r20190131&ptt=9&saldr=aa&abxe=1&nras=1&correlator=7858236862458&frm=20&pv=2&ga_vid=649973928.1615234972&ga_sid=1615234972&ga_hid=2024170864&ga_fc=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1600&bih=1200&scr_x=0&scr_y=0&eid=42530672%2C21066922%2C21068083&oid=3&pvsid=1284100185698243&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=8192&bc=31&ifi=3&uci=a!3&fsb=1&dtd=18
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
166a4ec3cb90d525f7f744c7616c01b36bebd6dcecd486c8f5be14ccc0a7b3da
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-6762391202596396&output=html&adk=1812271804&adf=3025194257&lmt=1615234972&plat=1%3A16809992%2C2%3A32776%2C8%3A134217728%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32&format=0x0&url=https%3A%2F%2Fmikiki.tokyo.jp%2F&ea=0&flash=0&pra=7&wgl=1&dt=1615234972114&bpp=1&bdt=1257&idt=1&shv=r20210303&cbv=r20190131&ptt=9&saldr=aa&abxe=1&nras=1&correlator=7858236862458&frm=20&pv=2&ga_vid=649973928.1615234972&ga_sid=1615234972&ga_hid=2024170864&ga_fc=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1600&bih=1200&scr_x=0&scr_y=0&eid=42530672%2C21066922%2C21068083&oid=3&pvsid=1284100185698243&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=8192&bc=31&ifi=3&uci=a!3&fsb=1&dtd=18
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
sec-fetch-dest
iframe
referer
https://mikiki.tokyo.jp/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
Referer
https://mikiki.tokyo.jp/

Response headers

p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
cross-origin-resource-policy
cross-origin
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Mon, 08 Mar 2021 20:22:52 GMT
server
cafe
content-length
34
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Mon, 08-Mar-2021 20:37:52 GMT; path=/; domain=.doubleclick.net; Secure; HttpOnly; SameSite=none
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
expires
Mon, 08 Mar 2021 20:22:52 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
74 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
e2b04100564fd9141d7acbd40482d40a3c5b4af2cf25b2cf8726b5608841d61a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1614774803212306"
vary
Accept-Encoding
content-type
text/javascript
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
28399
x-xss-protection
0
expires
Mon, 08 Mar 2021 20:22:52 GMT
like_box.php
www.facebook.com/v2.0/plugins/ Frame 8B64
53 KB
17 KB
Document
General
Full URL
https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
Requested by
Host: connect.facebook.net
URL: https://connect.facebook.net/ja_JP/sdk.js?hash=88a562dfc2480c8ef772655c688a4d87&ua=modern_es6
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f145:82:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
877154470ef1831f5378508d6848ab9e0cf3e5dfd6f8537b13ecd4b43ea6baf9
Security Headers
Name Value
Content-Security-Policy default-src * data: blob: 'self';script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests;
Strict-Transport-Security max-age=15552000; preload
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
www.facebook.com
:scheme
https
:path
/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
sec-fetch-dest
iframe
referer
https://mikiki.tokyo.jp/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
Referer
https://mikiki.tokyo.jp/

Response headers

content-security-policy
default-src * data: blob: 'self';script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests;
cache-control
private, no-cache, no-store, must-revalidate
expires
Sat, 01 Jan 2000 00:00:00 GMT
x-xss-protection
0
strict-transport-security
max-age=15552000; preload
content-encoding
br
facebook-api-version
v3.2
x-content-type-options
nosniff
vary
Accept-Encoding
pragma
no-cache
x-fb-rlafr
0
content-type
text/html; charset="utf-8"
x-fb-debug
NDgez49F4jsVBG/PKB2i1t5Hb7ZiMDzyjTKrmVCOcMgXxgVZxyQLDwaXs5VVWjVOcyl60wXUrn8YRwb4E44K1g==
date
Mon, 08 Mar 2021 20:22:52 GMT
priority
u=3,i
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
genre_selector.png
mikiki.ismcdn.jp/common/images/v1/sub_column/
447 B
621 B
Image
General
Full URL
https://mikiki.ismcdn.jp/common/images/v1/sub_column/genre_selector.png
Requested by
Host: mikiki.ismcdn.jp
URL: https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-aside.css?rd=202101291537
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
93b53bea5f3eef0830b16423182f7b9f1612ae24a3a31ddd86f2cdfc92d13a2a
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-aside.css?rd=202101291537
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Thu, 20 Feb 2014 09:57:28 GMT
strict-transport-security
max-age=31536000
content-type
image/png
cache-control
max-age=1409802
accept-ranges
bytes
content-length
447
expires
Thu, 25 Mar 2021 03:59:34 GMT
ranking
mikiki.tokyo.jp/list/slideshow/tabs_reviews/
8 KB
1 KB
XHR
General
Full URL
https://mikiki.tokyo.jp/list/slideshow/tabs_reviews/ranking?t=0&g=0
Requested by
Host: ajax.googleapis.com
URL: https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
202.238.151.85 Mito, Japan, ASN2497 (IIJ Internet Initiative Japan Inc., JP),
Reverse DNS
85.151.238.202.rev.ismedia.jp
Software
/
Resource Hash
fcd42fbc171063aec1e2deceb21e3884c46b7dea68543a511a5c5dad335b57a1
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Accept
*/*
Referer
https://mikiki.tokyo.jp/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
300.000
date
Mon, 08 Mar 2021 20:19:03 GMT
content-encoding
gzip
x-content-type-options
nosniff
x-frame-options
SAMEORIGIN
x-cache
HIT
content-type
text/html; charset=utf-8
cache-control
max-age=0, private, must-revalidate
strict-transport-security
max-age=31536000
accept-ranges
bytes
vary
Accept-Encoding,User-Agent,Cookie
content-length
1316
x-xss-protection
1; mode=block
x-request-id
040aaf86-63b1-4ba8-aef6-a0abb3e17c58
ranking
mikiki.tokyo.jp/list/slideshow/tabs_articles/
9 KB
2 KB
XHR
General
Full URL
https://mikiki.tokyo.jp/list/slideshow/tabs_articles/ranking?t=0&g=0
Requested by
Host: ajax.googleapis.com
URL: https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
202.238.151.85 Mito, Japan, ASN2497 (IIJ Internet Initiative Japan Inc., JP),
Reverse DNS
85.151.238.202.rev.ismedia.jp
Software
/
Resource Hash
3bf4ba4cad00a79d25826421b08cf177ab20e4f352ef514c08b3b850524bb8e5
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Accept
*/*
Referer
https://mikiki.tokyo.jp/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
300.000
date
Mon, 08 Mar 2021 20:19:03 GMT
content-encoding
gzip
x-content-type-options
nosniff
x-frame-options
SAMEORIGIN
x-cache
HIT
content-type
text/html; charset=utf-8
cache-control
max-age=0, private, must-revalidate
strict-transport-security
max-age=31536000
accept-ranges
bytes
vary
Accept-Encoding,User-Agent,Cookie
content-length
1894
x-xss-protection
1; mode=block
x-request-id
fb414333-590f-487d-b1d5-176bafded614
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.66.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.66.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
f9b9f1e144d97450d5ccc485f9aeba31144a8e15bc70c9f17249b34e157c12fc
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 07:47:56 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:17:14 GMT
server
sffe
age
304496
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16396
x-xss-protection
0
expires
Sat, 05 Mar 2022 07:47:56 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.39.woff2
fonts.gstatic.com/s/notosansjp/v28/
56 KB
56 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.39.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
690d6f60191f1663dc4c741f9ec6e90d106214dd2b6f69e5ace9b414ea71d1de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 20:25:35 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:43 GMT
server
sffe
age
345437
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
57160
x-xss-protection
0
expires
Fri, 04 Mar 2022 20:25:35 GMT
-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.83.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQMisq1xVxjfp_dakBof6Bs-tb3ab2FNISVac.83.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
fae0fa574bed38ddf8e96e24b982062e0fe6b04b2c1e004df584fcb0dce75050
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 03:25:50 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:08:36 GMT
server
sffe
age
320222
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16280
x-xss-protection
0
expires
Sat, 05 Mar 2022 03:25:50 GMT
tag
yjtag.yahoo.co.jp/
4 KB
2 KB
Script
General
Full URL
https://yjtag.yahoo.co.jp/tag?site=XeiM79u&referrer=https%3A%2F%2Fmikiki.tokyo.jp%2F&H=3rivtft
Requested by
Host: s.yjtag.jp
URL: https://s.yjtag.jp/tag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
183.79.113.119 , Japan, ASN24572 (YAHOO-JP-AS-AP Yahoo Japan, JP),
Reverse DNS
Software
/
Resource Hash
269b982262e017483ed1a150558e693b9bbcf32573d207c2cade2baa7d3db4db
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

Pragma
no-cache
Date
Mon, 08 Mar 2021 20:22:53 GMT
Content-Encoding
gzip
X-Content-Type-Options
nosniff
Age
0
ETag
cd7646e6d65de97573f1241f76a68ba7
vary
accept-encoding
P3P
policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control
private, must-revalidate
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
text/javascript
X-BT-RequestId
0fb0ffe0-804c-11eb-93a2-0000ac1c47df
widget_iframe.0edc1ef9f8b82d9b79c6115bda79f63f.html
platform.twitter.com/widgets/ Frame CE63
320 KB
104 KB
Document
General
Full URL
https://platform.twitter.com/widgets/widget_iframe.0edc1ef9f8b82d9b79c6115bda79f63f.html?origin=https%3A%2F%2Fmikiki.tokyo.jp
Requested by
Host: platform.twitter.com
URL: https://platform.twitter.com/widgets.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2606:2800:234:59:254c:406:2366:268c , United States, ASN15133 (EDGECAST, US),
Reverse DNS
Software
ECS (amb/6B9E) /
Resource Hash
a8d227efe0ef553cba37d86bef6e44598dbf9bd9fad3db2582b0ffdebdbd6138

Request headers

Host
platform.twitter.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
cross-site
Sec-Fetch-Mode
navigate
Sec-Fetch-Dest
iframe
Referer
https://mikiki.tokyo.jp/
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
Referer
https://mikiki.tokyo.jp/

Response headers

Content-Encoding
gzip
Access-Control-Allow-Methods
GET
Access-Control-Allow-Origin
*
Age
435344
Cache-Control
public, max-age=315360000
Content-Type
text/html; charset=utf-8
Date
Mon, 08 Mar 2021 20:22:52 GMT
Etag
"e9ffeb87a3b6f068499be71966b442d9+gzip"
Last-Modified
Wed, 03 Mar 2021 19:20:25 GMT
P3P
CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT"
Server
ECS (amb/6B9E)
Vary
Accept-Encoding
X-Cache
HIT
x-tw-cdn
VZ
Content-Length
105690
aCaPNPfP7ow.css
www.facebook.com/rsrc.php/v3/yN/l/0,ja_JP/ Frame 8B64
35 KB
9 KB
Stylesheet
General
Full URL
https://www.facebook.com/rsrc.php/v3/yN/l/0,ja_JP/aCaPNPfP7ow.css?_nc_x=Ij3Wp8lg5Kz
Requested by
Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f145:82:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
40291ead67dbd6701800119f53000b60b0697c31bb17d4a356dcb85e0a5d1c50
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Origin
https://www.facebook.com
Referer
https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-fb-debug
+0bS0WRDPBT3/hKbIiHAPBgvXJ8aafhwxUWRU8lpTe2bkW4Zx14AnrAYIaGXGop4h6N0oK0ha5GYXPpPPTaPjg==
content-encoding
br
x-content-type-options
nosniff
last-modified
Mon, 01 Jan 2001 08:00:00 GMT
content-md5
xgU5NbToD03aRyOhDnA3DA==
date
Sun, 07 Mar 2021 18:59:30 GMT
vary
Accept-Encoding
content-type
text/css; charset=utf-8
access-control-allow-origin
*
cache-control
public,max-age=31536000,immutable
cross-origin-resource-policy
cross-origin
timing-allow-origin
*
content-length
9244
x-fb-rlafr
0
expires
Mon, 07 Mar 2022 18:59:30 GMT
1_s3efm4LYv.js
www.facebook.com/rsrc.php/v3/yp/r/ Frame 8B64
267 KB
71 KB
Script
General
Full URL
https://www.facebook.com/rsrc.php/v3/yp/r/1_s3efm4LYv.js?_nc_x=Ij3Wp8lg5Kz
Requested by
Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f145:82:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
624a90008a2ffe56c5745854d5df0f61402093ab7978559f4b4fd36e41e57dad
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Origin
https://www.facebook.com
Referer
https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 03:13:51 GMT
content-encoding
br
x-content-type-options
nosniff
content-md5
n6rw+BJ2UnEUY8zKg7LqAw==
cross-origin-resource-policy
cross-origin
content-length
72163
x-fb-rlafr
0
x-fb-debug
AoG+JEoSg1bt9/Zmwkr0tzYE/V+jHv6wUGkqHSCyUf2xJf/uwemV70lbeuYaV6ZTD0FFLVGVvjm31K+oMGcflg==
last-modified
Mon, 01 Jan 2001 08:00:00 GMT
vary
Accept-Encoding
content-type
application/x-javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public,max-age=31536000,immutable
timing-allow-origin
*
priority
u=3,i
expires
Sun, 06 Mar 2022 03:13:51 GMT
ujzWhJE7ek0.js
www.facebook.com/rsrc.php/v3/yJ/r/ Frame 8B64
65 KB
20 KB
Script
General
Full URL
https://www.facebook.com/rsrc.php/v3/yJ/r/ujzWhJE7ek0.js?_nc_x=Ij3Wp8lg5Kz
Requested by
Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f145:82:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
bdb4ecc3fb70125429c5a3808b423ef6a53bb1e83d77bef8f02ead87bc80ec76
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Origin
https://www.facebook.com
Referer
https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-fb-debug
ej41/x2VtpvbUfB/LsAicWs0TCNfEWsEI5c3li9q0KiczU0zcvnPdqmMqCCf/cvNcN461u0cy1ttotPUAas+sQ==
content-encoding
br
x-content-type-options
nosniff
last-modified
Mon, 01 Jan 2001 08:00:00 GMT
content-md5
suLK3XH78r4ILkk4ZObFfQ==
date
Fri, 05 Mar 2021 05:30:09 GMT
vary
Accept-Encoding
content-type
application/x-javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public,max-age=31536000,immutable
cross-origin-resource-policy
cross-origin
timing-allow-origin
*
content-length
20236
x-fb-rlafr
0
expires
Sat, 05 Mar 2022 05:30:09 GMT
-y6ICflXqw-.js
www.facebook.com/rsrc.php/v3irB34/y-/l/ja_JP/ Frame 8B64
123 KB
34 KB
Script
General
Full URL
https://www.facebook.com/rsrc.php/v3irB34/y-/l/ja_JP/-y6ICflXqw-.js?_nc_x=Ij3Wp8lg5Kz
Requested by
Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f145:82:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
e00e69e8e10f072e4a816dd6980c5273917201e813ee432c64e86443a0404ba6
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Origin
https://www.facebook.com
Referer
https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-fb-debug
+z45zpHQ6SnNgZvRGpEIS8dSOo0skL/jzhby9RSU97UNDnHWsxKsU7V5iIlQPUf2SooxQAauHnubod4+ondBcA==
content-encoding
br
x-content-type-options
nosniff
last-modified
Mon, 01 Jan 2001 08:00:00 GMT
content-md5
A+btXu6IFXpmzTgVOgW1/g==
date
Fri, 05 Mar 2021 01:13:53 GMT
vary
Accept-Encoding
content-type
application/x-javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public,max-age=31536000,immutable
cross-origin-resource-policy
cross-origin
timing-allow-origin
*
content-length
35038
x-fb-rlafr
0
expires
Sat, 05 Mar 2022 01:13:53 GMT
nLyZ6bYhSNu.js
www.facebook.com/rsrc.php/v3/yW/r/ Frame 8B64
7 KB
2 KB
Script
General
Full URL
https://www.facebook.com/rsrc.php/v3/yW/r/nLyZ6bYhSNu.js?_nc_x=Ij3Wp8lg5Kz
Requested by
Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f145:82:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
67d8e7a3e7815e72595c83389b163f51ecd562ed6c394cdaf5cbc93c7330623e
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Origin
https://www.facebook.com
Referer
https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-fb-debug
QW0GRv0UBKyZsPAdMfSRxiX2+k03DCDagnLYFhRQoMbljrUjlQ+gBbDU38QAgxO5k85U+KATPFsstkyrsYDF+g==
content-encoding
br
x-content-type-options
nosniff
last-modified
Mon, 01 Jan 2001 08:00:00 GMT
content-md5
sAMp5DhlJ2pej3twf5dwWw==
date
Sat, 06 Mar 2021 17:59:41 GMT
vary
Accept-Encoding
content-type
application/x-javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public,max-age=31536000,immutable
cross-origin-resource-policy
cross-origin
timing-allow-origin
*
content-length
2304
x-fb-rlafr
0
expires
Sun, 06 Mar 2022 17:59:41 GMT
158810230_375991646883705_115399203741811626_n.jpg
scontent-frt3-1.xx.fbcdn.net/v/t1.0-0/p130x130/ Frame 8B64
7 KB
7 KB
Image
General
Full URL
https://scontent-frt3-1.xx.fbcdn.net/v/t1.0-0/p130x130/158810230_375991646883705_115399203741811626_n.jpg?_nc_cat=109&ccb=1-3&_nc_sid=dd9801&_nc_ohc=Yp87ixHyZjEAX9P1xK5&_nc_ht=scontent-frt3-1.xx&tp=6&oh=dd61f32df5b628f58d88e9c5a0ae90c6&oe=606C9E03
Requested by
Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:216:face:b00c:0:3 , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
f26d999c117cf597b4309a9b0b06736a6186c2ea179312ce2e84e92cb44014e8

Request headers

Referer
https://www.facebook.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-haystack-needlechecksum
4182816254
date
Mon, 08 Mar 2021 20:22:52 GMT
x-fb-trip-id
686109401
last-modified
Mon, 08 Mar 2021 02:49:04 GMT
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
X-FB-CEC-Video-Limit
cache-control
max-age=1209600, no-transform
cross-origin-resource-policy
cross-origin
x-needle-checksum
1901051042
x-fb-config-version-olb-prod
1038
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
6941
158695835_375991650217038_429185904419813178_n.jpg
scontent-frt3-2.xx.fbcdn.net/v/t1.0-1/cp0/p50x50/ Frame 8B64
1 KB
2 KB
Image
General
Full URL
https://scontent-frt3-2.xx.fbcdn.net/v/t1.0-1/cp0/p50x50/158695835_375991650217038_429185904419813178_n.jpg?_nc_cat=101&ccb=1-3&_nc_sid=dbb9e7&_nc_ohc=YsCE3wuo9SwAX-BFm2k&_nc_ht=scontent-frt3-2.xx&tp=27&oh=ee07ddb1a40ebc0902b5d7c86ac5a580&oe=606BAD0C
Requested by
Host: www.facebook.com
URL: https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:8012:face:b00c:0:3 , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
338de06ae9e44b27f5ae8230f171c8c74c23cbbef0e1e8c2d57c703039cb37b3

Request headers

Referer
https://www.facebook.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-haystack-needlechecksum
483593984
date
Mon, 08 Mar 2021 20:22:52 GMT
x-fb-trip-id
2050670934
last-modified
Mon, 08 Mar 2021 02:49:04 GMT
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
X-FB-CEC-Video-Limit
cache-control
max-age=1209600, no-transform
cross-origin-resource-policy
cross-origin
x-needle-checksum
2004941428
x-fb-config-version-olb-prod
1038
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
1432
settings
syndication.twitter.com/ Frame CE63
183 B
410 B
Fetch
General
Full URL
https://syndication.twitter.com/settings?session_id=263bd738c0cc98004f2a442b43db8ee1792b3aea
Requested by
Host: platform.twitter.com
URL: https://platform.twitter.com/widgets/widget_iframe.0edc1ef9f8b82d9b79c6115bda79f63f.html?origin=https%3A%2F%2Fmikiki.tokyo.jp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.42.136 , United States, ASN13414 (TWITTER, US),
Reverse DNS
Software
tsa_o /
Resource Hash
ced34f591157438ef47695f979ac95f8758408e8d9b88e63aee8b382ec975785
Security Headers
Name Value
Strict-Transport-Security max-age=631138519

Request headers

Referer
https://platform.twitter.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-response-time
105
date
Mon, 08 Mar 2021 20:22:52 GMT
content-encoding
gzip
last-modified
Mon, 08 Mar 2021 20:22:52 GMT
server
tsa_o
vary
Origin
content-type
application/json; charset=utf-8
access-control-allow-origin
https://platform.twitter.com
cache-control
must-revalidate, max-age=600
access-control-allow-credentials
true
x-connection-hash
072e640e354cca850c861490a1e3534a
strict-transport-security
max-age=631138519
content-length
152
ApcBOUT5FoS.png
www.facebook.com/rsrc.php/v3/y_/r/ Frame 8B64
573 B
789 B
Image
General
Full URL
https://www.facebook.com/rsrc.php/v3/y_/r/ApcBOUT5FoS.png
Requested by
Host: www.facebook.com
URL: https://www.facebook.com/rsrc.php/v3/yN/l/0,ja_JP/aCaPNPfP7ow.css?_nc_x=Ij3Wp8lg5Kz
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f145:82:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
641e03dfeee60c05e0794bace5fc58d2fba409fee529a114459e44cee0d9d069
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.facebook.com/rsrc.php/v3/yN/l/0,ja_JP/aCaPNPfP7ow.css?_nc_x=Ij3Wp8lg5Kz
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-fb-debug
aRnvFfrBftQO7Raspjr3iWGEtFCcO8sUOcKF0Nt6yfELOamhCvMq0R9GtKHsiO2Ooj5dQTfixe8rDb5Mf9B1KA==
x-content-type-options
nosniff
last-modified
Mon, 01 Jan 2001 08:00:00 GMT
content-md5
Y/eW3MWFNJnkcpEqoXzG3Q==
date
Fri, 26 Feb 2021 02:05:00 GMT
content-type
image/png
access-control-allow-origin
*
cache-control
public,max-age=31536000,immutable
cross-origin-resource-policy
cross-origin
timing-allow-origin
*
content-length
573
x-fb-rlafr
0
expires
Sat, 26 Feb 2022 02:05:00 GMT
3gKIw20zpPx.js
www.facebook.com/rsrc.php/v3/yc/r/ Frame 8B64
18 KB
6 KB
Script
General
Full URL
https://www.facebook.com/rsrc.php/v3/yc/r/3gKIw20zpPx.js?_nc_x=Ij3Wp8lg5Kz
Requested by
Host: www.facebook.com
URL: https://www.facebook.com/rsrc.php/v3/yp/r/1_s3efm4LYv.js?_nc_x=Ij3Wp8lg5Kz
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f145:82:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
8a7b3e1fb9dcfcdc74602cd099e52b29d81d0e136dd6405f9b9f604695ac0c92
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Origin
https://www.facebook.com
Referer
https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-fb-debug
0mkjJZOxvmJHAQ5UMUmWWoZZSkDekEJP2PF6uHpyjw72sLoh0ShtzViNAvdyWns+aQ8qIo3+X2nX4SkerB/k+g==
content-encoding
br
x-content-type-options
nosniff
last-modified
Mon, 01 Jan 2001 08:00:00 GMT
content-md5
JxklXWIUFJ/V53r1B155cg==
date
Fri, 05 Mar 2021 18:38:14 GMT
vary
Accept-Encoding
content-type
application/x-javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public,max-age=31536000,immutable
cross-origin-resource-policy
cross-origin
timing-allow-origin
*
content-length
5952
x-fb-rlafr
0
expires
Sat, 05 Mar 2022 18:38:14 GMT
JopZtdti8dq.js
www.facebook.com/rsrc.php/v3/y_/r/ Frame 8B64
7 KB
2 KB
Script
General
Full URL
https://www.facebook.com/rsrc.php/v3/y_/r/JopZtdti8dq.js?_nc_x=Ij3Wp8lg5Kz
Requested by
Host: www.facebook.com
URL: https://www.facebook.com/rsrc.php/v3/yp/r/1_s3efm4LYv.js?_nc_x=Ij3Wp8lg5Kz
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f145:82:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
587b234b1819edd56fb28552f715b8d1c367a1dd28829d07c3678229c96e650b
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Origin
https://www.facebook.com
Referer
https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-fb-debug
LrTByX7xubRTy/3tsxaLnAROTVK+FK8/YBU/ASdVCrVuENAakeg+bG0pwRPSlDq2mTLLrfi5TdWDyp/0uyeSmw==
content-encoding
br
x-content-type-options
nosniff
last-modified
Mon, 01 Jan 2001 08:00:00 GMT
content-md5
7V1kQCLTl32/i6kpb5a/eQ==
date
Sat, 06 Mar 2021 21:23:47 GMT
vary
Accept-Encoding
content-type
application/x-javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public,max-age=31536000,immutable
cross-origin-resource-policy
cross-origin
timing-allow-origin
*
content-length
2267
x-fb-rlafr
0
expires
Sun, 06 Mar 2022 21:23:47 GMT
mbwLUT9Jpr0.js
www.facebook.com/rsrc.php/v3/y4/r/ Frame 8B64
48 KB
14 KB
Script
General
Full URL
https://www.facebook.com/rsrc.php/v3/y4/r/mbwLUT9Jpr0.js?_nc_x=Ij3Wp8lg5Kz
Requested by
Host: www.facebook.com
URL: https://www.facebook.com/rsrc.php/v3/yp/r/1_s3efm4LYv.js?_nc_x=Ij3Wp8lg5Kz
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f145:82:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
c7355c07330602c53b7b7b2a74b3b8fc3d4d4684158f6dd76240a7f5352282fb
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Origin
https://www.facebook.com
Referer
https://www.facebook.com/v2.0/plugins/like_box.php?app_id=236609006527248&channel=https%3A%2F%2Fstaticxx.facebook.com%2Fx%2Fconnect%2Fxd_arbiter%2F%3Fversion%3D46%23cb%3Df1a169cc3c851%26domain%3Dmikiki.tokyo.jp%26origin%3Dhttps%253A%252F%252Fmikiki.tokyo.jp%252Ff5f366af410274%26relation%3Dparent.parent&color_scheme=dark&container_width=300&header=true&height=350&href=https%3A%2F%2Fwww.facebook.com%2Fmikiki.tokyo.jp&locale=ja_JP&sdk=joey&show_border=true&show_faces=true&stream=false&width=300
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sun, 07 Mar 2021 22:21:41 GMT
content-encoding
br
x-content-type-options
nosniff
content-md5
GJE0D1LQm+b1bWz42e/WqA==
cross-origin-resource-policy
cross-origin
content-length
14531
x-fb-rlafr
0
x-fb-debug
CW4ZVfT6e8QgQyC9VisZOzOYRN6L+sGG55chFJ0kygH4AV5Rq63NdQD1bpePKO96MHKa/eQO0pWyaMIN/NVuDw==
last-modified
Mon, 01 Jan 2001 08:00:00 GMT
vary
Accept-Encoding
content-type
application/x-javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public,max-age=31536000,immutable
timing-allow-origin
*
priority
u=3,i
expires
Mon, 07 Mar 2022 22:21:41 GMT
img_f34c4f5ff227999480591efccac73f68439505.jpg
mikiki.ismcdn.jp/mwimgs/f/3/220h/
58 KB
58 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/f/3/220h/img_f34c4f5ff227999480591efccac73f68439505.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
186f649c10537eaec357a8acdae6cd08f7e6df6acaeb0d0da14a5030947a4d59
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Tue, 02 Mar 2021 04:16:17 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574814
accept-ranges
bytes
content-length
58957
expires
Wed, 07 Apr 2021 15:36:26 GMT
img_32bc20028f22c6340f2b2e50b3d02c6f371768.jpg
mikiki.ismcdn.jp/mwimgs/3/2/220/
91 KB
91 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/3/2/220/img_32bc20028f22c6340f2b2e50b3d02c6f371768.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
9f4eee9a9f3883790ad429bd9090d095b887dc5c250492de906f6a2b105092ed
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Fri, 26 Feb 2021 03:15:59 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574798
accept-ranges
bytes
content-length
93035
expires
Wed, 07 Apr 2021 15:36:10 GMT
img_40316cba29ca81fdadd85339328fa7e9189240.jpg
mikiki.ismcdn.jp/mwimgs/4/0/220/
41 KB
42 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/4/0/220/img_40316cba29ca81fdadd85339328fa7e9189240.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
cce352a77fafeeb51348207cfc69244c231420dac9eee8cfa55d0b02b80c1cf3
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
x-content-type-options
nosniff
last-modified
Tue, 02 Mar 2021 05:12:58 GMT
x-frame-options
SAMEORIGIN
content-type
image/jpeg
cache-control
max-age=2574787
strict-transport-security
max-age=31536000
accept-ranges
bytes
content-length
42190
x-xss-protection
1; mode=block
x-request-id
5787b476-a187-4dd4-b484-3ce25b60091d
expires
Wed, 07 Apr 2021 15:35:59 GMT
img_529745170ef2a3a593e27ea02b6f7cf7295705.jpg
mikiki.ismcdn.jp/mwimgs/5/2/220/
74 KB
74 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/5/2/220/img_529745170ef2a3a593e27ea02b6f7cf7295705.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f525dd25be196c4914d5785da4772f9f2462f25b81ab35faf0e5b83a38a19ab2
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Tue, 02 Mar 2021 07:23:46 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574763
accept-ranges
bytes
content-length
75564
expires
Wed, 07 Apr 2021 15:35:35 GMT
img_1382b10d4545097d993a8e4b8b022f3c195745.jpg
mikiki.ismcdn.jp/mwimgs/1/3/220h/
50 KB
50 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/1/3/220h/img_1382b10d4545097d993a8e4b8b022f3c195745.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
9a7d7ddcd767632d3e47bac402f3aebe9beaef249ead177d3d9fd18b2f2dab21
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
x-content-type-options
nosniff
last-modified
Tue, 02 Mar 2021 06:04:53 GMT
x-frame-options
SAMEORIGIN
content-type
image/jpeg
cache-control
max-age=2574803
strict-transport-security
max-age=31536000
accept-ranges
bytes
content-length
51116
x-xss-protection
1; mode=block
x-request-id
c3b8bcbd-828e-41d2-9b0a-5345d29d0935
expires
Wed, 07 Apr 2021 15:36:15 GMT
img_bba73a3e4db90af6fd99d08e5b88390e412524.jpg
mikiki.ismcdn.jp/mwimgs/b/b/220/
19 KB
20 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/b/b/220/img_bba73a3e4db90af6fd99d08e5b88390e412524.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
ff9a42ec88638db59f1ebd41697f606450fb4adf0263c5fcd3a3147e9964a946
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Tue, 24 Nov 2020 15:28:48 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2501657
accept-ranges
bytes
content-length
19834
expires
Tue, 06 Apr 2021 19:17:09 GMT
img_df01a46988a6a9e595ae2b32cbb4d8d8213492.jpg
mikiki.ismcdn.jp/mwimgs/d/f/220/
51 KB
51 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/d/f/220/img_df01a46988a6a9e595ae2b32cbb4d8d8213492.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
20f0f9f7cc9fdeadbc4a37771d7e381ffbec6fed08c1d4152ce68e43271dd142
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Fri, 26 Feb 2021 05:23:30 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2306557
accept-ranges
bytes
content-length
52373
expires
Sun, 04 Apr 2021 13:05:29 GMT
img_aa2fe163414aebaeb1c6c06054f2a7fc240818.jpg
mikiki.ismcdn.jp/mwimgs/a/a/220/
46 KB
46 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/a/a/220/img_aa2fe163414aebaeb1c6c06054f2a7fc240818.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
75a333b6f247f420f7d014af7b3615c35875e71b704e1a82fb86846563aeee86
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Tue, 02 Mar 2021 06:59:16 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2574808
accept-ranges
bytes
content-length
46827
expires
Wed, 07 Apr 2021 15:36:20 GMT
img_4ab46f473f1e772bfdbdc16a3e850f98444405.jpg
mikiki.ismcdn.jp/mwimgs/4/a/220/
98 KB
98 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/4/a/220/img_4ab46f473f1e772bfdbdc16a3e850f98444405.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
4d85149c237295ac2a009005088506eaeae9ec292289b092bc02e1653802da01
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Thu, 18 Feb 2021 01:23:53 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2319423
accept-ranges
bytes
content-length
100045
expires
Sun, 04 Apr 2021 16:39:55 GMT
img_88034c0f1431d1e128c2745d13fc09f5206334.jpg
mikiki.ismcdn.jp/mwimgs/8/8/220/
51 KB
51 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/8/8/220/img_88034c0f1431d1e128c2745d13fc09f5206334.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
0625f3fdf699cabefa588e8a9f75af6dd64f285ddfcc241313e187d43e0207cf
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
x-content-type-options
nosniff
last-modified
Tue, 02 Mar 2021 06:12:49 GMT
x-frame-options
SAMEORIGIN
content-type
image/jpeg
cache-control
max-age=2574792
strict-transport-security
max-age=31536000
accept-ranges
bytes
content-length
52287
x-xss-protection
1; mode=block
x-request-id
ad5e5951-d0c1-40d6-943b-3224df4dc320
expires
Wed, 07 Apr 2021 15:36:04 GMT
cycle_pager.png
mikiki.ismcdn.jp/common/images/v1/sub_column/
310 B
483 B
Image
General
Full URL
https://mikiki.ismcdn.jp/common/images/v1/sub_column/cycle_pager.png
Requested by
Host: mikiki.ismcdn.jp
URL: https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-aside.css?rd=202101291537
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
40b0500528e50a7fe5c5e0ff4166ec3da866f803b31ff43f9bc0dd52dfab5a78
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-aside.css?rd=202101291537
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Wed, 05 Feb 2014 13:38:12 GMT
strict-transport-security
max-age=31536000
content-type
image/png
cache-control
max-age=1529854
accept-ranges
bytes
content-length
310
expires
Fri, 26 Mar 2021 13:20:26 GMT
tag_corner_wh.png
mikiki.ismcdn.jp/common/images/v1/common/
406 B
580 B
Image
General
Full URL
https://mikiki.ismcdn.jp/common/images/v1/common/tag_corner_wh.png
Requested by
Host: mikiki.ismcdn.jp
URL: https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-aside.css?rd=202101291537
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
5e5b137cffdd089eaab0e545f32a7bdde0af959f1926e3c8d673b0fe78d3ac80
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.ismcdn.jp/resources/mikiki/css/v1/common-aside.css?rd=202101291537
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Wed, 05 Feb 2014 05:25:55 GMT
strict-transport-security
max-age=31536000
content-type
image/png
cache-control
max-age=1529875
accept-ranges
bytes
content-length
406
expires
Fri, 26 Mar 2021 13:20:47 GMT
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.117.woff2
fonts.gstatic.com/s/notosansjp/v28/
10 KB
10 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.117.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
9b5bb281335fd0c63339483981216a6807ab62adcb452b79b810f67a9b2951a7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 19:41:52 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:21:31 GMT
server
sffe
age
348060
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
9808
x-xss-protection
0
expires
Fri, 04 Mar 2022 19:41:52 GMT
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.118.woff2
fonts.gstatic.com/s/notosansjp/v28/
13 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.118.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
25d60620fbd3478d449ed18e74336849b237d1e45e035dc74024f2e6235d56e8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 06:32:07 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:19:52 GMT
server
sffe
age
222645
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13800
x-xss-protection
0
expires
Sun, 06 Mar 2022 06:32:07 GMT
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.112.woff2
fonts.gstatic.com/s/notosansjp/v28/
13 KB
13 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.112.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
35ebf4926dd4130b9cbb7950342c27d98a0d0e3853be0110f9b860863fa382a7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 11:42:11 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:05:28 GMT
server
sffe
age
290441
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
12928
x-xss-protection
0
expires
Sat, 05 Mar 2022 11:42:11 GMT
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.111.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.111.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
6a352e1c80750991386dc776482535a958e11899502c2efa9bcb25375e251d00
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 04:07:53 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:28 GMT
server
sffe
age
404099
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14644
x-xss-protection
0
expires
Fri, 04 Mar 2022 04:07:53 GMT
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.110.woff2
fonts.gstatic.com/s/notosansjp/v28/
13 KB
13 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.110.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
9ad5b0abecf13076072b73e09b3028adccd1f18778e9b4702f4592be29146e44
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:25:41 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:05:27 GMT
server
sffe
age
7031
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13404
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:25:41 GMT
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.107.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.107.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
016f83769d5bd72278c6942f0f2119e91c5d29d3afe86a8b11aeb4ffcca2e3d4
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 10:45:36 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:04 GMT
server
sffe
age
207436
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13872
x-xss-protection
0
expires
Sun, 06 Mar 2022 10:45:36 GMT
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.100.woff2
fonts.gstatic.com/s/notosansjp/v28/
17 KB
17 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.100.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
d272dcef0f0b73b67c85a3c724552319aaab80b951ca8bd765b515837c097bf5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 10:53:10 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:01 GMT
server
sffe
age
206982
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17660
x-xss-protection
0
expires
Sun, 06 Mar 2022 10:53:10 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.99.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.99.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
8ead8c65d14cf4b878e6d67b423166df1eca666ea389576bf163538508c0a735
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 10:46:53 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:11 GMT
server
sffe
age
207359
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16340
x-xss-protection
0
expires
Sun, 06 Mar 2022 10:46:53 GMT
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.119.woff2
fonts.gstatic.com/s/notosansjp/v28/
52 KB
52 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.119.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
d3433bbae8708076d6e9520170f8bedce10e23541ab1937e25fd9a7fb68c63fd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 10:07:07 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:19:54 GMT
server
sffe
age
382545
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
52800
x-xss-protection
0
expires
Fri, 04 Mar 2022 10:07:07 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.107.woff2
fonts.gstatic.com/s/notosansjp/v28/
13 KB
13 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.107.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
e3b2fad6e3232fa74667f0d123ec81ea032faafa050e2d9343a2801ffc1f8fda
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 04:27:15 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:22:56 GMT
server
sffe
age
316537
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13692
x-xss-protection
0
expires
Sat, 05 Mar 2022 04:27:15 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.115.woff2
fonts.gstatic.com/s/notosansjp/v28/
13 KB
13 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.115.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
48fc83f0f96ce8185898f554404d560beb6312334902a207bf103baf5cf7aeb1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 19:42:37 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:14:51 GMT
server
sffe
age
348015
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13696
x-xss-protection
0
expires
Fri, 04 Mar 2022 19:42:37 GMT
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.115.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.115.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
3b27a0f37afa496acb2b319b9313d75387868e359e51a06b004d37f63eb92423
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 12:57:28 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:19:56 GMT
server
sffe
age
372324
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14040
x-xss-protection
0
expires
Fri, 04 Mar 2022 12:57:28 GMT
-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.105.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F6pfjtqLzI2JPCgQBnw7HFQei0q1xVxjfp_dakBof6Bs-tb3ab2FNISVac.105.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
e2c9a0ca9f379618b4cd9bac6bc1f3aaedfae3098a0fc40838c8727a8237a9f1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 03:26:13 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:21:32 GMT
server
sffe
age
492999
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14276
x-xss-protection
0
expires
Thu, 03 Mar 2022 03:26:13 GMT
img_d503db31681f69c860745388f7ce2dd3295430.jpg
mikiki.ismcdn.jp/mwimgs/d/5/220h/
12 KB
12 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/d/5/220h/img_d503db31681f69c860745388f7ce2dd3295430.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
8df04fbf0ee24d2c53bbb5bfac066f3f48a12a3eead84447a0895cf883f4c787
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Tue, 02 Mar 2021 01:58:59 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2056870
accept-ranges
bytes
content-length
12522
expires
Thu, 01 Apr 2021 15:44:02 GMT
img_0f67a4d7dbf0923ec0a37530aa34ef3d350161.jpg
mikiki.ismcdn.jp/mwimgs/0/f/220/
11 KB
11 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/0/f/220/img_0f67a4d7dbf0923ec0a37530aa34ef3d350161.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
f26f4ed0cd0fcff9e113702943608d2ec7027c5fc00ac63da3342a238cb21a65
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Mon, 08 Mar 2021 06:13:51 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2576145
accept-ranges
bytes
content-length
11349
expires
Wed, 07 Apr 2021 15:58:37 GMT
img_7b18e9c6f970d7e266171b643112cad41315554.jpg
mikiki.ismcdn.jp/mwimgs/7/b/220h/
32 KB
32 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/7/b/220h/img_7b18e9c6f970d7e266171b643112cad41315554.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
cbb42fbf762c91aab4a0cf83c79a0321a313f2afdaca434938c5a70bb4b0f312
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Tue, 02 Mar 2021 01:30:16 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2576159
accept-ranges
bytes
content-length
32743
expires
Wed, 07 Apr 2021 15:58:51 GMT
img_f65b13aa32eeacd10e0e9b5a6f0127cf379591.jpg
mikiki.ismcdn.jp/mwimgs/f/6/220/
26 KB
26 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/f/6/220/img_f65b13aa32eeacd10e0e9b5a6f0127cf379591.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
64d912aaf1bd52176c21cf9b20c17138009206bbb995347e01497c9af52603d9
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Wed, 09 Dec 2020 12:35:05 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2319853
accept-ranges
bytes
content-length
26322
expires
Sun, 04 Apr 2021 16:47:05 GMT
img_97c2133c5d8b5d072fb75913c93546b8361024.jpg
mikiki.ismcdn.jp/mwimgs/9/7/220h/
13 KB
13 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/9/7/220h/img_97c2133c5d8b5d072fb75913c93546b8361024.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
dba37c703ff1168aa666051c5124328416b201d68e63254164b74d21c051e7d8
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Tue, 02 Mar 2021 00:58:35 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2293881
accept-ranges
bytes
content-length
13251
expires
Sun, 04 Apr 2021 09:34:13 GMT
img_62c33438ef0759a80dab9f14f41d9e61238571.jpg
mikiki.ismcdn.jp/mwimgs/6/2/220/
10 KB
11 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/6/2/220/img_62c33438ef0759a80dab9f14f41d9e61238571.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
691bd7c5db18aa275aaae9df3bd920824b5f53ca93d11ad66b31ef6712ce991b
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Mon, 22 Feb 2021 05:50:07 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2489346
accept-ranges
bytes
content-length
10598
expires
Tue, 06 Apr 2021 15:51:58 GMT
img_647209f0f6258262193ed28cf595330a1233484.jpg
mikiki.ismcdn.jp/mwimgs/6/4/220/
50 KB
51 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/6/4/220/img_647209f0f6258262193ed28cf595330a1233484.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
27325306da8c2cba1992c4a1bd5b4235efc13787f008941be87adfe639db115e
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Thu, 25 Feb 2021 04:34:09 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2402347
accept-ranges
bytes
content-length
51510
expires
Mon, 05 Apr 2021 15:41:59 GMT
img_4fcb45c2cf8307bd0f9876b44fac92cd880224.jpg
mikiki.ismcdn.jp/mwimgs/4/f/220/
553 KB
555 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/4/f/220/img_4fcb45c2cf8307bd0f9876b44fac92cd880224.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
5ad69c79701638fa11e592ad9c1c42357bc39f3457b49ec0981c364f91b12ba0
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Sun, 21 Feb 2021 07:24:26 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2576115
accept-ranges
bytes
content-length
566511
expires
Wed, 07 Apr 2021 15:58:07 GMT
img_4e5cd1d3eaae222e6612692c7f3588671471823.jpg
mikiki.ismcdn.jp/mwimgs/4/e/220/
68 KB
68 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/4/e/220/img_4e5cd1d3eaae222e6612692c7f3588671471823.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
7d81fad253fb0c84643f23a009e0789098784547e779e0172cfe3bf289f836b1
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Fri, 05 Mar 2021 06:48:42 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2576272
accept-ranges
bytes
content-length
69374
expires
Wed, 07 Apr 2021 16:00:44 GMT
img_ca64037cc5eb048e82a8365dd89989b8345344.jpg
mikiki.ismcdn.jp/mwimgs/c/a/220/
13 KB
13 KB
Image
General
Full URL
https://mikiki.ismcdn.jp/mwimgs/c/a/220/img_ca64037cc5eb048e82a8365dd89989b8345344.jpg
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2.16.107.89 Frankfurt am Main, Germany, ASN20940 (AKAMAI-ASN1, NL),
Reverse DNS
a2-16-107-89.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
2d854c79c7236ee7c65d111852cd73374234fc73023274e98a89259102302e88
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-cache-ttl
900.000
date
Mon, 08 Mar 2021 20:22:52 GMT
last-modified
Wed, 24 Feb 2021 04:06:47 GMT
strict-transport-security
max-age=31536000
content-type
image/jpeg
cache-control
max-age=2294028
accept-ranges
bytes
content-length
13538
expires
Sun, 04 Apr 2021 09:36:40 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.111.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.111.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
846f7d8e67c639570b124028d5a21ad5ec84492239c3bef7e9cd3517cdbc5cbc
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 03:23:20 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:14:48 GMT
server
sffe
age
493172
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14108
x-xss-protection
0
expires
Thu, 03 Mar 2022 03:23:20 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.83.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.83.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
19a69f647c93a07b8b2605e1d56c79d0b374807cdcb419fcdced2c55b9343aa1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:30:29 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:17:54 GMT
server
sffe
age
6743
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16096
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:30:29 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.92.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.92.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
8639ff502223c403a24492e198023ec853f86bdc3dbe0e3166e5b3c8a8701987
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 03:24:14 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:11 GMT
server
sffe
age
493118
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15832
x-xss-protection
0
expires
Thu, 03 Mar 2022 03:24:14 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.84.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.84.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
93fe41db9f07e54a5534338808be67ac02efa6f7bb84ba8d1dcfd5f671d1a939
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 12:26:29 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:19:33 GMT
server
sffe
age
287783
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15356
x-xss-protection
0
expires
Sat, 05 Mar 2022 12:26:29 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.67.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.67.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
d3be57f602efeede358880a0a90d42209cef6db6fe27519a00df90bd90602ecd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 05:59:40 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:38 GMT
server
sffe
age
310992
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14612
x-xss-protection
0
expires
Sat, 05 Mar 2022 05:59:40 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.94.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.94.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
439d47c8b190ac1a23cdce79411e328372a148e70de6be3259200d33134dd557
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:54:34 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:08:48 GMT
server
sffe
age
5298
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16420
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:54:34 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.100.woff2
fonts.gstatic.com/s/notosansjp/v28/
17 KB
17 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.100.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
5e192e51fcc97d233b14975854b646e695e0953bf04bd70756ff351ca2c5dc23
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 19:53:03 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:22:56 GMT
server
sffe
age
433789
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17108
x-xss-protection
0
expires
Thu, 03 Mar 2022 19:53:03 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.102.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.102.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
c6546c7051e9f1a615bd2d11b997ac6e7516ce160dba3f9ff2a526bedff75823
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:36:01 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:02 GMT
server
sffe
age
6411
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15136
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:36:01 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.68.woff2
fonts.gstatic.com/s/notosansjp/v28/
17 KB
17 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.68.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
39a0d8ab6450afa84d4b1996dd3f703b73d02000684a2bbe70d2e37dde661cde
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 19:50:03 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:14 GMT
server
sffe
age
347569
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17812
x-xss-protection
0
expires
Fri, 04 Mar 2022 19:50:03 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.105.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.105.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
2f1a66f9a01bdcd1009095bef115bde5f1df8a7389b28b29735f89e0867c9ab2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 15:01:54 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:03 GMT
server
sffe
age
537658
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14000
x-xss-protection
0
expires
Wed, 02 Mar 2022 15:01:54 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.78.woff2
fonts.gstatic.com/s/notosansjp/v28/
17 KB
17 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.78.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
15cdd64531bdd5d775ca0bd6545a4d2c9fd0b1fa7e0f12caa1196fa2d1218b52
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 15:06:37 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:21:01 GMT
server
sffe
age
450975
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17080
x-xss-protection
0
expires
Thu, 03 Mar 2022 15:06:37 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.73.woff2
fonts.gstatic.com/s/notosansjp/v28/
17 KB
17 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.73.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
2041bd7fe56ee702d796770dc9d7dd4890fa2140bb1038ec7140e8f9ef84e7e9
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 19:43:12 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:17:06 GMT
server
sffe
age
347980
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17056
x-xss-protection
0
expires
Fri, 04 Mar 2022 19:43:12 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.104.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.104.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
f29d11feed082dab235d2bb1d7630b142de08616b978a9709cc6899d9d56a708
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 01:58:29 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:04 GMT
server
sffe
age
411863
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14268
x-xss-protection
0
expires
Fri, 04 Mar 2022 01:58:29 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.95.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.95.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
62a7fa666d6f46c8911b5e637e752c2472eae6bcbb32fa59dc05b9374f9e4839
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Fri, 05 Mar 2021 15:07:53 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:19:08 GMT
server
sffe
age
278099
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15028
x-xss-protection
0
expires
Sat, 05 Mar 2022 15:07:53 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.106.woff2
fonts.gstatic.com/s/notosansjp/v28/
18 KB
18 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.106.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
965a3375a1c13fc67b57e0b4eaec43998ab57cd02c20e7a7e4774e0e5614926c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 10:32:38 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:03 GMT
server
sffe
age
208214
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17936
x-xss-protection
0
expires
Sun, 06 Mar 2022 10:32:38 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.98.woff2
fonts.gstatic.com/s/notosansjp/v28/
15 KB
15 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.98.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
75cb87c3dcf435025338b8a5afa68f31bb7d3b88de17659ea1b6c294a116d3ca
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 03:24:17 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:20:59 GMT
server
sffe
age
493115
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
15160
x-xss-protection
0
expires
Thu, 03 Mar 2022 03:24:17 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.33.woff2
fonts.gstatic.com/s/notosansjp/v28/
46 KB
46 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.33.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
63e5a151b0522b0aa537ccfb24ee8538129589386ab99bdee61c09bcc44d2bee
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 19:46:15 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:05:23 GMT
server
sffe
age
347797
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
47328
x-xss-protection
0
expires
Fri, 04 Mar 2022 19:46:15 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.85.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.85.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
bf5365396cf8864cacf254de07a9311f664635927a0d7cae79ceb26a9bdc015b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 10:43:29 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:19:05 GMT
server
sffe
age
207563
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14348
x-xss-protection
0
expires
Sun, 06 Mar 2022 10:43:29 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.70.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.70.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
6831f3f64549e3c7d50cfac29d9977f85ea2cf55efbfb95db768ad2dc096216b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 18:11:00 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:46 GMT
server
sffe
age
7912
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16060
x-xss-protection
0
expires
Tue, 08 Mar 2022 18:11:00 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.77.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.77.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
22f740c9cd6e4d77dc5a633fa4fd1e22e23644f3e04d2fe9bb10872e66347e53
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Thu, 04 Mar 2021 19:42:40 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:17:52 GMT
server
sffe
age
348012
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
14736
x-xss-protection
0
expires
Fri, 04 Mar 2022 19:42:40 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.103.woff2
fonts.gstatic.com/s/notosansjp/v28/
14 KB
14 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.103.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
2251e565d2d24030b91f7eca2f09d488822c353e41fd28ad07aa7fdca3d68006
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Sat, 06 Mar 2021 10:29:33 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:09:07 GMT
server
sffe
age
208399
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
13908
x-xss-protection
0
expires
Sun, 06 Mar 2022 10:29:33 GMT
-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.79.woff2
fonts.gstatic.com/s/notosansjp/v28/
16 KB
16 KB
Font
General
Full URL
https://fonts.gstatic.com/s/notosansjp/v28/-F62fjtqLzI2JPCgQBnw7HFow2oe2EcP5pp0erwTqsSWs9Jezazjcb4.79.woff2
Requested by
Host: fonts.googleapis.com
URL: https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;700&display=swap
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:800::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
514dc56a08fa1eef64ebd657afd5a7186ade9da1ff353252355bbb6197c2b483
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Origin
https://mikiki.tokyo.jp
Referer
https://fonts.googleapis.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Wed, 03 Mar 2021 21:58:07 GMT
x-content-type-options
nosniff
last-modified
Thu, 12 Nov 2020 04:19:32 GMT
server
sffe
age
426285
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
16576
x-xss-protection
0
expires
Thu, 03 Mar 2022 21:58:07 GMT
truncated
/
249 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
c7b9f405db9cd7c70368e843566881beeed2e413398f276601bc15442740431a

Request headers

Referer
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

Content-Type
text/javascript
geolocation
checkout-api.worldshopping.jp/v1/
46 B
490 B
XHR
General
Full URL
https://checkout-api.worldshopping.jp/v1/geolocation
Requested by
Host: checkout-api.worldshopping.jp
URL: https://checkout-api.worldshopping.jp/v1/script?token=tower_jp
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
143.204.209.77 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-209-77.fra53.r.cloudfront.net
Software
/
Resource Hash
d9842b3bd40597ceb2f1635a7f1e50885aa951f9a0882a0303a526d9363e44e2

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:54 GMT
via
1.1 b44e2902bb3501d47514e51618f1bda5.cloudfront.net (CloudFront), 1.1 110641d379117242a91443ac729d6def.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA50-C1, FRA53-C1
x-amzn-requestid
47700042-38f4-4bb5-a5bd-a954029900b2
x-cache
Miss from cloudfront
content-type
application/json; charset=utf-8
access-control-allow-origin
*
x-amzn-trace-id
Root=1-6046879e-241c497006a6314966c4f754;Sampled=0
x-amz-apigw-id
b4oguFWmNjMFt5g=
content-length
46
x-amz-cf-id
Mopk-I9V3LOmQ_njTzP5qnGDzJ9nei-wJOuJp8gqTwfnY9U9sI4WfA==
ytag.js
s.yimg.jp/images/listing/tool/cv/
23 KB
7 KB
Script
General
Full URL
https://s.yimg.jp/images/listing/tool/cv/ytag.js
Requested by
Host: s.yjtag.jp
URL: https://s.yjtag.jp/tag.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
182.22.24.252 , Japan, ASN23816 (YAHOO Yahoo Japan Corporation, JP),
Reverse DNS
Software
ATS /
Resource Hash
fcb5ee7a8fcec48a11b7adf420332a9ff2cf49f99558795d6b7b810618573e35

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

ats-carp-promotion
1
date
Mon, 08 Mar 2021 20:17:46 GMT
content-encoding
gzip
last-modified
Wed, 30 Sep 2020 06:06:44 GMT
server
ATS
age
308
vary
Accept-Encoding
p3p
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
via
http/1.1 edge1379.img.bbt.yahoo.co.jp (ApacheTrafficServer [cRs f ]), http/1.1 edge1308.img.bbt.yahoo.co.jp (ApacheTrafficServer [cRs f ]), http/1.1 edge1376.img.bbt.yahoo.co.jp (ApacheTrafficServer [cRs f ])
cache-control
public, max-age=600
accept-ranges
bytes
content-type
application/javascript
content-length
6746
expires
Mon, 08 Mar 2021 20:27:46 GMT
checkout-3_2_28.js
checkout-js.worldshopping.jp/
1 MB
465 KB
Script
General
Full URL
https://checkout-js.worldshopping.jp/checkout-3_2_28.js
Requested by
Host: checkout-api.worldshopping.jp
URL: https://checkout-api.worldshopping.jp/v1/script?token=tower_jp
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.96.8 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f2a2ee4c98a33eff54867b89cfbc07f93bd3e550736b49d9f4c5f99f16f20d2f

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-amz-version-id
XJQK0LDXRAUi..4jwbLx0Itv1b3kp8pf
content-encoding
gzip
last-modified
Fri, 05 Mar 2021 03:31:34 GMT
server
AmazonS3
x-amz-cf-pop
PRG50-C1
etag
W/"75ec39c035d87e42afd4699a73b57f71"
vary
Accept-Encoding
x-cache
RefreshHit from cloudfront
content-type
application/javascript
via
1.1 6fc3cae9692b6db972e4990be9921fae.cloudfront.net (CloudFront)
date
Mon, 08 Mar 2021 20:22:56 GMT
x-amz-cf-id
oxSp2VWO55_OpZut7YdlxFgXD7BKXfZK3wCdvnbJ-dz8y2ecjch79Q==
sodar
pagead2.googlesyndication.com/getconfig/
8 KB
7 KB
XHR
General
Full URL
https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gda&tv=r20210303&st=env
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:827::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
b0bba882ca184170cc4f6a79cff496f9bbcfc075153b811d9f90bc6f13a38ac0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

timing-allow-origin
*
date
Mon, 08 Mar 2021 20:22:55 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
private
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
content-type
application/json; charset=UTF-8
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
6483
x-xss-protection
0
conversion_async.js
www.googleadservices.com/pagead/
32 KB
13 KB
Script
General
Full URL
https://www.googleadservices.com/pagead/conversion_async.js
Requested by
Host: s.yjtag.jp
URL: https://s.yjtag.jp/tag.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
mil04s23-in-f2.1e100.net
Software
cafe /
Resource Hash
194db57ea5c3a9e20e350591abf1373f9ce6c05f6ba10c7f7a05116d5dcbb003
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:55 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
12538
x-xss-protection
0
server
cafe
etag
17494555688414437399
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Mon, 08 Mar 2021 20:22:55 GMT
/
b92.yahoo.co.jp/search/
0
658 B
Script
General
Full URL
https://b92.yahoo.co.jp/search/?p=6ELZ7URVW7&label=&ref=https%3A%2F%2Fmikiki.tokyo.jp%2F&rref=&pt=&item=&cat=&price=&quantity=&r=1615234975.8877237&pvid=rksz6yb6d5km1177v7&tsyjad=0&_impl=ytag
Requested by
Host: s.yimg.jp
URL: https://s.yimg.jp/images/listing/tool/cv/ytag.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
182.22.24.252 , Japan, ASN23816 (YAHOO Yahoo Japan Corporation, JP),
Reverse DNS
Software
ATS /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1;mode=block

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 08 Mar 2021 20:22:56 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
ATS
age
0
x-frame-options
SAMEORIGIN
p3p
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
via
http/1.1 edge1376.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ])
cache-control
private, no-cache, no-store, post-check=0, pre-check=0
content-type
text/javascript; charset=utf-8
vary
Accept-Encoding
x-xss-protection
1;mode=block
expires
-1
td.min.js
cdn.treasuredata.com/sdk/1.8.4/
35 KB
13 KB
Script
General
Full URL
https://cdn.treasuredata.com/sdk/1.8.4/td.min.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
99.84.90.65 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-99-84-90-65.muc50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
daa628950f0ec33a7b28e88dc22d7a3723fae18b2cddb153fcc1f75018b040c5

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

Date
Tue, 01 Dec 2020 15:47:47 GMT
Content-Encoding
gzip
Connection
keep-alive
Last-Modified
Mon, 10 Jul 2017 21:13:20 GMT
Server
AmazonS3
Age
8397309
ETag
W/"e48ca102469fcb87cf0490c3b83832d9"
Vary
Accept-Encoding
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 7ede51d8c775deaef83b54a3beafab3c.cloudfront.net (CloudFront)
Cache-Control
public, max-age=315360000
Transfer-Encoding
chunked
X-Amz-Cf-Pop
MUC50-C1
X-Amz-Cf-Id
zaOlL6m_ymJj_jG0cm12oJ-DKjdw2oa_FL6DTmSB0kaRnBTxDkQxFg==
tracking.min.js
img.ak.impact-ad.jp/ut/a1/
50 KB
14 KB
Script
General
Full URL
https://img.ak.impact-ad.jp/ut/a1/tracking.min.js
Requested by
Host: mikiki.tokyo.jp
URL: https://mikiki.tokyo.jp/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.19 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
79979e1699a23bad2b34332432d42c4c55729c210f894708a26e3ea9a61c77cc

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:55 GMT
via
1.1 varnish
age
45700
x-cache
HIT
content-encoding
gzip
content-length
13705
x-served-by
cache-fra19123-FRA
last-modified
Wed, 13 Jan 2021 07:39:26 GMT
server
AmazonS3
x-timer
S1615234976.976022,VS0,VE0
etag
"beaa421c5f3c949f8129e98a82545e59"
vary
Accept-Encoding
content-type
text/javascript
cache-control
no-cache
accept-ranges
bytes
x-cache-hits
1207
default
api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en-US/
3 B
594 B
XHR
General
Full URL
https://api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en-US/default
Requested by
Host: text
URL: data:text/javascript;base64,ZnVuY3Rpb24gb25Mb2FkWmlnWmFnKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgbyBpbiB0KW4uZChyLG8sZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsImEiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPSIvIixuKG4ucz0zMDIpfShbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQpLG89big0NCkuZixpPW4oODcpLGE9bigxKSxzPW4oMzEpLHU9bigxNyksYz1uKDE0KSxsPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUsbil9cmV0dXJuIG5ldyB0KGUsbixyKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlLnByb3RvdHlwZT10LnByb3RvdHlwZSxlfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixmLHAsaCxkLGcsdix5LG09dC50YXJnZXQsYj10Lmdsb2JhbCx4PXQuc3RhdCx3PXQucHJvdG8saz1iP3I6eD9yW21dOihyW21dfHx7fSkucHJvdG90eXBlLFM9Yj9hOmFbbV18fChhW21dPXt9KSxFPVMucHJvdG90eXBlO2ZvcihwIGluIGUpbj0haShiP3A6bSsoeD8iLiI6IiMiKStwLHQuZm9yY2VkKSYmayYmYyhrLHApLGQ9U1twXSxuJiYoZz10Lm5vVGFyZ2V0R2V0Pyh5PW8oayxwKSkmJnkudmFsdWU6a1twXSksaD1uJiZnP2c6ZVtwXSxuJiZ0eXBlb2YgZD09dHlwZW9mIGh8fCh2PXQuYmluZCYmbj9zKGgscik6dC53cmFwJiZuP2woaCk6dyYmImZ1bmN0aW9uIj09dHlwZW9mIGg/cyhGdW5jdGlvbi5jYWxsLGgpOmgsKHQuc2hhbXx8aCYmaC5zaGFtfHxkJiZkLnNoYW0pJiZ1KHYsInNoYW0iLCEwKSxTW3BdPXYsdyYmKGMoYSxmPW0rIlByb3RvdHlwZSIpfHx1KGEsZix7fSksYVtmXVtwXT1oLHQucmVhbCYmRSYmIUVbcF0mJnUoRSxwLGgpKSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDU4KSxpPW4oNzApLGE9big5NCkscz1yLlN5bWJvbCx1PW8oIndrcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdVt0XXx8KHVbdF09YSYmc1t0XXx8KGE/czppKSgiU3ltYm9sLiIrdCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksbz1uKDE0KSxpPW4oNzUpLGE9bigyMykuZjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9ci5TeW1ib2x8fChyLlN5bWJvbD17fSk7byhlLHQpfHxhKGUsdCx7dmFsdWU6aS5mKHQpfSl9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3ZhciBuPSJvYmplY3QiLHI9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuTWF0aD09TWF0aCYmdH07dC5leHBvcnRzPXIodHlwZW9mIGdsb2JhbFRoaXM9PW4mJmdsb2JhbFRoaXMpfHxyKHR5cGVvZiB3aW5kb3c9PW4mJndpbmRvdyl8fHIodHlwZW9mIHNlbGY9PW4mJnNlbGYpfHxyKHR5cGVvZiBlPT1uJiZlKXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKX0pLmNhbGwodGhpcyxuKDg1KSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaCh0KXtyZXR1cm4hMH19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/bnVsbCE9PXQ6ImZ1bmN0aW9uIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEzNil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjA5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTApO2Z1bmN0aW9uIG8odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLHIodCxvLmtleSxvKX19dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmbyh0LnByb3RvdHlwZSxlKSxuJiZvKHQsbiksdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30uaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY2FsbCh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTYzKSxvPW4oOTYpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPW8/cjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fHIodCl9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksbz1uKDIzKSxpPW4oMzApO3QuZXhwb3J0cz1yP2Z1bmN0aW9uKHQsZSxuKXtyZXR1cm4gby5mKHQsZSxpKDEsbikpfTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bix0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByW3QrIlByb3RvdHlwZSJdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTcxKSxvPW4oMTc1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1yKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmbyh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0Nil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KSxvPW4oNDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihvKHQpKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLG89big4NiksaT1uKDExKSxhPW4oNTQpLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O2UuZj1yP3M6ZnVuY3Rpb24odCxlLG4pe2lmKGkodCksZT1hKGUsITApLGkobiksbyl0cnl7cmV0dXJuIHModCxlLG4pfWNhdGNoKHQpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIG4mJih0W2VdPW4udmFsdWUpLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0NSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qocih0KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjEpLG89bi5uKHIpO2Z1bmN0aW9uIGkodCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzLmRlYnVnTG9nZ2VyKCkobygpKHQpKX1lLmE9e2RlYnVnOmksZXJyb3I6ZnVuY3Rpb24odCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzJiZlLnV0aWxzLmVycm9yTG9nZ2VyJiZlLnV0aWxzLmVycm9yTG9nZ2VyKCkodCksaSh0KX19fSxmdW5jdGlvbih0LGUpe3ZhciBuPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbi5jYWxsKHQpLnNsaWNlKDgsLTEpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzKS5mLG89bigxNyksaT1uKDE0KSxhPW4oMTgzKSxzPW4oMikoInRvU3RyaW5nVGFnIiksdT1hIT09e30udG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGMpe2lmKHQpe3ZhciBsPW4/dDp0LnByb3RvdHlwZTtpKGwscyl8fHIobCxzLHtjb25maWd1cmFibGU6ITAsdmFsdWU6ZX0pLGMmJnUmJm8obCwidG9TdHJpbmciLGEpfX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTplfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2lmKHIodCksdm9pZCAwPT09ZSlyZXR1cm4gdDtzd2l0Y2gobil7Y2FzZSAwOnJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmNhbGwoZSl9O2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQuY2FsbChlLG4pfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIHQuY2FsbChlLG4scil9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24obixyLG8pe3JldHVybiB0LmNhbGwoZSxuLHIsbyl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsYXJndW1lbnRzKX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxvPW4oNCksaT1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OnZvaWQgMH07dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9pKHJbdF0pfHxpKG9bdF0pOnJbdF0mJnJbdF1bZV18fG9bdF0mJm9bdF1bZV19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD9vKHIodCksOTAwNzE5OTI1NDc0MDk5MSk6MH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxODApLmNoYXJBdCxvPW4oNDkpLGk9big5OCksYT1vLnNldCxzPW8uZ2V0dGVyRm9yKCJTdHJpbmcgSXRlcmF0b3IiKTtpKFN0cmluZywiU3RyaW5nIixmdW5jdGlvbih0KXthKHRoaXMse3R5cGU6IlN0cmluZyBJdGVyYXRvciIsc3RyaW5nOlN0cmluZyh0KSxpbmRleDowfSl9LGZ1bmN0aW9uKCl7dmFyIHQsZT1zKHRoaXMpLG49ZS5zdHJpbmcsbz1lLmluZGV4O3JldHVybiBvPj1uLmxlbmd0aD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9Oih0PXIobixvKSxlLmluZGV4Kz10Lmxlbmd0aCx7dmFsdWU6dCxkb25lOiExfSl9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTcpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixvKXtvJiZvLmVudW1lcmFibGU/dFtlXT1uOnIodCxlLG4pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTc2KSxvPW4oMjA4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4hZXx8Im9iamVjdCIhPT1yKGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9vKHQpOmV9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjIyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyMyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjI2KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyNyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzApfSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9SlNPTi5wYXJzZSgneyJsb2NpemUiOnsicHJvZHVjdElkIjoiNjBmZjgyMjQtYmJjYy00ODAyLThkNTktYzg5ODNkZWFlOGQwIiwiYXBpS2V5IjoiNzM5NmU3NzgtMDkwMy00ZTdlLTgyODItZTY3MTU4NThiYjhjIiwidmVyc2lvbiI6InByb2R1Y3Rpb24ifSwiaW50ZWdyYXRpb25zIjp7ImNvbG9ybWVBcHAiOnsiYXBpIjp7InByb2R1Y3QiOiJodHRwczovL2NvbG9ybWUud29ybGRzaG9wcGluZy5qcC92MS9wcm9kdWN0In19LCJzaG9waWZ5QXBwIjp7ImFwaSI6eyJwcm9kdWN0IjoiaHR0cHM6Ly9hcHAtcy53b3JsZHNob3BwaW5nLmpwL3YxL3Byb2R1Y3QifX19LCJsYW1iZGEiOnsiY3JlYXRlIjoic2hvcC1kYXRhLXByb2QtY3JlYXRlIiwiY2xlYXIiOiJzaG9wLWRhdGEtcHJvZC1jbGVhciJ9LCJzZmRjIjp7ImNvbm5lY3Rpb25TZXR0aW5nc1BhdGgiOiIvc2ZkYy9wcm9kL2FwaSJ9LCJkZWJ1Z0hvc3RzIjpbInNob3AtZGFzaGJvYXJkLndvcmxkc2hvcHBpbmcuYml6Iiwic2hvcC1kYXNoYm9hcmQtZGV2Lndvcmxkc2hvcHBpbmcuYml6Iiwic2hvcC1kYXNoYm9hcmQtbG9jYWwud29ybGRzaG9wcGluZy5iaXoiXX0nKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLG89big2NCksaT1uKDMwKSxhPW4oMjEpLHM9big1NCksdT1uKDE0KSxjPW4oODYpLGw9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtlLmY9cj9sOmZ1bmN0aW9uKHQsZSl7aWYodD1hKHQpLGU9cyhlLCEwKSxjKXRyeXtyZXR1cm4gbCh0LGUpfWNhdGNoKHQpe31pZih1KHQsZSkpcmV0dXJuIGkoIW8uZi5jYWxsKHQsZSksdFtlXSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIit0KTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oMTM5KSxpPW4oNjkpLGE9big1Nikscz1uKDkwKSx1PW4oNjYpLGM9big1NykoIklFX1BST1RPIiksbD1mdW5jdGlvbigpe30sZj1mdW5jdGlvbigpe3ZhciB0LGU9dSgiaWZyYW1lIiksbj1pLmxlbmd0aDtmb3IoZS5zdHlsZS5kaXNwbGF5PSJub25lIixzLmFwcGVuZENoaWxkKGUpLGUuc3JjPVN0cmluZygiamF2YXNjcmlwdDoiKSwodD1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSx0LndyaXRlKCI8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PFwvc2NyaXB0PiIpLHQuY2xvc2UoKSxmPXQuRjtuLS07KWRlbGV0ZSBmLnByb3RvdHlwZVtpW25dXTtyZXR1cm4gZigpfTt0LmV4cG9ydHM9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbnVsbCE9PXQ/KGwucHJvdG90eXBlPXIodCksbj1uZXcgbCxsLnByb3RvdHlwZT1udWxsLG5bY109dCk6bj1mKCksdm9pZCAwPT09ZT9uOm8obixlKX0sYVtjXT0hMH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjYpO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iQXJyYXkiPT1yKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQpLG89bigyNCksaT1uKDU3KSxhPW4oOTUpLHM9aSgiSUVfUFJPVE8iKSx1PU9iamVjdC5wcm90b3R5cGU7dC5leHBvcnRzPWE/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0PW8odCkscih0LHMpP3Rbc106ImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3ImJnQgaW5zdGFuY2VvZiB0LmNvbnN0cnVjdG9yP3QuY29uc3RydWN0b3IucHJvdG90eXBlOnQgaW5zdGFuY2VvZiBPYmplY3Q/dTpudWxsfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhPW4oMTgxKSxzPW4oNCksdT1uKDYpLGM9bigxNyksbD1uKDE0KSxmPW4oNTcpLHA9big1NiksaD1zLldlYWtNYXA7aWYoYSl7dmFyIGQ9bmV3IGgsZz1kLmdldCx2PWQuaGFzLHk9ZC5zZXQ7cj1mdW5jdGlvbih0LGUpe3JldHVybiB5LmNhbGwoZCx0LGUpLGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIGcuY2FsbChkLHQpfHx7fX0saT1mdW5jdGlvbih0KXtyZXR1cm4gdi5jYWxsKGQsdCl9fWVsc2V7dmFyIG09Zigic3RhdGUiKTtwW21dPSEwLHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYyh0LG0sZSksZX0sbz1mdW5jdGlvbih0KXtyZXR1cm4gbCh0LG0pP3RbbV06e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIGwodCxtKX19dC5leHBvcnRzPXtzZXQ6cixnZXQ6byxoYXM6aSxlbmZvcmNlOmZ1bmN0aW9uKHQpe3JldHVybiBpKHQpP28odCk6cih0LHt9KX0sZ2V0dGVyRm9yOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbjtpZighdShlKXx8KG49byhlKSkudHlwZSE9PXQpdGhyb3cgVHlwZUVycm9yKCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICIrdCsiIHJlcXVpcmVkIik7cmV0dXJuIG59fX19LGZ1bmN0aW9uKHQsZSxuKXtuKDEwMSk7dmFyIHI9bigxODQpLG89big0KSxpPW4oMTcpLGE9bigyOSkscz1uKDIpKCJ0b1N0cmluZ1RhZyIpO2Zvcih2YXIgdSBpbiByKXt2YXIgYz1vW3VdLGw9YyYmYy5wcm90b3R5cGU7bCYmIWxbc10mJmkobCxzLHUpLGFbdV09YS5BcnJheX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc2KSxvPW4oMjkpLGk9bigyKSgiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbCE9dClyZXR1cm4gdFtpXXx8dFsiQEBpdGVyYXRvciJdfHxvW3IodCldfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPWZ1bmN0aW9uKHQpe3ZhciBlLG47dGhpcy5wcm9taXNlPW5ldyB0KGZ1bmN0aW9uKHQscil7aWYodm9pZCAwIT09ZXx8dm9pZCAwIT09bil0aHJvdyBUeXBlRXJyb3IoIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yIik7ZT10LG49cn0pLHRoaXMucmVzb2x2ZT1yKGUpLHRoaXMucmVqZWN0PXIobil9O3QuZXhwb3J0cy5mPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighcih0KSlyZXR1cm4gdDt2YXIgbixvO2lmKGUmJiJmdW5jdGlvbiI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49dC52YWx1ZU9mKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO2lmKCFlJiYiZnVuY3Rpb24iPT10eXBlb2Yobj10LnRvU3RyaW5nKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OCksbz1uKDY5KTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsbyl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTgpLG89big3MCksaT1yKCJrZXlzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpW3RdfHwoaVt0XT1vKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89bigxNDApLGk9bigyNyksYT1yWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8bygiX19jb3JlLWpzX3NoYXJlZF9fIix7fSk7KHQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhW3RdfHwoYVt0XT12b2lkIDAhPT1lP2U6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4yLjAiLG1vZGU6aT8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE5IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDExMiksaT1uKDMzKSxhPW4oMzEpLHM9big1MSksdT1uKDExMSksYz1mdW5jdGlvbih0LGUpe3RoaXMuc3RvcHBlZD10LHRoaXMucmVzdWx0PWV9Oyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxmKXt2YXIgcCxoLGQsZyx2LHksbT1hKGUsbixsPzI6MSk7aWYoZilwPXQ7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YoaD1zKHQpKSl0aHJvdyBUeXBlRXJyb3IoIlRhcmdldCBpcyBub3QgaXRlcmFibGUiKTtpZihvKGgpKXtmb3IoZD0wLGc9aSh0Lmxlbmd0aCk7Zz5kO2QrKylpZigodj1sP20ocih5PXRbZF0pWzBdLHlbMV0pOm0odFtkXSkpJiZ2IGluc3RhbmNlb2YgYylyZXR1cm4gdjtyZXR1cm4gbmV3IGMoITEpfXA9aC5jYWxsKHQpfWZvcig7ISh5PXAubmV4dCgpKS5kb25lOylpZigodj11KHAsbSx5LnZhbHVlLGwpKSYmdiBpbnN0YW5jZW9mIGMpcmV0dXJuIHY7cmV0dXJuIG5ldyBjKCExKX0pLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjKCEwLHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybntlcnJvcjohMSx2YWx1ZTp0KCl9fWNhdGNoKHQpe3JldHVybntlcnJvcjohMCx2YWx1ZTp0fX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQxKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzMyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyODUpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixpPW8mJiFyLmNhbGwoezE6Mn0sMSk7ZS5mPWk/ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpyfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KSxvPW4oMjYpLGk9IiIuc3BsaXQ7dC5leHBvcnRzPXIoZnVuY3Rpb24oKXtyZXR1cm4hT2JqZWN0KCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KT9mdW5jdGlvbih0KXtyZXR1cm4iU3RyaW5nIj09byh0KT9pLmNhbGwodCwiIik6T2JqZWN0KHQpfTpPYmplY3R9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89big2KSxpPXIuZG9jdW1lbnQsYT1vKGkpJiZvKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKSxvPW4oMzMpLGk9big4OSksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3ZhciBzLHU9cihlKSxjPW8odS5sZW5ndGgpLGw9aShhLGMpO2lmKHQmJm4hPW4pe2Zvcig7Yz5sOylpZigocz11W2wrK10pIT1zKXJldHVybiEwfWVsc2UgZm9yKDtjPmw7bCsrKWlmKCh0fHxsIGluIHUpJiZ1W2xdPT09bilyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmEoITApLGluZGV4T2Y6YSghMSl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/cjpuKSh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIitTdHJpbmcodm9pZCAwPT09dD8iIjp0KSsiKV8iKygrK24rcikudG9TdHJpbmcoMzYpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU0KSxvPW4oMjMpLGk9bigzMCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYT1yKGUpO2EgaW4gdD9vLmYodCxhLGkoMCxuKSk6dFthXT1ufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDIpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiFyKGZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuKGUuY29uc3RydWN0b3I9e30pW29dPWZ1bmN0aW9uKCl7cmV0dXJue2ZvbzoxfX0sMSE9PWVbdF0oQm9vbGVhbikuZm9vfSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMSksbz1uKDY1KSxpPW4oMjQpLGE9bigzMykscz1uKDkzKSx1PVtdLnB1c2gsYz1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCxjPTM9PXQsbD00PT10LGY9Nj09dCxwPTU9PXR8fGY7cmV0dXJuIGZ1bmN0aW9uKGgsZCxnLHYpe2Zvcih2YXIgeSxtLGI9aShoKSx4PW8oYiksdz1yKGQsZywzKSxrPWEoeC5sZW5ndGgpLFM9MCxFPXZ8fHMsVD1lP0UoaCxrKTpuP0UoaCwwKTp2b2lkIDA7az5TO1MrKylpZigocHx8UyBpbiB4KSYmKG09dyh5PXhbU10sUyxiKSx0KSlpZihlKVRbU109bTtlbHNlIGlmKG0pc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBTO2Nhc2UgMjp1LmNhbGwoVCx5KX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY/LTE6Y3x8bD9sOlR9fTt0LmV4cG9ydHM9e2ZvckVhY2g6YygwKSxtYXA6YygxKSxmaWx0ZXI6YygyKSxzb21lOmMoMyksZXZlcnk6Yyg0KSxmaW5kOmMoNSksZmluZEluZGV4OmMoNil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDE3MCk7dC5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciB0LGU9ITEsbj17fTt0cnl7KHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQpLmNhbGwobixbXSksZT1uIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihuLGkpe3JldHVybiByKG4pLG8oaSksZT90LmNhbGwobixpKTpuLl9fcHJvdG9fXz1pLG59fSgpOnZvaWQgMCl9LGZ1bmN0aW9uKHQsZSxuKXtlLmY9bigyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjYpLG89bigyKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sYTtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLG8pKT9uOmk/cihlKToiT2JqZWN0Ij09KGE9cihlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjphfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0iXHRcblx2XGZcciDCoOGagOKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFx1MjAyOFx1MjAyOVx1ZmVmZiJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyKTt0LmV4cG9ydHM9cigibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIifSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjE4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0Nyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNzMpLG89bigyNzYpLGk9bigyODEpLGE9bigyODQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KXx8byh0KXx8aSh0KXx8YSgpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSxuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gUH0pO3ZhciByPW4oMzcpLG89bi5uKHIpLGk9bigzOCksYT1uLm4oaSkscz1uKDM5KSx1PW4ubihzKSxjPW4oNDApLGw9bi5uKGMpLGY9big0MSkscD1uLm4oZiksaD1uKDQyKSxkPW4ubihoKSxnPW4oMTM0KSx2PW4ubihnKSx5PW4oNjMpLG09bi5uKHkpLGI9bigxNikseD1uLm4oYiksdz1uKDcpLGs9bi5uKHcpLFM9bigxMiksRT1uLm4oUyksVD1uKDEzNSksaj1uLm4oVCksQT1uKDI1KSxPPW4oNDMpO2Z1bmN0aW9uIEModCxlKXt2YXIgbjtpZih2b2lkIDA9PT1sLmF8fG51bGw9PXUoKSh0KSl7aWYoYSgpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEwodCxlKTt2YXIgcj1kKCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIHAoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBMKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIHMsYz0hMCxmPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1vKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYz10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtmPSEwLHM9dH0sZjpmdW5jdGlvbigpe3RyeXtjfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKGYpdGhyb3cgc319fX1mdW5jdGlvbiBMKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9dmFyIFI9e2NvZGU6Ik5PTkUifSxQPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbj10aGlzLHI9dC5zY3JhcGVyUmVzdWx0LG89dC5sb2NhdGlvbixpPXQuZGF0YTtrKCkodGhpcyxlKSx0aGlzLmV4Y2x1ZGVCeVNjcmFwZXJFcnJvcj1mdW5jdGlvbigpe3ZhciB0PW4uc2NyYXBlclJlc3VsdDtyZXR1cm4gdC5lcnJvcj97Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogIi5jb25jYXQodC5lcnJvcil9OnQuaXRlbT8odC5za3VSb3dzfHwodC5za3VSb3dzPVtdKSxSKTp7Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogbm8gaXRlbSJ9fSx0aGlzLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIG4uc2NyYXBlclJlc3VsdC5wdXJjaGFzYWJsZT9SOntjb2RlOiJOT1RfUFVSQ0hBU0FCTEUiLG1lc3NhZ2U6ImV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlIn19LHRoaXMuZXhjbHVkZUJ5U2t1WmVybz1mdW5jdGlvbigpe3JldHVybiBuLnNjcmFwZXJSZXN1bHQuc2t1Um93cyYmMD09PW4uc2NyYXBlclJlc3VsdC5za3VSb3dzLmxlbmd0aD97Y29kZToiTk9UX1BVUkNIQVNBQkxFIixtZXNzYWdlOiJleGNsdWRlQnlTa3VaZXJvIn06Un0sdGhpcy5leGNsdWRlQnlVcmw9ZnVuY3Rpb24oKXtpZigwPT09bi5ieVVybC5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9ZS53aW5kb3dMb2NhdGlvbkhyZWY7cmV0dXJuIG4uZXhjbHVkZShuLmJ5VXJsLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdChqKCkoeCgpKG49ZS51cmwpLmNhbGwobikpKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1OYW1lPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtTmFtZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLm5hbWV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1OYW1lLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdCh4KCkobj1lLml0ZW1OYW1lKS5jYWxsKG4pKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1Db2RlPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtQ29kZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLmNvZGV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1Db2RlLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuaXRlbUNvZGUpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5Q2F0ZWdvcnk9ZnVuY3Rpb24oKXtpZigwPT09bi5ieUNhdGVnb3J5Lmxlbmd0aClyZXR1cm4gUjt2YXIgdD1uLnNjcmFwZXJSZXN1bHQuaXRlbSYmbi5zY3JhcGVyUmVzdWx0Lml0ZW0uY2F0ZWdvcnl8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUNhdGVnb3J5LHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuY2F0ZWdvcnkpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5SXRlbURlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtRGVzY3JpcHRpb24ubGVuZ3RoKXJldHVybiBSO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5kZXNjcmlwdGlvbnx8IiI7cmV0dXJuIG4uZXhjbHVkZShuLmJ5SXRlbURlc2NyaXB0aW9uLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIiIuY29uY2F0KHgoKShuPWUudGV4dCkuY2FsbChuKSkpLnRlc3QodCl9KX0sdGhpcy5leGVjdXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ITEsZT1bXSxyPW4uZXhjbHVkZUJ5U2NyYXBlckVycm9yKCk7aWYoIk5PTkUiIT09ci5jb2RlKXJldHVybntpc0V4Y2x1ZGVkOiEwLHJlYXNvbnM6W3JdfTsiTk9ORSIhPT0ocj1uLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlKCkpLmNvZGUmJih0PSEwLGUucHVzaChyKSk7dmFyIG8saT1DKG4uY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyhbbi5leGNsdWRlQnlVcmwsbi5leGNsdWRlQnlJdGVtTmFtZSxuLmV4Y2x1ZGVCeUl0ZW1Db2RlLG4uZXhjbHVkZUJ5Q2F0ZWdvcnksbi5leGNsdWRlQnlJdGVtRGVzY3JpcHRpb25dKSk7dHJ5e2ZvcihpLnMoKTshKG89aS5uKCkpLmRvbmU7KXt2YXIgYT0oMCxvLnZhbHVlKSgpO2lmKCJOT05FIiE9PWEuY29kZSYmKHQ9ITAsZS5wdXNoKGEpKSwiRVJST1IiPT09YS5jb2RlKWJyZWFrfX1jYXRjaCh0KXtpLmUodCl9ZmluYWxseXtpLmYoKX1yZXR1cm57aXNFeGNsdWRlZDp0LHJlYXNvbnM6ZX19LHRoaXMuc2NyYXBlclJlc3VsdD1yLHRoaXMubG9jYXRpb249byx0aGlzLmRhdGE9aSx0aGlzLmJ5VXJsPWkuYnlVcmwsdGhpcy5ieUl0ZW1OYW1lPWkuYnlJdGVtTmFtZSx0aGlzLmJ5SXRlbUNvZGU9aS5ieUl0ZW1Db2RlLHRoaXMuYnlDYXRlZ29yeT1pLmJ5Q2F0ZWdvcnksdGhpcy5ieUl0ZW1EZXNjcmlwdGlvbj1pLmJ5SXRlbURlc2NyaXB0aW9ufXJldHVybiBFKCkoZSxbe2tleToiY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSx7a2V5OiJleGNsdWRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFJ9fV0sW3trZXk6IndpbmRvd0xvY2F0aW9uSHJlZiIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGUsbj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUscj13aW5kb3cubG9jYXRpb24uaHJlZjtpZihtKCkoZT1PLmRlYnVnSG9zdHMpLmNhbGwoZSxuKSl7dmFyIG89bmV3IHYuYSh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoInp6dXJsIik7aWYobyl0cnl7cj10LmZyb20obywiYmFzZTY0IikudG9TdHJpbmcoInV0Zi04Iil9Y2F0Y2godCl7QS5hLmVycm9yKHQpfX1yZXR1cm4gcn19XSksZX0oKX0pLmNhbGwodGhpcyxuKDI5NCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oNSksaT1uKDY2KTt0LmV4cG9ydHM9IXImJiFvKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz0vI3xcLnByb3RvdHlwZVwuLyxpPWZ1bmN0aW9uKHQsZSl7dmFyIG49c1thKHQpXTtyZXR1cm4gbj09Y3x8biE9dSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlP3IoZSk6ISFlKX0sYT1pLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UobywiLiIpLnRvTG93ZXJDYXNlKCl9LHM9aS5kYXRhPXt9LHU9aS5OQVRJVkU9Ik4iLGM9aS5QT0xZRklMTD0iUCI7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjEpLGk9big2NykuaW5kZXhPZixhPW4oNTYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLHM9byh0KSx1PTAsYz1bXTtmb3IobiBpbiBzKSFyKGEsbikmJnIocyxuKSYmYy5wdXNoKG4pO2Zvcig7ZS5sZW5ndGg+dTspcihzLG49ZVt1KytdKSYmKH5pKGMsbil8fGMucHVzaChuKSk7cmV0dXJuIGN9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1NYXRoLm1heCxpPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIodCk7cmV0dXJuIG48MD9vKG4rZSwwKTppKG4sZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMik7dC5leHBvcnRzPXIoImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDYpLGk9W10uc2xpY2UsYT17fSxzPWZ1bmN0aW9uKHQsZSxuKXtpZighKGUgaW4gYSkpe2Zvcih2YXIgcj1bXSxvPTA7bzxlO28rKylyW29dPSJhWyIrbysiXSI7YVtlXT1GdW5jdGlvbigiQyxhIiwicmV0dXJuIG5ldyBDKCIrci5qb2luKCIsIikrIikiKX1yZXR1cm4gYVtlXSh0LG4pfTt0LmV4cG9ydHM9RnVuY3Rpb24uYmluZHx8ZnVuY3Rpb24odCl7dmFyIGU9cih0aGlzKSxuPWkuY2FsbChhcmd1bWVudHMsMSksYT1mdW5jdGlvbigpe3ZhciByPW4uY29uY2F0KGkuY2FsbChhcmd1bWVudHMpKTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGE/cyhlLHIubGVuZ3RoLHIpOmUuYXBwbHkodCxyKX07cmV0dXJuIG8oZS5wcm90b3R5cGUpJiYoYS5wcm90b3R5cGU9ZS5wcm90b3R5cGUpLGF9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDUpLGk9big0NyksYT1uKDYpLHM9bigyNCksdT1uKDMzKSxjPW4oNzEpLGw9big5MyksZj1uKDcyKSxwPW4oMikoImlzQ29uY2F0U3ByZWFkYWJsZSIpLGg9IW8oZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdFtwXT0hMSx0LmNvbmNhdCgpWzBdIT09dH0pLGQ9ZigiY29uY2F0IiksZz1mdW5jdGlvbih0KXtpZighYSh0KSlyZXR1cm4hMTt2YXIgZT10W3BdO3JldHVybiB2b2lkIDAhPT1lPyEhZTppKHQpfTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWh8fCFkfSx7Y29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT1zKHRoaXMpLGY9bChhLDApLHA9MDtmb3IoZT0tMSxyPWFyZ3VtZW50cy5sZW5ndGg7ZTxyO2UrKylpZihpPS0xPT09ZT9hOmFyZ3VtZW50c1tlXSxnKGkpKXtpZihwKyhvPXUoaS5sZW5ndGgpKT45MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7Zm9yKG49MDtuPG87bisrLHArKyluIGluIGkmJmMoZixwLGlbbl0pfWVsc2V7aWYocD49OTAwNzE5OTI1NDc0MDk5MSl0aHJvdyBUeXBlRXJyb3IoIk1heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCIpO2MoZixwKyssaSl9cmV0dXJuIGYubGVuZ3RoPXAsZn19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz1uKDQ3KSxpPW4oMikoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbyh0KSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPXQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFvKG4ucHJvdG90eXBlKT9yKG4pJiZudWxsPT09KG49bltpXSkmJihuPXZvaWQgMCk6bj12b2lkIDApLG5ldyh2b2lkIDA9PT1uP0FycmF5Om4pKDA9PT1lPzA6ZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcihmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyB0KSE9PXQucHJvdG90eXBlfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjcpfSxmdW5jdGlvbih0LGUsbil7bigzKSgiaXRlcmF0b3IiKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big5OSksaT1uKDQ4KSxhPW4oNzQpLHM9bigyOCksdT1uKDE3KSxjPW4oMzUpLGw9bigyKSxmPW4oMjcpLHA9bigyOSksaD1uKDEwMCksZD1oLkl0ZXJhdG9yUHJvdG90eXBlLGc9aC5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLHY9bCgiaXRlcmF0b3IiKSx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixsLGgsbSxiKXtvKG4sZSxsKTt2YXIgeCx3LGssUz1mdW5jdGlvbih0KXtpZih0PT09aCYmTylyZXR1cm4gTztpZighZyYmdCBpbiBqKXJldHVybiBqW3RdO3N3aXRjaCh0KXtjYXNlImtleXMiOmNhc2UidmFsdWVzIjpjYXNlImVudHJpZXMiOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyl9fSxFPWUrIiBJdGVyYXRvciIsVD0hMSxqPXQucHJvdG90eXBlLEE9alt2XXx8alsiQEBpdGVyYXRvciJdfHxoJiZqW2hdLE89IWcmJkF8fFMoaCksQz0iQXJyYXkiPT1lJiZqLmVudHJpZXN8fEE7aWYoQyYmKHg9aShDLmNhbGwobmV3IHQpKSxkIT09T2JqZWN0LnByb3RvdHlwZSYmeC5uZXh0JiYoZnx8aSh4KT09PWR8fChhP2EoeCxkKToiZnVuY3Rpb24iIT10eXBlb2YgeFt2XSYmdSh4LHYseSkpLHMoeCxFLCEwLCEwKSxmJiYocFtFXT15KSkpLCJ2YWx1ZXMiPT1oJiZBJiYidmFsdWVzIiE9PUEubmFtZSYmKFQ9ITAsTz1mdW5jdGlvbigpe3JldHVybiBBLmNhbGwodGhpcyl9KSxmJiYhYnx8alt2XT09PU98fHUoaix2LE8pLHBbZV09TyxoKWlmKHc9e3ZhbHVlczpTKCJ2YWx1ZXMiKSxrZXlzOm0/TzpTKCJrZXlzIiksZW50cmllczpTKCJlbnRyaWVzIil9LGIpZm9yKGsgaW4gdykhZyYmIVQmJmsgaW4ganx8YyhqLGssd1trXSk7ZWxzZSByKHt0YXJnZXQ6ZSxwcm90bzohMCxmb3JjZWQ6Z3x8VH0sdyk7cmV0dXJuIHd9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTAwKS5JdGVyYXRvclByb3RvdHlwZSxvPW4oNDYpLGk9bigzMCksYT1uKDI4KSxzPW4oMjkpLHU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYz1lKyIgSXRlcmF0b3IiO3JldHVybiB0LnByb3RvdHlwZT1vKHIse25leHQ6aSgxLG4pfSksYSh0LGMsITEsITApLHNbY109dSx0fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvLGksYT1uKDQ4KSxzPW4oMTcpLHU9bigxNCksYz1uKDIpLGw9bigyNyksZj1jKCJpdGVyYXRvciIpLHA9ITE7W10ua2V5cyYmKCJuZXh0ImluKGk9W10ua2V5cygpKT8obz1hKGEoaSkpKSE9PU9iamVjdC5wcm90b3R5cGUmJihyPW8pOnA9ITApLG51bGw9PXImJihyPXt9KSxsfHx1KHIsZil8fHMocixmLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSx0LmV4cG9ydHM9e0l0ZXJhdG9yUHJvdG90eXBlOnIsQlVHR1lfU0FGQVJJX0lURVJBVE9SUzpwfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIxKSxvPW4oNzcpLGk9bigyOSksYT1uKDQ5KSxzPW4oOTgpLHU9YS5zZXQsYz1hLmdldHRlckZvcigiQXJyYXkgSXRlcmF0b3IiKTt0LmV4cG9ydHM9cyhBcnJheSwiQXJyYXkiLGZ1bmN0aW9uKHQsZSl7dSh0aGlzLHt0eXBlOiJBcnJheSBJdGVyYXRvciIsdGFyZ2V0OnIodCksaW5kZXg6MCxraW5kOmV9KX0sZnVuY3Rpb24oKXt2YXIgdD1jKHRoaXMpLGU9dC50YXJnZXQsbj10LmtpbmQscj10LmluZGV4Kys7cmV0dXJuIWV8fHI+PWUubGVuZ3RoPyh0LnRhcmdldD12b2lkIDAse3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk6ImtleXMiPT1uP3t2YWx1ZTpyLGRvbmU6ITF9OiJ2YWx1ZXMiPT1uP3t2YWx1ZTplW3JdLGRvbmU6ITF9Ont2YWx1ZTpbcixlW3JdXSxkb25lOiExfX0sInZhbHVlcyIpLGkuQXJndW1lbnRzPWkuQXJyYXksbygia2V5cyIpLG8oInZhbHVlcyIpLG8oImVudHJpZXMiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4NSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDkyKSxuKDEwNCksbigxODYpLG4oMTg4KSxuKDE4OSksbigxOTApLG4oMTkxKSxuKDk3KSxuKDE5MiksbigxOTMpLG4oMTk0KSxuKDE5NSksbigxOTYpLG4oMTk3KSxuKDE5OCksbigxOTkpLG4oMjAwKSxuKDIwMSksbigyMDIpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuU3ltYm9sfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODgpLG89big2OSkuY29uY2F0KCJsZW5ndGgiLCJwcm90b3R5cGUiKTtlLmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsbyl9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0NSksbz0iWyIrbig3OCkrIl0iLGk9UmVnRXhwKCJeIitvK28rIioiKSxhPVJlZ0V4cChvK28rIiokIikscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49U3RyaW5nKHIoZSkpO3JldHVybiAxJnQmJihuPW4ucmVwbGFjZShpLCIiKSksMiZ0JiYobj1uLnJlcGxhY2UoYSwiIikpLG59fTt0LmV4cG9ydHM9e3N0YXJ0OnMoMSksZW5kOnMoMiksdHJpbTpzKDMpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEpLG89big1MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8odCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBpdGVyYWJsZSIpO3JldHVybiByKGUuY2FsbCh0KSl9fSxmdW5jdGlvbih0LGUsbil7bigyMjQpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuQXJyYXkuaXNBcnJheX0sZnVuY3Rpb24odCxlLG4pe24oMzQpLG4oMjI4KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLkFycmF5LmZyb219LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbyl7dHJ5e3JldHVybiBvP2UocihuKVswXSxuWzFdKTplKG4pfWNhdGNoKGUpe3ZhciBpPXQucmV0dXJuO3Rocm93IHZvaWQgMCE9PWkmJnIoaS5jYWxsKHQpKSxlfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIpLG89bigyOSksaT1yKCJpdGVyYXRvciIpLGE9QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dCYmKG8uQXJyYXk9PT10fHxhW2ldPT09dCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKSgiaXRlcmF0b3IiKSxvPSExO3RyeXt2YXIgaT0wLGE9e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohIWkrK319LHJldHVybjpmdW5jdGlvbigpe289ITB9fTthW3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEFycmF5LmZyb20oYSxmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaCh0KXt9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIWUmJiFvKXJldHVybiExO3ZhciBuPSExO3RyeXt2YXIgaT17fTtpW3JdPWZ1bmN0aW9uKCl7cmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTpuPSEwfX19fSx0KGkpfWNhdGNoKHQpe31yZXR1cm4gbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzMSksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2xpY2U7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLnNsaWNlP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0KSxpPW4oNzkpLGE9W10uc2xpY2Uscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjIsbz1yP2EuY2FsbChhcmd1bWVudHMsMik6dm9pZCAwO3JldHVybiB0KHI/ZnVuY3Rpb24oKXsoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpGdW5jdGlvbihlKSkuYXBwbHkodGhpcyxvKX06ZSxuKX19O3Ioe2dsb2JhbDohMCxiaW5kOiEwLGZvcmNlZDovTVNJRSAuXC4vLnRlc3QoaSl9LHtzZXRUaW1lb3V0OnMoby5zZXRUaW1lb3V0KSxzZXRJbnRlcnZhbDpzKG8uc2V0SW50ZXJ2YWwpfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDEwNCksbigzNCksbig1MCksbigyNTQpLG4oMTIzKSxuKDI1OCk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5Qcm9taXNlfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KTt0LmV4cG9ydHM9ci5Qcm9taXNlfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIG8gaW4gZSluJiZuLnVuc2FmZSYmdFtvXT90W29dPWVbb106cih0LG8sZVtvXSxuKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBUeXBlRXJyb3IoIkluY29ycmVjdCAiKyhuP24rIiAiOiIiKSsiaW52b2NhdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEpLG89bigyMiksaT1uKDIpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG4sYT1yKHQpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1hfHxudWxsPT0obj1yKGEpW2ldKT9lOm8obil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9big0KSxzPW4oNSksdT1uKDI2KSxjPW4oMzEpLGw9big5MCksZj1uKDY2KSxwPWEubG9jYXRpb24saD1hLnNldEltbWVkaWF0ZSxkPWEuY2xlYXJJbW1lZGlhdGUsZz1hLnByb2Nlc3Msdj1hLk1lc3NhZ2VDaGFubmVsLHk9YS5EaXNwYXRjaCxtPTAsYj17fSx4PWZ1bmN0aW9uKHQpe2lmKGIuaGFzT3duUHJvcGVydHkodCkpe3ZhciBlPWJbdF07ZGVsZXRlIGJbdF0sZSgpfX0sdz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt4KHQpfX0saz1mdW5jdGlvbih0KXt4KHQuZGF0YSl9LFM9ZnVuY3Rpb24odCl7YS5wb3N0TWVzc2FnZSh0KyIiLHAucHJvdG9jb2wrIi8vIitwLmhvc3QpfTtoJiZkfHwoaD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO2FyZ3VtZW50cy5sZW5ndGg+bjspZS5wdXNoKGFyZ3VtZW50c1tuKytdKTtyZXR1cm4gYlsrK21dPWZ1bmN0aW9uKCl7KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RnVuY3Rpb24odCkpLmFwcGx5KHZvaWQgMCxlKX0scihtKSxtfSxkPWZ1bmN0aW9uKHQpe2RlbGV0ZSBiW3RdfSwicHJvY2VzcyI9PXUoZyk/cj1mdW5jdGlvbih0KXtnLm5leHRUaWNrKHcodCkpfTp5JiZ5Lm5vdz9yPWZ1bmN0aW9uKHQpe3kubm93KHcodCkpfTp2PyhpPShvPW5ldyB2KS5wb3J0MixvLnBvcnQxLm9ubWVzc2FnZT1rLHI9YyhpLnBvc3RNZXNzYWdlLGksMSkpOiFhLmFkZEV2ZW50TGlzdGVuZXJ8fCJmdW5jdGlvbiIhPXR5cGVvZiBwb3N0TWVzc2FnZXx8YS5pbXBvcnRTY3JpcHRzfHxzKFMpP3I9Im9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBmKCJzY3JpcHQiKT9mdW5jdGlvbih0KXtsLmFwcGVuZENoaWxkKGYoInNjcmlwdCIpKS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtsLnJlbW92ZUNoaWxkKHRoaXMpLHgodCl9fTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHcodCksMCl9OihyPVMsYS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixrLCExKSkpLHQuZXhwb3J0cz17c2V0OmgsY2xlYXI6ZH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oNiksaT1uKDUyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihyKHQpLG8oZSkmJmUuY29uc3RydWN0b3I9PT10KXJldHVybiBlO3ZhciBuPWkuZih0KTtyZXR1cm4oMCxuLnJlc29sdmUpKGUpLG4ucHJvbWlzZX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjIpLGk9big1MiksYT1uKDYwKSxzPW4oNTkpO3Ioe3RhcmdldDoiUHJvbWlzZSIsc3RhdDohMH0se2FsbFNldHRsZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWkuZihlKSxyPW4ucmVzb2x2ZSx1PW4ucmVqZWN0LGM9YShmdW5jdGlvbigpe3ZhciBuPW8oZS5yZXNvbHZlKSxpPVtdLGE9MCx1PTE7cyh0LGZ1bmN0aW9uKHQpe3ZhciBvPWErKyxzPSExO2kucHVzaCh2b2lkIDApLHUrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe3N8fChzPSEwLGlbb109e3N0YXR1czoiZnVsZmlsbGVkIix2YWx1ZTp0fSwtLXV8fHIoaSkpfSxmdW5jdGlvbih0KXtzfHwocz0hMCxpW29dPXtzdGF0dXM6InJlamVjdGVkIixyZWFzb246dH0sLS11fHxyKGkpKX0pfSksLS11fHxyKGkpfSk7cmV0dXJuIGMuZXJyb3ImJnUoYy52YWx1ZSksbi5wcm9taXNlfX0pfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3Nyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1NCksbz1uKDE1OCksaT1uKDE2Mik7ZnVuY3Rpb24gYShlLG4scyl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZvP3QuZXhwb3J0cz1hPW86dC5leHBvcnRzPWE9ZnVuY3Rpb24odCxlLG4pe3ZhciBvPWkodCxlKTtpZihvKXt2YXIgYT1yKG8sZSk7cmV0dXJuIGEuZ2V0P2EuZ2V0LmNhbGwobik6YS52YWx1ZX19LGEoZSxuLHN8fGUpfXQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM2KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByOwovKiEKICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My40LjEKICogaHR0cHM6Ly9qcXVlcnkuY29tLwogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIERhdGU6IDIwMTktMDUtMDFUMjE6MDRaCiAqLwovKiEKICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My40LjEKICogaHR0cHM6Ly9qcXVlcnkuY29tLwogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIERhdGU6IDIwMTktMDUtMDFUMjE6MDRaCiAqLwohZnVuY3Rpb24oZSxuKXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiB0LmV4cG9ydHM/dC5leHBvcnRzPWUuZG9jdW1lbnQ/bihlLCEwKTpmdW5jdGlvbih0KXtpZighdC5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gbih0KX06bihlKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24obixvKXsidXNlIHN0cmljdCI7dmFyIGk9W10sYT1uLmRvY3VtZW50LHM9T2JqZWN0LmdldFByb3RvdHlwZU9mLHU9aS5zbGljZSxjPWkuY29uY2F0LGw9aS5wdXNoLGY9aS5pbmRleE9mLHA9e30saD1wLnRvU3RyaW5nLGQ9cC5oYXNPd25Qcm9wZXJ0eSxnPWQudG9TdHJpbmcsdj1nLmNhbGwoT2JqZWN0KSx5PXt9LG09ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJiJudW1iZXIiIT10eXBlb2YgdC5ub2RlVHlwZX0sYj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmdD09PXQud2luZG93fSx4PXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gdyh0LGUsbil7dmFyIHIsbyxpPShuPW58fGEpLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKGkudGV4dD10LGUpZm9yKHIgaW4geCkobz1lW3JdfHxlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUocikpJiZpLnNldEF0dHJpYnV0ZShyLG8pO24uaGVhZC5hcHBlbmRDaGlsZChpKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkpfWZ1bmN0aW9uIGsodCl7cmV0dXJuIG51bGw9PXQ/dCsiIjoib2JqZWN0Ij09dHlwZW9mIHR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0P3BbaC5jYWxsKHQpXXx8Im9iamVjdCI6dHlwZW9mIHR9dmFyIFM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFMuZm4uaW5pdCh0LGUpfSxFPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZztmdW5jdGlvbiBUKHQpe3ZhciBlPSEhdCYmImxlbmd0aCJpbiB0JiZ0Lmxlbmd0aCxuPWsodCk7cmV0dXJuIW0odCkmJiFiKHQpJiYoImFycmF5Ij09PW58fDA9PT1lfHwibnVtYmVyIj09dHlwZW9mIGUmJmU+MCYmZS0xIGluIHQpfVMuZm49Uy5wcm90b3R5cGU9e2pxdWVyeToiMy40LjEiLGNvbnN0cnVjdG9yOlMsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiB1LmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD91LmNhbGwodGhpcyk6dDwwP3RoaXNbdCt0aGlzLmxlbmd0aF06dGhpc1t0XX0scHVzaFN0YWNrOmZ1bmN0aW9uKHQpe3ZhciBlPVMubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLHQpO3JldHVybiBlLnByZXZPYmplY3Q9dGhpcyxlfSxlYWNoOmZ1bmN0aW9uKHQpe3JldHVybiBTLmVhY2godGhpcyx0KX0sbWFwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLm1hcCh0aGlzLGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuY2FsbChlLG4sZSl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sZW5ndGgsbj0rdCsodDwwP2U6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJm48ZT9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6bCxzb3J0Omkuc29ydCxzcGxpY2U6aS5zcGxpY2V9LFMuZXh0ZW5kPVMuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsbyxpLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGM9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGEmJihjPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksIm9iamVjdCI9PXR5cGVvZiBhfHxtKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPSh0PWFyZ3VtZW50c1tzXSkpZm9yKGUgaW4gdClyPXRbZV0sIl9fcHJvdG9fXyIhPT1lJiZhIT09ciYmKGMmJnImJihTLmlzUGxhaW5PYmplY3Qocil8fChvPUFycmF5LmlzQXJyYXkocikpKT8obj1hW2VdLGk9byYmIUFycmF5LmlzQXJyYXkobik/W106b3x8Uy5pc1BsYWluT2JqZWN0KG4pP246e30sbz0hMSxhW2VdPVMuZXh0ZW5kKGMsaSxyKSk6dm9pZCAwIT09ciYmKGFbZV09cikpO3JldHVybiBhfSxTLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoIjMuNC4xIitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcih0KX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbih0KXt2YXIgZSxuO3JldHVybiEoIXR8fCJbb2JqZWN0IE9iamVjdF0iIT09aC5jYWxsKHQpKSYmKCEoZT1zKHQpKXx8ImZ1bmN0aW9uIj09dHlwZW9mKG49ZC5jYWxsKGUsImNvbnN0cnVjdG9yIikmJmUuY29uc3RydWN0b3IpJiZnLmNhbGwobik9PT12KX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbih0KXt2YXIgZTtmb3IoZSBpbiB0KXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKHQsZSl7dyh0LHtub25jZTplJiZlLm5vbmNlfSl9LGVhY2g6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTA7aWYoVCh0KSlmb3Iobj10Lmxlbmd0aDtyPG4mJiExIT09ZS5jYWxsKHRbcl0scix0W3JdKTtyKyspO2Vsc2UgZm9yKHIgaW4gdClpZighMT09PWUuY2FsbCh0W3JdLHIsdFtyXSkpYnJlYWs7cmV0dXJuIHR9LHRyaW06ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6KHQrIiIpLnJlcGxhY2UoRSwiIil9LG1ha2VBcnJheTpmdW5jdGlvbih0LGUpe3ZhciBuPWV8fFtdO3JldHVybiBudWxsIT10JiYoVChPYmplY3QodCkpP1MubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIHQ/W3RdOnQpOmwuY2FsbChuLHQpKSxufSxpbkFycmF5OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09ZT8tMTpmLmNhbGwoZSx0LG4pfSxtZXJnZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0rZS5sZW5ndGgscj0wLG89dC5sZW5ndGg7cjxuO3IrKyl0W28rK109ZVtyXTtyZXR1cm4gdC5sZW5ndGg9byx0fSxncmVwOmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9W10sbz0wLGk9dC5sZW5ndGgsYT0hbjtvPGk7bysrKSFlKHRbb10sbykhPT1hJiZyLnB1c2godFtvXSk7cmV0dXJuIHJ9LG1hcDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPTAsYT1bXTtpZihUKHQpKWZvcihyPXQubGVuZ3RoO2k8cjtpKyspbnVsbCE9KG89ZSh0W2ldLGksbikpJiZhLnB1c2gobyk7ZWxzZSBmb3IoaSBpbiB0KW51bGwhPShvPWUodFtpXSxpLG4pKSYmYS5wdXNoKG8pO3JldHVybiBjLmFwcGx5KFtdLGEpfSxndWlkOjEsc3VwcG9ydDp5fSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKFMuZm5bU3ltYm9sLml0ZXJhdG9yXT1pW1N5bWJvbC5pdGVyYXRvcl0pLFMuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24odCxlKXtwWyJbb2JqZWN0ICIrZSsiXSJdPWUudG9Mb3dlckNhc2UoKX0pO3ZhciBqPQovKiEKICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy40CiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pzLmZvdW5kYXRpb24vCiAqCiAqIERhdGU6IDIwMTktMDQtMDgKICovCmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzLHUsYyxsLGYscCxoLGQsZyx2LHksbSxiLHg9InNpenpsZSIrMSpuZXcgRGF0ZSx3PXQuZG9jdW1lbnQsaz0wLFM9MCxFPXV0KCksVD11dCgpLGo9dXQoKSxBPXV0KCksTz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZSYmKGY9ITApLDB9LEM9e30uaGFzT3duUHJvcGVydHksTD1bXSxSPUwucG9wLFA9TC5wdXNoLE49TC5wdXNoLEk9TC5zbGljZSxEPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKHRbbl09PT1lKXJldHVybiBuO3JldHVybi0xfSxfPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsVT0iKD86XFxcXC58W1xcdy1dfFteXDAtXFx4YTBdKSsiLEI9IlxcWyIrTSsiKigiK1UrIikoPzoiK00rIiooWypeJHwhfl0/PSkiK00rIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitVKyIpKXwpIitNKyIqXFxdIixxPSI6KCIrVSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrQisiKSopfC4qKVxcKXwpIixGPW5ldyBSZWdFeHAoTSsiKyIsImciKSxIPW5ldyBSZWdFeHAoIl4iK00rIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTSsiKyQiLCJnIiksej1uZXcgUmVnRXhwKCJeIitNKyIqLCIrTSsiKiIpLFc9bmV3IFJlZ0V4cCgiXiIrTSsiKihbPit+XXwiK00rIikiK00rIioiKSwkPW5ldyBSZWdFeHAoTSsifD4iKSxZPW5ldyBSZWdFeHAocSksVj1uZXcgUmVnRXhwKCJeIitVKyIkIiksRz17SUQ6bmV3IFJlZ0V4cCgiXiMoIitVKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK1UrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK1UrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitCKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrcSksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitNKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitNKyIqKD86KFsrLV18KSIrTSsiKihcXGQrKXwpKSIrTSsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrXysiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sSz0vSFRNTCQvaSxYPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksSj0vXmhcZCQvaSxRPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxaPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sdHQ9L1srfl0vLGV0PW5ldyBSZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIrTSsiP3woIitNKyIpfC4pIiwiaWciKSxudD1mdW5jdGlvbih0LGUsbil7dmFyIHI9IjB4IitlLTY1NTM2O3JldHVybiByIT1yfHxuP2U6cjwwP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShyPj4xMHw1NTI5NiwxMDIzJnJ8NTYzMjApfSxydD0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxvdD1mdW5jdGlvbih0LGUpe3JldHVybiBlPyJcMCI9PT10PyLvv70iOnQuc2xpY2UoMCwtMSkrIlxcIit0LmNoYXJDb2RlQXQodC5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK3R9LGl0PWZ1bmN0aW9uKCl7cCgpfSxhdD14dChmdW5jdGlvbih0KXtyZXR1cm4hMD09PXQuZGlzYWJsZWQmJiJmaWVsZHNldCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7Ti5hcHBseShMPUkuY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksTFt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaCh0KXtOPXthcHBseTpMLmxlbmd0aD9mdW5jdGlvbih0LGUpe1AuYXBwbHkodCxJLmNhbGwoZSkpfTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aCxyPTA7dFtuKytdPWVbcisrXTspO3QubGVuZ3RoPW4tMX19fWZ1bmN0aW9uIHN0KHQsZSxyLG8pe3ZhciBpLHMsYyxsLGYsZCx5LG09ZSYmZS5vd25lckRvY3VtZW50LGs9ZT9lLm5vZGVUeXBlOjk7aWYocj1yfHxbXSwic3RyaW5nIiE9dHlwZW9mIHR8fCF0fHwxIT09ayYmOSE9PWsmJjExIT09aylyZXR1cm4gcjtpZighbyYmKChlP2Uub3duZXJEb2N1bWVudHx8ZTp3KSE9PWgmJnAoZSksZT1lfHxoLGcpKXtpZigxMSE9PWsmJihmPVouZXhlYyh0KSkpaWYoaT1mWzFdKXtpZig5PT09ayl7aWYoIShjPWUuZ2V0RWxlbWVudEJ5SWQoaSkpKXJldHVybiByO2lmKGMuaWQ9PT1pKXJldHVybiByLnB1c2goYykscn1lbHNlIGlmKG0mJihjPW0uZ2V0RWxlbWVudEJ5SWQoaSkpJiZiKGUsYykmJmMuaWQ9PT1pKXJldHVybiByLnB1c2goYykscn1lbHNle2lmKGZbMl0pcmV0dXJuIE4uYXBwbHkocixlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpKSxyO2lmKChpPWZbM10pJiZuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gTi5hcHBseShyLGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShpKSkscn1pZihuLnFzYSYmIUFbdCsiICJdJiYoIXZ8fCF2LnRlc3QodCkpJiYoMSE9PWt8fCJvYmplY3QiIT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSl7aWYoeT10LG09ZSwxPT09ayYmJC50ZXN0KHQpKXtmb3IoKGw9ZS5nZXRBdHRyaWJ1dGUoImlkIikpP2w9bC5yZXBsYWNlKHJ0LG90KTplLnNldEF0dHJpYnV0ZSgiaWQiLGw9eCkscz0oZD1hKHQpKS5sZW5ndGg7cy0tOylkW3NdPSIjIitsKyIgIitidChkW3NdKTt5PWQuam9pbigiLCIpLG09dHQudGVzdCh0KSYmeXQoZS5wYXJlbnROb2RlKXx8ZX10cnl7cmV0dXJuIE4uYXBwbHkocixtLnF1ZXJ5U2VsZWN0b3JBbGwoeSkpLHJ9Y2F0Y2goZSl7QSh0LCEwKX1maW5hbGx5e2w9PT14JiZlLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiB1KHQucmVwbGFjZShILCIkMSIpLGUscixvKX1mdW5jdGlvbiB1dCgpe3ZhciB0PVtdO3JldHVybiBmdW5jdGlvbiBlKG4sbyl7cmV0dXJuIHQucHVzaChuKyIgIik+ci5jYWNoZUxlbmd0aCYmZGVsZXRlIGVbdC5zaGlmdCgpXSxlW24rIiAiXT1vfX1mdW5jdGlvbiBjdCh0KXtyZXR1cm4gdFt4XT0hMCx0fWZ1bmN0aW9uIGx0KHQpe3ZhciBlPWguY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTt0cnl7cmV0dXJuISF0KGUpfWNhdGNoKHQpe3JldHVybiExfWZpbmFsbHl7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksZT1udWxsfX1mdW5jdGlvbiBmdCh0LGUpe2Zvcih2YXIgbj10LnNwbGl0KCJ8Iiksbz1uLmxlbmd0aDtvLS07KXIuYXR0ckhhbmRsZVtuW29dXT1lfWZ1bmN0aW9uIHB0KHQsZSl7dmFyIG49ZSYmdCxyPW4mJjE9PT10Lm5vZGVUeXBlJiYxPT09ZS5ub2RlVHlwZSYmdC5zb3VyY2VJbmRleC1lLnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobilmb3IoO249bi5uZXh0U2libGluZzspaWYobj09PWUpcmV0dXJuLTE7cmV0dXJuIHQ/MTotMX1mdW5jdGlvbiBodCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gZHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJmUudHlwZT09PXR9fWZ1bmN0aW9uIGd0KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iZm9ybSJpbiBlP2UucGFyZW50Tm9kZSYmITE9PT1lLmRpc2FibGVkPyJsYWJlbCJpbiBlPyJsYWJlbCJpbiBlLnBhcmVudE5vZGU/ZS5wYXJlbnROb2RlLmRpc2FibGVkPT09dDplLmRpc2FibGVkPT09dDplLmlzRGlzYWJsZWQ9PT10fHxlLmlzRGlzYWJsZWQhPT0hdCYmYXQoZSk9PT10OmUuZGlzYWJsZWQ9PT10OiJsYWJlbCJpbiBlJiZlLmRpc2FibGVkPT09dH19ZnVuY3Rpb24gdnQodCl7cmV0dXJuIGN0KGZ1bmN0aW9uKGUpe3JldHVybiBlPStlLGN0KGZ1bmN0aW9uKG4scil7Zm9yKHZhciBvLGk9dChbXSxuLmxlbmd0aCxlKSxhPWkubGVuZ3RoO2EtLTspbltvPWlbYV1dJiYobltvXT0hKHJbb109bltvXSkpfSl9KX1mdW5jdGlvbiB5dCh0KXtyZXR1cm4gdCYmdm9pZCAwIT09dC5nZXRFbGVtZW50c0J5VGFnTmFtZSYmdH1mb3IoZSBpbiBuPXN0LnN1cHBvcnQ9e30saT1zdC5pc1hNTD1mdW5jdGlvbih0KXt2YXIgZT10Lm5hbWVzcGFjZVVSSSxuPSh0Lm93bmVyRG9jdW1lbnR8fHQpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4hSy50ZXN0KGV8fG4mJm4ubm9kZU5hbWV8fCJIVE1MIil9LHA9c3Quc2V0RG9jdW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGUsbyxhPXQ/dC5vd25lckRvY3VtZW50fHx0Onc7cmV0dXJuIGEhPT1oJiY5PT09YS5ub2RlVHlwZSYmYS5kb2N1bWVudEVsZW1lbnQ/KGQ9KGg9YSkuZG9jdW1lbnRFbGVtZW50LGc9IWkoaCksdyE9PWgmJihvPWguZGVmYXVsdFZpZXcpJiZvLnRvcCE9PW8mJihvLmFkZEV2ZW50TGlzdGVuZXI/by5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGl0LCExKTpvLmF0dGFjaEV2ZW50JiZvLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsaXQpKSxuLmF0dHJpYnV0ZXM9bHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NOYW1lPSJpIiwhdC5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksbi5nZXRFbGVtZW50c0J5VGFnTmFtZT1sdChmdW5jdGlvbih0KXtyZXR1cm4gdC5hcHBlbmRDaGlsZChoLmNyZWF0ZUNvbW1lbnQoIiIpKSwhdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1RLnRlc3QoaC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxuLmdldEJ5SWQ9bHQoZnVuY3Rpb24odCl7cmV0dXJuIGQuYXBwZW5kQ2hpbGQodCkuaWQ9eCwhaC5nZXRFbGVtZW50c0J5TmFtZXx8IWguZ2V0RWxlbWVudHNCeU5hbWUoeCkubGVuZ3RofSksbi5nZXRCeUlkPyhyLmZpbHRlci5JRD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoZXQsbnQpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoImlkIik9PT1lfX0sci5maW5kLklEPWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZS5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG49ZS5nZXRFbGVtZW50QnlJZCh0KTtyZXR1cm4gbj9bbl06W119fSk6KHIuZmlsdGVyLklEPWZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShldCxudCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXZvaWQgMCE9PXQuZ2V0QXR0cmlidXRlTm9kZSYmdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09ZX19LHIuZmluZC5JRD1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUuZ2V0RWxlbWVudEJ5SWQmJmcpe3ZhciBuLHIsbyxpPWUuZ2V0RWxlbWVudEJ5SWQodCk7aWYoaSl7aWYoKG49aS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PXQpcmV0dXJuW2ldO2ZvcihvPWUuZ2V0RWxlbWVudHNCeU5hbWUodCkscj0wO2k9b1tyKytdOylpZigobj1pLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09dClyZXR1cm5baV19cmV0dXJuW119fSksci5maW5kLlRBRz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWUuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KTpuLnFzYT9lLnF1ZXJ5U2VsZWN0b3JBbGwodCk6dm9pZCAwfTpmdW5jdGlvbih0LGUpe3ZhciBuLHI9W10sbz0wLGk9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KTtpZigiKiI9PT10KXtmb3IoO249aVtvKytdOykxPT09bi5ub2RlVHlwZSYmci5wdXNoKG4pO3JldHVybiByfXJldHVybiBpfSxyLmZpbmQuQ0xBU1M9bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZylyZXR1cm4gZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHQpfSx5PVtdLHY9W10sKG4ucXNhPVEudGVzdChoLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGx0KGZ1bmN0aW9uKHQpe2QuYXBwZW5kQ2hpbGQodCkuaW5uZXJIVE1MPSI8YSBpZD0nIit4KyInPjwvYT48c2VsZWN0IGlkPSciK3grIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsdC5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmdi5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLHQucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK18rIikiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit4KyItXSIpLmxlbmd0aHx8di5wdXNoKCJ+PSIpLHQucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHYucHVzaCgiOmNoZWNrZWQiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit4KyIrKiIpLmxlbmd0aHx8di5wdXNoKCIuIy4rWyt+XSIpfSksbHQoZnVuY3Rpb24odCl7dC5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIGU9aC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Uuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksdC5hcHBlbmRDaGlsZChlKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmdi5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT10LnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZC5hcHBlbmRDaGlsZCh0KS5kaXNhYmxlZD0hMCwyIT09dC5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx2LnB1c2goIiwuKjoiKX0pKSwobi5tYXRjaGVzU2VsZWN0b3I9US50ZXN0KG09ZC5tYXRjaGVzfHxkLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8ZC5tb3pNYXRjaGVzU2VsZWN0b3J8fGQub01hdGNoZXNTZWxlY3Rvcnx8ZC5tc01hdGNoZXNTZWxlY3RvcikpJiZsdChmdW5jdGlvbih0KXtuLmRpc2Nvbm5lY3RlZE1hdGNoPW0uY2FsbCh0LCIqIiksbS5jYWxsKHQsIltzIT0nJ106eCIpLHkucHVzaCgiIT0iLHEpfSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSkseT15Lmxlbmd0aCYmbmV3IFJlZ0V4cCh5LmpvaW4oInwiKSksZT1RLnRlc3QoZC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksYj1lfHxRLnRlc3QoZC5jb250YWlucyk/ZnVuY3Rpb24odCxlKXt2YXIgbj05PT09dC5ub2RlVHlwZT90LmRvY3VtZW50RWxlbWVudDp0LHI9ZSYmZS5wYXJlbnROb2RlO3JldHVybiB0PT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24odCxlKXtpZihlKWZvcig7ZT1lLnBhcmVudE5vZGU7KWlmKGU9PT10KXJldHVybiEwO3JldHVybiExfSxPPWU/ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4gZj0hMCwwO3ZhciByPSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiByfHwoMSYocj0odC5vd25lckRvY3VtZW50fHx0KT09PShlLm93bmVyRG9jdW1lbnR8fGUpP3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk6MSl8fCFuLnNvcnREZXRhY2hlZCYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KT09PXI/dD09PWh8fHQub3duZXJEb2N1bWVudD09PXcmJmIodyx0KT8tMTplPT09aHx8ZS5vd25lckRvY3VtZW50PT09dyYmYih3LGUpPzE6bD9EKGwsdCktRChsLGUpOjA6NCZyPy0xOjEpfTpmdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiBmPSEwLDA7dmFyIG4scj0wLG89dC5wYXJlbnROb2RlLGk9ZS5wYXJlbnROb2RlLGE9W3RdLHM9W2VdO2lmKCFvfHwhaSlyZXR1cm4gdD09PWg/LTE6ZT09PWg/MTpvPy0xOmk/MTpsP0QobCx0KS1EKGwsZSk6MDtpZihvPT09aSlyZXR1cm4gcHQodCxlKTtmb3Iobj10O249bi5wYXJlbnROb2RlOylhLnVuc2hpZnQobik7Zm9yKG49ZTtuPW4ucGFyZW50Tm9kZTspcy51bnNoaWZ0KG4pO2Zvcig7YVtyXT09PXNbcl07KXIrKztyZXR1cm4gcj9wdChhW3JdLHNbcl0pOmFbcl09PT13Py0xOnNbcl09PT13PzE6MH0saCk6aH0sc3QubWF0Y2hlcz1mdW5jdGlvbih0LGUpe3JldHVybiBzdCh0LG51bGwsbnVsbCxlKX0sc3QubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKHQsZSl7aWYoKHQub3duZXJEb2N1bWVudHx8dCkhPT1oJiZwKHQpLG4ubWF0Y2hlc1NlbGVjdG9yJiZnJiYhQVtlKyIgIl0mJigheXx8IXkudGVzdChlKSkmJighdnx8IXYudGVzdChlKSkpdHJ5e3ZhciByPW0uY2FsbCh0LGUpO2lmKHJ8fG4uZGlzY29ubmVjdGVkTWF0Y2h8fHQuZG9jdW1lbnQmJjExIT09dC5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gcn1jYXRjaCh0KXtBKGUsITApfXJldHVybiBzdChlLGgsbnVsbCxbdF0pLmxlbmd0aD4wfSxzdC5jb250YWlucz1mdW5jdGlvbih0LGUpe3JldHVybih0Lm93bmVyRG9jdW1lbnR8fHQpIT09aCYmcCh0KSxiKHQsZSl9LHN0LmF0dHI9ZnVuY3Rpb24odCxlKXsodC5vd25lckRvY3VtZW50fHx0KSE9PWgmJnAodCk7dmFyIG89ci5hdHRySGFuZGxlW2UudG9Mb3dlckNhc2UoKV0saT1vJiZDLmNhbGwoci5hdHRySGFuZGxlLGUudG9Mb3dlckNhc2UoKSk/byh0LGUsIWcpOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09aT9pOm4uYXR0cmlidXRlc3x8IWc/dC5nZXRBdHRyaWJ1dGUoZSk6KGk9dC5nZXRBdHRyaWJ1dGVOb2RlKGUpKSYmaS5zcGVjaWZpZWQ/aS52YWx1ZTpudWxsfSxzdC5lc2NhcGU9ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnJlcGxhY2UocnQsb3QpfSxzdC5lcnJvcj1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrdCl9LHN0LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24odCl7dmFyIGUscj1bXSxvPTAsaT0wO2lmKGY9IW4uZGV0ZWN0RHVwbGljYXRlcyxsPSFuLnNvcnRTdGFibGUmJnQuc2xpY2UoMCksdC5zb3J0KE8pLGYpe2Zvcig7ZT10W2krK107KWU9PT10W2ldJiYobz1yLnB1c2goaSkpO2Zvcig7by0tOyl0LnNwbGljZShyW29dLDEpfXJldHVybiBsPW51bGwsdH0sbz1zdC5nZXRUZXh0PWZ1bmN0aW9uKHQpe3ZhciBlLG49IiIscj0wLGk9dC5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiB0LnRleHRDb250ZW50KXJldHVybiB0LnRleHRDb250ZW50O2Zvcih0PXQuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyluKz1vKHQpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiB0Lm5vZGVWYWx1ZX1lbHNlIGZvcig7ZT10W3IrK107KW4rPW8oZSk7cmV0dXJuIG59LChyPXN0LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmN0LG1hdGNoOkcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKHQpe3JldHVybiB0WzFdPXRbMV0ucmVwbGFjZShldCxudCksdFszXT0odFszXXx8dFs0XXx8dFs1XXx8IiIpLnJlcGxhY2UoZXQsbnQpLCJ+PSI9PT10WzJdJiYodFszXT0iICIrdFszXSsiICIpLHQuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRbMV09dFsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09dFsxXS5zbGljZSgwLDMpPyh0WzNdfHxzdC5lcnJvcih0WzBdKSx0WzRdPSsodFs0XT90WzVdKyh0WzZdfHwxKToyKigiZXZlbiI9PT10WzNdfHwib2RkIj09PXRbM10pKSx0WzVdPSsodFs3XSt0WzhdfHwib2RkIj09PXRbM10pKTp0WzNdJiZzdC5lcnJvcih0WzBdKSx0fSxQU0VVRE86ZnVuY3Rpb24odCl7dmFyIGUsbj0hdFs2XSYmdFsyXTtyZXR1cm4gRy5DSElMRC50ZXN0KHRbMF0pP251bGw6KHRbM10/dFsyXT10WzRdfHx0WzVdfHwiIjpuJiZZLnRlc3QobikmJihlPWEobiwhMCkpJiYoZT1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLWUpLW4ubGVuZ3RoKSYmKHRbMF09dFswXS5zbGljZSgwLGUpLHRbMl09bi5zbGljZSgwLGUpKSx0LnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKGV0LG50KS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PXQ/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWV9fSxDTEFTUzpmdW5jdGlvbih0KXt2YXIgZT1FW3QrIiAiXTtyZXR1cm4gZXx8KGU9bmV3IFJlZ0V4cCgiKF58IitNKyIpIit0KyIoIitNKyJ8JCkiKSkmJkUodCxmdW5jdGlvbih0KXtyZXR1cm4gZS50ZXN0KCJzdHJpbmciPT10eXBlb2YgdC5jbGFzc05hbWUmJnQuY2xhc3NOYW1lfHx2b2lkIDAhPT10LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIG89c3QuYXR0cihyLHQpO3JldHVybiBudWxsPT1vPyIhPSI9PT1lOiFlfHwobys9IiIsIj0iPT09ZT9vPT09bjoiIT0iPT09ZT9vIT09bjoiXj0iPT09ZT9uJiYwPT09by5pbmRleE9mKG4pOiIqPSI9PT1lP24mJm8uaW5kZXhPZihuKT4tMToiJD0iPT09ZT9uJiZvLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT1lPygiICIrby5yZXBsYWNlKEYsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PWUmJihvPT09bnx8by5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9Im50aCIhPT10LnNsaWNlKDAsMyksYT0ibGFzdCIhPT10LnNsaWNlKC00KSxzPSJvZi10eXBlIj09PWU7cmV0dXJuIDE9PT1yJiYwPT09bz9mdW5jdGlvbih0KXtyZXR1cm4hIXQucGFyZW50Tm9kZX06ZnVuY3Rpb24oZSxuLHUpe3ZhciBjLGwsZixwLGgsZCxnPWkhPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsdj1lLnBhcmVudE5vZGUseT1zJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbT0hdSYmIXMsYj0hMTtpZih2KXtpZihpKXtmb3IoO2c7KXtmb3IocD1lO3A9cFtnXTspaWYocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT15OjE9PT1wLm5vZGVUeXBlKXJldHVybiExO2Q9Zz0ib25seSI9PT10JiYhZCYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihkPVthP3YuZmlyc3RDaGlsZDp2Lmxhc3RDaGlsZF0sYSYmbSl7Zm9yKGI9KGg9KGM9KGw9KGY9KHA9dilbeF18fChwW3hdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbdF18fFtdKVswXT09PWsmJmNbMV0pJiZjWzJdLHA9aCYmdi5jaGlsZE5vZGVzW2hdO3A9KytoJiZwJiZwW2ddfHwoYj1oPTApfHxkLnBvcCgpOylpZigxPT09cC5ub2RlVHlwZSYmKytiJiZwPT09ZSl7bFt0XT1bayxoLGJdO2JyZWFrfX1lbHNlIGlmKG0mJihiPWg9KGM9KGw9KGY9KHA9ZSlbeF18fChwW3hdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbdF18fFtdKVswXT09PWsmJmNbMV0pLCExPT09Yilmb3IoOyhwPSsraCYmcCYmcFtnXXx8KGI9aD0wKXx8ZC5wb3AoKSkmJigocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT15OjEhPT1wLm5vZGVUeXBlKXx8ISsrYnx8KG0mJigobD0oZj1wW3hdfHwocFt4XT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW3RdPVtrLGJdKSxwIT09ZSkpOyk7cmV0dXJuKGItPW8pPT09cnx8YiVyPT0wJiZiL3I+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKHQsZSl7dmFyIG4sbz1yLnBzZXVkb3NbdF18fHIuc2V0RmlsdGVyc1t0LnRvTG93ZXJDYXNlKCldfHxzdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK3QpO3JldHVybiBvW3hdP28oZSk6by5sZW5ndGg+MT8obj1bdCx0LCIiLGVdLHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSh0LnRvTG93ZXJDYXNlKCkpP2N0KGZ1bmN0aW9uKHQsbil7Zm9yKHZhciByLGk9byh0LGUpLGE9aS5sZW5ndGg7YS0tOyl0W3I9RCh0LGlbYV0pXT0hKG5bcl09aVthXSl9KTpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsbil9KTpvfX0scHNldWRvczp7bm90OmN0KGZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49W10scj1zKHQucmVwbGFjZShILCIkMSIpKTtyZXR1cm4gclt4XT9jdChmdW5jdGlvbih0LGUsbixvKXtmb3IodmFyIGksYT1yKHQsbnVsbCxvLFtdKSxzPXQubGVuZ3RoO3MtLTspKGk9YVtzXSkmJih0W3NdPSEoZVtzXT1pKSl9KTpmdW5jdGlvbih0LG8saSl7cmV0dXJuIGVbMF09dCxyKGUsbnVsbCxpLG4pLGVbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6Y3QoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBzdCh0LGUpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmN0KGZ1bmN0aW9uKHQpe3JldHVybiB0PXQucmVwbGFjZShldCxudCksZnVuY3Rpb24oZSl7cmV0dXJuKGUudGV4dENvbnRlbnR8fG8oZSkpLmluZGV4T2YodCk+LTF9fSksbGFuZzpjdChmdW5jdGlvbih0KXtyZXR1cm4gVi50ZXN0KHR8fCIiKXx8c3QuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrdCksdD10LnJlcGxhY2UoZXQsbnQpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oZSl7dmFyIG47ZG97aWYobj1nP2UubGFuZzplLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8ZS5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4obj1uLnRvTG93ZXJDYXNlKCkpPT09dHx8MD09PW4uaW5kZXhPZih0KyItIil9d2hpbGUoKGU9ZS5wYXJlbnROb2RlKSYmMT09PWUubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihlKXt2YXIgbj10LmxvY2F0aW9uJiZ0LmxvY2F0aW9uLmhhc2g7cmV0dXJuIG4mJm4uc2xpY2UoMSk9PT1lLmlkfSxyb290OmZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZH0sZm9jdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1oLmFjdGl2ZUVsZW1lbnQmJighaC5oYXNGb2N1c3x8aC5oYXNGb2N1cygpKSYmISEodC50eXBlfHx0LmhyZWZ8fH50LnRhYkluZGV4KX0sZW5hYmxlZDpndCghMSksZGlzYWJsZWQ6Z3QoITApLGNoZWNrZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1lJiYhIXQuY2hlY2tlZHx8Im9wdGlvbiI9PT1lJiYhIXQuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKHQpe3JldHVybiB0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LCEwPT09dC5zZWxlY3RlZH0sZW1wdHk6ZnVuY3Rpb24odCl7Zm9yKHQ9dC5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKWlmKHQubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKHQpe3JldHVybiFyLnBzZXVkb3MuZW1wdHkodCl9LGhlYWRlcjpmdW5jdGlvbih0KXtyZXR1cm4gSi50ZXN0KHQubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gWC50ZXN0KHQubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1lJiYiYnV0dG9uIj09PXQudHlwZXx8ImJ1dHRvbiI9PT1lfSx0ZXh0OmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiJpbnB1dCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PXQudHlwZSYmKG51bGw9PShlPXQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1lLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDp2dChmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6dnQoZnVuY3Rpb24odCxlKXtyZXR1cm5bZS0xXX0pLGVxOnZ0KGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bbjwwP24rZTpuXX0pLGV2ZW46dnQoZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGU7bis9Mil0LnB1c2gobik7cmV0dXJuIHR9KSxvZGQ6dnQoZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MTtuPGU7bis9Mil0LnB1c2gobik7cmV0dXJuIHR9KSxsdDp2dChmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW48MD9uK2U6bj5lP2U6bjstLXI+PTA7KXQucHVzaChyKTtyZXR1cm4gdH0pLGd0OnZ0KGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bjwwP24rZTpuOysrcjxlOyl0LnB1c2gocik7cmV0dXJuIHR9KX19KS5wc2V1ZG9zLm50aD1yLnBzZXVkb3MuZXEse3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KXIucHNldWRvc1tlXT1odChlKTtmb3IoZSBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KXIucHNldWRvc1tlXT1kdChlKTtmdW5jdGlvbiBtdCgpe31mdW5jdGlvbiBidCh0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoLHI9IiI7ZTxuO2UrKylyKz10W2VdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIHh0KHQsZSxuKXt2YXIgcj1lLmRpcixvPWUubmV4dCxpPW98fHIsYT1uJiYicGFyZW50Tm9kZSI9PT1pLHM9UysrO3JldHVybiBlLmZpcnN0P2Z1bmN0aW9uKGUsbixvKXtmb3IoO2U9ZVtyXTspaWYoMT09PWUubm9kZVR5cGV8fGEpcmV0dXJuIHQoZSxuLG8pO3JldHVybiExfTpmdW5jdGlvbihlLG4sdSl7dmFyIGMsbCxmLHA9W2ssc107aWYodSl7Zm9yKDtlPWVbcl07KWlmKCgxPT09ZS5ub2RlVHlwZXx8YSkmJnQoZSxuLHUpKXJldHVybiEwfWVsc2UgZm9yKDtlPWVbcl07KWlmKDE9PT1lLm5vZGVUeXBlfHxhKWlmKGw9KGY9ZVt4XXx8KGVbeF09e30pKVtlLnVuaXF1ZUlEXXx8KGZbZS51bmlxdWVJRF09e30pLG8mJm89PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpZT1lW3JdfHxlO2Vsc2V7aWYoKGM9bFtpXSkmJmNbMF09PT1rJiZjWzFdPT09cylyZXR1cm4gcFsyXT1jWzJdO2lmKGxbaV09cCxwWzJdPXQoZSxuLHUpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB3dCh0KXtyZXR1cm4gdC5sZW5ndGg+MT9mdW5jdGlvbihlLG4scil7Zm9yKHZhciBvPXQubGVuZ3RoO28tLTspaWYoIXRbb10oZSxuLHIpKXJldHVybiExO3JldHVybiEwfTp0WzBdfWZ1bmN0aW9uIGt0KHQsZSxuLHIsbyl7Zm9yKHZhciBpLGE9W10scz0wLHU9dC5sZW5ndGgsYz1udWxsIT1lO3M8dTtzKyspKGk9dFtzXSkmJihuJiYhbihpLHIsbyl8fChhLnB1c2goaSksYyYmZS5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gU3QodCxlLG4scixvLGkpe3JldHVybiByJiYhclt4XSYmKHI9U3QocikpLG8mJiFvW3hdJiYobz1TdChvLGkpKSxjdChmdW5jdGlvbihpLGEscyx1KXt2YXIgYyxsLGYscD1bXSxoPVtdLGQ9YS5sZW5ndGgsZz1pfHxmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTAsbz1lLmxlbmd0aDtyPG87cisrKXN0KHQsZVtyXSxuKTtyZXR1cm4gbn0oZXx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLHY9IXR8fCFpJiZlP2c6a3QoZyxwLHQscyx1KSx5PW4/b3x8KGk/dDpkfHxyKT9bXTphOnY7aWYobiYmbih2LHkscyx1KSxyKWZvcihjPWt0KHksaCkscihjLFtdLHMsdSksbD1jLmxlbmd0aDtsLS07KShmPWNbbF0pJiYoeVtoW2xdXT0hKHZbaFtsXV09ZikpO2lmKGkpe2lmKG98fHQpe2lmKG8pe2ZvcihjPVtdLGw9eS5sZW5ndGg7bC0tOykoZj15W2xdKSYmYy5wdXNoKHZbbF09Zik7byhudWxsLHk9W10sYyx1KX1mb3IobD15Lmxlbmd0aDtsLS07KShmPXlbbF0pJiYoYz1vP0QoaSxmKTpwW2xdKT4tMSYmKGlbY109IShhW2NdPWYpKX19ZWxzZSB5PWt0KHk9PT1hP3kuc3BsaWNlKGQseS5sZW5ndGgpOnkpLG8/byhudWxsLGEseSx1KTpOLmFwcGx5KGEseSl9KX1mdW5jdGlvbiBFdCh0KXtmb3IodmFyIGUsbixvLGk9dC5sZW5ndGgsYT1yLnJlbGF0aXZlW3RbMF0udHlwZV0scz1hfHxyLnJlbGF0aXZlWyIgIl0sdT1hPzE6MCxsPXh0KGZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZX0scywhMCksZj14dChmdW5jdGlvbih0KXtyZXR1cm4gRChlLHQpPi0xfSxzLCEwKSxwPVtmdW5jdGlvbih0LG4scil7dmFyIG89IWEmJihyfHxuIT09Yyl8fCgoZT1uKS5ub2RlVHlwZT9sKHQsbixyKTpmKHQsbixyKSk7cmV0dXJuIGU9bnVsbCxvfV07dTxpO3UrKylpZihuPXIucmVsYXRpdmVbdFt1XS50eXBlXSlwPVt4dCh3dChwKSxuKV07ZWxzZXtpZigobj1yLmZpbHRlclt0W3VdLnR5cGVdLmFwcGx5KG51bGwsdFt1XS5tYXRjaGVzKSlbeF0pe2ZvcihvPSsrdTtvPGkmJiFyLnJlbGF0aXZlW3Rbb10udHlwZV07bysrKTtyZXR1cm4gU3QodT4xJiZ3dChwKSx1PjEmJmJ0KHQuc2xpY2UoMCx1LTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09dFt1LTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoSCwiJDEiKSxuLHU8byYmRXQodC5zbGljZSh1LG8pKSxvPGkmJkV0KHQ9dC5zbGljZShvKSksbzxpJiZidCh0KSl9cC5wdXNoKG4pfXJldHVybiB3dChwKX1yZXR1cm4gbXQucHJvdG90eXBlPXIuZmlsdGVycz1yLnBzZXVkb3Msci5zZXRGaWx0ZXJzPW5ldyBtdCxhPXN0LnRva2VuaXplPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbyxpLGEscyx1LGMsbD1UW3QrIiAiXTtpZihsKXJldHVybiBlPzA6bC5zbGljZSgwKTtmb3Iocz10LHU9W10sYz1yLnByZUZpbHRlcjtzOyl7Zm9yKGEgaW4gbiYmIShvPXouZXhlYyhzKSl8fChvJiYocz1zLnNsaWNlKG9bMF0ubGVuZ3RoKXx8cyksdS5wdXNoKGk9W10pKSxuPSExLChvPVcuZXhlYyhzKSkmJihuPW8uc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvWzBdLnJlcGxhY2UoSCwiICIpfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSksci5maWx0ZXIpIShvPUdbYV0uZXhlYyhzKSl8fGNbYV0mJiEobz1jW2FdKG8pKXx8KG49by5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOmEsbWF0Y2hlczpvfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0dXJuIGU/cy5sZW5ndGg6cz9zdC5lcnJvcih0KTpUKHQsdSkuc2xpY2UoMCl9LHM9c3QuY29tcGlsZT1mdW5jdGlvbih0LGUpe3ZhciBuLG89W10saT1bXSxzPWpbdCsiICJdO2lmKCFzKXtmb3IoZXx8KGU9YSh0KSksbj1lLmxlbmd0aDtuLS07KShzPUV0KGVbbl0pKVt4XT9vLnB1c2gocyk6aS5wdXNoKHMpOyhzPWoodCxmdW5jdGlvbih0LGUpe3ZhciBuPWUubGVuZ3RoPjAsbz10Lmxlbmd0aD4wLGk9ZnVuY3Rpb24oaSxhLHMsdSxsKXt2YXIgZixkLHYseT0wLG09IjAiLGI9aSYmW10seD1bXSx3PWMsUz1pfHxvJiZyLmZpbmQuVEFHKCIqIixsKSxFPWsrPW51bGw9PXc/MTpNYXRoLnJhbmRvbSgpfHwuMSxUPVMubGVuZ3RoO2ZvcihsJiYoYz1hPT09aHx8YXx8bCk7bSE9PVQmJm51bGwhPShmPVNbbV0pO20rKyl7aWYobyYmZil7Zm9yKGQ9MCxhfHxmLm93bmVyRG9jdW1lbnQ9PT1ofHwocChmKSxzPSFnKTt2PXRbZCsrXTspaWYodihmLGF8fGgscykpe3UucHVzaChmKTticmVha31sJiYoaz1FKX1uJiYoKGY9IXYmJmYpJiZ5LS0saSYmYi5wdXNoKGYpKX1pZih5Kz1tLG4mJm0hPT15KXtmb3IoZD0wO3Y9ZVtkKytdOyl2KGIseCxhLHMpO2lmKGkpe2lmKHk+MClmb3IoO20tLTspYlttXXx8eFttXXx8KHhbbV09Ui5jYWxsKHUpKTt4PWt0KHgpfU4uYXBwbHkodSx4KSxsJiYhaSYmeC5sZW5ndGg+MCYmeStlLmxlbmd0aD4xJiZzdC51bmlxdWVTb3J0KHUpfXJldHVybiBsJiYoaz1FLGM9dyksYn07cmV0dXJuIG4/Y3QoaSk6aX0oaSxvKSkpLnNlbGVjdG9yPXR9cmV0dXJuIHN9LHU9c3Quc2VsZWN0PWZ1bmN0aW9uKHQsZSxuLG8pe3ZhciBpLHUsYyxsLGYscD0iZnVuY3Rpb24iPT10eXBlb2YgdCYmdCxoPSFvJiZhKHQ9cC5zZWxlY3Rvcnx8dCk7aWYobj1ufHxbXSwxPT09aC5sZW5ndGgpe2lmKCh1PWhbMF09aFswXS5zbGljZSgwKSkubGVuZ3RoPjImJiJJRCI9PT0oYz11WzBdKS50eXBlJiY5PT09ZS5ub2RlVHlwZSYmZyYmci5yZWxhdGl2ZVt1WzFdLnR5cGVdKXtpZighKGU9KHIuZmluZC5JRChjLm1hdGNoZXNbMF0ucmVwbGFjZShldCxudCksZSl8fFtdKVswXSkpcmV0dXJuIG47cCYmKGU9ZS5wYXJlbnROb2RlKSx0PXQuc2xpY2UodS5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9Zm9yKGk9Ry5uZWVkc0NvbnRleHQudGVzdCh0KT8wOnUubGVuZ3RoO2ktLSYmKGM9dVtpXSwhci5yZWxhdGl2ZVtsPWMudHlwZV0pOylpZigoZj1yLmZpbmRbbF0pJiYobz1mKGMubWF0Y2hlc1swXS5yZXBsYWNlKGV0LG50KSx0dC50ZXN0KHVbMF0udHlwZSkmJnl0KGUucGFyZW50Tm9kZSl8fGUpKSl7aWYodS5zcGxpY2UoaSwxKSwhKHQ9by5sZW5ndGgmJmJ0KHUpKSlyZXR1cm4gTi5hcHBseShuLG8pLG47YnJlYWt9fXJldHVybihwfHxzKHQsaCkpKG8sZSwhZyxuLCFlfHx0dC50ZXN0KHQpJiZ5dChlLnBhcmVudE5vZGUpfHxlKSxufSxuLnNvcnRTdGFibGU9eC5zcGxpdCgiIikuc29ydChPKS5qb2luKCIiKT09PXgsbi5kZXRlY3REdXBsaWNhdGVzPSEhZixwKCksbi5zb3J0RGV0YWNoZWQ9bHQoZnVuY3Rpb24odCl7cmV0dXJuIDEmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihoLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksbHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT10LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8ZnQoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKHQsZSxuKXtpZighbilyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoZSwidHlwZSI9PT1lLnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmbHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5uZXJIVE1MPSI8aW5wdXQvPiIsdC5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PXQuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8ZnQoInZhbHVlIixmdW5jdGlvbih0LGUsbil7aWYoIW4mJiJpbnB1dCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQuZGVmYXVsdFZhbHVlfSksbHQoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGZ0KF8sZnVuY3Rpb24odCxlLG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09dFtlXT9lLnRvTG93ZXJDYXNlKCk6KHI9dC5nZXRBdHRyaWJ1dGVOb2RlKGUpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksc3R9KG4pO1MuZmluZD1qLFMuZXhwcj1qLnNlbGVjdG9ycyxTLmV4cHJbIjoiXT1TLmV4cHIucHNldWRvcyxTLnVuaXF1ZVNvcnQ9Uy51bmlxdWU9ai51bmlxdWVTb3J0LFMudGV4dD1qLmdldFRleHQsUy5pc1hNTERvYz1qLmlzWE1MLFMuY29udGFpbnM9ai5jb250YWlucyxTLmVzY2FwZVNlbGVjdG9yPWouZXNjYXBlO3ZhciBBPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9W10sbz12b2lkIDAhPT1uOyh0PXRbZV0pJiY5IT09dC5ub2RlVHlwZTspaWYoMT09PXQubm9kZVR5cGUpe2lmKG8mJlModCkuaXMobikpYnJlYWs7ci5wdXNoKHQpfXJldHVybiByfSxPPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdO3Q7dD10Lm5leHRTaWJsaW5nKTE9PT10Lm5vZGVUeXBlJiZ0IT09ZSYmbi5wdXNoKHQpO3JldHVybiBufSxDPVMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7ZnVuY3Rpb24gTCh0LGUpe3JldHVybiB0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCl9dmFyIFI9L148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7ZnVuY3Rpb24gUCh0LGUsbil7cmV0dXJuIG0oZSk/Uy5ncmVwKHQsZnVuY3Rpb24odCxyKXtyZXR1cm4hIWUuY2FsbCh0LHIsdCkhPT1ufSk6ZS5ub2RlVHlwZT9TLmdyZXAodCxmdW5jdGlvbih0KXtyZXR1cm4gdD09PWUhPT1ufSk6InN0cmluZyIhPXR5cGVvZiBlP1MuZ3JlcCh0LGZ1bmN0aW9uKHQpe3JldHVybiBmLmNhbGwoZSx0KT4tMSE9PW59KTpTLmZpbHRlcihlLHQsbil9Uy5maWx0ZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWVbMF07cmV0dXJuIG4mJih0PSI6bm90KCIrdCsiKSIpLDE9PT1lLmxlbmd0aCYmMT09PXIubm9kZVR5cGU/Uy5maW5kLm1hdGNoZXNTZWxlY3RvcihyLHQpP1tyXTpbXTpTLmZpbmQubWF0Y2hlcyh0LFMuZ3JlcChlLGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5ub2RlVHlwZX0pKX0sUy5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyPXRoaXMubGVuZ3RoLG89dGhpcztpZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIHRoaXMucHVzaFN0YWNrKFModCkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGU9MDtlPHI7ZSsrKWlmKFMuY29udGFpbnMob1tlXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3Iobj10aGlzLnB1c2hTdGFjayhbXSksZT0wO2U8cjtlKyspUy5maW5kKHQsb1tlXSxuKTtyZXR1cm4gcj4xP1MudW5pcXVlU29ydChuKTpufSxmaWx0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFAodGhpcyx0fHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFAodGhpcyx0fHxbXSwhMCkpfSxpczpmdW5jdGlvbih0KXtyZXR1cm4hIVAodGhpcywic3RyaW5nIj09dHlwZW9mIHQmJkMudGVzdCh0KT9TKHQpOnR8fFtdLCExKS5sZW5ndGh9fSk7dmFyIE4sST0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSspKSQvOyhTLmZuLmluaXQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByLG87aWYoIXQpcmV0dXJuIHRoaXM7aWYobj1ufHxOLCJzdHJpbmciPT10eXBlb2YgdCl7aWYoIShyPSI8Ij09PXRbMF0mJiI+Ij09PXRbdC5sZW5ndGgtMV0mJnQubGVuZ3RoPj0zP1tudWxsLHQsbnVsbF06SS5leGVjKHQpKXx8IXJbMV0mJmUpcmV0dXJuIWV8fGUuanF1ZXJ5PyhlfHxuKS5maW5kKHQpOnRoaXMuY29uc3RydWN0b3IoZSkuZmluZCh0KTtpZihyWzFdKXtpZihlPWUgaW5zdGFuY2VvZiBTP2VbMF06ZSxTLm1lcmdlKHRoaXMsUy5wYXJzZUhUTUwoclsxXSxlJiZlLm5vZGVUeXBlP2Uub3duZXJEb2N1bWVudHx8ZTphLCEwKSksUi50ZXN0KHJbMV0pJiZTLmlzUGxhaW5PYmplY3QoZSkpZm9yKHIgaW4gZSltKHRoaXNbcl0pP3RoaXNbcl0oZVtyXSk6dGhpcy5hdHRyKHIsZVtyXSk7cmV0dXJuIHRoaXN9cmV0dXJuKG89YS5nZXRFbGVtZW50QnlJZChyWzJdKSkmJih0aGlzWzBdPW8sdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gdC5ub2RlVHlwZT8odGhpc1swXT10LHRoaXMubGVuZ3RoPTEsdGhpcyk6bSh0KT92b2lkIDAhPT1uLnJlYWR5P24ucmVhZHkodCk6dChTKTpTLm1ha2VBcnJheSh0LHRoaXMpfSkucHJvdG90eXBlPVMuZm4sTj1TKGEpO3ZhciBEPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLF89e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ZnVuY3Rpb24gTSh0LGUpe2Zvcig7KHQ9dFtlXSkmJjEhPT10Lm5vZGVUeXBlOyk7cmV0dXJuIHR9Uy5mbi5leHRlbmQoe2hhczpmdW5jdGlvbih0KXt2YXIgZT1TKHQsdGhpcyksbj1lLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PG47dCsrKWlmKFMuY29udGFpbnModGhpcyxlW3RdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wLG89dGhpcy5sZW5ndGgsaT1bXSxhPSJzdHJpbmciIT10eXBlb2YgdCYmUyh0KTtpZighQy50ZXN0KHQpKWZvcig7cjxvO3IrKylmb3Iobj10aGlzW3JdO24mJm4hPT1lO249bi5wYXJlbnROb2RlKWlmKG4ubm9kZVR5cGU8MTEmJihhP2EuaW5kZXgobik+LTE6MT09PW4ubm9kZVR5cGUmJlMuZmluZC5tYXRjaGVzU2VsZWN0b3Iobix0KSkpe2kucHVzaChuKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soaS5sZW5ndGg+MT9TLnVuaXF1ZVNvcnQoaSk6aSl9LGluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0PyJzdHJpbmciPT10eXBlb2YgdD9mLmNhbGwoUyh0KSx0aGlzWzBdKTpmLmNhbGwodGhpcyx0LmpxdWVyeT90WzBdOnQpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMudW5pcXVlU29ydChTLm1lcmdlKHRoaXMuZ2V0KCksUyh0LGUpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFkZChudWxsPT10P3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKHQpKX19KSxTLmVhY2goe3BhcmVudDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7cmV0dXJuIGUmJjExIT09ZS5ub2RlVHlwZT9lOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24odCl7cmV0dXJuIEEodCwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBBKHQsInBhcmVudE5vZGUiLG4pfSxuZXh0OmZ1bmN0aW9uKHQpe3JldHVybiBNKHQsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24odCl7cmV0dXJuIE0odCwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIEEodCwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbih0KXtyZXR1cm4gQSh0LCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQSh0LCJuZXh0U2libGluZyIsbil9LHByZXZVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIEEodCwicHJldmlvdXNTaWJsaW5nIixuKX0sc2libGluZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIE8oKHQucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsdCl9LGNoaWxkcmVuOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10LmNvbnRlbnREb2N1bWVudD90LmNvbnRlbnREb2N1bWVudDooTCh0LCJ0ZW1wbGF0ZSIpJiYodD10LmNvbnRlbnR8fHQpLFMubWVyZ2UoW10sdC5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbih0LGUpe1MuZm5bdF09ZnVuY3Rpb24obixyKXt2YXIgbz1TLm1hcCh0aGlzLGUsbik7cmV0dXJuIlVudGlsIiE9PXQuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihvPVMuZmlsdGVyKHIsbykpLHRoaXMubGVuZ3RoPjEmJihfW3RdfHxTLnVuaXF1ZVNvcnQobyksRC50ZXN0KHQpJiZvLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2sobyl9fSk7dmFyIFU9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBCKHQpe3JldHVybiB0fWZ1bmN0aW9uIHEodCl7dGhyb3cgdH1mdW5jdGlvbiBGKHQsZSxuLHIpe3ZhciBvO3RyeXt0JiZtKG89dC5wcm9taXNlKT9vLmNhbGwodCkuZG9uZShlKS5mYWlsKG4pOnQmJm0obz10LnRoZW4pP28uY2FsbCh0LGUsbik6ZS5hcHBseSh2b2lkIDAsW3RdLnNsaWNlKHIpKX1jYXRjaCh0KXtuLmFwcGx5KHZvaWQgMCxbdF0pfX1TLkNhbGxiYWNrcz1mdW5jdGlvbih0KXt0PSJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gUy5lYWNoKHQubWF0Y2goVSl8fFtdLGZ1bmN0aW9uKHQsbil7ZVtuXT0hMH0pLGV9KHQpOlMuZXh0ZW5kKHt9LHQpO3ZhciBlLG4scixvLGk9W10sYT1bXSxzPS0xLHU9ZnVuY3Rpb24oKXtmb3Iobz1vfHx0Lm9uY2Uscj1lPSEwO2EubGVuZ3RoO3M9LTEpZm9yKG49YS5zaGlmdCgpOysrczxpLmxlbmd0aDspITE9PT1pW3NdLmFwcGx5KG5bMF0sblsxXSkmJnQuc3RvcE9uRmFsc2UmJihzPWkubGVuZ3RoLG49ITEpO3QubWVtb3J5fHwobj0hMSksZT0hMSxvJiYoaT1uP1tdOiIiKX0sYz17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIGkmJihuJiYhZSYmKHM9aS5sZW5ndGgtMSxhLnB1c2gobikpLGZ1bmN0aW9uIGUobil7Uy5lYWNoKG4sZnVuY3Rpb24obixyKXttKHIpP3QudW5pcXVlJiZjLmhhcyhyKXx8aS5wdXNoKHIpOnImJnIubGVuZ3RoJiYic3RyaW5nIiE9PWsocikmJmUocil9KX0oYXJndW1lbnRzKSxuJiYhZSYmdSgpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbjsobj1TLmluQXJyYXkoZSxpLG4pKT4tMTspaS5zcGxpY2UobiwxKSxuPD1zJiZzLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/Uy5pbkFycmF5KHQsaSk+LTE6aS5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaSYmKGk9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gbz1hPVtdLGk9bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFpfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIG89YT1bXSxufHxlfHwoaT1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW99LGZpcmVXaXRoOmZ1bmN0aW9uKHQsbil7cmV0dXJuIG98fChuPVt0LChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0sYS5wdXNoKG4pLGV8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBjLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBjfSxTLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIGU9W1sibm90aWZ5IiwicHJvZ3Jlc3MiLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSxTLkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLHI9InBlbmRpbmciLG89e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sY2F0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIG8udGhlbihudWxsLHQpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3JldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKG4pe1MuZWFjaChlLGZ1bmN0aW9uKGUscil7dmFyIG89bSh0W3JbNF1dKSYmdFtyWzRdXTtpW3JbMV1dKGZ1bmN0aW9uKCl7dmFyIHQ9byYmby5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dCYmbSh0LnByb21pc2UpP3QucHJvbWlzZSgpLnByb2dyZXNzKG4ubm90aWZ5KS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCk6bltyWzBdKyJXaXRoIl0odGhpcyxvP1t0XTphcmd1bWVudHMpfSl9KSx0PW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxyLG8pe3ZhciBpPTA7ZnVuY3Rpb24gYSh0LGUscixvKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcz10aGlzLHU9YXJndW1lbnRzLGM9ZnVuY3Rpb24oKXt2YXIgbixjO2lmKCEodDxpKSl7aWYoKG49ci5hcHBseShzLHUpKT09PWUucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO2M9biYmKCJvYmplY3QiPT10eXBlb2Ygbnx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pJiZuLnRoZW4sbShjKT9vP2MuY2FsbChuLGEoaSxlLEIsbyksYShpLGUscSxvKSk6KGkrKyxjLmNhbGwobixhKGksZSxCLG8pLGEoaSxlLHEsbyksYShpLGUsQixlLm5vdGlmeVdpdGgpKSk6KHIhPT1CJiYocz12b2lkIDAsdT1bbl0pLChvfHxlLnJlc29sdmVXaXRoKShzLHUpKX19LGw9bz9jOmZ1bmN0aW9uKCl7dHJ5e2MoKX1jYXRjaChuKXtTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJlMuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhuLGwuc3RhY2tUcmFjZSksdCsxPj1pJiYociE9PXEmJihzPXZvaWQgMCx1PVtuXSksZS5yZWplY3RXaXRoKHMsdSkpfX07dD9sKCk6KFMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYobC5zdGFja1RyYWNlPVMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLG4uc2V0VGltZW91dChsKSl9fXJldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKG4pe2VbMF1bM10uYWRkKGEoMCxuLG0obyk/bzpCLG4ubm90aWZ5V2l0aCkpLGVbMV1bM10uYWRkKGEoMCxuLG0odCk/dDpCKSksZVsyXVszXS5hZGQoYSgwLG4sbShyKT9yOnEpKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dD9TLmV4dGVuZCh0LG8pOm99fSxpPXt9O3JldHVybiBTLmVhY2goZSxmdW5jdGlvbih0LG4pe3ZhciBhPW5bMl0scz1uWzVdO29bblsxXV09YS5hZGQscyYmYS5hZGQoZnVuY3Rpb24oKXtyPXN9LGVbMy10XVsyXS5kaXNhYmxlLGVbMy10XVszXS5kaXNhYmxlLGVbMF1bMl0ubG9jayxlWzBdWzNdLmxvY2spLGEuYWRkKG5bM10uZmlyZSksaVtuWzBdXT1mdW5jdGlvbigpe3JldHVybiBpW25bMF0rIldpdGgiXSh0aGlzPT09aT92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LGlbblswXSsiV2l0aCJdPWEuZmlyZVdpdGh9KSxvLnByb21pc2UoaSksdCYmdC5jYWxsKGksaSksaX0sd2hlbjpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49ZSxyPUFycmF5KG4pLG89dS5jYWxsKGFyZ3VtZW50cyksaT1TLkRlZmVycmVkKCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7clt0XT10aGlzLG9bdF09YXJndW1lbnRzLmxlbmd0aD4xP3UuY2FsbChhcmd1bWVudHMpOm4sLS1lfHxpLnJlc29sdmVXaXRoKHIsbyl9fTtpZihlPD0xJiYoRih0LGkuZG9uZShhKG4pKS5yZXNvbHZlLGkucmVqZWN0LCFlKSwicGVuZGluZyI9PT1pLnN0YXRlKCl8fG0ob1tuXSYmb1tuXS50aGVuKSkpcmV0dXJuIGkudGhlbigpO2Zvcig7bi0tOylGKG9bbl0sYShuKSxpLnJlamVjdCk7cmV0dXJuIGkucHJvbWlzZSgpfX0pO3ZhciBIPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1MuRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbih0LGUpe24uY29uc29sZSYmbi5jb25zb2xlLndhcm4mJnQmJkgudGVzdCh0Lm5hbWUpJiZuLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIit0Lm1lc3NhZ2UsdC5zdGFjayxlKX0sUy5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbih0KXtuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB0fSl9O3ZhciB6PVMuRGVmZXJyZWQoKTtmdW5jdGlvbiBXKCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixXKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLFcpLFMucmVhZHkoKX1TLmZuLnJlYWR5PWZ1bmN0aW9uKHQpe3JldHVybiB6LnRoZW4odCkuY2F0Y2goZnVuY3Rpb24odCl7Uy5yZWFkeUV4Y2VwdGlvbih0KX0pLHRoaXN9LFMuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKHQpeyghMD09PXQ/LS1TLnJlYWR5V2FpdDpTLmlzUmVhZHkpfHwoUy5pc1JlYWR5PSEwLCEwIT09dCYmLS1TLnJlYWR5V2FpdD4wfHx6LnJlc29sdmVXaXRoKGEsW1NdKSl9fSksUy5yZWFkeS50aGVuPXoudGhlbiwiY29tcGxldGUiPT09YS5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1hLnJlYWR5U3RhdGUmJiFhLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9uLnNldFRpbWVvdXQoUy5yZWFkeSk6KGEuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsVyksbi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixXKSk7dmFyICQ9ZnVuY3Rpb24odCxlLG4scixvLGksYSl7dmFyIHM9MCx1PXQubGVuZ3RoLGM9bnVsbD09bjtpZigib2JqZWN0Ij09PWsobikpZm9yKHMgaW4gbz0hMCxuKSQodCxlLHMsbltzXSwhMCxpLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKG89ITAsbShyKXx8KGE9ITApLGMmJihhPyhlLmNhbGwodCxyKSxlPW51bGwpOihjPWUsZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGMuY2FsbChTKHQpLG4pfSkpLGUpKWZvcig7czx1O3MrKyllKHRbc10sbixhP3I6ci5jYWxsKHRbc10scyxlKHRbc10sbikpKTtyZXR1cm4gbz90OmM/ZS5jYWxsKHQpOnU/ZSh0WzBdLG4pOml9LFk9L14tbXMtLyxWPS8tKFthLXpdKS9nO2Z1bmN0aW9uIEcodCxlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEsodCl7cmV0dXJuIHQucmVwbGFjZShZLCJtcy0iKS5yZXBsYWNlKFYsRyl9dmFyIFg9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lm5vZGVUeXBlfHw5PT09dC5ub2RlVHlwZXx8ISt0Lm5vZGVUeXBlfTtmdW5jdGlvbiBKKCl7dGhpcy5leHBhbmRvPVMuZXhwYW5kbytKLnVpZCsrfUoudWlkPTEsSi5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5leHBhbmRvXTtyZXR1cm4gZXx8KGU9e30sWCh0KSYmKHQubm9kZVR5cGU/dFt0aGlzLmV4cGFuZG9dPWU6T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsdGhpcy5leHBhbmRvLHt2YWx1ZTplLGNvbmZpZ3VyYWJsZTohMH0pKSksZX0sc2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvPXRoaXMuY2FjaGUodCk7aWYoInN0cmluZyI9PXR5cGVvZiBlKW9bSyhlKV09bjtlbHNlIGZvcihyIGluIGUpb1tLKHIpXT1lW3JdO3JldHVybiBvfSxnZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLmNhY2hlKHQpOnRbdGhpcy5leHBhbmRvXSYmdFt0aGlzLmV4cGFuZG9dW0soZSldfSxhY2Nlc3M6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1lfHxlJiYic3RyaW5nIj09dHlwZW9mIGUmJnZvaWQgMD09PW4/dGhpcy5nZXQodCxlKToodGhpcy5zZXQodCxlLG4pLHZvaWQgMCE9PW4/bjplKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj10W3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09ZSl7bj0oZT1BcnJheS5pc0FycmF5KGUpP2UubWFwKEspOihlPUsoZSkpaW4gcj9bZV06ZS5tYXRjaChVKXx8W10pLmxlbmd0aDtmb3IoO24tLTspZGVsZXRlIHJbZVtuXV19KHZvaWQgMD09PWV8fFMuaXNFbXB0eU9iamVjdChyKSkmJih0Lm5vZGVUeXBlP3RbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIHRbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09ZSYmIVMuaXNFbXB0eU9iamVjdChlKX19O3ZhciBRPW5ldyBKLFo9bmV3IEosdHQ9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxldD0vW0EtWl0vZztmdW5jdGlvbiBudCh0LGUsbil7dmFyIHI7aWYodm9pZCAwPT09biYmMT09PXQubm9kZVR5cGUpaWYocj0iZGF0YS0iK2UucmVwbGFjZShldCwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49dC5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj1mdW5jdGlvbih0KXtyZXR1cm4idHJ1ZSI9PT10fHwiZmFsc2UiIT09dCYmKCJudWxsIj09PXQ/bnVsbDp0PT09K3QrIiI/K3Q6dHQudGVzdCh0KT9KU09OLnBhcnNlKHQpOnQpfShuKX1jYXRjaCh0KXt9Wi5zZXQodCxlLG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59Uy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIFouaGFzRGF0YSh0KXx8US5oYXNEYXRhKHQpfSxkYXRhOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gWi5hY2Nlc3ModCxlLG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQsZSl7Wi5yZW1vdmUodCxlKX0sX2RhdGE6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBRLmFjY2Vzcyh0LGUsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKHQsZSl7US5yZW1vdmUodCxlKX19KSxTLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbyxpPXRoaXNbMF0sYT1pJiZpLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09dCl7aWYodGhpcy5sZW5ndGgmJihvPVouZ2V0KGkpLDE9PT1pLm5vZGVUeXBlJiYhUS5nZXQoaSwiaGFzRGF0YUF0dHJzIikpKXtmb3Iobj1hLmxlbmd0aDtuLS07KWFbbl0mJjA9PT0ocj1hW25dLm5hbWUpLmluZGV4T2YoImRhdGEtIikmJihyPUsoci5zbGljZSg1KSksbnQoaSxyLG9bcl0pKTtRLnNldChpLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gb31yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Wi5zZXQodGhpcyx0KX0pOiQodGhpcyxmdW5jdGlvbihlKXt2YXIgbjtpZihpJiZ2b2lkIDA9PT1lKXJldHVybiB2b2lkIDAhPT0obj1aLmdldChpLHQpKT9uOnZvaWQgMCE9PShuPW50KGksdCkpP246dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe1ouc2V0KHRoaXMsdCxlKX0pfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtaLnJlbW92ZSh0aGlzLHQpfSl9fSksUy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtpZih0KXJldHVybiBlPShlfHwiZngiKSsicXVldWUiLHI9US5nZXQodCxlKSxuJiYoIXJ8fEFycmF5LmlzQXJyYXkobik/cj1RLmFjY2Vzcyh0LGUsUy5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24odCxlKXtlPWV8fCJmeCI7dmFyIG49Uy5xdWV1ZSh0LGUpLHI9bi5sZW5ndGgsbz1uLnNoaWZ0KCksaT1TLl9xdWV1ZUhvb2tzKHQsZSk7ImlucHJvZ3Jlc3MiPT09byYmKG89bi5zaGlmdCgpLHItLSksbyYmKCJmeCI9PT1lJiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgaS5zdG9wLG8uY2FsbCh0LGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKHQsZSl9LGkpKSwhciYmaSYmaS5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZSsicXVldWVIb29rcyI7cmV0dXJuIFEuZ2V0KHQsbil8fFEuYWNjZXNzKHQsbix7ZW1wdHk6Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7US5yZW1vdmUodCxbZSsicXVldWUiLG5dKX0pfSl9fSksUy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihlPXQsdD0iZngiLG4tLSksYXJndW1lbnRzLmxlbmd0aDxuP1MucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1lP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49Uy5xdWV1ZSh0aGlzLHQsZSk7Uy5fcXVldWVIb29rcyh0aGlzLHQpLCJmeCI9PT10JiYiaW5wcm9ncmVzcyIhPT1uWzBdJiZTLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmRlcXVldWUodGhpcyx0KX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnF1ZXVlKHR8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0xLG89Uy5EZWZlcnJlZCgpLGk9dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fG8ucmVzb2x2ZVdpdGgoaSxbaV0pfTtmb3IoInN0cmluZyIhPXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSx0PXR8fCJmeCI7YS0tOykobj1RLmdldChpW2FdLHQrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksby5wcm9taXNlKGUpfX0pO3ZhciBydD0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxvdD1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrcnQrIikoW2EteiVdKikkIiwiaSIpLGl0PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYXQ9YS5kb2N1bWVudEVsZW1lbnQsc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIFMuY29udGFpbnModC5vd25lckRvY3VtZW50LHQpfSx1dD17Y29tcG9zZWQ6ITB9O2F0LmdldFJvb3ROb2RlJiYoc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIFMuY29udGFpbnModC5vd25lckRvY3VtZW50LHQpfHx0LmdldFJvb3ROb2RlKHV0KT09PXQub3duZXJEb2N1bWVudH0pO3ZhciBjdD1mdW5jdGlvbih0LGUpe3JldHVybiJub25lIj09PSh0PWV8fHQpLnN0eWxlLmRpc3BsYXl8fCIiPT09dC5zdHlsZS5kaXNwbGF5JiZzdCh0KSYmIm5vbmUiPT09Uy5jc3ModCwiZGlzcGxheSIpfSxsdD1mdW5jdGlvbih0LGUsbixyKXt2YXIgbyxpLGE9e307Zm9yKGkgaW4gZSlhW2ldPXQuc3R5bGVbaV0sdC5zdHlsZVtpXT1lW2ldO2ZvcihpIGluIG89bi5hcHBseSh0LHJ8fFtdKSxlKXQuc3R5bGVbaV09YVtpXTtyZXR1cm4gb307ZnVuY3Rpb24gZnQodCxlLG4scil7dmFyIG8saSxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBTLmNzcyh0LGUsIiIpfSx1PXMoKSxjPW4mJm5bM118fChTLmNzc051bWJlcltlXT8iIjoicHgiKSxsPXQubm9kZVR5cGUmJihTLmNzc051bWJlcltlXXx8InB4IiE9PWMmJit1KSYmb3QuZXhlYyhTLmNzcyh0LGUpKTtpZihsJiZsWzNdIT09Yyl7Zm9yKHUvPTIsYz1jfHxsWzNdLGw9K3V8fDE7YS0tOylTLnN0eWxlKHQsZSxsK2MpLCgxLWkpKigxLShpPXMoKS91fHwuNSkpPD0wJiYoYT0wKSxsLz1pO2wqPTIsUy5zdHlsZSh0LGUsbCtjKSxuPW58fFtdfXJldHVybiBuJiYobD0rbHx8K3V8fDAsbz1uWzFdP2wrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWMsci5zdGFydD1sLHIuZW5kPW8pKSxvfXZhciBwdD17fTtmdW5jdGlvbiBodCh0KXt2YXIgZSxuPXQub3duZXJEb2N1bWVudCxyPXQubm9kZU5hbWUsbz1wdFtyXTtyZXR1cm4gb3x8KGU9bi5ib2R5LmFwcGVuZENoaWxkKG4uY3JlYXRlRWxlbWVudChyKSksbz1TLmNzcyhlLCJkaXNwbGF5IiksZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLCJub25lIj09PW8mJihvPSJibG9jayIpLHB0W3JdPW8sbyl9ZnVuY3Rpb24gZHQodCxlKXtmb3IodmFyIG4scixvPVtdLGk9MCxhPXQubGVuZ3RoO2k8YTtpKyspKHI9dFtpXSkuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSxlPygibm9uZSI9PT1uJiYob1tpXT1RLmdldChyLCJkaXNwbGF5Iil8fG51bGwsb1tpXXx8KHIuc3R5bGUuZGlzcGxheT0iIikpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZjdChyKSYmKG9baV09aHQocikpKToibm9uZSIhPT1uJiYob1tpXT0ibm9uZSIsUS5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoaT0wO2k8YTtpKyspbnVsbCE9b1tpXSYmKHRbaV0uc3R5bGUuZGlzcGxheT1vW2ldKTtyZXR1cm4gdH1TLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBkdCh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBkdCh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHQ/dD90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtjdCh0aGlzKT9TKHRoaXMpLnNob3coKTpTKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBndD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSx2dD0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKikvaSx5dD0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksbXQ9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtmdW5jdGlvbiBidCh0LGUpe3ZhciBuO3JldHVybiBuPXZvaWQgMCE9PXQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlfHwiKiIpOnZvaWQgMCE9PXQucXVlcnlTZWxlY3RvckFsbD90LnF1ZXJ5U2VsZWN0b3JBbGwoZXx8IioiKTpbXSx2b2lkIDA9PT1lfHxlJiZMKHQsZSk/Uy5tZXJnZShbdF0sbik6bn1mdW5jdGlvbiB4dCh0LGUpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylRLnNldCh0W25dLCJnbG9iYWxFdmFsIiwhZXx8US5nZXQoZVtuXSwiZ2xvYmFsRXZhbCIpKX1tdC5vcHRncm91cD1tdC5vcHRpb24sbXQudGJvZHk9bXQudGZvb3Q9bXQuY29sZ3JvdXA9bXQuY2FwdGlvbj1tdC50aGVhZCxtdC50aD1tdC50ZDt2YXIgd3Qsa3QsU3Q9Lzx8JiM/XHcrOy87ZnVuY3Rpb24gRXQodCxlLG4scixvKXtmb3IodmFyIGksYSxzLHUsYyxsLGY9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxoPTAsZD10Lmxlbmd0aDtoPGQ7aCsrKWlmKChpPXRbaF0pfHwwPT09aSlpZigib2JqZWN0Ij09PWsoaSkpUy5tZXJnZShwLGkubm9kZVR5cGU/W2ldOmkpO2Vsc2UgaWYoU3QudGVzdChpKSl7Zm9yKGE9YXx8Zi5hcHBlbmRDaGlsZChlLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxzPSh2dC5leGVjKGkpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLHU9bXRbc118fG10Ll9kZWZhdWx0LGEuaW5uZXJIVE1MPXVbMV0rUy5odG1sUHJlZmlsdGVyKGkpK3VbMl0sbD11WzBdO2wtLTspYT1hLmxhc3RDaGlsZDtTLm1lcmdlKHAsYS5jaGlsZE5vZGVzKSwoYT1mLmZpcnN0Q2hpbGQpLnRleHRDb250ZW50PSIifWVsc2UgcC5wdXNoKGUuY3JlYXRlVGV4dE5vZGUoaSkpO2ZvcihmLnRleHRDb250ZW50PSIiLGg9MDtpPXBbaCsrXTspaWYociYmUy5pbkFycmF5KGkscik+LTEpbyYmby5wdXNoKGkpO2Vsc2UgaWYoYz1zdChpKSxhPWJ0KGYuYXBwZW5kQ2hpbGQoaSksInNjcmlwdCIpLGMmJnh0KGEpLG4pZm9yKGw9MDtpPWFbbCsrXTspeXQudGVzdChpLnR5cGV8fCIiKSYmbi5wdXNoKGkpO3JldHVybiBmfXd0PWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgiZGl2IikpLChrdD1hLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksa3Quc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGt0LnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSx3dC5hcHBlbmRDaGlsZChrdCkseS5jaGVja0Nsb25lPXd0LmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCx3dC5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLHkubm9DbG9uZUNoZWNrZWQ9ISF3dC5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7dmFyIFR0PS9ea2V5LyxqdD0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sQXQ9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIE90KCl7cmV0dXJuITB9ZnVuY3Rpb24gQ3QoKXtyZXR1cm4hMX1mdW5jdGlvbiBMdCh0LGUpe3JldHVybiB0PT09ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGEuYWN0aXZlRWxlbWVudH1jYXRjaCh0KXt9fSgpPT0oImZvY3VzIj09PWUpfWZ1bmN0aW9uIFJ0KHQsZSxuLHIsbyxpKXt2YXIgYSxzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKHMgaW4ic3RyaW5nIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApLGUpUnQodCxzLG4scixlW3NdLGkpO3JldHVybiB0fWlmKG51bGw9PXImJm51bGw9PW8/KG89bixyPW49dm9pZCAwKTpudWxsPT1vJiYoInN0cmluZyI9PXR5cGVvZiBuPyhvPXIscj12b2lkIDApOihvPXIscj1uLG49dm9pZCAwKSksITE9PT1vKW89Q3Q7ZWxzZSBpZighbylyZXR1cm4gdDtyZXR1cm4gMT09PWkmJihhPW8sKG89ZnVuY3Rpb24odCl7cmV0dXJuIFMoKS5vZmYodCksYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KS5ndWlkPWEuZ3VpZHx8KGEuZ3VpZD1TLmd1aWQrKykpLHQuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQuYWRkKHRoaXMsZSxvLHIsbil9KX1mdW5jdGlvbiBQdCh0LGUsbil7bj8oUS5zZXQodCxlLCExKSxTLmV2ZW50LmFkZCh0LGUse25hbWVzcGFjZTohMSxoYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciByLG8saT1RLmdldCh0aGlzLGUpO2lmKDEmdC5pc1RyaWdnZXImJnRoaXNbZV0pe2lmKGkubGVuZ3RoKShTLmV2ZW50LnNwZWNpYWxbZV18fHt9KS5kZWxlZ2F0ZVR5cGUmJnQuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihpPXUuY2FsbChhcmd1bWVudHMpLFEuc2V0KHRoaXMsZSxpKSxyPW4odGhpcyxlKSx0aGlzW2VdKCksaSE9PShvPVEuZ2V0KHRoaXMsZSkpfHxyP1Euc2V0KHRoaXMsZSwhMSk6bz17fSxpIT09bylyZXR1cm4gdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0LnByZXZlbnREZWZhdWx0KCksby52YWx1ZX1lbHNlIGkubGVuZ3RoJiYoUS5zZXQodGhpcyxlLHt2YWx1ZTpTLmV2ZW50LnRyaWdnZXIoUy5leHRlbmQoaVswXSxTLkV2ZW50LnByb3RvdHlwZSksaS5zbGljZSgxKSx0aGlzKX0pLHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfX0pKTp2b2lkIDA9PT1RLmdldCh0LGUpJiZTLmV2ZW50LmFkZCh0LGUsT3QpfVMuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaSxhLHMsdSxjLGwsZixwLGgsZCxnLHY9US5nZXQodCk7aWYodilmb3Iobi5oYW5kbGVyJiYobj0oaT1uKS5oYW5kbGVyLG89aS5zZWxlY3RvciksbyYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihhdCxvKSxuLmd1aWR8fChuLmd1aWQ9Uy5ndWlkKyspLCh1PXYuZXZlbnRzKXx8KHU9di5ldmVudHM9e30pLChhPXYuaGFuZGxlKXx8KGE9di5oYW5kbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PVMmJlMuZXZlbnQudHJpZ2dlcmVkIT09ZS50eXBlP1MuZXZlbnQuZGlzcGF0Y2guYXBwbHkodCxhcmd1bWVudHMpOnZvaWQgMH0pLGM9KGU9KGV8fCIiKS5tYXRjaChVKXx8WyIiXSkubGVuZ3RoO2MtLTspaD1nPShzPUF0LmV4ZWMoZVtjXSl8fFtdKVsxXSxkPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksaCYmKGY9Uy5ldmVudC5zcGVjaWFsW2hdfHx7fSxoPShvP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxoLGY9Uy5ldmVudC5zcGVjaWFsW2hdfHx7fSxsPVMuZXh0ZW5kKHt0eXBlOmgsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOm8sbmVlZHNDb250ZXh0Om8mJlMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChvKSxuYW1lc3BhY2U6ZC5qb2luKCIuIil9LGkpLChwPXVbaF0pfHwoKHA9dVtoXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKHQscixkLGEpfHx0LmFkZEV2ZW50TGlzdGVuZXImJnQuYWRkRXZlbnRMaXN0ZW5lcihoLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwodCxsKSxsLmhhbmRsZXIuZ3VpZHx8KGwuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLG8/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxsKTpwLnB1c2gobCksUy5ldmVudC5nbG9iYWxbaF09ITApfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaSxhLHMsdSxjLGwsZixwLGgsZCxnLHY9US5oYXNEYXRhKHQpJiZRLmdldCh0KTtpZih2JiYodT12LmV2ZW50cykpe2ZvcihjPShlPShlfHwiIikubWF0Y2goVSl8fFsiIl0pLmxlbmd0aDtjLS07KWlmKGg9Zz0ocz1BdC5leGVjKGVbY10pfHxbXSlbMV0sZD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGgpe2ZvcihmPVMuZXZlbnQuc3BlY2lhbFtoXXx8e30scD11W2g9KHI/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGhdfHxbXSxzPXNbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK2Quam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksYT1pPXAubGVuZ3RoO2ktLTspbD1wW2ldLCFvJiZnIT09bC5vcmlnVHlwZXx8biYmbi5ndWlkIT09bC5ndWlkfHxzJiYhcy50ZXN0KGwubmFtZXNwYWNlKXx8ciYmciE9PWwuc2VsZWN0b3ImJigiKioiIT09cnx8IWwuc2VsZWN0b3IpfHwocC5zcGxpY2UoaSwxKSxsLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbCh0LGwpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbCh0LGQsdi5oYW5kbGUpfHxTLnJlbW92ZUV2ZW50KHQsaCx2LmhhbmRsZSksZGVsZXRlIHVbaF0pfWVsc2UgZm9yKGggaW4gdSlTLmV2ZW50LnJlbW92ZSh0LGgrZVtjXSxuLHIsITApO1MuaXNFbXB0eU9iamVjdCh1KSYmUS5yZW1vdmUodCwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHM9Uy5ldmVudC5maXgodCksdT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksYz0oUS5nZXQodGhpcywiZXZlbnRzIil8fHt9KVtzLnR5cGVdfHxbXSxsPVMuZXZlbnQuc3BlY2lhbFtzLnR5cGVdfHx7fTtmb3IodVswXT1zLGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXVbZV09YXJndW1lbnRzW2VdO2lmKHMuZGVsZWdhdGVUYXJnZXQ9dGhpcywhbC5wcmVEaXNwYXRjaHx8ITEhPT1sLnByZURpc3BhdGNoLmNhbGwodGhpcyxzKSl7Zm9yKGE9Uy5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMscyxjKSxlPTA7KG89YVtlKytdKSYmIXMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZm9yKHMuY3VycmVudFRhcmdldD1vLmVsZW0sbj0wOyhpPW8uaGFuZGxlcnNbbisrXSkmJiFzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7KXMucm5hbWVzcGFjZSYmITEhPT1pLm5hbWVzcGFjZSYmIXMucm5hbWVzcGFjZS50ZXN0KGkubmFtZXNwYWNlKXx8KHMuaGFuZGxlT2JqPWkscy5kYXRhPWkuZGF0YSx2b2lkIDAhPT0ocj0oKFMuZXZlbnQuc3BlY2lhbFtpLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8aS5oYW5kbGVyKS5hcHBseShvLmVsZW0sdSkpJiYhMT09PShzLnJlc3VsdD1yKSYmKHMucHJldmVudERlZmF1bHQoKSxzLnN0b3BQcm9wYWdhdGlvbigpKSk7cmV0dXJuIGwucG9zdERpc3BhdGNoJiZsLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMscykscy5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbyxpLGEscz1bXSx1PWUuZGVsZWdhdGVDb3VudCxjPXQudGFyZ2V0O2lmKHUmJmMubm9kZVR5cGUmJiEoImNsaWNrIj09PXQudHlwZSYmdC5idXR0b24+PTEpKWZvcig7YyE9PXRoaXM7Yz1jLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWMubm9kZVR5cGUmJigiY2xpY2siIT09dC50eXBlfHwhMCE9PWMuZGlzYWJsZWQpKXtmb3IoaT1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbbz0ocj1lW25dKS5zZWxlY3RvcisiICJdJiYoYVtvXT1yLm5lZWRzQ29udGV4dD9TKG8sdGhpcykuaW5kZXgoYyk+LTE6Uy5maW5kKG8sdGhpcyxudWxsLFtjXSkubGVuZ3RoKSxhW29dJiZpLnB1c2gocik7aS5sZW5ndGgmJnMucHVzaCh7ZWxlbTpjLGhhbmRsZXJzOml9KX1yZXR1cm4gYz10aGlzLHU8ZS5sZW5ndGgmJnMucHVzaCh7ZWxlbTpjLGhhbmRsZXJzOmUuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFMuRXZlbnQucHJvdG90eXBlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDptKGUpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBlKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbdF19LHNldDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9fSl9LGZpeDpmdW5jdGlvbih0KXtyZXR1cm4gdFtTLmV4cGFuZG9dP3Q6bmV3IFMuRXZlbnQodCl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxjbGljazp7c2V0dXA6ZnVuY3Rpb24odCl7dmFyIGU9dGhpc3x8dDtyZXR1cm4gZ3QudGVzdChlLnR5cGUpJiZlLmNsaWNrJiZMKGUsImlucHV0IikmJlB0KGUsImNsaWNrIixPdCksITF9LHRyaWdnZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpc3x8dDtyZXR1cm4gZ3QudGVzdChlLnR5cGUpJiZlLmNsaWNrJiZMKGUsImlucHV0IikmJlB0KGUsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKHQpe3ZhciBlPXQudGFyZ2V0O3JldHVybiBndC50ZXN0KGUudHlwZSkmJmUuY2xpY2smJkwoZSwiaW5wdXQiKSYmUS5nZXQoZSwiY2xpY2siKXx8TChlLCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbih0KXt2b2lkIDAhPT10LnJlc3VsdCYmdC5vcmlnaW5hbEV2ZW50JiYodC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPXQucmVzdWx0KX19fX0sUy5yZW1vdmVFdmVudD1mdW5jdGlvbih0LGUsbil7dC5yZW1vdmVFdmVudExpc3RlbmVyJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxuKX0sUy5FdmVudD1mdW5jdGlvbih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFMuRXZlbnQpKXJldHVybiBuZXcgUy5FdmVudCh0LGUpO3QmJnQudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD10LmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PXQuZGVmYXVsdFByZXZlbnRlZCYmITE9PT10LnJldHVyblZhbHVlP090OkN0LHRoaXMudGFyZ2V0PXQudGFyZ2V0JiYzPT09dC50YXJnZXQubm9kZVR5cGU/dC50YXJnZXQucGFyZW50Tm9kZTp0LnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9dC5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD10LnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT10LGUmJlMuZXh0ZW5kKHRoaXMsZSksdGhpcy50aW1lU3RhbXA9dCYmdC50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1tTLmV4cGFuZG9dPSEwfSxTLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6Uy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6Q3QsaXNQcm9wYWdhdGlvblN0b3BwZWQ6Q3QsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6Q3QsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9T3QsdCYmIXRoaXMuaXNTaW11bGF0ZWQmJnQucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9T3QsdCYmIXRoaXMuaXNTaW11bGF0ZWQmJnQuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPU90LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxTLmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsY2hhcjohMCxjb2RlOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuYnV0dG9uO3JldHVybiBudWxsPT10LndoaWNoJiZUdC50ZXN0KHQudHlwZSk/bnVsbCE9dC5jaGFyQ29kZT90LmNoYXJDb2RlOnQua2V5Q29kZTohdC53aGljaCYmdm9pZCAwIT09ZSYmanQudGVzdCh0LnR5cGUpPzEmZT8xOjImZT8zOjQmZT8yOjA6dC53aGljaH19LFMuZXZlbnQuYWRkUHJvcCksUy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbih0LGUpe1MuZXZlbnQuc3BlY2lhbFt0XT17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gUHQodGhpcyx0LEx0KSwhMX0sdHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQpLCEwfSxkZWxlZ2F0ZVR5cGU6ZX19KSxTLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQiLHBvaW50ZXJlbnRlcjoicG9pbnRlcm92ZXIiLHBvaW50ZXJsZWF2ZToicG9pbnRlcm91dCJ9LGZ1bmN0aW9uKHQsZSl7Uy5ldmVudC5zcGVjaWFsW3RdPXtkZWxlZ2F0ZVR5cGU6ZSxiaW5kVHlwZTplLGhhbmRsZTpmdW5jdGlvbih0KXt2YXIgbixyPXRoaXMsbz10LnJlbGF0ZWRUYXJnZXQsaT10LmhhbmRsZU9iajtyZXR1cm4gbyYmKG89PT1yfHxTLmNvbnRhaW5zKHIsbykpfHwodC50eXBlPWkub3JpZ1R5cGUsbj1pLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQudHlwZT1lKSxufX19KSxTLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIFJ0KHRoaXMsdCxlLG4scil9LG9uZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gUnQodGhpcyx0LGUsbixyLDEpfSxvZmY6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG87aWYodCYmdC5wcmV2ZW50RGVmYXVsdCYmdC5oYW5kbGVPYmopcmV0dXJuIHI9dC5oYW5kbGVPYmosUyh0LmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIHQpe2ZvcihvIGluIHQpdGhpcy5vZmYobyxlLHRbb10pO3JldHVybiB0aGlzfXJldHVybiExIT09ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGV8fChuPWUsZT12b2lkIDApLCExPT09biYmKG49Q3QpLHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQucmVtb3ZlKHRoaXMsdCxuLGUpfSl9fSk7dmFyIE50PS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKVtePl0qKVwvPi9naSxJdD0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxEdD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxfdD0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7ZnVuY3Rpb24gTXQodCxlKXtyZXR1cm4gTCh0LCJ0YWJsZSIpJiZMKDExIT09ZS5ub2RlVHlwZT9lOmUuZmlyc3RDaGlsZCwidHIiKSYmUyh0KS5jaGlsZHJlbigidGJvZHkiKVswXXx8dH1mdW5jdGlvbiBVdCh0KXtyZXR1cm4gdC50eXBlPShudWxsIT09dC5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK3QudHlwZSx0fWZ1bmN0aW9uIEJ0KHQpe3JldHVybiJ0cnVlLyI9PT0odC50eXBlfHwiIikuc2xpY2UoMCw1KT90LnR5cGU9dC50eXBlLnNsaWNlKDUpOnQucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksdH1mdW5jdGlvbiBxdCh0LGUpe3ZhciBuLHIsbyxpLGEscyx1LGM7aWYoMT09PWUubm9kZVR5cGUpe2lmKFEuaGFzRGF0YSh0KSYmKGk9US5hY2Nlc3ModCksYT1RLnNldChlLGkpLGM9aS5ldmVudHMpKWZvcihvIGluIGRlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fSxjKWZvcihuPTAscj1jW29dLmxlbmd0aDtuPHI7bisrKVMuZXZlbnQuYWRkKGUsbyxjW29dW25dKTtaLmhhc0RhdGEodCkmJihzPVouYWNjZXNzKHQpLHU9Uy5leHRlbmQoe30scyksWi5zZXQoZSx1KSl9fWZ1bmN0aW9uIEZ0KHQsZSl7dmFyIG49ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZndC50ZXN0KHQudHlwZSk/ZS5jaGVja2VkPXQuY2hlY2tlZDoiaW5wdXQiIT09biYmInRleHRhcmVhIiE9PW58fChlLmRlZmF1bHRWYWx1ZT10LmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gSHQodCxlLG4scil7ZT1jLmFwcGx5KFtdLGUpO3ZhciBvLGksYSxzLHUsbCxmPTAscD10Lmxlbmd0aCxoPXAtMSxkPWVbMF0sZz1tKGQpO2lmKGd8fHA+MSYmInN0cmluZyI9PXR5cGVvZiBkJiYheS5jaGVja0Nsb25lJiZEdC50ZXN0KGQpKXJldHVybiB0LmVhY2goZnVuY3Rpb24obyl7dmFyIGk9dC5lcShvKTtnJiYoZVswXT1kLmNhbGwodGhpcyxvLGkuaHRtbCgpKSksSHQoaSxlLG4scil9KTtpZihwJiYoaT0obz1FdChlLHRbMF0ub3duZXJEb2N1bWVudCwhMSx0LHIpKS5maXJzdENoaWxkLDE9PT1vLmNoaWxkTm9kZXMubGVuZ3RoJiYobz1pKSxpfHxyKSl7Zm9yKHM9KGE9Uy5tYXAoYnQobywic2NyaXB0IiksVXQpKS5sZW5ndGg7ZjxwO2YrKyl1PW8sZiE9PWgmJih1PVMuY2xvbmUodSwhMCwhMCkscyYmUy5tZXJnZShhLGJ0KHUsInNjcmlwdCIpKSksbi5jYWxsKHRbZl0sdSxmKTtpZihzKWZvcihsPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxTLm1hcChhLEJ0KSxmPTA7ZjxzO2YrKyl1PWFbZl0seXQudGVzdCh1LnR5cGV8fCIiKSYmIVEuYWNjZXNzKHUsImdsb2JhbEV2YWwiKSYmUy5jb250YWlucyhsLHUpJiYodS5zcmMmJiJtb2R1bGUiIT09KHUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/Uy5fZXZhbFVybCYmIXUubm9Nb2R1bGUmJlMuX2V2YWxVcmwodS5zcmMse25vbmNlOnUubm9uY2V8fHUuZ2V0QXR0cmlidXRlKCJub25jZSIpfSk6dyh1LnRleHRDb250ZW50LnJlcGxhY2UoX3QsIiIpLHUsbCkpfXJldHVybiB0fWZ1bmN0aW9uIHp0KHQsZSxuKXtmb3IodmFyIHIsbz1lP1MuZmlsdGVyKGUsdCk6dCxpPTA7bnVsbCE9KHI9b1tpXSk7aSsrKW58fDEhPT1yLm5vZGVUeXBlfHxTLmNsZWFuRGF0YShidChyKSksci5wYXJlbnROb2RlJiYobiYmc3QocikmJnh0KGJ0KHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiB0fVMuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoTnQsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscz10LmNsb25lTm9kZSghMCksdT1zdCh0KTtpZighKHkubm9DbG9uZUNoZWNrZWR8fDEhPT10Lm5vZGVUeXBlJiYxMSE9PXQubm9kZVR5cGV8fFMuaXNYTUxEb2ModCkpKWZvcihhPWJ0KHMpLHI9MCxvPShpPWJ0KHQpKS5sZW5ndGg7cjxvO3IrKylGdChpW3JdLGFbcl0pO2lmKGUpaWYobilmb3IoaT1pfHxidCh0KSxhPWF8fGJ0KHMpLHI9MCxvPWkubGVuZ3RoO3I8bztyKyspcXQoaVtyXSxhW3JdKTtlbHNlIHF0KHQscyk7cmV0dXJuKGE9YnQocywic2NyaXB0IikpLmxlbmd0aD4wJiZ4dChhLCF1JiZidCh0LCJzY3JpcHQiKSksc30sY2xlYW5EYXRhOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuLHIsbz1TLmV2ZW50LnNwZWNpYWwsaT0wO3ZvaWQgMCE9PShuPXRbaV0pO2krKylpZihYKG4pKXtpZihlPW5bUS5leHBhbmRvXSl7aWYoZS5ldmVudHMpZm9yKHIgaW4gZS5ldmVudHMpb1tyXT9TLmV2ZW50LnJlbW92ZShuLHIpOlMucmVtb3ZlRXZlbnQobixyLGUuaGFuZGxlKTtuW1EuZXhwYW5kb109dm9pZCAwfW5bWi5leHBhbmRvXSYmKG5bWi5leHBhbmRvXT12b2lkIDApfX19KSxTLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKHQpe3JldHVybiB6dCh0aGlzLHQsITApfSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHp0KHRoaXMsdCl9LHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD9TLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9dCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fE10KHRoaXMsdCkuYXBwZW5kQ2hpbGQodCl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGU9TXQodGhpcyx0KTtlLmluc2VydEJlZm9yZSh0LGUuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCxlPTA7bnVsbCE9KHQ9dGhpc1tlXSk7ZSsrKTE9PT10Lm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEoYnQodCwhMSkpLHQudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbih0LGUpe3JldHVybiB0PW51bGwhPXQmJnQsZT1udWxsPT1lP3Q6ZSx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBTLmNsb25lKHRoaXMsdCxlKX0pfSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCl7dmFyIGU9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09dCYmMT09PWUubm9kZVR5cGUpcmV0dXJuIGUuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmIUl0LnRlc3QodCkmJiFtdFsodnQuZXhlYyh0KXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe3Q9Uy5odG1sUHJlZmlsdGVyKHQpO3RyeXtmb3IoO248cjtuKyspMT09PShlPXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKGJ0KGUsITEpKSxlLmlubmVySFRNTD10KTtlPTB9Y2F0Y2godCl7fX1lJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKHQpfSxudWxsLHQsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTtTLmluQXJyYXkodGhpcyx0KTwwJiYoUy5jbGVhbkRhdGEoYnQodGhpcykpLG4mJm4ucmVwbGFjZUNoaWxkKGUsdGhpcykpfSx0KX19KSxTLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbih0LGUpe1MuZm5bdF09ZnVuY3Rpb24odCl7Zm9yKHZhciBuLHI9W10sbz1TKHQpLGk9by5sZW5ndGgtMSxhPTA7YTw9aTthKyspbj1hPT09aT90aGlzOnRoaXMuY2xvbmUoITApLFMob1thXSlbZV0obiksbC5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KTt2YXIgV3Q9bmV3IFJlZ0V4cCgiXigiK3J0KyIpKD8hcHgpW2EteiVdKyQiLCJpIiksJHQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiBlJiZlLm9wZW5lcnx8KGU9biksZS5nZXRDb21wdXRlZFN0eWxlKHQpfSxZdD1uZXcgUmVnRXhwKGl0LmpvaW4oInwiKSwiaSIpO2Z1bmN0aW9uIFZ0KHQsZSxuKXt2YXIgcixvLGksYSxzPXQuc3R5bGU7cmV0dXJuKG49bnx8JHQodCkpJiYoIiIhPT0oYT1uLmdldFByb3BlcnR5VmFsdWUoZSl8fG5bZV0pfHxzdCh0KXx8KGE9Uy5zdHlsZSh0LGUpKSwheS5waXhlbEJveFN0eWxlcygpJiZXdC50ZXN0KGEpJiZZdC50ZXN0KGUpJiYocj1zLndpZHRoLG89cy5taW5XaWR0aCxpPXMubWF4V2lkdGgscy5taW5XaWR0aD1zLm1heFdpZHRoPXMud2lkdGg9YSxhPW4ud2lkdGgscy53aWR0aD1yLHMubWluV2lkdGg9byxzLm1heFdpZHRoPWkpKSx2b2lkIDAhPT1hP2ErIiI6YX1mdW5jdGlvbiBHdCh0LGUpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtpZighdCgpKXJldHVybih0aGlzLmdldD1lKS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZGVsZXRlIHRoaXMuZ2V0fX19IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2lmKGwpe2Muc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MCIsbC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo2MCU7dG9wOjElIixhdC5hcHBlbmRDaGlsZChjKS5hcHBlbmRDaGlsZChsKTt2YXIgdD1uLmdldENvbXB1dGVkU3R5bGUobCk7cj0iMSUiIT09dC50b3AsdT0xMj09PWUodC5tYXJnaW5MZWZ0KSxsLnN0eWxlLnJpZ2h0PSI2MCUiLHM9MzY9PT1lKHQucmlnaHQpLG89MzY9PT1lKHQud2lkdGgpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixpPTEyPT09ZShsLm9mZnNldFdpZHRoLzMpLGF0LnJlbW92ZUNoaWxkKGMpLGw9bnVsbH19ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHQpKX12YXIgcixvLGkscyx1LGM9YS5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPWEuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5zdHlsZSYmKGwuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixsLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIseS5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWwuc3R5bGUuYmFja2dyb3VuZENsaXAsUy5leHRlbmQoeSx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLG99LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxzfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxyfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHV9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGl9fSkpfSgpO3ZhciBLdD1bIldlYmtpdCIsIk1veiIsIm1zIl0sWHQ9YS5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSxKdD17fTtmdW5jdGlvbiBRdCh0KXt2YXIgZT1TLmNzc1Byb3BzW3RdfHxKdFt0XTtyZXR1cm4gZXx8KHQgaW4gWHQ/dDpKdFt0XT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSksbj1LdC5sZW5ndGg7bi0tOylpZigodD1LdFtuXStlKWluIFh0KXJldHVybiB0fSh0KXx8dCl9dmFyIFp0PS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyx0ZT0vXi0tLyxlZT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sbmU9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIHJlKHQsZSxuKXt2YXIgcj1vdC5leGVjKGUpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTplfWZ1bmN0aW9uIG9lKHQsZSxuLHIsbyxpKXt2YXIgYT0id2lkdGgiPT09ZT8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPVMuY3NzKHQsbitpdFthXSwhMCxvKSkscj8oImNvbnRlbnQiPT09biYmKHUtPVMuY3NzKHQsInBhZGRpbmciK2l0W2FdLCEwLG8pKSwibWFyZ2luIiE9PW4mJih1LT1TLmNzcyh0LCJib3JkZXIiK2l0W2FdKyJXaWR0aCIsITAsbykpKToodSs9Uy5jc3ModCwicGFkZGluZyIraXRbYV0sITAsbyksInBhZGRpbmciIT09bj91Kz1TLmNzcyh0LCJib3JkZXIiK2l0W2FdKyJXaWR0aCIsITAsbyk6cys9Uy5jc3ModCwiYm9yZGVyIitpdFthXSsiV2lkdGgiLCEwLG8pKTtyZXR1cm4hciYmaT49MCYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKHRbIm9mZnNldCIrZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSldLWktdS1zLS41KSl8fDApLHV9ZnVuY3Rpb24gaWUodCxlLG4pe3ZhciByPSR0KHQpLG89KCF5LmJveFNpemluZ1JlbGlhYmxlKCl8fG4pJiYiYm9yZGVyLWJveCI9PT1TLmNzcyh0LCJib3hTaXppbmciLCExLHIpLGk9byxhPVZ0KHQsZSxyKSxzPSJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpO2lmKFd0LnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZvfHwiYXV0byI9PT1hfHwhcGFyc2VGbG9hdChhKSYmImlubGluZSI9PT1TLmNzcyh0LCJkaXNwbGF5IiwhMSxyKSkmJnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJihvPSJib3JkZXItYm94Ij09PVMuY3NzKHQsImJveFNpemluZyIsITEsciksKGk9cyBpbiB0KSYmKGE9dFtzXSkpLChhPXBhcnNlRmxvYXQoYSl8fDApK29lKHQsZSxufHwobz8iYm9yZGVyIjoiY29udGVudCIpLGkscixhKSsicHgifWZ1bmN0aW9uIGFlKHQsZSxuLHIsbyl7cmV0dXJuIG5ldyBhZS5wcm90b3R5cGUuaW5pdCh0LGUsbixyLG8pfVMuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKHQsZSl7aWYoZSl7dmFyIG49VnQodCwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsZ3JpZEFyZWE6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TdGFydDohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1N0YXJ0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6e30sc3R5bGU6ZnVuY3Rpb24odCxlLG4scil7aWYodCYmMyE9PXQubm9kZVR5cGUmJjghPT10Lm5vZGVUeXBlJiZ0LnN0eWxlKXt2YXIgbyxpLGEscz1LKGUpLHU9dGUudGVzdChlKSxjPXQuc3R5bGU7aWYodXx8KGU9UXQocykpLGE9Uy5jc3NIb29rc1tlXXx8Uy5jc3NIb29rc1tzXSx2b2lkIDA9PT1uKXJldHVybiBhJiYiZ2V0ImluIGEmJnZvaWQgMCE9PShvPWEuZ2V0KHQsITEscikpP286Y1tlXTsic3RyaW5nIj09PShpPXR5cGVvZiBuKSYmKG89b3QuZXhlYyhuKSkmJm9bMV0mJihuPWZ0KHQsZSxvKSxpPSJudW1iZXIiKSxudWxsIT1uJiZuPT1uJiYoIm51bWJlciIhPT1pfHx1fHwobis9byYmb1szXXx8KFMuY3NzTnVtYmVyW3NdPyIiOiJweCIpKSx5LmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1ufHwwIT09ZS5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChjW2VdPSJpbmhlcml0IiksYSYmInNldCJpbiBhJiZ2b2lkIDA9PT0obj1hLnNldCh0LG4scikpfHwodT9jLnNldFByb3BlcnR5KGUsbik6Y1tlXT1uKSl9fSxjc3M6ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHM9SyhlKTtyZXR1cm4gdGUudGVzdChlKXx8KGU9UXQocykpLChhPVMuY3NzSG9va3NbZV18fFMuY3NzSG9va3Nbc10pJiYiZ2V0ImluIGEmJihvPWEuZ2V0KHQsITAsbikpLHZvaWQgMD09PW8mJihvPVZ0KHQsZSxyKSksIm5vcm1hbCI9PT1vJiZlIGluIG5lJiYobz1uZVtlXSksIiI9PT1ufHxuPyhpPXBhcnNlRmxvYXQobyksITA9PT1ufHxpc0Zpbml0ZShpKT9pfHwwOm8pOm99fSksUy5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbih0LGUpe1MuY3NzSG9va3NbZV09e2dldDpmdW5jdGlvbih0LG4scil7aWYobilyZXR1cm4hWnQudGVzdChTLmNzcyh0LCJkaXNwbGF5IikpfHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiZ0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoP2llKHQsZSxyKTpsdCh0LGVlLGZ1bmN0aW9uKCl7cmV0dXJuIGllKHQsZSxyKX0pfSxzZXQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBvLGk9JHQodCksYT0heS5zY3JvbGxib3hTaXplKCkmJiJhYnNvbHV0ZSI9PT1pLnBvc2l0aW9uLHM9KGF8fHIpJiYiYm9yZGVyLWJveCI9PT1TLmNzcyh0LCJib3hTaXppbmciLCExLGkpLHU9cj9vZSh0LGUscixzLGkpOjA7cmV0dXJuIHMmJmEmJih1LT1NYXRoLmNlaWwodFsib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKV0tcGFyc2VGbG9hdChpW2VdKS1vZSh0LGUsImJvcmRlciIsITEsaSktLjUpKSx1JiYobz1vdC5leGVjKG4pKSYmInB4IiE9PShvWzNdfHwicHgiKSYmKHQuc3R5bGVbZV09bixuPVMuY3NzKHQsZSkpLHJlKDAsbix1KX19fSksUy5jc3NIb29rcy5tYXJnaW5MZWZ0PUd0KHkucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKHQsZSl7aWYoZSlyZXR1cm4ocGFyc2VGbG9hdChWdCh0LCJtYXJnaW5MZWZ0IikpfHx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtbHQodCx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLFMuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKHQsZSl7Uy5jc3NIb29rc1t0K2VdPXtleHBhbmQ6ZnVuY3Rpb24obil7Zm9yKHZhciByPTAsbz17fSxpPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO3I8NDtyKyspb1t0K2l0W3JdK2VdPWlbcl18fGlbci0yXXx8aVswXTtyZXR1cm4gb319LCJtYXJnaW4iIT09dCYmKFMuY3NzSG9va3NbdCtlXS5zZXQ9cmUpfSksUy5mbi5leHRlbmQoe2NzczpmdW5jdGlvbih0LGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT17fSxhPTA7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHI9JHQodCksbz1lLmxlbmd0aDthPG87YSsrKWlbZVthXV09Uy5jc3ModCxlW2FdLCExLHIpO3JldHVybiBpfXJldHVybiB2b2lkIDAhPT1uP1Muc3R5bGUodCxlLG4pOlMuY3NzKHQsZSl9LHQsZSxhcmd1bWVudHMubGVuZ3RoPjEpfX0pLFMuVHdlZW49YWUsYWUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphZSxpbml0OmZ1bmN0aW9uKHQsZSxuLHIsbyxpKXt0aGlzLmVsZW09dCx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1vfHxTLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9ZSx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9aXx8KFMuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgdD1hZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdCYmdC5nZXQ/dC5nZXQodGhpcyk6YWUucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKHQpe3ZhciBlLG49YWUucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz1lPVMuZWFzaW5nW3RoaXMuZWFzaW5nXSh0LHRoaXMub3B0aW9ucy5kdXJhdGlvbip0LDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPWU9dCx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqZSt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTphZS5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxhZS5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9YWUucHJvdG90eXBlLGFlLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gMSE9PXQuZWxlbS5ub2RlVHlwZXx8bnVsbCE9dC5lbGVtW3QucHJvcF0mJm51bGw9PXQuZWxlbS5zdHlsZVt0LnByb3BdP3QuZWxlbVt0LnByb3BdOihlPVMuY3NzKHQuZWxlbSx0LnByb3AsIiIpKSYmImF1dG8iIT09ZT9lOjB9LHNldDpmdW5jdGlvbih0KXtTLmZ4LnN0ZXBbdC5wcm9wXT9TLmZ4LnN0ZXBbdC5wcm9wXSh0KToxIT09dC5lbGVtLm5vZGVUeXBlfHwhUy5jc3NIb29rc1t0LnByb3BdJiZudWxsPT10LmVsZW0uc3R5bGVbUXQodC5wcm9wKV0/dC5lbGVtW3QucHJvcF09dC5ub3c6Uy5zdHlsZSh0LmVsZW0sdC5wcm9wLHQubm93K3QudW5pdCl9fX0sYWUucHJvcEhvb2tzLnNjcm9sbFRvcD1hZS5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKHQpe3QuZWxlbS5ub2RlVHlwZSYmdC5lbGVtLnBhcmVudE5vZGUmJih0LmVsZW1bdC5wcm9wXT10Lm5vdyl9fSxTLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxzd2luZzpmdW5jdGlvbih0KXtyZXR1cm4uNS1NYXRoLmNvcyh0Kk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LFMuZng9YWUucHJvdG90eXBlLmluaXQsUy5meC5zdGVwPXt9O3ZhciBzZSx1ZSxjZT0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sbGU9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBmZSgpe3VlJiYoITE9PT1hLmhpZGRlbiYmbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/bi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZmUpOm4uc2V0VGltZW91dChmZSxTLmZ4LmludGVydmFsKSxTLmZ4LnRpY2soKSl9ZnVuY3Rpb24gcGUoKXtyZXR1cm4gbi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2U9dm9pZCAwfSksc2U9RGF0ZS5ub3coKX1mdW5jdGlvbiBoZSh0LGUpe3ZhciBuLHI9MCxvPXtoZWlnaHQ6dH07Zm9yKGU9ZT8xOjA7cjw0O3IrPTItZSlvWyJtYXJnaW4iKyhuPWl0W3JdKV09b1sicGFkZGluZyIrbl09dDtyZXR1cm4gZSYmKG8ub3BhY2l0eT1vLndpZHRoPXQpLG99ZnVuY3Rpb24gZGUodCxlLG4pe2Zvcih2YXIgcixvPShnZS50d2VlbmVyc1tlXXx8W10pLmNvbmNhdChnZS50d2VlbmVyc1siKiJdKSxpPTAsYT1vLmxlbmd0aDtpPGE7aSsrKWlmKHI9b1tpXS5jYWxsKG4sZSx0KSlyZXR1cm4gcn1mdW5jdGlvbiBnZSh0LGUsbil7dmFyIHIsbyxpPTAsYT1nZS5wcmVmaWx0ZXJzLmxlbmd0aCxzPVMuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKG8pcmV0dXJuITE7Zm9yKHZhciBlPXNlfHxwZSgpLG49TWF0aC5tYXgoMCxjLnN0YXJ0VGltZStjLmR1cmF0aW9uLWUpLHI9MS0obi9jLmR1cmF0aW9ufHwwKSxpPTAsYT1jLnR3ZWVucy5sZW5ndGg7aTxhO2krKyljLnR3ZWVuc1tpXS5ydW4ocik7cmV0dXJuIHMubm90aWZ5V2l0aCh0LFtjLHIsbl0pLHI8MSYmYT9uOihhfHxzLm5vdGlmeVdpdGgodCxbYywxLDBdKSxzLnJlc29sdmVXaXRoKHQsW2NdKSwhMSl9LGM9cy5wcm9taXNlKHtlbGVtOnQscHJvcHM6Uy5leHRlbmQoe30sZSksb3B0czpTLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6Uy5lYXNpbmcuX2RlZmF1bHR9LG4pLG9yaWdpbmFsUHJvcGVydGllczplLG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTpzZXx8cGUoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihlLG4pe3ZhciByPVMuVHdlZW4odCxjLm9wdHMsZSxuLGMub3B0cy5zcGVjaWFsRWFzaW5nW2VdfHxjLm9wdHMuZWFzaW5nKTtyZXR1cm4gYy50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKGUpe3ZhciBuPTAscj1lP2MudHdlZW5zLmxlbmd0aDowO2lmKG8pcmV0dXJuIHRoaXM7Zm9yKG89ITA7bjxyO24rKyljLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIGU/KHMubm90aWZ5V2l0aCh0LFtjLDEsMF0pLHMucmVzb2x2ZVdpdGgodCxbYyxlXSkpOnMucmVqZWN0V2l0aCh0LFtjLGVdKSx0aGlzfX0pLGw9Yy5wcm9wcztmb3IoIWZ1bmN0aW9uKHQsZSl7dmFyIG4scixvLGksYTtmb3IobiBpbiB0KWlmKG89ZVtyPUsobildLGk9dFtuXSxBcnJheS5pc0FycmF5KGkpJiYobz1pWzFdLGk9dFtuXT1pWzBdKSxuIT09ciYmKHRbcl09aSxkZWxldGUgdFtuXSksKGE9Uy5jc3NIb29rc1tyXSkmJiJleHBhbmQiaW4gYSlmb3IobiBpbiBpPWEuZXhwYW5kKGkpLGRlbGV0ZSB0W3JdLGkpbiBpbiB0fHwodFtuXT1pW25dLGVbbl09byk7ZWxzZSBlW3JdPW99KGwsYy5vcHRzLnNwZWNpYWxFYXNpbmcpO2k8YTtpKyspaWYocj1nZS5wcmVmaWx0ZXJzW2ldLmNhbGwoYyx0LGwsYy5vcHRzKSlyZXR1cm4gbShyLnN0b3ApJiYoUy5fcXVldWVIb29rcyhjLmVsZW0sYy5vcHRzLnF1ZXVlKS5zdG9wPXIuc3RvcC5iaW5kKHIpKSxyO3JldHVybiBTLm1hcChsLGRlLGMpLG0oYy5vcHRzLnN0YXJ0KSYmYy5vcHRzLnN0YXJ0LmNhbGwodCxjKSxjLnByb2dyZXNzKGMub3B0cy5wcm9ncmVzcykuZG9uZShjLm9wdHMuZG9uZSxjLm9wdHMuY29tcGxldGUpLmZhaWwoYy5vcHRzLmZhaWwpLmFsd2F5cyhjLm9wdHMuYWx3YXlzKSxTLmZ4LnRpbWVyKFMuZXh0ZW5kKHUse2VsZW06dCxhbmltOmMscXVldWU6Yy5vcHRzLnF1ZXVlfSkpLGN9Uy5BbmltYXRpb249Uy5leHRlbmQoZ2Use3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jcmVhdGVUd2Vlbih0LGUpO3JldHVybiBmdChuLmVsZW0sdCxvdC5leGVjKGUpLG4pLG59XX0sdHdlZW5lcjpmdW5jdGlvbih0LGUpe20odCk/KGU9dCx0PVsiKiJdKTp0PXQubWF0Y2goVSk7Zm9yKHZhciBuLHI9MCxvPXQubGVuZ3RoO3I8bztyKyspbj10W3JdLGdlLnR3ZWVuZXJzW25dPWdlLnR3ZWVuZXJzW25dfHxbXSxnZS50d2VlbmVyc1tuXS51bnNoaWZ0KGUpfSxwcmVmaWx0ZXJzOltmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscyx1LGMsbCxmPSJ3aWR0aCJpbiBlfHwiaGVpZ2h0ImluIGUscD10aGlzLGg9e30sZD10LnN0eWxlLGc9dC5ub2RlVHlwZSYmY3QodCksdj1RLmdldCh0LCJmeHNob3ciKTtmb3IociBpbiBuLnF1ZXVlfHwobnVsbD09KGE9Uy5fcXVldWVIb29rcyh0LCJmeCIpKS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe2EudW5xdWV1ZWQtLSxTLnF1ZXVlKHQsImZ4IikubGVuZ3RofHxhLmVtcHR5LmZpcmUoKX0pfSkpLGUpaWYobz1lW3JdLGNlLnRlc3Qobykpe2lmKGRlbGV0ZSBlW3JdLGk9aXx8InRvZ2dsZSI9PT1vLG89PT0oZz8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09b3x8IXZ8fHZvaWQgMD09PXZbcl0pY29udGludWU7Zz0hMH1oW3JdPXYmJnZbcl18fFMuc3R5bGUodCxyKX1pZigodT0hUy5pc0VtcHR5T2JqZWN0KGUpKXx8IVMuaXNFbXB0eU9iamVjdChoKSlmb3IociBpbiBmJiYxPT09dC5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2Qub3ZlcmZsb3csZC5vdmVyZmxvd1gsZC5vdmVyZmxvd1ldLG51bGw9PShjPXYmJnYuZGlzcGxheSkmJihjPVEuZ2V0KHQsImRpc3BsYXkiKSksIm5vbmUiPT09KGw9Uy5jc3ModCwiZGlzcGxheSIpKSYmKGM/bD1jOihkdChbdF0sITApLGM9dC5zdHlsZS5kaXNwbGF5fHxjLGw9Uy5jc3ModCwiZGlzcGxheSIpLGR0KFt0XSkpKSwoImlubGluZSI9PT1sfHwiaW5saW5lLWJsb2NrIj09PWwmJm51bGwhPWMpJiYibm9uZSI9PT1TLmNzcyh0LCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2QuZGlzcGxheT1jfSksbnVsbD09YyYmKGw9ZC5kaXNwbGF5LGM9Im5vbmUiPT09bD8iIjpsKSksZC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGQub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtkLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0sZC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxkLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITEsaCl1fHwodj8iaGlkZGVuImluIHYmJihnPXYuaGlkZGVuKTp2PVEuYWNjZXNzKHQsImZ4c2hvdyIse2Rpc3BsYXk6Y30pLGkmJih2LmhpZGRlbj0hZyksZyYmZHQoW3RdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtmb3IociBpbiBnfHxkdChbdF0pLFEucmVtb3ZlKHQsImZ4c2hvdyIpLGgpUy5zdHlsZSh0LHIsaFtyXSl9KSksdT1kZShnP3Zbcl06MCxyLHApLHIgaW4gdnx8KHZbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX1dLHByZWZpbHRlcjpmdW5jdGlvbih0LGUpe2U/Z2UucHJlZmlsdGVycy51bnNoaWZ0KHQpOmdlLnByZWZpbHRlcnMucHVzaCh0KX19KSxTLnNwZWVkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10JiYib2JqZWN0Ij09dHlwZW9mIHQ/Uy5leHRlbmQoe30sdCk6e2NvbXBsZXRlOm58fCFuJiZlfHxtKHQpJiZ0LGR1cmF0aW9uOnQsZWFzaW5nOm4mJmV8fGUmJiFtKGUpJiZlfTtyZXR1cm4gUy5meC5vZmY/ci5kdXJhdGlvbj0wOiJudW1iZXIiIT10eXBlb2Ygci5kdXJhdGlvbiYmKHIuZHVyYXRpb24gaW4gUy5meC5zcGVlZHM/ci5kdXJhdGlvbj1TLmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTpyLmR1cmF0aW9uPVMuZnguc3BlZWRzLl9kZWZhdWx0KSxudWxsIT1yLnF1ZXVlJiYhMCE9PXIucXVldWV8fChyLnF1ZXVlPSJmeCIpLHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe20oci5vbGQpJiZyLm9sZC5jYWxsKHRoaXMpLHIucXVldWUmJlMuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSxTLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0aGlzLmZpbHRlcihjdCkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTplfSx0LG4scil9LGFuaW1hdGU6ZnVuY3Rpb24odCxlLG4scil7dmFyIG89Uy5pc0VtcHR5T2JqZWN0KHQpLGk9Uy5zcGVlZChlLG4sciksYT1mdW5jdGlvbigpe3ZhciBlPWdlKHRoaXMsUy5leHRlbmQoe30sdCksaSk7KG98fFEuZ2V0KHRoaXMsImZpbmlzaCIpKSYmZS5zdG9wKCEwKX07cmV0dXJuIGEuZmluaXNoPWEsb3x8ITE9PT1pLnF1ZXVlP3RoaXMuZWFjaChhKTp0aGlzLnF1ZXVlKGkucXVldWUsYSl9LHN0b3A6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3RvcDtkZWxldGUgdC5zdG9wLGUobil9O3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKG49ZSxlPXQsdD12b2lkIDApLGUmJiExIT09dCYmdGhpcy5xdWV1ZSh0fHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT0hMCxvPW51bGwhPXQmJnQrInF1ZXVlSG9va3MiLGk9Uy50aW1lcnMsYT1RLmdldCh0aGlzKTtpZihvKWFbb10mJmFbb10uc3RvcCYmcihhW29dKTtlbHNlIGZvcihvIGluIGEpYVtvXSYmYVtvXS5zdG9wJiZsZS50ZXN0KG8pJiZyKGFbb10pO2ZvcihvPWkubGVuZ3RoO28tLTspaVtvXS5lbGVtIT09dGhpc3x8bnVsbCE9dCYmaVtvXS5xdWV1ZSE9PXR8fChpW29dLmFuaW0uc3RvcChuKSxlPSExLGkuc3BsaWNlKG8sMSkpOyFlJiZufHxTLmRlcXVldWUodGhpcyx0KX0pfSxmaW5pc2g6ZnVuY3Rpb24odCl7cmV0dXJuITEhPT10JiYodD10fHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSxuPVEuZ2V0KHRoaXMpLHI9blt0KyJxdWV1ZSJdLG89blt0KyJxdWV1ZUhvb2tzIl0saT1TLnRpbWVycyxhPXI/ci5sZW5ndGg6MDtmb3Iobi5maW5pc2g9ITAsUy5xdWV1ZSh0aGlzLHQsW10pLG8mJm8uc3RvcCYmby5zdG9wLmNhbGwodGhpcywhMCksZT1pLmxlbmd0aDtlLS07KWlbZV0uZWxlbT09PXRoaXMmJmlbZV0ucXVldWU9PT10JiYoaVtlXS5hbmltLnN0b3AoITApLGkuc3BsaWNlKGUsMSkpO2ZvcihlPTA7ZTxhO2UrKylyW2VdJiZyW2VdLmZpbmlzaCYmcltlXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgbi5maW5pc2h9KX19KSxTLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKHQsZSl7dmFyIG49Uy5mbltlXTtTLmZuW2VdPWZ1bmN0aW9uKHQscixvKXtyZXR1cm4gbnVsbD09dHx8ImJvb2xlYW4iPT10eXBlb2YgdD9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoaGUoZSwhMCksdCxyLG8pfX0pLFMuZWFjaCh7c2xpZGVEb3duOmhlKCJzaG93Iiksc2xpZGVVcDpoZSgiaGlkZSIpLHNsaWRlVG9nZ2xlOmhlKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKHQsZSl7Uy5mblt0XT1mdW5jdGlvbih0LG4scil7cmV0dXJuIHRoaXMuYW5pbWF0ZShlLHQsbixyKX19KSxTLnRpbWVycz1bXSxTLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgdCxlPTAsbj1TLnRpbWVycztmb3Ioc2U9RGF0ZS5ub3coKTtlPG4ubGVuZ3RoO2UrKykodD1uW2VdKSgpfHxuW2VdIT09dHx8bi5zcGxpY2UoZS0tLDEpO24ubGVuZ3RofHxTLmZ4LnN0b3AoKSxzZT12b2lkIDB9LFMuZngudGltZXI9ZnVuY3Rpb24odCl7Uy50aW1lcnMucHVzaCh0KSxTLmZ4LnN0YXJ0KCl9LFMuZnguaW50ZXJ2YWw9MTMsUy5meC5zdGFydD1mdW5jdGlvbigpe3VlfHwodWU9ITAsZmUoKSl9LFMuZnguc3RvcD1mdW5jdGlvbigpe3VlPW51bGx9LFMuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LFMuZm4uZGVsYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1TLmZ4JiZTLmZ4LnNwZWVkc1t0XXx8dCxlPWV8fCJmeCIsdGhpcy5xdWV1ZShlLGZ1bmN0aW9uKGUscil7dmFyIG89bi5zZXRUaW1lb3V0KGUsdCk7ci5zdG9wPWZ1bmN0aW9uKCl7bi5jbGVhclRpbWVvdXQobyl9fSl9LGZ1bmN0aW9uKCl7dmFyIHQ9YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGU9YS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTt0LnR5cGU9ImNoZWNrYm94Iix5LmNoZWNrT249IiIhPT10LnZhbHVlLHkub3B0U2VsZWN0ZWQ9ZS5zZWxlY3RlZCwodD1hLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnZhbHVlPSJ0Iix0LnR5cGU9InJhZGlvIix5LnJhZGlvVmFsdWU9InQiPT09dC52YWx1ZX0oKTt2YXIgdmUseWU9Uy5leHByLmF0dHJIYW5kbGU7Uy5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0aGlzLFMuYXR0cix0LGUsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5yZW1vdmVBdHRyKHRoaXMsdCl9KX19KSxTLmV4dGVuZCh7YXR0cjpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPXQubm9kZVR5cGU7aWYoMyE9PWkmJjghPT1pJiYyIT09aSlyZXR1cm4gdm9pZCAwPT09dC5nZXRBdHRyaWJ1dGU/Uy5wcm9wKHQsZSxuKTooMT09PWkmJlMuaXNYTUxEb2ModCl8fChvPVMuYXR0ckhvb2tzW2UudG9Mb3dlckNhc2UoKV18fChTLmV4cHIubWF0Y2guYm9vbC50ZXN0KGUpP3ZlOnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBTLnJlbW92ZUF0dHIodCxlKTpvJiYic2V0ImluIG8mJnZvaWQgMCE9PShyPW8uc2V0KHQsbixlKSk/cjoodC5zZXRBdHRyaWJ1dGUoZSxuKyIiKSxuKTpvJiYiZ2V0ImluIG8mJm51bGwhPT0ocj1vLmdldCh0LGUpKT9yOm51bGw9PShyPVMuZmluZC5hdHRyKHQsZSkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24odCxlKXtpZigheS5yYWRpb1ZhbHVlJiYicmFkaW8iPT09ZSYmTCh0LCJpbnB1dCIpKXt2YXIgbj10LnZhbHVlO3JldHVybiB0LnNldEF0dHJpYnV0ZSgidHlwZSIsZSksbiYmKHQudmFsdWU9biksZX19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MCxvPWUmJmUubWF0Y2goVSk7aWYobyYmMT09PXQubm9kZVR5cGUpZm9yKDtuPW9bcisrXTspdC5yZW1vdmVBdHRyaWJ1dGUobil9fSksdmU9e3NldDpmdW5jdGlvbih0LGUsbil7cmV0dXJuITE9PT1lP1MucmVtb3ZlQXR0cih0LG4pOnQuc2V0QXR0cmlidXRlKG4sbiksbn19LFMuZWFjaChTLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbih0LGUpe3ZhciBuPXllW2VdfHxTLmZpbmQuYXR0cjt5ZVtlXT1mdW5jdGlvbih0LGUscil7dmFyIG8saSxhPWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gcnx8KGk9eWVbYV0seWVbYV09byxvPW51bGwhPW4odCxlLHIpP2E6bnVsbCx5ZVthXT1pKSxvfX0pO3ZhciBtZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLGJlPS9eKD86YXxhcmVhKSQvaTtmdW5jdGlvbiB4ZSh0KXtyZXR1cm4odC5tYXRjaChVKXx8W10pLmpvaW4oIiAiKX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn1mdW5jdGlvbiBrZSh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90OiJzdHJpbmciPT10eXBlb2YgdCYmdC5tYXRjaChVKXx8W119Uy5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0aGlzLFMucHJvcCx0LGUsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbUy5wcm9wRml4W3RdfHx0XX0pfX0pLFMuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9dC5ub2RlVHlwZTtpZigzIT09aSYmOCE9PWkmJjIhPT1pKXJldHVybiAxPT09aSYmUy5pc1hNTERvYyh0KXx8KGU9Uy5wcm9wRml4W2VdfHxlLG89Uy5wcm9wSG9va3NbZV0pLHZvaWQgMCE9PW4/byYmInNldCJpbiBvJiZ2b2lkIDAhPT0ocj1vLnNldCh0LG4sZSkpP3I6dFtlXT1uOm8mJiJnZXQiaW4gbyYmbnVsbCE9PShyPW8uZ2V0KHQsZSkpP3I6dFtlXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlPVMuZmluZC5hdHRyKHQsInRhYmluZGV4Iik7cmV0dXJuIGU/cGFyc2VJbnQoZSwxMCk6bWUudGVzdCh0Lm5vZGVOYW1lKXx8YmUudGVzdCh0Lm5vZGVOYW1lKSYmdC5ocmVmPzA6LTF9fX0scHJvcEZpeDp7Zm9yOiJodG1sRm9yIixjbGFzczoiY2xhc3NOYW1lIn19KSx5Lm9wdFNlbGVjdGVkfHwoUy5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7cmV0dXJuIGUmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyZW50Tm9kZTtlJiYoZS5zZWxlY3RlZEluZGV4LGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLFMuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7Uy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLFMuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykuYWRkQ2xhc3ModC5jYWxsKHRoaXMsZSx3ZSh0aGlzKSkpfSk7aWYoKGU9a2UodCkpLmxlbmd0aClmb3IoO249dGhpc1t1KytdOylpZihvPXdlKG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit4ZShvKSsiICIpe2ZvcihhPTA7aT1lW2ErK107KXIuaW5kZXhPZigiICIraSsiICIpPDAmJihyKz1pKyIgIik7byE9PShzPXhlKHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnJlbW92ZUNsYXNzKHQuY2FsbCh0aGlzLGUsd2UodGhpcykpKX0pO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmF0dHIoImNsYXNzIiwiIik7aWYoKGU9a2UodCkpLmxlbmd0aClmb3IoO249dGhpc1t1KytdOylpZihvPXdlKG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit4ZShvKSsiICIpe2ZvcihhPTA7aT1lW2ErK107KWZvcig7ci5pbmRleE9mKCIgIitpKyIgIik+LTE7KXI9ci5yZXBsYWNlKCIgIitpKyIgIiwiICIpO28hPT0ocz14ZShyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dHlwZW9mIHQscj0ic3RyaW5nIj09PW58fEFycmF5LmlzQXJyYXkodCk7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZSYmcj9lP3RoaXMuYWRkQ2xhc3ModCk6dGhpcy5yZW1vdmVDbGFzcyh0KTptKHQpP3RoaXMuZWFjaChmdW5jdGlvbihuKXtTKHRoaXMpLnRvZ2dsZUNsYXNzKHQuY2FsbCh0aGlzLG4sd2UodGhpcyksZSksZSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSxvLGksYTtpZihyKWZvcihvPTAsaT1TKHRoaXMpLGE9a2UodCk7ZT1hW28rK107KWkuaGFzQ2xhc3MoZSk/aS5yZW1vdmVDbGFzcyhlKTppLmFkZENsYXNzKGUpO2Vsc2Ugdm9pZCAwIT09dCYmImJvb2xlYW4iIT09bnx8KChlPXdlKHRoaXMpKSYmUS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsZSksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsZXx8ITE9PT10PyIiOlEuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpKX0pfSxoYXNDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHI9MDtmb3IoZT0iICIrdCsiICI7bj10aGlzW3IrK107KWlmKDE9PT1uLm5vZGVUeXBlJiYoIiAiK3hlKHdlKG4pKSsiICIpLmluZGV4T2YoZSk+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIFNlPS9cci9nO1MuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG89dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1tKHQpLHRoaXMuZWFjaChmdW5jdGlvbihuKXt2YXIgbzsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PShvPXI/dC5jYWxsKHRoaXMsbixTKHRoaXMpLnZhbCgpKTp0KT9vPSIiOiJudW1iZXIiPT10eXBlb2Ygbz9vKz0iIjpBcnJheS5pc0FycmF5KG8pJiYobz1TLm1hcChvLGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOnQrIiJ9KSksKGU9Uy52YWxIb29rc1t0aGlzLnR5cGVdfHxTLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYic2V0ImluIGUmJnZvaWQgMCE9PWUuc2V0KHRoaXMsbywidmFsdWUiKXx8KHRoaXMudmFsdWU9bykpfSkpOm8/KGU9Uy52YWxIb29rc1tvLnR5cGVdfHxTLnZhbEhvb2tzW28ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYiZ2V0ImluIGUmJnZvaWQgMCE9PShuPWUuZ2V0KG8sInZhbHVlIikpP246InN0cmluZyI9PXR5cGVvZihuPW8udmFsdWUpP24ucmVwbGFjZShTZSwiIik6bnVsbD09bj8iIjpuOnZvaWQgMH19KSxTLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlPVMuZmluZC5hdHRyKHQsInZhbHVlIik7cmV0dXJuIG51bGwhPWU/ZTp4ZShTLnRleHQodCkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG89dC5vcHRpb25zLGk9dC5zZWxlY3RlZEluZGV4LGE9InNlbGVjdC1vbmUiPT09dC50eXBlLHM9YT9udWxsOltdLHU9YT9pKzE6by5sZW5ndGg7Zm9yKHI9aTwwP3U6YT9pOjA7cjx1O3IrKylpZigoKG49b1tyXSkuc2VsZWN0ZWR8fHI9PT1pKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhTChuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZihlPVMobikudmFsKCksYSlyZXR1cm4gZTtzLnB1c2goZSl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyLG89dC5vcHRpb25zLGk9Uy5tYWtlQXJyYXkoZSksYT1vLmxlbmd0aDthLS07KSgocj1vW2FdKS5zZWxlY3RlZD1TLmluQXJyYXkoUy52YWxIb29rcy5vcHRpb24uZ2V0KHIpLGkpPi0xKSYmKG49ITApO3JldHVybiBufHwodC5zZWxlY3RlZEluZGV4PS0xKSxpfX19fSksUy5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Uy52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdC5jaGVja2VkPVMuaW5BcnJheShTKHQpLnZhbCgpLGUpPi0xfX0seS5jaGVja09ufHwoUy52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10LmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOnQudmFsdWV9KX0pLHkuZm9jdXNpbj0ib25mb2N1c2luImluIG47dmFyIEVlPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxUZT1mdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpfTtTLmV4dGVuZChTLmV2ZW50LHt0cmlnZ2VyOmZ1bmN0aW9uKHQsZSxyLG8pe3ZhciBpLHMsdSxjLGwsZixwLGgsZz1bcnx8YV0sdj1kLmNhbGwodCwidHlwZSIpP3QudHlwZTp0LHk9ZC5jYWxsKHQsIm5hbWVzcGFjZSIpP3QubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYocz1oPXU9cj1yfHxhLDMhPT1yLm5vZGVUeXBlJiY4IT09ci5ub2RlVHlwZSYmIUVlLnRlc3QoditTLmV2ZW50LnRyaWdnZXJlZCkmJih2LmluZGV4T2YoIi4iKT4tMSYmKHk9di5zcGxpdCgiLiIpLHY9eS5zaGlmdCgpLHkuc29ydCgpKSxsPXYuaW5kZXhPZigiOiIpPDAmJiJvbiIrdiwodD10W1MuZXhwYW5kb10/dDpuZXcgUy5FdmVudCh2LCJvYmplY3QiPT10eXBlb2YgdCYmdCkpLmlzVHJpZ2dlcj1vPzI6Myx0Lm5hbWVzcGFjZT15LmpvaW4oIi4iKSx0LnJuYW1lc3BhY2U9dC5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIreS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLHQucmVzdWx0PXZvaWQgMCx0LnRhcmdldHx8KHQudGFyZ2V0PXIpLGU9bnVsbD09ZT9bdF06Uy5tYWtlQXJyYXkoZSxbdF0pLHA9Uy5ldmVudC5zcGVjaWFsW3ZdfHx7fSxvfHwhcC50cmlnZ2VyfHwhMSE9PXAudHJpZ2dlci5hcHBseShyLGUpKSl7aWYoIW8mJiFwLm5vQnViYmxlJiYhYihyKSl7Zm9yKGM9cC5kZWxlZ2F0ZVR5cGV8fHYsRWUudGVzdChjK3YpfHwocz1zLnBhcmVudE5vZGUpO3M7cz1zLnBhcmVudE5vZGUpZy5wdXNoKHMpLHU9czt1PT09KHIub3duZXJEb2N1bWVudHx8YSkmJmcucHVzaCh1LmRlZmF1bHRWaWV3fHx1LnBhcmVudFdpbmRvd3x8bil9Zm9yKGk9MDsocz1nW2krK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOyloPXMsdC50eXBlPWk+MT9jOnAuYmluZFR5cGV8fHYsKGY9KFEuZ2V0KHMsImV2ZW50cyIpfHx7fSlbdC50eXBlXSYmUS5nZXQocywiaGFuZGxlIikpJiZmLmFwcGx5KHMsZSksKGY9bCYmc1tsXSkmJmYuYXBwbHkmJlgocykmJih0LnJlc3VsdD1mLmFwcGx5KHMsZSksITE9PT10LnJlc3VsdCYmdC5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gdC50eXBlPXYsb3x8dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8cC5fZGVmYXVsdCYmITEhPT1wLl9kZWZhdWx0LmFwcGx5KGcucG9wKCksZSl8fCFYKHIpfHxsJiZtKHJbdl0pJiYhYihyKSYmKCh1PXJbbF0pJiYocltsXT1udWxsKSxTLmV2ZW50LnRyaWdnZXJlZD12LHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5hZGRFdmVudExpc3RlbmVyKHYsVGUpLHJbdl0oKSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmgucmVtb3ZlRXZlbnRMaXN0ZW5lcih2LFRlKSxTLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsdSYmKHJbbF09dSkpLHQucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPVMuZXh0ZW5kKG5ldyBTLkV2ZW50LG4se3R5cGU6dCxpc1NpbXVsYXRlZDohMH0pO1MuZXZlbnQudHJpZ2dlcihyLG51bGwsZSl9fSksUy5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC50cmlnZ2VyKHQsZSx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gUy5ldmVudC50cmlnZ2VyKHQsZSxuLCEwKX19KSx5LmZvY3VzaW58fFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24odCxlKXt2YXIgbj1mdW5jdGlvbih0KXtTLmV2ZW50LnNpbXVsYXRlKGUsdC50YXJnZXQsUy5ldmVudC5maXgodCkpfTtTLmV2ZW50LnNwZWNpYWxbZV09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLG89US5hY2Nlc3MocixlKTtvfHxyLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKSxRLmFjY2VzcyhyLGUsKG98fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxvPVEuYWNjZXNzKHIsZSktMTtvP1EuYWNjZXNzKHIsZSxvKTooci5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMCksUS5yZW1vdmUocixlKSl9fX0pO3ZhciBqZT1uLmxvY2F0aW9uLEFlPURhdGUubm93KCksT2U9L1w/LztTLnBhcnNlWE1MPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dHJ5e2U9KG5ldyBuLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQveG1sIil9Y2F0Y2godCl7ZT12b2lkIDB9cmV0dXJuIGUmJiFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8Uy5lcnJvcigiSW52YWxpZCBYTUw6ICIrdCksZX07dmFyIENlPS9cW1xdJC8sTGU9L1xyP1xuL2csUmU9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFBlPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBOZSh0LGUsbixyKXt2YXIgbztpZihBcnJheS5pc0FycmF5KGUpKVMuZWFjaChlLGZ1bmN0aW9uKGUsbyl7bnx8Q2UudGVzdCh0KT9yKHQsbyk6TmUodCsiWyIrKCJvYmplY3QiPT10eXBlb2YgbyYmbnVsbCE9bz9lOiIiKSsiXSIsbyxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PWsoZSkpcih0LGUpO2Vsc2UgZm9yKG8gaW4gZSlOZSh0KyJbIitvKyJdIixlW29dLG4scil9Uy5wYXJhbT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9W10sbz1mdW5jdGlvbih0LGUpe3ZhciBuPW0oZSk/ZSgpOmU7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KHQpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYobnVsbD09dClyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KHQpfHx0LmpxdWVyeSYmIVMuaXNQbGFpbk9iamVjdCh0KSlTLmVhY2godCxmdW5jdGlvbigpe28odGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiB0KU5lKG4sdFtuXSxlLG8pO3JldHVybiByLmpvaW4oIiYiKX0sUy5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBTLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9Uy5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIHQ/Uy5tYWtlQXJyYXkodCk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciB0PXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhUyh0aGlzKS5pcygiOmRpc2FibGVkIikmJlBlLnRlc3QodGhpcy5ub2RlTmFtZSkmJiFSZS50ZXN0KHQpJiYodGhpcy5jaGVja2VkfHwhZ3QudGVzdCh0KSl9KS5tYXAoZnVuY3Rpb24odCxlKXt2YXIgbj1TKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9TLm1hcChuLGZ1bmN0aW9uKHQpe3JldHVybntuYW1lOmUubmFtZSx2YWx1ZTp0LnJlcGxhY2UoTGUsIlxyXG4iKX19KTp7bmFtZTplLm5hbWUsdmFsdWU6bi5yZXBsYWNlKExlLCJcclxuIil9fSkuZ2V0KCl9fSk7dmFyIEllPS8lMjAvZyxEZT0vIy4qJC8sX2U9LyhbPyZdKV89W14mXSovLE1lPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20sVWU9L14oPzpHRVR8SEVBRCkkLyxCZT0vXlwvXC8vLHFlPXt9LEZlPXt9LEhlPSIqLyIuY29uY2F0KCIqIiksemU9YS5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gV2UodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7InN0cmluZyIhPXR5cGVvZiBlJiYobj1lLGU9IioiKTt2YXIgcixvPTAsaT1lLnRvTG93ZXJDYXNlKCkubWF0Y2goVSl8fFtdO2lmKG0obikpZm9yKDtyPWlbbysrXTspIisiPT09clswXT8ocj1yLnNsaWNlKDEpfHwiKiIsKHRbcl09dFtyXXx8W10pLnVuc2hpZnQobikpOih0W3JdPXRbcl18fFtdKS5wdXNoKG4pfX1mdW5jdGlvbiAkZSh0LGUsbixyKXt2YXIgbz17fSxpPXQ9PT1GZTtmdW5jdGlvbiBhKHMpe3ZhciB1O3JldHVybiBvW3NdPSEwLFMuZWFjaCh0W3NdfHxbXSxmdW5jdGlvbih0LHMpe3ZhciBjPXMoZSxuLHIpO3JldHVybiJzdHJpbmciIT10eXBlb2YgY3x8aXx8b1tjXT9pPyEodT1jKTp2b2lkIDA6KGUuZGF0YVR5cGVzLnVuc2hpZnQoYyksYShjKSwhMSl9KSx1fXJldHVybiBhKGUuZGF0YVR5cGVzWzBdKXx8IW9bIioiXSYmYSgiKiIpfWZ1bmN0aW9uIFllKHQsZSl7dmFyIG4scixvPVMuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiBlKXZvaWQgMCE9PWVbbl0mJigob1tuXT90OnJ8fChyPXt9KSlbbl09ZVtuXSk7cmV0dXJuIHImJlMuZXh0ZW5kKCEwLHQsciksdH16ZS5ocmVmPWplLmhyZWYsUy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOmplLmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOi9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLnRlc3QoamUucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SGUsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOlMucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbih0LGUpe3JldHVybiBlP1llKFllKHQsUy5hamF4U2V0dGluZ3MpLGUpOlllKFMuYWpheFNldHRpbmdzLHQpfSxhamF4UHJlZmlsdGVyOldlKHFlKSxhamF4VHJhbnNwb3J0OldlKEZlKSxhamF4OmZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSxlPWV8fHt9O3ZhciByLG8saSxzLHUsYyxsLGYscCxoLGQ9Uy5hamF4U2V0dXAoe30sZSksZz1kLmNvbnRleHR8fGQsdj1kLmNvbnRleHQmJihnLm5vZGVUeXBlfHxnLmpxdWVyeSk/UyhnKTpTLmV2ZW50LHk9Uy5EZWZlcnJlZCgpLG09Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYj1kLnN0YXR1c0NvZGV8fHt9LHg9e30sdz17fSxrPSJjYW5jZWxlZCIsRT17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKGwpe2lmKCFzKWZvcihzPXt9O2U9TWUuZXhlYyhpKTspc1tlWzFdLnRvTG93ZXJDYXNlKCkrIiAiXT0oc1tlWzFdLnRvTG93ZXJDYXNlKCkrIiAiXXx8W10pLmNvbmNhdChlWzJdKTtlPXNbdC50b0xvd2VyQ2FzZSgpKyIgIl19cmV0dXJuIG51bGw9PWU/bnVsbDplLmpvaW4oIiwgIil9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBsP2k6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1sJiYodD13W3QudG9Mb3dlckNhc2UoKV09d1t0LnRvTG93ZXJDYXNlKCldfHx0LHhbdF09ZSksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09bCYmKGQubWltZVR5cGU9dCksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbih0KXt2YXIgZTtpZih0KWlmKGwpRS5hbHdheXModFtFLnN0YXR1c10pO2Vsc2UgZm9yKGUgaW4gdCliW2VdPVtiW2VdLHRbZV1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbih0KXt2YXIgZT10fHxrO3JldHVybiByJiZyLmFib3J0KGUpLFQoMCxlKSx0aGlzfX07aWYoeS5wcm9taXNlKEUpLGQudXJsPSgodHx8ZC51cmx8fGplLmhyZWYpKyIiKS5yZXBsYWNlKEJlLGplLnByb3RvY29sKyIvLyIpLGQudHlwZT1lLm1ldGhvZHx8ZS50eXBlfHxkLm1ldGhvZHx8ZC50eXBlLGQuZGF0YVR5cGVzPShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goVSl8fFsiIl0sbnVsbD09ZC5jcm9zc0RvbWFpbil7Yz1hLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7Yy5ocmVmPWQudXJsLGMuaHJlZj1jLmhyZWYsZC5jcm9zc0RvbWFpbj16ZS5wcm90b2NvbCsiLy8iK3plLmhvc3QhPWMucHJvdG9jb2wrIi8vIitjLmhvc3R9Y2F0Y2godCl7ZC5jcm9zc0RvbWFpbj0hMH19aWYoZC5kYXRhJiZkLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGQuZGF0YSYmKGQuZGF0YT1TLnBhcmFtKGQuZGF0YSxkLnRyYWRpdGlvbmFsKSksJGUocWUsZCxlLEUpLGwpcmV0dXJuIEU7Zm9yKHAgaW4oZj1TLmV2ZW50JiZkLmdsb2JhbCkmJjA9PVMuYWN0aXZlKysmJlMuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0IiksZC50eXBlPWQudHlwZS50b1VwcGVyQ2FzZSgpLGQuaGFzQ29udGVudD0hVWUudGVzdChkLnR5cGUpLG89ZC51cmwucmVwbGFjZShEZSwiIiksZC5oYXNDb250ZW50P2QuZGF0YSYmZC5wcm9jZXNzRGF0YSYmMD09PShkLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJihkLmRhdGE9ZC5kYXRhLnJlcGxhY2UoSWUsIisiKSk6KGg9ZC51cmwuc2xpY2Uoby5sZW5ndGgpLGQuZGF0YSYmKGQucHJvY2Vzc0RhdGF8fCJzdHJpbmciPT10eXBlb2YgZC5kYXRhKSYmKG8rPShPZS50ZXN0KG8pPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSwhMT09PWQuY2FjaGUmJihvPW8ucmVwbGFjZShfZSwiJDEiKSxoPShPZS50ZXN0KG8pPyImIjoiPyIpKyJfPSIrQWUrKytoKSxkLnVybD1vK2gpLGQuaWZNb2RpZmllZCYmKFMubGFzdE1vZGlmaWVkW29dJiZFLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixTLmxhc3RNb2RpZmllZFtvXSksUy5ldGFnW29dJiZFLnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLFMuZXRhZ1tvXSkpLChkLmRhdGEmJmQuaGFzQ29udGVudCYmITEhPT1kLmNvbnRlbnRUeXBlfHxlLmNvbnRlbnRUeXBlKSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGQuY29udGVudFR5cGUpLEUuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixkLmRhdGFUeXBlc1swXSYmZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXT9kLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dKygiKiIhPT1kLmRhdGFUeXBlc1swXT8iLCAiK0hlKyI7IHE9MC4wMSI6IiIpOmQuYWNjZXB0c1siKiJdKSxkLmhlYWRlcnMpRS5zZXRSZXF1ZXN0SGVhZGVyKHAsZC5oZWFkZXJzW3BdKTtpZihkLmJlZm9yZVNlbmQmJighMT09PWQuYmVmb3JlU2VuZC5jYWxsKGcsRSxkKXx8bCkpcmV0dXJuIEUuYWJvcnQoKTtpZihrPSJhYm9ydCIsbS5hZGQoZC5jb21wbGV0ZSksRS5kb25lKGQuc3VjY2VzcyksRS5mYWlsKGQuZXJyb3IpLHI9JGUoRmUsZCxlLEUpKXtpZihFLnJlYWR5U3RhdGU9MSxmJiZ2LnRyaWdnZXIoImFqYXhTZW5kIixbRSxkXSksbClyZXR1cm4gRTtkLmFzeW5jJiZkLnRpbWVvdXQ+MCYmKHU9bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7RS5hYm9ydCgidGltZW91dCIpfSxkLnRpbWVvdXQpKTt0cnl7bD0hMSxyLnNlbmQoeCxUKX1jYXRjaCh0KXtpZihsKXRocm93IHQ7VCgtMSx0KX19ZWxzZSBUKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBUKHQsZSxhLHMpe3ZhciBjLHAsaCx4LHcsaz1lO2x8fChsPSEwLHUmJm4uY2xlYXJUaW1lb3V0KHUpLHI9dm9pZCAwLGk9c3x8IiIsRS5yZWFkeVN0YXRlPXQ+MD80OjAsYz10Pj0yMDAmJnQ8MzAwfHwzMDQ9PT10LGEmJih4PWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsbyxpLGEscz10LmNvbnRlbnRzLHU9dC5kYXRhVHlwZXM7IioiPT09dVswXTspdS5zaGlmdCgpLHZvaWQgMD09PXImJihyPXQubWltZVR5cGV8fGUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihvIGluIHMpaWYoc1tvXSYmc1tvXS50ZXN0KHIpKXt1LnVuc2hpZnQobyk7YnJlYWt9aWYodVswXWluIG4paT11WzBdO2Vsc2V7Zm9yKG8gaW4gbil7aWYoIXVbMF18fHQuY29udmVydGVyc1tvKyIgIit1WzBdXSl7aT1vO2JyZWFrfWF8fChhPW8pfWk9aXx8YX1pZihpKXJldHVybiBpIT09dVswXSYmdS51bnNoaWZ0KGkpLG5baV19KGQsRSxhKSkseD1mdW5jdGlvbih0LGUsbixyKXt2YXIgbyxpLGEscyx1LGM9e30sbD10LmRhdGFUeXBlcy5zbGljZSgpO2lmKGxbMV0pZm9yKGEgaW4gdC5jb252ZXJ0ZXJzKWNbYS50b0xvd2VyQ2FzZSgpXT10LmNvbnZlcnRlcnNbYV07Zm9yKGk9bC5zaGlmdCgpO2k7KWlmKHQucmVzcG9uc2VGaWVsZHNbaV0mJihuW3QucmVzcG9uc2VGaWVsZHNbaV1dPWUpLCF1JiZyJiZ0LmRhdGFGaWx0ZXImJihlPXQuZGF0YUZpbHRlcihlLHQuZGF0YVR5cGUpKSx1PWksaT1sLnNoaWZ0KCkpaWYoIioiPT09aSlpPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09aSl7aWYoIShhPWNbdSsiICIraV18fGNbIiogIitpXSkpZm9yKG8gaW4gYylpZigocz1vLnNwbGl0KCIgIikpWzFdPT09aSYmKGE9Y1t1KyIgIitzWzBdXXx8Y1siKiAiK3NbMF1dKSl7ITA9PT1hP2E9Y1tvXTohMCE9PWNbb10mJihpPXNbMF0sbC51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmdC50aHJvd3MpZT1hKGUpO2Vsc2UgdHJ5e2U9YShlKX1jYXRjaCh0KXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP3Q6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK2l9fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6ZX19KGQseCxFLGMpLGM/KGQuaWZNb2RpZmllZCYmKCh3PUUuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSkmJihTLmxhc3RNb2RpZmllZFtvXT13KSwodz1FLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIikpJiYoUy5ldGFnW29dPXcpKSwyMDQ9PT10fHwiSEVBRCI9PT1kLnR5cGU/az0ibm9jb250ZW50IjozMDQ9PT10P2s9Im5vdG1vZGlmaWVkIjooaz14LnN0YXRlLHA9eC5kYXRhLGM9IShoPXguZXJyb3IpKSk6KGg9aywhdCYma3x8KGs9ImVycm9yIix0PDAmJih0PTApKSksRS5zdGF0dXM9dCxFLnN0YXR1c1RleHQ9KGV8fGspKyIiLGM/eS5yZXNvbHZlV2l0aChnLFtwLGssRV0pOnkucmVqZWN0V2l0aChnLFtFLGssaF0pLEUuc3RhdHVzQ29kZShiKSxiPXZvaWQgMCxmJiZ2LnRyaWdnZXIoYz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFtFLGQsYz9wOmhdKSxtLmZpcmVXaXRoKGcsW0Usa10pLGYmJih2LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW0UsZF0pLC0tUy5hY3RpdmV8fFMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiBFfSxnZXRKU09OOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUy5nZXQodCxlLG4sImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFMuZ2V0KHQsdm9pZCAwLGUsInNjcmlwdCIpfX0pLFMuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbih0LGUpe1NbZV09ZnVuY3Rpb24odCxuLHIsbyl7cmV0dXJuIG0obikmJihvPW98fHIscj1uLG49dm9pZCAwKSxTLmFqYXgoUy5leHRlbmQoe3VybDp0LHR5cGU6ZSxkYXRhVHlwZTpvLGRhdGE6bixzdWNjZXNzOnJ9LFMuaXNQbGFpbk9iamVjdCh0KSYmdCkpfX0pLFMuX2V2YWxVcmw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gUy5hamF4KHt1cmw6dCx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKCl7fX0sZGF0YUZpbHRlcjpmdW5jdGlvbih0KXtTLmdsb2JhbEV2YWwodCxlKX19KX0sUy5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHRoaXNbMF0mJihtKHQpJiYodD10LmNhbGwodGhpc1swXSkpLGU9Uyh0LHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmZS5pbnNlcnRCZWZvcmUodGhpc1swXSksZS5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpczt0LmZpcnN0RWxlbWVudENoaWxkOyl0PXQuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIHR9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbih0KXtyZXR1cm4gbSh0KT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS53cmFwSW5uZXIodC5jYWxsKHRoaXMsZSkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uyh0aGlzKSxuPWUuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwodCk6ZS5hcHBlbmQodCl9KX0sd3JhcDpmdW5jdGlvbih0KXt2YXIgZT1tKHQpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7Uyh0aGlzKS53cmFwQWxsKGU/dC5jYWxsKHRoaXMsbik6dCl9KX0sdW53cmFwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBhcmVudCh0KS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Uyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxTLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24odCl7cmV0dXJuIVMuZXhwci5wc2V1ZG9zLnZpc2libGUodCl9LFMuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24odCl7cmV0dXJuISEodC5vZmZzZXRXaWR0aHx8dC5vZmZzZXRIZWlnaHR8fHQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxTLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBuLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKHQpe319O3ZhciBWZT17MDoyMDAsMTIyMzoyMDR9LEdlPVMuYWpheFNldHRpbmdzLnhocigpO3kuY29ycz0hIUdlJiYid2l0aENyZWRlbnRpYWxzImluIEdlLHkuYWpheD1HZT0hIUdlLFMuYWpheFRyYW5zcG9ydChmdW5jdGlvbih0KXt2YXIgZSxyO2lmKHkuY29yc3x8R2UmJiF0LmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKG8saSl7dmFyIGEscz10LnhocigpO2lmKHMub3Blbih0LnR5cGUsdC51cmwsdC5hc3luYyx0LnVzZXJuYW1lLHQucGFzc3dvcmQpLHQueGhyRmllbGRzKWZvcihhIGluIHQueGhyRmllbGRzKXNbYV09dC54aHJGaWVsZHNbYV07Zm9yKGEgaW4gdC5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUodC5taW1lVHlwZSksdC5jcm9zc0RvbWFpbnx8b1siWC1SZXF1ZXN0ZWQtV2l0aCJdfHwob1siWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpLG8pcy5zZXRSZXF1ZXN0SGVhZGVyKGEsb1thXSk7ZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtlJiYoZT1yPXMub25sb2FkPXMub25lcnJvcj1zLm9uYWJvcnQ9cy5vbnRpbWVvdXQ9cy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09dD9zLmFib3J0KCk6ImVycm9yIj09PXQ/Im51bWJlciIhPXR5cGVvZiBzLnN0YXR1cz9pKDAsImVycm9yIik6aShzLnN0YXR1cyxzLnN0YXR1c1RleHQpOmkoVmVbcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInRleHQiIT09KHMucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHMucmVzcG9uc2VUZXh0P3tiaW5hcnk6cy5yZXNwb25zZX06e3RleHQ6cy5yZXNwb25zZVRleHR9LHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPWUoKSxyPXMub25lcnJvcj1zLm9udGltZW91dD1lKCJlcnJvciIpLHZvaWQgMCE9PXMub25hYm9ydD9zLm9uYWJvcnQ9cjpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1zLnJlYWR5U3RhdGUmJm4uc2V0VGltZW91dChmdW5jdGlvbigpe2UmJnIoKX0pfSxlPWUoImFib3J0Iik7dHJ5e3Muc2VuZCh0Lmhhc0NvbnRlbnQmJnQuZGF0YXx8bnVsbCl9Y2F0Y2godCl7aWYoZSl0aHJvdyB0fX0sYWJvcnQ6ZnVuY3Rpb24oKXtlJiZlKCl9fX0pLFMuYWpheFByZWZpbHRlcihmdW5jdGlvbih0KXt0LmNyb3NzRG9tYWluJiYodC5jb250ZW50cy5zY3JpcHQ9ITEpfSksUy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24odCl7cmV0dXJuIFMuZ2xvYmFsRXZhbCh0KSx0fX19KSxTLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24odCl7dm9pZCAwPT09dC5jYWNoZSYmKHQuY2FjaGU9ITEpLHQuY3Jvc3NEb21haW4mJih0LnR5cGU9IkdFVCIpfSksUy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKHQpe3ZhciBlLG47aWYodC5jcm9zc0RvbWFpbnx8dC5zY3JpcHRBdHRycylyZXR1cm57c2VuZDpmdW5jdGlvbihyLG8pe2U9UygiPHNjcmlwdD4iKS5hdHRyKHQuc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0OnQuc2NyaXB0Q2hhcnNldCxzcmM6dC51cmx9KS5vbigibG9hZCBlcnJvciIsbj1mdW5jdGlvbih0KXtlLnJlbW92ZSgpLG49bnVsbCx0JiZvKCJlcnJvciI9PT10LnR5cGU/NDA0OjIwMCx0LnR5cGUpfSksYS5oZWFkLmFwcGVuZENoaWxkKGVbMF0pfSxhYm9ydDpmdW5jdGlvbigpe24mJm4oKX19fSk7dmFyIEtlLFhlPVtdLEplPS8oPSlcPyg/PSZ8JCl8XD9cPy87Uy5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciB0PVhlLnBvcCgpfHxTLmV4cGFuZG8rIl8iK0FlKys7cmV0dXJuIHRoaXNbdF09ITAsdH19KSxTLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGEscz0hMSE9PXQuanNvbnAmJihKZS50ZXN0KHQudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmMD09PSh0LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJkplLnRlc3QodC5kYXRhKSYmImRhdGEiKTtpZihzfHwianNvbnAiPT09dC5kYXRhVHlwZXNbMF0pcmV0dXJuIG89dC5qc29ucENhbGxiYWNrPW0odC5qc29ucENhbGxiYWNrKT90Lmpzb25wQ2FsbGJhY2soKTp0Lmpzb25wQ2FsbGJhY2sscz90W3NdPXRbc10ucmVwbGFjZShKZSwiJDEiK28pOiExIT09dC5qc29ucCYmKHQudXJsKz0oT2UudGVzdCh0LnVybCk/IiYiOiI/IikrdC5qc29ucCsiPSIrbyksdC5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIGF8fFMuZXJyb3IobysiIHdhcyBub3QgY2FsbGVkIiksYVswXX0sdC5kYXRhVHlwZXNbMF09Impzb24iLGk9bltvXSxuW29dPWZ1bmN0aW9uKCl7YT1hcmd1bWVudHN9LHIuYWx3YXlzKGZ1bmN0aW9uKCl7dm9pZCAwPT09aT9TKG4pLnJlbW92ZVByb3Aobyk6bltvXT1pLHRbb10mJih0Lmpzb25wQ2FsbGJhY2s9ZS5qc29ucENhbGxiYWNrLFhlLnB1c2gobykpLGEmJm0oaSkmJmkoYVswXSksYT1pPXZvaWQgMH0pLCJzY3JpcHQifSkseS5jcmVhdGVIVE1MRG9jdW1lbnQ9KChLZT1hLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keSkuaW5uZXJIVE1MPSI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPiIsMj09PUtlLmNoaWxkTm9kZXMubGVuZ3RoKSxTLnBhcnNlSFRNTD1mdW5jdGlvbih0LGUsbil7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0P1tdOigiYm9vbGVhbiI9PXR5cGVvZiBlJiYobj1lLGU9ITEpLGV8fCh5LmNyZWF0ZUhUTUxEb2N1bWVudD8oKHI9KGU9YS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9YS5sb2NhdGlvbi5ocmVmLGUuaGVhZC5hcHBlbmRDaGlsZChyKSk6ZT1hKSxpPSFuJiZbXSwobz1SLmV4ZWModCkpP1tlLmNyZWF0ZUVsZW1lbnQob1sxXSldOihvPUV0KFt0XSxlLGkpLGkmJmkubGVuZ3RoJiZTKGkpLnJlbW92ZSgpLFMubWVyZ2UoW10sby5jaGlsZE5vZGVzKSkpO3ZhciByLG8saX0sUy5mbi5sb2FkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYT10aGlzLHM9dC5pbmRleE9mKCIgIik7cmV0dXJuIHM+LTEmJihyPXhlKHQuc2xpY2UocykpLHQ9dC5zbGljZSgwLHMpKSxtKGUpPyhuPWUsZT12b2lkIDApOmUmJiJvYmplY3QiPT10eXBlb2YgZSYmKG89IlBPU1QiKSxhLmxlbmd0aD4wJiZTLmFqYXgoe3VybDp0LHR5cGU6b3x8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6ZX0pLmRvbmUoZnVuY3Rpb24odCl7aT1hcmd1bWVudHMsYS5odG1sKHI/UygiPGRpdj4iKS5hcHBlbmQoUy5wYXJzZUhUTUwodCkpLmZpbmQocik6dCl9KS5hbHdheXMobiYmZnVuY3Rpb24odCxlKXthLmVhY2goZnVuY3Rpb24oKXtuLmFwcGx5KHRoaXMsaXx8W3QucmVzcG9uc2VUZXh0LGUsdF0pfSl9KSx0aGlzfSxTLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbih0LGUpe1MuZm5bZV09ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub24oZSx0KX19KSxTLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gUy5ncmVwKFMudGltZXJzLGZ1bmN0aW9uKGUpe3JldHVybiB0PT09ZS5lbGVtfSkubGVuZ3RofSxTLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzLHUsYz1TLmNzcyh0LCJwb3NpdGlvbiIpLGw9Uyh0KSxmPXt9OyJzdGF0aWMiPT09YyYmKHQuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1sLm9mZnNldCgpLGk9Uy5jc3ModCwidG9wIiksdT1TLmNzcyh0LCJsZWZ0IiksKCJhYnNvbHV0ZSI9PT1jfHwiZml4ZWQiPT09YykmJihpK3UpLmluZGV4T2YoImF1dG8iKT4tMT8oYT0ocj1sLnBvc2l0aW9uKCkpLnRvcCxvPXIubGVmdCk6KGE9cGFyc2VGbG9hdChpKXx8MCxvPXBhcnNlRmxvYXQodSl8fDApLG0oZSkmJihlPWUuY2FsbCh0LG4sUy5leHRlbmQoe30scykpKSxudWxsIT1lLnRvcCYmKGYudG9wPWUudG9wLXMudG9wK2EpLG51bGwhPWUubGVmdCYmKGYubGVmdD1lLmxlZnQtcy5sZWZ0K28pLCJ1c2luZyJpbiBlP2UudXNpbmcuY2FsbCh0LGYpOmwuY3NzKGYpfX0sUy5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbih0KXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLHQsZSl9KTt2YXIgZSxuLHI9dGhpc1swXTtyZXR1cm4gcj9yLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyhlPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1yLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDplLnRvcCtuLnBhZ2VZT2Zmc2V0LGxlZnQ6ZS5sZWZ0K24ucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfTp2b2lkIDB9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIHQsZSxuLHI9dGhpc1swXSxvPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT1TLmNzcyhyLCJwb3NpdGlvbiIpKWU9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle2ZvcihlPXRoaXMub2Zmc2V0KCksbj1yLm93bmVyRG9jdW1lbnQsdD1yLm9mZnNldFBhcmVudHx8bi5kb2N1bWVudEVsZW1lbnQ7dCYmKHQ9PT1uLmJvZHl8fHQ9PT1uLmRvY3VtZW50RWxlbWVudCkmJiJzdGF0aWMiPT09Uy5jc3ModCwicG9zaXRpb24iKTspdD10LnBhcmVudE5vZGU7dCYmdCE9PXImJjE9PT10Lm5vZGVUeXBlJiYoKG89Uyh0KS5vZmZzZXQoKSkudG9wKz1TLmNzcyh0LCJib3JkZXJUb3BXaWR0aCIsITApLG8ubGVmdCs9Uy5jc3ModCwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6ZS50b3Atby50b3AtUy5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDplLmxlZnQtby5sZWZ0LVMuY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5vZmZzZXRQYXJlbnQ7dCYmInN0YXRpYyI9PT1TLmNzcyh0LCJwb3NpdGlvbiIpOyl0PXQub2Zmc2V0UGFyZW50O3JldHVybiB0fHxhdH0pfX0pLFMuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LGUpe3ZhciBuPSJwYWdlWU9mZnNldCI9PT1lO1MuZm5bdF09ZnVuY3Rpb24ocil7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0LHIsbyl7dmFyIGk7aWYoYih0KT9pPXQ6OT09PXQubm9kZVR5cGUmJihpPXQuZGVmYXVsdFZpZXcpLHZvaWQgMD09PW8pcmV0dXJuIGk/aVtlXTp0W3JdO2k/aS5zY3JvbGxUbyhuP2kucGFnZVhPZmZzZXQ6byxuP286aS5wYWdlWU9mZnNldCk6dFtyXT1vfSx0LHIsYXJndW1lbnRzLmxlbmd0aCl9fSksUy5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKHQsZSl7Uy5jc3NIb29rc1tlXT1HdCh5LnBpeGVsUG9zaXRpb24sZnVuY3Rpb24odCxuKXtpZihuKXJldHVybiBuPVZ0KHQsZSksV3QudGVzdChuKT9TKHQpLnBvc2l0aW9uKClbZV0rInB4IjpufSl9KSxTLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbih0LGUpe1MuZWFjaCh7cGFkZGluZzoiaW5uZXIiK3QsY29udGVudDplLCIiOiJvdXRlciIrdH0sZnVuY3Rpb24obixyKXtTLmZuW3JdPWZ1bmN0aW9uKG8saSl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aCYmKG58fCJib29sZWFuIiE9dHlwZW9mIG8pLHM9bnx8KCEwPT09b3x8ITA9PT1pPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsbixvKXt2YXIgaTtyZXR1cm4gYihlKT8wPT09ci5pbmRleE9mKCJvdXRlciIpP2VbImlubmVyIit0XTplLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50Iit0XTo5PT09ZS5ub2RlVHlwZT8oaT1lLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChlLmJvZHlbInNjcm9sbCIrdF0saVsic2Nyb2xsIit0XSxlLmJvZHlbIm9mZnNldCIrdF0saVsib2Zmc2V0Iit0XSxpWyJjbGllbnQiK3RdKSk6dm9pZCAwPT09bz9TLmNzcyhlLG4scyk6Uy5zdHlsZShlLG4sbyxzKX0sZSxhP286dm9pZCAwLGEpfX0pfSksUy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKHQsZSl7Uy5mbltlXT1mdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihlLG51bGwsdCxuKTp0aGlzLnRyaWdnZXIoZSl9fSksUy5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubW91c2VlbnRlcih0KS5tb3VzZWxlYXZlKGV8fHQpfX0pLFMuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5vbih0LG51bGwsZSxuKX0sdW5iaW5kOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMub2ZmKHQsbnVsbCxlKX0sZGVsZWdhdGU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHRoaXMub24oZSx0LG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZih0LCIqKiIpOnRoaXMub2ZmKGUsdHx8IioqIixuKX19KSxTLnByb3h5PWZ1bmN0aW9uKHQsZSl7dmFyIG4scixvO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmKG49dFtlXSxlPXQsdD1uKSxtKHQpKXJldHVybiByPXUuY2FsbChhcmd1bWVudHMsMiksKG89ZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlfHx0aGlzLHIuY29uY2F0KHUuY2FsbChhcmd1bWVudHMpKSl9KS5ndWlkPXQuZ3VpZD10Lmd1aWR8fFMuZ3VpZCsrLG99LFMuaG9sZFJlYWR5PWZ1bmN0aW9uKHQpe3Q/Uy5yZWFkeVdhaXQrKzpTLnJlYWR5KCEwKX0sUy5pc0FycmF5PUFycmF5LmlzQXJyYXksUy5wYXJzZUpTT049SlNPTi5wYXJzZSxTLm5vZGVOYW1lPUwsUy5pc0Z1bmN0aW9uPW0sUy5pc1dpbmRvdz1iLFMuY2FtZWxDYXNlPUssUy50eXBlPWssUy5ub3c9RGF0ZS5ub3csUy5pc051bWVyaWM9ZnVuY3Rpb24odCl7dmFyIGU9Uy50eXBlKHQpO3JldHVybigibnVtYmVyIj09PWV8fCJzdHJpbmciPT09ZSkmJiFpc05hTih0LXBhcnNlRmxvYXQodCkpfSx2b2lkIDA9PT0ocj1mdW5jdGlvbigpe3JldHVybiBTfS5hcHBseShlLFtdKSl8fCh0LmV4cG9ydHM9cik7dmFyIFFlPW4ualF1ZXJ5LFplPW4uJDtyZXR1cm4gUy5ub0NvbmZsaWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuLiQ9PT1TJiYobi4kPVplKSx0JiZuLmpRdWVyeT09PVMmJihuLmpRdWVyeT1RZSksU30sb3x8KG4ualF1ZXJ5PW4uJD1TKSxTfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0OCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI1Mik7ZnVuY3Rpb24gbyh0LGUsbixvLGksYSxzKXt0cnl7dmFyIHU9dFthXShzKSxjPXUudmFsdWV9Y2F0Y2godCl7cmV0dXJuIHZvaWQgbih0KX11LmRvbmU/ZShjKTpyLnJlc29sdmUoYykudGhlbihvLGkpfXQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgcihmdW5jdGlvbihyLGkpe3ZhciBhPXQuYXBwbHkoZSxuKTtmdW5jdGlvbiBzKHQpe28oYSxyLGkscyx1LCJuZXh0Iix0KX1mdW5jdGlvbiB1KHQpe28oYSxyLGkscyx1LCJ0aHJvdyIsdCl9cyh2b2lkIDApfSl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjY0KS5kZWZhdWx0O3QuZXhwb3J0cz1yLHQuZXhwb3J0cy5kZWZhdWx0PXJ9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyOTgpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCJcXCQmIil9ci5wcm90bz1mdW5jdGlvbigpe3JldHVybiBSZWdFeHAuZXNjYXBlPXIscn0sdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMzcpfSxmdW5jdGlvbih0LGUsbil7bigxMzgpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuUmVmbGVjdC5jb25zdHJ1Y3R9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigzMiksaT1uKDIyKSxhPW4oMTEpLHM9big2KSx1PW4oNDYpLGM9big5MSksbD1uKDUpLGY9bygiUmVmbGVjdCIsImNvbnN0cnVjdCIpLHA9bChmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIShmKGZ1bmN0aW9uKCl7fSxbXSx0KWluc3RhbmNlb2YgdCl9KSxoPSFsKGZ1bmN0aW9uKCl7ZihmdW5jdGlvbigpe30pfSksZD1wfHxoO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMCxmb3JjZWQ6ZCxzaGFtOmR9LHtjb25zdHJ1Y3Q6ZnVuY3Rpb24odCxlKXtpKHQpLGEoZSk7dmFyIG49YXJndW1lbnRzLmxlbmd0aDwzP3Q6aShhcmd1bWVudHNbMl0pO2lmKGgmJiFwKXJldHVybiBmKHQsZSxuKTtpZih0PT1uKXtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKX12YXIgcj1bbnVsbF07cmV0dXJuIHIucHVzaC5hcHBseShyLGUpLG5ldyhjLmFwcGx5KHQscikpfXZhciBvPW4ucHJvdG90eXBlLGw9dShzKG8pP286T2JqZWN0LnByb3RvdHlwZSksZD1GdW5jdGlvbi5hcHBseS5jYWxsKHQsbCxlKTtyZXR1cm4gcyhkKT9kOmx9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oMjMpLGk9bigxMSksYT1uKDU1KTt0LmV4cG9ydHM9cj9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbih0LGUpe2kodCk7Zm9yKHZhciBuLHI9YShlKSxzPXIubGVuZ3RoLHU9MDtzPnU7KW8uZih0LG49clt1KytdLGVbbl0pO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDE3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0cnl7byhyLHQsZSl9Y2F0Y2gobil7clt0XT1lfXJldHVybiBlfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0Mil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEpLG89ci5KU09OfHwoci5KU09OPXtzdHJpbmdpZnk6SlNPTi5zdHJpbmdpZnl9KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8uc3RyaW5naWZ5LmFwcGx5KG8sYXJndW1lbnRzKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDQpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmNvbmNhdDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uY29uY2F0P3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDkyKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5jb25jYXR9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDgpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8ubWFwP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDE0OSk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkFycmF5IikubWFwfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5tYXA7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFuKDcyKSgibWFwIil9LHttYXA6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTIpfSxmdW5jdGlvbih0LGUsbil7bigxNTMpO3ZhciByPW4oMSkuT2JqZWN0LG89dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gci5kZWZpbmVQcm9wZXJ0eSh0LGUsbil9O3IuZGVmaW5lUHJvcGVydHkuc2hhbSYmKG8uc2hhbT0hMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigxMyk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFvLHNoYW06IW99LHtkZWZpbmVQcm9wZXJ0eTpuKDIzKS5mfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTU2KX0sZnVuY3Rpb24odCxlLG4pe24oMTU3KTt2YXIgcj1uKDEpLk9iamVjdCxvPXQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiByLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpfTtyLmdldE93blByb3BlcnR5RGVzY3JpcHRvci5zaGFtJiYoby5zaGFtPSEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDUpLGk9bigyMSksYT1uKDQ0KS5mLHM9bigxMyksdT1vKGZ1bmN0aW9uKCl7YSgxKX0pO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohc3x8dSxzaGFtOiFzfSx7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGEoaSh0KSxlKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1OSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjApfSxmdW5jdGlvbih0LGUsbil7bigxNjEpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuUmVmbGVjdC5nZXR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big2KSxpPW4oMTEpLGE9bigxNCkscz1uKDQ0KSx1PW4oNDgpO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMH0se2dldDpmdW5jdGlvbiB0KGUsbil7dmFyIHIsYyxsPWFyZ3VtZW50cy5sZW5ndGg8Mz9lOmFyZ3VtZW50c1syXTtyZXR1cm4gaShlKT09PWw/ZVtuXToocj1zLmYoZSxuKSk/YShyLCJ2YWx1ZSIpP3IudmFsdWU6dm9pZCAwPT09ci5nZXQ/dm9pZCAwOnIuZ2V0LmNhbGwobCk6byhjPXUoZSkpP3QoYyxuLGwpOnZvaWQgMH19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcig7IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpJiZudWxsIT09KHQ9cih0KSk7KTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY1KX0sZnVuY3Rpb24odCxlLG4pe24oMTY2KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLk9iamVjdC5nZXRQcm90b3R5cGVPZn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDUpLGk9bigyNCksYT1uKDQ4KSxzPW4oOTUpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpvKGZ1bmN0aW9uKCl7YSgxKX0pLHNoYW06IXN9LHtnZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2OCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE2OSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3Quc2V0UHJvdG90eXBlT2Z9LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMH0se3NldFByb3RvdHlwZU9mOm4oNzQpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighcih0KSYmbnVsbCE9PXQpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBzZXQgIitTdHJpbmcodCkrIiBhcyBhIHByb3RvdHlwZSIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3Mil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzMpfSxmdW5jdGlvbih0LGUsbil7bigxNzQpO3ZhciByPW4oMSkuT2JqZWN0O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiByLmNyZWF0ZSh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLHNoYW06IW4oMTMpfSx7Y3JlYXRlOm4oNDYpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDk2KTtmdW5jdGlvbiBvKGUsbil7cmV0dXJuIHQuZXhwb3J0cz1vPXJ8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0sbyhlLG4pfXQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNzcpLG89bigxMDIpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPSJmdW5jdGlvbiI9PXR5cGVvZiBvJiYic3ltYm9sIj09dHlwZW9mIHI/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIG8mJnQuY29uc3RydWN0b3I9PT1vJiZ0IT09by5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTc5KX0sZnVuY3Rpb24odCxlLG4pe24oOTcpLG4oMzQpLG4oNTApO3ZhciByPW4oNzUpO3QuZXhwb3J0cz1yLmYoIml0ZXJhdG9yIil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY4KSxvPW4oNDUpLGk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGksYSxzPVN0cmluZyhvKGUpKSx1PXIobiksYz1zLmxlbmd0aDtyZXR1cm4gdTwwfHx1Pj1jP3Q/IiI6dm9pZCAwOihpPXMuY2hhckNvZGVBdCh1KSk8NTUyOTZ8fGk+NTYzMTl8fHUrMT09PWN8fChhPXMuY2hhckNvZGVBdCh1KzEpKTw1NjMyMHx8YT41NzM0Mz90P3MuY2hhckF0KHUpOmk6dD9zLnNsaWNlKHUsdSsyKTphLTU2MzIwKyhpLTU1Mjk2PDwxMCkrNjU1MzZ9fTt0LmV4cG9ydHM9e2NvZGVBdDppKCExKSxjaGFyQXQ6aSghMCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oMTgyKSxpPXIuV2Vha01hcDt0LmV4cG9ydHM9ImZ1bmN0aW9uIj09dHlwZW9mIGkmJi9uYXRpdmUgY29kZS8udGVzdChvLmNhbGwoaSkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1OCk7dC5leHBvcnRzPXIoIm5hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmciLEZ1bmN0aW9uLnRvU3RyaW5nKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDc2KSxvPXt9O29bbigyKSgidG9TdHJpbmdUYWciKV09InoiLHQuZXhwb3J0cz0iW29iamVjdCB6XSIhPT1TdHJpbmcobyk/ZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCAiK3IodGhpcykrIl0ifTpvLnRvU3RyaW5nfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17Q1NTUnVsZUxpc3Q6MCxDU1NTdHlsZURlY2xhcmF0aW9uOjAsQ1NTVmFsdWVMaXN0OjAsQ2xpZW50UmVjdExpc3Q6MCxET01SZWN0TGlzdDowLERPTVN0cmluZ0xpc3Q6MCxET01Ub2tlbkxpc3Q6MSxEYXRhVHJhbnNmZXJJdGVtTGlzdDowLEZpbGVMaXN0OjAsSFRNTEFsbENvbGxlY3Rpb246MCxIVE1MQ29sbGVjdGlvbjowLEhUTUxGb3JtRWxlbWVudDowLEhUTUxTZWxlY3RFbGVtZW50OjAsTWVkaWFMaXN0OjAsTWltZVR5cGVBcnJheTowLE5hbWVkTm9kZU1hcDowLE5vZGVMaXN0OjEsUGFpbnRSZXF1ZXN0TGlzdDowLFBsdWdpbjowLFBsdWdpbkFycmF5OjAsU1ZHTGVuZ3RoTGlzdDowLFNWR051bWJlckxpc3Q6MCxTVkdQYXRoU2VnTGlzdDowLFNWR1BvaW50TGlzdDowLFNWR1N0cmluZ0xpc3Q6MCxTVkdUcmFuc2Zvcm1MaXN0OjAsU291cmNlQnVmZmVyTGlzdDowLFN0eWxlU2hlZXRMaXN0OjAsVGV4dFRyYWNrQ3VlTGlzdDowLFRleHRUcmFja0xpc3Q6MCxUb3VjaExpc3Q6MH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDMpLG4oMjAzKSxuKDIwNCksbigyMDUpLG4oMjA2KSxuKDIwNyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNCksaT1uKDI3KSxhPW4oMTMpLHM9big5NCksdT1uKDUpLGM9bigxNCksbD1uKDQ3KSxmPW4oNikscD1uKDExKSxoPW4oMjQpLGQ9bigyMSksZz1uKDU0KSx2PW4oMzApLHk9big0NiksbT1uKDU1KSxiPW4oMTA1KSx4PW4oMTg3KSx3PW4oMTA2KSxrPW4oNDQpLFM9bigyMyksRT1uKDY0KSxUPW4oMTcpLGo9bigzNSksQT1uKDU4KSxPPW4oNTcpLEM9big1NiksTD1uKDcwKSxSPW4oMiksUD1uKDc1KSxOPW4oMyksST1uKDI4KSxEPW4oNDkpLF89big3MykuZm9yRWFjaCxNPU8oImhpZGRlbiIpLFU9UigidG9QcmltaXRpdmUiKSxCPUQuc2V0LHE9RC5nZXR0ZXJGb3IoIlN5bWJvbCIpLEY9T2JqZWN0LnByb3RvdHlwZSxIPW8uU3ltYm9sLHo9by5KU09OLFc9eiYmei5zdHJpbmdpZnksJD1rLmYsWT1TLmYsVj14LmYsRz1FLmYsSz1BKCJzeW1ib2xzIiksWD1BKCJvcC1zeW1ib2xzIiksSj1BKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksUT1BKCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5IiksWj1BKCJ3a3MiKSx0dD1vLlFPYmplY3QsZXQ9IXR0fHwhdHQucHJvdG90eXBlfHwhdHQucHJvdG90eXBlLmZpbmRDaGlsZCxudD1hJiZ1KGZ1bmN0aW9uKCl7cmV0dXJuIDchPXkoWSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBZKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcj0kKEYsZSk7ciYmZGVsZXRlIEZbZV0sWSh0LGUsbiksciYmdCE9PUYmJlkoRixlLHIpfTpZLHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49S1t0XT15KEgucHJvdG90eXBlKTtyZXR1cm4gQihuLHt0eXBlOiJTeW1ib2wiLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxhfHwobi5kZXNjcmlwdGlvbj1lKSxufSxvdD1zJiYic3ltYm9sIj09dHlwZW9mIEguaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBIfSxpdD1mdW5jdGlvbih0LGUsbil7dD09PUYmJml0KFgsZSxuKSxwKHQpO3ZhciByPWcoZSwhMCk7cmV0dXJuIHAobiksYyhLLHIpPyhuLmVudW1lcmFibGU/KGModCxNKSYmdFtNXVtyXSYmKHRbTV1bcl09ITEpLG49eShuLHtlbnVtZXJhYmxlOnYoMCwhMSl9KSk6KGModCxNKXx8WSh0LE0sdigxLHt9KSksdFtNXVtyXT0hMCksbnQodCxyLG4pKTpZKHQscixuKX0sYXQ9ZnVuY3Rpb24odCxlKXtwKHQpO3ZhciBuPWQoZSkscj1tKG4pLmNvbmNhdChsdChuKSk7cmV0dXJuIF8ocixmdW5jdGlvbihlKXthJiYhc3QuY2FsbChuLGUpfHxpdCh0LGUsbltlXSl9KSx0fSxzdD1mdW5jdGlvbih0KXt2YXIgZT1nKHQsITApLG49Ry5jYWxsKHRoaXMsZSk7cmV0dXJuISh0aGlzPT09RiYmYyhLLGUpJiYhYyhYLGUpKSYmKCEobnx8IWModGhpcyxlKXx8IWMoSyxlKXx8Yyh0aGlzLE0pJiZ0aGlzW01dW2VdKXx8bil9LHV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZCh0KSxyPWcoZSwhMCk7aWYobiE9PUZ8fCFjKEsscil8fGMoWCxyKSl7dmFyIG89JChuLHIpO3JldHVybiFvfHwhYyhLLHIpfHxjKG4sTSkmJm5bTV1bcl18fChvLmVudW1lcmFibGU9ITApLG99fSxjdD1mdW5jdGlvbih0KXt2YXIgZT1WKGQodCkpLG49W107cmV0dXJuIF8oZSxmdW5jdGlvbih0KXtjKEssdCl8fGMoQyx0KXx8bi5wdXNoKHQpfSksbn0sbHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PUYsbj1WKGU/WDpkKHQpKSxyPVtdO3JldHVybiBfKG4sZnVuY3Rpb24odCl7IWMoSyx0KXx8ZSYmIWMoRix0KXx8ci5wdXNoKEtbdF0pfSkscn07c3x8KGooKEg9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgSCl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1MKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PUYmJm4uY2FsbChYLHQpLGModGhpcyxNKSYmYyh0aGlzW01dLGUpJiYodGhpc1tNXVtlXT0hMSksbnQodGhpcyxlLHYoMSx0KSl9O3JldHVybiBhJiZldCYmbnQoRixlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxydChlLHQpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzKS50YWd9KSxFLmY9c3QsUy5mPWl0LGsuZj11dCxiLmY9eC5mPWN0LHcuZj1sdCxhJiYoWShILnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHEodGhpcykuZGVzY3JpcHRpb259fSksaXx8aihGLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsc3Qse3Vuc2FmZTohMH0pKSxQLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KFIodCksdCl9KSxyKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IXMsc2hhbTohc30se1N5bWJvbDpIfSksXyhtKFopLGZ1bmN0aW9uKHQpe04odCl9KSxyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpO2lmKGMoSixlKSlyZXR1cm4gSltlXTt2YXIgbj1IKGUpO3JldHVybiBKW2VdPW4sUVtuXT1lLG59LGtleUZvcjpmdW5jdGlvbih0KXtpZighb3QodCkpdGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2wiKTtpZihjKFEsdCkpcmV0dXJuIFFbdF19LHVzZVNldHRlcjpmdW5jdGlvbigpe2V0PSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtldD0hMX19KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXMsc2hhbTohYX0se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3kodCk6YXQoeSh0KSxlKX0sZGVmaW5lUHJvcGVydHk6aXQsZGVmaW5lUHJvcGVydGllczphdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6dXR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOmN0LGdldE93blByb3BlcnR5U3ltYm9sczpsdH0pLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDp1KGZ1bmN0aW9uKCl7dy5mKDEpfSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHcuZihoKHQpKX19KSx6JiZyKHt0YXJnZXQ6IkpTT04iLHN0YXQ6ITAsZm9yY2VkOiFzfHx1KGZ1bmN0aW9uKCl7dmFyIHQ9SCgpO3JldHVybiJbbnVsbF0iIT1XKFt0XSl8fCJ7fSIhPVcoe2E6dH0pfHwie30iIT1XKE9iamVjdCh0KSl9KX0se3N0cmluZ2lmeTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyPVt0XSxvPTE7YXJndW1lbnRzLmxlbmd0aD5vOylyLnB1c2goYXJndW1lbnRzW28rK10pO2lmKG49ZT1yWzFdLChmKGUpfHx2b2lkIDAhPT10KSYmIW90KHQpKXJldHVybiBsKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoZT1uLmNhbGwodGhpcyx0LGUpKSwhb3QoZSkpcmV0dXJuIGV9KSxyWzFdPWUsVy5hcHBseSh6LHIpfX0pLEgucHJvdG90eXBlW1VdfHxUKEgucHJvdG90eXBlLFUsSC5wcm90b3R5cGUudmFsdWVPZiksSShILCJTeW1ib2wiKSxDW01dPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMSksbz1uKDEwNSkuZixpPXt9LnRvU3RyaW5nLGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gYSYmIltvYmplY3QgV2luZG93XSI9PWkuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIG8odCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19KHQpOm8ocih0KSl9fSxmdW5jdGlvbih0LGUsbil7bigzKSgiYXN5bmNJdGVyYXRvciIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe24oMykoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoIm1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgic2VhcmNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGxpdCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgidG9QcmltaXRpdmUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyOCkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KTtuKDI4KShyLkpTT04sIkpTT04iLCEwKX0sZnVuY3Rpb24odCxlLG4pe24oMykoImFzeW5jRGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgiZGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicGF0dGVybk1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJyZXBsYWNlQWxsIil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMTEpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmZpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmZpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjEyKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5maW5kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5maW5kLGk9big3NyksYT0hMDsiZmluZCJpbltdJiZBcnJheSgxKS5maW5kKGZ1bmN0aW9uKCl7YT0hMX0pLHIoe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDphfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmQiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIxNCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxNSksbz1TdHJpbmcucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnRyaW07cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHx0PT09b3x8dCBpbnN0YW5jZW9mIFN0cmluZyYmZT09PW8udHJpbT9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyMTYpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS50cmltfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDEwNykudHJpbTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oMjE3KSgidHJpbSIpfSx7dHJpbTpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMpfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KSxvPW4oNzgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihmdW5jdGlvbigpe3JldHVybiEhb1t0XSgpfHwi4oCLwoXhoI4iIT0i4oCLwoXhoI4iW3RdKCl8fG9bdF0ubmFtZSE9PXR9KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTkpfSxmdW5jdGlvbih0LGUsbil7bigyMjApO3ZhciByPW4oMSk7dC5leHBvcnRzPXIucGFyc2VJbnR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyMjEpO3Ioe2dsb2JhbDohMCxmb3JjZWQ6cGFyc2VJbnQhPW99LHtwYXJzZUludDpvfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89bigxMDcpLnRyaW0saT1uKDc4KSxhPXIucGFyc2VJbnQscz0vXlsrLV0/MFtYeF0vLHU9OCE9PWEoaSsiMDgiKXx8MjIhPT1hKGkrIjB4MTYiKTt0LmV4cG9ydHM9dT9mdW5jdGlvbih0LGUpe3ZhciBuPW8oU3RyaW5nKHQpKTtyZXR1cm4gYShuLGU+Pj4wfHwocy50ZXN0KG4pPzE2OjEwKSl9OmF9LGZ1bmN0aW9uKHQsZSxuKXtuKDUwKSxuKDM0KSx0LmV4cG9ydHM9bigxMDgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTA5KX0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITB9LHtpc0FycmF5Om4oNDcpfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDUwKSxuKDM0KSx0LmV4cG9ydHM9big1MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDIyOSk7cih7dGFyZ2V0OiJBcnJheSIsc3RhdDohMCxmb3JjZWQ6IW4oMTEzKShmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSl9LHtmcm9tOm99KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMxKSxvPW4oMjQpLGk9bigxMTEpLGE9bigxMTIpLHM9bigzMyksdT1uKDcxKSxjPW4oNTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuLGwsZixwPW8odCksaD0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcz90aGlzOkFycmF5LGQ9YXJndW1lbnRzLmxlbmd0aCxnPWQ+MT9hcmd1bWVudHNbMV06dm9pZCAwLHY9dm9pZCAwIT09Zyx5PTAsbT1jKHApO2lmKHYmJihnPXIoZyxkPjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSksbnVsbD09bXx8aD09QXJyYXkmJmEobSkpZm9yKG49bmV3IGgoZT1zKHAubGVuZ3RoKSk7ZT55O3krKyl1KG4seSx2P2cocFt5XSx5KTpwW3ldKTtlbHNlIGZvcihmPW0uY2FsbChwKSxuPW5ldyBoOyEobD1mLm5leHQoKSkuZG9uZTt5KyspdShuLHksdj9pKGYsZyxbbC52YWx1ZSx5XSwhMCk6bC52YWx1ZSk7cmV0dXJuIG4ubGVuZ3RoPXksbn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTQpfSxmdW5jdGlvbih0LGUsbil7bigyMzIpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDYpLGk9big0NyksYT1uKDg5KSxzPW4oMzMpLHU9bigyMSksYz1uKDcxKSxsPW4oNzIpLGY9bigyKSgic3BlY2llcyIpLHA9W10uc2xpY2UsaD1NYXRoLm1heDtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWwoInNsaWNlIil9LHtzbGljZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbCxkPXUodGhpcyksZz1zKGQubGVuZ3RoKSx2PWEodCxnKSx5PWEodm9pZCAwPT09ZT9nOmUsZyk7aWYoaShkKSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPWQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFpKG4ucHJvdG90eXBlKT9vKG4pJiZudWxsPT09KG49bltmXSkmJihuPXZvaWQgMCk6bj12b2lkIDAsbj09PUFycmF5fHx2b2lkIDA9PT1uKSlyZXR1cm4gcC5jYWxsKGQsdix5KTtmb3Iocj1uZXcodm9pZCAwPT09bj9BcnJheTpuKShoKHktdiwwKSksbD0wO3Y8eTt2KyssbCsrKXYgaW4gZCYmYyhyLGwsZFt2XSk7cmV0dXJuIHIubGVuZ3RoPWwscn19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDIzNSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3Qua2V5c30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDI0KSxpPW4oNTUpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpuKDUpKGZ1bmN0aW9uKCl7aSgxKX0pfSx7a2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaShvKHQpKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzOCksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZjtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uaW5kZXhPZj9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyMzkpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLmluZGV4T2Z9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNjcpLmluZGV4T2YsaT1uKDI0MCksYT1bXS5pbmRleE9mLHM9ISFhJiYxL1sxXS5pbmRleE9mKDEsLTApPDAsdT1pKCJpbmRleE9mIik7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOnN8fHV9LHtpbmRleE9mOmZ1bmN0aW9uKHQpe3JldHVybiBzP2EuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwOm8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPVtdW3RdO3JldHVybiFufHwhcihmdW5jdGlvbigpe24uY2FsbChudWxsLGV8fGZ1bmN0aW9uKCl7dGhyb3cgMX0sMSl9KX19LGZ1bmN0aW9uKHQsZSxuKXtuKDExNSksdC5leHBvcnRzPW4oMSkuc2V0VGltZW91dH0sZnVuY3Rpb24odCxlLG4pe24oMTE1KSx0LmV4cG9ydHM9bigxKS5zZXRJbnRlcnZhbH0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0NCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDI0NSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3QuYXNzaWdufSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMjQ2KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6T2JqZWN0LmFzc2lnbiE9PW99LHthc3NpZ246b30pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTMpLG89big1KSxpPW4oNTUpLGE9bigxMDYpLHM9big2NCksdT1uKDI0KSxjPW4oNjUpLGw9T2JqZWN0LmFzc2lnbjt0LmV4cG9ydHM9IWx8fG8oZnVuY3Rpb24oKXt2YXIgdD17fSxlPXt9LG49U3ltYm9sKCk7cmV0dXJuIHRbbl09NywiYWJjZGVmZ2hpamtsbW5vcHFyc3QiLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09dH0pLDchPWwoe30sdClbbl18fCJhYmNkZWZnaGlqa2xtbm9wcXJzdCIhPWkobCh7fSxlKSkuam9pbigiIil9KT9mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj11KHQpLG89YXJndW1lbnRzLmxlbmd0aCxsPTEsZj1hLmYscD1zLmY7bz5sOylmb3IodmFyIGgsZD1jKGFyZ3VtZW50c1tsKytdKSxnPWY/aShkKS5jb25jYXQoZihkKSk6aShkKSx2PWcubGVuZ3RoLHk9MDt2Pnk7KWg9Z1t5KytdLHImJiFwLmNhbGwoZCxoKXx8KG5baF09ZFtoXSk7cmV0dXJuIG59Omx9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1mdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGUsbj1PYmplY3QucHJvdG90eXBlLHI9bi5oYXNPd25Qcm9wZXJ0eSxvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2w/U3ltYm9sOnt9LGk9by5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLGE9by5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixzPW8udG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiB1KHQsZSxuKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLHRbZV19dHJ5e3Uoe30sIiIpfWNhdGNoKHQpe3U9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0W2VdPW59fWZ1bmN0aW9uIGModCxlLG4scil7dmFyIG89ZSYmZS5wcm90b3R5cGUgaW5zdGFuY2VvZiB2P2U6dixpPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLGE9bmV3IE8ocnx8W10pO3JldHVybiBpLl9pbnZva2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWY7cmV0dXJuIGZ1bmN0aW9uKG8saSl7aWYocj09PWgpdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYocj09PWQpe2lmKCJ0aHJvdyI9PT1vKXRocm93IGk7cmV0dXJuIEwoKX1mb3Iobi5tZXRob2Q9byxuLmFyZz1pOzspe3ZhciBhPW4uZGVsZWdhdGU7aWYoYSl7dmFyIHM9VChhLG4pO2lmKHMpe2lmKHM9PT1nKWNvbnRpbnVlO3JldHVybiBzfX1pZigibmV4dCI9PT1uLm1ldGhvZCluLnNlbnQ9bi5fc2VudD1uLmFyZztlbHNlIGlmKCJ0aHJvdyI9PT1uLm1ldGhvZCl7aWYocj09PWYpdGhyb3cgcj1kLG4uYXJnO24uZGlzcGF0Y2hFeGNlcHRpb24obi5hcmcpfWVsc2UicmV0dXJuIj09PW4ubWV0aG9kJiZuLmFicnVwdCgicmV0dXJuIixuLmFyZyk7cj1oO3ZhciB1PWwodCxlLG4pO2lmKCJub3JtYWwiPT09dS50eXBlKXtpZihyPW4uZG9uZT9kOnAsdS5hcmc9PT1nKWNvbnRpbnVlO3JldHVybnt2YWx1ZTp1LmFyZyxkb25lOm4uZG9uZX19InRocm93Ij09PXUudHlwZSYmKHI9ZCxuLm1ldGhvZD0idGhyb3ciLG4uYXJnPXUuYXJnKX19fSh0LG4sYSksaX1mdW5jdGlvbiBsKHQsZSxuKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOnQuY2FsbChlLG4pfX1jYXRjaCh0KXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzp0fX19dC53cmFwPWM7dmFyIGY9InN1c3BlbmRlZFN0YXJ0IixwPSJzdXNwZW5kZWRZaWVsZCIsaD0iZXhlY3V0aW5nIixkPSJjb21wbGV0ZWQiLGc9e307ZnVuY3Rpb24gdigpe31mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIG0oKXt9dmFyIGI9e307YltpXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt2YXIgeD1PYmplY3QuZ2V0UHJvdG90eXBlT2Ysdz14JiZ4KHgoQyhbXSkpKTt3JiZ3IT09biYmci5jYWxsKHcsaSkmJihiPXcpO3ZhciBrPW0ucHJvdG90eXBlPXYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYik7ZnVuY3Rpb24gUyh0KXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24oZSl7dSh0LGUsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludm9rZShlLHQpfSl9KX1mdW5jdGlvbiBFKHQsZSl7dmFyIG47dGhpcy5faW52b2tlPWZ1bmN0aW9uKG8saSl7ZnVuY3Rpb24gYSgpe3JldHVybiBuZXcgZShmdW5jdGlvbihuLGEpeyFmdW5jdGlvbiBuKG8saSxhLHMpe3ZhciB1PWwodFtvXSx0LGkpO2lmKCJ0aHJvdyIhPT11LnR5cGUpe3ZhciBjPXUuYXJnLGY9Yy52YWx1ZTtyZXR1cm4gZiYmIm9iamVjdCI9PXR5cGVvZiBmJiZyLmNhbGwoZiwiX19hd2FpdCIpP2UucmVzb2x2ZShmLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odCl7bigibmV4dCIsdCxhLHMpfSxmdW5jdGlvbih0KXtuKCJ0aHJvdyIsdCxhLHMpfSk6ZS5yZXNvbHZlKGYpLnRoZW4oZnVuY3Rpb24odCl7Yy52YWx1ZT10LGEoYyl9LGZ1bmN0aW9uKHQpe3JldHVybiBuKCJ0aHJvdyIsdCxhLHMpfSl9cyh1LmFyZyl9KG8saSxuLGEpfSl9cmV0dXJuIG49bj9uLnRoZW4oYSxhKTphKCl9fWZ1bmN0aW9uIFQodCxuKXt2YXIgcj10Lml0ZXJhdG9yW24ubWV0aG9kXTtpZihyPT09ZSl7aWYobi5kZWxlZ2F0ZT1udWxsLCJ0aHJvdyI9PT1uLm1ldGhvZCl7aWYodC5pdGVyYXRvci5yZXR1cm4mJihuLm1ldGhvZD0icmV0dXJuIixuLmFyZz1lLFQodCxuKSwidGhyb3ciPT09bi5tZXRob2QpKXJldHVybiBnO24ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZCIpfXJldHVybiBnfXZhciBvPWwocix0Lml0ZXJhdG9yLG4uYXJnKTtpZigidGhyb3ciPT09by50eXBlKXJldHVybiBuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW8uYXJnLG4uZGVsZWdhdGU9bnVsbCxnO3ZhciBpPW8uYXJnO3JldHVybiBpP2kuZG9uZT8oblt0LnJlc3VsdE5hbWVdPWkudmFsdWUsbi5uZXh0PXQubmV4dExvYywicmV0dXJuIiE9PW4ubWV0aG9kJiYobi5tZXRob2Q9Im5leHQiLG4uYXJnPWUpLG4uZGVsZWdhdGU9bnVsbCxnKTppOihuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0Iiksbi5kZWxlZ2F0ZT1udWxsLGcpfWZ1bmN0aW9uIGoodCl7dmFyIGU9e3RyeUxvYzp0WzBdfTsxIGluIHQmJihlLmNhdGNoTG9jPXRbMV0pLDIgaW4gdCYmKGUuZmluYWxseUxvYz10WzJdLGUuYWZ0ZXJMb2M9dFszXSksdGhpcy50cnlFbnRyaWVzLnB1c2goZSl9ZnVuY3Rpb24gQSh0KXt2YXIgZT10LmNvbXBsZXRpb258fHt9O2UudHlwZT0ibm9ybWFsIixkZWxldGUgZS5hcmcsdC5jb21wbGV0aW9uPWV9ZnVuY3Rpb24gTyh0KXt0aGlzLnRyeUVudHJpZXM9W3t0cnlMb2M6InJvb3QifV0sdC5mb3JFYWNoKGosdGhpcyksdGhpcy5yZXNldCghMCl9ZnVuY3Rpb24gQyh0KXtpZih0KXt2YXIgbj10W2ldO2lmKG4pcmV0dXJuIG4uY2FsbCh0KTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5uZXh0KXJldHVybiB0O2lmKCFpc05hTih0Lmxlbmd0aCkpe3ZhciBvPS0xLGE9ZnVuY3Rpb24gbigpe2Zvcig7KytvPHQubGVuZ3RoOylpZihyLmNhbGwodCxvKSlyZXR1cm4gbi52YWx1ZT10W29dLG4uZG9uZT0hMSxuO3JldHVybiBuLnZhbHVlPWUsbi5kb25lPSEwLG59O3JldHVybiBhLm5leHQ9YX19cmV0dXJue25leHQ6TH19ZnVuY3Rpb24gTCgpe3JldHVybnt2YWx1ZTplLGRvbmU6ITB9fXJldHVybiB5LnByb3RvdHlwZT1rLmNvbnN0cnVjdG9yPW0sbS5jb25zdHJ1Y3Rvcj15LHkuZGlzcGxheU5hbWU9dShtLHMsIkdlbmVyYXRvckZ1bmN0aW9uIiksdC5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LmNvbnN0cnVjdG9yO3JldHVybiEhZSYmKGU9PT15fHwiR2VuZXJhdG9yRnVuY3Rpb24iPT09KGUuZGlzcGxheU5hbWV8fGUubmFtZSkpfSx0Lm1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxtKToodC5fX3Byb3RvX189bSx1KHQscywiR2VuZXJhdG9yRnVuY3Rpb24iKSksdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShrKSx0fSx0LmF3cmFwPWZ1bmN0aW9uKHQpe3JldHVybntfX2F3YWl0OnR9fSxTKEUucHJvdG90eXBlKSxFLnByb3RvdHlwZVthXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LkFzeW5jSXRlcmF0b3I9RSx0LmFzeW5jPWZ1bmN0aW9uKGUsbixyLG8saSl7dm9pZCAwPT09aSYmKGk9UHJvbWlzZSk7dmFyIGE9bmV3IEUoYyhlLG4scixvKSxpKTtyZXR1cm4gdC5pc0dlbmVyYXRvckZ1bmN0aW9uKG4pP2E6YS5uZXh0KCkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdC5kb25lP3QudmFsdWU6YS5uZXh0KCl9KX0sUyhrKSx1KGsscywiR2VuZXJhdG9yIiksa1tpXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxrLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9LHQua2V5cz1mdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIG4gaW4gdCllLnB1c2gobik7cmV0dXJuIGUucmV2ZXJzZSgpLGZ1bmN0aW9uIG4oKXtmb3IoO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKTtpZihyIGluIHQpcmV0dXJuIG4udmFsdWU9cixuLmRvbmU9ITEsbn1yZXR1cm4gbi5kb25lPSEwLG59fSx0LnZhbHVlcz1DLE8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPLHJlc2V0OmZ1bmN0aW9uKHQpe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PWUsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9ZSx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChBKSwhdClmb3IodmFyIG4gaW4gdGhpcykidCI9PT1uLmNoYXJBdCgwKSYmci5jYWxsKHRoaXMsbikmJiFpc05hTigrbi5zbGljZSgxKSkmJih0aGlzW25dPWUpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5kb25lPSEwO3ZhciB0PXRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT10LnR5cGUpdGhyb3cgdC5hcmc7cmV0dXJuIHRoaXMucnZhbH0sZGlzcGF0Y2hFeGNlcHRpb246ZnVuY3Rpb24odCl7aWYodGhpcy5kb25lKXRocm93IHQ7dmFyIG49dGhpcztmdW5jdGlvbiBvKHIsbyl7cmV0dXJuIHMudHlwZT0idGhyb3ciLHMuYXJnPXQsbi5uZXh0PXIsbyYmKG4ubWV0aG9kPSJuZXh0IixuLmFyZz1lKSwhIW99Zm9yKHZhciBpPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtpPj0wOy0taSl7dmFyIGE9dGhpcy50cnlFbnRyaWVzW2ldLHM9YS5jb21wbGV0aW9uO2lmKCJyb290Ij09PWEudHJ5TG9jKXJldHVybiBvKCJlbmQiKTtpZihhLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgdT1yLmNhbGwoYSwiY2F0Y2hMb2MiKSxjPXIuY2FsbChhLCJmaW5hbGx5TG9jIik7aWYodSYmYyl7aWYodGhpcy5wcmV2PGEuY2F0Y2hMb2MpcmV0dXJuIG8oYS5jYXRjaExvYywhMCk7aWYodGhpcy5wcmV2PGEuZmluYWxseUxvYylyZXR1cm4gbyhhLmZpbmFsbHlMb2MpfWVsc2UgaWYodSl7aWYodGhpcy5wcmV2PGEuY2F0Y2hMb2MpcmV0dXJuIG8oYS5jYXRjaExvYywhMCl9ZWxzZXtpZighYyl0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PGEuZmluYWxseUxvYylyZXR1cm4gbyhhLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO24+PTA7LS1uKXt2YXIgbz10aGlzLnRyeUVudHJpZXNbbl07aWYoby50cnlMb2M8PXRoaXMucHJldiYmci5jYWxsKG8sImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PG8uZmluYWxseUxvYyl7dmFyIGk9bzticmVha319aSYmKCJicmVhayI9PT10fHwiY29udGludWUiPT09dCkmJmkudHJ5TG9jPD1lJiZlPD1pLmZpbmFsbHlMb2MmJihpPW51bGwpO3ZhciBhPWk/aS5jb21wbGV0aW9uOnt9O3JldHVybiBhLnR5cGU9dCxhLmFyZz1lLGk/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9aS5maW5hbGx5TG9jLGcpOnRoaXMuY29tcGxldGUoYSl9LGNvbXBsZXRlOmZ1bmN0aW9uKHQsZSl7aWYoInRocm93Ij09PXQudHlwZSl0aHJvdyB0LmFyZztyZXR1cm4iYnJlYWsiPT09dC50eXBlfHwiY29udGludWUiPT09dC50eXBlP3RoaXMubmV4dD10LmFyZzoicmV0dXJuIj09PXQudHlwZT8odGhpcy5ydmFsPXRoaXMuYXJnPXQuYXJnLHRoaXMubWV0aG9kPSJyZXR1cm4iLHRoaXMubmV4dD0iZW5kIik6Im5vcm1hbCI9PT10LnR5cGUmJmUmJih0aGlzLm5leHQ9ZSksZ30sZmluaXNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7ZT49MDstLWUpe3ZhciBuPXRoaXMudHJ5RW50cmllc1tlXTtpZihuLmZpbmFsbHlMb2M9PT10KXJldHVybiB0aGlzLmNvbXBsZXRlKG4uY29tcGxldGlvbixuLmFmdGVyTG9jKSxBKG4pLGd9fSxjYXRjaDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2U+PTA7LS1lKXt2YXIgbj10aGlzLnRyeUVudHJpZXNbZV07aWYobi50cnlMb2M9PT10KXt2YXIgcj1uLmNvbXBsZXRpb247aWYoInRocm93Ij09PXIudHlwZSl7dmFyIG89ci5hcmc7QShuKX1yZXR1cm4gb319dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbih0LG4scil7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOkModCkscmVzdWx0TmFtZTpuLG5leHRMb2M6cn0sIm5leHQiPT09dGhpcy5tZXRob2QmJih0aGlzLmFyZz1lKSxnfX0sdH0odC5leHBvcnRzKTt0cnl7cmVnZW5lcmF0b3JSdW50aW1lPXJ9Y2F0Y2godCl7RnVuY3Rpb24oInIiLCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocil9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQ5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjUwKSxvPUZ1bmN0aW9uLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5iaW5kO3JldHVybiB0PT09b3x8dCBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZlPT09by5iaW5kP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDI1MSk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkZ1bmN0aW9uIikuYmluZH0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiRnVuY3Rpb24iLHByb3RvOiEwfSx7YmluZDpuKDkxKX0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjUzKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExNiksbigyNTkpLG4oMjYwKSxuKDI2MSksbigyNjIpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByLG8saSxhLHM9bigwKSx1PW4oMjcpLGM9big0KSxsPW4oMSksZj1uKDExNykscD1uKDM1KSxoPW4oMTE4KSxkPW4oMjgpLGc9bigyNTUpLHY9big2KSx5PW4oMjIpLG09bigxMTkpLGI9bigyNikseD1uKDU5KSx3PW4oMTEzKSxrPW4oMTIwKSxTPW4oMTIxKS5zZXQsRT1uKDI1NiksVD1uKDEyMiksaj1uKDI1NyksQT1uKDUyKSxPPW4oNjApLEM9big3OSksTD1uKDQ5KSxSPW4oODcpLFA9bigyKSgic3BlY2llcyIpLE49IlByb21pc2UiLEk9TC5nZXQsRD1MLnNldCxfPUwuZ2V0dGVyRm9yKE4pLE09ZixVPWMuVHlwZUVycm9yLEI9Yy5kb2N1bWVudCxxPWMucHJvY2VzcyxGPWMuZmV0Y2gsSD1xJiZxLnZlcnNpb25zLHo9SCYmSC52OHx8IiIsVz1BLmYsJD1XLFk9InByb2Nlc3MiPT1iKHEpLFY9ISEoQiYmQi5jcmVhdGVFdmVudCYmYy5kaXNwYXRjaEV2ZW50KSxHPVIoTixmdW5jdGlvbigpe3ZhciB0PU0ucmVzb2x2ZSgxKSxlPWZ1bmN0aW9uKCl7fSxuPSh0LmNvbnN0cnVjdG9yPXt9KVtQXT1mdW5jdGlvbih0KXt0KGUsZSl9O3JldHVybiEoKFl8fCJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpJiYoIXV8fHQuZmluYWxseSkmJnQudGhlbihlKWluc3RhbmNlb2YgbiYmMCE9PXouaW5kZXhPZigiNi42IikmJi0xPT09Qy5pbmRleE9mKCJDaHJvbWUvNjYiKSl9KSxLPUd8fCF3KGZ1bmN0aW9uKHQpe00uYWxsKHQpLmNhdGNoKGZ1bmN0aW9uKCl7fSl9KSxYPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiEoIXYodCl8fCJmdW5jdGlvbiIhPXR5cGVvZihlPXQudGhlbikpJiZlfSxKPWZ1bmN0aW9uKHQsZSxuKXtpZighZS5ub3RpZmllZCl7ZS5ub3RpZmllZD0hMDt2YXIgcj1lLnJlYWN0aW9ucztFKGZ1bmN0aW9uKCl7Zm9yKHZhciBvPWUudmFsdWUsaT0xPT1lLnN0YXRlLGE9MDtyLmxlbmd0aD5hOyl7dmFyIHMsdSxjLGw9clthKytdLGY9aT9sLm9rOmwuZmFpbCxwPWwucmVzb2x2ZSxoPWwucmVqZWN0LGQ9bC5kb21haW47dHJ5e2Y/KGl8fCgyPT09ZS5yZWplY3Rpb24mJmV0KHQsZSksZS5yZWplY3Rpb249MSksITA9PT1mP3M9bzooZCYmZC5lbnRlcigpLHM9ZihvKSxkJiYoZC5leGl0KCksYz0hMCkpLHM9PT1sLnByb21pc2U/aChVKCJQcm9taXNlLWNoYWluIGN5Y2xlIikpOih1PVgocykpP3UuY2FsbChzLHAsaCk6cChzKSk6aChvKX1jYXRjaCh0KXtkJiYhYyYmZC5leGl0KCksaCh0KX19ZS5yZWFjdGlvbnM9W10sZS5ub3RpZmllZD0hMSxuJiYhZS5yZWplY3Rpb24mJloodCxlKX0pfX0sUT1mdW5jdGlvbih0LGUsbil7dmFyIHIsbztWPygocj1CLmNyZWF0ZUV2ZW50KCJFdmVudCIpKS5wcm9taXNlPWUsci5yZWFzb249bixyLmluaXRFdmVudCh0LCExLCEwKSxjLmRpc3BhdGNoRXZlbnQocikpOnI9e3Byb21pc2U6ZSxyZWFzb246bn0sKG89Y1sib24iK3RdKT9vKHIpOiJ1bmhhbmRsZWRyZWplY3Rpb24iPT09dCYmaigiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIixuKX0sWj1mdW5jdGlvbih0LGUpe1MuY2FsbChjLGZ1bmN0aW9uKCl7dmFyIG4scj1lLnZhbHVlO2lmKHR0KGUpJiYobj1PKGZ1bmN0aW9uKCl7WT9xLmVtaXQoInVuaGFuZGxlZFJlamVjdGlvbiIscix0KTpRKCJ1bmhhbmRsZWRyZWplY3Rpb24iLHQscil9KSxlLnJlamVjdGlvbj1ZfHx0dChlKT8yOjEsbi5lcnJvcikpdGhyb3cgbi52YWx1ZX0pfSx0dD1mdW5jdGlvbih0KXtyZXR1cm4gMSE9PXQucmVqZWN0aW9uJiYhdC5wYXJlbnR9LGV0PWZ1bmN0aW9uKHQsZSl7Uy5jYWxsKGMsZnVuY3Rpb24oKXtZP3EuZW1pdCgicmVqZWN0aW9uSGFuZGxlZCIsdCk6USgicmVqZWN0aW9uaGFuZGxlZCIsdCxlLnZhbHVlKX0pfSxudD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gZnVuY3Rpb24obyl7dChlLG4sbyxyKX19LHJ0PWZ1bmN0aW9uKHQsZSxuLHIpe2UuZG9uZXx8KGUuZG9uZT0hMCxyJiYoZT1yKSxlLnZhbHVlPW4sZS5zdGF0ZT0yLEoodCxlLCEwKSl9LG90PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCFlLmRvbmUpe2UuZG9uZT0hMCxyJiYoZT1yKTt0cnl7aWYodD09PW4pdGhyb3cgVSgiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTt2YXIgbz1YKG4pO28/RShmdW5jdGlvbigpe3ZhciByPXtkb25lOiExfTt0cnl7by5jYWxsKG4sbnQob3QsdCxyLGUpLG50KHJ0LHQscixlKSl9Y2F0Y2gobil7cnQodCxyLG4sZSl9fSk6KGUudmFsdWU9bixlLnN0YXRlPTEsSih0LGUsITEpKX1jYXRjaChuKXtydCh0LHtkb25lOiExfSxuLGUpfX19O0cmJihNPWZ1bmN0aW9uKHQpe20odGhpcyxNLE4pLHkodCksci5jYWxsKHRoaXMpO3ZhciBlPUkodGhpcyk7dHJ5e3QobnQob3QsdGhpcyxlKSxudChydCx0aGlzLGUpKX1jYXRjaCh0KXtydCh0aGlzLGUsdCl9fSwocj1mdW5jdGlvbih0KXtEKHRoaXMse3R5cGU6Tixkb25lOiExLG5vdGlmaWVkOiExLHBhcmVudDohMSxyZWFjdGlvbnM6W10scmVqZWN0aW9uOiExLHN0YXRlOjAsdmFsdWU6dm9pZCAwfSl9KS5wcm90b3R5cGU9aChNLnByb3RvdHlwZSx7dGhlbjpmdW5jdGlvbih0LGUpe3ZhciBuPV8odGhpcykscj1XKGsodGhpcyxNKSk7cmV0dXJuIHIub2s9ImZ1bmN0aW9uIiE9dHlwZW9mIHR8fHQsci5mYWlsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLHIuZG9tYWluPVk/cS5kb21haW46dm9pZCAwLG4ucGFyZW50PSEwLG4ucmVhY3Rpb25zLnB1c2gociksMCE9bi5zdGF0ZSYmSih0aGlzLG4sITEpLHIucHJvbWlzZX0sY2F0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGhlbih2b2lkIDAsdCl9fSksbz1mdW5jdGlvbigpe3ZhciB0PW5ldyByLGU9SSh0KTt0aGlzLnByb21pc2U9dCx0aGlzLnJlc29sdmU9bnQob3QsdCxlKSx0aGlzLnJlamVjdD1udChydCx0LGUpfSxBLmY9Vz1mdW5jdGlvbih0KXtyZXR1cm4gdD09PU18fHQ9PT1pP25ldyBvKHQpOiQodCl9LHV8fCJmdW5jdGlvbiIhPXR5cGVvZiBmfHwoYT1mLnByb3RvdHlwZS50aGVuLHAoZi5wcm90b3R5cGUsInRoZW4iLGZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gbmV3IE0oZnVuY3Rpb24odCxlKXthLmNhbGwobix0LGUpfSkudGhlbih0LGUpfSksImZ1bmN0aW9uIj09dHlwZW9mIEYmJnMoe2dsb2JhbDohMCxlbnVtZXJhYmxlOiEwLGZvcmNlZDohMH0se2ZldGNoOmZ1bmN0aW9uKHQpe3JldHVybiBUKE0sRi5hcHBseShjLGFyZ3VtZW50cykpfX0pKSkscyh7Z2xvYmFsOiEwLHdyYXA6ITAsZm9yY2VkOkd9LHtQcm9taXNlOk19KSxkKE0sTiwhMSwhMCksZyhOKSxpPWwuUHJvbWlzZSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDpHfSx7cmVqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPVcodGhpcyk7cmV0dXJuIGUucmVqZWN0LmNhbGwodm9pZCAwLHQpLGUucHJvbWlzZX19KSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDp1fHxHfSx7cmVzb2x2ZTpmdW5jdGlvbih0KXtyZXR1cm4gVCh1JiZ0aGlzPT09aT9NOnRoaXMsdCl9fSkscyh7dGFyZ2V0Ok4sc3RhdDohMCxmb3JjZWQ6S30se2FsbDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49VyhlKSxyPW4ucmVzb2x2ZSxvPW4ucmVqZWN0LGk9TyhmdW5jdGlvbigpe3ZhciBuPXkoZS5yZXNvbHZlKSxpPVtdLGE9MCxzPTE7eCh0LGZ1bmN0aW9uKHQpe3ZhciB1PWErKyxjPSExO2kucHVzaCh2b2lkIDApLHMrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe2N8fChjPSEwLGlbdV09dCwtLXN8fHIoaSkpfSxvKX0pLC0tc3x8cihpKX0pO3JldHVybiBpLmVycm9yJiZvKGkudmFsdWUpLG4ucHJvbWlzZX0scmFjZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49VyhlKSxyPW4ucmVqZWN0LG89TyhmdW5jdGlvbigpe3ZhciBvPXkoZS5yZXNvbHZlKTt4KHQsZnVuY3Rpb24odCl7by5jYWxsKGUsdCkudGhlbihuLnJlc29sdmUscil9KX0pO3JldHVybiBvLmVycm9yJiZyKG8udmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMyKSxvPW4oMjMpLGk9bigyKSxhPW4oMTMpLHM9aSgic3BlY2llcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1yKHQpLG49by5mO2EmJmUmJiFlW3NdJiZuKGUscyx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzfX0pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHMsdSxjLGw9big0KSxmPW4oNDQpLmYscD1uKDI2KSxoPW4oMTIxKS5zZXQsZD1uKDc5KSxnPWwuTXV0YXRpb25PYnNlcnZlcnx8bC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHY9bC5wcm9jZXNzLHk9bC5Qcm9taXNlLG09InByb2Nlc3MiPT1wKHYpLGI9ZihsLCJxdWV1ZU1pY3JvdGFzayIpLHg9YiYmYi52YWx1ZTt4fHwocj1mdW5jdGlvbigpe3ZhciB0LGU7Zm9yKG0mJih0PXYuZG9tYWluKSYmdC5leGl0KCk7bzspe2U9by5mbixvPW8ubmV4dDt0cnl7ZSgpfWNhdGNoKHQpe3Rocm93IG8/YSgpOmk9dm9pZCAwLHR9fWk9dm9pZCAwLHQmJnQuZW50ZXIoKX0sbT9hPWZ1bmN0aW9uKCl7di5uZXh0VGljayhyKX06ZyYmIS8oaXBob25lfGlwb2R8aXBhZCkuKmFwcGxld2Via2l0L2kudGVzdChkKT8ocz0hMCx1PWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxuZXcgZyhyKS5vYnNlcnZlKHUse2NoYXJhY3RlckRhdGE6ITB9KSxhPWZ1bmN0aW9uKCl7dS5kYXRhPXM9IXN9KTp5JiZ5LnJlc29sdmU/KGM9eS5yZXNvbHZlKHZvaWQgMCksYT1mdW5jdGlvbigpe2MudGhlbihyKX0pOmE9ZnVuY3Rpb24oKXtoLmNhbGwobCxyKX0pLHQuZXhwb3J0cz14fHxmdW5jdGlvbih0KXt2YXIgZT17Zm46dCxuZXh0OnZvaWQgMH07aSYmKGkubmV4dD1lKSxvfHwobz1lLGEoKSksaT1lfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49ci5jb25zb2xlO24mJm4uZXJyb3ImJigxPT09YXJndW1lbnRzLmxlbmd0aD9uLmVycm9yKHQpOm4uZXJyb3IodCxlKSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDI3KSxpPW4oMTE3KSxhPW4oMzIpLHM9bigxMjApLHU9bigxMjIpLGM9bigzNSk7cih7dGFyZ2V0OiJQcm9taXNlIixwcm90bzohMCxyZWFsOiEwfSx7ZmluYWxseTpmdW5jdGlvbih0KXt2YXIgZT1zKHRoaXMsYSgiUHJvbWlzZSIpKSxuPSJmdW5jdGlvbiI9PXR5cGVvZiB0O3JldHVybiB0aGlzLnRoZW4obj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBufSl9OnQsbj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3Rocm93IG59KX06dCl9fSksb3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGl8fGkucHJvdG90eXBlLmZpbmFsbHl8fGMoaS5wcm90b3R5cGUsImZpbmFsbHkiLGEoIlByb21pc2UiKS5wcm90b3R5cGUuZmluYWxseSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0OCksaT1uKDc0KSxhPW4oNDYpLHM9bigzMCksdT1uKDU5KSxjPW4oMTcpLGw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKCEobiBpbnN0YW5jZW9mIGwpKXJldHVybiBuZXcgbCh0LGUpO2kmJihuPWkobmV3IEVycm9yKGUpLG8obikpKTt2YXIgcj1bXTtyZXR1cm4gdSh0LHIucHVzaCxyKSxjKG4sImVycm9ycyIsciksdm9pZCAwIT09ZSYmYyhuLCJtZXNzYWdlIixTdHJpbmcoZSkpLG59O2wucHJvdG90eXBlPWEoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3RvcjpzKDUsbCksbmFtZTpzKDUsIkFnZ3JlZ2F0ZUVycm9yIil9KSxyKHtnbG9iYWw6ITB9LHtBZ2dyZWdhdGVFcnJvcjpsfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDEyMyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNTIpLGk9big2MCk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7dHJ5OmZ1bmN0aW9uKHQpe3ZhciBlPW8uZih0aGlzKSxuPWkodCk7cmV0dXJuKG4uZXJyb3I/ZS5yZWplY3Q6ZS5yZXNvbHZlKShuLnZhbHVlKSxlLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjIpLGk9bigzMiksYT1uKDUyKSxzPW4oNjApLHU9big1OSk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YW55OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hLmYoZSkscj1uLnJlc29sdmUsYz1uLnJlamVjdCxsPXMoZnVuY3Rpb24oKXt2YXIgbj1vKGUucmVzb2x2ZSksYT1bXSxzPTAsbD0xLGY9ITE7dSh0LGZ1bmN0aW9uKHQpe3ZhciBvPXMrKyx1PSExO2EucHVzaCh2b2lkIDApLGwrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe3V8fGZ8fChmPSEwLHIodCkpfSxmdW5jdGlvbih0KXt1fHxmfHwodT0hMCxhW29dPXQsLS1sfHxjKG5ldyhpKCJBZ2dyZWdhdGVFcnJvciIpKShhLCJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCIpKSl9KX0pLC0tbHx8YyhuZXcoaSgiQWdncmVnYXRlRXJyb3IiKSkoYSwiTm8gb25lIHByb21pc2UgcmVzb2x2ZWQiKSl9KTtyZXR1cm4gbC5lcnJvciYmYyhsLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTYpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiBuJiZ0KGUucHJvdG90eXBlLG4pLHImJnQoZSxyKSxlfX0oKSxvPWZ1bmN0aW9uKHQpe2lmKHQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgZT17fTtpZihudWxsIT10KWZvcih2YXIgbiBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiYoZVtuXT10W25dKTtyZXR1cm4gZS5kZWZhdWx0PXQsZX0obigyNjUpKSxpPXAobigyNjYpKSxhPXAobigyNjcpKSxzPXAobigyNjgpKSx1PXAobigyNjkpKSxjPXAobigyNzApKSxsPXAobigyNzEpKSxmPXAobigyNzIpKTtmdW5jdGlvbiBwKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX12YXIgaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9OyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLHQpLHRoaXMudHlwZT0ibGFuZ3VhZ2VEZXRlY3RvciIsdGhpcy5kZXRlY3RvcnM9e30sdGhpcy5pbml0KGUsbil9cmV0dXJuIHIodCxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O3RoaXMuc2VydmljZXM9dCx0aGlzLm9wdGlvbnM9by5kZWZhdWx0cyhlLHRoaXMub3B0aW9uc3x8e30se29yZGVyOlsicXVlcnlzdHJpbmciLCJjb29raWUiLCJsb2NhbFN0b3JhZ2UiLCJuYXZpZ2F0b3IiLCJodG1sVGFnIl0sbG9va3VwUXVlcnlzdHJpbmc6ImxuZyIsbG9va3VwQ29va2llOiJpMThuZXh0Iixsb29rdXBMb2NhbFN0b3JhZ2U6ImkxOG5leHRMbmciLGNhY2hlczpbImxvY2FsU3RvcmFnZSJdLGV4Y2x1ZGVDYWNoZUZvcjpbImNpbW9kZSJdfSksdGhpcy5vcHRpb25zLmxvb2t1cEZyb21VcmxJbmRleCYmKHRoaXMub3B0aW9ucy5sb29rdXBGcm9tUGF0aEluZGV4PXRoaXMub3B0aW9ucy5sb29rdXBGcm9tVXJsSW5kZXgpLHRoaXMuaTE4bk9wdGlvbnM9bix0aGlzLmFkZERldGVjdG9yKGkuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihhLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3Iocy5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKHUuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihjLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IobC5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGYuZGVmYXVsdCl9fSx7a2V5OiJhZGREZXRlY3RvciIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZXRlY3RvcnNbdC5uYW1lXT10fX0se2tleToiZGV0ZWN0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzO3R8fCh0PXRoaXMub3B0aW9ucy5vcmRlcik7dmFyIG49W107dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKGUuZGV0ZWN0b3JzW3RdKXt2YXIgcj1lLmRldGVjdG9yc1t0XS5sb29rdXAoZS5vcHRpb25zKTtyJiYic3RyaW5nIj09dHlwZW9mIHImJihyPVtyXSksciYmKG49bi5jb25jYXQocikpfX0pO3ZhciByPXZvaWQgMDtpZihuLmZvckVhY2goZnVuY3Rpb24odCl7aWYoIXIpe3ZhciBuPWUuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5mb3JtYXRMYW5ndWFnZUNvZGUodCk7ZS5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmlzV2hpdGVsaXN0ZWQobikmJihyPW4pfX0pLCFyKXt2YXIgbz10aGlzLmkxOG5PcHRpb25zLmZhbGxiYWNrTG5nOyJzdHJpbmciPT10eXBlb2YgbyYmKG89W29dKSxvfHwobz1bXSkscj0iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShvKT9vWzBdOm9bMF18fG8uZGVmYXVsdCYmby5kZWZhdWx0WzBdfXJldHVybiByfX0se2tleToiY2FjaGVVc2VyTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztlfHwoZT10aGlzLm9wdGlvbnMuY2FjaGVzKSxlJiYodGhpcy5vcHRpb25zLmV4Y2x1ZGVDYWNoZUZvciYmdGhpcy5vcHRpb25zLmV4Y2x1ZGVDYWNoZUZvci5pbmRleE9mKHQpPi0xfHxlLmZvckVhY2goZnVuY3Rpb24oZSl7bi5kZXRlY3RvcnNbZV0mJm4uZGV0ZWN0b3JzW2VdLmNhY2hlVXNlckxhbmd1YWdlKHQsbi5vcHRpb25zKX0pKX19XSksdH0oKTtoLnR5cGU9Imxhbmd1YWdlRGV0ZWN0b3IiLGUuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHRzPWZ1bmN0aW9uKHQpe3JldHVybiBvLmNhbGwoaS5jYWxsKGFyZ3VtZW50cywxKSxmdW5jdGlvbihlKXtpZihlKWZvcih2YXIgbiBpbiBlKXZvaWQgMD09PXRbbl0mJih0W25dPWVbbl0pfSksdH0sZS5leHRlbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG8uY2FsbChpLmNhbGwoYXJndW1lbnRzLDEpLGZ1bmN0aW9uKGUpe2lmKGUpZm9yKHZhciBuIGluIGUpdFtuXT1lW25dfSksdH07dmFyIHI9W10sbz1yLmZvckVhY2gsaT1yLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgbz12b2lkIDA7aWYobil7dmFyIGk9bmV3IERhdGU7aS5zZXRUaW1lKGkuZ2V0VGltZSgpKzYwKm4qMWUzKSxvPSI7IGV4cGlyZXM9IitpLnRvR01UU3RyaW5nKCl9ZWxzZSBvPSIiO3I9cj8iZG9tYWluPSIrcisiOyI6IiIsZG9jdW1lbnQuY29va2llPXQrIj0iK2UrbysiOyIrcisicGF0aD0vIn0sbz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dCsiPSIsbj1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKSxyPTA7cjxuLmxlbmd0aDtyKyspe2Zvcih2YXIgbz1uW3JdOyIgIj09PW8uY2hhckF0KDApOylvPW8uc3Vic3RyaW5nKDEsby5sZW5ndGgpO2lmKDA9PT1vLmluZGV4T2YoZSkpcmV0dXJuIG8uc3Vic3RyaW5nKGUubGVuZ3RoLG8ubGVuZ3RoKX1yZXR1cm4gbnVsbH07ZS5kZWZhdWx0PXtuYW1lOiJjb29raWUiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYodC5sb29rdXBDb29raWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBuPW8odC5sb29rdXBDb29raWUpO24mJihlPW4pfXJldHVybiBlfSxjYWNoZVVzZXJMYW5ndWFnZTpmdW5jdGlvbih0LGUpe2UubG9va3VwQ29va2llJiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZyKGUubG9va3VwQ29va2llLHQsZS5jb29raWVNaW51dGVzLGUuY29va2llRG9tYWluKX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6InF1ZXJ5c3RyaW5nIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KWZvcih2YXIgbj13aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdCgiJiIpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXS5pbmRleE9mKCI9Iik7aWYobz4wKW5bcl0uc3Vic3RyaW5nKDAsbyk9PT10Lmxvb2t1cFF1ZXJ5c3RyaW5nJiYoZT1uW3JdLnN1YnN0cmluZyhvKzEpKX1yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj12b2lkIDA7dHJ5e3I9InVuZGVmaW5lZCIhPT13aW5kb3cmJm51bGwhPT13aW5kb3cubG9jYWxTdG9yYWdlO3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiaTE4bmV4dC50cmFuc2xhdGUuYm9vIiwiZm9vIiksd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJpMThuZXh0LnRyYW5zbGF0ZS5ib28iKX1jYXRjaCh0KXtyPSExfWUuZGVmYXVsdD17bmFtZToibG9jYWxTdG9yYWdlIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKHQubG9va3VwTG9jYWxTdG9yYWdlJiZyKXt2YXIgbj13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odC5sb29rdXBMb2NhbFN0b3JhZ2UpO24mJihlPW4pfXJldHVybiBlfSxjYWNoZVVzZXJMYW5ndWFnZTpmdW5jdGlvbih0LGUpe2UubG9va3VwTG9jYWxTdG9yYWdlJiZyJiZ3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oZS5sb29rdXBMb2NhbFN0b3JhZ2UsdCl9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJuYXZpZ2F0b3IiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT1bXTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvcil7aWYobmF2aWdhdG9yLmxhbmd1YWdlcylmb3IodmFyIG49MDtuPG5hdmlnYXRvci5sYW5ndWFnZXMubGVuZ3RoO24rKyllLnB1c2gobmF2aWdhdG9yLmxhbmd1YWdlc1tuXSk7bmF2aWdhdG9yLnVzZXJMYW5ndWFnZSYmZS5wdXNoKG5hdmlnYXRvci51c2VyTGFuZ3VhZ2UpLG5hdmlnYXRvci5sYW5ndWFnZSYmZS5wdXNoKG5hdmlnYXRvci5sYW5ndWFnZSl9cmV0dXJuIGUubGVuZ3RoPjA/ZTp2b2lkIDB9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJodG1sVGFnIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwLG49dC5odG1sVGFnfHwoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6bnVsbCk7cmV0dXJuIG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLmdldEF0dHJpYnV0ZSYmKGU9bi5nZXRBdHRyaWJ1dGUoImxhbmciKSksZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6InBhdGgiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpe3ZhciBuPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXC8oW2EtekEtWi1dKikvZyk7aWYobiBpbnN0YW5jZW9mIEFycmF5KWlmKCJudW1iZXIiPT10eXBlb2YgdC5sb29rdXBGcm9tUGF0aEluZGV4KXtpZigic3RyaW5nIiE9dHlwZW9mIG5bdC5sb29rdXBGcm9tUGF0aEluZGV4XSlyZXR1cm47ZT1uW3QubG9va3VwRnJvbVBhdGhJbmRleF0ucmVwbGFjZSgiLyIsIiIpfWVsc2UgZT1uWzBdLnJlcGxhY2UoIi8iLCIiKX1yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6InN1YmRvbWFpbiIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7dmFyIG49d2luZG93LmxvY2F0aW9uLmhyZWYubWF0Y2goLyg/Omh0dHBbc10qXDpcL1wvKSooLio/KVwuKD89W15cL10qXC4uezIsNX0pL2dpKTtuIGluc3RhbmNlb2YgQXJyYXkmJihlPSJudW1iZXIiPT10eXBlb2YgdC5sb29rdXBGcm9tU3ViZG9tYWluSW5kZXg/blt0Lmxvb2t1cEZyb21TdWJkb21haW5JbmRleF0ucmVwbGFjZSgiaHR0cDovLyIsIiIpLnJlcGxhY2UoImh0dHBzOi8vIiwiIikucmVwbGFjZSgiLiIsIiIpOm5bMF0ucmVwbGFjZSgiaHR0cDovLyIsIiIpLnJlcGxhY2UoImh0dHBzOi8vIiwiIikucmVwbGFjZSgiLiIsIiIpKX1yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNzQpLG89bigxMjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihyKHQpKXJldHVybiBvKHQpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3NSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMjUpLG89bigyNzgpLGk9bigxMDIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT1pJiZvKE9iamVjdCh0KSkpcmV0dXJuIHIodCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTEwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3OSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDUwKSxuKDM0KSx0LmV4cG9ydHM9bigyODApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3Niksbz1uKDIpLGk9bigyOSksYT1vKCJpdGVyYXRvciIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3QodCk7cmV0dXJuIHZvaWQgMCE9PWVbYV18fCJAQGl0ZXJhdG9yImluIGV8fGkuaGFzT3duUHJvcGVydHkocihlKSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMjUpLG89bigyODIpLGk9bigxMjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gaSh0LGUpO3ZhciBhPW8obj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTtyZXR1cm4iT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSksIk1hcCI9PT1hfHwiU2V0Ij09PWE/cih0KToiQXJndW1lbnRzIj09PWF8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGEpP2kodCxlKTp2b2lkIDB9fX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4Myl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTQpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4Nil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI4Nyksbz1uKDI4OSksaT1BcnJheS5wcm90b3R5cGUsYT1TdHJpbmcucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmluY2x1ZGVzO3JldHVybiB0PT09aXx8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09aS5pbmNsdWRlcz9yOiJzdHJpbmciPT10eXBlb2YgdHx8dD09PWF8fHQgaW5zdGFuY2VvZiBTdHJpbmcmJmU9PT1hLmluY2x1ZGVzP286ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDI4OCk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkFycmF5IikuaW5jbHVkZXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNjcpLmluY2x1ZGVzLGk9big3Nyk7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITB9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImluY2x1ZGVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDI5MCk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIlN0cmluZyIpLmluY2x1ZGVzfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDI5MSksaT1uKDQ1KTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOiFuKDI5MykoImluY2x1ZGVzIil9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4hIX5TdHJpbmcoaSh0aGlzKSkuaW5kZXhPZihvKHQpLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjkyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYocih0KSl0aHJvdyBUeXBlRXJyb3IoIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9ucyIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz1uKDI2KSxpPW4oMikoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiByKHQpJiYodm9pZCAwIT09KGU9dFtpXSk/ISFlOiJSZWdFeHAiPT1vKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIpKCJtYXRjaCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0vLi87dHJ5eyIvLi8iW3RdKGUpfWNhdGNoKG4pe3RyeXtyZXR1cm4gZVtyXT0hMSwiLy4vIlt0XShlKX1jYXRjaCh0KXt9fXJldHVybiExfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7Ci8qIQogKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci4KICoKICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+CiAqIEBsaWNlbnNlICBNSVQKICovCnZhciByPW4oMjk1KSxvPW4oMjk2KSxpPW4oMjk3KTtmdW5jdGlvbiBhKCl7cmV0dXJuIHUuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gcyh0LGUpe2lmKGEoKTxlKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiB1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9bmV3IFVpbnQ4QXJyYXkoZSkpLl9fcHJvdG9fXz11LnByb3RvdHlwZToobnVsbD09PXQmJih0PW5ldyB1KGUpKSx0Lmxlbmd0aD1lKSx0fWZ1bmN0aW9uIHUodCxlLG4pe2lmKCEodS5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgdSkpcmV0dXJuIG5ldyB1KHQsZSxuKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGYodGhpcyx0KX1yZXR1cm4gYyh0aGlzLHQsZSxuKX1mdW5jdGlvbiBjKHQsZSxuLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKHQsZSxuLHIpe2lmKGUuYnl0ZUxlbmd0aCxuPDB8fGUuYnl0ZUxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYoZS5ieXRlTGVuZ3RoPG4rKHJ8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7ZT12b2lkIDA9PT1uJiZ2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KGUpOnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkoZSxuKTpuZXcgVWludDhBcnJheShlLG4scik7dS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PWUpLl9fcHJvdG9fXz11LnByb3RvdHlwZTp0PXAodCxlKTtyZXR1cm4gdH0odCxlLG4scik6InN0cmluZyI9PXR5cGVvZiBlP2Z1bmN0aW9uKHQsZSxuKXsic3RyaW5nIj09dHlwZW9mIG4mJiIiIT09bnx8KG49InV0ZjgiKTtpZighdS5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciByPTB8ZChlLG4pLG89KHQ9cyh0LHIpKS53cml0ZShlLG4pO28hPT1yJiYodD10LnNsaWNlKDAsbykpO3JldHVybiB0fSh0LGUsbik6ZnVuY3Rpb24odCxlKXtpZih1LmlzQnVmZmVyKGUpKXt2YXIgbj0wfGgoZS5sZW5ndGgpO3JldHVybiAwPT09KHQ9cyh0LG4pKS5sZW5ndGg/dDooZS5jb3B5KHQsMCwwLG4pLHQpfWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwocj1lLmxlbmd0aCkhPXI/cyh0LDApOnAodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmaShlLmRhdGEpKXJldHVybiBwKHQsZS5kYXRhKX12YXIgcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gbCh0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGYodCxlKXtpZihsKGUpLHQ9cyh0LGU8MD8wOjB8aChlKSksIXUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIG49MDtuPGU7KytuKXRbbl09MDtyZXR1cm4gdH1mdW5jdGlvbiBwKHQsZSl7dmFyIG49ZS5sZW5ndGg8MD8wOjB8aChlLmxlbmd0aCk7dD1zKHQsbik7Zm9yKHZhciByPTA7cjxuO3IrPTEpdFtyXT0yNTUmZVtyXTtyZXR1cm4gdH1mdW5jdGlvbiBoKHQpe2lmKHQ+PWEoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrYSgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBkKHQsZSl7aWYodS5pc0J1ZmZlcih0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIG49dC5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIDA7Zm9yKHZhciByPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIG47Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gRih0KS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKm47Y2FzZSJoZXgiOnJldHVybiBuPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIEgodCkubGVuZ3RoO2RlZmF1bHQ6aWYocilyZXR1cm4gRih0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiBnKHQsZSxuKXt2YXIgcj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09bnx8bj50aGlzLmxlbmd0aCkmJihuPXRoaXMubGVuZ3RoKSxuPD0wKXJldHVybiIiO2lmKChuPj4+PTApPD0oZT4+Pj0wKSlyZXR1cm4iIjtmb3IodHx8KHQ9InV0ZjgiKTs7KXN3aXRjaCh0KXtjYXNlImhleCI6cmV0dXJuIEwodGhpcyxlLG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIGoodGhpcyxlLG4pO2Nhc2UiYXNjaWkiOnJldHVybiBPKHRoaXMsZSxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBDKHRoaXMsZSxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIFQodGhpcyxlLG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gUih0aGlzLGUsbik7ZGVmYXVsdDppZihyKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7dD0odCsiIikudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiB2KHQsZSxuKXt2YXIgcj10W2VdO3RbZV09dFtuXSx0W25dPXJ9ZnVuY3Rpb24geSh0LGUsbixyLG8pe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIG4/KHI9bixuPTApOm4+MjE0NzQ4MzY0Nz9uPTIxNDc0ODM2NDc6bjwtMjE0NzQ4MzY0OCYmKG49LTIxNDc0ODM2NDgpLG49K24saXNOYU4obikmJihuPW8/MDp0Lmxlbmd0aC0xKSxuPDAmJihuPXQubGVuZ3RoK24pLG4+PXQubGVuZ3RoKXtpZihvKXJldHVybi0xO249dC5sZW5ndGgtMX1lbHNlIGlmKG48MCl7aWYoIW8pcmV0dXJuLTE7bj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9dS5mcm9tKGUscikpLHUuaXNCdWZmZXIoZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTptKHQsZSxuLHIsbyk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsdS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9vP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUsbik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUsbik6bSh0LFtlXSxuLHIsbyk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gbSh0LGUsbixyLG8pe3ZhciBpLGE9MSxzPXQubGVuZ3RoLHU9ZS5sZW5ndGg7aWYodm9pZCAwIT09ciYmKCJ1Y3MyIj09PShyPVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PXJ8fCJ1dGYxNmxlIj09PXJ8fCJ1dGYtMTZsZSI9PT1yKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTthPTIscy89Mix1Lz0yLG4vPTJ9ZnVuY3Rpb24gYyh0LGUpe3JldHVybiAxPT09YT90W2VdOnQucmVhZFVJbnQxNkJFKGUqYSl9aWYobyl7dmFyIGw9LTE7Zm9yKGk9bjtpPHM7aSsrKWlmKGModCxpKT09PWMoZSwtMT09PWw/MDppLWwpKXtpZigtMT09PWwmJihsPWkpLGktbCsxPT09dSlyZXR1cm4gbCphfWVsc2UtMSE9PWwmJihpLT1pLWwpLGw9LTF9ZWxzZSBmb3Iobit1PnMmJihuPXMtdSksaT1uO2k+PTA7aS0tKXtmb3IodmFyIGY9ITAscD0wO3A8dTtwKyspaWYoYyh0LGkrcCkhPT1jKGUscCkpe2Y9ITE7YnJlYWt9aWYoZilyZXR1cm4gaX1yZXR1cm4tMX1mdW5jdGlvbiBiKHQsZSxuLHIpe249TnVtYmVyKG4pfHwwO3ZhciBvPXQubGVuZ3RoLW47cj8ocj1OdW1iZXIocikpPm8mJihyPW8pOnI9bzt2YXIgaT1lLmxlbmd0aDtpZihpJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7cj5pLzImJihyPWkvMik7Zm9yKHZhciBhPTA7YTxyOysrYSl7dmFyIHM9cGFyc2VJbnQoZS5zdWJzdHIoMiphLDIpLDE2KTtpZihpc05hTihzKSlyZXR1cm4gYTt0W24rYV09c31yZXR1cm4gYX1mdW5jdGlvbiB4KHQsZSxuLHIpe3JldHVybiB6KEYoZSx0Lmxlbmd0aC1uKSx0LG4scil9ZnVuY3Rpb24gdyh0LGUsbixyKXtyZXR1cm4geihmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7KytuKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KG4pKTtyZXR1cm4gZX0oZSksdCxuLHIpfWZ1bmN0aW9uIGsodCxlLG4scil7cmV0dXJuIHcodCxlLG4scil9ZnVuY3Rpb24gUyh0LGUsbixyKXtyZXR1cm4geihIKGUpLHQsbixyKX1mdW5jdGlvbiBFKHQsZSxuLHIpe3JldHVybiB6KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHIsbyxpPVtdLGE9MDthPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK2Epbj10LmNoYXJDb2RlQXQoYSkscj1uPj44LG89biUyNTYsaS5wdXNoKG8pLGkucHVzaChyKTtyZXR1cm4gaX0oZSx0Lmxlbmd0aC1uKSx0LG4scil9ZnVuY3Rpb24gVCh0LGUsbil7cmV0dXJuIDA9PT1lJiZuPT09dC5sZW5ndGg/ci5mcm9tQnl0ZUFycmF5KHQpOnIuZnJvbUJ5dGVBcnJheSh0LnNsaWNlKGUsbikpfWZ1bmN0aW9uIGoodCxlLG4pe249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciByPVtdLG89ZTtvPG47KXt2YXIgaSxhLHMsdSxjPXRbb10sbD1udWxsLGY9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihvK2Y8PW4pc3dpdGNoKGYpe2Nhc2UgMTpjPDEyOCYmKGw9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYoaT10W28rMV0pKSYmKHU9KDMxJmMpPDw2fDYzJmkpPjEyNyYmKGw9dSk7YnJlYWs7Y2FzZSAzOmk9dFtvKzFdLGE9dFtvKzJdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJmEpJiYodT0oMTUmYyk8PDEyfCg2MyZpKTw8Nnw2MyZhKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihsPXUpO2JyZWFrO2Nhc2UgNDppPXRbbysxXSxhPXRbbysyXSxzPXRbbyszXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZhKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmYyk8PDE4fCg2MyZpKTw8MTJ8KDYzJmEpPDw2fDYzJnMpPjY1NTM1JiZ1PDExMTQxMTImJihsPXUpfW51bGw9PT1sPyhsPTY1NTMzLGY9MSk6bD42NTUzNSYmKGwtPTY1NTM2LHIucHVzaChsPj4+MTAmMTAyM3w1NTI5NiksbD01NjMyMHwxMDIzJmwpLHIucHVzaChsKSxvKz1mfXJldHVybiBmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDtpZihlPD1BKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0KTt2YXIgbj0iIixyPTA7Zm9yKDtyPGU7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQuc2xpY2UocixyKz1BKSk7cmV0dXJuIG59KHIpfWUuQnVmZmVyPXUsZS5TbG93QnVmZmVyPWZ1bmN0aW9uKHQpeyt0IT10JiYodD0wKTtyZXR1cm4gdS5hbGxvYygrdCl9LGUuSU5TUEVDVF9NQVhfQllURVM9NTAsdS5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMCE9PXQuVFlQRURfQVJSQVlfU1VQUE9SVD90LlRZUEVEX0FSUkFZX1NVUFBPUlQ6ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIHQuX19wcm90b19fPXtfX3Byb3RvX186VWludDhBcnJheS5wcm90b3R5cGUsZm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX0sNDI9PT10LmZvbygpJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zdWJhcnJheSYmMD09PXQuc3ViYXJyYXkoMSwxKS5ieXRlTGVuZ3RofWNhdGNoKHQpe3JldHVybiExfX0oKSxlLmtNYXhMZW5ndGg9YSgpLHUucG9vbFNpemU9ODE5Mix1Ll9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz11LnByb3RvdHlwZSx0fSx1LmZyb209ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjKG51bGwsdCxlLG4pfSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQmJih1LnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsdS5fX3Byb3RvX189VWludDhBcnJheSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnNwZWNpZXMmJnVbU3ltYm9sLnNwZWNpZXNdPT09dSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsU3ltYm9sLnNwZWNpZXMse3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOiEwfSkpLHUuYWxsb2M9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gbChlKSxlPD0wP3ModCxlKTp2b2lkIDAhPT1uPyJzdHJpbmciPT10eXBlb2Ygcj9zKHQsZSkuZmlsbChuLHIpOnModCxlKS5maWxsKG4pOnModCxlKX0obnVsbCx0LGUsbil9LHUuYWxsb2NVbnNhZmU9ZnVuY3Rpb24odCl7cmV0dXJuIGYobnVsbCx0KX0sdS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGYobnVsbCx0KX0sdS5pc0J1ZmZlcj1mdW5jdGlvbih0KXtyZXR1cm4hKG51bGw9PXR8fCF0Ll9pc0J1ZmZlcil9LHUuY29tcGFyZT1mdW5jdGlvbih0LGUpe2lmKCF1LmlzQnVmZmVyKHQpfHwhdS5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYodD09PWUpcmV0dXJuIDA7Zm9yKHZhciBuPXQubGVuZ3RoLHI9ZS5sZW5ndGgsbz0wLGk9TWF0aC5taW4obixyKTtvPGk7KytvKWlmKHRbb10hPT1lW29dKXtuPXRbb10scj1lW29dO2JyZWFrfXJldHVybiBuPHI/LTE6cjxuPzE6MH0sdS5pc0VuY29kaW5nPWZ1bmN0aW9uKHQpe3N3aXRjaChTdHJpbmcodCkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSx1LmNvbmNhdD1mdW5jdGlvbih0LGUpe2lmKCFpKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHUuYWxsb2MoMCk7dmFyIG47aWYodm9pZCAwPT09ZSlmb3IoZT0wLG49MDtuPHQubGVuZ3RoOysrbillKz10W25dLmxlbmd0aDt2YXIgcj11LmFsbG9jVW5zYWZlKGUpLG89MDtmb3Iobj0wO248dC5sZW5ndGg7KytuKXt2YXIgYT10W25dO2lmKCF1LmlzQnVmZmVyKGEpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTthLmNvcHkocixvKSxvKz1hLmxlbmd0aH1yZXR1cm4gcn0sdS5ieXRlTGVuZ3RoPWQsdS5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLHUucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9Mil2KHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpdih0aGlzLGUsZSszKSx2KHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9OCl2KHRoaXMsZSxlKzcpLHYodGhpcyxlKzEsZSs2KSx2KHRoaXMsZSsyLGUrNSksdih0aGlzLGUrMyxlKzQpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT10PyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP2oodGhpcywwLHQpOmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx1LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09dHx8MD09PXUuY29tcGFyZSh0aGlzLHQpfSx1LnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9IiIsbj1lLklOU1BFQ1RfTUFYX0JZVEVTO3JldHVybiB0aGlzLmxlbmd0aD4wJiYodD10aGlzLnRvU3RyaW5nKCJoZXgiLDAsbikubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPm4mJih0Kz0iIC4uLiAiKSksIjxCdWZmZXIgIit0KyI+In0sdS5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUsbixyLG8pe2lmKCF1LmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1uJiYobj10P3QubGVuZ3RoOjApLHZvaWQgMD09PXImJihyPTApLHZvaWQgMD09PW8mJihvPXRoaXMubGVuZ3RoKSxlPDB8fG4+dC5sZW5ndGh8fHI8MHx8bz50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocj49byYmZT49bilyZXR1cm4gMDtpZihyPj1vKXJldHVybi0xO2lmKGU+PW4pcmV0dXJuIDE7aWYodGhpcz09PXQpcmV0dXJuIDA7Zm9yKHZhciBpPShvPj4+PTApLShyPj4+PTApLGE9KG4+Pj49MCktKGU+Pj49MCkscz1NYXRoLm1pbihpLGEpLGM9dGhpcy5zbGljZShyLG8pLGw9dC5zbGljZShlLG4pLGY9MDtmPHM7KytmKWlmKGNbZl0hPT1sW2ZdKXtpPWNbZl0sYT1sW2ZdO2JyZWFrfXJldHVybiBpPGE/LTE6YTxpPzE6MH0sdS5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCxlLG4pe3JldHVybi0xIT09dGhpcy5pbmRleE9mKHQsZSxuKX0sdS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkodGhpcyx0LGUsbiwhMCl9LHUucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geSh0aGlzLHQsZSxuLCExKX0sdS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLG4scil7aWYodm9pZCAwPT09ZSlyPSJ1dGY4IixuPXRoaXMubGVuZ3RoLGU9MDtlbHNlIGlmKHZvaWQgMD09PW4mJiJzdHJpbmciPT10eXBlb2YgZSlyPWUsbj10aGlzLmxlbmd0aCxlPTA7ZWxzZXtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO2V8PTAsaXNGaW5pdGUobik/KG58PTAsdm9pZCAwPT09ciYmKHI9InV0ZjgiKSk6KHI9bixuPXZvaWQgMCl9dmFyIG89dGhpcy5sZW5ndGgtZTtpZigodm9pZCAwPT09bnx8bj5vKSYmKG49byksdC5sZW5ndGg+MCYmKG48MHx8ZTwwKXx8ZT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtyfHwocj0idXRmOCIpO2Zvcih2YXIgaT0hMTs7KXN3aXRjaChyKXtjYXNlImhleCI6cmV0dXJuIGIodGhpcyx0LGUsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4geCh0aGlzLHQsZSxuKTtjYXNlImFzY2lpIjpyZXR1cm4gdyh0aGlzLHQsZSxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBrKHRoaXMsdCxlLG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gUyh0aGlzLHQsZSxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEUodGhpcyx0LGUsbik7ZGVmYXVsdDppZihpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcik7cj0oIiIrcikudG9Mb3dlckNhc2UoKSxpPSEwfX0sdS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgQT00MDk2O2Z1bmN0aW9uIE8odCxlLG4pe3ZhciByPSIiO249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciBvPWU7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W29dKTtyZXR1cm4gcn1mdW5jdGlvbiBDKHQsZSxuKXt2YXIgcj0iIjtuPU1hdGgubWluKHQubGVuZ3RoLG4pO2Zvcih2YXIgbz1lO288bjsrK28pcis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W29dKTtyZXR1cm4gcn1mdW5jdGlvbiBMKHQsZSxuKXt2YXIgcj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghbnx8bjwwfHxuPnIpJiYobj1yKTtmb3IodmFyIG89IiIsaT1lO2k8bjsrK2kpbys9cSh0W2ldKTtyZXR1cm4gb31mdW5jdGlvbiBSKHQsZSxuKXtmb3IodmFyIHI9dC5zbGljZShlLG4pLG89IiIsaT0wO2k8ci5sZW5ndGg7aSs9MilvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbaV0rMjU2KnJbaSsxXSk7cmV0dXJuIG99ZnVuY3Rpb24gUCh0LGUsbil7aWYodCUxIT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gTih0LGUsbixyLG8saSl7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+b3x8ZTxpKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEkodCxlLG4scil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4odC5sZW5ndGgtbiwyKTtvPGk7KytvKXRbbitvXT0oZSYyNTU8PDgqKHI/bzoxLW8pKT4+PjgqKHI/bzoxLW8pfWZ1bmN0aW9uIEQodCxlLG4scil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbih0Lmxlbmd0aC1uLDQpO288aTsrK28pdFtuK29dPWU+Pj44KihyP286My1vKSYyNTV9ZnVuY3Rpb24gXyh0LGUsbixyLG8saSl7aWYobityPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIE0odCxlLG4scixpKXtyZXR1cm4gaXx8Xyh0LDAsbiw0KSxvLndyaXRlKHQsZSxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIFUodCxlLG4scixpKXtyZXR1cm4gaXx8Xyh0LDAsbiw4KSxvLndyaXRlKHQsZSxuLHIsNTIsOCksbis4fXUucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigodD1+fnQpPDA/KHQrPXIpPDAmJih0PTApOnQ+ciYmKHQ9ciksKGU9dm9pZCAwPT09ZT9yOn5+ZSk8MD8oZSs9cik8MCYmKGU9MCk6ZT5yJiYoZT1yKSxlPHQmJihlPXQpLHUuVFlQRURfQVJSQVlfU1VQUE9SVCkobj10aGlzLnN1YmFycmF5KHQsZSkpLl9fcHJvdG9fXz11LnByb3RvdHlwZTtlbHNle3ZhciBvPWUtdDtuPW5ldyB1KG8sdm9pZCAwKTtmb3IodmFyIGk9MDtpPG87KytpKW5baV09dGhpc1tpK3RdfXJldHVybiBufSx1LnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8UCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3RdLG89MSxpPTA7KytpPGUmJihvKj0yNTYpOylyKz10aGlzW3QraV0qbztyZXR1cm4gcn0sdS5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFAodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0Ky0tZV0sbz0xO2U+MCYmKG8qPTI1Nik7KXIrPXRoaXNbdCstLWVdKm87cmV0dXJuIHJ9LHUucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sdS5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sdS5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sdS5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSx1LnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LHUucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFAodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0XSxvPTEsaT0wOysraTxlJiYobyo9MjU2KTspcis9dGhpc1t0K2ldKm87cmV0dXJuIHI+PShvKj0xMjgpJiYoci09TWF0aC5wb3coMiw4KmUpKSxyfSx1LnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxQKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPWUsbz0xLGk9dGhpc1t0Ky0tcl07cj4wJiYobyo9MjU2KTspaSs9dGhpc1t0Ky0tcl0qbztyZXR1cm4gaT49KG8qPTEyOCkmJihpLT1NYXRoLnBvdygyLDgqZSkpLGl9LHUucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sdS5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24odCxlKXtlfHxQKHQsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LHUucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7ZXx8UCh0LDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSx1LnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNnx0aGlzW3QrM108PDI0fSx1LnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSx1LnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMCwyMyw0KX0sdS5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITEsMjMsNCl9LHUucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMCw1Miw4KX0sdS5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCExLDUyLDgpfSx1LnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbih0LGUsbixyKXsodD0rdCxlfD0wLG58PTAscil8fE4odGhpcyx0LGUsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgbz0xLGk9MDtmb3IodGhpc1tlXT0yNTUmdDsrK2k8biYmKG8qPTI1Nik7KXRoaXNbZStpXT10L28mMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQsZSxuLHIpeyh0PSt0LGV8PTAsbnw9MCxyKXx8Tih0aGlzLHQsZSxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBvPW4tMSxpPTE7Zm9yKHRoaXNbZStvXT0yNTUmdDstLW8+PTAmJihpKj0yNTYpOyl0aGlzW2Urb109dC9pJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMSwyNTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0aGlzW2VdPTI1NSZ0LGUrMX0sdS5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsNjU1MzUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6SSh0aGlzLHQsZSwhMCksZSsyfSx1LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiw2NTUzNSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpJKHRoaXMsdCxlLCExKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2UrM109dD4+PjI0LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZV09MjU1JnQpOkQodGhpcyx0LGUsITApLGUrNH0sdS5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6RCh0aGlzLHQsZSwhMSksZSs0fSx1LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9K3QsZXw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7Tih0aGlzLHQsZSxuLG8tMSwtbyl9dmFyIGk9MCxhPTEscz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysraTxuJiYoYSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStpLTFdJiYocz0xKSx0aGlzW2UraV09KHQvYT4+MCktcyYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbih0LGUsbixyKXtpZih0PSt0LGV8PTAsIXIpe3ZhciBvPU1hdGgucG93KDIsOCpuLTEpO04odGhpcyx0LGUsbixvLTEsLW8pfXZhciBpPW4tMSxhPTEscz0wO2Zvcih0aGlzW2UraV09MjU1JnQ7LS1pPj0wJiYoYSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStpKzFdJiYocz0xKSx0aGlzW2UraV09KHQvYT4+MCktcyYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMSwxMjcsLTEyOCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0PDAmJih0PTI1NSt0KzEpLHRoaXNbZV09MjU1JnQsZSsxfSx1LnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6SSh0aGlzLHQsZSwhMCksZSsyfSx1LnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6SSh0aGlzLHQsZSwhMSksZSsyfSx1LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrM109dD4+PjI0KTpEKHRoaXMsdCxlLCEwKSxlKzR9LHUucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdDwwJiYodD00Mjk0OTY3Mjk1K3QrMSksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOkQodGhpcyx0LGUsITEpLGUrNH0sdS5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTSh0aGlzLHQsZSwhMCxuKX0sdS5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTSh0aGlzLHQsZSwhMSxuKX0sdS5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFUodGhpcyx0LGUsITAsbil9LHUucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBVKHRoaXMsdCxlLCExLG4pfSx1LnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKG58fChuPTApLHJ8fDA9PT1yfHwocj10aGlzLmxlbmd0aCksZT49dC5sZW5ndGgmJihlPXQubGVuZ3RoKSxlfHwoZT0wKSxyPjAmJnI8biYmKHI9bikscj09PW4pcmV0dXJuIDA7aWYoMD09PXQubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtyPnRoaXMubGVuZ3RoJiYocj10aGlzLmxlbmd0aCksdC5sZW5ndGgtZTxyLW4mJihyPXQubGVuZ3RoLWUrbik7dmFyIG8saT1yLW47aWYodGhpcz09PXQmJm48ZSYmZTxyKWZvcihvPWktMTtvPj0wOy0tbyl0W28rZV09dGhpc1tvK25dO2Vsc2UgaWYoaTwxZTN8fCF1LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKG89MDtvPGk7KytvKXRbbytlXT10aGlzW28rbl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbCh0LHRoaXMuc3ViYXJyYXkobixuK2kpLGUpO3JldHVybiBpfSx1LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlPyhyPWUsZT0wLG49dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgbiYmKHI9bixuPXRoaXMubGVuZ3RoKSwxPT09dC5sZW5ndGgpe3ZhciBvPXQuY2hhckNvZGVBdCgwKTtvPDI1NiYmKHQ9byl9aWYodm9pZCAwIT09ciYmInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIHImJiF1LmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKX1lbHNlIm51bWJlciI9PXR5cGVvZiB0JiYodCY9MjU1KTtpZihlPDB8fHRoaXMubGVuZ3RoPGV8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKG48PWUpcmV0dXJuIHRoaXM7dmFyIGk7aWYoZT4+Pj0wLG49dm9pZCAwPT09bj90aGlzLmxlbmd0aDpuPj4+MCx0fHwodD0wKSwibnVtYmVyIj09dHlwZW9mIHQpZm9yKGk9ZTtpPG47KytpKXRoaXNbaV09dDtlbHNle3ZhciBhPXUuaXNCdWZmZXIodCk/dDpGKG5ldyB1KHQscikudG9TdHJpbmcoKSkscz1hLmxlbmd0aDtmb3IoaT0wO2k8bi1lOysraSl0aGlzW2krZV09YVtpJXNdfXJldHVybiB0aGlzfTt2YXIgQj0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBxKHQpe3JldHVybiB0PDE2PyIwIit0LnRvU3RyaW5nKDE2KTp0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBGKHQsZSl7dmFyIG47ZT1lfHwxLzA7Zm9yKHZhciByPXQubGVuZ3RoLG89bnVsbCxpPVtdLGE9MDthPHI7KythKXtpZigobj10LmNoYXJDb2RlQXQoYSkpPjU1Mjk1JiZuPDU3MzQ0KXtpZighbyl7aWYobj41NjMxOSl7KGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKGErMT09PXIpeyhlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1vPW47Y29udGludWV9aWYobjw1NjMyMCl7KGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpLG89bjtjb250aW51ZX1uPTY1NTM2KyhvLTU1Mjk2PDwxMHxuLTU2MzIwKX1lbHNlIG8mJihlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtpZihvPW51bGwsbjwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO2kucHVzaChuKX1lbHNlIGlmKG48MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7aS5wdXNoKG4+PjZ8MTkyLDYzJm58MTI4KX1lbHNlIGlmKG48NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO2kucHVzaChuPj4xMnwyMjQsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfWVsc2V7aWYoIShuPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKGUtPTQpPDApYnJlYWs7aS5wdXNoKG4+PjE4fDI0MCxuPj4xMiY2M3wxMjgsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfX1yZXR1cm4gaX1mdW5jdGlvbiBIKHQpe3JldHVybiByLnRvQnl0ZUFycmF5KGZ1bmN0aW9uKHQpe2lmKCh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KHQpLnJlcGxhY2UoQiwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7dC5sZW5ndGglNCE9MDspdCs9Ij0iO3JldHVybiB0fSh0KSl9ZnVuY3Rpb24geih0LGUsbixyKXtmb3IodmFyIG89MDtvPHImJiEobytuPj1lLmxlbmd0aHx8bz49dC5sZW5ndGgpOysrbyllW28rbl09dFtvXTtyZXR1cm4gb319KS5jYWxsKHRoaXMsbig4NSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2UuYnl0ZUxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT1jKHQpLG49ZVswXSxyPWVbMV07cmV0dXJuIDMqKG4rcikvNC1yfSxlLnRvQnl0ZUFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlLG4scj1jKHQpLGE9clswXSxzPXJbMV0sdT1uZXcgaShmdW5jdGlvbih0LGUsbil7cmV0dXJuIDMqKGUrbikvNC1ufSgwLGEscykpLGw9MCxmPXM+MD9hLTQ6YTtmb3Iobj0wO248ZjtuKz00KWU9b1t0LmNoYXJDb2RlQXQobildPDwxOHxvW3QuY2hhckNvZGVBdChuKzEpXTw8MTJ8b1t0LmNoYXJDb2RlQXQobisyKV08PDZ8b1t0LmNoYXJDb2RlQXQobiszKV0sdVtsKytdPWU+PjE2JjI1NSx1W2wrK109ZT4+OCYyNTUsdVtsKytdPTI1NSZlOzI9PT1zJiYoZT1vW3QuY2hhckNvZGVBdChuKV08PDJ8b1t0LmNoYXJDb2RlQXQobisxKV0+PjQsdVtsKytdPTI1NSZlKTsxPT09cyYmKGU9b1t0LmNoYXJDb2RlQXQobildPDwxMHxvW3QuY2hhckNvZGVBdChuKzEpXTw8NHxvW3QuY2hhckNvZGVBdChuKzIpXT4+Mix1W2wrK109ZT4+OCYyNTUsdVtsKytdPTI1NSZlKTtyZXR1cm4gdX0sZS5mcm9tQnl0ZUFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXQubGVuZ3RoLG89biUzLGk9W10sYT0wLHM9bi1vO2E8czthKz0xNjM4MylpLnB1c2gobCh0LGEsYSsxNjM4Mz5zP3M6YSsxNjM4MykpOzE9PT1vPyhlPXRbbi0xXSxpLnB1c2gocltlPj4yXStyW2U8PDQmNjNdKyI9PSIpKToyPT09byYmKGU9KHRbbi0yXTw8OCkrdFtuLTFdLGkucHVzaChyW2U+PjEwXStyW2U+PjQmNjNdK3JbZTw8MiY2M10rIj0iKSk7cmV0dXJuIGkuam9pbigiIil9O2Zvcih2YXIgcj1bXSxvPVtdLGk9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksYT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIscz0wLHU9YS5sZW5ndGg7czx1OysrcylyW3NdPWFbc10sb1thLmNoYXJDb2RlQXQocyldPXM7ZnVuY3Rpb24gYyh0KXt2YXIgZT10Lmxlbmd0aDtpZihlJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTt2YXIgbj10LmluZGV4T2YoIj0iKTtyZXR1cm4tMT09PW4mJihuPWUpLFtuLG49PT1lPzA6NC1uJTRdfWZ1bmN0aW9uIGwodCxlLG4pe2Zvcih2YXIgbyxpLGE9W10scz1lO3M8bjtzKz0zKW89KHRbc108PDE2JjE2NzExNjgwKSsodFtzKzFdPDw4JjY1MjgwKSsoMjU1JnRbcysyXSksYS5wdXNoKHJbKGk9byk+PjE4JjYzXStyW2k+PjEyJjYzXStyW2k+PjYmNjNdK3JbNjMmaV0pO3JldHVybiBhLmpvaW4oIiIpfW9bIi0iLmNoYXJDb2RlQXQoMCldPTYyLG9bIl8iLmNoYXJDb2RlQXQoMCldPTYzfSxmdW5jdGlvbih0LGUpe2UucmVhZD1mdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpLGEscz04Km8tci0xLHU9KDE8PHMpLTEsYz11Pj4xLGw9LTcsZj1uP28tMTowLHA9bj8tMToxLGg9dFtlK2ZdO2ZvcihmKz1wLGk9aCYoMTw8LWwpLTEsaD4+PS1sLGwrPXM7bD4wO2k9MjU2KmkrdFtlK2ZdLGYrPXAsbC09OCk7Zm9yKGE9aSYoMTw8LWwpLTEsaT4+PS1sLGwrPXI7bD4wO2E9MjU2KmErdFtlK2ZdLGYrPXAsbC09OCk7aWYoMD09PWkpaT0xLWM7ZWxzZXtpZihpPT09dSlyZXR1cm4gYT9OYU46MS8wKihoPy0xOjEpO2ErPU1hdGgucG93KDIsciksaS09Y31yZXR1cm4oaD8tMToxKSphKk1hdGgucG93KDIsaS1yKX0sZS53cml0ZT1mdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGEscyx1LGM9OCppLW8tMSxsPSgxPDxjKS0xLGY9bD4+MSxwPTIzPT09bz9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsaD1yPzA6aS0xLGQ9cj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhzPWlzTmFOKGUpPzE6MCxhPWwpOihhPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtYSkpPDEmJihhLS0sdSo9MiksKGUrPWErZj49MT9wL3U6cCpNYXRoLnBvdygyLDEtZikpKnU+PTImJihhKyssdS89MiksYStmPj1sPyhzPTAsYT1sKTphK2Y+PTE/KHM9KGUqdS0xKSpNYXRoLnBvdygyLG8pLGErPWYpOihzPWUqTWF0aC5wb3coMixmLTEpKk1hdGgucG93KDIsbyksYT0wKSk7bz49ODt0W24raF09MjU1JnMsaCs9ZCxzLz0yNTYsby09OCk7Zm9yKGE9YTw8b3xzLGMrPW87Yz4wO3RbbitoXT0yNTUmYSxoKz1kLGEvPTI1NixjLT04KTt0W24raC1kXXw9MTI4Kmd9fSxmdW5jdGlvbih0LGUpe3ZhciBuPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1uLmNhbGwodCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjk5KX0sZnVuY3Rpb24odCxlLG4pe24oMzAwKTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlVSTFNlYXJjaFBhcmFtc30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuKDEwMSk7dmFyIHI9bigwKSxvPW4oMzAxKSxpPW4oMzUpLGE9bigxMTgpLHM9bigyOCksdT1uKDk5KSxjPW4oNDkpLGw9bigxMTkpLGY9bigxNCkscD1uKDMxKSxoPW4oMTEpLGQ9big2KSxnPW4oMTA4KSx2PW4oNTEpLHk9bigyKSgiaXRlcmF0b3IiKSxtPWMuc2V0LGI9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtcyIpLHg9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiksdz0vXCsvZyxrPUFycmF5KDQpLFM9ZnVuY3Rpb24odCl7cmV0dXJuIGtbdC0xXXx8KGtbdC0xXT1SZWdFeHAoIigoPzolW1xcZGEtZl17Mn0peyIrdCsifSkiLCJnaSIpKX0sRT1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX1jYXRjaChlKXtyZXR1cm4gdH19LFQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKHcsIiAiKSxuPTQ7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2godCl7Zm9yKDtuOyllPWUucmVwbGFjZShTKG4tLSksRSk7cmV0dXJuIGV9fSxqPS9bIScoKX5dfCUyMC9nLEE9eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisifSxPPWZ1bmN0aW9uKHQpe3JldHVybiBBW3RdfSxDPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZShqLE8pfSxMPWZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIG4scixvPWUuc3BsaXQoIiYiKSxpPTA7aTxvLmxlbmd0aDspKG49b1tpKytdKS5sZW5ndGgmJihyPW4uc3BsaXQoIj0iKSx0LnB1c2goe2tleTpUKHIuc2hpZnQoKSksdmFsdWU6VChyLmpvaW4oIj0iKSl9KSl9LFI9ZnVuY3Rpb24odCl7dGhpcy5lbnRyaWVzLmxlbmd0aD0wLEwodGhpcy5lbnRyaWVzLHQpfSxQPWZ1bmN0aW9uKHQsZSl7aWYodDxlKXRocm93IFR5cGVFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiKX0sTj11KGZ1bmN0aW9uKHQsZSl7bSh0aGlzLHt0eXBlOiJVUkxTZWFyY2hQYXJhbXNJdGVyYXRvciIsaXRlcmF0b3I6ZyhiKHQpLmVudHJpZXMpLGtpbmQ6ZX0pfSwiSXRlcmF0b3IiLGZ1bmN0aW9uKCl7dmFyIHQ9eCh0aGlzKSxlPXQua2luZCxuPXQuaXRlcmF0b3IubmV4dCgpLHI9bi52YWx1ZTtyZXR1cm4gbi5kb25lfHwobi52YWx1ZT0ia2V5cyI9PT1lP3Iua2V5OiJ2YWx1ZXMiPT09ZT9yLnZhbHVlOltyLmtleSxyLnZhbHVlXSksbn0pLEk9ZnVuY3Rpb24oKXtsKHRoaXMsSSwiVVJMU2VhcmNoUGFyYW1zIik7dmFyIHQsZSxuLHIsbyxpLGEscz1hcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCx1PXRoaXMsYz1bXTtpZihtKHUse3R5cGU6IlVSTFNlYXJjaFBhcmFtcyIsZW50cmllczpjLHVwZGF0ZVVSTDpmdW5jdGlvbigpe30sdXBkYXRlU2VhcmNoUGFyYW1zOlJ9KSx2b2lkIDAhPT1zKWlmKGQocykpaWYoImZ1bmN0aW9uIj09dHlwZW9mKHQ9dihzKSkpZm9yKGU9dC5jYWxsKHMpOyEobj1lLm5leHQoKSkuZG9uZTspe2lmKChvPShyPWcoaChuLnZhbHVlKSkpLm5leHQoKSkuZG9uZXx8KGk9ci5uZXh0KCkpLmRvbmV8fCFyLm5leHQoKS5kb25lKXRocm93IFR5cGVFcnJvcigiRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMiIpO2MucHVzaCh7a2V5Om8udmFsdWUrIiIsdmFsdWU6aS52YWx1ZSsiIn0pfWVsc2UgZm9yKGEgaW4gcylmKHMsYSkmJmMucHVzaCh7a2V5OmEsdmFsdWU6c1thXSsiIn0pO2Vsc2UgTChjLCJzdHJpbmciPT10eXBlb2Ygcz8iPyI9PT1zLmNoYXJBdCgwKT9zLnNsaWNlKDEpOnM6cysiIil9LEQ9SS5wcm90b3R5cGU7YShELHthcHBlbmQ6ZnVuY3Rpb24odCxlKXtQKGFyZ3VtZW50cy5sZW5ndGgsMik7dmFyIG49Yih0aGlzKTtuLmVudHJpZXMucHVzaCh7a2V5OnQrIiIsdmFsdWU6ZSsiIn0pLG4udXBkYXRlVVJMKCl9LGRlbGV0ZTpmdW5jdGlvbih0KXtQKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcyksbj1lLmVudHJpZXMscj10KyIiLG89MDtvPG4ubGVuZ3RoOyluW29dLmtleT09PXI/bi5zcGxpY2UobywxKTpvKys7ZS51cGRhdGVVUkwoKX0sZ2V0OmZ1bmN0aW9uKHQpe1AoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIGU9Yih0aGlzKS5lbnRyaWVzLG49dCsiIixyPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5rZXk9PT1uKXJldHVybiBlW3JdLnZhbHVlO3JldHVybiBudWxsfSxnZXRBbGw6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9W10sbz0wO288ZS5sZW5ndGg7bysrKWVbb10ua2V5PT09biYmci5wdXNoKGVbb10udmFsdWUpO3JldHVybiByfSxoYXM6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9MDtyPGUubGVuZ3RoOylpZihlW3IrK10ua2V5PT09bilyZXR1cm4hMDtyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKHQsZSl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT0hMSxhPXQrIiIscz1lKyIiLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1vW3VdKS5rZXk9PT1hJiYoaT9vLnNwbGljZSh1LS0sMSk6KGk9ITAsbi52YWx1ZT1zKSk7aXx8by5wdXNoKHtrZXk6YSx2YWx1ZTpzfSksci51cGRhdGVVUkwoKX0sc29ydDpmdW5jdGlvbigpe3ZhciB0LGUsbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT1vLnNsaWNlKCk7Zm9yKG8ubGVuZ3RoPTAsbj0wO248aS5sZW5ndGg7bisrKXtmb3IodD1pW25dLGU9MDtlPG47ZSsrKWlmKG9bZV0ua2V5PnQua2V5KXtvLnNwbGljZShlLDAsdCk7YnJlYWt9ZT09PW4mJm8ucHVzaCh0KX1yLnVwZGF0ZVVSTCgpfSxmb3JFYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPWIodGhpcykuZW50cmllcyxyPXAodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPTA7bzxuLmxlbmd0aDspcigoZT1uW28rK10pLnZhbHVlLGUua2V5LHRoaXMpfSxrZXlzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImtleXMiKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsInZhbHVlcyIpfSxlbnRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImVudHJpZXMiKX19LHtlbnVtZXJhYmxlOiEwfSksaShELHksRC5lbnRyaWVzKSxpKEQsInRvU3RyaW5nIixmdW5jdGlvbigpe2Zvcih2YXIgdCxlPWIodGhpcykuZW50cmllcyxuPVtdLHI9MDtyPGUubGVuZ3RoOyl0PWVbcisrXSxuLnB1c2goQyh0LmtleSkrIj0iK0ModC52YWx1ZSkpO3JldHVybiBuLmpvaW4oIiYiKX0se2VudW1lcmFibGU6ITB9KSxzKEksIlVSTFNlYXJjaFBhcmFtcyIpLHIoe2dsb2JhbDohMCxmb3JjZWQ6IW99LHtVUkxTZWFyY2hQYXJhbXM6SX0pLHQuZXhwb3J0cz17VVJMU2VhcmNoUGFyYW1zOkksZ2V0U3RhdGU6Yn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigyKSxpPW4oMjcpLGE9bygiaXRlcmF0b3IiKTt0LmV4cG9ydHM9IXIoZnVuY3Rpb24oKXt2YXIgdD1uZXcgVVJMKCJiP2U9MSIsImh0dHA6Ly9hIiksZT10LnNlYXJjaFBhcmFtcztyZXR1cm4gdC5wYXRobmFtZT0iYyUyMGQiLGkmJiF0LnRvSlNPTnx8IWUuc29ydHx8Imh0dHA6Ly9hL2MlMjBkP2U9MSIhPT10LmhyZWZ8fCIxIiE9PWUuZ2V0KCJlIil8fCJhPTEiIT09U3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoIj9hPTEiKSl8fCFlW2FdfHwiYSIhPT1uZXcgVVJMKCJodHRwczovL2FAYiIpLnVzZXJuYW1lfHwiYiIhPT1uZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoImE9YiIpKS5nZXQoImEiKXx8InhuLS1lMWF5YmMiIT09bmV3IFVSTCgiaHR0cDovL9GC0LXRgdGCIikuaG9zdHx8IiMlRDAlQjEiIT09bmV3IFVSTCgiaHR0cDovL2Ej0LEiKS5oYXNofSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5yKGUpO3ZhciByPW4oOCksbz1uLm4ociksaT1uKDYxKSxhPW4ubihpKSxzPW4oOSksdT1uLm4ocyksYz1uKDIwKSxsPW4ubihjKSxmPW4oNykscD1uLm4oZiksaD1uKDEyKSxkPW4ubihoKSxnPW4oMTI2KSx2PW4ubihnKSx5PW4oMTkpLG09bi5uKHkpLGI9bigzNikseD1uLm4oYiksdz1uKDE1KSxrPW4ubih3KSxTPW4oMTApLEU9bi5uKFMpLFQ9KG4oMTYpLG4oODApKSxqPW4ubihUKTtmdW5jdGlvbiBBKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLG49aigpKHQucmVwbGFjZSgvW14wLTldL2dpLCIiKSwxMCk7cmV0dXJuIG58fGV9ZnVuY3Rpb24gTyh0KXt2YXIgZT0iIixuPXQuY29udGVudHMoKTtpZihuLmxlbmd0aD4wKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cis9MSl7dmFyIG89bi5nZXQocik7Mz09PW8ubm9kZVR5cGUmJm8uZGF0YSYmKGUrPW8uZGF0YSl9cmV0dXJuIGV9ZnVuY3Rpb24gQyh0LGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcigic2VsZWN0b3IgcmVxdWlyZWQiKTtyZXR1cm4gdChlKS5sZW5ndGg+MCYmImltZyI9PT10KGUpLnByb3AoInRhZ05hbWUiKS50b0xvd2VyQ2FzZSgpP3QoZSkuYXR0cigiYWx0Iil8fCIiOnQoZSkudGV4dCgpLnJlcGxhY2UoL1xuLywiIil9ZnVuY3Rpb24gTCh0LGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcigic2VsZWN0b3IgcmVxdWlyZWQiKTt2YXIgbj0iIjtpZih0KGUpLmxlbmd0aD4wKXt2YXIgcj10KGUpLnByb3AoInRhZ05hbWUiKS50b0xvd2VyQ2FzZSgpO249ImlucHV0Ij09PXI/dChlKS52YWwoKToibWV0YSI9PT1yP3QoZSkuYXR0cigiY29udGVudCIpfHwiIjpPKHQoZSkpfXJldHVybiBuPW4ucmVwbGFjZSgvW14wLTldL2csIiIpLGooKShuLDEwKX12YXIgUj1uKDM3KSxQPW4ubihSKSxOPW4oMzgpLEk9bi5uKE4pLEQ9bigzOSksXz1uLm4oRCksTT1uKDQwKSxVPW4ubihNKSxCPW4oNDEpLHE9bi5uKEIpLEY9big0MiksSD1uLm4oRiksej1uKDYyKSxXPW4ubih6KTtmdW5jdGlvbiAkKHQsZSl7dmFyIG47aWYodm9pZCAwPT09VS5hfHxudWxsPT1fKCkodCkpe2lmKEkoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBZKHQsZSk7dmFyIHI9SCgpKG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKS5jYWxsKG4sOCwtMSk7Ik9iamVjdCI9PT1yJiZ0LmNvbnN0cnVjdG9yJiYocj10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKCJNYXAiPT09cnx8IlNldCI9PT1yKXJldHVybiBxKCkodCk7aWYoIkFyZ3VtZW50cyI9PT1yfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSlyZXR1cm4gWSh0LGUpfSh0KSl8fGUmJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe24mJih0PW4pO3ZhciByPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBpLGE9ITAscz0hMTtyZXR1cm57czpmdW5jdGlvbigpe249UCgpKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGE9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7cz0hMCxpPXR9LGY6ZnVuY3Rpb24oKXt0cnl7YXx8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IGl9fX19ZnVuY3Rpb24gWSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIFYodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJTS1XjgYzkuI3mraPjgafjgZkiKTtpZigwPT09VygpKHQpLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNLVemgheebruaVsOOBjOS4jeato+OBp+OBmSIpfXZhciBHPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj1lLiQscj1lLm5hbWUsbz1lLnByaWNlO3AoKSh0aGlzLHQpLHRoaXMuJD1uLHRoaXMubmFtZVNlbGVjdG9yPXJ8fCIiLHRoaXMucHJpY2VTZWxlY3Rvcj1vfHwiIn1yZXR1cm4gZCgpKHQsW3trZXk6ImdldFB1cmNoYXNhYmxlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hMH19LHtrZXk6ImV4ZWN1dGUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9ITA7dHJ5e3JldHVybiB0PXRoaXMuZ2V0SXRlbSgpLGU9dGhpcy5nZXRTa3VSb3dzKHQpLHI9dGhpcy5nZXRQdXJjaGFzYWJsZSh7aXRlbTp0LHNrdVJvd3M6ZX0pLGZ1bmN0aW9uKHQpe3ZhciBlPXQuaXRlbSxuPXQuc2t1Um93cztpZighZSl0aHJvdyBuZXcgRXJyb3IoIuOCouOCpOODhuODoOOBjOS4jeato+OBp+OBmSIpO2lmKCFlLm5hbWUpdGhyb3cgbmV3IEVycm9yKCLjgqLjgqTjg4bjg6DlkI3liY3jgYzkuI3mraPjgafjgZkiKTtpZighKG4mJjAhPT1uLmxlbmd0aHx8ZS5wcmljZSkpdGhyb3cgbmV3IEVycm9yKCLjgqLjgqTjg4bjg6Dph5HpoY3jgYzkuI3mraPjgafjgZkiKTtpZihuKXt2YXIgcixvPSQobik7dHJ5e2ZvcihvLnMoKTshKHI9by5uKCkpLmRvbmU7KXtWKHIudmFsdWUpfX1jYXRjaCh0KXtvLmUodCl9ZmluYWxseXtvLmYoKX19fSh7aXRlbTp0LHNrdVJvd3M6ZX0pLHtpdGVtOnQsc2t1Um93czplLHB1cmNoYXNhYmxlOnJ9fWNhdGNoKHQpe249dH12YXIgbz17cHVyY2hhc2FibGU6cn07cmV0dXJuIHQmJihvLml0ZW09dCksZSYmKG8uc2t1Um93cz1lKSxuJiYoby5lcnJvcj1uKSxvfX0se2tleToiZ2V0SXRlbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD17bmFtZToiIixwcmljZTowfTt0aGlzLm5hbWVTZWxlY3Rvcj90Lm5hbWU9dGhpcy5nZXRJdGVtTmFtZShDKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3RvcikpOnQubmFtZT10aGlzLmdldEl0ZW1OYW1lKCksdGhpcy5wcmljZVNlbGVjdG9yP3QucHJpY2U9dGhpcy5nZXRJdGVtUHJpY2UoTCh0aGlzLiQsdGhpcy5wcmljZVNlbGVjdG9yKSk6dC5wcmljZT10aGlzLmdldEl0ZW1QcmljZSgpO3ZhciBlPXRoaXMuZ2V0SXRlbUNvZGUoKTtyZXR1cm4gZSYmKHQuY29kZT1lKSx0fX0se2tleToiZ2V0SXRlbU5hbWUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiIiO3JldHVybiB0aGlzLm5hbWVTZWxlY3Rvcj9DKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1QcmljZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MDtyZXR1cm4gdGhpcy5wcmljZVNlbGVjdG9yP0wodGhpcy4kLHRoaXMucHJpY2VTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiIifX0se2tleToiZ2V0U2t1Um93cyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuW119fV0pLHR9KCksSz1uKDEyNyksWD1uLm4oSyksSj1uKDEyOCk7ZnVuY3Rpb24gUSgpe3JldHVybiB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyYmd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZX12YXIgWj1uKDEyOSksdHQ9bi5uKFopLGV0PW4oMTMwKSxudD1uLm4oZXQpLHJ0PW4oNTMpLG90PW4ubihydCksaXQ9InppZ3phZyI7dmFyIGF0PW4oMjUpLHN0PSJ1c2FnZSIsdXQ9InppZ3phZy1mbG93LWNvbnRyb2xsZWQiO2Z1bmN0aW9uIGN0KHQsZSl7d2luZG93LiQmJmZ1bmN0aW9uKG4pe3ZhciByPW4odCk7aWYociYmci5sZW5ndGg+MClmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rPTEpe3ZhciBpPXIuZ2V0KG8pO2kuaGFzQXR0cmlidXRlKHV0KXx8KCJjbGljayI9PT1lP2kub25jbGljaz1udWxsOiJzdWJtaXQiPT09ZSYmKGkub25zdWJtaXQ9bnVsbCksIm9mZiJpbiBuKGkpP24oaSkub2ZmKGUpOiJ1bmJpbmQiaW4gbihpKSYmbihpKS51bmJpbmQoZSkpfX0od2luZG93LiQpfXZhciBsdD17cHJlc2VydmVPcmlnaW5hbEV2ZW50OiExLGRpc2FibGVQb2ludGVyRXZlbnQ6ITEsZGlzYWJsZVJlcG9ydDohMX07dmFyIGZ0PXtkaXNhYmxlUmVwb3J0OiExfTtmdW5jdGlvbiBwdCh0KXt2YXIgZT1udCgpKGZ1bmN0aW9uKCl7dmFyIG4scixvPXdpbmRvdy56aWd6YWc7ImRlYWN0aXZhdGVkIj09PShuPXN0LHI9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGl0KSxKU09OLnBhcnNlKHI/ZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IocikpOiJ7fSIpW25dKXx8by5pc0RlbmllZHx8KHQoKSxjbGVhckludGVydmFsKGUpKX0sNTAwKX1mdW5jdGlvbiBodCh0LGUpe3ZhciBuPXdpbmRvdy56aWd6YWc7dHQoKShmdW5jdGlvbigpey9DaHJvbWUvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpJiYwPT09dChlKS5sZW5ndGgmJm4mJiJpdGVtIj09PW4uZGlzY292ZXJ5U3RhdHVzJiZhdC5hLmVycm9yKCIiLmNvbmNhdChlLCI6IOOCouOCpOODhuODoOODmuODvOOCuOOBp+ipsuW9k+OBmeOCi+ODleODreODvOWItuW+oeeUqOOBruimgee0oOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyIpKX0sNWUzKX12YXIgZHQ9e29uQ2hhbmdlc1JlYWR5OmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbImphIl07Qm9vbGVhbihFKCkoZSkuY2FsbChlLGZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybi0xIT09WCgpKGU9USgpKS5jYWxsKGUsdCl9KSl8fHB0KGZ1bmN0aW9uKCl7dChKKX0pfSxvdmVycmlkZUNsaWNrRXZlbnQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpsdDtpZigocj1vdCgpKG90KCkoe30sbHQpLHIpKS5kaXNhYmxlUmVwb3J0fHxodCh0LGUpLHIuZGlzYWJsZVBvaW50ZXJFdmVudCl7aWYod2luZG93LmRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKHV0KSlyZXR1cm47dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtvLmlubmVySFRNTD0iXG4gICAgIi5jb25jYXQoZSwiIHtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH0iKTt2YXIgaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHQiKTtyZXR1cm4gaSYmaS5wYXJlbnROb2RlJiZpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG8saSksdChkb2N1bWVudCkub24oImNsaWNrIixmdW5jdGlvbihyKXtyLnRhcmdldCYmdChyLnRhcmdldCkuY2xvc2VzdCh0KGUpLnBhcmVudCgpKS5sZW5ndGg+MCYmbihyKX0pLHZvaWQgd2luZG93LmRvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKHV0LCIxIil9ci5wcmVzZXJ2ZU9yaWdpbmFsRXZlbnR8fGN0KGUsImNsaWNrIik7Zm9yKHZhciBhPXQoZSkscz0wO3M8YS5sZW5ndGg7cys9MSl7dmFyIHU9YS5nZXQocyk7dS5oYXNBdHRyaWJ1dGUodXQpfHwodS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24odCl7ci5wcmVzZXJ2ZU9yaWdpbmFsRXZlbnR8fCh0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSksbih0KX0sITApLHUuc2V0QXR0cmlidXRlKHV0LCIxIikpfX0sb3ZlcnJpZGVTdWJtaXRFdmVudDpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOmZ0OyhyPW90KCkob3QoKSh7fSxmdCkscikpLmRpc2FibGVSZXBvcnR8fGh0KHQsZSksY3QoZSwic3VibWl0Iik7dmFyIG89dChlKTtpZihvJiZvLmxlbmd0aD4wKWZvcih2YXIgaT0wO2k8by5sZW5ndGg7aSs9MSl7dmFyIGE9by5nZXQoaSk7YS5oYXNBdHRyaWJ1dGUodXQpfHwodChhKS5vbigic3VibWl0IixuKSxhLnNldEF0dHJpYnV0ZSh1dCwiMSIpKX19LHVuYmluZE9yaWdpbmFsSlF1ZXJ5RXZlbnRzOmN0fTt2YXIgZ3Q9big4MSksdnQ9bi5uKGd0KSx5dD1uKDEzMSksbXQ9bi5uKHl0KSxidD1uKDEzMikseHQ9bi5uKGJ0KSx3dD1uKDgyKSxrdD1uLm4od3QpO2Z1bmN0aW9uIFN0KHQpe3JldHVybihTdD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIEV0KHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiBUdCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/T2JqZWN0KGFyZ3VtZW50c1tlXSk6e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7RXQodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24ganQodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBBdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIE90KHQsZSxuKXtyZXR1cm4gZSYmQXQodC5wcm90b3R5cGUsZSksbiYmQXQodCxuKSx0fWZ1bmN0aW9uIEN0KHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBMdCh0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9PVN0KGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9DdCh0KTplfWZ1bmN0aW9uIFJ0KHQpe3JldHVybihSdD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gUHQodCxlKXtyZXR1cm4oUHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIE50KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJlB0KHQsZSl9dmFyIEl0PXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgibG9nIix0KX0sd2FybjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgid2FybiIsdCl9LGVycm9yOmZ1bmN0aW9uKHQpe3RoaXMub3V0cHV0KCJlcnJvciIsdCl9LG91dHB1dDpmdW5jdGlvbih0LGUpe2NvbnNvbGUmJmNvbnNvbGVbdF0mJmNvbnNvbGVbdF0uYXBwbHkoY29uc29sZSxlKX19LER0PW5ldyhmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2p0KHRoaXMsdCksdGhpcy5pbml0KGUsbil9cmV0dXJuIE90KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1lLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj10fHxJdCx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixUdCh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdChlLCI6Iil9LHRoaXMub3B0aW9ucykpfX1dKSx0fSgpKSxfdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtqdCh0aGlzLHQpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBPdCh0LFt7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiB0LnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbih0KXtuLm9ic2VydmVyc1t0XT1uLm9ic2VydmVyc1t0XXx8W10sbi5vYnNlcnZlcnNbdF0ucHVzaChlKX0pLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5vYnNlcnZlcnNbdF0mJihlP3RoaXMub2JzZXJ2ZXJzW3RdPXRoaXMub2JzZXJ2ZXJzW3RdLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KTpkZWxldGUgdGhpcy5vYnNlcnZlcnNbdF0pfX0se2tleToiZW1pdCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2lmKHRoaXMub2JzZXJ2ZXJzW3RdKXt2YXIgbz1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbdF0pO28uZm9yRWFjaChmdW5jdGlvbih0KXt0LmFwcGx5KHZvaWQgMCxuKX0pfWlmKHRoaXMub2JzZXJ2ZXJzWyIqIl0pe3ZhciBpPVtdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1siKiJdKTtpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hcHBseShlLFt0XS5jb25jYXQobikpfSl9fX1dKSx0fSgpO2Z1bmN0aW9uIE10KCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7dD1uLGU9cn0pO3JldHVybiBuLnJlc29sdmU9dCxuLnJlamVjdD1lLG59ZnVuY3Rpb24gVXQodCl7cmV0dXJuIG51bGw9PXQ/IiI6IiIrdH1mdW5jdGlvbiBCdCh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBvKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIGk9InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7aS5sZW5ndGg+MTspe2lmKG8oKSlyZXR1cm57fTt2YXIgYT1yKGkuc2hpZnQoKSk7IXRbYV0mJm4mJih0W2FdPW5ldyBuKSx0PXRbYV19cmV0dXJuIG8oKT97fTp7b2JqOnQsazpyKGkuc2hpZnQoKSl9fWZ1bmN0aW9uIHF0KHQsZSxuKXt2YXIgcj1CdCh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24gRnQodCxlKXt2YXIgbj1CdCh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX1mdW5jdGlvbiBIdCh0LGUsbil7dmFyIHI9RnQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkZ0KGUsbil9ZnVuY3Rpb24genQodCxlLG4pe2Zvcih2YXIgciBpbiBlKSJfX3Byb3RvX18iIT09ciYmImNvbnN0cnVjdG9yIiE9PXImJihyIGluIHQ/InN0cmluZyI9PXR5cGVvZiB0W3JdfHx0W3JdaW5zdGFuY2VvZiBTdHJpbmd8fCJzdHJpbmciPT10eXBlb2YgZVtyXXx8ZVtyXWluc3RhbmNlb2YgU3RyaW5nP24mJih0W3JdPWVbcl0pOnp0KHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFd0KHQpe3JldHVybiB0LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfXZhciAkdD17IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7IiwiLyI6IiYjeDJGOyJ9O2Z1bmN0aW9uIFl0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLGZ1bmN0aW9uKHQpe3JldHVybiAkdFt0XX0pOnR9dmFyIFZ0PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpPi0xLEd0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e25zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6InRyYW5zbGF0aW9uIn07cmV0dXJuIGp0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZfdC5jYWxsKEN0KG4pKSxuLmRhdGE9dHx8e30sbi5vcHRpb25zPXIsdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxufXJldHVybiBOdChlLF90KSxPdChlLFt7a2V5OiJhZGROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTwwJiZ0aGlzLm9wdGlvbnMubnMucHVzaCh0KX19LHtrZXk6InJlbW92ZU5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5ucy5pbmRleE9mKHQpO2U+LTEmJnRoaXMub3B0aW9ucy5ucy5zcGxpY2UoZSwxKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LG89dm9pZCAwIT09ci5rZXlTZXBhcmF0b3I/ci5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixpPVt0LGVdO3JldHVybiBuJiYic3RyaW5nIiE9dHlwZW9mIG4mJihpPWkuY29uY2F0KG4pKSxuJiYic3RyaW5nIj09dHlwZW9mIG4mJihpPWkuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihpPXQuc3BsaXQoIi4iKSksRnQodGhpcy5kYXRhLGkpfX0se2tleToiYWRkUmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTp7c2lsZW50OiExfSxpPXRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7dm9pZCAwPT09aSYmKGk9Ii4iKTt2YXIgYT1bdCxlXTtuJiYoYT1hLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocj1lLGU9KGE9dC5zcGxpdCgiLiIpKVsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGUpLHF0KHRoaXMuZGF0YSxhLHIpLG8uc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbixyKX19LHtrZXk6ImFkZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7c2lsZW50OiExfTtmb3IodmFyIG8gaW4gbikic3RyaW5nIiE9dHlwZW9mIG5bb10mJiJbb2JqZWN0IEFycmF5XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG5bb10pfHx0aGlzLmFkZFJlc291cmNlKHQsZSxvLG5bb10se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0sYT1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0oYT10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIHM9RnQodGhpcy5kYXRhLGEpfHx7fTtyP3p0KHMsbixvKTpzPVR0KHt9LHMsbikscXQodGhpcy5kYXRhLGEscyksaS5zaWxlbnR8fHRoaXMuZW1pdCgiYWRkZWQiLHQsZSxuKX19LHtrZXk6InJlbW92ZVJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuaGFzUmVzb3VyY2VCdW5kbGUodCxlKSYmZGVsZXRlIHRoaXMuZGF0YVt0XVtlXSx0aGlzLnJlbW92ZU5hbWVzcGFjZXMoZSksdGhpcy5lbWl0KCJyZW1vdmVkIix0LGUpfX0se2tleToiaGFzUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZ2V0UmVzb3VyY2UodCxlKX19LHtrZXk6ImdldFJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBlfHwoZT10aGlzLm9wdGlvbnMuZGVmYXVsdE5TKSwidjEiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk/VHQoe30se30sdGhpcy5nZXRSZXNvdXJjZSh0LGUpKTp0aGlzLmdldFJlc291cmNlKHQsZSl9fSx7a2V5OiJnZXREYXRhQnlMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVt0XX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX1dKSxlfSgpLEt0PXtwcm9jZXNzb3JzOnt9LGFkZFBvc3RQcm9jZXNzb3I6ZnVuY3Rpb24odCl7dGhpcy5wcm9jZXNzb3JzW3QubmFtZV09dH0saGFuZGxlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9dGhpcztyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2kucHJvY2Vzc29yc1t0XSYmKGU9aS5wcm9jZXNzb3JzW3RdLnByb2Nlc3MoZSxuLHIsbykpfSksZX19LFh0PXt9LEp0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scixvLGksYT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307cmV0dXJuIGp0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZfdC5jYWxsKEN0KG4pKSxyPVsicmVzb3VyY2VTdG9yZSIsImxhbmd1YWdlVXRpbHMiLCJwbHVyYWxSZXNvbHZlciIsImludGVycG9sYXRvciIsImJhY2tlbmRDb25uZWN0b3IiLCJpMThuRm9ybWF0IiwidXRpbHMiXSxvPXQsaT1DdChuKSxyLmZvckVhY2goZnVuY3Rpb24odCl7b1t0XSYmKGlbdF09b1t0XSl9KSxuLm9wdGlvbnM9YSx2b2lkIDA9PT1uLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYobi5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLG4ubG9nZ2VyPUR0LmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIE50KGUsX3QpLE90KGUsW3trZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0KXt0JiYodGhpcy5sYW5ndWFnZT10KX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fSxuPXRoaXMucmVzb2x2ZSh0LGUpO3JldHVybiBuJiZ2b2lkIDAhPT1uLnJlc319LHtrZXk6ImV4dHJhY3RGcm9tS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXZvaWQgMCE9PWUubnNTZXBhcmF0b3I/ZS5uc1NlcGFyYXRvcjp0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7dm9pZCAwPT09biYmKG49IjoiKTt2YXIgcj12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLG89ZS5uc3x8dGhpcy5vcHRpb25zLmRlZmF1bHROUztpZihuJiZ0LmluZGV4T2Yobik+LTEpe3ZhciBpPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7aWYoaSYmaS5sZW5ndGg+MClyZXR1cm57a2V5OnQsbmFtZXNwYWNlczpvfTt2YXIgYT10LnNwbGl0KG4pOyhuIT09cnx8bj09PXImJnRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGFbMF0pPi0xKSYmKG89YS5zaGlmdCgpKSx0PWEuam9pbihyKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIG8mJihvPVtvXSkse2tleTp0LG5hbWVzcGFjZXM6b319fSx7a2V5OiJ0cmFuc2xhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO2lmKCJvYmplY3QiIT09U3QoZSkmJnRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlciYmKGU9dGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cykpLGV8fChlPXt9KSxudWxsPT10KXJldHVybiIiO0FycmF5LmlzQXJyYXkodCl8fCh0PVtTdHJpbmcodCldKTt2YXIgbz12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGk9dGhpcy5leHRyYWN0RnJvbUtleSh0W3QubGVuZ3RoLTFdLGUpLGE9aS5rZXkscz1pLm5hbWVzcGFjZXMsdT1zW3MubGVuZ3RoLTFdLGM9ZS5sbmd8fHRoaXMubGFuZ3VhZ2UsbD1lLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlfHx0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU7aWYoYyYmImNpbW9kZSI9PT1jLnRvTG93ZXJDYXNlKCkpe2lmKGwpe3ZhciBmPWUubnNTZXBhcmF0b3J8fHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtyZXR1cm4gdStmK2F9cmV0dXJuIGF9dmFyIHA9dGhpcy5yZXNvbHZlKHQsZSksaD1wJiZwLnJlcyxkPXAmJnAudXNlZEtleXx8YSxnPXAmJnAuZXhhY3RVc2VkS2V5fHxhLHY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoKSx5PVsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXSxtPXZvaWQgMCE9PWUuam9pbkFycmF5cz9lLmpvaW5BcnJheXM6dGhpcy5vcHRpb25zLmpvaW5BcnJheXMsYj0hdGhpcy5pMThuRm9ybWF0fHx0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3QseD0ic3RyaW5nIiE9dHlwZW9mIGgmJiJib29sZWFuIiE9dHlwZW9mIGgmJiJudW1iZXIiIT10eXBlb2YgaDtpZihiJiZoJiZ4JiZ5LmluZGV4T2Yodik8MCYmKCJzdHJpbmciIT10eXBlb2YgbXx8IltvYmplY3QgQXJyYXldIiE9PXYpKXtpZighZS5yZXR1cm5PYmplY3RzJiYhdGhpcy5vcHRpb25zLnJldHVybk9iamVjdHMpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImFjY2Vzc2luZyBhbiBvYmplY3QgLSBidXQgcmV0dXJuT2JqZWN0cyBvcHRpb25zIGlzIG5vdCBlbmFibGVkISIpLHRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXI/dGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlcihkLGgsZSk6ImtleSAnIi5jb25jYXQoYSwiICgiKS5jb25jYXQodGhpcy5sYW5ndWFnZSwiKScgcmV0dXJuZWQgYW4gb2JqZWN0IGluc3RlYWQgb2Ygc3RyaW5nLiIpO2lmKG8pe3ZhciB3PSJbb2JqZWN0IEFycmF5XSI9PT12LGs9dz9bXTp7fSxTPXc/ZzpkO2Zvcih2YXIgRSBpbiBoKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoLEUpKXt2YXIgVD0iIi5jb25jYXQoUykuY29uY2F0KG8pLmNvbmNhdChFKTtrW0VdPXRoaXMudHJhbnNsYXRlKFQsVHQoe30sZSx7am9pbkFycmF5czohMSxuczpzfSkpLGtbRV09PT1UJiYoa1tFXT1oW0VdKX1oPWt9fWVsc2UgaWYoYiYmInN0cmluZyI9PXR5cGVvZiBtJiYiW29iamVjdCBBcnJheV0iPT09dikoaD1oLmpvaW4obSkpJiYoaD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsdCxlLG4pKTtlbHNle3ZhciBqPSExLEE9ITE7aWYoIXRoaXMuaXNWYWxpZExvb2t1cChoKSYmdm9pZCAwIT09ZS5kZWZhdWx0VmFsdWUpe2lmKGo9ITAsdm9pZCAwIT09ZS5jb3VudCl7dmFyIE89dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoYyxlLmNvdW50KTtoPWVbImRlZmF1bHRWYWx1ZSIuY29uY2F0KE8pXX1ofHwoaD1lLmRlZmF1bHRWYWx1ZSl9dGhpcy5pc1ZhbGlkTG9va3VwKGgpfHwoQT0hMCxoPWEpO3ZhciBDPWUuZGVmYXVsdFZhbHVlJiZlLmRlZmF1bHRWYWx1ZSE9PWgmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKEF8fGp8fEMpe2lmKHRoaXMubG9nZ2VyLmxvZyhDPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixjLHUsYSxDP2UuZGVmYXVsdFZhbHVlOmgpLG8pe3ZhciBMPXRoaXMucmVzb2x2ZShhLFR0KHt9LGUse2tleVNlcGFyYXRvcjohMX0pKTtMJiZMLnJlcyYmdGhpcy5sb2dnZXIud2FybigiU2VlbXMgdGhlIGxvYWRlZCB0cmFuc2xhdGlvbnMgd2VyZSBpbiBmbGF0IEpTT04gZm9ybWF0IGluc3RlYWQgb2YgbmVzdGVkLiBFaXRoZXIgc2V0IGtleVNlcGFyYXRvcjogZmFsc2Ugb24gaW5pdCBvciBtYWtlIHN1cmUgeW91ciB0cmFuc2xhdGlvbnMgYXJlIHB1Ymxpc2hlZCBpbiBuZXN0ZWQgZm9ybWF0LiIpfXZhciBSPVtdLFA9dGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGUubG5nfHx0aGlzLmxhbmd1YWdlKTtpZigiZmFsbGJhY2siPT09dGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nVG8mJlAmJlBbMF0pZm9yKHZhciBOPTA7TjxQLmxlbmd0aDtOKyspUi5wdXNoKFBbTl0pO2Vsc2UiYWxsIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvP1I9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShlLmxuZ3x8dGhpcy5sYW5ndWFnZSk6Ui5wdXNoKGUubG5nfHx0aGlzLmxhbmd1YWdlKTt2YXIgST1mdW5jdGlvbih0LG4pe3Iub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcj9yLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXIodCx1LG4sQz9lLmRlZmF1bHRWYWx1ZTpoLEMsZSk6ci5iYWNrZW5kQ29ubmVjdG9yJiZyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcmJnIuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyh0LHUsbixDP2UuZGVmYXVsdFZhbHVlOmgsQyxlKSxyLmVtaXQoIm1pc3NpbmdLZXkiLHQsdSxuLGgpfTtpZih0aGlzLm9wdGlvbnMuc2F2ZU1pc3Npbmcpe3ZhciBEPXZvaWQgMCE9PWUuY291bnQmJiJzdHJpbmciIT10eXBlb2YgZS5jb3VudDt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZEP1IuZm9yRWFjaChmdW5jdGlvbih0KXtyLnBsdXJhbFJlc29sdmVyLmdldFBsdXJhbEZvcm1zT2ZLZXkodCxhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBJKFt0XSxlKX0pfSk6SShSLGEpfX1oPXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oaCx0LGUscCxuKSxBJiZoPT09YSYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKGg9IiIuY29uY2F0KHUsIjoiKS5jb25jYXQoYSkpLEEmJnRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyJiYoaD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcihoKSl9cmV0dXJuIGh9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsbixyLnVzZWRMbmcsci51c2VkTlMsci51c2VkS2V5LHtyZXNvbHZlZDpyfSk7ZWxzZSBpZighbi5za2lwSW50ZXJwb2xhdGlvbil7bi5pbnRlcnBvbGF0aW9uJiZ0aGlzLmludGVycG9sYXRvci5pbml0KFR0KHt9LG4se2ludGVycG9sYXRpb246VHQoe30sdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24sbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgYSxzPW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlc3x8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO2lmKHMpe3ZhciB1PXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YT11JiZ1Lmxlbmd0aH12YXIgYz1uLnJlcGxhY2UmJiJzdHJpbmciIT10eXBlb2Ygbi5yZXBsYWNlP24ucmVwbGFjZTpuO2lmKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMmJihjPVR0KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMsYykpLHQ9dGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUodCxjLG4ubG5nfHx0aGlzLmxhbmd1YWdlLG4pLHMpe3ZhciBsPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YTwobCYmbC5sZW5ndGgpJiYobi5uZXN0PSExKX0hMSE9PW4ubmVzdCYmKHQ9dGhpcy5pbnRlcnBvbGF0b3IubmVzdCh0LGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkodCksYT0wO2E8dDthKyspclthXT1hcmd1bWVudHNbYV07cmV0dXJuIG8mJm9bMF09PT1yWzBdJiYhbi5jb250ZXh0PyhpLmxvZ2dlci53YXJuKCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAiLmNvbmNhdChyWzBdLCIgaW4ga2V5OiAiKS5jb25jYXQoZVswXSkpLG51bGwpOmkudHJhbnNsYXRlLmFwcGx5KGksci5jb25jYXQoW2VdKSl9LG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGY9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLHA9InN0cmluZyI9PXR5cGVvZiBmP1tmXTpmO3JldHVybiBudWxsIT10JiZwJiZwLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9S3QuaGFuZGxlKHAsdCxlLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkP1R0KHtpMThuUmVzb2x2ZWQ6cn0sbik6bix0aGlzKSksdH19LHtrZXk6InJlc29sdmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT10aGlzLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWEuaXNWYWxpZExvb2t1cChlKSl7dmFyIHU9YS5leHRyYWN0RnJvbUtleSh0LHMpLGM9dS5rZXk7bj1jO3ZhciBsPXUubmFtZXNwYWNlczthLm9wdGlvbnMuZmFsbGJhY2tOUyYmKGw9bC5jb25jYXQoYS5vcHRpb25zLmZhbGxiYWNrTlMpKTt2YXIgZj12b2lkIDAhPT1zLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIHMuY291bnQscD12b2lkIDAhPT1zLmNvbnRleHQmJiJzdHJpbmciPT10eXBlb2Ygcy5jb250ZXh0JiYiIiE9PXMuY29udGV4dCxoPXMubG5ncz9zLmxuZ3M6YS5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShzLmxuZ3x8YS5sYW5ndWFnZSxzLmZhbGxiYWNrTG5nKTtsLmZvckVhY2goZnVuY3Rpb24odCl7YS5pc1ZhbGlkTG9va3VwKGUpfHwoaT10LCFYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV0mJmEudXRpbHMmJmEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UoaSkmJihYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV09ITAsYS5sb2dnZXIud2Fybigna2V5ICInLmNvbmNhdChuLCciIGZvciBsYW5ndWFnZXMgIicpLmNvbmNhdChoLmpvaW4oIiwgIiksJyIgd29uXCd0IGdldCByZXNvbHZlZCBhcyBuYW1lc3BhY2UgIicpLmNvbmNhdChpLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKSksaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKCFhLmlzVmFsaWRMb29rdXAoZSkpe289bjt2YXIgaSx1LGw9YyxoPVtsXTtpZihhLmkxOG5Gb3JtYXQmJmEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKWEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKGgsYyxuLHQscyk7ZWxzZSBmJiYoaT1hLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChuLHMuY291bnQpKSxmJiZwJiZoLnB1c2gobCtpKSxwJiZoLnB1c2gobCs9IiIuY29uY2F0KGEub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQocy5jb250ZXh0KSksZiYmaC5wdXNoKGwrPWkpO2Zvcig7dT1oLnBvcCgpOylhLmlzVmFsaWRMb29rdXAoZSl8fChyPXUsZT1hLmdldFJlc291cmNlKG4sdCx1LHMpKX19KSl9KX19KSx7cmVzOmUsdXNlZEtleTpuLGV4YWN0VXNlZEtleTpyLHVzZWRMbmc6byx1c2VkTlM6aX19fSx7a2V5OiJpc1ZhbGlkTG9va3VwIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hKHZvaWQgMD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuTnVsbCYmbnVsbD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuRW1wdHlTdHJpbmcmJiIiPT09dCl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gdGhpcy5pMThuRm9ybWF0JiZ0aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2U/dGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlKHQsZSxuLHIpOnRoaXMucmVzb3VyY2VTdG9yZS5nZXRSZXNvdXJjZSh0LGUsbixyKX19XSksZX0oKTtmdW5jdGlvbiBRdCh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBadD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7anQodGhpcyx0KSx0aGlzLm9wdGlvbnM9ZSx0aGlzLndoaXRlbGlzdD10aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ITEsdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1EdC5jcmVhdGUoImxhbmd1YWdlVXRpbHMiKX1yZXR1cm4gT3QodCxbe2tleToiZ2V0U2NyaXB0UGFydEZyb21Db2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dC5pbmRleE9mKCItIik8MClyZXR1cm4gbnVsbDt2YXIgZT10LnNwbGl0KCItIik7cmV0dXJuIDI9PT1lLmxlbmd0aD9udWxsOihlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKT9udWxsOnRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUuam9pbigiLSIpKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfSk6Mj09PW4ubGVuZ3RoPyhuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSxuWzFdPW5bMV0udG9VcHBlckNhc2UoKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSkpOjM9PT1uLmxlbmd0aCYmKG5bMF09blswXS50b0xvd2VyQ2FzZSgpLDI9PT1uWzFdLmxlbmd0aCYmKG5bMV09blsxXS50b1VwcGVyQ2FzZSgpKSwic2duIiE9PW5bMF0mJjI9PT1uWzJdLmxlbmd0aCYmKG5bMl09blsyXS50b1VwcGVyQ2FzZSgpKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPVF0KG5bMl0udG9Mb3dlckNhc2UoKSkpKSxuLmpvaW4oIi0iKX1yZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZXx8dGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz90LnRvTG93ZXJDYXNlKCk6dH19LHtrZXk6ImlzV2hpdGVsaXN0ZWQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZ2dlci5kZXByZWNhdGUoImxhbmd1YWdlVXRpbHMuaXNXaGl0ZWxpc3RlZCIsJ2Z1bmN0aW9uICJpc1doaXRlbGlzdGVkIiB3aWxsIGJlIHJlbmFtZWQgdG8gImlzU3VwcG9ydGVkQ29kZSIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSBpdFwncyB1c2FnZSBhc2FwLicpLHRoaXMuaXNTdXBwb3J0ZWRDb2RlKHQpfX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpO24ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzJiYhbi5pc1N1cHBvcnRlZENvZGUocil8fChlPXIpfX0pLCFlJiZ0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpO2lmKG4uaXNTdXBwb3J0ZWRDb2RlKHIpKXJldHVybiBlPXI7ZT1uLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KX19KSxlfHwoZT10aGlzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKVswXSksZSk6bnVsbH19LHtrZXk6ImdldEZhbGxiYWNrQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuW107aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoZSkpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSwiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh0KSlyZXR1cm4gdDtpZighZSlyZXR1cm4gdC5kZWZhdWx0fHxbXTt2YXIgbj10W2VdO3JldHVybiBufHwobj10W3RoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKGUpXSksbnx8KG49dFt0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlKV0pLG58fChuPXRbdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShlKV0pLG58fChuPXQuZGVmYXVsdCksbnx8W119fSx7a2V5OiJ0b1Jlc29sdmVIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXRoaXMuZ2V0RmFsbGJhY2tDb2RlcyhlfHx0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmd8fFtdLHQpLG89W10saT1mdW5jdGlvbih0KXt0JiYobi5pc1N1cHBvcnRlZENvZGUodCk/by5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJmkodGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmaSh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goZnVuY3Rpb24odCl7by5pbmRleE9mKHQpPDAmJmkobi5mb3JtYXRMYW5ndWFnZUNvZGUodCkpfSksb319XSksdH0oKSx0ZT1be2xuZ3M6WyJhY2giLCJhayIsImFtIiwiYXJuIiwiYnIiLCJmaWwiLCJndW4iLCJsbiIsIm1mZSIsIm1nIiwibWkiLCJvYyIsInB0IiwicHQtQlIiLCJ0ZyIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtuIiwia3UiLCJsYiIsIm1haSIsIm1sIiwibW4iLCJtciIsIm5haCIsIm5hcCIsIm5iIiwibmUiLCJubCIsIm5uIiwibm8iLCJuc28iLCJwYSIsInBhcCIsInBtcyIsInBzIiwicHQtUFQiLCJybSIsInNjbyIsInNlIiwic2kiLCJzbyIsInNvbiIsInNxIiwic3YiLCJzdyIsInRhIiwidGUiLCJ0ayIsInVyIiwieW8iXSxucjpbMSwyXSxmYzoyfSx7bG5nczpbImF5IiwiYm8iLCJjZ2ciLCJmYSIsImh0IiwiaWQiLCJqYSIsImpibyIsImthIiwia2siLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sZWU9ezE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PjEpfSwyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMSE9dCl9LDM6ZnVuY3Rpb24odCl7cmV0dXJuIDB9LDQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mj09dD8yOnQlMTAwPj0zJiZ0JTEwMDw9MTA/Mzp0JTEwMD49MTE/NDo1KX0sNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0Pj0yJiZ0PD00PzE6Mil9LDc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjghPXQmJjExIT10PzI6Myl9LDk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0Pj0yKX0sMTA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOnQ8Nz8yOnQ8MTE/Mzo0KX0sMTE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHwxMT09dD8wOjI9PXR8fDEyPT10PzE6dD4yJiZ0PDIwPzI6Myl9LDEyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMCE9MXx8dCUxMDA9PTExKX0sMTM6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwIT09dCl9LDE0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ/MTozPT10PzI6Myl9LDE1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDE2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6MCE9PXQ/MToyKX0sMTc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHx0JTEwPT0xJiZ0JTEwMCE9MTE/MDoxKX0sMTg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwPT10PzA6MT09dD8xOjIpfSwxOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4xJiZ0JTEwMDwxMT8xOnQlMTAwPjEwJiZ0JTEwMDwyMD8yOjMpfSwyMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4wJiZ0JTEwMDwyMD8xOjIpfSwyMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAwPT0xPzE6dCUxMDA9PTI/Mjp0JTEwMD09M3x8dCUxMDA9PTQ/MzowKX0sMjI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOih0PDB8fHQ+MTApJiZ0JTEwPT0wPzI6Myl9fTt2YXIgbmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2p0KHRoaXMsdCksdGhpcy5sYW5ndWFnZVV0aWxzPWUsdGhpcy5vcHRpb25zPXIsdGhpcy5sb2dnZXI9RHQuY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLHRoaXMucnVsZXM9KG49e30sdGUuZm9yRWFjaChmdW5jdGlvbih0KXt0LmxuZ3MuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPXtudW1iZXJzOnQubnIscGx1cmFsczplZVt0LmZjXX19KX0pLG4pfXJldHVybiBPdCh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSdWxlKHQpO3JldHVybiBlJiZlLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1bXSxvPXRoaXMuZ2V0UnVsZSh0KTtyZXR1cm4gbz8oby5udW1iZXJzLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIGk9bi5nZXRTdWZmaXgodCxvKTtyLnB1c2goIiIuY29uY2F0KGUpLmNvbmNhdChpKSl9KSxyKTpyfX0se2tleToiZ2V0U3VmZml4Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdldFJ1bGUodCk7aWYocil7dmFyIG89ci5ub0Ficz9yLnBsdXJhbHMoZSk6ci5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXIubnVtYmVyc1tvXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT1yLm51bWJlcnMubGVuZ3RoJiYxPT09ci5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgYT1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6YSgpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/YSgpOnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXIubnVtYmVycy5sZW5ndGgmJjE9PT1yLm51bWJlcnNbMF0/YSgpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZvLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrby50b1N0cmluZygpOm8udG9TdHJpbmcoKX1yZXR1cm4gdGhpcy5sb2dnZXIud2Fybigibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAiLmNvbmNhdCh0KSksIiJ9fV0pLHR9KCkscmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O2p0KHRoaXMsdCksdGhpcy5sb2dnZXI9RHQuY3JlYXRlKCJpbnRlcnBvbGF0b3IiKSx0aGlzLm9wdGlvbnM9ZSx0aGlzLmZvcm1hdD1lLmludGVycG9sYXRpb24mJmUuaW50ZXJwb2xhdGlvbi5mb3JtYXR8fGZ1bmN0aW9uKHQpe3JldHVybiB0fSx0aGlzLmluaXQoZSl9cmV0dXJuIE90KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3QuaW50ZXJwb2xhdGlvbnx8KHQuaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTt2YXIgZT10LmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9dm9pZCAwIT09ZS5lc2NhcGU/ZS5lc2NhcGU6WXQsdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9XdChlLnByZWZpeCk6ZS5wcmVmaXhFc2NhcGVkfHwie3siLHRoaXMuc3VmZml4PWUuc3VmZml4P1d0KGUuc3VmZml4KTplLnN1ZmZpeEVzY2FwZWR8fCJ9fSIsdGhpcy5mb3JtYXRTZXBhcmF0b3I9ZS5mb3JtYXRTZXBhcmF0b3I/ZS5mb3JtYXRTZXBhcmF0b3I6ZS5mb3JtYXRTZXBhcmF0b3J8fCIsIix0aGlzLnVuZXNjYXBlUHJlZml4PWUudW5lc2NhcGVTdWZmaXg/IiI6ZS51bmVzY2FwZVByZWZpeHx8Ii0iLHRoaXMudW5lc2NhcGVTdWZmaXg9dGhpcy51bmVzY2FwZVByZWZpeD8iIjplLnVuZXNjYXBlU3VmZml4fHwiIix0aGlzLm5lc3RpbmdQcmVmaXg9ZS5uZXN0aW5nUHJlZml4P1d0KGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8V3QoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1lLm5lc3RpbmdTdWZmaXg/V3QoZS5uZXN0aW5nU3VmZml4KTplLm5lc3RpbmdTdWZmaXhFc2NhcGVkfHxXdCgiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHM9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihzLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIG89SHQoZSx1LHQpO3JldHVybiBzLmFsd2F5c0Zvcm1hdD9zLmZvcm1hdChvLHZvaWQgMCxuKTpvfXZhciBpPXQuc3BsaXQocy5mb3JtYXRTZXBhcmF0b3IpLGE9aS5zaGlmdCgpLnRyaW0oKSxjPWkuam9pbihzLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBzLmZvcm1hdChIdChlLHUsYSksYyxuLHIpfTt0aGlzLnJlc2V0UmVnRXhwKCk7dmFyIGY9ciYmci5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIscD1yJiZyLmludGVycG9sYXRpb24mJnIuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXN8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztyZXR1cm5be3JlZ2V4OnRoaXMucmVnZXhwVW5lc2NhcGUsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBjKHQpfX0se3JlZ2V4OnRoaXMucmVnZXhwLHNhZmVWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gcy5lc2NhcGVWYWx1ZT9jKHMuZXNjYXBlKHQpKTpjKHQpfX1dLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKGE9MDtvPWUucmVnZXguZXhlYyh0KTspe2lmKHZvaWQgMD09PShpPWwob1sxXS50cmltKCkpKSlpZigiZnVuY3Rpb24iPT10eXBlb2YgZil7dmFyIG49Zih0LG8scik7aT0ic3RyaW5nIj09dHlwZW9mIG4/bjoiIn1lbHNle2lmKHApe2k9b1swXTtjb250aW51ZX1zLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSAiLmNvbmNhdChvWzFdLCIgZm9yIGludGVycG9sYXRpbmcgIikuY29uY2F0KHQpKSxpPSIifWVsc2Uic3RyaW5nIj09dHlwZW9mIGl8fHMudXNlUmF3VmFsdWVUb0VzY2FwZXx8KGk9VXQoaSkpO2lmKHQ9dC5yZXBsYWNlKG9bMF0sZS5zYWZlVmFsdWUoaSkpLGUucmVnZXgubGFzdEluZGV4PTAsKythPj1zLm1heFJlcGxhY2VzKWJyZWFrfX0pLHR9fSx7a2V5OiJuZXN0Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbz10aGlzLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGE9VHQoe30saSk7ZnVuY3Rpb24gcyh0LGUpe3ZhciBuPXRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I7aWYodC5pbmRleE9mKG4pPDApcmV0dXJuIHQ7dmFyIHI9dC5zcGxpdChuZXcgUmVnRXhwKCIiLmNvbmNhdChuLCJbIF0qeyIpKSksbz0ieyIuY29uY2F0KHJbMV0pO3Q9clswXSxvPShvPXRoaXMuaW50ZXJwb2xhdGUobyxhKSkucmVwbGFjZSgvJy9nLCciJyk7dHJ5e2E9SlNPTi5wYXJzZShvKSxlJiYoYT1UdCh7fSxlLGEpKX1jYXRjaChlKXtyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5ICIuY29uY2F0KHQpLGUpLCIiLmNvbmNhdCh0KS5jb25jYXQobikuY29uY2F0KG8pfXJldHVybiBkZWxldGUgYS5kZWZhdWx0VmFsdWUsdH1mb3IoYS5hcHBseVBvc3RQcm9jZXNzb3I9ITEsZGVsZXRlIGEuZGVmYXVsdFZhbHVlO249dGhpcy5uZXN0aW5nUmVnZXhwLmV4ZWModCk7KXt2YXIgdT1bXSxjPSExO2lmKG5bMF0uaW5jbHVkZXModGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KTtuWzFdPWwuc2hpZnQoKSx1PWwsYz0hMH1pZigocj1lKHMuY2FsbCh0aGlzLG5bMV0udHJpbSgpLGEpLGEpKSYmblswXT09PXQmJiJzdHJpbmciIT10eXBlb2YgcilyZXR1cm4gcjsic3RyaW5nIiE9dHlwZW9mIHImJihyPVV0KHIpKSxyfHwodGhpcy5sb2dnZXIud2FybigibWlzc2VkIHRvIHJlc29sdmUgIi5jb25jYXQoblsxXSwiIGZvciBuZXN0aW5nICIpLmNvbmNhdCh0KSkscj0iIiksYyYmKHI9dS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gby5mb3JtYXQodCxlLGkubG5nLGkpfSxyLnRyaW0oKSkpLHQ9dC5yZXBsYWNlKG5bMF0sciksdGhpcy5yZWdleHAubGFzdEluZGV4PTB9cmV0dXJuIHR9fV0pLHR9KCk7dmFyIG9lPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxuLHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9O3JldHVybiBqdCh0aGlzLGUpLG89THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmX3QuY2FsbChDdChvKSksby5iYWNrZW5kPXQsby5zdG9yZT1uLG8uc2VydmljZXM9cixvLmxhbmd1YWdlVXRpbHM9ci5sYW5ndWFnZVV0aWxzLG8ub3B0aW9ucz1pLG8ubG9nZ2VyPUR0LmNyZWF0ZSgiYmFja2VuZENvbm5lY3RvciIpLG8uc3RhdGU9e30sby5xdWV1ZT1bXSxvLmJhY2tlbmQmJm8uYmFja2VuZC5pbml0JiZvLmJhY2tlbmQuaW5pdChyLGkuYmFja2VuZCxpKSxvfXJldHVybiBOdChlLF90KSxPdChlLFt7a2V5OiJxdWV1ZUxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPXRoaXMsaT1bXSxhPVtdLHM9W10sdT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcz0iIi5jb25jYXQodCwifCIpLmNvbmNhdChlKTshbi5yZWxvYWQmJm8uc3RvcmUuaGFzUmVzb3VyY2VCdW5kbGUodCxlKT9vLnN0YXRlW3NdPTI6by5zdGF0ZVtzXTwwfHwoMT09PW8uc3RhdGVbc10/YS5pbmRleE9mKHMpPDAmJmEucHVzaChzKTooby5zdGF0ZVtzXT0xLHI9ITEsYS5pbmRleE9mKHMpPDAmJmEucHVzaChzKSxpLmluZGV4T2Yocyk8MCYmaS5wdXNoKHMpLHUuaW5kZXhPZihlKTwwJiZ1LnB1c2goZSkpKX0pLHJ8fHMucHVzaCh0KX0pLChpLmxlbmd0aHx8YS5sZW5ndGgpJiZ0aGlzLnF1ZXVlLnB1c2goe3BlbmRpbmc6YSxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOmkscGVuZGluZzphLHRvTG9hZExhbmd1YWdlczpzLHRvTG9hZE5hbWVzcGFjZXM6dX19fSx7a2V5OiJsb2FkZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTtlJiZ0aGlzLmVtaXQoImZhaWxlZExvYWRpbmciLG8saSxlKSxuJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlQnVuZGxlKG8saSxuKSx0aGlzLnN0YXRlW3RdPWU/LTE6Mjt2YXIgYT17fTt0aGlzLnF1ZXVlLmZvckVhY2goZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPUJ0KHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfShuLmxvYWRlZCxbb10saSksZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5pbmRleE9mKGUpOy0xIT09bjspdC5zcGxpY2UobiwxKSxuPXQuaW5kZXhPZihlKX0obi5wZW5kaW5nLHQpLGUmJm4uZXJyb3JzLnB1c2goZSksMCE9PW4ucGVuZGluZy5sZW5ndGh8fG4uZG9uZXx8KE9iamVjdC5rZXlzKG4ubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2FbdF18fChhW3RdPVtdKSxuLmxvYWRlZFt0XS5sZW5ndGgmJm4ubG9hZGVkW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7YVt0XS5pbmRleE9mKGUpPDAmJmFbdF0ucHVzaChlKX0pfSksbi5kb25lPSEwLG4uZXJyb3JzLmxlbmd0aD9uLmNhbGxiYWNrKG4uZXJyb3JzKTpuLmNhbGxiYWNrKCkpfSksdGhpcy5lbWl0KCJsb2FkZWQiLGEpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIXQuZG9uZX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MCxpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTozNTAsYT1hcmd1bWVudHMubGVuZ3RoPjU/YXJndW1lbnRzWzVdOnZvaWQgMDtyZXR1cm4gdC5sZW5ndGg/dGhpcy5iYWNrZW5kW25dKHQsZSxmdW5jdGlvbihzLHUpe3MmJnUmJm88NT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5yZWFkLmNhbGwocix0LGUsbixvKzEsMippLGEpfSxpKTphKHMsdSl9KTphKG51bGwse30pfX0se2tleToicHJlcGFyZUxvYWRpbmciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxvPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwO2lmKCF0aGlzLmJhY2tlbmQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIk5vIGJhY2tlbmQgd2FzIGFkZGVkIHZpYSBpMThuZXh0LnVzZS4gV2lsbCBub3QgbG9hZCByZXNvdXJjZXMuIiksbyYmbygpOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSksInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pO3ZhciBpPXRoaXMucXVldWVMb2FkKHQsZSxyLG8pO2lmKCFpLnRvTG9hZC5sZW5ndGgpcmV0dXJuIGkucGVuZGluZy5sZW5ndGh8fG8oKSxudWxsO2kudG9Mb2FkLmZvckVhY2goZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSl9fSx7a2V5OiJsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse30sbil9fSx7a2V5OiJyZWxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt0aGlzLnByZXBhcmVMb2FkaW5nKHQsZSx7cmVsb2FkOiEwfSxuKX19LHtrZXk6ImxvYWRPbmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IiIscj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTt0aGlzLnJlYWQobyxpLCJyZWFkIix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKHIsYSl7ciYmZS5sb2dnZXIud2FybigiIi5jb25jYXQobiwibG9hZGluZyBuYW1lc3BhY2UgIikuY29uY2F0KGksIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KG8sIiBmYWlsZWQiKSxyKSwhciYmYSYmZS5sb2dnZXIubG9nKCIiLmNvbmNhdChuLCJsb2FkZWQgbmFtZXNwYWNlICIpLmNvbmNhdChpLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChvKSxhKSxlLmxvYWRlZCh0LHIsYSl9KX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGwhPW4mJiIiIT09biYmKHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwsVHQoe30saSx7aXNVcGRhdGU6b30pKSx0JiZ0WzBdJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlKHRbMF0sZSxuLHIpKX19XSksZX0oKTtmdW5jdGlvbiBpZSgpe3JldHVybntkZWJ1ZzohMSxpbml0SW1tZWRpYXRlOiEwLG5zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6WyJ0cmFuc2xhdGlvbiJdLGZhbGxiYWNrTG5nOlsiZGV2Il0sZmFsbGJhY2tOUzohMSx3aGl0ZWxpc3Q6ITEsbm9uRXhwbGljaXRXaGl0ZWxpc3Q6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9e307aWYoIm9iamVjdCI9PT1TdCh0WzFdKSYmKGU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzFdJiYoZS5kZWZhdWx0VmFsdWU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzJdJiYoZS50RGVzY3JpcHRpb249dFsyXSksIm9iamVjdCI9PT1TdCh0WzJdKXx8Im9iamVjdCI9PT1TdCh0WzNdKSl7dmFyIG49dFszXXx8dFsyXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09blt0XX0pfXJldHVybiBlfSxpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMCxmb3JtYXQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHR9LHByZWZpeDoie3siLHN1ZmZpeDoifX0iLGZvcm1hdFNlcGFyYXRvcjoiLCIsdW5lc2NhcGVQcmVmaXg6Ii0iLG5lc3RpbmdQcmVmaXg6IiR0KCIsbmVzdGluZ1N1ZmZpeDoiKSIsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6IiwiLG1heFJlcGxhY2VzOjFlMyxza2lwT25WYXJpYWJsZXM6ITF9fX1mdW5jdGlvbiBhZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQubnMmJih0Lm5zPVt0Lm5zXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTG5nJiYodC5mYWxsYmFja0xuZz1bdC5mYWxsYmFja0xuZ10pLCJzdHJpbmciPT10eXBlb2YgdC5mYWxsYmFja05TJiYodC5mYWxsYmFja05TPVt0LmZhbGxiYWNrTlNdKSx0LndoaXRlbGlzdCYmKHQud2hpdGVsaXN0JiZ0LndoaXRlbGlzdC5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC53aGl0ZWxpc3Q9dC53aGl0ZWxpc3QuY29uY2F0KFsiY2ltb2RlIl0pKSx0LnN1cHBvcnRlZExuZ3M9dC53aGl0ZWxpc3QpLHQubm9uRXhwbGljaXRXaGl0ZWxpc3QmJih0Lm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncz10Lm5vbkV4cGxpY2l0V2hpdGVsaXN0KSx0LnN1cHBvcnRlZExuZ3MmJnQuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC5zdXBwb3J0ZWRMbmdzPXQuc3VwcG9ydGVkTG5ncy5jb25jYXQoWyJjaW1vZGUiXSkpLHR9ZnVuY3Rpb24gc2UoKXt9dmFyIHVlPW5ldyhmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIHQsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZihqdCh0aGlzLGUpLHQ9THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmX3QuY2FsbChDdCh0KSksdC5vcHRpb25zPWFlKG4pLHQuc2VydmljZXM9e30sdC5sb2dnZXI9RHQsdC5tb2R1bGVzPXtleHRlcm5hbDpbXX0sciYmIXQuaXNJbml0aWFsaXplZCYmIW4uaXNDbG9uZSl7aWYoIXQub3B0aW9ucy5pbml0SW1tZWRpYXRlKXJldHVybiB0LmluaXQobixyKSxMdCh0LEN0KHQpKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0KG4scil9LDApfXJldHVybiB0fXJldHVybiBOdChlLF90KSxPdChlLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sbj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtmdW5jdGlvbiByKHQpe3JldHVybiB0PyJmdW5jdGlvbiI9PXR5cGVvZiB0P25ldyB0OnQ6bnVsbH1pZigiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG49ZSxlPXt9KSxlLndoaXRlbGlzdCYmIWUuc3VwcG9ydGVkTG5ncyYmdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJ3aGl0ZWxpc3QiLCdvcHRpb24gIndoaXRlbGlzdCIgd2lsbCBiZSByZW5hbWVkIHRvICJzdXBwb3J0ZWRMbmdzIiBpbiB0aGUgbmV4dCBtYWpvciAtIHBsZWFzZSBtYWtlIHN1cmUgdG8gcmVuYW1lIHRoaXMgb3B0aW9uIGFzYXAuJyksZS5ub25FeHBsaWNpdFdoaXRlbGlzdCYmIWUubm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzJiZ0aGlzLmxvZ2dlci5kZXByZWNhdGUoIndoaXRlbGlzdCIsJ29wdGlvbnMgIm5vbkV4cGxpY2l0V2hpdGVsaXN0IiB3aWxsIGJlIHJlbmFtZWQgdG8gIm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncyIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSB0aGlzIG9wdGlvbiBhc2FwLicpLHRoaXMub3B0aW9ucz1UdCh7fSxpZSgpLHRoaXMub3B0aW9ucyxhZShlKSksdGhpcy5mb3JtYXQ9dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0LG58fChuPXNlKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3RoaXMubW9kdWxlcy5sb2dnZXI/RHQuaW5pdChyKHRoaXMubW9kdWxlcy5sb2dnZXIpLHRoaXMub3B0aW9ucyk6RHQuaW5pdChudWxsLHRoaXMub3B0aW9ucyk7dmFyIG89bmV3IFp0KHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgR3QodGhpcy5vcHRpb25zLnJlc291cmNlcyx0aGlzLm9wdGlvbnMpO3ZhciBpPXRoaXMuc2VydmljZXM7aS5sb2dnZXI9RHQsaS5yZXNvdXJjZVN0b3JlPXRoaXMuc3RvcmUsaS5sYW5ndWFnZVV0aWxzPW8saS5wbHVyYWxSZXNvbHZlcj1uZXcgbmUobyx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxpLmludGVycG9sYXRvcj1uZXcgcmUodGhpcy5vcHRpb25zKSxpLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKX0saS5iYWNrZW5kQ29ubmVjdG9yPW5ldyBvZShyKHRoaXMubW9kdWxlcy5iYWNrZW5kKSxpLnJlc291cmNlU3RvcmUsaSx0aGlzLm9wdGlvbnMpLGkuYmFja2VuZENvbm5lY3Rvci5vbigiKiIsZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3QuZW1pdC5hcHBseSh0LFtlXS5jb25jYXQocikpfSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJihpLmxhbmd1YWdlRGV0ZWN0b3I9cih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksaS5sYW5ndWFnZURldGVjdG9yLmluaXQoaSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYoaS5pMThuRm9ybWF0PXIodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLGkuaTE4bkZvcm1hdC5pbml0JiZpLmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBKdCh0aGlzLnNlcnZpY2VzLHRoaXMub3B0aW9ucyksdGhpcy50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihlKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLG89MTtvPG47bysrKXJbby0xXT1hcmd1bWVudHNbb107dC5lbWl0LmFwcGx5KHQsW2VdLmNvbmNhdChyKSl9KSx0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChmdW5jdGlvbihlKXtlLmluaXQmJmUuaW5pdCh0KX0pfXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5vcHRpb25zLmxuZ3x8dGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpO3ZhciBhPVsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXTthLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPXQuc3RvcmUpW2VdLmFwcGx5KG4sYXJndW1lbnRzKX19KTt2YXIgcz1bImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdO3MuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZ1bmN0aW9uKCl7dmFyIG47cmV0dXJuKG49dC5zdG9yZSlbZV0uYXBwbHkobixhcmd1bWVudHMpLHR9fSk7dmFyIHU9TXQoKSxjPWZ1bmN0aW9uKCl7dC5jaGFuZ2VMYW5ndWFnZSh0Lm9wdGlvbnMubG5nLGZ1bmN0aW9uKGUscil7dC5pc0luaXRpYWxpemVkPSEwLHQub3B0aW9ucy5pc0Nsb25lfHx0LmxvZ2dlci5sb2coImluaXRpYWxpemVkIix0Lm9wdGlvbnMpLHQuZW1pdCgiaW5pdGlhbGl6ZWQiLHQub3B0aW9ucyksdS5yZXNvbHZlKHIpLG4oZSxyKX0pfTtyZXR1cm4gdGhpcy5vcHRpb25zLnJlc291cmNlc3x8IXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlP2MoKTpzZXRUaW1lb3V0KGMsMCksdX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06c2Uscj1uLG89InN0cmluZyI9PXR5cGVvZiB0P3Q6dGhpcy5sYW5ndWFnZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHI9dCksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYobyYmImNpbW9kZSI9PT1vLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHIoKTt2YXIgaT1bXSxhPWZ1bmN0aW9uKHQpe3QmJmUuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkodCkuZm9yRWFjaChmdW5jdGlvbih0KXtpLmluZGV4T2YodCk8MCYmaS5wdXNoKHQpfSl9O2lmKG8pYShvKTtlbHNle3ZhciBzPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQpfSl9dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGEodCl9KSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZChpLHRoaXMub3B0aW9ucy5ucyxyKX1lbHNlIHIobnVsbCl9fSx7a2V5OiJyZWxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1NdCgpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1zZSksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsZnVuY3Rpb24odCl7ci5yZXNvbHZlKCksbih0KX0pLHJ9fSx7a2V5OiJ1c2UiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGFuIHVuZGVmaW5lZCBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7aWYoIXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhIHdyb25nIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtyZXR1cm4iYmFja2VuZCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuYmFja2VuZD10KSwoImxvZ2dlciI9PT10LnR5cGV8fHQubG9nJiZ0Lndhcm4mJnQuZXJyb3IpJiYodGhpcy5tb2R1bGVzLmxvZ2dlcj10KSwibGFuZ3VhZ2VEZXRlY3RvciI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcj10KSwiaTE4bkZvcm1hdCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdD10KSwicG9zdFByb2Nlc3NvciI9PT10LnR5cGUmJkt0LmFkZFBvc3RQcm9jZXNzb3IodCksIjNyZFBhcnR5Ij09PXQudHlwZSYmdGhpcy5tb2R1bGVzLmV4dGVybmFsLnB1c2godCksdGhpc319LHtrZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5pc0xhbmd1YWdlQ2hhbmdpbmdUbz10O3ZhciByPU10KCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgbz1mdW5jdGlvbih0KXt2YXIgbz0ic3RyaW5nIj09dHlwZW9mIHQ/dDpuLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKHQpO28mJihuLmxhbmd1YWdlfHwobi5sYW5ndWFnZT1vLG4ubGFuZ3VhZ2VzPW4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobykpLG4udHJhbnNsYXRvci5sYW5ndWFnZXx8bi50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKG8pLG4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKG8pKSxuLmxvYWRSZXNvdXJjZXMobyxmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhuLmxhbmd1YWdlPW8sbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvKSxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uobyksbi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsbi5lbWl0KCJsYW5ndWFnZUNoYW5nZWQiLG8pLG4ubG9nZ2VyLmxvZygibGFuZ3VhZ2VDaGFuZ2VkIixvKSk6bi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsci5yZXNvbHZlKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSxlJiZlKHQsZnVuY3Rpb24oKXtyZXR1cm4gbi50LmFwcGx5KG4sYXJndW1lbnRzKX0pfSh0LG8pfSl9O3JldHVybiB0fHwhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yfHx0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmM/IXQmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP3RoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3Qobyk6byh0KTpvKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSkscn19LHtrZXk6ImdldEZpeGVkVCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ZnVuY3Rpb24gdChlLHIpe3ZhciBvO2lmKCJvYmplY3QiIT09U3Qocikpe2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KGk+Mj9pLTI6MCkscz0yO3M8aTtzKyspYVtzLTJdPWFyZ3VtZW50c1tzXTtvPW4ub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbZSxyXS5jb25jYXQoYSkpfWVsc2Ugbz1UdCh7fSxyKTtyZXR1cm4gby5sbmc9by5sbmd8fHQubG5nLG8ubG5ncz1vLmxuZ3N8fHQubG5ncyxvLm5zPW8ubnN8fHQubnMsbi50KGUsbyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9yLmxuZz10OnIubG5ncz10LHIubnM9ZSxyfX0se2tleToidCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLnRyYW5zbGF0ZS5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKHQ9dGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkodCxhcmd1bWVudHMpfX0se2tleToic2V0RGVmYXVsdE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz10fX0se2tleToiaGFzTG9hZGVkTmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkIix0aGlzLmxhbmd1YWdlcyksITE7aWYoIXRoaXMubGFuZ3VhZ2VzfHwhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5Iix0aGlzLmxhbmd1YWdlcyksITE7dmFyIHI9dGhpcy5sYW5ndWFnZXNbMF0sbz0hIXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGk9dGhpcy5sYW5ndWFnZXNbdGhpcy5sYW5ndWFnZXMubGVuZ3RoLTFdO2lmKCJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiEwO3ZhciBhPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnN0YXRlWyIiLmNvbmNhdCh0LCJ8IikuY29uY2F0KG4pXTtyZXR1cm4tMT09PXJ8fDI9PT1yfTtpZihuLnByZWNoZWNrKXt2YXIgcz1uLnByZWNoZWNrKHRoaXMsYSk7aWYodm9pZCAwIT09cylyZXR1cm4gc31yZXR1cm4hIXRoaXMuaGFzUmVzb3VyY2VCdW5kbGUocix0KXx8KCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8ISghYShyLHQpfHxvJiYhYShpLHQpKSl9fSx7a2V5OiJsb2FkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9TXQoKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5zPygic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24ub3B0aW9ucy5ucy5pbmRleE9mKHQpPDAmJm4ub3B0aW9ucy5ucy5wdXNoKHQpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLGUmJmUodCl9KSxyKTooZSYmZSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImxvYWRMYW5ndWFnZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49TXQoKTsic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSk7dmFyIHI9dGhpcy5vcHRpb25zLnByZWxvYWR8fFtdLG89dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHIuaW5kZXhPZih0KTwwfSk7cmV0dXJuIG8ubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChvKSx0aGlzLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24odCl7bi5yZXNvbHZlKCksZSYmZSh0KX0pLG4pOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToiZGlyIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0fHwodD10aGlzLmxhbmd1YWdlcyYmdGhpcy5sYW5ndWFnZXMubGVuZ3RoPjA/dGhpcy5sYW5ndWFnZXNbMF06dGhpcy5sYW5ndWFnZSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT49MD8icnRsIjoibHRyIn19LHtrZXk6ImNyZWF0ZUluc3RhbmNlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwO3JldHVybiBuZXcgZSh0LG4pfX0se2tleToiY2xvbmVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnNlLG89VHQoe30sdGhpcy5vcHRpb25zLG4se2lzQ2xvbmU6ITB9KSxpPW5ldyBlKG8pLGE9WyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXTtyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lbZV09dFtlXX0pLGkuc2VydmljZXM9VHQoe30sdGhpcy5zZXJ2aWNlcyksaS5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOmkuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoaSl9LGkudHJhbnNsYXRvcj1uZXcgSnQoaS5zZXJ2aWNlcyxpLm9wdGlvbnMpLGkudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2kuZW1pdC5hcHBseShpLFt0XS5jb25jYXQobikpfSksaS5pbml0KG8sciksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19XSksZX0oKSksY2U9bigxMzMpLGxlPW4ubihjZSk7ZnVuY3Rpb24gZmUodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fWZ1bmN0aW9uIHBlKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7ZmUodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gaGUodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBkZSh0LGUsbil7dmFyIHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxpPWFyZ3VtZW50cyxhPWZ1bmN0aW9uKCl7cj1udWxsLG58fHQuYXBwbHkobyxpKX0scz1uJiYhcjtjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGEsZSkscyYmdC5hcHBseShvLGkpfX1mdW5jdGlvbiBnZSh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKCF0KXJldHVybnt9O3ZhciBpPXIoby5zaGlmdCgpKTshdFtpXSYmbiYmKHRbaV09bmV3IG4pLHQ9dFtpXX1yZXR1cm4gdD97b2JqOnQsazpyKG8uc2hpZnQoKSl9Ont9fWZ1bmN0aW9uIHZlKHQsZSxuKXt2YXIgcj1nZSh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24geWUodCxlKXt2YXIgbj1nZSh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX12YXIgbWU9bmV3IFJlZ0V4cCgie3soLis/KX19IiwiZyIpO2Z1bmN0aW9uIGJlKHQsZSxuKXt2YXIgcixvLGk7Zm9yKDtyPW1lLmV4ZWModCk7KSJzdHJpbmciIT10eXBlb2Yobz1yWzFdLnRyaW0oKSkmJihvPW51bGw9PShpPW8pPyIiOiIiK2kpLG98fChvPSIiKSxvPW8ucmVwbGFjZSgvXCQvZywiJCQkJCIpLHQ9dC5yZXBsYWNlKHJbMF0sZVtvXXx8byksbWUubGFzdEluZGV4PTA7cmV0dXJuIHR9ZnVuY3Rpb24geGUodCxlLG4scixvKXt0cnl7dmFyIGk9bmV3KFhNTEh0dHBSZXF1ZXN0fHxBY3RpdmVYT2JqZWN0KSgiTVNYTUwyLlhNTEhUVFAuMy4wIik7aS5vcGVuKHI/IlBPU1QiOiJHRVQiLHQsMSksZS5jcm9zc0RvbWFpbnx8aS5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKSxlLmF1dGhvcml6ZSYmZS5hcGlLZXkmJmkuc2V0UmVxdWVzdEhlYWRlcigiQXV0aG9yaXphdGlvbiIsZS5hcGlLZXkpLChyfHxlLnNldENvbnRlbnRUeXBlSlNPTikmJmkuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24vanNvbiIpLGkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aS5yZWFkeVN0YXRlPjMmJm4mJm4oaS5yZXNwb25zZVRleHQsaSl9LGkuc2VuZChKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2godCl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nKHQpfX12YXIgd2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixyKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSxlJiZlLnByb2plY3RJZD90aGlzLmluaXQobnVsbCxlLHt9LG4pOnRoaXMuaW5pdChudWxsLG4se30sciksdGhpcy50eXBlPSJiYWNrZW5kIn12YXIgZSxuLHI7cmV0dXJuIGU9dCwobj1be2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLG89YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7dGhpcy5vcHRpb25zPXBlKHt9LHtsb2FkUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHByaXZhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vcHJpdmF0ZS97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319IixwdWxsUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3B1bGwve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIsZ2V0TGFuZ3VhZ2VzUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL2xhbmd1YWdlcy97e3Byb2plY3RJZH19IixhZGRQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vbWlzc2luZy97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319Iix1cGRhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vdXBkYXRlL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHJlZmVyZW5jZUxuZzoiZW4iLGNyb3NzRG9tYWluOiEwLHNldENvbnRlbnRUeXBlSlNPTjohMSx2ZXJzaW9uOiJsYXRlc3QiLHB1bGw6ITEscHJpdmF0ZTohMSx3aGl0ZWxpc3RUaHJlc2hvbGQ6LjksZmFpbExvYWRpbmdPbkVtcHR5SlNPTjohMSxhbGxvd2VkQWRkT3JVcGRhdGVIb3N0czpbImxvY2FsaG9zdCJdfSx0aGlzLm9wdGlvbnMsbiksdGhpcy5zZXJ2aWNlcz10LHRoaXMub3B0aW9ucy5wdWxsJiZjb25zb2xlLndhcm4oImRlcHJlY2F0ZWQ6IHB1bGwgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggbG9jaXplIHByaXZhdGUgdmVyc2lvbnMiKTt2YXIgaT13aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtpPyh0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkPXRoaXMub3B0aW9ucy5hbGxvd2VkQWRkT3JVcGRhdGVIb3N0cy5pbmRleE9mKGkpPi0xLHIuc2F2ZU1pc3NpbmcmJiF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkJiZ0JiZ0LmxvZ2dlciYmdC5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgaG9zdCAiJy5jb25jYXQoaSwnIiB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzOiAnKS5jb25jYXQodGhpcy5vcHRpb25zLmFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzLmpvaW4oIiwgIiksIiAobWF0Y2hlcyBuZWVkIHRvIGJlIGV4YWN0KS4iKSkpOnRoaXMuaXNBZGRPclVwZGF0ZUFsbG93ZWQ9ITAsImZ1bmN0aW9uIj09dHlwZW9mIG8mJnRoaXMuZ2V0T3B0aW9ucyhmdW5jdGlvbih0LHIpe2lmKHQpcmV0dXJuIG8odCk7ZS5vcHRpb25zLnJlZmVyZW5jZUxuZz1uLnJlZmVyZW5jZUxuZ3x8ci5yZWZlcmVuY2VMbmd8fGUub3B0aW9ucy5yZWZlcmVuY2VMbmcsbyhudWxsLHIpfSksdGhpcy5xdWV1ZWRXcml0ZXM9e30sdGhpcy5kZWJvdW5jZWRQcm9jZXNzPWRlKHRoaXMucHJvY2VzcywxZTQpfX0se2tleToiZ2V0TGFuZ3VhZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1iZSh0aGlzLm9wdGlvbnMuZ2V0TGFuZ3VhZ2VzUGF0aCx7cHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWR9KTt0aGlzLmxvYWRVcmwoZSx7fSx0KX19LHtrZXk6ImdldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5nZXRMYW5ndWFnZXMoZnVuY3Rpb24obixyKXtpZihuKXJldHVybiB0KG4pO3ZhciBvPU9iamVjdC5rZXlzKHIpO2lmKCFvLmxlbmd0aClyZXR1cm4gdChuZXcgRXJyb3IoIndhcyB1bmFibGUgdG8gbG9hZCBsYW5ndWFnZXMgdmlhIEFQSSIpKTt2YXIgaT1vLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiByW2VdLmlzUmVmZXJlbmNlTGFuZ3VhZ2UmJih0PWUpLHR9LCIiKSxhPW8ucmVkdWNlKGZ1bmN0aW9uKHQsbil7dmFyIG89cltuXTtyZXR1cm4gby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXSYmby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXT49ZS5vcHRpb25zLndoaXRlbGlzdFRocmVzaG9sZCYmdC5wdXNoKG4pLHR9LFtdKSxzPW8ucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPi0xfHx0fSwhMSk7dChudWxsLHtmYWxsYmFja0xuZzppLHJlZmVyZW5jZUxuZzppLHdoaXRlbGlzdDphLGxvYWQ6cz8iYWxsIjoibGFuZ3VhZ2VPbmx5In0pfSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbz17fTt0aGlzLm9wdGlvbnMucHJpdmF0ZT8ocj1iZSh0aGlzLm9wdGlvbnMucHJpdmF0ZVBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLG89e2F1dGhvcml6ZTohMH0pOnRoaXMub3B0aW9ucy5wdWxsPyhyPWJlKHRoaXMub3B0aW9ucy5wdWxsUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksbz17YXV0aG9yaXplOiEwfSk6cj1iZSh0aGlzLm9wdGlvbnMubG9hZFBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLHRoaXMubG9hZFVybChyLG8sbil9fSx7a2V5OiJsb2FkVXJsIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpczt4ZSh0LHBlKHt9LHRoaXMub3B0aW9ucyxlKSxmdW5jdGlvbihlLG8pe2lmKG8uc3RhdHVzPj01MDAmJm8uc3RhdHVzPDYwMClyZXR1cm4gbigiZmFpbGVkIGxvYWRpbmcgIit0LCEwKTtpZihvLnN0YXR1cz49NDAwJiZvLnN0YXR1czw1MDApcmV0dXJuIG4oImZhaWxlZCBsb2FkaW5nICIrdCwhMSk7dmFyIGksYTt0cnl7aT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe2E9ImZhaWxlZCBwYXJzaW5nICIrdCsiIHRvIGpzb24ifXJldHVybiBhP24oYSwhMSk6ci5vcHRpb25zLmZhaWxMb2FkaW5nT25FbXB0eUpTT04mJiFPYmplY3Qua2V5cyhpKS5sZW5ndGg/bigibG9hZGVkIHJlc3VsdCBlbXB0eSBmb3IgIit0LCExKTp2b2lkIG4obnVsbCxpKX0pfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGE9dGhpcztpZihvfHwobz1mdW5jdGlvbigpe30pLCF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkKXJldHVybiBvKCJob3N0IGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBrZXkuIik7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09YS5vcHRpb25zLnJlZmVyZW5jZUxuZ30pLmxlbmd0aDwxJiZ0aGlzLnNlcnZpY2VzJiZ0aGlzLnNlcnZpY2VzLmxvZ2dlciYmdGhpcy5zZXJ2aWNlcy5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGxhbmd1YWdlICInLmNvbmNhdCh0aGlzLm9wdGlvbnMucmVmZXJlbmNlTG5nLCciIHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgdG8gc2F2ZSBsYW5ndWFnZXM6ICcpLmNvbmNhdCh0LmpvaW4oIiwgIiksIiAob3BlbiB5b3VyIHNpdGUgaW4gdGhlIHJlZmVyZW5jZSBsYW5ndWFnZSB0byBzYXZlIG1pc3NpbmdzKS4iKSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9PT1hLm9wdGlvbnMucmVmZXJlbmNlTG5nJiZhLnF1ZXVlLmNhbGwoYSxhLm9wdGlvbnMucmVmZXJlbmNlTG5nLGUsbixyLG8saSl9KX19LHtrZXk6InVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhPXRoaXM7aWYob3x8KG89ZnVuY3Rpb24oKXt9KSwhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZClyZXR1cm4gbygiaG9zdCBpcyBub3QgYWxsb3dlZCB0byB1cGRhdGUga2V5LiIpO2l8fChpPXt9KSwic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksaS5pc1VwZGF0ZT0hMCx0LmZvckVhY2goZnVuY3Rpb24odCl7dD09PWEub3B0aW9ucy5yZWZlcmVuY2VMbmcmJmEucXVldWUuY2FsbChhLGEub3B0aW9ucy5yZWZlcmVuY2VMbmcsZSxuLHIsbyxpKX0pfX0se2tleToid3JpdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigheWUodGhpcy5xdWV1ZWRXcml0ZXMsWyJsb2NrcyIsdCxlXSkpe3ZhciByPWJlKHRoaXMub3B0aW9ucy5hZGRQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxvPWJlKHRoaXMub3B0aW9ucy51cGRhdGVQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxpPXllKHRoaXMucXVldWVkV3JpdGVzLFt0LGVdKTtpZih2ZSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSxbXSksaS5sZW5ndGgpe3ZlKHRoaXMucXVldWVkV3JpdGVzLFsibG9ja3MiLHQsZV0sITApO3ZhciBhPSExLHM9ITEsdT17fSxjPXt9O2kuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10Lm9wdGlvbnMmJnQub3B0aW9ucy50RGVzY3JpcHRpb24/e3ZhbHVlOnQuZmFsbGJhY2tWYWx1ZXx8IiIsY29udGV4dDp7dGV4dDp0Lm9wdGlvbnMudERlc2NyaXB0aW9ufX06dC5mYWxsYmFja1ZhbHVlfHwiIjt0Lm9wdGlvbnMmJnQub3B0aW9ucy5pc1VwZGF0ZT8oc3x8KHM9ITApLGNbdC5rZXldPWUpOihhfHwoYT0hMCksdVt0LmtleV09ZSl9KTt2YXIgbD0wO2EmJmwrKyxzJiZsKys7dmFyIGY9ZnVuY3Rpb24oKXstLWx8fCh2ZShuLnF1ZXVlZFdyaXRlcyxbImxvY2tzIix0LGVdLCExKSxpLmZvckVhY2goZnVuY3Rpb24odCl7dC5jYWxsYmFjayYmdC5jYWxsYmFjaygpfSksbi5kZWJvdW5jZWRQcm9jZXNzKHQsZSkpfTtsfHxmKCksYSYmeGUocixwZSh7fSx7YXV0aG9yaXplOiEwfSx0aGlzLm9wdGlvbnMpLGZ1bmN0aW9uKHQsZSl7ZigpfSx1KSxzJiZ4ZShvLHBlKHt9LHthdXRob3JpemU6ITB9LHRoaXMub3B0aW9ucyksZnVuY3Rpb24odCxlKXtmKCl9LGMpfX19fSx7a2V5OiJwcm9jZXNzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7T2JqZWN0LmtleXModGhpcy5xdWV1ZWRXcml0ZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7ImxvY2tzIiE9PWUmJk9iamVjdC5rZXlzKHQucXVldWVkV3JpdGVzW2VdKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QucXVldWVkV3JpdGVzW2VdW25dLmxlbmd0aCYmdC53cml0ZShlLG4pfSl9KX19LHtrZXk6InF1ZXVlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWdlKHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSx7a2V5Om4sZmFsbGJhY2tWYWx1ZTpyfHwiIixjYWxsYmFjazpvLG9wdGlvbnM6aX0pLHRoaXMuZGVib3VuY2VkUHJvY2VzcygpfX1dKSYmaGUoZS5wcm90b3R5cGUsbiksciYmaGUoZSxyKSx0fSgpO3dlLnR5cGU9ImJhY2tlbmQiO3ZhciBrZT13ZSxTZT1uKDQzKTtmdW5jdGlvbiBFZSgpe3JldHVybihFZT14dCgpKHZ0LmEubWFyayhmdW5jdGlvbiB0KGUpe3JldHVybiB2dC5hLndyYXAoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLG5ldyBrdC5hKGZ1bmN0aW9uKHQpe3VlLmNoYW5nZUxhbmd1YWdlKGUsZnVuY3Rpb24oKXt0KHZvaWQgMCl9KX0pKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19LHQpfSkpKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gVGUoKXt2YXIgdDtyZXR1cm4gbXQoKSh0PXVlLnQpLmNhbGwodCx1ZSl9dmFyIGplPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrdC5hKGZ1bmN0aW9uKHQsZSl7dWUudXNlKG5ldyBsZS5hKG51bGwse29yZGVyOlsibmF2aWdhdG9yIl19KSkudXNlKGtlKS5pbml0KHtmYWxsYmFja0xuZzoiZW4iLG5zOlsiZGVmYXVsdCJdLGRlZmF1bHROUzoiZGVmYXVsdCIsYmFja2VuZDp7cHJvamVjdElkOlNlLmxvY2l6ZS5wcm9kdWN0SWQsdmVyc2lvbjpTZS5sb2NpemUudmVyc2lvbixhcGlLZXk6U2UubG9jaXplLmFwaUtleSxyZWZlcmVuY2VMbmc6ImVuIn19LGZ1bmN0aW9uKG4scil7cmV0dXJuIG4/ZShuKTp0KHIpfSl9KX0sY2hhbmdlTGFuZ3VhZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIEVlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZ2V0TGFuZ3VhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gdWUubGFuZ3VhZ2V9LGdldFQ6VGV9LEFlPW4oODMpLE9lPW4ubihBZSksQ2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWUuZGF0YTtwKCkodGhpcyx0KSx0aGlzLmRhdGE9bn1yZXR1cm4gZCgpKHQsbnVsbCxbe2tleToiY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0xO3I8ZS5sZW5ndGg7cis9MSl7Zm9yKHZhciBvPXt9LGk9MDtpPHQubGVuZ3RoO2krPTEpb1t0W2ldXT1lW3JdW2ldO24ucHVzaChvKX1yZXR1cm4gbn19LHtrZXk6InNwbGl0Q291bnRyaWVzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD8iIj09PXR8fCIsIj09PXQ/W106dC5zcGxpdCgiLCIpOltdfX0se2tleToibm9ybWFsaXplUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0wLG89VygpKHQpO3I8by5sZW5ndGg7cisrKXt2YXIgaSxhPXRbb1tyXV07YS5zaGlmdCgpLG49dSgpKGk9W10pLmNhbGwoaSxPZSgpKG4pLE9lKCkoYSkpfXJldHVybiBuLnVuc2hpZnQoZSkse2RhdGE6bn19fV0pLHR9KCk7ZnVuY3Rpb24gTGUodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFvLmEpcmV0dXJuITE7aWYoby5hLnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKCkoRGF0ZSxbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1rKCkodCk7aWYoZSl7dmFyIGk9aygpKHRoaXMpLmNvbnN0cnVjdG9yO249bygpKHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4geCgpKHRoaXMsbil9fXZhciBSZT17YnlVcmw6e25hbWU6ImJ5VXJsIixjb2x1bW5zOlsidXJsIiwiY291bnRyaWVzIl19LGJ5SXRlbU5hbWU6e25hbWU6ImJ5SXRlbU5hbWUiLGNvbHVtbnM6WyJpdGVtTmFtZSIsImNvdW50cmllcyJdfSxieUl0ZW1Db2RlOntuYW1lOiJieUl0ZW1Db2RlIixjb2x1bW5zOlsiaXRlbUNvZGUiLCJjb3VudHJpZXMiXX0sYnlDYXRlZ29yeTp7bmFtZToiYnlDYXRlZ29yeSIsY29sdW1uczpbImNhdGVnb3J5IiwiY291bnRyaWVzIl19LGJ5SXRlbURlc2NyaXB0aW9uOntuYW1lOiJieUl0ZW1EZXNjcmlwdGlvbiIsY29sdW1uczpbInRleHQiLCJjb3VudHJpZXMiXX19LFBlPWZ1bmN0aW9uKHQpe20oKShuLHQpO3ZhciBlPUxlKG4pO2Z1bmN0aW9uIG4odCl7dmFyIHI7cmV0dXJuIHAoKSh0aGlzLG4pLChyPWUuY2FsbCh0aGlzLHQpKS5kYXRhPXQuZGF0YSxyLnNoZWV0VHlwZT10LnNoZWV0VHlwZXx8UmUscn1yZXR1cm4gZCgpKG4sW3trZXk6ImJ5VXJsIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieVVybClyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieVVybDtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBsKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dXJsOmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5zaGVldFR5cGUuYnlJdGVtTmFtZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieUl0ZW1OYW1lO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGwoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybntpdGVtTmFtZTplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOkNlLnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImJ5SXRlbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbUNvZGUpcmV0dXJuW107dmFyIHQ9dGhpcy5zaGVldFR5cGUuYnlJdGVtQ29kZTtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBsKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57aXRlbUNvZGU6ZVt0LmNvbHVtbnNbMF1dLGNvdW50cmllczpDZS5zcGxpdENvdW50cmllcyhuKSxpc0FsbDoiQUxMIj09PW59fSl9fSx7a2V5OiJieUNhdGVnb3J5Iix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieUNhdGVnb3J5KXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5Q2F0ZWdvcnk7aWYoIXRoaXMuZGF0YVt0Lm5hbWVdKXJldHVybltdO3ZhciBlPUNlLmNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEodC5jb2x1bW5zLHRoaXMuZGF0YVt0Lm5hbWVdKTtyZXR1cm4gbCgpKGUpLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgbj1lW3QuY29sdW1uc1sxXV07cmV0dXJue2NhdGVnb3J5OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtRGVzY3JpcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGwoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybnt0ZXh0OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZXhjbHVzaW9uOntieVVybDp0aGlzLmJ5VXJsKCksYnlJdGVtTmFtZTp0aGlzLmJ5SXRlbU5hbWUoKSxieUl0ZW1Db2RlOnRoaXMuYnlJdGVtQ29kZSgpLGJ5Q2F0ZWdvcnk6dGhpcy5ieUNhdGVnb3J5KCksYnlJdGVtRGVzY3JpcHRpb246dGhpcy5ieUl0ZW1EZXNjcmlwdGlvbigpfX19fV0pLG59KENlKSxOZT1uKDYzKSxJZT1uLm4oTmUpLERlPW4oODQpO2Z1bmN0aW9uIF9lKHQsZSl7dmFyIG47aWYodm9pZCAwPT09VS5hfHxudWxsPT1fKCkodCkpe2lmKEkoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBNZSh0LGUpO3ZhciByPUgoKShuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpOyJPYmplY3QiPT09ciYmdC5jb25zdHJ1Y3RvciYmKHI9dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PXJ8fCJTZXQiPT09cilyZXR1cm4gcSgpKHQpO2lmKCJBcmd1bWVudHMiPT09cnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpcmV0dXJuIE1lKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1QKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtzPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBNZSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIFVlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9aygpKHQpO2lmKGUpe3ZhciBpPWsoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHgoKSh0aGlzLG4pfX12YXIgQmU9ZnVuY3Rpb24odCl7bSgpKG4sdCk7dmFyIGU9VWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBwKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZCgpKG4sW3trZXk6ImV4Y2x1ZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGEscz0hMSxjPXRoaXMubG9jYXRpb24uY291bnRyeSxsPV9lKHQpO3RyeXtmb3IobC5zKCk7IShvPWwubigpKS5kb25lOyl7dmFyIGY9by52YWx1ZTtpZihyKGYpKXtzPW4ubWF0Y2hDb3VudHJ5KGYsYyk7YnJlYWt9fX1jYXRjaCh0KXtsLmUodCl9ZmluYWxseXtsLmYoKX1yZXR1cm4gcz8oYXQuYS5kZWJ1Zyh1KCkoaT0iRVhDTFVERUQgQlkgU1BSRUFEU0hFRVQ6ICIuY29uY2F0KGUsIiwgIikpLmNhbGwoaSxjKSkse2NvZGU6IkVYQ0xVREVEX0JZX0JMQUNLTElTVCIsbWVzc2FnZTp1KCkoYT0iIi5jb25jYXQoZSwiLCAiKSkuY2FsbChhLGMsIiDjgavoqbLlvZPjgZfjgZ/jgZ/jgoHpmaTlpJYiKSxwYXJhbXM6e3ZhbHVlOmUsY291bnRyeTpjfX0pOkRlLmF9fV0sW3trZXk6Im1hdGNoQ291bnRyeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4hKCF0LmlzQWxsJiYwIT09dC5jb3VudHJpZXMubGVuZ3RoKXx8SWUoKShuPXQuY291bnRyaWVzKS5jYWxsKG4sZSl9fV0pLG59KERlLmIpO2Z1bmN0aW9uIHFlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9aygpKHQpO2lmKGUpe3ZhciBpPWsoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHgoKSh0aGlzLG4pfX12YXIgRmU9d2luZG93LnppZ3phZyxIZT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJidG4tbmF2IikubGVuZ3RoPjAsemU9L1wvaXRlbVwvXGQrLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtkdC5vbkNoYW5nZXNSZWFkeShmdW5jdGlvbih0KXsvdG93ZXJcLmpwXC8vLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoSGU/KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5pdGVtLWluZm8tbWFpbiAubWFpbi1jYXJ0aW4tYnRuLCAjRmxvYXRpbmdDYXJ0SW4gLm1haW4tY2FydGluLWJ0biIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShuPXIuY2xvc2VzdCgiLnJlbGF0aW9uLWdyb3VwLWl0ZW0tcm93IikpLmNhbGwobiwiLml0ZW0taW5mby1ibG9jayA+IGEiKS5hdHRyKCJocmVmIil8fCIifX0pKSxkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmJD0iL2VjL1Nob3BwaW5nQmFnL0l0ZW1MaXN0Il0nLGZ1bmN0aW9uKCl7RmUucGFnZVRvKCJjYXJ0Iil9KSx0KCIuYm94LnNlY3Rpb24sIC50ZXh0LWhvbGRlciIpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmKj0iYWN0aW9uPWNhcnRpbiJdJyxmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG49dChlLnRhcmdldCk7aWYobi5jbG9zZXN0KCIuZXZlbi1pdGVtIikubGVuZ3RoPjApe3ZhciByPW4uY2xvc2VzdCgiLmV2ZW4taXRlbSIpO0UoKShyKS5jYWxsKHIsIi5zdWItdGl0bGUiKS5sZW5ndGg+MD93aW5kb3cubG9jYXRpb24uaHJlZj1FKCkocikuY2FsbChyLCIuc3ViLXRpdGxlID4gYSIpLmF0dHIoImhyZWYiKXx8IiI6RSgpKHIpLmNhbGwociwiLndyYXBwLXRleHQiKS5sZW5ndGg+MCYmKHdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShyKS5jYWxsKHIsIi53cmFwcC10ZXh0IGE6Zmlyc3Qtb2YtdHlwZSIpLmF0dHIoImhyZWYiKXx8IiIpfX19KSk6KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5wcmljZS1pbmZvLW1haW4gLmNhcnRpbi1hcmVhLW5vd29uc2FsZSwgLnByaWNlLWluZm8tbWFpbiAuY2FydGluLWFyZWEtcmVzZXJ2ZSIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShuPXIuY2xvc2VzdCgiLml0ZW0tYmxvY2siKSkuY2FsbChuLCIuaXRlbS1pbmZvLWJsb2NrID4gYSIpLmF0dHIoImhyZWYiKXx8IiJ9fSkpLGR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYkPSIvZWMvU2hvcHBpbmdCYWcvSXRlbUxpc3QiXScsZnVuY3Rpb24oKXtGZS5wYWdlVG8oImNhcnQiKX0pLHQoIi50b3BNb2R1bGVCb3gsIC5hcnRpc3RNYWluT25lQ29sdW1uLCAuc2VhcmNoTGlzdFRhYmxlIikubGVuZ3RoPjAmJmR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYqPSJhY3Rpb249Y2FydGluIl0nLGZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0KXt2YXIgbixyPXQoZS50YXJnZXQpO2lmKHIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShuPXIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpKS5jYWxsKG4sIi5uYW1lOmZpcnN0LW9mLXR5cGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIjtlbHNlIGlmKHIuY2xvc2VzdCgiLmFydGlzdFNlY3Rpb25MaW5lMDEiKS5sZW5ndGg+MCl7dmFyIG87d2luZG93LmxvY2F0aW9uLmhyZWY9RSgpKG89ci5jbG9zZXN0KCJsaSIpKS5jYWxsKG8sIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuaW5NZGwtZmVhdHVyZUl0ZW1DZWxsLCAuZGlzY29ncmFwaHlMaW5ldXBUYWJsZTAxIikubGVuZ3RoPjApe3ZhciBpO3dpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShpPXIuY2xvc2VzdCgiLmluTWRsLWZlYXR1cmVJdGVtQ2VsbCwgLmRpc2NvZ3JhcGh5TGluZXVwVGFibGUwMSIpKS5jYWxsKGksIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuZmVhdHVyZUl0ZW1PdGhlckxpc3QwMSIpLmxlbmd0aD4wKXt2YXIgYTt3aW5kb3cubG9jYXRpb24uaHJlZj1FKCkoYT1yLmNsb3Nlc3QoImxpIikpLmNhbGwoYSwiLmltZyA+IHAgPiBhIikuYXR0cigiaHJlZiIpfHwiIn1lbHNlIGlmKHIuY2xvc2VzdCgiLmluTWRsLWF0Y2xJdGVtUm93IikubGVuZ3RoPjApe3ZhciBzO3dpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShzPXIuY2xvc2VzdCgibGkiKSkuY2FsbChzLCIudGl0bGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIn19fSx7ZGlzYWJsZVBvaW50ZXJFdmVudDohMH0pKSl9KTt2YXIgV2U9ZnVuY3Rpb24odCl7bSgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBwKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZCgpKG4sW3trZXk6ImdldEl0ZW0iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxyPXRoaXMsbz12KCkoaygpKG4ucHJvdG90eXBlKSwiZ2V0SXRlbSIsdGhpcykuY2FsbCh0aGlzKTtIZT9vLmltYWdlcz1sKCkodD10aGlzLiQoIiNqYWNrZXRQaG90b1N3aXBlciAubWFpbi1qYWNrZXQgaW1nIikuZ2V0KCkpLmNhbGwodCxmdW5jdGlvbih0KXtyZXR1cm4gci4kKHQpLmF0dHIoInNyYyIpfHwiIn0pOm8uaW1hZ2VzPWwoKShlPXRoaXMuJCgiI21haW4taW1hZ2UiKS5nZXQoKSkuY2FsbChlLGZ1bmN0aW9uKHQpe3JldHVybiByLiQodCkuYXR0cigic3JjIil8fCIifSk7cmV0dXJuIG99fSx7a2V5OiJnZXRJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7cmV0dXJuIHRoaXMuJCgiI1ByaXZpbGVnZUFyZWEiKS5sZW5ndGg+MD90KyLvvIjnibnlhbjjgYLjgorvvIkiOnR9fSx7a2V5OiJnZXRJdGVtUHJpY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT10LG49dGhpcy4kKCIuc2FsZS1wcmljZS12YWx1ZSIpLHI9dGhpcy4kKCIubXVsdGlidXktcHJpY2UtbGFiZWwiKS50ZXh0KCk7cmV0dXJuIG4ubGVuZ3RoPjAmJigv44G+44Go44KB44Gm44Kq44OV5L6h5qC8Ly50ZXN0KHIpfHwoZT1BKG4udGV4dCgpKSkpLGV9fSx7a2V5OiJnZXRQdXJjaGFzYWJsZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10aGlzLiQoJy5jYXJ0aW4tYXJlYS1ub3dvbnNhbGVbb25jbGljayo9IkNhcnRJbiJdLCAuY2FydGluLWFyZWEtcmVzZXJ2ZVtvbmNsaWNrKj0iQ2FydEluIl0nKS5sZW5ndGh8fChhdC5hLmRlYnVnKCLjgqvjg7zjg4jjg5zjgr/jg7PjgYznhKHjgYTjgZ/jgoHjgIHos7zlhaXkuI3lj68iKSwhMSl9fV0pLG59KEcpLCRlPWZ1bmN0aW9uKHQpe20oKShuLHQpO3ZhciBlPXFlKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gcCgpKHRoaXMsbiksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG59KFdlKSxZZT1mdW5jdGlvbih0KXttKCkobix0KTt2YXIgZT1xZShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIHAoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufShXZSksVmU9ZnVuY3Rpb24odCl7bSgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBwKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oQmUpO0ZlLmRpc2NvdmVyeShmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLG49dC5sb2NhdGlvbjshZnVuY3Rpb24odCxlKXt2YXIgbj13aW5kb3cuemlnemFnO24mJm4udXRpbHMuZmV0Y2hIdG1sKHQsZSl9KGZ1bmN0aW9uKHQpe3RyeXtpZighemUpcmV0dXJuIGUoKTt2YXIgcixvPW5ldyBQZSh7ZGF0YTpGZS5zaG9wRGF0YXx8e319KS5leGVjdXRlKCk7aWYoSGUpe3I9bmV3ICRlKHskOnQsbmFtZToiLml0ZW0tamFja2V0LXRpdGxlIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLml0ZW0taW5mbyAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfWVsc2V7cj1uZXcgWWUoeyQ6dCxuYW1lOiIuaXRlbS1pbmZvIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLnByaWNlLWluZm8tbWFpbiAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfXZhciBpPW5ldyBWZSh7bG9jYXRpb246bixzY3JhcGVyUmVzdWx0OnIsZGF0YTpvLmV4Y2x1c2lvbn0pLmV4ZWN1dGUoKTtyZXR1cm4gZShudWxsLHtpdGVtOnIuaXRlbSxza3VSb3dzOnIuc2t1Um93cyxleGNsdXNpb246aX0pfWNhdGNoKHQpe3JldHVybiBlKHQpfX0pfSk7dmFyIEdlPW5ldyBEYXRlKCJUaHUgTWFyIDQgMjAyMSAwMDowMDowMCBHTVQrMDgwMCIpLEtlPW5ldyBEYXRlKCJXZWQgTWFyIDE3IDIwMjEgMjM6NTk6NTkgR01UKzA4MDAiKSxYZT1uZXcgRGF0ZSxKZT1Cb29sZWFuKEZlLmxvY2F0aW9uJiYiQ04iPT09RmUubG9jYXRpb24uY291bnRyeSk7aWYoWGUuZ2V0VGltZSgpPj1HZS5nZXRUaW1lKCkmJlhlLmdldFRpbWUoKTw9S2UuZ2V0VGltZSgpJiZKZSl7aWYoRmUubm90aWNlTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG49VGUoKTtyZXR1cm57anVtYm90cm9uOntodG1sOnUoKSh0PXUoKShlPSJcbiAgPGRpdiBzdHlsZT0nbWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Jz5cbiAgPGRpdj5cbiAgPHNwYW4gc3R5bGU9J21hcmdpbjogMzRweCAwIDAgIWltcG9ydGFudDsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsnPjxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL25vdGljZU1vZGFsX2xvZ28ucG5nJyBhbHQ9J1dvcmxkU2hvcHBpbmfDl1RPV0VSIFJFQ09SRFMnIHN0eWxlPSdtYXgtd2lkdGg6IDQwMHB4ICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Jz48L3NwYW4+XG4gIDxoMSBzdHlsZT0nZm9udC1zaXplOiAyLjlyZW0gIWltcG9ydGFudDsnPiIuY29uY2F0KG4oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwiPC9oMT5cbiAgPGgyIHN0eWxlPSdmb250LXNpemU6IDEuNHJlbSAhaW1wb3J0YW50Oyc+IikpLmNhbGwoZSxuKCJjb21tb24ubm90aWNlTW9kYWwuanVtYm90cm9uLmgyIiksIjwvaDI+XG4gIDxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL2NvbW1vbi9hbGlwYXlfY2FtcGFpZ25fMjAyMTAzMDQucG5nJyBzdHlsZT0nd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgbWF4LXdpZHRoOiA1MDBweCAhaW1wb3J0YW50Oyc+XG4gIDxhIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7JyBocmVmPSdodHRwczovL3Rvd2VyLmpwL3NpdGUvaG93dG8vZm9yaW50ZXJuYXRpb25hbGN1c3RvbWVyJz5cbiAgPHNwYW4gc3R5bGU9J2Rpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXNpemU6IDEuNnJlbSAhaW1wb3J0YW50O1xuICAgICAgbWFyZ2luOiAxcmVtIGF1dG8gIWltcG9ydGFudDtcbiAgICAgIHBhZGRpbmc6IDFyZW0gIWltcG9ydGFudDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7XG4gICAgICBtYXgtd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXI6IHNvbGlkICNmZmNhMDAgIWltcG9ydGFudDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmNhMDAgIWltcG9ydGFudDtcbiAgICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LG4oInRvd2VyX2pwLm5vdGljZU1vZGFsLmp1bWJvdHJvbi50ZXh0IiksIjwvc3Bhbj5cbiAgPC9hPlxuICA8L2Rpdj5cbiAgPC9kaXY+XG4gICIpfX19KSx6ZSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaXRlbS1pbmZvLW1haW4gLnN0b2NrLXN0YXR1cyIpLmxlbmd0aD4wJiYi44GK5Y+W44KK5a+E44GbIj09PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIilbMF0udGV4dENvbnRlbnQ/RmUuaXRlbU1vZGFsKGZ1bmN0aW9uKCl7dmFyIHQsZT1UZSgpO3JldHVybntib3R0b206e2h0bWw6dSgpKHQ9IlxuICA8ZGl2IHN0eWxlPSdtYXJnaW46IC0xMHB4IDAgLThweCAhaW1wb3J0YW50Oyc+XG4gIDxwIHN0eWxlPSdjb2xvcjogcmVkICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7XG4gICAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50O1xuICAgICAgbWFyZ2luOiAwLjRlbSAwICFpbXBvcnRhbnQ7Jz4iLmNvbmNhdChlKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50aXRsZSIpLCI8L3A+XG4gIDxwIHN0eWxlPSdmb250LXNpemU6IDExcHggIWltcG9ydGFudDtcbiAgICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZSAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50O1xuICAgICAgcGFkZGluZy1ib3R0b206IDAuMmVtICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LGUoInRvd2VyX2pwLml0ZW0uYm90dG9tLnRleHQiKSwiPC9wPlxuICA8L2Rpdj5cbiAgPGltZyBzcmM9J2h0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvY29tbW9uL2FsaXBheV9jYW1wYWlnbl8yMDIxMDMwNC5wbmcnIHN0eWxlPSd3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBtYXJnaW4tYm90dG9tOiAtMTVweCAhaW1wb3J0YW50Oyc+XG4gICIpfX19KTpGZS5pdGVtTW9kYWwoZnVuY3Rpb24oKXtyZXR1cm57Ym90dG9tOntodG1sOiJcbiAgICAgIDxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL2NvbW1vbi9hbGlwYXlfY2FtcGFpZ25fMjAyMTAzMDQucG5nJyBzdHlsZT0nd2lkdGg6IDEwMCUgIWltcG9ydGFudDsnPlxuICAgICAgIn19fSk7RmUubGF1bmNoKGZ1bmN0aW9uKCl7dmFyIHQ9IXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oIlNUT1JBR0VfS0VZX3JhZ3RhZ19qcCIpO3JldHVybiBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCJTVE9SQUdFX0tFWV9yYWd0YWdfanAiLGEoKSghMCkpLHQ/Im5vdGljZSI6bnVsbH0pfWVsc2V7aWYoRmUubm90aWNlTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG49VGUoKTtyZXR1cm57anVtYm90cm9uOntodG1sOnUoKSh0PXUoKShlPSJcbjxkaXYgc3R5bGU9J21hcmdpbjogNnB4IDAgMCAhaW1wb3J0YW50Oyc+XG48ZGl2PlxuPHNwYW4gc3R5bGU9J21hcmdpbjogMzRweCAwIDAgIWltcG9ydGFudDsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsnPjxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL25vdGljZU1vZGFsX2xvZ28ucG5nJyBhbHQ9J1dvcmxkU2hvcHBpbmfDl1RPV0VSIFJFQ09SRFMnIHN0eWxlPSdtYXgtd2lkdGg6IDQwMHB4ICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Jz48L3NwYW4+XG48aDEgc3R5bGU9J2ZvbnQtc2l6ZTogMi45cmVtICFpbXBvcnRhbnQ7Jz4iLmNvbmNhdChuKCJjb21tb24ubm90aWNlTW9kYWwuanVtYm90cm9uLmgxIiksIjwvaDE+XG48aDIgc3R5bGU9J2ZvbnQtc2l6ZTogMS40cmVtICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbChlLG4oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDIiKSwiPC9oMj5cbjxhIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7JyBocmVmPSdodHRwczovL3Rvd2VyLmpwL3NpdGUvaG93dG8vZm9yaW50ZXJuYXRpb25hbGN1c3RvbWVyJz5cbjxzcGFuIHN0eWxlPSdkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luOiAxcmVtIGF1dG8gIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICBtYXgtd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiBzb2xpZCAjZmZjYTAwICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LG4oInRvd2VyX2pwLm5vdGljZU1vZGFsLmp1bWJvdHJvbi50ZXh0IiksIjwvc3Bhbj5cbjwvYT5cbjwvZGl2PlxuPC9kaXY+XG4iKX19fSksRmUuY2FydE1vZGFsKGZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9VGUoKTtyZXR1cm57Ym90dG9tOntodG1sOnUoKSh0PXUoKShlPXUoKShuPSJcbjxkaXYgc3R5bGU9J2xpbmUtaGVpZ2h0OiAxLjMgIWltcG9ydGFudDsnPlxuPHAgc3R5bGU9J2NvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Jz4iLmNvbmNhdChyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0MS5hbGVydCIpLCI8L3A+XG48dWwgc3R5bGU9J21hcmdpbjogMC40ZW0gMCAhaW1wb3J0YW50Oyc+XG48bGkgc3R5bGU9J2ZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbChuLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUxIiksIjwvbGk+XG48bGkgc3R5bGU9J2ZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbChlLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUyIiksIjwvbGk+XG48L3VsPlxuPHAgc3R5bGU9J2NvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLnRleHQyLmFsZXJ0IiksIiA8L3A+XG48L2Rpdj5cbiIpfX19KSx6ZSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaXRlbS1pbmZvLW1haW4gLnN0b2NrLXN0YXR1cyIpLmxlbmd0aD4wJiYi44GK5Y+W44KK5a+E44GbIj09PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIilbMF0udGV4dENvbnRlbnQmJkZlLml0ZW1Nb2RhbChmdW5jdGlvbigpe3ZhciB0LGU9VGUoKTtyZXR1cm57Ym90dG9tOntodG1sOnUoKSh0PSJcbjxkaXY+XG48cCBzdHlsZT0nY29sb3I6IHJlZCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7XG4gICAgbGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDtcbiAgICBtYXJnaW46IDAuNGVtIDAgIWltcG9ydGFudDsnPiIuY29uY2F0KGUoInRvd2VyX2pwLml0ZW0uYm90dG9tLnRpdGxlIiksIjwvcD5cbjxwIHN0eWxlPSdmb250LXNpemU6IDExcHggIWltcG9ydGFudDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmUgIWltcG9ydGFudDtcbiAgICBsaW5lLWhlaWdodDogMS4yICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDAuMmVtICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LGUoInRvd2VyX2pwLml0ZW0uYm90dG9tLnRleHQiKSwiPC9wPlxuPC9kaXY+XG4iKX19fSl9L3Rvd2Vyc2hpYnV5YVwuanBcL2twb3AvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpPyhGZS5sYXVuY2goZnVuY3Rpb24oKXtyZXR1cm4iYmFubmVyLWhpZGRlbiJ9KSxGZS5iYW5uZXIoZnVuY3Rpb24oKXtyZXR1cm57aGlkZGVuOntodG1sOidcbjxhIGhyZWY9Imh0dHBzOi8vYml0Lmx5LzJZVWxLVGQiPlxuPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogIzY0NjU2NyAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDRweCA0cHggMCAhaW1wb3J0YW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1xuICAgIGJvdHRvbTogMCAhaW1wb3J0YW50O1xuICAgIHJpZ2h0OiAxMHB4ICFpbXBvcnRhbnQ7XG4gICAgbGVmdDogYXV0byAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMTBweCAwIDAgIWltcG9ydGFudDsiPlxuICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgd2lkdGg6IDUwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA2cHggN3B4IDVweCA3cHggIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiA2cHggNnB4IDAgMCAhaW1wb3J0YW50OyI+XG4gICAgPGltZyBzcmM9Imh0dHBzOi8vY2hlY2tvdXQtc3RhdGljLndvcmxkc2hvcHBpbmcuanAvaW1hZ2VzL2NvbW1vbi9iYW5uZXJfaGlkZGVuX2ljb25fZW4uc3ZnIiBhbHQ9Ikdsb2JhbCBTaGlwcGluZyIgc3R5bGU9IndpZHRoOiA1MnB4ICFpbXBvcnRhbnQ7Ij5cbiAgICA8L3NwYW4+XG48L2Rpdj5cbjwvYT5cbid9fX0pKTovKHRvd2Vyc2hpYnV5YVwuanApLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSYmKEZlLmxhdW5jaChmdW5jdGlvbigpe3JldHVybiJiYW5uZXItaGlkZGVuIn0pLEZlLmJhbm5lcihmdW5jdGlvbigpe3JldHVybntoaWRkZW46e2h0bWw6J1xuPGEgaHJlZj0iaHR0cHM6Ly9iaXQubHkvM2dMdTR1QSI+XG48ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjNjQ2NTY3ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNHB4IDRweCAwICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgcmlnaHQ6IDEwcHggIWltcG9ydGFudDtcbiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweCAxMHB4IDAgMCAhaW1wb3J0YW50OyI+XG4gICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDZweCA3cHggNXB4IDdweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8aW1nIHNyYz0iaHR0cHM6Ly9jaGVja291dC1zdGF0aWMud29ybGRzaG9wcGluZy5qcC9pbWFnZXMvY29tbW9uL2Jhbm5lcl9oaWRkZW5faWNvbl9lbi5zdmciIGFsdD0iR2xvYmFsIFNoaXBwaW5nIiBzdHlsZT0id2lkdGg6IDUycHggIWltcG9ydGFudDsiPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuPC9hPlxuJ319fSkpLC8obWlraWtpXC50b2t5b1wuanBcLykvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoRmUubGF1bmNoKGZ1bmN0aW9uKCl7cmV0dXJuImJhbm5lci1oaWRkZW4ifSksRmUuYmFubmVyKGZ1bmN0aW9uKCl7cmV0dXJue2hpZGRlbjp7aHRtbDonXG48YSBocmVmPSJodHRwczovL2JpdC5seS8zMUlOejJMIj5cbjxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICM2NDY1NjcgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA0cHggNHB4ICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm90dG9tOiAxMzBweCAhaW1wb3J0YW50O1xuICAgIHJpZ2h0OiAtMjNweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMCAwIDEwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIHdpZHRoOiA1MHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNnB4IDIwcHggNnB4IDdweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweCAwIDAgNnB4ICFpbXBvcnRhbnQ7Ij5cbiAgICA8aW1nIHNyYz0iaHR0cHM6Ly9jaGVja291dC1zdGF0aWMud29ybGRzaG9wcGluZy5qcC9pbWFnZXMvY29tbW9uL2Jhbm5lcl9oaWRkZW5faWNvbl9lbi5zdmciIGFsdD0iR2xvYmFsIFNoaXBwaW5nIiBzdHlsZT0id2lkdGg6IDUycHggIWltcG9ydGFudDsgYm9yZGVyLXJhZGl1czogNnB4IDAgMCA2cHggIWltcG9ydGFudDsiPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuPC9hPlxuJ319fSkpLC8odG93ZXJcLmpwXC98dG93ZXJzaGlidXlhXC5qcFwvfG1pa2lraVwudG9reW9cLmpwXC8pLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSYmamUuaW5pdGlhbGl6ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gRmUucnVuKCl9KX1dKTt9
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
13.32.21.90 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-32-21-90.fra56.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-amz-version-id
LP99qA9EAMLqCMMRUwJOQ5lo4sldS.Jg
via
1.1 7d3c59ee1b45f72158a8cbce053c8978.cloudfront.net (CloudFront)
etag
"8a80554c91d9fca8acb82f023de02f11"
x-amz-cf-pop
FRA56-C2
x-cache
Error from cloudfront
access-control-max-age
300
x-amz-replication-status
COMPLETED
content-length
3
last-modified
Wed, 08 Apr 2020 15:53:18 GMT
server
AmazonS3
date
Mon, 08 Mar 2021 20:22:57 GMT
vary
Access-Control-Request-Headers,Access-Control-Request-Method
access-control-allow-methods
GET, HEAD
content-type
application/json
access-control-allow-origin
*
access-control-expose-headers
x-cache
cache-control
public, must-revalidate, proxy-revalidate, max-age=0
accept-ranges
bytes
x-amz-cf-id
LqWGi7mBmHY9avnO21zMyD_cDyK69pO0lGoLj8lboC-cj_EZwBUz9A==
default
api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en/
11 KB
3 KB
XHR
General
Full URL
https://api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en/default
Requested by
Host: text
URL: data:text/javascript;base64,ZnVuY3Rpb24gb25Mb2FkWmlnWmFnKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgbyBpbiB0KW4uZChyLG8sZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsImEiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPSIvIixuKG4ucz0zMDIpfShbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQpLG89big0NCkuZixpPW4oODcpLGE9bigxKSxzPW4oMzEpLHU9bigxNyksYz1uKDE0KSxsPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUsbil9cmV0dXJuIG5ldyB0KGUsbixyKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlLnByb3RvdHlwZT10LnByb3RvdHlwZSxlfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixmLHAsaCxkLGcsdix5LG09dC50YXJnZXQsYj10Lmdsb2JhbCx4PXQuc3RhdCx3PXQucHJvdG8saz1iP3I6eD9yW21dOihyW21dfHx7fSkucHJvdG90eXBlLFM9Yj9hOmFbbV18fChhW21dPXt9KSxFPVMucHJvdG90eXBlO2ZvcihwIGluIGUpbj0haShiP3A6bSsoeD8iLiI6IiMiKStwLHQuZm9yY2VkKSYmayYmYyhrLHApLGQ9U1twXSxuJiYoZz10Lm5vVGFyZ2V0R2V0Pyh5PW8oayxwKSkmJnkudmFsdWU6a1twXSksaD1uJiZnP2c6ZVtwXSxuJiZ0eXBlb2YgZD09dHlwZW9mIGh8fCh2PXQuYmluZCYmbj9zKGgscik6dC53cmFwJiZuP2woaCk6dyYmImZ1bmN0aW9uIj09dHlwZW9mIGg/cyhGdW5jdGlvbi5jYWxsLGgpOmgsKHQuc2hhbXx8aCYmaC5zaGFtfHxkJiZkLnNoYW0pJiZ1KHYsInNoYW0iLCEwKSxTW3BdPXYsdyYmKGMoYSxmPW0rIlByb3RvdHlwZSIpfHx1KGEsZix7fSksYVtmXVtwXT1oLHQucmVhbCYmRSYmIUVbcF0mJnUoRSxwLGgpKSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDU4KSxpPW4oNzApLGE9big5NCkscz1yLlN5bWJvbCx1PW8oIndrcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdVt0XXx8KHVbdF09YSYmc1t0XXx8KGE/czppKSgiU3ltYm9sLiIrdCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksbz1uKDE0KSxpPW4oNzUpLGE9bigyMykuZjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9ci5TeW1ib2x8fChyLlN5bWJvbD17fSk7byhlLHQpfHxhKGUsdCx7dmFsdWU6aS5mKHQpfSl9fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3ZhciBuPSJvYmplY3QiLHI9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuTWF0aD09TWF0aCYmdH07dC5leHBvcnRzPXIodHlwZW9mIGdsb2JhbFRoaXM9PW4mJmdsb2JhbFRoaXMpfHxyKHR5cGVvZiB3aW5kb3c9PW4mJndpbmRvdyl8fHIodHlwZW9mIHNlbGY9PW4mJnNlbGYpfHxyKHR5cGVvZiBlPT1uJiZlKXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKX0pLmNhbGwodGhpcyxuKDg1KSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaCh0KXtyZXR1cm4hMH19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/bnVsbCE9PXQ6ImZ1bmN0aW9uIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEzNil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjA5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTApO2Z1bmN0aW9uIG8odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLHIodCxvLmtleSxvKX19dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmbyh0LnByb3RvdHlwZSxlKSxuJiZvKHQsbiksdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30uaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY2FsbCh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTYzKSxvPW4oOTYpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPW8/cjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fHIodCl9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksbz1uKDIzKSxpPW4oMzApO3QuZXhwb3J0cz1yP2Z1bmN0aW9uKHQsZSxuKXtyZXR1cm4gby5mKHQsZSxpKDEsbikpfTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bix0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByW3QrIlByb3RvdHlwZSJdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTcxKSxvPW4oMTc1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1yKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmbyh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0Nil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KSxvPW4oNDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihvKHQpKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLG89big4NiksaT1uKDExKSxhPW4oNTQpLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O2UuZj1yP3M6ZnVuY3Rpb24odCxlLG4pe2lmKGkodCksZT1hKGUsITApLGkobiksbyl0cnl7cmV0dXJuIHModCxlLG4pfWNhdGNoKHQpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIG4mJih0W2VdPW4udmFsdWUpLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0NSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qocih0KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjEpLG89bi5uKHIpO2Z1bmN0aW9uIGkodCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzLmRlYnVnTG9nZ2VyKCkobygpKHQpKX1lLmE9e2RlYnVnOmksZXJyb3I6ZnVuY3Rpb24odCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzJiZlLnV0aWxzLmVycm9yTG9nZ2VyJiZlLnV0aWxzLmVycm9yTG9nZ2VyKCkodCksaSh0KX19fSxmdW5jdGlvbih0LGUpe3ZhciBuPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbi5jYWxsKHQpLnNsaWNlKDgsLTEpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzKS5mLG89bigxNyksaT1uKDE0KSxhPW4oMTgzKSxzPW4oMikoInRvU3RyaW5nVGFnIiksdT1hIT09e30udG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGMpe2lmKHQpe3ZhciBsPW4/dDp0LnByb3RvdHlwZTtpKGwscyl8fHIobCxzLHtjb25maWd1cmFibGU6ITAsdmFsdWU6ZX0pLGMmJnUmJm8obCwidG9TdHJpbmciLGEpfX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTplfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2lmKHIodCksdm9pZCAwPT09ZSlyZXR1cm4gdDtzd2l0Y2gobil7Y2FzZSAwOnJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmNhbGwoZSl9O2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQuY2FsbChlLG4pfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIHQuY2FsbChlLG4scil9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24obixyLG8pe3JldHVybiB0LmNhbGwoZSxuLHIsbyl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsYXJndW1lbnRzKX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxvPW4oNCksaT1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OnZvaWQgMH07dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9pKHJbdF0pfHxpKG9bdF0pOnJbdF0mJnJbdF1bZV18fG9bdF0mJm9bdF1bZV19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD9vKHIodCksOTAwNzE5OTI1NDc0MDk5MSk6MH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxODApLmNoYXJBdCxvPW4oNDkpLGk9big5OCksYT1vLnNldCxzPW8uZ2V0dGVyRm9yKCJTdHJpbmcgSXRlcmF0b3IiKTtpKFN0cmluZywiU3RyaW5nIixmdW5jdGlvbih0KXthKHRoaXMse3R5cGU6IlN0cmluZyBJdGVyYXRvciIsc3RyaW5nOlN0cmluZyh0KSxpbmRleDowfSl9LGZ1bmN0aW9uKCl7dmFyIHQsZT1zKHRoaXMpLG49ZS5zdHJpbmcsbz1lLmluZGV4O3JldHVybiBvPj1uLmxlbmd0aD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9Oih0PXIobixvKSxlLmluZGV4Kz10Lmxlbmd0aCx7dmFsdWU6dCxkb25lOiExfSl9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTcpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixvKXtvJiZvLmVudW1lcmFibGU/dFtlXT1uOnIodCxlLG4pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTc2KSxvPW4oMjA4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4hZXx8Im9iamVjdCIhPT1yKGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9vKHQpOmV9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjIyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyMyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjI2KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyNyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzApfSxmdW5jdGlvbih0KXt0LmV4cG9ydHM9SlNPTi5wYXJzZSgneyJsb2NpemUiOnsicHJvZHVjdElkIjoiNjBmZjgyMjQtYmJjYy00ODAyLThkNTktYzg5ODNkZWFlOGQwIiwiYXBpS2V5IjoiNzM5NmU3NzgtMDkwMy00ZTdlLTgyODItZTY3MTU4NThiYjhjIiwidmVyc2lvbiI6InByb2R1Y3Rpb24ifSwiaW50ZWdyYXRpb25zIjp7ImNvbG9ybWVBcHAiOnsiYXBpIjp7InByb2R1Y3QiOiJodHRwczovL2NvbG9ybWUud29ybGRzaG9wcGluZy5qcC92MS9wcm9kdWN0In19LCJzaG9waWZ5QXBwIjp7ImFwaSI6eyJwcm9kdWN0IjoiaHR0cHM6Ly9hcHAtcy53b3JsZHNob3BwaW5nLmpwL3YxL3Byb2R1Y3QifX19LCJsYW1iZGEiOnsiY3JlYXRlIjoic2hvcC1kYXRhLXByb2QtY3JlYXRlIiwiY2xlYXIiOiJzaG9wLWRhdGEtcHJvZC1jbGVhciJ9LCJzZmRjIjp7ImNvbm5lY3Rpb25TZXR0aW5nc1BhdGgiOiIvc2ZkYy9wcm9kL2FwaSJ9LCJkZWJ1Z0hvc3RzIjpbInNob3AtZGFzaGJvYXJkLndvcmxkc2hvcHBpbmcuYml6Iiwic2hvcC1kYXNoYm9hcmQtZGV2Lndvcmxkc2hvcHBpbmcuYml6Iiwic2hvcC1kYXNoYm9hcmQtbG9jYWwud29ybGRzaG9wcGluZy5iaXoiXX0nKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLG89big2NCksaT1uKDMwKSxhPW4oMjEpLHM9big1NCksdT1uKDE0KSxjPW4oODYpLGw9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtlLmY9cj9sOmZ1bmN0aW9uKHQsZSl7aWYodD1hKHQpLGU9cyhlLCEwKSxjKXRyeXtyZXR1cm4gbCh0LGUpfWNhdGNoKHQpe31pZih1KHQsZSkpcmV0dXJuIGkoIW8uZi5jYWxsKHQsZSksdFtlXSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIit0KTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oMTM5KSxpPW4oNjkpLGE9big1Nikscz1uKDkwKSx1PW4oNjYpLGM9big1NykoIklFX1BST1RPIiksbD1mdW5jdGlvbigpe30sZj1mdW5jdGlvbigpe3ZhciB0LGU9dSgiaWZyYW1lIiksbj1pLmxlbmd0aDtmb3IoZS5zdHlsZS5kaXNwbGF5PSJub25lIixzLmFwcGVuZENoaWxkKGUpLGUuc3JjPVN0cmluZygiamF2YXNjcmlwdDoiKSwodD1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSx0LndyaXRlKCI8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PFwvc2NyaXB0PiIpLHQuY2xvc2UoKSxmPXQuRjtuLS07KWRlbGV0ZSBmLnByb3RvdHlwZVtpW25dXTtyZXR1cm4gZigpfTt0LmV4cG9ydHM9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbnVsbCE9PXQ/KGwucHJvdG90eXBlPXIodCksbj1uZXcgbCxsLnByb3RvdHlwZT1udWxsLG5bY109dCk6bj1mKCksdm9pZCAwPT09ZT9uOm8obixlKX0sYVtjXT0hMH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjYpO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iQXJyYXkiPT1yKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQpLG89bigyNCksaT1uKDU3KSxhPW4oOTUpLHM9aSgiSUVfUFJPVE8iKSx1PU9iamVjdC5wcm90b3R5cGU7dC5leHBvcnRzPWE/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0PW8odCkscih0LHMpP3Rbc106ImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3ImJnQgaW5zdGFuY2VvZiB0LmNvbnN0cnVjdG9yP3QuY29uc3RydWN0b3IucHJvdG90eXBlOnQgaW5zdGFuY2VvZiBPYmplY3Q/dTpudWxsfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhPW4oMTgxKSxzPW4oNCksdT1uKDYpLGM9bigxNyksbD1uKDE0KSxmPW4oNTcpLHA9big1NiksaD1zLldlYWtNYXA7aWYoYSl7dmFyIGQ9bmV3IGgsZz1kLmdldCx2PWQuaGFzLHk9ZC5zZXQ7cj1mdW5jdGlvbih0LGUpe3JldHVybiB5LmNhbGwoZCx0LGUpLGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIGcuY2FsbChkLHQpfHx7fX0saT1mdW5jdGlvbih0KXtyZXR1cm4gdi5jYWxsKGQsdCl9fWVsc2V7dmFyIG09Zigic3RhdGUiKTtwW21dPSEwLHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYyh0LG0sZSksZX0sbz1mdW5jdGlvbih0KXtyZXR1cm4gbCh0LG0pP3RbbV06e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIGwodCxtKX19dC5leHBvcnRzPXtzZXQ6cixnZXQ6byxoYXM6aSxlbmZvcmNlOmZ1bmN0aW9uKHQpe3JldHVybiBpKHQpP28odCk6cih0LHt9KX0sZ2V0dGVyRm9yOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbjtpZighdShlKXx8KG49byhlKSkudHlwZSE9PXQpdGhyb3cgVHlwZUVycm9yKCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICIrdCsiIHJlcXVpcmVkIik7cmV0dXJuIG59fX19LGZ1bmN0aW9uKHQsZSxuKXtuKDEwMSk7dmFyIHI9bigxODQpLG89big0KSxpPW4oMTcpLGE9bigyOSkscz1uKDIpKCJ0b1N0cmluZ1RhZyIpO2Zvcih2YXIgdSBpbiByKXt2YXIgYz1vW3VdLGw9YyYmYy5wcm90b3R5cGU7bCYmIWxbc10mJmkobCxzLHUpLGFbdV09YS5BcnJheX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc2KSxvPW4oMjkpLGk9bigyKSgiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbCE9dClyZXR1cm4gdFtpXXx8dFsiQEBpdGVyYXRvciJdfHxvW3IodCldfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPWZ1bmN0aW9uKHQpe3ZhciBlLG47dGhpcy5wcm9taXNlPW5ldyB0KGZ1bmN0aW9uKHQscil7aWYodm9pZCAwIT09ZXx8dm9pZCAwIT09bil0aHJvdyBUeXBlRXJyb3IoIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yIik7ZT10LG49cn0pLHRoaXMucmVzb2x2ZT1yKGUpLHRoaXMucmVqZWN0PXIobil9O3QuZXhwb3J0cy5mPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighcih0KSlyZXR1cm4gdDt2YXIgbixvO2lmKGUmJiJmdW5jdGlvbiI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49dC52YWx1ZU9mKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO2lmKCFlJiYiZnVuY3Rpb24iPT10eXBlb2Yobj10LnRvU3RyaW5nKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OCksbz1uKDY5KTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsbyl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTgpLG89big3MCksaT1yKCJrZXlzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpW3RdfHwoaVt0XT1vKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89bigxNDApLGk9bigyNyksYT1yWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8bygiX19jb3JlLWpzX3NoYXJlZF9fIix7fSk7KHQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhW3RdfHwoYVt0XT12b2lkIDAhPT1lP2U6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4yLjAiLG1vZGU6aT8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE5IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDExMiksaT1uKDMzKSxhPW4oMzEpLHM9big1MSksdT1uKDExMSksYz1mdW5jdGlvbih0LGUpe3RoaXMuc3RvcHBlZD10LHRoaXMucmVzdWx0PWV9Oyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxmKXt2YXIgcCxoLGQsZyx2LHksbT1hKGUsbixsPzI6MSk7aWYoZilwPXQ7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YoaD1zKHQpKSl0aHJvdyBUeXBlRXJyb3IoIlRhcmdldCBpcyBub3QgaXRlcmFibGUiKTtpZihvKGgpKXtmb3IoZD0wLGc9aSh0Lmxlbmd0aCk7Zz5kO2QrKylpZigodj1sP20ocih5PXRbZF0pWzBdLHlbMV0pOm0odFtkXSkpJiZ2IGluc3RhbmNlb2YgYylyZXR1cm4gdjtyZXR1cm4gbmV3IGMoITEpfXA9aC5jYWxsKHQpfWZvcig7ISh5PXAubmV4dCgpKS5kb25lOylpZigodj11KHAsbSx5LnZhbHVlLGwpKSYmdiBpbnN0YW5jZW9mIGMpcmV0dXJuIHY7cmV0dXJuIG5ldyBjKCExKX0pLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjKCEwLHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybntlcnJvcjohMSx2YWx1ZTp0KCl9fWNhdGNoKHQpe3JldHVybntlcnJvcjohMCx2YWx1ZTp0fX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQxKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzMyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyODUpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixpPW8mJiFyLmNhbGwoezE6Mn0sMSk7ZS5mPWk/ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpyfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KSxvPW4oMjYpLGk9IiIuc3BsaXQ7dC5leHBvcnRzPXIoZnVuY3Rpb24oKXtyZXR1cm4hT2JqZWN0KCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KT9mdW5jdGlvbih0KXtyZXR1cm4iU3RyaW5nIj09byh0KT9pLmNhbGwodCwiIik6T2JqZWN0KHQpfTpPYmplY3R9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89big2KSxpPXIuZG9jdW1lbnQsYT1vKGkpJiZvKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKSxvPW4oMzMpLGk9big4OSksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3ZhciBzLHU9cihlKSxjPW8odS5sZW5ndGgpLGw9aShhLGMpO2lmKHQmJm4hPW4pe2Zvcig7Yz5sOylpZigocz11W2wrK10pIT1zKXJldHVybiEwfWVsc2UgZm9yKDtjPmw7bCsrKWlmKCh0fHxsIGluIHUpJiZ1W2xdPT09bilyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmEoITApLGluZGV4T2Y6YSghMSl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/cjpuKSh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIitTdHJpbmcodm9pZCAwPT09dD8iIjp0KSsiKV8iKygrK24rcikudG9TdHJpbmcoMzYpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU0KSxvPW4oMjMpLGk9bigzMCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYT1yKGUpO2EgaW4gdD9vLmYodCxhLGkoMCxuKSk6dFthXT1ufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDIpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiFyKGZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuKGUuY29uc3RydWN0b3I9e30pW29dPWZ1bmN0aW9uKCl7cmV0dXJue2ZvbzoxfX0sMSE9PWVbdF0oQm9vbGVhbikuZm9vfSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMSksbz1uKDY1KSxpPW4oMjQpLGE9bigzMykscz1uKDkzKSx1PVtdLnB1c2gsYz1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCxjPTM9PXQsbD00PT10LGY9Nj09dCxwPTU9PXR8fGY7cmV0dXJuIGZ1bmN0aW9uKGgsZCxnLHYpe2Zvcih2YXIgeSxtLGI9aShoKSx4PW8oYiksdz1yKGQsZywzKSxrPWEoeC5sZW5ndGgpLFM9MCxFPXZ8fHMsVD1lP0UoaCxrKTpuP0UoaCwwKTp2b2lkIDA7az5TO1MrKylpZigocHx8UyBpbiB4KSYmKG09dyh5PXhbU10sUyxiKSx0KSlpZihlKVRbU109bTtlbHNlIGlmKG0pc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBTO2Nhc2UgMjp1LmNhbGwoVCx5KX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY/LTE6Y3x8bD9sOlR9fTt0LmV4cG9ydHM9e2ZvckVhY2g6YygwKSxtYXA6YygxKSxmaWx0ZXI6YygyKSxzb21lOmMoMyksZXZlcnk6Yyg0KSxmaW5kOmMoNSksZmluZEluZGV4OmMoNil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDE3MCk7dC5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciB0LGU9ITEsbj17fTt0cnl7KHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQpLmNhbGwobixbXSksZT1uIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihuLGkpe3JldHVybiByKG4pLG8oaSksZT90LmNhbGwobixpKTpuLl9fcHJvdG9fXz1pLG59fSgpOnZvaWQgMCl9LGZ1bmN0aW9uKHQsZSxuKXtlLmY9bigyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjYpLG89bigyKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sYTtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLG8pKT9uOmk/cihlKToiT2JqZWN0Ij09KGE9cihlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjphfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0iXHRcblx2XGZcciDCoOGagOKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFx1MjAyOFx1MjAyOVx1ZmVmZiJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyKTt0LmV4cG9ydHM9cigibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIifSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjE4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0Nyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNzMpLG89bigyNzYpLGk9bigyODEpLGE9bigyODQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KXx8byh0KXx8aSh0KXx8YSgpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSxuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gUH0pO3ZhciByPW4oMzcpLG89bi5uKHIpLGk9bigzOCksYT1uLm4oaSkscz1uKDM5KSx1PW4ubihzKSxjPW4oNDApLGw9bi5uKGMpLGY9big0MSkscD1uLm4oZiksaD1uKDQyKSxkPW4ubihoKSxnPW4oMTM0KSx2PW4ubihnKSx5PW4oNjMpLG09bi5uKHkpLGI9bigxNikseD1uLm4oYiksdz1uKDcpLGs9bi5uKHcpLFM9bigxMiksRT1uLm4oUyksVD1uKDEzNSksaj1uLm4oVCksQT1uKDI1KSxPPW4oNDMpO2Z1bmN0aW9uIEModCxlKXt2YXIgbjtpZih2b2lkIDA9PT1sLmF8fG51bGw9PXUoKSh0KSl7aWYoYSgpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEwodCxlKTt2YXIgcj1kKCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIHAoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBMKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIHMsYz0hMCxmPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1vKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYz10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtmPSEwLHM9dH0sZjpmdW5jdGlvbigpe3RyeXtjfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKGYpdGhyb3cgc319fX1mdW5jdGlvbiBMKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9dmFyIFI9e2NvZGU6Ik5PTkUifSxQPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbj10aGlzLHI9dC5zY3JhcGVyUmVzdWx0LG89dC5sb2NhdGlvbixpPXQuZGF0YTtrKCkodGhpcyxlKSx0aGlzLmV4Y2x1ZGVCeVNjcmFwZXJFcnJvcj1mdW5jdGlvbigpe3ZhciB0PW4uc2NyYXBlclJlc3VsdDtyZXR1cm4gdC5lcnJvcj97Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogIi5jb25jYXQodC5lcnJvcil9OnQuaXRlbT8odC5za3VSb3dzfHwodC5za3VSb3dzPVtdKSxSKTp7Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogbm8gaXRlbSJ9fSx0aGlzLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIG4uc2NyYXBlclJlc3VsdC5wdXJjaGFzYWJsZT9SOntjb2RlOiJOT1RfUFVSQ0hBU0FCTEUiLG1lc3NhZ2U6ImV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlIn19LHRoaXMuZXhjbHVkZUJ5U2t1WmVybz1mdW5jdGlvbigpe3JldHVybiBuLnNjcmFwZXJSZXN1bHQuc2t1Um93cyYmMD09PW4uc2NyYXBlclJlc3VsdC5za3VSb3dzLmxlbmd0aD97Y29kZToiTk9UX1BVUkNIQVNBQkxFIixtZXNzYWdlOiJleGNsdWRlQnlTa3VaZXJvIn06Un0sdGhpcy5leGNsdWRlQnlVcmw9ZnVuY3Rpb24oKXtpZigwPT09bi5ieVVybC5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9ZS53aW5kb3dMb2NhdGlvbkhyZWY7cmV0dXJuIG4uZXhjbHVkZShuLmJ5VXJsLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdChqKCkoeCgpKG49ZS51cmwpLmNhbGwobikpKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1OYW1lPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtTmFtZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLm5hbWV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1OYW1lLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdCh4KCkobj1lLml0ZW1OYW1lKS5jYWxsKG4pKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1Db2RlPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtQ29kZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLmNvZGV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1Db2RlLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuaXRlbUNvZGUpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5Q2F0ZWdvcnk9ZnVuY3Rpb24oKXtpZigwPT09bi5ieUNhdGVnb3J5Lmxlbmd0aClyZXR1cm4gUjt2YXIgdD1uLnNjcmFwZXJSZXN1bHQuaXRlbSYmbi5zY3JhcGVyUmVzdWx0Lml0ZW0uY2F0ZWdvcnl8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUNhdGVnb3J5LHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuY2F0ZWdvcnkpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5SXRlbURlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtRGVzY3JpcHRpb24ubGVuZ3RoKXJldHVybiBSO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5kZXNjcmlwdGlvbnx8IiI7cmV0dXJuIG4uZXhjbHVkZShuLmJ5SXRlbURlc2NyaXB0aW9uLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIiIuY29uY2F0KHgoKShuPWUudGV4dCkuY2FsbChuKSkpLnRlc3QodCl9KX0sdGhpcy5leGVjdXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ITEsZT1bXSxyPW4uZXhjbHVkZUJ5U2NyYXBlckVycm9yKCk7aWYoIk5PTkUiIT09ci5jb2RlKXJldHVybntpc0V4Y2x1ZGVkOiEwLHJlYXNvbnM6W3JdfTsiTk9ORSIhPT0ocj1uLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlKCkpLmNvZGUmJih0PSEwLGUucHVzaChyKSk7dmFyIG8saT1DKG4uY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyhbbi5leGNsdWRlQnlVcmwsbi5leGNsdWRlQnlJdGVtTmFtZSxuLmV4Y2x1ZGVCeUl0ZW1Db2RlLG4uZXhjbHVkZUJ5Q2F0ZWdvcnksbi5leGNsdWRlQnlJdGVtRGVzY3JpcHRpb25dKSk7dHJ5e2ZvcihpLnMoKTshKG89aS5uKCkpLmRvbmU7KXt2YXIgYT0oMCxvLnZhbHVlKSgpO2lmKCJOT05FIiE9PWEuY29kZSYmKHQ9ITAsZS5wdXNoKGEpKSwiRVJST1IiPT09YS5jb2RlKWJyZWFrfX1jYXRjaCh0KXtpLmUodCl9ZmluYWxseXtpLmYoKX1yZXR1cm57aXNFeGNsdWRlZDp0LHJlYXNvbnM6ZX19LHRoaXMuc2NyYXBlclJlc3VsdD1yLHRoaXMubG9jYXRpb249byx0aGlzLmRhdGE9aSx0aGlzLmJ5VXJsPWkuYnlVcmwsdGhpcy5ieUl0ZW1OYW1lPWkuYnlJdGVtTmFtZSx0aGlzLmJ5SXRlbUNvZGU9aS5ieUl0ZW1Db2RlLHRoaXMuYnlDYXRlZ29yeT1pLmJ5Q2F0ZWdvcnksdGhpcy5ieUl0ZW1EZXNjcmlwdGlvbj1pLmJ5SXRlbURlc2NyaXB0aW9ufXJldHVybiBFKCkoZSxbe2tleToiY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSx7a2V5OiJleGNsdWRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFJ9fV0sW3trZXk6IndpbmRvd0xvY2F0aW9uSHJlZiIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGUsbj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUscj13aW5kb3cubG9jYXRpb24uaHJlZjtpZihtKCkoZT1PLmRlYnVnSG9zdHMpLmNhbGwoZSxuKSl7dmFyIG89bmV3IHYuYSh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoInp6dXJsIik7aWYobyl0cnl7cj10LmZyb20obywiYmFzZTY0IikudG9TdHJpbmcoInV0Zi04Iil9Y2F0Y2godCl7QS5hLmVycm9yKHQpfX1yZXR1cm4gcn19XSksZX0oKX0pLmNhbGwodGhpcyxuKDI5NCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oNSksaT1uKDY2KTt0LmV4cG9ydHM9IXImJiFvKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz0vI3xcLnByb3RvdHlwZVwuLyxpPWZ1bmN0aW9uKHQsZSl7dmFyIG49c1thKHQpXTtyZXR1cm4gbj09Y3x8biE9dSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlP3IoZSk6ISFlKX0sYT1pLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UobywiLiIpLnRvTG93ZXJDYXNlKCl9LHM9aS5kYXRhPXt9LHU9aS5OQVRJVkU9Ik4iLGM9aS5QT0xZRklMTD0iUCI7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjEpLGk9big2NykuaW5kZXhPZixhPW4oNTYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLHM9byh0KSx1PTAsYz1bXTtmb3IobiBpbiBzKSFyKGEsbikmJnIocyxuKSYmYy5wdXNoKG4pO2Zvcig7ZS5sZW5ndGg+dTspcihzLG49ZVt1KytdKSYmKH5pKGMsbil8fGMucHVzaChuKSk7cmV0dXJuIGN9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1NYXRoLm1heCxpPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIodCk7cmV0dXJuIG48MD9vKG4rZSwwKTppKG4sZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMik7dC5leHBvcnRzPXIoImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDYpLGk9W10uc2xpY2UsYT17fSxzPWZ1bmN0aW9uKHQsZSxuKXtpZighKGUgaW4gYSkpe2Zvcih2YXIgcj1bXSxvPTA7bzxlO28rKylyW29dPSJhWyIrbysiXSI7YVtlXT1GdW5jdGlvbigiQyxhIiwicmV0dXJuIG5ldyBDKCIrci5qb2luKCIsIikrIikiKX1yZXR1cm4gYVtlXSh0LG4pfTt0LmV4cG9ydHM9RnVuY3Rpb24uYmluZHx8ZnVuY3Rpb24odCl7dmFyIGU9cih0aGlzKSxuPWkuY2FsbChhcmd1bWVudHMsMSksYT1mdW5jdGlvbigpe3ZhciByPW4uY29uY2F0KGkuY2FsbChhcmd1bWVudHMpKTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGE/cyhlLHIubGVuZ3RoLHIpOmUuYXBwbHkodCxyKX07cmV0dXJuIG8oZS5wcm90b3R5cGUpJiYoYS5wcm90b3R5cGU9ZS5wcm90b3R5cGUpLGF9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDUpLGk9big0NyksYT1uKDYpLHM9bigyNCksdT1uKDMzKSxjPW4oNzEpLGw9big5MyksZj1uKDcyKSxwPW4oMikoImlzQ29uY2F0U3ByZWFkYWJsZSIpLGg9IW8oZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdFtwXT0hMSx0LmNvbmNhdCgpWzBdIT09dH0pLGQ9ZigiY29uY2F0IiksZz1mdW5jdGlvbih0KXtpZighYSh0KSlyZXR1cm4hMTt2YXIgZT10W3BdO3JldHVybiB2b2lkIDAhPT1lPyEhZTppKHQpfTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWh8fCFkfSx7Y29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT1zKHRoaXMpLGY9bChhLDApLHA9MDtmb3IoZT0tMSxyPWFyZ3VtZW50cy5sZW5ndGg7ZTxyO2UrKylpZihpPS0xPT09ZT9hOmFyZ3VtZW50c1tlXSxnKGkpKXtpZihwKyhvPXUoaS5sZW5ndGgpKT45MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7Zm9yKG49MDtuPG87bisrLHArKyluIGluIGkmJmMoZixwLGlbbl0pfWVsc2V7aWYocD49OTAwNzE5OTI1NDc0MDk5MSl0aHJvdyBUeXBlRXJyb3IoIk1heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCIpO2MoZixwKyssaSl9cmV0dXJuIGYubGVuZ3RoPXAsZn19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz1uKDQ3KSxpPW4oMikoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbyh0KSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPXQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFvKG4ucHJvdG90eXBlKT9yKG4pJiZudWxsPT09KG49bltpXSkmJihuPXZvaWQgMCk6bj12b2lkIDApLG5ldyh2b2lkIDA9PT1uP0FycmF5Om4pKDA9PT1lPzA6ZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcihmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyB0KSE9PXQucHJvdG90eXBlfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjcpfSxmdW5jdGlvbih0LGUsbil7bigzKSgiaXRlcmF0b3IiKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big5OSksaT1uKDQ4KSxhPW4oNzQpLHM9bigyOCksdT1uKDE3KSxjPW4oMzUpLGw9bigyKSxmPW4oMjcpLHA9bigyOSksaD1uKDEwMCksZD1oLkl0ZXJhdG9yUHJvdG90eXBlLGc9aC5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLHY9bCgiaXRlcmF0b3IiKSx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixsLGgsbSxiKXtvKG4sZSxsKTt2YXIgeCx3LGssUz1mdW5jdGlvbih0KXtpZih0PT09aCYmTylyZXR1cm4gTztpZighZyYmdCBpbiBqKXJldHVybiBqW3RdO3N3aXRjaCh0KXtjYXNlImtleXMiOmNhc2UidmFsdWVzIjpjYXNlImVudHJpZXMiOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyl9fSxFPWUrIiBJdGVyYXRvciIsVD0hMSxqPXQucHJvdG90eXBlLEE9alt2XXx8alsiQEBpdGVyYXRvciJdfHxoJiZqW2hdLE89IWcmJkF8fFMoaCksQz0iQXJyYXkiPT1lJiZqLmVudHJpZXN8fEE7aWYoQyYmKHg9aShDLmNhbGwobmV3IHQpKSxkIT09T2JqZWN0LnByb3RvdHlwZSYmeC5uZXh0JiYoZnx8aSh4KT09PWR8fChhP2EoeCxkKToiZnVuY3Rpb24iIT10eXBlb2YgeFt2XSYmdSh4LHYseSkpLHMoeCxFLCEwLCEwKSxmJiYocFtFXT15KSkpLCJ2YWx1ZXMiPT1oJiZBJiYidmFsdWVzIiE9PUEubmFtZSYmKFQ9ITAsTz1mdW5jdGlvbigpe3JldHVybiBBLmNhbGwodGhpcyl9KSxmJiYhYnx8alt2XT09PU98fHUoaix2LE8pLHBbZV09TyxoKWlmKHc9e3ZhbHVlczpTKCJ2YWx1ZXMiKSxrZXlzOm0/TzpTKCJrZXlzIiksZW50cmllczpTKCJlbnRyaWVzIil9LGIpZm9yKGsgaW4gdykhZyYmIVQmJmsgaW4ganx8YyhqLGssd1trXSk7ZWxzZSByKHt0YXJnZXQ6ZSxwcm90bzohMCxmb3JjZWQ6Z3x8VH0sdyk7cmV0dXJuIHd9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTAwKS5JdGVyYXRvclByb3RvdHlwZSxvPW4oNDYpLGk9bigzMCksYT1uKDI4KSxzPW4oMjkpLHU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYz1lKyIgSXRlcmF0b3IiO3JldHVybiB0LnByb3RvdHlwZT1vKHIse25leHQ6aSgxLG4pfSksYSh0LGMsITEsITApLHNbY109dSx0fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvLGksYT1uKDQ4KSxzPW4oMTcpLHU9bigxNCksYz1uKDIpLGw9bigyNyksZj1jKCJpdGVyYXRvciIpLHA9ITE7W10ua2V5cyYmKCJuZXh0ImluKGk9W10ua2V5cygpKT8obz1hKGEoaSkpKSE9PU9iamVjdC5wcm90b3R5cGUmJihyPW8pOnA9ITApLG51bGw9PXImJihyPXt9KSxsfHx1KHIsZil8fHMocixmLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSx0LmV4cG9ydHM9e0l0ZXJhdG9yUHJvdG90eXBlOnIsQlVHR1lfU0FGQVJJX0lURVJBVE9SUzpwfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIxKSxvPW4oNzcpLGk9bigyOSksYT1uKDQ5KSxzPW4oOTgpLHU9YS5zZXQsYz1hLmdldHRlckZvcigiQXJyYXkgSXRlcmF0b3IiKTt0LmV4cG9ydHM9cyhBcnJheSwiQXJyYXkiLGZ1bmN0aW9uKHQsZSl7dSh0aGlzLHt0eXBlOiJBcnJheSBJdGVyYXRvciIsdGFyZ2V0OnIodCksaW5kZXg6MCxraW5kOmV9KX0sZnVuY3Rpb24oKXt2YXIgdD1jKHRoaXMpLGU9dC50YXJnZXQsbj10LmtpbmQscj10LmluZGV4Kys7cmV0dXJuIWV8fHI+PWUubGVuZ3RoPyh0LnRhcmdldD12b2lkIDAse3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk6ImtleXMiPT1uP3t2YWx1ZTpyLGRvbmU6ITF9OiJ2YWx1ZXMiPT1uP3t2YWx1ZTplW3JdLGRvbmU6ITF9Ont2YWx1ZTpbcixlW3JdXSxkb25lOiExfX0sInZhbHVlcyIpLGkuQXJndW1lbnRzPWkuQXJyYXksbygia2V5cyIpLG8oInZhbHVlcyIpLG8oImVudHJpZXMiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4NSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDkyKSxuKDEwNCksbigxODYpLG4oMTg4KSxuKDE4OSksbigxOTApLG4oMTkxKSxuKDk3KSxuKDE5MiksbigxOTMpLG4oMTk0KSxuKDE5NSksbigxOTYpLG4oMTk3KSxuKDE5OCksbigxOTkpLG4oMjAwKSxuKDIwMSksbigyMDIpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuU3ltYm9sfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODgpLG89big2OSkuY29uY2F0KCJsZW5ndGgiLCJwcm90b3R5cGUiKTtlLmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsbyl9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0NSksbz0iWyIrbig3OCkrIl0iLGk9UmVnRXhwKCJeIitvK28rIioiKSxhPVJlZ0V4cChvK28rIiokIikscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49U3RyaW5nKHIoZSkpO3JldHVybiAxJnQmJihuPW4ucmVwbGFjZShpLCIiKSksMiZ0JiYobj1uLnJlcGxhY2UoYSwiIikpLG59fTt0LmV4cG9ydHM9e3N0YXJ0OnMoMSksZW5kOnMoMiksdHJpbTpzKDMpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEpLG89big1MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8odCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBpdGVyYWJsZSIpO3JldHVybiByKGUuY2FsbCh0KSl9fSxmdW5jdGlvbih0LGUsbil7bigyMjQpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuQXJyYXkuaXNBcnJheX0sZnVuY3Rpb24odCxlLG4pe24oMzQpLG4oMjI4KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLkFycmF5LmZyb219LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbyl7dHJ5e3JldHVybiBvP2UocihuKVswXSxuWzFdKTplKG4pfWNhdGNoKGUpe3ZhciBpPXQucmV0dXJuO3Rocm93IHZvaWQgMCE9PWkmJnIoaS5jYWxsKHQpKSxlfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIpLG89bigyOSksaT1yKCJpdGVyYXRvciIpLGE9QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dCYmKG8uQXJyYXk9PT10fHxhW2ldPT09dCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKSgiaXRlcmF0b3IiKSxvPSExO3RyeXt2YXIgaT0wLGE9e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohIWkrK319LHJldHVybjpmdW5jdGlvbigpe289ITB9fTthW3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEFycmF5LmZyb20oYSxmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaCh0KXt9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIWUmJiFvKXJldHVybiExO3ZhciBuPSExO3RyeXt2YXIgaT17fTtpW3JdPWZ1bmN0aW9uKCl7cmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTpuPSEwfX19fSx0KGkpfWNhdGNoKHQpe31yZXR1cm4gbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzMSksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2xpY2U7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLnNsaWNlP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0KSxpPW4oNzkpLGE9W10uc2xpY2Uscz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjIsbz1yP2EuY2FsbChhcmd1bWVudHMsMik6dm9pZCAwO3JldHVybiB0KHI/ZnVuY3Rpb24oKXsoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpGdW5jdGlvbihlKSkuYXBwbHkodGhpcyxvKX06ZSxuKX19O3Ioe2dsb2JhbDohMCxiaW5kOiEwLGZvcmNlZDovTVNJRSAuXC4vLnRlc3QoaSl9LHtzZXRUaW1lb3V0OnMoby5zZXRUaW1lb3V0KSxzZXRJbnRlcnZhbDpzKG8uc2V0SW50ZXJ2YWwpfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDEwNCksbigzNCksbig1MCksbigyNTQpLG4oMTIzKSxuKDI1OCk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5Qcm9taXNlfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KTt0LmV4cG9ydHM9ci5Qcm9taXNlfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIG8gaW4gZSluJiZuLnVuc2FmZSYmdFtvXT90W29dPWVbb106cih0LG8sZVtvXSxuKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBUeXBlRXJyb3IoIkluY29ycmVjdCAiKyhuP24rIiAiOiIiKSsiaW52b2NhdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEpLG89bigyMiksaT1uKDIpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG4sYT1yKHQpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1hfHxudWxsPT0obj1yKGEpW2ldKT9lOm8obil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9big0KSxzPW4oNSksdT1uKDI2KSxjPW4oMzEpLGw9big5MCksZj1uKDY2KSxwPWEubG9jYXRpb24saD1hLnNldEltbWVkaWF0ZSxkPWEuY2xlYXJJbW1lZGlhdGUsZz1hLnByb2Nlc3Msdj1hLk1lc3NhZ2VDaGFubmVsLHk9YS5EaXNwYXRjaCxtPTAsYj17fSx4PWZ1bmN0aW9uKHQpe2lmKGIuaGFzT3duUHJvcGVydHkodCkpe3ZhciBlPWJbdF07ZGVsZXRlIGJbdF0sZSgpfX0sdz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt4KHQpfX0saz1mdW5jdGlvbih0KXt4KHQuZGF0YSl9LFM9ZnVuY3Rpb24odCl7YS5wb3N0TWVzc2FnZSh0KyIiLHAucHJvdG9jb2wrIi8vIitwLmhvc3QpfTtoJiZkfHwoaD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO2FyZ3VtZW50cy5sZW5ndGg+bjspZS5wdXNoKGFyZ3VtZW50c1tuKytdKTtyZXR1cm4gYlsrK21dPWZ1bmN0aW9uKCl7KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RnVuY3Rpb24odCkpLmFwcGx5KHZvaWQgMCxlKX0scihtKSxtfSxkPWZ1bmN0aW9uKHQpe2RlbGV0ZSBiW3RdfSwicHJvY2VzcyI9PXUoZyk/cj1mdW5jdGlvbih0KXtnLm5leHRUaWNrKHcodCkpfTp5JiZ5Lm5vdz9yPWZ1bmN0aW9uKHQpe3kubm93KHcodCkpfTp2PyhpPShvPW5ldyB2KS5wb3J0MixvLnBvcnQxLm9ubWVzc2FnZT1rLHI9YyhpLnBvc3RNZXNzYWdlLGksMSkpOiFhLmFkZEV2ZW50TGlzdGVuZXJ8fCJmdW5jdGlvbiIhPXR5cGVvZiBwb3N0TWVzc2FnZXx8YS5pbXBvcnRTY3JpcHRzfHxzKFMpP3I9Im9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBmKCJzY3JpcHQiKT9mdW5jdGlvbih0KXtsLmFwcGVuZENoaWxkKGYoInNjcmlwdCIpKS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtsLnJlbW92ZUNoaWxkKHRoaXMpLHgodCl9fTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHcodCksMCl9OihyPVMsYS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixrLCExKSkpLHQuZXhwb3J0cz17c2V0OmgsY2xlYXI6ZH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oNiksaT1uKDUyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihyKHQpLG8oZSkmJmUuY29uc3RydWN0b3I9PT10KXJldHVybiBlO3ZhciBuPWkuZih0KTtyZXR1cm4oMCxuLnJlc29sdmUpKGUpLG4ucHJvbWlzZX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjIpLGk9big1MiksYT1uKDYwKSxzPW4oNTkpO3Ioe3RhcmdldDoiUHJvbWlzZSIsc3RhdDohMH0se2FsbFNldHRsZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWkuZihlKSxyPW4ucmVzb2x2ZSx1PW4ucmVqZWN0LGM9YShmdW5jdGlvbigpe3ZhciBuPW8oZS5yZXNvbHZlKSxpPVtdLGE9MCx1PTE7cyh0LGZ1bmN0aW9uKHQpe3ZhciBvPWErKyxzPSExO2kucHVzaCh2b2lkIDApLHUrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe3N8fChzPSEwLGlbb109e3N0YXR1czoiZnVsZmlsbGVkIix2YWx1ZTp0fSwtLXV8fHIoaSkpfSxmdW5jdGlvbih0KXtzfHwocz0hMCxpW29dPXtzdGF0dXM6InJlamVjdGVkIixyZWFzb246dH0sLS11fHxyKGkpKX0pfSksLS11fHxyKGkpfSk7cmV0dXJuIGMuZXJyb3ImJnUoYy52YWx1ZSksbi5wcm9taXNlfX0pfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3Nyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1NCksbz1uKDE1OCksaT1uKDE2Mik7ZnVuY3Rpb24gYShlLG4scyl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZvP3QuZXhwb3J0cz1hPW86dC5leHBvcnRzPWE9ZnVuY3Rpb24odCxlLG4pe3ZhciBvPWkodCxlKTtpZihvKXt2YXIgYT1yKG8sZSk7cmV0dXJuIGEuZ2V0P2EuZ2V0LmNhbGwobik6YS52YWx1ZX19LGEoZSxuLHN8fGUpfXQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM2KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByOwovKiEKICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My40LjEKICogaHR0cHM6Ly9qcXVlcnkuY29tLwogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIERhdGU6IDIwMTktMDUtMDFUMjE6MDRaCiAqLwovKiEKICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My40LjEKICogaHR0cHM6Ly9qcXVlcnkuY29tLwogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIERhdGU6IDIwMTktMDUtMDFUMjE6MDRaCiAqLwohZnVuY3Rpb24oZSxuKXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiB0LmV4cG9ydHM/dC5leHBvcnRzPWUuZG9jdW1lbnQ/bihlLCEwKTpmdW5jdGlvbih0KXtpZighdC5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gbih0KX06bihlKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24obixvKXsidXNlIHN0cmljdCI7dmFyIGk9W10sYT1uLmRvY3VtZW50LHM9T2JqZWN0LmdldFByb3RvdHlwZU9mLHU9aS5zbGljZSxjPWkuY29uY2F0LGw9aS5wdXNoLGY9aS5pbmRleE9mLHA9e30saD1wLnRvU3RyaW5nLGQ9cC5oYXNPd25Qcm9wZXJ0eSxnPWQudG9TdHJpbmcsdj1nLmNhbGwoT2JqZWN0KSx5PXt9LG09ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJiJudW1iZXIiIT10eXBlb2YgdC5ub2RlVHlwZX0sYj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmdD09PXQud2luZG93fSx4PXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gdyh0LGUsbil7dmFyIHIsbyxpPShuPW58fGEpLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKGkudGV4dD10LGUpZm9yKHIgaW4geCkobz1lW3JdfHxlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUocikpJiZpLnNldEF0dHJpYnV0ZShyLG8pO24uaGVhZC5hcHBlbmRDaGlsZChpKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkpfWZ1bmN0aW9uIGsodCl7cmV0dXJuIG51bGw9PXQ/dCsiIjoib2JqZWN0Ij09dHlwZW9mIHR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0P3BbaC5jYWxsKHQpXXx8Im9iamVjdCI6dHlwZW9mIHR9dmFyIFM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFMuZm4uaW5pdCh0LGUpfSxFPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZztmdW5jdGlvbiBUKHQpe3ZhciBlPSEhdCYmImxlbmd0aCJpbiB0JiZ0Lmxlbmd0aCxuPWsodCk7cmV0dXJuIW0odCkmJiFiKHQpJiYoImFycmF5Ij09PW58fDA9PT1lfHwibnVtYmVyIj09dHlwZW9mIGUmJmU+MCYmZS0xIGluIHQpfVMuZm49Uy5wcm90b3R5cGU9e2pxdWVyeToiMy40LjEiLGNvbnN0cnVjdG9yOlMsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiB1LmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD91LmNhbGwodGhpcyk6dDwwP3RoaXNbdCt0aGlzLmxlbmd0aF06dGhpc1t0XX0scHVzaFN0YWNrOmZ1bmN0aW9uKHQpe3ZhciBlPVMubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLHQpO3JldHVybiBlLnByZXZPYmplY3Q9dGhpcyxlfSxlYWNoOmZ1bmN0aW9uKHQpe3JldHVybiBTLmVhY2godGhpcyx0KX0sbWFwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLm1hcCh0aGlzLGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuY2FsbChlLG4sZSl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sZW5ndGgsbj0rdCsodDwwP2U6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJm48ZT9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6bCxzb3J0Omkuc29ydCxzcGxpY2U6aS5zcGxpY2V9LFMuZXh0ZW5kPVMuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsbyxpLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGM9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGEmJihjPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksIm9iamVjdCI9PXR5cGVvZiBhfHxtKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPSh0PWFyZ3VtZW50c1tzXSkpZm9yKGUgaW4gdClyPXRbZV0sIl9fcHJvdG9fXyIhPT1lJiZhIT09ciYmKGMmJnImJihTLmlzUGxhaW5PYmplY3Qocil8fChvPUFycmF5LmlzQXJyYXkocikpKT8obj1hW2VdLGk9byYmIUFycmF5LmlzQXJyYXkobik/W106b3x8Uy5pc1BsYWluT2JqZWN0KG4pP246e30sbz0hMSxhW2VdPVMuZXh0ZW5kKGMsaSxyKSk6dm9pZCAwIT09ciYmKGFbZV09cikpO3JldHVybiBhfSxTLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoIjMuNC4xIitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcih0KX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbih0KXt2YXIgZSxuO3JldHVybiEoIXR8fCJbb2JqZWN0IE9iamVjdF0iIT09aC5jYWxsKHQpKSYmKCEoZT1zKHQpKXx8ImZ1bmN0aW9uIj09dHlwZW9mKG49ZC5jYWxsKGUsImNvbnN0cnVjdG9yIikmJmUuY29uc3RydWN0b3IpJiZnLmNhbGwobik9PT12KX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbih0KXt2YXIgZTtmb3IoZSBpbiB0KXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKHQsZSl7dyh0LHtub25jZTplJiZlLm5vbmNlfSl9LGVhY2g6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTA7aWYoVCh0KSlmb3Iobj10Lmxlbmd0aDtyPG4mJiExIT09ZS5jYWxsKHRbcl0scix0W3JdKTtyKyspO2Vsc2UgZm9yKHIgaW4gdClpZighMT09PWUuY2FsbCh0W3JdLHIsdFtyXSkpYnJlYWs7cmV0dXJuIHR9LHRyaW06ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6KHQrIiIpLnJlcGxhY2UoRSwiIil9LG1ha2VBcnJheTpmdW5jdGlvbih0LGUpe3ZhciBuPWV8fFtdO3JldHVybiBudWxsIT10JiYoVChPYmplY3QodCkpP1MubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIHQ/W3RdOnQpOmwuY2FsbChuLHQpKSxufSxpbkFycmF5OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09ZT8tMTpmLmNhbGwoZSx0LG4pfSxtZXJnZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0rZS5sZW5ndGgscj0wLG89dC5sZW5ndGg7cjxuO3IrKyl0W28rK109ZVtyXTtyZXR1cm4gdC5sZW5ndGg9byx0fSxncmVwOmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9W10sbz0wLGk9dC5sZW5ndGgsYT0hbjtvPGk7bysrKSFlKHRbb10sbykhPT1hJiZyLnB1c2godFtvXSk7cmV0dXJuIHJ9LG1hcDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPTAsYT1bXTtpZihUKHQpKWZvcihyPXQubGVuZ3RoO2k8cjtpKyspbnVsbCE9KG89ZSh0W2ldLGksbikpJiZhLnB1c2gobyk7ZWxzZSBmb3IoaSBpbiB0KW51bGwhPShvPWUodFtpXSxpLG4pKSYmYS5wdXNoKG8pO3JldHVybiBjLmFwcGx5KFtdLGEpfSxndWlkOjEsc3VwcG9ydDp5fSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKFMuZm5bU3ltYm9sLml0ZXJhdG9yXT1pW1N5bWJvbC5pdGVyYXRvcl0pLFMuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24odCxlKXtwWyJbb2JqZWN0ICIrZSsiXSJdPWUudG9Mb3dlckNhc2UoKX0pO3ZhciBqPQovKiEKICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy40CiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pzLmZvdW5kYXRpb24vCiAqCiAqIERhdGU6IDIwMTktMDQtMDgKICovCmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzLHUsYyxsLGYscCxoLGQsZyx2LHksbSxiLHg9InNpenpsZSIrMSpuZXcgRGF0ZSx3PXQuZG9jdW1lbnQsaz0wLFM9MCxFPXV0KCksVD11dCgpLGo9dXQoKSxBPXV0KCksTz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZSYmKGY9ITApLDB9LEM9e30uaGFzT3duUHJvcGVydHksTD1bXSxSPUwucG9wLFA9TC5wdXNoLE49TC5wdXNoLEk9TC5zbGljZSxEPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKHRbbl09PT1lKXJldHVybiBuO3JldHVybi0xfSxfPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsVT0iKD86XFxcXC58W1xcdy1dfFteXDAtXFx4YTBdKSsiLEI9IlxcWyIrTSsiKigiK1UrIikoPzoiK00rIiooWypeJHwhfl0/PSkiK00rIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitVKyIpKXwpIitNKyIqXFxdIixxPSI6KCIrVSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrQisiKSopfC4qKVxcKXwpIixGPW5ldyBSZWdFeHAoTSsiKyIsImciKSxIPW5ldyBSZWdFeHAoIl4iK00rIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTSsiKyQiLCJnIiksej1uZXcgUmVnRXhwKCJeIitNKyIqLCIrTSsiKiIpLFc9bmV3IFJlZ0V4cCgiXiIrTSsiKihbPit+XXwiK00rIikiK00rIioiKSwkPW5ldyBSZWdFeHAoTSsifD4iKSxZPW5ldyBSZWdFeHAocSksVj1uZXcgUmVnRXhwKCJeIitVKyIkIiksRz17SUQ6bmV3IFJlZ0V4cCgiXiMoIitVKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK1UrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK1UrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitCKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrcSksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitNKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitNKyIqKD86KFsrLV18KSIrTSsiKihcXGQrKXwpKSIrTSsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrXysiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sSz0vSFRNTCQvaSxYPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksSj0vXmhcZCQvaSxRPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxaPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sdHQ9L1srfl0vLGV0PW5ldyBSZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIrTSsiP3woIitNKyIpfC4pIiwiaWciKSxudD1mdW5jdGlvbih0LGUsbil7dmFyIHI9IjB4IitlLTY1NTM2O3JldHVybiByIT1yfHxuP2U6cjwwP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShyPj4xMHw1NTI5NiwxMDIzJnJ8NTYzMjApfSxydD0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxvdD1mdW5jdGlvbih0LGUpe3JldHVybiBlPyJcMCI9PT10PyLvv70iOnQuc2xpY2UoMCwtMSkrIlxcIit0LmNoYXJDb2RlQXQodC5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK3R9LGl0PWZ1bmN0aW9uKCl7cCgpfSxhdD14dChmdW5jdGlvbih0KXtyZXR1cm4hMD09PXQuZGlzYWJsZWQmJiJmaWVsZHNldCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7Ti5hcHBseShMPUkuY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksTFt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaCh0KXtOPXthcHBseTpMLmxlbmd0aD9mdW5jdGlvbih0LGUpe1AuYXBwbHkodCxJLmNhbGwoZSkpfTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aCxyPTA7dFtuKytdPWVbcisrXTspO3QubGVuZ3RoPW4tMX19fWZ1bmN0aW9uIHN0KHQsZSxyLG8pe3ZhciBpLHMsYyxsLGYsZCx5LG09ZSYmZS5vd25lckRvY3VtZW50LGs9ZT9lLm5vZGVUeXBlOjk7aWYocj1yfHxbXSwic3RyaW5nIiE9dHlwZW9mIHR8fCF0fHwxIT09ayYmOSE9PWsmJjExIT09aylyZXR1cm4gcjtpZighbyYmKChlP2Uub3duZXJEb2N1bWVudHx8ZTp3KSE9PWgmJnAoZSksZT1lfHxoLGcpKXtpZigxMSE9PWsmJihmPVouZXhlYyh0KSkpaWYoaT1mWzFdKXtpZig5PT09ayl7aWYoIShjPWUuZ2V0RWxlbWVudEJ5SWQoaSkpKXJldHVybiByO2lmKGMuaWQ9PT1pKXJldHVybiByLnB1c2goYykscn1lbHNlIGlmKG0mJihjPW0uZ2V0RWxlbWVudEJ5SWQoaSkpJiZiKGUsYykmJmMuaWQ9PT1pKXJldHVybiByLnB1c2goYykscn1lbHNle2lmKGZbMl0pcmV0dXJuIE4uYXBwbHkocixlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpKSxyO2lmKChpPWZbM10pJiZuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gTi5hcHBseShyLGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShpKSkscn1pZihuLnFzYSYmIUFbdCsiICJdJiYoIXZ8fCF2LnRlc3QodCkpJiYoMSE9PWt8fCJvYmplY3QiIT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSl7aWYoeT10LG09ZSwxPT09ayYmJC50ZXN0KHQpKXtmb3IoKGw9ZS5nZXRBdHRyaWJ1dGUoImlkIikpP2w9bC5yZXBsYWNlKHJ0LG90KTplLnNldEF0dHJpYnV0ZSgiaWQiLGw9eCkscz0oZD1hKHQpKS5sZW5ndGg7cy0tOylkW3NdPSIjIitsKyIgIitidChkW3NdKTt5PWQuam9pbigiLCIpLG09dHQudGVzdCh0KSYmeXQoZS5wYXJlbnROb2RlKXx8ZX10cnl7cmV0dXJuIE4uYXBwbHkocixtLnF1ZXJ5U2VsZWN0b3JBbGwoeSkpLHJ9Y2F0Y2goZSl7QSh0LCEwKX1maW5hbGx5e2w9PT14JiZlLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiB1KHQucmVwbGFjZShILCIkMSIpLGUscixvKX1mdW5jdGlvbiB1dCgpe3ZhciB0PVtdO3JldHVybiBmdW5jdGlvbiBlKG4sbyl7cmV0dXJuIHQucHVzaChuKyIgIik+ci5jYWNoZUxlbmd0aCYmZGVsZXRlIGVbdC5zaGlmdCgpXSxlW24rIiAiXT1vfX1mdW5jdGlvbiBjdCh0KXtyZXR1cm4gdFt4XT0hMCx0fWZ1bmN0aW9uIGx0KHQpe3ZhciBlPWguY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTt0cnl7cmV0dXJuISF0KGUpfWNhdGNoKHQpe3JldHVybiExfWZpbmFsbHl7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksZT1udWxsfX1mdW5jdGlvbiBmdCh0LGUpe2Zvcih2YXIgbj10LnNwbGl0KCJ8Iiksbz1uLmxlbmd0aDtvLS07KXIuYXR0ckhhbmRsZVtuW29dXT1lfWZ1bmN0aW9uIHB0KHQsZSl7dmFyIG49ZSYmdCxyPW4mJjE9PT10Lm5vZGVUeXBlJiYxPT09ZS5ub2RlVHlwZSYmdC5zb3VyY2VJbmRleC1lLnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobilmb3IoO249bi5uZXh0U2libGluZzspaWYobj09PWUpcmV0dXJuLTE7cmV0dXJuIHQ/MTotMX1mdW5jdGlvbiBodCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gZHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJmUudHlwZT09PXR9fWZ1bmN0aW9uIGd0KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iZm9ybSJpbiBlP2UucGFyZW50Tm9kZSYmITE9PT1lLmRpc2FibGVkPyJsYWJlbCJpbiBlPyJsYWJlbCJpbiBlLnBhcmVudE5vZGU/ZS5wYXJlbnROb2RlLmRpc2FibGVkPT09dDplLmRpc2FibGVkPT09dDplLmlzRGlzYWJsZWQ9PT10fHxlLmlzRGlzYWJsZWQhPT0hdCYmYXQoZSk9PT10OmUuZGlzYWJsZWQ9PT10OiJsYWJlbCJpbiBlJiZlLmRpc2FibGVkPT09dH19ZnVuY3Rpb24gdnQodCl7cmV0dXJuIGN0KGZ1bmN0aW9uKGUpe3JldHVybiBlPStlLGN0KGZ1bmN0aW9uKG4scil7Zm9yKHZhciBvLGk9dChbXSxuLmxlbmd0aCxlKSxhPWkubGVuZ3RoO2EtLTspbltvPWlbYV1dJiYobltvXT0hKHJbb109bltvXSkpfSl9KX1mdW5jdGlvbiB5dCh0KXtyZXR1cm4gdCYmdm9pZCAwIT09dC5nZXRFbGVtZW50c0J5VGFnTmFtZSYmdH1mb3IoZSBpbiBuPXN0LnN1cHBvcnQ9e30saT1zdC5pc1hNTD1mdW5jdGlvbih0KXt2YXIgZT10Lm5hbWVzcGFjZVVSSSxuPSh0Lm93bmVyRG9jdW1lbnR8fHQpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4hSy50ZXN0KGV8fG4mJm4ubm9kZU5hbWV8fCJIVE1MIil9LHA9c3Quc2V0RG9jdW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGUsbyxhPXQ/dC5vd25lckRvY3VtZW50fHx0Onc7cmV0dXJuIGEhPT1oJiY5PT09YS5ub2RlVHlwZSYmYS5kb2N1bWVudEVsZW1lbnQ/KGQ9KGg9YSkuZG9jdW1lbnRFbGVtZW50LGc9IWkoaCksdyE9PWgmJihvPWguZGVmYXVsdFZpZXcpJiZvLnRvcCE9PW8mJihvLmFkZEV2ZW50TGlzdGVuZXI/by5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGl0LCExKTpvLmF0dGFjaEV2ZW50JiZvLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsaXQpKSxuLmF0dHJpYnV0ZXM9bHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NOYW1lPSJpIiwhdC5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksbi5nZXRFbGVtZW50c0J5VGFnTmFtZT1sdChmdW5jdGlvbih0KXtyZXR1cm4gdC5hcHBlbmRDaGlsZChoLmNyZWF0ZUNvbW1lbnQoIiIpKSwhdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1RLnRlc3QoaC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxuLmdldEJ5SWQ9bHQoZnVuY3Rpb24odCl7cmV0dXJuIGQuYXBwZW5kQ2hpbGQodCkuaWQ9eCwhaC5nZXRFbGVtZW50c0J5TmFtZXx8IWguZ2V0RWxlbWVudHNCeU5hbWUoeCkubGVuZ3RofSksbi5nZXRCeUlkPyhyLmZpbHRlci5JRD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoZXQsbnQpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoImlkIik9PT1lfX0sci5maW5kLklEPWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZS5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG49ZS5nZXRFbGVtZW50QnlJZCh0KTtyZXR1cm4gbj9bbl06W119fSk6KHIuZmlsdGVyLklEPWZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShldCxudCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXZvaWQgMCE9PXQuZ2V0QXR0cmlidXRlTm9kZSYmdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09ZX19LHIuZmluZC5JRD1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUuZ2V0RWxlbWVudEJ5SWQmJmcpe3ZhciBuLHIsbyxpPWUuZ2V0RWxlbWVudEJ5SWQodCk7aWYoaSl7aWYoKG49aS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PXQpcmV0dXJuW2ldO2ZvcihvPWUuZ2V0RWxlbWVudHNCeU5hbWUodCkscj0wO2k9b1tyKytdOylpZigobj1pLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09dClyZXR1cm5baV19cmV0dXJuW119fSksci5maW5kLlRBRz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWUuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KTpuLnFzYT9lLnF1ZXJ5U2VsZWN0b3JBbGwodCk6dm9pZCAwfTpmdW5jdGlvbih0LGUpe3ZhciBuLHI9W10sbz0wLGk9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KTtpZigiKiI9PT10KXtmb3IoO249aVtvKytdOykxPT09bi5ub2RlVHlwZSYmci5wdXNoKG4pO3JldHVybiByfXJldHVybiBpfSxyLmZpbmQuQ0xBU1M9bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZylyZXR1cm4gZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHQpfSx5PVtdLHY9W10sKG4ucXNhPVEudGVzdChoLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGx0KGZ1bmN0aW9uKHQpe2QuYXBwZW5kQ2hpbGQodCkuaW5uZXJIVE1MPSI8YSBpZD0nIit4KyInPjwvYT48c2VsZWN0IGlkPSciK3grIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsdC5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmdi5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLHQucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK18rIikiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit4KyItXSIpLmxlbmd0aHx8di5wdXNoKCJ+PSIpLHQucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHYucHVzaCgiOmNoZWNrZWQiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit4KyIrKiIpLmxlbmd0aHx8di5wdXNoKCIuIy4rWyt+XSIpfSksbHQoZnVuY3Rpb24odCl7dC5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIGU9aC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Uuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksdC5hcHBlbmRDaGlsZChlKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmdi5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT10LnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZC5hcHBlbmRDaGlsZCh0KS5kaXNhYmxlZD0hMCwyIT09dC5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx2LnB1c2goIiwuKjoiKX0pKSwobi5tYXRjaGVzU2VsZWN0b3I9US50ZXN0KG09ZC5tYXRjaGVzfHxkLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8ZC5tb3pNYXRjaGVzU2VsZWN0b3J8fGQub01hdGNoZXNTZWxlY3Rvcnx8ZC5tc01hdGNoZXNTZWxlY3RvcikpJiZsdChmdW5jdGlvbih0KXtuLmRpc2Nvbm5lY3RlZE1hdGNoPW0uY2FsbCh0LCIqIiksbS5jYWxsKHQsIltzIT0nJ106eCIpLHkucHVzaCgiIT0iLHEpfSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSkseT15Lmxlbmd0aCYmbmV3IFJlZ0V4cCh5LmpvaW4oInwiKSksZT1RLnRlc3QoZC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksYj1lfHxRLnRlc3QoZC5jb250YWlucyk/ZnVuY3Rpb24odCxlKXt2YXIgbj05PT09dC5ub2RlVHlwZT90LmRvY3VtZW50RWxlbWVudDp0LHI9ZSYmZS5wYXJlbnROb2RlO3JldHVybiB0PT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24odCxlKXtpZihlKWZvcig7ZT1lLnBhcmVudE5vZGU7KWlmKGU9PT10KXJldHVybiEwO3JldHVybiExfSxPPWU/ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4gZj0hMCwwO3ZhciByPSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiByfHwoMSYocj0odC5vd25lckRvY3VtZW50fHx0KT09PShlLm93bmVyRG9jdW1lbnR8fGUpP3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk6MSl8fCFuLnNvcnREZXRhY2hlZCYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KT09PXI/dD09PWh8fHQub3duZXJEb2N1bWVudD09PXcmJmIodyx0KT8tMTplPT09aHx8ZS5vd25lckRvY3VtZW50PT09dyYmYih3LGUpPzE6bD9EKGwsdCktRChsLGUpOjA6NCZyPy0xOjEpfTpmdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiBmPSEwLDA7dmFyIG4scj0wLG89dC5wYXJlbnROb2RlLGk9ZS5wYXJlbnROb2RlLGE9W3RdLHM9W2VdO2lmKCFvfHwhaSlyZXR1cm4gdD09PWg/LTE6ZT09PWg/MTpvPy0xOmk/MTpsP0QobCx0KS1EKGwsZSk6MDtpZihvPT09aSlyZXR1cm4gcHQodCxlKTtmb3Iobj10O249bi5wYXJlbnROb2RlOylhLnVuc2hpZnQobik7Zm9yKG49ZTtuPW4ucGFyZW50Tm9kZTspcy51bnNoaWZ0KG4pO2Zvcig7YVtyXT09PXNbcl07KXIrKztyZXR1cm4gcj9wdChhW3JdLHNbcl0pOmFbcl09PT13Py0xOnNbcl09PT13PzE6MH0saCk6aH0sc3QubWF0Y2hlcz1mdW5jdGlvbih0LGUpe3JldHVybiBzdCh0LG51bGwsbnVsbCxlKX0sc3QubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKHQsZSl7aWYoKHQub3duZXJEb2N1bWVudHx8dCkhPT1oJiZwKHQpLG4ubWF0Y2hlc1NlbGVjdG9yJiZnJiYhQVtlKyIgIl0mJigheXx8IXkudGVzdChlKSkmJighdnx8IXYudGVzdChlKSkpdHJ5e3ZhciByPW0uY2FsbCh0LGUpO2lmKHJ8fG4uZGlzY29ubmVjdGVkTWF0Y2h8fHQuZG9jdW1lbnQmJjExIT09dC5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gcn1jYXRjaCh0KXtBKGUsITApfXJldHVybiBzdChlLGgsbnVsbCxbdF0pLmxlbmd0aD4wfSxzdC5jb250YWlucz1mdW5jdGlvbih0LGUpe3JldHVybih0Lm93bmVyRG9jdW1lbnR8fHQpIT09aCYmcCh0KSxiKHQsZSl9LHN0LmF0dHI9ZnVuY3Rpb24odCxlKXsodC5vd25lckRvY3VtZW50fHx0KSE9PWgmJnAodCk7dmFyIG89ci5hdHRySGFuZGxlW2UudG9Mb3dlckNhc2UoKV0saT1vJiZDLmNhbGwoci5hdHRySGFuZGxlLGUudG9Mb3dlckNhc2UoKSk/byh0LGUsIWcpOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09aT9pOm4uYXR0cmlidXRlc3x8IWc/dC5nZXRBdHRyaWJ1dGUoZSk6KGk9dC5nZXRBdHRyaWJ1dGVOb2RlKGUpKSYmaS5zcGVjaWZpZWQ/aS52YWx1ZTpudWxsfSxzdC5lc2NhcGU9ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnJlcGxhY2UocnQsb3QpfSxzdC5lcnJvcj1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrdCl9LHN0LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24odCl7dmFyIGUscj1bXSxvPTAsaT0wO2lmKGY9IW4uZGV0ZWN0RHVwbGljYXRlcyxsPSFuLnNvcnRTdGFibGUmJnQuc2xpY2UoMCksdC5zb3J0KE8pLGYpe2Zvcig7ZT10W2krK107KWU9PT10W2ldJiYobz1yLnB1c2goaSkpO2Zvcig7by0tOyl0LnNwbGljZShyW29dLDEpfXJldHVybiBsPW51bGwsdH0sbz1zdC5nZXRUZXh0PWZ1bmN0aW9uKHQpe3ZhciBlLG49IiIscj0wLGk9dC5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiB0LnRleHRDb250ZW50KXJldHVybiB0LnRleHRDb250ZW50O2Zvcih0PXQuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyluKz1vKHQpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiB0Lm5vZGVWYWx1ZX1lbHNlIGZvcig7ZT10W3IrK107KW4rPW8oZSk7cmV0dXJuIG59LChyPXN0LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmN0LG1hdGNoOkcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKHQpe3JldHVybiB0WzFdPXRbMV0ucmVwbGFjZShldCxudCksdFszXT0odFszXXx8dFs0XXx8dFs1XXx8IiIpLnJlcGxhY2UoZXQsbnQpLCJ+PSI9PT10WzJdJiYodFszXT0iICIrdFszXSsiICIpLHQuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRbMV09dFsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09dFsxXS5zbGljZSgwLDMpPyh0WzNdfHxzdC5lcnJvcih0WzBdKSx0WzRdPSsodFs0XT90WzVdKyh0WzZdfHwxKToyKigiZXZlbiI9PT10WzNdfHwib2RkIj09PXRbM10pKSx0WzVdPSsodFs3XSt0WzhdfHwib2RkIj09PXRbM10pKTp0WzNdJiZzdC5lcnJvcih0WzBdKSx0fSxQU0VVRE86ZnVuY3Rpb24odCl7dmFyIGUsbj0hdFs2XSYmdFsyXTtyZXR1cm4gRy5DSElMRC50ZXN0KHRbMF0pP251bGw6KHRbM10/dFsyXT10WzRdfHx0WzVdfHwiIjpuJiZZLnRlc3QobikmJihlPWEobiwhMCkpJiYoZT1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLWUpLW4ubGVuZ3RoKSYmKHRbMF09dFswXS5zbGljZSgwLGUpLHRbMl09bi5zbGljZSgwLGUpKSx0LnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKGV0LG50KS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PXQ/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWV9fSxDTEFTUzpmdW5jdGlvbih0KXt2YXIgZT1FW3QrIiAiXTtyZXR1cm4gZXx8KGU9bmV3IFJlZ0V4cCgiKF58IitNKyIpIit0KyIoIitNKyJ8JCkiKSkmJkUodCxmdW5jdGlvbih0KXtyZXR1cm4gZS50ZXN0KCJzdHJpbmciPT10eXBlb2YgdC5jbGFzc05hbWUmJnQuY2xhc3NOYW1lfHx2b2lkIDAhPT10LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIG89c3QuYXR0cihyLHQpO3JldHVybiBudWxsPT1vPyIhPSI9PT1lOiFlfHwobys9IiIsIj0iPT09ZT9vPT09bjoiIT0iPT09ZT9vIT09bjoiXj0iPT09ZT9uJiYwPT09by5pbmRleE9mKG4pOiIqPSI9PT1lP24mJm8uaW5kZXhPZihuKT4tMToiJD0iPT09ZT9uJiZvLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT1lPygiICIrby5yZXBsYWNlKEYsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PWUmJihvPT09bnx8by5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9Im50aCIhPT10LnNsaWNlKDAsMyksYT0ibGFzdCIhPT10LnNsaWNlKC00KSxzPSJvZi10eXBlIj09PWU7cmV0dXJuIDE9PT1yJiYwPT09bz9mdW5jdGlvbih0KXtyZXR1cm4hIXQucGFyZW50Tm9kZX06ZnVuY3Rpb24oZSxuLHUpe3ZhciBjLGwsZixwLGgsZCxnPWkhPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsdj1lLnBhcmVudE5vZGUseT1zJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbT0hdSYmIXMsYj0hMTtpZih2KXtpZihpKXtmb3IoO2c7KXtmb3IocD1lO3A9cFtnXTspaWYocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT15OjE9PT1wLm5vZGVUeXBlKXJldHVybiExO2Q9Zz0ib25seSI9PT10JiYhZCYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihkPVthP3YuZmlyc3RDaGlsZDp2Lmxhc3RDaGlsZF0sYSYmbSl7Zm9yKGI9KGg9KGM9KGw9KGY9KHA9dilbeF18fChwW3hdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbdF18fFtdKVswXT09PWsmJmNbMV0pJiZjWzJdLHA9aCYmdi5jaGlsZE5vZGVzW2hdO3A9KytoJiZwJiZwW2ddfHwoYj1oPTApfHxkLnBvcCgpOylpZigxPT09cC5ub2RlVHlwZSYmKytiJiZwPT09ZSl7bFt0XT1bayxoLGJdO2JyZWFrfX1lbHNlIGlmKG0mJihiPWg9KGM9KGw9KGY9KHA9ZSlbeF18fChwW3hdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbdF18fFtdKVswXT09PWsmJmNbMV0pLCExPT09Yilmb3IoOyhwPSsraCYmcCYmcFtnXXx8KGI9aD0wKXx8ZC5wb3AoKSkmJigocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT15OjEhPT1wLm5vZGVUeXBlKXx8ISsrYnx8KG0mJigobD0oZj1wW3hdfHwocFt4XT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW3RdPVtrLGJdKSxwIT09ZSkpOyk7cmV0dXJuKGItPW8pPT09cnx8YiVyPT0wJiZiL3I+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKHQsZSl7dmFyIG4sbz1yLnBzZXVkb3NbdF18fHIuc2V0RmlsdGVyc1t0LnRvTG93ZXJDYXNlKCldfHxzdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK3QpO3JldHVybiBvW3hdP28oZSk6by5sZW5ndGg+MT8obj1bdCx0LCIiLGVdLHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSh0LnRvTG93ZXJDYXNlKCkpP2N0KGZ1bmN0aW9uKHQsbil7Zm9yKHZhciByLGk9byh0LGUpLGE9aS5sZW5ndGg7YS0tOyl0W3I9RCh0LGlbYV0pXT0hKG5bcl09aVthXSl9KTpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsbil9KTpvfX0scHNldWRvczp7bm90OmN0KGZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49W10scj1zKHQucmVwbGFjZShILCIkMSIpKTtyZXR1cm4gclt4XT9jdChmdW5jdGlvbih0LGUsbixvKXtmb3IodmFyIGksYT1yKHQsbnVsbCxvLFtdKSxzPXQubGVuZ3RoO3MtLTspKGk9YVtzXSkmJih0W3NdPSEoZVtzXT1pKSl9KTpmdW5jdGlvbih0LG8saSl7cmV0dXJuIGVbMF09dCxyKGUsbnVsbCxpLG4pLGVbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6Y3QoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBzdCh0LGUpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmN0KGZ1bmN0aW9uKHQpe3JldHVybiB0PXQucmVwbGFjZShldCxudCksZnVuY3Rpb24oZSl7cmV0dXJuKGUudGV4dENvbnRlbnR8fG8oZSkpLmluZGV4T2YodCk+LTF9fSksbGFuZzpjdChmdW5jdGlvbih0KXtyZXR1cm4gVi50ZXN0KHR8fCIiKXx8c3QuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrdCksdD10LnJlcGxhY2UoZXQsbnQpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oZSl7dmFyIG47ZG97aWYobj1nP2UubGFuZzplLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8ZS5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4obj1uLnRvTG93ZXJDYXNlKCkpPT09dHx8MD09PW4uaW5kZXhPZih0KyItIil9d2hpbGUoKGU9ZS5wYXJlbnROb2RlKSYmMT09PWUubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihlKXt2YXIgbj10LmxvY2F0aW9uJiZ0LmxvY2F0aW9uLmhhc2g7cmV0dXJuIG4mJm4uc2xpY2UoMSk9PT1lLmlkfSxyb290OmZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZH0sZm9jdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1oLmFjdGl2ZUVsZW1lbnQmJighaC5oYXNGb2N1c3x8aC5oYXNGb2N1cygpKSYmISEodC50eXBlfHx0LmhyZWZ8fH50LnRhYkluZGV4KX0sZW5hYmxlZDpndCghMSksZGlzYWJsZWQ6Z3QoITApLGNoZWNrZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1lJiYhIXQuY2hlY2tlZHx8Im9wdGlvbiI9PT1lJiYhIXQuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKHQpe3JldHVybiB0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LCEwPT09dC5zZWxlY3RlZH0sZW1wdHk6ZnVuY3Rpb24odCl7Zm9yKHQ9dC5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKWlmKHQubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKHQpe3JldHVybiFyLnBzZXVkb3MuZW1wdHkodCl9LGhlYWRlcjpmdW5jdGlvbih0KXtyZXR1cm4gSi50ZXN0KHQubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gWC50ZXN0KHQubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1lJiYiYnV0dG9uIj09PXQudHlwZXx8ImJ1dHRvbiI9PT1lfSx0ZXh0OmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiJpbnB1dCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PXQudHlwZSYmKG51bGw9PShlPXQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1lLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDp2dChmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6dnQoZnVuY3Rpb24odCxlKXtyZXR1cm5bZS0xXX0pLGVxOnZ0KGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bbjwwP24rZTpuXX0pLGV2ZW46dnQoZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGU7bis9Mil0LnB1c2gobik7cmV0dXJuIHR9KSxvZGQ6dnQoZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MTtuPGU7bis9Mil0LnB1c2gobik7cmV0dXJuIHR9KSxsdDp2dChmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW48MD9uK2U6bj5lP2U6bjstLXI+PTA7KXQucHVzaChyKTtyZXR1cm4gdH0pLGd0OnZ0KGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bjwwP24rZTpuOysrcjxlOyl0LnB1c2gocik7cmV0dXJuIHR9KX19KS5wc2V1ZG9zLm50aD1yLnBzZXVkb3MuZXEse3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KXIucHNldWRvc1tlXT1odChlKTtmb3IoZSBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KXIucHNldWRvc1tlXT1kdChlKTtmdW5jdGlvbiBtdCgpe31mdW5jdGlvbiBidCh0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoLHI9IiI7ZTxuO2UrKylyKz10W2VdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIHh0KHQsZSxuKXt2YXIgcj1lLmRpcixvPWUubmV4dCxpPW98fHIsYT1uJiYicGFyZW50Tm9kZSI9PT1pLHM9UysrO3JldHVybiBlLmZpcnN0P2Z1bmN0aW9uKGUsbixvKXtmb3IoO2U9ZVtyXTspaWYoMT09PWUubm9kZVR5cGV8fGEpcmV0dXJuIHQoZSxuLG8pO3JldHVybiExfTpmdW5jdGlvbihlLG4sdSl7dmFyIGMsbCxmLHA9W2ssc107aWYodSl7Zm9yKDtlPWVbcl07KWlmKCgxPT09ZS5ub2RlVHlwZXx8YSkmJnQoZSxuLHUpKXJldHVybiEwfWVsc2UgZm9yKDtlPWVbcl07KWlmKDE9PT1lLm5vZGVUeXBlfHxhKWlmKGw9KGY9ZVt4XXx8KGVbeF09e30pKVtlLnVuaXF1ZUlEXXx8KGZbZS51bmlxdWVJRF09e30pLG8mJm89PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpZT1lW3JdfHxlO2Vsc2V7aWYoKGM9bFtpXSkmJmNbMF09PT1rJiZjWzFdPT09cylyZXR1cm4gcFsyXT1jWzJdO2lmKGxbaV09cCxwWzJdPXQoZSxuLHUpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB3dCh0KXtyZXR1cm4gdC5sZW5ndGg+MT9mdW5jdGlvbihlLG4scil7Zm9yKHZhciBvPXQubGVuZ3RoO28tLTspaWYoIXRbb10oZSxuLHIpKXJldHVybiExO3JldHVybiEwfTp0WzBdfWZ1bmN0aW9uIGt0KHQsZSxuLHIsbyl7Zm9yKHZhciBpLGE9W10scz0wLHU9dC5sZW5ndGgsYz1udWxsIT1lO3M8dTtzKyspKGk9dFtzXSkmJihuJiYhbihpLHIsbyl8fChhLnB1c2goaSksYyYmZS5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gU3QodCxlLG4scixvLGkpe3JldHVybiByJiYhclt4XSYmKHI9U3QocikpLG8mJiFvW3hdJiYobz1TdChvLGkpKSxjdChmdW5jdGlvbihpLGEscyx1KXt2YXIgYyxsLGYscD1bXSxoPVtdLGQ9YS5sZW5ndGgsZz1pfHxmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTAsbz1lLmxlbmd0aDtyPG87cisrKXN0KHQsZVtyXSxuKTtyZXR1cm4gbn0oZXx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLHY9IXR8fCFpJiZlP2c6a3QoZyxwLHQscyx1KSx5PW4/b3x8KGk/dDpkfHxyKT9bXTphOnY7aWYobiYmbih2LHkscyx1KSxyKWZvcihjPWt0KHksaCkscihjLFtdLHMsdSksbD1jLmxlbmd0aDtsLS07KShmPWNbbF0pJiYoeVtoW2xdXT0hKHZbaFtsXV09ZikpO2lmKGkpe2lmKG98fHQpe2lmKG8pe2ZvcihjPVtdLGw9eS5sZW5ndGg7bC0tOykoZj15W2xdKSYmYy5wdXNoKHZbbF09Zik7byhudWxsLHk9W10sYyx1KX1mb3IobD15Lmxlbmd0aDtsLS07KShmPXlbbF0pJiYoYz1vP0QoaSxmKTpwW2xdKT4tMSYmKGlbY109IShhW2NdPWYpKX19ZWxzZSB5PWt0KHk9PT1hP3kuc3BsaWNlKGQseS5sZW5ndGgpOnkpLG8/byhudWxsLGEseSx1KTpOLmFwcGx5KGEseSl9KX1mdW5jdGlvbiBFdCh0KXtmb3IodmFyIGUsbixvLGk9dC5sZW5ndGgsYT1yLnJlbGF0aXZlW3RbMF0udHlwZV0scz1hfHxyLnJlbGF0aXZlWyIgIl0sdT1hPzE6MCxsPXh0KGZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZX0scywhMCksZj14dChmdW5jdGlvbih0KXtyZXR1cm4gRChlLHQpPi0xfSxzLCEwKSxwPVtmdW5jdGlvbih0LG4scil7dmFyIG89IWEmJihyfHxuIT09Yyl8fCgoZT1uKS5ub2RlVHlwZT9sKHQsbixyKTpmKHQsbixyKSk7cmV0dXJuIGU9bnVsbCxvfV07dTxpO3UrKylpZihuPXIucmVsYXRpdmVbdFt1XS50eXBlXSlwPVt4dCh3dChwKSxuKV07ZWxzZXtpZigobj1yLmZpbHRlclt0W3VdLnR5cGVdLmFwcGx5KG51bGwsdFt1XS5tYXRjaGVzKSlbeF0pe2ZvcihvPSsrdTtvPGkmJiFyLnJlbGF0aXZlW3Rbb10udHlwZV07bysrKTtyZXR1cm4gU3QodT4xJiZ3dChwKSx1PjEmJmJ0KHQuc2xpY2UoMCx1LTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09dFt1LTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoSCwiJDEiKSxuLHU8byYmRXQodC5zbGljZSh1LG8pKSxvPGkmJkV0KHQ9dC5zbGljZShvKSksbzxpJiZidCh0KSl9cC5wdXNoKG4pfXJldHVybiB3dChwKX1yZXR1cm4gbXQucHJvdG90eXBlPXIuZmlsdGVycz1yLnBzZXVkb3Msci5zZXRGaWx0ZXJzPW5ldyBtdCxhPXN0LnRva2VuaXplPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbyxpLGEscyx1LGMsbD1UW3QrIiAiXTtpZihsKXJldHVybiBlPzA6bC5zbGljZSgwKTtmb3Iocz10LHU9W10sYz1yLnByZUZpbHRlcjtzOyl7Zm9yKGEgaW4gbiYmIShvPXouZXhlYyhzKSl8fChvJiYocz1zLnNsaWNlKG9bMF0ubGVuZ3RoKXx8cyksdS5wdXNoKGk9W10pKSxuPSExLChvPVcuZXhlYyhzKSkmJihuPW8uc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvWzBdLnJlcGxhY2UoSCwiICIpfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSksci5maWx0ZXIpIShvPUdbYV0uZXhlYyhzKSl8fGNbYV0mJiEobz1jW2FdKG8pKXx8KG49by5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOmEsbWF0Y2hlczpvfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0dXJuIGU/cy5sZW5ndGg6cz9zdC5lcnJvcih0KTpUKHQsdSkuc2xpY2UoMCl9LHM9c3QuY29tcGlsZT1mdW5jdGlvbih0LGUpe3ZhciBuLG89W10saT1bXSxzPWpbdCsiICJdO2lmKCFzKXtmb3IoZXx8KGU9YSh0KSksbj1lLmxlbmd0aDtuLS07KShzPUV0KGVbbl0pKVt4XT9vLnB1c2gocyk6aS5wdXNoKHMpOyhzPWoodCxmdW5jdGlvbih0LGUpe3ZhciBuPWUubGVuZ3RoPjAsbz10Lmxlbmd0aD4wLGk9ZnVuY3Rpb24oaSxhLHMsdSxsKXt2YXIgZixkLHYseT0wLG09IjAiLGI9aSYmW10seD1bXSx3PWMsUz1pfHxvJiZyLmZpbmQuVEFHKCIqIixsKSxFPWsrPW51bGw9PXc/MTpNYXRoLnJhbmRvbSgpfHwuMSxUPVMubGVuZ3RoO2ZvcihsJiYoYz1hPT09aHx8YXx8bCk7bSE9PVQmJm51bGwhPShmPVNbbV0pO20rKyl7aWYobyYmZil7Zm9yKGQ9MCxhfHxmLm93bmVyRG9jdW1lbnQ9PT1ofHwocChmKSxzPSFnKTt2PXRbZCsrXTspaWYodihmLGF8fGgscykpe3UucHVzaChmKTticmVha31sJiYoaz1FKX1uJiYoKGY9IXYmJmYpJiZ5LS0saSYmYi5wdXNoKGYpKX1pZih5Kz1tLG4mJm0hPT15KXtmb3IoZD0wO3Y9ZVtkKytdOyl2KGIseCxhLHMpO2lmKGkpe2lmKHk+MClmb3IoO20tLTspYlttXXx8eFttXXx8KHhbbV09Ui5jYWxsKHUpKTt4PWt0KHgpfU4uYXBwbHkodSx4KSxsJiYhaSYmeC5sZW5ndGg+MCYmeStlLmxlbmd0aD4xJiZzdC51bmlxdWVTb3J0KHUpfXJldHVybiBsJiYoaz1FLGM9dyksYn07cmV0dXJuIG4/Y3QoaSk6aX0oaSxvKSkpLnNlbGVjdG9yPXR9cmV0dXJuIHN9LHU9c3Quc2VsZWN0PWZ1bmN0aW9uKHQsZSxuLG8pe3ZhciBpLHUsYyxsLGYscD0iZnVuY3Rpb24iPT10eXBlb2YgdCYmdCxoPSFvJiZhKHQ9cC5zZWxlY3Rvcnx8dCk7aWYobj1ufHxbXSwxPT09aC5sZW5ndGgpe2lmKCh1PWhbMF09aFswXS5zbGljZSgwKSkubGVuZ3RoPjImJiJJRCI9PT0oYz11WzBdKS50eXBlJiY5PT09ZS5ub2RlVHlwZSYmZyYmci5yZWxhdGl2ZVt1WzFdLnR5cGVdKXtpZighKGU9KHIuZmluZC5JRChjLm1hdGNoZXNbMF0ucmVwbGFjZShldCxudCksZSl8fFtdKVswXSkpcmV0dXJuIG47cCYmKGU9ZS5wYXJlbnROb2RlKSx0PXQuc2xpY2UodS5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9Zm9yKGk9Ry5uZWVkc0NvbnRleHQudGVzdCh0KT8wOnUubGVuZ3RoO2ktLSYmKGM9dVtpXSwhci5yZWxhdGl2ZVtsPWMudHlwZV0pOylpZigoZj1yLmZpbmRbbF0pJiYobz1mKGMubWF0Y2hlc1swXS5yZXBsYWNlKGV0LG50KSx0dC50ZXN0KHVbMF0udHlwZSkmJnl0KGUucGFyZW50Tm9kZSl8fGUpKSl7aWYodS5zcGxpY2UoaSwxKSwhKHQ9by5sZW5ndGgmJmJ0KHUpKSlyZXR1cm4gTi5hcHBseShuLG8pLG47YnJlYWt9fXJldHVybihwfHxzKHQsaCkpKG8sZSwhZyxuLCFlfHx0dC50ZXN0KHQpJiZ5dChlLnBhcmVudE5vZGUpfHxlKSxufSxuLnNvcnRTdGFibGU9eC5zcGxpdCgiIikuc29ydChPKS5qb2luKCIiKT09PXgsbi5kZXRlY3REdXBsaWNhdGVzPSEhZixwKCksbi5zb3J0RGV0YWNoZWQ9bHQoZnVuY3Rpb24odCl7cmV0dXJuIDEmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihoLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksbHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT10LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8ZnQoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKHQsZSxuKXtpZighbilyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoZSwidHlwZSI9PT1lLnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmbHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5uZXJIVE1MPSI8aW5wdXQvPiIsdC5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PXQuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8ZnQoInZhbHVlIixmdW5jdGlvbih0LGUsbil7aWYoIW4mJiJpbnB1dCI9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQuZGVmYXVsdFZhbHVlfSksbHQoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGZ0KF8sZnVuY3Rpb24odCxlLG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09dFtlXT9lLnRvTG93ZXJDYXNlKCk6KHI9dC5nZXRBdHRyaWJ1dGVOb2RlKGUpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksc3R9KG4pO1MuZmluZD1qLFMuZXhwcj1qLnNlbGVjdG9ycyxTLmV4cHJbIjoiXT1TLmV4cHIucHNldWRvcyxTLnVuaXF1ZVNvcnQ9Uy51bmlxdWU9ai51bmlxdWVTb3J0LFMudGV4dD1qLmdldFRleHQsUy5pc1hNTERvYz1qLmlzWE1MLFMuY29udGFpbnM9ai5jb250YWlucyxTLmVzY2FwZVNlbGVjdG9yPWouZXNjYXBlO3ZhciBBPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9W10sbz12b2lkIDAhPT1uOyh0PXRbZV0pJiY5IT09dC5ub2RlVHlwZTspaWYoMT09PXQubm9kZVR5cGUpe2lmKG8mJlModCkuaXMobikpYnJlYWs7ci5wdXNoKHQpfXJldHVybiByfSxPPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdO3Q7dD10Lm5leHRTaWJsaW5nKTE9PT10Lm5vZGVUeXBlJiZ0IT09ZSYmbi5wdXNoKHQpO3JldHVybiBufSxDPVMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7ZnVuY3Rpb24gTCh0LGUpe3JldHVybiB0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCl9dmFyIFI9L148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7ZnVuY3Rpb24gUCh0LGUsbil7cmV0dXJuIG0oZSk/Uy5ncmVwKHQsZnVuY3Rpb24odCxyKXtyZXR1cm4hIWUuY2FsbCh0LHIsdCkhPT1ufSk6ZS5ub2RlVHlwZT9TLmdyZXAodCxmdW5jdGlvbih0KXtyZXR1cm4gdD09PWUhPT1ufSk6InN0cmluZyIhPXR5cGVvZiBlP1MuZ3JlcCh0LGZ1bmN0aW9uKHQpe3JldHVybiBmLmNhbGwoZSx0KT4tMSE9PW59KTpTLmZpbHRlcihlLHQsbil9Uy5maWx0ZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWVbMF07cmV0dXJuIG4mJih0PSI6bm90KCIrdCsiKSIpLDE9PT1lLmxlbmd0aCYmMT09PXIubm9kZVR5cGU/Uy5maW5kLm1hdGNoZXNTZWxlY3RvcihyLHQpP1tyXTpbXTpTLmZpbmQubWF0Y2hlcyh0LFMuZ3JlcChlLGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5ub2RlVHlwZX0pKX0sUy5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyPXRoaXMubGVuZ3RoLG89dGhpcztpZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIHRoaXMucHVzaFN0YWNrKFModCkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGU9MDtlPHI7ZSsrKWlmKFMuY29udGFpbnMob1tlXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3Iobj10aGlzLnB1c2hTdGFjayhbXSksZT0wO2U8cjtlKyspUy5maW5kKHQsb1tlXSxuKTtyZXR1cm4gcj4xP1MudW5pcXVlU29ydChuKTpufSxmaWx0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFAodGhpcyx0fHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFAodGhpcyx0fHxbXSwhMCkpfSxpczpmdW5jdGlvbih0KXtyZXR1cm4hIVAodGhpcywic3RyaW5nIj09dHlwZW9mIHQmJkMudGVzdCh0KT9TKHQpOnR8fFtdLCExKS5sZW5ndGh9fSk7dmFyIE4sST0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSspKSQvOyhTLmZuLmluaXQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByLG87aWYoIXQpcmV0dXJuIHRoaXM7aWYobj1ufHxOLCJzdHJpbmciPT10eXBlb2YgdCl7aWYoIShyPSI8Ij09PXRbMF0mJiI+Ij09PXRbdC5sZW5ndGgtMV0mJnQubGVuZ3RoPj0zP1tudWxsLHQsbnVsbF06SS5leGVjKHQpKXx8IXJbMV0mJmUpcmV0dXJuIWV8fGUuanF1ZXJ5PyhlfHxuKS5maW5kKHQpOnRoaXMuY29uc3RydWN0b3IoZSkuZmluZCh0KTtpZihyWzFdKXtpZihlPWUgaW5zdGFuY2VvZiBTP2VbMF06ZSxTLm1lcmdlKHRoaXMsUy5wYXJzZUhUTUwoclsxXSxlJiZlLm5vZGVUeXBlP2Uub3duZXJEb2N1bWVudHx8ZTphLCEwKSksUi50ZXN0KHJbMV0pJiZTLmlzUGxhaW5PYmplY3QoZSkpZm9yKHIgaW4gZSltKHRoaXNbcl0pP3RoaXNbcl0oZVtyXSk6dGhpcy5hdHRyKHIsZVtyXSk7cmV0dXJuIHRoaXN9cmV0dXJuKG89YS5nZXRFbGVtZW50QnlJZChyWzJdKSkmJih0aGlzWzBdPW8sdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gdC5ub2RlVHlwZT8odGhpc1swXT10LHRoaXMubGVuZ3RoPTEsdGhpcyk6bSh0KT92b2lkIDAhPT1uLnJlYWR5P24ucmVhZHkodCk6dChTKTpTLm1ha2VBcnJheSh0LHRoaXMpfSkucHJvdG90eXBlPVMuZm4sTj1TKGEpO3ZhciBEPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLF89e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ZnVuY3Rpb24gTSh0LGUpe2Zvcig7KHQ9dFtlXSkmJjEhPT10Lm5vZGVUeXBlOyk7cmV0dXJuIHR9Uy5mbi5leHRlbmQoe2hhczpmdW5jdGlvbih0KXt2YXIgZT1TKHQsdGhpcyksbj1lLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PG47dCsrKWlmKFMuY29udGFpbnModGhpcyxlW3RdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wLG89dGhpcy5sZW5ndGgsaT1bXSxhPSJzdHJpbmciIT10eXBlb2YgdCYmUyh0KTtpZighQy50ZXN0KHQpKWZvcig7cjxvO3IrKylmb3Iobj10aGlzW3JdO24mJm4hPT1lO249bi5wYXJlbnROb2RlKWlmKG4ubm9kZVR5cGU8MTEmJihhP2EuaW5kZXgobik+LTE6MT09PW4ubm9kZVR5cGUmJlMuZmluZC5tYXRjaGVzU2VsZWN0b3Iobix0KSkpe2kucHVzaChuKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soaS5sZW5ndGg+MT9TLnVuaXF1ZVNvcnQoaSk6aSl9LGluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0PyJzdHJpbmciPT10eXBlb2YgdD9mLmNhbGwoUyh0KSx0aGlzWzBdKTpmLmNhbGwodGhpcyx0LmpxdWVyeT90WzBdOnQpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMudW5pcXVlU29ydChTLm1lcmdlKHRoaXMuZ2V0KCksUyh0LGUpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFkZChudWxsPT10P3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKHQpKX19KSxTLmVhY2goe3BhcmVudDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7cmV0dXJuIGUmJjExIT09ZS5ub2RlVHlwZT9lOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24odCl7cmV0dXJuIEEodCwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBBKHQsInBhcmVudE5vZGUiLG4pfSxuZXh0OmZ1bmN0aW9uKHQpe3JldHVybiBNKHQsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24odCl7cmV0dXJuIE0odCwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIEEodCwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbih0KXtyZXR1cm4gQSh0LCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQSh0LCJuZXh0U2libGluZyIsbil9LHByZXZVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIEEodCwicHJldmlvdXNTaWJsaW5nIixuKX0sc2libGluZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIE8oKHQucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsdCl9LGNoaWxkcmVuOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10LmNvbnRlbnREb2N1bWVudD90LmNvbnRlbnREb2N1bWVudDooTCh0LCJ0ZW1wbGF0ZSIpJiYodD10LmNvbnRlbnR8fHQpLFMubWVyZ2UoW10sdC5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbih0LGUpe1MuZm5bdF09ZnVuY3Rpb24obixyKXt2YXIgbz1TLm1hcCh0aGlzLGUsbik7cmV0dXJuIlVudGlsIiE9PXQuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihvPVMuZmlsdGVyKHIsbykpLHRoaXMubGVuZ3RoPjEmJihfW3RdfHxTLnVuaXF1ZVNvcnQobyksRC50ZXN0KHQpJiZvLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2sobyl9fSk7dmFyIFU9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBCKHQpe3JldHVybiB0fWZ1bmN0aW9uIHEodCl7dGhyb3cgdH1mdW5jdGlvbiBGKHQsZSxuLHIpe3ZhciBvO3RyeXt0JiZtKG89dC5wcm9taXNlKT9vLmNhbGwodCkuZG9uZShlKS5mYWlsKG4pOnQmJm0obz10LnRoZW4pP28uY2FsbCh0LGUsbik6ZS5hcHBseSh2b2lkIDAsW3RdLnNsaWNlKHIpKX1jYXRjaCh0KXtuLmFwcGx5KHZvaWQgMCxbdF0pfX1TLkNhbGxiYWNrcz1mdW5jdGlvbih0KXt0PSJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gUy5lYWNoKHQubWF0Y2goVSl8fFtdLGZ1bmN0aW9uKHQsbil7ZVtuXT0hMH0pLGV9KHQpOlMuZXh0ZW5kKHt9LHQpO3ZhciBlLG4scixvLGk9W10sYT1bXSxzPS0xLHU9ZnVuY3Rpb24oKXtmb3Iobz1vfHx0Lm9uY2Uscj1lPSEwO2EubGVuZ3RoO3M9LTEpZm9yKG49YS5zaGlmdCgpOysrczxpLmxlbmd0aDspITE9PT1pW3NdLmFwcGx5KG5bMF0sblsxXSkmJnQuc3RvcE9uRmFsc2UmJihzPWkubGVuZ3RoLG49ITEpO3QubWVtb3J5fHwobj0hMSksZT0hMSxvJiYoaT1uP1tdOiIiKX0sYz17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIGkmJihuJiYhZSYmKHM9aS5sZW5ndGgtMSxhLnB1c2gobikpLGZ1bmN0aW9uIGUobil7Uy5lYWNoKG4sZnVuY3Rpb24obixyKXttKHIpP3QudW5pcXVlJiZjLmhhcyhyKXx8aS5wdXNoKHIpOnImJnIubGVuZ3RoJiYic3RyaW5nIiE9PWsocikmJmUocil9KX0oYXJndW1lbnRzKSxuJiYhZSYmdSgpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbjsobj1TLmluQXJyYXkoZSxpLG4pKT4tMTspaS5zcGxpY2UobiwxKSxuPD1zJiZzLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/Uy5pbkFycmF5KHQsaSk+LTE6aS5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaSYmKGk9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gbz1hPVtdLGk9bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFpfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIG89YT1bXSxufHxlfHwoaT1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW99LGZpcmVXaXRoOmZ1bmN0aW9uKHQsbil7cmV0dXJuIG98fChuPVt0LChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0sYS5wdXNoKG4pLGV8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBjLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBjfSxTLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIGU9W1sibm90aWZ5IiwicHJvZ3Jlc3MiLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSxTLkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLHI9InBlbmRpbmciLG89e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sY2F0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIG8udGhlbihudWxsLHQpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3JldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKG4pe1MuZWFjaChlLGZ1bmN0aW9uKGUscil7dmFyIG89bSh0W3JbNF1dKSYmdFtyWzRdXTtpW3JbMV1dKGZ1bmN0aW9uKCl7dmFyIHQ9byYmby5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dCYmbSh0LnByb21pc2UpP3QucHJvbWlzZSgpLnByb2dyZXNzKG4ubm90aWZ5KS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCk6bltyWzBdKyJXaXRoIl0odGhpcyxvP1t0XTphcmd1bWVudHMpfSl9KSx0PW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxyLG8pe3ZhciBpPTA7ZnVuY3Rpb24gYSh0LGUscixvKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcz10aGlzLHU9YXJndW1lbnRzLGM9ZnVuY3Rpb24oKXt2YXIgbixjO2lmKCEodDxpKSl7aWYoKG49ci5hcHBseShzLHUpKT09PWUucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO2M9biYmKCJvYmplY3QiPT10eXBlb2Ygbnx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pJiZuLnRoZW4sbShjKT9vP2MuY2FsbChuLGEoaSxlLEIsbyksYShpLGUscSxvKSk6KGkrKyxjLmNhbGwobixhKGksZSxCLG8pLGEoaSxlLHEsbyksYShpLGUsQixlLm5vdGlmeVdpdGgpKSk6KHIhPT1CJiYocz12b2lkIDAsdT1bbl0pLChvfHxlLnJlc29sdmVXaXRoKShzLHUpKX19LGw9bz9jOmZ1bmN0aW9uKCl7dHJ5e2MoKX1jYXRjaChuKXtTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJlMuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhuLGwuc3RhY2tUcmFjZSksdCsxPj1pJiYociE9PXEmJihzPXZvaWQgMCx1PVtuXSksZS5yZWplY3RXaXRoKHMsdSkpfX07dD9sKCk6KFMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYobC5zdGFja1RyYWNlPVMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLG4uc2V0VGltZW91dChsKSl9fXJldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKG4pe2VbMF1bM10uYWRkKGEoMCxuLG0obyk/bzpCLG4ubm90aWZ5V2l0aCkpLGVbMV1bM10uYWRkKGEoMCxuLG0odCk/dDpCKSksZVsyXVszXS5hZGQoYSgwLG4sbShyKT9yOnEpKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dD9TLmV4dGVuZCh0LG8pOm99fSxpPXt9O3JldHVybiBTLmVhY2goZSxmdW5jdGlvbih0LG4pe3ZhciBhPW5bMl0scz1uWzVdO29bblsxXV09YS5hZGQscyYmYS5hZGQoZnVuY3Rpb24oKXtyPXN9LGVbMy10XVsyXS5kaXNhYmxlLGVbMy10XVszXS5kaXNhYmxlLGVbMF1bMl0ubG9jayxlWzBdWzNdLmxvY2spLGEuYWRkKG5bM10uZmlyZSksaVtuWzBdXT1mdW5jdGlvbigpe3JldHVybiBpW25bMF0rIldpdGgiXSh0aGlzPT09aT92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LGlbblswXSsiV2l0aCJdPWEuZmlyZVdpdGh9KSxvLnByb21pc2UoaSksdCYmdC5jYWxsKGksaSksaX0sd2hlbjpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49ZSxyPUFycmF5KG4pLG89dS5jYWxsKGFyZ3VtZW50cyksaT1TLkRlZmVycmVkKCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7clt0XT10aGlzLG9bdF09YXJndW1lbnRzLmxlbmd0aD4xP3UuY2FsbChhcmd1bWVudHMpOm4sLS1lfHxpLnJlc29sdmVXaXRoKHIsbyl9fTtpZihlPD0xJiYoRih0LGkuZG9uZShhKG4pKS5yZXNvbHZlLGkucmVqZWN0LCFlKSwicGVuZGluZyI9PT1pLnN0YXRlKCl8fG0ob1tuXSYmb1tuXS50aGVuKSkpcmV0dXJuIGkudGhlbigpO2Zvcig7bi0tOylGKG9bbl0sYShuKSxpLnJlamVjdCk7cmV0dXJuIGkucHJvbWlzZSgpfX0pO3ZhciBIPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1MuRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbih0LGUpe24uY29uc29sZSYmbi5jb25zb2xlLndhcm4mJnQmJkgudGVzdCh0Lm5hbWUpJiZuLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIit0Lm1lc3NhZ2UsdC5zdGFjayxlKX0sUy5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbih0KXtuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB0fSl9O3ZhciB6PVMuRGVmZXJyZWQoKTtmdW5jdGlvbiBXKCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixXKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLFcpLFMucmVhZHkoKX1TLmZuLnJlYWR5PWZ1bmN0aW9uKHQpe3JldHVybiB6LnRoZW4odCkuY2F0Y2goZnVuY3Rpb24odCl7Uy5yZWFkeUV4Y2VwdGlvbih0KX0pLHRoaXN9LFMuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKHQpeyghMD09PXQ/LS1TLnJlYWR5V2FpdDpTLmlzUmVhZHkpfHwoUy5pc1JlYWR5PSEwLCEwIT09dCYmLS1TLnJlYWR5V2FpdD4wfHx6LnJlc29sdmVXaXRoKGEsW1NdKSl9fSksUy5yZWFkeS50aGVuPXoudGhlbiwiY29tcGxldGUiPT09YS5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1hLnJlYWR5U3RhdGUmJiFhLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9uLnNldFRpbWVvdXQoUy5yZWFkeSk6KGEuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsVyksbi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixXKSk7dmFyICQ9ZnVuY3Rpb24odCxlLG4scixvLGksYSl7dmFyIHM9MCx1PXQubGVuZ3RoLGM9bnVsbD09bjtpZigib2JqZWN0Ij09PWsobikpZm9yKHMgaW4gbz0hMCxuKSQodCxlLHMsbltzXSwhMCxpLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKG89ITAsbShyKXx8KGE9ITApLGMmJihhPyhlLmNhbGwodCxyKSxlPW51bGwpOihjPWUsZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGMuY2FsbChTKHQpLG4pfSkpLGUpKWZvcig7czx1O3MrKyllKHRbc10sbixhP3I6ci5jYWxsKHRbc10scyxlKHRbc10sbikpKTtyZXR1cm4gbz90OmM/ZS5jYWxsKHQpOnU/ZSh0WzBdLG4pOml9LFk9L14tbXMtLyxWPS8tKFthLXpdKS9nO2Z1bmN0aW9uIEcodCxlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEsodCl7cmV0dXJuIHQucmVwbGFjZShZLCJtcy0iKS5yZXBsYWNlKFYsRyl9dmFyIFg9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lm5vZGVUeXBlfHw5PT09dC5ub2RlVHlwZXx8ISt0Lm5vZGVUeXBlfTtmdW5jdGlvbiBKKCl7dGhpcy5leHBhbmRvPVMuZXhwYW5kbytKLnVpZCsrfUoudWlkPTEsSi5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5leHBhbmRvXTtyZXR1cm4gZXx8KGU9e30sWCh0KSYmKHQubm9kZVR5cGU/dFt0aGlzLmV4cGFuZG9dPWU6T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsdGhpcy5leHBhbmRvLHt2YWx1ZTplLGNvbmZpZ3VyYWJsZTohMH0pKSksZX0sc2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvPXRoaXMuY2FjaGUodCk7aWYoInN0cmluZyI9PXR5cGVvZiBlKW9bSyhlKV09bjtlbHNlIGZvcihyIGluIGUpb1tLKHIpXT1lW3JdO3JldHVybiBvfSxnZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLmNhY2hlKHQpOnRbdGhpcy5leHBhbmRvXSYmdFt0aGlzLmV4cGFuZG9dW0soZSldfSxhY2Nlc3M6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1lfHxlJiYic3RyaW5nIj09dHlwZW9mIGUmJnZvaWQgMD09PW4/dGhpcy5nZXQodCxlKToodGhpcy5zZXQodCxlLG4pLHZvaWQgMCE9PW4/bjplKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj10W3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09ZSl7bj0oZT1BcnJheS5pc0FycmF5KGUpP2UubWFwKEspOihlPUsoZSkpaW4gcj9bZV06ZS5tYXRjaChVKXx8W10pLmxlbmd0aDtmb3IoO24tLTspZGVsZXRlIHJbZVtuXV19KHZvaWQgMD09PWV8fFMuaXNFbXB0eU9iamVjdChyKSkmJih0Lm5vZGVUeXBlP3RbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIHRbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09ZSYmIVMuaXNFbXB0eU9iamVjdChlKX19O3ZhciBRPW5ldyBKLFo9bmV3IEosdHQ9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxldD0vW0EtWl0vZztmdW5jdGlvbiBudCh0LGUsbil7dmFyIHI7aWYodm9pZCAwPT09biYmMT09PXQubm9kZVR5cGUpaWYocj0iZGF0YS0iK2UucmVwbGFjZShldCwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49dC5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj1mdW5jdGlvbih0KXtyZXR1cm4idHJ1ZSI9PT10fHwiZmFsc2UiIT09dCYmKCJudWxsIj09PXQ/bnVsbDp0PT09K3QrIiI/K3Q6dHQudGVzdCh0KT9KU09OLnBhcnNlKHQpOnQpfShuKX1jYXRjaCh0KXt9Wi5zZXQodCxlLG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59Uy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIFouaGFzRGF0YSh0KXx8US5oYXNEYXRhKHQpfSxkYXRhOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gWi5hY2Nlc3ModCxlLG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQsZSl7Wi5yZW1vdmUodCxlKX0sX2RhdGE6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBRLmFjY2Vzcyh0LGUsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKHQsZSl7US5yZW1vdmUodCxlKX19KSxTLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbyxpPXRoaXNbMF0sYT1pJiZpLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09dCl7aWYodGhpcy5sZW5ndGgmJihvPVouZ2V0KGkpLDE9PT1pLm5vZGVUeXBlJiYhUS5nZXQoaSwiaGFzRGF0YUF0dHJzIikpKXtmb3Iobj1hLmxlbmd0aDtuLS07KWFbbl0mJjA9PT0ocj1hW25dLm5hbWUpLmluZGV4T2YoImRhdGEtIikmJihyPUsoci5zbGljZSg1KSksbnQoaSxyLG9bcl0pKTtRLnNldChpLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gb31yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Wi5zZXQodGhpcyx0KX0pOiQodGhpcyxmdW5jdGlvbihlKXt2YXIgbjtpZihpJiZ2b2lkIDA9PT1lKXJldHVybiB2b2lkIDAhPT0obj1aLmdldChpLHQpKT9uOnZvaWQgMCE9PShuPW50KGksdCkpP246dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe1ouc2V0KHRoaXMsdCxlKX0pfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtaLnJlbW92ZSh0aGlzLHQpfSl9fSksUy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtpZih0KXJldHVybiBlPShlfHwiZngiKSsicXVldWUiLHI9US5nZXQodCxlKSxuJiYoIXJ8fEFycmF5LmlzQXJyYXkobik/cj1RLmFjY2Vzcyh0LGUsUy5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24odCxlKXtlPWV8fCJmeCI7dmFyIG49Uy5xdWV1ZSh0LGUpLHI9bi5sZW5ndGgsbz1uLnNoaWZ0KCksaT1TLl9xdWV1ZUhvb2tzKHQsZSk7ImlucHJvZ3Jlc3MiPT09byYmKG89bi5zaGlmdCgpLHItLSksbyYmKCJmeCI9PT1lJiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgaS5zdG9wLG8uY2FsbCh0LGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKHQsZSl9LGkpKSwhciYmaSYmaS5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZSsicXVldWVIb29rcyI7cmV0dXJuIFEuZ2V0KHQsbil8fFEuYWNjZXNzKHQsbix7ZW1wdHk6Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7US5yZW1vdmUodCxbZSsicXVldWUiLG5dKX0pfSl9fSksUy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihlPXQsdD0iZngiLG4tLSksYXJndW1lbnRzLmxlbmd0aDxuP1MucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1lP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49Uy5xdWV1ZSh0aGlzLHQsZSk7Uy5fcXVldWVIb29rcyh0aGlzLHQpLCJmeCI9PT10JiYiaW5wcm9ncmVzcyIhPT1uWzBdJiZTLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmRlcXVldWUodGhpcyx0KX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnF1ZXVlKHR8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0xLG89Uy5EZWZlcnJlZCgpLGk9dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fG8ucmVzb2x2ZVdpdGgoaSxbaV0pfTtmb3IoInN0cmluZyIhPXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSx0PXR8fCJmeCI7YS0tOykobj1RLmdldChpW2FdLHQrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksby5wcm9taXNlKGUpfX0pO3ZhciBydD0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxvdD1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrcnQrIikoW2EteiVdKikkIiwiaSIpLGl0PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYXQ9YS5kb2N1bWVudEVsZW1lbnQsc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIFMuY29udGFpbnModC5vd25lckRvY3VtZW50LHQpfSx1dD17Y29tcG9zZWQ6ITB9O2F0LmdldFJvb3ROb2RlJiYoc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIFMuY29udGFpbnModC5vd25lckRvY3VtZW50LHQpfHx0LmdldFJvb3ROb2RlKHV0KT09PXQub3duZXJEb2N1bWVudH0pO3ZhciBjdD1mdW5jdGlvbih0LGUpe3JldHVybiJub25lIj09PSh0PWV8fHQpLnN0eWxlLmRpc3BsYXl8fCIiPT09dC5zdHlsZS5kaXNwbGF5JiZzdCh0KSYmIm5vbmUiPT09Uy5jc3ModCwiZGlzcGxheSIpfSxsdD1mdW5jdGlvbih0LGUsbixyKXt2YXIgbyxpLGE9e307Zm9yKGkgaW4gZSlhW2ldPXQuc3R5bGVbaV0sdC5zdHlsZVtpXT1lW2ldO2ZvcihpIGluIG89bi5hcHBseSh0LHJ8fFtdKSxlKXQuc3R5bGVbaV09YVtpXTtyZXR1cm4gb307ZnVuY3Rpb24gZnQodCxlLG4scil7dmFyIG8saSxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBTLmNzcyh0LGUsIiIpfSx1PXMoKSxjPW4mJm5bM118fChTLmNzc051bWJlcltlXT8iIjoicHgiKSxsPXQubm9kZVR5cGUmJihTLmNzc051bWJlcltlXXx8InB4IiE9PWMmJit1KSYmb3QuZXhlYyhTLmNzcyh0LGUpKTtpZihsJiZsWzNdIT09Yyl7Zm9yKHUvPTIsYz1jfHxsWzNdLGw9K3V8fDE7YS0tOylTLnN0eWxlKHQsZSxsK2MpLCgxLWkpKigxLShpPXMoKS91fHwuNSkpPD0wJiYoYT0wKSxsLz1pO2wqPTIsUy5zdHlsZSh0LGUsbCtjKSxuPW58fFtdfXJldHVybiBuJiYobD0rbHx8K3V8fDAsbz1uWzFdP2wrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWMsci5zdGFydD1sLHIuZW5kPW8pKSxvfXZhciBwdD17fTtmdW5jdGlvbiBodCh0KXt2YXIgZSxuPXQub3duZXJEb2N1bWVudCxyPXQubm9kZU5hbWUsbz1wdFtyXTtyZXR1cm4gb3x8KGU9bi5ib2R5LmFwcGVuZENoaWxkKG4uY3JlYXRlRWxlbWVudChyKSksbz1TLmNzcyhlLCJkaXNwbGF5IiksZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLCJub25lIj09PW8mJihvPSJibG9jayIpLHB0W3JdPW8sbyl9ZnVuY3Rpb24gZHQodCxlKXtmb3IodmFyIG4scixvPVtdLGk9MCxhPXQubGVuZ3RoO2k8YTtpKyspKHI9dFtpXSkuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSxlPygibm9uZSI9PT1uJiYob1tpXT1RLmdldChyLCJkaXNwbGF5Iil8fG51bGwsb1tpXXx8KHIuc3R5bGUuZGlzcGxheT0iIikpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZjdChyKSYmKG9baV09aHQocikpKToibm9uZSIhPT1uJiYob1tpXT0ibm9uZSIsUS5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoaT0wO2k8YTtpKyspbnVsbCE9b1tpXSYmKHRbaV0uc3R5bGUuZGlzcGxheT1vW2ldKTtyZXR1cm4gdH1TLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBkdCh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBkdCh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHQ/dD90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtjdCh0aGlzKT9TKHRoaXMpLnNob3coKTpTKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBndD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSx2dD0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKikvaSx5dD0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksbXQ9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtmdW5jdGlvbiBidCh0LGUpe3ZhciBuO3JldHVybiBuPXZvaWQgMCE9PXQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlfHwiKiIpOnZvaWQgMCE9PXQucXVlcnlTZWxlY3RvckFsbD90LnF1ZXJ5U2VsZWN0b3JBbGwoZXx8IioiKTpbXSx2b2lkIDA9PT1lfHxlJiZMKHQsZSk/Uy5tZXJnZShbdF0sbik6bn1mdW5jdGlvbiB4dCh0LGUpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylRLnNldCh0W25dLCJnbG9iYWxFdmFsIiwhZXx8US5nZXQoZVtuXSwiZ2xvYmFsRXZhbCIpKX1tdC5vcHRncm91cD1tdC5vcHRpb24sbXQudGJvZHk9bXQudGZvb3Q9bXQuY29sZ3JvdXA9bXQuY2FwdGlvbj1tdC50aGVhZCxtdC50aD1tdC50ZDt2YXIgd3Qsa3QsU3Q9Lzx8JiM/XHcrOy87ZnVuY3Rpb24gRXQodCxlLG4scixvKXtmb3IodmFyIGksYSxzLHUsYyxsLGY9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxoPTAsZD10Lmxlbmd0aDtoPGQ7aCsrKWlmKChpPXRbaF0pfHwwPT09aSlpZigib2JqZWN0Ij09PWsoaSkpUy5tZXJnZShwLGkubm9kZVR5cGU/W2ldOmkpO2Vsc2UgaWYoU3QudGVzdChpKSl7Zm9yKGE9YXx8Zi5hcHBlbmRDaGlsZChlLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxzPSh2dC5leGVjKGkpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLHU9bXRbc118fG10Ll9kZWZhdWx0LGEuaW5uZXJIVE1MPXVbMV0rUy5odG1sUHJlZmlsdGVyKGkpK3VbMl0sbD11WzBdO2wtLTspYT1hLmxhc3RDaGlsZDtTLm1lcmdlKHAsYS5jaGlsZE5vZGVzKSwoYT1mLmZpcnN0Q2hpbGQpLnRleHRDb250ZW50PSIifWVsc2UgcC5wdXNoKGUuY3JlYXRlVGV4dE5vZGUoaSkpO2ZvcihmLnRleHRDb250ZW50PSIiLGg9MDtpPXBbaCsrXTspaWYociYmUy5pbkFycmF5KGkscik+LTEpbyYmby5wdXNoKGkpO2Vsc2UgaWYoYz1zdChpKSxhPWJ0KGYuYXBwZW5kQ2hpbGQoaSksInNjcmlwdCIpLGMmJnh0KGEpLG4pZm9yKGw9MDtpPWFbbCsrXTspeXQudGVzdChpLnR5cGV8fCIiKSYmbi5wdXNoKGkpO3JldHVybiBmfXd0PWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgiZGl2IikpLChrdD1hLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksa3Quc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGt0LnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSx3dC5hcHBlbmRDaGlsZChrdCkseS5jaGVja0Nsb25lPXd0LmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCx3dC5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLHkubm9DbG9uZUNoZWNrZWQ9ISF3dC5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7dmFyIFR0PS9ea2V5LyxqdD0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sQXQ9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIE90KCl7cmV0dXJuITB9ZnVuY3Rpb24gQ3QoKXtyZXR1cm4hMX1mdW5jdGlvbiBMdCh0LGUpe3JldHVybiB0PT09ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGEuYWN0aXZlRWxlbWVudH1jYXRjaCh0KXt9fSgpPT0oImZvY3VzIj09PWUpfWZ1bmN0aW9uIFJ0KHQsZSxuLHIsbyxpKXt2YXIgYSxzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKHMgaW4ic3RyaW5nIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApLGUpUnQodCxzLG4scixlW3NdLGkpO3JldHVybiB0fWlmKG51bGw9PXImJm51bGw9PW8/KG89bixyPW49dm9pZCAwKTpudWxsPT1vJiYoInN0cmluZyI9PXR5cGVvZiBuPyhvPXIscj12b2lkIDApOihvPXIscj1uLG49dm9pZCAwKSksITE9PT1vKW89Q3Q7ZWxzZSBpZighbylyZXR1cm4gdDtyZXR1cm4gMT09PWkmJihhPW8sKG89ZnVuY3Rpb24odCl7cmV0dXJuIFMoKS5vZmYodCksYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KS5ndWlkPWEuZ3VpZHx8KGEuZ3VpZD1TLmd1aWQrKykpLHQuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQuYWRkKHRoaXMsZSxvLHIsbil9KX1mdW5jdGlvbiBQdCh0LGUsbil7bj8oUS5zZXQodCxlLCExKSxTLmV2ZW50LmFkZCh0LGUse25hbWVzcGFjZTohMSxoYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciByLG8saT1RLmdldCh0aGlzLGUpO2lmKDEmdC5pc1RyaWdnZXImJnRoaXNbZV0pe2lmKGkubGVuZ3RoKShTLmV2ZW50LnNwZWNpYWxbZV18fHt9KS5kZWxlZ2F0ZVR5cGUmJnQuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihpPXUuY2FsbChhcmd1bWVudHMpLFEuc2V0KHRoaXMsZSxpKSxyPW4odGhpcyxlKSx0aGlzW2VdKCksaSE9PShvPVEuZ2V0KHRoaXMsZSkpfHxyP1Euc2V0KHRoaXMsZSwhMSk6bz17fSxpIT09bylyZXR1cm4gdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0LnByZXZlbnREZWZhdWx0KCksby52YWx1ZX1lbHNlIGkubGVuZ3RoJiYoUS5zZXQodGhpcyxlLHt2YWx1ZTpTLmV2ZW50LnRyaWdnZXIoUy5leHRlbmQoaVswXSxTLkV2ZW50LnByb3RvdHlwZSksaS5zbGljZSgxKSx0aGlzKX0pLHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfX0pKTp2b2lkIDA9PT1RLmdldCh0LGUpJiZTLmV2ZW50LmFkZCh0LGUsT3QpfVMuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaSxhLHMsdSxjLGwsZixwLGgsZCxnLHY9US5nZXQodCk7aWYodilmb3Iobi5oYW5kbGVyJiYobj0oaT1uKS5oYW5kbGVyLG89aS5zZWxlY3RvciksbyYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihhdCxvKSxuLmd1aWR8fChuLmd1aWQ9Uy5ndWlkKyspLCh1PXYuZXZlbnRzKXx8KHU9di5ldmVudHM9e30pLChhPXYuaGFuZGxlKXx8KGE9di5oYW5kbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PVMmJlMuZXZlbnQudHJpZ2dlcmVkIT09ZS50eXBlP1MuZXZlbnQuZGlzcGF0Y2guYXBwbHkodCxhcmd1bWVudHMpOnZvaWQgMH0pLGM9KGU9KGV8fCIiKS5tYXRjaChVKXx8WyIiXSkubGVuZ3RoO2MtLTspaD1nPShzPUF0LmV4ZWMoZVtjXSl8fFtdKVsxXSxkPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksaCYmKGY9Uy5ldmVudC5zcGVjaWFsW2hdfHx7fSxoPShvP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxoLGY9Uy5ldmVudC5zcGVjaWFsW2hdfHx7fSxsPVMuZXh0ZW5kKHt0eXBlOmgsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOm8sbmVlZHNDb250ZXh0Om8mJlMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChvKSxuYW1lc3BhY2U6ZC5qb2luKCIuIil9LGkpLChwPXVbaF0pfHwoKHA9dVtoXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKHQscixkLGEpfHx0LmFkZEV2ZW50TGlzdGVuZXImJnQuYWRkRXZlbnRMaXN0ZW5lcihoLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwodCxsKSxsLmhhbmRsZXIuZ3VpZHx8KGwuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLG8/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxsKTpwLnB1c2gobCksUy5ldmVudC5nbG9iYWxbaF09ITApfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaSxhLHMsdSxjLGwsZixwLGgsZCxnLHY9US5oYXNEYXRhKHQpJiZRLmdldCh0KTtpZih2JiYodT12LmV2ZW50cykpe2ZvcihjPShlPShlfHwiIikubWF0Y2goVSl8fFsiIl0pLmxlbmd0aDtjLS07KWlmKGg9Zz0ocz1BdC5leGVjKGVbY10pfHxbXSlbMV0sZD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGgpe2ZvcihmPVMuZXZlbnQuc3BlY2lhbFtoXXx8e30scD11W2g9KHI/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGhdfHxbXSxzPXNbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK2Quam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksYT1pPXAubGVuZ3RoO2ktLTspbD1wW2ldLCFvJiZnIT09bC5vcmlnVHlwZXx8biYmbi5ndWlkIT09bC5ndWlkfHxzJiYhcy50ZXN0KGwubmFtZXNwYWNlKXx8ciYmciE9PWwuc2VsZWN0b3ImJigiKioiIT09cnx8IWwuc2VsZWN0b3IpfHwocC5zcGxpY2UoaSwxKSxsLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbCh0LGwpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbCh0LGQsdi5oYW5kbGUpfHxTLnJlbW92ZUV2ZW50KHQsaCx2LmhhbmRsZSksZGVsZXRlIHVbaF0pfWVsc2UgZm9yKGggaW4gdSlTLmV2ZW50LnJlbW92ZSh0LGgrZVtjXSxuLHIsITApO1MuaXNFbXB0eU9iamVjdCh1KSYmUS5yZW1vdmUodCwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHM9Uy5ldmVudC5maXgodCksdT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksYz0oUS5nZXQodGhpcywiZXZlbnRzIil8fHt9KVtzLnR5cGVdfHxbXSxsPVMuZXZlbnQuc3BlY2lhbFtzLnR5cGVdfHx7fTtmb3IodVswXT1zLGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXVbZV09YXJndW1lbnRzW2VdO2lmKHMuZGVsZWdhdGVUYXJnZXQ9dGhpcywhbC5wcmVEaXNwYXRjaHx8ITEhPT1sLnByZURpc3BhdGNoLmNhbGwodGhpcyxzKSl7Zm9yKGE9Uy5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMscyxjKSxlPTA7KG89YVtlKytdKSYmIXMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZm9yKHMuY3VycmVudFRhcmdldD1vLmVsZW0sbj0wOyhpPW8uaGFuZGxlcnNbbisrXSkmJiFzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7KXMucm5hbWVzcGFjZSYmITEhPT1pLm5hbWVzcGFjZSYmIXMucm5hbWVzcGFjZS50ZXN0KGkubmFtZXNwYWNlKXx8KHMuaGFuZGxlT2JqPWkscy5kYXRhPWkuZGF0YSx2b2lkIDAhPT0ocj0oKFMuZXZlbnQuc3BlY2lhbFtpLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8aS5oYW5kbGVyKS5hcHBseShvLmVsZW0sdSkpJiYhMT09PShzLnJlc3VsdD1yKSYmKHMucHJldmVudERlZmF1bHQoKSxzLnN0b3BQcm9wYWdhdGlvbigpKSk7cmV0dXJuIGwucG9zdERpc3BhdGNoJiZsLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMscykscy5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbyxpLGEscz1bXSx1PWUuZGVsZWdhdGVDb3VudCxjPXQudGFyZ2V0O2lmKHUmJmMubm9kZVR5cGUmJiEoImNsaWNrIj09PXQudHlwZSYmdC5idXR0b24+PTEpKWZvcig7YyE9PXRoaXM7Yz1jLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWMubm9kZVR5cGUmJigiY2xpY2siIT09dC50eXBlfHwhMCE9PWMuZGlzYWJsZWQpKXtmb3IoaT1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbbz0ocj1lW25dKS5zZWxlY3RvcisiICJdJiYoYVtvXT1yLm5lZWRzQ29udGV4dD9TKG8sdGhpcykuaW5kZXgoYyk+LTE6Uy5maW5kKG8sdGhpcyxudWxsLFtjXSkubGVuZ3RoKSxhW29dJiZpLnB1c2gocik7aS5sZW5ndGgmJnMucHVzaCh7ZWxlbTpjLGhhbmRsZXJzOml9KX1yZXR1cm4gYz10aGlzLHU8ZS5sZW5ndGgmJnMucHVzaCh7ZWxlbTpjLGhhbmRsZXJzOmUuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFMuRXZlbnQucHJvdG90eXBlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDptKGUpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBlKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbdF19LHNldDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9fSl9LGZpeDpmdW5jdGlvbih0KXtyZXR1cm4gdFtTLmV4cGFuZG9dP3Q6bmV3IFMuRXZlbnQodCl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxjbGljazp7c2V0dXA6ZnVuY3Rpb24odCl7dmFyIGU9dGhpc3x8dDtyZXR1cm4gZ3QudGVzdChlLnR5cGUpJiZlLmNsaWNrJiZMKGUsImlucHV0IikmJlB0KGUsImNsaWNrIixPdCksITF9LHRyaWdnZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpc3x8dDtyZXR1cm4gZ3QudGVzdChlLnR5cGUpJiZlLmNsaWNrJiZMKGUsImlucHV0IikmJlB0KGUsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKHQpe3ZhciBlPXQudGFyZ2V0O3JldHVybiBndC50ZXN0KGUudHlwZSkmJmUuY2xpY2smJkwoZSwiaW5wdXQiKSYmUS5nZXQoZSwiY2xpY2siKXx8TChlLCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbih0KXt2b2lkIDAhPT10LnJlc3VsdCYmdC5vcmlnaW5hbEV2ZW50JiYodC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPXQucmVzdWx0KX19fX0sUy5yZW1vdmVFdmVudD1mdW5jdGlvbih0LGUsbil7dC5yZW1vdmVFdmVudExpc3RlbmVyJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxuKX0sUy5FdmVudD1mdW5jdGlvbih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFMuRXZlbnQpKXJldHVybiBuZXcgUy5FdmVudCh0LGUpO3QmJnQudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD10LmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PXQuZGVmYXVsdFByZXZlbnRlZCYmITE9PT10LnJldHVyblZhbHVlP090OkN0LHRoaXMudGFyZ2V0PXQudGFyZ2V0JiYzPT09dC50YXJnZXQubm9kZVR5cGU/dC50YXJnZXQucGFyZW50Tm9kZTp0LnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9dC5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD10LnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT10LGUmJlMuZXh0ZW5kKHRoaXMsZSksdGhpcy50aW1lU3RhbXA9dCYmdC50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1tTLmV4cGFuZG9dPSEwfSxTLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6Uy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6Q3QsaXNQcm9wYWdhdGlvblN0b3BwZWQ6Q3QsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6Q3QsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9T3QsdCYmIXRoaXMuaXNTaW11bGF0ZWQmJnQucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9T3QsdCYmIXRoaXMuaXNTaW11bGF0ZWQmJnQuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPU90LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxTLmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsY2hhcjohMCxjb2RlOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuYnV0dG9uO3JldHVybiBudWxsPT10LndoaWNoJiZUdC50ZXN0KHQudHlwZSk/bnVsbCE9dC5jaGFyQ29kZT90LmNoYXJDb2RlOnQua2V5Q29kZTohdC53aGljaCYmdm9pZCAwIT09ZSYmanQudGVzdCh0LnR5cGUpPzEmZT8xOjImZT8zOjQmZT8yOjA6dC53aGljaH19LFMuZXZlbnQuYWRkUHJvcCksUy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbih0LGUpe1MuZXZlbnQuc3BlY2lhbFt0XT17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gUHQodGhpcyx0LEx0KSwhMX0sdHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQpLCEwfSxkZWxlZ2F0ZVR5cGU6ZX19KSxTLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQiLHBvaW50ZXJlbnRlcjoicG9pbnRlcm92ZXIiLHBvaW50ZXJsZWF2ZToicG9pbnRlcm91dCJ9LGZ1bmN0aW9uKHQsZSl7Uy5ldmVudC5zcGVjaWFsW3RdPXtkZWxlZ2F0ZVR5cGU6ZSxiaW5kVHlwZTplLGhhbmRsZTpmdW5jdGlvbih0KXt2YXIgbixyPXRoaXMsbz10LnJlbGF0ZWRUYXJnZXQsaT10LmhhbmRsZU9iajtyZXR1cm4gbyYmKG89PT1yfHxTLmNvbnRhaW5zKHIsbykpfHwodC50eXBlPWkub3JpZ1R5cGUsbj1pLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQudHlwZT1lKSxufX19KSxTLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIFJ0KHRoaXMsdCxlLG4scil9LG9uZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gUnQodGhpcyx0LGUsbixyLDEpfSxvZmY6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG87aWYodCYmdC5wcmV2ZW50RGVmYXVsdCYmdC5oYW5kbGVPYmopcmV0dXJuIHI9dC5oYW5kbGVPYmosUyh0LmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIHQpe2ZvcihvIGluIHQpdGhpcy5vZmYobyxlLHRbb10pO3JldHVybiB0aGlzfXJldHVybiExIT09ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGV8fChuPWUsZT12b2lkIDApLCExPT09biYmKG49Q3QpLHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQucmVtb3ZlKHRoaXMsdCxuLGUpfSl9fSk7dmFyIE50PS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKVtePl0qKVwvPi9naSxJdD0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxEdD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxfdD0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7ZnVuY3Rpb24gTXQodCxlKXtyZXR1cm4gTCh0LCJ0YWJsZSIpJiZMKDExIT09ZS5ub2RlVHlwZT9lOmUuZmlyc3RDaGlsZCwidHIiKSYmUyh0KS5jaGlsZHJlbigidGJvZHkiKVswXXx8dH1mdW5jdGlvbiBVdCh0KXtyZXR1cm4gdC50eXBlPShudWxsIT09dC5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK3QudHlwZSx0fWZ1bmN0aW9uIEJ0KHQpe3JldHVybiJ0cnVlLyI9PT0odC50eXBlfHwiIikuc2xpY2UoMCw1KT90LnR5cGU9dC50eXBlLnNsaWNlKDUpOnQucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksdH1mdW5jdGlvbiBxdCh0LGUpe3ZhciBuLHIsbyxpLGEscyx1LGM7aWYoMT09PWUubm9kZVR5cGUpe2lmKFEuaGFzRGF0YSh0KSYmKGk9US5hY2Nlc3ModCksYT1RLnNldChlLGkpLGM9aS5ldmVudHMpKWZvcihvIGluIGRlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fSxjKWZvcihuPTAscj1jW29dLmxlbmd0aDtuPHI7bisrKVMuZXZlbnQuYWRkKGUsbyxjW29dW25dKTtaLmhhc0RhdGEodCkmJihzPVouYWNjZXNzKHQpLHU9Uy5leHRlbmQoe30scyksWi5zZXQoZSx1KSl9fWZ1bmN0aW9uIEZ0KHQsZSl7dmFyIG49ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZndC50ZXN0KHQudHlwZSk/ZS5jaGVja2VkPXQuY2hlY2tlZDoiaW5wdXQiIT09biYmInRleHRhcmVhIiE9PW58fChlLmRlZmF1bHRWYWx1ZT10LmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gSHQodCxlLG4scil7ZT1jLmFwcGx5KFtdLGUpO3ZhciBvLGksYSxzLHUsbCxmPTAscD10Lmxlbmd0aCxoPXAtMSxkPWVbMF0sZz1tKGQpO2lmKGd8fHA+MSYmInN0cmluZyI9PXR5cGVvZiBkJiYheS5jaGVja0Nsb25lJiZEdC50ZXN0KGQpKXJldHVybiB0LmVhY2goZnVuY3Rpb24obyl7dmFyIGk9dC5lcShvKTtnJiYoZVswXT1kLmNhbGwodGhpcyxvLGkuaHRtbCgpKSksSHQoaSxlLG4scil9KTtpZihwJiYoaT0obz1FdChlLHRbMF0ub3duZXJEb2N1bWVudCwhMSx0LHIpKS5maXJzdENoaWxkLDE9PT1vLmNoaWxkTm9kZXMubGVuZ3RoJiYobz1pKSxpfHxyKSl7Zm9yKHM9KGE9Uy5tYXAoYnQobywic2NyaXB0IiksVXQpKS5sZW5ndGg7ZjxwO2YrKyl1PW8sZiE9PWgmJih1PVMuY2xvbmUodSwhMCwhMCkscyYmUy5tZXJnZShhLGJ0KHUsInNjcmlwdCIpKSksbi5jYWxsKHRbZl0sdSxmKTtpZihzKWZvcihsPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxTLm1hcChhLEJ0KSxmPTA7ZjxzO2YrKyl1PWFbZl0seXQudGVzdCh1LnR5cGV8fCIiKSYmIVEuYWNjZXNzKHUsImdsb2JhbEV2YWwiKSYmUy5jb250YWlucyhsLHUpJiYodS5zcmMmJiJtb2R1bGUiIT09KHUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/Uy5fZXZhbFVybCYmIXUubm9Nb2R1bGUmJlMuX2V2YWxVcmwodS5zcmMse25vbmNlOnUubm9uY2V8fHUuZ2V0QXR0cmlidXRlKCJub25jZSIpfSk6dyh1LnRleHRDb250ZW50LnJlcGxhY2UoX3QsIiIpLHUsbCkpfXJldHVybiB0fWZ1bmN0aW9uIHp0KHQsZSxuKXtmb3IodmFyIHIsbz1lP1MuZmlsdGVyKGUsdCk6dCxpPTA7bnVsbCE9KHI9b1tpXSk7aSsrKW58fDEhPT1yLm5vZGVUeXBlfHxTLmNsZWFuRGF0YShidChyKSksci5wYXJlbnROb2RlJiYobiYmc3QocikmJnh0KGJ0KHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiB0fVMuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoTnQsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscz10LmNsb25lTm9kZSghMCksdT1zdCh0KTtpZighKHkubm9DbG9uZUNoZWNrZWR8fDEhPT10Lm5vZGVUeXBlJiYxMSE9PXQubm9kZVR5cGV8fFMuaXNYTUxEb2ModCkpKWZvcihhPWJ0KHMpLHI9MCxvPShpPWJ0KHQpKS5sZW5ndGg7cjxvO3IrKylGdChpW3JdLGFbcl0pO2lmKGUpaWYobilmb3IoaT1pfHxidCh0KSxhPWF8fGJ0KHMpLHI9MCxvPWkubGVuZ3RoO3I8bztyKyspcXQoaVtyXSxhW3JdKTtlbHNlIHF0KHQscyk7cmV0dXJuKGE9YnQocywic2NyaXB0IikpLmxlbmd0aD4wJiZ4dChhLCF1JiZidCh0LCJzY3JpcHQiKSksc30sY2xlYW5EYXRhOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuLHIsbz1TLmV2ZW50LnNwZWNpYWwsaT0wO3ZvaWQgMCE9PShuPXRbaV0pO2krKylpZihYKG4pKXtpZihlPW5bUS5leHBhbmRvXSl7aWYoZS5ldmVudHMpZm9yKHIgaW4gZS5ldmVudHMpb1tyXT9TLmV2ZW50LnJlbW92ZShuLHIpOlMucmVtb3ZlRXZlbnQobixyLGUuaGFuZGxlKTtuW1EuZXhwYW5kb109dm9pZCAwfW5bWi5leHBhbmRvXSYmKG5bWi5leHBhbmRvXT12b2lkIDApfX19KSxTLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKHQpe3JldHVybiB6dCh0aGlzLHQsITApfSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHp0KHRoaXMsdCl9LHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD9TLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9dCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fE10KHRoaXMsdCkuYXBwZW5kQ2hpbGQodCl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGU9TXQodGhpcyx0KTtlLmluc2VydEJlZm9yZSh0LGUuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCxlPTA7bnVsbCE9KHQ9dGhpc1tlXSk7ZSsrKTE9PT10Lm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEoYnQodCwhMSkpLHQudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbih0LGUpe3JldHVybiB0PW51bGwhPXQmJnQsZT1udWxsPT1lP3Q6ZSx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBTLmNsb25lKHRoaXMsdCxlKX0pfSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCl7dmFyIGU9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09dCYmMT09PWUubm9kZVR5cGUpcmV0dXJuIGUuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmIUl0LnRlc3QodCkmJiFtdFsodnQuZXhlYyh0KXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe3Q9Uy5odG1sUHJlZmlsdGVyKHQpO3RyeXtmb3IoO248cjtuKyspMT09PShlPXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKGJ0KGUsITEpKSxlLmlubmVySFRNTD10KTtlPTB9Y2F0Y2godCl7fX1lJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKHQpfSxudWxsLHQsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTtTLmluQXJyYXkodGhpcyx0KTwwJiYoUy5jbGVhbkRhdGEoYnQodGhpcykpLG4mJm4ucmVwbGFjZUNoaWxkKGUsdGhpcykpfSx0KX19KSxTLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbih0LGUpe1MuZm5bdF09ZnVuY3Rpb24odCl7Zm9yKHZhciBuLHI9W10sbz1TKHQpLGk9by5sZW5ndGgtMSxhPTA7YTw9aTthKyspbj1hPT09aT90aGlzOnRoaXMuY2xvbmUoITApLFMob1thXSlbZV0obiksbC5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KTt2YXIgV3Q9bmV3IFJlZ0V4cCgiXigiK3J0KyIpKD8hcHgpW2EteiVdKyQiLCJpIiksJHQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiBlJiZlLm9wZW5lcnx8KGU9biksZS5nZXRDb21wdXRlZFN0eWxlKHQpfSxZdD1uZXcgUmVnRXhwKGl0LmpvaW4oInwiKSwiaSIpO2Z1bmN0aW9uIFZ0KHQsZSxuKXt2YXIgcixvLGksYSxzPXQuc3R5bGU7cmV0dXJuKG49bnx8JHQodCkpJiYoIiIhPT0oYT1uLmdldFByb3BlcnR5VmFsdWUoZSl8fG5bZV0pfHxzdCh0KXx8KGE9Uy5zdHlsZSh0LGUpKSwheS5waXhlbEJveFN0eWxlcygpJiZXdC50ZXN0KGEpJiZZdC50ZXN0KGUpJiYocj1zLndpZHRoLG89cy5taW5XaWR0aCxpPXMubWF4V2lkdGgscy5taW5XaWR0aD1zLm1heFdpZHRoPXMud2lkdGg9YSxhPW4ud2lkdGgscy53aWR0aD1yLHMubWluV2lkdGg9byxzLm1heFdpZHRoPWkpKSx2b2lkIDAhPT1hP2ErIiI6YX1mdW5jdGlvbiBHdCh0LGUpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtpZighdCgpKXJldHVybih0aGlzLmdldD1lKS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZGVsZXRlIHRoaXMuZ2V0fX19IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2lmKGwpe2Muc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MCIsbC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo2MCU7dG9wOjElIixhdC5hcHBlbmRDaGlsZChjKS5hcHBlbmRDaGlsZChsKTt2YXIgdD1uLmdldENvbXB1dGVkU3R5bGUobCk7cj0iMSUiIT09dC50b3AsdT0xMj09PWUodC5tYXJnaW5MZWZ0KSxsLnN0eWxlLnJpZ2h0PSI2MCUiLHM9MzY9PT1lKHQucmlnaHQpLG89MzY9PT1lKHQud2lkdGgpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixpPTEyPT09ZShsLm9mZnNldFdpZHRoLzMpLGF0LnJlbW92ZUNoaWxkKGMpLGw9bnVsbH19ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHQpKX12YXIgcixvLGkscyx1LGM9YS5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPWEuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5zdHlsZSYmKGwuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixsLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIseS5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWwuc3R5bGUuYmFja2dyb3VuZENsaXAsUy5leHRlbmQoeSx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLG99LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxzfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxyfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHV9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGl9fSkpfSgpO3ZhciBLdD1bIldlYmtpdCIsIk1veiIsIm1zIl0sWHQ9YS5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSxKdD17fTtmdW5jdGlvbiBRdCh0KXt2YXIgZT1TLmNzc1Byb3BzW3RdfHxKdFt0XTtyZXR1cm4gZXx8KHQgaW4gWHQ/dDpKdFt0XT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSksbj1LdC5sZW5ndGg7bi0tOylpZigodD1LdFtuXStlKWluIFh0KXJldHVybiB0fSh0KXx8dCl9dmFyIFp0PS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyx0ZT0vXi0tLyxlZT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sbmU9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIHJlKHQsZSxuKXt2YXIgcj1vdC5leGVjKGUpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTplfWZ1bmN0aW9uIG9lKHQsZSxuLHIsbyxpKXt2YXIgYT0id2lkdGgiPT09ZT8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPVMuY3NzKHQsbitpdFthXSwhMCxvKSkscj8oImNvbnRlbnQiPT09biYmKHUtPVMuY3NzKHQsInBhZGRpbmciK2l0W2FdLCEwLG8pKSwibWFyZ2luIiE9PW4mJih1LT1TLmNzcyh0LCJib3JkZXIiK2l0W2FdKyJXaWR0aCIsITAsbykpKToodSs9Uy5jc3ModCwicGFkZGluZyIraXRbYV0sITAsbyksInBhZGRpbmciIT09bj91Kz1TLmNzcyh0LCJib3JkZXIiK2l0W2FdKyJXaWR0aCIsITAsbyk6cys9Uy5jc3ModCwiYm9yZGVyIitpdFthXSsiV2lkdGgiLCEwLG8pKTtyZXR1cm4hciYmaT49MCYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKHRbIm9mZnNldCIrZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSldLWktdS1zLS41KSl8fDApLHV9ZnVuY3Rpb24gaWUodCxlLG4pe3ZhciByPSR0KHQpLG89KCF5LmJveFNpemluZ1JlbGlhYmxlKCl8fG4pJiYiYm9yZGVyLWJveCI9PT1TLmNzcyh0LCJib3hTaXppbmciLCExLHIpLGk9byxhPVZ0KHQsZSxyKSxzPSJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpO2lmKFd0LnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZvfHwiYXV0byI9PT1hfHwhcGFyc2VGbG9hdChhKSYmImlubGluZSI9PT1TLmNzcyh0LCJkaXNwbGF5IiwhMSxyKSkmJnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJihvPSJib3JkZXItYm94Ij09PVMuY3NzKHQsImJveFNpemluZyIsITEsciksKGk9cyBpbiB0KSYmKGE9dFtzXSkpLChhPXBhcnNlRmxvYXQoYSl8fDApK29lKHQsZSxufHwobz8iYm9yZGVyIjoiY29udGVudCIpLGkscixhKSsicHgifWZ1bmN0aW9uIGFlKHQsZSxuLHIsbyl7cmV0dXJuIG5ldyBhZS5wcm90b3R5cGUuaW5pdCh0LGUsbixyLG8pfVMuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKHQsZSl7aWYoZSl7dmFyIG49VnQodCwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsZ3JpZEFyZWE6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TdGFydDohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1N0YXJ0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6e30sc3R5bGU6ZnVuY3Rpb24odCxlLG4scil7aWYodCYmMyE9PXQubm9kZVR5cGUmJjghPT10Lm5vZGVUeXBlJiZ0LnN0eWxlKXt2YXIgbyxpLGEscz1LKGUpLHU9dGUudGVzdChlKSxjPXQuc3R5bGU7aWYodXx8KGU9UXQocykpLGE9Uy5jc3NIb29rc1tlXXx8Uy5jc3NIb29rc1tzXSx2b2lkIDA9PT1uKXJldHVybiBhJiYiZ2V0ImluIGEmJnZvaWQgMCE9PShvPWEuZ2V0KHQsITEscikpP286Y1tlXTsic3RyaW5nIj09PShpPXR5cGVvZiBuKSYmKG89b3QuZXhlYyhuKSkmJm9bMV0mJihuPWZ0KHQsZSxvKSxpPSJudW1iZXIiKSxudWxsIT1uJiZuPT1uJiYoIm51bWJlciIhPT1pfHx1fHwobis9byYmb1szXXx8KFMuY3NzTnVtYmVyW3NdPyIiOiJweCIpKSx5LmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1ufHwwIT09ZS5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChjW2VdPSJpbmhlcml0IiksYSYmInNldCJpbiBhJiZ2b2lkIDA9PT0obj1hLnNldCh0LG4scikpfHwodT9jLnNldFByb3BlcnR5KGUsbik6Y1tlXT1uKSl9fSxjc3M6ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHM9SyhlKTtyZXR1cm4gdGUudGVzdChlKXx8KGU9UXQocykpLChhPVMuY3NzSG9va3NbZV18fFMuY3NzSG9va3Nbc10pJiYiZ2V0ImluIGEmJihvPWEuZ2V0KHQsITAsbikpLHZvaWQgMD09PW8mJihvPVZ0KHQsZSxyKSksIm5vcm1hbCI9PT1vJiZlIGluIG5lJiYobz1uZVtlXSksIiI9PT1ufHxuPyhpPXBhcnNlRmxvYXQobyksITA9PT1ufHxpc0Zpbml0ZShpKT9pfHwwOm8pOm99fSksUy5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbih0LGUpe1MuY3NzSG9va3NbZV09e2dldDpmdW5jdGlvbih0LG4scil7aWYobilyZXR1cm4hWnQudGVzdChTLmNzcyh0LCJkaXNwbGF5IikpfHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiZ0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoP2llKHQsZSxyKTpsdCh0LGVlLGZ1bmN0aW9uKCl7cmV0dXJuIGllKHQsZSxyKX0pfSxzZXQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBvLGk9JHQodCksYT0heS5zY3JvbGxib3hTaXplKCkmJiJhYnNvbHV0ZSI9PT1pLnBvc2l0aW9uLHM9KGF8fHIpJiYiYm9yZGVyLWJveCI9PT1TLmNzcyh0LCJib3hTaXppbmciLCExLGkpLHU9cj9vZSh0LGUscixzLGkpOjA7cmV0dXJuIHMmJmEmJih1LT1NYXRoLmNlaWwodFsib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKV0tcGFyc2VGbG9hdChpW2VdKS1vZSh0LGUsImJvcmRlciIsITEsaSktLjUpKSx1JiYobz1vdC5leGVjKG4pKSYmInB4IiE9PShvWzNdfHwicHgiKSYmKHQuc3R5bGVbZV09bixuPVMuY3NzKHQsZSkpLHJlKDAsbix1KX19fSksUy5jc3NIb29rcy5tYXJnaW5MZWZ0PUd0KHkucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKHQsZSl7aWYoZSlyZXR1cm4ocGFyc2VGbG9hdChWdCh0LCJtYXJnaW5MZWZ0IikpfHx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtbHQodCx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLFMuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKHQsZSl7Uy5jc3NIb29rc1t0K2VdPXtleHBhbmQ6ZnVuY3Rpb24obil7Zm9yKHZhciByPTAsbz17fSxpPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO3I8NDtyKyspb1t0K2l0W3JdK2VdPWlbcl18fGlbci0yXXx8aVswXTtyZXR1cm4gb319LCJtYXJnaW4iIT09dCYmKFMuY3NzSG9va3NbdCtlXS5zZXQ9cmUpfSksUy5mbi5leHRlbmQoe2NzczpmdW5jdGlvbih0LGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT17fSxhPTA7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHI9JHQodCksbz1lLmxlbmd0aDthPG87YSsrKWlbZVthXV09Uy5jc3ModCxlW2FdLCExLHIpO3JldHVybiBpfXJldHVybiB2b2lkIDAhPT1uP1Muc3R5bGUodCxlLG4pOlMuY3NzKHQsZSl9LHQsZSxhcmd1bWVudHMubGVuZ3RoPjEpfX0pLFMuVHdlZW49YWUsYWUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphZSxpbml0OmZ1bmN0aW9uKHQsZSxuLHIsbyxpKXt0aGlzLmVsZW09dCx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1vfHxTLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9ZSx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9aXx8KFMuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgdD1hZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdCYmdC5nZXQ/dC5nZXQodGhpcyk6YWUucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKHQpe3ZhciBlLG49YWUucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz1lPVMuZWFzaW5nW3RoaXMuZWFzaW5nXSh0LHRoaXMub3B0aW9ucy5kdXJhdGlvbip0LDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPWU9dCx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqZSt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTphZS5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxhZS5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9YWUucHJvdG90eXBlLGFlLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gMSE9PXQuZWxlbS5ub2RlVHlwZXx8bnVsbCE9dC5lbGVtW3QucHJvcF0mJm51bGw9PXQuZWxlbS5zdHlsZVt0LnByb3BdP3QuZWxlbVt0LnByb3BdOihlPVMuY3NzKHQuZWxlbSx0LnByb3AsIiIpKSYmImF1dG8iIT09ZT9lOjB9LHNldDpmdW5jdGlvbih0KXtTLmZ4LnN0ZXBbdC5wcm9wXT9TLmZ4LnN0ZXBbdC5wcm9wXSh0KToxIT09dC5lbGVtLm5vZGVUeXBlfHwhUy5jc3NIb29rc1t0LnByb3BdJiZudWxsPT10LmVsZW0uc3R5bGVbUXQodC5wcm9wKV0/dC5lbGVtW3QucHJvcF09dC5ub3c6Uy5zdHlsZSh0LmVsZW0sdC5wcm9wLHQubm93K3QudW5pdCl9fX0sYWUucHJvcEhvb2tzLnNjcm9sbFRvcD1hZS5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKHQpe3QuZWxlbS5ub2RlVHlwZSYmdC5lbGVtLnBhcmVudE5vZGUmJih0LmVsZW1bdC5wcm9wXT10Lm5vdyl9fSxTLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxzd2luZzpmdW5jdGlvbih0KXtyZXR1cm4uNS1NYXRoLmNvcyh0Kk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LFMuZng9YWUucHJvdG90eXBlLmluaXQsUy5meC5zdGVwPXt9O3ZhciBzZSx1ZSxjZT0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sbGU9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBmZSgpe3VlJiYoITE9PT1hLmhpZGRlbiYmbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/bi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZmUpOm4uc2V0VGltZW91dChmZSxTLmZ4LmludGVydmFsKSxTLmZ4LnRpY2soKSl9ZnVuY3Rpb24gcGUoKXtyZXR1cm4gbi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2U9dm9pZCAwfSksc2U9RGF0ZS5ub3coKX1mdW5jdGlvbiBoZSh0LGUpe3ZhciBuLHI9MCxvPXtoZWlnaHQ6dH07Zm9yKGU9ZT8xOjA7cjw0O3IrPTItZSlvWyJtYXJnaW4iKyhuPWl0W3JdKV09b1sicGFkZGluZyIrbl09dDtyZXR1cm4gZSYmKG8ub3BhY2l0eT1vLndpZHRoPXQpLG99ZnVuY3Rpb24gZGUodCxlLG4pe2Zvcih2YXIgcixvPShnZS50d2VlbmVyc1tlXXx8W10pLmNvbmNhdChnZS50d2VlbmVyc1siKiJdKSxpPTAsYT1vLmxlbmd0aDtpPGE7aSsrKWlmKHI9b1tpXS5jYWxsKG4sZSx0KSlyZXR1cm4gcn1mdW5jdGlvbiBnZSh0LGUsbil7dmFyIHIsbyxpPTAsYT1nZS5wcmVmaWx0ZXJzLmxlbmd0aCxzPVMuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKG8pcmV0dXJuITE7Zm9yKHZhciBlPXNlfHxwZSgpLG49TWF0aC5tYXgoMCxjLnN0YXJ0VGltZStjLmR1cmF0aW9uLWUpLHI9MS0obi9jLmR1cmF0aW9ufHwwKSxpPTAsYT1jLnR3ZWVucy5sZW5ndGg7aTxhO2krKyljLnR3ZWVuc1tpXS5ydW4ocik7cmV0dXJuIHMubm90aWZ5V2l0aCh0LFtjLHIsbl0pLHI8MSYmYT9uOihhfHxzLm5vdGlmeVdpdGgodCxbYywxLDBdKSxzLnJlc29sdmVXaXRoKHQsW2NdKSwhMSl9LGM9cy5wcm9taXNlKHtlbGVtOnQscHJvcHM6Uy5leHRlbmQoe30sZSksb3B0czpTLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6Uy5lYXNpbmcuX2RlZmF1bHR9LG4pLG9yaWdpbmFsUHJvcGVydGllczplLG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTpzZXx8cGUoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihlLG4pe3ZhciByPVMuVHdlZW4odCxjLm9wdHMsZSxuLGMub3B0cy5zcGVjaWFsRWFzaW5nW2VdfHxjLm9wdHMuZWFzaW5nKTtyZXR1cm4gYy50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKGUpe3ZhciBuPTAscj1lP2MudHdlZW5zLmxlbmd0aDowO2lmKG8pcmV0dXJuIHRoaXM7Zm9yKG89ITA7bjxyO24rKyljLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIGU/KHMubm90aWZ5V2l0aCh0LFtjLDEsMF0pLHMucmVzb2x2ZVdpdGgodCxbYyxlXSkpOnMucmVqZWN0V2l0aCh0LFtjLGVdKSx0aGlzfX0pLGw9Yy5wcm9wcztmb3IoIWZ1bmN0aW9uKHQsZSl7dmFyIG4scixvLGksYTtmb3IobiBpbiB0KWlmKG89ZVtyPUsobildLGk9dFtuXSxBcnJheS5pc0FycmF5KGkpJiYobz1pWzFdLGk9dFtuXT1pWzBdKSxuIT09ciYmKHRbcl09aSxkZWxldGUgdFtuXSksKGE9Uy5jc3NIb29rc1tyXSkmJiJleHBhbmQiaW4gYSlmb3IobiBpbiBpPWEuZXhwYW5kKGkpLGRlbGV0ZSB0W3JdLGkpbiBpbiB0fHwodFtuXT1pW25dLGVbbl09byk7ZWxzZSBlW3JdPW99KGwsYy5vcHRzLnNwZWNpYWxFYXNpbmcpO2k8YTtpKyspaWYocj1nZS5wcmVmaWx0ZXJzW2ldLmNhbGwoYyx0LGwsYy5vcHRzKSlyZXR1cm4gbShyLnN0b3ApJiYoUy5fcXVldWVIb29rcyhjLmVsZW0sYy5vcHRzLnF1ZXVlKS5zdG9wPXIuc3RvcC5iaW5kKHIpKSxyO3JldHVybiBTLm1hcChsLGRlLGMpLG0oYy5vcHRzLnN0YXJ0KSYmYy5vcHRzLnN0YXJ0LmNhbGwodCxjKSxjLnByb2dyZXNzKGMub3B0cy5wcm9ncmVzcykuZG9uZShjLm9wdHMuZG9uZSxjLm9wdHMuY29tcGxldGUpLmZhaWwoYy5vcHRzLmZhaWwpLmFsd2F5cyhjLm9wdHMuYWx3YXlzKSxTLmZ4LnRpbWVyKFMuZXh0ZW5kKHUse2VsZW06dCxhbmltOmMscXVldWU6Yy5vcHRzLnF1ZXVlfSkpLGN9Uy5BbmltYXRpb249Uy5leHRlbmQoZ2Use3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jcmVhdGVUd2Vlbih0LGUpO3JldHVybiBmdChuLmVsZW0sdCxvdC5leGVjKGUpLG4pLG59XX0sdHdlZW5lcjpmdW5jdGlvbih0LGUpe20odCk/KGU9dCx0PVsiKiJdKTp0PXQubWF0Y2goVSk7Zm9yKHZhciBuLHI9MCxvPXQubGVuZ3RoO3I8bztyKyspbj10W3JdLGdlLnR3ZWVuZXJzW25dPWdlLnR3ZWVuZXJzW25dfHxbXSxnZS50d2VlbmVyc1tuXS51bnNoaWZ0KGUpfSxwcmVmaWx0ZXJzOltmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscyx1LGMsbCxmPSJ3aWR0aCJpbiBlfHwiaGVpZ2h0ImluIGUscD10aGlzLGg9e30sZD10LnN0eWxlLGc9dC5ub2RlVHlwZSYmY3QodCksdj1RLmdldCh0LCJmeHNob3ciKTtmb3IociBpbiBuLnF1ZXVlfHwobnVsbD09KGE9Uy5fcXVldWVIb29rcyh0LCJmeCIpKS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe2EudW5xdWV1ZWQtLSxTLnF1ZXVlKHQsImZ4IikubGVuZ3RofHxhLmVtcHR5LmZpcmUoKX0pfSkpLGUpaWYobz1lW3JdLGNlLnRlc3Qobykpe2lmKGRlbGV0ZSBlW3JdLGk9aXx8InRvZ2dsZSI9PT1vLG89PT0oZz8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09b3x8IXZ8fHZvaWQgMD09PXZbcl0pY29udGludWU7Zz0hMH1oW3JdPXYmJnZbcl18fFMuc3R5bGUodCxyKX1pZigodT0hUy5pc0VtcHR5T2JqZWN0KGUpKXx8IVMuaXNFbXB0eU9iamVjdChoKSlmb3IociBpbiBmJiYxPT09dC5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2Qub3ZlcmZsb3csZC5vdmVyZmxvd1gsZC5vdmVyZmxvd1ldLG51bGw9PShjPXYmJnYuZGlzcGxheSkmJihjPVEuZ2V0KHQsImRpc3BsYXkiKSksIm5vbmUiPT09KGw9Uy5jc3ModCwiZGlzcGxheSIpKSYmKGM/bD1jOihkdChbdF0sITApLGM9dC5zdHlsZS5kaXNwbGF5fHxjLGw9Uy5jc3ModCwiZGlzcGxheSIpLGR0KFt0XSkpKSwoImlubGluZSI9PT1sfHwiaW5saW5lLWJsb2NrIj09PWwmJm51bGwhPWMpJiYibm9uZSI9PT1TLmNzcyh0LCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2QuZGlzcGxheT1jfSksbnVsbD09YyYmKGw9ZC5kaXNwbGF5LGM9Im5vbmUiPT09bD8iIjpsKSksZC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGQub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtkLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0sZC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxkLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITEsaCl1fHwodj8iaGlkZGVuImluIHYmJihnPXYuaGlkZGVuKTp2PVEuYWNjZXNzKHQsImZ4c2hvdyIse2Rpc3BsYXk6Y30pLGkmJih2LmhpZGRlbj0hZyksZyYmZHQoW3RdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtmb3IociBpbiBnfHxkdChbdF0pLFEucmVtb3ZlKHQsImZ4c2hvdyIpLGgpUy5zdHlsZSh0LHIsaFtyXSl9KSksdT1kZShnP3Zbcl06MCxyLHApLHIgaW4gdnx8KHZbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX1dLHByZWZpbHRlcjpmdW5jdGlvbih0LGUpe2U/Z2UucHJlZmlsdGVycy51bnNoaWZ0KHQpOmdlLnByZWZpbHRlcnMucHVzaCh0KX19KSxTLnNwZWVkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10JiYib2JqZWN0Ij09dHlwZW9mIHQ/Uy5leHRlbmQoe30sdCk6e2NvbXBsZXRlOm58fCFuJiZlfHxtKHQpJiZ0LGR1cmF0aW9uOnQsZWFzaW5nOm4mJmV8fGUmJiFtKGUpJiZlfTtyZXR1cm4gUy5meC5vZmY/ci5kdXJhdGlvbj0wOiJudW1iZXIiIT10eXBlb2Ygci5kdXJhdGlvbiYmKHIuZHVyYXRpb24gaW4gUy5meC5zcGVlZHM/ci5kdXJhdGlvbj1TLmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTpyLmR1cmF0aW9uPVMuZnguc3BlZWRzLl9kZWZhdWx0KSxudWxsIT1yLnF1ZXVlJiYhMCE9PXIucXVldWV8fChyLnF1ZXVlPSJmeCIpLHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe20oci5vbGQpJiZyLm9sZC5jYWxsKHRoaXMpLHIucXVldWUmJlMuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSxTLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0aGlzLmZpbHRlcihjdCkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTplfSx0LG4scil9LGFuaW1hdGU6ZnVuY3Rpb24odCxlLG4scil7dmFyIG89Uy5pc0VtcHR5T2JqZWN0KHQpLGk9Uy5zcGVlZChlLG4sciksYT1mdW5jdGlvbigpe3ZhciBlPWdlKHRoaXMsUy5leHRlbmQoe30sdCksaSk7KG98fFEuZ2V0KHRoaXMsImZpbmlzaCIpKSYmZS5zdG9wKCEwKX07cmV0dXJuIGEuZmluaXNoPWEsb3x8ITE9PT1pLnF1ZXVlP3RoaXMuZWFjaChhKTp0aGlzLnF1ZXVlKGkucXVldWUsYSl9LHN0b3A6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3RvcDtkZWxldGUgdC5zdG9wLGUobil9O3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKG49ZSxlPXQsdD12b2lkIDApLGUmJiExIT09dCYmdGhpcy5xdWV1ZSh0fHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT0hMCxvPW51bGwhPXQmJnQrInF1ZXVlSG9va3MiLGk9Uy50aW1lcnMsYT1RLmdldCh0aGlzKTtpZihvKWFbb10mJmFbb10uc3RvcCYmcihhW29dKTtlbHNlIGZvcihvIGluIGEpYVtvXSYmYVtvXS5zdG9wJiZsZS50ZXN0KG8pJiZyKGFbb10pO2ZvcihvPWkubGVuZ3RoO28tLTspaVtvXS5lbGVtIT09dGhpc3x8bnVsbCE9dCYmaVtvXS5xdWV1ZSE9PXR8fChpW29dLmFuaW0uc3RvcChuKSxlPSExLGkuc3BsaWNlKG8sMSkpOyFlJiZufHxTLmRlcXVldWUodGhpcyx0KX0pfSxmaW5pc2g6ZnVuY3Rpb24odCl7cmV0dXJuITEhPT10JiYodD10fHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSxuPVEuZ2V0KHRoaXMpLHI9blt0KyJxdWV1ZSJdLG89blt0KyJxdWV1ZUhvb2tzIl0saT1TLnRpbWVycyxhPXI/ci5sZW5ndGg6MDtmb3Iobi5maW5pc2g9ITAsUy5xdWV1ZSh0aGlzLHQsW10pLG8mJm8uc3RvcCYmby5zdG9wLmNhbGwodGhpcywhMCksZT1pLmxlbmd0aDtlLS07KWlbZV0uZWxlbT09PXRoaXMmJmlbZV0ucXVldWU9PT10JiYoaVtlXS5hbmltLnN0b3AoITApLGkuc3BsaWNlKGUsMSkpO2ZvcihlPTA7ZTxhO2UrKylyW2VdJiZyW2VdLmZpbmlzaCYmcltlXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgbi5maW5pc2h9KX19KSxTLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKHQsZSl7dmFyIG49Uy5mbltlXTtTLmZuW2VdPWZ1bmN0aW9uKHQscixvKXtyZXR1cm4gbnVsbD09dHx8ImJvb2xlYW4iPT10eXBlb2YgdD9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoaGUoZSwhMCksdCxyLG8pfX0pLFMuZWFjaCh7c2xpZGVEb3duOmhlKCJzaG93Iiksc2xpZGVVcDpoZSgiaGlkZSIpLHNsaWRlVG9nZ2xlOmhlKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKHQsZSl7Uy5mblt0XT1mdW5jdGlvbih0LG4scil7cmV0dXJuIHRoaXMuYW5pbWF0ZShlLHQsbixyKX19KSxTLnRpbWVycz1bXSxTLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgdCxlPTAsbj1TLnRpbWVycztmb3Ioc2U9RGF0ZS5ub3coKTtlPG4ubGVuZ3RoO2UrKykodD1uW2VdKSgpfHxuW2VdIT09dHx8bi5zcGxpY2UoZS0tLDEpO24ubGVuZ3RofHxTLmZ4LnN0b3AoKSxzZT12b2lkIDB9LFMuZngudGltZXI9ZnVuY3Rpb24odCl7Uy50aW1lcnMucHVzaCh0KSxTLmZ4LnN0YXJ0KCl9LFMuZnguaW50ZXJ2YWw9MTMsUy5meC5zdGFydD1mdW5jdGlvbigpe3VlfHwodWU9ITAsZmUoKSl9LFMuZnguc3RvcD1mdW5jdGlvbigpe3VlPW51bGx9LFMuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LFMuZm4uZGVsYXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1TLmZ4JiZTLmZ4LnNwZWVkc1t0XXx8dCxlPWV8fCJmeCIsdGhpcy5xdWV1ZShlLGZ1bmN0aW9uKGUscil7dmFyIG89bi5zZXRUaW1lb3V0KGUsdCk7ci5zdG9wPWZ1bmN0aW9uKCl7bi5jbGVhclRpbWVvdXQobyl9fSl9LGZ1bmN0aW9uKCl7dmFyIHQ9YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGU9YS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTt0LnR5cGU9ImNoZWNrYm94Iix5LmNoZWNrT249IiIhPT10LnZhbHVlLHkub3B0U2VsZWN0ZWQ9ZS5zZWxlY3RlZCwodD1hLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnZhbHVlPSJ0Iix0LnR5cGU9InJhZGlvIix5LnJhZGlvVmFsdWU9InQiPT09dC52YWx1ZX0oKTt2YXIgdmUseWU9Uy5leHByLmF0dHJIYW5kbGU7Uy5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0aGlzLFMuYXR0cix0LGUsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5yZW1vdmVBdHRyKHRoaXMsdCl9KX19KSxTLmV4dGVuZCh7YXR0cjpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPXQubm9kZVR5cGU7aWYoMyE9PWkmJjghPT1pJiYyIT09aSlyZXR1cm4gdm9pZCAwPT09dC5nZXRBdHRyaWJ1dGU/Uy5wcm9wKHQsZSxuKTooMT09PWkmJlMuaXNYTUxEb2ModCl8fChvPVMuYXR0ckhvb2tzW2UudG9Mb3dlckNhc2UoKV18fChTLmV4cHIubWF0Y2guYm9vbC50ZXN0KGUpP3ZlOnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBTLnJlbW92ZUF0dHIodCxlKTpvJiYic2V0ImluIG8mJnZvaWQgMCE9PShyPW8uc2V0KHQsbixlKSk/cjoodC5zZXRBdHRyaWJ1dGUoZSxuKyIiKSxuKTpvJiYiZ2V0ImluIG8mJm51bGwhPT0ocj1vLmdldCh0LGUpKT9yOm51bGw9PShyPVMuZmluZC5hdHRyKHQsZSkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24odCxlKXtpZigheS5yYWRpb1ZhbHVlJiYicmFkaW8iPT09ZSYmTCh0LCJpbnB1dCIpKXt2YXIgbj10LnZhbHVlO3JldHVybiB0LnNldEF0dHJpYnV0ZSgidHlwZSIsZSksbiYmKHQudmFsdWU9biksZX19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MCxvPWUmJmUubWF0Y2goVSk7aWYobyYmMT09PXQubm9kZVR5cGUpZm9yKDtuPW9bcisrXTspdC5yZW1vdmVBdHRyaWJ1dGUobil9fSksdmU9e3NldDpmdW5jdGlvbih0LGUsbil7cmV0dXJuITE9PT1lP1MucmVtb3ZlQXR0cih0LG4pOnQuc2V0QXR0cmlidXRlKG4sbiksbn19LFMuZWFjaChTLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbih0LGUpe3ZhciBuPXllW2VdfHxTLmZpbmQuYXR0cjt5ZVtlXT1mdW5jdGlvbih0LGUscil7dmFyIG8saSxhPWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gcnx8KGk9eWVbYV0seWVbYV09byxvPW51bGwhPW4odCxlLHIpP2E6bnVsbCx5ZVthXT1pKSxvfX0pO3ZhciBtZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLGJlPS9eKD86YXxhcmVhKSQvaTtmdW5jdGlvbiB4ZSh0KXtyZXR1cm4odC5tYXRjaChVKXx8W10pLmpvaW4oIiAiKX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn1mdW5jdGlvbiBrZSh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90OiJzdHJpbmciPT10eXBlb2YgdCYmdC5tYXRjaChVKXx8W119Uy5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0aGlzLFMucHJvcCx0LGUsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbUy5wcm9wRml4W3RdfHx0XX0pfX0pLFMuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9dC5ub2RlVHlwZTtpZigzIT09aSYmOCE9PWkmJjIhPT1pKXJldHVybiAxPT09aSYmUy5pc1hNTERvYyh0KXx8KGU9Uy5wcm9wRml4W2VdfHxlLG89Uy5wcm9wSG9va3NbZV0pLHZvaWQgMCE9PW4/byYmInNldCJpbiBvJiZ2b2lkIDAhPT0ocj1vLnNldCh0LG4sZSkpP3I6dFtlXT1uOm8mJiJnZXQiaW4gbyYmbnVsbCE9PShyPW8uZ2V0KHQsZSkpP3I6dFtlXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlPVMuZmluZC5hdHRyKHQsInRhYmluZGV4Iik7cmV0dXJuIGU/cGFyc2VJbnQoZSwxMCk6bWUudGVzdCh0Lm5vZGVOYW1lKXx8YmUudGVzdCh0Lm5vZGVOYW1lKSYmdC5ocmVmPzA6LTF9fX0scHJvcEZpeDp7Zm9yOiJodG1sRm9yIixjbGFzczoiY2xhc3NOYW1lIn19KSx5Lm9wdFNlbGVjdGVkfHwoUy5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7cmV0dXJuIGUmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyZW50Tm9kZTtlJiYoZS5zZWxlY3RlZEluZGV4LGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLFMuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7Uy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLFMuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykuYWRkQ2xhc3ModC5jYWxsKHRoaXMsZSx3ZSh0aGlzKSkpfSk7aWYoKGU9a2UodCkpLmxlbmd0aClmb3IoO249dGhpc1t1KytdOylpZihvPXdlKG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit4ZShvKSsiICIpe2ZvcihhPTA7aT1lW2ErK107KXIuaW5kZXhPZigiICIraSsiICIpPDAmJihyKz1pKyIgIik7byE9PShzPXhlKHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnJlbW92ZUNsYXNzKHQuY2FsbCh0aGlzLGUsd2UodGhpcykpKX0pO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmF0dHIoImNsYXNzIiwiIik7aWYoKGU9a2UodCkpLmxlbmd0aClmb3IoO249dGhpc1t1KytdOylpZihvPXdlKG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit4ZShvKSsiICIpe2ZvcihhPTA7aT1lW2ErK107KWZvcig7ci5pbmRleE9mKCIgIitpKyIgIik+LTE7KXI9ci5yZXBsYWNlKCIgIitpKyIgIiwiICIpO28hPT0ocz14ZShyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dHlwZW9mIHQscj0ic3RyaW5nIj09PW58fEFycmF5LmlzQXJyYXkodCk7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZSYmcj9lP3RoaXMuYWRkQ2xhc3ModCk6dGhpcy5yZW1vdmVDbGFzcyh0KTptKHQpP3RoaXMuZWFjaChmdW5jdGlvbihuKXtTKHRoaXMpLnRvZ2dsZUNsYXNzKHQuY2FsbCh0aGlzLG4sd2UodGhpcyksZSksZSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSxvLGksYTtpZihyKWZvcihvPTAsaT1TKHRoaXMpLGE9a2UodCk7ZT1hW28rK107KWkuaGFzQ2xhc3MoZSk/aS5yZW1vdmVDbGFzcyhlKTppLmFkZENsYXNzKGUpO2Vsc2Ugdm9pZCAwIT09dCYmImJvb2xlYW4iIT09bnx8KChlPXdlKHRoaXMpKSYmUS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsZSksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsZXx8ITE9PT10PyIiOlEuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpKX0pfSxoYXNDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHI9MDtmb3IoZT0iICIrdCsiICI7bj10aGlzW3IrK107KWlmKDE9PT1uLm5vZGVUeXBlJiYoIiAiK3hlKHdlKG4pKSsiICIpLmluZGV4T2YoZSk+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIFNlPS9cci9nO1MuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG89dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1tKHQpLHRoaXMuZWFjaChmdW5jdGlvbihuKXt2YXIgbzsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PShvPXI/dC5jYWxsKHRoaXMsbixTKHRoaXMpLnZhbCgpKTp0KT9vPSIiOiJudW1iZXIiPT10eXBlb2Ygbz9vKz0iIjpBcnJheS5pc0FycmF5KG8pJiYobz1TLm1hcChvLGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOnQrIiJ9KSksKGU9Uy52YWxIb29rc1t0aGlzLnR5cGVdfHxTLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYic2V0ImluIGUmJnZvaWQgMCE9PWUuc2V0KHRoaXMsbywidmFsdWUiKXx8KHRoaXMudmFsdWU9bykpfSkpOm8/KGU9Uy52YWxIb29rc1tvLnR5cGVdfHxTLnZhbEhvb2tzW28ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYiZ2V0ImluIGUmJnZvaWQgMCE9PShuPWUuZ2V0KG8sInZhbHVlIikpP246InN0cmluZyI9PXR5cGVvZihuPW8udmFsdWUpP24ucmVwbGFjZShTZSwiIik6bnVsbD09bj8iIjpuOnZvaWQgMH19KSxTLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlPVMuZmluZC5hdHRyKHQsInZhbHVlIik7cmV0dXJuIG51bGwhPWU/ZTp4ZShTLnRleHQodCkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG89dC5vcHRpb25zLGk9dC5zZWxlY3RlZEluZGV4LGE9InNlbGVjdC1vbmUiPT09dC50eXBlLHM9YT9udWxsOltdLHU9YT9pKzE6by5sZW5ndGg7Zm9yKHI9aTwwP3U6YT9pOjA7cjx1O3IrKylpZigoKG49b1tyXSkuc2VsZWN0ZWR8fHI9PT1pKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhTChuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZihlPVMobikudmFsKCksYSlyZXR1cm4gZTtzLnB1c2goZSl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyLG89dC5vcHRpb25zLGk9Uy5tYWtlQXJyYXkoZSksYT1vLmxlbmd0aDthLS07KSgocj1vW2FdKS5zZWxlY3RlZD1TLmluQXJyYXkoUy52YWxIb29rcy5vcHRpb24uZ2V0KHIpLGkpPi0xKSYmKG49ITApO3JldHVybiBufHwodC5zZWxlY3RlZEluZGV4PS0xKSxpfX19fSksUy5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Uy52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdC5jaGVja2VkPVMuaW5BcnJheShTKHQpLnZhbCgpLGUpPi0xfX0seS5jaGVja09ufHwoUy52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10LmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOnQudmFsdWV9KX0pLHkuZm9jdXNpbj0ib25mb2N1c2luImluIG47dmFyIEVlPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxUZT1mdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpfTtTLmV4dGVuZChTLmV2ZW50LHt0cmlnZ2VyOmZ1bmN0aW9uKHQsZSxyLG8pe3ZhciBpLHMsdSxjLGwsZixwLGgsZz1bcnx8YV0sdj1kLmNhbGwodCwidHlwZSIpP3QudHlwZTp0LHk9ZC5jYWxsKHQsIm5hbWVzcGFjZSIpP3QubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYocz1oPXU9cj1yfHxhLDMhPT1yLm5vZGVUeXBlJiY4IT09ci5ub2RlVHlwZSYmIUVlLnRlc3QoditTLmV2ZW50LnRyaWdnZXJlZCkmJih2LmluZGV4T2YoIi4iKT4tMSYmKHk9di5zcGxpdCgiLiIpLHY9eS5zaGlmdCgpLHkuc29ydCgpKSxsPXYuaW5kZXhPZigiOiIpPDAmJiJvbiIrdiwodD10W1MuZXhwYW5kb10/dDpuZXcgUy5FdmVudCh2LCJvYmplY3QiPT10eXBlb2YgdCYmdCkpLmlzVHJpZ2dlcj1vPzI6Myx0Lm5hbWVzcGFjZT15LmpvaW4oIi4iKSx0LnJuYW1lc3BhY2U9dC5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIreS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLHQucmVzdWx0PXZvaWQgMCx0LnRhcmdldHx8KHQudGFyZ2V0PXIpLGU9bnVsbD09ZT9bdF06Uy5tYWtlQXJyYXkoZSxbdF0pLHA9Uy5ldmVudC5zcGVjaWFsW3ZdfHx7fSxvfHwhcC50cmlnZ2VyfHwhMSE9PXAudHJpZ2dlci5hcHBseShyLGUpKSl7aWYoIW8mJiFwLm5vQnViYmxlJiYhYihyKSl7Zm9yKGM9cC5kZWxlZ2F0ZVR5cGV8fHYsRWUudGVzdChjK3YpfHwocz1zLnBhcmVudE5vZGUpO3M7cz1zLnBhcmVudE5vZGUpZy5wdXNoKHMpLHU9czt1PT09KHIub3duZXJEb2N1bWVudHx8YSkmJmcucHVzaCh1LmRlZmF1bHRWaWV3fHx1LnBhcmVudFdpbmRvd3x8bil9Zm9yKGk9MDsocz1nW2krK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOyloPXMsdC50eXBlPWk+MT9jOnAuYmluZFR5cGV8fHYsKGY9KFEuZ2V0KHMsImV2ZW50cyIpfHx7fSlbdC50eXBlXSYmUS5nZXQocywiaGFuZGxlIikpJiZmLmFwcGx5KHMsZSksKGY9bCYmc1tsXSkmJmYuYXBwbHkmJlgocykmJih0LnJlc3VsdD1mLmFwcGx5KHMsZSksITE9PT10LnJlc3VsdCYmdC5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gdC50eXBlPXYsb3x8dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8cC5fZGVmYXVsdCYmITEhPT1wLl9kZWZhdWx0LmFwcGx5KGcucG9wKCksZSl8fCFYKHIpfHxsJiZtKHJbdl0pJiYhYihyKSYmKCh1PXJbbF0pJiYocltsXT1udWxsKSxTLmV2ZW50LnRyaWdnZXJlZD12LHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5hZGRFdmVudExpc3RlbmVyKHYsVGUpLHJbdl0oKSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmgucmVtb3ZlRXZlbnRMaXN0ZW5lcih2LFRlKSxTLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsdSYmKHJbbF09dSkpLHQucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPVMuZXh0ZW5kKG5ldyBTLkV2ZW50LG4se3R5cGU6dCxpc1NpbXVsYXRlZDohMH0pO1MuZXZlbnQudHJpZ2dlcihyLG51bGwsZSl9fSksUy5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC50cmlnZ2VyKHQsZSx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gUy5ldmVudC50cmlnZ2VyKHQsZSxuLCEwKX19KSx5LmZvY3VzaW58fFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24odCxlKXt2YXIgbj1mdW5jdGlvbih0KXtTLmV2ZW50LnNpbXVsYXRlKGUsdC50YXJnZXQsUy5ldmVudC5maXgodCkpfTtTLmV2ZW50LnNwZWNpYWxbZV09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLG89US5hY2Nlc3MocixlKTtvfHxyLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKSxRLmFjY2VzcyhyLGUsKG98fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxvPVEuYWNjZXNzKHIsZSktMTtvP1EuYWNjZXNzKHIsZSxvKTooci5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMCksUS5yZW1vdmUocixlKSl9fX0pO3ZhciBqZT1uLmxvY2F0aW9uLEFlPURhdGUubm93KCksT2U9L1w/LztTLnBhcnNlWE1MPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dHJ5e2U9KG5ldyBuLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQveG1sIil9Y2F0Y2godCl7ZT12b2lkIDB9cmV0dXJuIGUmJiFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8Uy5lcnJvcigiSW52YWxpZCBYTUw6ICIrdCksZX07dmFyIENlPS9cW1xdJC8sTGU9L1xyP1xuL2csUmU9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFBlPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBOZSh0LGUsbixyKXt2YXIgbztpZihBcnJheS5pc0FycmF5KGUpKVMuZWFjaChlLGZ1bmN0aW9uKGUsbyl7bnx8Q2UudGVzdCh0KT9yKHQsbyk6TmUodCsiWyIrKCJvYmplY3QiPT10eXBlb2YgbyYmbnVsbCE9bz9lOiIiKSsiXSIsbyxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PWsoZSkpcih0LGUpO2Vsc2UgZm9yKG8gaW4gZSlOZSh0KyJbIitvKyJdIixlW29dLG4scil9Uy5wYXJhbT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9W10sbz1mdW5jdGlvbih0LGUpe3ZhciBuPW0oZSk/ZSgpOmU7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KHQpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYobnVsbD09dClyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KHQpfHx0LmpxdWVyeSYmIVMuaXNQbGFpbk9iamVjdCh0KSlTLmVhY2godCxmdW5jdGlvbigpe28odGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiB0KU5lKG4sdFtuXSxlLG8pO3JldHVybiByLmpvaW4oIiYiKX0sUy5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBTLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9Uy5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIHQ/Uy5tYWtlQXJyYXkodCk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciB0PXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhUyh0aGlzKS5pcygiOmRpc2FibGVkIikmJlBlLnRlc3QodGhpcy5ub2RlTmFtZSkmJiFSZS50ZXN0KHQpJiYodGhpcy5jaGVja2VkfHwhZ3QudGVzdCh0KSl9KS5tYXAoZnVuY3Rpb24odCxlKXt2YXIgbj1TKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9TLm1hcChuLGZ1bmN0aW9uKHQpe3JldHVybntuYW1lOmUubmFtZSx2YWx1ZTp0LnJlcGxhY2UoTGUsIlxyXG4iKX19KTp7bmFtZTplLm5hbWUsdmFsdWU6bi5yZXBsYWNlKExlLCJcclxuIil9fSkuZ2V0KCl9fSk7dmFyIEllPS8lMjAvZyxEZT0vIy4qJC8sX2U9LyhbPyZdKV89W14mXSovLE1lPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20sVWU9L14oPzpHRVR8SEVBRCkkLyxCZT0vXlwvXC8vLHFlPXt9LEZlPXt9LEhlPSIqLyIuY29uY2F0KCIqIiksemU9YS5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gV2UodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7InN0cmluZyIhPXR5cGVvZiBlJiYobj1lLGU9IioiKTt2YXIgcixvPTAsaT1lLnRvTG93ZXJDYXNlKCkubWF0Y2goVSl8fFtdO2lmKG0obikpZm9yKDtyPWlbbysrXTspIisiPT09clswXT8ocj1yLnNsaWNlKDEpfHwiKiIsKHRbcl09dFtyXXx8W10pLnVuc2hpZnQobikpOih0W3JdPXRbcl18fFtdKS5wdXNoKG4pfX1mdW5jdGlvbiAkZSh0LGUsbixyKXt2YXIgbz17fSxpPXQ9PT1GZTtmdW5jdGlvbiBhKHMpe3ZhciB1O3JldHVybiBvW3NdPSEwLFMuZWFjaCh0W3NdfHxbXSxmdW5jdGlvbih0LHMpe3ZhciBjPXMoZSxuLHIpO3JldHVybiJzdHJpbmciIT10eXBlb2YgY3x8aXx8b1tjXT9pPyEodT1jKTp2b2lkIDA6KGUuZGF0YVR5cGVzLnVuc2hpZnQoYyksYShjKSwhMSl9KSx1fXJldHVybiBhKGUuZGF0YVR5cGVzWzBdKXx8IW9bIioiXSYmYSgiKiIpfWZ1bmN0aW9uIFllKHQsZSl7dmFyIG4scixvPVMuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiBlKXZvaWQgMCE9PWVbbl0mJigob1tuXT90OnJ8fChyPXt9KSlbbl09ZVtuXSk7cmV0dXJuIHImJlMuZXh0ZW5kKCEwLHQsciksdH16ZS5ocmVmPWplLmhyZWYsUy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOmplLmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOi9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLnRlc3QoamUucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SGUsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOlMucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbih0LGUpe3JldHVybiBlP1llKFllKHQsUy5hamF4U2V0dGluZ3MpLGUpOlllKFMuYWpheFNldHRpbmdzLHQpfSxhamF4UHJlZmlsdGVyOldlKHFlKSxhamF4VHJhbnNwb3J0OldlKEZlKSxhamF4OmZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSxlPWV8fHt9O3ZhciByLG8saSxzLHUsYyxsLGYscCxoLGQ9Uy5hamF4U2V0dXAoe30sZSksZz1kLmNvbnRleHR8fGQsdj1kLmNvbnRleHQmJihnLm5vZGVUeXBlfHxnLmpxdWVyeSk/UyhnKTpTLmV2ZW50LHk9Uy5EZWZlcnJlZCgpLG09Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYj1kLnN0YXR1c0NvZGV8fHt9LHg9e30sdz17fSxrPSJjYW5jZWxlZCIsRT17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKGwpe2lmKCFzKWZvcihzPXt9O2U9TWUuZXhlYyhpKTspc1tlWzFdLnRvTG93ZXJDYXNlKCkrIiAiXT0oc1tlWzFdLnRvTG93ZXJDYXNlKCkrIiAiXXx8W10pLmNvbmNhdChlWzJdKTtlPXNbdC50b0xvd2VyQ2FzZSgpKyIgIl19cmV0dXJuIG51bGw9PWU/bnVsbDplLmpvaW4oIiwgIil9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBsP2k6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1sJiYodD13W3QudG9Mb3dlckNhc2UoKV09d1t0LnRvTG93ZXJDYXNlKCldfHx0LHhbdF09ZSksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09bCYmKGQubWltZVR5cGU9dCksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbih0KXt2YXIgZTtpZih0KWlmKGwpRS5hbHdheXModFtFLnN0YXR1c10pO2Vsc2UgZm9yKGUgaW4gdCliW2VdPVtiW2VdLHRbZV1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbih0KXt2YXIgZT10fHxrO3JldHVybiByJiZyLmFib3J0KGUpLFQoMCxlKSx0aGlzfX07aWYoeS5wcm9taXNlKEUpLGQudXJsPSgodHx8ZC51cmx8fGplLmhyZWYpKyIiKS5yZXBsYWNlKEJlLGplLnByb3RvY29sKyIvLyIpLGQudHlwZT1lLm1ldGhvZHx8ZS50eXBlfHxkLm1ldGhvZHx8ZC50eXBlLGQuZGF0YVR5cGVzPShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goVSl8fFsiIl0sbnVsbD09ZC5jcm9zc0RvbWFpbil7Yz1hLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7Yy5ocmVmPWQudXJsLGMuaHJlZj1jLmhyZWYsZC5jcm9zc0RvbWFpbj16ZS5wcm90b2NvbCsiLy8iK3plLmhvc3QhPWMucHJvdG9jb2wrIi8vIitjLmhvc3R9Y2F0Y2godCl7ZC5jcm9zc0RvbWFpbj0hMH19aWYoZC5kYXRhJiZkLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGQuZGF0YSYmKGQuZGF0YT1TLnBhcmFtKGQuZGF0YSxkLnRyYWRpdGlvbmFsKSksJGUocWUsZCxlLEUpLGwpcmV0dXJuIEU7Zm9yKHAgaW4oZj1TLmV2ZW50JiZkLmdsb2JhbCkmJjA9PVMuYWN0aXZlKysmJlMuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0IiksZC50eXBlPWQudHlwZS50b1VwcGVyQ2FzZSgpLGQuaGFzQ29udGVudD0hVWUudGVzdChkLnR5cGUpLG89ZC51cmwucmVwbGFjZShEZSwiIiksZC5oYXNDb250ZW50P2QuZGF0YSYmZC5wcm9jZXNzRGF0YSYmMD09PShkLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJihkLmRhdGE9ZC5kYXRhLnJlcGxhY2UoSWUsIisiKSk6KGg9ZC51cmwuc2xpY2Uoby5sZW5ndGgpLGQuZGF0YSYmKGQucHJvY2Vzc0RhdGF8fCJzdHJpbmciPT10eXBlb2YgZC5kYXRhKSYmKG8rPShPZS50ZXN0KG8pPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSwhMT09PWQuY2FjaGUmJihvPW8ucmVwbGFjZShfZSwiJDEiKSxoPShPZS50ZXN0KG8pPyImIjoiPyIpKyJfPSIrQWUrKytoKSxkLnVybD1vK2gpLGQuaWZNb2RpZmllZCYmKFMubGFzdE1vZGlmaWVkW29dJiZFLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixTLmxhc3RNb2RpZmllZFtvXSksUy5ldGFnW29dJiZFLnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLFMuZXRhZ1tvXSkpLChkLmRhdGEmJmQuaGFzQ29udGVudCYmITEhPT1kLmNvbnRlbnRUeXBlfHxlLmNvbnRlbnRUeXBlKSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGQuY29udGVudFR5cGUpLEUuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixkLmRhdGFUeXBlc1swXSYmZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXT9kLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dKygiKiIhPT1kLmRhdGFUeXBlc1swXT8iLCAiK0hlKyI7IHE9MC4wMSI6IiIpOmQuYWNjZXB0c1siKiJdKSxkLmhlYWRlcnMpRS5zZXRSZXF1ZXN0SGVhZGVyKHAsZC5oZWFkZXJzW3BdKTtpZihkLmJlZm9yZVNlbmQmJighMT09PWQuYmVmb3JlU2VuZC5jYWxsKGcsRSxkKXx8bCkpcmV0dXJuIEUuYWJvcnQoKTtpZihrPSJhYm9ydCIsbS5hZGQoZC5jb21wbGV0ZSksRS5kb25lKGQuc3VjY2VzcyksRS5mYWlsKGQuZXJyb3IpLHI9JGUoRmUsZCxlLEUpKXtpZihFLnJlYWR5U3RhdGU9MSxmJiZ2LnRyaWdnZXIoImFqYXhTZW5kIixbRSxkXSksbClyZXR1cm4gRTtkLmFzeW5jJiZkLnRpbWVvdXQ+MCYmKHU9bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7RS5hYm9ydCgidGltZW91dCIpfSxkLnRpbWVvdXQpKTt0cnl7bD0hMSxyLnNlbmQoeCxUKX1jYXRjaCh0KXtpZihsKXRocm93IHQ7VCgtMSx0KX19ZWxzZSBUKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBUKHQsZSxhLHMpe3ZhciBjLHAsaCx4LHcsaz1lO2x8fChsPSEwLHUmJm4uY2xlYXJUaW1lb3V0KHUpLHI9dm9pZCAwLGk9c3x8IiIsRS5yZWFkeVN0YXRlPXQ+MD80OjAsYz10Pj0yMDAmJnQ8MzAwfHwzMDQ9PT10LGEmJih4PWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsbyxpLGEscz10LmNvbnRlbnRzLHU9dC5kYXRhVHlwZXM7IioiPT09dVswXTspdS5zaGlmdCgpLHZvaWQgMD09PXImJihyPXQubWltZVR5cGV8fGUuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihvIGluIHMpaWYoc1tvXSYmc1tvXS50ZXN0KHIpKXt1LnVuc2hpZnQobyk7YnJlYWt9aWYodVswXWluIG4paT11WzBdO2Vsc2V7Zm9yKG8gaW4gbil7aWYoIXVbMF18fHQuY29udmVydGVyc1tvKyIgIit1WzBdXSl7aT1vO2JyZWFrfWF8fChhPW8pfWk9aXx8YX1pZihpKXJldHVybiBpIT09dVswXSYmdS51bnNoaWZ0KGkpLG5baV19KGQsRSxhKSkseD1mdW5jdGlvbih0LGUsbixyKXt2YXIgbyxpLGEscyx1LGM9e30sbD10LmRhdGFUeXBlcy5zbGljZSgpO2lmKGxbMV0pZm9yKGEgaW4gdC5jb252ZXJ0ZXJzKWNbYS50b0xvd2VyQ2FzZSgpXT10LmNvbnZlcnRlcnNbYV07Zm9yKGk9bC5zaGlmdCgpO2k7KWlmKHQucmVzcG9uc2VGaWVsZHNbaV0mJihuW3QucmVzcG9uc2VGaWVsZHNbaV1dPWUpLCF1JiZyJiZ0LmRhdGFGaWx0ZXImJihlPXQuZGF0YUZpbHRlcihlLHQuZGF0YVR5cGUpKSx1PWksaT1sLnNoaWZ0KCkpaWYoIioiPT09aSlpPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09aSl7aWYoIShhPWNbdSsiICIraV18fGNbIiogIitpXSkpZm9yKG8gaW4gYylpZigocz1vLnNwbGl0KCIgIikpWzFdPT09aSYmKGE9Y1t1KyIgIitzWzBdXXx8Y1siKiAiK3NbMF1dKSl7ITA9PT1hP2E9Y1tvXTohMCE9PWNbb10mJihpPXNbMF0sbC51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmdC50aHJvd3MpZT1hKGUpO2Vsc2UgdHJ5e2U9YShlKX1jYXRjaCh0KXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP3Q6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK2l9fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6ZX19KGQseCxFLGMpLGM/KGQuaWZNb2RpZmllZCYmKCh3PUUuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSkmJihTLmxhc3RNb2RpZmllZFtvXT13KSwodz1FLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIikpJiYoUy5ldGFnW29dPXcpKSwyMDQ9PT10fHwiSEVBRCI9PT1kLnR5cGU/az0ibm9jb250ZW50IjozMDQ9PT10P2s9Im5vdG1vZGlmaWVkIjooaz14LnN0YXRlLHA9eC5kYXRhLGM9IShoPXguZXJyb3IpKSk6KGg9aywhdCYma3x8KGs9ImVycm9yIix0PDAmJih0PTApKSksRS5zdGF0dXM9dCxFLnN0YXR1c1RleHQ9KGV8fGspKyIiLGM/eS5yZXNvbHZlV2l0aChnLFtwLGssRV0pOnkucmVqZWN0V2l0aChnLFtFLGssaF0pLEUuc3RhdHVzQ29kZShiKSxiPXZvaWQgMCxmJiZ2LnRyaWdnZXIoYz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFtFLGQsYz9wOmhdKSxtLmZpcmVXaXRoKGcsW0Usa10pLGYmJih2LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW0UsZF0pLC0tUy5hY3RpdmV8fFMuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiBFfSxnZXRKU09OOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUy5nZXQodCxlLG4sImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFMuZ2V0KHQsdm9pZCAwLGUsInNjcmlwdCIpfX0pLFMuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbih0LGUpe1NbZV09ZnVuY3Rpb24odCxuLHIsbyl7cmV0dXJuIG0obikmJihvPW98fHIscj1uLG49dm9pZCAwKSxTLmFqYXgoUy5leHRlbmQoe3VybDp0LHR5cGU6ZSxkYXRhVHlwZTpvLGRhdGE6bixzdWNjZXNzOnJ9LFMuaXNQbGFpbk9iamVjdCh0KSYmdCkpfX0pLFMuX2V2YWxVcmw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gUy5hamF4KHt1cmw6dCx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKCl7fX0sZGF0YUZpbHRlcjpmdW5jdGlvbih0KXtTLmdsb2JhbEV2YWwodCxlKX19KX0sUy5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHRoaXNbMF0mJihtKHQpJiYodD10LmNhbGwodGhpc1swXSkpLGU9Uyh0LHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmZS5pbnNlcnRCZWZvcmUodGhpc1swXSksZS5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpczt0LmZpcnN0RWxlbWVudENoaWxkOyl0PXQuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIHR9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbih0KXtyZXR1cm4gbSh0KT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS53cmFwSW5uZXIodC5jYWxsKHRoaXMsZSkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uyh0aGlzKSxuPWUuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwodCk6ZS5hcHBlbmQodCl9KX0sd3JhcDpmdW5jdGlvbih0KXt2YXIgZT1tKHQpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7Uyh0aGlzKS53cmFwQWxsKGU/dC5jYWxsKHRoaXMsbik6dCl9KX0sdW53cmFwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBhcmVudCh0KS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Uyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxTLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24odCl7cmV0dXJuIVMuZXhwci5wc2V1ZG9zLnZpc2libGUodCl9LFMuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24odCl7cmV0dXJuISEodC5vZmZzZXRXaWR0aHx8dC5vZmZzZXRIZWlnaHR8fHQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxTLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBuLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKHQpe319O3ZhciBWZT17MDoyMDAsMTIyMzoyMDR9LEdlPVMuYWpheFNldHRpbmdzLnhocigpO3kuY29ycz0hIUdlJiYid2l0aENyZWRlbnRpYWxzImluIEdlLHkuYWpheD1HZT0hIUdlLFMuYWpheFRyYW5zcG9ydChmdW5jdGlvbih0KXt2YXIgZSxyO2lmKHkuY29yc3x8R2UmJiF0LmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKG8saSl7dmFyIGEscz10LnhocigpO2lmKHMub3Blbih0LnR5cGUsdC51cmwsdC5hc3luYyx0LnVzZXJuYW1lLHQucGFzc3dvcmQpLHQueGhyRmllbGRzKWZvcihhIGluIHQueGhyRmllbGRzKXNbYV09dC54aHJGaWVsZHNbYV07Zm9yKGEgaW4gdC5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUodC5taW1lVHlwZSksdC5jcm9zc0RvbWFpbnx8b1siWC1SZXF1ZXN0ZWQtV2l0aCJdfHwob1siWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpLG8pcy5zZXRSZXF1ZXN0SGVhZGVyKGEsb1thXSk7ZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtlJiYoZT1yPXMub25sb2FkPXMub25lcnJvcj1zLm9uYWJvcnQ9cy5vbnRpbWVvdXQ9cy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09dD9zLmFib3J0KCk6ImVycm9yIj09PXQ/Im51bWJlciIhPXR5cGVvZiBzLnN0YXR1cz9pKDAsImVycm9yIik6aShzLnN0YXR1cyxzLnN0YXR1c1RleHQpOmkoVmVbcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInRleHQiIT09KHMucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHMucmVzcG9uc2VUZXh0P3tiaW5hcnk6cy5yZXNwb25zZX06e3RleHQ6cy5yZXNwb25zZVRleHR9LHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPWUoKSxyPXMub25lcnJvcj1zLm9udGltZW91dD1lKCJlcnJvciIpLHZvaWQgMCE9PXMub25hYm9ydD9zLm9uYWJvcnQ9cjpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1zLnJlYWR5U3RhdGUmJm4uc2V0VGltZW91dChmdW5jdGlvbigpe2UmJnIoKX0pfSxlPWUoImFib3J0Iik7dHJ5e3Muc2VuZCh0Lmhhc0NvbnRlbnQmJnQuZGF0YXx8bnVsbCl9Y2F0Y2godCl7aWYoZSl0aHJvdyB0fX0sYWJvcnQ6ZnVuY3Rpb24oKXtlJiZlKCl9fX0pLFMuYWpheFByZWZpbHRlcihmdW5jdGlvbih0KXt0LmNyb3NzRG9tYWluJiYodC5jb250ZW50cy5zY3JpcHQ9ITEpfSksUy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24odCl7cmV0dXJuIFMuZ2xvYmFsRXZhbCh0KSx0fX19KSxTLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24odCl7dm9pZCAwPT09dC5jYWNoZSYmKHQuY2FjaGU9ITEpLHQuY3Jvc3NEb21haW4mJih0LnR5cGU9IkdFVCIpfSksUy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKHQpe3ZhciBlLG47aWYodC5jcm9zc0RvbWFpbnx8dC5zY3JpcHRBdHRycylyZXR1cm57c2VuZDpmdW5jdGlvbihyLG8pe2U9UygiPHNjcmlwdD4iKS5hdHRyKHQuc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0OnQuc2NyaXB0Q2hhcnNldCxzcmM6dC51cmx9KS5vbigibG9hZCBlcnJvciIsbj1mdW5jdGlvbih0KXtlLnJlbW92ZSgpLG49bnVsbCx0JiZvKCJlcnJvciI9PT10LnR5cGU/NDA0OjIwMCx0LnR5cGUpfSksYS5oZWFkLmFwcGVuZENoaWxkKGVbMF0pfSxhYm9ydDpmdW5jdGlvbigpe24mJm4oKX19fSk7dmFyIEtlLFhlPVtdLEplPS8oPSlcPyg/PSZ8JCl8XD9cPy87Uy5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciB0PVhlLnBvcCgpfHxTLmV4cGFuZG8rIl8iK0FlKys7cmV0dXJuIHRoaXNbdF09ITAsdH19KSxTLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGEscz0hMSE9PXQuanNvbnAmJihKZS50ZXN0KHQudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmMD09PSh0LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJkplLnRlc3QodC5kYXRhKSYmImRhdGEiKTtpZihzfHwianNvbnAiPT09dC5kYXRhVHlwZXNbMF0pcmV0dXJuIG89dC5qc29ucENhbGxiYWNrPW0odC5qc29ucENhbGxiYWNrKT90Lmpzb25wQ2FsbGJhY2soKTp0Lmpzb25wQ2FsbGJhY2sscz90W3NdPXRbc10ucmVwbGFjZShKZSwiJDEiK28pOiExIT09dC5qc29ucCYmKHQudXJsKz0oT2UudGVzdCh0LnVybCk/IiYiOiI/IikrdC5qc29ucCsiPSIrbyksdC5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIGF8fFMuZXJyb3IobysiIHdhcyBub3QgY2FsbGVkIiksYVswXX0sdC5kYXRhVHlwZXNbMF09Impzb24iLGk9bltvXSxuW29dPWZ1bmN0aW9uKCl7YT1hcmd1bWVudHN9LHIuYWx3YXlzKGZ1bmN0aW9uKCl7dm9pZCAwPT09aT9TKG4pLnJlbW92ZVByb3Aobyk6bltvXT1pLHRbb10mJih0Lmpzb25wQ2FsbGJhY2s9ZS5qc29ucENhbGxiYWNrLFhlLnB1c2gobykpLGEmJm0oaSkmJmkoYVswXSksYT1pPXZvaWQgMH0pLCJzY3JpcHQifSkseS5jcmVhdGVIVE1MRG9jdW1lbnQ9KChLZT1hLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keSkuaW5uZXJIVE1MPSI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPiIsMj09PUtlLmNoaWxkTm9kZXMubGVuZ3RoKSxTLnBhcnNlSFRNTD1mdW5jdGlvbih0LGUsbil7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0P1tdOigiYm9vbGVhbiI9PXR5cGVvZiBlJiYobj1lLGU9ITEpLGV8fCh5LmNyZWF0ZUhUTUxEb2N1bWVudD8oKHI9KGU9YS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9YS5sb2NhdGlvbi5ocmVmLGUuaGVhZC5hcHBlbmRDaGlsZChyKSk6ZT1hKSxpPSFuJiZbXSwobz1SLmV4ZWModCkpP1tlLmNyZWF0ZUVsZW1lbnQob1sxXSldOihvPUV0KFt0XSxlLGkpLGkmJmkubGVuZ3RoJiZTKGkpLnJlbW92ZSgpLFMubWVyZ2UoW10sby5jaGlsZE5vZGVzKSkpO3ZhciByLG8saX0sUy5mbi5sb2FkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYT10aGlzLHM9dC5pbmRleE9mKCIgIik7cmV0dXJuIHM+LTEmJihyPXhlKHQuc2xpY2UocykpLHQ9dC5zbGljZSgwLHMpKSxtKGUpPyhuPWUsZT12b2lkIDApOmUmJiJvYmplY3QiPT10eXBlb2YgZSYmKG89IlBPU1QiKSxhLmxlbmd0aD4wJiZTLmFqYXgoe3VybDp0LHR5cGU6b3x8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6ZX0pLmRvbmUoZnVuY3Rpb24odCl7aT1hcmd1bWVudHMsYS5odG1sKHI/UygiPGRpdj4iKS5hcHBlbmQoUy5wYXJzZUhUTUwodCkpLmZpbmQocik6dCl9KS5hbHdheXMobiYmZnVuY3Rpb24odCxlKXthLmVhY2goZnVuY3Rpb24oKXtuLmFwcGx5KHRoaXMsaXx8W3QucmVzcG9uc2VUZXh0LGUsdF0pfSl9KSx0aGlzfSxTLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbih0LGUpe1MuZm5bZV09ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub24oZSx0KX19KSxTLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gUy5ncmVwKFMudGltZXJzLGZ1bmN0aW9uKGUpe3JldHVybiB0PT09ZS5lbGVtfSkubGVuZ3RofSxTLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYSxzLHUsYz1TLmNzcyh0LCJwb3NpdGlvbiIpLGw9Uyh0KSxmPXt9OyJzdGF0aWMiPT09YyYmKHQuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1sLm9mZnNldCgpLGk9Uy5jc3ModCwidG9wIiksdT1TLmNzcyh0LCJsZWZ0IiksKCJhYnNvbHV0ZSI9PT1jfHwiZml4ZWQiPT09YykmJihpK3UpLmluZGV4T2YoImF1dG8iKT4tMT8oYT0ocj1sLnBvc2l0aW9uKCkpLnRvcCxvPXIubGVmdCk6KGE9cGFyc2VGbG9hdChpKXx8MCxvPXBhcnNlRmxvYXQodSl8fDApLG0oZSkmJihlPWUuY2FsbCh0LG4sUy5leHRlbmQoe30scykpKSxudWxsIT1lLnRvcCYmKGYudG9wPWUudG9wLXMudG9wK2EpLG51bGwhPWUubGVmdCYmKGYubGVmdD1lLmxlZnQtcy5sZWZ0K28pLCJ1c2luZyJpbiBlP2UudXNpbmcuY2FsbCh0LGYpOmwuY3NzKGYpfX0sUy5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbih0KXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLHQsZSl9KTt2YXIgZSxuLHI9dGhpc1swXTtyZXR1cm4gcj9yLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyhlPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1yLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDplLnRvcCtuLnBhZ2VZT2Zmc2V0LGxlZnQ6ZS5sZWZ0K24ucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfTp2b2lkIDB9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIHQsZSxuLHI9dGhpc1swXSxvPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT1TLmNzcyhyLCJwb3NpdGlvbiIpKWU9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle2ZvcihlPXRoaXMub2Zmc2V0KCksbj1yLm93bmVyRG9jdW1lbnQsdD1yLm9mZnNldFBhcmVudHx8bi5kb2N1bWVudEVsZW1lbnQ7dCYmKHQ9PT1uLmJvZHl8fHQ9PT1uLmRvY3VtZW50RWxlbWVudCkmJiJzdGF0aWMiPT09Uy5jc3ModCwicG9zaXRpb24iKTspdD10LnBhcmVudE5vZGU7dCYmdCE9PXImJjE9PT10Lm5vZGVUeXBlJiYoKG89Uyh0KS5vZmZzZXQoKSkudG9wKz1TLmNzcyh0LCJib3JkZXJUb3BXaWR0aCIsITApLG8ubGVmdCs9Uy5jc3ModCwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6ZS50b3Atby50b3AtUy5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDplLmxlZnQtby5sZWZ0LVMuY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5vZmZzZXRQYXJlbnQ7dCYmInN0YXRpYyI9PT1TLmNzcyh0LCJwb3NpdGlvbiIpOyl0PXQub2Zmc2V0UGFyZW50O3JldHVybiB0fHxhdH0pfX0pLFMuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LGUpe3ZhciBuPSJwYWdlWU9mZnNldCI9PT1lO1MuZm5bdF09ZnVuY3Rpb24ocil7cmV0dXJuICQodGhpcyxmdW5jdGlvbih0LHIsbyl7dmFyIGk7aWYoYih0KT9pPXQ6OT09PXQubm9kZVR5cGUmJihpPXQuZGVmYXVsdFZpZXcpLHZvaWQgMD09PW8pcmV0dXJuIGk/aVtlXTp0W3JdO2k/aS5zY3JvbGxUbyhuP2kucGFnZVhPZmZzZXQ6byxuP286aS5wYWdlWU9mZnNldCk6dFtyXT1vfSx0LHIsYXJndW1lbnRzLmxlbmd0aCl9fSksUy5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKHQsZSl7Uy5jc3NIb29rc1tlXT1HdCh5LnBpeGVsUG9zaXRpb24sZnVuY3Rpb24odCxuKXtpZihuKXJldHVybiBuPVZ0KHQsZSksV3QudGVzdChuKT9TKHQpLnBvc2l0aW9uKClbZV0rInB4IjpufSl9KSxTLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbih0LGUpe1MuZWFjaCh7cGFkZGluZzoiaW5uZXIiK3QsY29udGVudDplLCIiOiJvdXRlciIrdH0sZnVuY3Rpb24obixyKXtTLmZuW3JdPWZ1bmN0aW9uKG8saSl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aCYmKG58fCJib29sZWFuIiE9dHlwZW9mIG8pLHM9bnx8KCEwPT09b3x8ITA9PT1pPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsbixvKXt2YXIgaTtyZXR1cm4gYihlKT8wPT09ci5pbmRleE9mKCJvdXRlciIpP2VbImlubmVyIit0XTplLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50Iit0XTo5PT09ZS5ub2RlVHlwZT8oaT1lLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChlLmJvZHlbInNjcm9sbCIrdF0saVsic2Nyb2xsIit0XSxlLmJvZHlbIm9mZnNldCIrdF0saVsib2Zmc2V0Iit0XSxpWyJjbGllbnQiK3RdKSk6dm9pZCAwPT09bz9TLmNzcyhlLG4scyk6Uy5zdHlsZShlLG4sbyxzKX0sZSxhP286dm9pZCAwLGEpfX0pfSksUy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKHQsZSl7Uy5mbltlXT1mdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihlLG51bGwsdCxuKTp0aGlzLnRyaWdnZXIoZSl9fSksUy5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubW91c2VlbnRlcih0KS5tb3VzZWxlYXZlKGV8fHQpfX0pLFMuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5vbih0LG51bGwsZSxuKX0sdW5iaW5kOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMub2ZmKHQsbnVsbCxlKX0sZGVsZWdhdGU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHRoaXMub24oZSx0LG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZih0LCIqKiIpOnRoaXMub2ZmKGUsdHx8IioqIixuKX19KSxTLnByb3h5PWZ1bmN0aW9uKHQsZSl7dmFyIG4scixvO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmKG49dFtlXSxlPXQsdD1uKSxtKHQpKXJldHVybiByPXUuY2FsbChhcmd1bWVudHMsMiksKG89ZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlfHx0aGlzLHIuY29uY2F0KHUuY2FsbChhcmd1bWVudHMpKSl9KS5ndWlkPXQuZ3VpZD10Lmd1aWR8fFMuZ3VpZCsrLG99LFMuaG9sZFJlYWR5PWZ1bmN0aW9uKHQpe3Q/Uy5yZWFkeVdhaXQrKzpTLnJlYWR5KCEwKX0sUy5pc0FycmF5PUFycmF5LmlzQXJyYXksUy5wYXJzZUpTT049SlNPTi5wYXJzZSxTLm5vZGVOYW1lPUwsUy5pc0Z1bmN0aW9uPW0sUy5pc1dpbmRvdz1iLFMuY2FtZWxDYXNlPUssUy50eXBlPWssUy5ub3c9RGF0ZS5ub3csUy5pc051bWVyaWM9ZnVuY3Rpb24odCl7dmFyIGU9Uy50eXBlKHQpO3JldHVybigibnVtYmVyIj09PWV8fCJzdHJpbmciPT09ZSkmJiFpc05hTih0LXBhcnNlRmxvYXQodCkpfSx2b2lkIDA9PT0ocj1mdW5jdGlvbigpe3JldHVybiBTfS5hcHBseShlLFtdKSl8fCh0LmV4cG9ydHM9cik7dmFyIFFlPW4ualF1ZXJ5LFplPW4uJDtyZXR1cm4gUy5ub0NvbmZsaWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuLiQ9PT1TJiYobi4kPVplKSx0JiZuLmpRdWVyeT09PVMmJihuLmpRdWVyeT1RZSksU30sb3x8KG4ualF1ZXJ5PW4uJD1TKSxTfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0OCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI1Mik7ZnVuY3Rpb24gbyh0LGUsbixvLGksYSxzKXt0cnl7dmFyIHU9dFthXShzKSxjPXUudmFsdWV9Y2F0Y2godCl7cmV0dXJuIHZvaWQgbih0KX11LmRvbmU/ZShjKTpyLnJlc29sdmUoYykudGhlbihvLGkpfXQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgcihmdW5jdGlvbihyLGkpe3ZhciBhPXQuYXBwbHkoZSxuKTtmdW5jdGlvbiBzKHQpe28oYSxyLGkscyx1LCJuZXh0Iix0KX1mdW5jdGlvbiB1KHQpe28oYSxyLGkscyx1LCJ0aHJvdyIsdCl9cyh2b2lkIDApfSl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjY0KS5kZWZhdWx0O3QuZXhwb3J0cz1yLHQuZXhwb3J0cy5kZWZhdWx0PXJ9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyOTgpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCJcXCQmIil9ci5wcm90bz1mdW5jdGlvbigpe3JldHVybiBSZWdFeHAuZXNjYXBlPXIscn0sdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMzcpfSxmdW5jdGlvbih0LGUsbil7bigxMzgpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuUmVmbGVjdC5jb25zdHJ1Y3R9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigzMiksaT1uKDIyKSxhPW4oMTEpLHM9big2KSx1PW4oNDYpLGM9big5MSksbD1uKDUpLGY9bygiUmVmbGVjdCIsImNvbnN0cnVjdCIpLHA9bChmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIShmKGZ1bmN0aW9uKCl7fSxbXSx0KWluc3RhbmNlb2YgdCl9KSxoPSFsKGZ1bmN0aW9uKCl7ZihmdW5jdGlvbigpe30pfSksZD1wfHxoO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMCxmb3JjZWQ6ZCxzaGFtOmR9LHtjb25zdHJ1Y3Q6ZnVuY3Rpb24odCxlKXtpKHQpLGEoZSk7dmFyIG49YXJndW1lbnRzLmxlbmd0aDwzP3Q6aShhcmd1bWVudHNbMl0pO2lmKGgmJiFwKXJldHVybiBmKHQsZSxuKTtpZih0PT1uKXtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKX12YXIgcj1bbnVsbF07cmV0dXJuIHIucHVzaC5hcHBseShyLGUpLG5ldyhjLmFwcGx5KHQscikpfXZhciBvPW4ucHJvdG90eXBlLGw9dShzKG8pP286T2JqZWN0LnByb3RvdHlwZSksZD1GdW5jdGlvbi5hcHBseS5jYWxsKHQsbCxlKTtyZXR1cm4gcyhkKT9kOmx9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oMjMpLGk9bigxMSksYT1uKDU1KTt0LmV4cG9ydHM9cj9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbih0LGUpe2kodCk7Zm9yKHZhciBuLHI9YShlKSxzPXIubGVuZ3RoLHU9MDtzPnU7KW8uZih0LG49clt1KytdLGVbbl0pO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksbz1uKDE3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0cnl7byhyLHQsZSl9Y2F0Y2gobil7clt0XT1lfXJldHVybiBlfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0Mil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEpLG89ci5KU09OfHwoci5KU09OPXtzdHJpbmdpZnk6SlNPTi5zdHJpbmdpZnl9KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8uc3RyaW5naWZ5LmFwcGx5KG8sYXJndW1lbnRzKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDQpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmNvbmNhdDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uY29uY2F0P3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDkyKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5jb25jYXR9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDgpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcDtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8ubWFwP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDE0OSk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkFycmF5IikubWFwfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5tYXA7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFuKDcyKSgibWFwIil9LHttYXA6ZnVuY3Rpb24odCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTIpfSxmdW5jdGlvbih0LGUsbil7bigxNTMpO3ZhciByPW4oMSkuT2JqZWN0LG89dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gci5kZWZpbmVQcm9wZXJ0eSh0LGUsbil9O3IuZGVmaW5lUHJvcGVydHkuc2hhbSYmKG8uc2hhbT0hMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigxMyk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFvLHNoYW06IW99LHtkZWZpbmVQcm9wZXJ0eTpuKDIzKS5mfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTU2KX0sZnVuY3Rpb24odCxlLG4pe24oMTU3KTt2YXIgcj1uKDEpLk9iamVjdCxvPXQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiByLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpfTtyLmdldE93blByb3BlcnR5RGVzY3JpcHRvci5zaGFtJiYoby5zaGFtPSEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDUpLGk9bigyMSksYT1uKDQ0KS5mLHM9bigxMyksdT1vKGZ1bmN0aW9uKCl7YSgxKX0pO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohc3x8dSxzaGFtOiFzfSx7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGEoaSh0KSxlKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1OSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjApfSxmdW5jdGlvbih0LGUsbil7bigxNjEpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuUmVmbGVjdC5nZXR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big2KSxpPW4oMTEpLGE9bigxNCkscz1uKDQ0KSx1PW4oNDgpO3Ioe3RhcmdldDoiUmVmbGVjdCIsc3RhdDohMH0se2dldDpmdW5jdGlvbiB0KGUsbil7dmFyIHIsYyxsPWFyZ3VtZW50cy5sZW5ndGg8Mz9lOmFyZ3VtZW50c1syXTtyZXR1cm4gaShlKT09PWw/ZVtuXToocj1zLmYoZSxuKSk/YShyLCJ2YWx1ZSIpP3IudmFsdWU6dm9pZCAwPT09ci5nZXQ/dm9pZCAwOnIuZ2V0LmNhbGwobCk6byhjPXUoZSkpP3QoYyxuLGwpOnZvaWQgMH19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcig7IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpJiZudWxsIT09KHQ9cih0KSk7KTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY1KX0sZnVuY3Rpb24odCxlLG4pe24oMTY2KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLk9iamVjdC5nZXRQcm90b3R5cGVPZn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDUpLGk9bigyNCksYT1uKDQ4KSxzPW4oOTUpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpvKGZ1bmN0aW9uKCl7YSgxKX0pLHNoYW06IXN9LHtnZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2OCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE2OSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3Quc2V0UHJvdG90eXBlT2Z9LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMH0se3NldFByb3RvdHlwZU9mOm4oNzQpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighcih0KSYmbnVsbCE9PXQpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBzZXQgIitTdHJpbmcodCkrIiBhcyBhIHByb3RvdHlwZSIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE3Mil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzMpfSxmdW5jdGlvbih0LGUsbil7bigxNzQpO3ZhciByPW4oMSkuT2JqZWN0O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiByLmNyZWF0ZSh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLHNoYW06IW4oMTMpfSx7Y3JlYXRlOm4oNDYpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDk2KTtmdW5jdGlvbiBvKGUsbil7cmV0dXJuIHQuZXhwb3J0cz1vPXJ8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0sbyhlLG4pfXQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNzcpLG89bigxMDIpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPSJmdW5jdGlvbiI9PXR5cGVvZiBvJiYic3ltYm9sIj09dHlwZW9mIHI/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIG8mJnQuY29uc3RydWN0b3I9PT1vJiZ0IT09by5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTc5KX0sZnVuY3Rpb24odCxlLG4pe24oOTcpLG4oMzQpLG4oNTApO3ZhciByPW4oNzUpO3QuZXhwb3J0cz1yLmYoIml0ZXJhdG9yIil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY4KSxvPW4oNDUpLGk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGksYSxzPVN0cmluZyhvKGUpKSx1PXIobiksYz1zLmxlbmd0aDtyZXR1cm4gdTwwfHx1Pj1jP3Q/IiI6dm9pZCAwOihpPXMuY2hhckNvZGVBdCh1KSk8NTUyOTZ8fGk+NTYzMTl8fHUrMT09PWN8fChhPXMuY2hhckNvZGVBdCh1KzEpKTw1NjMyMHx8YT41NzM0Mz90P3MuY2hhckF0KHUpOmk6dD9zLnNsaWNlKHUsdSsyKTphLTU2MzIwKyhpLTU1Mjk2PDwxMCkrNjU1MzZ9fTt0LmV4cG9ydHM9e2NvZGVBdDppKCExKSxjaGFyQXQ6aSghMCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KSxvPW4oMTgyKSxpPXIuV2Vha01hcDt0LmV4cG9ydHM9ImZ1bmN0aW9uIj09dHlwZW9mIGkmJi9uYXRpdmUgY29kZS8udGVzdChvLmNhbGwoaSkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1OCk7dC5leHBvcnRzPXIoIm5hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmciLEZ1bmN0aW9uLnRvU3RyaW5nKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDc2KSxvPXt9O29bbigyKSgidG9TdHJpbmdUYWciKV09InoiLHQuZXhwb3J0cz0iW29iamVjdCB6XSIhPT1TdHJpbmcobyk/ZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCAiK3IodGhpcykrIl0ifTpvLnRvU3RyaW5nfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17Q1NTUnVsZUxpc3Q6MCxDU1NTdHlsZURlY2xhcmF0aW9uOjAsQ1NTVmFsdWVMaXN0OjAsQ2xpZW50UmVjdExpc3Q6MCxET01SZWN0TGlzdDowLERPTVN0cmluZ0xpc3Q6MCxET01Ub2tlbkxpc3Q6MSxEYXRhVHJhbnNmZXJJdGVtTGlzdDowLEZpbGVMaXN0OjAsSFRNTEFsbENvbGxlY3Rpb246MCxIVE1MQ29sbGVjdGlvbjowLEhUTUxGb3JtRWxlbWVudDowLEhUTUxTZWxlY3RFbGVtZW50OjAsTWVkaWFMaXN0OjAsTWltZVR5cGVBcnJheTowLE5hbWVkTm9kZU1hcDowLE5vZGVMaXN0OjEsUGFpbnRSZXF1ZXN0TGlzdDowLFBsdWdpbjowLFBsdWdpbkFycmF5OjAsU1ZHTGVuZ3RoTGlzdDowLFNWR051bWJlckxpc3Q6MCxTVkdQYXRoU2VnTGlzdDowLFNWR1BvaW50TGlzdDowLFNWR1N0cmluZ0xpc3Q6MCxTVkdUcmFuc2Zvcm1MaXN0OjAsU291cmNlQnVmZmVyTGlzdDowLFN0eWxlU2hlZXRMaXN0OjAsVGV4dFRyYWNrQ3VlTGlzdDowLFRleHRUcmFja0xpc3Q6MCxUb3VjaExpc3Q6MH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDMpLG4oMjAzKSxuKDIwNCksbigyMDUpLG4oMjA2KSxuKDIwNyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNCksaT1uKDI3KSxhPW4oMTMpLHM9big5NCksdT1uKDUpLGM9bigxNCksbD1uKDQ3KSxmPW4oNikscD1uKDExKSxoPW4oMjQpLGQ9bigyMSksZz1uKDU0KSx2PW4oMzApLHk9big0NiksbT1uKDU1KSxiPW4oMTA1KSx4PW4oMTg3KSx3PW4oMTA2KSxrPW4oNDQpLFM9bigyMyksRT1uKDY0KSxUPW4oMTcpLGo9bigzNSksQT1uKDU4KSxPPW4oNTcpLEM9big1NiksTD1uKDcwKSxSPW4oMiksUD1uKDc1KSxOPW4oMyksST1uKDI4KSxEPW4oNDkpLF89big3MykuZm9yRWFjaCxNPU8oImhpZGRlbiIpLFU9UigidG9QcmltaXRpdmUiKSxCPUQuc2V0LHE9RC5nZXR0ZXJGb3IoIlN5bWJvbCIpLEY9T2JqZWN0LnByb3RvdHlwZSxIPW8uU3ltYm9sLHo9by5KU09OLFc9eiYmei5zdHJpbmdpZnksJD1rLmYsWT1TLmYsVj14LmYsRz1FLmYsSz1BKCJzeW1ib2xzIiksWD1BKCJvcC1zeW1ib2xzIiksSj1BKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksUT1BKCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5IiksWj1BKCJ3a3MiKSx0dD1vLlFPYmplY3QsZXQ9IXR0fHwhdHQucHJvdG90eXBlfHwhdHQucHJvdG90eXBlLmZpbmRDaGlsZCxudD1hJiZ1KGZ1bmN0aW9uKCl7cmV0dXJuIDchPXkoWSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBZKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcj0kKEYsZSk7ciYmZGVsZXRlIEZbZV0sWSh0LGUsbiksciYmdCE9PUYmJlkoRixlLHIpfTpZLHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49S1t0XT15KEgucHJvdG90eXBlKTtyZXR1cm4gQihuLHt0eXBlOiJTeW1ib2wiLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxhfHwobi5kZXNjcmlwdGlvbj1lKSxufSxvdD1zJiYic3ltYm9sIj09dHlwZW9mIEguaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBIfSxpdD1mdW5jdGlvbih0LGUsbil7dD09PUYmJml0KFgsZSxuKSxwKHQpO3ZhciByPWcoZSwhMCk7cmV0dXJuIHAobiksYyhLLHIpPyhuLmVudW1lcmFibGU/KGModCxNKSYmdFtNXVtyXSYmKHRbTV1bcl09ITEpLG49eShuLHtlbnVtZXJhYmxlOnYoMCwhMSl9KSk6KGModCxNKXx8WSh0LE0sdigxLHt9KSksdFtNXVtyXT0hMCksbnQodCxyLG4pKTpZKHQscixuKX0sYXQ9ZnVuY3Rpb24odCxlKXtwKHQpO3ZhciBuPWQoZSkscj1tKG4pLmNvbmNhdChsdChuKSk7cmV0dXJuIF8ocixmdW5jdGlvbihlKXthJiYhc3QuY2FsbChuLGUpfHxpdCh0LGUsbltlXSl9KSx0fSxzdD1mdW5jdGlvbih0KXt2YXIgZT1nKHQsITApLG49Ry5jYWxsKHRoaXMsZSk7cmV0dXJuISh0aGlzPT09RiYmYyhLLGUpJiYhYyhYLGUpKSYmKCEobnx8IWModGhpcyxlKXx8IWMoSyxlKXx8Yyh0aGlzLE0pJiZ0aGlzW01dW2VdKXx8bil9LHV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZCh0KSxyPWcoZSwhMCk7aWYobiE9PUZ8fCFjKEsscil8fGMoWCxyKSl7dmFyIG89JChuLHIpO3JldHVybiFvfHwhYyhLLHIpfHxjKG4sTSkmJm5bTV1bcl18fChvLmVudW1lcmFibGU9ITApLG99fSxjdD1mdW5jdGlvbih0KXt2YXIgZT1WKGQodCkpLG49W107cmV0dXJuIF8oZSxmdW5jdGlvbih0KXtjKEssdCl8fGMoQyx0KXx8bi5wdXNoKHQpfSksbn0sbHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PUYsbj1WKGU/WDpkKHQpKSxyPVtdO3JldHVybiBfKG4sZnVuY3Rpb24odCl7IWMoSyx0KXx8ZSYmIWMoRix0KXx8ci5wdXNoKEtbdF0pfSkscn07c3x8KGooKEg9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgSCl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1MKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PUYmJm4uY2FsbChYLHQpLGModGhpcyxNKSYmYyh0aGlzW01dLGUpJiYodGhpc1tNXVtlXT0hMSksbnQodGhpcyxlLHYoMSx0KSl9O3JldHVybiBhJiZldCYmbnQoRixlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxydChlLHQpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzKS50YWd9KSxFLmY9c3QsUy5mPWl0LGsuZj11dCxiLmY9eC5mPWN0LHcuZj1sdCxhJiYoWShILnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHEodGhpcykuZGVzY3JpcHRpb259fSksaXx8aihGLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsc3Qse3Vuc2FmZTohMH0pKSxQLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KFIodCksdCl9KSxyKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IXMsc2hhbTohc30se1N5bWJvbDpIfSksXyhtKFopLGZ1bmN0aW9uKHQpe04odCl9KSxyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpO2lmKGMoSixlKSlyZXR1cm4gSltlXTt2YXIgbj1IKGUpO3JldHVybiBKW2VdPW4sUVtuXT1lLG59LGtleUZvcjpmdW5jdGlvbih0KXtpZighb3QodCkpdGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2wiKTtpZihjKFEsdCkpcmV0dXJuIFFbdF19LHVzZVNldHRlcjpmdW5jdGlvbigpe2V0PSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtldD0hMX19KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXMsc2hhbTohYX0se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3kodCk6YXQoeSh0KSxlKX0sZGVmaW5lUHJvcGVydHk6aXQsZGVmaW5lUHJvcGVydGllczphdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6dXR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOmN0LGdldE93blByb3BlcnR5U3ltYm9sczpsdH0pLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDp1KGZ1bmN0aW9uKCl7dy5mKDEpfSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHcuZihoKHQpKX19KSx6JiZyKHt0YXJnZXQ6IkpTT04iLHN0YXQ6ITAsZm9yY2VkOiFzfHx1KGZ1bmN0aW9uKCl7dmFyIHQ9SCgpO3JldHVybiJbbnVsbF0iIT1XKFt0XSl8fCJ7fSIhPVcoe2E6dH0pfHwie30iIT1XKE9iamVjdCh0KSl9KX0se3N0cmluZ2lmeTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyPVt0XSxvPTE7YXJndW1lbnRzLmxlbmd0aD5vOylyLnB1c2goYXJndW1lbnRzW28rK10pO2lmKG49ZT1yWzFdLChmKGUpfHx2b2lkIDAhPT10KSYmIW90KHQpKXJldHVybiBsKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoZT1uLmNhbGwodGhpcyx0LGUpKSwhb3QoZSkpcmV0dXJuIGV9KSxyWzFdPWUsVy5hcHBseSh6LHIpfX0pLEgucHJvdG90eXBlW1VdfHxUKEgucHJvdG90eXBlLFUsSC5wcm90b3R5cGUudmFsdWVPZiksSShILCJTeW1ib2wiKSxDW01dPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMSksbz1uKDEwNSkuZixpPXt9LnRvU3RyaW5nLGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gYSYmIltvYmplY3QgV2luZG93XSI9PWkuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIG8odCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19KHQpOm8ocih0KSl9fSxmdW5jdGlvbih0LGUsbil7bigzKSgiYXN5bmNJdGVyYXRvciIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe24oMykoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoIm1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgic2VhcmNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJzcGxpdCIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgidG9QcmltaXRpdmUiKX0sZnVuY3Rpb24odCxlLG4pe24oMykoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyOCkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0KTtuKDI4KShyLkpTT04sIkpTT04iLCEwKX0sZnVuY3Rpb24odCxlLG4pe24oMykoImFzeW5jRGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgiZGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbih0LGUsbil7bigzKSgicGF0dGVybk1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDMpKCJyZXBsYWNlQWxsIil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMTEpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmZpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmZpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjEyKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5maW5kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5maW5kLGk9big3NyksYT0hMDsiZmluZCJpbltdJiZBcnJheSgxKS5maW5kKGZ1bmN0aW9uKCl7YT0hMX0pLHIoe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDphfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmQiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIxNCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxNSksbz1TdHJpbmcucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnRyaW07cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHx0PT09b3x8dCBpbnN0YW5jZW9mIFN0cmluZyYmZT09PW8udHJpbT9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyMTYpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS50cmltfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDEwNykudHJpbTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oMjE3KSgidHJpbSIpfSx7dHJpbTpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMpfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KSxvPW4oNzgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihmdW5jdGlvbigpe3JldHVybiEhb1t0XSgpfHwi4oCLwoXhoI4iIT0i4oCLwoXhoI4iW3RdKCl8fG9bdF0ubmFtZSE9PXR9KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTkpfSxmdW5jdGlvbih0LGUsbil7bigyMjApO3ZhciByPW4oMSk7dC5leHBvcnRzPXIucGFyc2VJbnR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyMjEpO3Ioe2dsb2JhbDohMCxmb3JjZWQ6cGFyc2VJbnQhPW99LHtwYXJzZUludDpvfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLG89bigxMDcpLnRyaW0saT1uKDc4KSxhPXIucGFyc2VJbnQscz0vXlsrLV0/MFtYeF0vLHU9OCE9PWEoaSsiMDgiKXx8MjIhPT1hKGkrIjB4MTYiKTt0LmV4cG9ydHM9dT9mdW5jdGlvbih0LGUpe3ZhciBuPW8oU3RyaW5nKHQpKTtyZXR1cm4gYShuLGU+Pj4wfHwocy50ZXN0KG4pPzE2OjEwKSl9OmF9LGZ1bmN0aW9uKHQsZSxuKXtuKDUwKSxuKDM0KSx0LmV4cG9ydHM9bigxMDgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTA5KX0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITB9LHtpc0FycmF5Om4oNDcpfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDUwKSxuKDM0KSx0LmV4cG9ydHM9big1MSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDIyOSk7cih7dGFyZ2V0OiJBcnJheSIsc3RhdDohMCxmb3JjZWQ6IW4oMTEzKShmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSl9LHtmcm9tOm99KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMxKSxvPW4oMjQpLGk9bigxMTEpLGE9bigxMTIpLHM9bigzMyksdT1uKDcxKSxjPW4oNTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuLGwsZixwPW8odCksaD0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcz90aGlzOkFycmF5LGQ9YXJndW1lbnRzLmxlbmd0aCxnPWQ+MT9hcmd1bWVudHNbMV06dm9pZCAwLHY9dm9pZCAwIT09Zyx5PTAsbT1jKHApO2lmKHYmJihnPXIoZyxkPjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSksbnVsbD09bXx8aD09QXJyYXkmJmEobSkpZm9yKG49bmV3IGgoZT1zKHAubGVuZ3RoKSk7ZT55O3krKyl1KG4seSx2P2cocFt5XSx5KTpwW3ldKTtlbHNlIGZvcihmPW0uY2FsbChwKSxuPW5ldyBoOyEobD1mLm5leHQoKSkuZG9uZTt5KyspdShuLHksdj9pKGYsZyxbbC52YWx1ZSx5XSwhMCk6bC52YWx1ZSk7cmV0dXJuIG4ubGVuZ3RoPXksbn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTQpfSxmdW5jdGlvbih0LGUsbil7bigyMzIpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDYpLGk9big0NyksYT1uKDg5KSxzPW4oMzMpLHU9bigyMSksYz1uKDcxKSxsPW4oNzIpLGY9bigyKSgic3BlY2llcyIpLHA9W10uc2xpY2UsaD1NYXRoLm1heDtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWwoInNsaWNlIil9LHtzbGljZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbCxkPXUodGhpcyksZz1zKGQubGVuZ3RoKSx2PWEodCxnKSx5PWEodm9pZCAwPT09ZT9nOmUsZyk7aWYoaShkKSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPWQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFpKG4ucHJvdG90eXBlKT9vKG4pJiZudWxsPT09KG49bltmXSkmJihuPXZvaWQgMCk6bj12b2lkIDAsbj09PUFycmF5fHx2b2lkIDA9PT1uKSlyZXR1cm4gcC5jYWxsKGQsdix5KTtmb3Iocj1uZXcodm9pZCAwPT09bj9BcnJheTpuKShoKHktdiwwKSksbD0wO3Y8eTt2KyssbCsrKXYgaW4gZCYmYyhyLGwsZFt2XSk7cmV0dXJuIHIubGVuZ3RoPWwscn19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDIzNSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3Qua2V5c30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDI0KSxpPW4oNTUpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpuKDUpKGZ1bmN0aW9uKCl7aSgxKX0pfSx7a2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaShvKHQpKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzOCksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZjtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uaW5kZXhPZj9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyMzkpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLmluZGV4T2Z9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNjcpLmluZGV4T2YsaT1uKDI0MCksYT1bXS5pbmRleE9mLHM9ISFhJiYxL1sxXS5pbmRleE9mKDEsLTApPDAsdT1pKCJpbmRleE9mIik7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOnN8fHV9LHtpbmRleE9mOmZ1bmN0aW9uKHQpe3JldHVybiBzP2EuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwOm8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPVtdW3RdO3JldHVybiFufHwhcihmdW5jdGlvbigpe24uY2FsbChudWxsLGV8fGZ1bmN0aW9uKCl7dGhyb3cgMX0sMSl9KX19LGZ1bmN0aW9uKHQsZSxuKXtuKDExNSksdC5leHBvcnRzPW4oMSkuc2V0VGltZW91dH0sZnVuY3Rpb24odCxlLG4pe24oMTE1KSx0LmV4cG9ydHM9bigxKS5zZXRJbnRlcnZhbH0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0NCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDI0NSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3QuYXNzaWdufSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMjQ2KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6T2JqZWN0LmFzc2lnbiE9PW99LHthc3NpZ246b30pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTMpLG89big1KSxpPW4oNTUpLGE9bigxMDYpLHM9big2NCksdT1uKDI0KSxjPW4oNjUpLGw9T2JqZWN0LmFzc2lnbjt0LmV4cG9ydHM9IWx8fG8oZnVuY3Rpb24oKXt2YXIgdD17fSxlPXt9LG49U3ltYm9sKCk7cmV0dXJuIHRbbl09NywiYWJjZGVmZ2hpamtsbW5vcHFyc3QiLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09dH0pLDchPWwoe30sdClbbl18fCJhYmNkZWZnaGlqa2xtbm9wcXJzdCIhPWkobCh7fSxlKSkuam9pbigiIil9KT9mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj11KHQpLG89YXJndW1lbnRzLmxlbmd0aCxsPTEsZj1hLmYscD1zLmY7bz5sOylmb3IodmFyIGgsZD1jKGFyZ3VtZW50c1tsKytdKSxnPWY/aShkKS5jb25jYXQoZihkKSk6aShkKSx2PWcubGVuZ3RoLHk9MDt2Pnk7KWg9Z1t5KytdLHImJiFwLmNhbGwoZCxoKXx8KG5baF09ZFtoXSk7cmV0dXJuIG59Omx9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1mdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGUsbj1PYmplY3QucHJvdG90eXBlLHI9bi5oYXNPd25Qcm9wZXJ0eSxvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2w/U3ltYm9sOnt9LGk9by5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLGE9by5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixzPW8udG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiB1KHQsZSxuKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLHRbZV19dHJ5e3Uoe30sIiIpfWNhdGNoKHQpe3U9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0W2VdPW59fWZ1bmN0aW9uIGModCxlLG4scil7dmFyIG89ZSYmZS5wcm90b3R5cGUgaW5zdGFuY2VvZiB2P2U6dixpPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLGE9bmV3IE8ocnx8W10pO3JldHVybiBpLl9pbnZva2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWY7cmV0dXJuIGZ1bmN0aW9uKG8saSl7aWYocj09PWgpdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYocj09PWQpe2lmKCJ0aHJvdyI9PT1vKXRocm93IGk7cmV0dXJuIEwoKX1mb3Iobi5tZXRob2Q9byxuLmFyZz1pOzspe3ZhciBhPW4uZGVsZWdhdGU7aWYoYSl7dmFyIHM9VChhLG4pO2lmKHMpe2lmKHM9PT1nKWNvbnRpbnVlO3JldHVybiBzfX1pZigibmV4dCI9PT1uLm1ldGhvZCluLnNlbnQ9bi5fc2VudD1uLmFyZztlbHNlIGlmKCJ0aHJvdyI9PT1uLm1ldGhvZCl7aWYocj09PWYpdGhyb3cgcj1kLG4uYXJnO24uZGlzcGF0Y2hFeGNlcHRpb24obi5hcmcpfWVsc2UicmV0dXJuIj09PW4ubWV0aG9kJiZuLmFicnVwdCgicmV0dXJuIixuLmFyZyk7cj1oO3ZhciB1PWwodCxlLG4pO2lmKCJub3JtYWwiPT09dS50eXBlKXtpZihyPW4uZG9uZT9kOnAsdS5hcmc9PT1nKWNvbnRpbnVlO3JldHVybnt2YWx1ZTp1LmFyZyxkb25lOm4uZG9uZX19InRocm93Ij09PXUudHlwZSYmKHI9ZCxuLm1ldGhvZD0idGhyb3ciLG4uYXJnPXUuYXJnKX19fSh0LG4sYSksaX1mdW5jdGlvbiBsKHQsZSxuKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOnQuY2FsbChlLG4pfX1jYXRjaCh0KXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzp0fX19dC53cmFwPWM7dmFyIGY9InN1c3BlbmRlZFN0YXJ0IixwPSJzdXNwZW5kZWRZaWVsZCIsaD0iZXhlY3V0aW5nIixkPSJjb21wbGV0ZWQiLGc9e307ZnVuY3Rpb24gdigpe31mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIG0oKXt9dmFyIGI9e307YltpXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt2YXIgeD1PYmplY3QuZ2V0UHJvdG90eXBlT2Ysdz14JiZ4KHgoQyhbXSkpKTt3JiZ3IT09biYmci5jYWxsKHcsaSkmJihiPXcpO3ZhciBrPW0ucHJvdG90eXBlPXYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYik7ZnVuY3Rpb24gUyh0KXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24oZSl7dSh0LGUsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludm9rZShlLHQpfSl9KX1mdW5jdGlvbiBFKHQsZSl7dmFyIG47dGhpcy5faW52b2tlPWZ1bmN0aW9uKG8saSl7ZnVuY3Rpb24gYSgpe3JldHVybiBuZXcgZShmdW5jdGlvbihuLGEpeyFmdW5jdGlvbiBuKG8saSxhLHMpe3ZhciB1PWwodFtvXSx0LGkpO2lmKCJ0aHJvdyIhPT11LnR5cGUpe3ZhciBjPXUuYXJnLGY9Yy52YWx1ZTtyZXR1cm4gZiYmIm9iamVjdCI9PXR5cGVvZiBmJiZyLmNhbGwoZiwiX19hd2FpdCIpP2UucmVzb2x2ZShmLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odCl7bigibmV4dCIsdCxhLHMpfSxmdW5jdGlvbih0KXtuKCJ0aHJvdyIsdCxhLHMpfSk6ZS5yZXNvbHZlKGYpLnRoZW4oZnVuY3Rpb24odCl7Yy52YWx1ZT10LGEoYyl9LGZ1bmN0aW9uKHQpe3JldHVybiBuKCJ0aHJvdyIsdCxhLHMpfSl9cyh1LmFyZyl9KG8saSxuLGEpfSl9cmV0dXJuIG49bj9uLnRoZW4oYSxhKTphKCl9fWZ1bmN0aW9uIFQodCxuKXt2YXIgcj10Lml0ZXJhdG9yW24ubWV0aG9kXTtpZihyPT09ZSl7aWYobi5kZWxlZ2F0ZT1udWxsLCJ0aHJvdyI9PT1uLm1ldGhvZCl7aWYodC5pdGVyYXRvci5yZXR1cm4mJihuLm1ldGhvZD0icmV0dXJuIixuLmFyZz1lLFQodCxuKSwidGhyb3ciPT09bi5tZXRob2QpKXJldHVybiBnO24ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZCIpfXJldHVybiBnfXZhciBvPWwocix0Lml0ZXJhdG9yLG4uYXJnKTtpZigidGhyb3ciPT09by50eXBlKXJldHVybiBuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW8uYXJnLG4uZGVsZWdhdGU9bnVsbCxnO3ZhciBpPW8uYXJnO3JldHVybiBpP2kuZG9uZT8oblt0LnJlc3VsdE5hbWVdPWkudmFsdWUsbi5uZXh0PXQubmV4dExvYywicmV0dXJuIiE9PW4ubWV0aG9kJiYobi5tZXRob2Q9Im5leHQiLG4uYXJnPWUpLG4uZGVsZWdhdGU9bnVsbCxnKTppOihuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0Iiksbi5kZWxlZ2F0ZT1udWxsLGcpfWZ1bmN0aW9uIGoodCl7dmFyIGU9e3RyeUxvYzp0WzBdfTsxIGluIHQmJihlLmNhdGNoTG9jPXRbMV0pLDIgaW4gdCYmKGUuZmluYWxseUxvYz10WzJdLGUuYWZ0ZXJMb2M9dFszXSksdGhpcy50cnlFbnRyaWVzLnB1c2goZSl9ZnVuY3Rpb24gQSh0KXt2YXIgZT10LmNvbXBsZXRpb258fHt9O2UudHlwZT0ibm9ybWFsIixkZWxldGUgZS5hcmcsdC5jb21wbGV0aW9uPWV9ZnVuY3Rpb24gTyh0KXt0aGlzLnRyeUVudHJpZXM9W3t0cnlMb2M6InJvb3QifV0sdC5mb3JFYWNoKGosdGhpcyksdGhpcy5yZXNldCghMCl9ZnVuY3Rpb24gQyh0KXtpZih0KXt2YXIgbj10W2ldO2lmKG4pcmV0dXJuIG4uY2FsbCh0KTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5uZXh0KXJldHVybiB0O2lmKCFpc05hTih0Lmxlbmd0aCkpe3ZhciBvPS0xLGE9ZnVuY3Rpb24gbigpe2Zvcig7KytvPHQubGVuZ3RoOylpZihyLmNhbGwodCxvKSlyZXR1cm4gbi52YWx1ZT10W29dLG4uZG9uZT0hMSxuO3JldHVybiBuLnZhbHVlPWUsbi5kb25lPSEwLG59O3JldHVybiBhLm5leHQ9YX19cmV0dXJue25leHQ6TH19ZnVuY3Rpb24gTCgpe3JldHVybnt2YWx1ZTplLGRvbmU6ITB9fXJldHVybiB5LnByb3RvdHlwZT1rLmNvbnN0cnVjdG9yPW0sbS5jb25zdHJ1Y3Rvcj15LHkuZGlzcGxheU5hbWU9dShtLHMsIkdlbmVyYXRvckZ1bmN0aW9uIiksdC5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LmNvbnN0cnVjdG9yO3JldHVybiEhZSYmKGU9PT15fHwiR2VuZXJhdG9yRnVuY3Rpb24iPT09KGUuZGlzcGxheU5hbWV8fGUubmFtZSkpfSx0Lm1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxtKToodC5fX3Byb3RvX189bSx1KHQscywiR2VuZXJhdG9yRnVuY3Rpb24iKSksdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShrKSx0fSx0LmF3cmFwPWZ1bmN0aW9uKHQpe3JldHVybntfX2F3YWl0OnR9fSxTKEUucHJvdG90eXBlKSxFLnByb3RvdHlwZVthXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LkFzeW5jSXRlcmF0b3I9RSx0LmFzeW5jPWZ1bmN0aW9uKGUsbixyLG8saSl7dm9pZCAwPT09aSYmKGk9UHJvbWlzZSk7dmFyIGE9bmV3IEUoYyhlLG4scixvKSxpKTtyZXR1cm4gdC5pc0dlbmVyYXRvckZ1bmN0aW9uKG4pP2E6YS5uZXh0KCkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdC5kb25lP3QudmFsdWU6YS5uZXh0KCl9KX0sUyhrKSx1KGsscywiR2VuZXJhdG9yIiksa1tpXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxrLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9LHQua2V5cz1mdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIG4gaW4gdCllLnB1c2gobik7cmV0dXJuIGUucmV2ZXJzZSgpLGZ1bmN0aW9uIG4oKXtmb3IoO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKTtpZihyIGluIHQpcmV0dXJuIG4udmFsdWU9cixuLmRvbmU9ITEsbn1yZXR1cm4gbi5kb25lPSEwLG59fSx0LnZhbHVlcz1DLE8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPLHJlc2V0OmZ1bmN0aW9uKHQpe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PWUsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9ZSx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChBKSwhdClmb3IodmFyIG4gaW4gdGhpcykidCI9PT1uLmNoYXJBdCgwKSYmci5jYWxsKHRoaXMsbikmJiFpc05hTigrbi5zbGljZSgxKSkmJih0aGlzW25dPWUpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5kb25lPSEwO3ZhciB0PXRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT10LnR5cGUpdGhyb3cgdC5hcmc7cmV0dXJuIHRoaXMucnZhbH0sZGlzcGF0Y2hFeGNlcHRpb246ZnVuY3Rpb24odCl7aWYodGhpcy5kb25lKXRocm93IHQ7dmFyIG49dGhpcztmdW5jdGlvbiBvKHIsbyl7cmV0dXJuIHMudHlwZT0idGhyb3ciLHMuYXJnPXQsbi5uZXh0PXIsbyYmKG4ubWV0aG9kPSJuZXh0IixuLmFyZz1lKSwhIW99Zm9yKHZhciBpPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtpPj0wOy0taSl7dmFyIGE9dGhpcy50cnlFbnRyaWVzW2ldLHM9YS5jb21wbGV0aW9uO2lmKCJyb290Ij09PWEudHJ5TG9jKXJldHVybiBvKCJlbmQiKTtpZihhLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgdT1yLmNhbGwoYSwiY2F0Y2hMb2MiKSxjPXIuY2FsbChhLCJmaW5hbGx5TG9jIik7aWYodSYmYyl7aWYodGhpcy5wcmV2PGEuY2F0Y2hMb2MpcmV0dXJuIG8oYS5jYXRjaExvYywhMCk7aWYodGhpcy5wcmV2PGEuZmluYWxseUxvYylyZXR1cm4gbyhhLmZpbmFsbHlMb2MpfWVsc2UgaWYodSl7aWYodGhpcy5wcmV2PGEuY2F0Y2hMb2MpcmV0dXJuIG8oYS5jYXRjaExvYywhMCl9ZWxzZXtpZighYyl0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PGEuZmluYWxseUxvYylyZXR1cm4gbyhhLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO24+PTA7LS1uKXt2YXIgbz10aGlzLnRyeUVudHJpZXNbbl07aWYoby50cnlMb2M8PXRoaXMucHJldiYmci5jYWxsKG8sImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PG8uZmluYWxseUxvYyl7dmFyIGk9bzticmVha319aSYmKCJicmVhayI9PT10fHwiY29udGludWUiPT09dCkmJmkudHJ5TG9jPD1lJiZlPD1pLmZpbmFsbHlMb2MmJihpPW51bGwpO3ZhciBhPWk/aS5jb21wbGV0aW9uOnt9O3JldHVybiBhLnR5cGU9dCxhLmFyZz1lLGk/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9aS5maW5hbGx5TG9jLGcpOnRoaXMuY29tcGxldGUoYSl9LGNvbXBsZXRlOmZ1bmN0aW9uKHQsZSl7aWYoInRocm93Ij09PXQudHlwZSl0aHJvdyB0LmFyZztyZXR1cm4iYnJlYWsiPT09dC50eXBlfHwiY29udGludWUiPT09dC50eXBlP3RoaXMubmV4dD10LmFyZzoicmV0dXJuIj09PXQudHlwZT8odGhpcy5ydmFsPXRoaXMuYXJnPXQuYXJnLHRoaXMubWV0aG9kPSJyZXR1cm4iLHRoaXMubmV4dD0iZW5kIik6Im5vcm1hbCI9PT10LnR5cGUmJmUmJih0aGlzLm5leHQ9ZSksZ30sZmluaXNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7ZT49MDstLWUpe3ZhciBuPXRoaXMudHJ5RW50cmllc1tlXTtpZihuLmZpbmFsbHlMb2M9PT10KXJldHVybiB0aGlzLmNvbXBsZXRlKG4uY29tcGxldGlvbixuLmFmdGVyTG9jKSxBKG4pLGd9fSxjYXRjaDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2U+PTA7LS1lKXt2YXIgbj10aGlzLnRyeUVudHJpZXNbZV07aWYobi50cnlMb2M9PT10KXt2YXIgcj1uLmNvbXBsZXRpb247aWYoInRocm93Ij09PXIudHlwZSl7dmFyIG89ci5hcmc7QShuKX1yZXR1cm4gb319dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbih0LG4scil7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOkModCkscmVzdWx0TmFtZTpuLG5leHRMb2M6cn0sIm5leHQiPT09dGhpcy5tZXRob2QmJih0aGlzLmFyZz1lKSxnfX0sdH0odC5leHBvcnRzKTt0cnl7cmVnZW5lcmF0b3JSdW50aW1lPXJ9Y2F0Y2godCl7RnVuY3Rpb24oInIiLCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocil9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQ5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjUwKSxvPUZ1bmN0aW9uLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5iaW5kO3JldHVybiB0PT09b3x8dCBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZlPT09by5iaW5kP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDI1MSk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkZ1bmN0aW9uIikuYmluZH0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiRnVuY3Rpb24iLHByb3RvOiEwfSx7YmluZDpuKDkxKX0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjUzKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExNiksbigyNTkpLG4oMjYwKSxuKDI2MSksbigyNjIpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByLG8saSxhLHM9bigwKSx1PW4oMjcpLGM9big0KSxsPW4oMSksZj1uKDExNykscD1uKDM1KSxoPW4oMTE4KSxkPW4oMjgpLGc9bigyNTUpLHY9big2KSx5PW4oMjIpLG09bigxMTkpLGI9bigyNikseD1uKDU5KSx3PW4oMTEzKSxrPW4oMTIwKSxTPW4oMTIxKS5zZXQsRT1uKDI1NiksVD1uKDEyMiksaj1uKDI1NyksQT1uKDUyKSxPPW4oNjApLEM9big3OSksTD1uKDQ5KSxSPW4oODcpLFA9bigyKSgic3BlY2llcyIpLE49IlByb21pc2UiLEk9TC5nZXQsRD1MLnNldCxfPUwuZ2V0dGVyRm9yKE4pLE09ZixVPWMuVHlwZUVycm9yLEI9Yy5kb2N1bWVudCxxPWMucHJvY2VzcyxGPWMuZmV0Y2gsSD1xJiZxLnZlcnNpb25zLHo9SCYmSC52OHx8IiIsVz1BLmYsJD1XLFk9InByb2Nlc3MiPT1iKHEpLFY9ISEoQiYmQi5jcmVhdGVFdmVudCYmYy5kaXNwYXRjaEV2ZW50KSxHPVIoTixmdW5jdGlvbigpe3ZhciB0PU0ucmVzb2x2ZSgxKSxlPWZ1bmN0aW9uKCl7fSxuPSh0LmNvbnN0cnVjdG9yPXt9KVtQXT1mdW5jdGlvbih0KXt0KGUsZSl9O3JldHVybiEoKFl8fCJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpJiYoIXV8fHQuZmluYWxseSkmJnQudGhlbihlKWluc3RhbmNlb2YgbiYmMCE9PXouaW5kZXhPZigiNi42IikmJi0xPT09Qy5pbmRleE9mKCJDaHJvbWUvNjYiKSl9KSxLPUd8fCF3KGZ1bmN0aW9uKHQpe00uYWxsKHQpLmNhdGNoKGZ1bmN0aW9uKCl7fSl9KSxYPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiEoIXYodCl8fCJmdW5jdGlvbiIhPXR5cGVvZihlPXQudGhlbikpJiZlfSxKPWZ1bmN0aW9uKHQsZSxuKXtpZighZS5ub3RpZmllZCl7ZS5ub3RpZmllZD0hMDt2YXIgcj1lLnJlYWN0aW9ucztFKGZ1bmN0aW9uKCl7Zm9yKHZhciBvPWUudmFsdWUsaT0xPT1lLnN0YXRlLGE9MDtyLmxlbmd0aD5hOyl7dmFyIHMsdSxjLGw9clthKytdLGY9aT9sLm9rOmwuZmFpbCxwPWwucmVzb2x2ZSxoPWwucmVqZWN0LGQ9bC5kb21haW47dHJ5e2Y/KGl8fCgyPT09ZS5yZWplY3Rpb24mJmV0KHQsZSksZS5yZWplY3Rpb249MSksITA9PT1mP3M9bzooZCYmZC5lbnRlcigpLHM9ZihvKSxkJiYoZC5leGl0KCksYz0hMCkpLHM9PT1sLnByb21pc2U/aChVKCJQcm9taXNlLWNoYWluIGN5Y2xlIikpOih1PVgocykpP3UuY2FsbChzLHAsaCk6cChzKSk6aChvKX1jYXRjaCh0KXtkJiYhYyYmZC5leGl0KCksaCh0KX19ZS5yZWFjdGlvbnM9W10sZS5ub3RpZmllZD0hMSxuJiYhZS5yZWplY3Rpb24mJloodCxlKX0pfX0sUT1mdW5jdGlvbih0LGUsbil7dmFyIHIsbztWPygocj1CLmNyZWF0ZUV2ZW50KCJFdmVudCIpKS5wcm9taXNlPWUsci5yZWFzb249bixyLmluaXRFdmVudCh0LCExLCEwKSxjLmRpc3BhdGNoRXZlbnQocikpOnI9e3Byb21pc2U6ZSxyZWFzb246bn0sKG89Y1sib24iK3RdKT9vKHIpOiJ1bmhhbmRsZWRyZWplY3Rpb24iPT09dCYmaigiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIixuKX0sWj1mdW5jdGlvbih0LGUpe1MuY2FsbChjLGZ1bmN0aW9uKCl7dmFyIG4scj1lLnZhbHVlO2lmKHR0KGUpJiYobj1PKGZ1bmN0aW9uKCl7WT9xLmVtaXQoInVuaGFuZGxlZFJlamVjdGlvbiIscix0KTpRKCJ1bmhhbmRsZWRyZWplY3Rpb24iLHQscil9KSxlLnJlamVjdGlvbj1ZfHx0dChlKT8yOjEsbi5lcnJvcikpdGhyb3cgbi52YWx1ZX0pfSx0dD1mdW5jdGlvbih0KXtyZXR1cm4gMSE9PXQucmVqZWN0aW9uJiYhdC5wYXJlbnR9LGV0PWZ1bmN0aW9uKHQsZSl7Uy5jYWxsKGMsZnVuY3Rpb24oKXtZP3EuZW1pdCgicmVqZWN0aW9uSGFuZGxlZCIsdCk6USgicmVqZWN0aW9uaGFuZGxlZCIsdCxlLnZhbHVlKX0pfSxudD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gZnVuY3Rpb24obyl7dChlLG4sbyxyKX19LHJ0PWZ1bmN0aW9uKHQsZSxuLHIpe2UuZG9uZXx8KGUuZG9uZT0hMCxyJiYoZT1yKSxlLnZhbHVlPW4sZS5zdGF0ZT0yLEoodCxlLCEwKSl9LG90PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCFlLmRvbmUpe2UuZG9uZT0hMCxyJiYoZT1yKTt0cnl7aWYodD09PW4pdGhyb3cgVSgiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTt2YXIgbz1YKG4pO28/RShmdW5jdGlvbigpe3ZhciByPXtkb25lOiExfTt0cnl7by5jYWxsKG4sbnQob3QsdCxyLGUpLG50KHJ0LHQscixlKSl9Y2F0Y2gobil7cnQodCxyLG4sZSl9fSk6KGUudmFsdWU9bixlLnN0YXRlPTEsSih0LGUsITEpKX1jYXRjaChuKXtydCh0LHtkb25lOiExfSxuLGUpfX19O0cmJihNPWZ1bmN0aW9uKHQpe20odGhpcyxNLE4pLHkodCksci5jYWxsKHRoaXMpO3ZhciBlPUkodGhpcyk7dHJ5e3QobnQob3QsdGhpcyxlKSxudChydCx0aGlzLGUpKX1jYXRjaCh0KXtydCh0aGlzLGUsdCl9fSwocj1mdW5jdGlvbih0KXtEKHRoaXMse3R5cGU6Tixkb25lOiExLG5vdGlmaWVkOiExLHBhcmVudDohMSxyZWFjdGlvbnM6W10scmVqZWN0aW9uOiExLHN0YXRlOjAsdmFsdWU6dm9pZCAwfSl9KS5wcm90b3R5cGU9aChNLnByb3RvdHlwZSx7dGhlbjpmdW5jdGlvbih0LGUpe3ZhciBuPV8odGhpcykscj1XKGsodGhpcyxNKSk7cmV0dXJuIHIub2s9ImZ1bmN0aW9uIiE9dHlwZW9mIHR8fHQsci5mYWlsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLHIuZG9tYWluPVk/cS5kb21haW46dm9pZCAwLG4ucGFyZW50PSEwLG4ucmVhY3Rpb25zLnB1c2gociksMCE9bi5zdGF0ZSYmSih0aGlzLG4sITEpLHIucHJvbWlzZX0sY2F0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGhlbih2b2lkIDAsdCl9fSksbz1mdW5jdGlvbigpe3ZhciB0PW5ldyByLGU9SSh0KTt0aGlzLnByb21pc2U9dCx0aGlzLnJlc29sdmU9bnQob3QsdCxlKSx0aGlzLnJlamVjdD1udChydCx0LGUpfSxBLmY9Vz1mdW5jdGlvbih0KXtyZXR1cm4gdD09PU18fHQ9PT1pP25ldyBvKHQpOiQodCl9LHV8fCJmdW5jdGlvbiIhPXR5cGVvZiBmfHwoYT1mLnByb3RvdHlwZS50aGVuLHAoZi5wcm90b3R5cGUsInRoZW4iLGZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gbmV3IE0oZnVuY3Rpb24odCxlKXthLmNhbGwobix0LGUpfSkudGhlbih0LGUpfSksImZ1bmN0aW9uIj09dHlwZW9mIEYmJnMoe2dsb2JhbDohMCxlbnVtZXJhYmxlOiEwLGZvcmNlZDohMH0se2ZldGNoOmZ1bmN0aW9uKHQpe3JldHVybiBUKE0sRi5hcHBseShjLGFyZ3VtZW50cykpfX0pKSkscyh7Z2xvYmFsOiEwLHdyYXA6ITAsZm9yY2VkOkd9LHtQcm9taXNlOk19KSxkKE0sTiwhMSwhMCksZyhOKSxpPWwuUHJvbWlzZSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDpHfSx7cmVqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPVcodGhpcyk7cmV0dXJuIGUucmVqZWN0LmNhbGwodm9pZCAwLHQpLGUucHJvbWlzZX19KSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDp1fHxHfSx7cmVzb2x2ZTpmdW5jdGlvbih0KXtyZXR1cm4gVCh1JiZ0aGlzPT09aT9NOnRoaXMsdCl9fSkscyh7dGFyZ2V0Ok4sc3RhdDohMCxmb3JjZWQ6S30se2FsbDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49VyhlKSxyPW4ucmVzb2x2ZSxvPW4ucmVqZWN0LGk9TyhmdW5jdGlvbigpe3ZhciBuPXkoZS5yZXNvbHZlKSxpPVtdLGE9MCxzPTE7eCh0LGZ1bmN0aW9uKHQpe3ZhciB1PWErKyxjPSExO2kucHVzaCh2b2lkIDApLHMrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe2N8fChjPSEwLGlbdV09dCwtLXN8fHIoaSkpfSxvKX0pLC0tc3x8cihpKX0pO3JldHVybiBpLmVycm9yJiZvKGkudmFsdWUpLG4ucHJvbWlzZX0scmFjZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49VyhlKSxyPW4ucmVqZWN0LG89TyhmdW5jdGlvbigpe3ZhciBvPXkoZS5yZXNvbHZlKTt4KHQsZnVuY3Rpb24odCl7by5jYWxsKGUsdCkudGhlbihuLnJlc29sdmUscil9KX0pO3JldHVybiBvLmVycm9yJiZyKG8udmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMyKSxvPW4oMjMpLGk9bigyKSxhPW4oMTMpLHM9aSgic3BlY2llcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1yKHQpLG49by5mO2EmJmUmJiFlW3NdJiZuKGUscyx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzfX0pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHMsdSxjLGw9big0KSxmPW4oNDQpLmYscD1uKDI2KSxoPW4oMTIxKS5zZXQsZD1uKDc5KSxnPWwuTXV0YXRpb25PYnNlcnZlcnx8bC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHY9bC5wcm9jZXNzLHk9bC5Qcm9taXNlLG09InByb2Nlc3MiPT1wKHYpLGI9ZihsLCJxdWV1ZU1pY3JvdGFzayIpLHg9YiYmYi52YWx1ZTt4fHwocj1mdW5jdGlvbigpe3ZhciB0LGU7Zm9yKG0mJih0PXYuZG9tYWluKSYmdC5leGl0KCk7bzspe2U9by5mbixvPW8ubmV4dDt0cnl7ZSgpfWNhdGNoKHQpe3Rocm93IG8/YSgpOmk9dm9pZCAwLHR9fWk9dm9pZCAwLHQmJnQuZW50ZXIoKX0sbT9hPWZ1bmN0aW9uKCl7di5uZXh0VGljayhyKX06ZyYmIS8oaXBob25lfGlwb2R8aXBhZCkuKmFwcGxld2Via2l0L2kudGVzdChkKT8ocz0hMCx1PWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxuZXcgZyhyKS5vYnNlcnZlKHUse2NoYXJhY3RlckRhdGE6ITB9KSxhPWZ1bmN0aW9uKCl7dS5kYXRhPXM9IXN9KTp5JiZ5LnJlc29sdmU/KGM9eS5yZXNvbHZlKHZvaWQgMCksYT1mdW5jdGlvbigpe2MudGhlbihyKX0pOmE9ZnVuY3Rpb24oKXtoLmNhbGwobCxyKX0pLHQuZXhwb3J0cz14fHxmdW5jdGlvbih0KXt2YXIgZT17Zm46dCxuZXh0OnZvaWQgMH07aSYmKGkubmV4dD1lKSxvfHwobz1lLGEoKSksaT1lfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49ci5jb25zb2xlO24mJm4uZXJyb3ImJigxPT09YXJndW1lbnRzLmxlbmd0aD9uLmVycm9yKHQpOm4uZXJyb3IodCxlKSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDI3KSxpPW4oMTE3KSxhPW4oMzIpLHM9bigxMjApLHU9bigxMjIpLGM9bigzNSk7cih7dGFyZ2V0OiJQcm9taXNlIixwcm90bzohMCxyZWFsOiEwfSx7ZmluYWxseTpmdW5jdGlvbih0KXt2YXIgZT1zKHRoaXMsYSgiUHJvbWlzZSIpKSxuPSJmdW5jdGlvbiI9PXR5cGVvZiB0O3JldHVybiB0aGlzLnRoZW4obj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBufSl9OnQsbj9mdW5jdGlvbihuKXtyZXR1cm4gdShlLHQoKSkudGhlbihmdW5jdGlvbigpe3Rocm93IG59KX06dCl9fSksb3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGl8fGkucHJvdG90eXBlLmZpbmFsbHl8fGMoaS5wcm90b3R5cGUsImZpbmFsbHkiLGEoIlByb21pc2UiKS5wcm90b3R5cGUuZmluYWxseSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big0OCksaT1uKDc0KSxhPW4oNDYpLHM9bigzMCksdT1uKDU5KSxjPW4oMTcpLGw9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKCEobiBpbnN0YW5jZW9mIGwpKXJldHVybiBuZXcgbCh0LGUpO2kmJihuPWkobmV3IEVycm9yKGUpLG8obikpKTt2YXIgcj1bXTtyZXR1cm4gdSh0LHIucHVzaCxyKSxjKG4sImVycm9ycyIsciksdm9pZCAwIT09ZSYmYyhuLCJtZXNzYWdlIixTdHJpbmcoZSkpLG59O2wucHJvdG90eXBlPWEoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3RvcjpzKDUsbCksbmFtZTpzKDUsIkFnZ3JlZ2F0ZUVycm9yIil9KSxyKHtnbG9iYWw6ITB9LHtBZ2dyZWdhdGVFcnJvcjpsfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDEyMyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNTIpLGk9big2MCk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7dHJ5OmZ1bmN0aW9uKHQpe3ZhciBlPW8uZih0aGlzKSxuPWkodCk7cmV0dXJuKG4uZXJyb3I/ZS5yZWplY3Q6ZS5yZXNvbHZlKShuLnZhbHVlKSxlLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjIpLGk9bigzMiksYT1uKDUyKSxzPW4oNjApLHU9big1OSk7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YW55OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hLmYoZSkscj1uLnJlc29sdmUsYz1uLnJlamVjdCxsPXMoZnVuY3Rpb24oKXt2YXIgbj1vKGUucmVzb2x2ZSksYT1bXSxzPTAsbD0xLGY9ITE7dSh0LGZ1bmN0aW9uKHQpe3ZhciBvPXMrKyx1PSExO2EucHVzaCh2b2lkIDApLGwrKyxuLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe3V8fGZ8fChmPSEwLHIodCkpfSxmdW5jdGlvbih0KXt1fHxmfHwodT0hMCxhW29dPXQsLS1sfHxjKG5ldyhpKCJBZ2dyZWdhdGVFcnJvciIpKShhLCJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCIpKSl9KX0pLC0tbHx8YyhuZXcoaSgiQWdncmVnYXRlRXJyb3IiKSkoYSwiTm8gb25lIHByb21pc2UgcmVzb2x2ZWQiKSl9KTtyZXR1cm4gbC5lcnJvciYmYyhsLnZhbHVlKSxuLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTYpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiBuJiZ0KGUucHJvdG90eXBlLG4pLHImJnQoZSxyKSxlfX0oKSxvPWZ1bmN0aW9uKHQpe2lmKHQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgZT17fTtpZihudWxsIT10KWZvcih2YXIgbiBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiYoZVtuXT10W25dKTtyZXR1cm4gZS5kZWZhdWx0PXQsZX0obigyNjUpKSxpPXAobigyNjYpKSxhPXAobigyNjcpKSxzPXAobigyNjgpKSx1PXAobigyNjkpKSxjPXAobigyNzApKSxsPXAobigyNzEpKSxmPXAobigyNzIpKTtmdW5jdGlvbiBwKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX12YXIgaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9OyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLHQpLHRoaXMudHlwZT0ibGFuZ3VhZ2VEZXRlY3RvciIsdGhpcy5kZXRlY3RvcnM9e30sdGhpcy5pbml0KGUsbil9cmV0dXJuIHIodCxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O3RoaXMuc2VydmljZXM9dCx0aGlzLm9wdGlvbnM9by5kZWZhdWx0cyhlLHRoaXMub3B0aW9uc3x8e30se29yZGVyOlsicXVlcnlzdHJpbmciLCJjb29raWUiLCJsb2NhbFN0b3JhZ2UiLCJuYXZpZ2F0b3IiLCJodG1sVGFnIl0sbG9va3VwUXVlcnlzdHJpbmc6ImxuZyIsbG9va3VwQ29va2llOiJpMThuZXh0Iixsb29rdXBMb2NhbFN0b3JhZ2U6ImkxOG5leHRMbmciLGNhY2hlczpbImxvY2FsU3RvcmFnZSJdLGV4Y2x1ZGVDYWNoZUZvcjpbImNpbW9kZSJdfSksdGhpcy5vcHRpb25zLmxvb2t1cEZyb21VcmxJbmRleCYmKHRoaXMub3B0aW9ucy5sb29rdXBGcm9tUGF0aEluZGV4PXRoaXMub3B0aW9ucy5sb29rdXBGcm9tVXJsSW5kZXgpLHRoaXMuaTE4bk9wdGlvbnM9bix0aGlzLmFkZERldGVjdG9yKGkuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihhLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3Iocy5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKHUuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihjLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IobC5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGYuZGVmYXVsdCl9fSx7a2V5OiJhZGREZXRlY3RvciIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZXRlY3RvcnNbdC5uYW1lXT10fX0se2tleToiZGV0ZWN0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzO3R8fCh0PXRoaXMub3B0aW9ucy5vcmRlcik7dmFyIG49W107dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKGUuZGV0ZWN0b3JzW3RdKXt2YXIgcj1lLmRldGVjdG9yc1t0XS5sb29rdXAoZS5vcHRpb25zKTtyJiYic3RyaW5nIj09dHlwZW9mIHImJihyPVtyXSksciYmKG49bi5jb25jYXQocikpfX0pO3ZhciByPXZvaWQgMDtpZihuLmZvckVhY2goZnVuY3Rpb24odCl7aWYoIXIpe3ZhciBuPWUuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5mb3JtYXRMYW5ndWFnZUNvZGUodCk7ZS5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmlzV2hpdGVsaXN0ZWQobikmJihyPW4pfX0pLCFyKXt2YXIgbz10aGlzLmkxOG5PcHRpb25zLmZhbGxiYWNrTG5nOyJzdHJpbmciPT10eXBlb2YgbyYmKG89W29dKSxvfHwobz1bXSkscj0iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShvKT9vWzBdOm9bMF18fG8uZGVmYXVsdCYmby5kZWZhdWx0WzBdfXJldHVybiByfX0se2tleToiY2FjaGVVc2VyTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztlfHwoZT10aGlzLm9wdGlvbnMuY2FjaGVzKSxlJiYodGhpcy5vcHRpb25zLmV4Y2x1ZGVDYWNoZUZvciYmdGhpcy5vcHRpb25zLmV4Y2x1ZGVDYWNoZUZvci5pbmRleE9mKHQpPi0xfHxlLmZvckVhY2goZnVuY3Rpb24oZSl7bi5kZXRlY3RvcnNbZV0mJm4uZGV0ZWN0b3JzW2VdLmNhY2hlVXNlckxhbmd1YWdlKHQsbi5vcHRpb25zKX0pKX19XSksdH0oKTtoLnR5cGU9Imxhbmd1YWdlRGV0ZWN0b3IiLGUuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHRzPWZ1bmN0aW9uKHQpe3JldHVybiBvLmNhbGwoaS5jYWxsKGFyZ3VtZW50cywxKSxmdW5jdGlvbihlKXtpZihlKWZvcih2YXIgbiBpbiBlKXZvaWQgMD09PXRbbl0mJih0W25dPWVbbl0pfSksdH0sZS5leHRlbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG8uY2FsbChpLmNhbGwoYXJndW1lbnRzLDEpLGZ1bmN0aW9uKGUpe2lmKGUpZm9yKHZhciBuIGluIGUpdFtuXT1lW25dfSksdH07dmFyIHI9W10sbz1yLmZvckVhY2gsaT1yLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbih0LGUsbixyKXt2YXIgbz12b2lkIDA7aWYobil7dmFyIGk9bmV3IERhdGU7aS5zZXRUaW1lKGkuZ2V0VGltZSgpKzYwKm4qMWUzKSxvPSI7IGV4cGlyZXM9IitpLnRvR01UU3RyaW5nKCl9ZWxzZSBvPSIiO3I9cj8iZG9tYWluPSIrcisiOyI6IiIsZG9jdW1lbnQuY29va2llPXQrIj0iK2UrbysiOyIrcisicGF0aD0vIn0sbz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dCsiPSIsbj1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKSxyPTA7cjxuLmxlbmd0aDtyKyspe2Zvcih2YXIgbz1uW3JdOyIgIj09PW8uY2hhckF0KDApOylvPW8uc3Vic3RyaW5nKDEsby5sZW5ndGgpO2lmKDA9PT1vLmluZGV4T2YoZSkpcmV0dXJuIG8uc3Vic3RyaW5nKGUubGVuZ3RoLG8ubGVuZ3RoKX1yZXR1cm4gbnVsbH07ZS5kZWZhdWx0PXtuYW1lOiJjb29raWUiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYodC5sb29rdXBDb29raWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBuPW8odC5sb29rdXBDb29raWUpO24mJihlPW4pfXJldHVybiBlfSxjYWNoZVVzZXJMYW5ndWFnZTpmdW5jdGlvbih0LGUpe2UubG9va3VwQ29va2llJiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZyKGUubG9va3VwQ29va2llLHQsZS5jb29raWVNaW51dGVzLGUuY29va2llRG9tYWluKX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6InF1ZXJ5c3RyaW5nIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KWZvcih2YXIgbj13aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdCgiJiIpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXS5pbmRleE9mKCI9Iik7aWYobz4wKW5bcl0uc3Vic3RyaW5nKDAsbyk9PT10Lmxvb2t1cFF1ZXJ5c3RyaW5nJiYoZT1uW3JdLnN1YnN0cmluZyhvKzEpKX1yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj12b2lkIDA7dHJ5e3I9InVuZGVmaW5lZCIhPT13aW5kb3cmJm51bGwhPT13aW5kb3cubG9jYWxTdG9yYWdlO3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiaTE4bmV4dC50cmFuc2xhdGUuYm9vIiwiZm9vIiksd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJpMThuZXh0LnRyYW5zbGF0ZS5ib28iKX1jYXRjaCh0KXtyPSExfWUuZGVmYXVsdD17bmFtZToibG9jYWxTdG9yYWdlIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKHQubG9va3VwTG9jYWxTdG9yYWdlJiZyKXt2YXIgbj13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odC5sb29rdXBMb2NhbFN0b3JhZ2UpO24mJihlPW4pfXJldHVybiBlfSxjYWNoZVVzZXJMYW5ndWFnZTpmdW5jdGlvbih0LGUpe2UubG9va3VwTG9jYWxTdG9yYWdlJiZyJiZ3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oZS5sb29rdXBMb2NhbFN0b3JhZ2UsdCl9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJuYXZpZ2F0b3IiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT1bXTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvcil7aWYobmF2aWdhdG9yLmxhbmd1YWdlcylmb3IodmFyIG49MDtuPG5hdmlnYXRvci5sYW5ndWFnZXMubGVuZ3RoO24rKyllLnB1c2gobmF2aWdhdG9yLmxhbmd1YWdlc1tuXSk7bmF2aWdhdG9yLnVzZXJMYW5ndWFnZSYmZS5wdXNoKG5hdmlnYXRvci51c2VyTGFuZ3VhZ2UpLG5hdmlnYXRvci5sYW5ndWFnZSYmZS5wdXNoKG5hdmlnYXRvci5sYW5ndWFnZSl9cmV0dXJuIGUubGVuZ3RoPjA/ZTp2b2lkIDB9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXtuYW1lOiJodG1sVGFnIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwLG49dC5odG1sVGFnfHwoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6bnVsbCk7cmV0dXJuIG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLmdldEF0dHJpYnV0ZSYmKGU9bi5nZXRBdHRyaWJ1dGUoImxhbmciKSksZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6InBhdGgiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpe3ZhciBuPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXC8oW2EtekEtWi1dKikvZyk7aWYobiBpbnN0YW5jZW9mIEFycmF5KWlmKCJudW1iZXIiPT10eXBlb2YgdC5sb29rdXBGcm9tUGF0aEluZGV4KXtpZigic3RyaW5nIiE9dHlwZW9mIG5bdC5sb29rdXBGcm9tUGF0aEluZGV4XSlyZXR1cm47ZT1uW3QubG9va3VwRnJvbVBhdGhJbmRleF0ucmVwbGFjZSgiLyIsIiIpfWVsc2UgZT1uWzBdLnJlcGxhY2UoIi8iLCIiKX1yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6InN1YmRvbWFpbiIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7dmFyIG49d2luZG93LmxvY2F0aW9uLmhyZWYubWF0Y2goLyg/Omh0dHBbc10qXDpcL1wvKSooLio/KVwuKD89W15cL10qXC4uezIsNX0pL2dpKTtuIGluc3RhbmNlb2YgQXJyYXkmJihlPSJudW1iZXIiPT10eXBlb2YgdC5sb29rdXBGcm9tU3ViZG9tYWluSW5kZXg/blt0Lmxvb2t1cEZyb21TdWJkb21haW5JbmRleF0ucmVwbGFjZSgiaHR0cDovLyIsIiIpLnJlcGxhY2UoImh0dHBzOi8vIiwiIikucmVwbGFjZSgiLiIsIiIpOm5bMF0ucmVwbGFjZSgiaHR0cDovLyIsIiIpLnJlcGxhY2UoImh0dHBzOi8vIiwiIikucmVwbGFjZSgiLiIsIiIpKX1yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNzQpLG89bigxMjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihyKHQpKXJldHVybiBvKHQpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3NSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMjUpLG89bigyNzgpLGk9bigxMDIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT1pJiZvKE9iamVjdCh0KSkpcmV0dXJuIHIodCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTEwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI3OSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDUwKSxuKDM0KSx0LmV4cG9ydHM9bigyODApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3Niksbz1uKDIpLGk9bigyOSksYT1vKCJpdGVyYXRvciIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3QodCk7cmV0dXJuIHZvaWQgMCE9PWVbYV18fCJAQGl0ZXJhdG9yImluIGV8fGkuaGFzT3duUHJvcGVydHkocihlKSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMjUpLG89bigyODIpLGk9bigxMjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gaSh0LGUpO3ZhciBhPW8obj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTtyZXR1cm4iT2JqZWN0Ij09PWEmJnQuY29uc3RydWN0b3ImJihhPXQuY29uc3RydWN0b3IubmFtZSksIk1hcCI9PT1hfHwiU2V0Ij09PWE/cih0KToiQXJndW1lbnRzIj09PWF8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGEpP2kodCxlKTp2b2lkIDB9fX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4Myl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTQpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI4Nil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI4Nyksbz1uKDI4OSksaT1BcnJheS5wcm90b3R5cGUsYT1TdHJpbmcucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmluY2x1ZGVzO3JldHVybiB0PT09aXx8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09aS5pbmNsdWRlcz9yOiJzdHJpbmciPT10eXBlb2YgdHx8dD09PWF8fHQgaW5zdGFuY2VvZiBTdHJpbmcmJmU9PT1hLmluY2x1ZGVzP286ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDI4OCk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkFycmF5IikuaW5jbHVkZXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNjcpLmluY2x1ZGVzLGk9big3Nyk7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITB9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImluY2x1ZGVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDI5MCk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIlN0cmluZyIpLmluY2x1ZGVzfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDI5MSksaT1uKDQ1KTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOiFuKDI5MykoImluY2x1ZGVzIil9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4hIX5TdHJpbmcoaSh0aGlzKSkuaW5kZXhPZihvKHQpLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjkyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYocih0KSl0aHJvdyBUeXBlRXJyb3IoIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9ucyIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz1uKDI2KSxpPW4oMikoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiByKHQpJiYodm9pZCAwIT09KGU9dFtpXSk/ISFlOiJSZWdFeHAiPT1vKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIpKCJtYXRjaCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0vLi87dHJ5eyIvLi8iW3RdKGUpfWNhdGNoKG4pe3RyeXtyZXR1cm4gZVtyXT0hMSwiLy4vIlt0XShlKX1jYXRjaCh0KXt9fXJldHVybiExfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7Ci8qIQogKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci4KICoKICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+CiAqIEBsaWNlbnNlICBNSVQKICovCnZhciByPW4oMjk1KSxvPW4oMjk2KSxpPW4oMjk3KTtmdW5jdGlvbiBhKCl7cmV0dXJuIHUuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gcyh0LGUpe2lmKGEoKTxlKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiB1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9bmV3IFVpbnQ4QXJyYXkoZSkpLl9fcHJvdG9fXz11LnByb3RvdHlwZToobnVsbD09PXQmJih0PW5ldyB1KGUpKSx0Lmxlbmd0aD1lKSx0fWZ1bmN0aW9uIHUodCxlLG4pe2lmKCEodS5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgdSkpcmV0dXJuIG5ldyB1KHQsZSxuKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGYodGhpcyx0KX1yZXR1cm4gYyh0aGlzLHQsZSxuKX1mdW5jdGlvbiBjKHQsZSxuLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKHQsZSxuLHIpe2lmKGUuYnl0ZUxlbmd0aCxuPDB8fGUuYnl0ZUxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYoZS5ieXRlTGVuZ3RoPG4rKHJ8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7ZT12b2lkIDA9PT1uJiZ2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KGUpOnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkoZSxuKTpuZXcgVWludDhBcnJheShlLG4scik7dS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PWUpLl9fcHJvdG9fXz11LnByb3RvdHlwZTp0PXAodCxlKTtyZXR1cm4gdH0odCxlLG4scik6InN0cmluZyI9PXR5cGVvZiBlP2Z1bmN0aW9uKHQsZSxuKXsic3RyaW5nIj09dHlwZW9mIG4mJiIiIT09bnx8KG49InV0ZjgiKTtpZighdS5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciByPTB8ZChlLG4pLG89KHQ9cyh0LHIpKS53cml0ZShlLG4pO28hPT1yJiYodD10LnNsaWNlKDAsbykpO3JldHVybiB0fSh0LGUsbik6ZnVuY3Rpb24odCxlKXtpZih1LmlzQnVmZmVyKGUpKXt2YXIgbj0wfGgoZS5sZW5ndGgpO3JldHVybiAwPT09KHQ9cyh0LG4pKS5sZW5ndGg/dDooZS5jb3B5KHQsMCwwLG4pLHQpfWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwocj1lLmxlbmd0aCkhPXI/cyh0LDApOnAodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmaShlLmRhdGEpKXJldHVybiBwKHQsZS5kYXRhKX12YXIgcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gbCh0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGYodCxlKXtpZihsKGUpLHQ9cyh0LGU8MD8wOjB8aChlKSksIXUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIG49MDtuPGU7KytuKXRbbl09MDtyZXR1cm4gdH1mdW5jdGlvbiBwKHQsZSl7dmFyIG49ZS5sZW5ndGg8MD8wOjB8aChlLmxlbmd0aCk7dD1zKHQsbik7Zm9yKHZhciByPTA7cjxuO3IrPTEpdFtyXT0yNTUmZVtyXTtyZXR1cm4gdH1mdW5jdGlvbiBoKHQpe2lmKHQ+PWEoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrYSgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBkKHQsZSl7aWYodS5pc0J1ZmZlcih0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIG49dC5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIDA7Zm9yKHZhciByPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIG47Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gRih0KS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKm47Y2FzZSJoZXgiOnJldHVybiBuPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIEgodCkubGVuZ3RoO2RlZmF1bHQ6aWYocilyZXR1cm4gRih0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiBnKHQsZSxuKXt2YXIgcj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09bnx8bj50aGlzLmxlbmd0aCkmJihuPXRoaXMubGVuZ3RoKSxuPD0wKXJldHVybiIiO2lmKChuPj4+PTApPD0oZT4+Pj0wKSlyZXR1cm4iIjtmb3IodHx8KHQ9InV0ZjgiKTs7KXN3aXRjaCh0KXtjYXNlImhleCI6cmV0dXJuIEwodGhpcyxlLG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIGoodGhpcyxlLG4pO2Nhc2UiYXNjaWkiOnJldHVybiBPKHRoaXMsZSxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBDKHRoaXMsZSxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIFQodGhpcyxlLG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gUih0aGlzLGUsbik7ZGVmYXVsdDppZihyKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7dD0odCsiIikudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiB2KHQsZSxuKXt2YXIgcj10W2VdO3RbZV09dFtuXSx0W25dPXJ9ZnVuY3Rpb24geSh0LGUsbixyLG8pe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIG4/KHI9bixuPTApOm4+MjE0NzQ4MzY0Nz9uPTIxNDc0ODM2NDc6bjwtMjE0NzQ4MzY0OCYmKG49LTIxNDc0ODM2NDgpLG49K24saXNOYU4obikmJihuPW8/MDp0Lmxlbmd0aC0xKSxuPDAmJihuPXQubGVuZ3RoK24pLG4+PXQubGVuZ3RoKXtpZihvKXJldHVybi0xO249dC5sZW5ndGgtMX1lbHNlIGlmKG48MCl7aWYoIW8pcmV0dXJuLTE7bj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9dS5mcm9tKGUscikpLHUuaXNCdWZmZXIoZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTptKHQsZSxuLHIsbyk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsdS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9vP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUsbik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUsbik6bSh0LFtlXSxuLHIsbyk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gbSh0LGUsbixyLG8pe3ZhciBpLGE9MSxzPXQubGVuZ3RoLHU9ZS5sZW5ndGg7aWYodm9pZCAwIT09ciYmKCJ1Y3MyIj09PShyPVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PXJ8fCJ1dGYxNmxlIj09PXJ8fCJ1dGYtMTZsZSI9PT1yKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTthPTIscy89Mix1Lz0yLG4vPTJ9ZnVuY3Rpb24gYyh0LGUpe3JldHVybiAxPT09YT90W2VdOnQucmVhZFVJbnQxNkJFKGUqYSl9aWYobyl7dmFyIGw9LTE7Zm9yKGk9bjtpPHM7aSsrKWlmKGModCxpKT09PWMoZSwtMT09PWw/MDppLWwpKXtpZigtMT09PWwmJihsPWkpLGktbCsxPT09dSlyZXR1cm4gbCphfWVsc2UtMSE9PWwmJihpLT1pLWwpLGw9LTF9ZWxzZSBmb3Iobit1PnMmJihuPXMtdSksaT1uO2k+PTA7aS0tKXtmb3IodmFyIGY9ITAscD0wO3A8dTtwKyspaWYoYyh0LGkrcCkhPT1jKGUscCkpe2Y9ITE7YnJlYWt9aWYoZilyZXR1cm4gaX1yZXR1cm4tMX1mdW5jdGlvbiBiKHQsZSxuLHIpe249TnVtYmVyKG4pfHwwO3ZhciBvPXQubGVuZ3RoLW47cj8ocj1OdW1iZXIocikpPm8mJihyPW8pOnI9bzt2YXIgaT1lLmxlbmd0aDtpZihpJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7cj5pLzImJihyPWkvMik7Zm9yKHZhciBhPTA7YTxyOysrYSl7dmFyIHM9cGFyc2VJbnQoZS5zdWJzdHIoMiphLDIpLDE2KTtpZihpc05hTihzKSlyZXR1cm4gYTt0W24rYV09c31yZXR1cm4gYX1mdW5jdGlvbiB4KHQsZSxuLHIpe3JldHVybiB6KEYoZSx0Lmxlbmd0aC1uKSx0LG4scil9ZnVuY3Rpb24gdyh0LGUsbixyKXtyZXR1cm4geihmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7KytuKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KG4pKTtyZXR1cm4gZX0oZSksdCxuLHIpfWZ1bmN0aW9uIGsodCxlLG4scil7cmV0dXJuIHcodCxlLG4scil9ZnVuY3Rpb24gUyh0LGUsbixyKXtyZXR1cm4geihIKGUpLHQsbixyKX1mdW5jdGlvbiBFKHQsZSxuLHIpe3JldHVybiB6KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHIsbyxpPVtdLGE9MDthPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK2Epbj10LmNoYXJDb2RlQXQoYSkscj1uPj44LG89biUyNTYsaS5wdXNoKG8pLGkucHVzaChyKTtyZXR1cm4gaX0oZSx0Lmxlbmd0aC1uKSx0LG4scil9ZnVuY3Rpb24gVCh0LGUsbil7cmV0dXJuIDA9PT1lJiZuPT09dC5sZW5ndGg/ci5mcm9tQnl0ZUFycmF5KHQpOnIuZnJvbUJ5dGVBcnJheSh0LnNsaWNlKGUsbikpfWZ1bmN0aW9uIGoodCxlLG4pe249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciByPVtdLG89ZTtvPG47KXt2YXIgaSxhLHMsdSxjPXRbb10sbD1udWxsLGY9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihvK2Y8PW4pc3dpdGNoKGYpe2Nhc2UgMTpjPDEyOCYmKGw9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYoaT10W28rMV0pKSYmKHU9KDMxJmMpPDw2fDYzJmkpPjEyNyYmKGw9dSk7YnJlYWs7Y2FzZSAzOmk9dFtvKzFdLGE9dFtvKzJdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJmEpJiYodT0oMTUmYyk8PDEyfCg2MyZpKTw8Nnw2MyZhKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihsPXUpO2JyZWFrO2Nhc2UgNDppPXRbbysxXSxhPXRbbysyXSxzPXRbbyszXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZhKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmYyk8PDE4fCg2MyZpKTw8MTJ8KDYzJmEpPDw2fDYzJnMpPjY1NTM1JiZ1PDExMTQxMTImJihsPXUpfW51bGw9PT1sPyhsPTY1NTMzLGY9MSk6bD42NTUzNSYmKGwtPTY1NTM2LHIucHVzaChsPj4+MTAmMTAyM3w1NTI5NiksbD01NjMyMHwxMDIzJmwpLHIucHVzaChsKSxvKz1mfXJldHVybiBmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDtpZihlPD1BKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0KTt2YXIgbj0iIixyPTA7Zm9yKDtyPGU7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQuc2xpY2UocixyKz1BKSk7cmV0dXJuIG59KHIpfWUuQnVmZmVyPXUsZS5TbG93QnVmZmVyPWZ1bmN0aW9uKHQpeyt0IT10JiYodD0wKTtyZXR1cm4gdS5hbGxvYygrdCl9LGUuSU5TUEVDVF9NQVhfQllURVM9NTAsdS5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMCE9PXQuVFlQRURfQVJSQVlfU1VQUE9SVD90LlRZUEVEX0FSUkFZX1NVUFBPUlQ6ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIHQuX19wcm90b19fPXtfX3Byb3RvX186VWludDhBcnJheS5wcm90b3R5cGUsZm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX0sNDI9PT10LmZvbygpJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zdWJhcnJheSYmMD09PXQuc3ViYXJyYXkoMSwxKS5ieXRlTGVuZ3RofWNhdGNoKHQpe3JldHVybiExfX0oKSxlLmtNYXhMZW5ndGg9YSgpLHUucG9vbFNpemU9ODE5Mix1Ll9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz11LnByb3RvdHlwZSx0fSx1LmZyb209ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjKG51bGwsdCxlLG4pfSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQmJih1LnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsdS5fX3Byb3RvX189VWludDhBcnJheSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnNwZWNpZXMmJnVbU3ltYm9sLnNwZWNpZXNdPT09dSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsU3ltYm9sLnNwZWNpZXMse3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOiEwfSkpLHUuYWxsb2M9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gbChlKSxlPD0wP3ModCxlKTp2b2lkIDAhPT1uPyJzdHJpbmciPT10eXBlb2Ygcj9zKHQsZSkuZmlsbChuLHIpOnModCxlKS5maWxsKG4pOnModCxlKX0obnVsbCx0LGUsbil9LHUuYWxsb2NVbnNhZmU9ZnVuY3Rpb24odCl7cmV0dXJuIGYobnVsbCx0KX0sdS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGYobnVsbCx0KX0sdS5pc0J1ZmZlcj1mdW5jdGlvbih0KXtyZXR1cm4hKG51bGw9PXR8fCF0Ll9pc0J1ZmZlcil9LHUuY29tcGFyZT1mdW5jdGlvbih0LGUpe2lmKCF1LmlzQnVmZmVyKHQpfHwhdS5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYodD09PWUpcmV0dXJuIDA7Zm9yKHZhciBuPXQubGVuZ3RoLHI9ZS5sZW5ndGgsbz0wLGk9TWF0aC5taW4obixyKTtvPGk7KytvKWlmKHRbb10hPT1lW29dKXtuPXRbb10scj1lW29dO2JyZWFrfXJldHVybiBuPHI/LTE6cjxuPzE6MH0sdS5pc0VuY29kaW5nPWZ1bmN0aW9uKHQpe3N3aXRjaChTdHJpbmcodCkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSx1LmNvbmNhdD1mdW5jdGlvbih0LGUpe2lmKCFpKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHUuYWxsb2MoMCk7dmFyIG47aWYodm9pZCAwPT09ZSlmb3IoZT0wLG49MDtuPHQubGVuZ3RoOysrbillKz10W25dLmxlbmd0aDt2YXIgcj11LmFsbG9jVW5zYWZlKGUpLG89MDtmb3Iobj0wO248dC5sZW5ndGg7KytuKXt2YXIgYT10W25dO2lmKCF1LmlzQnVmZmVyKGEpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTthLmNvcHkocixvKSxvKz1hLmxlbmd0aH1yZXR1cm4gcn0sdS5ieXRlTGVuZ3RoPWQsdS5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLHUucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9Mil2KHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpdih0aGlzLGUsZSszKSx2KHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9OCl2KHRoaXMsZSxlKzcpLHYodGhpcyxlKzEsZSs2KSx2KHRoaXMsZSsyLGUrNSksdih0aGlzLGUrMyxlKzQpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT10PyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP2oodGhpcywwLHQpOmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx1LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09dHx8MD09PXUuY29tcGFyZSh0aGlzLHQpfSx1LnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9IiIsbj1lLklOU1BFQ1RfTUFYX0JZVEVTO3JldHVybiB0aGlzLmxlbmd0aD4wJiYodD10aGlzLnRvU3RyaW5nKCJoZXgiLDAsbikubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPm4mJih0Kz0iIC4uLiAiKSksIjxCdWZmZXIgIit0KyI+In0sdS5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUsbixyLG8pe2lmKCF1LmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1uJiYobj10P3QubGVuZ3RoOjApLHZvaWQgMD09PXImJihyPTApLHZvaWQgMD09PW8mJihvPXRoaXMubGVuZ3RoKSxlPDB8fG4+dC5sZW5ndGh8fHI8MHx8bz50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocj49byYmZT49bilyZXR1cm4gMDtpZihyPj1vKXJldHVybi0xO2lmKGU+PW4pcmV0dXJuIDE7aWYodGhpcz09PXQpcmV0dXJuIDA7Zm9yKHZhciBpPShvPj4+PTApLShyPj4+PTApLGE9KG4+Pj49MCktKGU+Pj49MCkscz1NYXRoLm1pbihpLGEpLGM9dGhpcy5zbGljZShyLG8pLGw9dC5zbGljZShlLG4pLGY9MDtmPHM7KytmKWlmKGNbZl0hPT1sW2ZdKXtpPWNbZl0sYT1sW2ZdO2JyZWFrfXJldHVybiBpPGE/LTE6YTxpPzE6MH0sdS5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCxlLG4pe3JldHVybi0xIT09dGhpcy5pbmRleE9mKHQsZSxuKX0sdS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkodGhpcyx0LGUsbiwhMCl9LHUucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geSh0aGlzLHQsZSxuLCExKX0sdS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLG4scil7aWYodm9pZCAwPT09ZSlyPSJ1dGY4IixuPXRoaXMubGVuZ3RoLGU9MDtlbHNlIGlmKHZvaWQgMD09PW4mJiJzdHJpbmciPT10eXBlb2YgZSlyPWUsbj10aGlzLmxlbmd0aCxlPTA7ZWxzZXtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO2V8PTAsaXNGaW5pdGUobik/KG58PTAsdm9pZCAwPT09ciYmKHI9InV0ZjgiKSk6KHI9bixuPXZvaWQgMCl9dmFyIG89dGhpcy5sZW5ndGgtZTtpZigodm9pZCAwPT09bnx8bj5vKSYmKG49byksdC5sZW5ndGg+MCYmKG48MHx8ZTwwKXx8ZT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtyfHwocj0idXRmOCIpO2Zvcih2YXIgaT0hMTs7KXN3aXRjaChyKXtjYXNlImhleCI6cmV0dXJuIGIodGhpcyx0LGUsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4geCh0aGlzLHQsZSxuKTtjYXNlImFzY2lpIjpyZXR1cm4gdyh0aGlzLHQsZSxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBrKHRoaXMsdCxlLG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gUyh0aGlzLHQsZSxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEUodGhpcyx0LGUsbik7ZGVmYXVsdDppZihpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcik7cj0oIiIrcikudG9Mb3dlckNhc2UoKSxpPSEwfX0sdS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgQT00MDk2O2Z1bmN0aW9uIE8odCxlLG4pe3ZhciByPSIiO249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciBvPWU7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W29dKTtyZXR1cm4gcn1mdW5jdGlvbiBDKHQsZSxuKXt2YXIgcj0iIjtuPU1hdGgubWluKHQubGVuZ3RoLG4pO2Zvcih2YXIgbz1lO288bjsrK28pcis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W29dKTtyZXR1cm4gcn1mdW5jdGlvbiBMKHQsZSxuKXt2YXIgcj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghbnx8bjwwfHxuPnIpJiYobj1yKTtmb3IodmFyIG89IiIsaT1lO2k8bjsrK2kpbys9cSh0W2ldKTtyZXR1cm4gb31mdW5jdGlvbiBSKHQsZSxuKXtmb3IodmFyIHI9dC5zbGljZShlLG4pLG89IiIsaT0wO2k8ci5sZW5ndGg7aSs9MilvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbaV0rMjU2KnJbaSsxXSk7cmV0dXJuIG99ZnVuY3Rpb24gUCh0LGUsbil7aWYodCUxIT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gTih0LGUsbixyLG8saSl7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+b3x8ZTxpKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEkodCxlLG4scil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4odC5sZW5ndGgtbiwyKTtvPGk7KytvKXRbbitvXT0oZSYyNTU8PDgqKHI/bzoxLW8pKT4+PjgqKHI/bzoxLW8pfWZ1bmN0aW9uIEQodCxlLG4scil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbih0Lmxlbmd0aC1uLDQpO288aTsrK28pdFtuK29dPWU+Pj44KihyP286My1vKSYyNTV9ZnVuY3Rpb24gXyh0LGUsbixyLG8saSl7aWYobityPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIE0odCxlLG4scixpKXtyZXR1cm4gaXx8Xyh0LDAsbiw0KSxvLndyaXRlKHQsZSxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIFUodCxlLG4scixpKXtyZXR1cm4gaXx8Xyh0LDAsbiw4KSxvLndyaXRlKHQsZSxuLHIsNTIsOCksbis4fXUucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigodD1+fnQpPDA/KHQrPXIpPDAmJih0PTApOnQ+ciYmKHQ9ciksKGU9dm9pZCAwPT09ZT9yOn5+ZSk8MD8oZSs9cik8MCYmKGU9MCk6ZT5yJiYoZT1yKSxlPHQmJihlPXQpLHUuVFlQRURfQVJSQVlfU1VQUE9SVCkobj10aGlzLnN1YmFycmF5KHQsZSkpLl9fcHJvdG9fXz11LnByb3RvdHlwZTtlbHNle3ZhciBvPWUtdDtuPW5ldyB1KG8sdm9pZCAwKTtmb3IodmFyIGk9MDtpPG87KytpKW5baV09dGhpc1tpK3RdfXJldHVybiBufSx1LnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8UCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3RdLG89MSxpPTA7KytpPGUmJihvKj0yNTYpOylyKz10aGlzW3QraV0qbztyZXR1cm4gcn0sdS5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFAodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0Ky0tZV0sbz0xO2U+MCYmKG8qPTI1Nik7KXIrPXRoaXNbdCstLWVdKm87cmV0dXJuIHJ9LHUucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sdS5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sdS5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sdS5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSx1LnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LHUucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFAodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0XSxvPTEsaT0wOysraTxlJiYobyo9MjU2KTspcis9dGhpc1t0K2ldKm87cmV0dXJuIHI+PShvKj0xMjgpJiYoci09TWF0aC5wb3coMiw4KmUpKSxyfSx1LnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxQKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPWUsbz0xLGk9dGhpc1t0Ky0tcl07cj4wJiYobyo9MjU2KTspaSs9dGhpc1t0Ky0tcl0qbztyZXR1cm4gaT49KG8qPTEyOCkmJihpLT1NYXRoLnBvdygyLDgqZSkpLGl9LHUucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sdS5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24odCxlKXtlfHxQKHQsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LHUucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7ZXx8UCh0LDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSx1LnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNnx0aGlzW3QrM108PDI0fSx1LnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSx1LnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMCwyMyw0KX0sdS5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITEsMjMsNCl9LHUucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMCw1Miw4KX0sdS5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCExLDUyLDgpfSx1LnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbih0LGUsbixyKXsodD0rdCxlfD0wLG58PTAscil8fE4odGhpcyx0LGUsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgbz0xLGk9MDtmb3IodGhpc1tlXT0yNTUmdDsrK2k8biYmKG8qPTI1Nik7KXRoaXNbZStpXT10L28mMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQsZSxuLHIpeyh0PSt0LGV8PTAsbnw9MCxyKXx8Tih0aGlzLHQsZSxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBvPW4tMSxpPTE7Zm9yKHRoaXNbZStvXT0yNTUmdDstLW8+PTAmJihpKj0yNTYpOyl0aGlzW2Urb109dC9pJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMSwyNTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0aGlzW2VdPTI1NSZ0LGUrMX0sdS5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsNjU1MzUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6SSh0aGlzLHQsZSwhMCksZSsyfSx1LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiw2NTUzNSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpJKHRoaXMsdCxlLCExKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2UrM109dD4+PjI0LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZV09MjU1JnQpOkQodGhpcyx0LGUsITApLGUrNH0sdS5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6RCh0aGlzLHQsZSwhMSksZSs0fSx1LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9K3QsZXw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7Tih0aGlzLHQsZSxuLG8tMSwtbyl9dmFyIGk9MCxhPTEscz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysraTxuJiYoYSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStpLTFdJiYocz0xKSx0aGlzW2UraV09KHQvYT4+MCktcyYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbih0LGUsbixyKXtpZih0PSt0LGV8PTAsIXIpe3ZhciBvPU1hdGgucG93KDIsOCpuLTEpO04odGhpcyx0LGUsbixvLTEsLW8pfXZhciBpPW4tMSxhPTEscz0wO2Zvcih0aGlzW2UraV09MjU1JnQ7LS1pPj0wJiYoYSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStpKzFdJiYocz0xKSx0aGlzW2UraV09KHQvYT4+MCktcyYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMSwxMjcsLTEyOCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0PDAmJih0PTI1NSt0KzEpLHRoaXNbZV09MjU1JnQsZSsxfSx1LnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6SSh0aGlzLHQsZSwhMCksZSsyfSx1LnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6SSh0aGlzLHQsZSwhMSksZSsyfSx1LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrM109dD4+PjI0KTpEKHRoaXMsdCxlLCEwKSxlKzR9LHUucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdDwwJiYodD00Mjk0OTY3Mjk1K3QrMSksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOkQodGhpcyx0LGUsITEpLGUrNH0sdS5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTSh0aGlzLHQsZSwhMCxuKX0sdS5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTSh0aGlzLHQsZSwhMSxuKX0sdS5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFUodGhpcyx0LGUsITAsbil9LHUucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBVKHRoaXMsdCxlLCExLG4pfSx1LnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKG58fChuPTApLHJ8fDA9PT1yfHwocj10aGlzLmxlbmd0aCksZT49dC5sZW5ndGgmJihlPXQubGVuZ3RoKSxlfHwoZT0wKSxyPjAmJnI8biYmKHI9bikscj09PW4pcmV0dXJuIDA7aWYoMD09PXQubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtyPnRoaXMubGVuZ3RoJiYocj10aGlzLmxlbmd0aCksdC5sZW5ndGgtZTxyLW4mJihyPXQubGVuZ3RoLWUrbik7dmFyIG8saT1yLW47aWYodGhpcz09PXQmJm48ZSYmZTxyKWZvcihvPWktMTtvPj0wOy0tbyl0W28rZV09dGhpc1tvK25dO2Vsc2UgaWYoaTwxZTN8fCF1LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKG89MDtvPGk7KytvKXRbbytlXT10aGlzW28rbl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbCh0LHRoaXMuc3ViYXJyYXkobixuK2kpLGUpO3JldHVybiBpfSx1LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlPyhyPWUsZT0wLG49dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgbiYmKHI9bixuPXRoaXMubGVuZ3RoKSwxPT09dC5sZW5ndGgpe3ZhciBvPXQuY2hhckNvZGVBdCgwKTtvPDI1NiYmKHQ9byl9aWYodm9pZCAwIT09ciYmInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIHImJiF1LmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKX1lbHNlIm51bWJlciI9PXR5cGVvZiB0JiYodCY9MjU1KTtpZihlPDB8fHRoaXMubGVuZ3RoPGV8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKG48PWUpcmV0dXJuIHRoaXM7dmFyIGk7aWYoZT4+Pj0wLG49dm9pZCAwPT09bj90aGlzLmxlbmd0aDpuPj4+MCx0fHwodD0wKSwibnVtYmVyIj09dHlwZW9mIHQpZm9yKGk9ZTtpPG47KytpKXRoaXNbaV09dDtlbHNle3ZhciBhPXUuaXNCdWZmZXIodCk/dDpGKG5ldyB1KHQscikudG9TdHJpbmcoKSkscz1hLmxlbmd0aDtmb3IoaT0wO2k8bi1lOysraSl0aGlzW2krZV09YVtpJXNdfXJldHVybiB0aGlzfTt2YXIgQj0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBxKHQpe3JldHVybiB0PDE2PyIwIit0LnRvU3RyaW5nKDE2KTp0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBGKHQsZSl7dmFyIG47ZT1lfHwxLzA7Zm9yKHZhciByPXQubGVuZ3RoLG89bnVsbCxpPVtdLGE9MDthPHI7KythKXtpZigobj10LmNoYXJDb2RlQXQoYSkpPjU1Mjk1JiZuPDU3MzQ0KXtpZighbyl7aWYobj41NjMxOSl7KGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKGErMT09PXIpeyhlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1vPW47Y29udGludWV9aWYobjw1NjMyMCl7KGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpLG89bjtjb250aW51ZX1uPTY1NTM2KyhvLTU1Mjk2PDwxMHxuLTU2MzIwKX1lbHNlIG8mJihlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtpZihvPW51bGwsbjwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO2kucHVzaChuKX1lbHNlIGlmKG48MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7aS5wdXNoKG4+PjZ8MTkyLDYzJm58MTI4KX1lbHNlIGlmKG48NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO2kucHVzaChuPj4xMnwyMjQsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfWVsc2V7aWYoIShuPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKGUtPTQpPDApYnJlYWs7aS5wdXNoKG4+PjE4fDI0MCxuPj4xMiY2M3wxMjgsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfX1yZXR1cm4gaX1mdW5jdGlvbiBIKHQpe3JldHVybiByLnRvQnl0ZUFycmF5KGZ1bmN0aW9uKHQpe2lmKCh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KHQpLnJlcGxhY2UoQiwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7dC5sZW5ndGglNCE9MDspdCs9Ij0iO3JldHVybiB0fSh0KSl9ZnVuY3Rpb24geih0LGUsbixyKXtmb3IodmFyIG89MDtvPHImJiEobytuPj1lLmxlbmd0aHx8bz49dC5sZW5ndGgpOysrbyllW28rbl09dFtvXTtyZXR1cm4gb319KS5jYWxsKHRoaXMsbig4NSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2UuYnl0ZUxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT1jKHQpLG49ZVswXSxyPWVbMV07cmV0dXJuIDMqKG4rcikvNC1yfSxlLnRvQnl0ZUFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlLG4scj1jKHQpLGE9clswXSxzPXJbMV0sdT1uZXcgaShmdW5jdGlvbih0LGUsbil7cmV0dXJuIDMqKGUrbikvNC1ufSgwLGEscykpLGw9MCxmPXM+MD9hLTQ6YTtmb3Iobj0wO248ZjtuKz00KWU9b1t0LmNoYXJDb2RlQXQobildPDwxOHxvW3QuY2hhckNvZGVBdChuKzEpXTw8MTJ8b1t0LmNoYXJDb2RlQXQobisyKV08PDZ8b1t0LmNoYXJDb2RlQXQobiszKV0sdVtsKytdPWU+PjE2JjI1NSx1W2wrK109ZT4+OCYyNTUsdVtsKytdPTI1NSZlOzI9PT1zJiYoZT1vW3QuY2hhckNvZGVBdChuKV08PDJ8b1t0LmNoYXJDb2RlQXQobisxKV0+PjQsdVtsKytdPTI1NSZlKTsxPT09cyYmKGU9b1t0LmNoYXJDb2RlQXQobildPDwxMHxvW3QuY2hhckNvZGVBdChuKzEpXTw8NHxvW3QuY2hhckNvZGVBdChuKzIpXT4+Mix1W2wrK109ZT4+OCYyNTUsdVtsKytdPTI1NSZlKTtyZXR1cm4gdX0sZS5mcm9tQnl0ZUFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXQubGVuZ3RoLG89biUzLGk9W10sYT0wLHM9bi1vO2E8czthKz0xNjM4MylpLnB1c2gobCh0LGEsYSsxNjM4Mz5zP3M6YSsxNjM4MykpOzE9PT1vPyhlPXRbbi0xXSxpLnB1c2gocltlPj4yXStyW2U8PDQmNjNdKyI9PSIpKToyPT09byYmKGU9KHRbbi0yXTw8OCkrdFtuLTFdLGkucHVzaChyW2U+PjEwXStyW2U+PjQmNjNdK3JbZTw8MiY2M10rIj0iKSk7cmV0dXJuIGkuam9pbigiIil9O2Zvcih2YXIgcj1bXSxvPVtdLGk9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksYT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIscz0wLHU9YS5sZW5ndGg7czx1OysrcylyW3NdPWFbc10sb1thLmNoYXJDb2RlQXQocyldPXM7ZnVuY3Rpb24gYyh0KXt2YXIgZT10Lmxlbmd0aDtpZihlJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTt2YXIgbj10LmluZGV4T2YoIj0iKTtyZXR1cm4tMT09PW4mJihuPWUpLFtuLG49PT1lPzA6NC1uJTRdfWZ1bmN0aW9uIGwodCxlLG4pe2Zvcih2YXIgbyxpLGE9W10scz1lO3M8bjtzKz0zKW89KHRbc108PDE2JjE2NzExNjgwKSsodFtzKzFdPDw4JjY1MjgwKSsoMjU1JnRbcysyXSksYS5wdXNoKHJbKGk9byk+PjE4JjYzXStyW2k+PjEyJjYzXStyW2k+PjYmNjNdK3JbNjMmaV0pO3JldHVybiBhLmpvaW4oIiIpfW9bIi0iLmNoYXJDb2RlQXQoMCldPTYyLG9bIl8iLmNoYXJDb2RlQXQoMCldPTYzfSxmdW5jdGlvbih0LGUpe2UucmVhZD1mdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpLGEscz04Km8tci0xLHU9KDE8PHMpLTEsYz11Pj4xLGw9LTcsZj1uP28tMTowLHA9bj8tMToxLGg9dFtlK2ZdO2ZvcihmKz1wLGk9aCYoMTw8LWwpLTEsaD4+PS1sLGwrPXM7bD4wO2k9MjU2KmkrdFtlK2ZdLGYrPXAsbC09OCk7Zm9yKGE9aSYoMTw8LWwpLTEsaT4+PS1sLGwrPXI7bD4wO2E9MjU2KmErdFtlK2ZdLGYrPXAsbC09OCk7aWYoMD09PWkpaT0xLWM7ZWxzZXtpZihpPT09dSlyZXR1cm4gYT9OYU46MS8wKihoPy0xOjEpO2ErPU1hdGgucG93KDIsciksaS09Y31yZXR1cm4oaD8tMToxKSphKk1hdGgucG93KDIsaS1yKX0sZS53cml0ZT1mdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGEscyx1LGM9OCppLW8tMSxsPSgxPDxjKS0xLGY9bD4+MSxwPTIzPT09bz9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsaD1yPzA6aS0xLGQ9cj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhzPWlzTmFOKGUpPzE6MCxhPWwpOihhPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtYSkpPDEmJihhLS0sdSo9MiksKGUrPWErZj49MT9wL3U6cCpNYXRoLnBvdygyLDEtZikpKnU+PTImJihhKyssdS89MiksYStmPj1sPyhzPTAsYT1sKTphK2Y+PTE/KHM9KGUqdS0xKSpNYXRoLnBvdygyLG8pLGErPWYpOihzPWUqTWF0aC5wb3coMixmLTEpKk1hdGgucG93KDIsbyksYT0wKSk7bz49ODt0W24raF09MjU1JnMsaCs9ZCxzLz0yNTYsby09OCk7Zm9yKGE9YTw8b3xzLGMrPW87Yz4wO3RbbitoXT0yNTUmYSxoKz1kLGEvPTI1NixjLT04KTt0W24raC1kXXw9MTI4Kmd9fSxmdW5jdGlvbih0LGUpe3ZhciBuPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1uLmNhbGwodCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjk5KX0sZnVuY3Rpb24odCxlLG4pe24oMzAwKTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlVSTFNlYXJjaFBhcmFtc30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuKDEwMSk7dmFyIHI9bigwKSxvPW4oMzAxKSxpPW4oMzUpLGE9bigxMTgpLHM9bigyOCksdT1uKDk5KSxjPW4oNDkpLGw9bigxMTkpLGY9bigxNCkscD1uKDMxKSxoPW4oMTEpLGQ9big2KSxnPW4oMTA4KSx2PW4oNTEpLHk9bigyKSgiaXRlcmF0b3IiKSxtPWMuc2V0LGI9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtcyIpLHg9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiksdz0vXCsvZyxrPUFycmF5KDQpLFM9ZnVuY3Rpb24odCl7cmV0dXJuIGtbdC0xXXx8KGtbdC0xXT1SZWdFeHAoIigoPzolW1xcZGEtZl17Mn0peyIrdCsifSkiLCJnaSIpKX0sRT1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX1jYXRjaChlKXtyZXR1cm4gdH19LFQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKHcsIiAiKSxuPTQ7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2godCl7Zm9yKDtuOyllPWUucmVwbGFjZShTKG4tLSksRSk7cmV0dXJuIGV9fSxqPS9bIScoKX5dfCUyMC9nLEE9eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisifSxPPWZ1bmN0aW9uKHQpe3JldHVybiBBW3RdfSxDPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZShqLE8pfSxMPWZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIG4scixvPWUuc3BsaXQoIiYiKSxpPTA7aTxvLmxlbmd0aDspKG49b1tpKytdKS5sZW5ndGgmJihyPW4uc3BsaXQoIj0iKSx0LnB1c2goe2tleTpUKHIuc2hpZnQoKSksdmFsdWU6VChyLmpvaW4oIj0iKSl9KSl9LFI9ZnVuY3Rpb24odCl7dGhpcy5lbnRyaWVzLmxlbmd0aD0wLEwodGhpcy5lbnRyaWVzLHQpfSxQPWZ1bmN0aW9uKHQsZSl7aWYodDxlKXRocm93IFR5cGVFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiKX0sTj11KGZ1bmN0aW9uKHQsZSl7bSh0aGlzLHt0eXBlOiJVUkxTZWFyY2hQYXJhbXNJdGVyYXRvciIsaXRlcmF0b3I6ZyhiKHQpLmVudHJpZXMpLGtpbmQ6ZX0pfSwiSXRlcmF0b3IiLGZ1bmN0aW9uKCl7dmFyIHQ9eCh0aGlzKSxlPXQua2luZCxuPXQuaXRlcmF0b3IubmV4dCgpLHI9bi52YWx1ZTtyZXR1cm4gbi5kb25lfHwobi52YWx1ZT0ia2V5cyI9PT1lP3Iua2V5OiJ2YWx1ZXMiPT09ZT9yLnZhbHVlOltyLmtleSxyLnZhbHVlXSksbn0pLEk9ZnVuY3Rpb24oKXtsKHRoaXMsSSwiVVJMU2VhcmNoUGFyYW1zIik7dmFyIHQsZSxuLHIsbyxpLGEscz1hcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCx1PXRoaXMsYz1bXTtpZihtKHUse3R5cGU6IlVSTFNlYXJjaFBhcmFtcyIsZW50cmllczpjLHVwZGF0ZVVSTDpmdW5jdGlvbigpe30sdXBkYXRlU2VhcmNoUGFyYW1zOlJ9KSx2b2lkIDAhPT1zKWlmKGQocykpaWYoImZ1bmN0aW9uIj09dHlwZW9mKHQ9dihzKSkpZm9yKGU9dC5jYWxsKHMpOyEobj1lLm5leHQoKSkuZG9uZTspe2lmKChvPShyPWcoaChuLnZhbHVlKSkpLm5leHQoKSkuZG9uZXx8KGk9ci5uZXh0KCkpLmRvbmV8fCFyLm5leHQoKS5kb25lKXRocm93IFR5cGVFcnJvcigiRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMiIpO2MucHVzaCh7a2V5Om8udmFsdWUrIiIsdmFsdWU6aS52YWx1ZSsiIn0pfWVsc2UgZm9yKGEgaW4gcylmKHMsYSkmJmMucHVzaCh7a2V5OmEsdmFsdWU6c1thXSsiIn0pO2Vsc2UgTChjLCJzdHJpbmciPT10eXBlb2Ygcz8iPyI9PT1zLmNoYXJBdCgwKT9zLnNsaWNlKDEpOnM6cysiIil9LEQ9SS5wcm90b3R5cGU7YShELHthcHBlbmQ6ZnVuY3Rpb24odCxlKXtQKGFyZ3VtZW50cy5sZW5ndGgsMik7dmFyIG49Yih0aGlzKTtuLmVudHJpZXMucHVzaCh7a2V5OnQrIiIsdmFsdWU6ZSsiIn0pLG4udXBkYXRlVVJMKCl9LGRlbGV0ZTpmdW5jdGlvbih0KXtQKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcyksbj1lLmVudHJpZXMscj10KyIiLG89MDtvPG4ubGVuZ3RoOyluW29dLmtleT09PXI/bi5zcGxpY2UobywxKTpvKys7ZS51cGRhdGVVUkwoKX0sZ2V0OmZ1bmN0aW9uKHQpe1AoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIGU9Yih0aGlzKS5lbnRyaWVzLG49dCsiIixyPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5rZXk9PT1uKXJldHVybiBlW3JdLnZhbHVlO3JldHVybiBudWxsfSxnZXRBbGw6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9W10sbz0wO288ZS5sZW5ndGg7bysrKWVbb10ua2V5PT09biYmci5wdXNoKGVbb10udmFsdWUpO3JldHVybiByfSxoYXM6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9MDtyPGUubGVuZ3RoOylpZihlW3IrK10ua2V5PT09bilyZXR1cm4hMDtyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKHQsZSl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT0hMSxhPXQrIiIscz1lKyIiLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1vW3VdKS5rZXk9PT1hJiYoaT9vLnNwbGljZSh1LS0sMSk6KGk9ITAsbi52YWx1ZT1zKSk7aXx8by5wdXNoKHtrZXk6YSx2YWx1ZTpzfSksci51cGRhdGVVUkwoKX0sc29ydDpmdW5jdGlvbigpe3ZhciB0LGUsbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT1vLnNsaWNlKCk7Zm9yKG8ubGVuZ3RoPTAsbj0wO248aS5sZW5ndGg7bisrKXtmb3IodD1pW25dLGU9MDtlPG47ZSsrKWlmKG9bZV0ua2V5PnQua2V5KXtvLnNwbGljZShlLDAsdCk7YnJlYWt9ZT09PW4mJm8ucHVzaCh0KX1yLnVwZGF0ZVVSTCgpfSxmb3JFYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPWIodGhpcykuZW50cmllcyxyPXAodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPTA7bzxuLmxlbmd0aDspcigoZT1uW28rK10pLnZhbHVlLGUua2V5LHRoaXMpfSxrZXlzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImtleXMiKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsInZhbHVlcyIpfSxlbnRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImVudHJpZXMiKX19LHtlbnVtZXJhYmxlOiEwfSksaShELHksRC5lbnRyaWVzKSxpKEQsInRvU3RyaW5nIixmdW5jdGlvbigpe2Zvcih2YXIgdCxlPWIodGhpcykuZW50cmllcyxuPVtdLHI9MDtyPGUubGVuZ3RoOyl0PWVbcisrXSxuLnB1c2goQyh0LmtleSkrIj0iK0ModC52YWx1ZSkpO3JldHVybiBuLmpvaW4oIiYiKX0se2VudW1lcmFibGU6ITB9KSxzKEksIlVSTFNlYXJjaFBhcmFtcyIpLHIoe2dsb2JhbDohMCxmb3JjZWQ6IW99LHtVUkxTZWFyY2hQYXJhbXM6SX0pLHQuZXhwb3J0cz17VVJMU2VhcmNoUGFyYW1zOkksZ2V0U3RhdGU6Yn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigyKSxpPW4oMjcpLGE9bygiaXRlcmF0b3IiKTt0LmV4cG9ydHM9IXIoZnVuY3Rpb24oKXt2YXIgdD1uZXcgVVJMKCJiP2U9MSIsImh0dHA6Ly9hIiksZT10LnNlYXJjaFBhcmFtcztyZXR1cm4gdC5wYXRobmFtZT0iYyUyMGQiLGkmJiF0LnRvSlNPTnx8IWUuc29ydHx8Imh0dHA6Ly9hL2MlMjBkP2U9MSIhPT10LmhyZWZ8fCIxIiE9PWUuZ2V0KCJlIil8fCJhPTEiIT09U3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoIj9hPTEiKSl8fCFlW2FdfHwiYSIhPT1uZXcgVVJMKCJodHRwczovL2FAYiIpLnVzZXJuYW1lfHwiYiIhPT1uZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoImE9YiIpKS5nZXQoImEiKXx8InhuLS1lMWF5YmMiIT09bmV3IFVSTCgiaHR0cDovL9GC0LXRgdGCIikuaG9zdHx8IiMlRDAlQjEiIT09bmV3IFVSTCgiaHR0cDovL2Ej0LEiKS5oYXNofSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5yKGUpO3ZhciByPW4oOCksbz1uLm4ociksaT1uKDYxKSxhPW4ubihpKSxzPW4oOSksdT1uLm4ocyksYz1uKDIwKSxsPW4ubihjKSxmPW4oNykscD1uLm4oZiksaD1uKDEyKSxkPW4ubihoKSxnPW4oMTI2KSx2PW4ubihnKSx5PW4oMTkpLG09bi5uKHkpLGI9bigzNikseD1uLm4oYiksdz1uKDE1KSxrPW4ubih3KSxTPW4oMTApLEU9bi5uKFMpLFQ9KG4oMTYpLG4oODApKSxqPW4ubihUKTtmdW5jdGlvbiBBKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLG49aigpKHQucmVwbGFjZSgvW14wLTldL2dpLCIiKSwxMCk7cmV0dXJuIG58fGV9ZnVuY3Rpb24gTyh0KXt2YXIgZT0iIixuPXQuY29udGVudHMoKTtpZihuLmxlbmd0aD4wKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cis9MSl7dmFyIG89bi5nZXQocik7Mz09PW8ubm9kZVR5cGUmJm8uZGF0YSYmKGUrPW8uZGF0YSl9cmV0dXJuIGV9ZnVuY3Rpb24gQyh0LGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcigic2VsZWN0b3IgcmVxdWlyZWQiKTtyZXR1cm4gdChlKS5sZW5ndGg+MCYmImltZyI9PT10KGUpLnByb3AoInRhZ05hbWUiKS50b0xvd2VyQ2FzZSgpP3QoZSkuYXR0cigiYWx0Iil8fCIiOnQoZSkudGV4dCgpLnJlcGxhY2UoL1xuLywiIil9ZnVuY3Rpb24gTCh0LGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcigic2VsZWN0b3IgcmVxdWlyZWQiKTt2YXIgbj0iIjtpZih0KGUpLmxlbmd0aD4wKXt2YXIgcj10KGUpLnByb3AoInRhZ05hbWUiKS50b0xvd2VyQ2FzZSgpO249ImlucHV0Ij09PXI/dChlKS52YWwoKToibWV0YSI9PT1yP3QoZSkuYXR0cigiY29udGVudCIpfHwiIjpPKHQoZSkpfXJldHVybiBuPW4ucmVwbGFjZSgvW14wLTldL2csIiIpLGooKShuLDEwKX12YXIgUj1uKDM3KSxQPW4ubihSKSxOPW4oMzgpLEk9bi5uKE4pLEQ9bigzOSksXz1uLm4oRCksTT1uKDQwKSxVPW4ubihNKSxCPW4oNDEpLHE9bi5uKEIpLEY9big0MiksSD1uLm4oRiksej1uKDYyKSxXPW4ubih6KTtmdW5jdGlvbiAkKHQsZSl7dmFyIG47aWYodm9pZCAwPT09VS5hfHxudWxsPT1fKCkodCkpe2lmKEkoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBZKHQsZSk7dmFyIHI9SCgpKG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKS5jYWxsKG4sOCwtMSk7Ik9iamVjdCI9PT1yJiZ0LmNvbnN0cnVjdG9yJiYocj10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKCJNYXAiPT09cnx8IlNldCI9PT1yKXJldHVybiBxKCkodCk7aWYoIkFyZ3VtZW50cyI9PT1yfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSlyZXR1cm4gWSh0LGUpfSh0KSl8fGUmJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe24mJih0PW4pO3ZhciByPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBpLGE9ITAscz0hMTtyZXR1cm57czpmdW5jdGlvbigpe249UCgpKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIGE9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7cz0hMCxpPXR9LGY6ZnVuY3Rpb24oKXt0cnl7YXx8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IGl9fX19ZnVuY3Rpb24gWSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIFYodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJTS1XjgYzkuI3mraPjgafjgZkiKTtpZigwPT09VygpKHQpLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNLVemgheebruaVsOOBjOS4jeato+OBp+OBmSIpfXZhciBHPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj1lLiQscj1lLm5hbWUsbz1lLnByaWNlO3AoKSh0aGlzLHQpLHRoaXMuJD1uLHRoaXMubmFtZVNlbGVjdG9yPXJ8fCIiLHRoaXMucHJpY2VTZWxlY3Rvcj1vfHwiIn1yZXR1cm4gZCgpKHQsW3trZXk6ImdldFB1cmNoYXNhYmxlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hMH19LHtrZXk6ImV4ZWN1dGUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9ITA7dHJ5e3JldHVybiB0PXRoaXMuZ2V0SXRlbSgpLGU9dGhpcy5nZXRTa3VSb3dzKHQpLHI9dGhpcy5nZXRQdXJjaGFzYWJsZSh7aXRlbTp0LHNrdVJvd3M6ZX0pLGZ1bmN0aW9uKHQpe3ZhciBlPXQuaXRlbSxuPXQuc2t1Um93cztpZighZSl0aHJvdyBuZXcgRXJyb3IoIuOCouOCpOODhuODoOOBjOS4jeato+OBp+OBmSIpO2lmKCFlLm5hbWUpdGhyb3cgbmV3IEVycm9yKCLjgqLjgqTjg4bjg6DlkI3liY3jgYzkuI3mraPjgafjgZkiKTtpZighKG4mJjAhPT1uLmxlbmd0aHx8ZS5wcmljZSkpdGhyb3cgbmV3IEVycm9yKCLjgqLjgqTjg4bjg6Dph5HpoY3jgYzkuI3mraPjgafjgZkiKTtpZihuKXt2YXIgcixvPSQobik7dHJ5e2ZvcihvLnMoKTshKHI9by5uKCkpLmRvbmU7KXtWKHIudmFsdWUpfX1jYXRjaCh0KXtvLmUodCl9ZmluYWxseXtvLmYoKX19fSh7aXRlbTp0LHNrdVJvd3M6ZX0pLHtpdGVtOnQsc2t1Um93czplLHB1cmNoYXNhYmxlOnJ9fWNhdGNoKHQpe249dH12YXIgbz17cHVyY2hhc2FibGU6cn07cmV0dXJuIHQmJihvLml0ZW09dCksZSYmKG8uc2t1Um93cz1lKSxuJiYoby5lcnJvcj1uKSxvfX0se2tleToiZ2V0SXRlbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD17bmFtZToiIixwcmljZTowfTt0aGlzLm5hbWVTZWxlY3Rvcj90Lm5hbWU9dGhpcy5nZXRJdGVtTmFtZShDKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3RvcikpOnQubmFtZT10aGlzLmdldEl0ZW1OYW1lKCksdGhpcy5wcmljZVNlbGVjdG9yP3QucHJpY2U9dGhpcy5nZXRJdGVtUHJpY2UoTCh0aGlzLiQsdGhpcy5wcmljZVNlbGVjdG9yKSk6dC5wcmljZT10aGlzLmdldEl0ZW1QcmljZSgpO3ZhciBlPXRoaXMuZ2V0SXRlbUNvZGUoKTtyZXR1cm4gZSYmKHQuY29kZT1lKSx0fX0se2tleToiZ2V0SXRlbU5hbWUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiIiO3JldHVybiB0aGlzLm5hbWVTZWxlY3Rvcj9DKHRoaXMuJCx0aGlzLm5hbWVTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1QcmljZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MDtyZXR1cm4gdGhpcy5wcmljZVNlbGVjdG9yP0wodGhpcy4kLHRoaXMucHJpY2VTZWxlY3Rvcik6dH19LHtrZXk6ImdldEl0ZW1Db2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiIifX0se2tleToiZ2V0U2t1Um93cyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuW119fV0pLHR9KCksSz1uKDEyNyksWD1uLm4oSyksSj1uKDEyOCk7ZnVuY3Rpb24gUSgpe3JldHVybiB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyYmd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZX12YXIgWj1uKDEyOSksdHQ9bi5uKFopLGV0PW4oMTMwKSxudD1uLm4oZXQpLHJ0PW4oNTMpLG90PW4ubihydCksaXQ9InppZ3phZyI7dmFyIGF0PW4oMjUpLHN0PSJ1c2FnZSIsdXQ9InppZ3phZy1mbG93LWNvbnRyb2xsZWQiO2Z1bmN0aW9uIGN0KHQsZSl7d2luZG93LiQmJmZ1bmN0aW9uKG4pe3ZhciByPW4odCk7aWYociYmci5sZW5ndGg+MClmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rPTEpe3ZhciBpPXIuZ2V0KG8pO2kuaGFzQXR0cmlidXRlKHV0KXx8KCJjbGljayI9PT1lP2kub25jbGljaz1udWxsOiJzdWJtaXQiPT09ZSYmKGkub25zdWJtaXQ9bnVsbCksIm9mZiJpbiBuKGkpP24oaSkub2ZmKGUpOiJ1bmJpbmQiaW4gbihpKSYmbihpKS51bmJpbmQoZSkpfX0od2luZG93LiQpfXZhciBsdD17cHJlc2VydmVPcmlnaW5hbEV2ZW50OiExLGRpc2FibGVQb2ludGVyRXZlbnQ6ITEsZGlzYWJsZVJlcG9ydDohMX07dmFyIGZ0PXtkaXNhYmxlUmVwb3J0OiExfTtmdW5jdGlvbiBwdCh0KXt2YXIgZT1udCgpKGZ1bmN0aW9uKCl7dmFyIG4scixvPXdpbmRvdy56aWd6YWc7ImRlYWN0aXZhdGVkIj09PShuPXN0LHI9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGl0KSxKU09OLnBhcnNlKHI/ZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IocikpOiJ7fSIpW25dKXx8by5pc0RlbmllZHx8KHQoKSxjbGVhckludGVydmFsKGUpKX0sNTAwKX1mdW5jdGlvbiBodCh0LGUpe3ZhciBuPXdpbmRvdy56aWd6YWc7dHQoKShmdW5jdGlvbigpey9DaHJvbWUvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpJiYwPT09dChlKS5sZW5ndGgmJm4mJiJpdGVtIj09PW4uZGlzY292ZXJ5U3RhdHVzJiZhdC5hLmVycm9yKCIiLmNvbmNhdChlLCI6IOOCouOCpOODhuODoOODmuODvOOCuOOBp+ipsuW9k+OBmeOCi+ODleODreODvOWItuW+oeeUqOOBruimgee0oOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyIpKX0sNWUzKX12YXIgZHQ9e29uQ2hhbmdlc1JlYWR5OmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbImphIl07Qm9vbGVhbihFKCkoZSkuY2FsbChlLGZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybi0xIT09WCgpKGU9USgpKS5jYWxsKGUsdCl9KSl8fHB0KGZ1bmN0aW9uKCl7dChKKX0pfSxvdmVycmlkZUNsaWNrRXZlbnQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpsdDtpZigocj1vdCgpKG90KCkoe30sbHQpLHIpKS5kaXNhYmxlUmVwb3J0fHxodCh0LGUpLHIuZGlzYWJsZVBvaW50ZXJFdmVudCl7aWYod2luZG93LmRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKHV0KSlyZXR1cm47dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtvLmlubmVySFRNTD0iXG4gICAgIi5jb25jYXQoZSwiIHtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH0iKTt2YXIgaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHQiKTtyZXR1cm4gaSYmaS5wYXJlbnROb2RlJiZpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG8saSksdChkb2N1bWVudCkub24oImNsaWNrIixmdW5jdGlvbihyKXtyLnRhcmdldCYmdChyLnRhcmdldCkuY2xvc2VzdCh0KGUpLnBhcmVudCgpKS5sZW5ndGg+MCYmbihyKX0pLHZvaWQgd2luZG93LmRvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKHV0LCIxIil9ci5wcmVzZXJ2ZU9yaWdpbmFsRXZlbnR8fGN0KGUsImNsaWNrIik7Zm9yKHZhciBhPXQoZSkscz0wO3M8YS5sZW5ndGg7cys9MSl7dmFyIHU9YS5nZXQocyk7dS5oYXNBdHRyaWJ1dGUodXQpfHwodS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24odCl7ci5wcmVzZXJ2ZU9yaWdpbmFsRXZlbnR8fCh0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSksbih0KX0sITApLHUuc2V0QXR0cmlidXRlKHV0LCIxIikpfX0sb3ZlcnJpZGVTdWJtaXRFdmVudDpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOmZ0OyhyPW90KCkob3QoKSh7fSxmdCkscikpLmRpc2FibGVSZXBvcnR8fGh0KHQsZSksY3QoZSwic3VibWl0Iik7dmFyIG89dChlKTtpZihvJiZvLmxlbmd0aD4wKWZvcih2YXIgaT0wO2k8by5sZW5ndGg7aSs9MSl7dmFyIGE9by5nZXQoaSk7YS5oYXNBdHRyaWJ1dGUodXQpfHwodChhKS5vbigic3VibWl0IixuKSxhLnNldEF0dHJpYnV0ZSh1dCwiMSIpKX19LHVuYmluZE9yaWdpbmFsSlF1ZXJ5RXZlbnRzOmN0fTt2YXIgZ3Q9big4MSksdnQ9bi5uKGd0KSx5dD1uKDEzMSksbXQ9bi5uKHl0KSxidD1uKDEzMikseHQ9bi5uKGJ0KSx3dD1uKDgyKSxrdD1uLm4od3QpO2Z1bmN0aW9uIFN0KHQpe3JldHVybihTdD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIEV0KHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiBUdCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/T2JqZWN0KGFyZ3VtZW50c1tlXSk6e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7RXQodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24ganQodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBBdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIE90KHQsZSxuKXtyZXR1cm4gZSYmQXQodC5wcm90b3R5cGUsZSksbiYmQXQodCxuKSx0fWZ1bmN0aW9uIEN0KHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBMdCh0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9PVN0KGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9DdCh0KTplfWZ1bmN0aW9uIFJ0KHQpe3JldHVybihSdD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gUHQodCxlKXtyZXR1cm4oUHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIE50KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJlB0KHQsZSl9dmFyIEl0PXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgibG9nIix0KX0sd2FybjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgid2FybiIsdCl9LGVycm9yOmZ1bmN0aW9uKHQpe3RoaXMub3V0cHV0KCJlcnJvciIsdCl9LG91dHB1dDpmdW5jdGlvbih0LGUpe2NvbnNvbGUmJmNvbnNvbGVbdF0mJmNvbnNvbGVbdF0uYXBwbHkoY29uc29sZSxlKX19LER0PW5ldyhmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2p0KHRoaXMsdCksdGhpcy5pbml0KGUsbil9cmV0dXJuIE90KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1lLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj10fHxJdCx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixUdCh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdChlLCI6Iil9LHRoaXMub3B0aW9ucykpfX1dKSx0fSgpKSxfdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtqdCh0aGlzLHQpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBPdCh0LFt7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiB0LnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbih0KXtuLm9ic2VydmVyc1t0XT1uLm9ic2VydmVyc1t0XXx8W10sbi5vYnNlcnZlcnNbdF0ucHVzaChlKX0pLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5vYnNlcnZlcnNbdF0mJihlP3RoaXMub2JzZXJ2ZXJzW3RdPXRoaXMub2JzZXJ2ZXJzW3RdLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KTpkZWxldGUgdGhpcy5vYnNlcnZlcnNbdF0pfX0se2tleToiZW1pdCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2lmKHRoaXMub2JzZXJ2ZXJzW3RdKXt2YXIgbz1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbdF0pO28uZm9yRWFjaChmdW5jdGlvbih0KXt0LmFwcGx5KHZvaWQgMCxuKX0pfWlmKHRoaXMub2JzZXJ2ZXJzWyIqIl0pe3ZhciBpPVtdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1siKiJdKTtpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hcHBseShlLFt0XS5jb25jYXQobikpfSl9fX1dKSx0fSgpO2Z1bmN0aW9uIE10KCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7dD1uLGU9cn0pO3JldHVybiBuLnJlc29sdmU9dCxuLnJlamVjdD1lLG59ZnVuY3Rpb24gVXQodCl7cmV0dXJuIG51bGw9PXQ/IiI6IiIrdH1mdW5jdGlvbiBCdCh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBvKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIGk9InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7aS5sZW5ndGg+MTspe2lmKG8oKSlyZXR1cm57fTt2YXIgYT1yKGkuc2hpZnQoKSk7IXRbYV0mJm4mJih0W2FdPW5ldyBuKSx0PXRbYV19cmV0dXJuIG8oKT97fTp7b2JqOnQsazpyKGkuc2hpZnQoKSl9fWZ1bmN0aW9uIHF0KHQsZSxuKXt2YXIgcj1CdCh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24gRnQodCxlKXt2YXIgbj1CdCh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX1mdW5jdGlvbiBIdCh0LGUsbil7dmFyIHI9RnQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkZ0KGUsbil9ZnVuY3Rpb24genQodCxlLG4pe2Zvcih2YXIgciBpbiBlKSJfX3Byb3RvX18iIT09ciYmImNvbnN0cnVjdG9yIiE9PXImJihyIGluIHQ/InN0cmluZyI9PXR5cGVvZiB0W3JdfHx0W3JdaW5zdGFuY2VvZiBTdHJpbmd8fCJzdHJpbmciPT10eXBlb2YgZVtyXXx8ZVtyXWluc3RhbmNlb2YgU3RyaW5nP24mJih0W3JdPWVbcl0pOnp0KHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFd0KHQpe3JldHVybiB0LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfXZhciAkdD17IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7IiwiLyI6IiYjeDJGOyJ9O2Z1bmN0aW9uIFl0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLGZ1bmN0aW9uKHQpe3JldHVybiAkdFt0XX0pOnR9dmFyIFZ0PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpPi0xLEd0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e25zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6InRyYW5zbGF0aW9uIn07cmV0dXJuIGp0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZfdC5jYWxsKEN0KG4pKSxuLmRhdGE9dHx8e30sbi5vcHRpb25zPXIsdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxufXJldHVybiBOdChlLF90KSxPdChlLFt7a2V5OiJhZGROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTwwJiZ0aGlzLm9wdGlvbnMubnMucHVzaCh0KX19LHtrZXk6InJlbW92ZU5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5ucy5pbmRleE9mKHQpO2U+LTEmJnRoaXMub3B0aW9ucy5ucy5zcGxpY2UoZSwxKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LG89dm9pZCAwIT09ci5rZXlTZXBhcmF0b3I/ci5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixpPVt0LGVdO3JldHVybiBuJiYic3RyaW5nIiE9dHlwZW9mIG4mJihpPWkuY29uY2F0KG4pKSxuJiYic3RyaW5nIj09dHlwZW9mIG4mJihpPWkuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihpPXQuc3BsaXQoIi4iKSksRnQodGhpcy5kYXRhLGkpfX0se2tleToiYWRkUmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTp7c2lsZW50OiExfSxpPXRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7dm9pZCAwPT09aSYmKGk9Ii4iKTt2YXIgYT1bdCxlXTtuJiYoYT1hLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocj1lLGU9KGE9dC5zcGxpdCgiLiIpKVsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGUpLHF0KHRoaXMuZGF0YSxhLHIpLG8uc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbixyKX19LHtrZXk6ImFkZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7c2lsZW50OiExfTtmb3IodmFyIG8gaW4gbikic3RyaW5nIiE9dHlwZW9mIG5bb10mJiJbb2JqZWN0IEFycmF5XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG5bb10pfHx0aGlzLmFkZFJlc291cmNlKHQsZSxvLG5bb10se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0sYT1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0oYT10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIHM9RnQodGhpcy5kYXRhLGEpfHx7fTtyP3p0KHMsbixvKTpzPVR0KHt9LHMsbikscXQodGhpcy5kYXRhLGEscyksaS5zaWxlbnR8fHRoaXMuZW1pdCgiYWRkZWQiLHQsZSxuKX19LHtrZXk6InJlbW92ZVJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuaGFzUmVzb3VyY2VCdW5kbGUodCxlKSYmZGVsZXRlIHRoaXMuZGF0YVt0XVtlXSx0aGlzLnJlbW92ZU5hbWVzcGFjZXMoZSksdGhpcy5lbWl0KCJyZW1vdmVkIix0LGUpfX0se2tleToiaGFzUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZ2V0UmVzb3VyY2UodCxlKX19LHtrZXk6ImdldFJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBlfHwoZT10aGlzLm9wdGlvbnMuZGVmYXVsdE5TKSwidjEiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk/VHQoe30se30sdGhpcy5nZXRSZXNvdXJjZSh0LGUpKTp0aGlzLmdldFJlc291cmNlKHQsZSl9fSx7a2V5OiJnZXREYXRhQnlMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVt0XX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX1dKSxlfSgpLEt0PXtwcm9jZXNzb3JzOnt9LGFkZFBvc3RQcm9jZXNzb3I6ZnVuY3Rpb24odCl7dGhpcy5wcm9jZXNzb3JzW3QubmFtZV09dH0saGFuZGxlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9dGhpcztyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2kucHJvY2Vzc29yc1t0XSYmKGU9aS5wcm9jZXNzb3JzW3RdLnByb2Nlc3MoZSxuLHIsbykpfSksZX19LFh0PXt9LEp0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scixvLGksYT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307cmV0dXJuIGp0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZfdC5jYWxsKEN0KG4pKSxyPVsicmVzb3VyY2VTdG9yZSIsImxhbmd1YWdlVXRpbHMiLCJwbHVyYWxSZXNvbHZlciIsImludGVycG9sYXRvciIsImJhY2tlbmRDb25uZWN0b3IiLCJpMThuRm9ybWF0IiwidXRpbHMiXSxvPXQsaT1DdChuKSxyLmZvckVhY2goZnVuY3Rpb24odCl7b1t0XSYmKGlbdF09b1t0XSl9KSxuLm9wdGlvbnM9YSx2b2lkIDA9PT1uLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYobi5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLG4ubG9nZ2VyPUR0LmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIE50KGUsX3QpLE90KGUsW3trZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0KXt0JiYodGhpcy5sYW5ndWFnZT10KX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fSxuPXRoaXMucmVzb2x2ZSh0LGUpO3JldHVybiBuJiZ2b2lkIDAhPT1uLnJlc319LHtrZXk6ImV4dHJhY3RGcm9tS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXZvaWQgMCE9PWUubnNTZXBhcmF0b3I/ZS5uc1NlcGFyYXRvcjp0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7dm9pZCAwPT09biYmKG49IjoiKTt2YXIgcj12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLG89ZS5uc3x8dGhpcy5vcHRpb25zLmRlZmF1bHROUztpZihuJiZ0LmluZGV4T2Yobik+LTEpe3ZhciBpPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7aWYoaSYmaS5sZW5ndGg+MClyZXR1cm57a2V5OnQsbmFtZXNwYWNlczpvfTt2YXIgYT10LnNwbGl0KG4pOyhuIT09cnx8bj09PXImJnRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGFbMF0pPi0xKSYmKG89YS5zaGlmdCgpKSx0PWEuam9pbihyKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIG8mJihvPVtvXSkse2tleTp0LG5hbWVzcGFjZXM6b319fSx7a2V5OiJ0cmFuc2xhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO2lmKCJvYmplY3QiIT09U3QoZSkmJnRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlciYmKGU9dGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cykpLGV8fChlPXt9KSxudWxsPT10KXJldHVybiIiO0FycmF5LmlzQXJyYXkodCl8fCh0PVtTdHJpbmcodCldKTt2YXIgbz12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGk9dGhpcy5leHRyYWN0RnJvbUtleSh0W3QubGVuZ3RoLTFdLGUpLGE9aS5rZXkscz1pLm5hbWVzcGFjZXMsdT1zW3MubGVuZ3RoLTFdLGM9ZS5sbmd8fHRoaXMubGFuZ3VhZ2UsbD1lLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlfHx0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU7aWYoYyYmImNpbW9kZSI9PT1jLnRvTG93ZXJDYXNlKCkpe2lmKGwpe3ZhciBmPWUubnNTZXBhcmF0b3J8fHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtyZXR1cm4gdStmK2F9cmV0dXJuIGF9dmFyIHA9dGhpcy5yZXNvbHZlKHQsZSksaD1wJiZwLnJlcyxkPXAmJnAudXNlZEtleXx8YSxnPXAmJnAuZXhhY3RVc2VkS2V5fHxhLHY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoKSx5PVsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXSxtPXZvaWQgMCE9PWUuam9pbkFycmF5cz9lLmpvaW5BcnJheXM6dGhpcy5vcHRpb25zLmpvaW5BcnJheXMsYj0hdGhpcy5pMThuRm9ybWF0fHx0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3QseD0ic3RyaW5nIiE9dHlwZW9mIGgmJiJib29sZWFuIiE9dHlwZW9mIGgmJiJudW1iZXIiIT10eXBlb2YgaDtpZihiJiZoJiZ4JiZ5LmluZGV4T2Yodik8MCYmKCJzdHJpbmciIT10eXBlb2YgbXx8IltvYmplY3QgQXJyYXldIiE9PXYpKXtpZighZS5yZXR1cm5PYmplY3RzJiYhdGhpcy5vcHRpb25zLnJldHVybk9iamVjdHMpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImFjY2Vzc2luZyBhbiBvYmplY3QgLSBidXQgcmV0dXJuT2JqZWN0cyBvcHRpb25zIGlzIG5vdCBlbmFibGVkISIpLHRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXI/dGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlcihkLGgsZSk6ImtleSAnIi5jb25jYXQoYSwiICgiKS5jb25jYXQodGhpcy5sYW5ndWFnZSwiKScgcmV0dXJuZWQgYW4gb2JqZWN0IGluc3RlYWQgb2Ygc3RyaW5nLiIpO2lmKG8pe3ZhciB3PSJbb2JqZWN0IEFycmF5XSI9PT12LGs9dz9bXTp7fSxTPXc/ZzpkO2Zvcih2YXIgRSBpbiBoKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoLEUpKXt2YXIgVD0iIi5jb25jYXQoUykuY29uY2F0KG8pLmNvbmNhdChFKTtrW0VdPXRoaXMudHJhbnNsYXRlKFQsVHQoe30sZSx7am9pbkFycmF5czohMSxuczpzfSkpLGtbRV09PT1UJiYoa1tFXT1oW0VdKX1oPWt9fWVsc2UgaWYoYiYmInN0cmluZyI9PXR5cGVvZiBtJiYiW29iamVjdCBBcnJheV0iPT09dikoaD1oLmpvaW4obSkpJiYoaD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsdCxlLG4pKTtlbHNle3ZhciBqPSExLEE9ITE7aWYoIXRoaXMuaXNWYWxpZExvb2t1cChoKSYmdm9pZCAwIT09ZS5kZWZhdWx0VmFsdWUpe2lmKGo9ITAsdm9pZCAwIT09ZS5jb3VudCl7dmFyIE89dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoYyxlLmNvdW50KTtoPWVbImRlZmF1bHRWYWx1ZSIuY29uY2F0KE8pXX1ofHwoaD1lLmRlZmF1bHRWYWx1ZSl9dGhpcy5pc1ZhbGlkTG9va3VwKGgpfHwoQT0hMCxoPWEpO3ZhciBDPWUuZGVmYXVsdFZhbHVlJiZlLmRlZmF1bHRWYWx1ZSE9PWgmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKEF8fGp8fEMpe2lmKHRoaXMubG9nZ2VyLmxvZyhDPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixjLHUsYSxDP2UuZGVmYXVsdFZhbHVlOmgpLG8pe3ZhciBMPXRoaXMucmVzb2x2ZShhLFR0KHt9LGUse2tleVNlcGFyYXRvcjohMX0pKTtMJiZMLnJlcyYmdGhpcy5sb2dnZXIud2FybigiU2VlbXMgdGhlIGxvYWRlZCB0cmFuc2xhdGlvbnMgd2VyZSBpbiBmbGF0IEpTT04gZm9ybWF0IGluc3RlYWQgb2YgbmVzdGVkLiBFaXRoZXIgc2V0IGtleVNlcGFyYXRvcjogZmFsc2Ugb24gaW5pdCBvciBtYWtlIHN1cmUgeW91ciB0cmFuc2xhdGlvbnMgYXJlIHB1Ymxpc2hlZCBpbiBuZXN0ZWQgZm9ybWF0LiIpfXZhciBSPVtdLFA9dGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGUubG5nfHx0aGlzLmxhbmd1YWdlKTtpZigiZmFsbGJhY2siPT09dGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nVG8mJlAmJlBbMF0pZm9yKHZhciBOPTA7TjxQLmxlbmd0aDtOKyspUi5wdXNoKFBbTl0pO2Vsc2UiYWxsIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvP1I9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShlLmxuZ3x8dGhpcy5sYW5ndWFnZSk6Ui5wdXNoKGUubG5nfHx0aGlzLmxhbmd1YWdlKTt2YXIgST1mdW5jdGlvbih0LG4pe3Iub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcj9yLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXIodCx1LG4sQz9lLmRlZmF1bHRWYWx1ZTpoLEMsZSk6ci5iYWNrZW5kQ29ubmVjdG9yJiZyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcmJnIuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyh0LHUsbixDP2UuZGVmYXVsdFZhbHVlOmgsQyxlKSxyLmVtaXQoIm1pc3NpbmdLZXkiLHQsdSxuLGgpfTtpZih0aGlzLm9wdGlvbnMuc2F2ZU1pc3Npbmcpe3ZhciBEPXZvaWQgMCE9PWUuY291bnQmJiJzdHJpbmciIT10eXBlb2YgZS5jb3VudDt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZEP1IuZm9yRWFjaChmdW5jdGlvbih0KXtyLnBsdXJhbFJlc29sdmVyLmdldFBsdXJhbEZvcm1zT2ZLZXkodCxhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBJKFt0XSxlKX0pfSk6SShSLGEpfX1oPXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oaCx0LGUscCxuKSxBJiZoPT09YSYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKGg9IiIuY29uY2F0KHUsIjoiKS5jb25jYXQoYSkpLEEmJnRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyJiYoaD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcihoKSl9cmV0dXJuIGh9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsbixyLnVzZWRMbmcsci51c2VkTlMsci51c2VkS2V5LHtyZXNvbHZlZDpyfSk7ZWxzZSBpZighbi5za2lwSW50ZXJwb2xhdGlvbil7bi5pbnRlcnBvbGF0aW9uJiZ0aGlzLmludGVycG9sYXRvci5pbml0KFR0KHt9LG4se2ludGVycG9sYXRpb246VHQoe30sdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24sbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgYSxzPW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlc3x8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO2lmKHMpe3ZhciB1PXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YT11JiZ1Lmxlbmd0aH12YXIgYz1uLnJlcGxhY2UmJiJzdHJpbmciIT10eXBlb2Ygbi5yZXBsYWNlP24ucmVwbGFjZTpuO2lmKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMmJihjPVR0KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMsYykpLHQ9dGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUodCxjLG4ubG5nfHx0aGlzLmxhbmd1YWdlLG4pLHMpe3ZhciBsPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YTwobCYmbC5sZW5ndGgpJiYobi5uZXN0PSExKX0hMSE9PW4ubmVzdCYmKHQ9dGhpcy5pbnRlcnBvbGF0b3IubmVzdCh0LGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkodCksYT0wO2E8dDthKyspclthXT1hcmd1bWVudHNbYV07cmV0dXJuIG8mJm9bMF09PT1yWzBdJiYhbi5jb250ZXh0PyhpLmxvZ2dlci53YXJuKCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAiLmNvbmNhdChyWzBdLCIgaW4ga2V5OiAiKS5jb25jYXQoZVswXSkpLG51bGwpOmkudHJhbnNsYXRlLmFwcGx5KGksci5jb25jYXQoW2VdKSl9LG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGY9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLHA9InN0cmluZyI9PXR5cGVvZiBmP1tmXTpmO3JldHVybiBudWxsIT10JiZwJiZwLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9S3QuaGFuZGxlKHAsdCxlLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkP1R0KHtpMThuUmVzb2x2ZWQ6cn0sbik6bix0aGlzKSksdH19LHtrZXk6InJlc29sdmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT10aGlzLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWEuaXNWYWxpZExvb2t1cChlKSl7dmFyIHU9YS5leHRyYWN0RnJvbUtleSh0LHMpLGM9dS5rZXk7bj1jO3ZhciBsPXUubmFtZXNwYWNlczthLm9wdGlvbnMuZmFsbGJhY2tOUyYmKGw9bC5jb25jYXQoYS5vcHRpb25zLmZhbGxiYWNrTlMpKTt2YXIgZj12b2lkIDAhPT1zLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIHMuY291bnQscD12b2lkIDAhPT1zLmNvbnRleHQmJiJzdHJpbmciPT10eXBlb2Ygcy5jb250ZXh0JiYiIiE9PXMuY29udGV4dCxoPXMubG5ncz9zLmxuZ3M6YS5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShzLmxuZ3x8YS5sYW5ndWFnZSxzLmZhbGxiYWNrTG5nKTtsLmZvckVhY2goZnVuY3Rpb24odCl7YS5pc1ZhbGlkTG9va3VwKGUpfHwoaT10LCFYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV0mJmEudXRpbHMmJmEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UoaSkmJihYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV09ITAsYS5sb2dnZXIud2Fybigna2V5ICInLmNvbmNhdChuLCciIGZvciBsYW5ndWFnZXMgIicpLmNvbmNhdChoLmpvaW4oIiwgIiksJyIgd29uXCd0IGdldCByZXNvbHZlZCBhcyBuYW1lc3BhY2UgIicpLmNvbmNhdChpLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKSksaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKCFhLmlzVmFsaWRMb29rdXAoZSkpe289bjt2YXIgaSx1LGw9YyxoPVtsXTtpZihhLmkxOG5Gb3JtYXQmJmEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKWEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKGgsYyxuLHQscyk7ZWxzZSBmJiYoaT1hLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChuLHMuY291bnQpKSxmJiZwJiZoLnB1c2gobCtpKSxwJiZoLnB1c2gobCs9IiIuY29uY2F0KGEub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQocy5jb250ZXh0KSksZiYmaC5wdXNoKGwrPWkpO2Zvcig7dT1oLnBvcCgpOylhLmlzVmFsaWRMb29rdXAoZSl8fChyPXUsZT1hLmdldFJlc291cmNlKG4sdCx1LHMpKX19KSl9KX19KSx7cmVzOmUsdXNlZEtleTpuLGV4YWN0VXNlZEtleTpyLHVzZWRMbmc6byx1c2VkTlM6aX19fSx7a2V5OiJpc1ZhbGlkTG9va3VwIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hKHZvaWQgMD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuTnVsbCYmbnVsbD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuRW1wdHlTdHJpbmcmJiIiPT09dCl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gdGhpcy5pMThuRm9ybWF0JiZ0aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2U/dGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlKHQsZSxuLHIpOnRoaXMucmVzb3VyY2VTdG9yZS5nZXRSZXNvdXJjZSh0LGUsbixyKX19XSksZX0oKTtmdW5jdGlvbiBRdCh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBadD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7anQodGhpcyx0KSx0aGlzLm9wdGlvbnM9ZSx0aGlzLndoaXRlbGlzdD10aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ITEsdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1EdC5jcmVhdGUoImxhbmd1YWdlVXRpbHMiKX1yZXR1cm4gT3QodCxbe2tleToiZ2V0U2NyaXB0UGFydEZyb21Db2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dC5pbmRleE9mKCItIik8MClyZXR1cm4gbnVsbDt2YXIgZT10LnNwbGl0KCItIik7cmV0dXJuIDI9PT1lLmxlbmd0aD9udWxsOihlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKT9udWxsOnRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUuam9pbigiLSIpKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfSk6Mj09PW4ubGVuZ3RoPyhuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSxuWzFdPW5bMV0udG9VcHBlckNhc2UoKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSkpOjM9PT1uLmxlbmd0aCYmKG5bMF09blswXS50b0xvd2VyQ2FzZSgpLDI9PT1uWzFdLmxlbmd0aCYmKG5bMV09blsxXS50b1VwcGVyQ2FzZSgpKSwic2duIiE9PW5bMF0mJjI9PT1uWzJdLmxlbmd0aCYmKG5bMl09blsyXS50b1VwcGVyQ2FzZSgpKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPVF0KG5bMl0udG9Mb3dlckNhc2UoKSkpKSxuLmpvaW4oIi0iKX1yZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZXx8dGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz90LnRvTG93ZXJDYXNlKCk6dH19LHtrZXk6ImlzV2hpdGVsaXN0ZWQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZ2dlci5kZXByZWNhdGUoImxhbmd1YWdlVXRpbHMuaXNXaGl0ZWxpc3RlZCIsJ2Z1bmN0aW9uICJpc1doaXRlbGlzdGVkIiB3aWxsIGJlIHJlbmFtZWQgdG8gImlzU3VwcG9ydGVkQ29kZSIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSBpdFwncyB1c2FnZSBhc2FwLicpLHRoaXMuaXNTdXBwb3J0ZWRDb2RlKHQpfX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpO24ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzJiYhbi5pc1N1cHBvcnRlZENvZGUocil8fChlPXIpfX0pLCFlJiZ0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpO2lmKG4uaXNTdXBwb3J0ZWRDb2RlKHIpKXJldHVybiBlPXI7ZT1uLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KX19KSxlfHwoZT10aGlzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKVswXSksZSk6bnVsbH19LHtrZXk6ImdldEZhbGxiYWNrQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuW107aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoZSkpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSwiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh0KSlyZXR1cm4gdDtpZighZSlyZXR1cm4gdC5kZWZhdWx0fHxbXTt2YXIgbj10W2VdO3JldHVybiBufHwobj10W3RoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKGUpXSksbnx8KG49dFt0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlKV0pLG58fChuPXRbdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShlKV0pLG58fChuPXQuZGVmYXVsdCksbnx8W119fSx7a2V5OiJ0b1Jlc29sdmVIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXRoaXMuZ2V0RmFsbGJhY2tDb2RlcyhlfHx0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmd8fFtdLHQpLG89W10saT1mdW5jdGlvbih0KXt0JiYobi5pc1N1cHBvcnRlZENvZGUodCk/by5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJmkodGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmaSh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goZnVuY3Rpb24odCl7by5pbmRleE9mKHQpPDAmJmkobi5mb3JtYXRMYW5ndWFnZUNvZGUodCkpfSksb319XSksdH0oKSx0ZT1be2xuZ3M6WyJhY2giLCJhayIsImFtIiwiYXJuIiwiYnIiLCJmaWwiLCJndW4iLCJsbiIsIm1mZSIsIm1nIiwibWkiLCJvYyIsInB0IiwicHQtQlIiLCJ0ZyIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtuIiwia3UiLCJsYiIsIm1haSIsIm1sIiwibW4iLCJtciIsIm5haCIsIm5hcCIsIm5iIiwibmUiLCJubCIsIm5uIiwibm8iLCJuc28iLCJwYSIsInBhcCIsInBtcyIsInBzIiwicHQtUFQiLCJybSIsInNjbyIsInNlIiwic2kiLCJzbyIsInNvbiIsInNxIiwic3YiLCJzdyIsInRhIiwidGUiLCJ0ayIsInVyIiwieW8iXSxucjpbMSwyXSxmYzoyfSx7bG5nczpbImF5IiwiYm8iLCJjZ2ciLCJmYSIsImh0IiwiaWQiLCJqYSIsImpibyIsImthIiwia2siLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sZWU9ezE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PjEpfSwyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMSE9dCl9LDM6ZnVuY3Rpb24odCl7cmV0dXJuIDB9LDQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mj09dD8yOnQlMTAwPj0zJiZ0JTEwMDw9MTA/Mzp0JTEwMD49MTE/NDo1KX0sNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0Pj0yJiZ0PD00PzE6Mil9LDc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjghPXQmJjExIT10PzI6Myl9LDk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0Pj0yKX0sMTA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOnQ8Nz8yOnQ8MTE/Mzo0KX0sMTE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHwxMT09dD8wOjI9PXR8fDEyPT10PzE6dD4yJiZ0PDIwPzI6Myl9LDEyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMCE9MXx8dCUxMDA9PTExKX0sMTM6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwIT09dCl9LDE0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ/MTozPT10PzI6Myl9LDE1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDE2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6MCE9PXQ/MToyKX0sMTc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHx0JTEwPT0xJiZ0JTEwMCE9MTE/MDoxKX0sMTg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwPT10PzA6MT09dD8xOjIpfSwxOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4xJiZ0JTEwMDwxMT8xOnQlMTAwPjEwJiZ0JTEwMDwyMD8yOjMpfSwyMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4wJiZ0JTEwMDwyMD8xOjIpfSwyMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAwPT0xPzE6dCUxMDA9PTI/Mjp0JTEwMD09M3x8dCUxMDA9PTQ/MzowKX0sMjI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOih0PDB8fHQ+MTApJiZ0JTEwPT0wPzI6Myl9fTt2YXIgbmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2p0KHRoaXMsdCksdGhpcy5sYW5ndWFnZVV0aWxzPWUsdGhpcy5vcHRpb25zPXIsdGhpcy5sb2dnZXI9RHQuY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLHRoaXMucnVsZXM9KG49e30sdGUuZm9yRWFjaChmdW5jdGlvbih0KXt0LmxuZ3MuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPXtudW1iZXJzOnQubnIscGx1cmFsczplZVt0LmZjXX19KX0pLG4pfXJldHVybiBPdCh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSdWxlKHQpO3JldHVybiBlJiZlLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1bXSxvPXRoaXMuZ2V0UnVsZSh0KTtyZXR1cm4gbz8oby5udW1iZXJzLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIGk9bi5nZXRTdWZmaXgodCxvKTtyLnB1c2goIiIuY29uY2F0KGUpLmNvbmNhdChpKSl9KSxyKTpyfX0se2tleToiZ2V0U3VmZml4Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdldFJ1bGUodCk7aWYocil7dmFyIG89ci5ub0Ficz9yLnBsdXJhbHMoZSk6ci5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXIubnVtYmVyc1tvXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT1yLm51bWJlcnMubGVuZ3RoJiYxPT09ci5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgYT1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6YSgpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/YSgpOnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXIubnVtYmVycy5sZW5ndGgmJjE9PT1yLm51bWJlcnNbMF0/YSgpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZvLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrby50b1N0cmluZygpOm8udG9TdHJpbmcoKX1yZXR1cm4gdGhpcy5sb2dnZXIud2Fybigibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAiLmNvbmNhdCh0KSksIiJ9fV0pLHR9KCkscmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O2p0KHRoaXMsdCksdGhpcy5sb2dnZXI9RHQuY3JlYXRlKCJpbnRlcnBvbGF0b3IiKSx0aGlzLm9wdGlvbnM9ZSx0aGlzLmZvcm1hdD1lLmludGVycG9sYXRpb24mJmUuaW50ZXJwb2xhdGlvbi5mb3JtYXR8fGZ1bmN0aW9uKHQpe3JldHVybiB0fSx0aGlzLmluaXQoZSl9cmV0dXJuIE90KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3QuaW50ZXJwb2xhdGlvbnx8KHQuaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTt2YXIgZT10LmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9dm9pZCAwIT09ZS5lc2NhcGU/ZS5lc2NhcGU6WXQsdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9XdChlLnByZWZpeCk6ZS5wcmVmaXhFc2NhcGVkfHwie3siLHRoaXMuc3VmZml4PWUuc3VmZml4P1d0KGUuc3VmZml4KTplLnN1ZmZpeEVzY2FwZWR8fCJ9fSIsdGhpcy5mb3JtYXRTZXBhcmF0b3I9ZS5mb3JtYXRTZXBhcmF0b3I/ZS5mb3JtYXRTZXBhcmF0b3I6ZS5mb3JtYXRTZXBhcmF0b3J8fCIsIix0aGlzLnVuZXNjYXBlUHJlZml4PWUudW5lc2NhcGVTdWZmaXg/IiI6ZS51bmVzY2FwZVByZWZpeHx8Ii0iLHRoaXMudW5lc2NhcGVTdWZmaXg9dGhpcy51bmVzY2FwZVByZWZpeD8iIjplLnVuZXNjYXBlU3VmZml4fHwiIix0aGlzLm5lc3RpbmdQcmVmaXg9ZS5uZXN0aW5nUHJlZml4P1d0KGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8V3QoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1lLm5lc3RpbmdTdWZmaXg/V3QoZS5uZXN0aW5nU3VmZml4KTplLm5lc3RpbmdTdWZmaXhFc2NhcGVkfHxXdCgiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHM9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihzLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIG89SHQoZSx1LHQpO3JldHVybiBzLmFsd2F5c0Zvcm1hdD9zLmZvcm1hdChvLHZvaWQgMCxuKTpvfXZhciBpPXQuc3BsaXQocy5mb3JtYXRTZXBhcmF0b3IpLGE9aS5zaGlmdCgpLnRyaW0oKSxjPWkuam9pbihzLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBzLmZvcm1hdChIdChlLHUsYSksYyxuLHIpfTt0aGlzLnJlc2V0UmVnRXhwKCk7dmFyIGY9ciYmci5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIscD1yJiZyLmludGVycG9sYXRpb24mJnIuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXN8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztyZXR1cm5be3JlZ2V4OnRoaXMucmVnZXhwVW5lc2NhcGUsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBjKHQpfX0se3JlZ2V4OnRoaXMucmVnZXhwLHNhZmVWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gcy5lc2NhcGVWYWx1ZT9jKHMuZXNjYXBlKHQpKTpjKHQpfX1dLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKGE9MDtvPWUucmVnZXguZXhlYyh0KTspe2lmKHZvaWQgMD09PShpPWwob1sxXS50cmltKCkpKSlpZigiZnVuY3Rpb24iPT10eXBlb2YgZil7dmFyIG49Zih0LG8scik7aT0ic3RyaW5nIj09dHlwZW9mIG4/bjoiIn1lbHNle2lmKHApe2k9b1swXTtjb250aW51ZX1zLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSAiLmNvbmNhdChvWzFdLCIgZm9yIGludGVycG9sYXRpbmcgIikuY29uY2F0KHQpKSxpPSIifWVsc2Uic3RyaW5nIj09dHlwZW9mIGl8fHMudXNlUmF3VmFsdWVUb0VzY2FwZXx8KGk9VXQoaSkpO2lmKHQ9dC5yZXBsYWNlKG9bMF0sZS5zYWZlVmFsdWUoaSkpLGUucmVnZXgubGFzdEluZGV4PTAsKythPj1zLm1heFJlcGxhY2VzKWJyZWFrfX0pLHR9fSx7a2V5OiJuZXN0Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbz10aGlzLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGE9VHQoe30saSk7ZnVuY3Rpb24gcyh0LGUpe3ZhciBuPXRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I7aWYodC5pbmRleE9mKG4pPDApcmV0dXJuIHQ7dmFyIHI9dC5zcGxpdChuZXcgUmVnRXhwKCIiLmNvbmNhdChuLCJbIF0qeyIpKSksbz0ieyIuY29uY2F0KHJbMV0pO3Q9clswXSxvPShvPXRoaXMuaW50ZXJwb2xhdGUobyxhKSkucmVwbGFjZSgvJy9nLCciJyk7dHJ5e2E9SlNPTi5wYXJzZShvKSxlJiYoYT1UdCh7fSxlLGEpKX1jYXRjaChlKXtyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5ICIuY29uY2F0KHQpLGUpLCIiLmNvbmNhdCh0KS5jb25jYXQobikuY29uY2F0KG8pfXJldHVybiBkZWxldGUgYS5kZWZhdWx0VmFsdWUsdH1mb3IoYS5hcHBseVBvc3RQcm9jZXNzb3I9ITEsZGVsZXRlIGEuZGVmYXVsdFZhbHVlO249dGhpcy5uZXN0aW5nUmVnZXhwLmV4ZWModCk7KXt2YXIgdT1bXSxjPSExO2lmKG5bMF0uaW5jbHVkZXModGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KTtuWzFdPWwuc2hpZnQoKSx1PWwsYz0hMH1pZigocj1lKHMuY2FsbCh0aGlzLG5bMV0udHJpbSgpLGEpLGEpKSYmblswXT09PXQmJiJzdHJpbmciIT10eXBlb2YgcilyZXR1cm4gcjsic3RyaW5nIiE9dHlwZW9mIHImJihyPVV0KHIpKSxyfHwodGhpcy5sb2dnZXIud2FybigibWlzc2VkIHRvIHJlc29sdmUgIi5jb25jYXQoblsxXSwiIGZvciBuZXN0aW5nICIpLmNvbmNhdCh0KSkscj0iIiksYyYmKHI9dS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gby5mb3JtYXQodCxlLGkubG5nLGkpfSxyLnRyaW0oKSkpLHQ9dC5yZXBsYWNlKG5bMF0sciksdGhpcy5yZWdleHAubGFzdEluZGV4PTB9cmV0dXJuIHR9fV0pLHR9KCk7dmFyIG9lPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxuLHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9O3JldHVybiBqdCh0aGlzLGUpLG89THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmX3QuY2FsbChDdChvKSksby5iYWNrZW5kPXQsby5zdG9yZT1uLG8uc2VydmljZXM9cixvLmxhbmd1YWdlVXRpbHM9ci5sYW5ndWFnZVV0aWxzLG8ub3B0aW9ucz1pLG8ubG9nZ2VyPUR0LmNyZWF0ZSgiYmFja2VuZENvbm5lY3RvciIpLG8uc3RhdGU9e30sby5xdWV1ZT1bXSxvLmJhY2tlbmQmJm8uYmFja2VuZC5pbml0JiZvLmJhY2tlbmQuaW5pdChyLGkuYmFja2VuZCxpKSxvfXJldHVybiBOdChlLF90KSxPdChlLFt7a2V5OiJxdWV1ZUxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPXRoaXMsaT1bXSxhPVtdLHM9W10sdT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcz0iIi5jb25jYXQodCwifCIpLmNvbmNhdChlKTshbi5yZWxvYWQmJm8uc3RvcmUuaGFzUmVzb3VyY2VCdW5kbGUodCxlKT9vLnN0YXRlW3NdPTI6by5zdGF0ZVtzXTwwfHwoMT09PW8uc3RhdGVbc10/YS5pbmRleE9mKHMpPDAmJmEucHVzaChzKTooby5zdGF0ZVtzXT0xLHI9ITEsYS5pbmRleE9mKHMpPDAmJmEucHVzaChzKSxpLmluZGV4T2Yocyk8MCYmaS5wdXNoKHMpLHUuaW5kZXhPZihlKTwwJiZ1LnB1c2goZSkpKX0pLHJ8fHMucHVzaCh0KX0pLChpLmxlbmd0aHx8YS5sZW5ndGgpJiZ0aGlzLnF1ZXVlLnB1c2goe3BlbmRpbmc6YSxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOmkscGVuZGluZzphLHRvTG9hZExhbmd1YWdlczpzLHRvTG9hZE5hbWVzcGFjZXM6dX19fSx7a2V5OiJsb2FkZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTtlJiZ0aGlzLmVtaXQoImZhaWxlZExvYWRpbmciLG8saSxlKSxuJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlQnVuZGxlKG8saSxuKSx0aGlzLnN0YXRlW3RdPWU/LTE6Mjt2YXIgYT17fTt0aGlzLnF1ZXVlLmZvckVhY2goZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPUJ0KHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfShuLmxvYWRlZCxbb10saSksZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5pbmRleE9mKGUpOy0xIT09bjspdC5zcGxpY2UobiwxKSxuPXQuaW5kZXhPZihlKX0obi5wZW5kaW5nLHQpLGUmJm4uZXJyb3JzLnB1c2goZSksMCE9PW4ucGVuZGluZy5sZW5ndGh8fG4uZG9uZXx8KE9iamVjdC5rZXlzKG4ubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2FbdF18fChhW3RdPVtdKSxuLmxvYWRlZFt0XS5sZW5ndGgmJm4ubG9hZGVkW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7YVt0XS5pbmRleE9mKGUpPDAmJmFbdF0ucHVzaChlKX0pfSksbi5kb25lPSEwLG4uZXJyb3JzLmxlbmd0aD9uLmNhbGxiYWNrKG4uZXJyb3JzKTpuLmNhbGxiYWNrKCkpfSksdGhpcy5lbWl0KCJsb2FkZWQiLGEpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIXQuZG9uZX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MCxpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTozNTAsYT1hcmd1bWVudHMubGVuZ3RoPjU/YXJndW1lbnRzWzVdOnZvaWQgMDtyZXR1cm4gdC5sZW5ndGg/dGhpcy5iYWNrZW5kW25dKHQsZSxmdW5jdGlvbihzLHUpe3MmJnUmJm88NT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5yZWFkLmNhbGwocix0LGUsbixvKzEsMippLGEpfSxpKTphKHMsdSl9KTphKG51bGwse30pfX0se2tleToicHJlcGFyZUxvYWRpbmciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxvPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwO2lmKCF0aGlzLmJhY2tlbmQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIk5vIGJhY2tlbmQgd2FzIGFkZGVkIHZpYSBpMThuZXh0LnVzZS4gV2lsbCBub3QgbG9hZCByZXNvdXJjZXMuIiksbyYmbygpOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSksInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pO3ZhciBpPXRoaXMucXVldWVMb2FkKHQsZSxyLG8pO2lmKCFpLnRvTG9hZC5sZW5ndGgpcmV0dXJuIGkucGVuZGluZy5sZW5ndGh8fG8oKSxudWxsO2kudG9Mb2FkLmZvckVhY2goZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSl9fSx7a2V5OiJsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse30sbil9fSx7a2V5OiJyZWxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt0aGlzLnByZXBhcmVMb2FkaW5nKHQsZSx7cmVsb2FkOiEwfSxuKX19LHtrZXk6ImxvYWRPbmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IiIscj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTt0aGlzLnJlYWQobyxpLCJyZWFkIix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKHIsYSl7ciYmZS5sb2dnZXIud2FybigiIi5jb25jYXQobiwibG9hZGluZyBuYW1lc3BhY2UgIikuY29uY2F0KGksIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KG8sIiBmYWlsZWQiKSxyKSwhciYmYSYmZS5sb2dnZXIubG9nKCIiLmNvbmNhdChuLCJsb2FkZWQgbmFtZXNwYWNlICIpLmNvbmNhdChpLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChvKSxhKSxlLmxvYWRlZCh0LHIsYSl9KX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGwhPW4mJiIiIT09biYmKHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwsVHQoe30saSx7aXNVcGRhdGU6b30pKSx0JiZ0WzBdJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlKHRbMF0sZSxuLHIpKX19XSksZX0oKTtmdW5jdGlvbiBpZSgpe3JldHVybntkZWJ1ZzohMSxpbml0SW1tZWRpYXRlOiEwLG5zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6WyJ0cmFuc2xhdGlvbiJdLGZhbGxiYWNrTG5nOlsiZGV2Il0sZmFsbGJhY2tOUzohMSx3aGl0ZWxpc3Q6ITEsbm9uRXhwbGljaXRXaGl0ZWxpc3Q6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9e307aWYoIm9iamVjdCI9PT1TdCh0WzFdKSYmKGU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzFdJiYoZS5kZWZhdWx0VmFsdWU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzJdJiYoZS50RGVzY3JpcHRpb249dFsyXSksIm9iamVjdCI9PT1TdCh0WzJdKXx8Im9iamVjdCI9PT1TdCh0WzNdKSl7dmFyIG49dFszXXx8dFsyXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09blt0XX0pfXJldHVybiBlfSxpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMCxmb3JtYXQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHR9LHByZWZpeDoie3siLHN1ZmZpeDoifX0iLGZvcm1hdFNlcGFyYXRvcjoiLCIsdW5lc2NhcGVQcmVmaXg6Ii0iLG5lc3RpbmdQcmVmaXg6IiR0KCIsbmVzdGluZ1N1ZmZpeDoiKSIsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6IiwiLG1heFJlcGxhY2VzOjFlMyxza2lwT25WYXJpYWJsZXM6ITF9fX1mdW5jdGlvbiBhZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQubnMmJih0Lm5zPVt0Lm5zXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTG5nJiYodC5mYWxsYmFja0xuZz1bdC5mYWxsYmFja0xuZ10pLCJzdHJpbmciPT10eXBlb2YgdC5mYWxsYmFja05TJiYodC5mYWxsYmFja05TPVt0LmZhbGxiYWNrTlNdKSx0LndoaXRlbGlzdCYmKHQud2hpdGVsaXN0JiZ0LndoaXRlbGlzdC5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC53aGl0ZWxpc3Q9dC53aGl0ZWxpc3QuY29uY2F0KFsiY2ltb2RlIl0pKSx0LnN1cHBvcnRlZExuZ3M9dC53aGl0ZWxpc3QpLHQubm9uRXhwbGljaXRXaGl0ZWxpc3QmJih0Lm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncz10Lm5vbkV4cGxpY2l0V2hpdGVsaXN0KSx0LnN1cHBvcnRlZExuZ3MmJnQuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC5zdXBwb3J0ZWRMbmdzPXQuc3VwcG9ydGVkTG5ncy5jb25jYXQoWyJjaW1vZGUiXSkpLHR9ZnVuY3Rpb24gc2UoKXt9dmFyIHVlPW5ldyhmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIHQsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZihqdCh0aGlzLGUpLHQ9THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmX3QuY2FsbChDdCh0KSksdC5vcHRpb25zPWFlKG4pLHQuc2VydmljZXM9e30sdC5sb2dnZXI9RHQsdC5tb2R1bGVzPXtleHRlcm5hbDpbXX0sciYmIXQuaXNJbml0aWFsaXplZCYmIW4uaXNDbG9uZSl7aWYoIXQub3B0aW9ucy5pbml0SW1tZWRpYXRlKXJldHVybiB0LmluaXQobixyKSxMdCh0LEN0KHQpKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0KG4scil9LDApfXJldHVybiB0fXJldHVybiBOdChlLF90KSxPdChlLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sbj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtmdW5jdGlvbiByKHQpe3JldHVybiB0PyJmdW5jdGlvbiI9PXR5cGVvZiB0P25ldyB0OnQ6bnVsbH1pZigiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG49ZSxlPXt9KSxlLndoaXRlbGlzdCYmIWUuc3VwcG9ydGVkTG5ncyYmdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJ3aGl0ZWxpc3QiLCdvcHRpb24gIndoaXRlbGlzdCIgd2lsbCBiZSByZW5hbWVkIHRvICJzdXBwb3J0ZWRMbmdzIiBpbiB0aGUgbmV4dCBtYWpvciAtIHBsZWFzZSBtYWtlIHN1cmUgdG8gcmVuYW1lIHRoaXMgb3B0aW9uIGFzYXAuJyksZS5ub25FeHBsaWNpdFdoaXRlbGlzdCYmIWUubm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzJiZ0aGlzLmxvZ2dlci5kZXByZWNhdGUoIndoaXRlbGlzdCIsJ29wdGlvbnMgIm5vbkV4cGxpY2l0V2hpdGVsaXN0IiB3aWxsIGJlIHJlbmFtZWQgdG8gIm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncyIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSB0aGlzIG9wdGlvbiBhc2FwLicpLHRoaXMub3B0aW9ucz1UdCh7fSxpZSgpLHRoaXMub3B0aW9ucyxhZShlKSksdGhpcy5mb3JtYXQ9dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0LG58fChuPXNlKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3RoaXMubW9kdWxlcy5sb2dnZXI/RHQuaW5pdChyKHRoaXMubW9kdWxlcy5sb2dnZXIpLHRoaXMub3B0aW9ucyk6RHQuaW5pdChudWxsLHRoaXMub3B0aW9ucyk7dmFyIG89bmV3IFp0KHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgR3QodGhpcy5vcHRpb25zLnJlc291cmNlcyx0aGlzLm9wdGlvbnMpO3ZhciBpPXRoaXMuc2VydmljZXM7aS5sb2dnZXI9RHQsaS5yZXNvdXJjZVN0b3JlPXRoaXMuc3RvcmUsaS5sYW5ndWFnZVV0aWxzPW8saS5wbHVyYWxSZXNvbHZlcj1uZXcgbmUobyx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxpLmludGVycG9sYXRvcj1uZXcgcmUodGhpcy5vcHRpb25zKSxpLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKX0saS5iYWNrZW5kQ29ubmVjdG9yPW5ldyBvZShyKHRoaXMubW9kdWxlcy5iYWNrZW5kKSxpLnJlc291cmNlU3RvcmUsaSx0aGlzLm9wdGlvbnMpLGkuYmFja2VuZENvbm5lY3Rvci5vbigiKiIsZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3QuZW1pdC5hcHBseSh0LFtlXS5jb25jYXQocikpfSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJihpLmxhbmd1YWdlRGV0ZWN0b3I9cih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksaS5sYW5ndWFnZURldGVjdG9yLmluaXQoaSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYoaS5pMThuRm9ybWF0PXIodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLGkuaTE4bkZvcm1hdC5pbml0JiZpLmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBKdCh0aGlzLnNlcnZpY2VzLHRoaXMub3B0aW9ucyksdGhpcy50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihlKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLG89MTtvPG47bysrKXJbby0xXT1hcmd1bWVudHNbb107dC5lbWl0LmFwcGx5KHQsW2VdLmNvbmNhdChyKSl9KSx0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChmdW5jdGlvbihlKXtlLmluaXQmJmUuaW5pdCh0KX0pfXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5vcHRpb25zLmxuZ3x8dGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpO3ZhciBhPVsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXTthLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPXQuc3RvcmUpW2VdLmFwcGx5KG4sYXJndW1lbnRzKX19KTt2YXIgcz1bImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdO3MuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZ1bmN0aW9uKCl7dmFyIG47cmV0dXJuKG49dC5zdG9yZSlbZV0uYXBwbHkobixhcmd1bWVudHMpLHR9fSk7dmFyIHU9TXQoKSxjPWZ1bmN0aW9uKCl7dC5jaGFuZ2VMYW5ndWFnZSh0Lm9wdGlvbnMubG5nLGZ1bmN0aW9uKGUscil7dC5pc0luaXRpYWxpemVkPSEwLHQub3B0aW9ucy5pc0Nsb25lfHx0LmxvZ2dlci5sb2coImluaXRpYWxpemVkIix0Lm9wdGlvbnMpLHQuZW1pdCgiaW5pdGlhbGl6ZWQiLHQub3B0aW9ucyksdS5yZXNvbHZlKHIpLG4oZSxyKX0pfTtyZXR1cm4gdGhpcy5vcHRpb25zLnJlc291cmNlc3x8IXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlP2MoKTpzZXRUaW1lb3V0KGMsMCksdX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06c2Uscj1uLG89InN0cmluZyI9PXR5cGVvZiB0P3Q6dGhpcy5sYW5ndWFnZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHI9dCksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYobyYmImNpbW9kZSI9PT1vLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHIoKTt2YXIgaT1bXSxhPWZ1bmN0aW9uKHQpe3QmJmUuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkodCkuZm9yRWFjaChmdW5jdGlvbih0KXtpLmluZGV4T2YodCk8MCYmaS5wdXNoKHQpfSl9O2lmKG8pYShvKTtlbHNle3ZhciBzPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQpfSl9dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGEodCl9KSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZChpLHRoaXMub3B0aW9ucy5ucyxyKX1lbHNlIHIobnVsbCl9fSx7a2V5OiJyZWxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1NdCgpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1zZSksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsZnVuY3Rpb24odCl7ci5yZXNvbHZlKCksbih0KX0pLHJ9fSx7a2V5OiJ1c2UiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGFuIHVuZGVmaW5lZCBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7aWYoIXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhIHdyb25nIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtyZXR1cm4iYmFja2VuZCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuYmFja2VuZD10KSwoImxvZ2dlciI9PT10LnR5cGV8fHQubG9nJiZ0Lndhcm4mJnQuZXJyb3IpJiYodGhpcy5tb2R1bGVzLmxvZ2dlcj10KSwibGFuZ3VhZ2VEZXRlY3RvciI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcj10KSwiaTE4bkZvcm1hdCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdD10KSwicG9zdFByb2Nlc3NvciI9PT10LnR5cGUmJkt0LmFkZFBvc3RQcm9jZXNzb3IodCksIjNyZFBhcnR5Ij09PXQudHlwZSYmdGhpcy5tb2R1bGVzLmV4dGVybmFsLnB1c2godCksdGhpc319LHtrZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5pc0xhbmd1YWdlQ2hhbmdpbmdUbz10O3ZhciByPU10KCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgbz1mdW5jdGlvbih0KXt2YXIgbz0ic3RyaW5nIj09dHlwZW9mIHQ/dDpuLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKHQpO28mJihuLmxhbmd1YWdlfHwobi5sYW5ndWFnZT1vLG4ubGFuZ3VhZ2VzPW4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobykpLG4udHJhbnNsYXRvci5sYW5ndWFnZXx8bi50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKG8pLG4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKG8pKSxuLmxvYWRSZXNvdXJjZXMobyxmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhuLmxhbmd1YWdlPW8sbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvKSxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uobyksbi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsbi5lbWl0KCJsYW5ndWFnZUNoYW5nZWQiLG8pLG4ubG9nZ2VyLmxvZygibGFuZ3VhZ2VDaGFuZ2VkIixvKSk6bi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsci5yZXNvbHZlKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSxlJiZlKHQsZnVuY3Rpb24oKXtyZXR1cm4gbi50LmFwcGx5KG4sYXJndW1lbnRzKX0pfSh0LG8pfSl9O3JldHVybiB0fHwhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yfHx0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmM/IXQmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP3RoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3Qobyk6byh0KTpvKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSkscn19LHtrZXk6ImdldEZpeGVkVCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ZnVuY3Rpb24gdChlLHIpe3ZhciBvO2lmKCJvYmplY3QiIT09U3Qocikpe2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KGk+Mj9pLTI6MCkscz0yO3M8aTtzKyspYVtzLTJdPWFyZ3VtZW50c1tzXTtvPW4ub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbZSxyXS5jb25jYXQoYSkpfWVsc2Ugbz1UdCh7fSxyKTtyZXR1cm4gby5sbmc9by5sbmd8fHQubG5nLG8ubG5ncz1vLmxuZ3N8fHQubG5ncyxvLm5zPW8ubnN8fHQubnMsbi50KGUsbyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9yLmxuZz10OnIubG5ncz10LHIubnM9ZSxyfX0se2tleToidCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLnRyYW5zbGF0ZS5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKHQ9dGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkodCxhcmd1bWVudHMpfX0se2tleToic2V0RGVmYXVsdE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz10fX0se2tleToiaGFzTG9hZGVkTmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkIix0aGlzLmxhbmd1YWdlcyksITE7aWYoIXRoaXMubGFuZ3VhZ2VzfHwhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5Iix0aGlzLmxhbmd1YWdlcyksITE7dmFyIHI9dGhpcy5sYW5ndWFnZXNbMF0sbz0hIXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGk9dGhpcy5sYW5ndWFnZXNbdGhpcy5sYW5ndWFnZXMubGVuZ3RoLTFdO2lmKCJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiEwO3ZhciBhPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnN0YXRlWyIiLmNvbmNhdCh0LCJ8IikuY29uY2F0KG4pXTtyZXR1cm4tMT09PXJ8fDI9PT1yfTtpZihuLnByZWNoZWNrKXt2YXIgcz1uLnByZWNoZWNrKHRoaXMsYSk7aWYodm9pZCAwIT09cylyZXR1cm4gc31yZXR1cm4hIXRoaXMuaGFzUmVzb3VyY2VCdW5kbGUocix0KXx8KCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8ISghYShyLHQpfHxvJiYhYShpLHQpKSl9fSx7a2V5OiJsb2FkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9TXQoKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5zPygic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24ub3B0aW9ucy5ucy5pbmRleE9mKHQpPDAmJm4ub3B0aW9ucy5ucy5wdXNoKHQpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLGUmJmUodCl9KSxyKTooZSYmZSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImxvYWRMYW5ndWFnZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49TXQoKTsic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSk7dmFyIHI9dGhpcy5vcHRpb25zLnByZWxvYWR8fFtdLG89dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHIuaW5kZXhPZih0KTwwfSk7cmV0dXJuIG8ubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChvKSx0aGlzLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24odCl7bi5yZXNvbHZlKCksZSYmZSh0KX0pLG4pOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToiZGlyIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0fHwodD10aGlzLmxhbmd1YWdlcyYmdGhpcy5sYW5ndWFnZXMubGVuZ3RoPjA/dGhpcy5sYW5ndWFnZXNbMF06dGhpcy5sYW5ndWFnZSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT49MD8icnRsIjoibHRyIn19LHtrZXk6ImNyZWF0ZUluc3RhbmNlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwO3JldHVybiBuZXcgZSh0LG4pfX0se2tleToiY2xvbmVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnNlLG89VHQoe30sdGhpcy5vcHRpb25zLG4se2lzQ2xvbmU6ITB9KSxpPW5ldyBlKG8pLGE9WyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXTtyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lbZV09dFtlXX0pLGkuc2VydmljZXM9VHQoe30sdGhpcy5zZXJ2aWNlcyksaS5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOmkuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoaSl9LGkudHJhbnNsYXRvcj1uZXcgSnQoaS5zZXJ2aWNlcyxpLm9wdGlvbnMpLGkudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2kuZW1pdC5hcHBseShpLFt0XS5jb25jYXQobikpfSksaS5pbml0KG8sciksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19XSksZX0oKSksY2U9bigxMzMpLGxlPW4ubihjZSk7ZnVuY3Rpb24gZmUodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fWZ1bmN0aW9uIHBlKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7ZmUodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gaGUodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBkZSh0LGUsbil7dmFyIHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxpPWFyZ3VtZW50cyxhPWZ1bmN0aW9uKCl7cj1udWxsLG58fHQuYXBwbHkobyxpKX0scz1uJiYhcjtjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGEsZSkscyYmdC5hcHBseShvLGkpfX1mdW5jdGlvbiBnZSh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKCF0KXJldHVybnt9O3ZhciBpPXIoby5zaGlmdCgpKTshdFtpXSYmbiYmKHRbaV09bmV3IG4pLHQ9dFtpXX1yZXR1cm4gdD97b2JqOnQsazpyKG8uc2hpZnQoKSl9Ont9fWZ1bmN0aW9uIHZlKHQsZSxuKXt2YXIgcj1nZSh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24geWUodCxlKXt2YXIgbj1nZSh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX12YXIgbWU9bmV3IFJlZ0V4cCgie3soLis/KX19IiwiZyIpO2Z1bmN0aW9uIGJlKHQsZSxuKXt2YXIgcixvLGk7Zm9yKDtyPW1lLmV4ZWModCk7KSJzdHJpbmciIT10eXBlb2Yobz1yWzFdLnRyaW0oKSkmJihvPW51bGw9PShpPW8pPyIiOiIiK2kpLG98fChvPSIiKSxvPW8ucmVwbGFjZSgvXCQvZywiJCQkJCIpLHQ9dC5yZXBsYWNlKHJbMF0sZVtvXXx8byksbWUubGFzdEluZGV4PTA7cmV0dXJuIHR9ZnVuY3Rpb24geGUodCxlLG4scixvKXt0cnl7dmFyIGk9bmV3KFhNTEh0dHBSZXF1ZXN0fHxBY3RpdmVYT2JqZWN0KSgiTVNYTUwyLlhNTEhUVFAuMy4wIik7aS5vcGVuKHI/IlBPU1QiOiJHRVQiLHQsMSksZS5jcm9zc0RvbWFpbnx8aS5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKSxlLmF1dGhvcml6ZSYmZS5hcGlLZXkmJmkuc2V0UmVxdWVzdEhlYWRlcigiQXV0aG9yaXphdGlvbiIsZS5hcGlLZXkpLChyfHxlLnNldENvbnRlbnRUeXBlSlNPTikmJmkuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24vanNvbiIpLGkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aS5yZWFkeVN0YXRlPjMmJm4mJm4oaS5yZXNwb25zZVRleHQsaSl9LGkuc2VuZChKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2godCl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nKHQpfX12YXIgd2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixyKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSxlJiZlLnByb2plY3RJZD90aGlzLmluaXQobnVsbCxlLHt9LG4pOnRoaXMuaW5pdChudWxsLG4se30sciksdGhpcy50eXBlPSJiYWNrZW5kIn12YXIgZSxuLHI7cmV0dXJuIGU9dCwobj1be2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLG89YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7dGhpcy5vcHRpb25zPXBlKHt9LHtsb2FkUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHByaXZhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vcHJpdmF0ZS97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319IixwdWxsUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3B1bGwve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIsZ2V0TGFuZ3VhZ2VzUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL2xhbmd1YWdlcy97e3Byb2plY3RJZH19IixhZGRQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vbWlzc2luZy97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319Iix1cGRhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vdXBkYXRlL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHJlZmVyZW5jZUxuZzoiZW4iLGNyb3NzRG9tYWluOiEwLHNldENvbnRlbnRUeXBlSlNPTjohMSx2ZXJzaW9uOiJsYXRlc3QiLHB1bGw6ITEscHJpdmF0ZTohMSx3aGl0ZWxpc3RUaHJlc2hvbGQ6LjksZmFpbExvYWRpbmdPbkVtcHR5SlNPTjohMSxhbGxvd2VkQWRkT3JVcGRhdGVIb3N0czpbImxvY2FsaG9zdCJdfSx0aGlzLm9wdGlvbnMsbiksdGhpcy5zZXJ2aWNlcz10LHRoaXMub3B0aW9ucy5wdWxsJiZjb25zb2xlLndhcm4oImRlcHJlY2F0ZWQ6IHB1bGwgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggbG9jaXplIHByaXZhdGUgdmVyc2lvbnMiKTt2YXIgaT13aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtpPyh0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkPXRoaXMub3B0aW9ucy5hbGxvd2VkQWRkT3JVcGRhdGVIb3N0cy5pbmRleE9mKGkpPi0xLHIuc2F2ZU1pc3NpbmcmJiF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkJiZ0JiZ0LmxvZ2dlciYmdC5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgaG9zdCAiJy5jb25jYXQoaSwnIiB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzOiAnKS5jb25jYXQodGhpcy5vcHRpb25zLmFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzLmpvaW4oIiwgIiksIiAobWF0Y2hlcyBuZWVkIHRvIGJlIGV4YWN0KS4iKSkpOnRoaXMuaXNBZGRPclVwZGF0ZUFsbG93ZWQ9ITAsImZ1bmN0aW9uIj09dHlwZW9mIG8mJnRoaXMuZ2V0T3B0aW9ucyhmdW5jdGlvbih0LHIpe2lmKHQpcmV0dXJuIG8odCk7ZS5vcHRpb25zLnJlZmVyZW5jZUxuZz1uLnJlZmVyZW5jZUxuZ3x8ci5yZWZlcmVuY2VMbmd8fGUub3B0aW9ucy5yZWZlcmVuY2VMbmcsbyhudWxsLHIpfSksdGhpcy5xdWV1ZWRXcml0ZXM9e30sdGhpcy5kZWJvdW5jZWRQcm9jZXNzPWRlKHRoaXMucHJvY2VzcywxZTQpfX0se2tleToiZ2V0TGFuZ3VhZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1iZSh0aGlzLm9wdGlvbnMuZ2V0TGFuZ3VhZ2VzUGF0aCx7cHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWR9KTt0aGlzLmxvYWRVcmwoZSx7fSx0KX19LHtrZXk6ImdldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5nZXRMYW5ndWFnZXMoZnVuY3Rpb24obixyKXtpZihuKXJldHVybiB0KG4pO3ZhciBvPU9iamVjdC5rZXlzKHIpO2lmKCFvLmxlbmd0aClyZXR1cm4gdChuZXcgRXJyb3IoIndhcyB1bmFibGUgdG8gbG9hZCBsYW5ndWFnZXMgdmlhIEFQSSIpKTt2YXIgaT1vLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiByW2VdLmlzUmVmZXJlbmNlTGFuZ3VhZ2UmJih0PWUpLHR9LCIiKSxhPW8ucmVkdWNlKGZ1bmN0aW9uKHQsbil7dmFyIG89cltuXTtyZXR1cm4gby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXSYmby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXT49ZS5vcHRpb25zLndoaXRlbGlzdFRocmVzaG9sZCYmdC5wdXNoKG4pLHR9LFtdKSxzPW8ucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPi0xfHx0fSwhMSk7dChudWxsLHtmYWxsYmFja0xuZzppLHJlZmVyZW5jZUxuZzppLHdoaXRlbGlzdDphLGxvYWQ6cz8iYWxsIjoibGFuZ3VhZ2VPbmx5In0pfSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbz17fTt0aGlzLm9wdGlvbnMucHJpdmF0ZT8ocj1iZSh0aGlzLm9wdGlvbnMucHJpdmF0ZVBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLG89e2F1dGhvcml6ZTohMH0pOnRoaXMub3B0aW9ucy5wdWxsPyhyPWJlKHRoaXMub3B0aW9ucy5wdWxsUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksbz17YXV0aG9yaXplOiEwfSk6cj1iZSh0aGlzLm9wdGlvbnMubG9hZFBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLHRoaXMubG9hZFVybChyLG8sbil9fSx7a2V5OiJsb2FkVXJsIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpczt4ZSh0LHBlKHt9LHRoaXMub3B0aW9ucyxlKSxmdW5jdGlvbihlLG8pe2lmKG8uc3RhdHVzPj01MDAmJm8uc3RhdHVzPDYwMClyZXR1cm4gbigiZmFpbGVkIGxvYWRpbmcgIit0LCEwKTtpZihvLnN0YXR1cz49NDAwJiZvLnN0YXR1czw1MDApcmV0dXJuIG4oImZhaWxlZCBsb2FkaW5nICIrdCwhMSk7dmFyIGksYTt0cnl7aT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe2E9ImZhaWxlZCBwYXJzaW5nICIrdCsiIHRvIGpzb24ifXJldHVybiBhP24oYSwhMSk6ci5vcHRpb25zLmZhaWxMb2FkaW5nT25FbXB0eUpTT04mJiFPYmplY3Qua2V5cyhpKS5sZW5ndGg/bigibG9hZGVkIHJlc3VsdCBlbXB0eSBmb3IgIit0LCExKTp2b2lkIG4obnVsbCxpKX0pfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGE9dGhpcztpZihvfHwobz1mdW5jdGlvbigpe30pLCF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkKXJldHVybiBvKCJob3N0IGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBrZXkuIik7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09YS5vcHRpb25zLnJlZmVyZW5jZUxuZ30pLmxlbmd0aDwxJiZ0aGlzLnNlcnZpY2VzJiZ0aGlzLnNlcnZpY2VzLmxvZ2dlciYmdGhpcy5zZXJ2aWNlcy5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGxhbmd1YWdlICInLmNvbmNhdCh0aGlzLm9wdGlvbnMucmVmZXJlbmNlTG5nLCciIHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgdG8gc2F2ZSBsYW5ndWFnZXM6ICcpLmNvbmNhdCh0LmpvaW4oIiwgIiksIiAob3BlbiB5b3VyIHNpdGUgaW4gdGhlIHJlZmVyZW5jZSBsYW5ndWFnZSB0byBzYXZlIG1pc3NpbmdzKS4iKSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9PT1hLm9wdGlvbnMucmVmZXJlbmNlTG5nJiZhLnF1ZXVlLmNhbGwoYSxhLm9wdGlvbnMucmVmZXJlbmNlTG5nLGUsbixyLG8saSl9KX19LHtrZXk6InVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhPXRoaXM7aWYob3x8KG89ZnVuY3Rpb24oKXt9KSwhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZClyZXR1cm4gbygiaG9zdCBpcyBub3QgYWxsb3dlZCB0byB1cGRhdGUga2V5LiIpO2l8fChpPXt9KSwic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksaS5pc1VwZGF0ZT0hMCx0LmZvckVhY2goZnVuY3Rpb24odCl7dD09PWEub3B0aW9ucy5yZWZlcmVuY2VMbmcmJmEucXVldWUuY2FsbChhLGEub3B0aW9ucy5yZWZlcmVuY2VMbmcsZSxuLHIsbyxpKX0pfX0se2tleToid3JpdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigheWUodGhpcy5xdWV1ZWRXcml0ZXMsWyJsb2NrcyIsdCxlXSkpe3ZhciByPWJlKHRoaXMub3B0aW9ucy5hZGRQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxvPWJlKHRoaXMub3B0aW9ucy51cGRhdGVQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxpPXllKHRoaXMucXVldWVkV3JpdGVzLFt0LGVdKTtpZih2ZSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSxbXSksaS5sZW5ndGgpe3ZlKHRoaXMucXVldWVkV3JpdGVzLFsibG9ja3MiLHQsZV0sITApO3ZhciBhPSExLHM9ITEsdT17fSxjPXt9O2kuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10Lm9wdGlvbnMmJnQub3B0aW9ucy50RGVzY3JpcHRpb24/e3ZhbHVlOnQuZmFsbGJhY2tWYWx1ZXx8IiIsY29udGV4dDp7dGV4dDp0Lm9wdGlvbnMudERlc2NyaXB0aW9ufX06dC5mYWxsYmFja1ZhbHVlfHwiIjt0Lm9wdGlvbnMmJnQub3B0aW9ucy5pc1VwZGF0ZT8oc3x8KHM9ITApLGNbdC5rZXldPWUpOihhfHwoYT0hMCksdVt0LmtleV09ZSl9KTt2YXIgbD0wO2EmJmwrKyxzJiZsKys7dmFyIGY9ZnVuY3Rpb24oKXstLWx8fCh2ZShuLnF1ZXVlZFdyaXRlcyxbImxvY2tzIix0LGVdLCExKSxpLmZvckVhY2goZnVuY3Rpb24odCl7dC5jYWxsYmFjayYmdC5jYWxsYmFjaygpfSksbi5kZWJvdW5jZWRQcm9jZXNzKHQsZSkpfTtsfHxmKCksYSYmeGUocixwZSh7fSx7YXV0aG9yaXplOiEwfSx0aGlzLm9wdGlvbnMpLGZ1bmN0aW9uKHQsZSl7ZigpfSx1KSxzJiZ4ZShvLHBlKHt9LHthdXRob3JpemU6ITB9LHRoaXMub3B0aW9ucyksZnVuY3Rpb24odCxlKXtmKCl9LGMpfX19fSx7a2V5OiJwcm9jZXNzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7T2JqZWN0LmtleXModGhpcy5xdWV1ZWRXcml0ZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7ImxvY2tzIiE9PWUmJk9iamVjdC5rZXlzKHQucXVldWVkV3JpdGVzW2VdKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QucXVldWVkV3JpdGVzW2VdW25dLmxlbmd0aCYmdC53cml0ZShlLG4pfSl9KX19LHtrZXk6InF1ZXVlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWdlKHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSx7a2V5Om4sZmFsbGJhY2tWYWx1ZTpyfHwiIixjYWxsYmFjazpvLG9wdGlvbnM6aX0pLHRoaXMuZGVib3VuY2VkUHJvY2VzcygpfX1dKSYmaGUoZS5wcm90b3R5cGUsbiksciYmaGUoZSxyKSx0fSgpO3dlLnR5cGU9ImJhY2tlbmQiO3ZhciBrZT13ZSxTZT1uKDQzKTtmdW5jdGlvbiBFZSgpe3JldHVybihFZT14dCgpKHZ0LmEubWFyayhmdW5jdGlvbiB0KGUpe3JldHVybiB2dC5hLndyYXAoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLG5ldyBrdC5hKGZ1bmN0aW9uKHQpe3VlLmNoYW5nZUxhbmd1YWdlKGUsZnVuY3Rpb24oKXt0KHZvaWQgMCl9KX0pKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19LHQpfSkpKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gVGUoKXt2YXIgdDtyZXR1cm4gbXQoKSh0PXVlLnQpLmNhbGwodCx1ZSl9dmFyIGplPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrdC5hKGZ1bmN0aW9uKHQsZSl7dWUudXNlKG5ldyBsZS5hKG51bGwse29yZGVyOlsibmF2aWdhdG9yIl19KSkudXNlKGtlKS5pbml0KHtmYWxsYmFja0xuZzoiZW4iLG5zOlsiZGVmYXVsdCJdLGRlZmF1bHROUzoiZGVmYXVsdCIsYmFja2VuZDp7cHJvamVjdElkOlNlLmxvY2l6ZS5wcm9kdWN0SWQsdmVyc2lvbjpTZS5sb2NpemUudmVyc2lvbixhcGlLZXk6U2UubG9jaXplLmFwaUtleSxyZWZlcmVuY2VMbmc6ImVuIn19LGZ1bmN0aW9uKG4scil7cmV0dXJuIG4/ZShuKTp0KHIpfSl9KX0sY2hhbmdlTGFuZ3VhZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIEVlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZ2V0TGFuZ3VhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gdWUubGFuZ3VhZ2V9LGdldFQ6VGV9LEFlPW4oODMpLE9lPW4ubihBZSksQ2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWUuZGF0YTtwKCkodGhpcyx0KSx0aGlzLmRhdGE9bn1yZXR1cm4gZCgpKHQsbnVsbCxbe2tleToiY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0xO3I8ZS5sZW5ndGg7cis9MSl7Zm9yKHZhciBvPXt9LGk9MDtpPHQubGVuZ3RoO2krPTEpb1t0W2ldXT1lW3JdW2ldO24ucHVzaChvKX1yZXR1cm4gbn19LHtrZXk6InNwbGl0Q291bnRyaWVzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD8iIj09PXR8fCIsIj09PXQ/W106dC5zcGxpdCgiLCIpOltdfX0se2tleToibm9ybWFsaXplUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0wLG89VygpKHQpO3I8by5sZW5ndGg7cisrKXt2YXIgaSxhPXRbb1tyXV07YS5zaGlmdCgpLG49dSgpKGk9W10pLmNhbGwoaSxPZSgpKG4pLE9lKCkoYSkpfXJldHVybiBuLnVuc2hpZnQoZSkse2RhdGE6bn19fV0pLHR9KCk7ZnVuY3Rpb24gTGUodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFvLmEpcmV0dXJuITE7aWYoby5hLnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKCkoRGF0ZSxbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1rKCkodCk7aWYoZSl7dmFyIGk9aygpKHRoaXMpLmNvbnN0cnVjdG9yO249bygpKHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4geCgpKHRoaXMsbil9fXZhciBSZT17YnlVcmw6e25hbWU6ImJ5VXJsIixjb2x1bW5zOlsidXJsIiwiY291bnRyaWVzIl19LGJ5SXRlbU5hbWU6e25hbWU6ImJ5SXRlbU5hbWUiLGNvbHVtbnM6WyJpdGVtTmFtZSIsImNvdW50cmllcyJdfSxieUl0ZW1Db2RlOntuYW1lOiJieUl0ZW1Db2RlIixjb2x1bW5zOlsiaXRlbUNvZGUiLCJjb3VudHJpZXMiXX0sYnlDYXRlZ29yeTp7bmFtZToiYnlDYXRlZ29yeSIsY29sdW1uczpbImNhdGVnb3J5IiwiY291bnRyaWVzIl19LGJ5SXRlbURlc2NyaXB0aW9uOntuYW1lOiJieUl0ZW1EZXNjcmlwdGlvbiIsY29sdW1uczpbInRleHQiLCJjb3VudHJpZXMiXX19LFBlPWZ1bmN0aW9uKHQpe20oKShuLHQpO3ZhciBlPUxlKG4pO2Z1bmN0aW9uIG4odCl7dmFyIHI7cmV0dXJuIHAoKSh0aGlzLG4pLChyPWUuY2FsbCh0aGlzLHQpKS5kYXRhPXQuZGF0YSxyLnNoZWV0VHlwZT10LnNoZWV0VHlwZXx8UmUscn1yZXR1cm4gZCgpKG4sW3trZXk6ImJ5VXJsIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieVVybClyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieVVybDtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBsKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dXJsOmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5zaGVldFR5cGUuYnlJdGVtTmFtZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieUl0ZW1OYW1lO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGwoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybntpdGVtTmFtZTplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOkNlLnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImJ5SXRlbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbUNvZGUpcmV0dXJuW107dmFyIHQ9dGhpcy5zaGVldFR5cGUuYnlJdGVtQ29kZTtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBsKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57aXRlbUNvZGU6ZVt0LmNvbHVtbnNbMF1dLGNvdW50cmllczpDZS5zcGxpdENvdW50cmllcyhuKSxpc0FsbDoiQUxMIj09PW59fSl9fSx7a2V5OiJieUNhdGVnb3J5Iix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieUNhdGVnb3J5KXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5Q2F0ZWdvcnk7aWYoIXRoaXMuZGF0YVt0Lm5hbWVdKXJldHVybltdO3ZhciBlPUNlLmNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEodC5jb2x1bW5zLHRoaXMuZGF0YVt0Lm5hbWVdKTtyZXR1cm4gbCgpKGUpLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgbj1lW3QuY29sdW1uc1sxXV07cmV0dXJue2NhdGVnb3J5OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtRGVzY3JpcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIGwoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybnt0ZXh0OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZXhjbHVzaW9uOntieVVybDp0aGlzLmJ5VXJsKCksYnlJdGVtTmFtZTp0aGlzLmJ5SXRlbU5hbWUoKSxieUl0ZW1Db2RlOnRoaXMuYnlJdGVtQ29kZSgpLGJ5Q2F0ZWdvcnk6dGhpcy5ieUNhdGVnb3J5KCksYnlJdGVtRGVzY3JpcHRpb246dGhpcy5ieUl0ZW1EZXNjcmlwdGlvbigpfX19fV0pLG59KENlKSxOZT1uKDYzKSxJZT1uLm4oTmUpLERlPW4oODQpO2Z1bmN0aW9uIF9lKHQsZSl7dmFyIG47aWYodm9pZCAwPT09VS5hfHxudWxsPT1fKCkodCkpe2lmKEkoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBNZSh0LGUpO3ZhciByPUgoKShuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpOyJPYmplY3QiPT09ciYmdC5jb25zdHJ1Y3RvciYmKHI9dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PXJ8fCJTZXQiPT09cilyZXR1cm4gcSgpKHQpO2lmKCJBcmd1bWVudHMiPT09cnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpcmV0dXJuIE1lKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1QKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtzPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBNZSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIFVlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9aygpKHQpO2lmKGUpe3ZhciBpPWsoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHgoKSh0aGlzLG4pfX12YXIgQmU9ZnVuY3Rpb24odCl7bSgpKG4sdCk7dmFyIGU9VWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBwKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZCgpKG4sW3trZXk6ImV4Y2x1ZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGEscz0hMSxjPXRoaXMubG9jYXRpb24uY291bnRyeSxsPV9lKHQpO3RyeXtmb3IobC5zKCk7IShvPWwubigpKS5kb25lOyl7dmFyIGY9by52YWx1ZTtpZihyKGYpKXtzPW4ubWF0Y2hDb3VudHJ5KGYsYyk7YnJlYWt9fX1jYXRjaCh0KXtsLmUodCl9ZmluYWxseXtsLmYoKX1yZXR1cm4gcz8oYXQuYS5kZWJ1Zyh1KCkoaT0iRVhDTFVERUQgQlkgU1BSRUFEU0hFRVQ6ICIuY29uY2F0KGUsIiwgIikpLmNhbGwoaSxjKSkse2NvZGU6IkVYQ0xVREVEX0JZX0JMQUNLTElTVCIsbWVzc2FnZTp1KCkoYT0iIi5jb25jYXQoZSwiLCAiKSkuY2FsbChhLGMsIiDjgavoqbLlvZPjgZfjgZ/jgZ/jgoHpmaTlpJYiKSxwYXJhbXM6e3ZhbHVlOmUsY291bnRyeTpjfX0pOkRlLmF9fV0sW3trZXk6Im1hdGNoQ291bnRyeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4hKCF0LmlzQWxsJiYwIT09dC5jb3VudHJpZXMubGVuZ3RoKXx8SWUoKShuPXQuY291bnRyaWVzKS5jYWxsKG4sZSl9fV0pLG59KERlLmIpO2Z1bmN0aW9uIHFlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9aygpKHQpO2lmKGUpe3ZhciBpPWsoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHgoKSh0aGlzLG4pfX12YXIgRmU9d2luZG93LnppZ3phZyxIZT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJidG4tbmF2IikubGVuZ3RoPjAsemU9L1wvaXRlbVwvXGQrLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtkdC5vbkNoYW5nZXNSZWFkeShmdW5jdGlvbih0KXsvdG93ZXJcLmpwXC8vLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoSGU/KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5pdGVtLWluZm8tbWFpbiAubWFpbi1jYXJ0aW4tYnRuLCAjRmxvYXRpbmdDYXJ0SW4gLm1haW4tY2FydGluLWJ0biIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShuPXIuY2xvc2VzdCgiLnJlbGF0aW9uLWdyb3VwLWl0ZW0tcm93IikpLmNhbGwobiwiLml0ZW0taW5mby1ibG9jayA+IGEiKS5hdHRyKCJocmVmIil8fCIifX0pKSxkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmJD0iL2VjL1Nob3BwaW5nQmFnL0l0ZW1MaXN0Il0nLGZ1bmN0aW9uKCl7RmUucGFnZVRvKCJjYXJ0Iil9KSx0KCIuYm94LnNlY3Rpb24sIC50ZXh0LWhvbGRlciIpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmKj0iYWN0aW9uPWNhcnRpbiJdJyxmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG49dChlLnRhcmdldCk7aWYobi5jbG9zZXN0KCIuZXZlbi1pdGVtIikubGVuZ3RoPjApe3ZhciByPW4uY2xvc2VzdCgiLmV2ZW4taXRlbSIpO0UoKShyKS5jYWxsKHIsIi5zdWItdGl0bGUiKS5sZW5ndGg+MD93aW5kb3cubG9jYXRpb24uaHJlZj1FKCkocikuY2FsbChyLCIuc3ViLXRpdGxlID4gYSIpLmF0dHIoImhyZWYiKXx8IiI6RSgpKHIpLmNhbGwociwiLndyYXBwLXRleHQiKS5sZW5ndGg+MCYmKHdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShyKS5jYWxsKHIsIi53cmFwcC10ZXh0IGE6Zmlyc3Qtb2YtdHlwZSIpLmF0dHIoImhyZWYiKXx8IiIpfX19KSk6KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5wcmljZS1pbmZvLW1haW4gLmNhcnRpbi1hcmVhLW5vd29uc2FsZSwgLnByaWNlLWluZm8tbWFpbiAuY2FydGluLWFyZWEtcmVzZXJ2ZSIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShuPXIuY2xvc2VzdCgiLml0ZW0tYmxvY2siKSkuY2FsbChuLCIuaXRlbS1pbmZvLWJsb2NrID4gYSIpLmF0dHIoImhyZWYiKXx8IiJ9fSkpLGR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYkPSIvZWMvU2hvcHBpbmdCYWcvSXRlbUxpc3QiXScsZnVuY3Rpb24oKXtGZS5wYWdlVG8oImNhcnQiKX0pLHQoIi50b3BNb2R1bGVCb3gsIC5hcnRpc3RNYWluT25lQ29sdW1uLCAuc2VhcmNoTGlzdFRhYmxlIikubGVuZ3RoPjAmJmR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYqPSJhY3Rpb249Y2FydGluIl0nLGZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0KXt2YXIgbixyPXQoZS50YXJnZXQpO2lmKHIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShuPXIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpKS5jYWxsKG4sIi5uYW1lOmZpcnN0LW9mLXR5cGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIjtlbHNlIGlmKHIuY2xvc2VzdCgiLmFydGlzdFNlY3Rpb25MaW5lMDEiKS5sZW5ndGg+MCl7dmFyIG87d2luZG93LmxvY2F0aW9uLmhyZWY9RSgpKG89ci5jbG9zZXN0KCJsaSIpKS5jYWxsKG8sIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuaW5NZGwtZmVhdHVyZUl0ZW1DZWxsLCAuZGlzY29ncmFwaHlMaW5ldXBUYWJsZTAxIikubGVuZ3RoPjApe3ZhciBpO3dpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShpPXIuY2xvc2VzdCgiLmluTWRsLWZlYXR1cmVJdGVtQ2VsbCwgLmRpc2NvZ3JhcGh5TGluZXVwVGFibGUwMSIpKS5jYWxsKGksIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuZmVhdHVyZUl0ZW1PdGhlckxpc3QwMSIpLmxlbmd0aD4wKXt2YXIgYTt3aW5kb3cubG9jYXRpb24uaHJlZj1FKCkoYT1yLmNsb3Nlc3QoImxpIikpLmNhbGwoYSwiLmltZyA+IHAgPiBhIikuYXR0cigiaHJlZiIpfHwiIn1lbHNlIGlmKHIuY2xvc2VzdCgiLmluTWRsLWF0Y2xJdGVtUm93IikubGVuZ3RoPjApe3ZhciBzO3dpbmRvdy5sb2NhdGlvbi5ocmVmPUUoKShzPXIuY2xvc2VzdCgibGkiKSkuY2FsbChzLCIudGl0bGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIn19fSx7ZGlzYWJsZVBvaW50ZXJFdmVudDohMH0pKSl9KTt2YXIgV2U9ZnVuY3Rpb24odCl7bSgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBwKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZCgpKG4sW3trZXk6ImdldEl0ZW0iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxyPXRoaXMsbz12KCkoaygpKG4ucHJvdG90eXBlKSwiZ2V0SXRlbSIsdGhpcykuY2FsbCh0aGlzKTtIZT9vLmltYWdlcz1sKCkodD10aGlzLiQoIiNqYWNrZXRQaG90b1N3aXBlciAubWFpbi1qYWNrZXQgaW1nIikuZ2V0KCkpLmNhbGwodCxmdW5jdGlvbih0KXtyZXR1cm4gci4kKHQpLmF0dHIoInNyYyIpfHwiIn0pOm8uaW1hZ2VzPWwoKShlPXRoaXMuJCgiI21haW4taW1hZ2UiKS5nZXQoKSkuY2FsbChlLGZ1bmN0aW9uKHQpe3JldHVybiByLiQodCkuYXR0cigic3JjIil8fCIifSk7cmV0dXJuIG99fSx7a2V5OiJnZXRJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7cmV0dXJuIHRoaXMuJCgiI1ByaXZpbGVnZUFyZWEiKS5sZW5ndGg+MD90KyLvvIjnibnlhbjjgYLjgorvvIkiOnR9fSx7a2V5OiJnZXRJdGVtUHJpY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT10LG49dGhpcy4kKCIuc2FsZS1wcmljZS12YWx1ZSIpLHI9dGhpcy4kKCIubXVsdGlidXktcHJpY2UtbGFiZWwiKS50ZXh0KCk7cmV0dXJuIG4ubGVuZ3RoPjAmJigv44G+44Go44KB44Gm44Kq44OV5L6h5qC8Ly50ZXN0KHIpfHwoZT1BKG4udGV4dCgpKSkpLGV9fSx7a2V5OiJnZXRQdXJjaGFzYWJsZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10aGlzLiQoJy5jYXJ0aW4tYXJlYS1ub3dvbnNhbGVbb25jbGljayo9IkNhcnRJbiJdLCAuY2FydGluLWFyZWEtcmVzZXJ2ZVtvbmNsaWNrKj0iQ2FydEluIl0nKS5sZW5ndGh8fChhdC5hLmRlYnVnKCLjgqvjg7zjg4jjg5zjgr/jg7PjgYznhKHjgYTjgZ/jgoHjgIHos7zlhaXkuI3lj68iKSwhMSl9fV0pLG59KEcpLCRlPWZ1bmN0aW9uKHQpe20oKShuLHQpO3ZhciBlPXFlKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gcCgpKHRoaXMsbiksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG59KFdlKSxZZT1mdW5jdGlvbih0KXttKCkobix0KTt2YXIgZT1xZShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIHAoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufShXZSksVmU9ZnVuY3Rpb24odCl7bSgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBwKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oQmUpO0ZlLmRpc2NvdmVyeShmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLG49dC5sb2NhdGlvbjshZnVuY3Rpb24odCxlKXt2YXIgbj13aW5kb3cuemlnemFnO24mJm4udXRpbHMuZmV0Y2hIdG1sKHQsZSl9KGZ1bmN0aW9uKHQpe3RyeXtpZighemUpcmV0dXJuIGUoKTt2YXIgcixvPW5ldyBQZSh7ZGF0YTpGZS5zaG9wRGF0YXx8e319KS5leGVjdXRlKCk7aWYoSGUpe3I9bmV3ICRlKHskOnQsbmFtZToiLml0ZW0tamFja2V0LXRpdGxlIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLml0ZW0taW5mbyAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfWVsc2V7cj1uZXcgWWUoeyQ6dCxuYW1lOiIuaXRlbS1pbmZvIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLnByaWNlLWluZm8tbWFpbiAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfXZhciBpPW5ldyBWZSh7bG9jYXRpb246bixzY3JhcGVyUmVzdWx0OnIsZGF0YTpvLmV4Y2x1c2lvbn0pLmV4ZWN1dGUoKTtyZXR1cm4gZShudWxsLHtpdGVtOnIuaXRlbSxza3VSb3dzOnIuc2t1Um93cyxleGNsdXNpb246aX0pfWNhdGNoKHQpe3JldHVybiBlKHQpfX0pfSk7dmFyIEdlPW5ldyBEYXRlKCJUaHUgTWFyIDQgMjAyMSAwMDowMDowMCBHTVQrMDgwMCIpLEtlPW5ldyBEYXRlKCJXZWQgTWFyIDE3IDIwMjEgMjM6NTk6NTkgR01UKzA4MDAiKSxYZT1uZXcgRGF0ZSxKZT1Cb29sZWFuKEZlLmxvY2F0aW9uJiYiQ04iPT09RmUubG9jYXRpb24uY291bnRyeSk7aWYoWGUuZ2V0VGltZSgpPj1HZS5nZXRUaW1lKCkmJlhlLmdldFRpbWUoKTw9S2UuZ2V0VGltZSgpJiZKZSl7aWYoRmUubm90aWNlTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG49VGUoKTtyZXR1cm57anVtYm90cm9uOntodG1sOnUoKSh0PXUoKShlPSJcbiAgPGRpdiBzdHlsZT0nbWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Jz5cbiAgPGRpdj5cbiAgPHNwYW4gc3R5bGU9J21hcmdpbjogMzRweCAwIDAgIWltcG9ydGFudDsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsnPjxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL25vdGljZU1vZGFsX2xvZ28ucG5nJyBhbHQ9J1dvcmxkU2hvcHBpbmfDl1RPV0VSIFJFQ09SRFMnIHN0eWxlPSdtYXgtd2lkdGg6IDQwMHB4ICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Jz48L3NwYW4+XG4gIDxoMSBzdHlsZT0nZm9udC1zaXplOiAyLjlyZW0gIWltcG9ydGFudDsnPiIuY29uY2F0KG4oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwiPC9oMT5cbiAgPGgyIHN0eWxlPSdmb250LXNpemU6IDEuNHJlbSAhaW1wb3J0YW50Oyc+IikpLmNhbGwoZSxuKCJjb21tb24ubm90aWNlTW9kYWwuanVtYm90cm9uLmgyIiksIjwvaDI+XG4gIDxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL2NvbW1vbi9hbGlwYXlfY2FtcGFpZ25fMjAyMTAzMDQucG5nJyBzdHlsZT0nd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgbWF4LXdpZHRoOiA1MDBweCAhaW1wb3J0YW50Oyc+XG4gIDxhIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7JyBocmVmPSdodHRwczovL3Rvd2VyLmpwL3NpdGUvaG93dG8vZm9yaW50ZXJuYXRpb25hbGN1c3RvbWVyJz5cbiAgPHNwYW4gc3R5bGU9J2Rpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXNpemU6IDEuNnJlbSAhaW1wb3J0YW50O1xuICAgICAgbWFyZ2luOiAxcmVtIGF1dG8gIWltcG9ydGFudDtcbiAgICAgIHBhZGRpbmc6IDFyZW0gIWltcG9ydGFudDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7XG4gICAgICBtYXgtd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXI6IHNvbGlkICNmZmNhMDAgIWltcG9ydGFudDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmNhMDAgIWltcG9ydGFudDtcbiAgICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LG4oInRvd2VyX2pwLm5vdGljZU1vZGFsLmp1bWJvdHJvbi50ZXh0IiksIjwvc3Bhbj5cbiAgPC9hPlxuICA8L2Rpdj5cbiAgPC9kaXY+XG4gICIpfX19KSx6ZSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaXRlbS1pbmZvLW1haW4gLnN0b2NrLXN0YXR1cyIpLmxlbmd0aD4wJiYi44GK5Y+W44KK5a+E44GbIj09PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIilbMF0udGV4dENvbnRlbnQ/RmUuaXRlbU1vZGFsKGZ1bmN0aW9uKCl7dmFyIHQsZT1UZSgpO3JldHVybntib3R0b206e2h0bWw6dSgpKHQ9IlxuICA8ZGl2IHN0eWxlPSdtYXJnaW46IC0xMHB4IDAgLThweCAhaW1wb3J0YW50Oyc+XG4gIDxwIHN0eWxlPSdjb2xvcjogcmVkICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7XG4gICAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50O1xuICAgICAgbWFyZ2luOiAwLjRlbSAwICFpbXBvcnRhbnQ7Jz4iLmNvbmNhdChlKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50aXRsZSIpLCI8L3A+XG4gIDxwIHN0eWxlPSdmb250LXNpemU6IDExcHggIWltcG9ydGFudDtcbiAgICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZSAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50O1xuICAgICAgcGFkZGluZy1ib3R0b206IDAuMmVtICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LGUoInRvd2VyX2pwLml0ZW0uYm90dG9tLnRleHQiKSwiPC9wPlxuICA8L2Rpdj5cbiAgPGltZyBzcmM9J2h0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvY29tbW9uL2FsaXBheV9jYW1wYWlnbl8yMDIxMDMwNC5wbmcnIHN0eWxlPSd3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBtYXJnaW4tYm90dG9tOiAtMTVweCAhaW1wb3J0YW50Oyc+XG4gICIpfX19KTpGZS5pdGVtTW9kYWwoZnVuY3Rpb24oKXtyZXR1cm57Ym90dG9tOntodG1sOiJcbiAgICAgIDxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL2NvbW1vbi9hbGlwYXlfY2FtcGFpZ25fMjAyMTAzMDQucG5nJyBzdHlsZT0nd2lkdGg6IDEwMCUgIWltcG9ydGFudDsnPlxuICAgICAgIn19fSk7RmUubGF1bmNoKGZ1bmN0aW9uKCl7dmFyIHQ9IXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oIlNUT1JBR0VfS0VZX3JhZ3RhZ19qcCIpO3JldHVybiBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCJTVE9SQUdFX0tFWV9yYWd0YWdfanAiLGEoKSghMCkpLHQ/Im5vdGljZSI6bnVsbH0pfWVsc2V7aWYoRmUubm90aWNlTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG49VGUoKTtyZXR1cm57anVtYm90cm9uOntodG1sOnUoKSh0PXUoKShlPSJcbjxkaXYgc3R5bGU9J21hcmdpbjogNnB4IDAgMCAhaW1wb3J0YW50Oyc+XG48ZGl2PlxuPHNwYW4gc3R5bGU9J21hcmdpbjogMzRweCAwIDAgIWltcG9ydGFudDsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsnPjxpbWcgc3JjPSdodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL25vdGljZU1vZGFsX2xvZ28ucG5nJyBhbHQ9J1dvcmxkU2hvcHBpbmfDl1RPV0VSIFJFQ09SRFMnIHN0eWxlPSdtYXgtd2lkdGg6IDQwMHB4ICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Jz48L3NwYW4+XG48aDEgc3R5bGU9J2ZvbnQtc2l6ZTogMi45cmVtICFpbXBvcnRhbnQ7Jz4iLmNvbmNhdChuKCJjb21tb24ubm90aWNlTW9kYWwuanVtYm90cm9uLmgxIiksIjwvaDE+XG48aDIgc3R5bGU9J2ZvbnQtc2l6ZTogMS40cmVtICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbChlLG4oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDIiKSwiPC9oMj5cbjxhIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7JyBocmVmPSdodHRwczovL3Rvd2VyLmpwL3NpdGUvaG93dG8vZm9yaW50ZXJuYXRpb25hbGN1c3RvbWVyJz5cbjxzcGFuIHN0eWxlPSdkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luOiAxcmVtIGF1dG8gIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICBtYXgtd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiBzb2xpZCAjZmZjYTAwICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LG4oInRvd2VyX2pwLm5vdGljZU1vZGFsLmp1bWJvdHJvbi50ZXh0IiksIjwvc3Bhbj5cbjwvYT5cbjwvZGl2PlxuPC9kaXY+XG4iKX19fSksRmUuY2FydE1vZGFsKGZ1bmN0aW9uKCl7dmFyIHQsZSxuLHI9VGUoKTtyZXR1cm57Ym90dG9tOntodG1sOnUoKSh0PXUoKShlPXUoKShuPSJcbjxkaXYgc3R5bGU9J2xpbmUtaGVpZ2h0OiAxLjMgIWltcG9ydGFudDsnPlxuPHAgc3R5bGU9J2NvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Jz4iLmNvbmNhdChyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0MS5hbGVydCIpLCI8L3A+XG48dWwgc3R5bGU9J21hcmdpbjogMC40ZW0gMCAhaW1wb3J0YW50Oyc+XG48bGkgc3R5bGU9J2ZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbChuLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUxIiksIjwvbGk+XG48bGkgc3R5bGU9J2ZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbChlLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUyIiksIjwvbGk+XG48L3VsPlxuPHAgc3R5bGU9J2NvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLnRleHQyLmFsZXJ0IiksIiA8L3A+XG48L2Rpdj5cbiIpfX19KSx6ZSlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaXRlbS1pbmZvLW1haW4gLnN0b2NrLXN0YXR1cyIpLmxlbmd0aD4wJiYi44GK5Y+W44KK5a+E44GbIj09PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIilbMF0udGV4dENvbnRlbnQmJkZlLml0ZW1Nb2RhbChmdW5jdGlvbigpe3ZhciB0LGU9VGUoKTtyZXR1cm57Ym90dG9tOntodG1sOnUoKSh0PSJcbjxkaXY+XG48cCBzdHlsZT0nY29sb3I6IHJlZCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7XG4gICAgbGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDtcbiAgICBtYXJnaW46IDAuNGVtIDAgIWltcG9ydGFudDsnPiIuY29uY2F0KGUoInRvd2VyX2pwLml0ZW0uYm90dG9tLnRpdGxlIiksIjwvcD5cbjxwIHN0eWxlPSdmb250LXNpemU6IDExcHggIWltcG9ydGFudDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmUgIWltcG9ydGFudDtcbiAgICBsaW5lLWhlaWdodDogMS4yICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDAuMmVtICFpbXBvcnRhbnQ7Jz4iKSkuY2FsbCh0LGUoInRvd2VyX2pwLml0ZW0uYm90dG9tLnRleHQiKSwiPC9wPlxuPC9kaXY+XG4iKX19fSl9L3Rvd2Vyc2hpYnV5YVwuanBcL2twb3AvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpPyhGZS5sYXVuY2goZnVuY3Rpb24oKXtyZXR1cm4iYmFubmVyLWhpZGRlbiJ9KSxGZS5iYW5uZXIoZnVuY3Rpb24oKXtyZXR1cm57aGlkZGVuOntodG1sOidcbjxhIGhyZWY9Imh0dHBzOi8vYml0Lmx5LzJZVWxLVGQiPlxuPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogIzY0NjU2NyAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDRweCA0cHggMCAhaW1wb3J0YW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1xuICAgIGJvdHRvbTogMCAhaW1wb3J0YW50O1xuICAgIHJpZ2h0OiAxMHB4ICFpbXBvcnRhbnQ7XG4gICAgbGVmdDogYXV0byAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMTBweCAwIDAgIWltcG9ydGFudDsiPlxuICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgd2lkdGg6IDUwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA2cHggN3B4IDVweCA3cHggIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiA2cHggNnB4IDAgMCAhaW1wb3J0YW50OyI+XG4gICAgPGltZyBzcmM9Imh0dHBzOi8vY2hlY2tvdXQtc3RhdGljLndvcmxkc2hvcHBpbmcuanAvaW1hZ2VzL2NvbW1vbi9iYW5uZXJfaGlkZGVuX2ljb25fZW4uc3ZnIiBhbHQ9Ikdsb2JhbCBTaGlwcGluZyIgc3R5bGU9IndpZHRoOiA1MnB4ICFpbXBvcnRhbnQ7Ij5cbiAgICA8L3NwYW4+XG48L2Rpdj5cbjwvYT5cbid9fX0pKTovKHRvd2Vyc2hpYnV5YVwuanApLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSYmKEZlLmxhdW5jaChmdW5jdGlvbigpe3JldHVybiJiYW5uZXItaGlkZGVuIn0pLEZlLmJhbm5lcihmdW5jdGlvbigpe3JldHVybntoaWRkZW46e2h0bWw6J1xuPGEgaHJlZj0iaHR0cHM6Ly9iaXQubHkvM2dMdTR1QSI+XG48ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjNjQ2NTY3ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNHB4IDRweCAwICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgcmlnaHQ6IDEwcHggIWltcG9ydGFudDtcbiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweCAxMHB4IDAgMCAhaW1wb3J0YW50OyI+XG4gICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDZweCA3cHggNXB4IDdweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8aW1nIHNyYz0iaHR0cHM6Ly9jaGVja291dC1zdGF0aWMud29ybGRzaG9wcGluZy5qcC9pbWFnZXMvY29tbW9uL2Jhbm5lcl9oaWRkZW5faWNvbl9lbi5zdmciIGFsdD0iR2xvYmFsIFNoaXBwaW5nIiBzdHlsZT0id2lkdGg6IDUycHggIWltcG9ydGFudDsiPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuPC9hPlxuJ319fSkpLC8obWlraWtpXC50b2t5b1wuanBcLykvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoRmUubGF1bmNoKGZ1bmN0aW9uKCl7cmV0dXJuImJhbm5lci1oaWRkZW4ifSksRmUuYmFubmVyKGZ1bmN0aW9uKCl7cmV0dXJue2hpZGRlbjp7aHRtbDonXG48YSBocmVmPSJodHRwczovL2JpdC5seS8zMUlOejJMIj5cbjxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICM2NDY1NjcgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA0cHggNHB4ICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm90dG9tOiAxMzBweCAhaW1wb3J0YW50O1xuICAgIHJpZ2h0OiAtMjNweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMCAwIDEwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIHdpZHRoOiA1MHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNnB4IDIwcHggNnB4IDdweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweCAwIDAgNnB4ICFpbXBvcnRhbnQ7Ij5cbiAgICA8aW1nIHNyYz0iaHR0cHM6Ly9jaGVja291dC1zdGF0aWMud29ybGRzaG9wcGluZy5qcC9pbWFnZXMvY29tbW9uL2Jhbm5lcl9oaWRkZW5faWNvbl9lbi5zdmciIGFsdD0iR2xvYmFsIFNoaXBwaW5nIiBzdHlsZT0id2lkdGg6IDUycHggIWltcG9ydGFudDsgYm9yZGVyLXJhZGl1czogNnB4IDAgMCA2cHggIWltcG9ydGFudDsiPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuPC9hPlxuJ319fSkpLC8odG93ZXJcLmpwXC98dG93ZXJzaGlidXlhXC5qcFwvfG1pa2lraVwudG9reW9cLmpwXC8pLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSYmamUuaW5pdGlhbGl6ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gRmUucnVuKCl9KX1dKTt9
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
13.32.21.90 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-32-21-90.fra56.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
8c733cea3cf1c19c77be990ec11e77ad2ec87d11ce45e5463c669a6e1d7b1e11

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

x-amz-version-id
nzspaJdZA3jd0ZOwLK1QEbAvbXTfQt8x
content-encoding
gzip
etag
W/"722c3d5881477ca3f2c96cacec8af403"
x-amz-cf-pop
FRA56-C2
x-cache
RefreshHit from cloudfront
access-control-max-age
300
x-amz-replication-status
COMPLETED
access-control-allow-origin
*
last-modified
Mon, 08 Mar 2021 07:10:42 GMT
server
AmazonS3
date
Mon, 08 Mar 2021 20:22:57 GMT
vary
Access-Control-Request-Headers,Access-Control-Request-Method
access-control-allow-methods
GET, HEAD
content-type
application/json
via
1.1 7d3c59ee1b45f72158a8cbce053c8978.cloudfront.net (CloudFront)
access-control-expose-headers
x-cache
cache-control
public, must-revalidate, proxy-revalidate, max-age=0
x-amz-cf-id
-gh2_5hUbcu65ZZal29BRxTZml2YTlXYhEXaQXmoxTcURe6ZsODR0g==
sodar2.js
tpc.googlesyndication.com/sodar/
17 KB
7 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20210303/r20190131/show_ads_impl_with_ama_fy2019.js?client=ca-pub-6762391202596396&plah=mikiki.tokyo.jp&amaexp=1
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:828::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
d9cebb89ed3e16a74386f743f3fc12fe98cb4fc5c11f03af5febdf1141ca6a39
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:55 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1611170586013198"
vary
Accept-Encoding
content-type
text/javascript
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
6403
x-xss-protection
0
expires
Mon, 08 Mar 2021 20:22:55 GMT
runner.html
tpc.googlesyndication.com/sodar/sodar2/221/ Frame 28E6
12 KB
5 KB
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2/221/runner.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:828::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
49e1dcef611a905b866974d135554059ecd77a0ae022553178ec359ea0b64504
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/sodar2/221/runner.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
sec-fetch-dest
iframe
referer
https://mikiki.tokyo.jp/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
Referer
https://mikiki.tokyo.jp/

Response headers

accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
cross-origin-resource-policy
cross-origin
content-length
4984
date
Mon, 08 Mar 2021 15:58:45 GMT
expires
Tue, 08 Mar 2022 15:58:45 GMT
last-modified
Tue, 08 Dec 2020 21:41:15 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
15851
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
combo
penta.a.one.impact-ad.jp/ul_cb/
Redirect Chain
  • https://penta.a.one.impact-ad.jp/combo?oid=1ce48bb6b1384539&dd_rft=k&dd_jsonp=a1tracker.cb._10&fu=4cd00445-4b43-4538-aa7f-0783a0f63a3d&src=https%3A%2F%2Fmikiki.tokyo.jp%2F&l=en-us&sr=1600x1200&vp=1...
  • https://penta.a.one.impact-ad.jp/ul_cb/combo?oid=1ce48bb6b1384539&dd_rft=k&dd_jsonp=a1tracker.cb._10&fu=4cd00445-4b43-4538-aa7f-0783a0f63a3d&src=https%3A%2F%2Fmikiki.tokyo.jp%2F&l=en-us&sr=1600x120...
1 KB
995 B
Script
General
Full URL
https://penta.a.one.impact-ad.jp/ul_cb/combo?oid=1ce48bb6b1384539&dd_rft=k&dd_jsonp=a1tracker.cb._10&fu=4cd00445-4b43-4538-aa7f-0783a0f63a3d&src=https%3A%2F%2Fmikiki.tokyo.jp%2F&l=en-us&sr=1600x1200&vp=1600x1200&cd=24-bit&tgsrc=a1common&dsc=Mikiki%E3%81%AF%E3%80%81%E3%82%82%E3%81%A3%E3%81%A8%E8%81%B4%E3%81%8D%E3%81%9F%E3%81%84%E3%80%81%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84%E3%80%81%E6%A5%BD%E3%81%97%E3%81%BF%E3%81%9F%E3%81%84%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%83%E3%82%AF%E3%83%BB%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%83%BB%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7%E3%81%99&dt=Mikiki%20-%20music%20review%20site
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
107.178.248.96 Kansas City, United States, ASN15169 (GOOGLE, US),
Reverse DNS
96.248.178.107.bc.googleusercontent.com
Software
nginx /
Resource Hash
f543bee39dc60d9260e15ac903264941f9b6a3efa3fa8ad2aa6546eedcc39cd8
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains;

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:56 GMT
via
1.1 google
server
nginx
strict-transport-security
max-age=31536000; includeSubDomains;
content-type
text/javascript;charset=utf-8
content-encoding
gzip
alt-svc
clear
content-length
601

Redirect headers

date
Mon, 08 Mar 2021 20:22:56 GMT
via
1.1 google
server
nginx
strict-transport-security
max-age=31536000; includeSubDomains;
content-type
text/plain
location
/ul_cb/combo?oid=1ce48bb6b1384539&dd_rft=k&dd_jsonp=a1tracker.cb._10&fu=4cd00445-4b43-4538-aa7f-0783a0f63a3d&src=https%3A%2F%2Fmikiki.tokyo.jp%2F&l=en-us&sr=1600x1200&vp=1600x1200&cd=24-bit&tgsrc=a1common&dsc=Mikiki%E3%81%AF%E3%80%81%E3%82%82%E3%81%A3%E3%81%A8%E8%81%B4%E3%81%8D%E3%81%9F%E3%81%84%E3%80%81%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84%E3%80%81%E6%A5%BD%E3%81%97%E3%81%BF%E3%81%9F%E3%81%84%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%83%E3%82%AF%E3%83%BB%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%83%BB%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7%E3%81%99&dt=Mikiki%20-%20music%20review%20site
alt-svc
clear
content-length
0
/
googleads.g.doubleclick.net/pagead/viewthroughconversion/875187971/
2 KB
1 KB
Script
General
Full URL
https://googleads.g.doubleclick.net/pagead/viewthroughconversion/875187971/?random=1615234976007&cv=9&fst=1615234976007&num=1&guid=ON&resp=GooglemKTybQhCsO&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Fmikiki.tokyo.jp%2F&tiba=Mikiki%20-%20music%20review%20site&hn=www.googleadservices.com&async=1&rfmt=3&fmt=4
Requested by
Host: www.googleadservices.com
URL: https://www.googleadservices.com/pagead/conversion_async.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:802::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
20177fa171e87e19fba647e06f8450470adbacb0609bb119c00137c21e84aae2
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 08 Mar 2021 20:22:56 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
cache-control
no-cache, must-revalidate
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
content-type
text/javascript; charset=UTF-8
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
992
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
Q9MKgAIr8xj9wBMLW1buCS1LNKSoLAVOfjIlinQ2UMU.js
pagead2.googlesyndication.com/bg/ Frame 28E6
14 KB
6 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/bg/Q9MKgAIr8xj9wBMLW1buCS1LNKSoLAVOfjIlinQ2UMU.js
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2/221/runner.html
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:827::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
43d30a80022bf318fdc0130b5b56ee092d4b34a4a82c054e7e32258a743650c5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tpc.googlesyndication.com/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 07:40:57 GMT
content-encoding
br
x-content-type-options
nosniff
last-modified
Mon, 01 Mar 2021 10:45:00 GMT
server
sffe
age
45719
vary
Accept-Encoding
content-type
text/javascript
cache-control
public, max-age=31536000
cross-origin-resource-policy
cross-origin
accept-ranges
bytes
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
5643
x-xss-protection
0
expires
Tue, 08 Mar 2022 07:40:57 GMT
/
www.google.com/pagead/1p-user-list/875187971/
42 B
108 B
Image
General
Full URL
https://www.google.com/pagead/1p-user-list/875187971/?random=1615234976007&cv=9&fst=1615233600000&num=1&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&sendb=1&frm=0&url=https%3A%2F%2Fmikiki.tokyo.jp%2F&tiba=Mikiki%20-%20music%20review%20site&async=1&fmt=3&is_vtc=1&random=1987234370&resp=GooglemKTybQhCsO&rmt_tld=0&ipr=y
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:82a::2004 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 08 Mar 2021 20:22:56 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.google.de/pagead/1p-user-list/875187971/
42 B
108 B
Image
General
Full URL
https://www.google.de/pagead/1p-user-list/875187971/?random=1615234976007&cv=9&fst=1615233600000&num=1&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&sendb=1&frm=0&url=https%3A%2F%2Fmikiki.tokyo.jp%2F&tiba=Mikiki%20-%20music%20review%20site&async=1&fmt=3&is_vtc=1&random=1987234370&resp=GooglemKTybQhCsO&rmt_tld=1&ipr=y
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 08 Mar 2021 20:22:56 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
gen_204
pagead2.googlesyndication.com/pagead/
0
46 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=221&t=2&li=gda_r20210303&jk=1284100185698243&bg=!i4iliMvNAAWsVXnBrDsAKQB2-DxaFcSk8orldS3BMu482CGvbd8pn--wYy1C2RbFfxq0mwSAtQZ4AgAAAGhSAAAABmgBBwoA-vIdDKdDrZekgte_1mL4bAlwwib32lC8THOPMjAFMhDYsoeK5IHiJPCzeLyGZ_tjQay0srQxE1Hr2GuPY3mK-WAkXImID7JWZoMqw6CqlT2xr7m5qghStftzGDkRxslywKK1vKqt72OlaJfZCGzLgOi-guC02Hu6YUjyOGu69tyHHZhvCnf11VsIXG2JjM-_hWSlrAqhEJ0Aci0YGRWTLeizwgp5M8DRHruqzsMHuLUf7Swu4ITe1dFzM0gShDWa7zssoviq5KjBbuDQZYAjHHP-SFpaDzsZlOD60pvM9i190Q3R3NI2G2EhLTgTbQlzz8jZLcB8ZYiRmiqZAhSuxCGa5QoKuyC6XDwJCy-8G8aeOHUktekZ1xRKXlBPHp2ugdRHEwEswmkx1BWOgEC_m3ZzP67r0WJwTeCn_WsKLQXDkNS_nwlReq9ioYlkopsjBRf9WiU_tEuJ8SKi7gGL3UD841MA6lZMhNm3KHeHl9XINhrm21BhzCSD1-QHFj5c6Eu3SGwsJ5JiUP0hd3qsfx9dYOqHZt7HywX1cr2KRs28jqpCdwhdf0yDTskirnh_mfB1nCoeWI2Z8HOJ4NFEoRzLdXZzwcd6tfl4B2H01fNMivTwkG7oiI27ucU_u_83z80VF6Qhg4LdJe4RCEhainTQpP04sMrhi14705QPqTeFzngXbgZLC9KMqrNduuUHUnB-D6Cxk6HRmzrxKtjsTtBWbKqgHToQrQeK7zijXVVBAZuCIsar3FvY9LPbRFpg4Xq6lO-2G6rkMZ6UGntXYCpr8ZK6lGkU5BzQ46zbqNA4HvRsu6Dw741vxdcOyj7i3HiUx0zvLPD06qWon_MJhqg29mS-R83Ay06vDyI9NMBglN0t5rCD3VZcRzga8l44hdD2O0hL44Mf2W6G2HA3_HR25bhNCph_tPtTWhxgsiN3lR_wfb6QsTzzcKMUUUG-aPB36oc2c64uWfIzcUADnFBtidqvvG_lqEAGugje4BSpEezhpQLEvV0iBD6CH0yqNCgBzmtvbFTGXZrkxG3pRu49
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:827::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 08 Mar 2021 20:22:56 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, must-revalidate
cross-origin-resource-policy
cross-origin
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
report
checkout-api.worldshopping.jp/v1/ Frame
0
0
Preflight
General
Full URL
https://checkout-api.worldshopping.jp/v1/report
Protocol
H2
Server
143.204.209.77 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-209-77.fra53.r.cloudfront.net
Software
/
Resource Hash

Request headers

Accept
*/*
Access-Control-Request-Method
POST
Access-Control-Request-Headers
content-type
Origin
https://mikiki.tokyo.jp
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

content-type
application/json
content-length
1
date
Mon, 08 Mar 2021 20:22:57 GMT
x-amzn-requestid
d4d0863c-94a4-40e3-bc9c-178ddda43444
access-control-allow-origin
https://mikiki.tokyo.jp
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
x-amz-apigw-id
b4ohNF6qNjMFowg=
access-control-allow-methods
OPTIONS,POST
access-control-allow-credentials
false
via
1.1 3bf3e75bcb9a86b3eb343a1d4392a6df.cloudfront.net (CloudFront), 1.1 110641d379117242a91443ac729d6def.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA2-C1 FRA53-C1
x-cache
Miss from cloudfront
x-amz-cf-id
419hQ9X6FQy0euAEOog6rJcnfjMkDsRssuQP5EPu5n32LCnbTEtrdg==
report
checkout-api.worldshopping.jp/v1/
2 B
444 B
XHR
General
Full URL
https://checkout-api.worldshopping.jp/v1/report
Requested by
Host: checkout-js.worldshopping.jp
URL: https://checkout-js.worldshopping.jp/checkout-3_2_28.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
143.204.209.77 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-209-77.fra53.r.cloudfront.net
Software
/
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
Content-Type
application/json

Response headers

date
Mon, 08 Mar 2021 20:22:58 GMT
via
1.1 5076c8187f430eebe5e26fc594d6125a.cloudfront.net (CloudFront), 1.1 110641d379117242a91443ac729d6def.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA2-C1, FRA53-C1
x-amzn-requestid
7138feb4-f949-4716-938a-e726250d3b79
x-cache
Miss from cloudfront
content-type
application/json; charset=utf-8
access-control-allow-origin
*
x-amzn-trace-id
Root=1-604687a2-3071b0d306ff9fd417810f30;Sampled=0
x-amz-apigw-id
b4ohVFyKtjMFbGw=
content-length
2
x-amz-cf-id
Q8T9BjQ4CGHbBb1xfeyLxa-8AncEjY3xEvhKDjpi3xLh8CHefK8K3Q==
pb.html
img.ak.impact-ad.jp/ut/ Frame 9985
648 B
516 B
Document
General
Full URL
https://img.ak.impact-ad.jp/ut/pb.html
Requested by
Host: img.ak.impact-ad.jp
URL: https://img.ak.impact-ad.jp/ut/a1/tracking.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.19 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
04d4a0ed8f85de7b8d7cde0296f32c80e7fb6ab82081859be966ac702400710e

Request headers

:method
GET
:authority
img.ak.impact-ad.jp
:scheme
https
:path
/ut/pb.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
sec-fetch-dest
iframe
referer
https://mikiki.tokyo.jp/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
tuuid=249e67cf-d690-4bf4-8961-0b419f11adf7; psm=0
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36
Referer
https://mikiki.tokyo.jp/

Response headers

last-modified
Tue, 15 Oct 2019 01:08:10 GMT
etag
"553a3b444fda15a377d1a1b7728ed017"
content-type
text/html
server
AmazonS3
content-encoding
gzip
accept-ranges
bytes
date
Mon, 08 Mar 2021 20:22:56 GMT
via
1.1 varnish
age
57258
x-served-by
cache-fra19123-FRA
x-cache
HIT
x-cache-hits
1
x-timer
S1615234977.647454,VS0,VE1
vary
Accept-Encoding
content-length
366
external_pageviews
in.treasuredata.com/js/v3/event/prod_indival_dmp/
89 B
515 B
Script
General
Full URL
https://in.treasuredata.com/js/v3/event/prod_indival_dmp/external_pageviews?api_key=9422%2F7c9a1a3fb7fe0414b5eccb6f829f7c7a939a6041&modified=1615234976636&data=eyJhb25laWQiOiIyNDllNjdjZi1kNjkwLTRiZjQtODk2MS0wYjQxOWYxMWFkZjciLCJhb25lX3NlZ21lbnRpZHMiOltdLCJ0ZF9nbG9iYWxfaWQiOiJ0ZF9nbG9iYWxfaWQiLCJ0ZF92ZXJzaW9uIjoiMS44LjQiLCJ0ZF9jbGllbnRfaWQiOiJhZDBiYjUzNy1kYmEyLTQzMTEtYjY3Ni00YzgyYWE2N2FjZTQiLCJ0ZF9jaGFyc2V0IjoidXRmLTgiLCJ0ZF9sYW5ndWFnZSI6ImVuLXVzIiwidGRfY29sb3IiOiIyNC1iaXQiLCJ0ZF9zY3JlZW4iOiIxNjAweDEyMDAiLCJ0ZF92aWV3cG9ydCI6IjE2MDB4MTIwMCIsInRkX3RpdGxlIjoiTWlraWtpIC0gbXVzaWMgcmV2aWV3IHNpdGUiLCJ0ZF91cmwiOiJodHRwczovL21pa2lraS50b2t5by5qcC8iLCJ0ZF91c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg5LjAuNDM4OS43MiBTYWZhcmkvNTM3LjM2IiwidGRfcGxhdGZvcm0iOiJMaW51eCB4ODZfNjQiLCJ0ZF9ob3N0IjoibWlraWtpLnRva3lvLmpwIiwidGRfcGF0aCI6Ii8iLCJ0ZF9yZWZlcnJlciI6IiIsInRkX2lwIjoidGRfaXAiLCJ0ZF9icm93c2VyIjoidGRfYnJvd3NlciIsInRkX2Jyb3dzZXJfdmVyc2lvbiI6InRkX2Jyb3dzZXJfdmVyc2lvbiIsInRkX29zIjoidGRfb3MiLCJ0ZF9vc192ZXJzaW9uIjoidGRfb3NfdmVyc2lvbiJ9&callback=TreasureJSONPCallback0
Requested by
Host: cdn.treasuredata.com
URL: https://cdn.treasuredata.com/sdk/1.8.4/td.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.203.66.2 Ashburn, United States, ASN14618 (AMAZON-AES, US),
Reverse DNS
ec2-52-203-66-2.compute-1.amazonaws.com
Software
/
Resource Hash
3aa9f235c06f8205b4b91091c02bbb8c8a23b12fafa257f68aecc4be22e8b7c0
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://mikiki.tokyo.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

Strict-Transport-Security
max-age=31536000
Connection
keep-alive
P3P
CP="This is not a P3P policy! See https://docs.treasuredata.com/articles/p3p"
Date
Mon, 08 Mar 2021 20:22:57 GMT
Content-Length
89
Content-Type
application/javascript
/
aw.dw.impact-ad.jp/c/map/ Frame 9985
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=audienceone_dmp&google_cm&google_sc&oid=1ce48bb6b1384539&sp=ddp
  • https://aw.dw.impact-ad.jp/c/map/?cid=CAESEBUc7hoJyJ01sVcDAl2_sSE&google_cver=1&oid=1ce48bb6b1384539&sp=ddp
43 B
264 B
Image
General
Full URL
https://aw.dw.impact-ad.jp/c/map/?cid=CAESEBUc7hoJyJ01sVcDAl2_sSE&google_cver=1&oid=1ce48bb6b1384539&sp=ddp
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
35.186.254.217 Kansas City, United States, ASN15169 (GOOGLE, US),
Reverse DNS
217.254.186.35.bc.googleusercontent.com
Software
/
Resource Hash
42b976597a2d977d0e300f6d06bc903db389e5c112d33c1c8c249690a522d9f2
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains;

Request headers

Referer
https://img.ak.impact-ad.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:56 GMT
via
1.1 google
alt-svc
clear
content-length
43
strict-transport-security
max-age=31536000; includeSubDomains;
content-type
image/gif

Redirect headers

pragma
no-cache
date
Mon, 08 Mar 2021 20:22:56 GMT
server
HTTP server (unknown)
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
location
https://aw.dw.impact-ad.jp/c/map/?cid=CAESEBUc7hoJyJ01sVcDAl2_sSE&google_cver=1&oid=1ce48bb6b1384539&sp=ddp
cache-control
no-cache, must-revalidate
cross-origin-resource-policy
cross-origin
content-type
text/html; charset=UTF-8
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
316
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
demconf.jpg
dpm.demdex.net/ Frame 9985
Redirect Chain
  • https://dpm.demdex.net/ibs:dpid=47438?dpuuid=249e67cf-d690-4bf4-8961-0b419f11adf7&redir=https%3A%2F%2Faw.dw.impact-ad.jp%2Fc%2Fmap%2F%3Fcid%3D%24%7BDD_UUID%7D%26sp%3Daam%26oid%3D1ce48bb6b1384539
  • https://dpm.demdex.net/demconf.jpg?et:ibs%7cdata:dpid=47438
42 B
929 B
Image
General
Full URL
https://dpm.demdex.net/demconf.jpg?et:ibs%7cdata:dpid=47438
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.33.120.132 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains
X-Content-Type-Options nosniff

Request headers

Referer
https://img.ak.impact-ad.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

DCS
dcs-prod-irl1-v089-00fbec088.edge-irl1.demdex.com 5.80.6.20210202104731 0ms (+1ms)
Pragma
no-cache
Strict-Transport-Security
max-age=31536000; includeSubDomains
X-Content-Type-Options
nosniff
X-Error
300
X-TID
ssLWrO1eToI=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
Expires
Thu, 01 Jan 1970 00:00:00 GMT

Redirect headers

Pragma
no-cache
Strict-Transport-Security
max-age=31536000; includeSubDomains
X-TID
lID17NR1SCQ=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Location
https://dpm.demdex.net/demconf.jpg?et:ibs%7cdata:dpid=47438
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:00 GMT
tdsync
in.treasuredata.com/postback/v3/event/aoneweb/ Frame 9985
35 B
448 B
Image
General
Full URL
https://in.treasuredata.com/postback/v3/event/aoneweb/tdsync?td_format=pixel&td_write_key=851/aab6611c99cfb30870a9e4a48711710e9a7fc192&td_global_id=td_global_id&aoneuid=249e67cf-d690-4bf4-8961-0b419f11adf7&td_ua=td_ua&td_ip=td_ip
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.203.66.2 Ashburn, United States, ASN14618 (AMAZON-AES, US),
Reverse DNS
ec2-52-203-66-2.compute-1.amazonaws.com
Software
/
Resource Hash
b05bf1769da8596f575f074474fde72f795f02b7797d7ae0b58b939e1c216047
Security Headers
Name Value
Strict-Transport-Security max-age=31536000

Request headers

Referer
https://img.ak.impact-ad.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

Strict-Transport-Security
max-age=31536000
Connection
keep-alive
P3P
CP="This is not a P3P policy! See https://docs.treasuredata.com/articles/p3p"
Date
Mon, 08 Mar 2021 20:22:57 GMT
Content-Length
35
Content-Type
image/gif
/
aw.dw.impact-ad.jp/c/map/ Frame 9985
Redirect Chain
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=vxg9yvd&ttd_tpi=1
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=vxg9yvd&ttd_tpi=1
  • https://aw.dw.impact-ad.jp/c/map/?sp=ttd&oid=207d81ffda0cc019&cid=4b72918e-f9de-48f5-9d93-744d641f9ab3
43 B
203 B
Image
General
Full URL
https://aw.dw.impact-ad.jp/c/map/?sp=ttd&oid=207d81ffda0cc019&cid=4b72918e-f9de-48f5-9d93-744d641f9ab3
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
35.186.254.217 Kansas City, United States, ASN15169 (GOOGLE, US),
Reverse DNS
217.254.186.35.bc.googleusercontent.com
Software
/
Resource Hash
42b976597a2d977d0e300f6d06bc903db389e5c112d33c1c8c249690a522d9f2
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains;

Request headers

Referer
https://img.ak.impact-ad.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:57 GMT
via
1.1 google
alt-svc
clear
content-length
43
strict-transport-security
max-age=31536000; includeSubDomains;
content-type
image/gif

Redirect headers

pragma
no-cache
date
Mon, 08 Mar 2021 20:22:56 GMT
x-aspnet-version
4.0.30319
p3p
CP="NOI DSP COR CUR ADMo DEVo PSAo PSDo OUR SAMo BUS UNI NAV"
location
https://aw.dw.impact-ad.jp/c/map/?sp=ttd&oid=207d81ffda0cc019&cid=4b72918e-f9de-48f5-9d93-744d641f9ab3
cache-control
private,no-cache, must-revalidate
content-type
text/html
content-length
235
cs
yjtag.yahoo.co.jp/ Frame 9985
Redirect Chain
  • https://yjtag.yahoo.co.jp/csx?tp=khADDtf
  • https://aw.dw.impact-ad.jp/c/u/?gdpr=1&oid=207d81ffda0cc019&rdr=https%3A%2F%2Fyjtag.yahoo.co.jp%2Fcs%3Fbtt%3D8NV2nuCzcH3ylcKZwz03GfPqu68Ee9LaRqzTgzPRPro%26tp%3DkhADDtf%26uid%3D%7BAONEID%7D
  • https://yjtag.yahoo.co.jp/cs?btt=8NV2nuCzcH3ylcKZwz03GfPqu68Ee9LaRqzTgzPRPro&tp=khADDtf&uid=249e67cf-d690-4bf4-8961-0b419f11adf7
35 B
958 B
Image
General
Full URL
https://yjtag.yahoo.co.jp/cs?btt=8NV2nuCzcH3ylcKZwz03GfPqu68Ee9LaRqzTgzPRPro&tp=khADDtf&uid=249e67cf-d690-4bf4-8961-0b419f11adf7
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
183.79.113.119 , Japan, ASN24572 (YAHOO-JP-AS-AP Yahoo Japan, JP),
Reverse DNS
Software
/
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://img.ak.impact-ad.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

Pragma
no-cache
X-BT-RequestId
120995e1-804c-11eb-90ed-0000ac1c4117
X-Content-Type-Options
nosniff
Age
0
Date
Mon, 08 Mar 2021 20:22:57 GMT
P3P
policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Cache-Control
private, must-revalidate
Connection
keep-alive
Content-Type
image/gif
Content-Length
35
Expires
Thu, 01 Jan 1970 00:00:00 GMT

Redirect headers

location
https://yjtag.yahoo.co.jp/cs?btt=8NV2nuCzcH3ylcKZwz03GfPqu68Ee9LaRqzTgzPRPro&tp=khADDtf&uid=249e67cf-d690-4bf4-8961-0b419f11adf7
date
Mon, 08 Mar 2021 20:22:57 GMT
via
1.1 google
alt-svc
clear
content-length
0
strict-transport-security
max-age=31536000; includeSubDomains;
content-type
text/plain; charset=utf-8
adsct
analytics.twitter.com/i/ Frame 9985
43 B
312 B
Image
General
Full URL
https://analytics.twitter.com/i/adsct?p_user_id=249e67cf-d690-4bf4-8961-0b419f11adf7&p_id=981
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.42.131 , United States, ASN13414 (TWITTER, US),
Reverse DNS
Software
tsa_o /
Resource Hash
ac8778041fdb7f2e08ceb574c9a766247ea26f1a7d90fa854c4efcf4b361a957
Security Headers
Name Value
Strict-Transport-Security max-age=631138519
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Referer
https://img.ak.impact-ad.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:56 GMT
content-encoding
gzip
x-content-type-options
nosniff
status
200 OK
x-twitter-response-tags
BouncerCompliant
content-length
65
x-xss-protection
0
x-response-time
106
pragma
no-cache
last-modified
Mon, 08 Mar 2021 20:22:56 GMT
server
tsa_o
x-frame-options
SAMEORIGIN
strict-transport-security
max-age=631138519
content-type
image/gif;charset=utf-8
cache-control
no-cache, no-store, must-revalidate, pre-check=0, post-check=0
x-connection-hash
f2a1dbbbbb9584e6741fbe1e916eb225
x-transaction
004bff7c000aaea4
expires
Tue, 31 Mar 1981 05:00:00 GMT
/
aw.dw.impact-ad.jp/c/map/ Frame 9985
Redirect Chain
  • https://gum.criteo.com/sync?c=333&r=1&u=https%3A%2F%2Faw.dw.impact-ad.jp%2Fc%2Fmap%2F%3Fsp%3Dcro%26oid%3D207d81ffda0cc019%26cid%3D%40USERID%40
  • https://aw.dw.impact-ad.jp/c/map/?sp=cro&oid=207d81ffda0cc019&cid=
43 B
203 B
Image
General
Full URL
https://aw.dw.impact-ad.jp/c/map/?sp=cro&oid=207d81ffda0cc019&cid=
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
35.186.254.217 Kansas City, United States, ASN15169 (GOOGLE, US),
Reverse DNS
217.254.186.35.bc.googleusercontent.com
Software
/
Resource Hash
42b976597a2d977d0e300f6d06bc903db389e5c112d33c1c8c249690a522d9f2
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains;

Request headers

Referer
https://img.ak.impact-ad.jp/
User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36

Response headers

date
Mon, 08 Mar 2021 20:22:56 GMT
via
1.1 google
alt-svc
clear
content-length
43
strict-transport-security
max-age=31536000; includeSubDomains;
content-type
image/gif

Redirect headers

location
https://aw.dw.impact-ad.jp/c/map/?sp=cro&oid=207d81ffda0cc019&cid=
strict-transport-security
max-age=31536000
cache-control
private, max-age=0, no-cache, no-store, must-revalidate
server-processing-duration-in-ticks
1223
date
Mon, 08 Mar 2021 20:22:55 GMT
content-length
191
content-type
text/html; charset=utf-8

Verdicts & Comments Add Verdict or Comment

107 JavaScript Global Variables

These are the non-standard "global" variables defined on the window object. These can be helpful in identifying possible client-side frameworks and code.

object| 0 object| 1 object| 2 object| 3 object| 4 object| 5 object| 6 object| ontransitionrun object| ontransitionstart object| ontransitioncancel object| cookieStore function| showDirectoryPicker function| showOpenFilePicker function| showSaveFilePicker object| trustedTypes boolean| crossOriginIsolated function| $ function| jQuery object| adsbygoogle object| google_js_reporting_queue number| google_srt object| google_ad_modifications object| google_logging_queue object| ggeac boolean| google_measure_js_timing object| google_reactive_ads_global_state boolean| _gfp_a_ object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map function| topicsScroll function| featureLazyload string| GoogleAnalyticsObject function| ga function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter function| google_sa_impl object| google_persistent_state_async object| google_tag_data object| gaplugins object| gaGlobal object| gaData function| MiU object| miu object| FB object| google_jobrunner object| __google_ad_urls number| google_global_correlator number| __google_ad_urls_id object| googleToken object| googleIMState boolean| _gfp_p_ object| google_image_requests function| processGoogleToken object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages boolean| google_osd_loaded boolean| google_onload_fired object| Hatena string| text string| easySelectHtml object| displayer object| dropdown number| borderWidth object| $element undefined| _bt_url_prefix undefined| _bt_referrer undefined| _bt_site undefined| _bt_mode function| bt_log function| bt_eval function| bt_parameter function| bt_meta function| bt_cookie function| bt_data function| bt_handle_exception function| bt_data_escaped object| BrightTag function| btServe function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb object| __twttrll object| twttr object| __twttr number| zigzagLoadingStartedAt function| onLoadZigZag object| yjDataLayer object| regeneratorRuntime object| zigzag function| ytag object| yahoo_retargeting_sent_urls_counter string| yahoo_retargeting_pv_id function| Treasure object| a1tracker object| GoogleGcLKhOms function| GooglemKTybQhCsO function| google_trackConversion object| GooglebQhCsO object| JSON3 function| TreasureJSONPCallback0

4 Cookies

Domain/Path Name / Value
.doubleclick.net/ Name: test_cookie
Value: CheckForPermission
.mikiki.tokyo.jp/ Name: _td
Value: ad0bb537-dba2-4311-b676-4c82aa67ace4
.mikiki.tokyo.jp/ Name: _a1_f
Value: 4cd00445-4b43-4538-aa7f-0783a0f63a3d
.mikiki.tokyo.jp/ Name: _ts_yjad
Value: 1615234975892

1 Console Messages

Source Level URL
Text
console-api warning URL: https://platform.tumblr.com/v1/share.js(Line 1)
Message:
Please update your Tumblr share buttons, tumblr.com/buttons. <3, Tumblr.

Security Headers

This page lists any security headers set by the main page. If you want to understand what these mean and how to use them, head on over to this page

Header Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Indicators

This is a term in the security industry to describe indicators such as IPs, Domains, Hashes, etc. This does not imply that any of these indicate malicious activity.

adservice.google.com
adservice.google.de
ajax.googleapis.com
analytics.twitter.com
api.locize.io
aw.dw.impact-ad.jp
b.st-hatena.com
b92.yahoo.co.jp
cdn.treasuredata.com
checkout-api.worldshopping.jp
checkout-js.worldshopping.jp
cm.g.doubleclick.net
connect.facebook.net
dpm.demdex.net
fonts.googleapis.com
fonts.gstatic.com
googleads.g.doubleclick.net
gum.criteo.com
img.ak.impact-ad.jp
in.treasuredata.com
match.adsrvr.org
mikiki.ismcdn.jp
mikiki.tokyo.jp
pagead2.googlesyndication.com
partner.googleadservices.com
penta.a.one.impact-ad.jp
platform.tumblr.com
platform.twitter.com
s.yimg.jp
s.yjtag.jp
scontent-frt3-1.xx.fbcdn.net
scontent-frt3-2.xx.fbcdn.net
stats.g.doubleclick.net
syndication.twitter.com
tpc.googlesyndication.com
widgets.getpocket.com
www.facebook.com
www.google-analytics.com
www.google.com
www.google.de
www.googleadservices.com
www.googletagservices.com
www.mikiki.tokyo.jp
yjtag.yahoo.co.jp
104.244.42.131
104.244.42.136
107.178.248.96
13.32.21.90
142.250.185.226
142.250.185.98
143.204.209.77
151.101.13.19
172.217.23.98
182.22.24.252
183.79.113.119
2.16.107.89
202.238.151.85
2600:9000:214f:1000:8:dcbf:c740:93a1
2606:2800:234:59:254c:406:2366:268c
2a00:1450:4001:800::2002
2a00:1450:4001:800::2003
2a00:1450:4001:802::2002
2a00:1450:4001:803::2002
2a00:1450:4001:809::2003
2a00:1450:4001:809::200e
2a00:1450:4001:80e::2002
2a00:1450:4001:80f::200a
2a00:1450:4001:812::2002
2a00:1450:4001:827::2002
2a00:1450:4001:828::2001
2a00:1450:4001:82a::2004
2a00:1450:4001:82a::200a
2a00:1450:400c:c1b::9d
2a02:2638:1::13
2a03:2880:f01c:216:face:b00c:0:3
2a03:2880:f01c:8012:face:b00c:0:3
2a03:2880:f045:10:face:b00c:0:3
2a03:2880:f145:82:face:b00c:0:25de
35.186.254.217
52.203.66.2
52.214.43.215
63.33.120.132
65.9.96.29
65.9.96.38
65.9.96.8
74.114.154.15
99.84.90.65
016f83769d5bd72278c6942f0f2119e91c5d29d3afe86a8b11aeb4ffcca2e3d4
02b081c8a5b07b09d49dc204fb78065b2e965fb5a7e01d7cf91f2517efb5f55d
0319ff9a1d32a340bc3e6380f467f9799c3a1e3e94d1dcede1af2c21e90495f0
038f43445c562255485068792532173e886a194532dbf02ebb2587ffa57ce1b1
04c724885550412912bb7ff469c31abdb1cb26bb955f8a64f9ce07d63b3c94a5
04d4a0ed8f85de7b8d7cde0296f32c80e7fb6ab82081859be966ac702400710e
04f6abfdaebd7170b5c22848a8ab4f2a5e9fcd76276d5de379d5ab0f14645fb2
0625f3fdf699cabefa588e8a9f75af6dd64f285ddfcc241313e187d43e0207cf
06e85a911ce6c882b348be049340002e94f29021782b829135cb6a06c5dc126a
07897cb289ad971fc16117c1aa87d8e34b12bebb64c86e12e23da3c3844820d0
0c7f4e126e6aec99c81a4e028af8298f57adb74c076e32b7b26ab2348c583c13
0ccadac47f8db7d9086cb5d1a3230580ee43e7db056734068ce3785376e90500
0d8755fdd3ad6a0ad8bff8e51a8272640eaa91023bd8439dcafab5c2788718f7
0e235c65027fd5f1ba0b9f86250a77592a9d3b4fa03b45df3e02251dad244974
0f3be44690ae9914ae3e47b7752e1bdea316f09938e9094f99e0de19ccd8987a
1002546098510527be307620ac05e89e6378cd4a320eecea2d350362a0c32cfa
10086058dc794cce0f77a450c0c786a398c69dc3aa8de62577488d01751dc3e4
116d2fe7f5ca37e80eb55ebc721d713b9bf3cf85eda5f7350a2fcc5628a7ef1b
121505befcac12a9d72105f1e6d6477d9206fb49be464203bc91edad32b0488e
12f0516c538da8b778e131b5cc78f3d1704a9aa2ad978c09a0788bcf1eb48c4f
13f57dff9e0354e3eff3e49b137b1ae644afdc03b0de3038fd106f61450712df
15cdd64531bdd5d775ca0bd6545a4d2c9fd0b1fa7e0f12caa1196fa2d1218b52
166a4ec3cb90d525f7f744c7616c01b36bebd6dcecd486c8f5be14ccc0a7b3da
17c4f63a5838d55a80ee56b453f14000af4ff8cc00b477d7c0f3f345100630d1
186f649c10537eaec357a8acdae6cd08f7e6df6acaeb0d0da14a5030947a4d59
18726fffed172612c473de6357643cf6ab40f89593715c24de0d0dd4fb3a0053
18b18d6751cc5fdd74550eb92e574ad98a5fab307a84d91023639b7055cd5b45
194db57ea5c3a9e20e350591abf1373f9ce6c05f6ba10c7f7a05116d5dcbb003
19a69f647c93a07b8b2605e1d56c79d0b374807cdcb419fcdced2c55b9343aa1
1a308dd0f7c1a198f533fc66b2489ecf916364d4453dcc0f10e81253b07bbc8f
1a797bae9016a965652f72866a9a83bb9d3e6482d398e4f1b47362ba79e59e8f
1f01d8b5448c4c9c6d510fffd2c76a83dd05655810cafb8b279b66e0bc5cd060
20177fa171e87e19fba647e06f8450470adbacb0609bb119c00137c21e84aae2
2041bd7fe56ee702d796770dc9d7dd4890fa2140bb1038ec7140e8f9ef84e7e9
207214785c1e3df58ae12a6cd49217fd7990f4260b7b45e2710e2bdc97c71c71
20f0f9f7cc9fdeadbc4a37771d7e381ffbec6fed08c1d4152ce68e43271dd142
2251e565d2d24030b91f7eca2f09d488822c353e41fd28ad07aa7fdca3d68006
22f740c9cd6e4d77dc5a633fa4fd1e22e23644f3e04d2fe9bb10872e66347e53
24311e77bf10fc95e4335c266da892bc5b040c3e75e71610364d4d5e38608d80
25d60620fbd3478d449ed18e74336849b237d1e45e035dc74024f2e6235d56e8
269b982262e017483ed1a150558e693b9bbcf32573d207c2cade2baa7d3db4db
27325306da8c2cba1992c4a1bd5b4235efc13787f008941be87adfe639db115e
27eb0cd78766a34130a0576edab8a592ac7185cb1392d0f16fb04e858b2e9ec5
293ffbe64feb5b27df5ce57a4fbe2bb16e2e1b9e4bd0083bdb4a1cd43a5d66a4
2a01e79481a158efeaebaa1ebb3ad7824106c1d22d991d83cedfe72a30699aa0
2d854c79c7236ee7c65d111852cd73374234fc73023274e98a89259102302e88
2ed4fad10bde60024d26e14073a9c97f29d65b9d92325bb827270a15814bf32b
2f1a66f9a01bdcd1009095bef115bde5f1df8a7389b28b29735f89e0867c9ab2
2ff10c6363a69cf8336818b7558b29b70f038943f375fb7f565b952121c7d873
3012926ff086726e7240930aece3e3a71e15edced9b43aca206e7d5fa2138bab
31919fe20e249f5d732b3e8601897f5b5b6bf4197e7ad4900856edf1049dcfdd
338de06ae9e44b27f5ae8230f171c8c74c23cbbef0e1e8c2d57c703039cb37b3
35d356b9605183c89a9dbdd9af51d6bf2889cee00bebe8261989c6c25cffcba7
35ebf4926dd4130b9cbb7950342c27d98a0d0e3853be0110f9b860863fa382a7
361e88a70c1ddc6a37ca8acda0386d76e35c36ef4f577c21f363b3be6a45971b
3782da43615c58e52f2a390f7b5bebe45564bda62993858cddec99c057e84034
381815549a234946233ca1d17687706c9237a48bd681d7a7a46839a6fdabd232
38a465fa1ef5d0746ddaebad5638abc8ba0946f455fb07b60a3c86c209254622
399031cf526bda363fcb843695a6687e7d52562a525eb3fc3083d4ca8bff3284
39a0d8ab6450afa84d4b1996dd3f703b73d02000684a2bbe70d2e37dde661cde
3a1358389b9a4a5a965b07f8383ea26b525d6769215bfdf5f8fefba4281facb7
3aa9f235c06f8205b4b91091c02bbb8c8a23b12fafa257f68aecc4be22e8b7c0
3b27a0f37afa496acb2b319b9313d75387868e359e51a06b004d37f63eb92423
3bf4ba4cad00a79d25826421b08cf177ab20e4f352ef514c08b3b850524bb8e5
3cfaee78ccbba043c22b71a77b0902312f11ecbb24d7c7d17e4466c83a436859
3d66301aeb102b8bde37644ef42624b06a135a427292f22af88cf78b71d24127
3ea1d47e294e438851d775f2eca7352b4d03cf662e3ad9410f18bae663a380e5
3fa3450b07b49b60756b5d852d67fa58d7769943b290d4294e1f4ea50192c60d
40291ead67dbd6701800119f53000b60b0697c31bb17d4a356dcb85e0a5d1c50
40b0500528e50a7fe5c5e0ff4166ec3da866f803b31ff43f9bc0dd52dfab5a78
40f2416a462edde810a860187b5a9d6cbab3ba506239b57e8336f3ffec695ba3
42b976597a2d977d0e300f6d06bc903db389e5c112d33c1c8c249690a522d9f2
439d47c8b190ac1a23cdce79411e328372a148e70de6be3259200d33134dd557
43d30a80022bf318fdc0130b5b56ee092d4b34a4a82c054e7e32258a743650c5
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
4780e97366c6ff82b5b343790403b4b1ec82d71fbd1ac3197eff58db2a741ff5
48c3fa6f86c54f1d9bb519220713d4b0a1f8cd1a589a3c03b9fa82e98ecb13e3
48fc83f0f96ce8185898f554404d560beb6312334902a207bf103baf5cf7aeb1
49e1dcef611a905b866974d135554059ecd77a0ae022553178ec359ea0b64504
4ba3887eaa97621c2c50c0dc947d30f8eafd03f99e92ab63cc478cc363aad307
4d85149c237295ac2a009005088506eaeae9ec292289b092bc02e1653802da01
4dcda0daa519f52435cb137ffbdb0afb5e5ca8129924ea8819525f06c64e2862
4f195670c50e2fa56f045ca14d786c4516e48680f5d48b932e25223d26c42ea9
514dc56a08fa1eef64ebd657afd5a7186ade9da1ff353252355bbb6197c2b483
52c0ccea6c43f3f55b7b3055fe62633bd098da5bc9f0c0e7dc15351a3ebd8bf5
536f8d5b5018ae63d2a2a9f10d32547f1bf071e56657d5a95d167c7624ea97de
5428dc93c697fb86ac6e41a9a174bf846a6fba3f84428620ff8d7f2d1db206e2
57a97aa24102de07c40b8a02a5ea68bdfc09c9cf72bc59f32359389abdcddd3d
587b234b1819edd56fb28552f715b8d1c367a1dd28829d07c3678229c96e650b
5909f0444c677035061cb1de7123015d564fb2145c0e2078200d65aac3a1af9b
5aa869ba3a3f7a8883a0e6457ebaea6bb7c9069e296bdc166ce30431d318bb90
5ad69c79701638fa11e592ad9c1c42357bc39f3457b49ec0981c364f91b12ba0
5b477fb9a62da28bbdeeb604b989a411eac04b2681dc6080710cb011eeb170d1
5e192e51fcc97d233b14975854b646e695e0953bf04bd70756ff351ca2c5dc23
5e5b137cffdd089eaab0e545f32a7bdde0af959f1926e3c8d673b0fe78d3ac80
602a5dcd9d2f9dcfbc4d874ca1cb678980d0bd438f059baf655ec1738407dd44
60b55bef2079fa578b7ac3cd7716bf64978dd634eaa7dbb4eabf49a23a3e6bf0
624a90008a2ffe56c5745854d5df0f61402093ab7978559f4b4fd36e41e57dad
62a7fa666d6f46c8911b5e637e752c2472eae6bcbb32fa59dc05b9374f9e4839
63e5a151b0522b0aa537ccfb24ee8538129589386ab99bdee61c09bcc44d2bee
641e03dfeee60c05e0794bace5fc58d2fba409fee529a114459e44cee0d9d069
647dcb241a42cc03a0eadeb25707de5c25891d90a2ad791808a6801de69f43a9
64a730449f44153383afa7df6f6892a1bafc9c59e6941f601e071489cf8a568d
64d912aaf1bd52176c21cf9b20c17138009206bbb995347e01497c9af52603d9
65519f763fa92f366b3b9aa0b8a1f9ec065e4d92e0c88781d72af5e9417b5636
67d8e7a3e7815e72595c83389b163f51ecd562ed6c394cdaf5cbc93c7330623e
6831f3f64549e3c7d50cfac29d9977f85ea2cf55efbfb95db768ad2dc096216b
68ab2e2b626e9146a8e5623a2ea252961aec1cbd2c1a5772ca814d79f1a5ebd1
690d6f60191f1663dc4c741f9ec6e90d106214dd2b6f69e5ace9b414ea71d1de
691bd7c5db18aa275aaae9df3bd920824b5f53ca93d11ad66b31ef6712ce991b
69820d30b120213adac093371b52bb88a228fb75f70f607fdffb29d647a7c0e3
6a352e1c80750991386dc776482535a958e11899502c2efa9bcb25375e251d00
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
6fdfd0350217e59e5b8781a792f99e5f4948cd61bffd5a2d107050535b742f37
704230d3ab92cee78199d3d5067699583b67e5f7dfd17c2fb9ab750b1f3a9b3e
71566062654b378f99beb62d6276d698d2f07fcb890094b0f47b57038b9ef20a
73212b6cf2268fddef4cb1fd454658a2844db3f087b15f2705667f7e2decfe3c
74880a11dde584d814bb20e35fa49fc35fee16d0d70739a0f9ec9f42b52e6da6
75337859f0f8473575bb917cf9796d617c6f5d1201201857603b54883e862e7a
75a333b6f247f420f7d014af7b3615c35875e71b704e1a82fb86846563aeee86
75b4819451c72c56bb987fead00c3e70b3cb58662d6772e588c6bb079fd678cc
75cb87c3dcf435025338b8a5afa68f31bb7d3b88de17659ea1b6c294a116d3ca
76078be6370f737ef226cd3c7a68d28e522605266a790dda8e9a0a7cf5f33e2e
76b37efddbdc8f9dccf73391bf1c92a7f3dbb84a51d4ab745bec86a23ec0b9e7
780274f8d794f07e4a07104888e0d03562be15e6672490a6e50f11bfdc754cc2
788b50e1f819295a9f72be1bad0e51fb0b08bebb2ce82b0a416eb110eb77dd71
79979e1699a23bad2b34332432d42c4c55729c210f894708a26e3ea9a61c77cc
79e06a61e43a37a2237635ecbf0e6e6f572a57adf6ce5308528f92473f1c9b29
7a75a580d464a8e5ac20f33060d954cd0edc04c211283a6f080a2057970e60bc
7ab0d37786f689c3f5450e8f9b79587273e43a77c28400b919b8b54cecab303b
7adaf08052c6a6a0f8a0d0055b4f191fd07389fe41c972b69573472b2ecb406a
7c630fa54176d4504683088a10d62d907d03cc21ed0807a5c4b7be57d67aca16
7d81fad253fb0c84643f23a009e0789098784547e779e0172cfe3bf289f836b1
7db1a059deb7eaaff84dbc174e217c6beae3119958974191f8ff74035662c7c5
809b23fa3719aa2e2f7948dd598edbd963828447a7e6a975b7c90ca8fdcdaaf4
80c62b0a4e96b17409ffed681d534afb963b4fc5de60f0f4fd041b7f5ae8cf5d
81364ada25ee1adce36bc949b31a4f62390be00b737360b5bd34f3f8dee3e5f2
8142410a7e8adddb1eabb914635504ec09717377d2e14feed9840afbcf00b90d
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
839c37491e75f874f27d008facea2ca67a0ee1ac4b4cf08cea849cd867f8a481
83e2cd6fa04cd8999c625da6ad624c57654018285f49ffce092415ab7f8a0bc4
846f7d8e67c639570b124028d5a21ad5ec84492239c3bef7e9cd3517cdbc5cbc
84742406211d501cb400be272ff2541cb471d1ac7f00ca18e9f17994784ab854
85014d13d3064f60eb68afe1d0a0d17239d5ec39233912fe1023540b9c2a8580
8639ff502223c403a24492e198023ec853f86bdc3dbe0e3166e5b3c8a8701987
877154470ef1831f5378508d6848ab9e0cf3e5dfd6f8537b13ecd4b43ea6baf9
87cb574d8e4856f37eecfade92a2ecef0a2f3208b59de8e9a661b88b8f6e5cfd
8a7b3e1fb9dcfcdc74602cd099e52b29d81d0e136dd6405f9b9f604695ac0c92
8b697c38acad2b459608fd707c78357fc6d91dbac39edfcc031f2df5d4798b14
8c42b5289a4d8ae62e65b6d66929be24554f30df2489575da558f6fd9ecab17b
8c733cea3cf1c19c77be990ec11e77ad2ec87d11ce45e5463c669a6e1d7b1e11
8df04fbf0ee24d2c53bbb5bfac066f3f48a12a3eead84447a0895cf883f4c787
8e79f0f86567cba4bad1a98a1ab02344283e18b05bebeda53bba3b3ee0d9de6d
8ead8c65d14cf4b878e6d67b423166df1eca666ea389576bf163538508c0a735
8f0ec2741f6dc9472d183a72eea92897e37c492d39e8e04052e2662162f98575
903ebcc442e68d7d34c93992f61238cb71bd835750a6eeded77d9263b53404e3
92f43f973ef8f5f77674b630315d12f7c98231781db153f105cfa27892919e5a
93b53bea5f3eef0830b16423182f7b9f1612ae24a3a31ddd86f2cdfc92d13a2a
93fe41db9f07e54a5534338808be67ac02efa6f7bb84ba8d1dcfd5f671d1a939
963bc082db73b19b5718958d3a3407e076b033261ad320533a838eff1d39313d
965a3375a1c13fc67b57e0b4eaec43998ab57cd02c20e7a7e4774e0e5614926c
9671f8be70ad94a5362e60f4656d5d53ba214d32ab70a3f9d1603d7dadf9d1c1
993a66e17000cec650c6fd7a55332b6e4aa197c5fec6372c391720cecb5d54d1
9a2267d25cd1e6879633a573e90a5cd8f406ded9d15f86af3c090f0f43972466
9a3fae2cfb90b70e07d2be716d7a5e0fa03d38187a7b5997f468ad165984daf6
9a7d7ddcd767632d3e47bac402f3aebe9beaef249ead177d3d9fd18b2f2dab21
9ad5b0abecf13076072b73e09b3028adccd1f18778e9b4702f4592be29146e44
9b5bb281335fd0c63339483981216a6807ab62adcb452b79b810f67a9b2951a7
9bf4f70e38e28d8c284338a4d752a4cfc3e7fa9752db9ca5a82d93ee17eacaca
9f4eee9a9f3883790ad429bd9090d095b887dc5c250492de906f6a2b105092ed
9f6d3417bf40b5daa53bbbdcb5f4baf46eb92f92b540d5f4a544c3abe6286cd8
9fc9f3ab6d39be9fc3843a4b4100b0b8a088f531c4f8c0e47765f202d555bda2
a0f6d67ca6a7d48faaf6151b3907bddb8e2c050c423ba8348dd6829cd8cc595b
a10d0a9605dae963bb09f894f68440c4fdb763d7812479da03192f29ed604d6c
a16283308237b180c029082634322798e3aedf635f72a84a27f56e66115dceb8
a1db447d5fded04e406067127a27914776541c23f49e9bb9a2e11229a8e9267b
a3cee1c9cbe0d4fcf88256885309065038c298e4ff9ba69ddb97cf4dc0444b4d
a46ace2a5413297c15a062ee6f63480c2f8367a9c9e890b6239707ad5e2fe198
a4a1824defec1084ca81d496ee77891684c26196924bdc4fc21dd3482ce15e14
a62e1e19f797bae213d9eedb678b29644bfaa6ebfd3532fc2ec9829a44ac2e5c
a658b2a574c67e4917286358ce2ac75b57185283ed341580a8e45dd31fd7bbc5
a6c2ef0e5c0908627f62819d7c68325ea2bac8300aadb8d888e513c0d1de5c91
a6cf1be12cedd8831630f680f30bde048e4beb31332e5f0d190b0aeb35c0b1bf
a7f4f3c218bfc61533c17194e7f72767d8407cfaa712d301de5ca05e8b725446
a82016017984a3dc7fb458b27b0bf0bc16dd611e3eb93b96d1461adbb9afe96f
a8d227efe0ef553cba37d86bef6e44598dbf9bd9fad3db2582b0ffdebdbd6138
a8fa3a966a15c343e0e0b5345ec3faf05f426953a489a47e120874a8a17a4b06
a968bb0674deb2f0fbd87d865c8c9e4a290e6eae2004004d0d11dc75e37503e5
aa549f020cb9b7f26fafe652ed00ba0591d65a157e065576eb7127027284366a
ab83b66e358e5ec4f3e7b58365578e10c833ce55b5d1c0f0f12b36400e6460f3
ac69e594b591b52adf10ca552340ca61262b8c9099452e514402ec3ad46ad02d
ac8778041fdb7f2e08ceb574c9a766247ea26f1a7d90fa854c4efcf4b361a957
acdfd379ae0662a62840293b1299de5e454132f948233a00818183abad122162
ad0f62c75cc9e9553001b7dea1bec37dd09f8eb23e7f11c5256ac3aea219f6d3
aec60bc104db041b1512185839f18f52986df7e569e5445f740dd60f763fbca8
b05bf1769da8596f575f074474fde72f795f02b7797d7ae0b58b939e1c216047
b0bba882ca184170cc4f6a79cff496f9bbcfc075153b811d9f90bc6f13a38ac0
b1efbaeb8c5ce34e2c6a6492d7aad07daeadfe3e2b4f2360a12bbd756ec23067
b77c8336090d439fead311869670fad2f967de3919f9f99995e7278e755350c7
b7e766c951df7ba3943e878fd546d7ba1f6acc08a24b399035ea7bd69db64235
b8d0ac62da50fbb0597add996c2b8d95945197f8eba1d0ae58b4c775f36a0682
baefdbc15e796953d1e8095555192afff504fa58726062cc685668446581e54c
bb915b7278248012753d418ea0bf6b8f24ada7be9e8ff65c8f1f93ca5edc30ad
bc74b0db431d81c4e1814d9037a8369fb8765043a0bb9a738cd5c8d76e359ba5
bdb4ecc3fb70125429c5a3808b423ef6a53bb1e83d77bef8f02ead87bc80ec76
be77f2a682264d0193dbec5caf6719e392f56ea86130cafb4adc4b4dba813fc2
bf5365396cf8864cacf254de07a9311f664635927a0d7cae79ceb26a9bdc015b
c1f6f1027092d281d624e67f9f83460ed291ae367b558c16cd6afad7af5eba1e
c1f9261eca11a55a6865ae58bceeba5095f8c2549998d7721c0c86062c0d3bc5
c6546c7051e9f1a615bd2d11b997ac6e7516ce160dba3f9ff2a526bedff75823
c7355c07330602c53b7b7b2a74b3b8fc3d4d4684158f6dd76240a7f5352282fb
c7b9f405db9cd7c70368e843566881beeed2e413398f276601bc15442740431a
c82aea7b23b732a895cb386b03955d0db66902f9ddedcd573a1cb40ae3ad3fb1
c95cc12ff703311f30e416670dd4fb4b53f48228d8252809e9b6793658b820a6
ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356
ca9b887ba8e20019ba43791cec3453809582a349c65a6b7017c9415b258c8969
cbb42fbf762c91aab4a0cf83c79a0321a313f2afdaca434938c5a70bb4b0f312
cc85d7665430c72ef49021221536a7b8dcd16e8bc0bc11ceb9bac4aa9f5f75d7
cce352a77fafeeb51348207cfc69244c231420dac9eee8cfa55d0b02b80c1cf3
cd31ca1ac038f9d935e771718d78fd8cd60d151484de4bb6d967853606949f24
ced34f591157438ef47695f979ac95f8758408e8d9b88e63aee8b382ec975785
d04526c1417802365f624fe4da7b0c16d0209d262918a0488b9a2afcd6a5faf0
d219bf1f4c164ee6d9ab49f6f7e12f0945ce1ee4e4fe5c6a82207f2688a5c9db
d272dcef0f0b73b67c85a3c724552319aaab80b951ca8bd765b515837c097bf5
d3433bbae8708076d6e9520170f8bedce10e23541ab1937e25fd9a7fb68c63fd
d3be57f602efeede358880a0a90d42209cef6db6fe27519a00df90bd90602ecd
d40009960425e85ebfa185c2b37f8a5445456d60e1884df6b2a16abeee6a8ac5
d53831993057b52e14c5d2d158eb0b4466e1b67b73e0f68c3c868209c71fe881
d715510a3b75dbb49447388a3879adcc2ff16288660edaec33297fdc791e9f14
d9842b3bd40597ceb2f1635a7f1e50885aa951f9a0882a0303a526d9363e44e2
d9cebb89ed3e16a74386f743f3fc12fe98cb4fc5c11f03af5febdf1141ca6a39
daa628950f0ec33a7b28e88dc22d7a3723fae18b2cddb153fcc1f75018b040c5
daf150195be02d40aef144108115e329b6d2befe8b2532f64bad9963facb4b93
dba37c703ff1168aa666051c5124328416b201d68e63254164b74d21c051e7d8
dbb59f6b2042d5f803c0c6752a38625c0dc072eb82837974253ff58d39e0a75f
dd25286bc9bb33ddf9d164a84c9e655fc3a65a957aeca51805ff7b6d7e0da080
ddca82c37cb7ebc59efbfd254f045e1dc4ea9a3d1b8b3f84a9604cf3a6686ed4
de1e399b07289f3b0a8d35142e363e128124a1185770e214e25e58030dad48e5
e00e69e8e10f072e4a816dd6980c5273917201e813ee432c64e86443a0404ba6
e12dfaae532b449b71117f29ad43f92b3b87c19509a9b16f91115fd4e07903b4
e2b04100564fd9141d7acbd40482d40a3c5b4af2cf25b2cf8726b5608841d61a
e2c9a0ca9f379618b4cd9bac6bc1f3aaedfae3098a0fc40838c8727a8237a9f1
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3b2fad6e3232fa74667f0d123ec81ea032faafa050e2d9343a2801ffc1f8fda
e403cb530c23803c0b2150054a5bd4f748ddffab53b2f09ccb504797a2799a52
e78c14aeb9435fd03f67ad2ee4c45e18bfcfc100a4c62c8bd886324ce6296f77
e7d83be9624e15a40f0e9957b7989ee1332316cd4964f0b721650d4704108aee
e8115b1b2482f5026ea4e778c00c95231c78a21593f1b1a9facf235a61de4967
e9151f0be2e82fac91bd31725c80417e92a053c29f53896564843d92b7a2e17e
e9650ac862cd31bc5454fa33b09ea0e9cdced0832046baa3e57b31ab14dee790
eca5e4b773a1f5bbcad549433d6f8b1374e1847e3d3ff6de6fdd7a3aa4625cb5
ed44128a6249013474677c66b97ab04b94be57282b3440557aa61373cf391cd4
ed6199d3f98434199672f81bc3d017bf8b39783b55ff20a83d39e9245a45cdfd
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
ef4cea46477fae80dea705ec8e2d61f0de2702fccdda594ce3c78f6aa844c8e8
ef796289bb6aba587bc8a2b913252782dc74f671ffa1adbf4cff2ea98302e68e
f26d999c117cf597b4309a9b0b06736a6186c2ea179312ce2e84e92cb44014e8
f26f4ed0cd0fcff9e113702943608d2ec7027c5fc00ac63da3342a238cb21a65
f29d11feed082dab235d2bb1d7630b142de08616b978a9709cc6899d9d56a708
f2a2ee4c98a33eff54867b89cfbc07f93bd3e550736b49d9f4c5f99f16f20d2f
f319b50da1af65c0162ca5c14973a2a15ee89d1d27ab539141c172b9478ee54b
f525dd25be196c4914d5785da4772f9f2462f25b81ab35faf0e5b83a38a19ab2
f543bee39dc60d9260e15ac903264941f9b6a3efa3fa8ad2aa6546eedcc39cd8
f5533dc1e890e99b74930d8f462d013ad2aeff9a6fb7f673ce6eba3deb107ae7
f580e9551b54c28bb5d2b080dbdb902d74e971fa30b97ad1edde9478f764a119
f70ac3ecd2cc6dced5f0737c0cef21172b32742b6df25d3914d649431b3282a8
f70dcbde22b510a13b9b6b7b45c10283b117b52beaa988d5572b2309e79f8b70
f79f9e37e32f2b785374b23de144789aa3a51890f6f988f0775b8d314a1031f1
f7a01079de31377add99cab5139c7a57065a730623677475acaeb4473c716891
f7f6a5894f1d19ddad6fa392b2ece2c5e578cbf7da4ea805b6885eb6985b6e3d
f9b9f1e144d97450d5ccc485f9aeba31144a8e15bc70c9f17249b34e157c12fc
fa376a12bf886dcd556dd537d3dd546e55af1217ea2c05bdc7e5eb628d93fbc8
fa455fe41339aea4896b1bd254c9aaf0526e157ef2987c931fd3fc304e2773ab
fae0fa574bed38ddf8e96e24b982062e0fe6b04b2c1e004df584fcb0dce75050
fc8ccc6f466e069973c2f67c1dcaef7a1649d002945f36ab4a5e62d118a4b82f
fcb5ee7a8fcec48a11b7adf420332a9ff2cf49f99558795d6b7b810618573e35
fcd42fbc171063aec1e2deceb21e3884c46b7dea68543a511a5c5dad335b57a1
fe00c4967597e1957d5f28ccbe42785bf265355f54aa2c461047aa853285ba56
feebc60eac47c130da1c092054b72f88834570a0b6ea0278d607824c35a7a715
ff9a42ec88638db59f1ebd41697f606450fb4adf0263c5fcd3a3147e9964a946
ffaf3f74081130197ac049dd0660e61af0e07ee8cbd11d50ff4ca19305f9e5e2
ffd3931ebc92ffc205407140029266f4b893c0cde11b60ec79e2ec65e2cc6d17
ffedbcaa8faa8d35694373e2f95bf9948622de67d7819173ff7e411ed869b452