Want to know more about our gum disease treatments? Or why maintaining healthy gums is so important? Download our FREE guide here!
Your Guide to Gum Disease

PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKiA8IVtDREFUQVsgKi8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy0tLS0tLSBKQVZBU0NSSVBUIEhPT0sgRlVOQ1RJT05TIEZPUiBHUkFWSVRZIEZPUk1TIC0tLS0tLS0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoICEgZ2Zvcm0gKSB7Cglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnZ2Zvcm1fbWFpbl9zY3JpcHRzX2xvYWRlZCcsIGZ1bmN0aW9uKCkgeyBnZm9ybS5zY3JpcHRzTG9hZGVkID0gdHJ1ZTsgfSApOwoJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2dmb3JtL3RoZW1lL3NjcmlwdHNfbG9hZGVkJywgZnVuY3Rpb24oKSB7IGdmb3JtLnRoZW1lU2NyaXB0c0xvYWRlZCA9IHRydWU7IH0gKTsKCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkgeyBnZm9ybS5kb21Mb2FkZWQgPSB0cnVlOyB9ICk7CgoJdmFyIGdmb3JtID0gewoJCWRvbUxvYWRlZDogZmFsc2UsCgkJc2NyaXB0c0xvYWRlZDogZmFsc2UsCgkJdGhlbWVTY3JpcHRzTG9hZGVkOiBmYWxzZSwKCQlpc0Zvcm1FZGl0b3I6ICgpID0+IHR5cGVvZiBJbml0aWFsaXplRWRpdG9yID09PSAnZnVuY3Rpb24nLAoKCQkvKioKCQkgKiBAZGVwcmVjYXRlZCAyLjkgdGhlIHVzZSBvZiBpbml0aWFsaXplT25Mb2FkZWQgaW4gdGhlIGZvcm0gZWRpdG9yIGNvbnRleHQgaXMgZGVwcmVjYXRlZC4KCQkgKiBAcmVtb3ZlLWluIDMuMSB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGNoZWNrIGZvciBnZm9ybS5pc0Zvcm1FZGl0b3IoKS4KCQkgKi8KCQljYWxsSWZMb2FkZWQ6IGZ1bmN0aW9uICggZm4gKSB7CgkJCWlmICggZ2Zvcm0uZG9tTG9hZGVkICYmIGdmb3JtLnNjcmlwdHNMb2FkZWQgJiYgKCBnZm9ybS50aGVtZVNjcmlwdHNMb2FkZWQgfHwgZ2Zvcm0uaXNGb3JtRWRpdG9yKCkgKSApIHsKCQkJCWlmICggZ2Zvcm0uaXNGb3JtRWRpdG9yKCkgKSB7CgkJCQkJY29uc29sZS53YXJuKCAnVGhlIHVzZSBvZiBnZm9ybS5pbml0aWFsaXplT25Mb2FkZWQoKSBpcyBkZXByZWNhdGVkIGluIHRoZSBmb3JtIGVkaXRvciBjb250ZXh0IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gR3Jhdml0eSBGb3JtcyAzLjEuJyApOwoJCQkJfQoJCQkJZm4oKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9LAoKCQkvKioKCQkgKiBDYWxsIGEgZnVuY3Rpb24gd2hlbiBhbGwgc2NyaXB0cyBhcmUgbG9hZGVkCgkJICoKCQkgKiBAcGFyYW0gZnVuY3Rpb24gZm4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbGwgc2NyaXB0cyBhcmUgbG9hZGVkCgkJICoKCQkgKiBAcmV0dXJucyB2b2lkCgkJICovCgkJaW5pdGlhbGl6ZU9uTG9hZGVkOiBmdW5jdGlvbiggZm4gKSB7CgkJCWlmICggISBnZm9ybS5jYWxsSWZMb2FkZWQoIGZuICkgKSB7CgkJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnZ2Zvcm1fbWFpbl9zY3JpcHRzX2xvYWRlZCcsICgpID0+IHsgZ2Zvcm0uc2NyaXB0c0xvYWRlZCA9IHRydWU7IGdmb3JtLmNhbGxJZkxvYWRlZCggZm4gKTsgfSApOwoJCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2dmb3JtL3RoZW1lL3NjcmlwdHNfbG9hZGVkJywgKCkgPT4geyBnZm9ybS50aGVtZVNjcmlwdHNMb2FkZWQgPSB0cnVlOyBnZm9ybS5jYWxsSWZMb2FkZWQoIGZuICk7IH0gKTsKCQkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnRE9NQ29udGVudExvYWRlZCcsICgpID0+IHsgZ2Zvcm0uZG9tTG9hZGVkID0gdHJ1ZTsgZ2Zvcm0uY2FsbElmTG9hZGVkKCBmbiApOyB9ICk7CgkJCX0KCQl9LAoKCQlob29rczogeyBhY3Rpb246IHt9LCBmaWx0ZXI6IHt9IH0sCgkJYWRkQWN0aW9uOiBmdW5jdGlvbiggYWN0aW9uLCBjYWxsYWJsZSwgcHJpb3JpdHksIHRhZyApIHsKCQkJZ2Zvcm0uYWRkSG9vayggJ2FjdGlvbicsIGFjdGlvbiwgY2FsbGFibGUsIHByaW9yaXR5LCB0YWcgKTsKCQl9LAoJCWFkZEZpbHRlcjogZnVuY3Rpb24oIGFjdGlvbiwgY2FsbGFibGUsIHByaW9yaXR5LCB0YWcgKSB7CgkJCWdmb3JtLmFkZEhvb2soICdmaWx0ZXInLCBhY3Rpb24sIGNhbGxhYmxlLCBwcmlvcml0eSwgdGFnICk7CgkJfSwKCQlkb0FjdGlvbjogZnVuY3Rpb24oIGFjdGlvbiApIHsKCQkJZ2Zvcm0uZG9Ib29rKCAnYWN0aW9uJywgYWN0aW9uLCBhcmd1bWVudHMgKTsKCQl9LAoJCWFwcGx5RmlsdGVyczogZnVuY3Rpb24oIGFjdGlvbiApIHsKCQkJcmV0dXJuIGdmb3JtLmRvSG9vayggJ2ZpbHRlcicsIGFjdGlvbiwgYXJndW1lbnRzICk7CgkJfSwKCQlyZW1vdmVBY3Rpb246IGZ1bmN0aW9uKCBhY3Rpb24sIHRhZyApIHsKCQkJZ2Zvcm0ucmVtb3ZlSG9vayggJ2FjdGlvbicsIGFjdGlvbiwgdGFnICk7CgkJfSwKCQlyZW1vdmVGaWx0ZXI6IGZ1bmN0aW9uKCBhY3Rpb24sIHByaW9yaXR5LCB0YWcgKSB7CgkJCWdmb3JtLnJlbW92ZUhvb2soICdmaWx0ZXInLCBhY3Rpb24sIHByaW9yaXR5LCB0YWcgKTsKCQl9LAoJCWFkZEhvb2s6IGZ1bmN0aW9uKCBob29rVHlwZSwgYWN0aW9uLCBjYWxsYWJsZSwgcHJpb3JpdHksIHRhZyApIHsKCQkJaWYgKCB1bmRlZmluZWQgPT0gZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0gKSB7CgkJCQlnZm9ybS5ob29rc1tob29rVHlwZV1bYWN0aW9uXSA9IFtdOwoJCQl9CgkJCXZhciBob29rcyA9IGdmb3JtLmhvb2tzW2hvb2tUeXBlXVthY3Rpb25dOwoJCQlpZiAoIHVuZGVmaW5lZCA9PSB0YWcgKSB7CgkJCQl0YWcgPSBhY3Rpb24gKyAnXycgKyBob29rcy5sZW5ndGg7CgkJCX0KCQkJaWYoIHByaW9yaXR5ID09IHVuZGVmaW5lZCApewoJCQkJcHJpb3JpdHkgPSAxMDsKCQkJfQoKCQkJZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0ucHVzaCggeyB0YWc6dGFnLCBjYWxsYWJsZTpjYWxsYWJsZSwgcHJpb3JpdHk6cHJpb3JpdHkgfSApOwoJCX0sCgkJZG9Ib29rOiBmdW5jdGlvbiggaG9va1R5cGUsIGFjdGlvbiwgYXJncyApIHsKCgkJCS8vIHNwbGljZSBhcmdzIGZyb20gb2JqZWN0IGludG8gYXJyYXkgYW5kIHJlbW92ZSBmaXJzdCBpbmRleCB3aGljaCBpcyB0aGUgaG9vayBuYW1lCgkJCWFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKTsKCgkJCWlmICggdW5kZWZpbmVkICE9IGdmb3JtLmhvb2tzW2hvb2tUeXBlXVthY3Rpb25dICkgewoJCQkJdmFyIGhvb2tzID0gZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0sIGhvb2s7CgkJCQkvL3NvcnQgYnkgcHJpb3JpdHkKCQkJCWhvb2tzLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVsicHJpb3JpdHkiXS1iWyJwcmlvcml0eSJdfSk7CgoJCQkJaG9va3MuZm9yRWFjaCggZnVuY3Rpb24oIGhvb2tJdGVtICkgewoJCQkJCWhvb2sgPSBob29rSXRlbS5jYWxsYWJsZTsKCgkJCQkJaWYodHlwZW9mIGhvb2sgIT0gJ2Z1bmN0aW9uJykKCQkJCQkJaG9vayA9IHdpbmRvd1tob29rXTsKCQkJCQlpZiAoICdhY3Rpb24nID09IGhvb2tUeXBlICkgewoJCQkJCQlob29rLmFwcGx5KG51bGwsIGFyZ3MpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWFyZ3NbMF0gPSBob29rLmFwcGx5KG51bGwsIGFyZ3MpOwoJCQkJCX0KCQkJCX0gKTsKCQkJfQoJCQlpZiAoICdmaWx0ZXInPT1ob29rVHlwZSApIHsKCQkJCXJldHVybiBhcmdzWzBdOwoJCQl9CgkJfSwKCQlyZW1vdmVIb29rOiBmdW5jdGlvbiggaG9va1R5cGUsIGFjdGlvbiwgcHJpb3JpdHksIHRhZyApIHsKCQkJaWYgKCB1bmRlZmluZWQgIT0gZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0gKSB7CgkJCQl2YXIgaG9va3MgPSBnZm9ybS5ob29rc1tob29rVHlwZV1bYWN0aW9uXTsKCQkJCWhvb2tzID0gaG9va3MuZmlsdGVyKCBmdW5jdGlvbihob29rLCBpbmRleCwgYXJyKSB7CgkJCQkJdmFyIHJlbW92ZUhvb2sgPSAodW5kZWZpbmVkPT10YWd8fHRhZz09aG9vay50YWcpICYmICh1bmRlZmluZWQ9PXByaW9yaXR5fHxwcmlvcml0eT09aG9vay5wcmlvcml0eSk7CgkJCQkJcmV0dXJuICFyZW1vdmVIb29rOwoJCQkJfSApOwoJCQkJZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0gPSBob29rczsKCQkJfQoJCX0KCX07Cn0KCi8qIF1dPiAqLwo8L3NjcmlwdD4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdnZl9icm93c2VyX2dlY2tvIGdmb3JtX3dyYXBwZXIgZ2Zvcm1fbGVnYWN5X21hcmt1cF93cmFwcGVyIGdmb3JtLXRoZW1lLS1uby1mcmFtZXdvcmsgY29udGFjdC1mb3Jtc193cmFwcGVyIGdwbGFjZWhvbGRlcl93cmFwcGVyJyBkYXRhLWZvcm0tdGhlbWU9J2xlZ2FjeScgZGF0YS1mb3JtLWluZGV4PScwJyBpZD0nZ2Zvcm1fd3JhcHBlcl8xMScgPjxkaXYgaWQ9J2dmXzExJyBjbGFzcz0nZ2Zvcm1fYW5jaG9yJyB0YWJpbmRleD0nLTEnPjwvZGl2Pjxmb3JtIG1ldGhvZD0ncG9zdCcgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YScgdGFyZ2V0PSdnZm9ybV9hamF4X2ZyYW1lXzExJyBpZD0nZ2Zvcm1fMTEnIGNsYXNzPSdjb250YWN0LWZvcm1zIGdwbGFjZWhvbGRlcicgYWN0aW9uPScvZG93bmxvYWRhYmxlLWZvcm1zLyNnZl8xMScgZGF0YS1mb3JtaWQ9JzExJyBub3ZhbGlkYXRlPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdnZm9ybS1ib2R5IGdmb3JtX2JvZHknPjx1bCBpZD0nZ2Zvcm1fZmllbGRzXzExJyBjbGFzcz0nZ2Zvcm1fZmllbGRzIHRvcF9sYWJlbCBmb3JtX3N1YmxhYmVsX2JlbG93IGRlc2NyaXB0aW9uX2JlbG93IHZhbGlkYXRpb25fYmVsb3cnPjxsaSBpZD0iZmllbGRfMTFfMTAiIGNsYXNzPSJnZmllbGQgZ2ZpZWxkLS10eXBlLXRleHQgZ2ZpZWxkX2NvbnRhaW5zX3JlcXVpcmVkIGZpZWxkX3N1YmxhYmVsX2JlbG93IGdmaWVsZC0tbm8tZGVzY3JpcHRpb24gZmllbGRfZGVzY3JpcHRpb25fYmVsb3cgaGlkZGVuX2xhYmVsIGZpZWxkX3ZhbGlkYXRpb25fYmVsb3cgZ2ZpZWxkX3Zpc2liaWxpdHlfdmlzaWJsZSIgIGRhdGEtanMtcmVsb2FkPSJmaWVsZF8xMV8xMCIgPjxsYWJlbCBjbGFzcz0nZ2ZpZWxkX2xhYmVsIGdmb3JtLWZpZWxkLWxhYmVsJyBmb3I9J2lucHV0XzExXzEwJz5Zb3VyIE5hbWU8c3BhbiBjbGFzcz0iZ2ZpZWxkX3JlcXVpcmVkIj48c3BhbiBjbGFzcz0iZ2ZpZWxkX3JlcXVpcmVkIGdmaWVsZF9yZXF1aXJlZF9hc3RlcmlzayI+Kjwvc3Bhbj48L3NwYW4+PC9sYWJlbD48ZGl2IGNsYXNzPSdnaW5wdXRfY29udGFpbmVyIGdpbnB1dF9jb250YWluZXJfdGV4dCc+PGlucHV0IG5hbWU9J2lucHV0XzEwJyBpZD0naW5wdXRfMTFfMTAnIHR5cGU9J3RleHQnIHZhbHVlPScnIGNsYXNzPSdsYXJnZScgICB0YWJpbmRleD0nNTAnIHBsYWNlaG9sZGVyPSdZb3VyIE5hbWUgKicgYXJpYS1yZXF1aXJlZD0idHJ1ZSIgYXJpYS1pbnZhbGlkPSJmYWxzZSIgICAvPjwvZGl2PjwvbGk+PGxpIGlkPSJmaWVsZF8xMV8zIiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS1lbWFpbCBnZmllbGRfY29udGFpbnNfcmVxdWlyZWQgZmllbGRfc3VibGFiZWxfYmVsb3cgZ2ZpZWxkLS1uby1kZXNjcmlwdGlvbiBmaWVsZF9kZXNjcmlwdGlvbl9iZWxvdyBoaWRkZW5fbGFiZWwgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgZGF0YS1qcy1yZWxvYWQ9ImZpZWxkXzExXzMiID48bGFiZWwgY2xhc3M9J2dmaWVsZF9sYWJlbCBnZm9ybS1maWVsZC1sYWJlbCcgZm9yPSdpbnB1dF8xMV8zJz5Zb3VyIEVtYWlsPHNwYW4gY2xhc3M9ImdmaWVsZF9yZXF1aXJlZCI+PHNwYW4gY2xhc3M9ImdmaWVsZF9yZXF1aXJlZCBnZmllbGRfcmVxdWlyZWRfYXN0ZXJpc2siPio8L3NwYW4+PC9zcGFuPjwvbGFiZWw+PGRpdiBjbGFzcz0nZ2lucHV0X2NvbnRhaW5lciBnaW5wdXRfY29udGFpbmVyX2VtYWlsJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSdpbnB1dF8zJyBpZD0naW5wdXRfMTFfMycgdHlwZT0nZW1haWwnIHZhbHVlPScnIGNsYXNzPSdsYXJnZScgdGFiaW5kZXg9JzUxJyAgcGxhY2Vob2xkZXI9J1lvdXIgRW1haWwgKicgYXJpYS1yZXF1aXJlZD0idHJ1ZSIgYXJpYS1pbnZhbGlkPSJmYWxzZSIgIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PjwvbGk+PGxpIGlkPSJmaWVsZF8xMV8xNyIgY2xhc3M9ImdmaWVsZCBnZmllbGQtLXR5cGUtaGlkZGVuIGdmb3JtX2hpZGRlbiBmaWVsZF9zdWJsYWJlbF9iZWxvdyBnZmllbGQtLW5vLWRlc2NyaXB0aW9uIGZpZWxkX2Rlc2NyaXB0aW9uX2JlbG93IGZpZWxkX3ZhbGlkYXRpb25fYmVsb3cgZ2ZpZWxkX3Zpc2liaWxpdHlfdmlzaWJsZSIgIGRhdGEtanMtcmVsb2FkPSJmaWVsZF8xMV8xNyIgPjxkaXYgY2xhc3M9J2dpbnB1dF9jb250YWluZXIgZ2lucHV0X2NvbnRhaW5lcl90ZXh0Jz48aW5wdXQgbmFtZT0naW5wdXRfMTcnIGlkPSdpbnB1dF8xMV8xNycgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyAgYXJpYS1pbnZhbGlkPSJmYWxzZSIgdmFsdWU9JzEyNDUnIC8+PC9kaXY+PC9saT48bGkgaWQ9ImZpZWxkXzExXzE1IiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS1oaWRkZW4gZ2Zvcm1faGlkZGVuIGZpZWxkX3N1YmxhYmVsX2JlbG93IGdmaWVsZC0tbm8tZGVzY3JpcHRpb24gZmllbGRfZGVzY3JpcHRpb25fYmVsb3cgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgZGF0YS1qcy1yZWxvYWQ9ImZpZWxkXzExXzE1IiA+PGRpdiBjbGFzcz0nZ2lucHV0X2NvbnRhaW5lciBnaW5wdXRfY29udGFpbmVyX3RleHQnPjxpbnB1dCBuYW1lPSdpbnB1dF8xNScgaWQ9J2lucHV0XzExXzE1JyB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nICBhcmlhLWludmFsaWQ9ImZhbHNlIiB2YWx1ZT0nR3VtIERpc2Vhc2UgR3VpZGUnIC8+PC9kaXY+PC9saT48bGkgaWQ9ImZpZWxkXzExXzE2IiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS1oaWRkZW4gZ2Zvcm1faGlkZGVuIGZpZWxkX3N1YmxhYmVsX2JlbG93IGdmaWVsZC0tbm8tZGVzY3JpcHRpb24gZmllbGRfZGVzY3JpcHRpb25fYmVsb3cgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgZGF0YS1qcy1yZWxvYWQ9ImZpZWxkXzExXzE2IiA+PGRpdiBjbGFzcz0nZ2lucHV0X2NvbnRhaW5lciBnaW5wdXRfY29udGFpbmVyX3RleHQnPjxpbnB1dCBuYW1lPSdpbnB1dF8xNicgaWQ9J2lucHV0XzExXzE2JyB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nICBhcmlhLWludmFsaWQ9ImZhbHNlIiB2YWx1ZT0nJyAvPjwvZGl2PjwvbGk+PGxpIGlkPSJmaWVsZF8xMV8xOCIgY2xhc3M9ImdmaWVsZCBnZmllbGQtLXR5cGUtaGlkZGVuIGdmb3JtX2hpZGRlbiBmaWVsZF9zdWJsYWJlbF9iZWxvdyBnZmllbGQtLW5vLWRlc2NyaXB0aW9uIGZpZWxkX2Rlc2NyaXB0aW9uX2JlbG93IGZpZWxkX3ZhbGlkYXRpb25fYmVsb3cgZ2ZpZWxkX3Zpc2liaWxpdHlfdmlzaWJsZSIgIGRhdGEtanMtcmVsb2FkPSJmaWVsZF8xMV8xOCIgPjxkaXYgY2xhc3M9J2dpbnB1dF9jb250YWluZXIgZ2lucHV0X2NvbnRhaW5lcl90ZXh0Jz48aW5wdXQgbmFtZT0naW5wdXRfMTgnIGlkPSdpbnB1dF8xMV8xOCcgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyAgYXJpYS1pbnZhbGlkPSJmYWxzZSIgdmFsdWU9JycgLz48L2Rpdj48L2xpPjxsaSBpZD0iZmllbGRfMTFfMjAiIGNsYXNzPSJnZmllbGQgZ2ZpZWxkLS10eXBlLWhpZGRlbiBnZm9ybV9oaWRkZW4gZmllbGRfc3VibGFiZWxfYmVsb3cgZ2ZpZWxkLS1uby1kZXNjcmlwdGlvbiBmaWVsZF9kZXNjcmlwdGlvbl9iZWxvdyBmaWVsZF92YWxpZGF0aW9uX2JlbG93IGdmaWVsZF92aXNpYmlsaXR5X3Zpc2libGUiICBkYXRhLWpzLXJlbG9hZD0iZmllbGRfMTFfMjAiID48ZGl2IGNsYXNzPSdnaW5wdXRfY29udGFpbmVyIGdpbnB1dF9jb250YWluZXJfdGV4dCc+PGlucHV0IG5hbWU9J2lucHV0XzIwJyBpZD0naW5wdXRfMTFfMjAnIHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgIGFyaWEtaW52YWxpZD0iZmFsc2UiIHZhbHVlPScnIC8+PC9kaXY+PC9saT48bGkgaWQ9ImZpZWxkXzExXzIxIiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS1ob25leXBvdCBnZm9ybV92YWxpZGF0aW9uX2NvbnRhaW5lciBmaWVsZF9zdWJsYWJlbF9iZWxvdyBnZmllbGQtLWhhcy1kZXNjcmlwdGlvbiBmaWVsZF9kZXNjcmlwdGlvbl9iZWxvdyBmaWVsZF92YWxpZGF0aW9uX2JlbG93IGdmaWVsZF92aXNpYmlsaXR5X3Zpc2libGUiICBkYXRhLWpzLXJlbG9hZD0iZmllbGRfMTFfMjEiID48bGFiZWwgY2xhc3M9J2dmaWVsZF9sYWJlbCBnZm9ybS1maWVsZC1sYWJlbCcgZm9yPSdpbnB1dF8xMV8yMSc+UGhvbmU8L2xhYmVsPjxkaXYgY2xhc3M9J2dpbnB1dF9jb250YWluZXInPjxpbnB1dCBuYW1lPSdpbnB1dF8yMScgaWQ9J2lucHV0XzExXzIxJyB0eXBlPSd0ZXh0JyB2YWx1ZT0nJyBhdXRvY29tcGxldGU9J25ldy1wYXNzd29yZCcvPjwvZGl2PjxkaXYgY2xhc3M9J2dmaWVsZF9kZXNjcmlwdGlvbicgaWQ9J2dmaWVsZF9kZXNjcmlwdGlvbl8xMV8yMSc+VGhpcyBmaWVsZCBpcyBmb3IgdmFsaWRhdGlvbiBwdXJwb3NlcyBhbmQgc2hvdWxkIGJlIGxlZnQgdW5jaGFuZ2VkLjwvZGl2PjwvbGk+PC91bD48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSdnZm9ybS1mb290ZXIgZ2Zvcm1fZm9vdGVyIHRvcF9sYWJlbCc+IAoJCTxkaXYgY2xhc3M9InNlY3Rpb24tYnV0dG9uIj4KCSAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGlkPSJnZm9ybV9zdWJtaXRfYnV0dG9uXzExIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5Ij4KCQkgICAgICAgIERvd25sb2FkIG5vdwoJCQk8L2J1dHRvbj4KCQk8L2Rpdj4KICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdnZm9ybV9hamF4JyB2YWx1ZT0nZm9ybV9pZD0xMSZhbXA7dGl0bGU9JmFtcDtkZXNjcmlwdGlvbj0mYW1wO3RhYmluZGV4PTUwJmFtcDt0aGVtZT1sZWdhY3kmYW1wO3N0eWxlcz1bXSZhbXA7aGFzaD1lMjgyZDZjM2Y5NjA2MzVkYzY3OGI2Nzg2MTdkNDQ3MCcgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nZ2Zvcm1fc3VibWlzc2lvbl9tZXRob2QnIGRhdGEtanM9J2dmb3JtX3N1Ym1pc3Npb25fbWV0aG9kXzExJyB2YWx1ZT0naWZyYW1lJyAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyBuYW1lPSdnZm9ybV90aGVtZScgZGF0YS1qcz0nZ2Zvcm1fdGhlbWVfMTEnIGlkPSdnZm9ybV90aGVtZV8xMScgdmFsdWU9J2xlZ2FjeScgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nZ2Zvcm1fc3R5bGVfc2V0dGluZ3MnIGRhdGEtanM9J2dmb3JtX3N0eWxlX3NldHRpbmdzXzExJyBpZD0nZ2Zvcm1fc3R5bGVfc2V0dGluZ3NfMTEnIHZhbHVlPSdbXScgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0naXNfc3VibWl0XzExJyB2YWx1ZT0nMScgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nZ2Zvcm1fc3VibWl0JyB2YWx1ZT0nMTEnIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyBuYW1lPSdnZm9ybV91bmlxdWVfaWQnIHZhbHVlPScnIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nIG5hbWU9J3N0YXRlXzExJyB2YWx1ZT0nV3lKYlhTSXNJbVUwTVdGbU0yUm1OREl3TW1RMk5tWXhPV0U0WkRNMk9UUXlObVk0WkdZMElsMD0nIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIGF1dG9jb21wbGV0ZT0nb2ZmJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyBuYW1lPSdnZm9ybV90YXJnZXRfcGFnZV9udW1iZXJfMTEnIGlkPSdnZm9ybV90YXJnZXRfcGFnZV9udW1iZXJfMTEnIHZhbHVlPScwJyAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBhdXRvY29tcGxldGU9J29mZicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nZ2Zvcm1fc291cmNlX3BhZ2VfbnVtYmVyXzExJyBpZD0nZ2Zvcm1fc291cmNlX3BhZ2VfbnVtYmVyXzExJyB2YWx1ZT0nMScgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nZ2Zvcm1fZmllbGRfdmFsdWVzJyB2YWx1ZT0nZWJvb2tfaWQ9MTI0NSZhbXA7ZWJvb2tfYWN0aXZlX2NhbXBhaWduX3RhZz1HdW0rRGlzZWFzZStHdWlkZScgLz4KICAgICAgICAgICAgCiAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgkJICAgICAgICAgICAgICAgIDxpZnJhbWUgc3R5bGU9J2Rpc3BsYXk6bm9uZTt3aWR0aDowcHg7aGVpZ2h0OjBweDsnIHNyYz0nYWJvdXQ6YmxhbmsnIG5hbWU9J2dmb3JtX2FqYXhfZnJhbWVfMTEnIGlkPSdnZm9ybV9hamF4X2ZyYW1lXzExJyB0aXRsZT0nVGhpcyBpZnJhbWUgY29udGFpbnMgdGhlIGxvZ2ljIHJlcXVpcmVkIHRvIGhhbmRsZSBBamF4IHBvd2VyZWQgR3Jhdml0eSBGb3Jtcy4nPjwvaWZyYW1lPgoJCSAgICAgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qIDwhW0NEQVRBWyAqLwogZ2Zvcm0uaW5pdGlhbGl6ZU9uTG9hZGVkKCBmdW5jdGlvbigpIHtnZm9ybUluaXRTcGlubmVyKCAxMSwgJ2h0dHBzOi8vcGFjaWZpY3BlcmlvLmNvbS5hdS93cC1jb250ZW50L3BsdWdpbnMvZ3Jhdml0eWZvcm1zL2ltYWdlcy9zcGlubmVyLnN2ZycsIHRydWUgKTtqUXVlcnkoJyNnZm9ybV9hamF4X2ZyYW1lXzExJykub24oJ2xvYWQnLGZ1bmN0aW9uKCl7dmFyIGNvbnRlbnRzID0galF1ZXJ5KHRoaXMpLmNvbnRlbnRzKCkuZmluZCgnKicpLmh0bWwoKTt2YXIgaXNfcG9zdGJhY2sgPSBjb250ZW50cy5pbmRleE9mKCdHRl9BSkFYX1BPU1RCQUNLJykgPj0gMDtpZighaXNfcG9zdGJhY2spe3JldHVybjt9dmFyIGZvcm1fY29udGVudCA9IGpRdWVyeSh0aGlzKS5jb250ZW50cygpLmZpbmQoJyNnZm9ybV93cmFwcGVyXzExJyk7dmFyIGlzX2NvbmZpcm1hdGlvbiA9IGpRdWVyeSh0aGlzKS5jb250ZW50cygpLmZpbmQoJyNnZm9ybV9jb25maXJtYXRpb25fd3JhcHBlcl8xMScpLmxlbmd0aCA+IDA7dmFyIGlzX3JlZGlyZWN0ID0gY29udGVudHMuaW5kZXhPZignZ2Zvcm1SZWRpcmVjdCgpeycpID49IDA7dmFyIGlzX2Zvcm0gPSBmb3JtX2NvbnRlbnQubGVuZ3RoID4gMCAmJiAhIGlzX3JlZGlyZWN0ICYmICEgaXNfY29uZmlybWF0aW9uO3ZhciBtdCA9IHBhcnNlSW50KGpRdWVyeSgnaHRtbCcpLmNzcygnbWFyZ2luLXRvcCcpLCAxMCkgKyBwYXJzZUludChqUXVlcnkoJ2JvZHknKS5jc3MoJ21hcmdpbi10b3AnKSwgMTApICsgMTAwO2lmKGlzX2Zvcm0pe2pRdWVyeSgnI2dmb3JtX3dyYXBwZXJfMTEnKS5odG1sKGZvcm1fY29udGVudC5odG1sKCkpO2lmKGZvcm1fY29udGVudC5oYXNDbGFzcygnZ2Zvcm1fdmFsaWRhdGlvbl9lcnJvcicpKXtqUXVlcnkoJyNnZm9ybV93cmFwcGVyXzExJykuYWRkQ2xhc3MoJ2dmb3JtX3ZhbGlkYXRpb25fZXJyb3InKTt9IGVsc2Uge2pRdWVyeSgnI2dmb3JtX3dyYXBwZXJfMTEnKS5yZW1vdmVDbGFzcygnZ2Zvcm1fdmFsaWRhdGlvbl9lcnJvcicpO31zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsgLyogZGVsYXkgdGhlIHNjcm9sbCBieSA1MCBtaWxsaXNlY29uZHMgdG8gZml4IGEgYnVnIGluIGNocm9tZSAqLyBqUXVlcnkoZG9jdW1lbnQpLnNjcm9sbFRvcChqUXVlcnkoJyNnZm9ybV93cmFwcGVyXzExJykub2Zmc2V0KCkudG9wIC0gbXQpOyB9LCA1MCApO2lmKHdpbmRvd1snZ2Zvcm1Jbml0RGF0ZXBpY2tlciddKSB7Z2Zvcm1Jbml0RGF0ZXBpY2tlcigpO31pZih3aW5kb3dbJ2dmb3JtSW5pdFByaWNlRmllbGRzJ10pIHtnZm9ybUluaXRQcmljZUZpZWxkcygpO312YXIgY3VycmVudF9wYWdlID0galF1ZXJ5KCcjZ2Zvcm1fc291cmNlX3BhZ2VfbnVtYmVyXzExJykudmFsKCk7Z2Zvcm1Jbml0U3Bpbm5lciggMTEsICdodHRwczovL3BhY2lmaWNwZXJpby5jb20uYXUvd3AtY29udGVudC9wbHVnaW5zL2dyYXZpdHlmb3Jtcy9pbWFnZXMvc3Bpbm5lci5zdmcnLCB0cnVlICk7alF1ZXJ5KGRvY3VtZW50KS50cmlnZ2VyKCdnZm9ybV9wYWdlX2xvYWRlZCcsIFsxMSwgY3VycmVudF9wYWdlXSk7d2luZG93WydnZl9zdWJtaXR0aW5nXzExJ10gPSBmYWxzZTt9ZWxzZSBpZighaXNfcmVkaXJlY3Qpe3ZhciBjb25maXJtYXRpb25fY29udGVudCA9IGpRdWVyeSh0aGlzKS5jb250ZW50cygpLmZpbmQoJy5HRl9BSkFYX1BPU1RCQUNLJykuaHRtbCgpO2lmKCFjb25maXJtYXRpb25fY29udGVudCl7Y29uZmlybWF0aW9uX2NvbnRlbnQgPSBjb250ZW50czt9alF1ZXJ5KCcjZ2Zvcm1fd3JhcHBlcl8xMScpLnJlcGxhY2VXaXRoKGNvbmZpcm1hdGlvbl9jb250ZW50KTtqUXVlcnkoZG9jdW1lbnQpLnNjcm9sbFRvcChqUXVlcnkoJyNnZl8xMScpLm9mZnNldCgpLnRvcCAtIG10KTtqUXVlcnkoZG9jdW1lbnQpLnRyaWdnZXIoJ2dmb3JtX2NvbmZpcm1hdGlvbl9sb2FkZWQnLCBbMTFdKTt3aW5kb3dbJ2dmX3N1Ym1pdHRpbmdfMTEnXSA9IGZhbHNlO3dwLmExMXkuc3BlYWsoalF1ZXJ5KCcjZ2Zvcm1fY29uZmlybWF0aW9uX21lc3NhZ2VfMTEnKS50ZXh0KCkpO31lbHNle2pRdWVyeSgnI2dmb3JtXzExJykuYXBwZW5kKGNvbnRlbnRzKTtpZih3aW5kb3dbJ2dmb3JtUmVkaXJlY3QnXSkge2dmb3JtUmVkaXJlY3QoKTt9fWpRdWVyeShkb2N1bWVudCkudHJpZ2dlcigiZ2Zvcm1fcHJlX3Bvc3RfcmVuZGVyIiwgW3sgZm9ybUlkOiAiMTEiLCBjdXJyZW50UGFnZTogImN1cnJlbnRfcGFnZSIsIGFib3J0OiBmdW5jdGlvbigpIHsgdGhpcy5wcmV2ZW50RGVmYXVsdCgpOyB9IH1dKTsgICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHsgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgIH0gICAgICAgIGNvbnN0IGdmb3JtV3JhcHBlckRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAiZ2Zvcm1fd3JhcHBlcl8xMSIgKTsgICAgICAgIGlmICggZ2Zvcm1XcmFwcGVyRGl2ICkgeyAgICAgICAgICAgIGNvbnN0IHZpc2liaWxpdHlTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggInNwYW4iICk7ICAgICAgICAgICAgdmlzaWJpbGl0eVNwYW4uaWQgPSAiZ2Zvcm1fdmlzaWJpbGl0eV90ZXN0XzExIjsgICAgICAgICAgICBnZm9ybVdyYXBwZXJEaXYuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCAiYWZ0ZXJlbmQiLCB2aXNpYmlsaXR5U3BhbiApOyAgICAgICAgfSAgICAgICAgY29uc3QgdmlzaWJpbGl0eVRlc3REaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggImdmb3JtX3Zpc2liaWxpdHlfdGVzdF8xMSIgKTsgICAgICAgIGxldCBwb3N0UmVuZGVyRmlyZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgZnVuY3Rpb24gdHJpZ2dlclBvc3RSZW5kZXIoKSB7ICAgICAgICAgICAgaWYgKCBwb3N0UmVuZGVyRmlyZWQgKSB7ICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICB9ICAgICAgICAgICAgcG9zdFJlbmRlckZpcmVkID0gdHJ1ZTsgICAgICAgICAgICBnZm9ybS5jb3JlLnRyaWdnZXJQb3N0UmVuZGVyRXZlbnRzKCAxMSwgY3VycmVudF9wYWdlICk7ICAgICAgICAgICAgaWYgKCB2aXNpYmlsaXR5VGVzdERpdiApIHsgICAgICAgICAgICAgICAgdmlzaWJpbGl0eVRlc3REaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdmlzaWJpbGl0eVRlc3REaXYgKTsgICAgICAgICAgICB9ICAgICAgICB9ICAgICAgICBmdW5jdGlvbiBkZWJvdW5jZSggZnVuYywgd2FpdCwgaW1tZWRpYXRlICkgeyAgICAgICAgICAgIHZhciB0aW1lb3V0OyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzOyAgICAgICAgICAgICAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHsgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgaWYgKCAhaW1tZWRpYXRlICkgZnVuYy5hcHBseSggY29udGV4dCwgYXJncyApOyAgICAgICAgICAgICAgICB9OyAgICAgICAgICAgICAgICB2YXIgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDsgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7ICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCBsYXRlciwgd2FpdCApOyAgICAgICAgICAgICAgICBpZiAoIGNhbGxOb3cgKSBmdW5jLmFwcGx5KCBjb250ZXh0LCBhcmdzICk7ICAgICAgICAgICAgfTsgICAgICAgIH0gICAgICAgIGNvbnN0IGRlYm91bmNlZFRyaWdnZXJQb3N0UmVuZGVyID0gZGVib3VuY2UoIGZ1bmN0aW9uKCkgeyAgICAgICAgICAgIHRyaWdnZXJQb3N0UmVuZGVyKCk7ICAgICAgICB9LCAyMDAgKTsgICAgICAgIGlmICggdmlzaWJpbGl0eVRlc3REaXYgJiYgdmlzaWJpbGl0eVRlc3REaXYub2Zmc2V0UGFyZW50ID09PSBudWxsICkgeyAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoICggbXV0YXRpb25zICkgPT4geyAgICAgICAgICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaCggKCBtdXRhdGlvbiApID0+IHsgICAgICAgICAgICAgICAgICAgIGlmICggbXV0YXRpb24udHlwZSA9PT0gJ2F0dHJpYnV0ZXMnICYmIHZpc2liaWxpdHlUZXN0RGl2Lm9mZnNldFBhcmVudCAhPT0gbnVsbCApIHsgICAgICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZWRUcmlnZ2VyUG9zdFJlbmRlcigpOyAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgfSk7ICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSggZG9jdW1lbnQuYm9keSwgeyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLCAgICAgICAgICAgICAgICBjaGlsZExpc3Q6IGZhbHNlLCAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLCAgICAgICAgICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsgJ3N0eWxlJywgJ2NsYXNzJyBdLCAgICAgICAgICAgIH0pOyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICB0cmlnZ2VyUG9zdFJlbmRlcigpOyAgICAgICAgfSAgICB9ICk7fSApOyAKLyogXV0+ICovCjwvc2NyaXB0Pgo=