<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>P3367R1: constexpr coroutines</title>
<link rel="stylesheet" href="data:text/css;base64,QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJOnJvb3QgewoJCS0tdGV4dC1jb2xvcjogI0JCQjsKCQktLWZvdW5kLWhpZ2hsaWdodDogYmx1ZTsKCQktLWZvdW5kLXRleHQtY29sb3I6IHdoaXRlOwoJCS0tbWFpbi1iYWNrZ3JvdW5kOiAzMiwzMiwzMjsKCQktLWhlYWRlci1jb2xvcjogd2hpdGU7CgkJLS1ib3gtc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7CiAgICAtLXRoaW4tYm94LXNoYWRvdy1jb2xvcjogcmdiYSgwLDAsMCwwLjEpOwoJCS0tbmF2LWJhY2tncm91bmQtY29sb3I6ICMxMDEwMTA7CgkJLS1jb2RlLWZvcmVncm91bmQtY29sb3I6IHdoaXRlOwoJCS0tY29kZS1pbmZvLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7CgkJLS1jb2RlLWJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdi1iYWNrZ3JvdW5kLWNvbG9yKTsKCQktLWxpbmstY29sb3I6ICM4ZWYzZmY7CgkJLS12aXNpdGVkLWxpbmstY29sb3I6ICNmMGZmODk7CgkJLS1ob3Zlci1saW5rLWNvbG9yOiAjYjNmN2ZmOwoJCS0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yOiAjYzhmZmIzOwoJCS0tbGluZS1jb2xvcjogMjU1LDI1NSwyNTU7CgkJLS1oZWFkZXItYmFja2dyb3VuZDogMCwwLDA7CgkJLS1xdW90ZS1sZWZ0LWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNSk7CgkJLS1oaWdobGlnaHQ6IHJnYmEoMjU1LDI1MiwwLDAuMjUpOwoJfQoJOjpzZWxlY3Rpb24gewoJICBjb2xvcjogYmxhY2s7CgkgIGJhY2tncm91bmQ6IGxpZ2h0eWVsbG93OwoJfQp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkgewoJOnJvb3QgewoJCS0tdGV4dC1jb2xvcjogYmxhY2s7CgkJLS1mb3VuZC1oaWdobGlnaHQ6IHllbGxvdzsKCQktLWZvdW5kLXRleHQtY29sb3I6IGJsYWNrOwoJCS0tbWFpbi1iYWNrZ3JvdW5kOiAyNTUsMjU1LDI1NTsKCQktLWhlYWRlci1jb2xvcjogYmxhY2s7CgkJLS1ib3gtc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuMyk7CiAgICAtLXRoaW4tYm94LXNoYWRvdy1jb2xvcjogcmdiYSgwLDAsMCwwLjEpOwoJCS0tbmF2LWJhY2tncm91bmQtY29sb3I6ICNGNUY1RjU7CgkJLS1jb2RlLWZvcmVncm91bmQtY29sb3I6IGJsYWNrOwoJCS0tY29kZS1pbmZvLWNvbG9yOiByZ2JhKDAsMCwwLDAuMSk7CgkJLS1jb2RlLWJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdi1iYWNrZ3JvdW5kLWNvbG9yKTsKCQktLWxpbmstY29sb3I6ICMwMDAwODI7CgkJLS12aXNpdGVkLWxpbmstY29sb3I6ICM1MDhkMGY7CgkJLS1ob3Zlci1saW5rLWNvbG9yOiAjNTc1N2MyOwoJCS0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yOiAjOTRjNTYwOwoJCS0tbGluZS1jb2xvcjogMTIsNDMsNzU7CgkJLS1oZWFkZXItYmFja2dyb3VuZDogMCwwLDA7CgkJLS1xdW90ZS1sZWZ0LWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7CgkJLS1oaWdobGlnaHQ6IHJnYmEoMjU1LDI1NCwyMDcsMC41KTsKCX0KCTo6c2VsZWN0aW9uIHsKCSAgY29sb3I6IGJsYWNrOwoJICBiYWNrZ3JvdW5kOiAjYTRjM2Y2OwoJfQp9CgpzcGFuOnRhcmdldCwgcDp0YXJnZXQsIGxpOnRhcmdldCwgZGl2OnRhcmdldCB7CiAgYmFja2dyb3VuZDogdmFyKC0taGlnaGxpZ2h0KTsKfQoKLm5hbWUtb2YtcGFwZXIgewoJZm9udC1zaXplOiAyOHB4OwoJcGFkZGluZy10b3A6IDAuNWVtOwp9CgpzcGFuLmZvdW5kIHsKCXRleHQtc2hhZG93OiAwIDAgMTBweCB2YXIoLS1mb3VuZC1oaWdobGlnaHQpLCAgMCAwIDEwcHggdmFyKC0tZm91bmQtaGlnaGxpZ2h0KSwgIDAgMCAxMHB4IHZhcigtLWZvdW5kLWhpZ2hsaWdodCksICAwIDAgMTBweCB2YXIoLS1mb3VuZC1oaWdobGlnaHQpOwoJY29sb3I6IHZhcigtLWZvdW5kLXRleHQtY29sb3IpICFpbXBvcnRhbnQ7Cn0KCmJvZHkgewoJZm9udC1mYW1pbHk6IEhlbHZldGljYTsKCXBhZGRpbmc6IDA7CgltYXJnaW46IDA7CglvdmVyZmxvdzogaGlkZGVuOwoJY29sb3I6IHZhcigtLXRleHQtY29sb3IpOwoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLCAxKTsKfQoKYm9keSA+IGRpdiB7CglkaXNwbGF5OiBmbGV4OwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKfQoKLmhpZGUtb24tbmFycm93IHsKCWRpc3BsYXk6IGluaGVyaXQ7Cn0KCi5oaWRlLW9uLXdpZGUgewoJZGlzcGxheTogbm9uZTsKfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTAwcHgpIHsKCWJvZHkgewoJCW92ZXJmbG93OiBpbmhlcml0ICFpbXBvcnRhbnQ7Cgl9CgkuaGlkZS1vbi1uYXJyb3cgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuaGlkZS1vbi13aWRlIHsKCQlkaXNwbGF5OiBpbmhlcml0OwoJfQoJYm9keSA+IGRpdiB7CgkJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKCX0KCWFydGljbGUgewoJCW92ZXJmbG93OiBpbmhlcml0ICFpbXBvcnRhbnQ7CgkJYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCB0cmFuc3BhcmVudCxyZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksMC42KSwgcmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLDAuOCksIHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwwLjYpLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKCX0KCW5hdiwgYXJ0aWNsZSB7CgkJZmxleDogaW5pdGlhbCAhaW1wb3J0YW50OwoJfQoJbmF2IHsKCQltaW4td2lkdGg6IGluaXRpYWwgIWltcG9ydGFudDsKCQltYXgtd2lkdGg6IGluaXRpYWwgIWltcG9ydGFudDsKCQltaW4taGVpZ2h0OiBpbml0aWFsICFpbXBvcnRhbnQ7CgkJbWF4LWhlaWdodDogaW5pdGlhbCAhaW1wb3J0YW50OwoJCWJveC1zaGFkb3c6IDAgMTBweCAwIHZhcigtLWJveC1zaGFkb3ctY29sb3IpOwoJfQoJbmF2ID4gZGl2IHsKCQlvdmVyZmxvdzogaW5oZXJpdCAhaW1wb3J0YW50OwoJCXBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OwoJCW1heC13aWR0aDogaW5pdGlhbCAhaW1wb3J0YW50OwoJCW1heC1oZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDsKCX0KCWRpdjpoYXMoPiBpbnB1dFt0eXBlPXNlYXJjaF0pIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LnF1b3RlIHsKCQlvdmVyZmxvdy14OiBzY3JvbGw7CgkJb3ZlcmZsb3cteTogdmlzaWJsZTsKCX0KfQoKbmF2IHsKCXBhZGRpbmc6IDAgMC41ZW07CgltYXJnaW46IDA7CglmbGV4OiAxIDEgMDsKCW1pbi13aWR0aDogMzUwcHg7CgltYXgtd2lkdGg6IDM1MHB4OwoJYm94LXNoYWRvdzogMCAwIDEwcHggdmFyKC0tYm94LXNoYWRvdy1jb2xvcik7CgliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXYtYmFja2dyb3VuZC1jb2xvcik7Cn0KCm5hdiA+IGRpdiB7Cglwb3NpdGlvbjogZml4ZWQ7CgltYXgtd2lkdGg6IDM1MHB4OwoJbWF4LWhlaWdodDogMTAwJTsKCW92ZXJmbG93OiBzY3JvbGw7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcGFkZGluZzogMCAwLjVlbTsKCW1hcmdpbjogMDsKfQoKbmF2ID4gZGl2ID4gZGl2IHsKCXBhZGRpbmc6IDAuNWVtOwoJcGFkZGluZy10b3A6IDA7CglwYWRkaW5nLWJvdHRvbTogMWVtOwp9CgphcnRpY2xlIHsKCWZsZXg6IDMgMSAwOwoJb3ZlcmZsb3c6IHNjcm9sbDsKCWhlaWdodDogMTAwdmg7Cgl0ZXh0LWFsaWduOiBqdXN0aWZ5OwoJYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdHJhbnNwYXJlbnQscmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLDAuNiksIHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwwLjgpLCByZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksMC42KSwgdHJhbnNwYXJlbnQpOwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKfQoKYXJ0aWNsZSA+IGRpdiB7CglwYWRkaW5nLXJpZ2h0OiAxLjVlbTsKCXBhZGRpbmctbGVmdDogMS41ZW07CglwYWRkaW5nLWJvdHRvbTogMWVtOwp9Cgpjb2RlIHsKCQp9CgpkaXYucXVvdGUgewoJY29sb3I6IHZhcigtLWNvZGUtZm9yZWdyb3VuZC1jb2xvcik7CgliYWNrZ3JvdW5kOiB2YXIoLS1jb2RlLWJhY2tncm91bmQtY29sb3IpOwoJcGFkZGluZzogMWVtOwoJYm9yZGVyLXJhZGl1czogMHB4IDE1cHggMTVweCAwcHg7Cglib3JkZXItbGVmdDogNXB4IHNvbGlkIHZhcigtLXF1b3RlLWxlZnQtY29sb3IpOwoJZm9udC1zdHlsZTogaXRhbGljOwoJbWFyZ2luOiAxZW07Cn0KCmNvZGU6bm90KHByZSA+IGNvZGUpIHsKCWNvbG9yOiBpbmhlcml0OwoJYmFja2dyb3VuZDogdmFyKC0tY29kZS1iYWNrZ3JvdW5kLWNvbG9yKTsKCWJvcmRlci1yYWRpdXM6IDVweDsKCXBhZGRpbmc6IDAgMC4yZW07CgltYXJnaW46IDAgMnB4OwoJb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWNvZGUtYmFja2dyb3VuZC1jb2xvcik7Cn0KCnByZSA+IGNvZGUgewoJb3V0bGluZTogbm9uZTsKCWxpbmUtaGVpZ2h0OiAxLjQ7Cgl0YWItc2l6ZTogMjsKfQoKcHJlOmhhcyhjb2RlKSB7Cgljb2xvcjogdmFyKC0tY29kZS1mb3JlZ3JvdW5kLWNvbG9yKTsKCWJhY2tncm91bmQ6IHZhcigtLWNvZGUtYmFja2dyb3VuZC1jb2xvcik7CglwYWRkaW5nOiAxZW07Cglib3JkZXItcmFkaXVzOiAxNXB4OwoJcG9zaXRpb246IHJlbGF0aXZlOwoJei1pbmRleDogMTsKCW92ZXJmbG93LXg6IHNjcm9sbDsKCW92ZXJmbG93LXk6IHZpc2libGU7Cn0KCnByZTpoYXMoY29kZS5sYW5ndWFnZS1jYXJib24pOjpiZWZvcmUgewoJY29udGVudDogIkNhcmJvbiI7Cgl0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiAxZW07CglyaWdodDogMWVtOwoJY29sb3I6IHZhcigtLWNvZGUtaW5mby1jb2xvcik7Cglmb250LXdlaWdodDogYm9sZDsKfQoKcCwgdWwgPiBsaSB7Cgl0ZXh0LWFsaWduOiBqdXN0aWZ5OwoJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCWh5cGhlbnM6IGF1dG87Cn0KCmFydGljbGUgdWwgPiBsaSB7CglwYWRkaW5nLWJvdHRvbTogMC4yNWVtOwp9CgpkaXYuZGVzY3JpcHRpb24gdWwgewogIHBhZGRpbmctdG9wOiAwLjVlbTsKCXBhZGRpbmctYm90dG9tOiAwLjVlbTsKfQoKYSB7Cgljb2xvcjogdmFyKC0tbGluay1jb2xvcik7Cgl0ZXh0LWRlY29yYXRpb24tc3R5bGU6IGRvdHRlZDsKfQoKYTpob3ZlciB7Cgljb2xvcjogdmFyKC0taG92ZXItbGluay1jb2xvcik7Cgl0ZXh0LWRlY29yYXRpb24tc3R5bGU6IHNvbGlkOwp9CgphOnZpc2l0ZWQgewoJY29sb3I6IHZhcigtLXZpc2l0ZWQtbGluay1jb2xvcik7Cn0KCmE6dmlzaXRlZDpob3ZlciB7Cgljb2xvcjogdmFyKC0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yKTsKCXRleHQtZGVjb3JhdGlvbi1zdHlsZTogc29saWQ7Cn0KCmgxLCBoMiwgaDMsIGg0LCBoNSB7CgltYXJnaW46IDA7CgltYXJnaW4tYm90dG9tOiAxMHB4OwoJcGFkZGluZzogMC41ZW07CglwYWRkaW5nLXRvcDogMjBweDsKCXBhZGRpbmctYm90dG9tOiAycHg7Cgl6LWluZGV4OiAyOwoJY29sb3I6IHZhcigtLWhlYWRlci1jb2xvcik7Cn0KCmFydGljbGUgaDEsIGFydGljbGUgaDIsIGFydGljbGUgaDMsIGFydGljbGUgaDQsIGFydGljbGUgaDUgewovKglwb3NpdGlvbjogc3RpY2t5OwoJcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OwoJdG9wOiAwOyovCgkKfQoKaDEgewoJZm9udC13ZWlnaHQ6IDgwMDsKCWJvcmRlci1ib3R0b206IHJnYmEodmFyKC0tbGluZS1jb2xvciksIDEpIGRvdHRlZCAycHg7Cn0KCmgyIHsKCWZvbnQtd2VpZ2h0OiA4MDA7Cglib3JkZXItYm90dG9tOiByZ2JhKHZhcigtLWxpbmUtY29sb3IpLCAwLjc1KSBkb3R0ZWQgMnB4Owp9CgpoMywgaDQsIGg1IHsKCWZvbnQtd2VpZ2h0OiA2MDA7Cglib3JkZXItYm90dG9tOiByZ2JhKHZhcigtLWxpbmUtY29sb3IpLCAwLjMzKSBkb3R0ZWQgMnB4Owp9CgpoMSA+IGEsIGgyID4gYSwgaDMgPiBhLCBoNCA+IGEsIGg1ID4gYSB7Cgljb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwoJdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0Owp9CgpoMTp0YXJnZXQ6OmFmdGVyLCBoMjp0YXJnZXQ6OmFmdGVyLCBoMzp0YXJnZXQ6OmFmdGVyLCBoNDp0YXJnZXQ6OmFmdGVyLCBoNTp0YXJnZXQ6OmFmdGVyIHsKCXRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDsKCWNvbnRlbnQ6ICIg4pqT77iOIjsKICBmb250LXNpemU6IDE0cHg7Cn0KCmgxID4gYTpob3ZlciwgaDIgPiBhOmhvdmVyLCBoMyA+IGE6aG92ZXIsIGg0ID4gYTpob3ZlciwgaDUgPiBhOmhvdmVyIHsKCWNvbG9yOiB2YXIoLS1ob3Zlci1saW5rLWNvbG9yKTsKfQoKZGl2Omhhcyg+IGlucHV0W3R5cGU9c2VhcmNoXSkgewoJcG9zaXRpb246IGZpeGVkOwoJdG9wOiAwOwoJcmlnaHQ6IDA7Cgl6LWluZGV4OiAxMDAwOwoJcGFkZGluZzogMC41ZW07CgliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXYtYmFja2dyb3VuZC1jb2xvcik7Cglib3gtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsMCwwLDAuMyk7Cglib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxMHB4Owp9CgpkaXYgPiBpbnB1dFt0eXBlPXNlYXJjaF0gewoJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmF2LWJhY2tncm91bmQtY29sb3IpOwoJYm9yZGVyOiAycHggc29saWQgdmFyKC0tdGV4dC1jb2xvcik7Cgljb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7Cgl3aWR0aDogMzAwcHg7Cn0KCmRpdi5wYXBlci1pbmZvIHsKCXBhZGRpbmc6IDA7CglwYWRkaW5nLXRvcDogMWVtOwoJCgkua2V5IHsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCQoJZGl2IHsKCX0KfQoKdWwgewoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKCXBhZGRpbmctbGVmdDogMmVtOwp9CgpsaSA+IHVsIHsKCXBhZGRpbmctbGVmdDogMC41ZW07Cn0KCnVsID4gbGkgewoJcGFkZGluZy1sZWZ0OiAwLjVlbTsKfQoKY29kZSAuZXJyb3IsIGNvZGUgLmJlZm9yZSB7CgkJbGluZS1oZWlnaHQ6IDEuOTsKfQoKY29kZSAuZXJyb3IgPiAqLCBjb2RlIC5iZWZvcmUgPiAqIHsKCWJhY2tncm91bmQtY29sb3I6ICNGRjg4ODggIWltcG9ydGFudDsKCWNvbG9yOiBibGFjayAhaW1wb3J0YW50OwoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiB3aGl0ZTsKCX0KCWJvcmRlcjogM3B4IHNvbGlkICNGRjg4ODg7Cglmb250LXdlaWdodDogYm9sZDsKfQoKY29kZSAuYWZ0ZXIgPiAqIHsKCWJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JlZW4gIWltcG9ydGFudDsKCWNvbG9yOiBibGFjayAhaW1wb3J0YW50OwoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiB3aGl0ZTsKCX0KCWJvcmRlcjogM3B4IHNvbGlkIGxpZ2h0Z3JlZW47Cglmb250LXdlaWdodDogYm9sZDsKfQoKY29kZSAudW5jaGFuZ2VkID4gKiB7CgliYWNrZ3JvdW5kLWNvbG9yOiBsaWdodHllbGxvdyAhaW1wb3J0YW50OwoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IHdoaXRlOwoJfQoJYm9yZGVyOiAzcHggc29saWQgbGlnaHR5ZWxsb3c7Cglmb250LXdlaWdodDogYm9sZDsKfQoKY29kZSAuaW52aXNpYmxlIHsKCXZpc2liaWxpdHk6IGhpZGRlbjsKfQoKLmNoYW5nZXMgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgoud29yZGluZyBoMSwgLndvcmRpbmcgaDIgewoJZm9udC1zaXplOiBpbmhlcml0OwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJYm9yZGVyOiBub25lOwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKfQoKLndvcmRpbmcgcCB7CglwYWRkaW5nOiAwOwoJcGFkZGluZy10b3A6IDAuNWVtOwoJbWFyZ2luOiAwOwp9Cgoud29yZGluZyBhIHsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWNvbG9yOiBpbmhlcml0Owp9Cgoud29yZGluZyBhOmhvdmVyIHsKCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwoJY29sb3I6IHZhcigtLWxpbmstY29sb3IpOwp9Cgoud29yZGluZyBhOnZpc2l0ZWQgewoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiBibGFjayAhaW1wb3J0YW50OwoJfQp9Cgoud29yZGluZyBjb2RlIHsKCWJhY2tncm91bmQ6IGluaGVyaXQgIWltcG9ydGFudDsKCWJvcmRlcjogbm9uZTsKCW91dGxpbmU6IG5vbmU7Cn0KCQoud29yZGluZyB7Cglmb250LWZhbWlseTogIk5vdG8gU2VyaWYiOwoJCglwYWRkaW5nOiAwLjVlbSAxZW07CglwYWRkaW5nLWJvdHRvbTogMWVtOwoJY29sb3I6IHZhcigtLWNvZGUtZm9yZWdyb3VuZC1jb2xvcik7CgliYWNrZ3JvdW5kOiB2YXIoLS1jb2RlLWJhY2tncm91bmQtY29sb3IpOwoJbGluZS1oZWlnaHQ6IDEuNTU7CgkKCWJvcmRlci1yYWRpdXM6IDE1cHg7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwoJb3ZlcmZsb3cteDogdmlzaWJsZTsKCW92ZXJmbG93LXk6IHZpc2libGU7Cn0KCQoud29yZGluZyAuYWRkZWQsIHByZSAuYWRkZWQgewoJYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmVlbjsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICB0ZXh0LWRlY29yYXRpb24tY29sb3I6IGdyZWVuOwogIHRleHQtZGVjb3JhdGlvbi10aGlja25lc3M6IDJweCAhaW1wb3J0YW50OwoJei1pbmRleDogODA7CglwYWRkaW5nOiAzcHg7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7Cgl9Cn0KCi53b3JkaW5nIC5hZGRlZC1pdGVtIHsKCWJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JlZW47CiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiBncmVlbjsKICB0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzOiAycHggIWltcG9ydGFudDsKCUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKCQljb2xvcjogYmxhY2s7Cgl9Cn0KCQoud29yZGluZyAucmVtb3ZlZCB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRkY4ODg4OwoJei1pbmRleDogNTA7CglwYWRkaW5nOiAzcHg7CiAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7CiAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiByZWQ7CiAgdGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzczogMnB4ICFpbXBvcnRhbnQ7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IGJsYWNrOwoJfQp9CgkKLndvcmRpbmcgLm5vdGUgewoJZm9udC1zaXplOiAwLjhlbTsKfQoJCi53b3JkaW5nCSsgLndvcmRpbmcgewoJbWFyZ2luLXRvcDogMC41ZW07Cn0KCQoud29yZGluZyBwcmU6aGFzKGNvZGUpIHsKCWJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvZGUtaW5mby1jb2xvcik7Cglib3JkZXItcmFkaXVzOiAwOwoJcGFkZGluZzogMGVtOwoJei1pbmRleDogMTsKCW92ZXJmbG93LXg6IHNjcm9sbDsKfQoJCi53b3JkaW5nCWNvZGUgLmFkZGVkZWQgc3BhbiB7Cgljb2xvcjogYmxhY2sgIWltcG9ydGFudDsKfQoKdGFibGUucG9sbCB7CiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICBtYXJnaW4tdG9wOiAyMHB4Owp9Cgp0YWJsZS5wb2xsIHRoLCB0YWJsZS5wb2xsIHRkIHsKICBib3JkZXI6IDA7CiAgcGFkZGluZzogMCAxMHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDEyOCwxMjgsMTI4LDAuMik7Cn0KCnRhYmxlLnBvbGwgdGQ6Zmlyc3QtY2hpbGQsIHRhYmxlLnBvbGwgdGg6Zmlyc3QtY2hpbGQgewogYm9yZGVyLWxlZnQ6IG5vbmU7Cn0KCnRhYmxlLnBvbGwgdGQ6bGFzdC1jaGlsZCwgdGFibGUucG9sbCB0aDpsYXN0LWNoaWxkIHsKIGJvcmRlci1yaWdodDogbm9uZTsKfQoKdGFibGUucG9sbCB0cjpmaXJzdC1jaGlsZCB0aCwgdGFibGUucG9sbCB0cjpmaXJzdC1jaGlsZCB0ZCB7CiAgYm9yZGVyLXRvcDogbm9uZTsKfQoKdGFibGUucG9sbCB0cjpsYXN0LWNoaWxkIHRoLCB0YWJsZS5wb2xsIHRyOmxhc3QtY2hpbGQgdGQgewogIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KCi53b3JkaW5nIC5kZXNjcmlwdGlvbiB7CiAgcGFkZGluZy1ib3R0b206IDFlbTsKfQoKLndvcmRpbmcgLmNhcHMgewogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCnRhYmxlIHRoLnRhYmxlLWdyb3VwIHsKCW1heC13aWR0aDogMmVtOwp9Cgp0YWJsZSB0aC50YWJsZS1ncm91cCA+IHNwYW4gewoJbWF4LXdpZHRoOiAyZW07CglkaXNwbGF5OiBibG9jazsKCW92ZXJmbG93OiB2aXNpYmxlOwoJdGV4dC1hbGlnbjogY2VudGVyOwoJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDFlbSk7Cn0KCnRhYmxlIHRoLnRhYmxlLWdyb3VwID4gc3BhbiA+IHNwYW4gewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHJvdGF0ZSgtOTBkZWcpOwoJd2lkdGg6IGF1dG87Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciB0aCwgdGFibGUuYmVmb3JlLWFmdGVyIHRkICB7CiAgaGVpZ2h0OiAzMHB4Owp9CgoKCnRhYmxlLmJlZm9yZS1hZnRlciAuZ3JlZW4gewogIGNvbG9yOiBncmVlbjsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5vcmFuZ2UgewogIGNvbG9yOiBvcmFuZ2U7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAucmVkLW5vcm1hbCB7CiAgY29sb3I6IHJlZDsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5pbi1wcm9ncmVzcyB7Cgljb2xvcjogYmx1ZTsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwyMzEsMjU1LDAuNSk7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAucHJvcG9zaW5nIHsKCWNvbG9yOiBncmVlbjsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwyNTUsMCwwLjUpOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLm5vdC1wcm9wb3NpbmcgewoJY29sb3I6IHJlZDsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LDAsMCwwLjI1KTsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5uZXZlci1wcm9wb3NpbmcgewoJY29sb3I6IHJlZDsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LDAsMCwwLjI1KTsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5wcm9wb3NlZC1yZWFkeS1mb3ItZnV0dXJlIHsKCWNvbG9yOiBncmVlbjsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMjAzLDIyOSw3LDAuNSk7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAucHJvcG9zZWQtcmVhZHktZm9yLWZ1dHVyZTIgewoJY29sb3I6IGdyZWVuOwoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsMTk4LDAsMC41KTsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5yZWQgewogIGNvbG9yOiByZWQ7CiAgZm9udC1zaXplOiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAxNnB4Owp9Cgp0ZCBhLCB0ZCBhOnZpc2l0ZWQsIHRkIGE6aG92ZXIgewoJY29sb3I6IGluaGVyaXQ7Cn0KCmRpdi53b3JkaW5nLW5vdGUgewogIGJhY2tncm91bmQ6IHJnYih2YXIoLS1tYWluLWJhY2tncm91bmQpKTsKICBib3gtc2hhZG93OiA1cHggMCAxMHB4IHZhcigtLXRoaW4tYm94LXNoYWRvdy1jb2xvcikgaW5zZXQ7CiAgYm9yZGVyLXJhZGl1czogMTVweDsKICBjb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7CiAgcGFkZGluZzogMTBweDsKICBtYXJnaW46IDEwcHggMjBweDsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wYXJudW0gewoJZm9udC1zaXplOiAxMnB4OwoJbWFyZ2luLXJpZ2h0OiAwLjI1ZW07CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCmxpOmhhcyg+IC5wYXJudW0pIHsKCWxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKbGkgPiAucGFybnVtIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCWxlZnQ6IC0zMHB4OwoJYm90dG9tOiAycHg7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciB0ZC5kaXNhYmxlLWJvdHRvbSwgdGFibGUuYmVmb3JlLWFmdGVyIHRoLmRpc2FibGUtYm90dG9tIHsKCWJvcmRlci1ib3R0b206IG5vbmU7Cn0KdGFibGUuYmVmb3JlLWFmdGVyIHRoLmxlZnQsIHRhYmxlLmJlZm9yZS1hZnRlciB0ZC5sZWZ0IHsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KCnRkIGEubm90ZTphZnRlciB7Cgl2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7Cglmb250LXNpemU6IDc1JTsKCW1hcmdpbi1sZWZ0OiAwLjVlbTsKfQoKdGQgYS5ub3RlLm4xOmFmdGVyIHsKCWNvbnRlbnQ6ICIxIjsKfQoKdGQgYS5ub3RlLm4yOmFmdGVyIHsKCWNvbnRlbnQ6ICIyIjsKfQoKdGQgYS5ub3RlLm4zOmFmdGVyIHsKCWNvbnRlbnQ6ICIzIjsKfQoKdGQgYS5ub3RlLm40OmFmdGVyIHsKCWNvbnRlbnQ6ICI0IjsKfQoKdGQgYS5ub3RlLm41OmFmdGVyIHsKCWNvbnRlbnQ6ICI1IjsKfQ==">
<link rel="stylesheet" href="data:text/css;base64,QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIHsKCnByZSBjb2RlLmhsanMgewoKfQpjb2RlLmhsanMgewoKfQovKgoKWENvZGUgc3R5bGUgKGMpIEFuZ2VsIEdhcmNpYSA8YW5nZWxnYXJjaWEubWFpbEBnbWFpbC5jb20+CgoqLwouaGxqcyB7CiAgY29sb3I6IGluaGVyaXQKfQovKiBHcmF5IERPQ1RZUEUgc2VsZWN0b3JzIGxpa2UgV2ViS2l0ICovCi54bWwgLmhsanMtbWV0YSB7CiAgY29sb3I6ICNjMGMwYzAKfQouaGxqcy1jb21tZW50LAouaGxqcy1xdW90ZSB7CiAgY29sb3I6ICMwMDc0MDAKfQouaGxqcy10YWcsCi5obGpzLWF0dHJpYnV0ZSwKLmhsanMta2V5d29yZCwKLmhsanMtc2VsZWN0b3ItdGFnLAouaGxqcy1saXRlcmFsLAouaGxqcy1uYW1lIHsKICBjb2xvcjogI2FhMGQ5MQp9Ci5obGpzLXZhcmlhYmxlLAouaGxqcy10ZW1wbGF0ZS12YXJpYWJsZSB7CiAgY29sb3I6ICMzRjZFNzQKfQouaGxqcy1jb2RlLAouaGxqcy1zdHJpbmcsCi5obGpzLW1ldGEgLmhsanMtc3RyaW5nIHsKICBjb2xvcjogI2M0MWExNgp9Ci5obGpzLXJlZ2V4cCwKLmhsanMtbGluayB7CiAgY29sb3I6ICMwRTBFRkYKfQouaGxqcy10aXRsZSwKLmhsanMtc3ltYm9sLAouaGxqcy1idWxsZXQsCi5obGpzLW51bWJlciB7CiAgY29sb3I6ICMxYzAwY2YKfQouaGxqcy1zZWN0aW9uLAouaGxqcy1tZXRhIHsKICBjb2xvcjogIzY0MzgyMAp9Ci5obGpzLXRpdGxlLmNsYXNzXywKLmhsanMtY2xhc3MgLmhsanMtdGl0bGUsCi5obGpzLXR5cGUsCi5obGpzLWJ1aWx0X2luLAouaGxqcy1wYXJhbXMgewogIGNvbG9yOiAjNWMyNjk5Cn0KLmhsanMtYXR0ciB7CiAgY29sb3I6ICM4MzZDMjgKfQouaGxqcy1zdWJzdCB7CiAgY29sb3I6ICMwMDAKfQouaGxqcy1mb3JtdWxhIHsKICBmb250LXN0eWxlOiBpdGFsaWMKfQouaGxqcy1hZGRpdGlvbiB7Cgp9Ci5obGpzLWRlbGV0aW9uIHsKCn0KLmhsanMtc2VsZWN0b3ItaWQsCi5obGpzLXNlbGVjdG9yLWNsYXNzIHsKICBjb2xvcjogIzliNzAzZgp9Ci5obGpzLWRvY3RhZywKLmhsanMtc3Ryb25nIHsKICBmb250LXdlaWdodDogYm9sZAp9Ci5obGpzLWVtcGhhc2lzIHsKICBmb250LXN0eWxlOiBpdGFsaWMKfQoKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoKcHJlIGNvZGUuaGxqcyB7Cgp9CmNvZGUuaGxqcyB7Cgp9Ci8qCgpYQ29kZSBzdHlsZSAoYykgQW5nZWwgR2FyY2lhIDxhbmdlbGdhcmNpYS5tYWlsQGdtYWlsLmNvbT4KCiovCi5obGpzIHsKICBjb2xvcjogaW5oZXJpdAp9Ci8qIEdyYXkgRE9DVFlQRSBzZWxlY3RvcnMgbGlrZSBXZWJLaXQgKi8KLnhtbCAuaGxqcy1tZXRhIHsKICBjb2xvcjogI2MwYzBjMAp9Ci5obGpzLWNvbW1lbnQsCi5obGpzLXF1b3RlIHsKICBjb2xvcjogIzAwNzQwMAp9Ci5obGpzLXRhZywKLmhsanMtYXR0cmlidXRlLAouaGxqcy1rZXl3b3JkLAouaGxqcy1zZWxlY3Rvci10YWcsCi5obGpzLWxpdGVyYWwsCi5obGpzLW5hbWUgewogIGNvbG9yOiAjYWEwZDkxCn0KLmhsanMtdmFyaWFibGUsCi5obGpzLXRlbXBsYXRlLXZhcmlhYmxlIHsKICBjb2xvcjogIzNGNkU3NAp9Ci5obGpzLWNvZGUsCi5obGpzLXN0cmluZywKLmhsanMtbWV0YSAuaGxqcy1zdHJpbmcgewogIGNvbG9yOiAjYzQxYTE2Cn0KLmhsanMtcmVnZXhwLAouaGxqcy1saW5rIHsKICBjb2xvcjogIzBFMEVGRgp9Ci5obGpzLXRpdGxlLAouaGxqcy1zeW1ib2wsCi5obGpzLWJ1bGxldCwKLmhsanMtbnVtYmVyIHsKICBjb2xvcjogIzkzODJmZgp9Ci5obGpzLXNlY3Rpb24sCi5obGpzLW1ldGEgewogIGNvbG9yOiAjNjQzODIwCn0KLmhsanMtdGl0bGUuY2xhc3NfLAouaGxqcy1jbGFzcyAuaGxqcy10aXRsZSwKLmhsanMtdHlwZSwKLmhsanMtYnVpbHRfaW4sCi5obGpzLXBhcmFtcyB7CiAgY29sb3I6ICNiODc5ZmYKfQouaGxqcy1hdHRyIHsKICBjb2xvcjogIzgzNkMyOAp9Ci5obGpzLXN1YnN0IHsKICBjb2xvcjogIzAwMAp9Ci5obGpzLWZvcm11bGEgewogIGZvbnQtc3R5bGU6IGl0YWxpYwp9Ci5obGpzLWFkZGl0aW9uIHsKCn0KLmhsanMtZGVsZXRpb24gewoKfQouaGxqcy1zZWxlY3Rvci1pZCwKLmhsanMtc2VsZWN0b3ItY2xhc3MgewogIGNvbG9yOiAjOWI3MDNmCn0KLmhsanMtZG9jdGFnLAouaGxqcy1zdHJvbmcgewogIGZvbnQtd2VpZ2h0OiBib2xkCn0KLmhsanMtZW1waGFzaXMgewogIGZvbnQtc3R5bGU6IGl0YWxpYwp9Cgp9CgoK">
<link rel="stylesheet" href="data:text/css;base64,LndvcmRpbmcgIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTZXJpZic7CiAgICBoeXBoZW5zOiBhdXRvOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgIHBhZGRpbmctbGVmdDogM2VtOwp9Cgoud29yZGluZyBkaXYgewogICAgYmFja2dyb3VuZDogaW5oZXJpdDsKfQoKLndvcmRpbmcgZGl2LndyYXBwZXIgewogICAgbWF4LXdpZHRoOiAyMGNtOwogICAgbWFyZ2luOiBhdXRvOwp9Cgoud29yZGluZyBkaXYudGV4cGFyYSB7CiAgICBtYXJnaW4tdG9wOiAzcHQ7CiAgICBtYXJnaW4tYm90dG9tOiAzcHQ7Cn0KCi53b3JkaW5nIHRhYmxlIGRpdi50ZXhwYXJhIHsKICAgIG1hcmdpbi10b3A6IDA7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9Cgoud29yZGluZyB0YWJsZS5lbnVtZXJhdGUgZGl2LnRleHBhcmEgewogICAgbWFyZ2luLXRvcDogM3B0OwogICAgbWFyZ2luLWJvdHRvbTogM3B0Owp9Cgoud29yZGluZyB1bCB7CiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICBwYWRkaW5nLWxlZnQ6IDltbTsKICAgIG1hcmdpbi10b3A6IDA7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9Cgoud29yZGluZyBvbCB7CiAgICBtYXJnaW4tdG9wOiAwOwogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLndvcmRpbmcgYSB7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi53b3JkaW5nIGEuaGlkZGVuX2xpbmsgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6IGluaGVyaXQ7Cn0KCi53b3JkaW5nIGxpIHsKICAgIG1hcmdpbi10b3A6IDNwdDsKICAgIG1hcmdpbi1ib3R0b206IDNwdDsKfQoKLndvcmRpbmcgaDEgewogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW4tdG9wOiAxMHB0OwogICAgbWFyZ2luLWJvdHRvbTogMTBwdDsKfQoKLndvcmRpbmcgaDIgewogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBmb250LXNpemU6IDE0cHQ7CiAgICBtYXJnaW4tdG9wOiAxMHB0OwogICAgbWFyZ2luLWJvdHRvbTogMTBwdDsKfQoKLndvcmRpbmcgaDI6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgY2xlYXI6IGJvdGg7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQoKLndvcmRpbmcgaDMgewogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW4tdG9wOiAxMHB0OwogICAgbWFyZ2luLWJvdHRvbTogMTBwdDsKfQoKLndvcmRpbmcgaDM6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgY2xlYXI6IGJvdGg7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQoKLndvcmRpbmcgaDQgewogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW4tdG9wOiAxMHB0OwogICAgbWFyZ2luLWJvdHRvbTogMTBwdDsKfQoKLndvcmRpbmcgaDQ6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgY2xlYXI6IGJvdGg7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQoKLndvcmRpbmcgdWwgPiBsaTpiZWZvcmUgewogICAgY29udGVudDogIlwyMDE0IjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIG1hcmdpbi1sZWZ0OiAtMS41ZW07Cn0KCi53b3JkaW5nIC5zaHk6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcMDBhZCI7CiAgICAvKiBUaGlzIGlzIFUrMDBBRCBTT0ZUIEhZUEhFTiwgc2FtZSBhcyAmc2h5LCBidXQgd2UgcHV0IGl0IGluIDpiZWZvcmUKICAgIAl0byBzdG9wIGl0IGZyb20gYmVpbmcgaW5jbHVkZWQgd2hlbiB0aGUgdGV4dCBpcyBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZAogICAgCXdpdGggRmlyZWZveCwgd2hpY2ggaXMgZXNwZWNpYWxseSBhbm5veWluZyB3aGVuIGNvcHlpbmcgdG8gYSB0ZXJtaW5hbCwKICAgIAl3aGVyZSB0aGUgaHlwaGVuIGNoYXJhY3RlcnMgd2lsbCBzaG93IHVwLiAqLwp9CgoKLndvcmRpbmcgLmFiYnJfcmVmIHsKICAgIGZsb2F0OiByaWdodDsKfQoKLndvcmRpbmcgLmZvbGRlZF9hYmJyX3JlZiB7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCi53b3JkaW5nIC51bmZvbGRlZF9hYmJyX3JlZiB7CiAgICBkaXNwbGF5OiBub25lOwp9Cgoud29yZGluZyAuc2VjbnVtIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIG1pbi13aWR0aDogMzVwdDsKfQoKLndvcmRpbmcgLmFubmV4bnVtIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9Cgoud29yZGluZyBkaXYuc291cmNlTGlua1BhcmVudCB7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCi53b3JkaW5nIGEuc291cmNlTGluayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBvcGFjaXR5OiAwOwogICAgbWFyZ2luLWxlZnQ6IDEwcHQ7Cn0KCi53b3JkaW5nIGEuc291cmNlTGluazpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwp9Cgoud29yZGluZyBhLml0ZW1EZWNsTGluayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBmb250LXNpemU6IDc1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgd2lkdGg6IDVlbTsKICAgIG9wYWNpdHk6IDA7Cn0KCi53b3JkaW5nIGEuaXRlbURlY2xMaW5rOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi53b3JkaW5nIGRpdi5tYXJnaW5hbGl6ZWRwYXJlbnQgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbGVmdDogLTE4bW07Cn0KCi53b3JkaW5nIGEubWFyZ2luYWxpemVkIHsKICAgIHdpZHRoOiAxNW1tOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgZm9udC1zaXplOiA3cHQ7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKLndvcmRpbmcgYS5lbnVtZXJhdGVkX2l0ZW1fbnVtIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWFyZ2luLXRvcDogM3B0OwogICAgbWFyZ2luLWJvdHRvbTogM3B0OwogICAgbWFyZ2luLXJpZ2h0OiA2cHQ7Cn0KCi53b3JkaW5nIGRpdi5wYXJhIHsKICAgIG1hcmdpbi1ib3R0b206IDZwdDsKICAgIG1hcmdpbi10b3A6IDZwdDsKICAgIHRleHQtYWxpZ246IGp1c3RpZnk7CiAgICBtaW4taGVpZ2h0OiAxLjJlbTsKfQoKLndvcmRpbmcgZGl2LnNlY3Rpb24gewogICAgdGV4dC1hbGlnbjoganVzdGlmeTsKfQoKLndvcmRpbmcgZGl2LnNlbnRlbmNlIHsKICAgIGRpc3BsYXk6IGlubGluZTsKfQoKLndvcmRpbmcgYS5pbmRleCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBmbG9hdDogcmlnaHQ7CiAgICByaWdodDogLTFlbTsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi53b3JkaW5nIGEuaW5kZXg6YmVmb3JlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGNvbnRlbnQ6ICLin7UiOwogICAgYmFja2dyb3VuZC1jb2xvcjogI0M5RkJDOTsKfQoKCi53b3JkaW5nIC5pbmRleGl0ZW1zIHsKICAgIG1hcmdpbi1sZWZ0OiAyZW07CiAgICB0ZXh0LWluZGVudDogLTJlbTsKfQoKLndvcmRpbmcgZGl2Lml0ZW1kZXNjciB7CiAgICBtYXJnaW4tbGVmdDogMTJtbTsKfQoKLndvcmRpbmcgLmJuZiB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2Fucyc7CiAgICBmb250LXNpemU6IDEwcHQ7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBtYXJnaW4tbGVmdDogMjVwdDsKICAgIG1hcmdpbi1yaWdodDogLTE1bW07CiAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOwogICAgdGV4dC1pbmRlbnQ6IC0zZW07CiAgICBwYWRkaW5nLWxlZnQ6IDNlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi53b3JkaW5nIGRpdi5ibmYgc3Bhbi50ZXh0dHQgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi53b3JkaW5nIC5yZWJuZiB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2VyaWYnOwogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgbWFyZ2luLXRvcDogMC41ZW07CiAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKICAgIG1hcmdpbi1sZWZ0OiAzMHB0OwogICAgdGV4dC1pbmRlbnQ6IC0zZW07CiAgICBwYWRkaW5nLWxlZnQ6IDNlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi53b3JkaW5nIC5zaW1wbGVibmYgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgIG1hcmdpbi10b3A6IDAuNWVtOwogICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CiAgICBtYXJnaW4tbGVmdDogMzBwdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi53b3JkaW5nIHNwYW4udGV4dG5vcm1hbCB7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2VyaWYnOwogICAgZm9udC1zaXplOiAxMHB0OwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLndvcmRpbmcgLmJuZiBzcGFuLnRleHRub3JtYWwgewogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7Cn0KCi53b3JkaW5nIHAgewogICAgbWFyZ2luLXRvcDogNHB0OwogICAgbWFyZ2luLWJvdHRvbTogNHB0Owp9Cgoud29yZGluZyBzcGFuLnJsYXAgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDBweDsKICAgIHRleHQtaW5kZW50OiAwOwp9Cgoud29yZGluZyBzcGFuLnRlcm1pbmFsIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zIE1vbm8nOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC1zaXplOiA5cHQ7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7Cn0KCi53b3JkaW5nIHNwYW4ubm9uY3h4dGVybWluYWwgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXNpemU6IDlwdDsKfQoKLndvcmRpbmcgc3Bhbi50ZXJtIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLndvcmRpbmcgc3Bhbi50Y29kZSB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2FucyBNb25vJzsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0YmYgewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi53b3JkaW5nIHNwYW4udGV4dHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgZGl2LmZvb3Rub3RlIHNwYW4udGV4dHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKICAgIGZvbnQtc2l6ZTogOHB0Owp9Cgoud29yZGluZyAuYm5mIHNwYW4udGV4dHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgLnNpbXBsZWJuZiBzcGFuLnRleHRzZiB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2Fucyc7CiAgICBmb250LXNpemU6IDEwcHQ7Cn0KCi53b3JkaW5nIC5leGFtcGxlIHNwYW4udGV4dHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0c2MgewogICAgZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwp9Cgoud29yZGluZyBzcGFuLm5vbnRlcm1kZWYgewogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMnOwogICAgZm9udC1zaXplOiAxMHB0Owp9Cgoud29yZGluZyAucmVibmYgYS5ub250ZXJtZGVmIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTZXJpZic7Cn0KCi53b3JkaW5nIHNwYW4uZW1waCB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi53b3JkaW5nIHNwYW4udGVjaHRlcm0gewogICAgZm9udC1zdHlsZTogaXRhbGljOwp9Cgoud29yZGluZyBzcGFuLm1hdGhpdCB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi53b3JkaW5nIHNwYW4ubWF0aHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKfQoKLndvcmRpbmcgc3Bhbi5tYXRocm0gewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0cm0gewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0c2wgewogICAgZm9udC1zdHlsZTogaXRhbGljOwp9Cgoud29yZGluZyBzcGFuLm1hdGh0dCB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2FucyBNb25vJzsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKfQoKLndvcmRpbmcgc3Bhbi5tYm94IHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTZXJpZic7CiAgICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi53b3JkaW5nIHNwYW4udW5nYXAgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDJwdDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0dHQgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7Cn0KCi53b3JkaW5nIHNwYW4udGV4dGl0IHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLndvcmRpbmcgZGl2LmZvb3Rub3RlIHNwYW4udGV4dHR0IHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zIE1vbm8nOwp9Cgoud29yZGluZyBzcGFuLnRjb2RlX2luX2NvZGVibG9jayB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2FucyBNb25vJzsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKICAgIGZvbnQtc2l6ZTogOXB0Owp9Cgoud29yZGluZyBzcGFuLnBoYW50b20gewogICAgY29sb3I6IHdoaXRlOwp9Ci8qIFVuZm9ydHVuYXRlbHksIHRoaXMgd2F5IHRoZSB0ZXh0IGlzIHN0aWxsIHNlbGVjdGFibGUuIEFub3RoZXIKCW9wdGlvbiBpcyBkaXNwbGF5Om5vbmUsIGJ1dCB0aGVuIHdlIGxvc2UgdGhlIG5pY2UgbGF5b3V0LgoJVG9kbzogZmluZCBwcm9wZXIgc29sdXRpb24uICovCgoud29yZGluZyBzcGFuLm1hdGggewogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgc3Bhbi5tYXRoYmxvY2sgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIG1hcmdpbi1yaWdodDogYXV0bzsKICAgIG1hcmdpbi10b3A6IDEuMmVtOwogICAgbWFyZ2luLWJvdHRvbTogMS4yZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi53b3JkaW5nIHNwYW4ubWF0aGFscGhhIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLndvcmRpbmcgc3Bhbi5zeW5vcHNpcyB7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIG1hcmdpbi10b3A6IDAuNWVtOwogICAgZGlzcGxheTogYmxvY2s7Cn0KCi53b3JkaW5nIHNwYW4uZGVmaW5pdGlvbiB7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGRpc3BsYXk6IGJsb2NrOwp9Cgoud29yZGluZyAuY29kZWJsb2NrIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zIE1vbm8nOwogICAgbWFyZ2luLWxlZnQ6IDEuMmVtOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgIGZvbnQtc2l6ZTogOXB0OwogICAgd2hpdGUtc3BhY2U6IHByZTsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWFyZ2luLXRvcDogM3B0OwogICAgbWFyZ2luLWJvdHRvbTogM3B0OwoJCW92ZXJmbG93LXg6IHNjcm9sbDsKICAgIG92ZXJmbG93LXk6IHZpc2libGU7CiAgICBtYXJnaW4tcmlnaHQ6IC0xNW1tOwp9Cgoud29yZGluZyB0YWJsZSAuY29kZWJsb2NrIHsKICAgIG1hcmdpbi1yaWdodDogMDsKfQoKLndvcmRpbmcgLm91dHB1dGJsb2NrIHsKICAgIG1hcmdpbi1sZWZ0OiAxLjJlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2FucyBNb25vJzsKICAgIGZvbnQtc2l6ZTogOXB0Owp9Cgoud29yZGluZyBjb2RlIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zIE1vbm8nOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwp9Cgoud29yZGluZyBkaXYuaXRlbWRlY2wgewogICAgbWFyZ2luLXRvcDogMmV4Owp9Cgoud29yZGluZyBjb2RlLml0ZW1kZWNsY29kZSB7CiAgICB3aGl0ZS1zcGFjZTogcHJlOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXNpemU6IDlwdDsKICAgIGRpc3BsYXk6IGJsb2NrOwoJCW92ZXJmbG93LXg6IHNjcm9sbDsKICAgIG92ZXJmbG93LXk6IHZpc2libGU7CiAgICBtYXJnaW4tcmlnaHQ6IC0xNW1tOwp9Cgoud29yZGluZyAuY29tbWVudCB7CiAgICBjb2xvcjogZ3JlZW47CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2VyaWYnOwogICAgZm9udC1zaXplOiAxMHB0Owp9Cgoud29yZGluZyAuZm9vdG5vdGUgLmNvbW1lbnQgewogICAgY29sb3I6IGdyZWVuOwogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc2l6ZTogOHB0Owp9Cgoud29yZGluZyAuZXhhbXBsZSAuY29tbWVudCB7CiAgICBjb2xvcjogZ3JlZW47CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2VyaWYnOwogICAgZm9udC1zaXplOiA5cHQ7Cn0KCi53b3JkaW5nIC5ub3RlIC5jb21tZW50IHsKICAgIGNvbG9yOiBncmVlbjsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTZXJpZic7CiAgICBmb250LXNpemU6IDlwdDsKfQoKLndvcmRpbmcgc3Bhbi5rZXl3b3JkIHsKICAgIGNvbG9yOiAjMDA2MDdjOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwp9Cgoud29yZGluZyBzcGFuLnBhcmVudGhlc2lzIHsKICAgIGNvbG9yOiAjYWYxOTE1Owp9Cgoud29yZGluZyBzcGFuLmN1cmx5YnJhY2tldCB7CiAgICBjb2xvcjogI2FmMTkxNTsKfQoKLndvcmRpbmcgc3Bhbi5zcXVhcmVicmFja2V0IHsKICAgIGNvbG9yOiAjYWYxOTE1Owp9Cgoud29yZGluZyBzcGFuLmxpdGVyYWwgewogICAgY29sb3I6ICM5RjY4MDc7Cn0KCi53b3JkaW5nIHNwYW4ubGl0ZXJhbHRlcm1pbmFsIHsKICAgIGNvbG9yOiAjOUY2ODA3OwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi53b3JkaW5nIHNwYW4ub3BlcmF0b3IgewogICAgY29sb3I6ICM1NzAwNTc7Cn0KCi53b3JkaW5nIHNwYW4uYW5nbGVicmFja2V0IHsKICAgIGNvbG9yOiAjNTcwMDU3Owp9Cgoud29yZGluZyBzcGFuLnByZXByb2Nlc3NvcmRpcmVjdGl2ZSB7CiAgICBjb2xvcjogIzZGNEUzNzsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0c3VwZXJzY3JpcHQgewogICAgdmVydGljYWwtYWxpZ246IHN1cGVyOwogICAgZm9udC1zaXplOiBzbWFsbGVyOwogICAgbGluZS1oZWlnaHQ6IDA7Cn0KCi53b3JkaW5nIC5mb290bm90ZXJlZiB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7CiAgICBmb250LXNpemU6IHNtYWxsZXI7CiAgICBsaW5lLWhlaWdodDogMDsKfQoKLndvcmRpbmcgLmZvb3Rub3RlIHsKICAgIGZvbnQtc2l6ZTogOHB0Owp9Cgoud29yZGluZyAuZm9vdG5vdGUgLm1hdGggewogICAgZm9udC1zaXplOiA4cHQ7Cn0KCi53b3JkaW5nIC5mb290bm90ZW51bSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIG1hcmdpbi1yaWdodDogMW1tOwogICAgd2lkdGg6IDRjaDsKfQoKLndvcmRpbmcgLmZvb3Rub3RlQmFja2xpbmsgewogICAgZGlzcGxheTogbm9uZTsKfQoKLndvcmRpbmcgLmZvb3Rub3RlU2VwYXJhdG9yIHsKICAgIGJhY2tncm91bmQ6IGJsYWNrOwogICAgbWFyZ2luLXRvcDogNW1tOwogICAgaGVpZ2h0OiAxcHg7CiAgICB3aWR0aDogNmNtOwp9Cgoud29yZGluZyBkaXYubWluaXBhZ2UgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgbWFyZ2luLXJpZ2h0OiAzZW07Cn0KCi53b3JkaW5nIGRpdi5udW1iZXJlZFRhYmxlIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG1hcmdpbi1sZWZ0OiAxZW07CiAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgIG1hcmdpbi1ib3R0b206IDEycHQ7CiAgICBtYXJnaW4tdG9wOiA4cHQ7Cn0KCi53b3JkaW5nIGRpdi5maWd1cmUgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbWFyZ2luLWxlZnQ6IDJlbTsKICAgIG1hcmdpbi1yaWdodDogMmVtOwogICAgbWFyZ2luLWJvdHRvbTogMTJwdDsKICAgIG1hcmdpbi10b3A6IDNwdDsKfQoKLndvcmRpbmcgdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87CiAgICBtYXJnaW4tdG9wOiA3cHQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9Cgoud29yZGluZyB0ZCwgLndvcmRpbmcgdGggewogICAgcGFkZGluZy1sZWZ0OiA4cHQ7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHQ7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9Cgoud29yZGluZyB0ZC5lbXB0eSB7CiAgICBwYWRkaW5nOiAwcHg7CiAgICBwYWRkaW5nLWxlZnQ6IDFweDsKfQoKLndvcmRpbmcgdGQubGVmdCB7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9Cgoud29yZGluZyB0ZC5oaWRkZW4gewogICAgcGFkZGluZzogMDsKICAgIHdpZHRoOiAwOwp9Cgoud29yZGluZyB0ZC5yaWdodCB7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKLndvcmRpbmcgdGQuY2VudGVyIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLndvcmRpbmcgdGQuanVzdGlmeSB7CiAgICB0ZXh0LWFsaWduOiBqdXN0aWZ5Owp9Cgoud29yZGluZyB0ZC5ib3JkZXIgewogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBibGFjazsKfQoKLndvcmRpbmcgdHIucm93c2VwLCAud29yZGluZyB0ZC5jbGluZSB7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7Cn0KCi53b3JkaW5nIHRyLmNhcHNlcCB7CiAgICBib3JkZXItdG9wOiAzcHggc29saWQgYmxhY2s7CiAgICBib3JkZXItdG9wLXN0eWxlOiBkb3VibGU7Cn0KCi53b3JkaW5nIHRoIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsKfQoKLndvcmRpbmcgc3Bhbi5jZW50cnkgewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi53b3JkaW5nIGRpdi50YWJsZSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgbWFyZ2luLXJpZ2h0OiBhdXRvOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgd2lkdGg6IDkwJTsKfQoKLndvcmRpbmcgc3Bhbi5pbmRlbnRlZCB7CiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OwogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW4tbGVmdDogMmVtOwogICAgbWFyZ2luLWJvdHRvbTogMWVtOwogICAgbWFyZ2luLXRvcDogMWVtOwp9Cgoud29yZGluZyBzcGFuLnVwcGVyY2FzZSB7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9Cgoud29yZGluZyBzcGFuLnVjb2RlIHsKICAgIGZvbnQtdmFyaWFudDogc21hbGwtY2FwczsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBmb250LXNpemU6IDkwJTsKfQoKLndvcmRpbmcgc3Bhbi51bmFtZSB7CiAgICBmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHM7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgZm9udC1zaXplOiA5MCU7Cn0KCi53b3JkaW5nIHRhYmxlLmVudW1lcmF0ZSB7CiAgICBib3JkZXI6IDA7CiAgICBtYXJnaW46IDA7Cn0KCi53b3JkaW5nIHRhYmxlLmVudW1lcmF0ZSB0ZCB7CiAgICBwYWRkaW5nOiAwOwp9Cgoud29yZGluZyB0YWJsZS5lbnVtZXJhdGUgdGQ6Zmlyc3QtY2hpbGQgewogICAgd2lkdGg6IDFjbTsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAud29yZGluZyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzE3MTcxNzsKICAgICAgICBjb2xvcjogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyBzcGFuLm1qeC1tc3R5bGUgewogICAgICAgIGNvbG9yOiAjZDBkMGQwICFpbXBvcnRhbnQKICAgIH0KCiAgICAud29yZGluZyBhOmxpbmsgewogICAgICAgIGNvbG9yOiAjNjRhZGZmOwogICAgfQoKICAgIC53b3JkaW5nIGE6dmlzaXRlZCB7CiAgICAgICAgY29sb3I6ICNhMzZhZTY7CiAgICB9CgogICAgLndvcmRpbmcgYS5oaWRkZW5fbGluayB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4ucGhhbnRvbSB7CiAgICAgICAgY29sb3I6ICMxNzE3MTc7CiAgICB9CgogICAgLndvcmRpbmcgYS5pbmRleDpiZWZvcmUgewogICAgICAgIGNvbG9yOiAjZDBkMGQwOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM0YjYzNTM7CiAgICB9CgogICAgLndvcmRpbmcgLmNvbW1lbnQgewogICAgICAgIGNvbG9yOiAjMzVkYTAwOwogICAgfQoKICAgIC53b3JkaW5nIC5mb290bm90ZSAuY29tbWVudCB7CiAgICAgICAgY29sb3I6ICMzNWRhMDA7CiAgICB9CgogICAgLndvcmRpbmcgLmV4YW1wbGUgLmNvbW1lbnQgewogICAgICAgIGNvbG9yOiAjMzVkYTAwOwogICAgfQoKICAgIC53b3JkaW5nIC5ub3RlIC5jb21tZW50IHsKICAgICAgICBjb2xvcjogIzM1ZGEwMDsKICAgIH0KCiAgICAud29yZGluZyBzcGFuLmtleXdvcmQgewogICAgICAgIGNvbG9yOiAjMTJjYWJlOwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4ucGFyZW50aGVzaXMgewogICAgICAgIGNvbG9yOiAjZmYxNTE1OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4uY3VybHlicmFja2V0IHsKICAgICAgICBjb2xvcjogI2ZmMTUxNTsKICAgIH0KCiAgICAud29yZGluZyBzcGFuLnNxdWFyZWJyYWNrZXQgewogICAgICAgIGNvbG9yOiAjZmYxNTE1OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4ubGl0ZXJhbCB7CiAgICAgICAgY29sb3I6ICNkZmE4Mzc7CiAgICB9CgogICAgLndvcmRpbmcgc3Bhbi5saXRlcmFsdGVybWluYWwgewogICAgICAgIGNvbG9yOiAjZGZhODM3OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4ub3BlcmF0b3IgewogICAgICAgIGNvbG9yOiAjYmFhNmI5OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4uYW5nbGVicmFja2V0IHsKICAgICAgICBjb2xvcjogI2JhYTZiOTsKICAgIH0KCiAgICAud29yZGluZyBzcGFuLnByZXByb2Nlc3NvcmRpcmVjdGl2ZSB7CiAgICAgICAgY29sb3I6ICNiMjdjNTg7CiAgICB9CgogICAgLndvcmRpbmcgdGFibGUgewogICAgICAgIGJvcmRlci1jb2xvcjogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyB0ZC5ib3JkZXIgewogICAgICAgIGJvcmRlci1jb2xvcjogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyB0ZC5ib3JkZXIgewogICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjZDBkMGQwOwogICAgfQoKICAgIC53b3JkaW5nIHRyLnJvd3NlcCwgdGQuY2xpbmUgewogICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNkMGQwZDA7CiAgICB9CgogICAgLndvcmRpbmcgdHIuY2Fwc2VwIHsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAjZDBkMGQwOwogICAgfQoKICAgIC53b3JkaW5nIHRoIHsKICAgICAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjZDBkMGQwOwogICAgfQoKICAgIC53b3JkaW5nIC5mb290bm90ZVNlcGFyYXRvciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyB0ZXh0IHsKICAgICAgICBmaWxsOiAjZDBkMGQwOwogICAgfQoKICAgIC53b3JkaW5nIHBhdGggewogICAgICAgIHN0cm9rZTogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyBwb2x5Z29uIHsKICAgICAgICBzdHJva2U6ICNkMGQwZDA7CiAgICAgICAgZmlsbDogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyBlbGxpcHNlIHsKICAgICAgICBzdHJva2U6ICNkMGQwZDA7CiAgICB9Cgp9Cgoud29yZGluZyAubWp4LWNodG1sIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgdGV4dC1pbmRlbnQ6IDA7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgZm9udC1zaXplOiAxMDAlOwogICAgZm9udC1zaXplLWFkanVzdDogbm9uZTsKICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7CiAgICB3b3JkLXdyYXA6IG5vcm1hbDsKICAgIHdvcmQtc3BhY2luZzogbm9ybWFsOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZsb2F0OiBub25lOwogICAgZGlyZWN0aW9uOiBsdHI7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBtYXgtaGVpZ2h0OiBub25lOwogICAgbWluLXdpZHRoOiAwOwogICAgbWluLWhlaWdodDogMDsKICAgIGJvcmRlcjogMDsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDFweCAwCn0KCi53b3JkaW5nIC5NSlhjLWRpc3BsYXkgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbWFyZ2luOiAxZW0gMDsKICAgIHBhZGRpbmc6IDAKfQoKLndvcmRpbmcgLm1qeC1jaHRtbFt0YWJpbmRleF06Zm9jdXMsIC53b3JkaW5nICA6Zm9jdXMgLm1qeC1jaHRtbFt0YWJpbmRleF0gewogICAgZGlzcGxheTogaW5saW5lLXRhYmxlCn0KCi53b3JkaW5nIC5tangtZnVsbC13aWR0aCB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMTAwMDBlbQp9Cgoud29yZGluZyAubWp4LW1hdGggewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsKICAgIGJvcmRlci1zcGFjaW5nOiAwCn0KCi53b3JkaW5nIC5tangtbWF0aCAqIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3ggIWltcG9ydGFudDsKICAgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3ggIWltcG9ydGFudDsKICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Cn0KCi53b3JkaW5nIC5tangtbnVtZXJhdG9yIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGNlbnRlcgp9Cgoud29yZGluZyAubWp4LWRlbm9taW5hdG9yIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGNlbnRlcgp9Cgoud29yZGluZyAuTUpYYy1zdGFja2VkIHsKICAgIGhlaWdodDogMDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZQp9Cgoud29yZGluZyAuTUpYYy1zdGFja2VkID4gKiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUKfQoKLndvcmRpbmcgLk1KWGMtYmV2ZWxsZWQgPiAqIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jawp9Cgoud29yZGluZyAubWp4LXN0YWNrIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jawp9Cgoud29yZGluZyAubWp4LW9wIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdAp9Cgoud29yZGluZyAubWp4LXVuZGVyIHsKICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwKfQoKLndvcmRpbmcgLm1qeC1vdmVyIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdAp9Cgoud29yZGluZyAubWp4LW92ZXIgPiAqIHsKICAgIHBhZGRpbmctbGVmdDogMHB4ICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHggIWltcG9ydGFudAp9Cgoud29yZGluZyAubWp4LXVuZGVyID4gKiB7CiAgICBwYWRkaW5nLWxlZnQ6IDBweCAhaW1wb3J0YW50OwogICAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQKfQoKLndvcmRpbmcgLm1qeC1zdGFjayA+IC5tangtc3VwIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdAp9Cgoud29yZGluZyAubWp4LXN0YWNrID4gLm1qeC1zdWIgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0Cn0KCi53b3JkaW5nIC5tangtcHJlc3RhY2sgPiAubWp4LXByZXN1cCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJhY2tncm91bmQ6IGluaGVyaXQKfQoKLndvcmRpbmcgLm1qeC1wcmVzdGFjayA+IC5tangtcHJlc3ViIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdAp9Cgoud29yZGluZyAubWp4LWRlbGltLWggPiAubWp4LWNoYXIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrCn0KCi53b3JkaW5nIC5tangtc3VyZCB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wCn0KCi53b3JkaW5nIC5tangtbXBoYW50b20gKiB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW4KfQoKLndvcmRpbmcgLm1qeC1tZXJyb3IgewogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkY4ODsKICAgIGNvbG9yOiAjQ0MwMDAwOwogICAgYm9yZGVyOiAxcHggc29saWQgI0NDMDAwMDsKICAgIHBhZGRpbmc6IDJweCAzcHg7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXNpemU6IDkwJQp9Cgoud29yZGluZyAubWp4LWFubm90YXRpb24teG1sIHsKICAgIGxpbmUtaGVpZ2h0OiBub3JtYWwKfQoKLndvcmRpbmcgLm1qeC1tZW5jbG9zZSA+IHN2ZyB7CiAgICBmaWxsOiBub25lOwogICAgc3Ryb2tlOiBjdXJyZW50Q29sb3IKfQoKLndvcmRpbmcgLm1qeC1tdHIgewogICAgZGlzcGxheTogdGFibGUtcm93Cn0KCi53b3JkaW5nIC5tangtbWxhYmVsZWR0ciB7CiAgICBkaXNwbGF5OiB0YWJsZS1yb3cKfQoKLndvcmRpbmcgLm1qeC1tdGQgewogICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgIHRleHQtYWxpZ246IGNlbnRlcgp9Cgoud29yZGluZyAubWp4LWxhYmVsIHsKICAgIGRpc3BsYXk6IHRhYmxlLXJvdwp9Cgoud29yZGluZyAubWp4LWJveCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sKfQoKLndvcmRpbmcgLm1qeC1ibG9jayB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJhY2tncm91bmQ6IGluaGVyaXQKfQoKLndvcmRpbmcgLm1qeC1zcGFuIHsKICAgIGRpc3BsYXk6IGlubGluZQp9Cgoud29yZGluZyAubWp4LWNoYXIgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OwogICAgd2hpdGUtc3BhY2U6IHByZQp9Cgoud29yZGluZyAubWp4LWl0YWJsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtdGFibGU7CiAgICB3aWR0aDogYXV0bwp9Cgoud29yZGluZyAubWp4LXJvdyB7CiAgICBkaXNwbGF5OiB0YWJsZS1yb3cKfQoKLndvcmRpbmcgLm1qeC1jZWxsIHsKICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwKfQoKLndvcmRpbmcgLm1qeC10YWJsZSB7CiAgICBkaXNwbGF5OiB0YWJsZTsKICAgIHdpZHRoOiAxMDAlCn0KCi53b3JkaW5nIC5tangtbGluZSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICBoZWlnaHQ6IDAKfQoKLndvcmRpbmcgLm1qeC1zdHJ1dCB7CiAgICB3aWR0aDogMDsKICAgIHBhZGRpbmctdG9wOiAxZW0KfQoKLndvcmRpbmcgLm1qeC12c2l6ZSB7CiAgICB3aWR0aDogMAp9Cgoud29yZGluZyAuTUpYYy1zcGFjZTEgewogICAgbWFyZ2luLWxlZnQ6IC4xNjdlbQp9Cgoud29yZGluZyAuTUpYYy1zcGFjZTIgewogICAgbWFyZ2luLWxlZnQ6IC4yMjJlbQp9Cgoud29yZGluZyAuTUpYYy1zcGFjZTMgewogICAgbWFyZ2luLWxlZnQ6IC4yNzhlbQp9Cgoud29yZGluZyAubWp4LWV4LWJveC10ZXN0IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKCQlvdmVyZmxvdy14OiBzY3JvbGw7CiAgICBvdmVyZmxvdy15OiB2aXNpYmxlOwogICAgd2lkdGg6IDFweDsKICAgIGhlaWdodDogNjBleAp9Cgoud29yZGluZyAubWp4LWxpbmUtYm94LXRlc3QgewogICAgZGlzcGxheTogdGFibGUgIWltcG9ydGFudAp9Cgoud29yZGluZyAubWp4LWxpbmUtYm94LXRlc3Qgc3BhbiB7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMTAwMDBlbSAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwOwogICAgbWF4LXdpZHRoOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMDsKICAgIG1hcmdpbjogMAp9Cgoud29yZGluZyAuTUpYYy1UZVgtdW5rbm93bi1SIHsKICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXdlaWdodDogbm9ybWFsCn0KCi53b3JkaW5nIC5NSlhjLVRlWC11bmtub3duLUkgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtd2VpZ2h0OiBub3JtYWwKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXVua25vd24tQiB7CiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC13ZWlnaHQ6IGJvbGQKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXVua25vd24tQkkgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtd2VpZ2h0OiBib2xkCn0KCi53b3JkaW5nIC5NSlhjLVRlWC1hbXMtUiB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtYW1zLVIsIE1KWGMtVGVYLWFtcy1Sdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtY2FsLUIgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWNhbC1CLCBNSlhjLVRlWC1jYWwtQngsIE1KWGMtVGVYLWNhbC1Cdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtZnJhay1SIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1mcmFrLVIsIE1KWGMtVGVYLWZyYWstUncKfQoKLndvcmRpbmcgLk1KWGMtVGVYLWZyYWstQiB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtZnJhay1CLCBNSlhjLVRlWC1mcmFrLUJ4LCBNSlhjLVRlWC1mcmFrLUJ3Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1tYXRoLUJJIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYXRoLUJJLCBNSlhjLVRlWC1tYXRoLUJJeCwgTUpYYy1UZVgtbWF0aC1CSXcKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXNhbnMtUiB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2Fucyc7CiAgICBmb250LXNpemU6IDEwcHQ7Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1zYW5zLUIgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtQiwgTUpYYy1UZVgtc2Fucy1CeCwgTUpYYy1UZVgtc2Fucy1Cdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtc2Fucy1JIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zYW5zLUksIE1KWGMtVGVYLXNhbnMtSXgsIE1KWGMtVGVYLXNhbnMtSXcKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXNjcmlwdC1SIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zY3JpcHQtUiwgTUpYYy1UZVgtc2NyaXB0LVJ3Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC10eXBlLVIgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXNpemU6IDEwcHQ7Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1jYWwtUiB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtY2FsLVIsIE1KWGMtVGVYLWNhbC1Sdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtbWFpbi1CIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUIsIE1KWGMtVGVYLW1haW4tQngsIE1KWGMtVGVYLW1haW4tQncKfQoKLndvcmRpbmcgLk1KWGMtVGVYLW1haW4tSSB7CiAgICBmb250LXN0eWxlOiBpdGFsaWMKfQoKLndvcmRpbmcgLk1KWGMtVGVYLW1haW4tUiB7Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1tYXRoLUkgewogICAgZm9udC1zdHlsZTogaXRhbGljCn0KCi53b3JkaW5nIC5NSlhjLVRlWC1zaXplMS1SIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zaXplMS1SLCBNSlhjLVRlWC1zaXplMS1Sdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtc2l6ZTItUiB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2l6ZTItUiwgTUpYYy1UZVgtc2l6ZTItUncKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXNpemUzLVIgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNpemUzLVIsIE1KWGMtVGVYLXNpemUzLVJ3Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1zaXplNC1SIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zaXplNC1SLCBNSlhjLVRlWC1zaXplNC1Sdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtdmVjLVIgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXZlYy1SLCBNSlhjLVRlWC12ZWMtUncKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXZlYy1CIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC12ZWMtQiwgTUpYYy1UZVgtdmVjLUJ4LCBNSlhjLVRlWC12ZWMtQncKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtYW1zLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X0FNUycpLCBsb2NhbCgnTWF0aEpheF9BTVMtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWFtcy1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfQU1TLVJlZ3VsYXIuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9BTVMtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X0FNUy1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1jYWwtQjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfQ2FsaWdyYXBoaWMgQm9sZCcpLCBsb2NhbCgnTWF0aEpheF9DYWxpZ3JhcGhpYy1Cb2xkJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtY2FsLUJ4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9DYWxpZ3JhcGhpYycpOwogICAgZm9udC13ZWlnaHQ6IGJvbGQKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtY2FsLUJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9DYWxpZ3JhcGhpYy1Cb2xkLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfQ2FsaWdyYXBoaWMtQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X0NhbGlncmFwaGljLUJvbGQub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWZyYWstUjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfRnJha3R1cicpLCBsb2NhbCgnTWF0aEpheF9GcmFrdHVyLVJlZ3VsYXInKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1mcmFrLVJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9GcmFrdHVyLVJlZ3VsYXIuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9GcmFrdHVyLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9GcmFrdHVyLVJlZ3VsYXIub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWZyYWstQjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfRnJha3R1ciBCb2xkJyksIGxvY2FsKCdNYXRoSmF4X0ZyYWt0dXItQm9sZCcpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWZyYWstQng7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X0ZyYWt0dXInKTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWZyYWstQnc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X0ZyYWt0dXItQm9sZC5lb3QnKTsKICAgIHNyYyAvKjIqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvd29mZi9NYXRoSmF4X0ZyYWt0dXItQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X0ZyYWt0dXItQm9sZC5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtbWF0aC1CSTsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfTWF0aCBCb2xkSXRhbGljJyksIGxvY2FsKCdNYXRoSmF4X01hdGgtQm9sZEl0YWxpYycpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLW1hdGgtQkl4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9NYXRoJyk7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYwp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYXRoLUJJdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfTWF0aC1Cb2xkSXRhbGljLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfTWF0aC1Cb2xkSXRhbGljLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfTWF0aC1Cb2xkSXRhbGljLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zYW5zLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NhbnNTZXJpZicpLCBsb2NhbCgnTWF0aEpheF9TYW5zU2VyaWYtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtUnc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X1NhbnNTZXJpZi1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfU2Fuc1NlcmlmLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9TYW5zU2VyaWYtUmVndWxhci5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2Fucy1COwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9TYW5zU2VyaWYgQm9sZCcpLCBsb2NhbCgnTWF0aEpheF9TYW5zU2VyaWYtQm9sZCcpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtQng7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NhbnNTZXJpZicpOwogICAgZm9udC13ZWlnaHQ6IGJvbGQKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2Fucy1CdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfU2Fuc1NlcmlmLUJvbGQuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9TYW5zU2VyaWYtQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1NhbnNTZXJpZi1Cb2xkLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zYW5zLUk7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NhbnNTZXJpZiBJdGFsaWMnKSwgbG9jYWwoJ01hdGhKYXhfU2Fuc1NlcmlmLUl0YWxpYycpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtSXg7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NhbnNTZXJpZicpOwogICAgZm9udC1zdHlsZTogaXRhbGljCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtSXc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X1NhbnNTZXJpZi1JdGFsaWMuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9TYW5zU2VyaWYtSXRhbGljLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfU2Fuc1NlcmlmLUl0YWxpYy5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2NyaXB0LVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NjcmlwdCcpLCBsb2NhbCgnTWF0aEpheF9TY3JpcHQtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNjcmlwdC1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfU2NyaXB0LVJlZ3VsYXIuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9TY3JpcHQtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1NjcmlwdC1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC10eXBlLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1R5cGV3cml0ZXInKSwgbG9jYWwoJ01hdGhKYXhfVHlwZXdyaXRlci1SZWd1bGFyJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtdHlwZS1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfVHlwZXdyaXRlci1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfVHlwZXdyaXRlci1SZWd1bGFyLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfVHlwZXdyaXRlci1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1jYWwtUjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfQ2FsaWdyYXBoaWMnKSwgbG9jYWwoJ01hdGhKYXhfQ2FsaWdyYXBoaWMtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWNhbC1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfQ2FsaWdyYXBoaWMtUmVndWxhci5lb3QnKTsKICAgIHNyYyAvKjIqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvd29mZi9NYXRoSmF4X0NhbGlncmFwaGljLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9DYWxpZ3JhcGhpYy1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X01haW4gQm9sZCcpLCBsb2NhbCgnTWF0aEpheF9NYWluLUJvbGQnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUJ4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9NYWluJyk7CiAgICBmb250LXdlaWdodDogYm9sZAp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9NYWluLUJvbGQuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9NYWluLUJvbGQud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9NYWluLUJvbGQub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLW1haW4tSTsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfTWFpbiBJdGFsaWMnKSwgbG9jYWwoJ01hdGhKYXhfTWFpbi1JdGFsaWMnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUl4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9NYWluJyk7CiAgICBmb250LXN0eWxlOiBpdGFsaWMKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtbWFpbi1JdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfTWFpbi1JdGFsaWMuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9NYWluLUl0YWxpYy53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X01haW4tSXRhbGljLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X01haW4nKSwgbG9jYWwoJ01hdGhKYXhfTWFpbi1SZWd1bGFyJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtbWFpbi1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfTWFpbi1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfTWFpbi1SZWd1bGFyLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfTWFpbi1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYXRoLUk7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X01hdGggSXRhbGljJyksIGxvY2FsKCdNYXRoSmF4X01hdGgtSXRhbGljJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtbWF0aC1JeDsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfTWF0aCcpOwogICAgZm9udC1zdHlsZTogaXRhbGljCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLW1hdGgtSXc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X01hdGgtSXRhbGljLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfTWF0aC1JdGFsaWMud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9NYXRoLUl0YWxpYy5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2l6ZTEtUjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfU2l6ZTEnKSwgbG9jYWwoJ01hdGhKYXhfU2l6ZTEtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNpemUxLVJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9TaXplMS1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfU2l6ZTEtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1NpemUxLVJlZ3VsYXIub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNpemUyLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NpemUyJyksIGxvY2FsKCdNYXRoSmF4X1NpemUyLVJlZ3VsYXInKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zaXplMi1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfU2l6ZTItUmVndWxhci5lb3QnKTsKICAgIHNyYyAvKjIqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvd29mZi9NYXRoSmF4X1NpemUyLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9TaXplMi1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zaXplMy1SOwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9TaXplMycpLCBsb2NhbCgnTWF0aEpheF9TaXplMy1SZWd1bGFyJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2l6ZTMtUnc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X1NpemUzLVJlZ3VsYXIuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9TaXplMy1SZWd1bGFyLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfU2l6ZTMtUmVndWxhci5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2l6ZTQtUjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfU2l6ZTQnKSwgbG9jYWwoJ01hdGhKYXhfU2l6ZTQtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNpemU0LVJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9TaXplNC1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfU2l6ZTQtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1NpemU0LVJlZ3VsYXIub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXZlYy1SOwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9WZWN0b3InKSwgbG9jYWwoJ01hdGhKYXhfVmVjdG9yLVJlZ3VsYXInKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC12ZWMtUnc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X1ZlY3Rvci1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfVmVjdG9yLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9WZWN0b3ItUmVndWxhci5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtdmVjLUI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1ZlY3RvciBCb2xkJyksIGxvY2FsKCdNYXRoSmF4X1ZlY3Rvci1Cb2xkJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtdmVjLUJ4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9WZWN0b3InKTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXZlYy1CdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfVmVjdG9yLUJvbGQuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9WZWN0b3ItQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1ZlY3Rvci1Cb2xkLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9Cgoud29yZGluZyBkaXYuZXhhbXBsZSB7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi10b3A6IDVwdDsKCW1hcmdpbi1ib3R0b206IDVwdDsKCWZvbnQtc2l6ZTogMTFwdDsKCWNvbG9yOiAjYmIwMGJiOwp9Cgoud29yZGluZyBkaXYubm90ZSB7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi10b3A6IDVwdDsKCW1hcmdpbi1ib3R0b206IDVwdDsKCWZvbnQtc2l6ZTogMTFwdDsKCWNvbG9yOiAjYmIwMGJiOwp9Cgoud29yZGluZyBkaXYuZXhhbXBsZSB7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi10b3A6IDVwdDsKCW1hcmdpbi1ib3R0b206IDVwdDsKCWZvbnQtc2l6ZTogOXB0Owp9Cgoud29yZGluZyBkaXYubm90ZSB7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi10b3A6IDVwdDsKCW1hcmdpbi1ib3R0b206IDVwdDsKCWZvbnQtc2l6ZTogOXB0Owp9Cgoud29yZGluZyBkaXYubm90ZSAudGV4dHR0IHsgZm9udC1zaXplOiA5cHQ7IH0KLndvcmRpbmcgZGl2LmV4YW1wbGUgLnRleHR0dCB7IGZvbnQtc2l6ZTogOXB0OyB9Cgoud29yZGluZyBkaXYubm90ZSAudGV4dHNmIHsgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMnOyBmb250LXNpemU6IDlwdDsgfQoud29yZGluZyBkaXYuZXhhbXBsZSAudGV4dHNmIHsgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMnOyBmb250LXNpemU6IDlwdDsgfQoKLndvcmRpbmcgZGl2Lm5vdGUgLm1hdGggeyBmb250LXNpemU6IDlwdDsgfQoud29yZGluZyBkaXYuZXhhbXBsZSAubWF0aCB7IGZvbnQtc2l6ZTogOXB0OyB9Cgoud29yZGluZyBkaXYuZXhhbXBsZSB7IGRpc3BsYXk6IG5vbmU7IH0KLndvcmRpbmcgZGl2Lm5vdGUgeyBkaXNwbGF5OiBub25lOyB9Cgoud29yZGluZyBhLmZvb3Rub3RlbnVtIHsgZGlzcGxheTogbm9uZTsgfQoud29yZGluZyBkaXYuZm9vdG5vdGUgeyBkaXNwbGF5OiBub25lOyB9Ci53b3JkaW5nIGRpdi5mb290bm90ZVNlcGFyYXRvciB7IGRpc3BsYXk6IG5vbmU7IH0KLndvcmRpbmcgLmZvb3Rub3RlcmVmIHsgZGlzcGxheTogbm9uZTsgfQoKLndvcmRpbmcgZGl2Lm5vbk5vcm1hdGl2ZU9ubHkgeyBkaXNwbGF5OiBub25lOyB9Cgo=">
<link href="https://fonts.googleapis.com/css?family=Noto+Serif" rel='stylesheet'>
<link href="https://fonts.googleapis.com/css?family=Noto+Sans" rel='stylesheet'>
<link href="https://fonts.googleapis.com/css?family=Noto+Sans+Mono" rel='stylesheet'>
<script src="data:text/javascript;base64,LyohCiAgSGlnaGxpZ2h0LmpzIHYxMS45LjAgKGdpdDogYjdlYzRiZmFmYykKICAoYykgMjAwNi0yMDI0IHVuZGVmaW5lZCBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAgTGljZW5zZTogQlNELTMtQ2xhdXNlCiAqLwp2YXIgaGxqcz1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKHQpewpyZXR1cm4gdCBpbnN0YW5jZW9mIE1hcD90LmNsZWFyPXQuZGVsZXRlPXQuc2V0PSgpPT57CnRocm93IEVycm9yKCJtYXAgaXMgcmVhZC1vbmx5Iil9OnQgaW5zdGFuY2VvZiBTZXQmJih0LmFkZD10LmNsZWFyPXQuZGVsZXRlPSgpPT57CnRocm93IEVycm9yKCJzZXQgaXMgcmVhZC1vbmx5IikKfSksT2JqZWN0LmZyZWV6ZSh0KSxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5mb3JFYWNoKChuPT57CmNvbnN0IGk9dFtuXSxzPXR5cGVvZiBpOyJvYmplY3QiIT09cyYmImZ1bmN0aW9uIiE9PXN8fE9iamVjdC5pc0Zyb3plbihpKXx8ZShpKQp9KSksdH1jbGFzcyB0e2NvbnN0cnVjdG9yKGUpewp2b2lkIDA9PT1lLmRhdGEmJihlLmRhdGE9e30pLHRoaXMuZGF0YT1lLmRhdGEsdGhpcy5pc01hdGNoSWdub3JlZD0hMX0KaWdub3JlTWF0Y2goKXt0aGlzLmlzTWF0Y2hJZ25vcmVkPSEwfX1mdW5jdGlvbiBuKGUpewpyZXR1cm4gZS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjeDI3OyIpCn1mdW5jdGlvbiBpKGUsLi4udCl7Y29uc3Qgbj1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdCB0IGluIGUpblt0XT1lW3RdCjtyZXR1cm4gdC5mb3JFYWNoKChlPT57Zm9yKGNvbnN0IHQgaW4gZSluW3RdPWVbdF19KSksbn1jb25zdCBzPWU9PiEhZS5zY29wZQo7Y2xhc3Mgb3tjb25zdHJ1Y3RvcihlLHQpewp0aGlzLmJ1ZmZlcj0iIix0aGlzLmNsYXNzUHJlZml4PXQuY2xhc3NQcmVmaXgsZS53YWxrKHRoaXMpfWFkZFRleHQoZSl7CnRoaXMuYnVmZmVyKz1uKGUpfW9wZW5Ob2RlKGUpe2lmKCFzKGUpKXJldHVybjtjb25zdCB0PSgoZSx7cHJlZml4OnR9KT0+ewppZihlLnN0YXJ0c1dpdGgoImxhbmd1YWdlOiIpKXJldHVybiBlLnJlcGxhY2UoImxhbmd1YWdlOiIsImxhbmd1YWdlLSIpCjtpZihlLmluY2x1ZGVzKCIuIikpe2NvbnN0IG49ZS5zcGxpdCgiLiIpCjtyZXR1cm5bYCR7dH0ke24uc2hpZnQoKX1gLC4uLm4ubWFwKCgoZSx0KT0+YCR7ZX0keyJfIi5yZXBlYXQodCsxKX1gKSldLmpvaW4oIiAiKQp9cmV0dXJuYCR7dH0ke2V9YH0pKGUuc2NvcGUse3ByZWZpeDp0aGlzLmNsYXNzUHJlZml4fSk7dGhpcy5zcGFuKHQpfQpjbG9zZU5vZGUoZSl7cyhlKSYmKHRoaXMuYnVmZmVyKz0iPC9zcGFuPiIpfXZhbHVlKCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNwYW4oZSl7CnRoaXMuYnVmZmVyKz1gPHNwYW4gY2xhc3M9IiR7ZX0iPmB9fWNvbnN0IHI9KGU9e30pPT57Y29uc3QgdD17Y2hpbGRyZW46W119CjtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LGUpLHR9O2NsYXNzIGF7Y29uc3RydWN0b3IoKXsKdGhpcy5yb290Tm9kZT1yKCksdGhpcy5zdGFjaz1bdGhpcy5yb290Tm9kZV19Z2V0IHRvcCgpewpyZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXX1nZXQgcm9vdCgpe3JldHVybiB0aGlzLnJvb3ROb2RlfWFkZChlKXsKdGhpcy50b3AuY2hpbGRyZW4ucHVzaChlKX1vcGVuTm9kZShlKXtjb25zdCB0PXIoe3Njb3BlOmV9KQo7dGhpcy5hZGQodCksdGhpcy5zdGFjay5wdXNoKHQpfWNsb3NlTm9kZSgpewppZih0aGlzLnN0YWNrLmxlbmd0aD4xKXJldHVybiB0aGlzLnN0YWNrLnBvcCgpfWNsb3NlQWxsTm9kZXMoKXsKZm9yKDt0aGlzLmNsb3NlTm9kZSgpOyk7fXRvSlNPTigpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3ROb2RlLG51bGwsNCl9CndhbGsoZSl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuX3dhbGsoZSx0aGlzLnJvb3ROb2RlKX1zdGF0aWMgX3dhbGsoZSx0KXsKcmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2UuYWRkVGV4dCh0KTp0LmNoaWxkcmVuJiYoZS5vcGVuTm9kZSh0KSwKdC5jaGlsZHJlbi5mb3JFYWNoKCh0PT50aGlzLl93YWxrKGUsdCkpKSxlLmNsb3NlTm9kZSh0KSksZX1zdGF0aWMgX2NvbGxhcHNlKGUpewoic3RyaW5nIiE9dHlwZW9mIGUmJmUuY2hpbGRyZW4mJihlLmNoaWxkcmVuLmV2ZXJ5KChlPT4ic3RyaW5nIj09dHlwZW9mIGUpKT9lLmNoaWxkcmVuPVtlLmNoaWxkcmVuLmpvaW4oIiIpXTplLmNoaWxkcmVuLmZvckVhY2goKGU9PnsKYS5fY29sbGFwc2UoZSl9KSkpfX1jbGFzcyBjIGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMub3B0aW9ucz1lfQphZGRUZXh0KGUpeyIiIT09ZSYmdGhpcy5hZGQoZSl9c3RhcnRTY29wZShlKXt0aGlzLm9wZW5Ob2RlKGUpfWVuZFNjb3BlKCl7CnRoaXMuY2xvc2VOb2RlKCl9X19hZGRTdWJsYW5ndWFnZShlLHQpe2NvbnN0IG49ZS5yb290Cjt0JiYobi5zY29wZT0ibGFuZ3VhZ2U6Iit0KSx0aGlzLmFkZChuKX10b0hUTUwoKXsKcmV0dXJuIG5ldyBvKHRoaXMsdGhpcy5vcHRpb25zKS52YWx1ZSgpfWZpbmFsaXplKCl7CnJldHVybiB0aGlzLmNsb3NlQWxsTm9kZXMoKSwhMH19ZnVuY3Rpb24gbChlKXsKcmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP2U6ZS5zb3VyY2U6bnVsbH1mdW5jdGlvbiBnKGUpe3JldHVybiBoKCIoPz0iLGUsIikiKX0KZnVuY3Rpb24gdShlKXtyZXR1cm4gaCgiKD86IixlLCIpKiIpfWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGgoIig/OiIsZSwiKT8iKX0KZnVuY3Rpb24gaCguLi5lKXtyZXR1cm4gZS5tYXAoKGU9PmwoZSkpKS5qb2luKCIiKX1mdW5jdGlvbiBmKC4uLmUpe2NvbnN0IHQ9KGU9PnsKY29uc3QgdD1lW2UubGVuZ3RoLTFdCjtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJnQuY29uc3RydWN0b3I9PT1PYmplY3Q/KGUuc3BsaWNlKGUubGVuZ3RoLTEsMSksdCk6e30KfSkoZSk7cmV0dXJuIigiKyh0LmNhcHR1cmU/IiI6Ij86IikrZS5tYXAoKGU9PmwoZSkpKS5qb2luKCJ8IikrIikifQpmdW5jdGlvbiBwKGUpe3JldHVybiBSZWdFeHAoZS50b1N0cmluZygpKyJ8IikuZXhlYygiIikubGVuZ3RoLTF9CmNvbnN0IGI9L1xbKD86W15cXFxdXXxcXC4pKlxdfFwoXD8/fFxcKFsxLTldWzAtOV0qKXxcXC4vCjtmdW5jdGlvbiBtKGUse2pvaW5XaXRoOnR9KXtsZXQgbj0wO3JldHVybiBlLm1hcCgoZT0+e24rPTE7Y29uc3QgdD1uCjtsZXQgaT1sKGUpLHM9IiI7Zm9yKDtpLmxlbmd0aD4wOyl7Y29uc3QgZT1iLmV4ZWMoaSk7aWYoIWUpe3MrPWk7YnJlYWt9CnMrPWkuc3Vic3RyaW5nKDAsZS5pbmRleCksCmk9aS5zdWJzdHJpbmcoZS5pbmRleCtlWzBdLmxlbmd0aCksIlxcIj09PWVbMF1bMF0mJmVbMV0/cys9IlxcIisoTnVtYmVyKGVbMV0pK3QpOihzKz1lWzBdLAoiKCI9PT1lWzBdJiZuKyspfXJldHVybiBzfSkpLm1hcCgoZT0+YCgke2V9KWApKS5qb2luKHQpfQpjb25zdCBFPSJbYS16QS1aXVxcdyoiLHg9IlthLXpBLVpfXVxcdyoiLHc9IlxcYlxcZCsoXFwuXFxkKyk/Iix5PSIoLT8pKFxcYjBbeFhdW2EtZkEtRjAtOV0rfChcXGJcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWy0rXT9cXGQrKT8pIixfPSJcXGIoMGJbMDFdKykiLE89ewpiZWdpbjoiXFxcXFtcXHNcXFNdIixyZWxldmFuY2U6MH0sdj17c2NvcGU6InN0cmluZyIsYmVnaW46IiciLGVuZDoiJyIsCmlsbGVnYWw6IlxcbiIsY29udGFpbnM6W09dfSxrPXtzY29wZToic3RyaW5nIixiZWdpbjonIicsZW5kOiciJyxpbGxlZ2FsOiJcXG4iLApjb250YWluczpbT119LE49KGUsdCxuPXt9KT0+e2NvbnN0IHM9aSh7c2NvcGU6ImNvbW1lbnQiLGJlZ2luOmUsZW5kOnQsCmNvbnRhaW5zOltdfSxuKTtzLmNvbnRhaW5zLnB1c2goe3Njb3BlOiJkb2N0YWciLApiZWdpbjoiWyBdKig/PShUT0RPfEZJWE1FfE5PVEV8QlVHfE9QVElNSVpFfEhBQ0t8WFhYKTopIiwKZW5kOi8oVE9ET3xGSVhNRXxOT1RFfEJVR3xPUFRJTUlaRXxIQUNLfFhYWCk6LyxleGNsdWRlQmVnaW46ITAscmVsZXZhbmNlOjB9KQo7Y29uc3Qgbz1mKCJJIiwiYSIsImlzIiwic28iLCJ1cyIsInRvIiwiYXQiLCJpZiIsImluIiwiaXQiLCJvbiIsL1tBLVphLXpdK1snXShkfHZlfHJlfGxsfHR8c3xuKS8sL1tBLVphLXpdK1stXVthLXpdKy8sL1tBLVphLXpdW2Etel17Mix9LykKO3JldHVybiBzLmNvbnRhaW5zLnB1c2goe2JlZ2luOmgoL1sgXSsvLCIoIixvLC9bLl0/WzpdPyhbLl1bIF18WyBdKS8sIil7M30iKX0pLHMKfSxTPU4oIi8vIiwiJCIpLE09TigiL1xcKiIsIlxcKi8iKSxSPU4oIiMiLCIkIik7dmFyIGo9T2JqZWN0LmZyZWV6ZSh7Cl9fcHJvdG9fXzpudWxsLEFQT1NfU1RSSU5HX01PREU6dixCQUNLU0xBU0hfRVNDQVBFOk8sQklOQVJZX05VTUJFUl9NT0RFOnsKc2NvcGU6Im51bWJlciIsYmVnaW46XyxyZWxldmFuY2U6MH0sQklOQVJZX05VTUJFUl9SRTpfLENPTU1FTlQ6TiwKQ19CTE9DS19DT01NRU5UX01PREU6TSxDX0xJTkVfQ09NTUVOVF9NT0RFOlMsQ19OVU1CRVJfTU9ERTp7c2NvcGU6Im51bWJlciIsCmJlZ2luOnkscmVsZXZhbmNlOjB9LENfTlVNQkVSX1JFOnksRU5EX1NBTUVfQVNfQkVHSU46ZT0+T2JqZWN0LmFzc2lnbihlLHsKIm9uOmJlZ2luIjooZSx0KT0+e3QuZGF0YS5fYmVnaW5NYXRjaD1lWzFdfSwib246ZW5kIjooZSx0KT0+ewp0LmRhdGEuX2JlZ2luTWF0Y2ghPT1lWzFdJiZ0Lmlnbm9yZU1hdGNoKCl9fSksSEFTSF9DT01NRU5UX01PREU6UixJREVOVF9SRTpFLApNQVRDSF9OT1RISU5HX1JFOi9cYlxCLyxNRVRIT0RfR1VBUkQ6e2JlZ2luOiJcXC5cXHMqIit4LHJlbGV2YW5jZTowfSwKTlVNQkVSX01PREU6e3Njb3BlOiJudW1iZXIiLGJlZ2luOncscmVsZXZhbmNlOjB9LE5VTUJFUl9SRTp3LApQSFJBU0FMX1dPUkRTX01PREU6ewpiZWdpbjovXGIoYXxhbnx0aGV8YXJlfEknbXxpc24ndHxkb24ndHxkb2Vzbid0fHdvbid0fGJ1dHxqdXN0fHNob3VsZHxwcmV0dHl8c2ltcGx5fGVub3VnaHxnb25uYXxnb2luZ3x3dGZ8c298c3VjaHx3aWxsfHlvdXx5b3VyfHRoZXl8bGlrZXxtb3JlKVxiLwp9LFFVT1RFX1NUUklOR19NT0RFOmssUkVHRVhQX01PREU6e3Njb3BlOiJyZWdleHAiLGJlZ2luOi9cLyg/PVteL1xuXSpcLykvLAplbmQ6L1wvW2dpbXV5XSovLGNvbnRhaW5zOltPLHtiZWdpbjovXFsvLGVuZDovXF0vLHJlbGV2YW5jZTowLGNvbnRhaW5zOltPXX1dfSwKUkVfU1RBUlRFUlNfUkU6IiF8IT18IT09fCV8JT18JnwmJnwmPXxcXCp8XFwqPXxcXCt8XFwrPXwsfC18LT18Lz18L3w6fDt8PDx8PDw9fDw9fDx8PT09fD09fD18Pj4+PXw+Pj18Pj18Pj4+fD4+fD58XFw/fFxcW3xcXHt8XFwofFxcXnxcXF49fFxcfHxcXHw9fFxcfFxcfHx+IiwKU0hFQkFORzooZT17fSk9Pntjb25zdCB0PS9eIyFbIF0qXC8vCjtyZXR1cm4gZS5iaW5hcnkmJihlLmJlZ2luPWgodCwvLipcYi8sZS5iaW5hcnksL1xiLiovKSksaSh7c2NvcGU6Im1ldGEiLGJlZ2luOnQsCmVuZDovJC8scmVsZXZhbmNlOjAsIm9uOmJlZ2luIjooZSx0KT0+ezAhPT1lLmluZGV4JiZ0Lmlnbm9yZU1hdGNoKCl9fSxlKX0sClRJVExFX01PREU6e3Njb3BlOiJ0aXRsZSIsYmVnaW46RSxyZWxldmFuY2U6MH0sVU5ERVJTQ09SRV9JREVOVF9SRTp4LApVTkRFUlNDT1JFX1RJVExFX01PREU6e3Njb3BlOiJ0aXRsZSIsYmVnaW46eCxyZWxldmFuY2U6MH19KTtmdW5jdGlvbiBBKGUsdCl7CiIuIj09PWUuaW5wdXRbZS5pbmRleC0xXSYmdC5pZ25vcmVNYXRjaCgpfWZ1bmN0aW9uIEkoZSx0KXsKdm9pZCAwIT09ZS5jbGFzc05hbWUmJihlLnNjb3BlPWUuY2xhc3NOYW1lLGRlbGV0ZSBlLmNsYXNzTmFtZSl9ZnVuY3Rpb24gVChlLHQpewp0JiZlLmJlZ2luS2V5d29yZHMmJihlLmJlZ2luPSJcXGIoIitlLmJlZ2luS2V5d29yZHMuc3BsaXQoIiAiKS5qb2luKCJ8IikrIikoPyFcXC4pKD89XFxifFxccykiLAplLl9fYmVmb3JlQmVnaW49QSxlLmtleXdvcmRzPWUua2V5d29yZHN8fGUuYmVnaW5LZXl3b3JkcyxkZWxldGUgZS5iZWdpbktleXdvcmRzLAp2b2lkIDA9PT1lLnJlbGV2YW5jZSYmKGUucmVsZXZhbmNlPTApKX1mdW5jdGlvbiBMKGUsdCl7CkFycmF5LmlzQXJyYXkoZS5pbGxlZ2FsKSYmKGUuaWxsZWdhbD1mKC4uLmUuaWxsZWdhbCkpfWZ1bmN0aW9uIEIoZSx0KXsKaWYoZS5tYXRjaCl7CmlmKGUuYmVnaW58fGUuZW5kKXRocm93IEVycm9yKCJiZWdpbiAmIGVuZCBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIG1hdGNoIikKO2UuYmVnaW49ZS5tYXRjaCxkZWxldGUgZS5tYXRjaH19ZnVuY3Rpb24gUChlLHQpewp2b2lkIDA9PT1lLnJlbGV2YW5jZSYmKGUucmVsZXZhbmNlPTEpfWNvbnN0IEQ9KGUsdCk9PntpZighZS5iZWZvcmVNYXRjaClyZXR1cm4KO2lmKGUuc3RhcnRzKXRocm93IEVycm9yKCJiZWZvcmVNYXRjaCBjYW5ub3QgYmUgdXNlZCB3aXRoIHN0YXJ0cyIpCjtjb25zdCBuPU9iamVjdC5hc3NpZ24oe30sZSk7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e2RlbGV0ZSBlW3RdCn0pKSxlLmtleXdvcmRzPW4ua2V5d29yZHMsZS5iZWdpbj1oKG4uYmVmb3JlTWF0Y2gsZyhuLmJlZ2luKSksZS5zdGFydHM9ewpyZWxldmFuY2U6MCxjb250YWluczpbT2JqZWN0LmFzc2lnbihuLHtlbmRzUGFyZW50OiEwfSldCn0sZS5yZWxldmFuY2U9MCxkZWxldGUgbi5iZWZvcmVNYXRjaAp9LEg9WyJvZiIsImFuZCIsImZvciIsImluIiwibm90Iiwib3IiLCJpZiIsInRoZW4iLCJwYXJlbnQiLCJsaXN0IiwidmFsdWUiXSxDPSJrZXl3b3JkIgo7ZnVuY3Rpb24gJChlLHQsbj1DKXtjb25zdCBpPU9iamVjdC5jcmVhdGUobnVsbCkKO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9zKG4sZS5zcGxpdCgiICIpKTpBcnJheS5pc0FycmF5KGUpP3MobixlKTpPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChuPT57Ck9iamVjdC5hc3NpZ24oaSwkKGVbbl0sdCxuKSl9KSksaTtmdW5jdGlvbiBzKGUsbil7CnQmJihuPW4ubWFwKChlPT5lLnRvTG93ZXJDYXNlKCkpKSksbi5mb3JFYWNoKCh0PT57Y29uc3Qgbj10LnNwbGl0KCJ8IikKO2lbblswXV09W2UsVShuWzBdLG5bMV0pXX0pKX19ZnVuY3Rpb24gVShlLHQpewpyZXR1cm4gdD9OdW1iZXIodCk6KGU9PkguaW5jbHVkZXMoZS50b0xvd2VyQ2FzZSgpKSkoZSk/MDoxfWNvbnN0IHo9e30sVz1lPT57CmNvbnNvbGUuZXJyb3IoZSl9LFg9KGUsLi4udCk9Pntjb25zb2xlLmxvZygiV0FSTjogIitlLC4uLnQpfSxHPShlLHQpPT57CnpbYCR7ZX0vJHt0fWBdfHwoY29uc29sZS5sb2coYERlcHJlY2F0ZWQgYXMgb2YgJHtlfS4gJHt0fWApLHpbYCR7ZX0vJHt0fWBdPSEwKQp9LEs9RXJyb3IoKTtmdW5jdGlvbiBGKGUsdCx7a2V5Om59KXtsZXQgaT0wO2NvbnN0IHM9ZVtuXSxvPXt9LHI9e30KO2ZvcihsZXQgZT0xO2U8PXQubGVuZ3RoO2UrKylyW2UraV09c1tlXSxvW2UraV09ITAsaSs9cCh0W2UtMV0pCjtlW25dPXIsZVtuXS5fZW1pdD1vLGVbbl0uX211bHRpPSEwfWZ1bmN0aW9uIFooZSl7KGU9PnsKZS5zY29wZSYmIm9iamVjdCI9PXR5cGVvZiBlLnNjb3BlJiZudWxsIT09ZS5zY29wZSYmKGUuYmVnaW5TY29wZT1lLnNjb3BlLApkZWxldGUgZS5zY29wZSl9KShlKSwic3RyaW5nIj09dHlwZW9mIGUuYmVnaW5TY29wZSYmKGUuYmVnaW5TY29wZT17Cl93cmFwOmUuYmVnaW5TY29wZX0pLCJzdHJpbmciPT10eXBlb2YgZS5lbmRTY29wZSYmKGUuZW5kU2NvcGU9e193cmFwOmUuZW5kU2NvcGUKfSksKGU9PntpZihBcnJheS5pc0FycmF5KGUuYmVnaW4pKXsKaWYoZS5za2lwfHxlLmV4Y2x1ZGVCZWdpbnx8ZS5yZXR1cm5CZWdpbil0aHJvdyBXKCJza2lwLCBleGNsdWRlQmVnaW4sIHJldHVybkJlZ2luIG5vdCBjb21wYXRpYmxlIHdpdGggYmVnaW5TY29wZToge30iKSwKSwo7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmJlZ2luU2NvcGV8fG51bGw9PT1lLmJlZ2luU2NvcGUpdGhyb3cgVygiYmVnaW5TY29wZSBtdXN0IGJlIG9iamVjdCIpLApLO0YoZSxlLmJlZ2luLHtrZXk6ImJlZ2luU2NvcGUifSksZS5iZWdpbj1tKGUuYmVnaW4se2pvaW5XaXRoOiIifSl9fSkoZSksKGU9PnsKaWYoQXJyYXkuaXNBcnJheShlLmVuZCkpewppZihlLnNraXB8fGUuZXhjbHVkZUVuZHx8ZS5yZXR1cm5FbmQpdGhyb3cgVygic2tpcCwgZXhjbHVkZUVuZCwgcmV0dXJuRW5kIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kU2NvcGU6IHt9IiksCksKO2lmKCJvYmplY3QiIT10eXBlb2YgZS5lbmRTY29wZXx8bnVsbD09PWUuZW5kU2NvcGUpdGhyb3cgVygiZW5kU2NvcGUgbXVzdCBiZSBvYmplY3QiKSwKSztGKGUsZS5lbmQse2tleToiZW5kU2NvcGUifSksZS5lbmQ9bShlLmVuZCx7am9pbldpdGg6IiJ9KX19KShlKX1mdW5jdGlvbiBWKGUpewpmdW5jdGlvbiB0KHQsbil7CnJldHVybiBSZWdFeHAobCh0KSwibSIrKGUuY2FzZV9pbnNlbnNpdGl2ZT8iaSI6IiIpKyhlLnVuaWNvZGVSZWdleD8idSI6IiIpKyhuPyJnIjoiIikpCn1jbGFzcyBue2NvbnN0cnVjdG9yKCl7CnRoaXMubWF0Y2hJbmRleGVzPXt9LHRoaXMucmVnZXhlcz1bXSx0aGlzLm1hdGNoQXQ9MSx0aGlzLnBvc2l0aW9uPTB9CmFkZFJ1bGUoZSx0KXsKdC5wb3NpdGlvbj10aGlzLnBvc2l0aW9uKyssdGhpcy5tYXRjaEluZGV4ZXNbdGhpcy5tYXRjaEF0XT10LHRoaXMucmVnZXhlcy5wdXNoKFt0LGVdKSwKdGhpcy5tYXRjaEF0Kz1wKGUpKzF9Y29tcGlsZSgpezA9PT10aGlzLnJlZ2V4ZXMubGVuZ3RoJiYodGhpcy5leGVjPSgpPT5udWxsKQo7Y29uc3QgZT10aGlzLnJlZ2V4ZXMubWFwKChlPT5lWzFdKSk7dGhpcy5tYXRjaGVyUmU9dChtKGUse2pvaW5XaXRoOiJ8Igp9KSwhMCksdGhpcy5sYXN0SW5kZXg9MH1leGVjKGUpe3RoaXMubWF0Y2hlclJlLmxhc3RJbmRleD10aGlzLmxhc3RJbmRleAo7Y29uc3QgdD10aGlzLm1hdGNoZXJSZS5leGVjKGUpO2lmKCF0KXJldHVybiBudWxsCjtjb25zdCBuPXQuZmluZEluZGV4KCgoZSx0KT0+dD4wJiZ2b2lkIDAhPT1lKSksaT10aGlzLm1hdGNoSW5kZXhlc1tuXQo7cmV0dXJuIHQuc3BsaWNlKDAsbiksT2JqZWN0LmFzc2lnbih0LGkpfX1jbGFzcyBze2NvbnN0cnVjdG9yKCl7CnRoaXMucnVsZXM9W10sdGhpcy5tdWx0aVJlZ2V4ZXM9W10sCnRoaXMuY291bnQ9MCx0aGlzLmxhc3RJbmRleD0wLHRoaXMucmVnZXhJbmRleD0wfWdldE1hdGNoZXIoZSl7CmlmKHRoaXMubXVsdGlSZWdleGVzW2VdKXJldHVybiB0aGlzLm11bHRpUmVnZXhlc1tlXTtjb25zdCB0PW5ldyBuCjtyZXR1cm4gdGhpcy5ydWxlcy5zbGljZShlKS5mb3JFYWNoKCgoW2Usbl0pPT50LmFkZFJ1bGUoZSxuKSkpLAp0LmNvbXBpbGUoKSx0aGlzLm11bHRpUmVnZXhlc1tlXT10LHR9cmVzdW1pbmdTY2FuQXRTYW1lUG9zaXRpb24oKXsKcmV0dXJuIDAhPT10aGlzLnJlZ2V4SW5kZXh9Y29uc2lkZXJBbGwoKXt0aGlzLnJlZ2V4SW5kZXg9MH1hZGRSdWxlKGUsdCl7CnRoaXMucnVsZXMucHVzaChbZSx0XSksImJlZ2luIj09PXQudHlwZSYmdGhpcy5jb3VudCsrfWV4ZWMoZSl7CmNvbnN0IHQ9dGhpcy5nZXRNYXRjaGVyKHRoaXMucmVnZXhJbmRleCk7dC5sYXN0SW5kZXg9dGhpcy5sYXN0SW5kZXgKO2xldCBuPXQuZXhlYyhlKQo7aWYodGhpcy5yZXN1bWluZ1NjYW5BdFNhbWVQb3NpdGlvbigpKWlmKG4mJm4uaW5kZXg9PT10aGlzLmxhc3RJbmRleCk7ZWxzZXsKY29uc3QgdD10aGlzLmdldE1hdGNoZXIoMCk7dC5sYXN0SW5kZXg9dGhpcy5sYXN0SW5kZXgrMSxuPXQuZXhlYyhlKX0KcmV0dXJuIG4mJih0aGlzLnJlZ2V4SW5kZXgrPW4ucG9zaXRpb24rMSwKdGhpcy5yZWdleEluZGV4PT09dGhpcy5jb3VudCYmdGhpcy5jb25zaWRlckFsbCgpKSxufX0KaWYoZS5jb21waWxlckV4dGVuc2lvbnN8fChlLmNvbXBpbGVyRXh0ZW5zaW9ucz1bXSksCmUuY29udGFpbnMmJmUuY29udGFpbnMuaW5jbHVkZXMoInNlbGYiKSl0aHJvdyBFcnJvcigiRVJSOiBjb250YWlucyBgc2VsZmAgaXMgbm90IHN1cHBvcnRlZCBhdCB0aGUgdG9wLWxldmVsIG9mIGEgbGFuZ3VhZ2UuICBTZWUgZG9jdW1lbnRhdGlvbi4iKQo7cmV0dXJuIGUuY2xhc3NOYW1lQWxpYXNlcz1pKGUuY2xhc3NOYW1lQWxpYXNlc3x8e30pLGZ1bmN0aW9uIG4obyxyKXtjb25zdCBhPW8KO2lmKG8uaXNDb21waWxlZClyZXR1cm4gYQo7W0ksQixaLERdLmZvckVhY2goKGU9PmUobyxyKSkpLGUuY29tcGlsZXJFeHRlbnNpb25zLmZvckVhY2goKGU9PmUobyxyKSkpLApvLl9fYmVmb3JlQmVnaW49bnVsbCxbVCxMLFBdLmZvckVhY2goKGU9PmUobyxyKSkpLG8uaXNDb21waWxlZD0hMDtsZXQgYz1udWxsCjtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIG8ua2V5d29yZHMmJm8ua2V5d29yZHMuJHBhdHRlcm4mJihvLmtleXdvcmRzPU9iamVjdC5hc3NpZ24oe30sby5rZXl3b3JkcyksCmM9by5rZXl3b3Jkcy4kcGF0dGVybiwKZGVsZXRlIG8ua2V5d29yZHMuJHBhdHRlcm4pLGM9Y3x8L1x3Ky8sby5rZXl3b3JkcyYmKG8ua2V5d29yZHM9JChvLmtleXdvcmRzLGUuY2FzZV9pbnNlbnNpdGl2ZSkpLAphLmtleXdvcmRQYXR0ZXJuUmU9dChjLCEwKSwKciYmKG8uYmVnaW58fChvLmJlZ2luPS9cQnxcYi8pLGEuYmVnaW5SZT10KGEuYmVnaW4pLG8uZW5kfHxvLmVuZHNXaXRoUGFyZW50fHwoby5lbmQ9L1xCfFxiLyksCm8uZW5kJiYoYS5lbmRSZT10KGEuZW5kKSksCmEudGVybWluYXRvckVuZD1sKGEuZW5kKXx8IiIsby5lbmRzV2l0aFBhcmVudCYmci50ZXJtaW5hdG9yRW5kJiYoYS50ZXJtaW5hdG9yRW5kKz0oby5lbmQ/InwiOiIiKStyLnRlcm1pbmF0b3JFbmQpKSwKby5pbGxlZ2FsJiYoYS5pbGxlZ2FsUmU9dChvLmlsbGVnYWwpKSwKby5jb250YWluc3x8KG8uY29udGFpbnM9W10pLG8uY29udGFpbnM9W10uY29uY2F0KC4uLm8uY29udGFpbnMubWFwKChlPT4oZT0+KGUudmFyaWFudHMmJiFlLmNhY2hlZFZhcmlhbnRzJiYoZS5jYWNoZWRWYXJpYW50cz1lLnZhcmlhbnRzLm1hcCgodD0+aShlLHsKdmFyaWFudHM6bnVsbH0sdCkpKSksZS5jYWNoZWRWYXJpYW50cz9lLmNhY2hlZFZhcmlhbnRzOnEoZSk/aShlLHsKc3RhcnRzOmUuc3RhcnRzP2koZS5zdGFydHMpOm51bGwKfSk6T2JqZWN0LmlzRnJvemVuKGUpP2koZSk6ZSkpKCJzZWxmIj09PWU/bzplKSkpKSxvLmNvbnRhaW5zLmZvckVhY2goKGU9PntuKGUsYSkKfSkpLG8uc3RhcnRzJiZuKG8uc3RhcnRzLHIpLGEubWF0Y2hlcj0oZT0+e2NvbnN0IHQ9bmV3IHMKO3JldHVybiBlLmNvbnRhaW5zLmZvckVhY2goKGU9PnQuYWRkUnVsZShlLmJlZ2luLHtydWxlOmUsdHlwZToiYmVnaW4iCn0pKSksZS50ZXJtaW5hdG9yRW5kJiZ0LmFkZFJ1bGUoZS50ZXJtaW5hdG9yRW5kLHt0eXBlOiJlbmQiCn0pLGUuaWxsZWdhbCYmdC5hZGRSdWxlKGUuaWxsZWdhbCx7dHlwZToiaWxsZWdhbCJ9KSx0fSkoYSksYX0oZSl9ZnVuY3Rpb24gcShlKXsKcmV0dXJuISFlJiYoZS5lbmRzV2l0aFBhcmVudHx8cShlLnN0YXJ0cykpfWNsYXNzIEogZXh0ZW5kcyBFcnJvcnsKY29uc3RydWN0b3IoZSx0KXtzdXBlcihlKSx0aGlzLm5hbWU9IkhUTUxJbmplY3Rpb25FcnJvciIsdGhpcy5odG1sPXR9fQpjb25zdCBZPW4sUT1pLGVlPVN5bWJvbCgibm9tYXRjaCIpLHRlPW49PnsKY29uc3QgaT1PYmplY3QuY3JlYXRlKG51bGwpLHM9T2JqZWN0LmNyZWF0ZShudWxsKSxvPVtdO2xldCByPSEwCjtjb25zdCBhPSJDb3VsZCBub3QgZmluZCB0aGUgbGFuZ3VhZ2UgJ3t9JywgZGlkIHlvdSBmb3JnZXQgdG8gbG9hZC9pbmNsdWRlIGEgbGFuZ3VhZ2UgbW9kdWxlPyIsbD17CmRpc2FibGVBdXRvZGV0ZWN0OiEwLG5hbWU6IlBsYWluIHRleHQiLGNvbnRhaW5zOltdfTtsZXQgcD17Cmlnbm9yZVVuZXNjYXBlZEhUTUw6ITEsdGhyb3dVbmVzY2FwZWRIVE1MOiExLG5vSGlnaGxpZ2h0UmU6L14obm8tP2hpZ2hsaWdodCkkL2ksCmxhbmd1YWdlRGV0ZWN0UmU6L1xibGFuZyg/OnVhZ2UpPy0oW1x3LV0rKVxiL2ksY2xhc3NQcmVmaXg6ImhsanMtIiwKY3NzU2VsZWN0b3I6InByZSBjb2RlIixsYW5ndWFnZXM6bnVsbCxfX2VtaXR0ZXI6Y307ZnVuY3Rpb24gYihlKXsKcmV0dXJuIHAubm9IaWdobGlnaHRSZS50ZXN0KGUpfWZ1bmN0aW9uIG0oZSx0LG4pe2xldCBpPSIiLHM9IiIKOyJvYmplY3QiPT10eXBlb2YgdD8oaT1lLApuPXQuaWdub3JlSWxsZWdhbHMscz10Lmxhbmd1YWdlKTooRygiMTAuNy4wIiwiaGlnaGxpZ2h0KGxhbmcsIGNvZGUsIC4uLmFyZ3MpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIiksCkcoIjEwLjcuMCIsIlBsZWFzZSB1c2UgaGlnaGxpZ2h0KGNvZGUsIG9wdGlvbnMpIGluc3RlYWQuXG5odHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8yMjc3IiksCnM9ZSxpPXQpLHZvaWQgMD09PW4mJihuPSEwKTtjb25zdCBvPXtjb2RlOmksbGFuZ3VhZ2U6c307TigiYmVmb3JlOmhpZ2hsaWdodCIsbykKO2NvbnN0IHI9by5yZXN1bHQ/by5yZXN1bHQ6RShvLmxhbmd1YWdlLG8uY29kZSxuKQo7cmV0dXJuIHIuY29kZT1vLmNvZGUsTigiYWZ0ZXI6aGlnaGxpZ2h0IixyKSxyfWZ1bmN0aW9uIEUoZSxuLHMsbyl7CmNvbnN0IGM9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBsKCl7aWYoIU4ua2V5d29yZHMpcmV0dXJuIHZvaWQgTS5hZGRUZXh0KFIpCjtsZXQgZT0wO04ua2V5d29yZFBhdHRlcm5SZS5sYXN0SW5kZXg9MDtsZXQgdD1OLmtleXdvcmRQYXR0ZXJuUmUuZXhlYyhSKSxuPSIiCjtmb3IoO3Q7KXtuKz1SLnN1YnN0cmluZyhlLHQuaW5kZXgpCjtjb25zdCBzPV8uY2FzZV9pbnNlbnNpdGl2ZT90WzBdLnRvTG93ZXJDYXNlKCk6dFswXSxvPShpPXMsTi5rZXl3b3Jkc1tpXSk7aWYobyl7CmNvbnN0W2UsaV09bwo7aWYoTS5hZGRUZXh0KG4pLG49IiIsY1tzXT0oY1tzXXx8MCkrMSxjW3NdPD03JiYoais9aSksZS5zdGFydHNXaXRoKCJfIikpbis9dFswXTtlbHNlewpjb25zdCBuPV8uY2xhc3NOYW1lQWxpYXNlc1tlXXx8ZTt1KHRbMF0sbil9fWVsc2Ugbis9dFswXQo7ZT1OLmtleXdvcmRQYXR0ZXJuUmUubGFzdEluZGV4LHQ9Ti5rZXl3b3JkUGF0dGVyblJlLmV4ZWMoUil9dmFyIGkKO24rPVIuc3Vic3RyaW5nKGUpLE0uYWRkVGV4dChuKX1mdW5jdGlvbiBnKCl7bnVsbCE9Ti5zdWJMYW5ndWFnZT8oKCk9PnsKaWYoIiI9PT1SKXJldHVybjtsZXQgZT1udWxsO2lmKCJzdHJpbmciPT10eXBlb2YgTi5zdWJMYW5ndWFnZSl7CmlmKCFpW04uc3ViTGFuZ3VhZ2VdKXJldHVybiB2b2lkIE0uYWRkVGV4dChSKQo7ZT1FKE4uc3ViTGFuZ3VhZ2UsUiwhMCxTW04uc3ViTGFuZ3VhZ2VdKSxTW04uc3ViTGFuZ3VhZ2VdPWUuX3RvcAp9ZWxzZSBlPXgoUixOLnN1Ykxhbmd1YWdlLmxlbmd0aD9OLnN1Ykxhbmd1YWdlOm51bGwpCjtOLnJlbGV2YW5jZT4wJiYoais9ZS5yZWxldmFuY2UpLE0uX19hZGRTdWJsYW5ndWFnZShlLl9lbWl0dGVyLGUubGFuZ3VhZ2UpCn0pKCk6bCgpLFI9IiJ9ZnVuY3Rpb24gdShlLHQpewoiIiE9PWUmJihNLnN0YXJ0U2NvcGUodCksTS5hZGRUZXh0KGUpLE0uZW5kU2NvcGUoKSl9ZnVuY3Rpb24gZChlLHQpe2xldCBuPTEKO2NvbnN0IGk9dC5sZW5ndGgtMTtmb3IoO248PWk7KXtpZighZS5fZW1pdFtuXSl7bisrO2NvbnRpbnVlfQpjb25zdCBpPV8uY2xhc3NOYW1lQWxpYXNlc1tlW25dXXx8ZVtuXSxzPXRbbl07aT91KHMsaSk6KFI9cyxsKCksUj0iIiksbisrfX0KZnVuY3Rpb24gaChlLHQpewpyZXR1cm4gZS5zY29wZSYmInN0cmluZyI9PXR5cGVvZiBlLnNjb3BlJiZNLm9wZW5Ob2RlKF8uY2xhc3NOYW1lQWxpYXNlc1tlLnNjb3BlXXx8ZS5zY29wZSksCmUuYmVnaW5TY29wZSYmKGUuYmVnaW5TY29wZS5fd3JhcD8odShSLF8uY2xhc3NOYW1lQWxpYXNlc1tlLmJlZ2luU2NvcGUuX3dyYXBdfHxlLmJlZ2luU2NvcGUuX3dyYXApLApSPSIiKTplLmJlZ2luU2NvcGUuX211bHRpJiYoZChlLmJlZ2luU2NvcGUsdCksUj0iIikpLE49T2JqZWN0LmNyZWF0ZShlLHtwYXJlbnQ6ewp2YWx1ZTpOfX0pLE59ZnVuY3Rpb24gZihlLG4saSl7bGV0IHM9KChlLHQpPT57Y29uc3Qgbj1lJiZlLmV4ZWModCkKO3JldHVybiBuJiYwPT09bi5pbmRleH0pKGUuZW5kUmUsaSk7aWYocyl7aWYoZVsib246ZW5kIl0pe2NvbnN0IGk9bmV3IHQoZSkKO2VbIm9uOmVuZCJdKG4saSksaS5pc01hdGNoSWdub3JlZCYmKHM9ITEpfWlmKHMpewpmb3IoO2UuZW5kc1BhcmVudCYmZS5wYXJlbnQ7KWU9ZS5wYXJlbnQ7cmV0dXJuIGV9fQppZihlLmVuZHNXaXRoUGFyZW50KXJldHVybiBmKGUucGFyZW50LG4saSl9ZnVuY3Rpb24gYihlKXsKcmV0dXJuIDA9PT1OLm1hdGNoZXIucmVnZXhJbmRleD8oUis9ZVswXSwxKTooVD0hMCwwKX1mdW5jdGlvbiBtKGUpewpjb25zdCB0PWVbMF0saT1uLnN1YnN0cmluZyhlLmluZGV4KSxzPWYoTixlLGkpO2lmKCFzKXJldHVybiBlZTtjb25zdCBvPU4KO04uZW5kU2NvcGUmJk4uZW5kU2NvcGUuX3dyYXA/KGcoKSwKdSh0LE4uZW5kU2NvcGUuX3dyYXApKTpOLmVuZFNjb3BlJiZOLmVuZFNjb3BlLl9tdWx0aT8oZygpLApkKE4uZW5kU2NvcGUsZSkpOm8uc2tpcD9SKz10OihvLnJldHVybkVuZHx8by5leGNsdWRlRW5kfHwoUis9dCksCmcoKSxvLmV4Y2x1ZGVFbmQmJihSPXQpKTtkb3sKTi5zY29wZSYmTS5jbG9zZU5vZGUoKSxOLnNraXB8fE4uc3ViTGFuZ3VhZ2V8fChqKz1OLnJlbGV2YW5jZSksTj1OLnBhcmVudAp9d2hpbGUoTiE9PXMucGFyZW50KTtyZXR1cm4gcy5zdGFydHMmJmgocy5zdGFydHMsZSksby5yZXR1cm5FbmQ/MDp0Lmxlbmd0aH0KbGV0IHc9e307ZnVuY3Rpb24geShpLG8pe2NvbnN0IGE9byYmb1swXTtpZihSKz1pLG51bGw9PWEpcmV0dXJuIGcoKSwwCjtpZigiYmVnaW4iPT09dy50eXBlJiYiZW5kIj09PW8udHlwZSYmdy5pbmRleD09PW8uaW5kZXgmJiIiPT09YSl7CmlmKFIrPW4uc2xpY2Uoby5pbmRleCxvLmluZGV4KzEpLCFyKXtjb25zdCB0PUVycm9yKGAwIHdpZHRoIG1hdGNoIHJlZ2V4ICgke2V9KWApCjt0aHJvdyB0Lmxhbmd1YWdlTmFtZT1lLHQuYmFkUnVsZT13LnJ1bGUsdH1yZXR1cm4gMX0KaWYodz1vLCJiZWdpbiI9PT1vLnR5cGUpcmV0dXJuKGU9PnsKY29uc3Qgbj1lWzBdLGk9ZS5ydWxlLHM9bmV3IHQoaSksbz1baS5fX2JlZm9yZUJlZ2luLGlbIm9uOmJlZ2luIl1dCjtmb3IoY29uc3QgdCBvZiBvKWlmKHQmJih0KGUscykscy5pc01hdGNoSWdub3JlZCkpcmV0dXJuIGIobikKO3JldHVybiBpLnNraXA/Uis9bjooaS5leGNsdWRlQmVnaW4mJihSKz1uKSwKZygpLGkucmV0dXJuQmVnaW58fGkuZXhjbHVkZUJlZ2lufHwoUj1uKSksaChpLGUpLGkucmV0dXJuQmVnaW4/MDpuLmxlbmd0aH0pKG8pCjtpZigiaWxsZWdhbCI9PT1vLnR5cGUmJiFzKXsKY29uc3QgZT1FcnJvcignSWxsZWdhbCBsZXhlbWUgIicrYSsnIiBmb3IgbW9kZSAiJysoTi5zY29wZXx8Ijx1bm5hbWVkPiIpKyciJykKO3Rocm93IGUubW9kZT1OLGV9aWYoImVuZCI9PT1vLnR5cGUpe2NvbnN0IGU9bShvKTtpZihlIT09ZWUpcmV0dXJuIGV9CmlmKCJpbGxlZ2FsIj09PW8udHlwZSYmIiI9PT1hKXJldHVybiAxCjtpZihJPjFlNSYmST4zKm8uaW5kZXgpdGhyb3cgRXJyb3IoInBvdGVudGlhbCBpbmZpbml0ZSBsb29wLCB3YXkgbW9yZSBpdGVyYXRpb25zIHRoYW4gbWF0Y2hlcyIpCjtyZXR1cm4gUis9YSxhLmxlbmd0aH1jb25zdCBfPU8oZSkKO2lmKCFfKXRocm93IFcoYS5yZXBsYWNlKCJ7fSIsZSkpLEVycm9yKCdVbmtub3duIGxhbmd1YWdlOiAiJytlKyciJykKO2NvbnN0IHY9VihfKTtsZXQgaz0iIixOPW98fHY7Y29uc3QgUz17fSxNPW5ldyBwLl9fZW1pdHRlcihwKTsoKCk9Pntjb25zdCBlPVtdCjtmb3IobGV0IHQ9Tjt0IT09Xzt0PXQucGFyZW50KXQuc2NvcGUmJmUudW5zaGlmdCh0LnNjb3BlKQo7ZS5mb3JFYWNoKChlPT5NLm9wZW5Ob2RlKGUpKSl9KSgpO2xldCBSPSIiLGo9MCxBPTAsST0wLFQ9ITE7dHJ5ewppZihfLl9fZW1pdFRva2VucylfLl9fZW1pdFRva2VucyhuLE0pO2Vsc2V7Zm9yKE4ubWF0Y2hlci5jb25zaWRlckFsbCgpOzspewpJKyssVD9UPSExOk4ubWF0Y2hlci5jb25zaWRlckFsbCgpLE4ubWF0Y2hlci5sYXN0SW5kZXg9QQo7Y29uc3QgZT1OLm1hdGNoZXIuZXhlYyhuKTtpZighZSlicmVhaztjb25zdCB0PXkobi5zdWJzdHJpbmcoQSxlLmluZGV4KSxlKQo7QT1lLmluZGV4K3R9eShuLnN1YnN0cmluZyhBKSl9cmV0dXJuIE0uZmluYWxpemUoKSxrPU0udG9IVE1MKCkse2xhbmd1YWdlOmUsCnZhbHVlOmsscmVsZXZhbmNlOmosaWxsZWdhbDohMSxfZW1pdHRlcjpNLF90b3A6Tn19Y2F0Y2godCl7CmlmKHQubWVzc2FnZSYmdC5tZXNzYWdlLmluY2x1ZGVzKCJJbGxlZ2FsIikpcmV0dXJue2xhbmd1YWdlOmUsdmFsdWU6WShuKSwKaWxsZWdhbDohMCxyZWxldmFuY2U6MCxfaWxsZWdhbEJ5OnttZXNzYWdlOnQubWVzc2FnZSxpbmRleDpBLApjb250ZXh0Om4uc2xpY2UoQS0xMDAsQSsxMDApLG1vZGU6dC5tb2RlLHJlc3VsdFNvRmFyOmt9LF9lbWl0dGVyOk19O2lmKHIpcmV0dXJuewpsYW5ndWFnZTplLHZhbHVlOlkobiksaWxsZWdhbDohMSxyZWxldmFuY2U6MCxlcnJvclJhaXNlZDp0LF9lbWl0dGVyOk0sX3RvcDpOfQo7dGhyb3cgdH19ZnVuY3Rpb24geChlLHQpe3Q9dHx8cC5sYW5ndWFnZXN8fE9iamVjdC5rZXlzKGkpO2NvbnN0IG49KGU9PnsKY29uc3QgdD17dmFsdWU6WShlKSxpbGxlZ2FsOiExLHJlbGV2YW5jZTowLF90b3A6bCxfZW1pdHRlcjpuZXcgcC5fX2VtaXR0ZXIocCl9CjtyZXR1cm4gdC5fZW1pdHRlci5hZGRUZXh0KGUpLHR9KShlKSxzPXQuZmlsdGVyKE8pLmZpbHRlcihrKS5tYXAoKHQ9PkUodCxlLCExKSkpCjtzLnVuc2hpZnQobik7Y29uc3Qgbz1zLnNvcnQoKChlLHQpPT57CmlmKGUucmVsZXZhbmNlIT09dC5yZWxldmFuY2UpcmV0dXJuIHQucmVsZXZhbmNlLWUucmVsZXZhbmNlCjtpZihlLmxhbmd1YWdlJiZ0Lmxhbmd1YWdlKXtpZihPKGUubGFuZ3VhZ2UpLnN1cGVyc2V0T2Y9PT10Lmxhbmd1YWdlKXJldHVybiAxCjtpZihPKHQubGFuZ3VhZ2UpLnN1cGVyc2V0T2Y9PT1lLmxhbmd1YWdlKXJldHVybi0xfXJldHVybiAwfSkpLFtyLGFdPW8sYz1yCjtyZXR1cm4gYy5zZWNvbmRCZXN0PWEsY31mdW5jdGlvbiB3KGUpe2xldCB0PW51bGw7Y29uc3Qgbj0oZT0+ewpsZXQgdD1lLmNsYXNzTmFtZSsiICI7dCs9ZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5jbGFzc05hbWU6IiIKO2NvbnN0IG49cC5sYW5ndWFnZURldGVjdFJlLmV4ZWModCk7aWYobil7Y29uc3QgdD1PKG5bMV0pCjtyZXR1cm4gdHx8KFgoYS5yZXBsYWNlKCJ7fSIsblsxXSkpLApYKCJGYWxsaW5nIGJhY2sgdG8gbm8taGlnaGxpZ2h0IG1vZGUgZm9yIHRoaXMgYmxvY2suIixlKSksdD9uWzFdOiJuby1oaWdobGlnaHQifQpyZXR1cm4gdC5zcGxpdCgvXHMrLykuZmluZCgoZT0+YihlKXx8TyhlKSkpfSkoZSk7aWYoYihuKSlyZXR1cm4KO2lmKE4oImJlZm9yZTpoaWdobGlnaHRFbGVtZW50Iix7ZWw6ZSxsYW5ndWFnZTpuCn0pLGUuZGF0YXNldC5oaWdobGlnaHRlZClyZXR1cm4gdm9pZCBjb25zb2xlLmxvZygiRWxlbWVudCBwcmV2aW91c2x5IGhpZ2hsaWdodGVkLiBUbyBoaWdobGlnaHQgYWdhaW4sIGZpcnN0IHVuc2V0IGBkYXRhc2V0LmhpZ2hsaWdodGVkYC4iLGUpCjtpZihlLmNoaWxkcmVuLmxlbmd0aD4wJiYocC5pZ25vcmVVbmVzY2FwZWRIVE1MfHwoY29uc29sZS53YXJuKCJPbmUgb2YgeW91ciBjb2RlIGJsb2NrcyBpbmNsdWRlcyB1bmVzY2FwZWQgSFRNTC4gVGhpcyBpcyBhIHBvdGVudGlhbGx5IHNlcmlvdXMgc2VjdXJpdHkgcmlzay4iKSwKY29uc29sZS53YXJuKCJodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL3dpa2kvc2VjdXJpdHkiKSwKY29uc29sZS53YXJuKCJUaGUgZWxlbWVudCB3aXRoIHVuZXNjYXBlZCBIVE1MOiIpLApjb25zb2xlLndhcm4oZSkpLHAudGhyb3dVbmVzY2FwZWRIVE1MKSl0aHJvdyBuZXcgSigiT25lIG9mIHlvdXIgY29kZSBibG9ja3MgaW5jbHVkZXMgdW5lc2NhcGVkIEhUTUwuIixlLmlubmVySFRNTCkKO3Q9ZTtjb25zdCBpPXQudGV4dENvbnRlbnQsbz1uP20oaSx7bGFuZ3VhZ2U6bixpZ25vcmVJbGxlZ2FsczohMH0pOngoaSkKO2UuaW5uZXJIVE1MPW8udmFsdWUsZS5kYXRhc2V0LmhpZ2hsaWdodGVkPSJ5ZXMiLCgoZSx0LG4pPT57Y29uc3QgaT10JiZzW3RdfHxuCjtlLmNsYXNzTGlzdC5hZGQoImhsanMiKSxlLmNsYXNzTGlzdC5hZGQoImxhbmd1YWdlLSIraSkKfSkoZSxuLG8ubGFuZ3VhZ2UpLGUucmVzdWx0PXtsYW5ndWFnZTpvLmxhbmd1YWdlLHJlOm8ucmVsZXZhbmNlLApyZWxldmFuY2U6by5yZWxldmFuY2V9LG8uc2Vjb25kQmVzdCYmKGUuc2Vjb25kQmVzdD17Cmxhbmd1YWdlOm8uc2Vjb25kQmVzdC5sYW5ndWFnZSxyZWxldmFuY2U6by5zZWNvbmRCZXN0LnJlbGV2YW5jZQp9KSxOKCJhZnRlcjpoaWdobGlnaHRFbGVtZW50Iix7ZWw6ZSxyZXN1bHQ6byx0ZXh0Oml9KX1sZXQgeT0hMTtmdW5jdGlvbiBfKCl7CiJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwLmNzc1NlbGVjdG9yKS5mb3JFYWNoKHcpOnk9ITAKfWZ1bmN0aW9uIE8oZSl7cmV0dXJuIGU9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLGlbZV18fGlbc1tlXV19CmZ1bmN0aW9uIHYoZSx7bGFuZ3VhZ2VOYW1lOnR9KXsic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSksZS5mb3JFYWNoKChlPT57CnNbZS50b0xvd2VyQ2FzZSgpXT10fSkpfWZ1bmN0aW9uIGsoZSl7Y29uc3QgdD1PKGUpCjtyZXR1cm4gdCYmIXQuZGlzYWJsZUF1dG9kZXRlY3R9ZnVuY3Rpb24gTihlLHQpe2NvbnN0IG49ZTtvLmZvckVhY2goKGU9PnsKZVtuXSYmZVtuXSh0KX0pKX0KInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyJiZ3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsKCgpPT57CnkmJl8oKX0pLCExKSxPYmplY3QuYXNzaWduKG4se2hpZ2hsaWdodDptLGhpZ2hsaWdodEF1dG86eCxoaWdobGlnaHRBbGw6XywKaGlnaGxpZ2h0RWxlbWVudDp3LApoaWdobGlnaHRCbG9jazplPT4oRygiMTAuNy4wIiwiaGlnaGxpZ2h0QmxvY2sgd2lsbCBiZSByZW1vdmVkIGVudGlyZWx5IGluIHYxMi4wIiksCkcoIjEwLjcuMCIsIlBsZWFzZSB1c2UgaGlnaGxpZ2h0RWxlbWVudCBub3cuIiksdyhlKSksY29uZmlndXJlOmU9PntwPVEocCxlKX0sCmluaXRIaWdobGlnaHRpbmc6KCk9PnsKXygpLEcoIjEwLjYuMCIsImluaXRIaWdobGlnaHRpbmcoKSBkZXByZWNhdGVkLiAgVXNlIGhpZ2hsaWdodEFsbCgpIG5vdy4iKX0sCmluaXRIaWdobGlnaHRpbmdPbkxvYWQ6KCk9PnsKXygpLEcoIjEwLjYuMCIsImluaXRIaWdobGlnaHRpbmdPbkxvYWQoKSBkZXByZWNhdGVkLiAgVXNlIGhpZ2hsaWdodEFsbCgpIG5vdy4iKQp9LHJlZ2lzdGVyTGFuZ3VhZ2U6KGUsdCk9PntsZXQgcz1udWxsO3RyeXtzPXQobil9Y2F0Y2godCl7CmlmKFcoIkxhbmd1YWdlIGRlZmluaXRpb24gZm9yICd7fScgY291bGQgbm90IGJlIHJlZ2lzdGVyZWQuIi5yZXBsYWNlKCJ7fSIsZSkpLAohcil0aHJvdyB0O1codCkscz1sfQpzLm5hbWV8fChzLm5hbWU9ZSksaVtlXT1zLHMucmF3RGVmaW5pdGlvbj10LmJpbmQobnVsbCxuKSxzLmFsaWFzZXMmJnYocy5hbGlhc2VzLHsKbGFuZ3VhZ2VOYW1lOmV9KX0sdW5yZWdpc3Rlckxhbmd1YWdlOmU9PntkZWxldGUgaVtlXQo7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMocykpc1t0XT09PWUmJmRlbGV0ZSBzW3RdfSwKbGlzdExhbmd1YWdlczooKT0+T2JqZWN0LmtleXMoaSksZ2V0TGFuZ3VhZ2U6TyxyZWdpc3RlckFsaWFzZXM6diwKYXV0b0RldGVjdGlvbjprLGluaGVyaXQ6USxhZGRQbHVnaW46ZT0+eyhlPT57CmVbImJlZm9yZTpoaWdobGlnaHRCbG9jayJdJiYhZVsiYmVmb3JlOmhpZ2hsaWdodEVsZW1lbnQiXSYmKGVbImJlZm9yZTpoaWdobGlnaHRFbGVtZW50Il09dD0+ewplWyJiZWZvcmU6aGlnaGxpZ2h0QmxvY2siXShPYmplY3QuYXNzaWduKHtibG9jazp0LmVsfSx0KSkKfSksZVsiYWZ0ZXI6aGlnaGxpZ2h0QmxvY2siXSYmIWVbImFmdGVyOmhpZ2hsaWdodEVsZW1lbnQiXSYmKGVbImFmdGVyOmhpZ2hsaWdodEVsZW1lbnQiXT10PT57CmVbImFmdGVyOmhpZ2hsaWdodEJsb2NrIl0oT2JqZWN0LmFzc2lnbih7YmxvY2s6dC5lbH0sdCkpfSl9KShlKSxvLnB1c2goZSl9LApyZW1vdmVQbHVnaW46ZT0+e2NvbnN0IHQ9by5pbmRleE9mKGUpOy0xIT09dCYmby5zcGxpY2UodCwxKX19KSxuLmRlYnVnTW9kZT0oKT0+ewpyPSExfSxuLnNhZmVNb2RlPSgpPT57cj0hMH0sbi52ZXJzaW9uU3RyaW5nPSIxMS45LjAiLG4ucmVnZXg9e2NvbmNhdDpoLApsb29rYWhlYWQ6ZyxlaXRoZXI6ZixvcHRpb25hbDpkLGFueU51bWJlck9mVGltZXM6dX0KO2Zvcihjb25zdCB0IGluIGopIm9iamVjdCI9PXR5cGVvZiBqW3RdJiZlKGpbdF0pO3JldHVybiBPYmplY3QuYXNzaWduKG4saiksbgp9LG5lPXRlKHt9KTtyZXR1cm4gbmUubmV3SW5zdGFuY2U9KCk9PnRlKHt9KSxuZX0oKQo7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmKG1vZHVsZS5leHBvcnRzPWhsanMpOy8qISBgY3BwYCBncmFtbWFyIGNvbXBpbGVkIGZvciBIaWdobGlnaHQuanMgMTEuOS4wICovCigoKT0+e3ZhciBlPSgoKT0+eyJ1c2Ugc3RyaWN0IjtyZXR1cm4gZT0+e2NvbnN0IHQ9ZS5yZWdleCxhPWUuQ09NTUVOVCgiLy8iLCIkIix7CmNvbnRhaW5zOlt7YmVnaW46L1xcXG4vfV0KfSksbj0iZGVjbHR5cGVcXChhdXRvXFwpIixyPSJbYS16QS1aX11cXHcqOjoiLGk9Iig/IXN0cnVjdCkoIituKyJ8Iit0Lm9wdGlvbmFsKHIpKyJbYS16QS1aX11cXHcqIit0Lm9wdGlvbmFsKCI8W148Pl0rPiIpKyIpIixzPXsKY2xhc3NOYW1lOiJ0eXBlIixiZWdpbjoiXFxiW2EtelxcZF9dKl90XFxiIn0sYz17Y2xhc3NOYW1lOiJzdHJpbmciLHZhcmlhbnRzOlt7CmJlZ2luOicodTg/fFV8TCk/IicsZW5kOiciJyxpbGxlZ2FsOiJcXG4iLGNvbnRhaW5zOltlLkJBQ0tTTEFTSF9FU0NBUEVdfSx7CmJlZ2luOiIodTg/fFV8TCk/JyhcXFxcKHhbMC05QS1GYS1mXXsyfXx1WzAtOUEtRmEtZl17NCw4fXxbMC03XXszfXxcXFMpfC4pIiwKZW5kOiInIixpbGxlZ2FsOiIuIn0sZS5FTkRfU0FNRV9BU19CRUdJTih7CmJlZ2luOi8oPzp1OD98VXxMKT9SIihbXigpXFwgXXswLDE2fSlcKC8sZW5kOi9cKShbXigpXFwgXXswLDE2fSkiL30pXX0sbz17CmNsYXNzTmFtZToibnVtYmVyIix2YXJpYW50czpbewpiZWdpbjoiWystXT8oPzooPzpbMC05XSg/Oic/WzAtOV0pKlxcLig/OlswLTldKD86Jz9bMC05XSkqKT98XFwuWzAtOV0oPzonP1swLTldKSopKD86W0VlXVsrLV0/WzAtOV0oPzonP1swLTldKSopP3xbMC05XSg/Oic/WzAtOV0pKltFZV1bKy1dP1swLTldKD86Jz9bMC05XSkqfDBbWHhdKD86WzAtOUEtRmEtZl0oPzonP1swLTlBLUZhLWZdKSooPzpcXC4oPzpbMC05QS1GYS1mXSg/Oic/WzAtOUEtRmEtZl0pKik/KT98XFwuWzAtOUEtRmEtZl0oPzonP1swLTlBLUZhLWZdKSopW1BwXVsrLV0/WzAtOV0oPzonP1swLTldKSopKD86W0ZmXSg/OjE2fDMyfDY0fDEyOCk/fChCRnxiZikxNnxbTGxdfCkiCn0sewpiZWdpbjoiWystXT9cXGIoPzowW0JiXVswMV0oPzonP1swMV0pKnwwW1h4XVswLTlBLUZhLWZdKD86Jz9bMC05QS1GYS1mXSkqfDAoPzonP1swLTddKSp8WzEtOV0oPzonP1swLTldKSopKD86W1V1XSg/OkxMP3xsbD8pfFtVdV1bWnpdP3woPzpMTD98bGw/KVtVdV0/fFtael1bVXVdfCkiCn1dLHJlbGV2YW5jZTowfSxsPXtjbGFzc05hbWU6Im1ldGEiLGJlZ2luOi8jXHMqW2Etel0rXGIvLGVuZDovJC8sa2V5d29yZHM6ewprZXl3b3JkOiJpZiBlbHNlIGVsaWYgZW5kaWYgZGVmaW5lIHVuZGVmIHdhcm5pbmcgZXJyb3IgbGluZSBwcmFnbWEgX1ByYWdtYSBpZmRlZiBpZm5kZWYgaW5jbHVkZSIKfSxjb250YWluczpbe2JlZ2luOi9cXFxuLyxyZWxldmFuY2U6MH0sZS5pbmhlcml0KGMse2NsYXNzTmFtZToic3RyaW5nIn0pLHsKY2xhc3NOYW1lOiJzdHJpbmciLGJlZ2luOi88Lio/Pi99LGEsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERV19LHU9ewpjbGFzc05hbWU6InRpdGxlIixiZWdpbjp0Lm9wdGlvbmFsKHIpK2UuSURFTlRfUkUscmVsZXZhbmNlOjAKfSxkPXQub3B0aW9uYWwocikrZS5JREVOVF9SRSsiXFxzKlxcKCIscD17CnR5cGU6WyJib29sIiwiY2hhciIsImNoYXIxNl90IiwiY2hhcjMyX3QiLCJjaGFyOF90IiwiZG91YmxlIiwiZmxvYXQiLCJpbnQiLCJsb25nIiwic2hvcnQiLCJ2b2lkIiwid2NoYXJfdCIsInVuc2lnbmVkIiwic2lnbmVkIiwiY29uc3QiLCJzdGF0aWMiXSwKa2V5d29yZDpbImFsaWduYXMiLCJhbGlnbm9mIiwiYW5kIiwiYW5kX2VxIiwiYXNtIiwiYXRvbWljX2NhbmNlbCIsImF0b21pY19jb21taXQiLCJhdG9taWNfbm9leGNlcHQiLCJhdXRvIiwiYml0YW5kIiwiYml0b3IiLCJicmVhayIsImNhc2UiLCJjYXRjaCIsImNsYXNzIiwiY29fYXdhaXQiLCJjb19yZXR1cm4iLCJjb195aWVsZCIsImNvbXBsIiwiY29uY2VwdCIsImNvbnN0X2Nhc3R8MTAiLCJjb25zdGV2YWwiLCJjb25zdGV4cHIiLCJjb25zdGluaXQiLCJjb250aW51ZSIsImRlY2x0eXBlIiwiZGVmYXVsdCIsImRlbGV0ZSIsImRvIiwiZHluYW1pY19jYXN0fDEwIiwiZWxzZSIsImVudW0iLCJleHBsaWNpdCIsImV4cG9ydCIsImV4dGVybiIsImZhbHNlIiwiZmluYWwiLCJmb3IiLCJmcmllbmQiLCJnb3RvIiwiaWYiLCJpbXBvcnQiLCJpbmxpbmUiLCJtb2R1bGUiLCJtdXRhYmxlIiwibmFtZXNwYWNlIiwibmV3Iiwibm9leGNlcHQiLCJub3QiLCJub3RfZXEiLCJudWxscHRyIiwib3BlcmF0b3IiLCJvciIsIm9yX2VxIiwib3ZlcnJpZGUiLCJwcml2YXRlIiwicHJvdGVjdGVkIiwicHVibGljIiwicmVmbGV4cHIiLCJyZWdpc3RlciIsInJlaW50ZXJwcmV0X2Nhc3R8MTAiLCJyZXF1aXJlcyIsInJldHVybiIsInNpemVvZiIsInN0YXRpY19hc3NlcnQiLCJzdGF0aWNfY2FzdHwxMCIsInN0cnVjdCIsInN3aXRjaCIsInN5bmNocm9uaXplZCIsInRlbXBsYXRlIiwidGhpcyIsInRocmVhZF9sb2NhbCIsInRocm93IiwidHJhbnNhY3Rpb25fc2FmZSIsInRyYW5zYWN0aW9uX3NhZmVfZHluYW1pYyIsInRydWUiLCJ0cnkiLCJ0eXBlZGVmIiwidHlwZWlkIiwidHlwZW5hbWUiLCJ1bmlvbiIsInVzaW5nIiwidmlydHVhbCIsInZvbGF0aWxlIiwid2hpbGUiLCJ4b3IiLCJ4b3JfZXEiXSwKbGl0ZXJhbDpbIk5VTEwiLCJmYWxzZSIsIm51bGxvcHQiLCJudWxscHRyIiwidHJ1ZSJdLGJ1aWx0X2luOlsiX1ByYWdtYSJdLApfdHlwZV9oaW50czpbImFueSIsImF1dG9fcHRyIiwiYmFycmllciIsImJpbmFyeV9zZW1hcGhvcmUiLCJiaXRzZXQiLCJjb21wbGV4IiwiY29uZGl0aW9uX3ZhcmlhYmxlIiwiY29uZGl0aW9uX3ZhcmlhYmxlX2FueSIsImNvdW50aW5nX3NlbWFwaG9yZSIsImRlcXVlIiwiZmFsc2VfdHlwZSIsImZ1dHVyZSIsImltYWdpbmFyeSIsImluaXRpYWxpemVyX2xpc3QiLCJpc3RyaW5nc3RyZWFtIiwianRocmVhZCIsImxhdGNoIiwibG9ja19ndWFyZCIsIm11bHRpbWFwIiwibXVsdGlzZXQiLCJtdXRleCIsIm9wdGlvbmFsIiwib3N0cmluZ3N0cmVhbSIsInBhY2thZ2VkX3Rhc2siLCJwYWlyIiwicHJvbWlzZSIsInByaW9yaXR5X3F1ZXVlIiwicXVldWUiLCJyZWN1cnNpdmVfbXV0ZXgiLCJyZWN1cnNpdmVfdGltZWRfbXV0ZXgiLCJzY29wZWRfbG9jayIsInNldCIsInNoYXJlZF9mdXR1cmUiLCJzaGFyZWRfbG9jayIsInNoYXJlZF9tdXRleCIsInNoYXJlZF90aW1lZF9tdXRleCIsInNoYXJlZF9wdHIiLCJzdGFjayIsInN0cmluZ192aWV3Iiwic3RyaW5nc3RyZWFtIiwidGltZWRfbXV0ZXgiLCJ0aHJlYWQiLCJ0cnVlX3R5cGUiLCJ0dXBsZSIsInVuaXF1ZV9sb2NrIiwidW5pcXVlX3B0ciIsInVub3JkZXJlZF9tYXAiLCJ1bm9yZGVyZWRfbXVsdGltYXAiLCJ1bm9yZGVyZWRfbXVsdGlzZXQiLCJ1bm9yZGVyZWRfc2V0IiwidmFyaWFudCIsInZlY3RvciIsIndlYWtfcHRyIiwid3N0cmluZyIsIndzdHJpbmdfdmlldyJdCn0sXz17Y2xhc3NOYW1lOiJmdW5jdGlvbi5kaXNwYXRjaCIscmVsZXZhbmNlOjAsa2V5d29yZHM6ewpfaGludDpbImFib3J0IiwiYWJzIiwiYWNvcyIsImFwcGx5IiwiYXNfY29uc3QiLCJhc2luIiwiYXRhbiIsImF0YW4yIiwiY2FsbG9jIiwiY2VpbCIsImNlcnIiLCJjaW4iLCJjbG9nIiwiY29zIiwiY29zaCIsImNvdXQiLCJkZWNsdmFsIiwiZW5kbCIsImV4Y2hhbmdlIiwiZXhpdCIsImV4cCIsImZhYnMiLCJmbG9vciIsImZtb2QiLCJmb3J3YXJkIiwiZnByaW50ZiIsImZwdXRzIiwiZnJlZSIsImZyZXhwIiwiZnNjYW5mIiwiZnV0dXJlIiwiaW52b2tlIiwiaXNhbG51bSIsImlzYWxwaGEiLCJpc2NudHJsIiwiaXNkaWdpdCIsImlzZ3JhcGgiLCJpc2xvd2VyIiwiaXNwcmludCIsImlzcHVuY3QiLCJpc3NwYWNlIiwiaXN1cHBlciIsImlzeGRpZ2l0IiwibGFicyIsImxhdW5kZXIiLCJsZGV4cCIsImxvZyIsImxvZzEwIiwibWFrZV9wYWlyIiwibWFrZV9zaGFyZWQiLCJtYWtlX3NoYXJlZF9mb3Jfb3ZlcndyaXRlIiwibWFrZV90dXBsZSIsIm1ha2VfdW5pcXVlIiwibWFsbG9jIiwibWVtY2hyIiwibWVtY21wIiwibWVtY3B5IiwibWVtc2V0IiwibW9kZiIsIm1vdmUiLCJwb3ciLCJwcmludGYiLCJwdXRjaGFyIiwicHV0cyIsInJlYWxsb2MiLCJzY2FuZiIsInNpbiIsInNpbmgiLCJzbnByaW50ZiIsInNwcmludGYiLCJzcXJ0Iiwic3NjYW5mIiwic3RkIiwic3RkZXJyIiwic3RkaW4iLCJzdGRvdXQiLCJzdHJjYXQiLCJzdHJjaHIiLCJzdHJjbXAiLCJzdHJjcHkiLCJzdHJjc3BuIiwic3RybGVuIiwic3RybmNhdCIsInN0cm5jbXAiLCJzdHJuY3B5Iiwic3RycGJyayIsInN0cnJjaHIiLCJzdHJzcG4iLCJzdHJzdHIiLCJzd2FwIiwidGFuIiwidGFuaCIsInRlcm1pbmF0ZSIsInRvX3VuZGVybHlpbmciLCJ0b2xvd2VyIiwidG91cHBlciIsInZmcHJpbnRmIiwidmlzaXQiLCJ2cHJpbnRmIiwidnNwcmludGYiXQp9LApiZWdpbjp0LmNvbmNhdCgvXGIvLC8oPyFkZWNsdHlwZSkvLC8oPyFpZikvLC8oPyFmb3IpLywvKD8hc3dpdGNoKS8sLyg/IXdoaWxlKS8sZS5JREVOVF9SRSx0Lmxvb2thaGVhZCgvKDxbXjw+XSs+fClccypcKC8pKQp9LG09W18sbCxzLGEsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERSxvLGNdLGY9e3ZhcmlhbnRzOlt7YmVnaW46Lz0vLGVuZDovOy99LHsKYmVnaW46L1woLyxlbmQ6L1wpL30se2JlZ2luS2V5d29yZHM6Im5ldyB0aHJvdyByZXR1cm4gZWxzZSIsZW5kOi87L31dLAprZXl3b3JkczpwLGNvbnRhaW5zOm0uY29uY2F0KFt7YmVnaW46L1woLyxlbmQ6L1wpLyxrZXl3b3JkczpwLApjb250YWluczptLmNvbmNhdChbInNlbGYiXSkscmVsZXZhbmNlOjB9XSkscmVsZXZhbmNlOjB9LGc9e2NsYXNzTmFtZToiZnVuY3Rpb24iLApiZWdpbjoiKCIraSsiW1xcKiZcXHNdKykrIitkLHJldHVybkJlZ2luOiEwLGVuZDovW3s7PV0vLGV4Y2x1ZGVFbmQ6ITAsCmtleXdvcmRzOnAsaWxsZWdhbDovW15cd1xzXComOjw+Ll0vLGNvbnRhaW5zOlt7YmVnaW46bixrZXl3b3JkczpwLHJlbGV2YW5jZTowfSx7CmJlZ2luOmQscmV0dXJuQmVnaW46ITAsY29udGFpbnM6W3VdLHJlbGV2YW5jZTowfSx7YmVnaW46Lzo6LyxyZWxldmFuY2U6MH0sewpiZWdpbjovOi8sZW5kc1dpdGhQYXJlbnQ6ITAsY29udGFpbnM6W2Msb119LHtyZWxldmFuY2U6MCxtYXRjaDovLC99LHsKY2xhc3NOYW1lOiJwYXJhbXMiLGJlZ2luOi9cKC8sZW5kOi9cKS8sa2V5d29yZHM6cCxyZWxldmFuY2U6MCwKY29udGFpbnM6W2EsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERSxjLG8scyx7YmVnaW46L1woLyxlbmQ6L1wpLyxrZXl3b3JkczpwLApyZWxldmFuY2U6MCxjb250YWluczpbInNlbGYiLGEsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERSxjLG8sc119XQp9LHMsYSxlLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLGxdfTtyZXR1cm57bmFtZToiQysrIiwKYWxpYXNlczpbImNjIiwiYysrIiwiaCsrIiwiaHBwIiwiaGgiLCJoeHgiLCJjeHgiXSxrZXl3b3JkczpwLGlsbGVnYWw6IjwvIiwKY2xhc3NOYW1lQWxpYXNlczp7ImZ1bmN0aW9uLmRpc3BhdGNoIjoiYnVpbHRfaW4ifSwKY29udGFpbnM6W10uY29uY2F0KGYsZyxfLG0sW2wsewpiZWdpbjoiXFxiKGRlcXVlfGxpc3R8cXVldWV8cHJpb3JpdHlfcXVldWV8cGFpcnxzdGFja3x2ZWN0b3J8bWFwfHNldHxiaXRzZXR8bXVsdGlzZXR8bXVsdGltYXB8dW5vcmRlcmVkX21hcHx1bm9yZGVyZWRfc2V0fHVub3JkZXJlZF9tdWx0aXNldHx1bm9yZGVyZWRfbXVsdGltYXB8YXJyYXl8dHVwbGV8b3B0aW9uYWx8dmFyaWFudHxmdW5jdGlvbilcXHMqPCg/ITwpIiwKZW5kOiI+IixrZXl3b3JkczpwLGNvbnRhaW5zOlsic2VsZiIsc119LHtiZWdpbjplLklERU5UX1JFKyI6OiIsa2V5d29yZHM6cH0sewptYXRjaDpbL1xiKD86ZW51bSg/OlxzKyg/OmNsYXNzfHN0cnVjdCkpP3xjbGFzc3xzdHJ1Y3R8dW5pb24pLywvXHMrLywvXHcrL10sCmNsYXNzTmFtZTp7MToia2V5d29yZCIsMzoidGl0bGUuY2xhc3MifX1dKX19fSkoKTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoImNwcCIsZSkKfSkoKTs="></script>
<script src="data:text/javascript;base64,dmFyIG1lcmdlSFRNTFBsdWdpbiA9IChmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgb3JpZ2luYWxTdHJlYW07CgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZQogICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICovCiAgZnVuY3Rpb24gZXNjYXBlSFRNTCh2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlCiAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpCiAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JykKICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKQogICAgICAucmVwbGFjZSgvIi9nLCAnJnF1b3Q7JykKICAgICAgLnJlcGxhY2UoLycvZywgJyYjeDI3OycpOwogIH0KCiAgLyogcGx1Z2luIGl0c2VsZiAqLwoKICAvKiogQHR5cGUge0hMSlNQbHVnaW59ICovCiAgY29uc3QgbWVyZ2VIVE1MUGx1Z2luID0gewogICAgLy8gcHJlc2VydmUgdGhlIG9yaWdpbmFsIEhUTUwgdG9rZW4gc3RyZWFtCiAgICAiYmVmb3JlOmhpZ2hsaWdodEVsZW1lbnQiOiAoeyBlbCB9KSA9PiB7CiAgICAgIG9yaWdpbmFsU3RyZWFtID0gbm9kZVN0cmVhbShlbCk7CiAgICB9LAogICAgLy8gbWVyZ2UgaXQgYWZ0ZXJ3YXJkcyB3aXRoIHRoZSBoaWdobGlnaHRlZCB0b2tlbiBzdHJlYW0KICAgICJhZnRlcjpoaWdobGlnaHRFbGVtZW50IjogKHsgZWwsIHJlc3VsdCwgdGV4dCB9KSA9PiB7CiAgICAgIGlmICghb3JpZ2luYWxTdHJlYW0ubGVuZ3RoKSByZXR1cm47CgogICAgICBjb25zdCByZXN1bHROb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIHJlc3VsdE5vZGUuaW5uZXJIVE1MID0gcmVzdWx0LnZhbHVlOwogICAgICByZXN1bHQudmFsdWUgPSBtZXJnZVN0cmVhbXMob3JpZ2luYWxTdHJlYW0sIG5vZGVTdHJlYW0ocmVzdWx0Tm9kZSksIHRleHQpOwogICAgICBlbC5pbm5lckhUTUwgPSByZXN1bHQudmFsdWU7CiAgICB9CiAgfTsKCiAgLyogU3RyZWFtIG1lcmdpbmcgc3VwcG9ydCBmdW5jdGlvbnMgKi8KCiAgLyoqCiAgICogQHR5cGVkZWYgRXZlbnQKICAgKiBAcHJvcGVydHkgeydzdGFydCd8J3N0b3AnfSBldmVudAogICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXQKICAgKiBAcHJvcGVydHkge05vZGV9IG5vZGUKICAgKi8KCiAgLyoqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlCiAgICovCiAgZnVuY3Rpb24gdGFnKG5vZGUpIHsKICAgIHJldHVybiBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CiAgfQoKICAvKioKICAgKiBAcGFyYW0ge05vZGV9IG5vZGUKICAgKi8KICBmdW5jdGlvbiBub2RlU3RyZWFtKG5vZGUpIHsKICAgIC8qKiBAdHlwZSBFdmVudFtdICovCiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIChmdW5jdGlvbiBfbm9kZVN0cmVhbShub2RlLCBvZmZzZXQpIHsKICAgICAgZm9yIChsZXQgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7CiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAzKSB7CiAgICAgICAgICBvZmZzZXQgKz0gY2hpbGQubm9kZVZhbHVlLmxlbmd0aDsKICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKSB7CiAgICAgICAgICByZXN1bHQucHVzaCh7CiAgICAgICAgICAgIGV2ZW50OiAnc3RhcnQnLAogICAgICAgICAgICBvZmZzZXQ6IG9mZnNldCwKICAgICAgICAgICAgbm9kZTogY2hpbGQKICAgICAgICAgIH0pOwogICAgICAgICAgb2Zmc2V0ID0gX25vZGVTdHJlYW0oY2hpbGQsIG9mZnNldCk7CiAgICAgICAgICAvLyBQcmV2ZW50IHZvaWQgZWxlbWVudHMgZnJvbSBoYXZpbmcgYW4gZW5kIHRhZyB0aGF0IHdvdWxkIGFjdHVhbGx5CiAgICAgICAgICAvLyBkb3VibGUgdGhlbSBpbiB0aGUgb3V0cHV0LiBUaGVyZSBhcmUgbW9yZSB2b2lkIGVsZW1lbnRzIGluIEhUTUwKICAgICAgICAgIC8vIGJ1dCB3ZSBsaXN0IG9ubHkgdGhvc2UgcmVhbGlzdGljYWxseSBleHBlY3RlZCBpbiBjb2RlIGRpc3BsYXkuCiAgICAgICAgICBpZiAoIXRhZyhjaGlsZCkubWF0Y2goL2JyfGhyfGltZ3xpbnB1dC8pKSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogJ3N0b3AnLAogICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0LAogICAgICAgICAgICAgIG5vZGU6IGNoaWxkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb2Zmc2V0OwogICAgfSkobm9kZSwgMCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogQHBhcmFtIHthbnl9IG9yaWdpbmFsIC0gdGhlIG9yaWdpbmFsIHN0cmVhbQogICAqIEBwYXJhbSB7YW55fSBoaWdobGlnaHRlZCAtIHN0cmVhbSBvZiB0aGUgaGlnaGxpZ2h0ZWQgc291cmNlCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gdGhlIG9yaWdpbmFsIHNvdXJjZSBpdHNlbGYKICAgKi8KICBmdW5jdGlvbiBtZXJnZVN0cmVhbXMob3JpZ2luYWwsIGhpZ2hsaWdodGVkLCB2YWx1ZSkgewogICAgbGV0IHByb2Nlc3NlZCA9IDA7CiAgICBsZXQgcmVzdWx0ID0gJyc7CiAgICBjb25zdCBub2RlU3RhY2sgPSBbXTsKCiAgICBmdW5jdGlvbiBzZWxlY3RTdHJlYW0oKSB7CiAgICAgIGlmICghb3JpZ2luYWwubGVuZ3RoIHx8ICFoaWdobGlnaHRlZC5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gb3JpZ2luYWwubGVuZ3RoID8gb3JpZ2luYWwgOiBoaWdobGlnaHRlZDsKICAgICAgfQogICAgICBpZiAob3JpZ2luYWxbMF0ub2Zmc2V0ICE9PSBoaWdobGlnaHRlZFswXS5vZmZzZXQpIHsKICAgICAgICByZXR1cm4gKG9yaWdpbmFsWzBdLm9mZnNldCA8IGhpZ2hsaWdodGVkWzBdLm9mZnNldCkgPyBvcmlnaW5hbCA6IGhpZ2hsaWdodGVkOwogICAgICB9CgogICAgICAvKgogICAgICBUbyBhdm9pZCBzdGFydGluZyB0aGUgc3RyZWFtIGp1c3QgYmVmb3JlIGl0IHNob3VsZCBzdG9wIHRoZSBvcmRlciBpcwogICAgICBlbnN1cmVkIHRoYXQgb3JpZ2luYWwgYWx3YXlzIHN0YXJ0cyBmaXJzdCBhbmQgY2xvc2VzIGxhc3Q6CgogICAgICBpZiAoZXZlbnQxID09ICdzdGFydCcgJiYgZXZlbnQyID09ICdzdGFydCcpCiAgICAgICAgcmV0dXJuIG9yaWdpbmFsOwogICAgICBpZiAoZXZlbnQxID09ICdzdGFydCcgJiYgZXZlbnQyID09ICdzdG9wJykKICAgICAgICByZXR1cm4gaGlnaGxpZ2h0ZWQ7CiAgICAgIGlmIChldmVudDEgPT0gJ3N0b3AnICYmIGV2ZW50MiA9PSAnc3RhcnQnKQogICAgICAgIHJldHVybiBvcmlnaW5hbDsKICAgICAgaWYgKGV2ZW50MSA9PSAnc3RvcCcgJiYgZXZlbnQyID09ICdzdG9wJykKICAgICAgICByZXR1cm4gaGlnaGxpZ2h0ZWQ7CgogICAgICAuLi4gd2hpY2ggaXMgY29sbGFwc2VkIHRvOgogICAgICAqLwogICAgICByZXR1cm4gaGlnaGxpZ2h0ZWRbMF0uZXZlbnQgPT09ICdzdGFydCcgPyBvcmlnaW5hbCA6IGhpZ2hsaWdodGVkOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlCiAgICAgKi8KICAgIGZ1bmN0aW9uIG9wZW4obm9kZSkgewogICAgICAvKiogQHBhcmFtIHtBdHRyfSBhdHRyICovCiAgICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZVN0cmluZyhhdHRyKSB7CiAgICAgICAgcmV0dXJuICcgJyArIGF0dHIubm9kZU5hbWUgKyAnPSInICsgZXNjYXBlSFRNTChhdHRyLnZhbHVlKSArICciJzsKICAgICAgfQogICAgICAvLyBAdHMtaWdub3JlCiAgICAgIHJlc3VsdCArPSAnPCcgKyB0YWcobm9kZSkgKyBbXS5tYXAuY2FsbChub2RlLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZVN0cmluZykuam9pbignJykgKyAnPic7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUKICAgICAqLwogICAgZnVuY3Rpb24gY2xvc2Uobm9kZSkgewogICAgICByZXN1bHQgKz0gJzwvJyArIHRhZyhub2RlKSArICc+JzsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbmRlcihldmVudCkgewogICAgICAoZXZlbnQuZXZlbnQgPT09ICdzdGFydCcgPyBvcGVuIDogY2xvc2UpKGV2ZW50Lm5vZGUpOwogICAgfQoKICAgIHdoaWxlIChvcmlnaW5hbC5sZW5ndGggfHwgaGlnaGxpZ2h0ZWQubGVuZ3RoKSB7CiAgICAgIGxldCBzdHJlYW0gPSBzZWxlY3RTdHJlYW0oKTsKICAgICAgcmVzdWx0ICs9IGVzY2FwZUhUTUwodmFsdWUuc3Vic3RyaW5nKHByb2Nlc3NlZCwgc3RyZWFtWzBdLm9mZnNldCkpOwogICAgICBwcm9jZXNzZWQgPSBzdHJlYW1bMF0ub2Zmc2V0OwogICAgICBpZiAoc3RyZWFtID09PSBvcmlnaW5hbCkgewogICAgICAgIC8qCiAgICAgICAgT24gYW55IG9wZW5pbmcgb3IgY2xvc2luZyB0YWcgb2YgdGhlIG9yaWdpbmFsIG1hcmt1cCB3ZSBmaXJzdCBjbG9zZQogICAgICAgIHRoZSBlbnRpcmUgaGlnaGxpZ2h0ZWQgbm9kZSBzdGFjaywgdGhlbiByZW5kZXIgdGhlIG9yaWdpbmFsIHRhZyBhbG9uZwogICAgICAgIHdpdGggYWxsIHRoZSBmb2xsb3dpbmcgb3JpZ2luYWwgdGFncyBhdCB0aGUgc2FtZSBvZmZzZXQgYW5kIHRoZW4KICAgICAgICByZW9wZW4gYWxsIHRoZSB0YWdzIG9uIHRoZSBoaWdobGlnaHRlZCBzdGFjay4KICAgICAgICAqLwogICAgICAgIG5vZGVTdGFjay5yZXZlcnNlKCkuZm9yRWFjaChjbG9zZSk7CiAgICAgICAgZG8gewogICAgICAgICAgcmVuZGVyKHN0cmVhbS5zcGxpY2UoMCwgMSlbMF0pOwogICAgICAgICAgc3RyZWFtID0gc2VsZWN0U3RyZWFtKCk7CiAgICAgICAgfSB3aGlsZSAoc3RyZWFtID09PSBvcmlnaW5hbCAmJiBzdHJlYW0ubGVuZ3RoICYmIHN0cmVhbVswXS5vZmZzZXQgPT09IHByb2Nlc3NlZCk7CiAgICAgICAgbm9kZVN0YWNrLnJldmVyc2UoKS5mb3JFYWNoKG9wZW4pOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdHJlYW1bMF0uZXZlbnQgPT09ICdzdGFydCcpIHsKICAgICAgICAgIG5vZGVTdGFjay5wdXNoKHN0cmVhbVswXS5ub2RlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZVN0YWNrLnBvcCgpOwogICAgICAgIH0KICAgICAgICByZW5kZXIoc3RyZWFtLnNwbGljZSgwLCAxKVswXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQgKyBlc2NhcGVIVE1MKHZhbHVlLnN1YnN0cihwcm9jZXNzZWQpKTsKICB9CgogIHJldHVybiBtZXJnZUhUTUxQbHVnaW47Cgp9KCkpOw=="></script>
</head>
<body><div>
<nav><div><div>
<h1 class="hide-on-wide name-of-paper">constexpr coroutines</h1>
<div class="paper-info">
	<div><span class="key">Number:</span> P3367R1</div>
	<div><span class="key">Date:</span> <time>2024-11-22</time></div>
	<div><span class="key">Audience:</span> CWG</div>
	<div><span class="key">Reply-to:</span> <a href="mailto:cpp@hanicka.net">Hana Dusíková</a></div>
</div>

<h2 id="table-of-contents"><a href="#table-of-contents">Table of contents</a></h2>
<ul>
	<li><a href="#changes">Changes</a></li>
  <li><a href="#quote">Why would you want to do this?</a></li>
	<li><a href="#example">Simple example</a></li>
	<li><a href="#implementation-experience">Implementation experience</a></li>
	<li><a href="#impact-on-existing-code">Impact on existing code</a></li>
	<li><a href="#intention">Intention for wording changes</a></li>
	<li><a href="#wording">Proposed changes to wording</a></li>
		<ul>
			<li><a href="#feature-test-macros">Feature test macros</a></li>
		</ul>
</ul>
</div></div></nav>
<article>
<div><div>
	<h1 class="hide-on-narrow name-of-paper">constexpr coroutines</h1>
	<p>This paper is proposing making coroutines functional during constant evaluation. Even when most of use-cases for coroutines are based on I/O and event based, coroutines are still useful for compile-time based computation, eg. <code>std::generator</code>.</p>
	<h2 id="changes"><a href="#changes">Changes</a></h2>
	<ul>
		<li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3372r2.html">R0</a>&#x2005;→&#x2005;<a href="">R1</a>: Changed wording mentioning lifetime of coroutines after expr.const 5.2</li>
	</ul>
  <h2 id="quote"><a href="#quote">Why would you want to do this?</a></h2>
  <p>Well, you just told me coroutines are the best way to solve some problems, so wouldn't I also want to use the Best Way at compile time? (quote from Jason Turner, co-author of <em>"constexpr all the things"</em> talk)</p>
	<h2 id="example"><a href="#example">Simple example</a></h2>
  <p>When this paper is merged into the standard, users will be able to use <code>std::generator</code>-like coroutines to generate or calculate data.</p>
  <pre><code class="language-cpp">template &lt;typename T&gt; constexpr auto fib() -> std::generator&lt;T&gt; {
    T a = 0;
    T b = 1;
    co_yield a;
    do {
        co_yield b;
        auto tmp = b;
        b += a;
        a = tmp;
    } while (true);
}

template &lt;typename T, size_t N&gt; constexpr auto calculate_fibonnaci() {
    auto res = std::array&lt;T, N&gt;{};
    std::ranges::copy(fib&lt;T&gt;() | std::views::take(N), res.begin());
    return res;
}

constexpr auto cached_fibonnaci = calculate_fibonnaci&lt;unsigned, 20&gt;();</code></pre>
	<h2 id="implementation-experience"><a href="#implementation-experience">Implementation experience</a></h2>
  <p>Partially implemented in clang available on my <a href="https://github.com/hanickadot/llvm-project/tree/P3367-constexpr-coroutines">github</a>, implementation should be ready for its presentation at Wroclaw meeting, and also will be soon available on compiler explorer (thanks Matt!).</p>
  <p>Most of functionality needed was already present in Clang, it was mostly about removing checks in the parser.</p>
  <p>Another part was implementing the functionality in Clang's interpreter and there I needed to add fibers (stackfull coroutines) as the interpreter recursive walks over AST. Ability to save interpreter's stack content did minimize impact of the change to only resuming, suspending, and variable storage and life-time management.</p>
  <p>At the end of evaluation the interpret needs to check objects holding fibers if there is still any coroutine not released, if there is it report similar error as when there is an unreleased memory allocation.</p>
  <p>Hardest problem was implementing local "stack", as <code>createLocal</code> function was designed around idea of having only one branch of evaluation. This I solved by providing context of currently evaluated coroutine in <code>EvalInfo</code> and switching it on every suspension / resume of a coroutine.</p>
	<h2 id="impact-on-existing-code"><a href="#impact-on-existing-code">Impact on existing code</a></h2>
  <p>None, this is a pure extension, it allows code to be constexpr which wasn't case before.</p>
	<h2 id="intention"><a href="#intention">Intention for wording changes</a></h2>
  <p>Remove all obstacles blocking coroutines from being constant evaluatable. Make sure all coroutines are destroyed at end of constant evaluation.</p>
	<h2 id="wording"><a href="#wording">Proposed changes to wording</a></h2>
	<div class="wording">
    <h2 ><a class='secnum' style='min-width:65pt'>7.7</a> Constant expressions <a class='abbr_ref'>[expr.const]</a></h2>


<div class='para' id='5'><div class='marginalizedparent'><a class='marginalized' href='#5'>5</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/expressions.tex#L7464'>#</a></div><div class='texpara'><div id='5.sentence-1' class='sentence'>An expression <span class='math'><span class='mathalpha'>E</span></span> is a <a class='hidden_link' href='#def:expression,core_constant' title='7.7&emsp;Constant expressions&emsp;[expr.const]'><span id='def:expression,core_constant'><i >core constant expression</i></span></a>
unless the evaluation of <span class='math'><span class='mathalpha'>E</span></span>, following the rules of the abstract
machine (<a href='intro.execution' title='6.9.1&emsp;Sequential execution'>[intro.<span class='shy'></span>execution]</a>), would evaluate one of the following:
<ul class='itemize'><li id='5.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.1'>(5.1)</a></div><span id=':this'><span class='texttt'><span class='keyword'>this</span></span></span> (<a href='expr.prim.this' title='7.5.3&emsp;This'>[expr.<span class='shy'></span>prim.<span class='shy'></span>this]</a>), except
<ul class='itemize'><li id='5.1.1'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#5.1.1'>(5.1.1)</a></div>in a constexpr function (<a href='dcl.constexpr' title='9.2.6&emsp;The constexpr and consteval specifiers'>[dcl.<span class='shy'></span>constexpr]</a>)
that is being evaluated as part of <span class='math'><span class='mathalpha'>E</span></span> or</li><li id='5.1.2'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#5.1.2'>(5.1.2)</a></div>when appearing as the <a href='expr.post.general#nt:postfix-expression' title='7.6.1.1&emsp;General&emsp;[expr.post.general]'><span id='ntref:postfix-expression'><span class='textsf'><i >postfix-expression</i></span></span></a> of
an implicit or explicit class member access expression (<a href='expr.ref' title='7.6.1.5&emsp;Class member access'>[expr.<span class='shy'></span>ref]</a>);</li></ul></li><li id='5.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.2'>(5.2)</a></div>a control flow that passes through
a declaration of a block variable (<a href='basic.scope.block' title='6.4.3&emsp;Block scope'>[basic.<span class='shy'></span>scope.<span class='shy'></span>block]</a>) with
static (<a href='basic.stc.static' title='6.7.5.2&emsp;Static storage duration'>[basic.<span class='shy'></span>stc.<span class='shy'></span>static]</a>) or
thread (<a href='basic.stc.thread' title='6.7.5.3&emsp;Thread storage duration'>[basic.<span class='shy'></span>stc.<span class='shy'></span>thread]</a>) storage duration,
unless that variable is usable in constant expressions;
<div id='example-1' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-1'>1</a></i>:&ensp;<span class='codeblock'><span class='keyword'>constexpr</span> <span class='keyword'>char</span> test<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>static</span> <span class='keyword'>const</span> <span class='keyword'>int</span> x <span class='operator'>=</span> <span class='literal'>5</span>;
  <span class='keyword'>static</span> <span class='keyword'>constexpr</span> <span class='keyword'>char</span> c<span class='squarebracket'>[</span><span class='squarebracket'>]</span> <span class='operator'>=</span> <span class='literal'>"Hello World"</span>;
  <span class='keyword'>return</span> <span class='operator'>*</span><span class='parenthesis'>(</span>c <span class='operator'>+</span> x<span class='parenthesis'>)</span>;
<span class='curlybracket'>}</span>
<span class='keyword'>static_assert</span><span class='parenthesis'>(</span><span class='literal'>' '</span> <span class='operator'>=</span><span class='operator'>=</span> test<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>;
</span> —&nbsp;<i>end example</i>]</div></div></li>

<li id='5.??' class="added-item"><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.??'>(5.??)</a></div>a construction of a coroutine promise object ([<a href="https://eel.is/c++draft/dcl.fct.def.coroutine#def:promise_object">dcl.fct.def.coroutine</a>]), unless the coroutine promise object is destroyed within the evaluation of <em>E</em>;</li>

<li id='5.3'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.3'>(5.3)</a></div>an invocation of a non-constexpr function;<a class='footnoteref' href='#footnote-68' id='footnoteref-68' title='Overload resolution ([over.match]) is applied as usual.'>68</a></li><li id='5.4'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.4'>(5.4)</a></div>an invocation of an undefined constexpr function;</li><li id='5.5'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.5'>(5.5)</a></div>an invocation of an instantiated constexpr function
that is not constexpr-suitable;</li><li id='5.6'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.6'>(5.6)</a></div>an invocation of a virtual function (<a href='class.virtual' title='11.7.3&emsp;Virtual functions'>[class.<span class='shy'></span>virtual]</a>)
for an object whose dynamic type is constexpr-unknown;</li>

<div style="height: 50px"></div>

<li id='5.20'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.20'>(5.20)</a></div>a call to an instance of
<span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>allocator<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span><span class='operator'>&#x200b;::&#x200b;</span>allocate</span> (<a href='allocator.members' title='20.2.10.2&emsp;Members'>[allocator.<span class='shy'></span>members]</a>),
unless the allocated storage is deallocated within the evaluation of <span class='math'><span class='mathalpha'>E</span></span>;</li><li id='5.21'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.21'>(5.21)</a></div>a call to an instance of
<span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>allocator<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span><span class='operator'>&#x200b;::&#x200b;</span>deallocate</span> (<a href='allocator.members' title='20.2.10.2&emsp;Members'>[allocator.<span class='shy'></span>members]</a>),
unless it deallocates a region of storage
allocated within the evaluation of <span class='math'><span class='mathalpha'>E</span></span>;</li><li id='5.22'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.22'><span class="removed">(5.22)</span></a></div><span class="removed">an <a href='expr.await#nt:await-expression' title='7.6.2.4&emsp;Await&emsp;[expr.await]'><span id='ntref:await-expression'><span class='textsf'><i >await-expression</i></span></span></a> (<a href='expr.await' title='7.6.2.4&emsp;Await'>[expr.<span class='shy'></span>await]</a>);</span></li><li id='5.23'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.23'><span class="removed">(5.23)</span></a></div><span class="removed">a <a href='expr.yield#nt:yield-expression' title='7.6.17&emsp;Yielding a value&emsp;[expr.yield]'><span id='ntref:yield-expression'><span class='textsf'><i >yield-expression</i></span></span></a> (<a href='expr.yield' title='7.6.17&emsp;Yielding a value'>[expr.<span class='shy'></span>yield]</a>);</span></li><li id='5.24'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.24'>(5.24)</a></div>a three-way comparison (<a href='expr.spaceship' title='7.6.8&emsp;Three-way comparison operator'>[expr.<span class='shy'></span>spaceship]</a>),
relational (<a href='expr.rel' title='7.6.9&emsp;Relational operators'>[expr.<span class='shy'></span>rel]</a>), or equality (<a href='expr.eq' title='7.6.10&emsp;Equality operators'>[expr.<span class='shy'></span>eq]</a>)
operator where the result is unspecified;</li><li id='5.25'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#5.25'>(5.25)</a></div>a <a href='expr.throw#nt:throw-expression' title='7.6.18&emsp;Throwing an exception&emsp;[expr.throw]'><span id='ntref:throw-expression'><span class='textsf'><i >throw-expression</i></span></span></a> (<a href='expr.throw' title='7.6.18&emsp;Throwing an exception'>[expr.<span class='shy'></span>throw]</a>);</li>

</div></div></div>
  </div>
  <div class="wording">
    <h3 ><a class='secnum' style='min-width:80pt'>9.2.6</a> The <span class='texttt'>constexpr</span> and <span class='texttt'>consteval</span> specifiers <a class='abbr_ref'>[dcl.constexpr]</a></h3><div class='texpara'><a class='index' id=':specifier,constexpr'></a>
<a class='index' id=':specifier,consteval'></a></div><div class='para' id='1'><div class='marginalizedparent'><a class='marginalized' href='#1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/declarations.tex#L851'>#</a></div><div class='texpara'><div id='1.sentence-1' class='sentence'>The <span id=':constexpr'><span class='texttt'><span class='keyword'>constexpr</span></span></span> specifier shall be applied only to
the definition of a variable or variable template or
the declaration of a function or function template<a class='hidden_link' href='#1.sentence-1'>.</a></div> <div id='1.sentence-2' class='sentence'>The <span id=':consteval'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier shall be applied only to
the declaration of a function or function template<a class='hidden_link' href='#1.sentence-2'>.</a></div> <div id='1.sentence-3' class='sentence'>A function or static data member
declared with the <span id=':constexpr_'><span class='texttt'><span class='keyword'>constexpr</span></span></span> or <span id=':consteval_'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier
on its first declaration
is implicitly an inline function or variable (<a href='dcl.inline' title='9.2.8&emsp;The inline specifier'>[dcl.<span class='shy'></span>inline]</a>)<a class='hidden_link' href='#1.sentence-3'>.</a></div> <div id='1.sentence-4' class='sentence'>If any declaration of a function or function template has
a <span id=':constexpr__'><span class='texttt'><span class='keyword'>constexpr</span></span></span> or <span id=':consteval__'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier,
then all its declarations shall contain the same specifier<a class='hidden_link' href='#1.sentence-4'>.</a></div> <div id='note-1' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-1'>1</a></i>:&ensp;<div id='1.sentence-5' class='sentence'>An explicit specialization can differ from the template declaration
with respect to the <span id=':constexpr___'><span class='texttt'><span class='keyword'>constexpr</span></span></span> or <span id=':consteval___'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier<a class='hidden_link' href='#1.sentence-5'>.</a></div> —&nbsp;<i>end note</i>]</div></div> <div id='note-2' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-2'>2</a></i>:&ensp;<div id='1.sentence-6' class='sentence'>Function parameters cannot be declared <span id=':constexpr____'><span class='texttt'><span class='keyword'>constexpr</span></span></span><a class='hidden_link' href='#1.sentence-6'>.</a></div> —&nbsp;<i>end note</i>]</div></div> <div id='example-1' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-1'>1</a></i>:&ensp;<span class='codeblock'><span class='keyword'>constexpr</span> <span class='keyword'>void</span> square<span class='parenthesis'>(</span><span class='keyword'>int</span> <span class='operator'>&amp;</span>x<span class='parenthesis'>)</span>;  <span class='comment'>// OK, declaration</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> bufsz <span class='operator'>=</span> <span class='literal'>1024</span>;     <span class='comment'>// OK, definition</span>
<span class='keyword'>constexpr</span> <span class='keyword'>struct</span> pixel <span class='curlybracket'>{</span>        <span class='comment'>// error: <span class='tcode_in_codeblock'>pixel</span> is a type</span>
  <span class='keyword'>int</span> x;
  <span class='keyword'>int</span> y;
  <span class='keyword'>constexpr</span> pixel<span class='parenthesis'>(</span><span class='keyword'>int</span><span class='parenthesis'>)</span>;         <span class='comment'>// OK, declaration</span>
<span class='curlybracket'>}</span>;
<span class='keyword'>constexpr</span> pixel<span class='operator'>::</span>pixel<span class='parenthesis'>(</span><span class='keyword'>int</span> a<span class='parenthesis'>)</span>
  <span class='operator'>:</span> x<span class='parenthesis'>(</span>a<span class='parenthesis'>)</span>, y<span class='parenthesis'>(</span>x<span class='parenthesis'>)</span>                  <span class='comment'>// OK, definition</span>
  <span class='curlybracket'>{</span> square<span class='parenthesis'>(</span>x<span class='parenthesis'>)</span>; <span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> pixel small<span class='parenthesis'>(</span><span class='literal'>2</span><span class='parenthesis'>)</span>;       <span class='comment'>// error: <span class='tcode_in_codeblock'>square</span> not defined, so <span class='tcode_in_codeblock'>small(2)</span></span>
                                <span class='comment'>// not constant (<a href='expr.const' title='7.7&emsp;Constant expressions'>[expr.<span class='shy'></span>const]</a>) so <span id=':constexpr_____'><span class='tcode_in_codeblock'>constexpr</span></span> not satisfied</span>

<span class='keyword'>constexpr</span> <span class='keyword'>void</span> square<span class='parenthesis'>(</span><span class='keyword'>int</span> <span class='operator'>&amp;</span>x<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='comment'>// OK, definition</span>
  x <span class='operator'>*</span><span class='operator'>=</span> x;
<span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> pixel large<span class='parenthesis'>(</span><span class='literal'>4</span><span class='parenthesis'>)</span>;       <span class='comment'>// OK, <span class='tcode_in_codeblock'>square</span> defined</span>
<span class='keyword'>int</span> next<span class='parenthesis'>(</span><span class='keyword'>constexpr</span> <span class='keyword'>int</span> x<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>     <span class='comment'>// error: not for parameters</span>
     <span class='keyword'>return</span> x <span class='operator'>+</span> <span class='literal'>1</span>;
<span class='curlybracket'>}</span>
<span class='keyword'>extern</span> <span class='keyword'>constexpr</span> <span class='keyword'>int</span> memsz;     <span class='comment'>// error: not a definition</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/declarations.tex#L897'>#</a></div><div class='texpara'><div id='2.sentence-1' class='sentence'>A <span id=':constexpr______'><span class='texttt'><span class='keyword'>constexpr</span></span></span> or <span id=':consteval____'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier
used in the declaration of a function
declares that function to be
a <a class='hidden_link' href='#def:specifier,constexpr,function' title='9.2.6&emsp;The constexpr and consteval specifiers&emsp;[dcl.constexpr]'><span id='def:specifier,constexpr,function'><i >constexpr function</i></span></a><a class='hidden_link' href='#2.sentence-1'>.</a></div> <div id='note-3' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-3'>3</a></i>:&ensp;<div id='2.sentence-2' class='sentence'>A function or constructor declared with the <span id=':consteval_____'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier
is an immediate function (<a href='expr.const' title='7.7&emsp;Constant expressions'>[expr.<span class='shy'></span>const]</a>)<a class='hidden_link' href='#2.sentence-2'>.</a></div> —&nbsp;<i>end note</i>]</div></div> <div id='2.sentence-3' class='sentence'>
A destructor, an allocation function, or a deallocation function
shall not be declared with the <span id=':consteval______'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifier<a class='hidden_link' href='#2.sentence-3'>.</a></div></div></div><div class='para' id='3'><div class='marginalizedparent'><a class='marginalized' href='#3'>3</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/declarations.tex#L909'>#</a></div><div class='texpara'><div id='3.sentence-1' class='sentence'><a class='index' id=':specifier,constexpr,function'></a><a class='index' id=':constexpr_function'></a>A function is <a class='hidden_link' href='#def:constexpr-suitable' title='9.2.6&emsp;The constexpr and consteval specifiers&emsp;[dcl.constexpr]'><span id='def:constexpr-suitable'><i >constexpr-suitable</i></span></a> <span class="added">unless</span> <span class="removed">if</span>
<ul class='itemize'><li id='3.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#3.1'><span class="removed">(3.1)</span></a></div><span class='removed'>it is not a coroutine (<a href='dcl.fct.def.coroutine' title='9.5.4&emsp;Coroutine definitions'>[dcl.<span class='shy'></span>fct.<span class='shy'></span>def.<span class='shy'></span>coroutine]</a>), and</span></li><li id='3.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#3.2'><span class="removed">(3.2)</span></a></div><span class="removed">if the function </span> <span class="added">it</span> is a constructor or destructor <span class="added">whose class has</span>
<span class="removed">its class does not have </span> any virtual base classes<a class='hidden_link' href='#3.sentence-1'>.</a></li></ul></div> <div id='3.sentence-2' class='sentence'>
Except for instantiated constexpr functions,
non-templated constexpr functions shall be constexpr-suitable<a class='hidden_link' href='#3.sentence-2'>.</a></div></div><div class='texpara'><div id='example-2' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-2'>2</a></i>:&ensp;<span class='codeblock'><span class='keyword'>constexpr</span> <span class='keyword'>int</span> square<span class='parenthesis'>(</span><span class='keyword'>int</span> x<span class='parenthesis'>)</span>
  <span class='curlybracket'>{</span> <span class='keyword'>return</span> x <span class='operator'>*</span> x; <span class='curlybracket'>}</span>             <span class='comment'>// OK</span>
<span class='keyword'>constexpr</span> <span class='keyword'>long</span> long_max<span class='parenthesis'>(</span><span class='parenthesis'>)</span>
  <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='literal'>2147483647</span>; <span class='curlybracket'>}</span>        <span class='comment'>// OK</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> abs<span class='parenthesis'>(</span><span class='keyword'>int</span> x<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>if</span> <span class='parenthesis'>(</span>x <span class='anglebracket'>&lt;</span> <span class='literal'>0</span><span class='parenthesis'>)</span>
    x <span class='operator'>=</span> <span class='operator'>-</span>x;
  <span class='keyword'>return</span> x;                     <span class='comment'>// OK</span>
<span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> constant_non_42<span class='parenthesis'>(</span><span class='keyword'>int</span> n<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>  <span class='comment'>// OK</span>
  <span class='keyword'>if</span> <span class='parenthesis'>(</span>n <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>42</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
    <span class='keyword'>static</span> <span class='keyword'>int</span> value <span class='operator'>=</span> n;
    <span class='keyword'>return</span> value;
  <span class='curlybracket'>}</span>
  <span class='keyword'>return</span> n;
<span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> uninit<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>struct</span> <span class='curlybracket'>{</span> <span class='keyword'>int</span> a; <span class='curlybracket'>}</span> s;
  <span class='keyword'>return</span> s<span class='operator'>.</span>a;                   <span class='comment'>// error: uninitialized read of <span class='tcode_in_codeblock'>s.a</span></span>
<span class='curlybracket'>}</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> prev<span class='parenthesis'>(</span><span class='keyword'>int</span> x<span class='parenthesis'>)</span>
  <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='operator'>-</span><span class='operator'>-</span>x; <span class='curlybracket'>}</span>               <span class='comment'>// OK</span>
<span class='keyword'>constexpr</span> <span class='keyword'>int</span> g<span class='parenthesis'>(</span><span class='keyword'>int</span> x, <span class='keyword'>int</span> n<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='comment'>// OK</span>
  <span class='keyword'>int</span> r <span class='operator'>=</span> <span class='literal'>1</span>;
  <span class='keyword'>while</span> <span class='parenthesis'>(</span><span class='operator'>-</span><span class='operator'>-</span>n <span class='anglebracket'>&gt;</span> <span class='literal'>0</span><span class='parenthesis'>)</span> r <span class='operator'>*</span><span class='operator'>=</span> x;
  <span class='keyword'>return</span> r;
<span class='curlybracket'>}</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div><div class='para' id='4'><div class='marginalizedparent'><a class='marginalized' href='#4'>4</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/declarations.tex#L956'>#</a></div><div class='texpara'><div id='4.sentence-1' class='sentence'>An invocation of a constexpr function in a given context
produces the same result as
an invocation of an equivalent non-constexpr function in the same context
in all respects except that
<ul class='itemize'><li id='4.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#4.1'>(4.1)</a></div>an invocation of a constexpr function
can appear in a constant expression (<a href='expr.const' title='7.7&emsp;Constant expressions'>[expr.<span class='shy'></span>const]</a>) and</li><li id='4.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#4.2'>(4.2)</a></div>copy elision is not performed in a constant expression (<a href='class.copy.elision' title='11.9.6&emsp;Copy/move elision'>[class.<span class='shy'></span>copy.<span class='shy'></span>elision]</a>)<a class='hidden_link' href='#4.sentence-1'>.</a></li></ul></div> <div id='note-4' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-4'>4</a></i>:&ensp;<div id='4.sentence-2' class='sentence'>Declaring a function constexpr can change whether an expression
is a constant expression<a class='hidden_link' href='#4.sentence-2'>.</a></div> <div id='4.sentence-3' class='sentence'>This can indirectly cause calls to <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>is_<span class='shy'></span>constant_<span class='shy'></span>evaluated</span>
within an invocation of the function to produce a different value<a class='hidden_link' href='#4.sentence-3'>.</a></div> —&nbsp;<i>end note</i>]</div></div> <div id='note-5' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#note-5'>5</a></i>:&ensp;<div id='4.sentence-4' class='sentence'>It is possible to write a constexpr function for which
no invocation satisfies the requirements of a core constant expression<a class='hidden_link' href='#4.sentence-4'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div><div class='para' id='5'><div class='marginalizedparent'><a class='marginalized' href='#5'>5</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/declarations.tex#L979'>#</a></div><div class='texpara'><div id='5.sentence-1' class='sentence'>The <span id=':constexpr_______'><span class='texttt'><span class='keyword'>constexpr</span></span></span> and <span id=':consteval_______'><span class='texttt'><span class='keyword'>consteval</span></span></span> specifiers have no
effect on the type of a constexpr function<a class='hidden_link' href='#5.sentence-1'>.</a></div> <div id='example-3' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-3'>3</a></i>:&ensp;<span class='codeblock'><span class='keyword'>constexpr</span> <span class='keyword'>int</span> bar<span class='parenthesis'>(</span><span class='keyword'>int</span> x, <span class='keyword'>int</span> y<span class='parenthesis'>)</span>         <span class='comment'>// OK</span>
    <span class='curlybracket'>{</span> <span class='keyword'>return</span> x <span class='operator'>+</span> y <span class='operator'>+</span> x<span class='operator'>*</span>y; <span class='curlybracket'>}</span>
<span class='comment'>// ...</span>
<span class='keyword'>int</span> bar<span class='parenthesis'>(</span><span class='keyword'>int</span> x, <span class='keyword'>int</span> y<span class='parenthesis'>)</span>                   <span class='comment'>// error: redefinition of <span class='tcode_in_codeblock'>bar</span></span>
    <span class='curlybracket'>{</span> <span class='keyword'>return</span> x <span class='operator'>*</span> <span class='literal'>2</span> <span class='operator'>+</span> <span class='literal'>3</span> <span class='operator'>*</span> y; <span class='curlybracket'>}</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div><div class='para' id='6'><div class='marginalizedparent'><a class='marginalized' href='#6'>6</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/declarations.tex#L992'>#</a></div><div class='texpara'><div id='6.sentence-1' class='sentence'>A <span id=':constexpr________'><span class='texttt'><span class='keyword'>constexpr</span></span></span> specifier used in an object declaration
declares the object as const<a class='hidden_link' href='#6.sentence-1'>.</a></div> <div id='6.sentence-2' class='sentence'>Such an object
shall have literal type and
shall be initialized<a class='hidden_link' href='#6.sentence-2'>.</a></div> <div id='6.sentence-3' class='sentence'>In any <span id=':constexpr_________'><span class='texttt'><span class='keyword'>constexpr</span></span></span> variable declaration,
the full-expression of the initialization
shall be a constant expression (<a href='expr.const' title='7.7&emsp;Constant expressions'>[expr.<span class='shy'></span>const]</a>)<a class='hidden_link' href='#6.sentence-3'>.</a></div> <div id='6.sentence-4' class='sentence'>A <span id=':constexpr__________'><span class='texttt'><span class='keyword'>constexpr</span></span></span> variable that is an object,
as well as any temporary to which a <span id=':constexpr___________'><span class='texttt'><span class='keyword'>constexpr</span></span></span> reference is bound,
shall have constant destruction<a class='hidden_link' href='#6.sentence-4'>.</a></div> <div id='example-4' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#example-4'>4</a></i>:&ensp;<span class='codeblock'><span class='keyword'>struct</span> pixel <span class='curlybracket'>{</span>
  <span class='keyword'>int</span> x, y;
<span class='curlybracket'>}</span>;
<span class='keyword'>constexpr</span> pixel ur <span class='operator'>=</span> <span class='curlybracket'>{</span> <span class='literal'>1294</span>, <span class='literal'>1024</span> <span class='curlybracket'>}</span>;    <span class='comment'>// OK</span>
<span class='keyword'>constexpr</span> pixel origin;                 <span class='comment'>// error: initializer missing</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div>
   </div><div class="wording">
		<h2 ><a class='secnum' style='min-width:65pt'>17.12</a> Coroutines <a class='abbr_ref'>[support.coroutine]</a></h2><div id='general' class='section'><h3 ><a class='secnum' href='#general' style='min-width:80pt'>17.12.1</a> General <a class='abbr_ref' href='support.coroutine.general'>[support.coroutine.general]</a></h3><div class='para' id='general-1'><div class='marginalizedparent'><a class='marginalized' href='#general-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5146'>#</a></div><div class='texpara'><div id='general-1.sentence-1' class='sentence'>The header <span id='header:<coroutine>'><span class='texttt'><span class='anglebracket'>&lt;</span>coroutine<span class='anglebracket'>&gt;</span></span></span>
defines several types providing
compile and run-time support for
coroutines in a C++ program<a class='hidden_link' href='#general-1.sentence-1'>.</a></div></div></div></div><div id='coroutine.syn' class='section'><h3 ><a class='secnum' href='#coroutine.syn' style='min-width:80pt'>17.12.2</a> Header <span class='texttt'>&lt;coroutine&gt;</span> synopsis <a class='abbr_ref' href='coroutine.syn'>[coroutine.syn]</a></h3><div class='texpara'><span id='lib:noop_coroutine_handle'><span id='header:<coroutine>_'><div class='marginalizedparent'><a class='itemDeclLink' href='#header:%3ccoroutine%3e_'>🔗</a></div><span class='codeblock'><span class='comment'>// all freestanding</span>
<span class='preprocessordirective'>#include</span> <span class='anglebracket'>&lt;</span>compare<span class='anglebracket'>&gt;</span>              <span class='comment'>// see <a href='compare.syn' title='17.11.1&emsp;Header &lt;compare&gt; synopsis'>[compare.<span class='shy'></span>syn]</a></span>

<span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='comment'>// <a href='#coroutine.traits' title='17.12.3&emsp;Coroutine traits'>[coroutine.<span class='shy'></span>traits]</a>, coroutine traits</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> R, <span class='keyword'>class</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> ArgTypes<span class='anglebracket'>&gt;</span>
    <span class='keyword'>struct</span> coroutine_traits;

  <span class='comment'>// <a href='#coroutine.handle' title='17.12.4&emsp;Class template coroutine_&shy;handle'>[coroutine.<span class='shy'></span>handle]</a>, coroutine handle</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Promise <span class='operator'>=</span> <span class='keyword'>void</span><span class='anglebracket'>&gt;</span>
    <span class='keyword'>struct</span> coroutine_handle;

  <span class='comment'>// <a href='#coroutine.handle.compare' title='17.12.4.8&emsp;Comparison operators'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>compare]</a>, comparison operators</span>
  <span class='keyword'>constexpr</span> <span class='keyword'>bool</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='operator'>=</span><span class='parenthesis'>(</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> x, coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> y<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
  <span class='keyword'>constexpr</span> strong_ordering <span class='keyword'>operator</span><span class='anglebracket'>&lt;</span><span class='operator'>=</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> x, coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> y<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

  <span class='comment'>// <a href='#coroutine.handle.hash' title='17.12.4.9&emsp;Hash support'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>hash]</a>, hash support</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> T<span class='anglebracket'>&gt;</span> <span class='keyword'>struct</span> hash;
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> P<span class='anglebracket'>&gt;</span> <span class='keyword'>struct</span> hash<span class='anglebracket'>&lt;</span>coroutine_handle<span class='anglebracket'>&lt;</span>P<span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span>;

  <span class='comment'>// <a href='#coroutine.noop' title='17.12.5&emsp;No-op coroutines'>[coroutine.<span class='shy'></span>noop]</a>, no-op coroutines</span>
  <span class='keyword'>struct</span> noop_coroutine_promise;

  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> <span class='keyword'>struct</span> coroutine_handle<span class='anglebracket'>&lt;</span>noop_coroutine_promise<span class='anglebracket'>&gt;</span>;
  <span class='keyword'>using</span> noop_coroutine_handle <span class='operator'>=</span> coroutine_handle<span class='anglebracket'>&lt;</span>noop_coroutine_promise<span class='anglebracket'>&gt;</span>;

  <span class="added keyword">constexpr </span>noop_coroutine_handle noop_coroutine<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

  <span class='comment'>// <a href='#coroutine.trivial.awaitables' title='17.12.6&emsp;Trivial awaitables'>[coroutine.<span class='shy'></span>trivial.<span class='shy'></span>awaitables]</a>, trivial awaitables</span>
  <span class='keyword'>struct</span> suspend_never;
  <span class='keyword'>struct</span> suspend_always;
<span class='curlybracket'>}</span>
</span></span></span></div></div><div id='coroutine.traits' class='section'><h3 ><a class='secnum' href='#coroutine.traits' style='min-width:80pt'>17.12.3</a> Coroutine traits <a class='abbr_ref' href='coroutine.traits'>[coroutine.traits]</a></h3><div id='coroutine.traits.general' class='section'><h4 ><a class='secnum' href='#coroutine.traits.general' style='min-width:95pt'>17.12.3.1</a> General <a class='abbr_ref' href='coroutine.traits.general'>[coroutine.traits.general]</a></h4><div class='para' id='coroutine.traits.general-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.traits.general-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5195'>#</a></div><div class='texpara'><div id='coroutine.traits.general-1.sentence-1' class='sentence'>Subclause <a href='#coroutine.traits' title='17.12.3&emsp;Coroutine traits'>[coroutine.<span class='shy'></span>traits]</a> defines requirements on classes representing
<a class='hidden_link' href='#def:coroutine_traits' id='def:coroutine_traits'><i>coroutine traits</i></a>,
and defines the class template
<span class='texttt'>coroutine_<span class='shy'></span>traits</span>
that meets those requirements<a class='hidden_link' href='#coroutine.traits.general-1.sentence-1'>.</a></div></div></div></div><div id='coroutine.traits.primary' class='section'><h4 ><a class='secnum' href='#coroutine.traits.primary' style='min-width:95pt'>17.12.3.2</a> Class template <span class='texttt'>coroutine_<span class='shy'></span>traits</span> <a class='abbr_ref' href='coroutine.traits.primary'>[coroutine.traits.primary]</a></h4><div class='texpara'><a class='index' id='lib:coroutine_traits'></a></div><div class='para' id='coroutine.traits.primary-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.traits.primary-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5205'>#</a></div><div class='texpara'><div id='coroutine.traits.primary-1.sentence-1' class='sentence'>The header <a href='#header:%3ccoroutine%3e' title='17.12.2&emsp;Header &lt;coroutine&gt; synopsis&emsp;[coroutine.syn]'><span id='headerref:<coroutine>'><span class='texttt'>&lt;coroutine&gt;</span></span></a> defines the primary template
<span class='texttt'>coroutine_<span class='shy'></span>traits</span> such that
if <span class='texttt'>ArgTypes</span> is a parameter pack of types and
if the <a href='expr.prim.id.qual#nt:qualified-id' title='7.5.5.3&emsp;Qualified names&emsp;[expr.prim.id.qual]'><span id='ntref:qualified-id'><span class='textsf'><i >qualified-id</i></span></span></a> <span class='texttt'>R<span class='operator'>&#x200b;::&#x200b;</span>promise_<span class='shy'></span>type</span> is valid and
denotes a type (<a href='temp.deduct' title='13.10.3&emsp;Template argument deduction'>[temp.<span class='shy'></span>deduct]</a>),
then <span class='texttt'>coroutine_<span class='shy'></span>traits<span class='anglebracket'>&lt;</span>R, ArgTypes<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span></span> has the following publicly
accessible member:
<span class='codeblock'><span class='keyword'>using</span> promise_type <span class='operator'>=</span> <span class='keyword'>typename</span> R<span class='operator'>::</span>promise_type;
</span></div></div><div class='texpara'><div id='coroutine.traits.primary-1.sentence-2' class='sentence'>Otherwise, <span class='texttt'>coroutine_<span class='shy'></span>traits<span class='anglebracket'>&lt;</span>R, ArgTypes<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span></span> has no members<a class='hidden_link' href='#coroutine.traits.primary-1.sentence-2'>.</a></div></div></div><div class='para' id='coroutine.traits.primary-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.traits.primary-2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5219'>#</a></div><div class='texpara'><div id='coroutine.traits.primary-2.sentence-1' class='sentence'>Program-defined specializations of this template shall define a publicly
accessible nested type named <span class='texttt'>promise_<span class='shy'></span>type</span><a class='hidden_link' href='#coroutine.traits.primary-2.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle' class='section'><h3 ><a class='secnum' href='#coroutine.handle' style='min-width:80pt'>17.12.4</a> Class template <span class='texttt'>coroutine_<span class='shy'></span>handle</span> <a class='abbr_ref' href='coroutine.handle'>[coroutine.handle]</a></h3><div id='coroutine.handle.general' class='section'><h4 ><a class='secnum' href='#coroutine.handle.general' style='min-width:95pt'>17.12.4.1</a> General <a class='abbr_ref' href='coroutine.handle.general'>[coroutine.handle.general]</a></h4><div class='texpara'><span id='lib:coroutine_handle'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:coroutine_handle'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span>
  <span class='keyword'>struct</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='keyword'>void</span><span class='anglebracket'>&gt;</span>
  <span class='curlybracket'>{</span>
    <span class='comment'>// <a href='#coroutine.handle.con' title='17.12.4.2&emsp;Construct/reset'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>con]</a>, construct/reset</span>
    <span class='keyword'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span>nullptr_t<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class='keyword added'>constexpr</span> coroutine_handle<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span>nullptr_t<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.export.import' title='17.12.4.4&emsp;Export/import'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>export.<span class='shy'></span>import]</a>, export/import</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>static</span> <span class='keyword'>constexpr</span> coroutine_handle from_address<span class='parenthesis'>(</span><span class='keyword'>void</span><span class='operator'>*</span> addr<span class='parenthesis'>)</span>;

    <span class='comment'>// <a href='#coroutine.handle.observers' title='17.12.4.5&emsp;Observers'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>observers]</a>, observers</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>explicit</span> <span class='keyword'>operator</span> <span class='keyword'>bool</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword added'>constexpr</span> <span class='keyword'>bool</span> done<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;

    <span class='comment'>// <a href='#coroutine.handle.resumption' title='17.12.4.6&emsp;Resumption'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>resumption]</a>, resumption</span>
    <span class='keyword added'>constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
    <span class='keyword added'>constexpr</span> <span class='keyword'>void</span> resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
    <span class='keyword added'>constexpr</span> <span class='keyword'>void</span> destroy<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;

  <span class='keyword'>private</span><span class='operator'>:</span>
    <span class='keyword'>void</span><span class='operator'>*</span> ptr;  <span class='comment'>// <i >exposition only</i></span>
  <span class='curlybracket'>}</span>;

  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Promise<span class='anglebracket'>&gt;</span>
  <span class='keyword'>struct</span> coroutine_handle
  <span class='curlybracket'>{</span>
    <span class='comment'>// <a href='#coroutine.handle.con' title='17.12.4.2&emsp;Construct/reset'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>con]</a>, construct/reset</span>
    <span class='keyword'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span>nullptr_t<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>static</span> <span class='keyword added'>constexpr</span> coroutine_handle from_promise<span class='parenthesis'>(</span>Promise<span class='operator'>&amp;</span><span class='parenthesis'>)</span>;
    <span class='keyword added'>constexpr</span> coroutine_handle<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span>nullptr_t<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.export.import' title='17.12.4.4&emsp;Export/import'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>export.<span class='shy'></span>import]</a>, export/import</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>static</span> <span class='keyword'>constexpr</span> coroutine_handle from_address<span class='parenthesis'>(</span><span class='keyword'>void</span><span class='operator'>*</span> addr<span class='parenthesis'>)</span>;

    <span class='comment'>// <a href='#coroutine.handle.conv' title='17.12.4.3&emsp;Conversion'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>conv]</a>, conversion</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>operator</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.observers' title='17.12.4.5&emsp;Observers'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>observers]</a>, observers</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>explicit</span> <span class='keyword'>operator</span> <span class='keyword'>bool</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword added'>constexpr</span> <span class='keyword'>bool</span> done<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;

    <span class='comment'>// <a href='#coroutine.handle.resumption' title='17.12.4.6&emsp;Resumption'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>resumption]</a>, resumption</span>
    <span class='keyword added'>constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
    <span class='keyword added'>constexpr</span> <span class='keyword'>void</span> resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
    <span class='keyword added'>constexpr</span> <span class='keyword'>void</span> destroy<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;

    <span class='comment'>// <a href='#coroutine.handle.promise' title='17.12.4.7&emsp;Promise access'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>promise]</a>, promise access</span>
    <span class='keyword added'>constexpr</span> Promise<span class='operator'>&amp;</span> promise<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;

  <span class='keyword'>private</span><span class='operator'>:</span>
    <span class='keyword'>void</span><span class='operator'>*</span> ptr;  <span class='comment'>// <i >exposition only</i></span>
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></div><div class='para' id='coroutine.handle.general-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.general-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5289'>#</a></div><div class='texpara'><div id='coroutine.handle.general-1.sentence-1' class='sentence'>An object of type
<span class='texttt'>coroutine_<span class='shy'></span>handle<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span></span> is called a <a class='hidden_link' href='#def:coroutine_handle' id='def:coroutine_handle'><i>coroutine handle</i></a>
and can be used to refer to a suspended or executing coroutine<a class='hidden_link' href='#coroutine.handle.general-1.sentence-1'>.</a></div> <div id='coroutine.handle.general-1.sentence-2' class='sentence'>A <span class='texttt'>coroutine_<span class='shy'></span>handle</span> object whose
member <span class='texttt'>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span> returns a null pointer value
does not refer to any
coroutine<a class='hidden_link' href='#coroutine.handle.general-1.sentence-2'>.</a></div> <div id='coroutine.handle.general-1.sentence-3' class='sentence'>Two <span class='texttt'>coroutine_<span class='shy'></span>handle</span> objects refer to the same coroutine
if and only if their member <span class='texttt'>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span> returns the same non-null value<a class='hidden_link' href='#coroutine.handle.general-1.sentence-3'>.</a></div></div></div><div class='para' id='coroutine.handle.general-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.general-2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5300'>#</a></div><div class='texpara'><div id='coroutine.handle.general-2.sentence-1' class='sentence'>If a program declares an explicit or partial specialization of
<span class='texttt'>coroutine_<span class='shy'></span>handle</span>, the behavior is undefined<a class='hidden_link' href='#coroutine.handle.general-2.sentence-1'>.</a></div></div></div></div><div id='coroutine.handle.con' class='section'><h4 ><a class='secnum' href='#coroutine.handle.con' style='min-width:95pt'>17.12.4.2</a> Construct/reset <a class='abbr_ref' href='coroutine.handle.con'>[coroutine.handle.con]</a></h4><div class='texpara'><div id='lib:coroutine_handle,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:coroutine_handle,constructor'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
<span class='keyword'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span>nullptr_t<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div><div class='para' id='coroutine.handle.con-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.con-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5313'>#</a></div><div class='texpara'><div id='coroutine.handle.con-1.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>nullptr</span></span><a class='hidden_link' href='#coroutine.handle.con-1.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,from_promise'><div id='lib:from_promise,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:from_promise,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>static</span> <span class='keyword added'>constexpr</span> coroutine_handle from_promise<span class='parenthesis'>(</span>Promise<span class='operator'>&amp;</span> p<span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.con-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.con-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5324'>#</a></div><div class='texpara'><div id='coroutine.handle.con-2.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'>p</span> is a reference to a promise object of a coroutine<a class='hidden_link' href='#coroutine.handle.con-2.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.con-3'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.con-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5328'>#</a></div><div class='texpara'><div id='coroutine.handle.con-3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>addressof<span class='parenthesis'>(</span>h<span class='operator'>.</span>promise<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> addressof<span class='parenthesis'>(</span>p<span class='parenthesis'>)</span></span><a class='hidden_link' href='#coroutine.handle.con-3.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.con-4'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.con-4'>4</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5332'>#</a></div><div class='texpara'><div id='coroutine.handle.con-4.sentence-1' class='sentence'><i >Returns</i>: A coroutine handle <span class='texttt'>h</span> referring to the coroutine<a class='hidden_link' href='#coroutine.handle.con-4.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,operator='><div id='lib:operator=,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator=,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> coroutine_handle<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span>nullptr_t<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.con-5'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.con-5'>5</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5343'>#</a></div><div class='texpara'><div id='coroutine.handle.con-5.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>nullptr</span></span><a class='hidden_link' href='#coroutine.handle.con-5.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.con-6'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.con-6'>6</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5347'>#</a></div><div class='texpara'><div id='coroutine.handle.con-6.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span><a class='hidden_link' href='#coroutine.handle.con-6.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.conv' class='section'><h4 ><a class='secnum' href='#coroutine.handle.conv' style='min-width:95pt'>17.12.4.3</a> Conversion <a class='abbr_ref' href='coroutine.handle.conv'>[coroutine.handle.conv]</a></h4><div class='texpara'><div id='lib:coroutine_handle,operator_coroutine_handle<>'><div id='lib:operator_coroutine_handle<>,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator_coroutine_handle%3c%3e,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>operator</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.conv-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.conv-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5360'>#</a></div><div class='texpara'><div id='coroutine.handle.conv-1.sentence-1' class='sentence'><i >Effects</i>: Equivalent to: <span class='texttt'><span class='keyword'>return</span> coroutine_<span class='shy'></span>handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='operator'>&#x200b;::&#x200b;</span>from_<span class='shy'></span>address<span class='parenthesis'>(</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>;</span></div></div></div></div></div><div id='coroutine.handle.export.import' class='section'><h4 ><a class='secnum' href='#coroutine.handle.export.import' style='min-width:95pt'>17.12.4.4</a> Export/import <a class='abbr_ref' href='coroutine.handle.export.import'>[coroutine.handle.export.import]</a></h4><div class='texpara'><div id='lib:coroutine_handle,address'><div id='lib:address,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:address,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.export.import-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.export.import-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5373'>#</a></div><div class='texpara'><div id='coroutine.handle.export.import-1.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'>ptr</span><a class='hidden_link' href='#coroutine.handle.export.import-1.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,from_address'><div id='lib:from_address,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:from_address,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>static</span> <span class='keyword'>constexpr</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='operator'>::</span>from_address<span class='parenthesis'>(</span><span class='keyword'>void</span><span class='operator'>*</span> addr<span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.export.import-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.export.import-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5384'>#</a></div><div class='texpara'><div id='coroutine.handle.export.import-2.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'>addr</span> was obtained via a prior call to <span class='texttt'>address</span>
on an object whose type is a specialization of <span class='texttt'>coroutine_<span class='shy'></span>handle</span><a class='hidden_link' href='#coroutine.handle.export.import-2.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.export.import-3'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.export.import-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5389'>#</a></div><div class='texpara'><div id='coroutine.handle.export.import-3.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>from_<span class='shy'></span>address<span class='parenthesis'>(</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='operator'>*</span><span class='keyword'>this</span></span><a class='hidden_link' href='#coroutine.handle.export.import-3.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,from_address_'><div id='lib:from_address,coroutine_handle_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:from_address,coroutine_handle_'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>static</span> <span class='keyword'>constexpr</span> coroutine_handle<span class='anglebracket'>&lt;</span>Promise<span class='anglebracket'>&gt;</span> coroutine_handle<span class='anglebracket'>&lt;</span>Promise<span class='anglebracket'>&gt;</span><span class='operator'>::</span>from_address<span class='parenthesis'>(</span><span class='keyword'>void</span><span class='operator'>*</span> addr<span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.export.import-4'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.export.import-4'>4</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5400'>#</a></div><div class='texpara'><div id='coroutine.handle.export.import-4.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'>addr</span> was obtained via a prior call to <span class='texttt'>address</span>
on an object of type <span class='mathit'>cv</span> <span class='texttt'>coroutine_<span class='shy'></span>handle<span class='anglebracket'>&lt;</span>Promise<span class='anglebracket'>&gt;</span></span><a class='hidden_link' href='#coroutine.handle.export.import-4.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.export.import-5'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.export.import-5'>5</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5405'>#</a></div><div class='texpara'><div id='coroutine.handle.export.import-5.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>from_<span class='shy'></span>address<span class='parenthesis'>(</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> <span class='operator'>*</span><span class='keyword'>this</span></span><a class='hidden_link' href='#coroutine.handle.export.import-5.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.observers' class='section'><h4 ><a class='secnum' href='#coroutine.handle.observers' style='min-width:95pt'>17.12.4.5</a> Observers <a class='abbr_ref' href='coroutine.handle.observers'>[coroutine.handle.observers]</a></h4><div class='texpara'><div id='lib:coroutine_handle,operator_bool'><div id='lib:operator_bool,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator_bool,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>explicit</span> <span class='keyword'>operator</span> <span class='keyword'>bool</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.observers-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.observers-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5418'>#</a></div><div class='texpara'><div id='coroutine.handle.observers-1.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>!</span><span class='operator'>=</span> <span class='literal'>nullptr</span></span><a class='hidden_link' href='#coroutine.handle.observers-1.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,done'><div id='lib:done,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:done,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> <span class='keyword'>bool</span> done<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.observers-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.observers-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5429'>#</a></div><div class='texpara'><div id='coroutine.handle.observers-2.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span> refers to a suspended coroutine<a class='hidden_link' href='#coroutine.handle.observers-2.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.observers-3'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.observers-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5433'>#</a></div><div class='texpara'><div id='coroutine.handle.observers-3.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='literal'>true</span></span> if the coroutine is suspended at its
final suspend point, otherwise <span class='texttt'><span class='literal'>false</span></span><a class='hidden_link' href='#coroutine.handle.observers-3.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.resumption' class='section'><h4 ><a class='secnum' href='#coroutine.handle.resumption' style='min-width:95pt'>17.12.4.6</a> Resumption <a class='abbr_ref' href='coroutine.handle.resumption'>[coroutine.handle.resumption]</a></h4><div class='para' id='coroutine.handle.resumption-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.resumption-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5441'>#</a></div><div class='texpara'><div id='coroutine.handle.resumption-1.sentence-1' class='sentence'>Resuming a coroutine via <span class='texttt'>resume</span>, <span class='texttt'><span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span></span>, or <span class='texttt'>destroy</span>
on an execution agent other than the one on which it was suspended
has <a class='index' id=':resuming_a_coroutine_on_a_different_execution_agent'></a>implementation-defined behavior
unless
each execution agent either is
an instance of <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>thread</span> or <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>jthread</span>,
or is the thread that executes <span class='texttt'>main</span><a class='hidden_link' href='#coroutine.handle.resumption-1.sentence-1'>.</a></div> <div id='coroutine.handle.resumption-note-1' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#coroutine.handle.resumption-note-1'>1</a></i>:&ensp;<div id='coroutine.handle.resumption-1.sentence-2' class='sentence'>A coroutine that is resumed on a different execution agent should
avoid relying on consistent thread identity throughout, such as holding
a mutex object across a suspend point<a class='hidden_link' href='#coroutine.handle.resumption-1.sentence-2'>.</a></div> —&nbsp;<i>end note</i>]</div></div> <div id='coroutine.handle.resumption-note-2' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#coroutine.handle.resumption-note-2'>2</a></i>:&ensp;<div id='coroutine.handle.resumption-1.sentence-3' class='sentence'>A concurrent resumption of the coroutine can result in a data race<a class='hidden_link' href='#coroutine.handle.resumption-1.sentence-3'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,resume'><div id='lib:resume,coroutine_handle'><div id='lib:coroutine_handle,operator()'><div id='lib:operator(),coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator(),coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
<span class='keyword added'>constexpr</span> <span class='keyword'>void</span> resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
</code></div></div></div></div></div></div><div class='para' id='coroutine.handle.resumption-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.resumption-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5466'>#</a></div><div class='texpara'><div id='coroutine.handle.resumption-2.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span> refers to a suspended coroutine<a class='hidden_link' href='#coroutine.handle.resumption-2.sentence-1'>.</a></div> <div id='coroutine.handle.resumption-2.sentence-2' class='sentence'>The coroutine is not suspended at its final suspend point<a class='hidden_link' href='#coroutine.handle.resumption-2.sentence-2'>.</a></div></div></div></div><div class='para' id='coroutine.handle.resumption-3'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.resumption-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5471'>#</a></div><div class='texpara'><div id='coroutine.handle.resumption-3.sentence-1' class='sentence'><i >Effects</i>: Resumes the execution of the coroutine<a class='hidden_link' href='#coroutine.handle.resumption-3.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,destroy'><div id='lib:destroy,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:destroy,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> <span class='keyword'>void</span> destroy<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.resumption-4'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.resumption-4'>4</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5482'>#</a></div><div class='texpara'><div id='coroutine.handle.resumption-4.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span> refers to a suspended coroutine<a class='hidden_link' href='#coroutine.handle.resumption-4.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.resumption-5'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.resumption-5'>5</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5486'>#</a></div><div class='texpara'><div id='coroutine.handle.resumption-5.sentence-1' class='sentence'><i >Effects</i>: Destroys the coroutine (<a href='dcl.fct.def.coroutine' title='9.5.4&emsp;Coroutine definitions'>[dcl.<span class='shy'></span>fct.<span class='shy'></span>def.<span class='shy'></span>coroutine]</a>)<a class='hidden_link' href='#coroutine.handle.resumption-5.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.promise' class='section'><h4 ><a class='secnum' href='#coroutine.handle.promise' style='min-width:95pt'>17.12.4.7</a> Promise access <a class='abbr_ref' href='coroutine.handle.promise'>[coroutine.handle.promise]</a></h4><div class='texpara'><div id='lib:coroutine_handle,promise'><div id='lib:promise,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:promise,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> Promise<span class='operator'>&amp;</span> promise<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.promise-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.promise-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5499'>#</a></div><div class='texpara'><div id='coroutine.handle.promise-1.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span> refers to a coroutine<a class='hidden_link' href='#coroutine.handle.promise-1.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.promise-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.promise-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5503'>#</a></div><div class='texpara'><div id='coroutine.handle.promise-2.sentence-1' class='sentence'><i >Returns</i>: A reference to the promise of the coroutine<a class='hidden_link' href='#coroutine.handle.promise-2.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.compare' class='section'><h4 ><a class='secnum' href='#coroutine.handle.compare' style='min-width:95pt'>17.12.4.8</a> Comparison operators <a class='abbr_ref' href='coroutine.handle.compare'>[coroutine.handle.compare]</a></h4><div class='texpara'><div id='lib:coroutine_handle,operator!='><div id='lib:operator!=,coroutine_handle'><div id='lib:coroutine_handle,operator=='><div id='lib:operator==,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator==,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>bool</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='operator'>=</span><span class='parenthesis'>(</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> x, coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> y<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div></div></div><div class='para' id='coroutine.handle.compare-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.compare-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5517'>#</a></div><div class='texpara'><div id='coroutine.handle.compare-1.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'>x<span class='operator'>.</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span><span class='operator'>=</span> y<span class='operator'>.</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span><a class='hidden_link' href='#coroutine.handle.compare-1.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle,operator<=>'><div id='lib:operator<=>,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator%3c=%3e,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> strong_ordering <span class='keyword'>operator</span><span class='anglebracket'>&lt;</span><span class='operator'>=</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> x, coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span> y<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.compare-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.compare-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5528'>#</a></div><div class='texpara'><div id='coroutine.handle.compare-2.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'>compare_<span class='shy'></span>three_<span class='shy'></span>way<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span>x<span class='operator'>.</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span>, y<span class='operator'>.</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span></span><a class='hidden_link' href='#coroutine.handle.compare-2.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.hash' class='section'><h4 ><a class='secnum' href='#coroutine.handle.hash' style='min-width:95pt'>17.12.4.9</a> Hash support <a class='abbr_ref' href='coroutine.handle.hash'>[coroutine.handle.hash]</a></h4><div class='texpara'><div id='lib:coroutine_handle,hash'><div id='lib:hash,coroutine_handle'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:hash,coroutine_handle'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> P<span class='anglebracket'>&gt;</span> <span class='keyword'>struct</span> hash<span class='anglebracket'>&lt;</span>coroutine_handle<span class='anglebracket'>&lt;</span>P<span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.hash-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.hash-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5541'>#</a></div><div class='texpara'><div id='coroutine.handle.hash-1.sentence-1' class='sentence'>The specialization is enabled (<a href='unord.hash' title='22.10.19&emsp;Class template hash'>[unord.<span class='shy'></span>hash]</a>)<a class='hidden_link' href='#coroutine.handle.hash-1.sentence-1'>.</a></div></div></div></div></div></div><div id='coroutine.noop' class='section'><h3 ><a class='secnum' href='#coroutine.noop' style='min-width:80pt'>17.12.5</a> No-op coroutines <a class='abbr_ref' href='coroutine.noop'>[coroutine.noop]</a></h3><div id='coroutine.promise.noop' class='section'><h4 ><a class='secnum' href='#coroutine.promise.noop' style='min-width:95pt'>17.12.5.1</a> Class <span class='texttt'>noop_<span class='shy'></span>coroutine_<span class='shy'></span>promise</span> <a class='abbr_ref' href='coroutine.promise.noop'>[coroutine.promise.noop]</a></h4><div class='texpara'><div id='lib:noop_coroutine_promise'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:noop_coroutine_promise'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>struct</span> noop_coroutine_promise <span class='curlybracket'>{</span><span class='curlybracket'>}</span>;
</code></div></div></div><div class='para' id='coroutine.promise.noop-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.promise.noop-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5555'>#</a></div><div class='texpara'><div id='coroutine.promise.noop-1.sentence-1' class='sentence'>The class <span class='texttt'>noop_<span class='shy'></span>coroutine_<span class='shy'></span>promise</span> defines the promise type for
the coroutine referred to
by <span class='texttt'>noop_<span class='shy'></span>coroutine_<span class='shy'></span>handle</span> (<a href='#coroutine.syn' title='17.12.2&emsp;Header &lt;coroutine&gt; synopsis'>[coroutine.<span class='shy'></span>syn]</a>)<a class='hidden_link' href='#coroutine.promise.noop-1.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.noop' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop' style='min-width:95pt'>17.12.5.2</a> Class <span class='texttt'>coroutine_<span class='shy'></span>handle&lt;noop_<span class='shy'></span>coroutine_<span class='shy'></span>promise&gt;</span> <a class='abbr_ref' href='coroutine.handle.noop'>[coroutine.handle.noop]</a></h4><div id='coroutine.handle.noop.general' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop.general' style='min-width:110pt'>17.12.5.2.1</a> General <a class='abbr_ref' href='coroutine.handle.noop.general'>[coroutine.handle.noop.general]</a></h4><div class='texpara'><span id='lib:coroutine_handle<noop_coroutine_promise>'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span>
  <span class='keyword'>struct</span> coroutine_handle<span class='anglebracket'>&lt;</span>noop_coroutine_promise<span class='anglebracket'>&gt;</span>
  <span class='curlybracket'>{</span>
    <span class='comment'>// <a href='#coroutine.handle.noop.conv' title='17.12.5.2.2&emsp;Conversion'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>noop.<span class='shy'></span>conv]</a>, conversion</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>operator</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.noop.observers' title='17.12.5.2.3&emsp;Observers'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>noop.<span class='shy'></span>observers]</a>, observers</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>explicit</span> <span class='keyword'>operator</span> <span class='keyword'>bool</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>constexpr</span> <span class='keyword'>bool</span> done<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.noop.resumption' title='17.12.5.2.4&emsp;Resumption'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>noop.<span class='shy'></span>resumption]</a>, resumption</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> destroy<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.noop.promise' title='17.12.5.2.5&emsp;Promise access'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>noop.<span class='shy'></span>promise]</a>, promise access</span>
    <span class='keyword added'>constexpr</span> noop_coroutine_promise<span class='operator'>&amp;</span> promise<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;

    <span class='comment'>// <a href='#coroutine.handle.noop.address' title='17.12.5.2.6&emsp;Address'>[coroutine.<span class='shy'></span>handle.<span class='shy'></span>noop.<span class='shy'></span>address]</a>, address</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
  <span class='keyword'>private</span><span class='operator'>:</span>
    <span class='keyword added'>constexpr</span> coroutine_handle<span class='parenthesis'>(</span><i ><span class='texttt'>unspecified</span></i><span class='parenthesis'>)</span>;
    <span class='keyword'>void</span><span class='operator'>*</span> ptr;  <span class='comment'>// <i >exposition only</i></span>
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></div></div><div id='coroutine.handle.noop.conv' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop.conv' style='min-width:110pt'>17.12.5.2.2</a> Conversion <a class='abbr_ref' href='coroutine.handle.noop.conv'>[coroutine.handle.noop.conv]</a></h4><div class='texpara'><div id='lib:coroutine_handle<noop_coroutine_promise>,operator_coroutine_handle<>'><div id='lib:operator_coroutine_handle<>,coroutine_handle<noop_coroutine_promise>'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator_coroutine_handle%3c%3e,coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>operator</span> coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.noop.conv-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.conv-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5603'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.conv-1.sentence-1' class='sentence'><i >Effects</i>: Equivalent to: <span class='texttt'><span class='keyword'>return</span> coroutine_<span class='shy'></span>handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='operator'>&#x200b;::&#x200b;</span>from_<span class='shy'></span>address<span class='parenthesis'>(</span>address<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>;</span></div></div></div></div></div><div id='coroutine.handle.noop.observers' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop.observers' style='min-width:110pt'>17.12.5.2.3</a> Observers <a class='abbr_ref' href='coroutine.handle.noop.observers'>[coroutine.handle.noop.observers]</a></h4><div class='texpara'><div id='lib:coroutine_handle<noop_coroutine_promise>,operator_bool'><div id='lib:operator_bool,coroutine_handle<noop_coroutine_promise>'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator_bool,coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>explicit</span> <span class='keyword'>operator</span> <span class='keyword'>bool</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.noop.observers-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.observers-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5616'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.observers-1.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='literal'>true</span></span><a class='hidden_link' href='#coroutine.handle.noop.observers-1.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:coroutine_handle<noop_coroutine_promise>,done'><div id='lib:done,coroutine_handle<noop_coroutine_promise>'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:done,coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>bool</span> done<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.noop.observers-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.observers-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5627'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.observers-2.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='literal'>false</span></span><a class='hidden_link' href='#coroutine.handle.noop.observers-2.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.noop.resumption' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop.resumption' style='min-width:110pt'>17.12.5.2.4</a> Resumption <a class='abbr_ref' href='coroutine.handle.noop.resumption'>[coroutine.handle.noop.resumption]</a></h4><div class='texpara'><div id='lib:coroutine_handle<noop_coroutine_promise>,destroy'><div id='lib:destroy,coroutine_handle<noop_coroutine_promise>'><div id='lib:coroutine_handle<noop_coroutine_promise>,resume'><div id='lib:resume,coroutine_handle<noop_coroutine_promise>'><div id='lib:coroutine_handle<noop_coroutine_promise>,operator()'><div id='lib:operator(),coroutine_handle<noop_coroutine_promise>'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator(),coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
<span class='keyword'>constexpr</span> <span class='keyword'>void</span> resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
<span class='keyword'>constexpr</span> <span class='keyword'>void</span> destroy<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div></div></div></div></div><div class='para' id='coroutine.handle.noop.resumption-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.resumption-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5644'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.resumption-1.sentence-1' class='sentence'><i >Effects</i>: None<a class='hidden_link' href='#coroutine.handle.noop.resumption-1.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.noop.resumption-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.resumption-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5648'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.resumption-2.sentence-1' class='sentence'><i >Remarks</i>: If <span class='texttt'>noop_<span class='shy'></span>coroutine_<span class='shy'></span>handle</span> is converted to <span class='texttt'>coroutine_<span class='shy'></span>handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span></span>,
calls to <span class='texttt'><span class='keyword'>operator</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span></span>, <span class='texttt'>resume</span> and <span class='texttt'>destroy</span> on that handle
will also have no observable effects<a class='hidden_link' href='#coroutine.handle.noop.resumption-2.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.noop.promise' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop.promise' style='min-width:110pt'>17.12.5.2.5</a> Promise access <a class='abbr_ref' href='coroutine.handle.noop.promise'>[coroutine.handle.noop.promise]</a></h4><div class='texpara'><div id='lib:coroutine_handle<noop_coroutine_promise>,promise'><div id='lib:promise,coroutine_handle<noop_coroutine_promise>'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:promise,coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> noop_coroutine_promise<span class='operator'>&amp;</span> promise<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.noop.promise-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.promise-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5663'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.promise-1.sentence-1' class='sentence'><i >Returns</i>: A reference to the promise object associated with this
coroutine handle<a class='hidden_link' href='#coroutine.handle.noop.promise-1.sentence-1'>.</a></div></div></div></div></div><div id='coroutine.handle.noop.address' class='section'><h4 ><a class='secnum' href='#coroutine.handle.noop.address' style='min-width:110pt'>17.12.5.2.6</a> Address <a class='abbr_ref' href='coroutine.handle.noop.address'>[coroutine.handle.noop.address]</a></h4><div class='texpara'><div id='lib:coroutine_handle<noop_coroutine_promise>,address'><div id='lib:address,coroutine_handle<noop_coroutine_promise>'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:address,coroutine_handle%3cnoop_coroutine_promise%3e'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> address<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='coroutine.handle.noop.address-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.address-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5677'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.address-1.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'>ptr</span><a class='hidden_link' href='#coroutine.handle.noop.address-1.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.handle.noop.address-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.handle.noop.address-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5681'>#</a></div><div class='texpara'><div id='coroutine.handle.noop.address-2.sentence-1' class='sentence'><i >Remarks</i>: A <span class='texttt'>noop_<span class='shy'></span>coroutine_<span class='shy'></span>handle</span>'s <span class='texttt'>ptr</span> is always a
non-null pointer value<a class='hidden_link' href='#coroutine.handle.noop.address-2.sentence-1'>.</a></div></div></div></div></div></div><div id='coroutine.noop.coroutine' class='section'><h4 ><a class='secnum' href='#coroutine.noop.coroutine' style='min-width:95pt'>17.12.5.3</a> Function <span class='texttt'>noop_<span class='shy'></span>coroutine</span> <a class='abbr_ref' href='coroutine.noop.coroutine'>[coroutine.noop.coroutine]</a></h4><div class='texpara'><div id='lib:noop_coroutine'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:noop_coroutine'>🔗</a></div><code class='itemdeclcode'><span class='keyword added'>constexpr</span> noop_coroutine_handle noop_coroutine<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div><div class='para' id='coroutine.noop.coroutine-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.noop.coroutine-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5695'>#</a></div><div class='texpara'><div id='coroutine.noop.coroutine-1.sentence-1' class='sentence'><i >Returns</i>: A handle to a coroutine that has no observable effects
when resumed or destroyed<a class='hidden_link' href='#coroutine.noop.coroutine-1.sentence-1'>.</a></div></div></div></div><div class='para' id='coroutine.noop.coroutine-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.noop.coroutine-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5700'>#</a></div><div class='texpara'><div id='coroutine.noop.coroutine-2.sentence-1' class='sentence'><i >Remarks</i>: A handle returned from <span class='texttt'>noop_<span class='shy'></span>coroutine</span> may or may not
compare equal to a handle returned from another invocation
of <span class='texttt'>noop_<span class='shy'></span>coroutine</span><a class='hidden_link' href='#coroutine.noop.coroutine-2.sentence-1'>.</a></div></div></div></div></div></div><div id='coroutine.trivial.awaitables' class='section'><h3 ><a class='secnum' href='#coroutine.trivial.awaitables' style='min-width:80pt'>17.12.6</a> Trivial awaitables <a class='abbr_ref' href='coroutine.trivial.awaitables'>[coroutine.trivial.awaitables]</a></h3><div class='texpara'><span id='lib:suspend_always,await_resume'><span id='lib:await_resume,suspend_always'><span id='lib:suspend_always,await_suspend'><span id='lib:await_suspend,suspend_always'><span id='lib:suspend_always,await_ready'><span id='lib:await_ready,suspend_always'><span id='lib:suspend_always'><span id='lib:suspend_never,await_resume'><span id='lib:await_resume,suspend_never'><span id='lib:suspend_never,await_suspend'><span id='lib:await_suspend,suspend_never'><span id='lib:suspend_never,await_ready'><span id='lib:await_ready,suspend_never'><span id='lib:suspend_never'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:suspend_never'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>struct</span> suspend_never <span class='curlybracket'>{</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>bool</span> await_ready<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='literal'>true</span>; <span class='curlybracket'>}</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> await_suspend<span class='parenthesis'>(</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> await_resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>
  <span class='curlybracket'>}</span>;
  <span class='keyword'>struct</span> suspend_always <span class='curlybracket'>{</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>bool</span> await_ready<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='literal'>false</span>; <span class='curlybracket'>}</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> await_suspend<span class='parenthesis'>(</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>
    <span class='keyword'>constexpr</span> <span class='keyword'>void</span> await_resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class='para nonNormativeOnly' id='coroutine.trivial.awaitables-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.trivial.awaitables-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/support.tex#L5732'>#</a></div><div class='texpara'><div id='coroutine.trivial.awaitables-note-1' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#coroutine.trivial.awaitables-note-1'>1</a></i>:&ensp;<div id='coroutine.trivial.awaitables-1.sentence-1' class='sentence'>The types <span class='texttt'>suspend_<span class='shy'></span>never</span> and <span class='texttt'>suspend_<span class='shy'></span>always</span> can be used
to indicate that an <a href='expr.await#nt:await-expression' title='7.6.2.4&emsp;Await&emsp;[expr.await]'><span id='ntref:await-expression'><span class='textsf'><i >await-expression</i></span></span></a> either never
suspends or always suspends, and in either case does not produce a value<a class='hidden_link' href='#coroutine.trivial.awaitables-1.sentence-1'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div></div>
    </div>
	</div>
  <h3 id="feature-test-macros"><a href="#feature-test-macros">Feature test macros</a></h3>
  <div class="wording">
  <h2><a href="http://eel.is/c++draft/cpp.predefined">15.11 Predefined macro names [cpp.predefined]</a></h2>
  <div class="description">
  <span class="added"><code>__cpp_constexpr_coroutines 2024??L</code></span>
  </div>
  <h2><a href="http://eel.is/c++draft/version.syn">17.3.2 Header &lt;version&gt; synopsis [version.syn]</a></h2>
  <div class="description">
  <span class="added"><code>#define __cpp_lib_constexpr_coroutines 2024??L // also in &lt;coroutine&gt;</code></span>
  </div>

  </div>
</div></div></article>
</div><script>
	hljs.addPlugin(mergeHTMLPlugin);
	hljs.highlightAll();
</script>
</body>
</html>
