@mnaoumov/obsidian-dev-toolkit 3.3.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -408,7 +408,7 @@ const CODE_BUTTON_FENCE_REG_EXP = /^\s*(?:```|~~~)\s*code-button\b/;
408
408
  const CODE_FENCE_REG_EXP = /^\s*(?:```|~~~)/;
409
409
  const DEFAULT_EXCLUDED_NOTES = ["README.md"];
410
410
  const DEFAULT_START_NOTE = "00 Start.md";
411
- const DEFAULT_TRY_IT_CODE_BUTTONS_SEVERITY = "warn";
411
+ const DEFAULT_TRY_IT_CODE_BUTTONS_SEVERITY = "error";
412
412
  const DOCS_LINK_REG_EXP = /^\s*\[Docs]\(/;
413
413
  const FRONTMATTER_REG_EXP = /^---\r?\n[\s\S]*?\r?\n---[^\S\n]*\r?\n?/;
414
414
  const H1_REG_EXP = /^# \S/;
@@ -712,4 +712,4 @@ function tryDecodeUriComponent(value) {
712
712
  DemoVaultCoverageChecker,
713
713
  registerDemoVaultCoverageSuite
714
714
  });
715
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTdGF0aWMgY292ZXJhZ2UvZnJlc2huZXNzIGNoZWNrcyB0aGF0IGtlZXAgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AgaW4gc3luYyB3aXRoIGl0cyBwdWJsaWMgc3VyZmFjZS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIFRoZXNlIGhlbHBlcnMgcmVmbGVjdCB0aGUgcmVhbFxuICogcHVibGljIEFQSS9jb25maWcvZG9jcyBzdHJhaWdodCBmcm9tIHNvdXJjZSBhbmQgYXNzZXJ0IOKAlCBXSVRIT1VUIGxhdW5jaGluZyBPYnNpZGlhbiDigJQgdGhhdCBldmVyeSBmZWF0dXJlIGlzXG4gKiBkZW1vbnN0cmF0ZWQgaW4gdGhlIG5vdGVzIGFuZCB0aGF0IHRoZSBub3RlcyByZWZlcmVuY2Ugbm8gQVBJIG1lbWJlciB0aGF0IG5vIGxvbmdlciBleGlzdHMgKHJlbmFtZSBkcmlmdCkuXG4gKiBUaGUgcnVudGltZSBiZWhhdmlvciBvZiB0aGUgcGx1Z2luIGlzIGNvdmVyZWQgYnkgaXRzIG90aGVyIGludGVncmF0aW9uIHRlc3RzLCBub3QgYnkgdGhlIGRlbW8gdmF1bHQ7IHRoZVxuICogdmF1bHQgaXMgYSBsZWFybmluZyByZXNvdXJjZSwgYW5kIHRoZXNlIGNoZWNrcyBvbmx5IGd1YXJkIHRoYXQgaXQgc3RheXMgdHJ1dGhmdWwuXG4gKlxuICogVGhleSBhbHNvIGd1YXJkIHRoZSB2YXVsdCdzIG93biBgLm9ic2lkaWFuL2FwcC5qc29uYDogdGhlIHNldHRpbmdzIGxpc3RlZCBpblxuICoge0BsaW5rIERFTU9fVkFVTFRfQVBQX0pTT05fU0VUVElOR1N9IGJlbG9uZyB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYCwgd2hpY2ggd3JpdGVzIHRoZW0gaW50byB0aGUgYXJjaGl2ZWRcbiAqIHZhdWx0IGF0IHJlbGVhc2UgdGltZSwgc28gYSB2YXVsdCB0aGF0IGNvbW1pdHMgYW55IG9mIHRoZW0gaXMga2VlcGluZyBhIHNlY29uZCBjb3B5IG5vdGhpbmcgcmVjb25jaWxlcy5cbiAqXG4gKiBUaGV5IGFsc28gZW5mb3JjZSB0aGUgZGVtby12YXVsdCBBVVRIT1JJTkcgY29udmVudGlvbiDigJQgZXZlcnkgbm90ZSBvcGVucyB3aXRoIGFuIGAjIEgxYCBhbmQgYSBwbGFpblxuICogcHJvc2UgcGFyYWdyYXBoLCBldmVyeSBub3RlIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBzdGFydCBub3RlLCBhbmQgbm8gbm90ZSB1c2VzIGEgYFtbd2lraWxpbmtdXWAgb3IgYVxuICogYFtEb2NzXSjigKYpYCBsaW5lLiBUaGVzZSBjaGVja3MgYXJlIHVuY29uZGl0aW9uYWw6IHRoZSBkZW1vIHZhdWx0IGlzIHRoZSBwdWJsaXNoZWQgZG9jdW1lbnRhdGlvbiwgcmVhZFxuICogaW4gT2JzaWRpYW4gQU5EIG9uIEdpdEh1YiAod2hlcmUgYSB3aWtpbGluayBkb2VzIG5vdCByZW5kZXIpLCBzbyBhIG5vdGUgdGhhdCBicmVha3MgdGhlIGNvbnZlbnRpb24gaXNcbiAqIGJyb2tlbiBmb3IgcmVhbCByZWFkZXJzLiBgYXV0aG9yaW5nYCBvbmx5IHR1bmVzIHRoZW0gKHdoaWNoIG5vdGUgaXMgdGhlIHN0YXJ0LCB3aGljaCBub3RlcyBzaXQgb3V0c2lkZVxuICogdGhlIGxlYXJuaW5nIHBhdGgpOyBpdCBjYW5ub3Qgc3dpdGNoIHRoZW0gb2ZmLlxuICpcbiAqIE9ubHkgYHJvb3RGb2xkZXJgIGlzIHJlcXVpcmVkLCBzbyBhIHBsdWdpbiB3aXRoIG5vIHNldHRpbmdzIGFuZCBubyBwdWJsaWMgQVBJIHRvIHJlZmxlY3QgcmVnaXN0ZXJzIHRoZVxuICogc3VpdGUgd2l0aCB0aGF0IGFsb25lIGFuZCBzdGlsbCBnZXRzIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayDigJQgdGhlIGNoZWNrcyBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGF0IHRoZVxuICogcGx1Z2luIGV4cG9zZXMuIEVhY2ggcmVmbGVjdGlvbiBzcGVjIChgY29uZmlnSW50ZXJmYWNlc2AsIGBpbnRlcmZhY2VzYCwgYG5vblRyaXZpYWxHdWFyZGApIGFkZHMgdGhlIGNoZWNrc1xuICogaXQgZGVzY3JpYmVzIHdoZW4gc3VwcGxpZWQuIFRoZSB2YXVsdCBpcyBndWFyZGVkIGFnYWluc3QgYmVpbmcgZW1wdHkgZWl0aGVyIHdheTogd2l0aCBubyBub3RlcyB0byByZWFkLFxuICogZXZlcnkgYXV0aG9yaW5nIGNoZWNrIHdvdWxkIHBhc3MgYnkgaGF2aW5nIG5vdGhpbmcgdG8gbG9vayBhdC5cbiAqXG4gKiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIG5vdGUgd2hvc2UgU1VCSkVDVCBpcyB0aGUgd2lraWxpbmsg4oCUIGFuIGVtYmVkIHNwZWxsaW5nIHRoZSByZWFkZXIgaXMgYmVpbmcgdGF1Z2h0XG4gKiB0byB0eXBlLCBhIGZyb250bWF0dGVyIHByb3BlcnR5IHZhbHVlIHRoYXQgZXhpc3RzIHRvIGNvbnRyYXN0IHdpdGggYSBNYXJrZG93biBsaW5rLCBhIGZpeHR1cmUgdGhhdCBtdXN0XG4gKiBrZWVwIHRoZSB3aWtpbGluayBhIGNvbW1hbmQgaXMgc3VwcG9zZWQgdG8gbGVhdmUgYWxvbmUsIGEgbGluayB0aGUgcmVhZGVyIGNsaWNrcyB3aGlsZSBpdCBzdGlsbCByZXNvbHZlc1xuICogdG8gbm90aGluZy4gU3VjaCBhIG5vdGUgc2F5cyBzbyBpdHNlbGYsIHN0YXRpbmcgd2h5LCBpbiBvbmUgb2YgdHdvIGZvcm1zIG1vZGVsbGVkIG9uIEVTTGludCdzLlxuICpcbiAqIFBlciBsaW5lIG9yIHBlciByZWdpb24sIHdyaXR0ZW4gYXMgYW4gSFRNTCBjb21tZW50IHNvIGl0IGlzIGludmlzaWJsZSBpbiBPYnNpZGlhbiBBTkQgb24gR2l0SHViIOKAlCB0aGVcbiAqIHNwZWxsaW5nIHRoZXNlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWA6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUtbmV4dC1saW5lIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0gQ2xpY2tpbmcgYSBsaW5rIHRvIGEgbm90ZSB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCBJUyB0aGUgZmVhdHVyZS4gLS0+XG4gKiAyLiBDbGljayB0aGlzIGxpbms6IFtbUHJvamVjdHMvRnJlc2ggaWRlYV1dLlxuICpcbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLSBUaGUgd2lraWxpbmsgZW1iZWQgaXMgdGhlIHN5bnRheCB0aGlzIG5vdGUgdGVhY2hlcy4gLS0+XG4gKiAhW1tiYXNpYy5odG1sfDQwMF1dXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1lbmFibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLT5cbiAqIGBgYFxuICpcbiAqIFBlciBub3RlLCBpbiB0aGUgbm90ZSdzIG93biBmcm9udG1hdHRlciDigJQgdGhlIG9ubHkgZm9ybSB0aGF0IGNhbiByZWFjaCBhIHdpa2lsaW5rIElOU0lERSBmcm9udG1hdHRlcixcbiAqIHdoZXJlIGEgY29tbWVudCBjYW5ub3QgZ286XG4gKlxuICogYGBgeWFtbFxuICogLS0tXG4gKiBvYnNpZGlhbi1kZXYtdXRpbHM6XG4gKiAgIGRlbW8tdmF1bHQtdmFsaWRhdGlvbjpcbiAqICAgICBhbGxvdy13aWtpbGlua3M6IFRoZSBgd2lraWxpbmtgIHByb3BlcnR5IHZhbHVlIGlzIHRoZSBjb250cmFzdCB0aGlzIG5vdGUgaXMgYnVpbHQgYXJvdW5kLlxuICogLS0tXG4gKiBgYGBcbiAqXG4gKiBFaXRoZXIgd2F5IHRoZSBkZWNsYXJhdGlvbiB0cmF2ZWxzIHdpdGggdGhlIG5vdGUgcmF0aGVyIHRoYW4gc2l0dGluZyBpbiBhIGxpc3Qgc29tZXdoZXJlIGVsc2UsIGl0IGNhcnJpZXNcbiAqIGl0cyBqdXN0aWZpY2F0aW9uLCBhbmQgaXQgZXhlbXB0cyBvbmx5IHRoZSBXSUtJTElOSyBjaGVjayDigJQgdGhlIEgxLCBwcm9zZSwgcmVhY2hhYmlsaXR5IGFuZCBgW0RvY3NdYFxuICogY2hlY2tzIHN0aWxsIGFwcGx5LiBBIGRlY2xhcmF0aW9uIHdpdGggbm8gcmVhc29uLCBvbmUgY292ZXJpbmcgbm8gd2lraWxpbmssIGEgcmVnaW9uIG5ldmVyIGVuYWJsZWQgYWdhaW4sXG4gKiBvciBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlIGFsbCBmYWlsOiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCB0aGF0IG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIG9yIHRoYXRcbiAqIHNpbGVudGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vIGV4ZW1wdGlvbiBhdCBhbGwuXG4gKlxuICogVGhleSBhbHNvIGNoZWNrIHRoYXQgZXZlcnkgYFRyeSBpdGAgc2VjdGlvbiDigJQgYSBoZWFkaW5nIG9mIGFueSBsZXZlbCBzdGFydGluZyBgVHJ5IGl0YCwgdXAgdG8gdGhlIG5leHRcbiAqIGhlYWRpbmcgb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwg4oCUIGhvbGRzIGEgYGNvZGUtYnV0dG9uYCB0aGF0IHBlcmZvcm1zIGl0cyBzZXR1cCwgYmVjYXVzZSBhIHJlYWRlclxuICogYXNrZWQgdG8gY29uZmlndXJlIHRoaW5ncyBieSBoYW5kIGlzIGEgcmVhZGVyIHRoZSBkZW1vIGxvc3QuIEEgc2VjdGlvbiB3aG9zZSBzdGVwcyByZWFsbHkgY2Fubm90IGJlXG4gKiBzY3JpcHRlZCBzYXlzIHNvIHdpdGggdGhlIHNhbWUgZGlyZWN0aXZlLCBuYW1pbmcgdGhlIGBkZW1vLXZhdWx0LXZhbGlkYXRpb24vdHJ5LWl0LWNvZGUtYnV0dG9uYCBydWxlIG9uXG4gKiB0aGUgaGVhZGluZywgYW5kIHdpdGggdGhlIHNhbWUgY2hlY2tzIG9uIHRoZSBkaXJlY3RpdmUgaXRzZWxmOlxuICpcbiAqIGBgYG1hcmtkb3duXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlLW5leHQtbGluZSBkZW1vLXZhdWx0LXZhbGlkYXRpb24vdHJ5LWl0LWNvZGUtYnV0dG9uIC0tIERyYWdnaW5nIGEgZmlsZSBpbiBmcm9tIG91dHNpZGUgT2JzaWRpYW4gY2Fubm90IGJlIHNjcmlwdGVkLiAtLT5cbiAqICMjIFRyeSBpdFxuICogYGBgXG4gKlxuICogVGhhdCBjaGVjayBzaGlwcyBhcyBhIHdhcm5pbmcgKHtAbGluayBEZW1vVmF1bHRBdXRob3JpbmdTcGVjLnRyeUl0Q29kZUJ1dHRvbnN9KSwgc28gYSB2YXVsdCB3cml0dGVuXG4gKiBiZWZvcmUgaXQgZXhpc3RlZCBrZWVwcyBwYXNzaW5nIHdoaWxlIGl0IGlzIGJyb3VnaHQgdXAgdG8gaXQuXG4gKlxuICogVHdvIGxheWVycyBhcmUgZXhwb3NlZDpcbiAqIC0ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0g4oCUIGEgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgdGhhdCByZWFkcyB0aGUgY29ycHVzLCBwYXJzZXMgaW50ZXJmYWNlIC9cbiAqICAgY2xhc3MgLyBlbnVtIG1lbWJlcnMgYW5kIGV4cG9ydGVkIGZ1bmN0aW9ucywgYW5kIHJldHVybnMgZGlhZ25vc3RpYyBhcnJheXMgKHdoYXQgaXMgdW5kZW1vbnN0cmF0ZWQgLyBzdGFsZVxuICogICAvIHVubGlua2VkIC8gb2ZmLWNvbnZlbnRpb24pLlxuICogLSB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfSDigJQgYSB0aGluIHdyYXBwZXIgdGhhdCByZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSBvdmVyIHRoZSBjb3JlLCBzb1xuICogICBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCBpcyBhIHNpbmdsZSBkZWNsYXJhdGl2ZSBjYWxsLlxuICovXG5cbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBkZXNjcmliZSxcbiAgZXhwZWN0LFxuICBpdFxufSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQge1xuICBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MsXG4gIHBhcnNlRGVtb1ZhdWx0QXBwSnNvblxufSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcblxuLyoqXG4gKiBUdW5lcyB0aGUgYWx3YXlzLW9uIGF1dGhvcmluZyBjaGVja3MuIEl0IGNhbm5vdCBkaXNhYmxlIHRoZW0g4oCUIHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRBdXRob3JpbmdTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlcyAocGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoYXQgc2l0IG91dHNpZGUgdGhlIGxlYXJuaW5nIHBhdGggYW5kIGFyZSB0aGVyZWZvcmVcbiAgICogZXhlbXB0IGZyb20gZXZlcnkgYXV0aG9yaW5nIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgdmF1bHQncyBvd24gYFJFQURNRS5tZGAsIHdoaWNoIGFkZHJlc3NlcyBzb21lb25lXG4gICAqIGJyb3dzaW5nIHRoZSByZXBvIG9uIEdpdEh1YiByYXRoZXIgdGhhbiBhIHJlYWRlciB3b3JraW5nIHRocm91Z2ggdGhlIHZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgZXZlcnkgb3RoZXIgbm90ZSBtdXN0IGJlIHJlYWNoYWJsZSBmcm9tLiBEZWZhdWx0cyB0b1xuICAgKiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnROb3RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgYSBgVHJ5IGl0YCBzZWN0aW9uIHdpdGggbm8gYGNvZGUtYnV0dG9uYCBhbmQgbm8gZGlyZWN0aXZlIGV4cGxhaW5pbmcgd2h5IGlzIHJlcG9ydGVkOiBgJ3dhcm4nYFxuICAgKiBwcmludHMgdGhlIHNlY3Rpb25zIGFuZCBwYXNzZXMsIGAnZXJyb3InYCBmYWlscyB0aGUgc3VpdGUuIERlZmF1bHRzIHRvIGAnd2FybidgLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJ5SXRDb2RlQnV0dG9ucz86IERlbW9WYXVsdENoZWNrU2V2ZXJpdHk7XG59XG5cbi8qKlxuICogSG93IGEgY2hlY2sgdGhhdCBpcyBiZWluZyBpbnRyb2R1Y2VkIGdyYWR1YWxseSByZXBvcnRzIHdoYXQgaXQgZmluZHM6IGAnd2FybidgIHByaW50cyBpdCBhbmQgcGFzc2VzLFxuICogYCdlcnJvcidgIGZhaWxzLlxuICovXG5leHBvcnQgdHlwZSBEZW1vVmF1bHRDaGVja1NldmVyaXR5ID0gJ2Vycm9yJyB8ICd3YXJuJztcblxuLyoqXG4gKiBSZWZsZWN0cyBhIGNvbmZpZyBpbnRlcmZhY2Ugd2hvc2Ugb3B0aW9ucyBhcmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb25maWdJbnRlcmZhY2VDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgd2hvc2UgcHJvcGVydGllcyBhcmUgdGhlIGNvbmZpZ1xuICAgKiBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJ9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlcyAocGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIGV4ZW1wdCBmcm9tIHRoZSBhdXRob3JpbmcgY2hlY2tzLiBEZWZhdWx0cyB0byB0aGVcbiAgICogdmF1bHQncyBvd24gYFJFQURNRS5tZGAuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZE5vdGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwbHVnaW4gcmVwbyByb290IOKAlCB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgYGRlbW8tdmF1bHQvYCBhbmQgdGhlIHNvdXJjZSBiZWluZ1xuICAgKiByZWZsZWN0ZWQuIENhbGxlcnMgdHlwaWNhbGx5IHBhc3MgYGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kU3RhbGVSZWZlcmVuY2VzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kU3RhbGVSZWZlcmVuY2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSByZWNlaXZlciB3aG9zZSBgYCBgJHtyZWNlaXZlcn0uPG1lbWJlcj5gIGBgIHJlZmVyZW5jZXMgYXJlIHNjYW5uZWQgZm9yIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtZW1iZXJzIHRoYXQgY3VycmVudGx5IGV4aXN0IG9uIHRoZSByZWNlaXZlcjsgYW55IHJlZmVyZW5jZWQgbWVtYmVyIG5vdCBpbiB0aGlzIHNldCBpcyBzdGFsZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkTWVtYmVyczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWVtYmVyIG5hbWVzIHRoYXQgbXVzdCBlYWNoIGFwcGVhciBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICByZWFkb25seSBtZW1iZXJzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hlbiBzZXQsIGEgbWVtYmVyIGlzIGRlbW9uc3RyYXRlZCBvbmx5IGlmIGBgIGAke3JlY2VpdmVyfS4ke21lbWJlcn1gIGBgIGFwcGVhcnMgKGUuZy4gYSBjb250ZXh0IG9iamVjdCdzXG4gICAqIG1ldGhvZHMpOyB3aGVuIGFic2VudCwgdGhlIGJhcmUgbWVtYmVyIG5hbWUgaXMgbG9va2VkIHVwIChlLmcuIGEgY29uZmlnIG9wdGlvbikuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kVW5saW5rZWRGZWF0dXJlRG9jc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVubGlua2VkRmVhdHVyZURvY3NQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRvY3MgZm9sZGVyIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSB0b3AtbGV2ZWwgYCoubWRgIGZpbGVzIGFyZSB0aGUgZmVhdHVyZSBkb2NzLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jc0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgdGhhdCBhcmUgTk9UIHBlci1mZWF0dXJlIHBhZ2VzIGFuZCBzbyBuZWVkIG5vIGxpbmtpbmcgZGVtbyBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uRmVhdHVyZURvY3M6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbnJlYWNoYWJsZU5vdGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5yZWFjaGFibGVOb3Rlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgdGhlIHdhbGsgc3RhcnRzIGZyb20sIGUuZy4gYDAwIFN0YXJ0Lm1kYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0Tm90ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSBgZXhwb3J0IGZ1bmN0aW9uYHMgYXJlIHBhcnNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRJbnRlcmZhY2VNZW1iZXJzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHRvIHBhcnNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBmZWF0dXJlLWRvYyBsaW5raW5nIGNoZWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIGRvY3MgZm9sZGVyIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSB0b3AtbGV2ZWwgYCoubWRgIGZpbGVzIGFyZSB0aGUgZmVhdHVyZSBkb2NzLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2MgYmFzZW5hbWVzICh3aXRob3V0IGAubWRgKSB0aGF0IGFyZSBOT1QgcGVyLWZlYXR1cmUgcGFnZXMgYW5kIHNvIG5lZWQgbm8gbGlua2luZyBkZW1vIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub25GZWF0dXJlRG9jczogc3RyaW5nW107XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBtb2R1bGUncyBleHBvcnRlZCBmdW5jdGlvbnMsIGVhY2ggZGVtb25zdHJhdGVkIGJ5IGl0cyBiYXJlIG5hbWUgaW4gdGhlIGRlbW8gY29ycHVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEZ1bmN0aW9uc0NvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBzaW5nbGUgaW50ZXJmYWNlJ3MgbWVtYmVycyBhbmQgZGVtb25zdHJhdGVzIHRoZW0gdmlhIGBgIGAke3JlY2VpdmVyfS48bWVtYmVyPmAgYGAgcmVmZXJlbmNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRJbnRlcmZhY2VDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgdG8gcmVmbGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZGVtb25zdHJhdGVkIG1lbWJlcnMgYXJlIHRoZSByZWZsZWN0ZWQgdHlwZSdzIG1ldGhvZHMgb3IgaXRzIHByb3BlcnRpZXMgKGVudW0gbWVtYmVycyBjb3VudCBhc1xuICAgKiBwcm9wZXJ0aWVzKS5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IERlbW9WYXVsdEludGVyZmFjZU1lbWJlcktpbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIHRoZSBub3RlcyBjYWxsIHRoZSBtZW1iZXJzIG9uIChlLmcuIGBjb2RlQnV0dG9uQ29udGV4dGApLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBpbnRlcmZhY2UncyBkZW1vbnN0cmF0ZWQgbWVtYmVycyBhcmUgaXRzIG1ldGhvZHMgb3IgaXRzIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlbW9WYXVsdEludGVyZmFjZU1lbWJlcktpbmQgPSAnbWV0aG9kcycgfCAncHJvcGVydGllcyc7XG5cbi8qKlxuICogQ29uZmlndXJlcyB0aGUgZ3VhcmQgdGhhdCB0aGUgcmVmbGVjdGVkIHN1cmZhY2UgaXMgbm9uLXRyaXZpYWwgKHByb3RlY3RzIGFnYWluc3QgYSBwYXJzaW5nIHJlZ3Jlc3Npb25cbiAqIHNpbGVudGx5IGVtcHR5aW5nIGV2ZXJ5IG90aGVyIGNoZWNrKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHROb25Ucml2aWFsR3VhcmRTcGVjIHtcbiAgLyoqXG4gICAqIEEgZGVtbyBub3RlIChwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSB0aGF0IG11c3QgYmUgcHJlc2VudC5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdERlbW9Ob3RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbWVtYmVyIHRoYXQgbXVzdCBiZSByZWZsZWN0ZWQgZnJvbSB7QGxpbmsgRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYy5pbnRlcmZhY2VOYW1lfS5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdE1lbWJlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB3aG9zZSBtZW1iZXJzIGFyZSByZS1wYXJzZWQgZm9yIHRoZVxuICAgKiBndWFyZC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgZGVtbyBub3RlLCBhcyByZWFkIGZyb20gdGhlIGRlbW8gdmF1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Tm90ZSB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZSdzIHJhdyBNYXJrZG93biBjb250ZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgZm9sZGVyLCBlLmcuIGAwMCBTdGFydC5tZGAuXG4gICAqL1xuICByZWFkb25seSByZWxhdGl2ZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGEgbm90ZSdzIGlubGluZSBgb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGXigKZgIGRpcmVjdGl2ZXMgYWxsb3csIHJ1bGUgYnkgcnVsZSwgYW5kIHdoYXQgaXMgd3Jvbmcgd2l0aFxuICogdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVTY2FuIHtcbiAgLyoqXG4gICAqIEZvciBlYWNoIHJ1bGUsIHRoZSB6ZXJvLWJhc2VkIGxpbmUgbnVtYmVycyBhIGRpcmVjdGl2ZSBleGVtcHRzIGZyb20gaXQuXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGU6IFJlYWRvbmx5TWFwPHN0cmluZywgUmVhZG9ubHlTZXQ8bnVtYmVyPj47XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUgbWlzdGFrZXMgZm91bmQsIGVhY2ggcGhyYXNlZCBmb3IgYSBmYWlsaW5nIGFzc2VydGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcnVubmluZyBzdGF0ZSBvZiBhIGRpcmVjdGl2ZSBzY2FuLCB0aHJlYWRlZCB0aHJvdWdoIHRoZSBwZXItbGluZSBoZWxwZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZVNjYW5TdGF0ZSB7XG4gIC8qKlxuICAgKiBGb3IgZWFjaCBydWxlLCB0aGUgbGluZXMgYSBkaXJlY3RpdmUgaGFzIGV4ZW1wdGVkIGZyb20gaXQgc28gZmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZExpbmVJbmRleGVzQnlSdWxlOiBNYXA8c3RyaW5nLCBTZXQ8bnVtYmVyPj47XG5cbiAgLyoqXG4gICAqIEZvciBlYWNoIHJ1bGUsIHRoZSByZWdpb24gY3VycmVudGx5IG9wZW4sIGFuZCB3aGV0aGVyIGl0IGhhcyBjb3ZlcmVkIGEgdGFyZ2V0IHlldC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZW5SZWdpb25zQnlSdWxlOiBNYXA8c3RyaW5nLCBPcGVuRGlyZWN0aXZlUmVnaW9uPjtcblxuICAvKipcbiAgICogRm9yIGVhY2ggcnVsZSwgdGhlIGxpbmUgYSBgZGlzYWJsZS1uZXh0LWxpbmVgIHdhcyByZWFkIG9uLCB3aGlsZSBpdCBzdGlsbCB3YWl0cyBmb3IgdGhlIGxpbmUgaXQgY292ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGVuZGluZ05leHRMaW5lSW5kZXhlc0J5UnVsZTogTWFwPHN0cmluZywgbnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGl2ZSBtaXN0YWtlcyBmb3VuZCBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEZvciBlYWNoIHJ1bGUsIHRoZSBsaW5lcyBvZiB0aGUgbm90ZSB0aGF0IGJyZWFrIGl0IOKAlCB0aGUgbGluZXMgYSBkaXJlY3RpdmUgZm9yIGl0IGhhcyB0byBjb3ZlciB0byBiZVxuICAgKiBkb2luZyBhbnkgd29yay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldExpbmVJbmRleGVzQnlSdWxlOiBSZWFkb25seU1hcDxzdHJpbmcsIFJlYWRvbmx5U2V0PG51bWJlcj4+O1xufVxuXG4vKipcbiAqIFRoZSBwYXJzZWQgbWVtYmVycyBvZiBhIHNvdXJjZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZmFjZU1lbWJlcnMge1xuICAvKipcbiAgICogRXZlcnkgbWVtYmVyIOKAlCB7QGxpbmsgSW50ZXJmYWNlTWVtYmVycy5tZXRob2RzfSBmb2xsb3dlZCBieSB7QGxpbmsgSW50ZXJmYWNlTWVtYmVycy5wcm9wZXJ0aWVzfS5cbiAgICovXG4gIHJlYWRvbmx5IGFsbDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgbWVtYmVycyAoZGVjbGFyZWQgYXMgYG5hbWUoLi4uKWApLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0aG9kczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBtZW1iZXJzIChkZWNsYXJlZCBhcyBgbmFtZT86IC4uLmApLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydGllczogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBub3RlIGxpbmUgcGFpcmVkIHdpdGggdGhlIGxpbmUgbnVtYmVyIGl0IGNhbWUgZnJvbSwgc28gYSBjaGVjayB0aGF0IHNraXBzIGZlbmNlZCBibG9ja3MgY2FuIHN0aWxsXG4gKiByZXBvcnQg4oCUIGFuZCBhbiBpbmxpbmUgZGlyZWN0aXZlIGNhbiBzdGlsbCBuYW1lIOKAlCB0aGUgbGluZSBhcyB0aGUgcmVhZGVyIHNlZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm90ZUxpbmUge1xuICAvKipcbiAgICogVGhlIHplcm8tYmFzZWQgbGluZSBudW1iZXIgd2l0aGluIHRoZSBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxpbmUncyByYXcgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGBkaXNhYmxlYCByZWdpb24gdGhhdCBoYXMgYmVlbiBvcGVuZWQgYW5kIG5vdCB5ZXQgZW5hYmxlZCBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuRGlyZWN0aXZlUmVnaW9uIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJlZ2lvbiBoYXMgY292ZXJlZCBhIGxpbmUgYnJlYWtpbmcgaXRzIHJ1bGUsIHdoaWNoIGlzIHdoYXQgc3RvcHMgaXQgYmVpbmcgcmVwb3J0ZWQgYXNcbiAgICogcG9pbnRsZXNzLlxuICAgKi9cbiAgaXNVc2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSB0aGUgcmVnaW9uIHdhcyBvcGVuZWQgb24uXG4gICAqL1xuICByZWFkb25seSBsaW5lSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIGBkaXNhYmxlYCByZWdpb24gdGhhdCBoYXMgYmVlbiBvcGVuZWQgYW5kIG5vdCB5ZXQgZW5hYmxlZCBhZ2Fpbi5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE9wZW5EaXJlY3RpdmVSZWdpb259OiB0aGUgZGlyZWN0aXZlcyBub3cgc2VydmUgbW9yZSB0aGFuIHRoZSB3aWtpbGluayBydWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5XaWtpbGlua0RpcmVjdGl2ZVJlZ2lvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSByZWdpb24gaGFzIGNvdmVyZWQgYSB3aWtpbGluaywgd2hpY2ggaXMgd2hhdCBzdG9wcyBpdCBiZWluZyByZXBvcnRlZCBhcyBwb2ludGxlc3MuXG4gICAqL1xuICBpc1VzZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIHRoZSByZWdpb24gd2FzIG9wZW5lZCBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmVJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVQYXJhbXMge1xuICAvKipcbiAgICogVHVuZXMgdGhlIGFsd2F5cy1vbiBhdXRob3JpbmcgY2hlY2tzLCBvciBgdW5kZWZpbmVkYCB0byB0YWtlIHRoZWlyIGRlZmF1bHRzLiBJdCBjYW5ub3QgZGlzYWJsZSB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaW5nPzogRGVtb1ZhdWx0QXV0aG9yaW5nU3BlYztcblxuICAvKipcbiAgICogVGhlIGNvbmZpZyBpbnRlcmZhY2VzIHdob3NlIG9wdGlvbnMgbXVzdCBlYWNoIGJlIGRlbW9uc3RyYXRlZCBieSB0aGVpciBiYXJlIG5hbWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlXG4gICAqIHBsdWdpbiBoYXMgbm8gc2V0dGluZ3MuXG4gICAqL1xuICByZWFkb25seSBjb25maWdJbnRlcmZhY2VzPzogRGVtb1ZhdWx0Q29uZmlnSW50ZXJmYWNlQ292ZXJhZ2VTcGVjW107XG5cbiAgLyoqXG4gICAqIFRoZSBmZWF0dXJlLWRvYyBsaW5raW5nIGNoZWNrLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwbHVnaW4gc2hpcHMgbm8gYGRvY3MvYCBmb2xkZXIuXG4gICAqL1xuICByZWFkb25seSBkb2NzPzogRGVtb1ZhdWx0RG9jc0NvdmVyYWdlU3BlYztcblxuICAvKipcbiAgICogVGhlIG1vZHVsZXMgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICAgKiBwbHVnaW4gZXhwb3NlcyBubyBzdWNoIG1vZHVsZSB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uTW9kdWxlcz86IERlbW9WYXVsdEZ1bmN0aW9uc0NvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJmYWNlcyB3aG9zZSBtZW1iZXJzIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgKGFuZCByZWZlcmVuY2VkIHdpdGhvdXQgZHJpZnQpLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gICAqIHRoZSBwbHVnaW4gZXhwb3NlcyBubyBwdWJsaWMgQVBJIHN1cmZhY2UgdG8gcmVmbGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZXM/OiBEZW1vVmF1bHRJbnRlcmZhY2VDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGd1YXJkIHRoYXQga2VlcHMgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIG5vbi10cml2aWFsLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vIHJlZmxlY3RlZCBzdXJmYWNlXG4gICAqIHRvIGd1YXJkLiBUaGUgdmF1bHQgaXMgY2hlY2tlZCBmb3IgYmVpbmcgbm9uLWVtcHR5IGVpdGhlciB3YXkuXG4gICAqL1xuICByZWFkb25seSBub25Ucml2aWFsR3VhcmQ/OiBEZW1vVmF1bHROb25Ucml2aWFsR3VhcmRTcGVjO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGx1Z2luIHJlcG8gcm9vdC4gQ2FsbGVycyB0eXBpY2FsbHkgcGFzcyBgZ2V0Um9vdEZvbGRlcigpID8/IHByb2Nlc3MuY3dkKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgYSBub3RlJ3MgaW5saW5lIGBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZeKApmAgZGlyZWN0aXZlcyBhbGxvdywgYW5kIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGVtLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgRGlyZWN0aXZlU2Nhbn06IHRoZSBkaXJlY3RpdmVzIG5vdyBzZXJ2ZSBtb3JlIHRoYW4gdGhlIHdpa2lsaW5rIHJ1bGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2lraWxpbmtEaXJlY3RpdmVTY2FuIHtcbiAgLyoqXG4gICAqIFRoZSB6ZXJvLWJhc2VkIGxpbmUgbnVtYmVycyBhIGRpcmVjdGl2ZSBhbGxvd3MgYSB3aWtpbGluayBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRMaW5lSW5kZXhlczogUmVhZG9ubHlTZXQ8bnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGl2ZSBtaXN0YWtlcyBmb3VuZCwgZWFjaCBwaHJhc2VkIGZvciBhIGZhaWxpbmcgYXNzZXJ0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBydW5uaW5nIHN0YXRlIG9mIGEgZGlyZWN0aXZlIHNjYW4sIHRocmVhZGVkIHRocm91Z2ggdGhlIHBlci1saW5lIGhlbHBlcnMuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBEaXJlY3RpdmVTY2FuU3RhdGV9OiB0aGUgZGlyZWN0aXZlcyBub3cgc2VydmUgbW9yZSB0aGFuIHRoZSB3aWtpbGluayBydWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpa2lsaW5rRGlyZWN0aXZlU2NhblN0YXRlIHtcbiAgLyoqXG4gICAqIFRoZSBsaW5lcyBhIGRpcmVjdGl2ZSBoYXMgYWxsb3dlZCBhIHdpa2lsaW5rIG9uIHNvIGZhci5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRMaW5lSW5kZXhlczogU2V0PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gY3VycmVudGx5IG9wZW4sIGFuZCB3aGV0aGVyIGl0IGhhcyBjb3ZlcmVkIGEgd2lraWxpbmsgeWV0LlxuICAgKi9cbiAgb3BlblJlZ2lvbjogbnVsbCB8IE9wZW5EaXJlY3RpdmVSZWdpb247XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGEgYGRpc2FibGUtbmV4dC1saW5lYCB3YXMgcmVhZCBvbiwgd2hpbGUgaXQgc3RpbGwgd2FpdHMgZm9yIHRoZSBsaW5lIGl0IGNvdmVycy5cbiAgICovXG4gIHBlbmRpbmdOZXh0TGluZUluZGV4OiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aXZlIG1pc3Rha2VzIGZvdW5kIHNvIGZhci5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIHRoZSBub3RlIHRoYXQgY2FycnkgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHdpa2lsaW5rTGluZUluZGV4ZXM6IFJlYWRvbmx5U2V0PG51bWJlcj47XG59XG5cbi8qKlxuICogQSBgVHJ5IGl0YCBzZWN0aW9uIGJlaW5nIHJlYWQsIGZyb20gaXRzIGhlYWRpbmcgdG8gdGhlIG5leHQgaGVhZGluZyBvZiB0aGUgc2FtZSBvciBhIGhpZ2hlciBsZXZlbC5cbiAqL1xuaW50ZXJmYWNlIFRyeUl0U2VjdGlvbiB7XG4gIGhhc0NvZGVCdXR0b246IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxldmVsOiBudW1iZXI7XG4gIHJlYWRvbmx5IGxpbmVJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgcGx1Z2luJ3MgcHVibGljIHN1cmZhY2UgZnJvbSBzb3VyY2UgYW5kIGNoZWNrcyBpdHMgaW4tcmVwbyBgZGVtby12YXVsdC9gIHN0YXlzIGluIHN5bmMgd2l0aCBpdC5cbiAqXG4gKiBFdmVyeSBtZXRob2QgaXMgYSBwdXJlIHF1ZXJ5IG92ZXIgZmlsZXMgdW5kZXIgdGhlIHJlcG8gcm9vdCAodGhlIGRlbW8gY29ycHVzIGlzIHJlYWQgb25jZSBhbmQgY2FjaGVkKSwgc29cbiAqIHRoZSBjaGVja2VyIGlzIHRyaXZpYWxseSB1bml0LXRlc3RhYmxlIGFnYWluc3QgYSBmaXh0dXJlIHJlcG8gYW5kIGNhcnJpZXMgbm8gdGVzdC1mcmFtZXdvcmsgZGVwZW5kZW5jeS5cbiAqL1xuZXhwb3J0IGNsYXNzIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlciB7XG4gIHByaXZhdGUgY2FjaGVkQ29ycHVzOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWROb3RlczogRGVtb1ZhdWx0Tm90ZVtdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVtb1ZhdWx0Rm9sZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhjbHVkZWROb3RlczogU2V0PHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2hlY2tlciByb290ZWQgYXQgYSBwbHVnaW4gcmVwby5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29uc3RydWN0b3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMucm9vdEZvbGRlciA9IHBhcmFtcy5yb290Rm9sZGVyO1xuICAgIHRoaXMuZGVtb1ZhdWx0Rm9sZGVyID0gam9pbih0aGlzLnJvb3RGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCk7XG4gICAgdGhpcy5leGNsdWRlZE5vdGVzID0gbmV3IFNldChwYXJhbXMuZXhjbHVkZWROb3RlcyA/PyBERUZBVUxUX0VYQ0xVREVEX05PVEVTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0cyB0aGUgZGVtbyBub3RlcyBhcyBwYXRocyByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBmb2xkZXIgKGZvciBhIG5vbi10cml2aWFsLXN1cmZhY2UgZ3VhcmQpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgZXZlcnkgYCoubWRgIG5vdGUgaW4gdGhlIGRlbW8gdmF1bHQuXG4gICAqL1xuICBwdWJsaWMgY29sbGVjdERlbW9Ob3RlUmVsYXRpdmVQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdE5vdGVzKCkubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIGNhY2hlcyBldmVyeSBkZW1vIG5vdGUgaW5kaXZpZHVhbGx5IOKAlCB0aGUgcGVyLW5vdGUgdmlldyB0aGUgYXV0aG9yaW5nIGNoZWNrcyB3b3JrIG9uLCBhc1xuICAgKiBvcHBvc2VkIHRvIHRoZSBjb25jYXRlbmF0ZWQge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5yZWFkQ29ycHVzfS5cbiAgICpcbiAgICogQHJldHVybnMgRXZlcnkgYCoubWRgIG5vdGUgaW4gdGhlIGRlbW8gdmF1bHQsIGV4Y2x1ZGVkIG9uZXMgaW5jbHVkZWQuXG4gICAqL1xuICBwdWJsaWMgY29sbGVjdE5vdGVzKCk6IERlbW9WYXVsdE5vdGVbXSB7XG4gICAgdGhpcy5jYWNoZWROb3RlcyA/Pz0gdGhpcy5jb2xsZWN0TWFya2Rvd25GaWxlcyh0aGlzLmRlbW9WYXVsdEZvbGRlcikubWFwKChmaWxlKSA9PiAoe1xuICAgICAgY29udGVudDogcmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpLFxuICAgICAgcmVsYXRpdmVQYXRoOiByZWxhdGl2ZSh0aGlzLmRlbW9WYXVsdEZvbGRlciwgZmlsZSlcbiAgICB9KSk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkTm90ZXM7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGAub2JzaWRpYW4vYXBwLmpzb25gIHNldHRpbmdzIHRoZSB2YXVsdCBjb21taXRzIHRoYXQgYG9ic2lkaWFuLWRldi11dGlsc2Agb3ducyBhbmQgd3JpdGVzXG4gICAqIGludG8gdGhlIGFyY2hpdmVkIHZhdWx0IGl0c2VsZi4gQSBjb21taXR0ZWQgb25lIGlzIGEgc2Vjb25kIGNvcHkgb2YgYSBzZXR0aW5nIG5vdGhpbmcgcmVjb25jaWxlcywgYW5kXG4gICAqIGl0IGlzIHRoZSBjb3B5IHRoYXQgZ29lcyBzdGFsZSDigJQgc28gdGhlIGNvbnZlbnRpb24gaXMgdGhhdCB0aGUgdmF1bHQgY29tbWl0cyBub25lIG9mIHRoZW0uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBuYW1lcyBvZiB0aGUgb3duZWQgc2V0dGluZ3MgdGhlIGNvbW1pdHRlZCBgYXBwLmpzb25gIHNldHMuIEEgdmF1bHQgdGhhdCBjb21taXRzIG5vXG4gICAqIGBhcHAuanNvbmAgYXQgYWxsIGlzIGZpbmUsIGFuZCB5aWVsZHMgbm9uZS5cbiAgICovXG4gIHB1YmxpYyBmaW5kQ29tbWl0dGVkQXBwSnNvblNldHRpbmdzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhcHBKc29uUGF0aCA9IGpvaW4odGhpcy5kZW1vVmF1bHRGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5BcHBKc29uKTtcbiAgICBjb25zdCBjb250ZW50ID0gZXhpc3RzU3luYyhhcHBKc29uUGF0aCkgPyByZWFkRmlsZVN5bmMoYXBwSnNvblBhdGgsICd1dGYtOCcpIDogbnVsbDtcbiAgICByZXR1cm4gZmluZE93bmVkRGVtb1ZhdWx0QXBwSnNvblNldHRpbmdzKHsgYXBwSnNvbjogcGFyc2VEZW1vVmF1bHRBcHBKc29uKHsgY29udGVudCwgcGF0aDogYXBwSnNvblBhdGggfSkgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgY2FycnlpbmcgYSBgW0RvY3NdKOKApilgIGxpbmsgbGluZS4gVGhlIG5vdGUgSVMgdGhlIGRvY3VtZW50YXRpb24sIHNvIGEgbGluZSBwb2ludGluZ1xuICAgKiBlbHNld2hlcmUgZm9yIHRoZSByZWFsIGV4cGxhbmF0aW9uIGlzIHRoZSBzaGFwZSB0aGlzIGNvbnZlbnRpb24gZXhpc3RzIHRvIHJlbW92ZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aERvY3NMaW5rcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+IGdldExpbmVzT3V0c2lkZUZlbmNlcyhub3RlLmNvbnRlbnQpLnNvbWUoKGxpbmUpID0+IERPQ1NfTElOS19SRUdfRVhQLnRlc3QobGluZSkpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHRoYXQgZG8gbm90IG9wZW4gd2l0aCBhbiBgIyBIMWAgKGZyb250bWF0dGVyIGFzaWRlKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aG91dEgxKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLmZpbHRlcigobm90ZSkgPT4gIWhhc0gxKG5vdGUuY29udGVudCkpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgd2l0aCBubyBwcm9zZSBwYXJhZ3JhcGggYmVmb3JlIHRoZWlyIGZpcnN0IGNvZGUgZmVuY2Ug4oCUIHRoZSAxLTMgc2VudGVuY2VzIHNheWluZyB3aGF0IHRoZVxuICAgKiBmZWF0dXJlIGRvZXMgYW5kIHdoeSBhIHJlYWRlciB3b3VsZCB3YW50IGl0LCB3aXRob3V0IHdoaWNoIHRoZSBub3RlIGlzIGEgYnV0dG9uIHdpdGggbm8gbGVzc29uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRob3V0SW50cm9Qcm9zZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+ICFoYXNJbnRyb1Byb3NlKG5vdGUuY29udGVudCkpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgd2hvc2UgZXhlbXB0aW9ucyBhcmUgbm90IGRvaW5nIGFueSB3b3JrIOKAlCBhIHdpa2lsaW5rIGFsbG93YW5jZSBvciBhbiBpbmxpbmUgZGlyZWN0aXZlIGZvclxuICAgKiBhbnkgcnVsZSBkZWNsYXJlZCB3aXRob3V0IGEgcmVhc29uLCBtaXNzcGVsbGVkLCBvciBjb3ZlcmluZyBub3RoaW5nIHRoYXQgYnJlYWtzIGl0cyBydWxlLiBBbGwgb2YgdGhlbVxuICAgKiBhcmUgZHJpZnQ6IGFuIGV4ZW1wdGlvbiBub2JvZHkgY2FuIGp1c3RpZnksIGFuZCBvbmUgbm90aGluZyBuZWVkcyBhbnkgbW9yZSwgd2hpY2ggd291bGQgZ28gb24gaGlkaW5nXG4gICAqIHRoZSBuZXh0IG1pc3Rha2Ugc29tZWJvZHkgbWFrZXMgYnkgYWNjaWRlbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIE9uZSBgPG5vdGU+OiA8cHJvYmxlbT5gIGVudHJ5IHBlciBwcm9ibGVtIGZvdW5kLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKS5mbGF0TWFwKChub3RlKSA9PiB7XG4gICAgICBjb25zdCBzY2FuID0gc2NhbkRpcmVjdGl2ZXMobm90ZS5jb250ZW50KTtcbiAgICAgIGNvbnN0IHByb2JsZW1zID0gWy4uLnNjYW4ucHJvYmxlbXNdO1xuICAgICAgY29uc3QgcmVhc29uID0gcmVhZFdpa2lsaW5rQWxsb3dhbmNlUmVhc29uKG5vdGUuY29udGVudCk7XG4gICAgICBpZiAocmVhc29uICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChyZWFzb24udHJpbSgpID09PSAnJykge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goJ2Egbm90ZS1sZXZlbCBhbGxvd2FuY2Ugd2l0aCBubyByZWFzb24nKTtcbiAgICAgICAgfSBlbHNlIGlmICghaGFzV2lraWxpbmsobm90ZS5jb250ZW50KSkge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goJ2Egbm90ZS1sZXZlbCBhbGxvd2FuY2UgY292ZXJpbmcgbm8gd2lraWxpbmsnKTtcbiAgICAgICAgfSBlbHNlIGlmIChnZXRBbGxvd2VkTGluZUluZGV4ZXMoc2NhbiwgV0lLSUxJTktfUlVMRSkuc2l6ZSA+IDApIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdpbmxpbmUgZGlyZWN0aXZlcyB0aGUgbm90ZS1sZXZlbCBhbGxvd2FuY2UgYWxyZWFkeSBjb3ZlcnMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2JsZW1zLm1hcCgocHJvYmxlbSkgPT4gYCR7bm90ZS5yZWxhdGl2ZVBhdGh9OiAke3Byb2JsZW19YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgdXNpbmcgYW4gT2JzaWRpYW4gYFtbd2lraWxpbmtdXWAgb3V0c2lkZSBhIGNvZGUgZmVuY2UuIFRoZSBkZW1vIHZhdWx0IGlzIGFsc28gcmVhZCBvblxuICAgKiBHaXRIdWIsIHdoZXJlIGEgd2lraWxpbmsgcmVuZGVycyBhcyBsaXRlcmFsIGJyYWNrZXRzIGFuZCBsZWFkcyBub3doZXJlLiBBIHdpa2lsaW5rIHNob3duIElOU0lERSBhXG4gICAqIGZlbmNlIGlzIHNhbXBsZSB0ZXh0LCBub3QgbmF2aWdhdGlvbiwgc28gZmVuY2VkIGJsb2NrcyBhcmUgc2tpcHBlZCwgYXMgaXMgYSBub3RlIHRoYXQgZGVjbGFyZXMgaW4gaXRzXG4gICAqIGZyb250bWF0dGVyIHdoeSBpdHMgd2lraWxpbmtzIGFyZSB0aGUgcG9pbnQg4oCUIHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aFdpa2lsaW5rcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihub3RlLmNvbnRlbnQpICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFsbG93ZWRMaW5lSW5kZXhlcyA9IGdldEFsbG93ZWRMaW5lSW5kZXhlcyhzY2FuRGlyZWN0aXZlcyhub3RlLmNvbnRlbnQpLCBXSUtJTElOS19SVUxFKTtcbiAgICAgICAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKG5vdGUuY29udGVudCkuc29tZSgobGluZUluZGV4KSA9PiAhYWxsb3dlZExpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbWVtYmVycyB0aGF0IHRoZSBkZW1vIG5vdGVzIHJlZmVyZW5jZSBvbiBhIHJlY2VpdmVyIGJ1dCB0aGF0IG5vIGxvbmdlciBleGlzdCBvbiBpdCAocmVuYW1lIGRyaWZ0KS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGluY3Qgc3RhbGUgbWVtYmVyIG5hbWVzIHJlZmVyZW5jZWQgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcHVibGljIGZpbmRTdGFsZVJlZmVyZW5jZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kU3RhbGVSZWZlcmVuY2VzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZhbGlkTWVtYmVycyA9IG5ldyBTZXQocGFyYW1zLnZhbGlkTWVtYmVycyk7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IFsuLi50aGlzLnJlYWRDb3JwdXMoKS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgJHtwYXJhbXMucmVjZWl2ZXJ9XFwuKD88bWVtYmVyPlxcdyspYCwgJ2cnKSldXG4gICAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21lbWJlcicpKTtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQocmVmZXJlbmNlZCldLmZpbHRlcigobWVtYmVyKSA9PiAhdmFsaWRNZW1iZXJzLmhhcyhtZW1iZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBgVHJ5IGl0YCBzZWN0aW9ucyB3aXRoIG5vIGBjb2RlLWJ1dHRvbmAgaW4gdGhlbS4gQSBgVHJ5IGl0YCBzZWN0aW9uIGlzIGEgaGVhZGluZyBvZiBhbnkgbGV2ZWxcbiAgICogc3RhcnRpbmcgYFRyeSBpdGAsIHVwIHRvIHRoZSBuZXh0IGhlYWRpbmcgb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWw7IHRoZSBzZXR1cCBpdCBhc2tzIGZvciBpc1xuICAgKiB3aGF0IGEgYnV0dG9uIGlzIGZvciwgc28gYSBzZWN0aW9uIHRoYXQgbGVhdmVzIHRoZSByZWFkZXIgdG8gZG8gaXQgYnkgaGFuZCBpcyB0aGUgc2hhcGUgdGhpcyBjaGVja1xuICAgKiByZWplY3RzLiBBIHNlY3Rpb24gd2hvc2UgaGVhZGluZyBhIGBkZW1vLXZhdWx0LXZhbGlkYXRpb24vdHJ5LWl0LWNvZGUtYnV0dG9uYCBkaXJlY3RpdmUgY292ZXJzIGhhc1xuICAgKiBzdGF0ZWQgd2h5IGl0IGNhbm5vdCBiZSBzY3JpcHRlZCwgYW5kIGlzIHNraXBwZWQg4oCUIHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAgICpcbiAgICogQHJldHVybnMgT25lIGA8bm90ZT46IGxpbmUgPG4+YCBlbnRyeSBwZXIgb2ZmZW5kaW5nIHNlY3Rpb24sIG5hbWluZyB0aGUgbGluZSBvZiBpdHMgaGVhZGluZy5cbiAgICovXG4gIHB1YmxpYyBmaW5kVHJ5SXRTZWN0aW9uc1dpdGhvdXRDb2RlQnV0dG9uKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKS5mbGF0TWFwKChub3RlKSA9PiB7XG4gICAgICBjb25zdCBhbGxvd2VkTGluZUluZGV4ZXMgPSBnZXRBbGxvd2VkTGluZUluZGV4ZXMoc2NhbkRpcmVjdGl2ZXMobm90ZS5jb250ZW50KSwgVFJZX0lUX1JVTEUpO1xuICAgICAgcmV0dXJuIGZpbmRUcnlJdExpbmVJbmRleGVzV2l0aG91dENvZGVCdXR0b24obm90ZS5jb250ZW50KVxuICAgICAgICAuZmlsdGVyKChsaW5lSW5kZXgpID0+ICFhbGxvd2VkTGluZUluZGV4ZXMuaGFzKGxpbmVJbmRleCkpXG4gICAgICAgIC5tYXAoKGxpbmVJbmRleCkgPT4gYCR7bm90ZS5yZWxhdGl2ZVBhdGh9OiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBtZW1iZXJzIHRoYXQgYXJlIG5vdCBkZW1vbnN0cmF0ZWQgYW55d2hlcmUgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBtZW1iZXIgbmFtZXMgd2l0aCBubyBkZW1vbnN0cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvcnB1cyA9IHRoaXMucmVhZENvcnB1cygpO1xuICAgIHJldHVybiBwYXJhbXMubWVtYmVycy5maWx0ZXIoKG1lbWJlcikgPT4ge1xuICAgICAgY29uc3QgbmVlZGxlID0gcGFyYW1zLnJlY2VpdmVyID09PSB1bmRlZmluZWQgPyBtZW1iZXIgOiBgJHtwYXJhbXMucmVjZWl2ZXJ9LiR7bWVtYmVyfWA7XG4gICAgICByZXR1cm4gIWNvcnB1cy5pbmNsdWRlcyhuZWVkbGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGZlYXR1cmUgZG9jcyB0aGF0IG5vIGRlbW8gbm90ZSBsaW5rcyB0by5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgZmVhdHVyZS1kb2MgYmFzZW5hbWVzICh3aXRob3V0IGAubWRgKSBub3QgbGlua2VkIGZyb20gYW55IGRlbW8gbm90ZS5cbiAgICovXG4gIHB1YmxpYyBmaW5kVW5saW5rZWRGZWF0dXJlRG9jcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5vbkZlYXR1cmVEb2NzID0gbmV3IFNldChwYXJhbXMubm9uRmVhdHVyZURvY3MpO1xuICAgIGNvbnN0IGZlYXR1cmVEb2NzID0gcmVhZGRpclN5bmMoam9pbih0aGlzLnJvb3RGb2xkZXIsIHBhcmFtcy5kb2NzRm9sZGVyKSlcbiAgICAgIC5maWx0ZXIoKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpKVxuICAgICAgLm1hcCgoZmlsZSkgPT4gZmlsZS5yZXBsYWNlKC9cXC5tZCQvLCAnJykpXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiAhbm9uRmVhdHVyZURvY3MuaGFzKG5hbWUpKTtcbiAgICBjb25zdCBsaW5rZWREb2NzID0gbmV3IFNldChcbiAgICAgIFsuLi50aGlzLnJlYWRDb3JwdXMoKS5tYXRjaEFsbCgvZG9jc1xcLyg/PGRvYz5bXFx3LV0rKVxcLm1kL2cpXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnZG9jJykpXG4gICAgKTtcbiAgICByZXR1cm4gZmVhdHVyZURvY3MuZmlsdGVyKChkb2MpID0+ICFsaW5rZWREb2NzLmhhcyhkb2MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB0aGF0IGNhbm5vdCBiZSByZWFjaGVkIGZyb20gdGhlIHN0YXJ0IG5vdGUgYnkgZm9sbG93aW5nIE1hcmtkb3duIGxpbmtzIGJldHdlZW4gbm90ZXMuXG4gICAqXG4gICAqIFRoZSB3YWxrIHN0YXJ0cyBhdCB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMuc3RhcnROb3RlfSBhbmQgZm9sbG93c1xuICAgKiBldmVyeSBgW1RleHRdKDwuL05OIE5hbWUubWQ+KWAgbGluayBvdXRzaWRlIGEgY29kZSBmZW5jZSwgdHJhbnNpdGl2ZWx5LiBBIG5vdGUgbm90aGluZyBsaW5rcyB0byBpc1xuICAgKiBvbmUgYSByZWFkZXIgY2FuIG9ubHkgZmluZCBieSBicm93c2luZyB0aGUgZmlsZSBsaXN0IOKAlCB3aGljaCBpcyBleGFjdGx5IHdoYXQgdGhlIGdyb3VwZWQgaW5kZXggaW4gdGhlXG4gICAqIHN0YXJ0IG5vdGUgaXMgbWVhbnQgdG8gcmVwbGFjZS4gV2hlbiB0aGUgc3RhcnQgbm90ZSBpdHNlbGYgaXMgbWlzc2luZywgRVZFUlkgbm90ZSBpcyB1bnJlYWNoYWJsZSxcbiAgICogYmVjYXVzZSB0aGVyZSBpcyBub3doZXJlIHRvIHN0YXJ0IGZyb20uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHdhbGsuXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgdW5yZWFjaGFibGUgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZFVucmVhY2hhYmxlTm90ZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5yZWFjaGFibGVOb3Rlc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBub3Rlc0J5UmVsYXRpdmVQYXRoID0gbmV3IE1hcCh0aGlzLmNvbGxlY3ROb3RlcygpLm1hcCgobm90ZSkgPT4gW25vdGUucmVsYXRpdmVQYXRoLCBub3RlXSkpO1xuICAgIGNvbnN0IHJlYWNoZWROb3RlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHBlbmRpbmdOb3RlcyA9IFtwYXJhbXMuc3RhcnROb3RlXTtcblxuICAgIHdoaWxlIChwZW5kaW5nTm90ZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm90ZVBhdGggPSBlbnN1cmVOb25OdWxsYWJsZShwZW5kaW5nTm90ZXMucG9wKCkpO1xuICAgICAgY29uc3Qgbm90ZSA9IG5vdGVzQnlSZWxhdGl2ZVBhdGguZ2V0KG5vdGVQYXRoKTtcbiAgICAgIGlmICghbm90ZSB8fCByZWFjaGVkTm90ZXMuaGFzKG5vdGVQYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlYWNoZWROb3Rlcy5hZGQobm90ZVBhdGgpO1xuICAgICAgcGVuZGluZ05vdGVzLnB1c2goLi4uY29sbGVjdE5vdGVMaW5rVGFyZ2V0cyhub3RlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKVxuICAgICAgLmZpbHRlcigobm90ZVBhdGgpID0+ICFyZWFjaGVkTm90ZXMuaGFzKG5vdGVQYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBuYW1lcyBvZiB0aGUgYGV4cG9ydCBmdW5jdGlvbmBzIChpbmNsdWRpbmcgYGFzeW5jYCBhbmQgZ2VuZXJhdG9yIGRlY2xhcmF0aW9ucykgaW4gYSBzb3VyY2UgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgZXhwb3J0ZWQgZnVuY3Rpb24gbmFtZXMgaW4gc291cmNlIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGdldEV4cG9ydGVkRnVuY3Rpb25OYW1lcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPSByZWFkRmlsZVN5bmMoam9pbih0aGlzLnJvb3RGb2xkZXIsIHBhcmFtcy5zb3VyY2VQYXRoKSwgJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIFsuLi5zb3VyY2UubWF0Y2hBbGwoL15leHBvcnQgKD86YXN5bmMgKT9mdW5jdGlvblxcKj8gKD88bmFtZT5cXHcrKS9nbSldXG4gICAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBtZW1iZXJzIG9mIGFuIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgZGVjbGFyZWQgaW4gYSBzb3VyY2UgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgcGFyc2VkIHtAbGluayBJbnRlcmZhY2VNZW1iZXJzfS5cbiAgICogQHRocm93cyBXaGVuIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgc291cmNlIGZpbGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0SW50ZXJmYWNlTWVtYmVycyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEludGVyZmFjZU1lbWJlcnNQYXJhbXMpOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgICBjb25zdCBzb3VyY2UgPSByZWFkRmlsZVN5bmMoam9pbih0aGlzLnJvb3RGb2xkZXIsIHBhcmFtcy5zb3VyY2VQYXRoKSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgZXhwb3J0ICg/PGtleXdvcmQ+aW50ZXJmYWNlfGNsYXNzfGVudW0pICR7cGFyYW1zLmludGVyZmFjZU5hbWV9XFxiW157XSpcXHsoPzxib2R5PltcXHNcXFNdKj8pXFxuXFx9YCkuZXhlYyhzb3VyY2UpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgaW50ZXJmYWNlICR7cGFyYW1zLmludGVyZmFjZU5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZU1lbWJlcnMoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2tleXdvcmQnKSwgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2JvZHknKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIGNhY2hlcyB0aGUgZGVtbyBjb3JwdXMg4oCUIGV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0IGpvaW5lZCBpbnRvIG9uZSBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjb25jYXRlbmF0ZWQgZGVtby1ub3RlIGNvbnRlbnRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRDb3JwdXMoKTogc3RyaW5nIHtcbiAgICB0aGlzLmNhY2hlZENvcnB1cyA/Pz0gdGhpcy5jb2xsZWN0Tm90ZXMoKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5jb250ZW50KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZENvcnB1cztcbiAgfVxuXG4gIC8vIFRoZSBub3RlcyB0aGUgYXV0aG9yaW5nIGNoZWNrcyBhcHBseSB0bzogZXZlcnkgbm90ZSBleGNlcHQgdGhlIG9uZXMgZGVjbGFyZWQgb3V0c2lkZSB0aGUgbGVhcm5pbmdcbiAgLy8gcGF0aCAodGhlIHZhdWx0J3Mgb3duIGBSRUFETUUubWRgIGJ5IGRlZmF1bHQpLlxuICBwcml2YXRlIGNvbGxlY3RDaGVja2FibGVOb3RlcygpOiBEZW1vVmF1bHROb3RlW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3ROb3RlcygpLmZpbHRlcigobm90ZSkgPT4gIXRoaXMuZXhjbHVkZWROb3Rlcy5oYXMobm90ZS5yZWxhdGl2ZVBhdGgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdE1hcmtkb3duRmlsZXMoZm9sZGVyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICAgIC8vIGByZWFkZGlyU3luY2AgcmV0dXJucyBlbnRyaWVzIGluIHRoZSBmaWxlIHN5c3RlbSdzIG93biBvcmRlcjogYnkgbmFtZSBvbiBOVEZTLCBidXQgYnkgaGFzaCBvbiBleHQ0LCBzb1xuICAgIC8vIHNvcnQgdGhlbSBzbyBldmVyeSBjaGVjayByZXBvcnRzIGl0cyBub3RlcyBpbiB0aGUgc2FtZSBvcmRlciBvbiBldmVyeSBwbGF0Zm9ybS5cbiAgICBjb25zdCBlbnRyaWVzID0gcmVhZGRpclN5bmMoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lLCAnZW4nKSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBpZiAoZW50cnkubmFtZSA9PT0gT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTm9kZU1vZHVsZXMgYXMgc3RyaW5nKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5jb2xsZWN0TWFya2Rvd25GaWxlcyhqb2luKGZvbGRlciwgZW50cnkubmFtZSkpKTtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goam9pbihmb2xkZXIsIGVudHJ5Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGB2aXRlc3RgIHN1aXRlIHRoYXQga2VlcHMgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AgaW4gc3luYyB3aXRoIGl0cyBwdWJsaWMgc3VyZmFjZS5cbiAqXG4gKiBDYWxsIGl0IG9uY2UgZnJvbSBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYDsgaXQgcmVnaXN0ZXJzIG9uZSB0ZXN0IHBlciBjaGVjayxcbiAqIGRlbGVnYXRpbmcgdG8ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZWNsYXJhdGl2ZSBjb3ZlcmFnZSBzcGVjaWZpY2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlKHBhcmFtczogUmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrZXIgPSBuZXcgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcz4oe1xuICAgIGV4Y2x1ZGVkTm90ZXM6IHBhcmFtcy5hdXRob3Jpbmc/LmV4Y2x1ZGVkTm90ZXMsXG4gICAgcm9vdEZvbGRlcjogcGFyYW1zLnJvb3RGb2xkZXJcbiAgfSkpO1xuICBjb25zdCBzdGFydE5vdGUgPSBwYXJhbXMuYXV0aG9yaW5nPy5zdGFydE5vdGUgPz8gREVGQVVMVF9TVEFSVF9OT1RFO1xuICBjb25zdCB0cnlJdENvZGVCdXR0b25zID0gcGFyYW1zLmF1dGhvcmluZz8udHJ5SXRDb2RlQnV0dG9ucyA/PyBERUZBVUxUX1RSWV9JVF9DT0RFX0JVVFRPTlNfU0VWRVJJVFk7XG5cbiAgZGVzY3JpYmUoJ2RlbW8tdmF1bHQgY292ZXJhZ2UnLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5pbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSAke3NwZWMua2luZH1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGNvbnN0IGRlbW9uc3RyYXRlZCA9IG1lbWJlcnNbc3BlYy5raW5kXTtcbiAgICAgICAgZXhwZWN0KGRlbW9uc3RyYXRlZC5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyh7IG1lbWJlcnM6IGRlbW9uc3RyYXRlZCwgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KGByZWZlcmVuY2VzIG5vICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBtZW1iZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kU3RhbGVSZWZlcmVuY2VzKHsgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIsIHZhbGlkTWVtYmVyczogbWVtYmVycy5hbGwgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5jb25maWdJbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBvcHRpb25gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChtZW1iZXJzLnByb3BlcnRpZXMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBtZW1iZXJzLnByb3BlcnRpZXMgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5mdW5jdGlvbk1vZHVsZXMgPz8gW10pIHtcbiAgICAgIGl0KGBkZW1vbnN0cmF0ZXMgZXZlcnkgZXhwb3J0ZWQgZnVuY3Rpb24gaW4gJHtzcGVjLnNvdXJjZVBhdGh9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gY2hlY2tlci5nZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChmdW5jdGlvbk5hbWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogZnVuY3Rpb25OYW1lcyB9KSkudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBkb2NzID0gcGFyYW1zLmRvY3M7XG4gICAgaWYgKGRvY3MpIHtcbiAgICAgIGl0KCdsaW5rcyBhIGRlbW8gbm90ZSBmb3IgZXZlcnkgZmVhdHVyZSBkb2MnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzKHsgZG9jc0ZvbGRlcjogZG9jcy5mb2xkZXIsIG5vbkZlYXR1cmVEb2NzOiBkb2NzLm5vbkZlYXR1cmVEb2NzIH0pKVxuICAgICAgICAgIC50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KCdvcGVucyBldmVyeSBub3RlIHdpdGggYW4gSDEnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRob3V0SDEoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnb3BlbnMgZXZlcnkgbm90ZSB3aXRoIGEgcHJvc2UgcGFyYWdyYXBoIGJlZm9yZSBpdHMgZmlyc3QgY29kZSBibG9jaycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhvdXRJbnRyb1Byb3NlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoYHJlYWNoZXMgZXZlcnkgbm90ZSBmcm9tICR7c3RhcnROb3RlfWAsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbnJlYWNoYWJsZU5vdGVzKHsgc3RhcnROb3RlIH0pKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIG5vIHdpa2lsaW5rcywgd2hpY2ggZG8gbm90IHJlbmRlciBvbiBHaXRIdWInLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoV2lraWxpbmtzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2p1c3RpZmllcyBldmVyeSB3aWtpbGluayBhbGxvd2FuY2UgYW5kIGRpcmVjdGl2ZSwgYW5kIGRlY2xhcmVzIG5vbmUgaXQgbm8gbG9uZ2VyIG5lZWRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aFVuanVzdGlmaWVkV2lraWxpbmtBbGxvd2FuY2UoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZ2l2ZXMgZXZlcnkgVHJ5IGl0IHNlY3Rpb24gYSBjb2RlIGJ1dHRvbiwgb3IgYSBzdGF0ZWQgcmVhc29uIGl0IGhhcyBub25lJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjaGVja2VyLmZpbmRUcnlJdFNlY3Rpb25zV2l0aG91dENvZGVCdXR0b24oKTtcbiAgICAgIGlmICh0cnlJdENvZGVCdXR0b25zID09PSAnZXJyb3InKSB7XG4gICAgICAgIGV4cGVjdChzZWN0aW9ucykudG9FcXVhbChbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihmb3JtYXRUcnlJdFdhcm5pbmcoc2VjdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdjYXJyaWVzIG5vIERvY3MgbGluayBsaW5lLCBiZWNhdXNlIHRoZSBub3RlIGlzIHRoZSBkb2NzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aERvY3NMaW5rcygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb21taXRzIG5vbmUgb2YgdGhlIGFwcC5qc29uIHNldHRpbmdzIG9ic2lkaWFuLWRldi11dGlscyBpbmplY3RzIGF0IHJlbGVhc2UgdGltZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRDb21taXR0ZWRBcHBKc29uU2V0dGluZ3MoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICAvLyBXaXRoIG5vIG5vdGVzIHRvIHJlYWQsIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayBhYm92ZSBwYXNzZXMgYnkgaGF2aW5nIG5vdGhpbmcgdG8gbG9vayBhdCwgc28gYSB2YXVsdFxuICAgIC8vIHRoYXQgc3RvcHBlZCBiZWluZyBmb3VuZCB3b3VsZCBnbyBvbiByZXBvcnRpbmcgaXRzZWxmIGNsZWFuLiBUaGlzIGlzIHRoZSBoYWxmIG9mIHRoZSBub24tdHJpdmlhbFxuICAgIC8vIGd1YXJkIHRoYXQgc3RpbGwgYXBwbGllcyB3aGVuIHRoZSBwbHVnaW4gZXhwb3NlcyBub3RoaW5nIHRvIHJlZmxlY3QuXG4gICAgaXQoJ3JlYWRzIGEgbm9uLWVtcHR5IGRlbW8gdmF1bHQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5jb2xsZWN0RGVtb05vdGVSZWxhdGl2ZVBhdGhzKCkubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBndWFyZCA9IHBhcmFtcy5ub25Ucml2aWFsR3VhcmQ7XG4gICAgaWYgKGd1YXJkKSB7XG4gICAgICBpdCgna2VlcHMgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIG5vbi10cml2aWFsJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKGd1YXJkKTtcbiAgICAgICAgZXhwZWN0KG1lbWJlcnMuYWxsKS50b0NvbnRhaW4oZ3VhcmQuZXhwZWN0TWVtYmVyKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuY29sbGVjdERlbW9Ob3RlUmVsYXRpdmVQYXRocygpKS50b0NvbnRhaW4oZ3VhcmQuZXhwZWN0RGVtb05vdGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQ0xBU1NfTUVNQkVSX01PRElGSUVSUyA9IFN0cmluZy5yYXdgKD86KD86cHVibGljfHByaXZhdGV8cHJvdGVjdGVkfHJlYWRvbmx5fHN0YXRpY3xhYnN0cmFjdHxvdmVycmlkZSlcXHMrKSpgO1xuY29uc3QgQUJTT0xVVEVfVVJMX1JFR19FWFAgPSAvXlthLXpdW1xcdysuLV0qOi9pO1xuY29uc3QgQVJST1dfUkVHX0VYUCA9IC9eXFxzKj0+LztcbmNvbnN0IEZVTkNUSU9OX1RZUEVfUEFSQU1FVEVSU19SRUdfRVhQID0gL148W14+XSo+XFxzKi87XG5jb25zdCBBTkdMRV9CUkFDS0VUU19SRUdfRVhQID0gL148fD4kL2c7XG5jb25zdCBDT0RFX0JVVFRPTl9GRU5DRV9SRUdfRVhQID0gL15cXHMqKD86YGBgfH5+filcXHMqY29kZS1idXR0b25cXGIvO1xuY29uc3QgQ09ERV9GRU5DRV9SRUdfRVhQID0gL15cXHMqKD86YGBgfH5+fikvO1xuY29uc3QgREVGQVVMVF9FWENMVURFRF9OT1RFUyA9IFsnUkVBRE1FLm1kJ107XG5jb25zdCBERUZBVUxUX1NUQVJUX05PVEUgPSAnMDAgU3RhcnQubWQnO1xuLy8gQSB3YXJuaW5nIHdoaWxlIGV4aXN0aW5nIHZhdWx0cyBhcmUgYnJvdWdodCB1cCB0byB0aGUgY2hlY2s7IGl0IGJlY29tZXMgYW4gZXJyb3Igb25jZSB0aGV5IGFyZS5cbmNvbnN0IERFRkFVTFRfVFJZX0lUX0NPREVfQlVUVE9OU19TRVZFUklUWTogRGVtb1ZhdWx0Q2hlY2tTZXZlcml0eSA9ICd3YXJuJztcbmNvbnN0IERPQ1NfTElOS19SRUdfRVhQID0gL15cXHMqXFxbRG9jc11cXCgvO1xuY29uc3QgRlJPTlRNQVRURVJfUkVHX0VYUCA9IC9eLS0tXFxyP1xcbltcXHNcXFNdKj9cXHI/XFxuLS0tW15cXFNcXG5dKlxccj9cXG4/LztcbmNvbnN0IEgxX1JFR19FWFAgPSAvXiMgXFxTLztcbmNvbnN0IEhFQURJTkdfTEVWRUxfUkVHX0VYUCA9IC9eIHswLDN9KD88aGFzaGVzPiN7MSw2fSkoPzpcXHN8JCkvO1xuY29uc3QgSEVBRElOR19SRUdfRVhQID0gL14jezEsNn0gLztcbmNvbnN0IElOTElORV9DT0RFX1JFR19FWFAgPSAvYFteYFxcbl0qYC9nO1xuY29uc3QgTUFSS0RPV05fTElOS19SRUdfRVhQID0gL1xcW1teXFxdXSpdXFwoKD88dGFyZ2V0PlteKV0rKVxcKS9nO1xuLy8gQW4gaW5saW5lIGRpcmVjdGl2ZSwgc2hhcGVkIGFmdGVyIEVTTGludCdzIGFuZCB3cml0dGVuIGFzIGFuIEhUTUwgY29tbWVudCBzbyBpdCBpcyBpbnZpc2libGUgQk9USCBpblxuLy8gT2JzaWRpYW4gYW5kIG9uIEdpdEh1YiDigJQgdGhlIHNhbWUgc3BlbGxpbmcgdGhlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWAuXG4vLyBBbiBPYnNpZGlhbiBgJSUg4oCmICUlYCBjb21tZW50IHdvdWxkIHNob3cgdXAgYXMgbGl0ZXJhbCB0ZXh0IG9uIEdpdEh1Yiwgd2hpY2ggaXMgaGFsZiB0aGUgcmVhZGVyc2hpcC5cbmNvbnN0IERJUkVDVElWRV9SRUdfRVhQID0gL15cXHMqPCEtLVxccypvYnNpZGlhbi1kZXYtdXRpbHMtKD88YWN0aW9uPmRpc2FibGUtbmV4dC1saW5lfGRpc2FibGV8ZW5hYmxlKVxccysoPzxydWxlPltcXHctXStcXC9bXFx3LV0rKSg/OlxccystLVxccysoPzxyZWFzb24+Lio/KSk/XFxzKi0tPlxccyokLztcbi8vIENhdGNoZXMgYSBkaXJlY3RpdmUgdGhhdCB3YXMgTUVBTlQgdG8gYmUgb25lIGJ1dCBpcyBtaXNzcGVsbGVkOiBpdCB3b3VsZCBvdGhlcndpc2UgcmVhZCBhcyBhbiBvcmRpbmFyeVxuLy8gY29tbWVudCBhbmQgc2lsZW50bHkgZG8gbm90aGluZywgd2hpY2ggaXMgdGhlIGZhaWx1cmUgbW9kZSBhIHN1cHByZXNzaW9uIHN5bnRheCBtdXN0IG5ldmVyIGhhdmUuXG5jb25zdCBESVJFQ1RJVkVfUFJPQkVfUkVHX0VYUCA9IC88IS0tXFxzKm9ic2lkaWFuLWRldi11dGlscy0vO1xuY29uc3QgVFJZX0lUX0hFQURJTkdfUkVHX0VYUCA9IC9eIHswLDN9I3sxLDZ9XFxzK1RyeSBpdFxcYi9pO1xuY29uc3QgVFJZX0lUX1JVTEUgPSAnZGVtby12YXVsdC12YWxpZGF0aW9uL3RyeS1pdC1jb2RlLWJ1dHRvbic7XG5jb25zdCBXSUtJTElOS19SVUxFID0gJ2RlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MnO1xuLy8gRXZlcnkgcnVsZSBhIGRpcmVjdGl2ZSBtYXkgbmFtZSwgd2l0aCB3aGF0IGEgbGluZSBicmVha2luZyBpdCBpcyBjYWxsZWQgaW4gYSBwcm9ibGVtIG1lc3NhZ2UuXG5jb25zdCBESVJFQ1RJVkVfUlVMRV9UQVJHRVRTID0gbmV3IE1hcChbXG4gIFtUUllfSVRfUlVMRSwgJ1RyeSBpdCBzZWN0aW9uIHdpdGhvdXQgYSBjb2RlIGJ1dHRvbiddLFxuICBbV0lLSUxJTktfUlVMRSwgJ3dpa2lsaW5rJ11cbl0pO1xuLy8gVGhlIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGZyb250bWF0dGVyIHBhdGgsIGF0IGFueSBpbmRlbnRhdGlvbjpcbi8vIFRoZSBrZXlzIG11c3QgbmVzdCBpbiB0aGF0IG9yZGVyLCBhbmQgYW55IGxpbmUgYmV0d2VlbiB0aGVtIGhhcyB0byBzdGF5IGluZGVudGVkLCBzbyBhIGRlZGVudCB0byB0aGVcbi8vIGRvY3VtZW50J3Mgb3duIHRvcCBsZXZlbCBlbmRzIHRoZSBtYXRjaCByYXRoZXIgdGhhbiByZWFjaGluZyBhIHNhbWUtbmFtZWQga2V5IHVuZGVyIGFub3RoZXIgcGFyZW50LlxuY29uc3QgV0lLSUxJTktfQUxMT1dBTkNFX1JFR19FWFAgPSAvXm9ic2lkaWFuLWRldi11dGlsczpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2RlbW8tdmF1bHQtdmFsaWRhdGlvbjpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2FsbG93LXdpa2lsaW5rczooPzxyZWFzb24+LiopJC9tO1xuY29uc3QgV0lLSUxJTktfUkVHX0VYUCA9IC9cXFtcXFtbXlxcXV0rXV0vO1xuXG4vLyBBcHBsaWVzIG9uZSBwYXJzZWQgZGlyZWN0aXZlIHRvIHRoZSBzY2FuLiBFYWNoIHJ1bGUga2VlcHMgaXRzIG93biByZWdpb24gYW5kIGl0cyBvd24gcGVuZGluZ1xuLy8gYGRpc2FibGUtbmV4dC1saW5lYCwgc28gYSBkaXJlY3RpdmUgZm9yIG9uZSBydWxlIG5ldmVyIGV4ZW1wdHMgYSBsaW5lIGZyb20gYW5vdGhlci5cbmZ1bmN0aW9uIGFwcGx5RGlyZWN0aXZlKHN0YXRlOiBEaXJlY3RpdmVTY2FuU3RhdGUsIGxpbmVJbmRleDogbnVtYmVyLCBtYXRjaDogUmVnRXhwRXhlY0FycmF5KTogdm9pZCB7XG4gIGNvbnN0IGFjdGlvbiA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdhY3Rpb24nKTtcbiAgY29uc3QgcnVsZSA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdydWxlJyk7XG4gIGNvbnN0IHJlYXNvbiA9IG1hdGNoLmdyb3Vwcz8uWydyZWFzb24nXT8udHJpbSgpID8/ICcnO1xuICBjb25zdCB0YXJnZXQgPSBESVJFQ1RJVkVfUlVMRV9UQVJHRVRTLmdldChydWxlKTtcbiAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYW4gdW5rbm93biBydWxlIFwiJHtydWxlfVwiIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYWN0aW9uICE9PSAnZW5hYmxlJyAmJiByZWFzb24gPT09ICcnKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXJlY3RpdmUgd2l0aCBubyByZWFzb24gb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUtbmV4dC1saW5lJykge1xuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGUuc2V0KHJ1bGUsIGxpbmVJbmRleCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3BlblJlZ2lvbiA9IHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLmdldChydWxlKTtcbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUnKSB7XG4gICAgaWYgKG9wZW5SZWdpb24pIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX0gaW5zaWRlIHRoZSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihvcGVuUmVnaW9uLmxpbmVJbmRleCl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLnNldChydWxlLCB7IGlzVXNlZDogZmFsc2UsIGxpbmVJbmRleCB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIW9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhbiBlbmFibGUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9IHdpdGggbm8gcmVnaW9uIG9wZW5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFvcGVuUmVnaW9uLmlzVXNlZCkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIob3BlblJlZ2lvbi5saW5lSW5kZXgpfSBjb3ZlcmluZyBubyAke3RhcmdldH1gKTtcbiAgfVxuICBzdGF0ZS5vcGVuUmVnaW9uc0J5UnVsZS5kZWxldGUocnVsZSk7XG59XG5cbi8vIEFwcGxpZXMgb25lIG9yZGluYXJ5IGxpbmUgdG8gdGhlIHNjYW4sIHJ1bGUgYnkgcnVsZTogYW4gb3BlbiByZWdpb24gY292ZXJzIGl0LCBhbmQgYSBwZW5kaW5nXG4vLyBgZGlzYWJsZS1uZXh0LWxpbmVgIGNsYWltcyB0aGUgZmlyc3QgbGluZSB3aXRoIGNvbnRlbnQgb24gaXQg4oCUIHRoZSBkaXJlY3RpdmUgYW5kIGl0cyB0YXJnZXQgYXJlIHVzdWFsbHkgYVxuLy8gYmxhbmsgbGluZSBhcGFydC5cbmZ1bmN0aW9uIGFwcGx5RGlyZWN0aXZlU2NhbkxpbmUoc3RhdGU6IERpcmVjdGl2ZVNjYW5TdGF0ZSwgbGluZUluZGV4OiBudW1iZXIsIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtydWxlLCB0YXJnZXRdIG9mIERJUkVDVElWRV9SVUxFX1RBUkdFVFMpIHtcbiAgICBjb25zdCBpc1RhcmdldCA9IGVuc3VyZU5vbk51bGxhYmxlKHN0YXRlLnRhcmdldExpbmVJbmRleGVzQnlSdWxlLmdldChydWxlKSkuaGFzKGxpbmVJbmRleCk7XG4gICAgY29uc3Qgb3BlblJlZ2lvbiA9IHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLmdldChydWxlKTtcbiAgICBpZiAob3BlblJlZ2lvbikge1xuICAgICAgZ2V0T3JDcmVhdGVMaW5lSW5kZXhlcyhzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUsIHJ1bGUpLmFkZChsaW5lSW5kZXgpO1xuICAgICAgb3BlblJlZ2lvbi5pc1VzZWQgfHw9IGlzVGFyZ2V0O1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmdOZXh0TGluZUluZGV4ID0gc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXhlc0J5UnVsZS5nZXQocnVsZSk7XG4gICAgaWYgKHBlbmRpbmdOZXh0TGluZUluZGV4ID09PSB1bmRlZmluZWQgfHwgbGluZS50cmltKCkgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZ2V0T3JDcmVhdGVMaW5lSW5kZXhlcyhzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUsIHJ1bGUpLmFkZChsaW5lSW5kZXgpO1xuICAgIGlmICghaXNUYXJnZXQpIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZS1uZXh0LWxpbmUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHBlbmRpbmdOZXh0TGluZUluZGV4KX0gY292ZXJpbmcgbm8gJHt0YXJnZXR9YCk7XG4gICAgfVxuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGUuZGVsZXRlKHJ1bGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWVtYmVycyhtZXRob2RzOiBzdHJpbmdbXSwgcHJvcGVydGllczogc3RyaW5nW10pOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgcmV0dXJuIHtcbiAgICBhbGw6IFsuLi5tZXRob2RzLCAuLi5wcm9wZXJ0aWVzXSxcbiAgICBtZXRob2RzLFxuICAgIHByb3BlcnRpZXNcbiAgfTtcbn1cblxuLy8gUmVzb2x2ZXMgdGhlIG5vdGVzIGEgbm90ZSBsaW5rcyB0bzogZXZlcnkgTWFya2Rvd24gbGluayBvdXRzaWRlIGEgY29kZSBmZW5jZSB3aG9zZSB0YXJnZXQgaXMgYSBgLm1kYFxuLy8gZmlsZSwgbWFkZSByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBzbyBpdCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBub3RlIG1hcC4gRXh0ZXJuYWwgVVJMcyBhbmRcbi8vIG5vbi1ub3RlIHRhcmdldHMgKGltYWdlcywgc2NyaXB0cykgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsZWFybmluZyBwYXRoIGFuZCBhcmUgc2tpcHBlZDsgYSBgI2FuY2hvcmAgaXNcbi8vIGRyb3BwZWQsIHNpbmNlIGl0IGFkZHJlc3NlcyBhIHBsYWNlIGluc2lkZSBhbiBhbHJlYWR5LXJlc29sdmVkIG5vdGUuXG4vLyBSZXR1cm5zIHRoZSBub3RlJ3MgbGluZXMgd2l0aCBmZW5jZWQgY29kZSBibG9ja3MgcmVtb3ZlZCAodGhlIGZlbmNlIGxpbmVzIGluY2x1ZGVkKSwgcGFpcmVkIHdpdGggdGhlXG4vLyBsaW5lIG51bWJlciBlYWNoIGNhbWUgZnJvbSwgc28gYSBjaGVjayBuZXZlciBtaXN0YWtlcyBzYW1wbGUgY29kZSBmb3IgcHJvc2Ug4oCUIGEgYFtbd2lraWxpbmtdXWBcbi8vIGRlbW9uc3RyYXRlZCBpbnNpZGUgYSBmZW5jZSBpcyB0ZXh0LCBub3QgbmF2aWdhdGlvbiDigJQgYW5kIGFuIGlubGluZSBkaXJlY3RpdmUgY2FuIHN0aWxsIG5hbWUgYSBsaW5lLlxuZnVuY3Rpb24gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBOb3RlTGluZVtdIHtcbiAgY29uc3Qgbm90ZUxpbmVzOiBOb3RlTGluZVtdID0gW107XG4gIGxldCBpc0luc2lkZUZlbmNlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoQ09ERV9GRU5DRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIGlzSW5zaWRlRmVuY2UgPSAhaXNJbnNpZGVGZW5jZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWlzSW5zaWRlRmVuY2UpIHtcbiAgICAgIG5vdGVMaW5lcy5wdXNoKHsgaW5kZXgsIGxpbmUgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3RlTGluZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3ROb3RlTGlua1RhcmdldHMobm90ZTogRGVtb1ZhdWx0Tm90ZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdGFyZ2V0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGdldExpbmVzT3V0c2lkZUZlbmNlcyhub3RlLmNvbnRlbnQpKSB7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBzdHJpcElubGluZUNvZGUobGluZSkubWF0Y2hBbGwoTUFSS0RPV05fTElOS19SRUdfRVhQKSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpLnJlcGxhY2VBbGwoQU5HTEVfQlJBQ0tFVFNfUkVHX0VYUCwgJycpO1xuICAgICAgY29uc3QgW25vdGVQYXRoID0gJyddID0gdGFyZ2V0LnNwbGl0KCcjJywgMSk7XG4gICAgICBpZiAoQUJTT0xVVEVfVVJMX1JFR19FWFAudGVzdChub3RlUGF0aCkgfHwgIW5vdGVQYXRoLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0cy5wdXNoKGpvaW4oZGlybmFtZShub3RlLnJlbGF0aXZlUGF0aCksIHRyeURlY29kZVVyaUNvbXBvbmVudChub3RlUGF0aCkpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldHM7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGNsYXNzQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmNsYXNzQm9keS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgXiB7Mn0oPzxtb2RpZmllcnM+JHtDTEFTU19NRU1CRVJfTU9ESUZJRVJTfSkoPzxuYW1lPlxcdyspKD86PFtePl0qPik/XFwoYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc1Byb3BlcnR5TmFtZXMoY2xhc3NCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uY2xhc3NCb2R5Lm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeIHsyfSg/PG1vZGlmaWVycz4ke0NMQVNTX01FTUJFUl9NT0RJRklFUlN9KSg/PG5hbWU+XFx3KylcXHMqXFw/P1xccypbOj1dYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoZW51bUJvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5lbnVtQm9keS5tYXRjaEFsbCgvXiB7Mn0oPzxuYW1lPlxcdyspL2dtKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbi8vIEEgbWV0aG9kIGlzIGNhbGxhYmxlIHN1cmZhY2UgaG93ZXZlciBpdCBpcyB3cml0dGVuOiBhIG1ldGhvZCBzaWduYXR1cmUgKGBmb28oYmFyOiBzdHJpbmcpOiB2b2lkO2ApIG9yIGFcbi8vIHByb3BlcnR5IHNpZ25hdHVyZSB3aG9zZSB0eXBlIGlzIGEgZnVuY3Rpb24gdHlwZSAoYGZvbzogKGJhcjogc3RyaW5nKSA9PiB2b2lkO2ApLiBUaGUgc2hhcmVkIEVTTGludCBjb25maWdcbi8vIHJ1bnMgYEB0eXBlc2NyaXB0LWVzbGludC9tZXRob2Qtc2lnbmF0dXJlLXN0eWxlYCBhdCBpdHMgYHByb3BlcnR5YCBkZWZhdWx0LCBzbyBgbGludDpmaXhgIHJld3JpdGVzIHRoZVxuLy8gZmlyc3Qgc2hhcGUgaW50byB0aGUgc2Vjb25kIOKAlCByZWFkaW5nIG9ubHkgdGhlIGZpcnN0IHJlcG9ydGVkIHplcm8gbWV0aG9kcyBmb3IgZXZlcnkgc3VjaCBpbnRlcmZhY2UuXG5mdW5jdGlvbiBleHRyYWN0TWV0aG9kTmFtZXMoaW50ZXJmYWNlQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBtZXRob2RTaWduYXR1cmVOYW1lcyA9IFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/PG5hbWU+XFx3KykoPzo8W14+XSo+KT9cXCgvZ20pXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgY29uc3QgZnVuY3Rpb25Qcm9wZXJ0eU5hbWVzID0gbWF0Y2hQcm9wZXJ0eVNpZ25hdHVyZXMoaW50ZXJmYWNlQm9keSlcbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gaXNGdW5jdGlvblR5cGUoaW50ZXJmYWNlQm9keSwgbWF0Y2gpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgcmV0dXJuIFsuLi5tZXRob2RTaWduYXR1cmVOYW1lcywgLi4uZnVuY3Rpb25Qcm9wZXJ0eU5hbWVzXTtcbn1cblxuLy8gRXZlcnkgcHJvcGVydHkgc2lnbmF0dXJlIHdob3NlIHR5cGUgaXMgbm90IGEgZnVuY3Rpb24gdHlwZSwgc28gbWV0aG9kcyBhbmQgcHJvcGVydGllcyBzdGF5IGEgcGFydGl0aW9uLlxuZnVuY3Rpb24gZXh0cmFjdFByb3BlcnR5TmFtZXMoaW50ZXJmYWNlQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gbWF0Y2hQcm9wZXJ0eVNpZ25hdHVyZXMoaW50ZXJmYWNlQm9keSlcbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gIWlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHksIG1hdGNoKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbi8vIFRoZSBoZWFkaW5nIGxpbmVzIG9mIHRoZSBgVHJ5IGl0YCBzZWN0aW9ucyB0aGF0IGhvbGQgbm8gYGNvZGUtYnV0dG9uYC4gQSBzZWN0aW9uIHJ1bnMgdG8gdGhlIG5leHQgaGVhZGluZ1xuLy8gb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwsIHNvIGEgYCMjIyBTdGVwIDFgIGluc2lkZSBhIGAjIyBUcnkgaXRgIHN0YXlzIHBhcnQgb2YgaXQuIEhlYWRpbmdzIGFuZFxuLy8gZmVuY2VzIGluc2lkZSBhIGZlbmNlZCBibG9jayBhcmUgc2FtcGxlIHRleHQsIHNvIG9ubHkgYSBmZW5jZSB0aGF0IE9QRU5TIGEgYmxvY2sgY2FuIGJlIHRoZSBidXR0b24uXG5mdW5jdGlvbiBmaW5kVHJ5SXRMaW5lSW5kZXhlc1dpdGhvdXRDb2RlQnV0dG9uKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgY29uc3QgbGluZUluZGV4ZXM6IG51bWJlcltdID0gW107XG4gIGxldCBzZWN0aW9uOiBudWxsIHwgVHJ5SXRTZWN0aW9uID0gbnVsbDtcbiAgbGV0IGlzSW5zaWRlRmVuY2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpLmVudHJpZXMoKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgaWYgKCFpc0luc2lkZUZlbmNlICYmIHNlY3Rpb24gJiYgQ09ERV9CVVRUT05fRkVOQ0VfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICAgIHNlY3Rpb24uaGFzQ29kZUJ1dHRvbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBpc0luc2lkZUZlbmNlID0gIWlzSW5zaWRlRmVuY2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaGFzaGVzID0gaXNJbnNpZGVGZW5jZSA/IHVuZGVmaW5lZCA6IEhFQURJTkdfTEVWRUxfUkVHX0VYUC5leGVjKGxpbmUpPy5ncm91cHM/LlsnaGFzaGVzJ107XG4gICAgaWYgKGhhc2hlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNlY3Rpb24gJiYgaGFzaGVzLmxlbmd0aCA8PSBzZWN0aW9uLmxldmVsKSB7XG4gICAgICBpZiAoIXNlY3Rpb24uaGFzQ29kZUJ1dHRvbikge1xuICAgICAgICBsaW5lSW5kZXhlcy5wdXNoKHNlY3Rpb24ubGluZUluZGV4KTtcbiAgICAgIH1cbiAgICAgIHNlY3Rpb24gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXNlY3Rpb24gJiYgVFJZX0lUX0hFQURJTkdfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICBzZWN0aW9uID0geyBoYXNDb2RlQnV0dG9uOiBmYWxzZSwgbGV2ZWw6IGhhc2hlcy5sZW5ndGgsIGxpbmVJbmRleDogaW5kZXggfTtcbiAgICB9XG4gIH1cbiAgaWYgKHNlY3Rpb24gJiYgIXNlY3Rpb24uaGFzQ29kZUJ1dHRvbikge1xuICAgIGxpbmVJbmRleGVzLnB1c2goc2VjdGlvbi5saW5lSW5kZXgpO1xuICB9XG4gIHJldHVybiBsaW5lSW5kZXhlcztcbn1cblxuLy8gVGhlIGxpbmUgbnVtYmVycyBjYXJyeWluZyBhIHdpa2lsaW5rIHRoYXQgaXMgbmF2aWdhdGlvbiByYXRoZXIgdGhhbiBzYW1wbGUgdGV4dC5cbmZ1bmN0aW9uIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudClcbiAgICAuZmlsdGVyKChub3RlTGluZSkgPT4gV0lLSUxJTktfUkVHX0VYUC50ZXN0KHN0cmlwSW5saW5lQ29kZShub3RlTGluZS5saW5lKSkpXG4gICAgLm1hcCgobm90ZUxpbmUpID0+IG5vdGVMaW5lLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbGluZSAke1N0cmluZyhsaW5lSW5kZXggKyAxKX1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUcnlJdFdhcm5pbmcoc2VjdGlvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICBgZGVtby12YXVsdCBjb3ZlcmFnZTogJHtTdHJpbmcoc2VjdGlvbnMubGVuZ3RoKX0gVHJ5IGl0IHNlY3Rpb24ocykgaGF2ZSBubyBjb2RlLWJ1dHRvbiB0byBwZXJmb3JtIHRoZWlyIHNldHVwLmAsXG4gICAgYEFkZCBvbmUsIG9yIHN0YXRlIHdoeSB0aGUgc3RlcHMgY2Fubm90IGJlIHNjcmlwdGVkIHdpdGggPCEtLSBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZS1uZXh0LWxpbmUgJHtUUllfSVRfUlVMRX0gLS0gPHJlYXNvbj4gLS0+IGFib3ZlIHRoZSBoZWFkaW5nLmAsXG4gICAgLi4uc2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiBgICAke3NlY3Rpb259YClcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxsb3dlZExpbmVJbmRleGVzKHNjYW46IERpcmVjdGl2ZVNjYW4sIHJ1bGU6IHN0cmluZyk6IFJlYWRvbmx5U2V0PG51bWJlcj4ge1xuICByZXR1cm4gc2Nhbi5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUuZ2V0KHJ1bGUpID8/IG5ldyBTZXQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZXNPdXRzaWRlRmVuY2VzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudCkubWFwKChub3RlTGluZSkgPT4gbm90ZUxpbmUubGluZSk7XG59XG5cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlTGluZUluZGV4ZXMobGluZUluZGV4ZXNCeVJ1bGU6IE1hcDxzdHJpbmcsIFNldDxudW1iZXI+PiwgcnVsZTogc3RyaW5nKTogU2V0PG51bWJlcj4ge1xuICBsZXQgbGluZUluZGV4ZXMgPSBsaW5lSW5kZXhlc0J5UnVsZS5nZXQocnVsZSk7XG4gIGlmICghbGluZUluZGV4ZXMpIHtcbiAgICBsaW5lSW5kZXhlcyA9IG5ldyBTZXQoKTtcbiAgICBsaW5lSW5kZXhlc0J5UnVsZS5zZXQocnVsZSwgbGluZUluZGV4ZXMpO1xuICB9XG4gIHJldHVybiBsaW5lSW5kZXhlcztcbn1cblxuLy8gV2hldGhlciB0aGUgbm90ZSdzIGZpcnN0IGNvbnRlbnQgbGluZSAoZnJvbnRtYXR0ZXIgYW5kIGJsYW5rIGxpbmVzIGFzaWRlKSBpcyBhbiBgIyBIMWAuXG5mdW5jdGlvbiBoYXNIMShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZExpbmUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIEgxX1JFR19FWFAudGVzdCh0cmltbWVkTGluZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIGEgcGxhaW4gcHJvc2UgbGluZSBhcHBlYXJzIGJlZm9yZSB0aGUgbm90ZSdzIGZpcnN0IGNvZGUgZmVuY2UuIEhlYWRpbmdzIGFyZSBub3QgcHJvc2Ug4oCUIGEgbm90ZVxuLy8gdGhhdCBnb2VzIHN0cmFpZ2h0IGZyb20gaXRzIHRpdGxlIHRvIGEgYnV0dG9uIGlzIGV4YWN0bHkgdGhlIHNoYXBlIHRoaXMgY2hlY2sgcmVqZWN0cy5cbmZ1bmN0aW9uIGhhc0ludHJvUHJvc2UoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBzdHJpcEZyb250bWF0dGVyKGNvbnRlbnQpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICh0cmltbWVkTGluZSA9PT0gJycgfHwgSEVBRElOR19SRUdfRVhQLnRlc3QodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBub3RlIG5hdmlnYXRlcyB3aXRoIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gLiBGZW5jZWQgYmxvY2tzIGFuZCBpbmxpbmUgY29kZSBhcmUgc2FtcGxlXG4vLyB0ZXh0IHJhdGhlciB0aGFuIG5hdmlnYXRpb24sIHNvIHRoZXkgYXJlIHJlbW92ZWQgYmVmb3JlIGxvb2tpbmcuXG5mdW5jdGlvbiBoYXNXaWtpbGluayhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpLmxlbmd0aCA+IDA7XG59XG5cbi8vIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNpZ25hdHVyZSdzIHR5cGUsIHN0YXJ0aW5nIHJpZ2h0IGFmdGVyIGl0cyBgOmAsIGlzIGEgZnVuY3Rpb24gdHlwZTogYW4gb3B0aW9uYWwgdHlwZVxuLy8gcGFyYW1ldGVyIGxpc3QsIGEgcGFyYW1ldGVyIGxpc3QsIHRoZW4gYD0+YC4gVGhlIHBhcmFtZXRlciBsaXN0IGlzIHdhbGtlZCBieSBicmFja2V0IGRlcHRoIHJhdGhlciB0aGFuIGJ5IGFcbi8vIHJlZ3VsYXIgZXhwcmVzc2lvbiwgc28gYSBwYXJlbnRoZXNpemVkIG5vbi1mdW5jdGlvbiB0eXBlIChgKHN0cmluZyB8IG51bWJlcilbXWApIGFuZCBhIHBhcmFtZXRlciB3aG9zZSBvd25cbi8vIHR5cGUgaG9sZHMgcGFyZW50aGVzZXMgKGAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWRgKSBhcmUgYm90aCByZWFkIGNvcnJlY3RseSwgYWNyb3NzIGxpbmVzIHRvby5cbmZ1bmN0aW9uIGlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHk6IHN0cmluZywgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSk6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgaW5kZXggKz0gRlVOQ1RJT05fVFlQRV9QQVJBTUVURVJTX1JFR19FWFAuZXhlYyhpbnRlcmZhY2VCb2R5LnNsaWNlKGluZGV4KSk/LlswXS5sZW5ndGggPz8gMDtcbiAgaWYgKGludGVyZmFjZUJvZHlbaW5kZXhdICE9PSAnKCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGRlcHRoID0gMDtcbiAgZm9yICg7IGluZGV4IDwgaW50ZXJmYWNlQm9keS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBpbnRlcmZhY2VCb2R5W2luZGV4XTtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnKCcpIHtcbiAgICAgIGRlcHRoKys7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZGVwdGgtLTtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQVJST1dfUkVHX0VYUC50ZXN0KGludGVyZmFjZUJvZHkuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNOb25QdWJsaWNNZW1iZXIobW9kaWZpZXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGIoPzpwcml2YXRlfHByb3RlY3RlZClcXGIvLnRlc3QobW9kaWZpZXJzKTtcbn1cblxuLy8gYHJlYWRvbmx5YCBpcyB0aGUgb25seSBtb2RpZmllciBhIHByb3BlcnR5IHNpZ25hdHVyZSB0YWtlcywgYW5kIGEgbWV0aG9kIHNpZ25hdHVyZSB0YWtlcyBub25lIOKAlCBUeXBlU2NyaXB0XG4vLyByZWplY3RzIGByZWFkb25seSBmb28oKTogdm9pZDtgIOKAlCBzbyB0aGUgbWV0aG9kLXNpZ25hdHVyZSByZWdleCBuZWVkcyBubyBjb3VudGVycGFydC5cbmZ1bmN0aW9uIG1hdGNoUHJvcGVydHlTaWduYXR1cmVzKGludGVyZmFjZUJvZHk6IHN0cmluZyk6IFJlZ0V4cEV4ZWNBcnJheVtdIHtcbiAgcmV0dXJuIFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/OnJlYWRvbmx5XFxzKyk/KD88bmFtZT5cXHcrKVxcPz86XFxzKi9nbSldO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1lbWJlcnMoa2V5d29yZDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgc3dpdGNoIChrZXl3b3JkKSB7XG4gICAgY2FzZSAnY2xhc3MnOiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGJvZHkpLCBleHRyYWN0Q2xhc3NQcm9wZXJ0eU5hbWVzKGJvZHkpKTtcbiAgICB9XG4gICAgY2FzZSAnZW51bSc6IHtcbiAgICAgIHJldHVybiBidWlsZE1lbWJlcnMoW10sIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoYm9keSkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RNZXRob2ROYW1lcyhib2R5KSwgZXh0cmFjdFByb3BlcnR5TmFtZXMoYm9keSkpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBSZWFkcyB0aGUgbm90ZSdzIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGRlY2xhcmF0aW9uOiB0aGUgc3RhdGVkXG4vLyByZWFzb24sIGAnJ2Agd2hlbiB0aGUga2V5IGlzIHByZXNlbnQgd2l0aCBub3RoaW5nIGFmdGVyIGl0LCBvciBgbnVsbGAgd2hlbiB0aGUgbm90ZSBkZWNsYXJlcyBub3RoaW5nLlxuLy8gUmVhZCB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uIHJhdGhlciB0aGFuIGEgWUFNTCBwYXJzZXI6IGl0IGlzIG9uZSBrbm93biBrZXkgcGF0aCwgYW5kIGV2ZXJ5IHBsdWdpbiB0aGF0XG4vLyBpbnN0YWxscyB0aGlzIHBhY2thZ2Ugd291bGQgb3RoZXJ3aXNlIGNhcnJ5IGEgWUFNTCBkZXBlbmRlbmN5IGZvciBpdC5cbmZ1bmN0aW9uIHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihjb250ZW50OiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBGUk9OVE1BVFRFUl9SRUdfRVhQLmV4ZWMoY29udGVudCk/LlswXTtcbiAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCByZWFzb24gPSBXSUtJTElOS19BTExPV0FOQ0VfUkVHX0VYUC5leGVjKGZyb250bWF0dGVyKT8uZ3JvdXBzPy5bJ3JlYXNvbiddO1xuICByZXR1cm4gcmVhc29uID09PSB1bmRlZmluZWQgPyBudWxsIDogcmVhc29uLnRyaW0oKS5yZXBsYWNlKC9eKD88cXVvdGU+W1wiJ10pKD88dmFsdWU+W1xcc1xcU10qKVxcazxxdW90ZT4kLywgJyQ8dmFsdWU+Jyk7XG59XG5cbi8vIFJlYWRzIHRoZSBub3RlJ3MgaW5saW5lIGBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZeKApmAgZGlyZWN0aXZlcywgcmV0dXJuaW5nIHdoaWNoIGxpbmVzIHRoZXkgZXhlbXB0IGZyb21cbi8vIGVhY2ggcnVsZSBhbmQgZXZlcnl0aGluZyB3cm9uZyB3aXRoIHRoZW0uIEEgc3VwcHJlc3Npb24gdGhhdCBxdWlldGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vbmUsIHNvXG4vLyBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlLCBvbmUgd2l0aCBubyByZWFzb24sIGFuIHVuY2xvc2VkIHJlZ2lvbiBhbmQgb25lIGNvdmVyaW5nIG5vdGhpbmcgdGhhdCBicmVha3MgaXRzXG4vLyBydWxlIGFyZSBlYWNoIHJlcG9ydGVkIHJhdGhlciB0aGFuIGlnbm9yZWQuXG5mdW5jdGlvbiBzY2FuRGlyZWN0aXZlcyhjb250ZW50OiBzdHJpbmcpOiBEaXJlY3RpdmVTY2FuIHtcbiAgY29uc3Qgc3RhdGU6IERpcmVjdGl2ZVNjYW5TdGF0ZSA9IHtcbiAgICBhbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoKSxcbiAgICBvcGVuUmVnaW9uc0J5UnVsZTogbmV3IE1hcCgpLFxuICAgIHBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoKSxcbiAgICBwcm9ibGVtczogW10sXG4gICAgdGFyZ2V0TGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoW1xuICAgICAgW1RSWV9JVF9SVUxFLCBuZXcgU2V0KGZpbmRUcnlJdExpbmVJbmRleGVzV2l0aG91dENvZGVCdXR0b24oY29udGVudCkpXSxcbiAgICAgIFtXSUtJTElOS19SVUxFLCBuZXcgU2V0KGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpKV1cbiAgICBdKVxuICB9O1xuXG4gIGZvciAoY29uc3QgeyBpbmRleCwgbGluZSB9IG9mIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudCkpIHtcbiAgICBjb25zdCBtYXRjaCA9IERJUkVDVElWRV9SRUdfRVhQLmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBhcHBseURpcmVjdGl2ZShzdGF0ZSwgaW5kZXgsIG1hdGNoKTtcbiAgICB9IGVsc2UgaWYgKERJUkVDVElWRV9QUk9CRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgbWFsZm9ybWVkIGRpcmVjdGl2ZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoaW5kZXgpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBseURpcmVjdGl2ZVNjYW5MaW5lKHN0YXRlLCBpbmRleCwgbGluZSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBvcGVuUmVnaW9uIG9mIHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLnZhbHVlcygpKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihvcGVuUmVnaW9uLmxpbmVJbmRleCl9IHRoYXQgaXMgbmV2ZXIgZW5hYmxlZCBhZ2FpbmApO1xuICB9XG4gIGZvciAoY29uc3QgW3J1bGUsIHBlbmRpbmdOZXh0TGluZUluZGV4XSBvZiBzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleGVzQnlSdWxlKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlLW5leHQtbGluZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIocGVuZGluZ05leHRMaW5lSW5kZXgpfSBjb3ZlcmluZyBubyAke2Vuc3VyZU5vbk51bGxhYmxlKERJUkVDVElWRV9SVUxFX1RBUkdFVFMuZ2V0KHJ1bGUpKX1gKTtcbiAgfVxuICByZXR1cm4geyBhbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGU6IHN0YXRlLmFsbG93ZWRMaW5lSW5kZXhlc0J5UnVsZSwgcHJvYmxlbXM6IHN0YXRlLnByb2JsZW1zIH07XG59XG5cbmZ1bmN0aW9uIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShGUk9OVE1BVFRFUl9SRUdfRVhQLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwSW5saW5lQ29kZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKElOTElORV9DT0RFX1JFR19FWFAsICcnKTtcbn1cblxuLy8gQSBoYW5kLXdyaXR0ZW4gbGluayBtYXkgY29udGFpbiBhIGJhcmUgYCVgIChvciBhbnkgb3RoZXIgaW52YWxpZCBwZXJjZW50LWVzY2FwZSksIHdoaWNoIG1ha2VzXG4vLyBgZGVjb2RlVVJJQ29tcG9uZW50YCB0aHJvdy4gU3VjaCBhIHRhcmdldCBpcyBtZWFudCBsaXRlcmFsbHksIHNvIGl0IGlzIHVzZWQgYXMgd3JpdHRlbi5cbmZ1bmN0aW9uIHRyeURlY29kZVVyaUNvbXBvbmVudCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0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
715
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTdGF0aWMgY292ZXJhZ2UvZnJlc2huZXNzIGNoZWNrcyB0aGF0IGtlZXAgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AgaW4gc3luYyB3aXRoIGl0cyBwdWJsaWMgc3VyZmFjZS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIFRoZXNlIGhlbHBlcnMgcmVmbGVjdCB0aGUgcmVhbFxuICogcHVibGljIEFQSS9jb25maWcvZG9jcyBzdHJhaWdodCBmcm9tIHNvdXJjZSBhbmQgYXNzZXJ0IOKAlCBXSVRIT1VUIGxhdW5jaGluZyBPYnNpZGlhbiDigJQgdGhhdCBldmVyeSBmZWF0dXJlIGlzXG4gKiBkZW1vbnN0cmF0ZWQgaW4gdGhlIG5vdGVzIGFuZCB0aGF0IHRoZSBub3RlcyByZWZlcmVuY2Ugbm8gQVBJIG1lbWJlciB0aGF0IG5vIGxvbmdlciBleGlzdHMgKHJlbmFtZSBkcmlmdCkuXG4gKiBUaGUgcnVudGltZSBiZWhhdmlvciBvZiB0aGUgcGx1Z2luIGlzIGNvdmVyZWQgYnkgaXRzIG90aGVyIGludGVncmF0aW9uIHRlc3RzLCBub3QgYnkgdGhlIGRlbW8gdmF1bHQ7IHRoZVxuICogdmF1bHQgaXMgYSBsZWFybmluZyByZXNvdXJjZSwgYW5kIHRoZXNlIGNoZWNrcyBvbmx5IGd1YXJkIHRoYXQgaXQgc3RheXMgdHJ1dGhmdWwuXG4gKlxuICogVGhleSBhbHNvIGd1YXJkIHRoZSB2YXVsdCdzIG93biBgLm9ic2lkaWFuL2FwcC5qc29uYDogdGhlIHNldHRpbmdzIGxpc3RlZCBpblxuICoge0BsaW5rIERFTU9fVkFVTFRfQVBQX0pTT05fU0VUVElOR1N9IGJlbG9uZyB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYCwgd2hpY2ggd3JpdGVzIHRoZW0gaW50byB0aGUgYXJjaGl2ZWRcbiAqIHZhdWx0IGF0IHJlbGVhc2UgdGltZSwgc28gYSB2YXVsdCB0aGF0IGNvbW1pdHMgYW55IG9mIHRoZW0gaXMga2VlcGluZyBhIHNlY29uZCBjb3B5IG5vdGhpbmcgcmVjb25jaWxlcy5cbiAqXG4gKiBUaGV5IGFsc28gZW5mb3JjZSB0aGUgZGVtby12YXVsdCBBVVRIT1JJTkcgY29udmVudGlvbiDigJQgZXZlcnkgbm90ZSBvcGVucyB3aXRoIGFuIGAjIEgxYCBhbmQgYSBwbGFpblxuICogcHJvc2UgcGFyYWdyYXBoLCBldmVyeSBub3RlIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBzdGFydCBub3RlLCBhbmQgbm8gbm90ZSB1c2VzIGEgYFtbd2lraWxpbmtdXWAgb3IgYVxuICogYFtEb2NzXSjigKYpYCBsaW5lLiBUaGVzZSBjaGVja3MgYXJlIHVuY29uZGl0aW9uYWw6IHRoZSBkZW1vIHZhdWx0IGlzIHRoZSBwdWJsaXNoZWQgZG9jdW1lbnRhdGlvbiwgcmVhZFxuICogaW4gT2JzaWRpYW4gQU5EIG9uIEdpdEh1YiAod2hlcmUgYSB3aWtpbGluayBkb2VzIG5vdCByZW5kZXIpLCBzbyBhIG5vdGUgdGhhdCBicmVha3MgdGhlIGNvbnZlbnRpb24gaXNcbiAqIGJyb2tlbiBmb3IgcmVhbCByZWFkZXJzLiBgYXV0aG9yaW5nYCBvbmx5IHR1bmVzIHRoZW0gKHdoaWNoIG5vdGUgaXMgdGhlIHN0YXJ0LCB3aGljaCBub3RlcyBzaXQgb3V0c2lkZVxuICogdGhlIGxlYXJuaW5nIHBhdGgpOyBpdCBjYW5ub3Qgc3dpdGNoIHRoZW0gb2ZmLlxuICpcbiAqIE9ubHkgYHJvb3RGb2xkZXJgIGlzIHJlcXVpcmVkLCBzbyBhIHBsdWdpbiB3aXRoIG5vIHNldHRpbmdzIGFuZCBubyBwdWJsaWMgQVBJIHRvIHJlZmxlY3QgcmVnaXN0ZXJzIHRoZVxuICogc3VpdGUgd2l0aCB0aGF0IGFsb25lIGFuZCBzdGlsbCBnZXRzIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayDigJQgdGhlIGNoZWNrcyBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGF0IHRoZVxuICogcGx1Z2luIGV4cG9zZXMuIEVhY2ggcmVmbGVjdGlvbiBzcGVjIChgY29uZmlnSW50ZXJmYWNlc2AsIGBpbnRlcmZhY2VzYCwgYG5vblRyaXZpYWxHdWFyZGApIGFkZHMgdGhlIGNoZWNrc1xuICogaXQgZGVzY3JpYmVzIHdoZW4gc3VwcGxpZWQuIFRoZSB2YXVsdCBpcyBndWFyZGVkIGFnYWluc3QgYmVpbmcgZW1wdHkgZWl0aGVyIHdheTogd2l0aCBubyBub3RlcyB0byByZWFkLFxuICogZXZlcnkgYXV0aG9yaW5nIGNoZWNrIHdvdWxkIHBhc3MgYnkgaGF2aW5nIG5vdGhpbmcgdG8gbG9vayBhdC5cbiAqXG4gKiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIG5vdGUgd2hvc2UgU1VCSkVDVCBpcyB0aGUgd2lraWxpbmsg4oCUIGFuIGVtYmVkIHNwZWxsaW5nIHRoZSByZWFkZXIgaXMgYmVpbmcgdGF1Z2h0XG4gKiB0byB0eXBlLCBhIGZyb250bWF0dGVyIHByb3BlcnR5IHZhbHVlIHRoYXQgZXhpc3RzIHRvIGNvbnRyYXN0IHdpdGggYSBNYXJrZG93biBsaW5rLCBhIGZpeHR1cmUgdGhhdCBtdXN0XG4gKiBrZWVwIHRoZSB3aWtpbGluayBhIGNvbW1hbmQgaXMgc3VwcG9zZWQgdG8gbGVhdmUgYWxvbmUsIGEgbGluayB0aGUgcmVhZGVyIGNsaWNrcyB3aGlsZSBpdCBzdGlsbCByZXNvbHZlc1xuICogdG8gbm90aGluZy4gU3VjaCBhIG5vdGUgc2F5cyBzbyBpdHNlbGYsIHN0YXRpbmcgd2h5LCBpbiBvbmUgb2YgdHdvIGZvcm1zIG1vZGVsbGVkIG9uIEVTTGludCdzLlxuICpcbiAqIFBlciBsaW5lIG9yIHBlciByZWdpb24sIHdyaXR0ZW4gYXMgYW4gSFRNTCBjb21tZW50IHNvIGl0IGlzIGludmlzaWJsZSBpbiBPYnNpZGlhbiBBTkQgb24gR2l0SHViIOKAlCB0aGVcbiAqIHNwZWxsaW5nIHRoZXNlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWA6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUtbmV4dC1saW5lIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0gQ2xpY2tpbmcgYSBsaW5rIHRvIGEgbm90ZSB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCBJUyB0aGUgZmVhdHVyZS4gLS0+XG4gKiAyLiBDbGljayB0aGlzIGxpbms6IFtbUHJvamVjdHMvRnJlc2ggaWRlYV1dLlxuICpcbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLSBUaGUgd2lraWxpbmsgZW1iZWQgaXMgdGhlIHN5bnRheCB0aGlzIG5vdGUgdGVhY2hlcy4gLS0+XG4gKiAhW1tiYXNpYy5odG1sfDQwMF1dXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1lbmFibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLT5cbiAqIGBgYFxuICpcbiAqIFBlciBub3RlLCBpbiB0aGUgbm90ZSdzIG93biBmcm9udG1hdHRlciDigJQgdGhlIG9ubHkgZm9ybSB0aGF0IGNhbiByZWFjaCBhIHdpa2lsaW5rIElOU0lERSBmcm9udG1hdHRlcixcbiAqIHdoZXJlIGEgY29tbWVudCBjYW5ub3QgZ286XG4gKlxuICogYGBgeWFtbFxuICogLS0tXG4gKiBvYnNpZGlhbi1kZXYtdXRpbHM6XG4gKiAgIGRlbW8tdmF1bHQtdmFsaWRhdGlvbjpcbiAqICAgICBhbGxvdy13aWtpbGlua3M6IFRoZSBgd2lraWxpbmtgIHByb3BlcnR5IHZhbHVlIGlzIHRoZSBjb250cmFzdCB0aGlzIG5vdGUgaXMgYnVpbHQgYXJvdW5kLlxuICogLS0tXG4gKiBgYGBcbiAqXG4gKiBFaXRoZXIgd2F5IHRoZSBkZWNsYXJhdGlvbiB0cmF2ZWxzIHdpdGggdGhlIG5vdGUgcmF0aGVyIHRoYW4gc2l0dGluZyBpbiBhIGxpc3Qgc29tZXdoZXJlIGVsc2UsIGl0IGNhcnJpZXNcbiAqIGl0cyBqdXN0aWZpY2F0aW9uLCBhbmQgaXQgZXhlbXB0cyBvbmx5IHRoZSBXSUtJTElOSyBjaGVjayDigJQgdGhlIEgxLCBwcm9zZSwgcmVhY2hhYmlsaXR5IGFuZCBgW0RvY3NdYFxuICogY2hlY2tzIHN0aWxsIGFwcGx5LiBBIGRlY2xhcmF0aW9uIHdpdGggbm8gcmVhc29uLCBvbmUgY292ZXJpbmcgbm8gd2lraWxpbmssIGEgcmVnaW9uIG5ldmVyIGVuYWJsZWQgYWdhaW4sXG4gKiBvciBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlIGFsbCBmYWlsOiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCB0aGF0IG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIG9yIHRoYXRcbiAqIHNpbGVudGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vIGV4ZW1wdGlvbiBhdCBhbGwuXG4gKlxuICogVGhleSBhbHNvIGNoZWNrIHRoYXQgZXZlcnkgYFRyeSBpdGAgc2VjdGlvbiDigJQgYSBoZWFkaW5nIG9mIGFueSBsZXZlbCBzdGFydGluZyBgVHJ5IGl0YCwgdXAgdG8gdGhlIG5leHRcbiAqIGhlYWRpbmcgb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwg4oCUIGhvbGRzIGEgYGNvZGUtYnV0dG9uYCB0aGF0IHBlcmZvcm1zIGl0cyBzZXR1cCwgYmVjYXVzZSBhIHJlYWRlclxuICogYXNrZWQgdG8gY29uZmlndXJlIHRoaW5ncyBieSBoYW5kIGlzIGEgcmVhZGVyIHRoZSBkZW1vIGxvc3QuIEEgc2VjdGlvbiB3aG9zZSBzdGVwcyByZWFsbHkgY2Fubm90IGJlXG4gKiBzY3JpcHRlZCBzYXlzIHNvIHdpdGggdGhlIHNhbWUgZGlyZWN0aXZlLCBuYW1pbmcgdGhlIGBkZW1vLXZhdWx0LXZhbGlkYXRpb24vdHJ5LWl0LWNvZGUtYnV0dG9uYCBydWxlIG9uXG4gKiB0aGUgaGVhZGluZywgYW5kIHdpdGggdGhlIHNhbWUgY2hlY2tzIG9uIHRoZSBkaXJlY3RpdmUgaXRzZWxmOlxuICpcbiAqIGBgYG1hcmtkb3duXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlLW5leHQtbGluZSBkZW1vLXZhdWx0LXZhbGlkYXRpb24vdHJ5LWl0LWNvZGUtYnV0dG9uIC0tIERyYWdnaW5nIGEgZmlsZSBpbiBmcm9tIG91dHNpZGUgT2JzaWRpYW4gY2Fubm90IGJlIHNjcmlwdGVkLiAtLT5cbiAqICMjIFRyeSBpdFxuICogYGBgXG4gKlxuICogVGhhdCBjaGVjayBmYWlscyB0aGUgc3VpdGUgYnkgZGVmYXVsdDsge0BsaW5rIERlbW9WYXVsdEF1dGhvcmluZ1NwZWMudHJ5SXRDb2RlQnV0dG9uc30gc2V0IHRvIGAnd2FybidgXG4gKiBwcmludHMgdGhlIHNlY3Rpb25zIGluc3RlYWQsIGZvciBhIHZhdWx0IHN0aWxsIGJlaW5nIGJyb3VnaHQgdXAgdG8gaXQuXG4gKlxuICogVHdvIGxheWVycyBhcmUgZXhwb3NlZDpcbiAqIC0ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0g4oCUIGEgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgdGhhdCByZWFkcyB0aGUgY29ycHVzLCBwYXJzZXMgaW50ZXJmYWNlIC9cbiAqICAgY2xhc3MgLyBlbnVtIG1lbWJlcnMgYW5kIGV4cG9ydGVkIGZ1bmN0aW9ucywgYW5kIHJldHVybnMgZGlhZ25vc3RpYyBhcnJheXMgKHdoYXQgaXMgdW5kZW1vbnN0cmF0ZWQgLyBzdGFsZVxuICogICAvIHVubGlua2VkIC8gb2ZmLWNvbnZlbnRpb24pLlxuICogLSB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfSDigJQgYSB0aGluIHdyYXBwZXIgdGhhdCByZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSBvdmVyIHRoZSBjb3JlLCBzb1xuICogICBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCBpcyBhIHNpbmdsZSBkZWNsYXJhdGl2ZSBjYWxsLlxuICovXG5cbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBkZXNjcmliZSxcbiAgZXhwZWN0LFxuICBpdFxufSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQge1xuICBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MsXG4gIHBhcnNlRGVtb1ZhdWx0QXBwSnNvblxufSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcblxuLyoqXG4gKiBUdW5lcyB0aGUgYWx3YXlzLW9uIGF1dGhvcmluZyBjaGVja3MuIEl0IGNhbm5vdCBkaXNhYmxlIHRoZW0g4oCUIHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRBdXRob3JpbmdTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlcyAocGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoYXQgc2l0IG91dHNpZGUgdGhlIGxlYXJuaW5nIHBhdGggYW5kIGFyZSB0aGVyZWZvcmVcbiAgICogZXhlbXB0IGZyb20gZXZlcnkgYXV0aG9yaW5nIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgdmF1bHQncyBvd24gYFJFQURNRS5tZGAsIHdoaWNoIGFkZHJlc3NlcyBzb21lb25lXG4gICAqIGJyb3dzaW5nIHRoZSByZXBvIG9uIEdpdEh1YiByYXRoZXIgdGhhbiBhIHJlYWRlciB3b3JraW5nIHRocm91Z2ggdGhlIHZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgZXZlcnkgb3RoZXIgbm90ZSBtdXN0IGJlIHJlYWNoYWJsZSBmcm9tLiBEZWZhdWx0cyB0b1xuICAgKiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnROb3RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgYSBgVHJ5IGl0YCBzZWN0aW9uIHdpdGggbm8gYGNvZGUtYnV0dG9uYCBhbmQgbm8gZGlyZWN0aXZlIGV4cGxhaW5pbmcgd2h5IGlzIHJlcG9ydGVkOiBgJ3dhcm4nYFxuICAgKiBwcmludHMgdGhlIHNlY3Rpb25zIGFuZCBwYXNzZXMsIGAnZXJyb3InYCBmYWlscyB0aGUgc3VpdGUuIERlZmF1bHRzIHRvIGAnZXJyb3InYC5cbiAgICovXG4gIHJlYWRvbmx5IHRyeUl0Q29kZUJ1dHRvbnM/OiBEZW1vVmF1bHRDaGVja1NldmVyaXR5O1xufVxuXG4vKipcbiAqIEhvdyBhIGNoZWNrIHRoYXQgaXMgYmVpbmcgaW50cm9kdWNlZCBncmFkdWFsbHkgcmVwb3J0cyB3aGF0IGl0IGZpbmRzOiBgJ3dhcm4nYCBwcmludHMgaXQgYW5kIHBhc3NlcyxcbiAqIGAnZXJyb3InYCBmYWlscy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVtb1ZhdWx0Q2hlY2tTZXZlcml0eSA9ICdlcnJvcicgfCAnd2Fybic7XG5cbi8qKlxuICogUmVmbGVjdHMgYSBjb25maWcgaW50ZXJmYWNlIHdob3NlIG9wdGlvbnMgYXJlIGRlbW9uc3RyYXRlZCBieSB0aGVpciBiYXJlIG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q29uZmlnSW50ZXJmYWNlQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHdob3NlIHByb3BlcnRpZXMgYXJlIHRoZSBjb25maWdcbiAgICogb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZXMgKHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSBleGVtcHQgZnJvbSB0aGUgYXV0aG9yaW5nIGNoZWNrcy4gRGVmYXVsdHMgdG8gdGhlXG4gICAqIHZhdWx0J3Mgb3duIGBSRUFETUUubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGx1Z2luIHJlcG8gcm9vdCDigJQgdGhlIGZvbGRlciBjb250YWluaW5nIGBkZW1vLXZhdWx0L2AgYW5kIHRoZSBzb3VyY2UgYmVpbmdcbiAgICogcmVmbGVjdGVkLiBDYWxsZXJzIHR5cGljYWxseSBwYXNzIGBnZXRSb290Rm9sZGVyKCkgPz8gcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFN0YWxlUmVmZXJlbmNlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFN0YWxlUmVmZXJlbmNlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVjZWl2ZXIgd2hvc2UgYGAgYCR7cmVjZWl2ZXJ9LjxtZW1iZXI+YCBgYCByZWZlcmVuY2VzIGFyZSBzY2FubmVkIGZvciBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVtYmVycyB0aGF0IGN1cnJlbnRseSBleGlzdCBvbiB0aGUgcmVjZWl2ZXI7IGFueSByZWZlcmVuY2VkIG1lbWJlciBub3QgaW4gdGhpcyBzZXQgaXMgc3RhbGUuXG4gICAqL1xuICByZWFkb25seSB2YWxpZE1lbWJlcnM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG1lbWJlciBuYW1lcyB0aGF0IG11c3QgZWFjaCBhcHBlYXIgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVtYmVyczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBhIG1lbWJlciBpcyBkZW1vbnN0cmF0ZWQgb25seSBpZiBgYCBgJHtyZWNlaXZlcn0uJHttZW1iZXJ9YCBgYCBhcHBlYXJzIChlLmcuIGEgY29udGV4dCBvYmplY3Qnc1xuICAgKiBtZXRob2RzKTsgd2hlbiBhYnNlbnQsIHRoZSBiYXJlIG1lbWJlciBuYW1lIGlzIGxvb2tlZCB1cCAoZS5nLiBhIGNvbmZpZyBvcHRpb24pLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVubGlua2VkRmVhdHVyZURvY3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkb2NzIGZvbGRlciAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgdG9wLWxldmVsIGAqLm1kYCBmaWxlcyBhcmUgdGhlIGZlYXR1cmUgZG9jcy5cbiAgICovXG4gIHJlYWRvbmx5IGRvY3NGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIHRoYXQgYXJlIE5PVCBwZXItZmVhdHVyZSBwYWdlcyBhbmQgc28gbmVlZCBubyBsaW5raW5nIGRlbW8gbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vbkZlYXR1cmVEb2NzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kVW5yZWFjaGFibGVOb3Rlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5vdGUgKHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoZSB3YWxrIHN0YXJ0cyBmcm9tLCBlLmcuIGAwMCBTdGFydC5tZGAuXG4gICAqL1xuICByZWFkb25seSBzdGFydE5vdGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5nZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIGFyZSBwYXJzZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0SW50ZXJmYWNlTWVtYmVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB0byBwYXJzZS5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyB0aGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHREb2NzQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBkb2NzIGZvbGRlciAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgdG9wLWxldmVsIGAqLm1kYCBmaWxlcyBhcmUgdGhlIGZlYXR1cmUgZG9jcy5cbiAgICovXG4gIHJlYWRvbmx5IGZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgdGhhdCBhcmUgTk9UIHBlci1mZWF0dXJlIHBhZ2VzIGFuZCBzbyBuZWVkIG5vIGxpbmtpbmcgZGVtbyBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uRmVhdHVyZURvY3M6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgbW9kdWxlJ3MgZXhwb3J0ZWQgZnVuY3Rpb25zLCBlYWNoIGRlbW9uc3RyYXRlZCBieSBpdHMgYmFyZSBuYW1lIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgc2luZ2xlIGludGVyZmFjZSdzIG1lbWJlcnMgYW5kIGRlbW9uc3RyYXRlcyB0aGVtIHZpYSBgYCBgJHtyZWNlaXZlcn0uPG1lbWJlcj5gIGBgIHJlZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0SW50ZXJmYWNlQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHRvIHJlZmxlY3QuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRlbW9uc3RyYXRlZCBtZW1iZXJzIGFyZSB0aGUgcmVmbGVjdGVkIHR5cGUncyBtZXRob2RzIG9yIGl0cyBwcm9wZXJ0aWVzIChlbnVtIG1lbWJlcnMgY291bnQgYXNcbiAgICogcHJvcGVydGllcykuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBEZW1vVmF1bHRJbnRlcmZhY2VNZW1iZXJLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciB0aGUgbm90ZXMgY2FsbCB0aGUgbWVtYmVycyBvbiAoZS5nLiBgY29kZUJ1dHRvbkNvbnRleHRgKS5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gaW50ZXJmYWNlJ3MgZGVtb25zdHJhdGVkIG1lbWJlcnMgYXJlIGl0cyBtZXRob2RzIG9yIGl0cyBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgdHlwZSBEZW1vVmF1bHRJbnRlcmZhY2VNZW1iZXJLaW5kID0gJ21ldGhvZHMnIHwgJ3Byb3BlcnRpZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGd1YXJkIHRoYXQgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIGlzIG5vbi10cml2aWFsIChwcm90ZWN0cyBhZ2FpbnN0IGEgcGFyc2luZyByZWdyZXNzaW9uXG4gKiBzaWxlbnRseSBlbXB0eWluZyBldmVyeSBvdGhlciBjaGVjaykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYyB7XG4gIC8qKlxuICAgKiBBIGRlbW8gbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgdGhhdCBtdXN0IGJlIHByZXNlbnQuXG4gICAqL1xuICByZWFkb25seSBleHBlY3REZW1vTm90ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIG1lbWJlciB0aGF0IG11c3QgYmUgcmVmbGVjdGVkIGZyb20ge0BsaW5rIERlbW9WYXVsdE5vblRyaXZpYWxHdWFyZFNwZWMuaW50ZXJmYWNlTmFtZX0uXG4gICAqL1xuICByZWFkb25seSBleHBlY3RNZW1iZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgd2hvc2UgbWVtYmVycyBhcmUgcmUtcGFyc2VkIGZvciB0aGVcbiAgICogZ3VhcmQuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGRlbW8gbm90ZSwgYXMgcmVhZCBmcm9tIHRoZSBkZW1vIHZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdE5vdGUge1xuICAvKipcbiAgICogVGhlIG5vdGUncyByYXcgTWFya2Rvd24gY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGUncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IGZvbGRlciwgZS5nLiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBhIG5vdGUncyBpbmxpbmUgYG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxl4oCmYCBkaXJlY3RpdmVzIGFsbG93LCBydWxlIGJ5IHJ1bGUsIGFuZCB3aGF0IGlzIHdyb25nIHdpdGhcbiAqIHRoZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0aXZlU2NhbiB7XG4gIC8qKlxuICAgKiBGb3IgZWFjaCBydWxlLCB0aGUgemVyby1iYXNlZCBsaW5lIG51bWJlcnMgYSBkaXJlY3RpdmUgZXhlbXB0cyBmcm9tIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZExpbmVJbmRleGVzQnlSdWxlOiBSZWFkb25seU1hcDxzdHJpbmcsIFJlYWRvbmx5U2V0PG51bWJlcj4+O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aXZlIG1pc3Rha2VzIGZvdW5kLCBlYWNoIHBocmFzZWQgZm9yIGEgZmFpbGluZyBhc3NlcnRpb24uXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHJ1bm5pbmcgc3RhdGUgb2YgYSBkaXJlY3RpdmUgc2NhbiwgdGhyZWFkZWQgdGhyb3VnaCB0aGUgcGVyLWxpbmUgaGVscGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVTY2FuU3RhdGUge1xuICAvKipcbiAgICogRm9yIGVhY2ggcnVsZSwgdGhlIGxpbmVzIGEgZGlyZWN0aXZlIGhhcyBleGVtcHRlZCBmcm9tIGl0IHNvIGZhci5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRMaW5lSW5kZXhlc0J5UnVsZTogTWFwPHN0cmluZywgU2V0PG51bWJlcj4+O1xuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCBydWxlLCB0aGUgcmVnaW9uIGN1cnJlbnRseSBvcGVuLCBhbmQgd2hldGhlciBpdCBoYXMgY292ZXJlZCBhIHRhcmdldCB5ZXQuXG4gICAqL1xuICByZWFkb25seSBvcGVuUmVnaW9uc0J5UnVsZTogTWFwPHN0cmluZywgT3BlbkRpcmVjdGl2ZVJlZ2lvbj47XG5cbiAgLyoqXG4gICAqIEZvciBlYWNoIHJ1bGUsIHRoZSBsaW5lIGEgYGRpc2FibGUtbmV4dC1saW5lYCB3YXMgcmVhZCBvbiwgd2hpbGUgaXQgc3RpbGwgd2FpdHMgZm9yIHRoZSBsaW5lIGl0IGNvdmVycy5cbiAgICovXG4gIHJlYWRvbmx5IHBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGU6IE1hcDxzdHJpbmcsIG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUgbWlzdGFrZXMgZm91bmQgc28gZmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCBydWxlLCB0aGUgbGluZXMgb2YgdGhlIG5vdGUgdGhhdCBicmVhayBpdCDigJQgdGhlIGxpbmVzIGEgZGlyZWN0aXZlIGZvciBpdCBoYXMgdG8gY292ZXIgdG8gYmVcbiAgICogZG9pbmcgYW55IHdvcmsuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRMaW5lSW5kZXhlc0J5UnVsZTogUmVhZG9ubHlNYXA8c3RyaW5nLCBSZWFkb25seVNldDxudW1iZXI+Pjtcbn1cblxuLyoqXG4gKiBUaGUgcGFyc2VkIG1lbWJlcnMgb2YgYSBzb3VyY2UgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgLyoqXG4gICAqIEV2ZXJ5IG1lbWJlciDigJQge0BsaW5rIEludGVyZmFjZU1lbWJlcnMubWV0aG9kc30gZm9sbG93ZWQgYnkge0BsaW5rIEludGVyZmFjZU1lbWJlcnMucHJvcGVydGllc30uXG4gICAqL1xuICByZWFkb25seSBhbGw6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIG1lbWJlcnMgKGRlY2xhcmVkIGFzIGBuYW1lKC4uLilgKS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbWVtYmVycyAoZGVjbGFyZWQgYXMgYG5hbWU/OiAuLi5gKS5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnRpZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgbm90ZSBsaW5lIHBhaXJlZCB3aXRoIHRoZSBsaW5lIG51bWJlciBpdCBjYW1lIGZyb20sIHNvIGEgY2hlY2sgdGhhdCBza2lwcyBmZW5jZWQgYmxvY2tzIGNhbiBzdGlsbFxuICogcmVwb3J0IOKAlCBhbmQgYW4gaW5saW5lIGRpcmVjdGl2ZSBjYW4gc3RpbGwgbmFtZSDigJQgdGhlIGxpbmUgYXMgdGhlIHJlYWRlciBzZWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGVMaW5lIHtcbiAgLyoqXG4gICAqIFRoZSB6ZXJvLWJhc2VkIGxpbmUgbnVtYmVyIHdpdGhpbiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lJ3MgcmF3IHRleHQuXG4gICAqL1xuICByZWFkb25seSBsaW5lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBgZGlzYWJsZWAgcmVnaW9uIHRoYXQgaGFzIGJlZW4gb3BlbmVkIGFuZCBub3QgeWV0IGVuYWJsZWQgYWdhaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkRpcmVjdGl2ZVJlZ2lvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSByZWdpb24gaGFzIGNvdmVyZWQgYSBsaW5lIGJyZWFraW5nIGl0cyBydWxlLCB3aGljaCBpcyB3aGF0IHN0b3BzIGl0IGJlaW5nIHJlcG9ydGVkIGFzXG4gICAqIHBvaW50bGVzcy5cbiAgICovXG4gIGlzVXNlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgdGhlIHJlZ2lvbiB3YXMgb3BlbmVkIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZUluZGV4OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBgZGlzYWJsZWAgcmVnaW9uIHRoYXQgaGFzIGJlZW4gb3BlbmVkIGFuZCBub3QgeWV0IGVuYWJsZWQgYWdhaW4uXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBPcGVuRGlyZWN0aXZlUmVnaW9ufTogdGhlIGRpcmVjdGl2ZXMgbm93IHNlcnZlIG1vcmUgdGhhbiB0aGUgd2lraWxpbmsgcnVsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuV2lraWxpbmtEaXJlY3RpdmVSZWdpb24ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVnaW9uIGhhcyBjb3ZlcmVkIGEgd2lraWxpbmssIHdoaWNoIGlzIHdoYXQgc3RvcHMgaXQgYmVpbmcgcmVwb3J0ZWQgYXMgcG9pbnRsZXNzLlxuICAgKi9cbiAgaXNVc2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSB0aGUgcmVnaW9uIHdhcyBvcGVuZWQgb24uXG4gICAqL1xuICByZWFkb25seSBsaW5lSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFR1bmVzIHRoZSBhbHdheXMtb24gYXV0aG9yaW5nIGNoZWNrcywgb3IgYHVuZGVmaW5lZGAgdG8gdGFrZSB0aGVpciBkZWZhdWx0cy4gSXQgY2Fubm90IGRpc2FibGUgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcmluZz86IERlbW9WYXVsdEF1dGhvcmluZ1NwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWcgaW50ZXJmYWNlcyB3aG9zZSBvcHRpb25zIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICAgKiBwbHVnaW4gaGFzIG5vIHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnSW50ZXJmYWNlcz86IERlbW9WYXVsdENvbmZpZ0ludGVyZmFjZUNvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjaywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGx1Z2luIHNoaXBzIG5vIGBkb2NzL2AgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jcz86IERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2R1bGVzIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAgICogcGx1Z2luIGV4cG9zZXMgbm8gc3VjaCBtb2R1bGUgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk1vZHVsZXM/OiBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGludGVyZmFjZXMgd2hvc2UgbWVtYmVycyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIChhbmQgcmVmZXJlbmNlZCB3aXRob3V0IGRyaWZ0KSwgb3IgYHVuZGVmaW5lZGAgd2hlblxuICAgKiB0aGUgcGx1Z2luIGV4cG9zZXMgbm8gcHVibGljIEFQSSBzdXJmYWNlIHRvIHJlZmxlY3QuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VzPzogRGVtb1ZhdWx0SW50ZXJmYWNlQ292ZXJhZ2VTcGVjW107XG5cbiAgLyoqXG4gICAqIFRoZSBndWFyZCB0aGF0IGtlZXBzIHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBub24tdHJpdmlhbCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBubyByZWZsZWN0ZWQgc3VyZmFjZVxuICAgKiB0byBndWFyZC4gVGhlIHZhdWx0IGlzIGNoZWNrZWQgZm9yIGJlaW5nIG5vbi1lbXB0eSBlaXRoZXIgd2F5LlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uVHJpdmlhbEd1YXJkPzogRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYztcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHBsdWdpbiByZXBvIHJvb3QuIENhbGxlcnMgdHlwaWNhbGx5IHBhc3MgYGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGEgbm90ZSdzIGlubGluZSBgb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGXigKZgIGRpcmVjdGl2ZXMgYWxsb3csIGFuZCB3aGF0IGlzIHdyb25nIHdpdGggdGhlbS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIERpcmVjdGl2ZVNjYW59OiB0aGUgZGlyZWN0aXZlcyBub3cgc2VydmUgbW9yZSB0aGFuIHRoZSB3aWtpbGluayBydWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpa2lsaW5rRGlyZWN0aXZlU2NhbiB7XG4gIC8qKlxuICAgKiBUaGUgemVyby1iYXNlZCBsaW5lIG51bWJlcnMgYSBkaXJlY3RpdmUgYWxsb3dzIGEgd2lraWxpbmsgb24uXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXM6IFJlYWRvbmx5U2V0PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUgbWlzdGFrZXMgZm91bmQsIGVhY2ggcGhyYXNlZCBmb3IgYSBmYWlsaW5nIGFzc2VydGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcnVubmluZyBzdGF0ZSBvZiBhIGRpcmVjdGl2ZSBzY2FuLCB0aHJlYWRlZCB0aHJvdWdoIHRoZSBwZXItbGluZSBoZWxwZXJzLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgRGlyZWN0aXZlU2NhblN0YXRlfTogdGhlIGRpcmVjdGl2ZXMgbm93IHNlcnZlIG1vcmUgdGhhbiB0aGUgd2lraWxpbmsgcnVsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgbGluZXMgYSBkaXJlY3RpdmUgaGFzIGFsbG93ZWQgYSB3aWtpbGluayBvbiBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXM6IFNldDxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIGN1cnJlbnRseSBvcGVuLCBhbmQgd2hldGhlciBpdCBoYXMgY292ZXJlZCBhIHdpa2lsaW5rIHlldC5cbiAgICovXG4gIG9wZW5SZWdpb246IG51bGwgfCBPcGVuRGlyZWN0aXZlUmVnaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBhIGBkaXNhYmxlLW5leHQtbGluZWAgd2FzIHJlYWQgb24sIHdoaWxlIGl0IHN0aWxsIHdhaXRzIGZvciB0aGUgbGluZSBpdCBjb3ZlcnMuXG4gICAqL1xuICBwZW5kaW5nTmV4dExpbmVJbmRleDogbnVsbCB8IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGl2ZSBtaXN0YWtlcyBmb3VuZCBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lcyBvZiB0aGUgbm90ZSB0aGF0IGNhcnJ5IGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSB3aWtpbGlua0xpbmVJbmRleGVzOiBSZWFkb25seVNldDxudW1iZXI+O1xufVxuXG4vKipcbiAqIEEgYFRyeSBpdGAgc2VjdGlvbiBiZWluZyByZWFkLCBmcm9tIGl0cyBoZWFkaW5nIHRvIHRoZSBuZXh0IGhlYWRpbmcgb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwuXG4gKi9cbmludGVyZmFjZSBUcnlJdFNlY3Rpb24ge1xuICBoYXNDb2RlQnV0dG9uOiBib29sZWFuO1xuICByZWFkb25seSBsZXZlbDogbnVtYmVyO1xuICByZWFkb25seSBsaW5lSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIHBsdWdpbidzIHB1YmxpYyBzdXJmYWNlIGZyb20gc291cmNlIGFuZCBjaGVja3MgaXRzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCBzdGF5cyBpbiBzeW5jIHdpdGggaXQuXG4gKlxuICogRXZlcnkgbWV0aG9kIGlzIGEgcHVyZSBxdWVyeSBvdmVyIGZpbGVzIHVuZGVyIHRoZSByZXBvIHJvb3QgKHRoZSBkZW1vIGNvcnB1cyBpcyByZWFkIG9uY2UgYW5kIGNhY2hlZCksIHNvXG4gKiB0aGUgY2hlY2tlciBpcyB0cml2aWFsbHkgdW5pdC10ZXN0YWJsZSBhZ2FpbnN0IGEgZml4dHVyZSByZXBvIGFuZCBjYXJyaWVzIG5vIHRlc3QtZnJhbWV3b3JrIGRlcGVuZGVuY3kuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIge1xuICBwcml2YXRlIGNhY2hlZENvcnB1czogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgY2FjaGVkTm90ZXM6IERlbW9WYXVsdE5vdGVbXSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbW9WYXVsdEZvbGRlcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4Y2x1ZGVkTm90ZXM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNoZWNrZXIgcm9vdGVkIGF0IGEgcGx1Z2luIHJlcG8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLnJvb3RGb2xkZXIgPSBwYXJhbXMucm9vdEZvbGRlcjtcbiAgICB0aGlzLmRlbW9WYXVsdEZvbGRlciA9IGpvaW4odGhpcy5yb290Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQpO1xuICAgIHRoaXMuZXhjbHVkZWROb3RlcyA9IG5ldyBTZXQocGFyYW1zLmV4Y2x1ZGVkTm90ZXMgPz8gREVGQVVMVF9FWENMVURFRF9OT1RFUyk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgdGhlIGRlbW8gbm90ZXMgYXMgcGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgZm9sZGVyIChmb3IgYSBub24tdHJpdmlhbC1zdXJmYWNlIGd1YXJkKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIGV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0LlxuICAgKi9cbiAgcHVibGljIGNvbGxlY3REZW1vTm90ZVJlbGF0aXZlUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3ROb3RlcygpLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuZCBjYWNoZXMgZXZlcnkgZGVtbyBub3RlIGluZGl2aWR1YWxseSDigJQgdGhlIHBlci1ub3RlIHZpZXcgdGhlIGF1dGhvcmluZyBjaGVja3Mgd29yayBvbiwgYXNcbiAgICogb3Bwb3NlZCB0byB0aGUgY29uY2F0ZW5hdGVkIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIucmVhZENvcnB1c30uXG4gICAqXG4gICAqIEByZXR1cm5zIEV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0LCBleGNsdWRlZCBvbmVzIGluY2x1ZGVkLlxuICAgKi9cbiAgcHVibGljIGNvbGxlY3ROb3RlcygpOiBEZW1vVmF1bHROb3RlW10ge1xuICAgIHRoaXMuY2FjaGVkTm90ZXMgPz89IHRoaXMuY29sbGVjdE1hcmtkb3duRmlsZXModGhpcy5kZW1vVmF1bHRGb2xkZXIpLm1hcCgoZmlsZSkgPT4gKHtcbiAgICAgIGNvbnRlbnQ6IHJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKSxcbiAgICAgIHJlbGF0aXZlUGF0aDogcmVsYXRpdmUodGhpcy5kZW1vVmF1bHRGb2xkZXIsIGZpbGUpXG4gICAgfSkpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZE5vdGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBgLm9ic2lkaWFuL2FwcC5qc29uYCBzZXR0aW5ncyB0aGUgdmF1bHQgY29tbWl0cyB0aGF0IGBvYnNpZGlhbi1kZXYtdXRpbHNgIG93bnMgYW5kIHdyaXRlc1xuICAgKiBpbnRvIHRoZSBhcmNoaXZlZCB2YXVsdCBpdHNlbGYuIEEgY29tbWl0dGVkIG9uZSBpcyBhIHNlY29uZCBjb3B5IG9mIGEgc2V0dGluZyBub3RoaW5nIHJlY29uY2lsZXMsIGFuZFxuICAgKiBpdCBpcyB0aGUgY29weSB0aGF0IGdvZXMgc3RhbGUg4oCUIHNvIHRoZSBjb252ZW50aW9uIGlzIHRoYXQgdGhlIHZhdWx0IGNvbW1pdHMgbm9uZSBvZiB0aGVtLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmFtZXMgb2YgdGhlIG93bmVkIHNldHRpbmdzIHRoZSBjb21taXR0ZWQgYGFwcC5qc29uYCBzZXRzLiBBIHZhdWx0IHRoYXQgY29tbWl0cyBub1xuICAgKiBgYXBwLmpzb25gIGF0IGFsbCBpcyBmaW5lLCBhbmQgeWllbGRzIG5vbmUuXG4gICAqL1xuICBwdWJsaWMgZmluZENvbW1pdHRlZEFwcEpzb25TZXR0aW5ncygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYXBwSnNvblBhdGggPSBqb2luKHRoaXMuZGVtb1ZhdWx0Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbiwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQXBwSnNvbik7XG4gICAgY29uc3QgY29udGVudCA9IGV4aXN0c1N5bmMoYXBwSnNvblBhdGgpID8gcmVhZEZpbGVTeW5jKGFwcEpzb25QYXRoLCAndXRmLTgnKSA6IG51bGw7XG4gICAgcmV0dXJuIGZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5ncyh7IGFwcEpzb246IHBhcnNlRGVtb1ZhdWx0QXBwSnNvbih7IGNvbnRlbnQsIHBhdGg6IGFwcEpzb25QYXRoIH0pIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIGNhcnJ5aW5nIGEgYFtEb2NzXSjigKYpYCBsaW5rIGxpbmUuIFRoZSBub3RlIElTIHRoZSBkb2N1bWVudGF0aW9uLCBzbyBhIGxpbmUgcG9pbnRpbmdcbiAgICogZWxzZXdoZXJlIGZvciB0aGUgcmVhbCBleHBsYW5hdGlvbiBpcyB0aGUgc2hhcGUgdGhpcyBjb252ZW50aW9uIGV4aXN0cyB0byByZW1vdmUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhEb2NzTGlua3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiBnZXRMaW5lc091dHNpZGVGZW5jZXMobm90ZS5jb250ZW50KS5zb21lKChsaW5lKSA9PiBET0NTX0xJTktfUkVHX0VYUC50ZXN0KGxpbmUpKSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB0aGF0IGRvIG5vdCBvcGVuIHdpdGggYW4gYCMgSDFgIChmcm9udG1hdHRlciBhc2lkZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhvdXRIMSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+ICFoYXNIMShub3RlLmNvbnRlbnQpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHdpdGggbm8gcHJvc2UgcGFyYWdyYXBoIGJlZm9yZSB0aGVpciBmaXJzdCBjb2RlIGZlbmNlIOKAlCB0aGUgMS0zIHNlbnRlbmNlcyBzYXlpbmcgd2hhdCB0aGVcbiAgICogZmVhdHVyZSBkb2VzIGFuZCB3aHkgYSByZWFkZXIgd291bGQgd2FudCBpdCwgd2l0aG91dCB3aGljaCB0aGUgbm90ZSBpcyBhIGJ1dHRvbiB3aXRoIG5vIGxlc3Nvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aG91dEludHJvUHJvc2UoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiAhaGFzSW50cm9Qcm9zZShub3RlLmNvbnRlbnQpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHdob3NlIGV4ZW1wdGlvbnMgYXJlIG5vdCBkb2luZyBhbnkgd29yayDigJQgYSB3aWtpbGluayBhbGxvd2FuY2Ugb3IgYW4gaW5saW5lIGRpcmVjdGl2ZSBmb3JcbiAgICogYW55IHJ1bGUgZGVjbGFyZWQgd2l0aG91dCBhIHJlYXNvbiwgbWlzc3BlbGxlZCwgb3IgY292ZXJpbmcgbm90aGluZyB0aGF0IGJyZWFrcyBpdHMgcnVsZS4gQWxsIG9mIHRoZW1cbiAgICogYXJlIGRyaWZ0OiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCBhbmQgb25lIG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIHdoaWNoIHdvdWxkIGdvIG9uIGhpZGluZ1xuICAgKiB0aGUgbmV4dCBtaXN0YWtlIHNvbWVib2R5IG1ha2VzIGJ5IGFjY2lkZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBPbmUgYDxub3RlPjogPHByb2JsZW0+YCBlbnRyeSBwZXIgcHJvYmxlbSBmb3VuZC5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRoVW5qdXN0aWZpZWRXaWtpbGlua0FsbG93YW5jZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKCkuZmxhdE1hcCgobm90ZSkgPT4ge1xuICAgICAgY29uc3Qgc2NhbiA9IHNjYW5EaXJlY3RpdmVzKG5vdGUuY29udGVudCk7XG4gICAgICBjb25zdCBwcm9ibGVtcyA9IFsuLi5zY2FuLnByb2JsZW1zXTtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihub3RlLmNvbnRlbnQpO1xuICAgICAgaWYgKHJlYXNvbiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAocmVhc29uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdhIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIHdpdGggbm8gcmVhc29uJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc1dpa2lsaW5rKG5vdGUuY29udGVudCkpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdhIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIGNvdmVyaW5nIG5vIHdpa2lsaW5rJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2V0QWxsb3dlZExpbmVJbmRleGVzKHNjYW4sIFdJS0lMSU5LX1JVTEUpLnNpemUgPiAwKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnaW5saW5lIGRpcmVjdGl2ZXMgdGhlIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIGFscmVhZHkgY292ZXJzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9ibGVtcy5tYXAoKHByb2JsZW0pID0+IGAke25vdGUucmVsYXRpdmVQYXRofTogJHtwcm9ibGVtfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHVzaW5nIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gIG91dHNpZGUgYSBjb2RlIGZlbmNlLiBUaGUgZGVtbyB2YXVsdCBpcyBhbHNvIHJlYWQgb25cbiAgICogR2l0SHViLCB3aGVyZSBhIHdpa2lsaW5rIHJlbmRlcnMgYXMgbGl0ZXJhbCBicmFja2V0cyBhbmQgbGVhZHMgbm93aGVyZS4gQSB3aWtpbGluayBzaG93biBJTlNJREUgYVxuICAgKiBmZW5jZSBpcyBzYW1wbGUgdGV4dCwgbm90IG5hdmlnYXRpb24sIHNvIGZlbmNlZCBibG9ja3MgYXJlIHNraXBwZWQsIGFzIGlzIGEgbm90ZSB0aGF0IGRlY2xhcmVzIGluIGl0c1xuICAgKiBmcm9udG1hdHRlciB3aHkgaXRzIHdpa2lsaW5rcyBhcmUgdGhlIHBvaW50IOKAlCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhXaWtpbGlua3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiB7XG4gICAgICAgIGlmIChyZWFkV2lraWxpbmtBbGxvd2FuY2VSZWFzb24obm90ZS5jb250ZW50KSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGxvd2VkTGluZUluZGV4ZXMgPSBnZXRBbGxvd2VkTGluZUluZGV4ZXMoc2NhbkRpcmVjdGl2ZXMobm90ZS5jb250ZW50KSwgV0lLSUxJTktfUlVMRSk7XG4gICAgICAgIHJldHVybiBmaW5kV2lraWxpbmtMaW5lSW5kZXhlcyhub3RlLmNvbnRlbnQpLnNvbWUoKGxpbmVJbmRleCkgPT4gIWFsbG93ZWRMaW5lSW5kZXhlcy5oYXMobGluZUluZGV4KSk7XG4gICAgICB9KVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG1lbWJlcnMgdGhhdCB0aGUgZGVtbyBub3RlcyByZWZlcmVuY2Ugb24gYSByZWNlaXZlciBidXQgdGhhdCBubyBsb25nZXIgZXhpc3Qgb24gaXQgKHJlbmFtZSBkcmlmdCkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGRpc3RpbmN0IHN0YWxlIG1lbWJlciBuYW1lcyByZWZlcmVuY2VkIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICovXG4gIHB1YmxpYyBmaW5kU3RhbGVSZWZlcmVuY2VzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFN0YWxlUmVmZXJlbmNlc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWxpZE1lbWJlcnMgPSBuZXcgU2V0KHBhcmFtcy52YWxpZE1lbWJlcnMpO1xuICAgIGNvbnN0IHJlZmVyZW5jZWQgPSBbLi4udGhpcy5yZWFkQ29ycHVzKCkubWF0Y2hBbGwobmV3IFJlZ0V4cChTdHJpbmcucmF3YCR7cGFyYW1zLnJlY2VpdmVyfVxcLig/PG1lbWJlcj5cXHcrKWAsICdnJykpXVxuICAgICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtZW1iZXInKSk7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KHJlZmVyZW5jZWQpXS5maWx0ZXIoKG1lbWJlcikgPT4gIXZhbGlkTWVtYmVycy5oYXMobWVtYmVyKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYFRyeSBpdGAgc2VjdGlvbnMgd2l0aCBubyBgY29kZS1idXR0b25gIGluIHRoZW0uIEEgYFRyeSBpdGAgc2VjdGlvbiBpcyBhIGhlYWRpbmcgb2YgYW55IGxldmVsXG4gICAqIHN0YXJ0aW5nIGBUcnkgaXRgLCB1cCB0byB0aGUgbmV4dCBoZWFkaW5nIG9mIHRoZSBzYW1lIG9yIGEgaGlnaGVyIGxldmVsOyB0aGUgc2V0dXAgaXQgYXNrcyBmb3IgaXNcbiAgICogd2hhdCBhIGJ1dHRvbiBpcyBmb3IsIHNvIGEgc2VjdGlvbiB0aGF0IGxlYXZlcyB0aGUgcmVhZGVyIHRvIGRvIGl0IGJ5IGhhbmQgaXMgdGhlIHNoYXBlIHRoaXMgY2hlY2tcbiAgICogcmVqZWN0cy4gQSBzZWN0aW9uIHdob3NlIGhlYWRpbmcgYSBgZGVtby12YXVsdC12YWxpZGF0aW9uL3RyeS1pdC1jb2RlLWJ1dHRvbmAgZGlyZWN0aXZlIGNvdmVycyBoYXNcbiAgICogc3RhdGVkIHdoeSBpdCBjYW5ub3QgYmUgc2NyaXB0ZWQsIGFuZCBpcyBza2lwcGVkIOKAlCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcuXG4gICAqXG4gICAqIEByZXR1cm5zIE9uZSBgPG5vdGU+OiBsaW5lIDxuPmAgZW50cnkgcGVyIG9mZmVuZGluZyBzZWN0aW9uLCBuYW1pbmcgdGhlIGxpbmUgb2YgaXRzIGhlYWRpbmcuXG4gICAqL1xuICBwdWJsaWMgZmluZFRyeUl0U2VjdGlvbnNXaXRob3V0Q29kZUJ1dHRvbigpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKCkuZmxhdE1hcCgobm90ZSkgPT4ge1xuICAgICAgY29uc3QgYWxsb3dlZExpbmVJbmRleGVzID0gZ2V0QWxsb3dlZExpbmVJbmRleGVzKHNjYW5EaXJlY3RpdmVzKG5vdGUuY29udGVudCksIFRSWV9JVF9SVUxFKTtcbiAgICAgIHJldHVybiBmaW5kVHJ5SXRMaW5lSW5kZXhlc1dpdGhvdXRDb2RlQnV0dG9uKG5vdGUuY29udGVudClcbiAgICAgICAgLmZpbHRlcigobGluZUluZGV4KSA9PiAhYWxsb3dlZExpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpKVxuICAgICAgICAubWFwKChsaW5lSW5kZXgpID0+IGAke25vdGUucmVsYXRpdmVQYXRofTogJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbWVtYmVycyB0aGF0IGFyZSBub3QgZGVtb25zdHJhdGVkIGFueXdoZXJlIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgbWVtYmVyIG5hbWVzIHdpdGggbm8gZGVtb25zdHJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBmaW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb3JwdXMgPSB0aGlzLnJlYWRDb3JwdXMoKTtcbiAgICByZXR1cm4gcGFyYW1zLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IG5lZWRsZSA9IHBhcmFtcy5yZWNlaXZlciA9PT0gdW5kZWZpbmVkID8gbWVtYmVyIDogYCR7cGFyYW1zLnJlY2VpdmVyfS4ke21lbWJlcn1gO1xuICAgICAgcmV0dXJuICFjb3JwdXMuaW5jbHVkZXMobmVlZGxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBmZWF0dXJlIGRvY3MgdGhhdCBubyBkZW1vIG5vdGUgbGlua3MgdG8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGZlYXR1cmUtZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgbm90IGxpbmtlZCBmcm9tIGFueSBkZW1vIG5vdGUuXG4gICAqL1xuICBwdWJsaWMgZmluZFVubGlua2VkRmVhdHVyZURvY3MocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5saW5rZWRGZWF0dXJlRG9jc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBub25GZWF0dXJlRG9jcyA9IG5ldyBTZXQocGFyYW1zLm5vbkZlYXR1cmVEb2NzKTtcbiAgICBjb25zdCBmZWF0dXJlRG9jcyA9IHJlYWRkaXJTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuZG9jc0ZvbGRlcikpXG4gICAgICAuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKCcubWQnKSlcbiAgICAgIC5tYXAoKGZpbGUpID0+IGZpbGUucmVwbGFjZSgvXFwubWQkLywgJycpKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gIW5vbkZlYXR1cmVEb2NzLmhhcyhuYW1lKSk7XG4gICAgY29uc3QgbGlua2VkRG9jcyA9IG5ldyBTZXQoXG4gICAgICBbLi4udGhpcy5yZWFkQ29ycHVzKCkubWF0Y2hBbGwoL2RvY3NcXC8oPzxkb2M+W1xcdy1dKylcXC5tZC9nKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2RvYycpKVxuICAgICk7XG4gICAgcmV0dXJuIGZlYXR1cmVEb2NzLmZpbHRlcigoZG9jKSA9PiAhbGlua2VkRG9jcy5oYXMoZG9jKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgdGhhdCBjYW5ub3QgYmUgcmVhY2hlZCBmcm9tIHRoZSBzdGFydCBub3RlIGJ5IGZvbGxvd2luZyBNYXJrZG93biBsaW5rcyBiZXR3ZWVuIG5vdGVzLlxuICAgKlxuICAgKiBUaGUgd2FsayBzdGFydHMgYXQge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbnJlYWNoYWJsZU5vdGVzUGFyYW1zLnN0YXJ0Tm90ZX0gYW5kIGZvbGxvd3NcbiAgICogZXZlcnkgYFtUZXh0XSg8Li9OTiBOYW1lLm1kPilgIGxpbmsgb3V0c2lkZSBhIGNvZGUgZmVuY2UsIHRyYW5zaXRpdmVseS4gQSBub3RlIG5vdGhpbmcgbGlua3MgdG8gaXNcbiAgICogb25lIGEgcmVhZGVyIGNhbiBvbmx5IGZpbmQgYnkgYnJvd3NpbmcgdGhlIGZpbGUgbGlzdCDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZSBncm91cGVkIGluZGV4IGluIHRoZVxuICAgKiBzdGFydCBub3RlIGlzIG1lYW50IHRvIHJlcGxhY2UuIFdoZW4gdGhlIHN0YXJ0IG5vdGUgaXRzZWxmIGlzIG1pc3NpbmcsIEVWRVJZIG5vdGUgaXMgdW5yZWFjaGFibGUsXG4gICAqIGJlY2F1c2UgdGhlcmUgaXMgbm93aGVyZSB0byBzdGFydCBmcm9tLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YWxrLlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIHVucmVhY2hhYmxlIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbnJlYWNoYWJsZU5vdGVzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm90ZXNCeVJlbGF0aXZlUGF0aCA9IG5ldyBNYXAodGhpcy5jb2xsZWN0Tm90ZXMoKS5tYXAoKG5vdGUpID0+IFtub3RlLnJlbGF0aXZlUGF0aCwgbm90ZV0pKTtcbiAgICBjb25zdCByZWFjaGVkTm90ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBwZW5kaW5nTm90ZXMgPSBbcGFyYW1zLnN0YXJ0Tm90ZV07XG5cbiAgICB3aGlsZSAocGVuZGluZ05vdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vdGVQYXRoID0gZW5zdXJlTm9uTnVsbGFibGUocGVuZGluZ05vdGVzLnBvcCgpKTtcbiAgICAgIGNvbnN0IG5vdGUgPSBub3Rlc0J5UmVsYXRpdmVQYXRoLmdldChub3RlUGF0aCk7XG4gICAgICBpZiAoIW5vdGUgfHwgcmVhY2hlZE5vdGVzLmhhcyhub3RlUGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZWFjaGVkTm90ZXMuYWRkKG5vdGVQYXRoKTtcbiAgICAgIHBlbmRpbmdOb3Rlcy5wdXNoKC4uLmNvbGxlY3ROb3RlTGlua1RhcmdldHMobm90ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aClcbiAgICAgIC5maWx0ZXIoKG5vdGVQYXRoKSA9PiAhcmVhY2hlZE5vdGVzLmhhcyhub3RlUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgbmFtZXMgb2YgdGhlIGBleHBvcnQgZnVuY3Rpb25gcyAoaW5jbHVkaW5nIGBhc3luY2AgYW5kIGdlbmVyYXRvciBkZWNsYXJhdGlvbnMpIGluIGEgc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGV4cG9ydGVkIGZ1bmN0aW9uIG5hbWVzIGluIHNvdXJjZSBvcmRlci5cbiAgICovXG4gIHB1YmxpYyBnZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID0gcmVhZEZpbGVTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuc291cmNlUGF0aCksICd1dGYtOCcpO1xuICAgIHJldHVybiBbLi4uc291cmNlLm1hdGNoQWxsKC9eZXhwb3J0ICg/OmFzeW5jICk/ZnVuY3Rpb25cXCo/ICg/PG5hbWU+XFx3KykvZ20pXVxuICAgICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgbWVtYmVycyBvZiBhbiBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIGRlY2xhcmVkIGluIGEgc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIHBhcnNlZCB7QGxpbmsgSW50ZXJmYWNlTWVtYmVyc30uXG4gICAqIEB0aHJvd3MgV2hlbiB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHNvdXJjZSBmaWxlLlxuICAgKi9cbiAgcHVibGljIGdldEludGVyZmFjZU1lbWJlcnMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRJbnRlcmZhY2VNZW1iZXJzUGFyYW1zKTogSW50ZXJmYWNlTWVtYmVycyB7XG4gICAgY29uc3Qgc291cmNlID0gcmVhZEZpbGVTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuc291cmNlUGF0aCksICd1dGYtOCcpO1xuICAgIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YGV4cG9ydCAoPzxrZXl3b3JkPmludGVyZmFjZXxjbGFzc3xlbnVtKSAke3BhcmFtcy5pbnRlcmZhY2VOYW1lfVxcYltee10qXFx7KD88Ym9keT5bXFxzXFxTXSo/KVxcblxcfWApLmV4ZWMoc291cmNlKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGludGVyZmFjZSAke3BhcmFtcy5pbnRlcmZhY2VOYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VNZW1iZXJzKGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdrZXl3b3JkJyksIGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdib2R5JykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuZCBjYWNoZXMgdGhlIGRlbW8gY29ycHVzIOKAlCBldmVyeSBgKi5tZGAgbm90ZSBpbiB0aGUgZGVtbyB2YXVsdCBqb2luZWQgaW50byBvbmUgc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29uY2F0ZW5hdGVkIGRlbW8tbm90ZSBjb250ZW50cy5cbiAgICovXG4gIHB1YmxpYyByZWFkQ29ycHVzKCk6IHN0cmluZyB7XG4gICAgdGhpcy5jYWNoZWRDb3JwdXMgPz89IHRoaXMuY29sbGVjdE5vdGVzKClcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUuY29udGVudClcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRDb3JwdXM7XG4gIH1cblxuICAvLyBUaGUgbm90ZXMgdGhlIGF1dGhvcmluZyBjaGVja3MgYXBwbHkgdG86IGV2ZXJ5IG5vdGUgZXhjZXB0IHRoZSBvbmVzIGRlY2xhcmVkIG91dHNpZGUgdGhlIGxlYXJuaW5nXG4gIC8vIHBhdGggKHRoZSB2YXVsdCdzIG93biBgUkVBRE1FLm1kYCBieSBkZWZhdWx0KS5cbiAgcHJpdmF0ZSBjb2xsZWN0Q2hlY2thYmxlTm90ZXMoKTogRGVtb1ZhdWx0Tm90ZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Tm90ZXMoKS5maWx0ZXIoKG5vdGUpID0+ICF0aGlzLmV4Y2x1ZGVkTm90ZXMuaGFzKG5vdGUucmVsYXRpdmVQYXRoKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3RNYXJrZG93bkZpbGVzKGZvbGRlcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICAvLyBgcmVhZGRpclN5bmNgIHJldHVybnMgZW50cmllcyBpbiB0aGUgZmlsZSBzeXN0ZW0ncyBvd24gb3JkZXI6IGJ5IG5hbWUgb24gTlRGUywgYnV0IGJ5IGhhc2ggb24gZXh0NCwgc29cbiAgICAvLyBzb3J0IHRoZW0gc28gZXZlcnkgY2hlY2sgcmVwb3J0cyBpdHMgbm90ZXMgaW4gdGhlIHNhbWUgb3JkZXIgb24gZXZlcnkgcGxhdGZvcm0uXG4gICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSwgJ2VuJykpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk5vZGVNb2R1bGVzIGFzIHN0cmluZykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuY29sbGVjdE1hcmtkb3duRmlsZXMoam9pbihmb2xkZXIsIGVudHJ5Lm5hbWUpKSk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGpvaW4oZm9sZGVyLCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSB0aGF0IGtlZXBzIGEgcGx1Z2luJ3MgaW4tcmVwbyBgZGVtby12YXVsdC9gIGluIHN5bmMgd2l0aCBpdHMgcHVibGljIHN1cmZhY2UuXG4gKlxuICogQ2FsbCBpdCBvbmNlIGZyb20gYSBwbHVnaW4ncyBgZGVtby12YXVsdC5uby1hcHAuaW50ZWdyYXRpb24udGVzdC50c2A7IGl0IHJlZ2lzdGVycyBvbmUgdGVzdCBwZXIgY2hlY2ssXG4gKiBkZWxlZ2F0aW5nIHRvIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJ9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGVjbGFyYXRpdmUgY292ZXJhZ2Ugc3BlY2lmaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZShwYXJhbXM6IFJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZVBhcmFtcyk6IHZvaWQge1xuICBjb25zdCBjaGVja2VyID0gbmV3IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyQ29uc3RydWN0b3JQYXJhbXM+KHtcbiAgICBleGNsdWRlZE5vdGVzOiBwYXJhbXMuYXV0aG9yaW5nPy5leGNsdWRlZE5vdGVzLFxuICAgIHJvb3RGb2xkZXI6IHBhcmFtcy5yb290Rm9sZGVyXG4gIH0pKTtcbiAgY29uc3Qgc3RhcnROb3RlID0gcGFyYW1zLmF1dGhvcmluZz8uc3RhcnROb3RlID8/IERFRkFVTFRfU1RBUlRfTk9URTtcbiAgY29uc3QgdHJ5SXRDb2RlQnV0dG9ucyA9IHBhcmFtcy5hdXRob3Jpbmc/LnRyeUl0Q29kZUJ1dHRvbnMgPz8gREVGQVVMVF9UUllfSVRfQ09ERV9CVVRUT05TX1NFVkVSSVRZO1xuXG4gIGRlc2NyaWJlKCdkZW1vLXZhdWx0IGNvdmVyYWdlJywgKCkgPT4ge1xuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuaW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgaXQoYGRlbW9uc3RyYXRlcyBldmVyeSAke3NwZWMuaW50ZXJmYWNlTmFtZX0gJHtzcGVjLmtpbmR9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBjb25zdCBkZW1vbnN0cmF0ZWQgPSBtZW1iZXJzW3NwZWMua2luZF07XG4gICAgICAgIGV4cGVjdChkZW1vbnN0cmF0ZWQubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBkZW1vbnN0cmF0ZWQsIHJlY2VpdmVyOiBzcGVjLnJlY2VpdmVyIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdChgcmVmZXJlbmNlcyBubyAke3NwZWMuaW50ZXJmYWNlTmFtZX0gbWVtYmVyIHRoYXQgbm8gbG9uZ2VyIGV4aXN0c2AsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IGNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVycyhzcGVjKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFN0YWxlUmVmZXJlbmNlcyh7IHJlY2VpdmVyOiBzcGVjLnJlY2VpdmVyLCB2YWxpZE1lbWJlcnM6IG1lbWJlcnMuYWxsIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuY29uZmlnSW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgaXQoYGRlbW9uc3RyYXRlcyBldmVyeSAke3NwZWMuaW50ZXJmYWNlTmFtZX0gb3B0aW9uYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QobWVtYmVycy5wcm9wZXJ0aWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogbWVtYmVycy5wcm9wZXJ0aWVzIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuZnVuY3Rpb25Nb2R1bGVzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5IGV4cG9ydGVkIGZ1bmN0aW9uIGluICR7c3BlYy5zb3VyY2VQYXRofWAsICgpID0+IHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lcyA9IGNoZWNrZXIuZ2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzKHNwZWMpO1xuICAgICAgICBleHBlY3QoZnVuY3Rpb25OYW1lcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyh7IG1lbWJlcnM6IGZ1bmN0aW9uTmFtZXMgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jcyA9IHBhcmFtcy5kb2NzO1xuICAgIGlmIChkb2NzKSB7XG4gICAgICBpdCgnbGlua3MgYSBkZW1vIG5vdGUgZm9yIGV2ZXJ5IGZlYXR1cmUgZG9jJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5saW5rZWRGZWF0dXJlRG9jcyh7IGRvY3NGb2xkZXI6IGRvY3MuZm9sZGVyLCBub25GZWF0dXJlRG9jczogZG9jcy5ub25GZWF0dXJlRG9jcyB9KSlcbiAgICAgICAgICAudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpdCgnb3BlbnMgZXZlcnkgbm90ZSB3aXRoIGFuIEgxJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aG91dEgxKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ29wZW5zIGV2ZXJ5IG5vdGUgd2l0aCBhIHByb3NlIHBhcmFncmFwaCBiZWZvcmUgaXRzIGZpcnN0IGNvZGUgYmxvY2snLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRob3V0SW50cm9Qcm9zZSgpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KGByZWFjaGVzIGV2ZXJ5IG5vdGUgZnJvbSAke3N0YXJ0Tm90ZX1gLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5yZWFjaGFibGVOb3Rlcyh7IHN0YXJ0Tm90ZSB9KSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBubyB3aWtpbGlua3MsIHdoaWNoIGRvIG5vdCByZW5kZXIgb24gR2l0SHViJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aFdpa2lsaW5rcygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdqdXN0aWZpZXMgZXZlcnkgd2lraWxpbmsgYWxsb3dhbmNlIGFuZCBkaXJlY3RpdmUsIGFuZCBkZWNsYXJlcyBub25lIGl0IG5vIGxvbmdlciBuZWVkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dpdmVzIGV2ZXJ5IFRyeSBpdCBzZWN0aW9uIGEgY29kZSBidXR0b24sIG9yIGEgc3RhdGVkIHJlYXNvbiBpdCBoYXMgbm9uZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2hlY2tlci5maW5kVHJ5SXRTZWN0aW9uc1dpdGhvdXRDb2RlQnV0dG9uKCk7XG4gICAgICBpZiAodHJ5SXRDb2RlQnV0dG9ucyA9PT0gJ2Vycm9yJykge1xuICAgICAgICBleHBlY3Qoc2VjdGlvbnMpLnRvRXF1YWwoW10pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLndhcm4oZm9ybWF0VHJ5SXRXYXJuaW5nKHNlY3Rpb25zKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnY2FycmllcyBubyBEb2NzIGxpbmsgbGluZSwgYmVjYXVzZSB0aGUgbm90ZSBpcyB0aGUgZG9jcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhEb2NzTGlua3MoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY29tbWl0cyBub25lIG9mIHRoZSBhcHAuanNvbiBzZXR0aW5ncyBvYnNpZGlhbi1kZXYtdXRpbHMgaW5qZWN0cyBhdCByZWxlYXNlIHRpbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kQ29tbWl0dGVkQXBwSnNvblNldHRpbmdzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgLy8gV2l0aCBubyBub3RlcyB0byByZWFkLCBldmVyeSBhdXRob3JpbmcgY2hlY2sgYWJvdmUgcGFzc2VzIGJ5IGhhdmluZyBub3RoaW5nIHRvIGxvb2sgYXQsIHNvIGEgdmF1bHRcbiAgICAvLyB0aGF0IHN0b3BwZWQgYmVpbmcgZm91bmQgd291bGQgZ28gb24gcmVwb3J0aW5nIGl0c2VsZiBjbGVhbi4gVGhpcyBpcyB0aGUgaGFsZiBvZiB0aGUgbm9uLXRyaXZpYWxcbiAgICAvLyBndWFyZCB0aGF0IHN0aWxsIGFwcGxpZXMgd2hlbiB0aGUgcGx1Z2luIGV4cG9zZXMgbm90aGluZyB0byByZWZsZWN0LlxuICAgIGl0KCdyZWFkcyBhIG5vbi1lbXB0eSBkZW1vIHZhdWx0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuY29sbGVjdERlbW9Ob3RlUmVsYXRpdmVQYXRocygpLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZ3VhcmQgPSBwYXJhbXMubm9uVHJpdmlhbEd1YXJkO1xuICAgIGlmIChndWFyZCkge1xuICAgICAgaXQoJ2tlZXBzIHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBub24tdHJpdmlhbCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IGNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVycyhndWFyZCk7XG4gICAgICAgIGV4cGVjdChtZW1iZXJzLmFsbCkudG9Db250YWluKGd1YXJkLmV4cGVjdE1lbWJlcik7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmNvbGxlY3REZW1vTm90ZVJlbGF0aXZlUGF0aHMoKSkudG9Db250YWluKGd1YXJkLmV4cGVjdERlbW9Ob3RlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IENMQVNTX01FTUJFUl9NT0RJRklFUlMgPSBTdHJpbmcucmF3YCg/Oig/OnB1YmxpY3xwcml2YXRlfHByb3RlY3RlZHxyZWFkb25seXxzdGF0aWN8YWJzdHJhY3R8b3ZlcnJpZGUpXFxzKykqYDtcbmNvbnN0IEFCU09MVVRFX1VSTF9SRUdfRVhQID0gL15bYS16XVtcXHcrLi1dKjovaTtcbmNvbnN0IEFSUk9XX1JFR19FWFAgPSAvXlxccyo9Pi87XG5jb25zdCBGVU5DVElPTl9UWVBFX1BBUkFNRVRFUlNfUkVHX0VYUCA9IC9ePFtePl0qPlxccyovO1xuY29uc3QgQU5HTEVfQlJBQ0tFVFNfUkVHX0VYUCA9IC9ePHw+JC9nO1xuY29uc3QgQ09ERV9CVVRUT05fRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKig/OmBgYHx+fn4pXFxzKmNvZGUtYnV0dG9uXFxiLztcbmNvbnN0IENPREVfRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKig/OmBgYHx+fn4pLztcbmNvbnN0IERFRkFVTFRfRVhDTFVERURfTk9URVMgPSBbJ1JFQURNRS5tZCddO1xuY29uc3QgREVGQVVMVF9TVEFSVF9OT1RFID0gJzAwIFN0YXJ0Lm1kJztcbi8vIEl0IHNoaXBwZWQgYXMgYSB3YXJuaW5nIHdoaWxlIGV4aXN0aW5nIHZhdWx0cyB3ZXJlIGJyb3VnaHQgdXAgdG8gdGhlIGNoZWNrLCBhbmQgYmVjYW1lIGFuIGVycm9yIG9uY2UgdGhleSB3ZXJlLlxuY29uc3QgREVGQVVMVF9UUllfSVRfQ09ERV9CVVRUT05TX1NFVkVSSVRZOiBEZW1vVmF1bHRDaGVja1NldmVyaXR5ID0gJ2Vycm9yJztcbmNvbnN0IERPQ1NfTElOS19SRUdfRVhQID0gL15cXHMqXFxbRG9jc11cXCgvO1xuY29uc3QgRlJPTlRNQVRURVJfUkVHX0VYUCA9IC9eLS0tXFxyP1xcbltcXHNcXFNdKj9cXHI/XFxuLS0tW15cXFNcXG5dKlxccj9cXG4/LztcbmNvbnN0IEgxX1JFR19FWFAgPSAvXiMgXFxTLztcbmNvbnN0IEhFQURJTkdfTEVWRUxfUkVHX0VYUCA9IC9eIHswLDN9KD88aGFzaGVzPiN7MSw2fSkoPzpcXHN8JCkvO1xuY29uc3QgSEVBRElOR19SRUdfRVhQID0gL14jezEsNn0gLztcbmNvbnN0IElOTElORV9DT0RFX1JFR19FWFAgPSAvYFteYFxcbl0qYC9nO1xuY29uc3QgTUFSS0RPV05fTElOS19SRUdfRVhQID0gL1xcW1teXFxdXSpdXFwoKD88dGFyZ2V0PlteKV0rKVxcKS9nO1xuLy8gQW4gaW5saW5lIGRpcmVjdGl2ZSwgc2hhcGVkIGFmdGVyIEVTTGludCdzIGFuZCB3cml0dGVuIGFzIGFuIEhUTUwgY29tbWVudCBzbyBpdCBpcyBpbnZpc2libGUgQk9USCBpblxuLy8gT2JzaWRpYW4gYW5kIG9uIEdpdEh1YiDigJQgdGhlIHNhbWUgc3BlbGxpbmcgdGhlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWAuXG4vLyBBbiBPYnNpZGlhbiBgJSUg4oCmICUlYCBjb21tZW50IHdvdWxkIHNob3cgdXAgYXMgbGl0ZXJhbCB0ZXh0IG9uIEdpdEh1Yiwgd2hpY2ggaXMgaGFsZiB0aGUgcmVhZGVyc2hpcC5cbmNvbnN0IERJUkVDVElWRV9SRUdfRVhQID0gL15cXHMqPCEtLVxccypvYnNpZGlhbi1kZXYtdXRpbHMtKD88YWN0aW9uPmRpc2FibGUtbmV4dC1saW5lfGRpc2FibGV8ZW5hYmxlKVxccysoPzxydWxlPltcXHctXStcXC9bXFx3LV0rKSg/OlxccystLVxccysoPzxyZWFzb24+Lio/KSk/XFxzKi0tPlxccyokLztcbi8vIENhdGNoZXMgYSBkaXJlY3RpdmUgdGhhdCB3YXMgTUVBTlQgdG8gYmUgb25lIGJ1dCBpcyBtaXNzcGVsbGVkOiBpdCB3b3VsZCBvdGhlcndpc2UgcmVhZCBhcyBhbiBvcmRpbmFyeVxuLy8gY29tbWVudCBhbmQgc2lsZW50bHkgZG8gbm90aGluZywgd2hpY2ggaXMgdGhlIGZhaWx1cmUgbW9kZSBhIHN1cHByZXNzaW9uIHN5bnRheCBtdXN0IG5ldmVyIGhhdmUuXG5jb25zdCBESVJFQ1RJVkVfUFJPQkVfUkVHX0VYUCA9IC88IS0tXFxzKm9ic2lkaWFuLWRldi11dGlscy0vO1xuY29uc3QgVFJZX0lUX0hFQURJTkdfUkVHX0VYUCA9IC9eIHswLDN9I3sxLDZ9XFxzK1RyeSBpdFxcYi9pO1xuY29uc3QgVFJZX0lUX1JVTEUgPSAnZGVtby12YXVsdC12YWxpZGF0aW9uL3RyeS1pdC1jb2RlLWJ1dHRvbic7XG5jb25zdCBXSUtJTElOS19SVUxFID0gJ2RlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MnO1xuLy8gRXZlcnkgcnVsZSBhIGRpcmVjdGl2ZSBtYXkgbmFtZSwgd2l0aCB3aGF0IGEgbGluZSBicmVha2luZyBpdCBpcyBjYWxsZWQgaW4gYSBwcm9ibGVtIG1lc3NhZ2UuXG5jb25zdCBESVJFQ1RJVkVfUlVMRV9UQVJHRVRTID0gbmV3IE1hcChbXG4gIFtUUllfSVRfUlVMRSwgJ1RyeSBpdCBzZWN0aW9uIHdpdGhvdXQgYSBjb2RlIGJ1dHRvbiddLFxuICBbV0lLSUxJTktfUlVMRSwgJ3dpa2lsaW5rJ11cbl0pO1xuLy8gVGhlIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGZyb250bWF0dGVyIHBhdGgsIGF0IGFueSBpbmRlbnRhdGlvbjpcbi8vIFRoZSBrZXlzIG11c3QgbmVzdCBpbiB0aGF0IG9yZGVyLCBhbmQgYW55IGxpbmUgYmV0d2VlbiB0aGVtIGhhcyB0byBzdGF5IGluZGVudGVkLCBzbyBhIGRlZGVudCB0byB0aGVcbi8vIGRvY3VtZW50J3Mgb3duIHRvcCBsZXZlbCBlbmRzIHRoZSBtYXRjaCByYXRoZXIgdGhhbiByZWFjaGluZyBhIHNhbWUtbmFtZWQga2V5IHVuZGVyIGFub3RoZXIgcGFyZW50LlxuY29uc3QgV0lLSUxJTktfQUxMT1dBTkNFX1JFR19FWFAgPSAvXm9ic2lkaWFuLWRldi11dGlsczpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2RlbW8tdmF1bHQtdmFsaWRhdGlvbjpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2FsbG93LXdpa2lsaW5rczooPzxyZWFzb24+LiopJC9tO1xuY29uc3QgV0lLSUxJTktfUkVHX0VYUCA9IC9cXFtcXFtbXlxcXV0rXV0vO1xuXG4vLyBBcHBsaWVzIG9uZSBwYXJzZWQgZGlyZWN0aXZlIHRvIHRoZSBzY2FuLiBFYWNoIHJ1bGUga2VlcHMgaXRzIG93biByZWdpb24gYW5kIGl0cyBvd24gcGVuZGluZ1xuLy8gYGRpc2FibGUtbmV4dC1saW5lYCwgc28gYSBkaXJlY3RpdmUgZm9yIG9uZSBydWxlIG5ldmVyIGV4ZW1wdHMgYSBsaW5lIGZyb20gYW5vdGhlci5cbmZ1bmN0aW9uIGFwcGx5RGlyZWN0aXZlKHN0YXRlOiBEaXJlY3RpdmVTY2FuU3RhdGUsIGxpbmVJbmRleDogbnVtYmVyLCBtYXRjaDogUmVnRXhwRXhlY0FycmF5KTogdm9pZCB7XG4gIGNvbnN0IGFjdGlvbiA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdhY3Rpb24nKTtcbiAgY29uc3QgcnVsZSA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdydWxlJyk7XG4gIGNvbnN0IHJlYXNvbiA9IG1hdGNoLmdyb3Vwcz8uWydyZWFzb24nXT8udHJpbSgpID8/ICcnO1xuICBjb25zdCB0YXJnZXQgPSBESVJFQ1RJVkVfUlVMRV9UQVJHRVRTLmdldChydWxlKTtcbiAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYW4gdW5rbm93biBydWxlIFwiJHtydWxlfVwiIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYWN0aW9uICE9PSAnZW5hYmxlJyAmJiByZWFzb24gPT09ICcnKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXJlY3RpdmUgd2l0aCBubyByZWFzb24gb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUtbmV4dC1saW5lJykge1xuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGUuc2V0KHJ1bGUsIGxpbmVJbmRleCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3BlblJlZ2lvbiA9IHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLmdldChydWxlKTtcbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUnKSB7XG4gICAgaWYgKG9wZW5SZWdpb24pIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX0gaW5zaWRlIHRoZSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihvcGVuUmVnaW9uLmxpbmVJbmRleCl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLnNldChydWxlLCB7IGlzVXNlZDogZmFsc2UsIGxpbmVJbmRleCB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIW9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhbiBlbmFibGUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9IHdpdGggbm8gcmVnaW9uIG9wZW5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFvcGVuUmVnaW9uLmlzVXNlZCkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIob3BlblJlZ2lvbi5saW5lSW5kZXgpfSBjb3ZlcmluZyBubyAke3RhcmdldH1gKTtcbiAgfVxuICBzdGF0ZS5vcGVuUmVnaW9uc0J5UnVsZS5kZWxldGUocnVsZSk7XG59XG5cbi8vIEFwcGxpZXMgb25lIG9yZGluYXJ5IGxpbmUgdG8gdGhlIHNjYW4sIHJ1bGUgYnkgcnVsZTogYW4gb3BlbiByZWdpb24gY292ZXJzIGl0LCBhbmQgYSBwZW5kaW5nXG4vLyBgZGlzYWJsZS1uZXh0LWxpbmVgIGNsYWltcyB0aGUgZmlyc3QgbGluZSB3aXRoIGNvbnRlbnQgb24gaXQg4oCUIHRoZSBkaXJlY3RpdmUgYW5kIGl0cyB0YXJnZXQgYXJlIHVzdWFsbHkgYVxuLy8gYmxhbmsgbGluZSBhcGFydC5cbmZ1bmN0aW9uIGFwcGx5RGlyZWN0aXZlU2NhbkxpbmUoc3RhdGU6IERpcmVjdGl2ZVNjYW5TdGF0ZSwgbGluZUluZGV4OiBudW1iZXIsIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtydWxlLCB0YXJnZXRdIG9mIERJUkVDVElWRV9SVUxFX1RBUkdFVFMpIHtcbiAgICBjb25zdCBpc1RhcmdldCA9IGVuc3VyZU5vbk51bGxhYmxlKHN0YXRlLnRhcmdldExpbmVJbmRleGVzQnlSdWxlLmdldChydWxlKSkuaGFzKGxpbmVJbmRleCk7XG4gICAgY29uc3Qgb3BlblJlZ2lvbiA9IHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLmdldChydWxlKTtcbiAgICBpZiAob3BlblJlZ2lvbikge1xuICAgICAgZ2V0T3JDcmVhdGVMaW5lSW5kZXhlcyhzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUsIHJ1bGUpLmFkZChsaW5lSW5kZXgpO1xuICAgICAgb3BlblJlZ2lvbi5pc1VzZWQgfHw9IGlzVGFyZ2V0O1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmdOZXh0TGluZUluZGV4ID0gc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXhlc0J5UnVsZS5nZXQocnVsZSk7XG4gICAgaWYgKHBlbmRpbmdOZXh0TGluZUluZGV4ID09PSB1bmRlZmluZWQgfHwgbGluZS50cmltKCkgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZ2V0T3JDcmVhdGVMaW5lSW5kZXhlcyhzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUsIHJ1bGUpLmFkZChsaW5lSW5kZXgpO1xuICAgIGlmICghaXNUYXJnZXQpIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZS1uZXh0LWxpbmUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHBlbmRpbmdOZXh0TGluZUluZGV4KX0gY292ZXJpbmcgbm8gJHt0YXJnZXR9YCk7XG4gICAgfVxuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGUuZGVsZXRlKHJ1bGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWVtYmVycyhtZXRob2RzOiBzdHJpbmdbXSwgcHJvcGVydGllczogc3RyaW5nW10pOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgcmV0dXJuIHtcbiAgICBhbGw6IFsuLi5tZXRob2RzLCAuLi5wcm9wZXJ0aWVzXSxcbiAgICBtZXRob2RzLFxuICAgIHByb3BlcnRpZXNcbiAgfTtcbn1cblxuLy8gUmVzb2x2ZXMgdGhlIG5vdGVzIGEgbm90ZSBsaW5rcyB0bzogZXZlcnkgTWFya2Rvd24gbGluayBvdXRzaWRlIGEgY29kZSBmZW5jZSB3aG9zZSB0YXJnZXQgaXMgYSBgLm1kYFxuLy8gZmlsZSwgbWFkZSByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBzbyBpdCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBub3RlIG1hcC4gRXh0ZXJuYWwgVVJMcyBhbmRcbi8vIG5vbi1ub3RlIHRhcmdldHMgKGltYWdlcywgc2NyaXB0cykgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsZWFybmluZyBwYXRoIGFuZCBhcmUgc2tpcHBlZDsgYSBgI2FuY2hvcmAgaXNcbi8vIGRyb3BwZWQsIHNpbmNlIGl0IGFkZHJlc3NlcyBhIHBsYWNlIGluc2lkZSBhbiBhbHJlYWR5LXJlc29sdmVkIG5vdGUuXG4vLyBSZXR1cm5zIHRoZSBub3RlJ3MgbGluZXMgd2l0aCBmZW5jZWQgY29kZSBibG9ja3MgcmVtb3ZlZCAodGhlIGZlbmNlIGxpbmVzIGluY2x1ZGVkKSwgcGFpcmVkIHdpdGggdGhlXG4vLyBsaW5lIG51bWJlciBlYWNoIGNhbWUgZnJvbSwgc28gYSBjaGVjayBuZXZlciBtaXN0YWtlcyBzYW1wbGUgY29kZSBmb3IgcHJvc2Ug4oCUIGEgYFtbd2lraWxpbmtdXWBcbi8vIGRlbW9uc3RyYXRlZCBpbnNpZGUgYSBmZW5jZSBpcyB0ZXh0LCBub3QgbmF2aWdhdGlvbiDigJQgYW5kIGFuIGlubGluZSBkaXJlY3RpdmUgY2FuIHN0aWxsIG5hbWUgYSBsaW5lLlxuZnVuY3Rpb24gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBOb3RlTGluZVtdIHtcbiAgY29uc3Qgbm90ZUxpbmVzOiBOb3RlTGluZVtdID0gW107XG4gIGxldCBpc0luc2lkZUZlbmNlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoQ09ERV9GRU5DRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIGlzSW5zaWRlRmVuY2UgPSAhaXNJbnNpZGVGZW5jZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWlzSW5zaWRlRmVuY2UpIHtcbiAgICAgIG5vdGVMaW5lcy5wdXNoKHsgaW5kZXgsIGxpbmUgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3RlTGluZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3ROb3RlTGlua1RhcmdldHMobm90ZTogRGVtb1ZhdWx0Tm90ZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdGFyZ2V0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGdldExpbmVzT3V0c2lkZUZlbmNlcyhub3RlLmNvbnRlbnQpKSB7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBzdHJpcElubGluZUNvZGUobGluZSkubWF0Y2hBbGwoTUFSS0RPV05fTElOS19SRUdfRVhQKSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpLnJlcGxhY2VBbGwoQU5HTEVfQlJBQ0tFVFNfUkVHX0VYUCwgJycpO1xuICAgICAgY29uc3QgW25vdGVQYXRoID0gJyddID0gdGFyZ2V0LnNwbGl0KCcjJywgMSk7XG4gICAgICBpZiAoQUJTT0xVVEVfVVJMX1JFR19FWFAudGVzdChub3RlUGF0aCkgfHwgIW5vdGVQYXRoLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0cy5wdXNoKGpvaW4oZGlybmFtZShub3RlLnJlbGF0aXZlUGF0aCksIHRyeURlY29kZVVyaUNvbXBvbmVudChub3RlUGF0aCkpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldHM7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGNsYXNzQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmNsYXNzQm9keS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgXiB7Mn0oPzxtb2RpZmllcnM+JHtDTEFTU19NRU1CRVJfTU9ESUZJRVJTfSkoPzxuYW1lPlxcdyspKD86PFtePl0qPik/XFwoYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc1Byb3BlcnR5TmFtZXMoY2xhc3NCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uY2xhc3NCb2R5Lm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeIHsyfSg/PG1vZGlmaWVycz4ke0NMQVNTX01FTUJFUl9NT0RJRklFUlN9KSg/PG5hbWU+XFx3KylcXHMqXFw/P1xccypbOj1dYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoZW51bUJvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5lbnVtQm9keS5tYXRjaEFsbCgvXiB7Mn0oPzxuYW1lPlxcdyspL2dtKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbi8vIEEgbWV0aG9kIGlzIGNhbGxhYmxlIHN1cmZhY2UgaG93ZXZlciBpdCBpcyB3cml0dGVuOiBhIG1ldGhvZCBzaWduYXR1cmUgKGBmb28oYmFyOiBzdHJpbmcpOiB2b2lkO2ApIG9yIGFcbi8vIHByb3BlcnR5IHNpZ25hdHVyZSB3aG9zZSB0eXBlIGlzIGEgZnVuY3Rpb24gdHlwZSAoYGZvbzogKGJhcjogc3RyaW5nKSA9PiB2b2lkO2ApLiBUaGUgc2hhcmVkIEVTTGludCBjb25maWdcbi8vIHJ1bnMgYEB0eXBlc2NyaXB0LWVzbGludC9tZXRob2Qtc2lnbmF0dXJlLXN0eWxlYCBhdCBpdHMgYHByb3BlcnR5YCBkZWZhdWx0LCBzbyBgbGludDpmaXhgIHJld3JpdGVzIHRoZVxuLy8gZmlyc3Qgc2hhcGUgaW50byB0aGUgc2Vjb25kIOKAlCByZWFkaW5nIG9ubHkgdGhlIGZpcnN0IHJlcG9ydGVkIHplcm8gbWV0aG9kcyBmb3IgZXZlcnkgc3VjaCBpbnRlcmZhY2UuXG5mdW5jdGlvbiBleHRyYWN0TWV0aG9kTmFtZXMoaW50ZXJmYWNlQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBtZXRob2RTaWduYXR1cmVOYW1lcyA9IFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/PG5hbWU+XFx3KykoPzo8W14+XSo+KT9cXCgvZ20pXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgY29uc3QgZnVuY3Rpb25Qcm9wZXJ0eU5hbWVzID0gbWF0Y2hQcm9wZXJ0eVNpZ25hdHVyZXMoaW50ZXJmYWNlQm9keSlcbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gaXNGdW5jdGlvblR5cGUoaW50ZXJmYWNlQm9keSwgbWF0Y2gpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgcmV0dXJuIFsuLi5tZXRob2RTaWduYXR1cmVOYW1lcywgLi4uZnVuY3Rpb25Qcm9wZXJ0eU5hbWVzXTtcbn1cblxuLy8gRXZlcnkgcHJvcGVydHkgc2lnbmF0dXJlIHdob3NlIHR5cGUgaXMgbm90IGEgZnVuY3Rpb24gdHlwZSwgc28gbWV0aG9kcyBhbmQgcHJvcGVydGllcyBzdGF5IGEgcGFydGl0aW9uLlxuZnVuY3Rpb24gZXh0cmFjdFByb3BlcnR5TmFtZXMoaW50ZXJmYWNlQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gbWF0Y2hQcm9wZXJ0eVNpZ25hdHVyZXMoaW50ZXJmYWNlQm9keSlcbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gIWlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHksIG1hdGNoKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbi8vIFRoZSBoZWFkaW5nIGxpbmVzIG9mIHRoZSBgVHJ5IGl0YCBzZWN0aW9ucyB0aGF0IGhvbGQgbm8gYGNvZGUtYnV0dG9uYC4gQSBzZWN0aW9uIHJ1bnMgdG8gdGhlIG5leHQgaGVhZGluZ1xuLy8gb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwsIHNvIGEgYCMjIyBTdGVwIDFgIGluc2lkZSBhIGAjIyBUcnkgaXRgIHN0YXlzIHBhcnQgb2YgaXQuIEhlYWRpbmdzIGFuZFxuLy8gZmVuY2VzIGluc2lkZSBhIGZlbmNlZCBibG9jayBhcmUgc2FtcGxlIHRleHQsIHNvIG9ubHkgYSBmZW5jZSB0aGF0IE9QRU5TIGEgYmxvY2sgY2FuIGJlIHRoZSBidXR0b24uXG5mdW5jdGlvbiBmaW5kVHJ5SXRMaW5lSW5kZXhlc1dpdGhvdXRDb2RlQnV0dG9uKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgY29uc3QgbGluZUluZGV4ZXM6IG51bWJlcltdID0gW107XG4gIGxldCBzZWN0aW9uOiBudWxsIHwgVHJ5SXRTZWN0aW9uID0gbnVsbDtcbiAgbGV0IGlzSW5zaWRlRmVuY2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpLmVudHJpZXMoKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgaWYgKCFpc0luc2lkZUZlbmNlICYmIHNlY3Rpb24gJiYgQ09ERV9CVVRUT05fRkVOQ0VfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICAgIHNlY3Rpb24uaGFzQ29kZUJ1dHRvbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBpc0luc2lkZUZlbmNlID0gIWlzSW5zaWRlRmVuY2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaGFzaGVzID0gaXNJbnNpZGVGZW5jZSA/IHVuZGVmaW5lZCA6IEhFQURJTkdfTEVWRUxfUkVHX0VYUC5leGVjKGxpbmUpPy5ncm91cHM/LlsnaGFzaGVzJ107XG4gICAgaWYgKGhhc2hlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNlY3Rpb24gJiYgaGFzaGVzLmxlbmd0aCA8PSBzZWN0aW9uLmxldmVsKSB7XG4gICAgICBpZiAoIXNlY3Rpb24uaGFzQ29kZUJ1dHRvbikge1xuICAgICAgICBsaW5lSW5kZXhlcy5wdXNoKHNlY3Rpb24ubGluZUluZGV4KTtcbiAgICAgIH1cbiAgICAgIHNlY3Rpb24gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXNlY3Rpb24gJiYgVFJZX0lUX0hFQURJTkdfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICBzZWN0aW9uID0geyBoYXNDb2RlQnV0dG9uOiBmYWxzZSwgbGV2ZWw6IGhhc2hlcy5sZW5ndGgsIGxpbmVJbmRleDogaW5kZXggfTtcbiAgICB9XG4gIH1cbiAgaWYgKHNlY3Rpb24gJiYgIXNlY3Rpb24uaGFzQ29kZUJ1dHRvbikge1xuICAgIGxpbmVJbmRleGVzLnB1c2goc2VjdGlvbi5saW5lSW5kZXgpO1xuICB9XG4gIHJldHVybiBsaW5lSW5kZXhlcztcbn1cblxuLy8gVGhlIGxpbmUgbnVtYmVycyBjYXJyeWluZyBhIHdpa2lsaW5rIHRoYXQgaXMgbmF2aWdhdGlvbiByYXRoZXIgdGhhbiBzYW1wbGUgdGV4dC5cbmZ1bmN0aW9uIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudClcbiAgICAuZmlsdGVyKChub3RlTGluZSkgPT4gV0lLSUxJTktfUkVHX0VYUC50ZXN0KHN0cmlwSW5saW5lQ29kZShub3RlTGluZS5saW5lKSkpXG4gICAgLm1hcCgobm90ZUxpbmUpID0+IG5vdGVMaW5lLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbGluZSAke1N0cmluZyhsaW5lSW5kZXggKyAxKX1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUcnlJdFdhcm5pbmcoc2VjdGlvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICBgZGVtby12YXVsdCBjb3ZlcmFnZTogJHtTdHJpbmcoc2VjdGlvbnMubGVuZ3RoKX0gVHJ5IGl0IHNlY3Rpb24ocykgaGF2ZSBubyBjb2RlLWJ1dHRvbiB0byBwZXJmb3JtIHRoZWlyIHNldHVwLmAsXG4gICAgYEFkZCBvbmUsIG9yIHN0YXRlIHdoeSB0aGUgc3RlcHMgY2Fubm90IGJlIHNjcmlwdGVkIHdpdGggPCEtLSBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZS1uZXh0LWxpbmUgJHtUUllfSVRfUlVMRX0gLS0gPHJlYXNvbj4gLS0+IGFib3ZlIHRoZSBoZWFkaW5nLmAsXG4gICAgLi4uc2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiBgICAke3NlY3Rpb259YClcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxsb3dlZExpbmVJbmRleGVzKHNjYW46IERpcmVjdGl2ZVNjYW4sIHJ1bGU6IHN0cmluZyk6IFJlYWRvbmx5U2V0PG51bWJlcj4ge1xuICByZXR1cm4gc2Nhbi5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUuZ2V0KHJ1bGUpID8/IG5ldyBTZXQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZXNPdXRzaWRlRmVuY2VzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudCkubWFwKChub3RlTGluZSkgPT4gbm90ZUxpbmUubGluZSk7XG59XG5cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlTGluZUluZGV4ZXMobGluZUluZGV4ZXNCeVJ1bGU6IE1hcDxzdHJpbmcsIFNldDxudW1iZXI+PiwgcnVsZTogc3RyaW5nKTogU2V0PG51bWJlcj4ge1xuICBsZXQgbGluZUluZGV4ZXMgPSBsaW5lSW5kZXhlc0J5UnVsZS5nZXQocnVsZSk7XG4gIGlmICghbGluZUluZGV4ZXMpIHtcbiAgICBsaW5lSW5kZXhlcyA9IG5ldyBTZXQoKTtcbiAgICBsaW5lSW5kZXhlc0J5UnVsZS5zZXQocnVsZSwgbGluZUluZGV4ZXMpO1xuICB9XG4gIHJldHVybiBsaW5lSW5kZXhlcztcbn1cblxuLy8gV2hldGhlciB0aGUgbm90ZSdzIGZpcnN0IGNvbnRlbnQgbGluZSAoZnJvbnRtYXR0ZXIgYW5kIGJsYW5rIGxpbmVzIGFzaWRlKSBpcyBhbiBgIyBIMWAuXG5mdW5jdGlvbiBoYXNIMShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZExpbmUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIEgxX1JFR19FWFAudGVzdCh0cmltbWVkTGluZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIGEgcGxhaW4gcHJvc2UgbGluZSBhcHBlYXJzIGJlZm9yZSB0aGUgbm90ZSdzIGZpcnN0IGNvZGUgZmVuY2UuIEhlYWRpbmdzIGFyZSBub3QgcHJvc2Ug4oCUIGEgbm90ZVxuLy8gdGhhdCBnb2VzIHN0cmFpZ2h0IGZyb20gaXRzIHRpdGxlIHRvIGEgYnV0dG9uIGlzIGV4YWN0bHkgdGhlIHNoYXBlIHRoaXMgY2hlY2sgcmVqZWN0cy5cbmZ1bmN0aW9uIGhhc0ludHJvUHJvc2UoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBzdHJpcEZyb250bWF0dGVyKGNvbnRlbnQpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICh0cmltbWVkTGluZSA9PT0gJycgfHwgSEVBRElOR19SRUdfRVhQLnRlc3QodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBub3RlIG5hdmlnYXRlcyB3aXRoIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gLiBGZW5jZWQgYmxvY2tzIGFuZCBpbmxpbmUgY29kZSBhcmUgc2FtcGxlXG4vLyB0ZXh0IHJhdGhlciB0aGFuIG5hdmlnYXRpb24sIHNvIHRoZXkgYXJlIHJlbW92ZWQgYmVmb3JlIGxvb2tpbmcuXG5mdW5jdGlvbiBoYXNXaWtpbGluayhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpLmxlbmd0aCA+IDA7XG59XG5cbi8vIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNpZ25hdHVyZSdzIHR5cGUsIHN0YXJ0aW5nIHJpZ2h0IGFmdGVyIGl0cyBgOmAsIGlzIGEgZnVuY3Rpb24gdHlwZTogYW4gb3B0aW9uYWwgdHlwZVxuLy8gcGFyYW1ldGVyIGxpc3QsIGEgcGFyYW1ldGVyIGxpc3QsIHRoZW4gYD0+YC4gVGhlIHBhcmFtZXRlciBsaXN0IGlzIHdhbGtlZCBieSBicmFja2V0IGRlcHRoIHJhdGhlciB0aGFuIGJ5IGFcbi8vIHJlZ3VsYXIgZXhwcmVzc2lvbiwgc28gYSBwYXJlbnRoZXNpemVkIG5vbi1mdW5jdGlvbiB0eXBlIChgKHN0cmluZyB8IG51bWJlcilbXWApIGFuZCBhIHBhcmFtZXRlciB3aG9zZSBvd25cbi8vIHR5cGUgaG9sZHMgcGFyZW50aGVzZXMgKGAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWRgKSBhcmUgYm90aCByZWFkIGNvcnJlY3RseSwgYWNyb3NzIGxpbmVzIHRvby5cbmZ1bmN0aW9uIGlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHk6IHN0cmluZywgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSk6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgaW5kZXggKz0gRlVOQ1RJT05fVFlQRV9QQVJBTUVURVJTX1JFR19FWFAuZXhlYyhpbnRlcmZhY2VCb2R5LnNsaWNlKGluZGV4KSk/LlswXS5sZW5ndGggPz8gMDtcbiAgaWYgKGludGVyZmFjZUJvZHlbaW5kZXhdICE9PSAnKCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGRlcHRoID0gMDtcbiAgZm9yICg7IGluZGV4IDwgaW50ZXJmYWNlQm9keS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBpbnRlcmZhY2VCb2R5W2luZGV4XTtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnKCcpIHtcbiAgICAgIGRlcHRoKys7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZGVwdGgtLTtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQVJST1dfUkVHX0VYUC50ZXN0KGludGVyZmFjZUJvZHkuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNOb25QdWJsaWNNZW1iZXIobW9kaWZpZXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGIoPzpwcml2YXRlfHByb3RlY3RlZClcXGIvLnRlc3QobW9kaWZpZXJzKTtcbn1cblxuLy8gYHJlYWRvbmx5YCBpcyB0aGUgb25seSBtb2RpZmllciBhIHByb3BlcnR5IHNpZ25hdHVyZSB0YWtlcywgYW5kIGEgbWV0aG9kIHNpZ25hdHVyZSB0YWtlcyBub25lIOKAlCBUeXBlU2NyaXB0XG4vLyByZWplY3RzIGByZWFkb25seSBmb28oKTogdm9pZDtgIOKAlCBzbyB0aGUgbWV0aG9kLXNpZ25hdHVyZSByZWdleCBuZWVkcyBubyBjb3VudGVycGFydC5cbmZ1bmN0aW9uIG1hdGNoUHJvcGVydHlTaWduYXR1cmVzKGludGVyZmFjZUJvZHk6IHN0cmluZyk6IFJlZ0V4cEV4ZWNBcnJheVtdIHtcbiAgcmV0dXJuIFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/OnJlYWRvbmx5XFxzKyk/KD88bmFtZT5cXHcrKVxcPz86XFxzKi9nbSldO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1lbWJlcnMoa2V5d29yZDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgc3dpdGNoIChrZXl3b3JkKSB7XG4gICAgY2FzZSAnY2xhc3MnOiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGJvZHkpLCBleHRyYWN0Q2xhc3NQcm9wZXJ0eU5hbWVzKGJvZHkpKTtcbiAgICB9XG4gICAgY2FzZSAnZW51bSc6IHtcbiAgICAgIHJldHVybiBidWlsZE1lbWJlcnMoW10sIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoYm9keSkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RNZXRob2ROYW1lcyhib2R5KSwgZXh0cmFjdFByb3BlcnR5TmFtZXMoYm9keSkpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBSZWFkcyB0aGUgbm90ZSdzIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGRlY2xhcmF0aW9uOiB0aGUgc3RhdGVkXG4vLyByZWFzb24sIGAnJ2Agd2hlbiB0aGUga2V5IGlzIHByZXNlbnQgd2l0aCBub3RoaW5nIGFmdGVyIGl0LCBvciBgbnVsbGAgd2hlbiB0aGUgbm90ZSBkZWNsYXJlcyBub3RoaW5nLlxuLy8gUmVhZCB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uIHJhdGhlciB0aGFuIGEgWUFNTCBwYXJzZXI6IGl0IGlzIG9uZSBrbm93biBrZXkgcGF0aCwgYW5kIGV2ZXJ5IHBsdWdpbiB0aGF0XG4vLyBpbnN0YWxscyB0aGlzIHBhY2thZ2Ugd291bGQgb3RoZXJ3aXNlIGNhcnJ5IGEgWUFNTCBkZXBlbmRlbmN5IGZvciBpdC5cbmZ1bmN0aW9uIHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihjb250ZW50OiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBGUk9OVE1BVFRFUl9SRUdfRVhQLmV4ZWMoY29udGVudCk/LlswXTtcbiAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCByZWFzb24gPSBXSUtJTElOS19BTExPV0FOQ0VfUkVHX0VYUC5leGVjKGZyb250bWF0dGVyKT8uZ3JvdXBzPy5bJ3JlYXNvbiddO1xuICByZXR1cm4gcmVhc29uID09PSB1bmRlZmluZWQgPyBudWxsIDogcmVhc29uLnRyaW0oKS5yZXBsYWNlKC9eKD88cXVvdGU+W1wiJ10pKD88dmFsdWU+W1xcc1xcU10qKVxcazxxdW90ZT4kLywgJyQ8dmFsdWU+Jyk7XG59XG5cbi8vIFJlYWRzIHRoZSBub3RlJ3MgaW5saW5lIGBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZeKApmAgZGlyZWN0aXZlcywgcmV0dXJuaW5nIHdoaWNoIGxpbmVzIHRoZXkgZXhlbXB0IGZyb21cbi8vIGVhY2ggcnVsZSBhbmQgZXZlcnl0aGluZyB3cm9uZyB3aXRoIHRoZW0uIEEgc3VwcHJlc3Npb24gdGhhdCBxdWlldGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vbmUsIHNvXG4vLyBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlLCBvbmUgd2l0aCBubyByZWFzb24sIGFuIHVuY2xvc2VkIHJlZ2lvbiBhbmQgb25lIGNvdmVyaW5nIG5vdGhpbmcgdGhhdCBicmVha3MgaXRzXG4vLyBydWxlIGFyZSBlYWNoIHJlcG9ydGVkIHJhdGhlciB0aGFuIGlnbm9yZWQuXG5mdW5jdGlvbiBzY2FuRGlyZWN0aXZlcyhjb250ZW50OiBzdHJpbmcpOiBEaXJlY3RpdmVTY2FuIHtcbiAgY29uc3Qgc3RhdGU6IERpcmVjdGl2ZVNjYW5TdGF0ZSA9IHtcbiAgICBhbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoKSxcbiAgICBvcGVuUmVnaW9uc0J5UnVsZTogbmV3IE1hcCgpLFxuICAgIHBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoKSxcbiAgICBwcm9ibGVtczogW10sXG4gICAgdGFyZ2V0TGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoW1xuICAgICAgW1RSWV9JVF9SVUxFLCBuZXcgU2V0KGZpbmRUcnlJdExpbmVJbmRleGVzV2l0aG91dENvZGVCdXR0b24oY29udGVudCkpXSxcbiAgICAgIFtXSUtJTElOS19SVUxFLCBuZXcgU2V0KGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpKV1cbiAgICBdKVxuICB9O1xuXG4gIGZvciAoY29uc3QgeyBpbmRleCwgbGluZSB9IG9mIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudCkpIHtcbiAgICBjb25zdCBtYXRjaCA9IERJUkVDVElWRV9SRUdfRVhQLmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBhcHBseURpcmVjdGl2ZShzdGF0ZSwgaW5kZXgsIG1hdGNoKTtcbiAgICB9IGVsc2UgaWYgKERJUkVDVElWRV9QUk9CRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgbWFsZm9ybWVkIGRpcmVjdGl2ZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoaW5kZXgpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBseURpcmVjdGl2ZVNjYW5MaW5lKHN0YXRlLCBpbmRleCwgbGluZSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBvcGVuUmVnaW9uIG9mIHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLnZhbHVlcygpKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihvcGVuUmVnaW9uLmxpbmVJbmRleCl9IHRoYXQgaXMgbmV2ZXIgZW5hYmxlZCBhZ2FpbmApO1xuICB9XG4gIGZvciAoY29uc3QgW3J1bGUsIHBlbmRpbmdOZXh0TGluZUluZGV4XSBvZiBzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleGVzQnlSdWxlKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlLW5leHQtbGluZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIocGVuZGluZ05leHRMaW5lSW5kZXgpfSBjb3ZlcmluZyBubyAke2Vuc3VyZU5vbk51bGxhYmxlKERJUkVDVElWRV9SVUxFX1RBUkdFVFMuZ2V0KHJ1bGUpKX1gKTtcbiAgfVxuICByZXR1cm4geyBhbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGU6IHN0YXRlLmFsbG93ZWRMaW5lSW5kZXhlc0J5UnVsZSwgcHJvYmxlbXM6IHN0YXRlLnByb2JsZW1zIH07XG59XG5cbmZ1bmN0aW9uIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShGUk9OVE1BVFRFUl9SRUdfRVhQLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwSW5saW5lQ29kZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKElOTElORV9DT0RFX1JFR19FWFAsICcnKTtcbn1cblxuLy8gQSBoYW5kLXdyaXR0ZW4gbGluayBtYXkgY29udGFpbiBhIGJhcmUgYCVgIChvciBhbnkgb3RoZXIgaW52YWxpZCBwZXJjZW50LWVzY2FwZSksIHdoaWNoIG1ha2VzXG4vLyBgZGVjb2RlVVJJQ29tcG9uZW50YCB0aHJvdy4gU3VjaCBhIHRhcmdldCBpcyBtZWFudCBsaXRlcmFsbHksIHNvIGl0IGlzIHVzZWQgYXMgd3JpdHRlbi5cbmZ1bmN0aW9uIHRyeURlY29kZVVyaUNvbXBvbmVudCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50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
@@ -72,8 +72,8 @@
72
72
  * ## Try it
73
73
  * ```
74
74
  *
75
- * That check ships as a warning ({@link DemoVaultAuthoringSpec.tryItCodeButtons}), so a vault written
76
- * before it existed keeps passing while it is brought up to it.
75
+ * That check fails the suite by default; {@link DemoVaultAuthoringSpec.tryItCodeButtons} set to `'warn'`
76
+ * prints the sections instead, for a vault still being brought up to it.
77
77
  *
78
78
  * Two layers are exposed:
79
79
  * - {@link DemoVaultCoverageChecker} — a framework-agnostic core that reads the corpus, parses interface /
@@ -99,7 +99,7 @@ export interface DemoVaultAuthoringSpec {
99
99
  readonly startNote?: string;
100
100
  /**
101
101
  * How a `Try it` section with no `code-button` and no directive explaining why is reported: `'warn'`
102
- * prints the sections and passes, `'error'` fails the suite. Defaults to `'warn'`.
102
+ * prints the sections and passes, `'error'` fails the suite. Defaults to `'error'`.
103
103
  */
104
104
  readonly tryItCodeButtons?: DemoVaultCheckSeverity;
105
105
  }
@@ -72,8 +72,8 @@
72
72
  * ## Try it
73
73
  * ```
74
74
  *
75
- * That check ships as a warning ({@link DemoVaultAuthoringSpec.tryItCodeButtons}), so a vault written
76
- * before it existed keeps passing while it is brought up to it.
75
+ * That check fails the suite by default; {@link DemoVaultAuthoringSpec.tryItCodeButtons} set to `'warn'`
76
+ * prints the sections instead, for a vault still being brought up to it.
77
77
  *
78
78
  * Two layers are exposed:
79
79
  * - {@link DemoVaultCoverageChecker} — a framework-agnostic core that reads the corpus, parses interface /
@@ -99,7 +99,7 @@ export interface DemoVaultAuthoringSpec {
99
99
  readonly startNote?: string;
100
100
  /**
101
101
  * How a `Try it` section with no `code-button` and no directive explaining why is reported: `'warn'`
102
- * prints the sections and passes, `'error'` fails the suite. Defaults to `'warn'`.
102
+ * prints the sections and passes, `'error'` fails the suite. Defaults to `'error'`.
103
103
  */
104
104
  readonly tryItCodeButtons?: DemoVaultCheckSeverity;
105
105
  }
@@ -399,7 +399,7 @@ const CODE_BUTTON_FENCE_REG_EXP = /^\s*(?:```|~~~)\s*code-button\b/;
399
399
  const CODE_FENCE_REG_EXP = /^\s*(?:```|~~~)/;
400
400
  const DEFAULT_EXCLUDED_NOTES = ["README.md"];
401
401
  const DEFAULT_START_NOTE = "00 Start.md";
402
- const DEFAULT_TRY_IT_CODE_BUTTONS_SEVERITY = "warn";
402
+ const DEFAULT_TRY_IT_CODE_BUTTONS_SEVERITY = "error";
403
403
  const DOCS_LINK_REG_EXP = /^\s*\[Docs]\(/;
404
404
  const FRONTMATTER_REG_EXP = /^---\r?\n[\s\S]*?\r?\n---[^\S\n]*\r?\n?/;
405
405
  const H1_REG_EXP = /^# \S/;
@@ -702,4 +702,4 @@ export {
702
702
  DemoVaultCoverageChecker,
703
703
  registerDemoVaultCoverageSuite
704
704
  };
705
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTdGF0aWMgY292ZXJhZ2UvZnJlc2huZXNzIGNoZWNrcyB0aGF0IGtlZXAgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AgaW4gc3luYyB3aXRoIGl0cyBwdWJsaWMgc3VyZmFjZS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIFRoZXNlIGhlbHBlcnMgcmVmbGVjdCB0aGUgcmVhbFxuICogcHVibGljIEFQSS9jb25maWcvZG9jcyBzdHJhaWdodCBmcm9tIHNvdXJjZSBhbmQgYXNzZXJ0IOKAlCBXSVRIT1VUIGxhdW5jaGluZyBPYnNpZGlhbiDigJQgdGhhdCBldmVyeSBmZWF0dXJlIGlzXG4gKiBkZW1vbnN0cmF0ZWQgaW4gdGhlIG5vdGVzIGFuZCB0aGF0IHRoZSBub3RlcyByZWZlcmVuY2Ugbm8gQVBJIG1lbWJlciB0aGF0IG5vIGxvbmdlciBleGlzdHMgKHJlbmFtZSBkcmlmdCkuXG4gKiBUaGUgcnVudGltZSBiZWhhdmlvciBvZiB0aGUgcGx1Z2luIGlzIGNvdmVyZWQgYnkgaXRzIG90aGVyIGludGVncmF0aW9uIHRlc3RzLCBub3QgYnkgdGhlIGRlbW8gdmF1bHQ7IHRoZVxuICogdmF1bHQgaXMgYSBsZWFybmluZyByZXNvdXJjZSwgYW5kIHRoZXNlIGNoZWNrcyBvbmx5IGd1YXJkIHRoYXQgaXQgc3RheXMgdHJ1dGhmdWwuXG4gKlxuICogVGhleSBhbHNvIGd1YXJkIHRoZSB2YXVsdCdzIG93biBgLm9ic2lkaWFuL2FwcC5qc29uYDogdGhlIHNldHRpbmdzIGxpc3RlZCBpblxuICoge0BsaW5rIERFTU9fVkFVTFRfQVBQX0pTT05fU0VUVElOR1N9IGJlbG9uZyB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYCwgd2hpY2ggd3JpdGVzIHRoZW0gaW50byB0aGUgYXJjaGl2ZWRcbiAqIHZhdWx0IGF0IHJlbGVhc2UgdGltZSwgc28gYSB2YXVsdCB0aGF0IGNvbW1pdHMgYW55IG9mIHRoZW0gaXMga2VlcGluZyBhIHNlY29uZCBjb3B5IG5vdGhpbmcgcmVjb25jaWxlcy5cbiAqXG4gKiBUaGV5IGFsc28gZW5mb3JjZSB0aGUgZGVtby12YXVsdCBBVVRIT1JJTkcgY29udmVudGlvbiDigJQgZXZlcnkgbm90ZSBvcGVucyB3aXRoIGFuIGAjIEgxYCBhbmQgYSBwbGFpblxuICogcHJvc2UgcGFyYWdyYXBoLCBldmVyeSBub3RlIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBzdGFydCBub3RlLCBhbmQgbm8gbm90ZSB1c2VzIGEgYFtbd2lraWxpbmtdXWAgb3IgYVxuICogYFtEb2NzXSjigKYpYCBsaW5lLiBUaGVzZSBjaGVja3MgYXJlIHVuY29uZGl0aW9uYWw6IHRoZSBkZW1vIHZhdWx0IGlzIHRoZSBwdWJsaXNoZWQgZG9jdW1lbnRhdGlvbiwgcmVhZFxuICogaW4gT2JzaWRpYW4gQU5EIG9uIEdpdEh1YiAod2hlcmUgYSB3aWtpbGluayBkb2VzIG5vdCByZW5kZXIpLCBzbyBhIG5vdGUgdGhhdCBicmVha3MgdGhlIGNvbnZlbnRpb24gaXNcbiAqIGJyb2tlbiBmb3IgcmVhbCByZWFkZXJzLiBgYXV0aG9yaW5nYCBvbmx5IHR1bmVzIHRoZW0gKHdoaWNoIG5vdGUgaXMgdGhlIHN0YXJ0LCB3aGljaCBub3RlcyBzaXQgb3V0c2lkZVxuICogdGhlIGxlYXJuaW5nIHBhdGgpOyBpdCBjYW5ub3Qgc3dpdGNoIHRoZW0gb2ZmLlxuICpcbiAqIE9ubHkgYHJvb3RGb2xkZXJgIGlzIHJlcXVpcmVkLCBzbyBhIHBsdWdpbiB3aXRoIG5vIHNldHRpbmdzIGFuZCBubyBwdWJsaWMgQVBJIHRvIHJlZmxlY3QgcmVnaXN0ZXJzIHRoZVxuICogc3VpdGUgd2l0aCB0aGF0IGFsb25lIGFuZCBzdGlsbCBnZXRzIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayDigJQgdGhlIGNoZWNrcyBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGF0IHRoZVxuICogcGx1Z2luIGV4cG9zZXMuIEVhY2ggcmVmbGVjdGlvbiBzcGVjIChgY29uZmlnSW50ZXJmYWNlc2AsIGBpbnRlcmZhY2VzYCwgYG5vblRyaXZpYWxHdWFyZGApIGFkZHMgdGhlIGNoZWNrc1xuICogaXQgZGVzY3JpYmVzIHdoZW4gc3VwcGxpZWQuIFRoZSB2YXVsdCBpcyBndWFyZGVkIGFnYWluc3QgYmVpbmcgZW1wdHkgZWl0aGVyIHdheTogd2l0aCBubyBub3RlcyB0byByZWFkLFxuICogZXZlcnkgYXV0aG9yaW5nIGNoZWNrIHdvdWxkIHBhc3MgYnkgaGF2aW5nIG5vdGhpbmcgdG8gbG9vayBhdC5cbiAqXG4gKiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIG5vdGUgd2hvc2UgU1VCSkVDVCBpcyB0aGUgd2lraWxpbmsg4oCUIGFuIGVtYmVkIHNwZWxsaW5nIHRoZSByZWFkZXIgaXMgYmVpbmcgdGF1Z2h0XG4gKiB0byB0eXBlLCBhIGZyb250bWF0dGVyIHByb3BlcnR5IHZhbHVlIHRoYXQgZXhpc3RzIHRvIGNvbnRyYXN0IHdpdGggYSBNYXJrZG93biBsaW5rLCBhIGZpeHR1cmUgdGhhdCBtdXN0XG4gKiBrZWVwIHRoZSB3aWtpbGluayBhIGNvbW1hbmQgaXMgc3VwcG9zZWQgdG8gbGVhdmUgYWxvbmUsIGEgbGluayB0aGUgcmVhZGVyIGNsaWNrcyB3aGlsZSBpdCBzdGlsbCByZXNvbHZlc1xuICogdG8gbm90aGluZy4gU3VjaCBhIG5vdGUgc2F5cyBzbyBpdHNlbGYsIHN0YXRpbmcgd2h5LCBpbiBvbmUgb2YgdHdvIGZvcm1zIG1vZGVsbGVkIG9uIEVTTGludCdzLlxuICpcbiAqIFBlciBsaW5lIG9yIHBlciByZWdpb24sIHdyaXR0ZW4gYXMgYW4gSFRNTCBjb21tZW50IHNvIGl0IGlzIGludmlzaWJsZSBpbiBPYnNpZGlhbiBBTkQgb24gR2l0SHViIOKAlCB0aGVcbiAqIHNwZWxsaW5nIHRoZXNlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWA6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUtbmV4dC1saW5lIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0gQ2xpY2tpbmcgYSBsaW5rIHRvIGEgbm90ZSB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCBJUyB0aGUgZmVhdHVyZS4gLS0+XG4gKiAyLiBDbGljayB0aGlzIGxpbms6IFtbUHJvamVjdHMvRnJlc2ggaWRlYV1dLlxuICpcbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLSBUaGUgd2lraWxpbmsgZW1iZWQgaXMgdGhlIHN5bnRheCB0aGlzIG5vdGUgdGVhY2hlcy4gLS0+XG4gKiAhW1tiYXNpYy5odG1sfDQwMF1dXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1lbmFibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLT5cbiAqIGBgYFxuICpcbiAqIFBlciBub3RlLCBpbiB0aGUgbm90ZSdzIG93biBmcm9udG1hdHRlciDigJQgdGhlIG9ubHkgZm9ybSB0aGF0IGNhbiByZWFjaCBhIHdpa2lsaW5rIElOU0lERSBmcm9udG1hdHRlcixcbiAqIHdoZXJlIGEgY29tbWVudCBjYW5ub3QgZ286XG4gKlxuICogYGBgeWFtbFxuICogLS0tXG4gKiBvYnNpZGlhbi1kZXYtdXRpbHM6XG4gKiAgIGRlbW8tdmF1bHQtdmFsaWRhdGlvbjpcbiAqICAgICBhbGxvdy13aWtpbGlua3M6IFRoZSBgd2lraWxpbmtgIHByb3BlcnR5IHZhbHVlIGlzIHRoZSBjb250cmFzdCB0aGlzIG5vdGUgaXMgYnVpbHQgYXJvdW5kLlxuICogLS0tXG4gKiBgYGBcbiAqXG4gKiBFaXRoZXIgd2F5IHRoZSBkZWNsYXJhdGlvbiB0cmF2ZWxzIHdpdGggdGhlIG5vdGUgcmF0aGVyIHRoYW4gc2l0dGluZyBpbiBhIGxpc3Qgc29tZXdoZXJlIGVsc2UsIGl0IGNhcnJpZXNcbiAqIGl0cyBqdXN0aWZpY2F0aW9uLCBhbmQgaXQgZXhlbXB0cyBvbmx5IHRoZSBXSUtJTElOSyBjaGVjayDigJQgdGhlIEgxLCBwcm9zZSwgcmVhY2hhYmlsaXR5IGFuZCBgW0RvY3NdYFxuICogY2hlY2tzIHN0aWxsIGFwcGx5LiBBIGRlY2xhcmF0aW9uIHdpdGggbm8gcmVhc29uLCBvbmUgY292ZXJpbmcgbm8gd2lraWxpbmssIGEgcmVnaW9uIG5ldmVyIGVuYWJsZWQgYWdhaW4sXG4gKiBvciBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlIGFsbCBmYWlsOiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCB0aGF0IG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIG9yIHRoYXRcbiAqIHNpbGVudGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vIGV4ZW1wdGlvbiBhdCBhbGwuXG4gKlxuICogVGhleSBhbHNvIGNoZWNrIHRoYXQgZXZlcnkgYFRyeSBpdGAgc2VjdGlvbiDigJQgYSBoZWFkaW5nIG9mIGFueSBsZXZlbCBzdGFydGluZyBgVHJ5IGl0YCwgdXAgdG8gdGhlIG5leHRcbiAqIGhlYWRpbmcgb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwg4oCUIGhvbGRzIGEgYGNvZGUtYnV0dG9uYCB0aGF0IHBlcmZvcm1zIGl0cyBzZXR1cCwgYmVjYXVzZSBhIHJlYWRlclxuICogYXNrZWQgdG8gY29uZmlndXJlIHRoaW5ncyBieSBoYW5kIGlzIGEgcmVhZGVyIHRoZSBkZW1vIGxvc3QuIEEgc2VjdGlvbiB3aG9zZSBzdGVwcyByZWFsbHkgY2Fubm90IGJlXG4gKiBzY3JpcHRlZCBzYXlzIHNvIHdpdGggdGhlIHNhbWUgZGlyZWN0aXZlLCBuYW1pbmcgdGhlIGBkZW1vLXZhdWx0LXZhbGlkYXRpb24vdHJ5LWl0LWNvZGUtYnV0dG9uYCBydWxlIG9uXG4gKiB0aGUgaGVhZGluZywgYW5kIHdpdGggdGhlIHNhbWUgY2hlY2tzIG9uIHRoZSBkaXJlY3RpdmUgaXRzZWxmOlxuICpcbiAqIGBgYG1hcmtkb3duXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlLW5leHQtbGluZSBkZW1vLXZhdWx0LXZhbGlkYXRpb24vdHJ5LWl0LWNvZGUtYnV0dG9uIC0tIERyYWdnaW5nIGEgZmlsZSBpbiBmcm9tIG91dHNpZGUgT2JzaWRpYW4gY2Fubm90IGJlIHNjcmlwdGVkLiAtLT5cbiAqICMjIFRyeSBpdFxuICogYGBgXG4gKlxuICogVGhhdCBjaGVjayBzaGlwcyBhcyBhIHdhcm5pbmcgKHtAbGluayBEZW1vVmF1bHRBdXRob3JpbmdTcGVjLnRyeUl0Q29kZUJ1dHRvbnN9KSwgc28gYSB2YXVsdCB3cml0dGVuXG4gKiBiZWZvcmUgaXQgZXhpc3RlZCBrZWVwcyBwYXNzaW5nIHdoaWxlIGl0IGlzIGJyb3VnaHQgdXAgdG8gaXQuXG4gKlxuICogVHdvIGxheWVycyBhcmUgZXhwb3NlZDpcbiAqIC0ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0g4oCUIGEgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgdGhhdCByZWFkcyB0aGUgY29ycHVzLCBwYXJzZXMgaW50ZXJmYWNlIC9cbiAqICAgY2xhc3MgLyBlbnVtIG1lbWJlcnMgYW5kIGV4cG9ydGVkIGZ1bmN0aW9ucywgYW5kIHJldHVybnMgZGlhZ25vc3RpYyBhcnJheXMgKHdoYXQgaXMgdW5kZW1vbnN0cmF0ZWQgLyBzdGFsZVxuICogICAvIHVubGlua2VkIC8gb2ZmLWNvbnZlbnRpb24pLlxuICogLSB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfSDigJQgYSB0aGluIHdyYXBwZXIgdGhhdCByZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSBvdmVyIHRoZSBjb3JlLCBzb1xuICogICBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCBpcyBhIHNpbmdsZSBkZWNsYXJhdGl2ZSBjYWxsLlxuICovXG5cbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBkZXNjcmliZSxcbiAgZXhwZWN0LFxuICBpdFxufSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQge1xuICBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MsXG4gIHBhcnNlRGVtb1ZhdWx0QXBwSnNvblxufSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcblxuLyoqXG4gKiBUdW5lcyB0aGUgYWx3YXlzLW9uIGF1dGhvcmluZyBjaGVja3MuIEl0IGNhbm5vdCBkaXNhYmxlIHRoZW0g4oCUIHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRBdXRob3JpbmdTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlcyAocGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoYXQgc2l0IG91dHNpZGUgdGhlIGxlYXJuaW5nIHBhdGggYW5kIGFyZSB0aGVyZWZvcmVcbiAgICogZXhlbXB0IGZyb20gZXZlcnkgYXV0aG9yaW5nIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgdmF1bHQncyBvd24gYFJFQURNRS5tZGAsIHdoaWNoIGFkZHJlc3NlcyBzb21lb25lXG4gICAqIGJyb3dzaW5nIHRoZSByZXBvIG9uIEdpdEh1YiByYXRoZXIgdGhhbiBhIHJlYWRlciB3b3JraW5nIHRocm91Z2ggdGhlIHZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgZXZlcnkgb3RoZXIgbm90ZSBtdXN0IGJlIHJlYWNoYWJsZSBmcm9tLiBEZWZhdWx0cyB0b1xuICAgKiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnROb3RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgYSBgVHJ5IGl0YCBzZWN0aW9uIHdpdGggbm8gYGNvZGUtYnV0dG9uYCBhbmQgbm8gZGlyZWN0aXZlIGV4cGxhaW5pbmcgd2h5IGlzIHJlcG9ydGVkOiBgJ3dhcm4nYFxuICAgKiBwcmludHMgdGhlIHNlY3Rpb25zIGFuZCBwYXNzZXMsIGAnZXJyb3InYCBmYWlscyB0aGUgc3VpdGUuIERlZmF1bHRzIHRvIGAnd2FybidgLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJ5SXRDb2RlQnV0dG9ucz86IERlbW9WYXVsdENoZWNrU2V2ZXJpdHk7XG59XG5cbi8qKlxuICogSG93IGEgY2hlY2sgdGhhdCBpcyBiZWluZyBpbnRyb2R1Y2VkIGdyYWR1YWxseSByZXBvcnRzIHdoYXQgaXQgZmluZHM6IGAnd2FybidgIHByaW50cyBpdCBhbmQgcGFzc2VzLFxuICogYCdlcnJvcidgIGZhaWxzLlxuICovXG5leHBvcnQgdHlwZSBEZW1vVmF1bHRDaGVja1NldmVyaXR5ID0gJ2Vycm9yJyB8ICd3YXJuJztcblxuLyoqXG4gKiBSZWZsZWN0cyBhIGNvbmZpZyBpbnRlcmZhY2Ugd2hvc2Ugb3B0aW9ucyBhcmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb25maWdJbnRlcmZhY2VDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgd2hvc2UgcHJvcGVydGllcyBhcmUgdGhlIGNvbmZpZ1xuICAgKiBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJ9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlcyAocGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIGV4ZW1wdCBmcm9tIHRoZSBhdXRob3JpbmcgY2hlY2tzLiBEZWZhdWx0cyB0byB0aGVcbiAgICogdmF1bHQncyBvd24gYFJFQURNRS5tZGAuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZE5vdGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwbHVnaW4gcmVwbyByb290IOKAlCB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgYGRlbW8tdmF1bHQvYCBhbmQgdGhlIHNvdXJjZSBiZWluZ1xuICAgKiByZWZsZWN0ZWQuIENhbGxlcnMgdHlwaWNhbGx5IHBhc3MgYGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kU3RhbGVSZWZlcmVuY2VzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kU3RhbGVSZWZlcmVuY2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSByZWNlaXZlciB3aG9zZSBgYCBgJHtyZWNlaXZlcn0uPG1lbWJlcj5gIGBgIHJlZmVyZW5jZXMgYXJlIHNjYW5uZWQgZm9yIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtZW1iZXJzIHRoYXQgY3VycmVudGx5IGV4aXN0IG9uIHRoZSByZWNlaXZlcjsgYW55IHJlZmVyZW5jZWQgbWVtYmVyIG5vdCBpbiB0aGlzIHNldCBpcyBzdGFsZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkTWVtYmVyczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWVtYmVyIG5hbWVzIHRoYXQgbXVzdCBlYWNoIGFwcGVhciBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICByZWFkb25seSBtZW1iZXJzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hlbiBzZXQsIGEgbWVtYmVyIGlzIGRlbW9uc3RyYXRlZCBvbmx5IGlmIGBgIGAke3JlY2VpdmVyfS4ke21lbWJlcn1gIGBgIGFwcGVhcnMgKGUuZy4gYSBjb250ZXh0IG9iamVjdCdzXG4gICAqIG1ldGhvZHMpOyB3aGVuIGFic2VudCwgdGhlIGJhcmUgbWVtYmVyIG5hbWUgaXMgbG9va2VkIHVwIChlLmcuIGEgY29uZmlnIG9wdGlvbikuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kVW5saW5rZWRGZWF0dXJlRG9jc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVubGlua2VkRmVhdHVyZURvY3NQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRvY3MgZm9sZGVyIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSB0b3AtbGV2ZWwgYCoubWRgIGZpbGVzIGFyZSB0aGUgZmVhdHVyZSBkb2NzLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jc0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgdGhhdCBhcmUgTk9UIHBlci1mZWF0dXJlIHBhZ2VzIGFuZCBzbyBuZWVkIG5vIGxpbmtpbmcgZGVtbyBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uRmVhdHVyZURvY3M6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbnJlYWNoYWJsZU5vdGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5yZWFjaGFibGVOb3Rlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgdGhlIHdhbGsgc3RhcnRzIGZyb20sIGUuZy4gYDAwIFN0YXJ0Lm1kYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0Tm90ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSBgZXhwb3J0IGZ1bmN0aW9uYHMgYXJlIHBhcnNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRJbnRlcmZhY2VNZW1iZXJzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHRvIHBhcnNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBmZWF0dXJlLWRvYyBsaW5raW5nIGNoZWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIGRvY3MgZm9sZGVyIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSB0b3AtbGV2ZWwgYCoubWRgIGZpbGVzIGFyZSB0aGUgZmVhdHVyZSBkb2NzLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2MgYmFzZW5hbWVzICh3aXRob3V0IGAubWRgKSB0aGF0IGFyZSBOT1QgcGVyLWZlYXR1cmUgcGFnZXMgYW5kIHNvIG5lZWQgbm8gbGlua2luZyBkZW1vIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub25GZWF0dXJlRG9jczogc3RyaW5nW107XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBtb2R1bGUncyBleHBvcnRlZCBmdW5jdGlvbnMsIGVhY2ggZGVtb25zdHJhdGVkIGJ5IGl0cyBiYXJlIG5hbWUgaW4gdGhlIGRlbW8gY29ycHVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEZ1bmN0aW9uc0NvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBzaW5nbGUgaW50ZXJmYWNlJ3MgbWVtYmVycyBhbmQgZGVtb25zdHJhdGVzIHRoZW0gdmlhIGBgIGAke3JlY2VpdmVyfS48bWVtYmVyPmAgYGAgcmVmZXJlbmNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRJbnRlcmZhY2VDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgdG8gcmVmbGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZGVtb25zdHJhdGVkIG1lbWJlcnMgYXJlIHRoZSByZWZsZWN0ZWQgdHlwZSdzIG1ldGhvZHMgb3IgaXRzIHByb3BlcnRpZXMgKGVudW0gbWVtYmVycyBjb3VudCBhc1xuICAgKiBwcm9wZXJ0aWVzKS5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IERlbW9WYXVsdEludGVyZmFjZU1lbWJlcktpbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIHRoZSBub3RlcyBjYWxsIHRoZSBtZW1iZXJzIG9uIChlLmcuIGBjb2RlQnV0dG9uQ29udGV4dGApLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBpbnRlcmZhY2UncyBkZW1vbnN0cmF0ZWQgbWVtYmVycyBhcmUgaXRzIG1ldGhvZHMgb3IgaXRzIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlbW9WYXVsdEludGVyZmFjZU1lbWJlcktpbmQgPSAnbWV0aG9kcycgfCAncHJvcGVydGllcyc7XG5cbi8qKlxuICogQ29uZmlndXJlcyB0aGUgZ3VhcmQgdGhhdCB0aGUgcmVmbGVjdGVkIHN1cmZhY2UgaXMgbm9uLXRyaXZpYWwgKHByb3RlY3RzIGFnYWluc3QgYSBwYXJzaW5nIHJlZ3Jlc3Npb25cbiAqIHNpbGVudGx5IGVtcHR5aW5nIGV2ZXJ5IG90aGVyIGNoZWNrKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHROb25Ucml2aWFsR3VhcmRTcGVjIHtcbiAgLyoqXG4gICAqIEEgZGVtbyBub3RlIChwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSB0aGF0IG11c3QgYmUgcHJlc2VudC5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdERlbW9Ob3RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbWVtYmVyIHRoYXQgbXVzdCBiZSByZWZsZWN0ZWQgZnJvbSB7QGxpbmsgRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYy5pbnRlcmZhY2VOYW1lfS5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdE1lbWJlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB3aG9zZSBtZW1iZXJzIGFyZSByZS1wYXJzZWQgZm9yIHRoZVxuICAgKiBndWFyZC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgZGVtbyBub3RlLCBhcyByZWFkIGZyb20gdGhlIGRlbW8gdmF1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Tm90ZSB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZSdzIHJhdyBNYXJrZG93biBjb250ZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgZm9sZGVyLCBlLmcuIGAwMCBTdGFydC5tZGAuXG4gICAqL1xuICByZWFkb25seSByZWxhdGl2ZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGEgbm90ZSdzIGlubGluZSBgb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGXigKZgIGRpcmVjdGl2ZXMgYWxsb3csIHJ1bGUgYnkgcnVsZSwgYW5kIHdoYXQgaXMgd3Jvbmcgd2l0aFxuICogdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVTY2FuIHtcbiAgLyoqXG4gICAqIEZvciBlYWNoIHJ1bGUsIHRoZSB6ZXJvLWJhc2VkIGxpbmUgbnVtYmVycyBhIGRpcmVjdGl2ZSBleGVtcHRzIGZyb20gaXQuXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGU6IFJlYWRvbmx5TWFwPHN0cmluZywgUmVhZG9ubHlTZXQ8bnVtYmVyPj47XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUgbWlzdGFrZXMgZm91bmQsIGVhY2ggcGhyYXNlZCBmb3IgYSBmYWlsaW5nIGFzc2VydGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcnVubmluZyBzdGF0ZSBvZiBhIGRpcmVjdGl2ZSBzY2FuLCB0aHJlYWRlZCB0aHJvdWdoIHRoZSBwZXItbGluZSBoZWxwZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZVNjYW5TdGF0ZSB7XG4gIC8qKlxuICAgKiBGb3IgZWFjaCBydWxlLCB0aGUgbGluZXMgYSBkaXJlY3RpdmUgaGFzIGV4ZW1wdGVkIGZyb20gaXQgc28gZmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZExpbmVJbmRleGVzQnlSdWxlOiBNYXA8c3RyaW5nLCBTZXQ8bnVtYmVyPj47XG5cbiAgLyoqXG4gICAqIEZvciBlYWNoIHJ1bGUsIHRoZSByZWdpb24gY3VycmVudGx5IG9wZW4sIGFuZCB3aGV0aGVyIGl0IGhhcyBjb3ZlcmVkIGEgdGFyZ2V0IHlldC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZW5SZWdpb25zQnlSdWxlOiBNYXA8c3RyaW5nLCBPcGVuRGlyZWN0aXZlUmVnaW9uPjtcblxuICAvKipcbiAgICogRm9yIGVhY2ggcnVsZSwgdGhlIGxpbmUgYSBgZGlzYWJsZS1uZXh0LWxpbmVgIHdhcyByZWFkIG9uLCB3aGlsZSBpdCBzdGlsbCB3YWl0cyBmb3IgdGhlIGxpbmUgaXQgY292ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGVuZGluZ05leHRMaW5lSW5kZXhlc0J5UnVsZTogTWFwPHN0cmluZywgbnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGl2ZSBtaXN0YWtlcyBmb3VuZCBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEZvciBlYWNoIHJ1bGUsIHRoZSBsaW5lcyBvZiB0aGUgbm90ZSB0aGF0IGJyZWFrIGl0IOKAlCB0aGUgbGluZXMgYSBkaXJlY3RpdmUgZm9yIGl0IGhhcyB0byBjb3ZlciB0byBiZVxuICAgKiBkb2luZyBhbnkgd29yay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldExpbmVJbmRleGVzQnlSdWxlOiBSZWFkb25seU1hcDxzdHJpbmcsIFJlYWRvbmx5U2V0PG51bWJlcj4+O1xufVxuXG4vKipcbiAqIFRoZSBwYXJzZWQgbWVtYmVycyBvZiBhIHNvdXJjZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZmFjZU1lbWJlcnMge1xuICAvKipcbiAgICogRXZlcnkgbWVtYmVyIOKAlCB7QGxpbmsgSW50ZXJmYWNlTWVtYmVycy5tZXRob2RzfSBmb2xsb3dlZCBieSB7QGxpbmsgSW50ZXJmYWNlTWVtYmVycy5wcm9wZXJ0aWVzfS5cbiAgICovXG4gIHJlYWRvbmx5IGFsbDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgbWVtYmVycyAoZGVjbGFyZWQgYXMgYG5hbWUoLi4uKWApLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0aG9kczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBtZW1iZXJzIChkZWNsYXJlZCBhcyBgbmFtZT86IC4uLmApLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydGllczogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBub3RlIGxpbmUgcGFpcmVkIHdpdGggdGhlIGxpbmUgbnVtYmVyIGl0IGNhbWUgZnJvbSwgc28gYSBjaGVjayB0aGF0IHNraXBzIGZlbmNlZCBibG9ja3MgY2FuIHN0aWxsXG4gKiByZXBvcnQg4oCUIGFuZCBhbiBpbmxpbmUgZGlyZWN0aXZlIGNhbiBzdGlsbCBuYW1lIOKAlCB0aGUgbGluZSBhcyB0aGUgcmVhZGVyIHNlZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm90ZUxpbmUge1xuICAvKipcbiAgICogVGhlIHplcm8tYmFzZWQgbGluZSBudW1iZXIgd2l0aGluIHRoZSBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxpbmUncyByYXcgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGBkaXNhYmxlYCByZWdpb24gdGhhdCBoYXMgYmVlbiBvcGVuZWQgYW5kIG5vdCB5ZXQgZW5hYmxlZCBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuRGlyZWN0aXZlUmVnaW9uIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJlZ2lvbiBoYXMgY292ZXJlZCBhIGxpbmUgYnJlYWtpbmcgaXRzIHJ1bGUsIHdoaWNoIGlzIHdoYXQgc3RvcHMgaXQgYmVpbmcgcmVwb3J0ZWQgYXNcbiAgICogcG9pbnRsZXNzLlxuICAgKi9cbiAgaXNVc2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSB0aGUgcmVnaW9uIHdhcyBvcGVuZWQgb24uXG4gICAqL1xuICByZWFkb25seSBsaW5lSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIGBkaXNhYmxlYCByZWdpb24gdGhhdCBoYXMgYmVlbiBvcGVuZWQgYW5kIG5vdCB5ZXQgZW5hYmxlZCBhZ2Fpbi5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE9wZW5EaXJlY3RpdmVSZWdpb259OiB0aGUgZGlyZWN0aXZlcyBub3cgc2VydmUgbW9yZSB0aGFuIHRoZSB3aWtpbGluayBydWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5XaWtpbGlua0RpcmVjdGl2ZVJlZ2lvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSByZWdpb24gaGFzIGNvdmVyZWQgYSB3aWtpbGluaywgd2hpY2ggaXMgd2hhdCBzdG9wcyBpdCBiZWluZyByZXBvcnRlZCBhcyBwb2ludGxlc3MuXG4gICAqL1xuICBpc1VzZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIHRoZSByZWdpb24gd2FzIG9wZW5lZCBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmVJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVQYXJhbXMge1xuICAvKipcbiAgICogVHVuZXMgdGhlIGFsd2F5cy1vbiBhdXRob3JpbmcgY2hlY2tzLCBvciBgdW5kZWZpbmVkYCB0byB0YWtlIHRoZWlyIGRlZmF1bHRzLiBJdCBjYW5ub3QgZGlzYWJsZSB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaW5nPzogRGVtb1ZhdWx0QXV0aG9yaW5nU3BlYztcblxuICAvKipcbiAgICogVGhlIGNvbmZpZyBpbnRlcmZhY2VzIHdob3NlIG9wdGlvbnMgbXVzdCBlYWNoIGJlIGRlbW9uc3RyYXRlZCBieSB0aGVpciBiYXJlIG5hbWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlXG4gICAqIHBsdWdpbiBoYXMgbm8gc2V0dGluZ3MuXG4gICAqL1xuICByZWFkb25seSBjb25maWdJbnRlcmZhY2VzPzogRGVtb1ZhdWx0Q29uZmlnSW50ZXJmYWNlQ292ZXJhZ2VTcGVjW107XG5cbiAgLyoqXG4gICAqIFRoZSBmZWF0dXJlLWRvYyBsaW5raW5nIGNoZWNrLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwbHVnaW4gc2hpcHMgbm8gYGRvY3MvYCBmb2xkZXIuXG4gICAqL1xuICByZWFkb25seSBkb2NzPzogRGVtb1ZhdWx0RG9jc0NvdmVyYWdlU3BlYztcblxuICAvKipcbiAgICogVGhlIG1vZHVsZXMgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICAgKiBwbHVnaW4gZXhwb3NlcyBubyBzdWNoIG1vZHVsZSB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uTW9kdWxlcz86IERlbW9WYXVsdEZ1bmN0aW9uc0NvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJmYWNlcyB3aG9zZSBtZW1iZXJzIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgKGFuZCByZWZlcmVuY2VkIHdpdGhvdXQgZHJpZnQpLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gICAqIHRoZSBwbHVnaW4gZXhwb3NlcyBubyBwdWJsaWMgQVBJIHN1cmZhY2UgdG8gcmVmbGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZXM/OiBEZW1vVmF1bHRJbnRlcmZhY2VDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGd1YXJkIHRoYXQga2VlcHMgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIG5vbi10cml2aWFsLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vIHJlZmxlY3RlZCBzdXJmYWNlXG4gICAqIHRvIGd1YXJkLiBUaGUgdmF1bHQgaXMgY2hlY2tlZCBmb3IgYmVpbmcgbm9uLWVtcHR5IGVpdGhlciB3YXkuXG4gICAqL1xuICByZWFkb25seSBub25Ucml2aWFsR3VhcmQ/OiBEZW1vVmF1bHROb25Ucml2aWFsR3VhcmRTcGVjO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGx1Z2luIHJlcG8gcm9vdC4gQ2FsbGVycyB0eXBpY2FsbHkgcGFzcyBgZ2V0Um9vdEZvbGRlcigpID8/IHByb2Nlc3MuY3dkKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgYSBub3RlJ3MgaW5saW5lIGBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZeKApmAgZGlyZWN0aXZlcyBhbGxvdywgYW5kIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGVtLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgRGlyZWN0aXZlU2Nhbn06IHRoZSBkaXJlY3RpdmVzIG5vdyBzZXJ2ZSBtb3JlIHRoYW4gdGhlIHdpa2lsaW5rIHJ1bGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2lraWxpbmtEaXJlY3RpdmVTY2FuIHtcbiAgLyoqXG4gICAqIFRoZSB6ZXJvLWJhc2VkIGxpbmUgbnVtYmVycyBhIGRpcmVjdGl2ZSBhbGxvd3MgYSB3aWtpbGluayBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRMaW5lSW5kZXhlczogUmVhZG9ubHlTZXQ8bnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGl2ZSBtaXN0YWtlcyBmb3VuZCwgZWFjaCBwaHJhc2VkIGZvciBhIGZhaWxpbmcgYXNzZXJ0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBydW5uaW5nIHN0YXRlIG9mIGEgZGlyZWN0aXZlIHNjYW4sIHRocmVhZGVkIHRocm91Z2ggdGhlIHBlci1saW5lIGhlbHBlcnMuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBEaXJlY3RpdmVTY2FuU3RhdGV9OiB0aGUgZGlyZWN0aXZlcyBub3cgc2VydmUgbW9yZSB0aGFuIHRoZSB3aWtpbGluayBydWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpa2lsaW5rRGlyZWN0aXZlU2NhblN0YXRlIHtcbiAgLyoqXG4gICAqIFRoZSBsaW5lcyBhIGRpcmVjdGl2ZSBoYXMgYWxsb3dlZCBhIHdpa2lsaW5rIG9uIHNvIGZhci5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRMaW5lSW5kZXhlczogU2V0PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gY3VycmVudGx5IG9wZW4sIGFuZCB3aGV0aGVyIGl0IGhhcyBjb3ZlcmVkIGEgd2lraWxpbmsgeWV0LlxuICAgKi9cbiAgb3BlblJlZ2lvbjogbnVsbCB8IE9wZW5EaXJlY3RpdmVSZWdpb247XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGEgYGRpc2FibGUtbmV4dC1saW5lYCB3YXMgcmVhZCBvbiwgd2hpbGUgaXQgc3RpbGwgd2FpdHMgZm9yIHRoZSBsaW5lIGl0IGNvdmVycy5cbiAgICovXG4gIHBlbmRpbmdOZXh0TGluZUluZGV4OiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aXZlIG1pc3Rha2VzIGZvdW5kIHNvIGZhci5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIHRoZSBub3RlIHRoYXQgY2FycnkgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHdpa2lsaW5rTGluZUluZGV4ZXM6IFJlYWRvbmx5U2V0PG51bWJlcj47XG59XG5cbi8qKlxuICogQSBgVHJ5IGl0YCBzZWN0aW9uIGJlaW5nIHJlYWQsIGZyb20gaXRzIGhlYWRpbmcgdG8gdGhlIG5leHQgaGVhZGluZyBvZiB0aGUgc2FtZSBvciBhIGhpZ2hlciBsZXZlbC5cbiAqL1xuaW50ZXJmYWNlIFRyeUl0U2VjdGlvbiB7XG4gIGhhc0NvZGVCdXR0b246IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxldmVsOiBudW1iZXI7XG4gIHJlYWRvbmx5IGxpbmVJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgcGx1Z2luJ3MgcHVibGljIHN1cmZhY2UgZnJvbSBzb3VyY2UgYW5kIGNoZWNrcyBpdHMgaW4tcmVwbyBgZGVtby12YXVsdC9gIHN0YXlzIGluIHN5bmMgd2l0aCBpdC5cbiAqXG4gKiBFdmVyeSBtZXRob2QgaXMgYSBwdXJlIHF1ZXJ5IG92ZXIgZmlsZXMgdW5kZXIgdGhlIHJlcG8gcm9vdCAodGhlIGRlbW8gY29ycHVzIGlzIHJlYWQgb25jZSBhbmQgY2FjaGVkKSwgc29cbiAqIHRoZSBjaGVja2VyIGlzIHRyaXZpYWxseSB1bml0LXRlc3RhYmxlIGFnYWluc3QgYSBmaXh0dXJlIHJlcG8gYW5kIGNhcnJpZXMgbm8gdGVzdC1mcmFtZXdvcmsgZGVwZW5kZW5jeS5cbiAqL1xuZXhwb3J0IGNsYXNzIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlciB7XG4gIHByaXZhdGUgY2FjaGVkQ29ycHVzOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWROb3RlczogRGVtb1ZhdWx0Tm90ZVtdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVtb1ZhdWx0Rm9sZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhjbHVkZWROb3RlczogU2V0PHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2hlY2tlciByb290ZWQgYXQgYSBwbHVnaW4gcmVwby5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29uc3RydWN0b3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMucm9vdEZvbGRlciA9IHBhcmFtcy5yb290Rm9sZGVyO1xuICAgIHRoaXMuZGVtb1ZhdWx0Rm9sZGVyID0gam9pbih0aGlzLnJvb3RGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCk7XG4gICAgdGhpcy5leGNsdWRlZE5vdGVzID0gbmV3IFNldChwYXJhbXMuZXhjbHVkZWROb3RlcyA/PyBERUZBVUxUX0VYQ0xVREVEX05PVEVTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0cyB0aGUgZGVtbyBub3RlcyBhcyBwYXRocyByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBmb2xkZXIgKGZvciBhIG5vbi10cml2aWFsLXN1cmZhY2UgZ3VhcmQpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgZXZlcnkgYCoubWRgIG5vdGUgaW4gdGhlIGRlbW8gdmF1bHQuXG4gICAqL1xuICBwdWJsaWMgY29sbGVjdERlbW9Ob3RlUmVsYXRpdmVQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdE5vdGVzKCkubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIGNhY2hlcyBldmVyeSBkZW1vIG5vdGUgaW5kaXZpZHVhbGx5IOKAlCB0aGUgcGVyLW5vdGUgdmlldyB0aGUgYXV0aG9yaW5nIGNoZWNrcyB3b3JrIG9uLCBhc1xuICAgKiBvcHBvc2VkIHRvIHRoZSBjb25jYXRlbmF0ZWQge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5yZWFkQ29ycHVzfS5cbiAgICpcbiAgICogQHJldHVybnMgRXZlcnkgYCoubWRgIG5vdGUgaW4gdGhlIGRlbW8gdmF1bHQsIGV4Y2x1ZGVkIG9uZXMgaW5jbHVkZWQuXG4gICAqL1xuICBwdWJsaWMgY29sbGVjdE5vdGVzKCk6IERlbW9WYXVsdE5vdGVbXSB7XG4gICAgdGhpcy5jYWNoZWROb3RlcyA/Pz0gdGhpcy5jb2xsZWN0TWFya2Rvd25GaWxlcyh0aGlzLmRlbW9WYXVsdEZvbGRlcikubWFwKChmaWxlKSA9PiAoe1xuICAgICAgY29udGVudDogcmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpLFxuICAgICAgcmVsYXRpdmVQYXRoOiByZWxhdGl2ZSh0aGlzLmRlbW9WYXVsdEZvbGRlciwgZmlsZSlcbiAgICB9KSk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkTm90ZXM7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGAub2JzaWRpYW4vYXBwLmpzb25gIHNldHRpbmdzIHRoZSB2YXVsdCBjb21taXRzIHRoYXQgYG9ic2lkaWFuLWRldi11dGlsc2Agb3ducyBhbmQgd3JpdGVzXG4gICAqIGludG8gdGhlIGFyY2hpdmVkIHZhdWx0IGl0c2VsZi4gQSBjb21taXR0ZWQgb25lIGlzIGEgc2Vjb25kIGNvcHkgb2YgYSBzZXR0aW5nIG5vdGhpbmcgcmVjb25jaWxlcywgYW5kXG4gICAqIGl0IGlzIHRoZSBjb3B5IHRoYXQgZ29lcyBzdGFsZSDigJQgc28gdGhlIGNvbnZlbnRpb24gaXMgdGhhdCB0aGUgdmF1bHQgY29tbWl0cyBub25lIG9mIHRoZW0uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBuYW1lcyBvZiB0aGUgb3duZWQgc2V0dGluZ3MgdGhlIGNvbW1pdHRlZCBgYXBwLmpzb25gIHNldHMuIEEgdmF1bHQgdGhhdCBjb21taXRzIG5vXG4gICAqIGBhcHAuanNvbmAgYXQgYWxsIGlzIGZpbmUsIGFuZCB5aWVsZHMgbm9uZS5cbiAgICovXG4gIHB1YmxpYyBmaW5kQ29tbWl0dGVkQXBwSnNvblNldHRpbmdzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhcHBKc29uUGF0aCA9IGpvaW4odGhpcy5kZW1vVmF1bHRGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5BcHBKc29uKTtcbiAgICBjb25zdCBjb250ZW50ID0gZXhpc3RzU3luYyhhcHBKc29uUGF0aCkgPyByZWFkRmlsZVN5bmMoYXBwSnNvblBhdGgsICd1dGYtOCcpIDogbnVsbDtcbiAgICByZXR1cm4gZmluZE93bmVkRGVtb1ZhdWx0QXBwSnNvblNldHRpbmdzKHsgYXBwSnNvbjogcGFyc2VEZW1vVmF1bHRBcHBKc29uKHsgY29udGVudCwgcGF0aDogYXBwSnNvblBhdGggfSkgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgY2FycnlpbmcgYSBgW0RvY3NdKOKApilgIGxpbmsgbGluZS4gVGhlIG5vdGUgSVMgdGhlIGRvY3VtZW50YXRpb24sIHNvIGEgbGluZSBwb2ludGluZ1xuICAgKiBlbHNld2hlcmUgZm9yIHRoZSByZWFsIGV4cGxhbmF0aW9uIGlzIHRoZSBzaGFwZSB0aGlzIGNvbnZlbnRpb24gZXhpc3RzIHRvIHJlbW92ZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aERvY3NMaW5rcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+IGdldExpbmVzT3V0c2lkZUZlbmNlcyhub3RlLmNvbnRlbnQpLnNvbWUoKGxpbmUpID0+IERPQ1NfTElOS19SRUdfRVhQLnRlc3QobGluZSkpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHRoYXQgZG8gbm90IG9wZW4gd2l0aCBhbiBgIyBIMWAgKGZyb250bWF0dGVyIGFzaWRlKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aG91dEgxKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLmZpbHRlcigobm90ZSkgPT4gIWhhc0gxKG5vdGUuY29udGVudCkpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgd2l0aCBubyBwcm9zZSBwYXJhZ3JhcGggYmVmb3JlIHRoZWlyIGZpcnN0IGNvZGUgZmVuY2Ug4oCUIHRoZSAxLTMgc2VudGVuY2VzIHNheWluZyB3aGF0IHRoZVxuICAgKiBmZWF0dXJlIGRvZXMgYW5kIHdoeSBhIHJlYWRlciB3b3VsZCB3YW50IGl0LCB3aXRob3V0IHdoaWNoIHRoZSBub3RlIGlzIGEgYnV0dG9uIHdpdGggbm8gbGVzc29uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRob3V0SW50cm9Qcm9zZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+ICFoYXNJbnRyb1Byb3NlKG5vdGUuY29udGVudCkpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgd2hvc2UgZXhlbXB0aW9ucyBhcmUgbm90IGRvaW5nIGFueSB3b3JrIOKAlCBhIHdpa2lsaW5rIGFsbG93YW5jZSBvciBhbiBpbmxpbmUgZGlyZWN0aXZlIGZvclxuICAgKiBhbnkgcnVsZSBkZWNsYXJlZCB3aXRob3V0IGEgcmVhc29uLCBtaXNzcGVsbGVkLCBvciBjb3ZlcmluZyBub3RoaW5nIHRoYXQgYnJlYWtzIGl0cyBydWxlLiBBbGwgb2YgdGhlbVxuICAgKiBhcmUgZHJpZnQ6IGFuIGV4ZW1wdGlvbiBub2JvZHkgY2FuIGp1c3RpZnksIGFuZCBvbmUgbm90aGluZyBuZWVkcyBhbnkgbW9yZSwgd2hpY2ggd291bGQgZ28gb24gaGlkaW5nXG4gICAqIHRoZSBuZXh0IG1pc3Rha2Ugc29tZWJvZHkgbWFrZXMgYnkgYWNjaWRlbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIE9uZSBgPG5vdGU+OiA8cHJvYmxlbT5gIGVudHJ5IHBlciBwcm9ibGVtIGZvdW5kLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKS5mbGF0TWFwKChub3RlKSA9PiB7XG4gICAgICBjb25zdCBzY2FuID0gc2NhbkRpcmVjdGl2ZXMobm90ZS5jb250ZW50KTtcbiAgICAgIGNvbnN0IHByb2JsZW1zID0gWy4uLnNjYW4ucHJvYmxlbXNdO1xuICAgICAgY29uc3QgcmVhc29uID0gcmVhZFdpa2lsaW5rQWxsb3dhbmNlUmVhc29uKG5vdGUuY29udGVudCk7XG4gICAgICBpZiAocmVhc29uICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChyZWFzb24udHJpbSgpID09PSAnJykge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goJ2Egbm90ZS1sZXZlbCBhbGxvd2FuY2Ugd2l0aCBubyByZWFzb24nKTtcbiAgICAgICAgfSBlbHNlIGlmICghaGFzV2lraWxpbmsobm90ZS5jb250ZW50KSkge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goJ2Egbm90ZS1sZXZlbCBhbGxvd2FuY2UgY292ZXJpbmcgbm8gd2lraWxpbmsnKTtcbiAgICAgICAgfSBlbHNlIGlmIChnZXRBbGxvd2VkTGluZUluZGV4ZXMoc2NhbiwgV0lLSUxJTktfUlVMRSkuc2l6ZSA+IDApIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdpbmxpbmUgZGlyZWN0aXZlcyB0aGUgbm90ZS1sZXZlbCBhbGxvd2FuY2UgYWxyZWFkeSBjb3ZlcnMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2JsZW1zLm1hcCgocHJvYmxlbSkgPT4gYCR7bm90ZS5yZWxhdGl2ZVBhdGh9OiAke3Byb2JsZW19YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgdXNpbmcgYW4gT2JzaWRpYW4gYFtbd2lraWxpbmtdXWAgb3V0c2lkZSBhIGNvZGUgZmVuY2UuIFRoZSBkZW1vIHZhdWx0IGlzIGFsc28gcmVhZCBvblxuICAgKiBHaXRIdWIsIHdoZXJlIGEgd2lraWxpbmsgcmVuZGVycyBhcyBsaXRlcmFsIGJyYWNrZXRzIGFuZCBsZWFkcyBub3doZXJlLiBBIHdpa2lsaW5rIHNob3duIElOU0lERSBhXG4gICAqIGZlbmNlIGlzIHNhbXBsZSB0ZXh0LCBub3QgbmF2aWdhdGlvbiwgc28gZmVuY2VkIGJsb2NrcyBhcmUgc2tpcHBlZCwgYXMgaXMgYSBub3RlIHRoYXQgZGVjbGFyZXMgaW4gaXRzXG4gICAqIGZyb250bWF0dGVyIHdoeSBpdHMgd2lraWxpbmtzIGFyZSB0aGUgcG9pbnQg4oCUIHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aFdpa2lsaW5rcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihub3RlLmNvbnRlbnQpICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFsbG93ZWRMaW5lSW5kZXhlcyA9IGdldEFsbG93ZWRMaW5lSW5kZXhlcyhzY2FuRGlyZWN0aXZlcyhub3RlLmNvbnRlbnQpLCBXSUtJTElOS19SVUxFKTtcbiAgICAgICAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKG5vdGUuY29udGVudCkuc29tZSgobGluZUluZGV4KSA9PiAhYWxsb3dlZExpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbWVtYmVycyB0aGF0IHRoZSBkZW1vIG5vdGVzIHJlZmVyZW5jZSBvbiBhIHJlY2VpdmVyIGJ1dCB0aGF0IG5vIGxvbmdlciBleGlzdCBvbiBpdCAocmVuYW1lIGRyaWZ0KS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGluY3Qgc3RhbGUgbWVtYmVyIG5hbWVzIHJlZmVyZW5jZWQgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcHVibGljIGZpbmRTdGFsZVJlZmVyZW5jZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kU3RhbGVSZWZlcmVuY2VzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZhbGlkTWVtYmVycyA9IG5ldyBTZXQocGFyYW1zLnZhbGlkTWVtYmVycyk7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IFsuLi50aGlzLnJlYWRDb3JwdXMoKS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgJHtwYXJhbXMucmVjZWl2ZXJ9XFwuKD88bWVtYmVyPlxcdyspYCwgJ2cnKSldXG4gICAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21lbWJlcicpKTtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQocmVmZXJlbmNlZCldLmZpbHRlcigobWVtYmVyKSA9PiAhdmFsaWRNZW1iZXJzLmhhcyhtZW1iZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBgVHJ5IGl0YCBzZWN0aW9ucyB3aXRoIG5vIGBjb2RlLWJ1dHRvbmAgaW4gdGhlbS4gQSBgVHJ5IGl0YCBzZWN0aW9uIGlzIGEgaGVhZGluZyBvZiBhbnkgbGV2ZWxcbiAgICogc3RhcnRpbmcgYFRyeSBpdGAsIHVwIHRvIHRoZSBuZXh0IGhlYWRpbmcgb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWw7IHRoZSBzZXR1cCBpdCBhc2tzIGZvciBpc1xuICAgKiB3aGF0IGEgYnV0dG9uIGlzIGZvciwgc28gYSBzZWN0aW9uIHRoYXQgbGVhdmVzIHRoZSByZWFkZXIgdG8gZG8gaXQgYnkgaGFuZCBpcyB0aGUgc2hhcGUgdGhpcyBjaGVja1xuICAgKiByZWplY3RzLiBBIHNlY3Rpb24gd2hvc2UgaGVhZGluZyBhIGBkZW1vLXZhdWx0LXZhbGlkYXRpb24vdHJ5LWl0LWNvZGUtYnV0dG9uYCBkaXJlY3RpdmUgY292ZXJzIGhhc1xuICAgKiBzdGF0ZWQgd2h5IGl0IGNhbm5vdCBiZSBzY3JpcHRlZCwgYW5kIGlzIHNraXBwZWQg4oCUIHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAgICpcbiAgICogQHJldHVybnMgT25lIGA8bm90ZT46IGxpbmUgPG4+YCBlbnRyeSBwZXIgb2ZmZW5kaW5nIHNlY3Rpb24sIG5hbWluZyB0aGUgbGluZSBvZiBpdHMgaGVhZGluZy5cbiAgICovXG4gIHB1YmxpYyBmaW5kVHJ5SXRTZWN0aW9uc1dpdGhvdXRDb2RlQnV0dG9uKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKS5mbGF0TWFwKChub3RlKSA9PiB7XG4gICAgICBjb25zdCBhbGxvd2VkTGluZUluZGV4ZXMgPSBnZXRBbGxvd2VkTGluZUluZGV4ZXMoc2NhbkRpcmVjdGl2ZXMobm90ZS5jb250ZW50KSwgVFJZX0lUX1JVTEUpO1xuICAgICAgcmV0dXJuIGZpbmRUcnlJdExpbmVJbmRleGVzV2l0aG91dENvZGVCdXR0b24obm90ZS5jb250ZW50KVxuICAgICAgICAuZmlsdGVyKChsaW5lSW5kZXgpID0+ICFhbGxvd2VkTGluZUluZGV4ZXMuaGFzKGxpbmVJbmRleCkpXG4gICAgICAgIC5tYXAoKGxpbmVJbmRleCkgPT4gYCR7bm90ZS5yZWxhdGl2ZVBhdGh9OiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBtZW1iZXJzIHRoYXQgYXJlIG5vdCBkZW1vbnN0cmF0ZWQgYW55d2hlcmUgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBtZW1iZXIgbmFtZXMgd2l0aCBubyBkZW1vbnN0cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvcnB1cyA9IHRoaXMucmVhZENvcnB1cygpO1xuICAgIHJldHVybiBwYXJhbXMubWVtYmVycy5maWx0ZXIoKG1lbWJlcikgPT4ge1xuICAgICAgY29uc3QgbmVlZGxlID0gcGFyYW1zLnJlY2VpdmVyID09PSB1bmRlZmluZWQgPyBtZW1iZXIgOiBgJHtwYXJhbXMucmVjZWl2ZXJ9LiR7bWVtYmVyfWA7XG4gICAgICByZXR1cm4gIWNvcnB1cy5pbmNsdWRlcyhuZWVkbGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGZlYXR1cmUgZG9jcyB0aGF0IG5vIGRlbW8gbm90ZSBsaW5rcyB0by5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgZmVhdHVyZS1kb2MgYmFzZW5hbWVzICh3aXRob3V0IGAubWRgKSBub3QgbGlua2VkIGZyb20gYW55IGRlbW8gbm90ZS5cbiAgICovXG4gIHB1YmxpYyBmaW5kVW5saW5rZWRGZWF0dXJlRG9jcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5vbkZlYXR1cmVEb2NzID0gbmV3IFNldChwYXJhbXMubm9uRmVhdHVyZURvY3MpO1xuICAgIGNvbnN0IGZlYXR1cmVEb2NzID0gcmVhZGRpclN5bmMoam9pbih0aGlzLnJvb3RGb2xkZXIsIHBhcmFtcy5kb2NzRm9sZGVyKSlcbiAgICAgIC5maWx0ZXIoKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpKVxuICAgICAgLm1hcCgoZmlsZSkgPT4gZmlsZS5yZXBsYWNlKC9cXC5tZCQvLCAnJykpXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiAhbm9uRmVhdHVyZURvY3MuaGFzKG5hbWUpKTtcbiAgICBjb25zdCBsaW5rZWREb2NzID0gbmV3IFNldChcbiAgICAgIFsuLi50aGlzLnJlYWRDb3JwdXMoKS5tYXRjaEFsbCgvZG9jc1xcLyg/PGRvYz5bXFx3LV0rKVxcLm1kL2cpXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnZG9jJykpXG4gICAgKTtcbiAgICByZXR1cm4gZmVhdHVyZURvY3MuZmlsdGVyKChkb2MpID0+ICFsaW5rZWREb2NzLmhhcyhkb2MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB0aGF0IGNhbm5vdCBiZSByZWFjaGVkIGZyb20gdGhlIHN0YXJ0IG5vdGUgYnkgZm9sbG93aW5nIE1hcmtkb3duIGxpbmtzIGJldHdlZW4gbm90ZXMuXG4gICAqXG4gICAqIFRoZSB3YWxrIHN0YXJ0cyBhdCB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMuc3RhcnROb3RlfSBhbmQgZm9sbG93c1xuICAgKiBldmVyeSBgW1RleHRdKDwuL05OIE5hbWUubWQ+KWAgbGluayBvdXRzaWRlIGEgY29kZSBmZW5jZSwgdHJhbnNpdGl2ZWx5LiBBIG5vdGUgbm90aGluZyBsaW5rcyB0byBpc1xuICAgKiBvbmUgYSByZWFkZXIgY2FuIG9ubHkgZmluZCBieSBicm93c2luZyB0aGUgZmlsZSBsaXN0IOKAlCB3aGljaCBpcyBleGFjdGx5IHdoYXQgdGhlIGdyb3VwZWQgaW5kZXggaW4gdGhlXG4gICAqIHN0YXJ0IG5vdGUgaXMgbWVhbnQgdG8gcmVwbGFjZS4gV2hlbiB0aGUgc3RhcnQgbm90ZSBpdHNlbGYgaXMgbWlzc2luZywgRVZFUlkgbm90ZSBpcyB1bnJlYWNoYWJsZSxcbiAgICogYmVjYXVzZSB0aGVyZSBpcyBub3doZXJlIHRvIHN0YXJ0IGZyb20uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHdhbGsuXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgdW5yZWFjaGFibGUgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZFVucmVhY2hhYmxlTm90ZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5yZWFjaGFibGVOb3Rlc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBub3Rlc0J5UmVsYXRpdmVQYXRoID0gbmV3IE1hcCh0aGlzLmNvbGxlY3ROb3RlcygpLm1hcCgobm90ZSkgPT4gW25vdGUucmVsYXRpdmVQYXRoLCBub3RlXSkpO1xuICAgIGNvbnN0IHJlYWNoZWROb3RlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHBlbmRpbmdOb3RlcyA9IFtwYXJhbXMuc3RhcnROb3RlXTtcblxuICAgIHdoaWxlIChwZW5kaW5nTm90ZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm90ZVBhdGggPSBlbnN1cmVOb25OdWxsYWJsZShwZW5kaW5nTm90ZXMucG9wKCkpO1xuICAgICAgY29uc3Qgbm90ZSA9IG5vdGVzQnlSZWxhdGl2ZVBhdGguZ2V0KG5vdGVQYXRoKTtcbiAgICAgIGlmICghbm90ZSB8fCByZWFjaGVkTm90ZXMuaGFzKG5vdGVQYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlYWNoZWROb3Rlcy5hZGQobm90ZVBhdGgpO1xuICAgICAgcGVuZGluZ05vdGVzLnB1c2goLi4uY29sbGVjdE5vdGVMaW5rVGFyZ2V0cyhub3RlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKVxuICAgICAgLmZpbHRlcigobm90ZVBhdGgpID0+ICFyZWFjaGVkTm90ZXMuaGFzKG5vdGVQYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBuYW1lcyBvZiB0aGUgYGV4cG9ydCBmdW5jdGlvbmBzIChpbmNsdWRpbmcgYGFzeW5jYCBhbmQgZ2VuZXJhdG9yIGRlY2xhcmF0aW9ucykgaW4gYSBzb3VyY2UgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgZXhwb3J0ZWQgZnVuY3Rpb24gbmFtZXMgaW4gc291cmNlIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGdldEV4cG9ydGVkRnVuY3Rpb25OYW1lcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPSByZWFkRmlsZVN5bmMoam9pbih0aGlzLnJvb3RGb2xkZXIsIHBhcmFtcy5zb3VyY2VQYXRoKSwgJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIFsuLi5zb3VyY2UubWF0Y2hBbGwoL15leHBvcnQgKD86YXN5bmMgKT9mdW5jdGlvblxcKj8gKD88bmFtZT5cXHcrKS9nbSldXG4gICAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBtZW1iZXJzIG9mIGFuIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgZGVjbGFyZWQgaW4gYSBzb3VyY2UgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgcGFyc2VkIHtAbGluayBJbnRlcmZhY2VNZW1iZXJzfS5cbiAgICogQHRocm93cyBXaGVuIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgc291cmNlIGZpbGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0SW50ZXJmYWNlTWVtYmVycyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEludGVyZmFjZU1lbWJlcnNQYXJhbXMpOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgICBjb25zdCBzb3VyY2UgPSByZWFkRmlsZVN5bmMoam9pbih0aGlzLnJvb3RGb2xkZXIsIHBhcmFtcy5zb3VyY2VQYXRoKSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgZXhwb3J0ICg/PGtleXdvcmQ+aW50ZXJmYWNlfGNsYXNzfGVudW0pICR7cGFyYW1zLmludGVyZmFjZU5hbWV9XFxiW157XSpcXHsoPzxib2R5PltcXHNcXFNdKj8pXFxuXFx9YCkuZXhlYyhzb3VyY2UpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgaW50ZXJmYWNlICR7cGFyYW1zLmludGVyZmFjZU5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZU1lbWJlcnMoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2tleXdvcmQnKSwgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2JvZHknKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIGNhY2hlcyB0aGUgZGVtbyBjb3JwdXMg4oCUIGV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0IGpvaW5lZCBpbnRvIG9uZSBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjb25jYXRlbmF0ZWQgZGVtby1ub3RlIGNvbnRlbnRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRDb3JwdXMoKTogc3RyaW5nIHtcbiAgICB0aGlzLmNhY2hlZENvcnB1cyA/Pz0gdGhpcy5jb2xsZWN0Tm90ZXMoKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5jb250ZW50KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZENvcnB1cztcbiAgfVxuXG4gIC8vIFRoZSBub3RlcyB0aGUgYXV0aG9yaW5nIGNoZWNrcyBhcHBseSB0bzogZXZlcnkgbm90ZSBleGNlcHQgdGhlIG9uZXMgZGVjbGFyZWQgb3V0c2lkZSB0aGUgbGVhcm5pbmdcbiAgLy8gcGF0aCAodGhlIHZhdWx0J3Mgb3duIGBSRUFETUUubWRgIGJ5IGRlZmF1bHQpLlxuICBwcml2YXRlIGNvbGxlY3RDaGVja2FibGVOb3RlcygpOiBEZW1vVmF1bHROb3RlW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3ROb3RlcygpLmZpbHRlcigobm90ZSkgPT4gIXRoaXMuZXhjbHVkZWROb3Rlcy5oYXMobm90ZS5yZWxhdGl2ZVBhdGgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdE1hcmtkb3duRmlsZXMoZm9sZGVyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICAgIC8vIGByZWFkZGlyU3luY2AgcmV0dXJucyBlbnRyaWVzIGluIHRoZSBmaWxlIHN5c3RlbSdzIG93biBvcmRlcjogYnkgbmFtZSBvbiBOVEZTLCBidXQgYnkgaGFzaCBvbiBleHQ0LCBzb1xuICAgIC8vIHNvcnQgdGhlbSBzbyBldmVyeSBjaGVjayByZXBvcnRzIGl0cyBub3RlcyBpbiB0aGUgc2FtZSBvcmRlciBvbiBldmVyeSBwbGF0Zm9ybS5cbiAgICBjb25zdCBlbnRyaWVzID0gcmVhZGRpclN5bmMoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lLCAnZW4nKSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBpZiAoZW50cnkubmFtZSA9PT0gT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTm9kZU1vZHVsZXMgYXMgc3RyaW5nKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5jb2xsZWN0TWFya2Rvd25GaWxlcyhqb2luKGZvbGRlciwgZW50cnkubmFtZSkpKTtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goam9pbihmb2xkZXIsIGVudHJ5Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGB2aXRlc3RgIHN1aXRlIHRoYXQga2VlcHMgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AgaW4gc3luYyB3aXRoIGl0cyBwdWJsaWMgc3VyZmFjZS5cbiAqXG4gKiBDYWxsIGl0IG9uY2UgZnJvbSBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYDsgaXQgcmVnaXN0ZXJzIG9uZSB0ZXN0IHBlciBjaGVjayxcbiAqIGRlbGVnYXRpbmcgdG8ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZWNsYXJhdGl2ZSBjb3ZlcmFnZSBzcGVjaWZpY2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlKHBhcmFtczogUmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrZXIgPSBuZXcgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcz4oe1xuICAgIGV4Y2x1ZGVkTm90ZXM6IHBhcmFtcy5hdXRob3Jpbmc/LmV4Y2x1ZGVkTm90ZXMsXG4gICAgcm9vdEZvbGRlcjogcGFyYW1zLnJvb3RGb2xkZXJcbiAgfSkpO1xuICBjb25zdCBzdGFydE5vdGUgPSBwYXJhbXMuYXV0aG9yaW5nPy5zdGFydE5vdGUgPz8gREVGQVVMVF9TVEFSVF9OT1RFO1xuICBjb25zdCB0cnlJdENvZGVCdXR0b25zID0gcGFyYW1zLmF1dGhvcmluZz8udHJ5SXRDb2RlQnV0dG9ucyA/PyBERUZBVUxUX1RSWV9JVF9DT0RFX0JVVFRPTlNfU0VWRVJJVFk7XG5cbiAgZGVzY3JpYmUoJ2RlbW8tdmF1bHQgY292ZXJhZ2UnLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5pbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSAke3NwZWMua2luZH1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGNvbnN0IGRlbW9uc3RyYXRlZCA9IG1lbWJlcnNbc3BlYy5raW5kXTtcbiAgICAgICAgZXhwZWN0KGRlbW9uc3RyYXRlZC5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyh7IG1lbWJlcnM6IGRlbW9uc3RyYXRlZCwgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KGByZWZlcmVuY2VzIG5vICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBtZW1iZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kU3RhbGVSZWZlcmVuY2VzKHsgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIsIHZhbGlkTWVtYmVyczogbWVtYmVycy5hbGwgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5jb25maWdJbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBvcHRpb25gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChtZW1iZXJzLnByb3BlcnRpZXMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBtZW1iZXJzLnByb3BlcnRpZXMgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5mdW5jdGlvbk1vZHVsZXMgPz8gW10pIHtcbiAgICAgIGl0KGBkZW1vbnN0cmF0ZXMgZXZlcnkgZXhwb3J0ZWQgZnVuY3Rpb24gaW4gJHtzcGVjLnNvdXJjZVBhdGh9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gY2hlY2tlci5nZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChmdW5jdGlvbk5hbWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogZnVuY3Rpb25OYW1lcyB9KSkudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBkb2NzID0gcGFyYW1zLmRvY3M7XG4gICAgaWYgKGRvY3MpIHtcbiAgICAgIGl0KCdsaW5rcyBhIGRlbW8gbm90ZSBmb3IgZXZlcnkgZmVhdHVyZSBkb2MnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzKHsgZG9jc0ZvbGRlcjogZG9jcy5mb2xkZXIsIG5vbkZlYXR1cmVEb2NzOiBkb2NzLm5vbkZlYXR1cmVEb2NzIH0pKVxuICAgICAgICAgIC50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KCdvcGVucyBldmVyeSBub3RlIHdpdGggYW4gSDEnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRob3V0SDEoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnb3BlbnMgZXZlcnkgbm90ZSB3aXRoIGEgcHJvc2UgcGFyYWdyYXBoIGJlZm9yZSBpdHMgZmlyc3QgY29kZSBibG9jaycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhvdXRJbnRyb1Byb3NlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoYHJlYWNoZXMgZXZlcnkgbm90ZSBmcm9tICR7c3RhcnROb3RlfWAsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbnJlYWNoYWJsZU5vdGVzKHsgc3RhcnROb3RlIH0pKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIG5vIHdpa2lsaW5rcywgd2hpY2ggZG8gbm90IHJlbmRlciBvbiBHaXRIdWInLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoV2lraWxpbmtzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2p1c3RpZmllcyBldmVyeSB3aWtpbGluayBhbGxvd2FuY2UgYW5kIGRpcmVjdGl2ZSwgYW5kIGRlY2xhcmVzIG5vbmUgaXQgbm8gbG9uZ2VyIG5lZWRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aFVuanVzdGlmaWVkV2lraWxpbmtBbGxvd2FuY2UoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZ2l2ZXMgZXZlcnkgVHJ5IGl0IHNlY3Rpb24gYSBjb2RlIGJ1dHRvbiwgb3IgYSBzdGF0ZWQgcmVhc29uIGl0IGhhcyBub25lJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjaGVja2VyLmZpbmRUcnlJdFNlY3Rpb25zV2l0aG91dENvZGVCdXR0b24oKTtcbiAgICAgIGlmICh0cnlJdENvZGVCdXR0b25zID09PSAnZXJyb3InKSB7XG4gICAgICAgIGV4cGVjdChzZWN0aW9ucykudG9FcXVhbChbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihmb3JtYXRUcnlJdFdhcm5pbmcoc2VjdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdjYXJyaWVzIG5vIERvY3MgbGluayBsaW5lLCBiZWNhdXNlIHRoZSBub3RlIGlzIHRoZSBkb2NzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aERvY3NMaW5rcygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb21taXRzIG5vbmUgb2YgdGhlIGFwcC5qc29uIHNldHRpbmdzIG9ic2lkaWFuLWRldi11dGlscyBpbmplY3RzIGF0IHJlbGVhc2UgdGltZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRDb21taXR0ZWRBcHBKc29uU2V0dGluZ3MoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICAvLyBXaXRoIG5vIG5vdGVzIHRvIHJlYWQsIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayBhYm92ZSBwYXNzZXMgYnkgaGF2aW5nIG5vdGhpbmcgdG8gbG9vayBhdCwgc28gYSB2YXVsdFxuICAgIC8vIHRoYXQgc3RvcHBlZCBiZWluZyBmb3VuZCB3b3VsZCBnbyBvbiByZXBvcnRpbmcgaXRzZWxmIGNsZWFuLiBUaGlzIGlzIHRoZSBoYWxmIG9mIHRoZSBub24tdHJpdmlhbFxuICAgIC8vIGd1YXJkIHRoYXQgc3RpbGwgYXBwbGllcyB3aGVuIHRoZSBwbHVnaW4gZXhwb3NlcyBub3RoaW5nIHRvIHJlZmxlY3QuXG4gICAgaXQoJ3JlYWRzIGEgbm9uLWVtcHR5IGRlbW8gdmF1bHQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5jb2xsZWN0RGVtb05vdGVSZWxhdGl2ZVBhdGhzKCkubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBndWFyZCA9IHBhcmFtcy5ub25Ucml2aWFsR3VhcmQ7XG4gICAgaWYgKGd1YXJkKSB7XG4gICAgICBpdCgna2VlcHMgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIG5vbi10cml2aWFsJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKGd1YXJkKTtcbiAgICAgICAgZXhwZWN0KG1lbWJlcnMuYWxsKS50b0NvbnRhaW4oZ3VhcmQuZXhwZWN0TWVtYmVyKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuY29sbGVjdERlbW9Ob3RlUmVsYXRpdmVQYXRocygpKS50b0NvbnRhaW4oZ3VhcmQuZXhwZWN0RGVtb05vdGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQ0xBU1NfTUVNQkVSX01PRElGSUVSUyA9IFN0cmluZy5yYXdgKD86KD86cHVibGljfHByaXZhdGV8cHJvdGVjdGVkfHJlYWRvbmx5fHN0YXRpY3xhYnN0cmFjdHxvdmVycmlkZSlcXHMrKSpgO1xuY29uc3QgQUJTT0xVVEVfVVJMX1JFR19FWFAgPSAvXlthLXpdW1xcdysuLV0qOi9pO1xuY29uc3QgQVJST1dfUkVHX0VYUCA9IC9eXFxzKj0+LztcbmNvbnN0IEZVTkNUSU9OX1RZUEVfUEFSQU1FVEVSU19SRUdfRVhQID0gL148W14+XSo+XFxzKi87XG5jb25zdCBBTkdMRV9CUkFDS0VUU19SRUdfRVhQID0gL148fD4kL2c7XG5jb25zdCBDT0RFX0JVVFRPTl9GRU5DRV9SRUdfRVhQID0gL15cXHMqKD86YGBgfH5+filcXHMqY29kZS1idXR0b25cXGIvO1xuY29uc3QgQ09ERV9GRU5DRV9SRUdfRVhQID0gL15cXHMqKD86YGBgfH5+fikvO1xuY29uc3QgREVGQVVMVF9FWENMVURFRF9OT1RFUyA9IFsnUkVBRE1FLm1kJ107XG5jb25zdCBERUZBVUxUX1NUQVJUX05PVEUgPSAnMDAgU3RhcnQubWQnO1xuLy8gQSB3YXJuaW5nIHdoaWxlIGV4aXN0aW5nIHZhdWx0cyBhcmUgYnJvdWdodCB1cCB0byB0aGUgY2hlY2s7IGl0IGJlY29tZXMgYW4gZXJyb3Igb25jZSB0aGV5IGFyZS5cbmNvbnN0IERFRkFVTFRfVFJZX0lUX0NPREVfQlVUVE9OU19TRVZFUklUWTogRGVtb1ZhdWx0Q2hlY2tTZXZlcml0eSA9ICd3YXJuJztcbmNvbnN0IERPQ1NfTElOS19SRUdfRVhQID0gL15cXHMqXFxbRG9jc11cXCgvO1xuY29uc3QgRlJPTlRNQVRURVJfUkVHX0VYUCA9IC9eLS0tXFxyP1xcbltcXHNcXFNdKj9cXHI/XFxuLS0tW15cXFNcXG5dKlxccj9cXG4/LztcbmNvbnN0IEgxX1JFR19FWFAgPSAvXiMgXFxTLztcbmNvbnN0IEhFQURJTkdfTEVWRUxfUkVHX0VYUCA9IC9eIHswLDN9KD88aGFzaGVzPiN7MSw2fSkoPzpcXHN8JCkvO1xuY29uc3QgSEVBRElOR19SRUdfRVhQID0gL14jezEsNn0gLztcbmNvbnN0IElOTElORV9DT0RFX1JFR19FWFAgPSAvYFteYFxcbl0qYC9nO1xuY29uc3QgTUFSS0RPV05fTElOS19SRUdfRVhQID0gL1xcW1teXFxdXSpdXFwoKD88dGFyZ2V0PlteKV0rKVxcKS9nO1xuLy8gQW4gaW5saW5lIGRpcmVjdGl2ZSwgc2hhcGVkIGFmdGVyIEVTTGludCdzIGFuZCB3cml0dGVuIGFzIGFuIEhUTUwgY29tbWVudCBzbyBpdCBpcyBpbnZpc2libGUgQk9USCBpblxuLy8gT2JzaWRpYW4gYW5kIG9uIEdpdEh1YiDigJQgdGhlIHNhbWUgc3BlbGxpbmcgdGhlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWAuXG4vLyBBbiBPYnNpZGlhbiBgJSUg4oCmICUlYCBjb21tZW50IHdvdWxkIHNob3cgdXAgYXMgbGl0ZXJhbCB0ZXh0IG9uIEdpdEh1Yiwgd2hpY2ggaXMgaGFsZiB0aGUgcmVhZGVyc2hpcC5cbmNvbnN0IERJUkVDVElWRV9SRUdfRVhQID0gL15cXHMqPCEtLVxccypvYnNpZGlhbi1kZXYtdXRpbHMtKD88YWN0aW9uPmRpc2FibGUtbmV4dC1saW5lfGRpc2FibGV8ZW5hYmxlKVxccysoPzxydWxlPltcXHctXStcXC9bXFx3LV0rKSg/OlxccystLVxccysoPzxyZWFzb24+Lio/KSk/XFxzKi0tPlxccyokLztcbi8vIENhdGNoZXMgYSBkaXJlY3RpdmUgdGhhdCB3YXMgTUVBTlQgdG8gYmUgb25lIGJ1dCBpcyBtaXNzcGVsbGVkOiBpdCB3b3VsZCBvdGhlcndpc2UgcmVhZCBhcyBhbiBvcmRpbmFyeVxuLy8gY29tbWVudCBhbmQgc2lsZW50bHkgZG8gbm90aGluZywgd2hpY2ggaXMgdGhlIGZhaWx1cmUgbW9kZSBhIHN1cHByZXNzaW9uIHN5bnRheCBtdXN0IG5ldmVyIGhhdmUuXG5jb25zdCBESVJFQ1RJVkVfUFJPQkVfUkVHX0VYUCA9IC88IS0tXFxzKm9ic2lkaWFuLWRldi11dGlscy0vO1xuY29uc3QgVFJZX0lUX0hFQURJTkdfUkVHX0VYUCA9IC9eIHswLDN9I3sxLDZ9XFxzK1RyeSBpdFxcYi9pO1xuY29uc3QgVFJZX0lUX1JVTEUgPSAnZGVtby12YXVsdC12YWxpZGF0aW9uL3RyeS1pdC1jb2RlLWJ1dHRvbic7XG5jb25zdCBXSUtJTElOS19SVUxFID0gJ2RlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MnO1xuLy8gRXZlcnkgcnVsZSBhIGRpcmVjdGl2ZSBtYXkgbmFtZSwgd2l0aCB3aGF0IGEgbGluZSBicmVha2luZyBpdCBpcyBjYWxsZWQgaW4gYSBwcm9ibGVtIG1lc3NhZ2UuXG5jb25zdCBESVJFQ1RJVkVfUlVMRV9UQVJHRVRTID0gbmV3IE1hcChbXG4gIFtUUllfSVRfUlVMRSwgJ1RyeSBpdCBzZWN0aW9uIHdpdGhvdXQgYSBjb2RlIGJ1dHRvbiddLFxuICBbV0lLSUxJTktfUlVMRSwgJ3dpa2lsaW5rJ11cbl0pO1xuLy8gVGhlIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGZyb250bWF0dGVyIHBhdGgsIGF0IGFueSBpbmRlbnRhdGlvbjpcbi8vIFRoZSBrZXlzIG11c3QgbmVzdCBpbiB0aGF0IG9yZGVyLCBhbmQgYW55IGxpbmUgYmV0d2VlbiB0aGVtIGhhcyB0byBzdGF5IGluZGVudGVkLCBzbyBhIGRlZGVudCB0byB0aGVcbi8vIGRvY3VtZW50J3Mgb3duIHRvcCBsZXZlbCBlbmRzIHRoZSBtYXRjaCByYXRoZXIgdGhhbiByZWFjaGluZyBhIHNhbWUtbmFtZWQga2V5IHVuZGVyIGFub3RoZXIgcGFyZW50LlxuY29uc3QgV0lLSUxJTktfQUxMT1dBTkNFX1JFR19FWFAgPSAvXm9ic2lkaWFuLWRldi11dGlsczpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2RlbW8tdmF1bHQtdmFsaWRhdGlvbjpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2FsbG93LXdpa2lsaW5rczooPzxyZWFzb24+LiopJC9tO1xuY29uc3QgV0lLSUxJTktfUkVHX0VYUCA9IC9cXFtcXFtbXlxcXV0rXV0vO1xuXG4vLyBBcHBsaWVzIG9uZSBwYXJzZWQgZGlyZWN0aXZlIHRvIHRoZSBzY2FuLiBFYWNoIHJ1bGUga2VlcHMgaXRzIG93biByZWdpb24gYW5kIGl0cyBvd24gcGVuZGluZ1xuLy8gYGRpc2FibGUtbmV4dC1saW5lYCwgc28gYSBkaXJlY3RpdmUgZm9yIG9uZSBydWxlIG5ldmVyIGV4ZW1wdHMgYSBsaW5lIGZyb20gYW5vdGhlci5cbmZ1bmN0aW9uIGFwcGx5RGlyZWN0aXZlKHN0YXRlOiBEaXJlY3RpdmVTY2FuU3RhdGUsIGxpbmVJbmRleDogbnVtYmVyLCBtYXRjaDogUmVnRXhwRXhlY0FycmF5KTogdm9pZCB7XG4gIGNvbnN0IGFjdGlvbiA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdhY3Rpb24nKTtcbiAgY29uc3QgcnVsZSA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdydWxlJyk7XG4gIGNvbnN0IHJlYXNvbiA9IG1hdGNoLmdyb3Vwcz8uWydyZWFzb24nXT8udHJpbSgpID8/ICcnO1xuICBjb25zdCB0YXJnZXQgPSBESVJFQ1RJVkVfUlVMRV9UQVJHRVRTLmdldChydWxlKTtcbiAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYW4gdW5rbm93biBydWxlIFwiJHtydWxlfVwiIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYWN0aW9uICE9PSAnZW5hYmxlJyAmJiByZWFzb24gPT09ICcnKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXJlY3RpdmUgd2l0aCBubyByZWFzb24gb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUtbmV4dC1saW5lJykge1xuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGUuc2V0KHJ1bGUsIGxpbmVJbmRleCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3BlblJlZ2lvbiA9IHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLmdldChydWxlKTtcbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUnKSB7XG4gICAgaWYgKG9wZW5SZWdpb24pIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX0gaW5zaWRlIHRoZSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihvcGVuUmVnaW9uLmxpbmVJbmRleCl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLnNldChydWxlLCB7IGlzVXNlZDogZmFsc2UsIGxpbmVJbmRleCB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIW9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhbiBlbmFibGUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9IHdpdGggbm8gcmVnaW9uIG9wZW5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFvcGVuUmVnaW9uLmlzVXNlZCkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIob3BlblJlZ2lvbi5saW5lSW5kZXgpfSBjb3ZlcmluZyBubyAke3RhcmdldH1gKTtcbiAgfVxuICBzdGF0ZS5vcGVuUmVnaW9uc0J5UnVsZS5kZWxldGUocnVsZSk7XG59XG5cbi8vIEFwcGxpZXMgb25lIG9yZGluYXJ5IGxpbmUgdG8gdGhlIHNjYW4sIHJ1bGUgYnkgcnVsZTogYW4gb3BlbiByZWdpb24gY292ZXJzIGl0LCBhbmQgYSBwZW5kaW5nXG4vLyBgZGlzYWJsZS1uZXh0LWxpbmVgIGNsYWltcyB0aGUgZmlyc3QgbGluZSB3aXRoIGNvbnRlbnQgb24gaXQg4oCUIHRoZSBkaXJlY3RpdmUgYW5kIGl0cyB0YXJnZXQgYXJlIHVzdWFsbHkgYVxuLy8gYmxhbmsgbGluZSBhcGFydC5cbmZ1bmN0aW9uIGFwcGx5RGlyZWN0aXZlU2NhbkxpbmUoc3RhdGU6IERpcmVjdGl2ZVNjYW5TdGF0ZSwgbGluZUluZGV4OiBudW1iZXIsIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtydWxlLCB0YXJnZXRdIG9mIERJUkVDVElWRV9SVUxFX1RBUkdFVFMpIHtcbiAgICBjb25zdCBpc1RhcmdldCA9IGVuc3VyZU5vbk51bGxhYmxlKHN0YXRlLnRhcmdldExpbmVJbmRleGVzQnlSdWxlLmdldChydWxlKSkuaGFzKGxpbmVJbmRleCk7XG4gICAgY29uc3Qgb3BlblJlZ2lvbiA9IHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLmdldChydWxlKTtcbiAgICBpZiAob3BlblJlZ2lvbikge1xuICAgICAgZ2V0T3JDcmVhdGVMaW5lSW5kZXhlcyhzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUsIHJ1bGUpLmFkZChsaW5lSW5kZXgpO1xuICAgICAgb3BlblJlZ2lvbi5pc1VzZWQgfHw9IGlzVGFyZ2V0O1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmdOZXh0TGluZUluZGV4ID0gc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXhlc0J5UnVsZS5nZXQocnVsZSk7XG4gICAgaWYgKHBlbmRpbmdOZXh0TGluZUluZGV4ID09PSB1bmRlZmluZWQgfHwgbGluZS50cmltKCkgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZ2V0T3JDcmVhdGVMaW5lSW5kZXhlcyhzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUsIHJ1bGUpLmFkZChsaW5lSW5kZXgpO1xuICAgIGlmICghaXNUYXJnZXQpIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZS1uZXh0LWxpbmUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHBlbmRpbmdOZXh0TGluZUluZGV4KX0gY292ZXJpbmcgbm8gJHt0YXJnZXR9YCk7XG4gICAgfVxuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGUuZGVsZXRlKHJ1bGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWVtYmVycyhtZXRob2RzOiBzdHJpbmdbXSwgcHJvcGVydGllczogc3RyaW5nW10pOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgcmV0dXJuIHtcbiAgICBhbGw6IFsuLi5tZXRob2RzLCAuLi5wcm9wZXJ0aWVzXSxcbiAgICBtZXRob2RzLFxuICAgIHByb3BlcnRpZXNcbiAgfTtcbn1cblxuLy8gUmVzb2x2ZXMgdGhlIG5vdGVzIGEgbm90ZSBsaW5rcyB0bzogZXZlcnkgTWFya2Rvd24gbGluayBvdXRzaWRlIGEgY29kZSBmZW5jZSB3aG9zZSB0YXJnZXQgaXMgYSBgLm1kYFxuLy8gZmlsZSwgbWFkZSByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBzbyBpdCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBub3RlIG1hcC4gRXh0ZXJuYWwgVVJMcyBhbmRcbi8vIG5vbi1ub3RlIHRhcmdldHMgKGltYWdlcywgc2NyaXB0cykgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsZWFybmluZyBwYXRoIGFuZCBhcmUgc2tpcHBlZDsgYSBgI2FuY2hvcmAgaXNcbi8vIGRyb3BwZWQsIHNpbmNlIGl0IGFkZHJlc3NlcyBhIHBsYWNlIGluc2lkZSBhbiBhbHJlYWR5LXJlc29sdmVkIG5vdGUuXG4vLyBSZXR1cm5zIHRoZSBub3RlJ3MgbGluZXMgd2l0aCBmZW5jZWQgY29kZSBibG9ja3MgcmVtb3ZlZCAodGhlIGZlbmNlIGxpbmVzIGluY2x1ZGVkKSwgcGFpcmVkIHdpdGggdGhlXG4vLyBsaW5lIG51bWJlciBlYWNoIGNhbWUgZnJvbSwgc28gYSBjaGVjayBuZXZlciBtaXN0YWtlcyBzYW1wbGUgY29kZSBmb3IgcHJvc2Ug4oCUIGEgYFtbd2lraWxpbmtdXWBcbi8vIGRlbW9uc3RyYXRlZCBpbnNpZGUgYSBmZW5jZSBpcyB0ZXh0LCBub3QgbmF2aWdhdGlvbiDigJQgYW5kIGFuIGlubGluZSBkaXJlY3RpdmUgY2FuIHN0aWxsIG5hbWUgYSBsaW5lLlxuZnVuY3Rpb24gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBOb3RlTGluZVtdIHtcbiAgY29uc3Qgbm90ZUxpbmVzOiBOb3RlTGluZVtdID0gW107XG4gIGxldCBpc0luc2lkZUZlbmNlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoQ09ERV9GRU5DRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIGlzSW5zaWRlRmVuY2UgPSAhaXNJbnNpZGVGZW5jZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWlzSW5zaWRlRmVuY2UpIHtcbiAgICAgIG5vdGVMaW5lcy5wdXNoKHsgaW5kZXgsIGxpbmUgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3RlTGluZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3ROb3RlTGlua1RhcmdldHMobm90ZTogRGVtb1ZhdWx0Tm90ZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdGFyZ2V0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGdldExpbmVzT3V0c2lkZUZlbmNlcyhub3RlLmNvbnRlbnQpKSB7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBzdHJpcElubGluZUNvZGUobGluZSkubWF0Y2hBbGwoTUFSS0RPV05fTElOS19SRUdfRVhQKSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpLnJlcGxhY2VBbGwoQU5HTEVfQlJBQ0tFVFNfUkVHX0VYUCwgJycpO1xuICAgICAgY29uc3QgW25vdGVQYXRoID0gJyddID0gdGFyZ2V0LnNwbGl0KCcjJywgMSk7XG4gICAgICBpZiAoQUJTT0xVVEVfVVJMX1JFR19FWFAudGVzdChub3RlUGF0aCkgfHwgIW5vdGVQYXRoLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0cy5wdXNoKGpvaW4oZGlybmFtZShub3RlLnJlbGF0aXZlUGF0aCksIHRyeURlY29kZVVyaUNvbXBvbmVudChub3RlUGF0aCkpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldHM7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGNsYXNzQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmNsYXNzQm9keS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgXiB7Mn0oPzxtb2RpZmllcnM+JHtDTEFTU19NRU1CRVJfTU9ESUZJRVJTfSkoPzxuYW1lPlxcdyspKD86PFtePl0qPik/XFwoYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc1Byb3BlcnR5TmFtZXMoY2xhc3NCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uY2xhc3NCb2R5Lm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeIHsyfSg/PG1vZGlmaWVycz4ke0NMQVNTX01FTUJFUl9NT0RJRklFUlN9KSg/PG5hbWU+XFx3KylcXHMqXFw/P1xccypbOj1dYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoZW51bUJvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5lbnVtQm9keS5tYXRjaEFsbCgvXiB7Mn0oPzxuYW1lPlxcdyspL2dtKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbi8vIEEgbWV0aG9kIGlzIGNhbGxhYmxlIHN1cmZhY2UgaG93ZXZlciBpdCBpcyB3cml0dGVuOiBhIG1ldGhvZCBzaWduYXR1cmUgKGBmb28oYmFyOiBzdHJpbmcpOiB2b2lkO2ApIG9yIGFcbi8vIHByb3BlcnR5IHNpZ25hdHVyZSB3aG9zZSB0eXBlIGlzIGEgZnVuY3Rpb24gdHlwZSAoYGZvbzogKGJhcjogc3RyaW5nKSA9PiB2b2lkO2ApLiBUaGUgc2hhcmVkIEVTTGludCBjb25maWdcbi8vIHJ1bnMgYEB0eXBlc2NyaXB0LWVzbGludC9tZXRob2Qtc2lnbmF0dXJlLXN0eWxlYCBhdCBpdHMgYHByb3BlcnR5YCBkZWZhdWx0LCBzbyBgbGludDpmaXhgIHJld3JpdGVzIHRoZVxuLy8gZmlyc3Qgc2hhcGUgaW50byB0aGUgc2Vjb25kIOKAlCByZWFkaW5nIG9ubHkgdGhlIGZpcnN0IHJlcG9ydGVkIHplcm8gbWV0aG9kcyBmb3IgZXZlcnkgc3VjaCBpbnRlcmZhY2UuXG5mdW5jdGlvbiBleHRyYWN0TWV0aG9kTmFtZXMoaW50ZXJmYWNlQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBtZXRob2RTaWduYXR1cmVOYW1lcyA9IFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/PG5hbWU+XFx3KykoPzo8W14+XSo+KT9cXCgvZ20pXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgY29uc3QgZnVuY3Rpb25Qcm9wZXJ0eU5hbWVzID0gbWF0Y2hQcm9wZXJ0eVNpZ25hdHVyZXMoaW50ZXJmYWNlQm9keSlcbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gaXNGdW5jdGlvblR5cGUoaW50ZXJmYWNlQm9keSwgbWF0Y2gpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgcmV0dXJuIFsuLi5tZXRob2RTaWduYXR1cmVOYW1lcywgLi4uZnVuY3Rpb25Qcm9wZXJ0eU5hbWVzXTtcbn1cblxuLy8gRXZlcnkgcHJvcGVydHkgc2lnbmF0dXJlIHdob3NlIHR5cGUgaXMgbm90IGEgZnVuY3Rpb24gdHlwZSwgc28gbWV0aG9kcyBhbmQgcHJvcGVydGllcyBzdGF5IGEgcGFydGl0aW9uLlxuZnVuY3Rpb24gZXh0cmFjdFByb3BlcnR5TmFtZXMoaW50ZXJmYWNlQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gbWF0Y2hQcm9wZXJ0eVNpZ25hdHVyZXMoaW50ZXJmYWNlQm9keSlcbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gIWlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHksIG1hdGNoKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbi8vIFRoZSBoZWFkaW5nIGxpbmVzIG9mIHRoZSBgVHJ5IGl0YCBzZWN0aW9ucyB0aGF0IGhvbGQgbm8gYGNvZGUtYnV0dG9uYC4gQSBzZWN0aW9uIHJ1bnMgdG8gdGhlIG5leHQgaGVhZGluZ1xuLy8gb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwsIHNvIGEgYCMjIyBTdGVwIDFgIGluc2lkZSBhIGAjIyBUcnkgaXRgIHN0YXlzIHBhcnQgb2YgaXQuIEhlYWRpbmdzIGFuZFxuLy8gZmVuY2VzIGluc2lkZSBhIGZlbmNlZCBibG9jayBhcmUgc2FtcGxlIHRleHQsIHNvIG9ubHkgYSBmZW5jZSB0aGF0IE9QRU5TIGEgYmxvY2sgY2FuIGJlIHRoZSBidXR0b24uXG5mdW5jdGlvbiBmaW5kVHJ5SXRMaW5lSW5kZXhlc1dpdGhvdXRDb2RlQnV0dG9uKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgY29uc3QgbGluZUluZGV4ZXM6IG51bWJlcltdID0gW107XG4gIGxldCBzZWN0aW9uOiBudWxsIHwgVHJ5SXRTZWN0aW9uID0gbnVsbDtcbiAgbGV0IGlzSW5zaWRlRmVuY2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpLmVudHJpZXMoKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgaWYgKCFpc0luc2lkZUZlbmNlICYmIHNlY3Rpb24gJiYgQ09ERV9CVVRUT05fRkVOQ0VfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICAgIHNlY3Rpb24uaGFzQ29kZUJ1dHRvbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBpc0luc2lkZUZlbmNlID0gIWlzSW5zaWRlRmVuY2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaGFzaGVzID0gaXNJbnNpZGVGZW5jZSA/IHVuZGVmaW5lZCA6IEhFQURJTkdfTEVWRUxfUkVHX0VYUC5leGVjKGxpbmUpPy5ncm91cHM/LlsnaGFzaGVzJ107XG4gICAgaWYgKGhhc2hlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNlY3Rpb24gJiYgaGFzaGVzLmxlbmd0aCA8PSBzZWN0aW9uLmxldmVsKSB7XG4gICAgICBpZiAoIXNlY3Rpb24uaGFzQ29kZUJ1dHRvbikge1xuICAgICAgICBsaW5lSW5kZXhlcy5wdXNoKHNlY3Rpb24ubGluZUluZGV4KTtcbiAgICAgIH1cbiAgICAgIHNlY3Rpb24gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXNlY3Rpb24gJiYgVFJZX0lUX0hFQURJTkdfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICBzZWN0aW9uID0geyBoYXNDb2RlQnV0dG9uOiBmYWxzZSwgbGV2ZWw6IGhhc2hlcy5sZW5ndGgsIGxpbmVJbmRleDogaW5kZXggfTtcbiAgICB9XG4gIH1cbiAgaWYgKHNlY3Rpb24gJiYgIXNlY3Rpb24uaGFzQ29kZUJ1dHRvbikge1xuICAgIGxpbmVJbmRleGVzLnB1c2goc2VjdGlvbi5saW5lSW5kZXgpO1xuICB9XG4gIHJldHVybiBsaW5lSW5kZXhlcztcbn1cblxuLy8gVGhlIGxpbmUgbnVtYmVycyBjYXJyeWluZyBhIHdpa2lsaW5rIHRoYXQgaXMgbmF2aWdhdGlvbiByYXRoZXIgdGhhbiBzYW1wbGUgdGV4dC5cbmZ1bmN0aW9uIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudClcbiAgICAuZmlsdGVyKChub3RlTGluZSkgPT4gV0lLSUxJTktfUkVHX0VYUC50ZXN0KHN0cmlwSW5saW5lQ29kZShub3RlTGluZS5saW5lKSkpXG4gICAgLm1hcCgobm90ZUxpbmUpID0+IG5vdGVMaW5lLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbGluZSAke1N0cmluZyhsaW5lSW5kZXggKyAxKX1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUcnlJdFdhcm5pbmcoc2VjdGlvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICBgZGVtby12YXVsdCBjb3ZlcmFnZTogJHtTdHJpbmcoc2VjdGlvbnMubGVuZ3RoKX0gVHJ5IGl0IHNlY3Rpb24ocykgaGF2ZSBubyBjb2RlLWJ1dHRvbiB0byBwZXJmb3JtIHRoZWlyIHNldHVwLmAsXG4gICAgYEFkZCBvbmUsIG9yIHN0YXRlIHdoeSB0aGUgc3RlcHMgY2Fubm90IGJlIHNjcmlwdGVkIHdpdGggPCEtLSBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZS1uZXh0LWxpbmUgJHtUUllfSVRfUlVMRX0gLS0gPHJlYXNvbj4gLS0+IGFib3ZlIHRoZSBoZWFkaW5nLmAsXG4gICAgLi4uc2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiBgICAke3NlY3Rpb259YClcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxsb3dlZExpbmVJbmRleGVzKHNjYW46IERpcmVjdGl2ZVNjYW4sIHJ1bGU6IHN0cmluZyk6IFJlYWRvbmx5U2V0PG51bWJlcj4ge1xuICByZXR1cm4gc2Nhbi5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUuZ2V0KHJ1bGUpID8/IG5ldyBTZXQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZXNPdXRzaWRlRmVuY2VzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudCkubWFwKChub3RlTGluZSkgPT4gbm90ZUxpbmUubGluZSk7XG59XG5cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlTGluZUluZGV4ZXMobGluZUluZGV4ZXNCeVJ1bGU6IE1hcDxzdHJpbmcsIFNldDxudW1iZXI+PiwgcnVsZTogc3RyaW5nKTogU2V0PG51bWJlcj4ge1xuICBsZXQgbGluZUluZGV4ZXMgPSBsaW5lSW5kZXhlc0J5UnVsZS5nZXQocnVsZSk7XG4gIGlmICghbGluZUluZGV4ZXMpIHtcbiAgICBsaW5lSW5kZXhlcyA9IG5ldyBTZXQoKTtcbiAgICBsaW5lSW5kZXhlc0J5UnVsZS5zZXQocnVsZSwgbGluZUluZGV4ZXMpO1xuICB9XG4gIHJldHVybiBsaW5lSW5kZXhlcztcbn1cblxuLy8gV2hldGhlciB0aGUgbm90ZSdzIGZpcnN0IGNvbnRlbnQgbGluZSAoZnJvbnRtYXR0ZXIgYW5kIGJsYW5rIGxpbmVzIGFzaWRlKSBpcyBhbiBgIyBIMWAuXG5mdW5jdGlvbiBoYXNIMShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZExpbmUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIEgxX1JFR19FWFAudGVzdCh0cmltbWVkTGluZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIGEgcGxhaW4gcHJvc2UgbGluZSBhcHBlYXJzIGJlZm9yZSB0aGUgbm90ZSdzIGZpcnN0IGNvZGUgZmVuY2UuIEhlYWRpbmdzIGFyZSBub3QgcHJvc2Ug4oCUIGEgbm90ZVxuLy8gdGhhdCBnb2VzIHN0cmFpZ2h0IGZyb20gaXRzIHRpdGxlIHRvIGEgYnV0dG9uIGlzIGV4YWN0bHkgdGhlIHNoYXBlIHRoaXMgY2hlY2sgcmVqZWN0cy5cbmZ1bmN0aW9uIGhhc0ludHJvUHJvc2UoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBzdHJpcEZyb250bWF0dGVyKGNvbnRlbnQpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICh0cmltbWVkTGluZSA9PT0gJycgfHwgSEVBRElOR19SRUdfRVhQLnRlc3QodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBub3RlIG5hdmlnYXRlcyB3aXRoIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gLiBGZW5jZWQgYmxvY2tzIGFuZCBpbmxpbmUgY29kZSBhcmUgc2FtcGxlXG4vLyB0ZXh0IHJhdGhlciB0aGFuIG5hdmlnYXRpb24sIHNvIHRoZXkgYXJlIHJlbW92ZWQgYmVmb3JlIGxvb2tpbmcuXG5mdW5jdGlvbiBoYXNXaWtpbGluayhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpLmxlbmd0aCA+IDA7XG59XG5cbi8vIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNpZ25hdHVyZSdzIHR5cGUsIHN0YXJ0aW5nIHJpZ2h0IGFmdGVyIGl0cyBgOmAsIGlzIGEgZnVuY3Rpb24gdHlwZTogYW4gb3B0aW9uYWwgdHlwZVxuLy8gcGFyYW1ldGVyIGxpc3QsIGEgcGFyYW1ldGVyIGxpc3QsIHRoZW4gYD0+YC4gVGhlIHBhcmFtZXRlciBsaXN0IGlzIHdhbGtlZCBieSBicmFja2V0IGRlcHRoIHJhdGhlciB0aGFuIGJ5IGFcbi8vIHJlZ3VsYXIgZXhwcmVzc2lvbiwgc28gYSBwYXJlbnRoZXNpemVkIG5vbi1mdW5jdGlvbiB0eXBlIChgKHN0cmluZyB8IG51bWJlcilbXWApIGFuZCBhIHBhcmFtZXRlciB3aG9zZSBvd25cbi8vIHR5cGUgaG9sZHMgcGFyZW50aGVzZXMgKGAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWRgKSBhcmUgYm90aCByZWFkIGNvcnJlY3RseSwgYWNyb3NzIGxpbmVzIHRvby5cbmZ1bmN0aW9uIGlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHk6IHN0cmluZywgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSk6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgaW5kZXggKz0gRlVOQ1RJT05fVFlQRV9QQVJBTUVURVJTX1JFR19FWFAuZXhlYyhpbnRlcmZhY2VCb2R5LnNsaWNlKGluZGV4KSk/LlswXS5sZW5ndGggPz8gMDtcbiAgaWYgKGludGVyZmFjZUJvZHlbaW5kZXhdICE9PSAnKCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGRlcHRoID0gMDtcbiAgZm9yICg7IGluZGV4IDwgaW50ZXJmYWNlQm9keS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBpbnRlcmZhY2VCb2R5W2luZGV4XTtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnKCcpIHtcbiAgICAgIGRlcHRoKys7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZGVwdGgtLTtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQVJST1dfUkVHX0VYUC50ZXN0KGludGVyZmFjZUJvZHkuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNOb25QdWJsaWNNZW1iZXIobW9kaWZpZXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGIoPzpwcml2YXRlfHByb3RlY3RlZClcXGIvLnRlc3QobW9kaWZpZXJzKTtcbn1cblxuLy8gYHJlYWRvbmx5YCBpcyB0aGUgb25seSBtb2RpZmllciBhIHByb3BlcnR5IHNpZ25hdHVyZSB0YWtlcywgYW5kIGEgbWV0aG9kIHNpZ25hdHVyZSB0YWtlcyBub25lIOKAlCBUeXBlU2NyaXB0XG4vLyByZWplY3RzIGByZWFkb25seSBmb28oKTogdm9pZDtgIOKAlCBzbyB0aGUgbWV0aG9kLXNpZ25hdHVyZSByZWdleCBuZWVkcyBubyBjb3VudGVycGFydC5cbmZ1bmN0aW9uIG1hdGNoUHJvcGVydHlTaWduYXR1cmVzKGludGVyZmFjZUJvZHk6IHN0cmluZyk6IFJlZ0V4cEV4ZWNBcnJheVtdIHtcbiAgcmV0dXJuIFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/OnJlYWRvbmx5XFxzKyk/KD88bmFtZT5cXHcrKVxcPz86XFxzKi9nbSldO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1lbWJlcnMoa2V5d29yZDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgc3dpdGNoIChrZXl3b3JkKSB7XG4gICAgY2FzZSAnY2xhc3MnOiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGJvZHkpLCBleHRyYWN0Q2xhc3NQcm9wZXJ0eU5hbWVzKGJvZHkpKTtcbiAgICB9XG4gICAgY2FzZSAnZW51bSc6IHtcbiAgICAgIHJldHVybiBidWlsZE1lbWJlcnMoW10sIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoYm9keSkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RNZXRob2ROYW1lcyhib2R5KSwgZXh0cmFjdFByb3BlcnR5TmFtZXMoYm9keSkpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBSZWFkcyB0aGUgbm90ZSdzIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGRlY2xhcmF0aW9uOiB0aGUgc3RhdGVkXG4vLyByZWFzb24sIGAnJ2Agd2hlbiB0aGUga2V5IGlzIHByZXNlbnQgd2l0aCBub3RoaW5nIGFmdGVyIGl0LCBvciBgbnVsbGAgd2hlbiB0aGUgbm90ZSBkZWNsYXJlcyBub3RoaW5nLlxuLy8gUmVhZCB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uIHJhdGhlciB0aGFuIGEgWUFNTCBwYXJzZXI6IGl0IGlzIG9uZSBrbm93biBrZXkgcGF0aCwgYW5kIGV2ZXJ5IHBsdWdpbiB0aGF0XG4vLyBpbnN0YWxscyB0aGlzIHBhY2thZ2Ugd291bGQgb3RoZXJ3aXNlIGNhcnJ5IGEgWUFNTCBkZXBlbmRlbmN5IGZvciBpdC5cbmZ1bmN0aW9uIHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihjb250ZW50OiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBGUk9OVE1BVFRFUl9SRUdfRVhQLmV4ZWMoY29udGVudCk/LlswXTtcbiAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCByZWFzb24gPSBXSUtJTElOS19BTExPV0FOQ0VfUkVHX0VYUC5leGVjKGZyb250bWF0dGVyKT8uZ3JvdXBzPy5bJ3JlYXNvbiddO1xuICByZXR1cm4gcmVhc29uID09PSB1bmRlZmluZWQgPyBudWxsIDogcmVhc29uLnRyaW0oKS5yZXBsYWNlKC9eKD88cXVvdGU+W1wiJ10pKD88dmFsdWU+W1xcc1xcU10qKVxcazxxdW90ZT4kLywgJyQ8dmFsdWU+Jyk7XG59XG5cbi8vIFJlYWRzIHRoZSBub3RlJ3MgaW5saW5lIGBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZeKApmAgZGlyZWN0aXZlcywgcmV0dXJuaW5nIHdoaWNoIGxpbmVzIHRoZXkgZXhlbXB0IGZyb21cbi8vIGVhY2ggcnVsZSBhbmQgZXZlcnl0aGluZyB3cm9uZyB3aXRoIHRoZW0uIEEgc3VwcHJlc3Npb24gdGhhdCBxdWlldGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vbmUsIHNvXG4vLyBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlLCBvbmUgd2l0aCBubyByZWFzb24sIGFuIHVuY2xvc2VkIHJlZ2lvbiBhbmQgb25lIGNvdmVyaW5nIG5vdGhpbmcgdGhhdCBicmVha3MgaXRzXG4vLyBydWxlIGFyZSBlYWNoIHJlcG9ydGVkIHJhdGhlciB0aGFuIGlnbm9yZWQuXG5mdW5jdGlvbiBzY2FuRGlyZWN0aXZlcyhjb250ZW50OiBzdHJpbmcpOiBEaXJlY3RpdmVTY2FuIHtcbiAgY29uc3Qgc3RhdGU6IERpcmVjdGl2ZVNjYW5TdGF0ZSA9IHtcbiAgICBhbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoKSxcbiAgICBvcGVuUmVnaW9uc0J5UnVsZTogbmV3IE1hcCgpLFxuICAgIHBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoKSxcbiAgICBwcm9ibGVtczogW10sXG4gICAgdGFyZ2V0TGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoW1xuICAgICAgW1RSWV9JVF9SVUxFLCBuZXcgU2V0KGZpbmRUcnlJdExpbmVJbmRleGVzV2l0aG91dENvZGVCdXR0b24oY29udGVudCkpXSxcbiAgICAgIFtXSUtJTElOS19SVUxFLCBuZXcgU2V0KGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpKV1cbiAgICBdKVxuICB9O1xuXG4gIGZvciAoY29uc3QgeyBpbmRleCwgbGluZSB9IG9mIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudCkpIHtcbiAgICBjb25zdCBtYXRjaCA9IERJUkVDVElWRV9SRUdfRVhQLmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBhcHBseURpcmVjdGl2ZShzdGF0ZSwgaW5kZXgsIG1hdGNoKTtcbiAgICB9IGVsc2UgaWYgKERJUkVDVElWRV9QUk9CRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgbWFsZm9ybWVkIGRpcmVjdGl2ZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoaW5kZXgpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBseURpcmVjdGl2ZVNjYW5MaW5lKHN0YXRlLCBpbmRleCwgbGluZSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBvcGVuUmVnaW9uIG9mIHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLnZhbHVlcygpKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihvcGVuUmVnaW9uLmxpbmVJbmRleCl9IHRoYXQgaXMgbmV2ZXIgZW5hYmxlZCBhZ2FpbmApO1xuICB9XG4gIGZvciAoY29uc3QgW3J1bGUsIHBlbmRpbmdOZXh0TGluZUluZGV4XSBvZiBzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleGVzQnlSdWxlKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlLW5leHQtbGluZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIocGVuZGluZ05leHRMaW5lSW5kZXgpfSBjb3ZlcmluZyBubyAke2Vuc3VyZU5vbk51bGxhYmxlKERJUkVDVElWRV9SVUxFX1RBUkdFVFMuZ2V0KHJ1bGUpKX1gKTtcbiAgfVxuICByZXR1cm4geyBhbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGU6IHN0YXRlLmFsbG93ZWRMaW5lSW5kZXhlc0J5UnVsZSwgcHJvYmxlbXM6IHN0YXRlLnByb2JsZW1zIH07XG59XG5cbmZ1bmN0aW9uIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShGUk9OVE1BVFRFUl9SRUdfRVhQLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwSW5saW5lQ29kZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKElOTElORV9DT0RFX1JFR19FWFAsICcnKTtcbn1cblxuLy8gQSBoYW5kLXdyaXR0ZW4gbGluayBtYXkgY29udGFpbiBhIGJhcmUgYCVgIChvciBhbnkgb3RoZXIgaW52YWxpZCBwZXJjZW50LWVzY2FwZSksIHdoaWNoIG1ha2VzXG4vLyBgZGVjb2RlVVJJQ29tcG9uZW50YCB0aHJvdy4gU3VjaCBhIHRhcmdldCBpcyBtZWFudCBsaXRlcmFsbHksIHNvIGl0IGlzIHVzZWQgYXMgd3JpdHRlbi5cbmZ1bmN0aW9uIHRyeURlY29kZVVyaUNvbXBvbmVudCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0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
705
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTdGF0aWMgY292ZXJhZ2UvZnJlc2huZXNzIGNoZWNrcyB0aGF0IGtlZXAgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AgaW4gc3luYyB3aXRoIGl0cyBwdWJsaWMgc3VyZmFjZS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIFRoZXNlIGhlbHBlcnMgcmVmbGVjdCB0aGUgcmVhbFxuICogcHVibGljIEFQSS9jb25maWcvZG9jcyBzdHJhaWdodCBmcm9tIHNvdXJjZSBhbmQgYXNzZXJ0IOKAlCBXSVRIT1VUIGxhdW5jaGluZyBPYnNpZGlhbiDigJQgdGhhdCBldmVyeSBmZWF0dXJlIGlzXG4gKiBkZW1vbnN0cmF0ZWQgaW4gdGhlIG5vdGVzIGFuZCB0aGF0IHRoZSBub3RlcyByZWZlcmVuY2Ugbm8gQVBJIG1lbWJlciB0aGF0IG5vIGxvbmdlciBleGlzdHMgKHJlbmFtZSBkcmlmdCkuXG4gKiBUaGUgcnVudGltZSBiZWhhdmlvciBvZiB0aGUgcGx1Z2luIGlzIGNvdmVyZWQgYnkgaXRzIG90aGVyIGludGVncmF0aW9uIHRlc3RzLCBub3QgYnkgdGhlIGRlbW8gdmF1bHQ7IHRoZVxuICogdmF1bHQgaXMgYSBsZWFybmluZyByZXNvdXJjZSwgYW5kIHRoZXNlIGNoZWNrcyBvbmx5IGd1YXJkIHRoYXQgaXQgc3RheXMgdHJ1dGhmdWwuXG4gKlxuICogVGhleSBhbHNvIGd1YXJkIHRoZSB2YXVsdCdzIG93biBgLm9ic2lkaWFuL2FwcC5qc29uYDogdGhlIHNldHRpbmdzIGxpc3RlZCBpblxuICoge0BsaW5rIERFTU9fVkFVTFRfQVBQX0pTT05fU0VUVElOR1N9IGJlbG9uZyB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYCwgd2hpY2ggd3JpdGVzIHRoZW0gaW50byB0aGUgYXJjaGl2ZWRcbiAqIHZhdWx0IGF0IHJlbGVhc2UgdGltZSwgc28gYSB2YXVsdCB0aGF0IGNvbW1pdHMgYW55IG9mIHRoZW0gaXMga2VlcGluZyBhIHNlY29uZCBjb3B5IG5vdGhpbmcgcmVjb25jaWxlcy5cbiAqXG4gKiBUaGV5IGFsc28gZW5mb3JjZSB0aGUgZGVtby12YXVsdCBBVVRIT1JJTkcgY29udmVudGlvbiDigJQgZXZlcnkgbm90ZSBvcGVucyB3aXRoIGFuIGAjIEgxYCBhbmQgYSBwbGFpblxuICogcHJvc2UgcGFyYWdyYXBoLCBldmVyeSBub3RlIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBzdGFydCBub3RlLCBhbmQgbm8gbm90ZSB1c2VzIGEgYFtbd2lraWxpbmtdXWAgb3IgYVxuICogYFtEb2NzXSjigKYpYCBsaW5lLiBUaGVzZSBjaGVja3MgYXJlIHVuY29uZGl0aW9uYWw6IHRoZSBkZW1vIHZhdWx0IGlzIHRoZSBwdWJsaXNoZWQgZG9jdW1lbnRhdGlvbiwgcmVhZFxuICogaW4gT2JzaWRpYW4gQU5EIG9uIEdpdEh1YiAod2hlcmUgYSB3aWtpbGluayBkb2VzIG5vdCByZW5kZXIpLCBzbyBhIG5vdGUgdGhhdCBicmVha3MgdGhlIGNvbnZlbnRpb24gaXNcbiAqIGJyb2tlbiBmb3IgcmVhbCByZWFkZXJzLiBgYXV0aG9yaW5nYCBvbmx5IHR1bmVzIHRoZW0gKHdoaWNoIG5vdGUgaXMgdGhlIHN0YXJ0LCB3aGljaCBub3RlcyBzaXQgb3V0c2lkZVxuICogdGhlIGxlYXJuaW5nIHBhdGgpOyBpdCBjYW5ub3Qgc3dpdGNoIHRoZW0gb2ZmLlxuICpcbiAqIE9ubHkgYHJvb3RGb2xkZXJgIGlzIHJlcXVpcmVkLCBzbyBhIHBsdWdpbiB3aXRoIG5vIHNldHRpbmdzIGFuZCBubyBwdWJsaWMgQVBJIHRvIHJlZmxlY3QgcmVnaXN0ZXJzIHRoZVxuICogc3VpdGUgd2l0aCB0aGF0IGFsb25lIGFuZCBzdGlsbCBnZXRzIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayDigJQgdGhlIGNoZWNrcyBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGF0IHRoZVxuICogcGx1Z2luIGV4cG9zZXMuIEVhY2ggcmVmbGVjdGlvbiBzcGVjIChgY29uZmlnSW50ZXJmYWNlc2AsIGBpbnRlcmZhY2VzYCwgYG5vblRyaXZpYWxHdWFyZGApIGFkZHMgdGhlIGNoZWNrc1xuICogaXQgZGVzY3JpYmVzIHdoZW4gc3VwcGxpZWQuIFRoZSB2YXVsdCBpcyBndWFyZGVkIGFnYWluc3QgYmVpbmcgZW1wdHkgZWl0aGVyIHdheTogd2l0aCBubyBub3RlcyB0byByZWFkLFxuICogZXZlcnkgYXV0aG9yaW5nIGNoZWNrIHdvdWxkIHBhc3MgYnkgaGF2aW5nIG5vdGhpbmcgdG8gbG9vayBhdC5cbiAqXG4gKiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIG5vdGUgd2hvc2UgU1VCSkVDVCBpcyB0aGUgd2lraWxpbmsg4oCUIGFuIGVtYmVkIHNwZWxsaW5nIHRoZSByZWFkZXIgaXMgYmVpbmcgdGF1Z2h0XG4gKiB0byB0eXBlLCBhIGZyb250bWF0dGVyIHByb3BlcnR5IHZhbHVlIHRoYXQgZXhpc3RzIHRvIGNvbnRyYXN0IHdpdGggYSBNYXJrZG93biBsaW5rLCBhIGZpeHR1cmUgdGhhdCBtdXN0XG4gKiBrZWVwIHRoZSB3aWtpbGluayBhIGNvbW1hbmQgaXMgc3VwcG9zZWQgdG8gbGVhdmUgYWxvbmUsIGEgbGluayB0aGUgcmVhZGVyIGNsaWNrcyB3aGlsZSBpdCBzdGlsbCByZXNvbHZlc1xuICogdG8gbm90aGluZy4gU3VjaCBhIG5vdGUgc2F5cyBzbyBpdHNlbGYsIHN0YXRpbmcgd2h5LCBpbiBvbmUgb2YgdHdvIGZvcm1zIG1vZGVsbGVkIG9uIEVTTGludCdzLlxuICpcbiAqIFBlciBsaW5lIG9yIHBlciByZWdpb24sIHdyaXR0ZW4gYXMgYW4gSFRNTCBjb21tZW50IHNvIGl0IGlzIGludmlzaWJsZSBpbiBPYnNpZGlhbiBBTkQgb24gR2l0SHViIOKAlCB0aGVcbiAqIHNwZWxsaW5nIHRoZXNlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWA6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUtbmV4dC1saW5lIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0gQ2xpY2tpbmcgYSBsaW5rIHRvIGEgbm90ZSB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCBJUyB0aGUgZmVhdHVyZS4gLS0+XG4gKiAyLiBDbGljayB0aGlzIGxpbms6IFtbUHJvamVjdHMvRnJlc2ggaWRlYV1dLlxuICpcbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLSBUaGUgd2lraWxpbmsgZW1iZWQgaXMgdGhlIHN5bnRheCB0aGlzIG5vdGUgdGVhY2hlcy4gLS0+XG4gKiAhW1tiYXNpYy5odG1sfDQwMF1dXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1lbmFibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLT5cbiAqIGBgYFxuICpcbiAqIFBlciBub3RlLCBpbiB0aGUgbm90ZSdzIG93biBmcm9udG1hdHRlciDigJQgdGhlIG9ubHkgZm9ybSB0aGF0IGNhbiByZWFjaCBhIHdpa2lsaW5rIElOU0lERSBmcm9udG1hdHRlcixcbiAqIHdoZXJlIGEgY29tbWVudCBjYW5ub3QgZ286XG4gKlxuICogYGBgeWFtbFxuICogLS0tXG4gKiBvYnNpZGlhbi1kZXYtdXRpbHM6XG4gKiAgIGRlbW8tdmF1bHQtdmFsaWRhdGlvbjpcbiAqICAgICBhbGxvdy13aWtpbGlua3M6IFRoZSBgd2lraWxpbmtgIHByb3BlcnR5IHZhbHVlIGlzIHRoZSBjb250cmFzdCB0aGlzIG5vdGUgaXMgYnVpbHQgYXJvdW5kLlxuICogLS0tXG4gKiBgYGBcbiAqXG4gKiBFaXRoZXIgd2F5IHRoZSBkZWNsYXJhdGlvbiB0cmF2ZWxzIHdpdGggdGhlIG5vdGUgcmF0aGVyIHRoYW4gc2l0dGluZyBpbiBhIGxpc3Qgc29tZXdoZXJlIGVsc2UsIGl0IGNhcnJpZXNcbiAqIGl0cyBqdXN0aWZpY2F0aW9uLCBhbmQgaXQgZXhlbXB0cyBvbmx5IHRoZSBXSUtJTElOSyBjaGVjayDigJQgdGhlIEgxLCBwcm9zZSwgcmVhY2hhYmlsaXR5IGFuZCBgW0RvY3NdYFxuICogY2hlY2tzIHN0aWxsIGFwcGx5LiBBIGRlY2xhcmF0aW9uIHdpdGggbm8gcmVhc29uLCBvbmUgY292ZXJpbmcgbm8gd2lraWxpbmssIGEgcmVnaW9uIG5ldmVyIGVuYWJsZWQgYWdhaW4sXG4gKiBvciBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlIGFsbCBmYWlsOiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCB0aGF0IG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIG9yIHRoYXRcbiAqIHNpbGVudGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vIGV4ZW1wdGlvbiBhdCBhbGwuXG4gKlxuICogVGhleSBhbHNvIGNoZWNrIHRoYXQgZXZlcnkgYFRyeSBpdGAgc2VjdGlvbiDigJQgYSBoZWFkaW5nIG9mIGFueSBsZXZlbCBzdGFydGluZyBgVHJ5IGl0YCwgdXAgdG8gdGhlIG5leHRcbiAqIGhlYWRpbmcgb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwg4oCUIGhvbGRzIGEgYGNvZGUtYnV0dG9uYCB0aGF0IHBlcmZvcm1zIGl0cyBzZXR1cCwgYmVjYXVzZSBhIHJlYWRlclxuICogYXNrZWQgdG8gY29uZmlndXJlIHRoaW5ncyBieSBoYW5kIGlzIGEgcmVhZGVyIHRoZSBkZW1vIGxvc3QuIEEgc2VjdGlvbiB3aG9zZSBzdGVwcyByZWFsbHkgY2Fubm90IGJlXG4gKiBzY3JpcHRlZCBzYXlzIHNvIHdpdGggdGhlIHNhbWUgZGlyZWN0aXZlLCBuYW1pbmcgdGhlIGBkZW1vLXZhdWx0LXZhbGlkYXRpb24vdHJ5LWl0LWNvZGUtYnV0dG9uYCBydWxlIG9uXG4gKiB0aGUgaGVhZGluZywgYW5kIHdpdGggdGhlIHNhbWUgY2hlY2tzIG9uIHRoZSBkaXJlY3RpdmUgaXRzZWxmOlxuICpcbiAqIGBgYG1hcmtkb3duXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlLW5leHQtbGluZSBkZW1vLXZhdWx0LXZhbGlkYXRpb24vdHJ5LWl0LWNvZGUtYnV0dG9uIC0tIERyYWdnaW5nIGEgZmlsZSBpbiBmcm9tIG91dHNpZGUgT2JzaWRpYW4gY2Fubm90IGJlIHNjcmlwdGVkLiAtLT5cbiAqICMjIFRyeSBpdFxuICogYGBgXG4gKlxuICogVGhhdCBjaGVjayBmYWlscyB0aGUgc3VpdGUgYnkgZGVmYXVsdDsge0BsaW5rIERlbW9WYXVsdEF1dGhvcmluZ1NwZWMudHJ5SXRDb2RlQnV0dG9uc30gc2V0IHRvIGAnd2FybidgXG4gKiBwcmludHMgdGhlIHNlY3Rpb25zIGluc3RlYWQsIGZvciBhIHZhdWx0IHN0aWxsIGJlaW5nIGJyb3VnaHQgdXAgdG8gaXQuXG4gKlxuICogVHdvIGxheWVycyBhcmUgZXhwb3NlZDpcbiAqIC0ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0g4oCUIGEgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgdGhhdCByZWFkcyB0aGUgY29ycHVzLCBwYXJzZXMgaW50ZXJmYWNlIC9cbiAqICAgY2xhc3MgLyBlbnVtIG1lbWJlcnMgYW5kIGV4cG9ydGVkIGZ1bmN0aW9ucywgYW5kIHJldHVybnMgZGlhZ25vc3RpYyBhcnJheXMgKHdoYXQgaXMgdW5kZW1vbnN0cmF0ZWQgLyBzdGFsZVxuICogICAvIHVubGlua2VkIC8gb2ZmLWNvbnZlbnRpb24pLlxuICogLSB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfSDigJQgYSB0aGluIHdyYXBwZXIgdGhhdCByZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSBvdmVyIHRoZSBjb3JlLCBzb1xuICogICBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCBpcyBhIHNpbmdsZSBkZWNsYXJhdGl2ZSBjYWxsLlxuICovXG5cbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBkZXNjcmliZSxcbiAgZXhwZWN0LFxuICBpdFxufSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQge1xuICBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MsXG4gIHBhcnNlRGVtb1ZhdWx0QXBwSnNvblxufSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcblxuLyoqXG4gKiBUdW5lcyB0aGUgYWx3YXlzLW9uIGF1dGhvcmluZyBjaGVja3MuIEl0IGNhbm5vdCBkaXNhYmxlIHRoZW0g4oCUIHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRBdXRob3JpbmdTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlcyAocGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoYXQgc2l0IG91dHNpZGUgdGhlIGxlYXJuaW5nIHBhdGggYW5kIGFyZSB0aGVyZWZvcmVcbiAgICogZXhlbXB0IGZyb20gZXZlcnkgYXV0aG9yaW5nIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgdmF1bHQncyBvd24gYFJFQURNRS5tZGAsIHdoaWNoIGFkZHJlc3NlcyBzb21lb25lXG4gICAqIGJyb3dzaW5nIHRoZSByZXBvIG9uIEdpdEh1YiByYXRoZXIgdGhhbiBhIHJlYWRlciB3b3JraW5nIHRocm91Z2ggdGhlIHZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgZXZlcnkgb3RoZXIgbm90ZSBtdXN0IGJlIHJlYWNoYWJsZSBmcm9tLiBEZWZhdWx0cyB0b1xuICAgKiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnROb3RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgYSBgVHJ5IGl0YCBzZWN0aW9uIHdpdGggbm8gYGNvZGUtYnV0dG9uYCBhbmQgbm8gZGlyZWN0aXZlIGV4cGxhaW5pbmcgd2h5IGlzIHJlcG9ydGVkOiBgJ3dhcm4nYFxuICAgKiBwcmludHMgdGhlIHNlY3Rpb25zIGFuZCBwYXNzZXMsIGAnZXJyb3InYCBmYWlscyB0aGUgc3VpdGUuIERlZmF1bHRzIHRvIGAnZXJyb3InYC5cbiAgICovXG4gIHJlYWRvbmx5IHRyeUl0Q29kZUJ1dHRvbnM/OiBEZW1vVmF1bHRDaGVja1NldmVyaXR5O1xufVxuXG4vKipcbiAqIEhvdyBhIGNoZWNrIHRoYXQgaXMgYmVpbmcgaW50cm9kdWNlZCBncmFkdWFsbHkgcmVwb3J0cyB3aGF0IGl0IGZpbmRzOiBgJ3dhcm4nYCBwcmludHMgaXQgYW5kIHBhc3NlcyxcbiAqIGAnZXJyb3InYCBmYWlscy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVtb1ZhdWx0Q2hlY2tTZXZlcml0eSA9ICdlcnJvcicgfCAnd2Fybic7XG5cbi8qKlxuICogUmVmbGVjdHMgYSBjb25maWcgaW50ZXJmYWNlIHdob3NlIG9wdGlvbnMgYXJlIGRlbW9uc3RyYXRlZCBieSB0aGVpciBiYXJlIG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q29uZmlnSW50ZXJmYWNlQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHdob3NlIHByb3BlcnRpZXMgYXJlIHRoZSBjb25maWdcbiAgICogb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZXMgKHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSBleGVtcHQgZnJvbSB0aGUgYXV0aG9yaW5nIGNoZWNrcy4gRGVmYXVsdHMgdG8gdGhlXG4gICAqIHZhdWx0J3Mgb3duIGBSRUFETUUubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGx1Z2luIHJlcG8gcm9vdCDigJQgdGhlIGZvbGRlciBjb250YWluaW5nIGBkZW1vLXZhdWx0L2AgYW5kIHRoZSBzb3VyY2UgYmVpbmdcbiAgICogcmVmbGVjdGVkLiBDYWxsZXJzIHR5cGljYWxseSBwYXNzIGBnZXRSb290Rm9sZGVyKCkgPz8gcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFN0YWxlUmVmZXJlbmNlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFN0YWxlUmVmZXJlbmNlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVjZWl2ZXIgd2hvc2UgYGAgYCR7cmVjZWl2ZXJ9LjxtZW1iZXI+YCBgYCByZWZlcmVuY2VzIGFyZSBzY2FubmVkIGZvciBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVtYmVycyB0aGF0IGN1cnJlbnRseSBleGlzdCBvbiB0aGUgcmVjZWl2ZXI7IGFueSByZWZlcmVuY2VkIG1lbWJlciBub3QgaW4gdGhpcyBzZXQgaXMgc3RhbGUuXG4gICAqL1xuICByZWFkb25seSB2YWxpZE1lbWJlcnM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG1lbWJlciBuYW1lcyB0aGF0IG11c3QgZWFjaCBhcHBlYXIgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVtYmVyczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBhIG1lbWJlciBpcyBkZW1vbnN0cmF0ZWQgb25seSBpZiBgYCBgJHtyZWNlaXZlcn0uJHttZW1iZXJ9YCBgYCBhcHBlYXJzIChlLmcuIGEgY29udGV4dCBvYmplY3Qnc1xuICAgKiBtZXRob2RzKTsgd2hlbiBhYnNlbnQsIHRoZSBiYXJlIG1lbWJlciBuYW1lIGlzIGxvb2tlZCB1cCAoZS5nLiBhIGNvbmZpZyBvcHRpb24pLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVubGlua2VkRmVhdHVyZURvY3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkb2NzIGZvbGRlciAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgdG9wLWxldmVsIGAqLm1kYCBmaWxlcyBhcmUgdGhlIGZlYXR1cmUgZG9jcy5cbiAgICovXG4gIHJlYWRvbmx5IGRvY3NGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIHRoYXQgYXJlIE5PVCBwZXItZmVhdHVyZSBwYWdlcyBhbmQgc28gbmVlZCBubyBsaW5raW5nIGRlbW8gbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vbkZlYXR1cmVEb2NzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kVW5yZWFjaGFibGVOb3Rlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5vdGUgKHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoZSB3YWxrIHN0YXJ0cyBmcm9tLCBlLmcuIGAwMCBTdGFydC5tZGAuXG4gICAqL1xuICByZWFkb25seSBzdGFydE5vdGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5nZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIGFyZSBwYXJzZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0SW50ZXJmYWNlTWVtYmVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB0byBwYXJzZS5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyB0aGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHREb2NzQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBkb2NzIGZvbGRlciAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgdG9wLWxldmVsIGAqLm1kYCBmaWxlcyBhcmUgdGhlIGZlYXR1cmUgZG9jcy5cbiAgICovXG4gIHJlYWRvbmx5IGZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgdGhhdCBhcmUgTk9UIHBlci1mZWF0dXJlIHBhZ2VzIGFuZCBzbyBuZWVkIG5vIGxpbmtpbmcgZGVtbyBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uRmVhdHVyZURvY3M6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgbW9kdWxlJ3MgZXhwb3J0ZWQgZnVuY3Rpb25zLCBlYWNoIGRlbW9uc3RyYXRlZCBieSBpdHMgYmFyZSBuYW1lIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgc2luZ2xlIGludGVyZmFjZSdzIG1lbWJlcnMgYW5kIGRlbW9uc3RyYXRlcyB0aGVtIHZpYSBgYCBgJHtyZWNlaXZlcn0uPG1lbWJlcj5gIGBgIHJlZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0SW50ZXJmYWNlQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHRvIHJlZmxlY3QuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRlbW9uc3RyYXRlZCBtZW1iZXJzIGFyZSB0aGUgcmVmbGVjdGVkIHR5cGUncyBtZXRob2RzIG9yIGl0cyBwcm9wZXJ0aWVzIChlbnVtIG1lbWJlcnMgY291bnQgYXNcbiAgICogcHJvcGVydGllcykuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBEZW1vVmF1bHRJbnRlcmZhY2VNZW1iZXJLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciB0aGUgbm90ZXMgY2FsbCB0aGUgbWVtYmVycyBvbiAoZS5nLiBgY29kZUJ1dHRvbkNvbnRleHRgKS5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gaW50ZXJmYWNlJ3MgZGVtb25zdHJhdGVkIG1lbWJlcnMgYXJlIGl0cyBtZXRob2RzIG9yIGl0cyBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgdHlwZSBEZW1vVmF1bHRJbnRlcmZhY2VNZW1iZXJLaW5kID0gJ21ldGhvZHMnIHwgJ3Byb3BlcnRpZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGd1YXJkIHRoYXQgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIGlzIG5vbi10cml2aWFsIChwcm90ZWN0cyBhZ2FpbnN0IGEgcGFyc2luZyByZWdyZXNzaW9uXG4gKiBzaWxlbnRseSBlbXB0eWluZyBldmVyeSBvdGhlciBjaGVjaykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYyB7XG4gIC8qKlxuICAgKiBBIGRlbW8gbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgdGhhdCBtdXN0IGJlIHByZXNlbnQuXG4gICAqL1xuICByZWFkb25seSBleHBlY3REZW1vTm90ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIG1lbWJlciB0aGF0IG11c3QgYmUgcmVmbGVjdGVkIGZyb20ge0BsaW5rIERlbW9WYXVsdE5vblRyaXZpYWxHdWFyZFNwZWMuaW50ZXJmYWNlTmFtZX0uXG4gICAqL1xuICByZWFkb25seSBleHBlY3RNZW1iZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgd2hvc2UgbWVtYmVycyBhcmUgcmUtcGFyc2VkIGZvciB0aGVcbiAgICogZ3VhcmQuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGRlbW8gbm90ZSwgYXMgcmVhZCBmcm9tIHRoZSBkZW1vIHZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdE5vdGUge1xuICAvKipcbiAgICogVGhlIG5vdGUncyByYXcgTWFya2Rvd24gY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGUncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IGZvbGRlciwgZS5nLiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBhIG5vdGUncyBpbmxpbmUgYG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxl4oCmYCBkaXJlY3RpdmVzIGFsbG93LCBydWxlIGJ5IHJ1bGUsIGFuZCB3aGF0IGlzIHdyb25nIHdpdGhcbiAqIHRoZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0aXZlU2NhbiB7XG4gIC8qKlxuICAgKiBGb3IgZWFjaCBydWxlLCB0aGUgemVyby1iYXNlZCBsaW5lIG51bWJlcnMgYSBkaXJlY3RpdmUgZXhlbXB0cyBmcm9tIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZExpbmVJbmRleGVzQnlSdWxlOiBSZWFkb25seU1hcDxzdHJpbmcsIFJlYWRvbmx5U2V0PG51bWJlcj4+O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aXZlIG1pc3Rha2VzIGZvdW5kLCBlYWNoIHBocmFzZWQgZm9yIGEgZmFpbGluZyBhc3NlcnRpb24uXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHJ1bm5pbmcgc3RhdGUgb2YgYSBkaXJlY3RpdmUgc2NhbiwgdGhyZWFkZWQgdGhyb3VnaCB0aGUgcGVyLWxpbmUgaGVscGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVTY2FuU3RhdGUge1xuICAvKipcbiAgICogRm9yIGVhY2ggcnVsZSwgdGhlIGxpbmVzIGEgZGlyZWN0aXZlIGhhcyBleGVtcHRlZCBmcm9tIGl0IHNvIGZhci5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRMaW5lSW5kZXhlc0J5UnVsZTogTWFwPHN0cmluZywgU2V0PG51bWJlcj4+O1xuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCBydWxlLCB0aGUgcmVnaW9uIGN1cnJlbnRseSBvcGVuLCBhbmQgd2hldGhlciBpdCBoYXMgY292ZXJlZCBhIHRhcmdldCB5ZXQuXG4gICAqL1xuICByZWFkb25seSBvcGVuUmVnaW9uc0J5UnVsZTogTWFwPHN0cmluZywgT3BlbkRpcmVjdGl2ZVJlZ2lvbj47XG5cbiAgLyoqXG4gICAqIEZvciBlYWNoIHJ1bGUsIHRoZSBsaW5lIGEgYGRpc2FibGUtbmV4dC1saW5lYCB3YXMgcmVhZCBvbiwgd2hpbGUgaXQgc3RpbGwgd2FpdHMgZm9yIHRoZSBsaW5lIGl0IGNvdmVycy5cbiAgICovXG4gIHJlYWRvbmx5IHBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGU6IE1hcDxzdHJpbmcsIG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUgbWlzdGFrZXMgZm91bmQgc28gZmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCBydWxlLCB0aGUgbGluZXMgb2YgdGhlIG5vdGUgdGhhdCBicmVhayBpdCDigJQgdGhlIGxpbmVzIGEgZGlyZWN0aXZlIGZvciBpdCBoYXMgdG8gY292ZXIgdG8gYmVcbiAgICogZG9pbmcgYW55IHdvcmsuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRMaW5lSW5kZXhlc0J5UnVsZTogUmVhZG9ubHlNYXA8c3RyaW5nLCBSZWFkb25seVNldDxudW1iZXI+Pjtcbn1cblxuLyoqXG4gKiBUaGUgcGFyc2VkIG1lbWJlcnMgb2YgYSBzb3VyY2UgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgLyoqXG4gICAqIEV2ZXJ5IG1lbWJlciDigJQge0BsaW5rIEludGVyZmFjZU1lbWJlcnMubWV0aG9kc30gZm9sbG93ZWQgYnkge0BsaW5rIEludGVyZmFjZU1lbWJlcnMucHJvcGVydGllc30uXG4gICAqL1xuICByZWFkb25seSBhbGw6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIG1lbWJlcnMgKGRlY2xhcmVkIGFzIGBuYW1lKC4uLilgKS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbWVtYmVycyAoZGVjbGFyZWQgYXMgYG5hbWU/OiAuLi5gKS5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnRpZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgbm90ZSBsaW5lIHBhaXJlZCB3aXRoIHRoZSBsaW5lIG51bWJlciBpdCBjYW1lIGZyb20sIHNvIGEgY2hlY2sgdGhhdCBza2lwcyBmZW5jZWQgYmxvY2tzIGNhbiBzdGlsbFxuICogcmVwb3J0IOKAlCBhbmQgYW4gaW5saW5lIGRpcmVjdGl2ZSBjYW4gc3RpbGwgbmFtZSDigJQgdGhlIGxpbmUgYXMgdGhlIHJlYWRlciBzZWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGVMaW5lIHtcbiAgLyoqXG4gICAqIFRoZSB6ZXJvLWJhc2VkIGxpbmUgbnVtYmVyIHdpdGhpbiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lJ3MgcmF3IHRleHQuXG4gICAqL1xuICByZWFkb25seSBsaW5lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBgZGlzYWJsZWAgcmVnaW9uIHRoYXQgaGFzIGJlZW4gb3BlbmVkIGFuZCBub3QgeWV0IGVuYWJsZWQgYWdhaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkRpcmVjdGl2ZVJlZ2lvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSByZWdpb24gaGFzIGNvdmVyZWQgYSBsaW5lIGJyZWFraW5nIGl0cyBydWxlLCB3aGljaCBpcyB3aGF0IHN0b3BzIGl0IGJlaW5nIHJlcG9ydGVkIGFzXG4gICAqIHBvaW50bGVzcy5cbiAgICovXG4gIGlzVXNlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgdGhlIHJlZ2lvbiB3YXMgb3BlbmVkIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZUluZGV4OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBgZGlzYWJsZWAgcmVnaW9uIHRoYXQgaGFzIGJlZW4gb3BlbmVkIGFuZCBub3QgeWV0IGVuYWJsZWQgYWdhaW4uXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBPcGVuRGlyZWN0aXZlUmVnaW9ufTogdGhlIGRpcmVjdGl2ZXMgbm93IHNlcnZlIG1vcmUgdGhhbiB0aGUgd2lraWxpbmsgcnVsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuV2lraWxpbmtEaXJlY3RpdmVSZWdpb24ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVnaW9uIGhhcyBjb3ZlcmVkIGEgd2lraWxpbmssIHdoaWNoIGlzIHdoYXQgc3RvcHMgaXQgYmVpbmcgcmVwb3J0ZWQgYXMgcG9pbnRsZXNzLlxuICAgKi9cbiAgaXNVc2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSB0aGUgcmVnaW9uIHdhcyBvcGVuZWQgb24uXG4gICAqL1xuICByZWFkb25seSBsaW5lSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFR1bmVzIHRoZSBhbHdheXMtb24gYXV0aG9yaW5nIGNoZWNrcywgb3IgYHVuZGVmaW5lZGAgdG8gdGFrZSB0aGVpciBkZWZhdWx0cy4gSXQgY2Fubm90IGRpc2FibGUgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcmluZz86IERlbW9WYXVsdEF1dGhvcmluZ1NwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWcgaW50ZXJmYWNlcyB3aG9zZSBvcHRpb25zIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICAgKiBwbHVnaW4gaGFzIG5vIHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnSW50ZXJmYWNlcz86IERlbW9WYXVsdENvbmZpZ0ludGVyZmFjZUNvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjaywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGx1Z2luIHNoaXBzIG5vIGBkb2NzL2AgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jcz86IERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2R1bGVzIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAgICogcGx1Z2luIGV4cG9zZXMgbm8gc3VjaCBtb2R1bGUgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk1vZHVsZXM/OiBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGludGVyZmFjZXMgd2hvc2UgbWVtYmVycyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIChhbmQgcmVmZXJlbmNlZCB3aXRob3V0IGRyaWZ0KSwgb3IgYHVuZGVmaW5lZGAgd2hlblxuICAgKiB0aGUgcGx1Z2luIGV4cG9zZXMgbm8gcHVibGljIEFQSSBzdXJmYWNlIHRvIHJlZmxlY3QuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VzPzogRGVtb1ZhdWx0SW50ZXJmYWNlQ292ZXJhZ2VTcGVjW107XG5cbiAgLyoqXG4gICAqIFRoZSBndWFyZCB0aGF0IGtlZXBzIHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBub24tdHJpdmlhbCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBubyByZWZsZWN0ZWQgc3VyZmFjZVxuICAgKiB0byBndWFyZC4gVGhlIHZhdWx0IGlzIGNoZWNrZWQgZm9yIGJlaW5nIG5vbi1lbXB0eSBlaXRoZXIgd2F5LlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uVHJpdmlhbEd1YXJkPzogRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYztcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHBsdWdpbiByZXBvIHJvb3QuIENhbGxlcnMgdHlwaWNhbGx5IHBhc3MgYGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGEgbm90ZSdzIGlubGluZSBgb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGXigKZgIGRpcmVjdGl2ZXMgYWxsb3csIGFuZCB3aGF0IGlzIHdyb25nIHdpdGggdGhlbS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIERpcmVjdGl2ZVNjYW59OiB0aGUgZGlyZWN0aXZlcyBub3cgc2VydmUgbW9yZSB0aGFuIHRoZSB3aWtpbGluayBydWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpa2lsaW5rRGlyZWN0aXZlU2NhbiB7XG4gIC8qKlxuICAgKiBUaGUgemVyby1iYXNlZCBsaW5lIG51bWJlcnMgYSBkaXJlY3RpdmUgYWxsb3dzIGEgd2lraWxpbmsgb24uXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXM6IFJlYWRvbmx5U2V0PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUgbWlzdGFrZXMgZm91bmQsIGVhY2ggcGhyYXNlZCBmb3IgYSBmYWlsaW5nIGFzc2VydGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcnVubmluZyBzdGF0ZSBvZiBhIGRpcmVjdGl2ZSBzY2FuLCB0aHJlYWRlZCB0aHJvdWdoIHRoZSBwZXItbGluZSBoZWxwZXJzLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgRGlyZWN0aXZlU2NhblN0YXRlfTogdGhlIGRpcmVjdGl2ZXMgbm93IHNlcnZlIG1vcmUgdGhhbiB0aGUgd2lraWxpbmsgcnVsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgbGluZXMgYSBkaXJlY3RpdmUgaGFzIGFsbG93ZWQgYSB3aWtpbGluayBvbiBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXM6IFNldDxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIGN1cnJlbnRseSBvcGVuLCBhbmQgd2hldGhlciBpdCBoYXMgY292ZXJlZCBhIHdpa2lsaW5rIHlldC5cbiAgICovXG4gIG9wZW5SZWdpb246IG51bGwgfCBPcGVuRGlyZWN0aXZlUmVnaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBhIGBkaXNhYmxlLW5leHQtbGluZWAgd2FzIHJlYWQgb24sIHdoaWxlIGl0IHN0aWxsIHdhaXRzIGZvciB0aGUgbGluZSBpdCBjb3ZlcnMuXG4gICAqL1xuICBwZW5kaW5nTmV4dExpbmVJbmRleDogbnVsbCB8IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGl2ZSBtaXN0YWtlcyBmb3VuZCBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lcyBvZiB0aGUgbm90ZSB0aGF0IGNhcnJ5IGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSB3aWtpbGlua0xpbmVJbmRleGVzOiBSZWFkb25seVNldDxudW1iZXI+O1xufVxuXG4vKipcbiAqIEEgYFRyeSBpdGAgc2VjdGlvbiBiZWluZyByZWFkLCBmcm9tIGl0cyBoZWFkaW5nIHRvIHRoZSBuZXh0IGhlYWRpbmcgb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwuXG4gKi9cbmludGVyZmFjZSBUcnlJdFNlY3Rpb24ge1xuICBoYXNDb2RlQnV0dG9uOiBib29sZWFuO1xuICByZWFkb25seSBsZXZlbDogbnVtYmVyO1xuICByZWFkb25seSBsaW5lSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIHBsdWdpbidzIHB1YmxpYyBzdXJmYWNlIGZyb20gc291cmNlIGFuZCBjaGVja3MgaXRzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCBzdGF5cyBpbiBzeW5jIHdpdGggaXQuXG4gKlxuICogRXZlcnkgbWV0aG9kIGlzIGEgcHVyZSBxdWVyeSBvdmVyIGZpbGVzIHVuZGVyIHRoZSByZXBvIHJvb3QgKHRoZSBkZW1vIGNvcnB1cyBpcyByZWFkIG9uY2UgYW5kIGNhY2hlZCksIHNvXG4gKiB0aGUgY2hlY2tlciBpcyB0cml2aWFsbHkgdW5pdC10ZXN0YWJsZSBhZ2FpbnN0IGEgZml4dHVyZSByZXBvIGFuZCBjYXJyaWVzIG5vIHRlc3QtZnJhbWV3b3JrIGRlcGVuZGVuY3kuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIge1xuICBwcml2YXRlIGNhY2hlZENvcnB1czogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgY2FjaGVkTm90ZXM6IERlbW9WYXVsdE5vdGVbXSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbW9WYXVsdEZvbGRlcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4Y2x1ZGVkTm90ZXM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNoZWNrZXIgcm9vdGVkIGF0IGEgcGx1Z2luIHJlcG8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLnJvb3RGb2xkZXIgPSBwYXJhbXMucm9vdEZvbGRlcjtcbiAgICB0aGlzLmRlbW9WYXVsdEZvbGRlciA9IGpvaW4odGhpcy5yb290Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQpO1xuICAgIHRoaXMuZXhjbHVkZWROb3RlcyA9IG5ldyBTZXQocGFyYW1zLmV4Y2x1ZGVkTm90ZXMgPz8gREVGQVVMVF9FWENMVURFRF9OT1RFUyk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgdGhlIGRlbW8gbm90ZXMgYXMgcGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgZm9sZGVyIChmb3IgYSBub24tdHJpdmlhbC1zdXJmYWNlIGd1YXJkKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIGV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0LlxuICAgKi9cbiAgcHVibGljIGNvbGxlY3REZW1vTm90ZVJlbGF0aXZlUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3ROb3RlcygpLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuZCBjYWNoZXMgZXZlcnkgZGVtbyBub3RlIGluZGl2aWR1YWxseSDigJQgdGhlIHBlci1ub3RlIHZpZXcgdGhlIGF1dGhvcmluZyBjaGVja3Mgd29yayBvbiwgYXNcbiAgICogb3Bwb3NlZCB0byB0aGUgY29uY2F0ZW5hdGVkIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIucmVhZENvcnB1c30uXG4gICAqXG4gICAqIEByZXR1cm5zIEV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0LCBleGNsdWRlZCBvbmVzIGluY2x1ZGVkLlxuICAgKi9cbiAgcHVibGljIGNvbGxlY3ROb3RlcygpOiBEZW1vVmF1bHROb3RlW10ge1xuICAgIHRoaXMuY2FjaGVkTm90ZXMgPz89IHRoaXMuY29sbGVjdE1hcmtkb3duRmlsZXModGhpcy5kZW1vVmF1bHRGb2xkZXIpLm1hcCgoZmlsZSkgPT4gKHtcbiAgICAgIGNvbnRlbnQ6IHJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKSxcbiAgICAgIHJlbGF0aXZlUGF0aDogcmVsYXRpdmUodGhpcy5kZW1vVmF1bHRGb2xkZXIsIGZpbGUpXG4gICAgfSkpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZE5vdGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBgLm9ic2lkaWFuL2FwcC5qc29uYCBzZXR0aW5ncyB0aGUgdmF1bHQgY29tbWl0cyB0aGF0IGBvYnNpZGlhbi1kZXYtdXRpbHNgIG93bnMgYW5kIHdyaXRlc1xuICAgKiBpbnRvIHRoZSBhcmNoaXZlZCB2YXVsdCBpdHNlbGYuIEEgY29tbWl0dGVkIG9uZSBpcyBhIHNlY29uZCBjb3B5IG9mIGEgc2V0dGluZyBub3RoaW5nIHJlY29uY2lsZXMsIGFuZFxuICAgKiBpdCBpcyB0aGUgY29weSB0aGF0IGdvZXMgc3RhbGUg4oCUIHNvIHRoZSBjb252ZW50aW9uIGlzIHRoYXQgdGhlIHZhdWx0IGNvbW1pdHMgbm9uZSBvZiB0aGVtLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmFtZXMgb2YgdGhlIG93bmVkIHNldHRpbmdzIHRoZSBjb21taXR0ZWQgYGFwcC5qc29uYCBzZXRzLiBBIHZhdWx0IHRoYXQgY29tbWl0cyBub1xuICAgKiBgYXBwLmpzb25gIGF0IGFsbCBpcyBmaW5lLCBhbmQgeWllbGRzIG5vbmUuXG4gICAqL1xuICBwdWJsaWMgZmluZENvbW1pdHRlZEFwcEpzb25TZXR0aW5ncygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYXBwSnNvblBhdGggPSBqb2luKHRoaXMuZGVtb1ZhdWx0Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbiwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQXBwSnNvbik7XG4gICAgY29uc3QgY29udGVudCA9IGV4aXN0c1N5bmMoYXBwSnNvblBhdGgpID8gcmVhZEZpbGVTeW5jKGFwcEpzb25QYXRoLCAndXRmLTgnKSA6IG51bGw7XG4gICAgcmV0dXJuIGZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5ncyh7IGFwcEpzb246IHBhcnNlRGVtb1ZhdWx0QXBwSnNvbih7IGNvbnRlbnQsIHBhdGg6IGFwcEpzb25QYXRoIH0pIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIGNhcnJ5aW5nIGEgYFtEb2NzXSjigKYpYCBsaW5rIGxpbmUuIFRoZSBub3RlIElTIHRoZSBkb2N1bWVudGF0aW9uLCBzbyBhIGxpbmUgcG9pbnRpbmdcbiAgICogZWxzZXdoZXJlIGZvciB0aGUgcmVhbCBleHBsYW5hdGlvbiBpcyB0aGUgc2hhcGUgdGhpcyBjb252ZW50aW9uIGV4aXN0cyB0byByZW1vdmUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhEb2NzTGlua3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiBnZXRMaW5lc091dHNpZGVGZW5jZXMobm90ZS5jb250ZW50KS5zb21lKChsaW5lKSA9PiBET0NTX0xJTktfUkVHX0VYUC50ZXN0KGxpbmUpKSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB0aGF0IGRvIG5vdCBvcGVuIHdpdGggYW4gYCMgSDFgIChmcm9udG1hdHRlciBhc2lkZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhvdXRIMSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+ICFoYXNIMShub3RlLmNvbnRlbnQpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHdpdGggbm8gcHJvc2UgcGFyYWdyYXBoIGJlZm9yZSB0aGVpciBmaXJzdCBjb2RlIGZlbmNlIOKAlCB0aGUgMS0zIHNlbnRlbmNlcyBzYXlpbmcgd2hhdCB0aGVcbiAgICogZmVhdHVyZSBkb2VzIGFuZCB3aHkgYSByZWFkZXIgd291bGQgd2FudCBpdCwgd2l0aG91dCB3aGljaCB0aGUgbm90ZSBpcyBhIGJ1dHRvbiB3aXRoIG5vIGxlc3Nvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aG91dEludHJvUHJvc2UoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiAhaGFzSW50cm9Qcm9zZShub3RlLmNvbnRlbnQpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHdob3NlIGV4ZW1wdGlvbnMgYXJlIG5vdCBkb2luZyBhbnkgd29yayDigJQgYSB3aWtpbGluayBhbGxvd2FuY2Ugb3IgYW4gaW5saW5lIGRpcmVjdGl2ZSBmb3JcbiAgICogYW55IHJ1bGUgZGVjbGFyZWQgd2l0aG91dCBhIHJlYXNvbiwgbWlzc3BlbGxlZCwgb3IgY292ZXJpbmcgbm90aGluZyB0aGF0IGJyZWFrcyBpdHMgcnVsZS4gQWxsIG9mIHRoZW1cbiAgICogYXJlIGRyaWZ0OiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCBhbmQgb25lIG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIHdoaWNoIHdvdWxkIGdvIG9uIGhpZGluZ1xuICAgKiB0aGUgbmV4dCBtaXN0YWtlIHNvbWVib2R5IG1ha2VzIGJ5IGFjY2lkZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBPbmUgYDxub3RlPjogPHByb2JsZW0+YCBlbnRyeSBwZXIgcHJvYmxlbSBmb3VuZC5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRoVW5qdXN0aWZpZWRXaWtpbGlua0FsbG93YW5jZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKCkuZmxhdE1hcCgobm90ZSkgPT4ge1xuICAgICAgY29uc3Qgc2NhbiA9IHNjYW5EaXJlY3RpdmVzKG5vdGUuY29udGVudCk7XG4gICAgICBjb25zdCBwcm9ibGVtcyA9IFsuLi5zY2FuLnByb2JsZW1zXTtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihub3RlLmNvbnRlbnQpO1xuICAgICAgaWYgKHJlYXNvbiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAocmVhc29uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdhIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIHdpdGggbm8gcmVhc29uJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc1dpa2lsaW5rKG5vdGUuY29udGVudCkpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdhIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIGNvdmVyaW5nIG5vIHdpa2lsaW5rJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2V0QWxsb3dlZExpbmVJbmRleGVzKHNjYW4sIFdJS0lMSU5LX1JVTEUpLnNpemUgPiAwKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnaW5saW5lIGRpcmVjdGl2ZXMgdGhlIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIGFscmVhZHkgY292ZXJzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9ibGVtcy5tYXAoKHByb2JsZW0pID0+IGAke25vdGUucmVsYXRpdmVQYXRofTogJHtwcm9ibGVtfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHVzaW5nIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gIG91dHNpZGUgYSBjb2RlIGZlbmNlLiBUaGUgZGVtbyB2YXVsdCBpcyBhbHNvIHJlYWQgb25cbiAgICogR2l0SHViLCB3aGVyZSBhIHdpa2lsaW5rIHJlbmRlcnMgYXMgbGl0ZXJhbCBicmFja2V0cyBhbmQgbGVhZHMgbm93aGVyZS4gQSB3aWtpbGluayBzaG93biBJTlNJREUgYVxuICAgKiBmZW5jZSBpcyBzYW1wbGUgdGV4dCwgbm90IG5hdmlnYXRpb24sIHNvIGZlbmNlZCBibG9ja3MgYXJlIHNraXBwZWQsIGFzIGlzIGEgbm90ZSB0aGF0IGRlY2xhcmVzIGluIGl0c1xuICAgKiBmcm9udG1hdHRlciB3aHkgaXRzIHdpa2lsaW5rcyBhcmUgdGhlIHBvaW50IOKAlCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhXaWtpbGlua3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiB7XG4gICAgICAgIGlmIChyZWFkV2lraWxpbmtBbGxvd2FuY2VSZWFzb24obm90ZS5jb250ZW50KSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGxvd2VkTGluZUluZGV4ZXMgPSBnZXRBbGxvd2VkTGluZUluZGV4ZXMoc2NhbkRpcmVjdGl2ZXMobm90ZS5jb250ZW50KSwgV0lLSUxJTktfUlVMRSk7XG4gICAgICAgIHJldHVybiBmaW5kV2lraWxpbmtMaW5lSW5kZXhlcyhub3RlLmNvbnRlbnQpLnNvbWUoKGxpbmVJbmRleCkgPT4gIWFsbG93ZWRMaW5lSW5kZXhlcy5oYXMobGluZUluZGV4KSk7XG4gICAgICB9KVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG1lbWJlcnMgdGhhdCB0aGUgZGVtbyBub3RlcyByZWZlcmVuY2Ugb24gYSByZWNlaXZlciBidXQgdGhhdCBubyBsb25nZXIgZXhpc3Qgb24gaXQgKHJlbmFtZSBkcmlmdCkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGRpc3RpbmN0IHN0YWxlIG1lbWJlciBuYW1lcyByZWZlcmVuY2VkIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICovXG4gIHB1YmxpYyBmaW5kU3RhbGVSZWZlcmVuY2VzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFN0YWxlUmVmZXJlbmNlc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWxpZE1lbWJlcnMgPSBuZXcgU2V0KHBhcmFtcy52YWxpZE1lbWJlcnMpO1xuICAgIGNvbnN0IHJlZmVyZW5jZWQgPSBbLi4udGhpcy5yZWFkQ29ycHVzKCkubWF0Y2hBbGwobmV3IFJlZ0V4cChTdHJpbmcucmF3YCR7cGFyYW1zLnJlY2VpdmVyfVxcLig/PG1lbWJlcj5cXHcrKWAsICdnJykpXVxuICAgICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtZW1iZXInKSk7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KHJlZmVyZW5jZWQpXS5maWx0ZXIoKG1lbWJlcikgPT4gIXZhbGlkTWVtYmVycy5oYXMobWVtYmVyKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYFRyeSBpdGAgc2VjdGlvbnMgd2l0aCBubyBgY29kZS1idXR0b25gIGluIHRoZW0uIEEgYFRyeSBpdGAgc2VjdGlvbiBpcyBhIGhlYWRpbmcgb2YgYW55IGxldmVsXG4gICAqIHN0YXJ0aW5nIGBUcnkgaXRgLCB1cCB0byB0aGUgbmV4dCBoZWFkaW5nIG9mIHRoZSBzYW1lIG9yIGEgaGlnaGVyIGxldmVsOyB0aGUgc2V0dXAgaXQgYXNrcyBmb3IgaXNcbiAgICogd2hhdCBhIGJ1dHRvbiBpcyBmb3IsIHNvIGEgc2VjdGlvbiB0aGF0IGxlYXZlcyB0aGUgcmVhZGVyIHRvIGRvIGl0IGJ5IGhhbmQgaXMgdGhlIHNoYXBlIHRoaXMgY2hlY2tcbiAgICogcmVqZWN0cy4gQSBzZWN0aW9uIHdob3NlIGhlYWRpbmcgYSBgZGVtby12YXVsdC12YWxpZGF0aW9uL3RyeS1pdC1jb2RlLWJ1dHRvbmAgZGlyZWN0aXZlIGNvdmVycyBoYXNcbiAgICogc3RhdGVkIHdoeSBpdCBjYW5ub3QgYmUgc2NyaXB0ZWQsIGFuZCBpcyBza2lwcGVkIOKAlCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcuXG4gICAqXG4gICAqIEByZXR1cm5zIE9uZSBgPG5vdGU+OiBsaW5lIDxuPmAgZW50cnkgcGVyIG9mZmVuZGluZyBzZWN0aW9uLCBuYW1pbmcgdGhlIGxpbmUgb2YgaXRzIGhlYWRpbmcuXG4gICAqL1xuICBwdWJsaWMgZmluZFRyeUl0U2VjdGlvbnNXaXRob3V0Q29kZUJ1dHRvbigpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKCkuZmxhdE1hcCgobm90ZSkgPT4ge1xuICAgICAgY29uc3QgYWxsb3dlZExpbmVJbmRleGVzID0gZ2V0QWxsb3dlZExpbmVJbmRleGVzKHNjYW5EaXJlY3RpdmVzKG5vdGUuY29udGVudCksIFRSWV9JVF9SVUxFKTtcbiAgICAgIHJldHVybiBmaW5kVHJ5SXRMaW5lSW5kZXhlc1dpdGhvdXRDb2RlQnV0dG9uKG5vdGUuY29udGVudClcbiAgICAgICAgLmZpbHRlcigobGluZUluZGV4KSA9PiAhYWxsb3dlZExpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpKVxuICAgICAgICAubWFwKChsaW5lSW5kZXgpID0+IGAke25vdGUucmVsYXRpdmVQYXRofTogJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbWVtYmVycyB0aGF0IGFyZSBub3QgZGVtb25zdHJhdGVkIGFueXdoZXJlIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgbWVtYmVyIG5hbWVzIHdpdGggbm8gZGVtb25zdHJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBmaW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb3JwdXMgPSB0aGlzLnJlYWRDb3JwdXMoKTtcbiAgICByZXR1cm4gcGFyYW1zLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IG5lZWRsZSA9IHBhcmFtcy5yZWNlaXZlciA9PT0gdW5kZWZpbmVkID8gbWVtYmVyIDogYCR7cGFyYW1zLnJlY2VpdmVyfS4ke21lbWJlcn1gO1xuICAgICAgcmV0dXJuICFjb3JwdXMuaW5jbHVkZXMobmVlZGxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBmZWF0dXJlIGRvY3MgdGhhdCBubyBkZW1vIG5vdGUgbGlua3MgdG8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGZlYXR1cmUtZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgbm90IGxpbmtlZCBmcm9tIGFueSBkZW1vIG5vdGUuXG4gICAqL1xuICBwdWJsaWMgZmluZFVubGlua2VkRmVhdHVyZURvY3MocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5saW5rZWRGZWF0dXJlRG9jc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBub25GZWF0dXJlRG9jcyA9IG5ldyBTZXQocGFyYW1zLm5vbkZlYXR1cmVEb2NzKTtcbiAgICBjb25zdCBmZWF0dXJlRG9jcyA9IHJlYWRkaXJTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuZG9jc0ZvbGRlcikpXG4gICAgICAuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKCcubWQnKSlcbiAgICAgIC5tYXAoKGZpbGUpID0+IGZpbGUucmVwbGFjZSgvXFwubWQkLywgJycpKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gIW5vbkZlYXR1cmVEb2NzLmhhcyhuYW1lKSk7XG4gICAgY29uc3QgbGlua2VkRG9jcyA9IG5ldyBTZXQoXG4gICAgICBbLi4udGhpcy5yZWFkQ29ycHVzKCkubWF0Y2hBbGwoL2RvY3NcXC8oPzxkb2M+W1xcdy1dKylcXC5tZC9nKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2RvYycpKVxuICAgICk7XG4gICAgcmV0dXJuIGZlYXR1cmVEb2NzLmZpbHRlcigoZG9jKSA9PiAhbGlua2VkRG9jcy5oYXMoZG9jKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgdGhhdCBjYW5ub3QgYmUgcmVhY2hlZCBmcm9tIHRoZSBzdGFydCBub3RlIGJ5IGZvbGxvd2luZyBNYXJrZG93biBsaW5rcyBiZXR3ZWVuIG5vdGVzLlxuICAgKlxuICAgKiBUaGUgd2FsayBzdGFydHMgYXQge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbnJlYWNoYWJsZU5vdGVzUGFyYW1zLnN0YXJ0Tm90ZX0gYW5kIGZvbGxvd3NcbiAgICogZXZlcnkgYFtUZXh0XSg8Li9OTiBOYW1lLm1kPilgIGxpbmsgb3V0c2lkZSBhIGNvZGUgZmVuY2UsIHRyYW5zaXRpdmVseS4gQSBub3RlIG5vdGhpbmcgbGlua3MgdG8gaXNcbiAgICogb25lIGEgcmVhZGVyIGNhbiBvbmx5IGZpbmQgYnkgYnJvd3NpbmcgdGhlIGZpbGUgbGlzdCDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZSBncm91cGVkIGluZGV4IGluIHRoZVxuICAgKiBzdGFydCBub3RlIGlzIG1lYW50IHRvIHJlcGxhY2UuIFdoZW4gdGhlIHN0YXJ0IG5vdGUgaXRzZWxmIGlzIG1pc3NpbmcsIEVWRVJZIG5vdGUgaXMgdW5yZWFjaGFibGUsXG4gICAqIGJlY2F1c2UgdGhlcmUgaXMgbm93aGVyZSB0byBzdGFydCBmcm9tLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YWxrLlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIHVucmVhY2hhYmxlIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbnJlYWNoYWJsZU5vdGVzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm90ZXNCeVJlbGF0aXZlUGF0aCA9IG5ldyBNYXAodGhpcy5jb2xsZWN0Tm90ZXMoKS5tYXAoKG5vdGUpID0+IFtub3RlLnJlbGF0aXZlUGF0aCwgbm90ZV0pKTtcbiAgICBjb25zdCByZWFjaGVkTm90ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBwZW5kaW5nTm90ZXMgPSBbcGFyYW1zLnN0YXJ0Tm90ZV07XG5cbiAgICB3aGlsZSAocGVuZGluZ05vdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vdGVQYXRoID0gZW5zdXJlTm9uTnVsbGFibGUocGVuZGluZ05vdGVzLnBvcCgpKTtcbiAgICAgIGNvbnN0IG5vdGUgPSBub3Rlc0J5UmVsYXRpdmVQYXRoLmdldChub3RlUGF0aCk7XG4gICAgICBpZiAoIW5vdGUgfHwgcmVhY2hlZE5vdGVzLmhhcyhub3RlUGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZWFjaGVkTm90ZXMuYWRkKG5vdGVQYXRoKTtcbiAgICAgIHBlbmRpbmdOb3Rlcy5wdXNoKC4uLmNvbGxlY3ROb3RlTGlua1RhcmdldHMobm90ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aClcbiAgICAgIC5maWx0ZXIoKG5vdGVQYXRoKSA9PiAhcmVhY2hlZE5vdGVzLmhhcyhub3RlUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgbmFtZXMgb2YgdGhlIGBleHBvcnQgZnVuY3Rpb25gcyAoaW5jbHVkaW5nIGBhc3luY2AgYW5kIGdlbmVyYXRvciBkZWNsYXJhdGlvbnMpIGluIGEgc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGV4cG9ydGVkIGZ1bmN0aW9uIG5hbWVzIGluIHNvdXJjZSBvcmRlci5cbiAgICovXG4gIHB1YmxpYyBnZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID0gcmVhZEZpbGVTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuc291cmNlUGF0aCksICd1dGYtOCcpO1xuICAgIHJldHVybiBbLi4uc291cmNlLm1hdGNoQWxsKC9eZXhwb3J0ICg/OmFzeW5jICk/ZnVuY3Rpb25cXCo/ICg/PG5hbWU+XFx3KykvZ20pXVxuICAgICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgbWVtYmVycyBvZiBhbiBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIGRlY2xhcmVkIGluIGEgc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIHBhcnNlZCB7QGxpbmsgSW50ZXJmYWNlTWVtYmVyc30uXG4gICAqIEB0aHJvd3MgV2hlbiB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHNvdXJjZSBmaWxlLlxuICAgKi9cbiAgcHVibGljIGdldEludGVyZmFjZU1lbWJlcnMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRJbnRlcmZhY2VNZW1iZXJzUGFyYW1zKTogSW50ZXJmYWNlTWVtYmVycyB7XG4gICAgY29uc3Qgc291cmNlID0gcmVhZEZpbGVTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuc291cmNlUGF0aCksICd1dGYtOCcpO1xuICAgIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YGV4cG9ydCAoPzxrZXl3b3JkPmludGVyZmFjZXxjbGFzc3xlbnVtKSAke3BhcmFtcy5pbnRlcmZhY2VOYW1lfVxcYltee10qXFx7KD88Ym9keT5bXFxzXFxTXSo/KVxcblxcfWApLmV4ZWMoc291cmNlKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGludGVyZmFjZSAke3BhcmFtcy5pbnRlcmZhY2VOYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VNZW1iZXJzKGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdrZXl3b3JkJyksIGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdib2R5JykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuZCBjYWNoZXMgdGhlIGRlbW8gY29ycHVzIOKAlCBldmVyeSBgKi5tZGAgbm90ZSBpbiB0aGUgZGVtbyB2YXVsdCBqb2luZWQgaW50byBvbmUgc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29uY2F0ZW5hdGVkIGRlbW8tbm90ZSBjb250ZW50cy5cbiAgICovXG4gIHB1YmxpYyByZWFkQ29ycHVzKCk6IHN0cmluZyB7XG4gICAgdGhpcy5jYWNoZWRDb3JwdXMgPz89IHRoaXMuY29sbGVjdE5vdGVzKClcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUuY29udGVudClcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRDb3JwdXM7XG4gIH1cblxuICAvLyBUaGUgbm90ZXMgdGhlIGF1dGhvcmluZyBjaGVja3MgYXBwbHkgdG86IGV2ZXJ5IG5vdGUgZXhjZXB0IHRoZSBvbmVzIGRlY2xhcmVkIG91dHNpZGUgdGhlIGxlYXJuaW5nXG4gIC8vIHBhdGggKHRoZSB2YXVsdCdzIG93biBgUkVBRE1FLm1kYCBieSBkZWZhdWx0KS5cbiAgcHJpdmF0ZSBjb2xsZWN0Q2hlY2thYmxlTm90ZXMoKTogRGVtb1ZhdWx0Tm90ZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Tm90ZXMoKS5maWx0ZXIoKG5vdGUpID0+ICF0aGlzLmV4Y2x1ZGVkTm90ZXMuaGFzKG5vdGUucmVsYXRpdmVQYXRoKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3RNYXJrZG93bkZpbGVzKGZvbGRlcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICAvLyBgcmVhZGRpclN5bmNgIHJldHVybnMgZW50cmllcyBpbiB0aGUgZmlsZSBzeXN0ZW0ncyBvd24gb3JkZXI6IGJ5IG5hbWUgb24gTlRGUywgYnV0IGJ5IGhhc2ggb24gZXh0NCwgc29cbiAgICAvLyBzb3J0IHRoZW0gc28gZXZlcnkgY2hlY2sgcmVwb3J0cyBpdHMgbm90ZXMgaW4gdGhlIHNhbWUgb3JkZXIgb24gZXZlcnkgcGxhdGZvcm0uXG4gICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSwgJ2VuJykpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk5vZGVNb2R1bGVzIGFzIHN0cmluZykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuY29sbGVjdE1hcmtkb3duRmlsZXMoam9pbihmb2xkZXIsIGVudHJ5Lm5hbWUpKSk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGpvaW4oZm9sZGVyLCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSB0aGF0IGtlZXBzIGEgcGx1Z2luJ3MgaW4tcmVwbyBgZGVtby12YXVsdC9gIGluIHN5bmMgd2l0aCBpdHMgcHVibGljIHN1cmZhY2UuXG4gKlxuICogQ2FsbCBpdCBvbmNlIGZyb20gYSBwbHVnaW4ncyBgZGVtby12YXVsdC5uby1hcHAuaW50ZWdyYXRpb24udGVzdC50c2A7IGl0IHJlZ2lzdGVycyBvbmUgdGVzdCBwZXIgY2hlY2ssXG4gKiBkZWxlZ2F0aW5nIHRvIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJ9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGVjbGFyYXRpdmUgY292ZXJhZ2Ugc3BlY2lmaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZShwYXJhbXM6IFJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZVBhcmFtcyk6IHZvaWQge1xuICBjb25zdCBjaGVja2VyID0gbmV3IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyQ29uc3RydWN0b3JQYXJhbXM+KHtcbiAgICBleGNsdWRlZE5vdGVzOiBwYXJhbXMuYXV0aG9yaW5nPy5leGNsdWRlZE5vdGVzLFxuICAgIHJvb3RGb2xkZXI6IHBhcmFtcy5yb290Rm9sZGVyXG4gIH0pKTtcbiAgY29uc3Qgc3RhcnROb3RlID0gcGFyYW1zLmF1dGhvcmluZz8uc3RhcnROb3RlID8/IERFRkFVTFRfU1RBUlRfTk9URTtcbiAgY29uc3QgdHJ5SXRDb2RlQnV0dG9ucyA9IHBhcmFtcy5hdXRob3Jpbmc/LnRyeUl0Q29kZUJ1dHRvbnMgPz8gREVGQVVMVF9UUllfSVRfQ09ERV9CVVRUT05TX1NFVkVSSVRZO1xuXG4gIGRlc2NyaWJlKCdkZW1vLXZhdWx0IGNvdmVyYWdlJywgKCkgPT4ge1xuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuaW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgaXQoYGRlbW9uc3RyYXRlcyBldmVyeSAke3NwZWMuaW50ZXJmYWNlTmFtZX0gJHtzcGVjLmtpbmR9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBjb25zdCBkZW1vbnN0cmF0ZWQgPSBtZW1iZXJzW3NwZWMua2luZF07XG4gICAgICAgIGV4cGVjdChkZW1vbnN0cmF0ZWQubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBkZW1vbnN0cmF0ZWQsIHJlY2VpdmVyOiBzcGVjLnJlY2VpdmVyIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdChgcmVmZXJlbmNlcyBubyAke3NwZWMuaW50ZXJmYWNlTmFtZX0gbWVtYmVyIHRoYXQgbm8gbG9uZ2VyIGV4aXN0c2AsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IGNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVycyhzcGVjKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFN0YWxlUmVmZXJlbmNlcyh7IHJlY2VpdmVyOiBzcGVjLnJlY2VpdmVyLCB2YWxpZE1lbWJlcnM6IG1lbWJlcnMuYWxsIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuY29uZmlnSW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgaXQoYGRlbW9uc3RyYXRlcyBldmVyeSAke3NwZWMuaW50ZXJmYWNlTmFtZX0gb3B0aW9uYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QobWVtYmVycy5wcm9wZXJ0aWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogbWVtYmVycy5wcm9wZXJ0aWVzIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuZnVuY3Rpb25Nb2R1bGVzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5IGV4cG9ydGVkIGZ1bmN0aW9uIGluICR7c3BlYy5zb3VyY2VQYXRofWAsICgpID0+IHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lcyA9IGNoZWNrZXIuZ2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzKHNwZWMpO1xuICAgICAgICBleHBlY3QoZnVuY3Rpb25OYW1lcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyh7IG1lbWJlcnM6IGZ1bmN0aW9uTmFtZXMgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jcyA9IHBhcmFtcy5kb2NzO1xuICAgIGlmIChkb2NzKSB7XG4gICAgICBpdCgnbGlua3MgYSBkZW1vIG5vdGUgZm9yIGV2ZXJ5IGZlYXR1cmUgZG9jJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5saW5rZWRGZWF0dXJlRG9jcyh7IGRvY3NGb2xkZXI6IGRvY3MuZm9sZGVyLCBub25GZWF0dXJlRG9jczogZG9jcy5ub25GZWF0dXJlRG9jcyB9KSlcbiAgICAgICAgICAudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpdCgnb3BlbnMgZXZlcnkgbm90ZSB3aXRoIGFuIEgxJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aG91dEgxKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ29wZW5zIGV2ZXJ5IG5vdGUgd2l0aCBhIHByb3NlIHBhcmFncmFwaCBiZWZvcmUgaXRzIGZpcnN0IGNvZGUgYmxvY2snLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRob3V0SW50cm9Qcm9zZSgpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KGByZWFjaGVzIGV2ZXJ5IG5vdGUgZnJvbSAke3N0YXJ0Tm90ZX1gLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5yZWFjaGFibGVOb3Rlcyh7IHN0YXJ0Tm90ZSB9KSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBubyB3aWtpbGlua3MsIHdoaWNoIGRvIG5vdCByZW5kZXIgb24gR2l0SHViJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aFdpa2lsaW5rcygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdqdXN0aWZpZXMgZXZlcnkgd2lraWxpbmsgYWxsb3dhbmNlIGFuZCBkaXJlY3RpdmUsIGFuZCBkZWNsYXJlcyBub25lIGl0IG5vIGxvbmdlciBuZWVkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dpdmVzIGV2ZXJ5IFRyeSBpdCBzZWN0aW9uIGEgY29kZSBidXR0b24sIG9yIGEgc3RhdGVkIHJlYXNvbiBpdCBoYXMgbm9uZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2hlY2tlci5maW5kVHJ5SXRTZWN0aW9uc1dpdGhvdXRDb2RlQnV0dG9uKCk7XG4gICAgICBpZiAodHJ5SXRDb2RlQnV0dG9ucyA9PT0gJ2Vycm9yJykge1xuICAgICAgICBleHBlY3Qoc2VjdGlvbnMpLnRvRXF1YWwoW10pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLndhcm4oZm9ybWF0VHJ5SXRXYXJuaW5nKHNlY3Rpb25zKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnY2FycmllcyBubyBEb2NzIGxpbmsgbGluZSwgYmVjYXVzZSB0aGUgbm90ZSBpcyB0aGUgZG9jcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhEb2NzTGlua3MoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY29tbWl0cyBub25lIG9mIHRoZSBhcHAuanNvbiBzZXR0aW5ncyBvYnNpZGlhbi1kZXYtdXRpbHMgaW5qZWN0cyBhdCByZWxlYXNlIHRpbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kQ29tbWl0dGVkQXBwSnNvblNldHRpbmdzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgLy8gV2l0aCBubyBub3RlcyB0byByZWFkLCBldmVyeSBhdXRob3JpbmcgY2hlY2sgYWJvdmUgcGFzc2VzIGJ5IGhhdmluZyBub3RoaW5nIHRvIGxvb2sgYXQsIHNvIGEgdmF1bHRcbiAgICAvLyB0aGF0IHN0b3BwZWQgYmVpbmcgZm91bmQgd291bGQgZ28gb24gcmVwb3J0aW5nIGl0c2VsZiBjbGVhbi4gVGhpcyBpcyB0aGUgaGFsZiBvZiB0aGUgbm9uLXRyaXZpYWxcbiAgICAvLyBndWFyZCB0aGF0IHN0aWxsIGFwcGxpZXMgd2hlbiB0aGUgcGx1Z2luIGV4cG9zZXMgbm90aGluZyB0byByZWZsZWN0LlxuICAgIGl0KCdyZWFkcyBhIG5vbi1lbXB0eSBkZW1vIHZhdWx0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuY29sbGVjdERlbW9Ob3RlUmVsYXRpdmVQYXRocygpLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZ3VhcmQgPSBwYXJhbXMubm9uVHJpdmlhbEd1YXJkO1xuICAgIGlmIChndWFyZCkge1xuICAgICAgaXQoJ2tlZXBzIHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBub24tdHJpdmlhbCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IGNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVycyhndWFyZCk7XG4gICAgICAgIGV4cGVjdChtZW1iZXJzLmFsbCkudG9Db250YWluKGd1YXJkLmV4cGVjdE1lbWJlcik7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmNvbGxlY3REZW1vTm90ZVJlbGF0aXZlUGF0aHMoKSkudG9Db250YWluKGd1YXJkLmV4cGVjdERlbW9Ob3RlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IENMQVNTX01FTUJFUl9NT0RJRklFUlMgPSBTdHJpbmcucmF3YCg/Oig/OnB1YmxpY3xwcml2YXRlfHByb3RlY3RlZHxyZWFkb25seXxzdGF0aWN8YWJzdHJhY3R8b3ZlcnJpZGUpXFxzKykqYDtcbmNvbnN0IEFCU09MVVRFX1VSTF9SRUdfRVhQID0gL15bYS16XVtcXHcrLi1dKjovaTtcbmNvbnN0IEFSUk9XX1JFR19FWFAgPSAvXlxccyo9Pi87XG5jb25zdCBGVU5DVElPTl9UWVBFX1BBUkFNRVRFUlNfUkVHX0VYUCA9IC9ePFtePl0qPlxccyovO1xuY29uc3QgQU5HTEVfQlJBQ0tFVFNfUkVHX0VYUCA9IC9ePHw+JC9nO1xuY29uc3QgQ09ERV9CVVRUT05fRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKig/OmBgYHx+fn4pXFxzKmNvZGUtYnV0dG9uXFxiLztcbmNvbnN0IENPREVfRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKig/OmBgYHx+fn4pLztcbmNvbnN0IERFRkFVTFRfRVhDTFVERURfTk9URVMgPSBbJ1JFQURNRS5tZCddO1xuY29uc3QgREVGQVVMVF9TVEFSVF9OT1RFID0gJzAwIFN0YXJ0Lm1kJztcbi8vIEl0IHNoaXBwZWQgYXMgYSB3YXJuaW5nIHdoaWxlIGV4aXN0aW5nIHZhdWx0cyB3ZXJlIGJyb3VnaHQgdXAgdG8gdGhlIGNoZWNrLCBhbmQgYmVjYW1lIGFuIGVycm9yIG9uY2UgdGhleSB3ZXJlLlxuY29uc3QgREVGQVVMVF9UUllfSVRfQ09ERV9CVVRUT05TX1NFVkVSSVRZOiBEZW1vVmF1bHRDaGVja1NldmVyaXR5ID0gJ2Vycm9yJztcbmNvbnN0IERPQ1NfTElOS19SRUdfRVhQID0gL15cXHMqXFxbRG9jc11cXCgvO1xuY29uc3QgRlJPTlRNQVRURVJfUkVHX0VYUCA9IC9eLS0tXFxyP1xcbltcXHNcXFNdKj9cXHI/XFxuLS0tW15cXFNcXG5dKlxccj9cXG4/LztcbmNvbnN0IEgxX1JFR19FWFAgPSAvXiMgXFxTLztcbmNvbnN0IEhFQURJTkdfTEVWRUxfUkVHX0VYUCA9IC9eIHswLDN9KD88aGFzaGVzPiN7MSw2fSkoPzpcXHN8JCkvO1xuY29uc3QgSEVBRElOR19SRUdfRVhQID0gL14jezEsNn0gLztcbmNvbnN0IElOTElORV9DT0RFX1JFR19FWFAgPSAvYFteYFxcbl0qYC9nO1xuY29uc3QgTUFSS0RPV05fTElOS19SRUdfRVhQID0gL1xcW1teXFxdXSpdXFwoKD88dGFyZ2V0PlteKV0rKVxcKS9nO1xuLy8gQW4gaW5saW5lIGRpcmVjdGl2ZSwgc2hhcGVkIGFmdGVyIEVTTGludCdzIGFuZCB3cml0dGVuIGFzIGFuIEhUTUwgY29tbWVudCBzbyBpdCBpcyBpbnZpc2libGUgQk9USCBpblxuLy8gT2JzaWRpYW4gYW5kIG9uIEdpdEh1YiDigJQgdGhlIHNhbWUgc3BlbGxpbmcgdGhlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWAuXG4vLyBBbiBPYnNpZGlhbiBgJSUg4oCmICUlYCBjb21tZW50IHdvdWxkIHNob3cgdXAgYXMgbGl0ZXJhbCB0ZXh0IG9uIEdpdEh1Yiwgd2hpY2ggaXMgaGFsZiB0aGUgcmVhZGVyc2hpcC5cbmNvbnN0IERJUkVDVElWRV9SRUdfRVhQID0gL15cXHMqPCEtLVxccypvYnNpZGlhbi1kZXYtdXRpbHMtKD88YWN0aW9uPmRpc2FibGUtbmV4dC1saW5lfGRpc2FibGV8ZW5hYmxlKVxccysoPzxydWxlPltcXHctXStcXC9bXFx3LV0rKSg/OlxccystLVxccysoPzxyZWFzb24+Lio/KSk/XFxzKi0tPlxccyokLztcbi8vIENhdGNoZXMgYSBkaXJlY3RpdmUgdGhhdCB3YXMgTUVBTlQgdG8gYmUgb25lIGJ1dCBpcyBtaXNzcGVsbGVkOiBpdCB3b3VsZCBvdGhlcndpc2UgcmVhZCBhcyBhbiBvcmRpbmFyeVxuLy8gY29tbWVudCBhbmQgc2lsZW50bHkgZG8gbm90aGluZywgd2hpY2ggaXMgdGhlIGZhaWx1cmUgbW9kZSBhIHN1cHByZXNzaW9uIHN5bnRheCBtdXN0IG5ldmVyIGhhdmUuXG5jb25zdCBESVJFQ1RJVkVfUFJPQkVfUkVHX0VYUCA9IC88IS0tXFxzKm9ic2lkaWFuLWRldi11dGlscy0vO1xuY29uc3QgVFJZX0lUX0hFQURJTkdfUkVHX0VYUCA9IC9eIHswLDN9I3sxLDZ9XFxzK1RyeSBpdFxcYi9pO1xuY29uc3QgVFJZX0lUX1JVTEUgPSAnZGVtby12YXVsdC12YWxpZGF0aW9uL3RyeS1pdC1jb2RlLWJ1dHRvbic7XG5jb25zdCBXSUtJTElOS19SVUxFID0gJ2RlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MnO1xuLy8gRXZlcnkgcnVsZSBhIGRpcmVjdGl2ZSBtYXkgbmFtZSwgd2l0aCB3aGF0IGEgbGluZSBicmVha2luZyBpdCBpcyBjYWxsZWQgaW4gYSBwcm9ibGVtIG1lc3NhZ2UuXG5jb25zdCBESVJFQ1RJVkVfUlVMRV9UQVJHRVRTID0gbmV3IE1hcChbXG4gIFtUUllfSVRfUlVMRSwgJ1RyeSBpdCBzZWN0aW9uIHdpdGhvdXQgYSBjb2RlIGJ1dHRvbiddLFxuICBbV0lLSUxJTktfUlVMRSwgJ3dpa2lsaW5rJ11cbl0pO1xuLy8gVGhlIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGZyb250bWF0dGVyIHBhdGgsIGF0IGFueSBpbmRlbnRhdGlvbjpcbi8vIFRoZSBrZXlzIG11c3QgbmVzdCBpbiB0aGF0IG9yZGVyLCBhbmQgYW55IGxpbmUgYmV0d2VlbiB0aGVtIGhhcyB0byBzdGF5IGluZGVudGVkLCBzbyBhIGRlZGVudCB0byB0aGVcbi8vIGRvY3VtZW50J3Mgb3duIHRvcCBsZXZlbCBlbmRzIHRoZSBtYXRjaCByYXRoZXIgdGhhbiByZWFjaGluZyBhIHNhbWUtbmFtZWQga2V5IHVuZGVyIGFub3RoZXIgcGFyZW50LlxuY29uc3QgV0lLSUxJTktfQUxMT1dBTkNFX1JFR19FWFAgPSAvXm9ic2lkaWFuLWRldi11dGlsczpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2RlbW8tdmF1bHQtdmFsaWRhdGlvbjpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2FsbG93LXdpa2lsaW5rczooPzxyZWFzb24+LiopJC9tO1xuY29uc3QgV0lLSUxJTktfUkVHX0VYUCA9IC9cXFtcXFtbXlxcXV0rXV0vO1xuXG4vLyBBcHBsaWVzIG9uZSBwYXJzZWQgZGlyZWN0aXZlIHRvIHRoZSBzY2FuLiBFYWNoIHJ1bGUga2VlcHMgaXRzIG93biByZWdpb24gYW5kIGl0cyBvd24gcGVuZGluZ1xuLy8gYGRpc2FibGUtbmV4dC1saW5lYCwgc28gYSBkaXJlY3RpdmUgZm9yIG9uZSBydWxlIG5ldmVyIGV4ZW1wdHMgYSBsaW5lIGZyb20gYW5vdGhlci5cbmZ1bmN0aW9uIGFwcGx5RGlyZWN0aXZlKHN0YXRlOiBEaXJlY3RpdmVTY2FuU3RhdGUsIGxpbmVJbmRleDogbnVtYmVyLCBtYXRjaDogUmVnRXhwRXhlY0FycmF5KTogdm9pZCB7XG4gIGNvbnN0IGFjdGlvbiA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdhY3Rpb24nKTtcbiAgY29uc3QgcnVsZSA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdydWxlJyk7XG4gIGNvbnN0IHJlYXNvbiA9IG1hdGNoLmdyb3Vwcz8uWydyZWFzb24nXT8udHJpbSgpID8/ICcnO1xuICBjb25zdCB0YXJnZXQgPSBESVJFQ1RJVkVfUlVMRV9UQVJHRVRTLmdldChydWxlKTtcbiAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYW4gdW5rbm93biBydWxlIFwiJHtydWxlfVwiIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYWN0aW9uICE9PSAnZW5hYmxlJyAmJiByZWFzb24gPT09ICcnKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXJlY3RpdmUgd2l0aCBubyByZWFzb24gb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUtbmV4dC1saW5lJykge1xuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGUuc2V0KHJ1bGUsIGxpbmVJbmRleCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3BlblJlZ2lvbiA9IHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLmdldChydWxlKTtcbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUnKSB7XG4gICAgaWYgKG9wZW5SZWdpb24pIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX0gaW5zaWRlIHRoZSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihvcGVuUmVnaW9uLmxpbmVJbmRleCl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLnNldChydWxlLCB7IGlzVXNlZDogZmFsc2UsIGxpbmVJbmRleCB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIW9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhbiBlbmFibGUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9IHdpdGggbm8gcmVnaW9uIG9wZW5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFvcGVuUmVnaW9uLmlzVXNlZCkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIob3BlblJlZ2lvbi5saW5lSW5kZXgpfSBjb3ZlcmluZyBubyAke3RhcmdldH1gKTtcbiAgfVxuICBzdGF0ZS5vcGVuUmVnaW9uc0J5UnVsZS5kZWxldGUocnVsZSk7XG59XG5cbi8vIEFwcGxpZXMgb25lIG9yZGluYXJ5IGxpbmUgdG8gdGhlIHNjYW4sIHJ1bGUgYnkgcnVsZTogYW4gb3BlbiByZWdpb24gY292ZXJzIGl0LCBhbmQgYSBwZW5kaW5nXG4vLyBgZGlzYWJsZS1uZXh0LWxpbmVgIGNsYWltcyB0aGUgZmlyc3QgbGluZSB3aXRoIGNvbnRlbnQgb24gaXQg4oCUIHRoZSBkaXJlY3RpdmUgYW5kIGl0cyB0YXJnZXQgYXJlIHVzdWFsbHkgYVxuLy8gYmxhbmsgbGluZSBhcGFydC5cbmZ1bmN0aW9uIGFwcGx5RGlyZWN0aXZlU2NhbkxpbmUoc3RhdGU6IERpcmVjdGl2ZVNjYW5TdGF0ZSwgbGluZUluZGV4OiBudW1iZXIsIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtydWxlLCB0YXJnZXRdIG9mIERJUkVDVElWRV9SVUxFX1RBUkdFVFMpIHtcbiAgICBjb25zdCBpc1RhcmdldCA9IGVuc3VyZU5vbk51bGxhYmxlKHN0YXRlLnRhcmdldExpbmVJbmRleGVzQnlSdWxlLmdldChydWxlKSkuaGFzKGxpbmVJbmRleCk7XG4gICAgY29uc3Qgb3BlblJlZ2lvbiA9IHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLmdldChydWxlKTtcbiAgICBpZiAob3BlblJlZ2lvbikge1xuICAgICAgZ2V0T3JDcmVhdGVMaW5lSW5kZXhlcyhzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUsIHJ1bGUpLmFkZChsaW5lSW5kZXgpO1xuICAgICAgb3BlblJlZ2lvbi5pc1VzZWQgfHw9IGlzVGFyZ2V0O1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmdOZXh0TGluZUluZGV4ID0gc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXhlc0J5UnVsZS5nZXQocnVsZSk7XG4gICAgaWYgKHBlbmRpbmdOZXh0TGluZUluZGV4ID09PSB1bmRlZmluZWQgfHwgbGluZS50cmltKCkgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZ2V0T3JDcmVhdGVMaW5lSW5kZXhlcyhzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUsIHJ1bGUpLmFkZChsaW5lSW5kZXgpO1xuICAgIGlmICghaXNUYXJnZXQpIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZS1uZXh0LWxpbmUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHBlbmRpbmdOZXh0TGluZUluZGV4KX0gY292ZXJpbmcgbm8gJHt0YXJnZXR9YCk7XG4gICAgfVxuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGUuZGVsZXRlKHJ1bGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWVtYmVycyhtZXRob2RzOiBzdHJpbmdbXSwgcHJvcGVydGllczogc3RyaW5nW10pOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgcmV0dXJuIHtcbiAgICBhbGw6IFsuLi5tZXRob2RzLCAuLi5wcm9wZXJ0aWVzXSxcbiAgICBtZXRob2RzLFxuICAgIHByb3BlcnRpZXNcbiAgfTtcbn1cblxuLy8gUmVzb2x2ZXMgdGhlIG5vdGVzIGEgbm90ZSBsaW5rcyB0bzogZXZlcnkgTWFya2Rvd24gbGluayBvdXRzaWRlIGEgY29kZSBmZW5jZSB3aG9zZSB0YXJnZXQgaXMgYSBgLm1kYFxuLy8gZmlsZSwgbWFkZSByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBzbyBpdCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBub3RlIG1hcC4gRXh0ZXJuYWwgVVJMcyBhbmRcbi8vIG5vbi1ub3RlIHRhcmdldHMgKGltYWdlcywgc2NyaXB0cykgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsZWFybmluZyBwYXRoIGFuZCBhcmUgc2tpcHBlZDsgYSBgI2FuY2hvcmAgaXNcbi8vIGRyb3BwZWQsIHNpbmNlIGl0IGFkZHJlc3NlcyBhIHBsYWNlIGluc2lkZSBhbiBhbHJlYWR5LXJlc29sdmVkIG5vdGUuXG4vLyBSZXR1cm5zIHRoZSBub3RlJ3MgbGluZXMgd2l0aCBmZW5jZWQgY29kZSBibG9ja3MgcmVtb3ZlZCAodGhlIGZlbmNlIGxpbmVzIGluY2x1ZGVkKSwgcGFpcmVkIHdpdGggdGhlXG4vLyBsaW5lIG51bWJlciBlYWNoIGNhbWUgZnJvbSwgc28gYSBjaGVjayBuZXZlciBtaXN0YWtlcyBzYW1wbGUgY29kZSBmb3IgcHJvc2Ug4oCUIGEgYFtbd2lraWxpbmtdXWBcbi8vIGRlbW9uc3RyYXRlZCBpbnNpZGUgYSBmZW5jZSBpcyB0ZXh0LCBub3QgbmF2aWdhdGlvbiDigJQgYW5kIGFuIGlubGluZSBkaXJlY3RpdmUgY2FuIHN0aWxsIG5hbWUgYSBsaW5lLlxuZnVuY3Rpb24gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBOb3RlTGluZVtdIHtcbiAgY29uc3Qgbm90ZUxpbmVzOiBOb3RlTGluZVtdID0gW107XG4gIGxldCBpc0luc2lkZUZlbmNlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoQ09ERV9GRU5DRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIGlzSW5zaWRlRmVuY2UgPSAhaXNJbnNpZGVGZW5jZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWlzSW5zaWRlRmVuY2UpIHtcbiAgICAgIG5vdGVMaW5lcy5wdXNoKHsgaW5kZXgsIGxpbmUgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3RlTGluZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3ROb3RlTGlua1RhcmdldHMobm90ZTogRGVtb1ZhdWx0Tm90ZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdGFyZ2V0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGdldExpbmVzT3V0c2lkZUZlbmNlcyhub3RlLmNvbnRlbnQpKSB7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBzdHJpcElubGluZUNvZGUobGluZSkubWF0Y2hBbGwoTUFSS0RPV05fTElOS19SRUdfRVhQKSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpLnJlcGxhY2VBbGwoQU5HTEVfQlJBQ0tFVFNfUkVHX0VYUCwgJycpO1xuICAgICAgY29uc3QgW25vdGVQYXRoID0gJyddID0gdGFyZ2V0LnNwbGl0KCcjJywgMSk7XG4gICAgICBpZiAoQUJTT0xVVEVfVVJMX1JFR19FWFAudGVzdChub3RlUGF0aCkgfHwgIW5vdGVQYXRoLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0cy5wdXNoKGpvaW4oZGlybmFtZShub3RlLnJlbGF0aXZlUGF0aCksIHRyeURlY29kZVVyaUNvbXBvbmVudChub3RlUGF0aCkpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldHM7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGNsYXNzQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmNsYXNzQm9keS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgXiB7Mn0oPzxtb2RpZmllcnM+JHtDTEFTU19NRU1CRVJfTU9ESUZJRVJTfSkoPzxuYW1lPlxcdyspKD86PFtePl0qPik/XFwoYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc1Byb3BlcnR5TmFtZXMoY2xhc3NCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uY2xhc3NCb2R5Lm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeIHsyfSg/PG1vZGlmaWVycz4ke0NMQVNTX01FTUJFUl9NT0RJRklFUlN9KSg/PG5hbWU+XFx3KylcXHMqXFw/P1xccypbOj1dYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoZW51bUJvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5lbnVtQm9keS5tYXRjaEFsbCgvXiB7Mn0oPzxuYW1lPlxcdyspL2dtKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbi8vIEEgbWV0aG9kIGlzIGNhbGxhYmxlIHN1cmZhY2UgaG93ZXZlciBpdCBpcyB3cml0dGVuOiBhIG1ldGhvZCBzaWduYXR1cmUgKGBmb28oYmFyOiBzdHJpbmcpOiB2b2lkO2ApIG9yIGFcbi8vIHByb3BlcnR5IHNpZ25hdHVyZSB3aG9zZSB0eXBlIGlzIGEgZnVuY3Rpb24gdHlwZSAoYGZvbzogKGJhcjogc3RyaW5nKSA9PiB2b2lkO2ApLiBUaGUgc2hhcmVkIEVTTGludCBjb25maWdcbi8vIHJ1bnMgYEB0eXBlc2NyaXB0LWVzbGludC9tZXRob2Qtc2lnbmF0dXJlLXN0eWxlYCBhdCBpdHMgYHByb3BlcnR5YCBkZWZhdWx0LCBzbyBgbGludDpmaXhgIHJld3JpdGVzIHRoZVxuLy8gZmlyc3Qgc2hhcGUgaW50byB0aGUgc2Vjb25kIOKAlCByZWFkaW5nIG9ubHkgdGhlIGZpcnN0IHJlcG9ydGVkIHplcm8gbWV0aG9kcyBmb3IgZXZlcnkgc3VjaCBpbnRlcmZhY2UuXG5mdW5jdGlvbiBleHRyYWN0TWV0aG9kTmFtZXMoaW50ZXJmYWNlQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBtZXRob2RTaWduYXR1cmVOYW1lcyA9IFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/PG5hbWU+XFx3KykoPzo8W14+XSo+KT9cXCgvZ20pXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgY29uc3QgZnVuY3Rpb25Qcm9wZXJ0eU5hbWVzID0gbWF0Y2hQcm9wZXJ0eVNpZ25hdHVyZXMoaW50ZXJmYWNlQm9keSlcbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gaXNGdW5jdGlvblR5cGUoaW50ZXJmYWNlQm9keSwgbWF0Y2gpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgcmV0dXJuIFsuLi5tZXRob2RTaWduYXR1cmVOYW1lcywgLi4uZnVuY3Rpb25Qcm9wZXJ0eU5hbWVzXTtcbn1cblxuLy8gRXZlcnkgcHJvcGVydHkgc2lnbmF0dXJlIHdob3NlIHR5cGUgaXMgbm90IGEgZnVuY3Rpb24gdHlwZSwgc28gbWV0aG9kcyBhbmQgcHJvcGVydGllcyBzdGF5IGEgcGFydGl0aW9uLlxuZnVuY3Rpb24gZXh0cmFjdFByb3BlcnR5TmFtZXMoaW50ZXJmYWNlQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gbWF0Y2hQcm9wZXJ0eVNpZ25hdHVyZXMoaW50ZXJmYWNlQm9keSlcbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gIWlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHksIG1hdGNoKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbi8vIFRoZSBoZWFkaW5nIGxpbmVzIG9mIHRoZSBgVHJ5IGl0YCBzZWN0aW9ucyB0aGF0IGhvbGQgbm8gYGNvZGUtYnV0dG9uYC4gQSBzZWN0aW9uIHJ1bnMgdG8gdGhlIG5leHQgaGVhZGluZ1xuLy8gb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwsIHNvIGEgYCMjIyBTdGVwIDFgIGluc2lkZSBhIGAjIyBUcnkgaXRgIHN0YXlzIHBhcnQgb2YgaXQuIEhlYWRpbmdzIGFuZFxuLy8gZmVuY2VzIGluc2lkZSBhIGZlbmNlZCBibG9jayBhcmUgc2FtcGxlIHRleHQsIHNvIG9ubHkgYSBmZW5jZSB0aGF0IE9QRU5TIGEgYmxvY2sgY2FuIGJlIHRoZSBidXR0b24uXG5mdW5jdGlvbiBmaW5kVHJ5SXRMaW5lSW5kZXhlc1dpdGhvdXRDb2RlQnV0dG9uKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgY29uc3QgbGluZUluZGV4ZXM6IG51bWJlcltdID0gW107XG4gIGxldCBzZWN0aW9uOiBudWxsIHwgVHJ5SXRTZWN0aW9uID0gbnVsbDtcbiAgbGV0IGlzSW5zaWRlRmVuY2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpLmVudHJpZXMoKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgaWYgKCFpc0luc2lkZUZlbmNlICYmIHNlY3Rpb24gJiYgQ09ERV9CVVRUT05fRkVOQ0VfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICAgIHNlY3Rpb24uaGFzQ29kZUJ1dHRvbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBpc0luc2lkZUZlbmNlID0gIWlzSW5zaWRlRmVuY2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaGFzaGVzID0gaXNJbnNpZGVGZW5jZSA/IHVuZGVmaW5lZCA6IEhFQURJTkdfTEVWRUxfUkVHX0VYUC5leGVjKGxpbmUpPy5ncm91cHM/LlsnaGFzaGVzJ107XG4gICAgaWYgKGhhc2hlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNlY3Rpb24gJiYgaGFzaGVzLmxlbmd0aCA8PSBzZWN0aW9uLmxldmVsKSB7XG4gICAgICBpZiAoIXNlY3Rpb24uaGFzQ29kZUJ1dHRvbikge1xuICAgICAgICBsaW5lSW5kZXhlcy5wdXNoKHNlY3Rpb24ubGluZUluZGV4KTtcbiAgICAgIH1cbiAgICAgIHNlY3Rpb24gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXNlY3Rpb24gJiYgVFJZX0lUX0hFQURJTkdfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICBzZWN0aW9uID0geyBoYXNDb2RlQnV0dG9uOiBmYWxzZSwgbGV2ZWw6IGhhc2hlcy5sZW5ndGgsIGxpbmVJbmRleDogaW5kZXggfTtcbiAgICB9XG4gIH1cbiAgaWYgKHNlY3Rpb24gJiYgIXNlY3Rpb24uaGFzQ29kZUJ1dHRvbikge1xuICAgIGxpbmVJbmRleGVzLnB1c2goc2VjdGlvbi5saW5lSW5kZXgpO1xuICB9XG4gIHJldHVybiBsaW5lSW5kZXhlcztcbn1cblxuLy8gVGhlIGxpbmUgbnVtYmVycyBjYXJyeWluZyBhIHdpa2lsaW5rIHRoYXQgaXMgbmF2aWdhdGlvbiByYXRoZXIgdGhhbiBzYW1wbGUgdGV4dC5cbmZ1bmN0aW9uIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudClcbiAgICAuZmlsdGVyKChub3RlTGluZSkgPT4gV0lLSUxJTktfUkVHX0VYUC50ZXN0KHN0cmlwSW5saW5lQ29kZShub3RlTGluZS5saW5lKSkpXG4gICAgLm1hcCgobm90ZUxpbmUpID0+IG5vdGVMaW5lLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbGluZSAke1N0cmluZyhsaW5lSW5kZXggKyAxKX1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUcnlJdFdhcm5pbmcoc2VjdGlvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICBgZGVtby12YXVsdCBjb3ZlcmFnZTogJHtTdHJpbmcoc2VjdGlvbnMubGVuZ3RoKX0gVHJ5IGl0IHNlY3Rpb24ocykgaGF2ZSBubyBjb2RlLWJ1dHRvbiB0byBwZXJmb3JtIHRoZWlyIHNldHVwLmAsXG4gICAgYEFkZCBvbmUsIG9yIHN0YXRlIHdoeSB0aGUgc3RlcHMgY2Fubm90IGJlIHNjcmlwdGVkIHdpdGggPCEtLSBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZS1uZXh0LWxpbmUgJHtUUllfSVRfUlVMRX0gLS0gPHJlYXNvbj4gLS0+IGFib3ZlIHRoZSBoZWFkaW5nLmAsXG4gICAgLi4uc2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiBgICAke3NlY3Rpb259YClcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxsb3dlZExpbmVJbmRleGVzKHNjYW46IERpcmVjdGl2ZVNjYW4sIHJ1bGU6IHN0cmluZyk6IFJlYWRvbmx5U2V0PG51bWJlcj4ge1xuICByZXR1cm4gc2Nhbi5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUuZ2V0KHJ1bGUpID8/IG5ldyBTZXQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZXNPdXRzaWRlRmVuY2VzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudCkubWFwKChub3RlTGluZSkgPT4gbm90ZUxpbmUubGluZSk7XG59XG5cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlTGluZUluZGV4ZXMobGluZUluZGV4ZXNCeVJ1bGU6IE1hcDxzdHJpbmcsIFNldDxudW1iZXI+PiwgcnVsZTogc3RyaW5nKTogU2V0PG51bWJlcj4ge1xuICBsZXQgbGluZUluZGV4ZXMgPSBsaW5lSW5kZXhlc0J5UnVsZS5nZXQocnVsZSk7XG4gIGlmICghbGluZUluZGV4ZXMpIHtcbiAgICBsaW5lSW5kZXhlcyA9IG5ldyBTZXQoKTtcbiAgICBsaW5lSW5kZXhlc0J5UnVsZS5zZXQocnVsZSwgbGluZUluZGV4ZXMpO1xuICB9XG4gIHJldHVybiBsaW5lSW5kZXhlcztcbn1cblxuLy8gV2hldGhlciB0aGUgbm90ZSdzIGZpcnN0IGNvbnRlbnQgbGluZSAoZnJvbnRtYXR0ZXIgYW5kIGJsYW5rIGxpbmVzIGFzaWRlKSBpcyBhbiBgIyBIMWAuXG5mdW5jdGlvbiBoYXNIMShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZExpbmUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIEgxX1JFR19FWFAudGVzdCh0cmltbWVkTGluZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIGEgcGxhaW4gcHJvc2UgbGluZSBhcHBlYXJzIGJlZm9yZSB0aGUgbm90ZSdzIGZpcnN0IGNvZGUgZmVuY2UuIEhlYWRpbmdzIGFyZSBub3QgcHJvc2Ug4oCUIGEgbm90ZVxuLy8gdGhhdCBnb2VzIHN0cmFpZ2h0IGZyb20gaXRzIHRpdGxlIHRvIGEgYnV0dG9uIGlzIGV4YWN0bHkgdGhlIHNoYXBlIHRoaXMgY2hlY2sgcmVqZWN0cy5cbmZ1bmN0aW9uIGhhc0ludHJvUHJvc2UoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBzdHJpcEZyb250bWF0dGVyKGNvbnRlbnQpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICh0cmltbWVkTGluZSA9PT0gJycgfHwgSEVBRElOR19SRUdfRVhQLnRlc3QodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBub3RlIG5hdmlnYXRlcyB3aXRoIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gLiBGZW5jZWQgYmxvY2tzIGFuZCBpbmxpbmUgY29kZSBhcmUgc2FtcGxlXG4vLyB0ZXh0IHJhdGhlciB0aGFuIG5hdmlnYXRpb24sIHNvIHRoZXkgYXJlIHJlbW92ZWQgYmVmb3JlIGxvb2tpbmcuXG5mdW5jdGlvbiBoYXNXaWtpbGluayhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpLmxlbmd0aCA+IDA7XG59XG5cbi8vIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNpZ25hdHVyZSdzIHR5cGUsIHN0YXJ0aW5nIHJpZ2h0IGFmdGVyIGl0cyBgOmAsIGlzIGEgZnVuY3Rpb24gdHlwZTogYW4gb3B0aW9uYWwgdHlwZVxuLy8gcGFyYW1ldGVyIGxpc3QsIGEgcGFyYW1ldGVyIGxpc3QsIHRoZW4gYD0+YC4gVGhlIHBhcmFtZXRlciBsaXN0IGlzIHdhbGtlZCBieSBicmFja2V0IGRlcHRoIHJhdGhlciB0aGFuIGJ5IGFcbi8vIHJlZ3VsYXIgZXhwcmVzc2lvbiwgc28gYSBwYXJlbnRoZXNpemVkIG5vbi1mdW5jdGlvbiB0eXBlIChgKHN0cmluZyB8IG51bWJlcilbXWApIGFuZCBhIHBhcmFtZXRlciB3aG9zZSBvd25cbi8vIHR5cGUgaG9sZHMgcGFyZW50aGVzZXMgKGAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWRgKSBhcmUgYm90aCByZWFkIGNvcnJlY3RseSwgYWNyb3NzIGxpbmVzIHRvby5cbmZ1bmN0aW9uIGlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHk6IHN0cmluZywgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSk6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgaW5kZXggKz0gRlVOQ1RJT05fVFlQRV9QQVJBTUVURVJTX1JFR19FWFAuZXhlYyhpbnRlcmZhY2VCb2R5LnNsaWNlKGluZGV4KSk/LlswXS5sZW5ndGggPz8gMDtcbiAgaWYgKGludGVyZmFjZUJvZHlbaW5kZXhdICE9PSAnKCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGRlcHRoID0gMDtcbiAgZm9yICg7IGluZGV4IDwgaW50ZXJmYWNlQm9keS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBpbnRlcmZhY2VCb2R5W2luZGV4XTtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnKCcpIHtcbiAgICAgIGRlcHRoKys7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZGVwdGgtLTtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQVJST1dfUkVHX0VYUC50ZXN0KGludGVyZmFjZUJvZHkuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNOb25QdWJsaWNNZW1iZXIobW9kaWZpZXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGIoPzpwcml2YXRlfHByb3RlY3RlZClcXGIvLnRlc3QobW9kaWZpZXJzKTtcbn1cblxuLy8gYHJlYWRvbmx5YCBpcyB0aGUgb25seSBtb2RpZmllciBhIHByb3BlcnR5IHNpZ25hdHVyZSB0YWtlcywgYW5kIGEgbWV0aG9kIHNpZ25hdHVyZSB0YWtlcyBub25lIOKAlCBUeXBlU2NyaXB0XG4vLyByZWplY3RzIGByZWFkb25seSBmb28oKTogdm9pZDtgIOKAlCBzbyB0aGUgbWV0aG9kLXNpZ25hdHVyZSByZWdleCBuZWVkcyBubyBjb3VudGVycGFydC5cbmZ1bmN0aW9uIG1hdGNoUHJvcGVydHlTaWduYXR1cmVzKGludGVyZmFjZUJvZHk6IHN0cmluZyk6IFJlZ0V4cEV4ZWNBcnJheVtdIHtcbiAgcmV0dXJuIFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/OnJlYWRvbmx5XFxzKyk/KD88bmFtZT5cXHcrKVxcPz86XFxzKi9nbSldO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1lbWJlcnMoa2V5d29yZDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgc3dpdGNoIChrZXl3b3JkKSB7XG4gICAgY2FzZSAnY2xhc3MnOiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGJvZHkpLCBleHRyYWN0Q2xhc3NQcm9wZXJ0eU5hbWVzKGJvZHkpKTtcbiAgICB9XG4gICAgY2FzZSAnZW51bSc6IHtcbiAgICAgIHJldHVybiBidWlsZE1lbWJlcnMoW10sIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoYm9keSkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RNZXRob2ROYW1lcyhib2R5KSwgZXh0cmFjdFByb3BlcnR5TmFtZXMoYm9keSkpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBSZWFkcyB0aGUgbm90ZSdzIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGRlY2xhcmF0aW9uOiB0aGUgc3RhdGVkXG4vLyByZWFzb24sIGAnJ2Agd2hlbiB0aGUga2V5IGlzIHByZXNlbnQgd2l0aCBub3RoaW5nIGFmdGVyIGl0LCBvciBgbnVsbGAgd2hlbiB0aGUgbm90ZSBkZWNsYXJlcyBub3RoaW5nLlxuLy8gUmVhZCB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uIHJhdGhlciB0aGFuIGEgWUFNTCBwYXJzZXI6IGl0IGlzIG9uZSBrbm93biBrZXkgcGF0aCwgYW5kIGV2ZXJ5IHBsdWdpbiB0aGF0XG4vLyBpbnN0YWxscyB0aGlzIHBhY2thZ2Ugd291bGQgb3RoZXJ3aXNlIGNhcnJ5IGEgWUFNTCBkZXBlbmRlbmN5IGZvciBpdC5cbmZ1bmN0aW9uIHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihjb250ZW50OiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBGUk9OVE1BVFRFUl9SRUdfRVhQLmV4ZWMoY29udGVudCk/LlswXTtcbiAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCByZWFzb24gPSBXSUtJTElOS19BTExPV0FOQ0VfUkVHX0VYUC5leGVjKGZyb250bWF0dGVyKT8uZ3JvdXBzPy5bJ3JlYXNvbiddO1xuICByZXR1cm4gcmVhc29uID09PSB1bmRlZmluZWQgPyBudWxsIDogcmVhc29uLnRyaW0oKS5yZXBsYWNlKC9eKD88cXVvdGU+W1wiJ10pKD88dmFsdWU+W1xcc1xcU10qKVxcazxxdW90ZT4kLywgJyQ8dmFsdWU+Jyk7XG59XG5cbi8vIFJlYWRzIHRoZSBub3RlJ3MgaW5saW5lIGBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZeKApmAgZGlyZWN0aXZlcywgcmV0dXJuaW5nIHdoaWNoIGxpbmVzIHRoZXkgZXhlbXB0IGZyb21cbi8vIGVhY2ggcnVsZSBhbmQgZXZlcnl0aGluZyB3cm9uZyB3aXRoIHRoZW0uIEEgc3VwcHJlc3Npb24gdGhhdCBxdWlldGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vbmUsIHNvXG4vLyBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlLCBvbmUgd2l0aCBubyByZWFzb24sIGFuIHVuY2xvc2VkIHJlZ2lvbiBhbmQgb25lIGNvdmVyaW5nIG5vdGhpbmcgdGhhdCBicmVha3MgaXRzXG4vLyBydWxlIGFyZSBlYWNoIHJlcG9ydGVkIHJhdGhlciB0aGFuIGlnbm9yZWQuXG5mdW5jdGlvbiBzY2FuRGlyZWN0aXZlcyhjb250ZW50OiBzdHJpbmcpOiBEaXJlY3RpdmVTY2FuIHtcbiAgY29uc3Qgc3RhdGU6IERpcmVjdGl2ZVNjYW5TdGF0ZSA9IHtcbiAgICBhbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoKSxcbiAgICBvcGVuUmVnaW9uc0J5UnVsZTogbmV3IE1hcCgpLFxuICAgIHBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoKSxcbiAgICBwcm9ibGVtczogW10sXG4gICAgdGFyZ2V0TGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoW1xuICAgICAgW1RSWV9JVF9SVUxFLCBuZXcgU2V0KGZpbmRUcnlJdExpbmVJbmRleGVzV2l0aG91dENvZGVCdXR0b24oY29udGVudCkpXSxcbiAgICAgIFtXSUtJTElOS19SVUxFLCBuZXcgU2V0KGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpKV1cbiAgICBdKVxuICB9O1xuXG4gIGZvciAoY29uc3QgeyBpbmRleCwgbGluZSB9IG9mIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudCkpIHtcbiAgICBjb25zdCBtYXRjaCA9IERJUkVDVElWRV9SRUdfRVhQLmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBhcHBseURpcmVjdGl2ZShzdGF0ZSwgaW5kZXgsIG1hdGNoKTtcbiAgICB9IGVsc2UgaWYgKERJUkVDVElWRV9QUk9CRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgbWFsZm9ybWVkIGRpcmVjdGl2ZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoaW5kZXgpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBseURpcmVjdGl2ZVNjYW5MaW5lKHN0YXRlLCBpbmRleCwgbGluZSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBvcGVuUmVnaW9uIG9mIHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLnZhbHVlcygpKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihvcGVuUmVnaW9uLmxpbmVJbmRleCl9IHRoYXQgaXMgbmV2ZXIgZW5hYmxlZCBhZ2FpbmApO1xuICB9XG4gIGZvciAoY29uc3QgW3J1bGUsIHBlbmRpbmdOZXh0TGluZUluZGV4XSBvZiBzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleGVzQnlSdWxlKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlLW5leHQtbGluZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIocGVuZGluZ05leHRMaW5lSW5kZXgpfSBjb3ZlcmluZyBubyAke2Vuc3VyZU5vbk51bGxhYmxlKERJUkVDVElWRV9SVUxFX1RBUkdFVFMuZ2V0KHJ1bGUpKX1gKTtcbiAgfVxuICByZXR1cm4geyBhbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGU6IHN0YXRlLmFsbG93ZWRMaW5lSW5kZXhlc0J5UnVsZSwgcHJvYmxlbXM6IHN0YXRlLnByb2JsZW1zIH07XG59XG5cbmZ1bmN0aW9uIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShGUk9OVE1BVFRFUl9SRUdfRVhQLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwSW5saW5lQ29kZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKElOTElORV9DT0RFX1JFR19FWFAsICcnKTtcbn1cblxuLy8gQSBoYW5kLXdyaXR0ZW4gbGluayBtYXkgY29udGFpbiBhIGJhcmUgYCVgIChvciBhbnkgb3RoZXIgaW52YWxpZCBwZXJjZW50LWVzY2FwZSksIHdoaWNoIG1ha2VzXG4vLyBgZGVjb2RlVVJJQ29tcG9uZW50YCB0aHJvdy4gU3VjaCBhIHRhcmdldCBpcyBtZWFudCBsaXRlcmFsbHksIHNvIGl0IGlzIHVzZWQgYXMgd3JpdHRlbi5cbmZ1bmN0aW9uIHRyeURlY29kZVVyaUNvbXBvbmVudCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnaoumov/obsidian-dev-toolkit",
3
- "version": "3.3.0",
3
+ "version": "3.4.0",
4
4
  "description": "Tooling for Obsidian plugin development: the plugin builder for esbuild, vite, rollup, webpack and parcel, shared ESLint/Vitest configs, demo vaults and the release script.",
5
5
  "keywords": [
6
6
  "obsidian",