ember-scoped-css 1.0.0 → 1.0.2

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.
package/README.md CHANGED
@@ -50,9 +50,9 @@ This build tool can emit CSS in a `@layer`.
50
50
  ## Compatibility
51
51
 
52
52
  - Vite
53
- - V2 addons
54
- - non-embroider apps
55
- - embroider apps
53
+ - V2 addons with `@embroider/addon-dev` @ v8+ (or similar)
54
+
55
+ For [bugfixes for the pre-ember-scoped-css-1.0 code, PR here](https://github.com/auditboard/ember-scoped-css/tree/hbs-classic-and-webpack-support)
56
56
 
57
57
  | You Have | ember-scoped-css | ember-scoped-css-compat | docs |
58
58
  | -------- | ----------- | ---------------------- | --- |
@@ -0,0 +1,2 @@
1
+ export function rewriteCss(css: any, postfix: any, fileName: any, layerName: any): string;
2
+ //# sourceMappingURL=rewrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewrite.d.ts","sourceRoot":"","sources":["../../../src/lib/css/rewrite.js"],"names":[],"mappings":"AAsFA,0FA8GC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rewrite.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewrite.test.d.ts","sourceRoot":"","sources":["../../../src/lib/css/rewrite.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @param {string} css
3
+ * @return {string} hashed down version of the CSS for disambiguating
4
+ */
5
+ export function hash(css: string): string;
6
+ export function isInsideGlobal(node: any, func: any): boolean;
7
+ /**
8
+ * @param {string} cssPath path to a CSS file
9
+ */
10
+ export function getCSSInfo(cssPath: string): {
11
+ classes: Set<string>;
12
+ tags: Set<string>;
13
+ css: string;
14
+ id: string;
15
+ } | null;
16
+ /**
17
+ * We use this function to check each class used in the template
18
+ * to see if we need to leave it alone or transform it
19
+ *
20
+ * @param {string} css the CSS's contents
21
+ * @return {{ classes: Set<string>, tags: Set<string>, css: string, id: string }}
22
+ */
23
+ export function getCSSContentInfo(css: string): {
24
+ classes: Set<string>;
25
+ tags: Set<string>;
26
+ css: string;
27
+ id: string;
28
+ };
29
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/css/utils.js"],"names":[],"mappings":"AAMA;;;GAGG;AACH,0BAHW,MAAM,GACL,MAAM,CAIjB;AAED,8DAOC;AAED;;GAEG;AACH,oCAFW,MAAM;aAiBM,GAAG,CAAC,MAAM,CAAC;UAAQ,GAAG,CAAC,MAAM,CAAC;SAAO,MAAM;QAAM,MAAM;SAP7E;AAED;;;;;;GAMG;AACH,uCAHW,MAAM,GACL;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAiB/E"}
@@ -468,7 +468,7 @@ function decodeScopedCSSRequest(request) {
468
468
  let params = parse(request);
469
469
  return {
470
470
  postfix: params.from,
471
- css: decodeURIComponent(params.css),
471
+ css: params.css,
472
472
  cssId: params.cssId
473
473
  };
474
474
  }
@@ -552,12 +552,31 @@ function getClassesAndTags(sel, classes, tags) {
552
552
  }
553
553
 
554
554
  // src/lib/css/rewrite.js
555
+ var SEP = "__";
556
+ function isRule(node) {
557
+ return node.type === "rule";
558
+ }
559
+ function isDeclaration(node) {
560
+ return node.type === "decl";
561
+ }
562
+ function rewriteReferencable(node, postfix) {
563
+ let originalName = node.params;
564
+ let postfixedName = node.params + SEP + postfix;
565
+ node.params = postfixedName;
566
+ return {
567
+ originalName,
568
+ postfixedName
569
+ };
570
+ }
555
571
  function rewriteSelector(sel, postfix) {
556
572
  const transform = (selectors) => {
557
573
  selectors.walk((selector) => {
558
- if (selector.type === "class" && !isInsideGlobal(selector)) {
574
+ if (isInsideGlobal(selector)) return;
575
+ if (selector.type === "psuedo") return;
576
+ if (isNthOfType(selector)) return;
577
+ if (selector.type === "class") {
559
578
  selector.value += "_" + postfix;
560
- } else if (selector.type === "tag" && !isInsideGlobal(selector)) {
579
+ } else if (selector.type === "tag") {
561
580
  selector.replaceWith(
562
581
  import_postcss_selector_parser2.default.tag({ value: selector.value }),
563
582
  import_postcss_selector_parser2.default.className({ value: postfix })
@@ -573,6 +592,10 @@ function rewriteSelector(sel, postfix) {
573
592
  const transformed = (0, import_postcss_selector_parser2.default)(transform).processSync(sel);
574
593
  return transformed;
575
594
  }
595
+ function isNthOfType(node) {
596
+ if (!node) return false;
597
+ return node.parent?.value === ":nth-of-type" || isNthOfType(node.parent);
598
+ }
576
599
  function isInsideKeyframes(node) {
577
600
  const parent = node.parent;
578
601
  if (!parent) return false;
@@ -582,9 +605,61 @@ function isInsideKeyframes(node) {
582
605
  function rewriteCss(css, postfix, fileName, layerName) {
583
606
  const layerNameWithDefault = layerName ?? "components";
584
607
  const ast = import_postcss2.default.parse(css);
608
+ const referencables = {
609
+ keyframes: {},
610
+ "counter-style": {},
611
+ "position-try": {},
612
+ property: {}
613
+ };
614
+ const availableReferencables = new Set(Object.keys(referencables));
615
+ function isReferencable(node) {
616
+ if (node.type !== "atrule") return;
617
+ return availableReferencables.has(node.name);
618
+ }
619
+ function updateDirectReferences(node) {
620
+ if (!node.value) return;
621
+ for (let [, map] of Object.entries(referencables)) {
622
+ if (map[node.value]) {
623
+ node.value = map[node.value];
624
+ }
625
+ }
626
+ }
627
+ function updateShorthandContents(node) {
628
+ if (node.prop === "animation") {
629
+ let parts = node.value.split(" ");
630
+ let match = parts.filter((x) => referencables.keyframes[x]);
631
+ if (match.length) {
632
+ match.forEach((x) => {
633
+ let replacement = referencables.keyframes[x];
634
+ if (!replacement) return;
635
+ node.value = node.value.replace(x, replacement);
636
+ });
637
+ }
638
+ }
639
+ for (let [lookFor, replaceWith] of Object.entries(referencables.property)) {
640
+ let lookForVar = `var(${lookFor})`;
641
+ let replaceWithVar = `var(${replaceWith})`;
642
+ node.value = node.value.replace(lookForVar, replaceWithVar);
643
+ }
644
+ }
585
645
  ast.walk((node) => {
586
- if (node.type === "rule" && !isInsideKeyframes(node)) {
646
+ if (isReferencable(node)) {
647
+ let name = node.name;
648
+ let { originalName, postfixedName } = rewriteReferencable(node, postfix);
649
+ referencables[name][originalName] = postfixedName;
650
+ return;
651
+ }
652
+ });
653
+ ast.walk((node) => {
654
+ if (isDeclaration(node)) {
655
+ updateDirectReferences(node);
656
+ updateShorthandContents(node);
657
+ return;
658
+ }
659
+ if (isRule(node)) {
660
+ if (isInsideKeyframes(node)) return;
587
661
  node.selector = rewriteSelector(node.selector, postfix);
662
+ return;
588
663
  }
589
664
  });
590
665
  const rewrittenCss = ast.toString();
@@ -861,4 +936,4 @@ var rollupPlugin = scoped_css_unplugin_default.rollup;
861
936
  scopedCssUnplugin,
862
937
  templatePlugin
863
938
  });
864
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2luZGV4LmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC91dGlscy5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvbWQ1LmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMiLCAiLi4vLi4vc3JjL2J1aWxkL2JhYmVsLXBsdWdpbi5qcyIsICIuLi8uLi9zcmMvYnVpbGQvc2NvcGVkLWNzcy11bnBsdWdpbi5qcyIsICIuLi8uLi9zcmMvbGliL3JlcXVlc3QuanMiLCAiLi4vLi4vc3JjL2xpYi9jc3MvcmV3cml0ZS5qcyIsICIuLi8uLi9zcmMvbGliL2Nzcy91dGlscy5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvdGVtcGxhdGUtdHJhbnNmb3JtLXBhdGhzLmpzIiwgIi4uLy4uL3NyYy9saWIvcmV3cml0ZUhicy5qcyIsICIuLi8uLi9zcmMvbGliL3JlbmFtZUNsYXNzLmpzIiwgIi4uLy4uL3NyYy9idWlsZC90ZW1wbGF0ZS1wbHVnaW4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IGRlZmF1bHQgYXMgYmFiZWxQbHVnaW4gfSBmcm9tICcuL2JhYmVsLXBsdWdpbi5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHNjb3BlZENzc1VucGx1Z2luIH0gZnJvbSAnLi9zY29wZWQtY3NzLXVucGx1Z2luLmpzJztcbmV4cG9ydCB7IGNyZWF0ZVBsdWdpbiBhcyB0ZW1wbGF0ZVBsdWdpbiB9IGZyb20gJy4vdGVtcGxhdGUtcGx1Z2luLmpzJztcblxuaW1wb3J0IHsgZGVmYXVsdCBhcyBzY29wZWRDc3NVbnBsdWdpbiB9IGZyb20gJy4vc2NvcGVkLWNzcy11bnBsdWdpbi5qcyc7XG5cbmV4cG9ydCBjb25zdCByb2xsdXBQbHVnaW4gPSBzY29wZWRDc3NVbnBsdWdpbi5yb2xsdXA7XG4iLCAiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgZnNTeW5jLCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuaW1wb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5leHBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuZXhwb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5jb25zdCBDT01QT05FTlRfRVhURU5TSU9OUyA9IFsnLmd0cycsICcuZ2pzJywgJy50cycsICcuanMnLCAnLmhicyddO1xuXG4vLyBDSlMgLyBFU00/XG5sZXQgaGVyZSA9IGltcG9ydC5tZXRhLnVybDtcbmxldCBvdXJSZXF1aXJlID0gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gID8gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gIDogaGVyZSAmJiBjcmVhdGVSZXF1aXJlKGhlcmUpO1xuXG5pZiAoIW91clJlcXVpcmUpIHtcbiAgb3VyUmVxdWlyZSA9IHJlcXVpcmU7XG59XG5cbmNvbnN0IElSUkVMRVZBTlRfUEFUSFMgPSBbJ25vZGVfbW9kdWxlcy8ucG5wbScsICdfX3ZpdGUtJ107XG5jb25zdCBVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUyA9IG5ldyBTZXQoWyd0ZXN0cyddKTtcblxuY29uc3QgQ1dEID0gcHJvY2Vzcy5jd2QoKTtcblxuLyoqXG4gKiBSZWdhcmRsZXNzIG9mIHdoYXQgdGhlIGZpbGVQYXRoIGZvcm1hdCBpcyxcbiAqIHRoaXMgd2lsbCB0cnkgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHBvc3RmaXguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaEZyb20oZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBoYXNoRnJvbUFic29sdXRlUGF0aChmaWxlUGF0aCk7XG4gIH1cblxuICByZXR1cm4gaGFzaEZyb21Nb2R1bGVQYXRoKGZpbGVQYXRoKTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzSGFzQXNzb2NpYXRlZENvbXBvbmVudChjc3NQYXRoKSB7XG4gIHJldHVybiBjc3NIYXNTdGFuZGFyZEZpbGUoY3NzUGF0aCkgfHwgY3NzSGFzUG9kc0ZpbGUoY3NzUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGNzc0hhc1N0YW5kYXJkRmlsZShpZCkge1xuICAvKipcbiAgICogTm9ybWFsbHkgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBhIEpTIHBhdGggaGVyZSwgYnV0IHdoZW4gdXNpbmdcbiAgICogZW1icm9pZGVyQDMsIHdlIGhhdmUgYSBcInJld3JpdHRlbiBhcHBcIiwgd2hpY2ggaGFzIGFsbCBvdXIgc291cmNlXG4gICAqIHByZXByb2Nlc3NlZCBhIGJpdCBiZWZvcmUgc2NvcGVkLWNzcyB0cmFuc2Zvcm1hdGlvbnMuXG4gICAqXG4gICAqIChJbiBWaXRlLCB3ZSBvcGVyYXRlIG1vcmUgZGlyZWN0bHkgd2l0aCB0aGUgc291cmNlKVxuICAgKi9cbiAgZm9yIChsZXQgZXh0IG9mIENPTVBPTkVOVF9FWFRFTlNJT05TKSB7XG4gICAgbGV0IGNhbmRpZGF0ZVBhdGggPSBpZC5yZXBsYWNlKC9cXC5jc3MkLywgZXh0KTtcblxuICAgIGlmIChleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNzc0hhc1BvZHNGaWxlKGlkKSB7XG4gIGlmICghaWQuZW5kc1dpdGgoJ3N0eWxlcy5jc3MnKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxseSB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGEgSlMgcGF0aCBoZXJlLCBidXQgd2hlbiB1c2luZ1xuICAgKiBlbWJyb2lkZXJAMywgd2UgaGF2ZSBhIFwicmV3cml0dGVuIGFwcFwiLCB3aGljaCBoYXMgYWxsIG91ciBzb3VyY2VcbiAgICogcHJlcHJvY2Vzc2VkIGEgYml0IGJlZm9yZSBzY29wZWQtY3NzIHRyYW5zZm9ybWF0aW9ucy5cbiAgICpcbiAgICogKEluIFZpdGUsIHdlIG9wZXJhdGUgbW9yZSBkaXJlY3RseSB3aXRoIHRoZSBzb3VyY2UpXG4gICAqL1xuICBmb3IgKGxldCBleHQgb2YgQ09NUE9ORU5UX0VYVEVOU0lPTlMpIHtcbiAgICBsZXQgY2FuZGlkYXRlUGF0aCA9IGlkLnJlcGxhY2UoL3N0eWxlc1xcLmNzcyQvLCBgdGVtcGxhdGUke2V4dH1gKTtcblxuICAgIGlmIChleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQmFzZWQgb24gZW1iZXIncyBjb21wb25lbnQgbG9jYXRpb24gY29udmVudGlvbnMsXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSBhIHBhdGggZm9yIHdoZXJlIHdlXG4gKiBleHBlY3QgdGhlIENTUyB0byBsaXZlLlxuICpcbiAqIEZvciBjby1sb2NhdGVkIHN0cnVjdHVyZTpcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC5oYnNcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC5jc3NcbiAqXG4gKiBGb3IgbmVzdGVkIGNvLWxvY2F0ZWQgc3RydWN0dXJlXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQvZm9vLmhic1xuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50L2Zvby5jc3NcbiAqXG4gKiBGb3IgUG9kcyByb3V0ZXMgc3RydWN0dXJlXG4gKiAgIC0gcm91dGVzL215LXJvdXRlL3RlbXBsYXRlLntoYnMsanN9XG4gKiAgIC0gcm91dGVzL215LXJvdXRlL3N0eWxlcy5jc3NcbiAqXG4gKiBEZWxpYmVyYXRlbHkgbm90IHN1cHBvcnRlZDpcbiAqICAgLSBjb21wb25lbnRzIHcvIHBvZHMgLS0gdGhpcyBpcyBkZXByZWNhdGVkIGluIDUuMTBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWUgLSB0aGUgaGJzLCBqcywgZ2pzLCBndHMgb3Igd2hhdGV2ZXIgY28tbG9jYXRlZCBwYXRoLlxuICogQHJldHVybnMge3N0cmluZ30gLSBleHBlY3RlZCBjc3MgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzUGF0aEZvcihmaWxlTmFtZSkge1xuICBsZXQgd2l0aG91dEV4dCA9IHdpdGhvdXRFeHRlbnNpb24oZmlsZU5hbWUpO1xuICBsZXQgY3NzUGF0aCA9IHdpdGhvdXRFeHQgKyAnLmNzcyc7XG5cbiAgaWYgKGlzUG9kKGZpbGVOYW1lKSkge1xuICAgIGNzc1BhdGggPSBmaWxlTmFtZVxuICAgICAgLnJlcGxhY2UoL3RlbXBsYXRlXFwuanMkLywgJ3N0eWxlcy5jc3MnKVxuICAgICAgLnJlcGxhY2UoL3RlbXBsYXRlXFwuaGJzLywgJ3N0eWxlcy5jc3MnKTtcbiAgfVxuXG4gIHJldHVybiBjc3NQYXRoO1xufVxuXG4vKipcbiAqIE5vdGUgdGhhdCBjb21wb25lbnRzIGluIHRoZSBcInBvZHNcIiBjb252ZW50aW9uIHdpbGxcbiAqIG5ldmVyIGJlIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG9kVGVtcGxhdGUoZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLmluY2x1ZGVzKCcvY29tcG9uZW50cy8nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aCgndGVtcGxhdGUuanMnKSB8fCBmaWxlUGF0aC5lbmRzV2l0aCgndGVtcGxhdGUuaGJzJyk7XG59XG5cbi8qKlxuICogTm90ZSB0aGF0IGNvbXBvbmVudHMgaW4gdGhlIFwicG9kc1wiIGNvbnZlbnRpb24gd2lsbFxuICogbmV2ZXIgYmUgc3VwcG9ydGVkLlxuICpcbiAqIENoZWNrcyBpZiBhIGZpbGUgZW5kcyB3aXRoXG4gKiAtIHRlbXBsYXRlLmpzXG4gKiAtIHRlbXBsYXRlLmhic1xuICogLSBzdHlsZXMuY3NzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BvZChmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoJy9jb21wb25lbnRzLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzUG9kVGVtcGxhdGUoZmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguZW5kc1dpdGgoJ3N0eWxlcy5jc3MnKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKiBAcmV0dXJucyB0aGUgc2FtZSBwYXRoLCBidXQgd2l0aG91dCB0aGUgZXh0ZW5zaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRob3V0RXh0ZW5zaW9uKGZpbGVQYXRoKSB7XG4gIGxldCBwYXJzZWQgPSBwYXRoLnBhcnNlKGZpbGVQYXRoKTtcblxuICByZXR1cm4gcGF0aC5qb2luKHBhcnNlZC5kaXIsIHBhcnNlZC5uYW1lKTtcbn1cblxuLyoqXG4gKiBFeGFtcGxlcyBmb3IgZmlsZU5hbWVcbiAqIC0gYWJzb2x1dGUgb24tZGlzayBwYXRoXG4gKiAtIGluIHdlYnBhY2tcbiAqICAgLSBVUkwtYWJzb2x1dGUgcGF0aCwgc3RhcnRpbmcgd2l0aCAvXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lXG4gKiBAcGFyYW0ge3sgYWRkaXRpb25hbFJvb3RzPzogc3RyaW5nW107IGN3ZDogc3RyaW5nIH19IG9wdGlvbnNcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGV2YW50RmlsZShmaWxlTmFtZSwgeyBhZGRpdGlvbmFsUm9vdHMsIGN3ZCB9KSB7XG4gIC8vIEZha2UgZmlsZSBoYW5kbGVkIGJ5IHRlc3RlbSBzZXJ2ZXIgd2hlbiBpdCBydW5zXG4gIGlmIChmaWxlTmFtZS5zdGFydHNXaXRoKCcvdGVzdGVtJykpIHJldHVybiBmYWxzZTtcbiAgLy8gUHJpdmF0ZSBWaXJ0dWFsIE1vZHVsZXNcbiAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ1xcMCcpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZXNlIGFyZSBub3QgdmFsaWQgdXNlcmxhbmQgbmFtZXMgKG9yIGFyZSBmcm9tIGxpYnJhcmllcylcbiAgaWYgKGZpbGVOYW1lLm1hdGNoKC9eW2EtekEtWl0vKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBFeHRlcm5hbCB0byB1c1xuICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnL0BlbWJyb2lkZXInKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoSVJSRUxFVkFOVF9QQVRIUy5zb21lKChpKSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhpKSkpIHJldHVybiBmYWxzZTtcblxuICBsZXQgd29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoZmlsZU5hbWUpO1xuXG4gIGFzc2VydChjd2QsIGBjd2Qgd2FzIG5vdCBwYXNzZWQgdG8gaXNSZWxldmFudEZpbGVgKTtcblxuICBsZXQgb3VyV29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoY3dkKTtcblxuICBpZiAod29ya3NwYWNlICE9PSBvdXJXb3Jrc3BhY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgbG9jYWwgPSBmaWxlTmFtZS5yZXBsYWNlKHdvcmtzcGFjZSwgJycpO1xuICBsZXQgWywgLi4ucGFydHNdID0gbG9jYWwuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKFVOU1VQUE9SVEVEX0RJUkVDVE9SSUVTLmhhcyhwYXJ0c1swXSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IHBvZHMgc3VwcG9ydC5cbiAgICogZm9sa3MgbmVlZCB0byBvcHQgaW4gdG8gcG9kcyAocm91dGVzKSwgYmVjYXVzZSBldmVyeSBwb2RzIGFwcCBjYW4gYmUgY29uZmlndXJlZCBkaWZmZXJlbnRseVxuICAgKi9cbiAgbGV0IHJvb3RzID0gWycvY29tcG9uZW50cy8nLCAnL3RlbXBsYXRlcy8nLCAuLi4oYWRkaXRpb25hbFJvb3RzIHx8IFtdKV07XG5cbiAgaWYgKCFyb290cy5zb21lKChyb290KSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhyb290KSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHBhY2thZ2VTY29wZWRQYXRoKSB7XG4gIC8qKlxuICAgKiAqQnkgY29udmVudGlvbiosIGBzcmNgIGlzIG9taXR0ZWQgZnJvbSBjb21wb25lbnQgcGF0aHMuXG4gICAqIFdlIGNhbiByZWZsZWN0IHRoZSBzYW1lIGJlaGF2aW9yIGJ5IHJlcGxhY2luZyBzcmMvXG4gICAqIHdpdGggYW4gZW1wdHkgc3RyaW5nLlxuICAgKlxuICAgKiBDU1MgaXNuJ3QgZW1pdHRlZCBhcyBhIGNvLWxvY2F0ZWQgbW9kdWxlLCBidXRcbiAgICogdG8ga2VlcCBjb252ZW50aW9ucyBjb25zaXN0ZW50IGFjcm9zcyBsYW5ndWFnZXMsXG4gICAqIHdlIGNhbiBwcmV0ZW5kIGl0IGlzLlxuICAgKlxuICAgKiBBbnkgY3VzdG9taXphdGlvbiBiZXlvbmQgcmVtb3ZpbmcgYHNyY2AgYW5kIGBhcHBgIGlzIHBvdGVudGlhbGx5IGNvbmZ1c2luZy5cbiAgICogSWYgd2UgbmVlZCBmdXJ0aGVyIGN1c3RvbWl6YXRpb25zLCB3ZSdsbCB3YW50IHRvIG1hdGNoIG9uIGBleHBvcnRzYCBpbiB0aGVcbiAgICogY29ycmVzcG9uZGluZyBwYWNrYWdlLmpzb25cbiAgICovXG4gIGxldCBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlU2NvcGVkUGF0aC5yZXBsYWNlKC9eXFwvc3JjXFwvLywgJy8nKTtcblxuICBsZXQgcGFyc2VkID0gcGF0aC5wYXJzZShwYWNrYWdlUmVsYXRpdmUpO1xuXG4gIGlmIChpc1BvZChwYWNrYWdlUmVsYXRpdmUpKSB7XG4gICAgLyoqXG4gICAgICogRm9yIHBvZHMsIHdlIGNob3Agb2ZmIHRoZSB3aG9sZSBmaWxlLCBhbmQgdXNlIHRoZSBkaXIgbmFtZSBhcyB0aGUgXCJtb2R1bGVQYXRoXCJcbiAgICAgKi9cbiAgICByZXR1cm4gcGFyc2VkLmRpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhbiBleHRlbnNpb24gaXMgcGFzc2VkLCByZW1vdmUgaXQuXG4gICAqIFdoZW4gdXNpbmcgcGFja2FnZXJzLCBmb2xrcyBhcmUgdXNlZCB0byBub3QgaGF2aW5nIHRvIHNwZWNpZnkgZXh0ZW5zaW9ucyBmb3IgZmlsZXMuXG4gICAqIFNpbmNlIHdlIGRvbid0IGV2ZW4gZW1pdCBjc3MgZmlsZXMgY28tbG9jYXRlZCB0byBlYWNoIG1vZHVsZSxcbiAgICogdGhpcyBoZWxwcyB1cyBub3QgY29udmV5IGEgbGllIHRoYXQgYSBmaWxlIG1heSBleGlzdCBpbiBhdCBydW50aW1lLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSBgPG1vZHVsZS1uYW1lPi9jb21wb25lbnRzL2J1dHRvbmAuXG4gICAqIEl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGV4dGVuc2lvbiBpcywgYmVjYXVzZSB5b3UgY2FuIG9ubHkgaGF2ZSBvbmUgY3NzIGZpbGVcbiAgICogZm9yIHRoZSBidXR0b24gbW9kdWxlIGFueXdheS5cbiAgICovXG4gIGxldCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID0gcGF0aC5qb2luKHBhcnNlZC5kaXIsIHBhcnNlZC5uYW1lKTtcblxuICByZXR1cm4gbG9jYWxQYWNrYWdlclN0eWxlUGF0aDtcbn1cblxuLyoqXG4gKiByZXR1cm5zIHRoZSBhcHAtbW9kdWxlIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlXG4gKlxuICogVGhpcyBhc3N1bWVzIG5vcm1hbCBlbWJlciBhcHAgY29udmVudGlvbnNcbiAqXG4gKiB3aGljaCBpcyBgPHBhY2thZ2UuanNvbiNuYW1lPi9wYXRoLXRvLWZpbGVgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBQYXRoKHNvdXJjZVBhdGgpIHtcbiAgbGV0IHdvcmtzcGFjZVBhdGggPSBmaW5kV29ya3NwYWNlUGF0aChzb3VyY2VQYXRoKTtcbiAgbGV0IG5hbWUgPSBtb2R1bGVOYW1lKHNvdXJjZVBhdGgpO1xuXG4gIC8qKlxuICAgKiAgVW5kZXIgZW1icm9pZGVyIGJ1aWxkcywgdGhlIHNwZWMtY29tcGxpYW50IHZlcnNpb24gb2YgdGhlIGFwcFxuICAgKiBoYXMgYWxsIHRoZSBmaWxlcyB1bmRlciBhIGZvbGRlciB3aGljaCByZXByZXNlbnRzIHRoZSBwYWNrYWdlIG5hbWUsXG4gICAqIHJhdGhlciB0aGFuIFwiYXBwXCIuXG4gICAqL1xuICBsZXQgcGFja2FnZVJlbGF0aXZlID0gc291cmNlUGF0aC5yZXBsYWNlKHdvcmtzcGFjZVBhdGgsICcnKTtcblxuICAvKipcbiAgICogQnV0IHdlIGFsc28gZG9uJ3Qgd2FudCAnYXBwJyAtLSB3aGljaCBpcyBwcmVzZW50IGluIHRoZSB2MSBhZGRvbiBwaXBlbGluZVxuICAgKi9cbiAgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVJlbGF0aXZlLnJlcGxhY2UoYC9hcHAvYCwgYC9gKTtcblxuICAvLyBBbnkgb2YgdGhlIGFib3ZlIHJlbHBhY2VtZW50cyBjb3VsZCBhY2NpZGVudGFsbHkgZ2l2ZSB1cyBhbiBleHRyYSAvIChkZXBlbmRpbmcgb24gb3VyIGJ1aWxkIGVudmlyb25tZW50KVxuICBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlUmVsYXRpdmUucmVwbGFjZSgnLy8nLCAnLycpO1xuXG4gIGxldCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID0gcGFja2FnZVNjb3BlZFBhdGhUb01vZHVsZVBhdGgocGFja2FnZVJlbGF0aXZlKTtcblxuICByZXR1cm4gYCR7bmFtZX0ke2xvY2FsUGFja2FnZXJTdHlsZVBhdGh9YDtcbn1cblxuLyoqXG4gKiBUbyBhdm9pZCBoaXR0aW5nIHRoZSBmaWxlc3lzZXRtLCB3ZSdsbCBzdG9yZSBhbGwgZm91bmRcbiAqIHByb2plY3QgcGF0aHMgYmVyZSwgc28gd2UgY2FuLCBpbiBtZW1vcnksXG4gKiBnZXQgdGhlIGZvbGRlciB3aGVyZSBhIHBhY2thZ2UuanNvbiBleGlzdHMsIHJhdGhlciB0aGFuXG4gKiBoaXQgdGhlIGZpbGUgc3lzdGVtIGV2ZXJ5IHRpbWUuXG4gKi9cbmNvbnN0IFNFRU4gPSBuZXcgU2V0KCk7XG5cbmZ1bmN0aW9uIGdldFNlZW4oc291cmNlUGF0aCkge1xuICBpZiAoU0VFTi5oYXMoc291cmNlUGF0aCkpIHJldHVybiBzb3VyY2VQYXRoO1xuXG4gIGxldCBwYXJ0cyA9IHNvdXJjZVBhdGguc3BsaXQoJy8nKTtcblxuICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+IDE7IGktLSkge1xuICAgIGxldCB0b0NoZWNrID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpO1xuXG4gICAgbGV0IHNlZW4gPSBTRUVOLmhhcyh0b0NoZWNrKTtcblxuICAgIGlmIChzZWVuKSB7XG4gICAgICByZXR1cm4gdG9DaGVjaztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgsIG9wdGlvbnMpIHtcbiAgbGV0IGN3ZCA9IG9wdGlvbnM/LmN3ZCA/PyBDV0Q7XG5cbiAgaWYgKHNvdXJjZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gIH1cblxuICBsZXQgc2VlbiA9IGdldFNlZW4oc291cmNlUGF0aCk7XG5cbiAgaWYgKHNlZW4pIHtcbiAgICByZXR1cm4gc2VlbjtcbiAgfVxuXG4gIGxldCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKHNvdXJjZVBhdGgsICdwYWNrYWdlLmpzb24nKTtcblxuICBjb25zdCBpc1dvcmtzcGFjZSA9IGZzU3luYy5leGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpO1xuXG4gIGlmIChpc1dvcmtzcGFjZSkge1xuICAgIHJldHVybiBzb3VyY2VQYXRoO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gZmluZFBhY2thZ2VKc29uVXAoc291cmNlUGF0aCwgeyBjd2QgfSk7XG5cbiAgaWYgKCFwYWNrYWdlSnNvblBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcHJvamVjdCBmb3IgJHtzb3VyY2VQYXRofWApO1xuICB9XG5cbiAgY29uc3Qgd29ya3NwYWNlUGF0aCA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpO1xuXG4gIFNFRU4uYWRkKHdvcmtzcGFjZVBhdGgpO1xuXG4gIHJldHVybiB3b3Jrc3BhY2VQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kUGFja2FnZUpzb25VcChzdGFydFBhdGgsIG9wdGlvbnMpIHtcbiAgbGV0IGN3ZCA9IG9wdGlvbnM/LmN3ZCA/PyBDV0Q7XG4gIGxldCBwYXJ0cyA9IHN0YXJ0UGF0aC5zcGxpdCgnLycpO1xuXG4gIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID4gMTsgaS0tKSB7XG4gICAgbGV0IHRvQ2hlY2sgPSBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7XG5cbiAgICBsZXQgcGFja2FnZUpzb24gPSBwYXRoLmpvaW4odG9DaGVjaywgJ3BhY2thZ2UuanNvbicpO1xuICAgIGxldCBleGlzdHMgPSBmc1N5bmMuZXhpc3RzU3luYyhwYWNrYWdlSnNvbik7XG5cbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICByZXR1cm4gcGFja2FnZUpzb247XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdHJhdmVyc2UgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgb2YgdGhlIGZpbGUgc3lzdGVtLlxuICAgIGlmICh0b0NoZWNrID09PSBjd2QpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBNQU5JRkVTVF9DQUNIRSA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBXaWxsIHJldHVybiB0aGUgcGFja2FnZS5qc29uI25hbWUsIG9yIGNvbmZpZy9lbnZpcm9ubWVudCNtb3VkbGVQcmVmaXggKGlmIHYxIGFwcClcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kdWxlTmFtZShzb3VyY2VQYXRoKSB7XG4gIGNvbnN0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgpO1xuICBjb25zdCBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KHdvcmtzcGFjZSk7XG5cbiAgcmV0dXJuIG1hbmlmZXN0Lm5hbWU7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmtzcGFjZVxuICovXG5mdW5jdGlvbiBnZXRNYW5pZmVzdCh3b3Jrc3BhY2UpIHtcbiAgbGV0IGV4aXN0aW5nID0gTUFOSUZFU1RfQ0FDSEUuZ2V0KHdvcmtzcGFjZSk7XG5cbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG5cbiAgbGV0IGJ1ZmZlciA9IGZzU3luYy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtzcGFjZSwgJ3BhY2thZ2UuanNvbicpKTtcbiAgbGV0IGNvbnRlbnQgPSBidWZmZXIudG9TdHJpbmcoKTtcbiAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuXG4gIE1BTklGRVNUX0NBQ0hFLnNldCh3b3Jrc3BhY2UsIGpzb24pO1xuXG4gIHJldHVybiBqc29uO1xufVxuIiwgIi8qXG4gKiBKYXZhU2NyaXB0IE1ENVxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvSmF2YVNjcmlwdC1NRDVcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogQmFzZWQgb25cbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2VcbiAqIERpZ2VzdCBBbGdvcml0aG0sIGFzIGRlZmluZWQgaW4gUkZDIDEzMjEuXG4gKiBWZXJzaW9uIDIuMiBDb3B5cmlnaHQgKEMpIFBhdWwgSm9obnN0b24gMTk5OSAtIDIwMDlcbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZVxuICogU2VlIGh0dHA6Ly9wYWpob21lLm9yZy51ay9jcnlwdC9tZDUgZm9yIG1vcmUgaW5mby5cbiAqXG4gKiBNb2RpZmljYXRpb25zOlxuICogLSByZW1vdmVkIElJRkUsIGV4cG9ydGVkIG1kNSAodGhpcyBmaWxlIGlzIG5vdyBFU00pXG4gKi9cblxuLyoqXG4gKiBBZGQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeMzIuXG4gKiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnMgaW50ZXJuYWxseSB0byB3b3JrIGFyb3VuZCBidWdzIGluIGludGVycHJldGVycy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0geCBGaXJzdCBpbnRlZ2VyXG4gKiBAcGFyYW0ge251bWJlcn0geSBTZWNvbmQgaW50ZWdlclxuICogQHJldHVybnMge251bWJlcn0gU3VtXG4gKi9cbmZ1bmN0aW9uIHNhZmVBZGQoeCwgeSkge1xuICB2YXIgbHN3ID0gKHggJiAweGZmZmYpICsgKHkgJiAweGZmZmYpO1xuICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG5cbiAgcmV0dXJuIChtc3cgPDwgMTYpIHwgKGxzdyAmIDB4ZmZmZik7XG59XG5cbi8qKlxuICogQml0d2lzZSByb3RhdGUgYSAzMi1iaXQgbnVtYmVyIHRvIHRoZSBsZWZ0LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW0gMzItYml0IG51bWJlclxuICogQHBhcmFtIHtudW1iZXJ9IGNudCBSb3RhdGlvbiBjb3VudFxuICogQHJldHVybnMge251bWJlcn0gUm90YXRlZCBudW1iZXJcbiAqL1xuZnVuY3Rpb24gYml0Um90YXRlTGVmdChudW0sIGNudCkge1xuICByZXR1cm4gKG51bSA8PCBjbnQpIHwgKG51bSA+Pj4gKDMyIC0gY250KSk7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gcSBxXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1Y21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIHNhZmVBZGQoYml0Um90YXRlTGVmdChzYWZlQWRkKHNhZmVBZGQoYSwgcSksIHNhZmVBZGQoeCwgdCkpLCBzKSwgYik7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0gYyBjXG4gKiBAcGFyYW0ge251bWJlcn0gZCBkXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1ZmYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKChiICYgYykgfCAofmIgJiBkKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0gYyBjXG4gKiBAcGFyYW0ge251bWJlcn0gZCBkXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1Z2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKChiICYgZCkgfCAoYyAmIH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0gYyBjXG4gKiBAcGFyYW0ge251bWJlcn0gZCBkXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1aGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0gYyBjXG4gKiBAcGFyYW0ge251bWJlcn0gZCBkXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1aWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGMgXiAoYiB8IH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBNRDUgb2YgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcywgYW5kIGEgYml0IGxlbmd0aC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSB4IEFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gQml0IGxlbmd0aFxuICogQHJldHVybnMge0FycmF5PG51bWJlcj59IE1ENSBBcnJheVxuICovXG5mdW5jdGlvbiBiaW5sTUQ1KHgsIGxlbikge1xuICAvKiBhcHBlbmQgcGFkZGluZyAqL1xuICB4W2xlbiA+PiA1XSB8PSAweDgwIDw8IGxlbiAlIDMyO1xuICB4WygoKGxlbiArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNF0gPSBsZW47XG5cbiAgdmFyIGk7XG4gIHZhciBvbGRhO1xuICB2YXIgb2xkYjtcbiAgdmFyIG9sZGM7XG4gIHZhciBvbGRkO1xuICB2YXIgYSA9IDE3MzI1ODQxOTM7XG4gIHZhciBiID0gLTI3MTczMzg3OTtcbiAgdmFyIGMgPSAtMTczMjU4NDE5NDtcbiAgdmFyIGQgPSAyNzE3MzM4Nzg7XG5cbiAgZm9yIChpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgb2xkYSA9IGE7XG4gICAgb2xkYiA9IGI7XG4gICAgb2xkYyA9IGM7XG4gICAgb2xkZCA9IGQ7XG5cbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuXG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA1LCAtMTY1Nzk2NTEwKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNCwgNjQzNzE3NzEzKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpXSwgMjAsIC0zNzM4OTczMDIpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNSwgLTcwMTU1ODY5MSk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTQsIC0xODczNjM5NjEpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMl0sIDksIC01MTQwMzc4NCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcblxuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNCwgLTM3ODU1OCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE2LCAxODM5MDMwNTYyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMV0sIDQsIC0xNTMwOTkyMDYwKTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgNF0sIDExLCAxMjcyODkzMzUzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgN10sIDE2LCAtMTU1NDk3NjMyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTBdLCAyMywgLTEwOTQ3MzA2NDApO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDQsIDY4MTI3OTE3NCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaV0sIDExLCAtMzU4NTM3MjIyKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgM10sIDE2LCAtNzIyNTIxOTc5KTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgNl0sIDIzLCA3NjAyOTE4OSk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDldLCA0LCAtNjQwMzY0NDg3KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgMTJdLCAxMSwgLTQyMTgxNTgzNSk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTYsIDUzMDc0MjUyMCk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDJdLCAyMywgLTk5NTMzODY1MSk7XG5cbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG5cbiAgICBhID0gc2FmZUFkZChhLCBvbGRhKTtcbiAgICBiID0gc2FmZUFkZChiLCBvbGRiKTtcbiAgICBjID0gc2FmZUFkZChjLCBvbGRjKTtcbiAgICBkID0gc2FmZUFkZChkLCBvbGRkKTtcbiAgfVxuXG4gIHJldHVybiBbYSwgYiwgYywgZF07XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzIHRvIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBpbnB1dCBNRDUgQXJyYXlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IE1ENSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gYmlubDJyc3RyKGlucHV0KSB7XG4gIHZhciBpO1xuICB2YXIgb3V0cHV0ID0gJyc7XG4gIHZhciBsZW5ndGgzMiA9IGlucHV0Lmxlbmd0aCAqIDMyO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGgzMjsgaSArPSA4KSB7XG4gICAgb3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGlucHV0W2kgPj4gNV0gPj4+IGkgJSAzMikgJiAweGZmKTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHJhdyBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICogQ2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGlnaC1ieXRlIHNpbGVudGx5IGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IFJhdyBpbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSBBcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gKi9cbmZ1bmN0aW9uIHJzdHIyYmlubChpbnB1dCkge1xuICB2YXIgaTtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBvdXRwdXRbKGlucHV0Lmxlbmd0aCA+PiAyKSAtIDFdID0gdW5kZWZpbmVkO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBvdXRwdXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBvdXRwdXRbaV0gPSAwO1xuICB9XG5cbiAgdmFyIGxlbmd0aDggPSBpbnB1dC5sZW5ndGggKiA4O1xuXG4gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg4OyBpICs9IDgpIHtcbiAgICBvdXRwdXRbaSA+PiA1XSB8PSAoaW5wdXQuY2hhckNvZGVBdChpIC8gOCkgJiAweGZmKSA8PCBpICUgMzI7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgTUQ1IG9mIGEgcmF3IHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzIElucHV0IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gUmF3IE1ENSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gcnN0ck1ENShzKSB7XG4gIHJldHVybiBiaW5sMnJzdHIoYmlubE1ENShyc3RyMmJpbmwocyksIHMubGVuZ3RoICogOCkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIEhNQUMtTUQ1IG9mIGEga2V5IGFuZCBzb21lIGRhdGEgKHJhdyBzdHJpbmdzKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgSE1BQyBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIFJhdyBpbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJhdyBNRDUgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIHJzdHJITUFDTUQ1KGtleSwgZGF0YSkge1xuICB2YXIgaTtcbiAgdmFyIGJrZXkgPSByc3RyMmJpbmwoa2V5KTtcbiAgdmFyIGlwYWQgPSBbXTtcbiAgdmFyIG9wYWQgPSBbXTtcbiAgdmFyIGhhc2g7XG4gIGlwYWRbMTVdID0gb3BhZFsxNV0gPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGJrZXkubGVuZ3RoID4gMTYpIHtcbiAgICBia2V5ID0gYmlubE1ENShia2V5LCBrZXkubGVuZ3RoICogOCk7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgIGlwYWRbaV0gPSBia2V5W2ldIF4gMHgzNjM2MzYzNjtcbiAgICBvcGFkW2ldID0gYmtleVtpXSBeIDB4NWM1YzVjNWM7XG4gIH1cblxuICBoYXNoID0gYmlubE1ENShpcGFkLmNvbmNhdChyc3RyMmJpbmwoZGF0YSkpLCA1MTIgKyBkYXRhLmxlbmd0aCAqIDgpO1xuXG4gIHJldHVybiBiaW5sMnJzdHIoYmlubE1ENShvcGFkLmNvbmNhdChoYXNoKSwgNTEyICsgMTI4KSk7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHJhdyBzdHJpbmcgdG8gYSBoZXggc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IFJhdyBpbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEhleCBlbmNvZGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiByc3RyMmhleChpbnB1dCkge1xuICB2YXIgaGV4VGFiID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuICB2YXIgb3V0cHV0ID0gJyc7XG4gIHZhciB4O1xuICB2YXIgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB4ID0gaW5wdXQuY2hhckNvZGVBdChpKTtcbiAgICBvdXRwdXQgKz0gaGV4VGFiLmNoYXJBdCgoeCA+Pj4gNCkgJiAweDBmKSArIGhleFRhYi5jaGFyQXQoeCAmIDB4MGYpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBFbmNvZGUgYSBzdHJpbmcgYXMgVVRGLThcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgSW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVVEY4IHN0cmluZ1xuICovXG5mdW5jdGlvbiBzdHIycnN0clVURjgoaW5wdXQpIHtcbiAgcmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCkpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgaW5wdXQgc3RyaW5nIGFzIHJhdyBNRDUgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHMgSW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSYXcgTUQ1IHN0cmluZ1xuICovXG5mdW5jdGlvbiByYXdNRDUocykge1xuICByZXR1cm4gcnN0ck1ENShzdHIycnN0clVURjgocykpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgaW5wdXQgc3RyaW5nIGFzIEhleCBlbmNvZGVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzIElucHV0IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gSGV4IGVuY29kZWQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGhleE1ENShzKSB7XG4gIHJldHVybiByc3RyMmhleChyYXdNRDUocykpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHJhdyBITUFDLU1ENSBmb3IgdGhlIGdpdmVuIGtleSBhbmQgZGF0YVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrIEhNQUMga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gZCBJbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJhdyBNRDUgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIHJhd0hNQUNNRDUoaywgZCkge1xuICByZXR1cm4gcnN0ckhNQUNNRDUoc3RyMnJzdHJVVEY4KGspLCBzdHIycnN0clVURjgoZCkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIEhleCBlbmNvZGVkIEhNQUMtTUQ1IGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCBkYXRhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGsgSE1BQyBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBkIElucHV0IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gUmF3IE1ENSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gaGV4SE1BQ01ENShrLCBkKSB7XG4gIHJldHVybiByc3RyMmhleChyYXdITUFDTUQ1KGssIGQpKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIE1ENSB2YWx1ZSBmb3IgYSBnaXZlbiBzdHJpbmcuXG4gKiBJZiBhIGtleSBpcyBwcm92aWRlZCwgY2FsY3VsYXRlcyB0aGUgSE1BQy1NRDUgdmFsdWUuXG4gKiBSZXR1cm5zIGEgSGV4IGVuY29kZWQgc3RyaW5nIHVubGVzcyB0aGUgcmF3IGFyZ3VtZW50IGlzIGdpdmVuLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgSW5wdXQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gSE1BQyBrZXlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jhd10gUmF3IG91dHB1dCBzd2l0Y2hcbiAqIEByZXR1cm5zIHtzdHJpbmd9IE1ENSBvdXRwdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1kNShzdHJpbmcsIGtleSwgcmF3KSB7XG4gIGlmICgha2V5KSB7XG4gICAgaWYgKCFyYXcpIHtcbiAgICAgIHJldHVybiBoZXhNRDUoc3RyaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmF3TUQ1KHN0cmluZyk7XG4gIH1cblxuICBpZiAoIXJhdykge1xuICAgIHJldHVybiBoZXhITUFDTUQ1KGtleSwgc3RyaW5nKTtcbiAgfVxuXG4gIHJldHVybiByYXdITUFDTUQ1KGtleSwgc3RyaW5nKTtcbn1cbiIsICJpbXBvcnQgeyBtZDUgfSBmcm9tICcuL21kNS5qcyc7XG5cbi8qKlxuICogVGhlIGludGVudCBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGdlbmVyYXRlIHRoZSBzdWZmaXgvcG9zdGZpeCBmb3IgdGhlXG4gKiBjc3MgY2xhc3NlcywgYmFzZWQgb24gdGhlIG1vZHVsZS1zY29wZWQgcGF0aCBuYW1lLlxuICpcbiAqIGZvciBleGFtcGxlLFxuICogICAgaGFzaCgnbXktYXBwL2NvbXBvbmVudHMvZm9vJylcbiAqICBpbnN0ZWFkIG9mXG4gKiAgICBoYXNoKCdhcHAvY29tcG9uZW50cy9mb28nKVxuICpcbiAqICAodW5sZXNzIHlvdXIgYXBwIG5hbWUgaXMgJ2FwcCcpXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZVBhdGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoKG1vZHVsZVBhdGgpIHtcbiAgcmV0dXJuICdlJyArIG1kNShtb2R1bGVQYXRoKS5zdWJzdHJpbmcoMCwgOCk7XG59XG5cblxuZXhwb3J0IGNvbnN0IGhhc2hGcm9tTW9kdWxlUGF0aCA9IGhhc2g7XG4iLCAiaW1wb3J0IHsgaXNSZWxldmFudEZpbGUgfSBmcm9tICcuLi9saWIvcGF0aC91dGlscy5qcyc7XG5cbmZ1bmN0aW9uIF9pc1JlbGV2YW50RmlsZShzdGF0ZSwgY3dkKSB7XG4gIGxldCBmaWxlTmFtZSA9IHN0YXRlLmZpbGUub3B0cy5maWxlbmFtZTtcbiAgbGV0IGFkZGl0aW9uYWxSb290cyA9IHN0YXRlLm9wdHM/LmFkZGl0aW9uYWxSb290cztcblxuICByZXR1cm4gaXNSZWxldmFudEZpbGUoZmlsZU5hbWUsIHtcbiAgICBhZGRpdGlvbmFsUm9vdHMsXG4gICAgY3dkLFxuICB9KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gZW52IC0gYmFiZWwgcGx1Z2luIGVudiwgZW52LnR5cGVzIGlzIG1vc3QgY29tbW9ubHkgdXNlZCAoZXNwIGluIFRTKVxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSB0aGUgb3B0aW9ucyBmb3Igc2NvcGVkLWNzcyAtLSB0aGlzIGlzIGFsc28gYXZhaWxhYmxlIGluIGVhY2ggdmlzaXRvcidzIHN0YXRlLm9wdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JraW5nRGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBkZWZhdWx0IChlbnYsIG9wdGlvbnMsIHdvcmtpbmdEaXJlY3RvcnkpID0+IHtcbiAgLyoqXG4gICAqIFRoaXMgYmFiZWwgcGx1Z2luIGRvZXMgdHdvIHRoaW5nczpcbiAgICogLSByZW1vdmVzIHRoZSBpbXBvcnQgb2Ygc2NvcGVkQ2xhc3MsIGlmIGl0IGV4aXN0c1xuICAgKiAgIC0gaWYgc2NvcGVkQ2xhc3Mgd2FzIGltcG9ydGVkLCBpdCBpcyByZW1vdmVkIGZyb20gYW55IGNvbXBvbmVudCdzIFwic2NvcGUgYmFnXCJcbiAgICogICAgICh0aGUgc2NvcGUgYmFnIGJlaW5nIGEgbG93LWxldmVsIG9iamVjdCB1c2VkIGZvciBwYXNzaW5nIHdoYXQgaXMgXCJpbiBzY29wZVwiIGZvciBhIGNvbXBvbmVudClcbiAgICovXG4gIHJldHVybiB7XG4gICAgdmlzaXRvcjoge1xuICAgICAgUHJvZ3JhbToge1xuICAgICAgICBlbnRlcihwYXRoLCBzdGF0ZSkge1xuICAgICAgICAgIGlmICghX2lzUmVsZXZhbnRGaWxlKHN0YXRlLCB3b3JraW5nRGlyZWN0b3J5KSkge1xuICAgICAgICAgICAgc3RhdGUuY2FuU2tpcCA9IHRydWU7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgSW1wb3J0RGVjbGFyYXRpb24ocGF0aCwgc3RhdGUpIHtcbiAgICAgICAgaWYgKHN0YXRlLmNhblNraXApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0aC5ub2RlLnNvdXJjZS52YWx1ZSA9PT0gJ2VtYmVyLXNjb3BlZC1jc3MnKSB7XG4gICAgICAgICAgbGV0IHNwZWNpZmllciA9IHBhdGgubm9kZS5zcGVjaWZpZXJzLmZpbmQoXG4gICAgICAgICAgICAoeCkgPT4geC5pbXBvcnRlZC5uYW1lID09PSAnc2NvcGVkQ2xhc3MnLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoc3BlY2lmaWVyKSB7XG4gICAgICAgICAgICBzdGF0ZS5maWxlLm9wdHMuaW1wb3J0ZWRTY29wZWRDbGFzcyA9IHNwZWNpZmllci5sb2NhbC5uYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzcGVjaWZpZXIubG9jYWwubmFtZSAhPT0gJ3Njb3BlZENsYXNzJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVGhlIHNjb3BlZENsYXNzIGltcG9ydCBpcyBhIHBzdWVkby1oZWxwZXIsIGFuZCBtYXkgbm90IGJlIHJlbmFtZWQgYXMgaXQgaXMgcmVtb3ZlZCBhdCBidWlsZCB0aW1lLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhdGgucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIE9ubHkgaW4gc3RyaWN0IG1vZGUsIGRvIHdlIGNhcmUgYWJvdXQgcmVtb25pbmcgdGhlIHNjb3BlIGJhZyByZWZlcmVuY2VcbiAgICAgICAqL1xuICAgICAgT2JqZWN0UHJvcGVydHkocGF0aCwgc3RhdGUpIHtcbiAgICAgICAgaWYgKCFzdGF0ZS5maWxlLm9wdHM/LmltcG9ydGVkU2NvcGVkQ2xhc3MpIHJldHVybjtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgcGF0aC5ub2RlLnZhbHVlLnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJlxuICAgICAgICAgIHBhdGgubm9kZS52YWx1ZS5uYW1lID09PSBzdGF0ZS5maWxlLm9wdHM/LmltcG9ydGVkU2NvcGVkQ2xhc3NcbiAgICAgICAgKSB7XG4gICAgICAgICAgcGF0aC5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufTtcbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjcmVhdGVVbnBsdWdpbiB9IGZyb20gJ3VucGx1Z2luJztcblxuaW1wb3J0IHsgZGVjb2RlU2NvcGVkQ1NTUmVxdWVzdCwgaXNTY29wZWRDU1NSZXF1ZXN0IH0gZnJvbSAnLi4vbGliL3JlcXVlc3QuanMnO1xuLyoqXG4gKiBUaGUgcGx1Z2luIHRoYXQgaGFuZGxlcyBDU1MgcmVxdWVzdHMgZnJvbSBvdGhlciB0cmFuc2Zvcm0gKGUuZy46IGJhYmVsKVxuICpcbiAqIFRoaXMgcGx1Z2luIHRha2VzIG5vIG9wdGlvbnMgYmVjYXVzZSB0aGUgQ1NTIHRyYW5zZm9ybSBoYXMgYWxyZWFkeSBoYXBwZW5lZCBieSB0aGUgdGltZVxuICogd2UgaGFuZGxlIGl0IGhlcmUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVVucGx1Z2luKCgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnZW1iZXItc2NvcGVkLWNzcy11bnBsdWdpbicsXG5cbiAgICByZXNvbHZlSWQoaWQsIGltcG9ydGVyKSB7XG4gICAgICBpZiAoaXNTY29wZWRDU1NSZXF1ZXN0KGlkKSkge1xuICAgICAgICBsZXQgcGFyc2VkID0gZGVjb2RlU2NvcGVkQ1NTUmVxdWVzdChpZCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShpbXBvcnRlciksIHBhcnNlZC5wb3N0Zml4ICsgJy5jc3MnKSxcbiAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAnc2NvcGVkLWNzcyc6IHtcbiAgICAgICAgICAgICAgY3NzOiBwYXJzZWQuY3NzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2FkKGlkKSB7XG4gICAgICBsZXQgbWV0YSA9IHRoaXMuZ2V0TW9kdWxlSW5mbyhpZCk/Lm1ldGE/Llsnc2NvcGVkLWNzcyddO1xuXG4gICAgICBpZiAobWV0YSkge1xuICAgICAgICByZXR1cm4gbWV0YS5jc3M7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn0pO1xuIiwgImNvbnN0IGtleSA9ICdzdHlsZXMuZW1iZXItc2NvcGVkLmNzcyc7XG5jb25zdCBzZXBhcmF0b3IgPSAnX19fXyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHJlcXVlc3QpIHtcbiAgbGV0IFtsZWZ0LCBxcHNdID0gcmVxdWVzdC5zcGxpdCgnPycpO1xuICBsZXQgW3JlbGF0aXZlUG9zdGZpeCwgY3NzSWRdID0gbGVmdC5zcGxpdChzZXBhcmF0b3IpO1xuICBsZXQgcG9zdGZpeCA9IHJlbGF0aXZlUG9zdGZpeC5zbGljZSgyKTtcblxuICBsZXQgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxcHMpO1xuXG4gIHJldHVybiB7XG4gICAgZnJvbTogcG9zdGZpeCxcbiAgICBjc3M6IHNlYXJjaC5nZXQoJ2NzcycpLFxuICAgIGNzc0lkLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY29wZWRDU1NSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgbGV0IFssICwgc3R1ZmZdID0gcmVxdWVzdC5zcGxpdChzZXBhcmF0b3IpO1xuXG4gIGlmICghc3R1ZmYpIHJldHVybiBmYWxzZTtcblxuICBsZXQgW2tdID0gc3R1ZmYuc3BsaXQoJz8nKTtcblxuICByZXR1cm4gayA9PT0ga2V5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlU2NvcGVkQ1NTUmVxdWVzdChyZXF1ZXN0KSB7XG4gIGxldCBwYXJhbXMgPSBwYXJzZShyZXF1ZXN0KTtcblxuICByZXR1cm4ge1xuICAgIHBvc3RmaXg6IHBhcmFtcy5mcm9tLFxuICAgIGNzczogZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5jc3MpLFxuICAgIGNzc0lkOiBwYXJhbXMuY3NzSWQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUmVxdWVzdChwb3N0Zml4LCBjc3NJZCwgY3NzQ29udGVudCkge1xuICByZXR1cm4gYC4vJHtwb3N0Zml4fSR7c2VwYXJhdG9yfSR7Y3NzSWR9JHtzZXBhcmF0b3J9JHtrZXl9P2Nzcz0ke2VuY29kZVVSSUNvbXBvbmVudChjc3NDb250ZW50KX1gO1xufVxuIiwgImltcG9ydCBwb3N0Y3NzIGZyb20gJ3Bvc3Rjc3MnO1xuaW1wb3J0IHBhcnNlciBmcm9tICdwb3N0Y3NzLXNlbGVjdG9yLXBhcnNlcic7XG5cbmltcG9ydCB7IGlzSW5zaWRlR2xvYmFsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmZ1bmN0aW9uIHJld3JpdGVTZWxlY3RvcihzZWwsIHBvc3RmaXgpIHtcbiAgY29uc3QgdHJhbnNmb3JtID0gKHNlbGVjdG9ycykgPT4ge1xuICAgIHNlbGVjdG9ycy53YWxrKChzZWxlY3RvcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdjbGFzcycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBzZWxlY3Rvci52YWx1ZSArPSAnXycgKyBwb3N0Zml4O1xuICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci50eXBlID09PSAndGFnJyAmJiAhaXNJbnNpZGVHbG9iYWwoc2VsZWN0b3IpKSB7XG4gICAgICAgIHNlbGVjdG9yLnJlcGxhY2VXaXRoKFxuICAgICAgICAgIHBhcnNlci50YWcoeyB2YWx1ZTogc2VsZWN0b3IudmFsdWUgfSksXG4gICAgICAgICAgcGFyc2VyLmNsYXNzTmFtZSh7IHZhbHVlOiBwb3N0Zml4IH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gcmVtb3ZlIDpnbG9iYWxcbiAgICBzZWxlY3RvcnMud2Fsaygoc2VsZWN0b3IpID0+IHtcbiAgICAgIGlmIChzZWxlY3Rvci50eXBlID09PSAncHNldWRvJyAmJiBzZWxlY3Rvci52YWx1ZSA9PT0gJzpnbG9iYWwnKSB7XG4gICAgICAgIHNlbGVjdG9yLnJlcGxhY2VXaXRoKC4uLnNlbGVjdG9yLm5vZGVzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgdHJhbnNmb3JtZWQgPSBwYXJzZXIodHJhbnNmb3JtKS5wcm9jZXNzU3luYyhzZWwpO1xuXG4gIHJldHVybiB0cmFuc2Zvcm1lZDtcbn1cblxuZnVuY3Rpb24gaXNJbnNpZGVLZXlmcmFtZXMobm9kZSkge1xuICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudDtcblxuICBpZiAoIXBhcmVudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAocGFyZW50LnR5cGUgPT09ICdhdHJ1bGUnICYmIHBhcmVudC5uYW1lID09PSAna2V5ZnJhbWVzJykgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIGlzSW5zaWRlS2V5ZnJhbWVzKHBhcmVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXdyaXRlQ3NzKGNzcywgcG9zdGZpeCwgZmlsZU5hbWUsIGxheWVyTmFtZSkge1xuICBjb25zdCBsYXllck5hbWVXaXRoRGVmYXVsdCA9IGxheWVyTmFtZSA/PyAnY29tcG9uZW50cyc7XG4gIGNvbnN0IGFzdCA9IHBvc3Rjc3MucGFyc2UoY3NzKTtcblxuICBhc3Qud2Fsaygobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdydWxlJyAmJiAhaXNJbnNpZGVLZXlmcmFtZXMobm9kZSkpIHtcbiAgICAgIG5vZGUuc2VsZWN0b3IgPSByZXdyaXRlU2VsZWN0b3Iobm9kZS5zZWxlY3RvciwgcG9zdGZpeCk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCByZXdyaXR0ZW5Dc3MgPSBhc3QudG9TdHJpbmcoKTtcblxuICBpZiAoIWxheWVyTmFtZVdpdGhEZWZhdWx0KSB7XG4gICAgcmV0dXJuIGAvKiAke2ZpbGVOYW1lfSAqL1xcbiR7cmV3cml0dGVuQ3NzfVxcbmA7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGAvKiAke2ZpbGVOYW1lfSAqL1xcbkBsYXllciAke2xheWVyTmFtZVdpdGhEZWZhdWx0fSB7XFxuXFxuYCArXG4gICAgcmV3cml0dGVuQ3NzICtcbiAgICAnXFxufVxcbidcbiAgKTtcbn1cblxuIiwgImltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCBwb3N0Y3NzIGZyb20gJ3Bvc3Rjc3MnO1xuaW1wb3J0IHBhcnNlciBmcm9tICdwb3N0Y3NzLXNlbGVjdG9yLXBhcnNlcic7XG5cbmltcG9ydCB7IG1kNSB9IGZyb20gJy4uL3BhdGgvbWQ1LmpzJztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY3NzXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGhhc2hlZCBkb3duIHZlcnNpb24gb2YgdGhlIENTUyBmb3IgZGlzYW1iaWd1YXRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2goY3NzKSB7XG4gIHJldHVybiBgY3NzLSR7bWQ1KGNzcyl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5zaWRlR2xvYmFsKG5vZGUsIGZ1bmMpIHtcbiAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG5cbiAgaWYgKCFwYXJlbnQpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBhcmVudC50eXBlID09PSAncHNldWRvJyAmJiBwYXJlbnQudmFsdWUgPT09ICc6Z2xvYmFsJykgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIGlzSW5zaWRlR2xvYmFsKHBhcmVudCwgZnVuYyk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGNzc1BhdGggcGF0aCB0byBhIENTUyBmaWxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDU1NJbmZvKGNzc1BhdGgpIHtcbiAgaWYgKCFleGlzdHNTeW5jKGNzc1BhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgY3NzID0gcmVhZEZpbGVTeW5jKGNzc1BhdGgsICd1dGY4Jyk7XG5cbiAgcmV0dXJuIGdldENTU0NvbnRlbnRJbmZvKGNzcyk7XG59XG5cbi8qKlxuICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gY2hlY2sgZWFjaCBjbGFzcyB1c2VkIGluIHRoZSB0ZW1wbGF0ZVxuICogdG8gc2VlIGlmIHdlIG5lZWQgdG8gbGVhdmUgaXQgYWxvbmUgb3IgdHJhbnNmb3JtIGl0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNzcyB0aGUgQ1NTJ3MgY29udGVudHNcbiAqIEByZXR1cm4ge3sgY2xhc3NlczogU2V0PHN0cmluZz4sIHRhZ3M6IFNldDxzdHJpbmc+LCBjc3M6IHN0cmluZywgaWQ6IHN0cmluZyB9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q1NTQ29udGVudEluZm8oY3NzKSB7XG4gIGNvbnN0IGNsYXNzZXMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IHRhZ3MgPSBuZXcgU2V0KCk7XG5cbiAgY29uc3QgYXN0ID0gcG9zdGNzcy5wYXJzZShjc3MpO1xuXG4gIGFzdC53YWxrKChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ3J1bGUnKSB7XG4gICAgICBnZXRDbGFzc2VzQW5kVGFncyhub2RlLnNlbGVjdG9yLCBjbGFzc2VzLCB0YWdzKTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCBpZCA9IGhhc2goY3NzKTtcblxuICByZXR1cm4geyBjbGFzc2VzLCB0YWdzLCBjc3MsIGlkIH07XG59XG5cbmZ1bmN0aW9uIGdldENsYXNzZXNBbmRUYWdzKHNlbCwgY2xhc3NlcywgdGFncykge1xuICBjb25zdCB0cmFuc2Zvcm0gPSAoc2xzKSA9PiB7XG4gICAgc2xzLndhbGsoKHNlbGVjdG9yKSA9PiB7XG4gICAgICBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ2NsYXNzJyAmJiAhaXNJbnNpZGVHbG9iYWwoc2VsZWN0b3IpKSB7XG4gICAgICAgIGNsYXNzZXMuYWRkKHNlbGVjdG9yLnZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ3RhZycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICB0YWdzLmFkZChzZWxlY3Rvci52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgcGFyc2VyKHRyYW5zZm9ybSkucHJvY2Vzc1N5bmMoc2VsKTtcbn1cblxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGZpbmRXb3Jrc3BhY2VQYXRoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8qKlxuICogdGVtcGxhdGUgcGx1Z2lucyBkbyBub3QgaGFuZCB1cyB0aGUgY29ycmVjdCBmaWxlIHBhdGguXG4gKiBhZGRpdGlvbmFsbHksIHdlIG1heSBub3QgYmUgYWJsZSB0byByZWx5IG9uIHRoaXMgZGF0YSBpbiB0aGUgZnV0dXJlLFxuICogc28gdGhpcyBmdW5jdGlvbnMgYWN0cyBhcyBhIG1lYW5zIG9mIG5vcm1hbGl6aW5nIF93aGF0ZXZlcl8gd2UncmUgZ2l2ZW5cbiAqIGluIHRoZSBmdXR1cmUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZml4RmlsZW5hbWUoZmlsZW5hbWUpIHtcbiAgbGV0IGZpbGVOYW1lID0gZmlsZW5hbWU7XG4gIGxldCB3b3Jrc3BhY2UgPSBmaW5kV29ya3NwYWNlUGF0aChmaWxlTmFtZSk7XG5cbiAgLyoqXG4gICAqIGVtYmVyLXNvdXJjZSA1Ljg6XG4gICAqIC0gdGhlIGZpbGVuYW1lIGxvb2tzIGxpa2UgYW4gYWJzb2x1dGUgcGF0aCwgYnV0IHN3YXBwZWQgb3V0IHRoZSAnYXBwJyBwYXJ0IG9mIHRoZSBwYXRoXG4gICAqICAgd2l0aCB0aGUgbW9kdWxlIG5hbWUsIHNvIHRoZSBmaWxlIHBhdGhzIG5ldmVyIGV4aXN0IG9uIGRpc2tcbiAgICpcbiAgICogLSBpbiB2aXRlIGFwcHM6XG4gICAqICAgdGhlICdhcHAnIHBhcnQgX21heV8gYmUgYHNyY2AsIHNvIHdlIGFsc28gbmVlZCB0byBlbnN1cmUgdGhhdCBgc3JjYCBpcyBleGNsdWRlZCBhcyB3ZWxsXG4gICAqL1xuICBsZXQgaGFzQXBwRGlyID0gZmlsZU5hbWUuaW5jbHVkZXMocGF0aC5qb2luKHdvcmtzcGFjZSwgJ2FwcCcpKTtcbiAgbGV0IGhhc1NyY0RpciA9IGZpbGVOYW1lLmluY2x1ZGVzKHBhdGguam9pbih3b3Jrc3BhY2UsICdzcmMnKSk7XG5cbiAgaWYgKFxuICAgICEoaGFzQXBwRGlyIHx8IGhhc1NyY0RpcikgJiZcbiAgICAhZmlsZU5hbWUuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvLmVtYnJvaWRlci8nKVxuICApIHtcbiAgICBsZXQgbWF5YmVNb2R1bGUgPSBmaWxlTmFtZS5yZXBsYWNlKHdvcmtzcGFjZSwgJycpO1xuICAgIGxldCBbbWF5YmVTY29wZSwgLi4ucmVzdF0gPSBtYXliZU1vZHVsZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgcGFydHMgPSByZXN0O1xuXG4gICAgaWYgKG1heWJlU2NvcGUuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICBsZXQgWywgLi4ucmVzdGVyXSA9IHJlc3Q7XG5cbiAgICAgIHBhcnRzID0gcmVzdGVyO1xuICAgIH1cblxuICAgIGxldCByZWxhdGl2ZSA9IHBhdGguam9pbiguLi5wYXJ0cyk7XG5cbiAgICAvKipcbiAgICAgKiBXZSBkb24ndCBhY3R1YWxseSBrbm93IGlmIHRoaXMgZmlsZSBpcyBhbiBhcHAuXG4gICAgICogaXQgY291bGQgYmUgYW4gYWRkb24gKHYxIG9yIHYyKVxuICAgICAqXG4gICAgICogU28gaGVyZSB3ZSBsb2cgdG8gc2VlIGlmIHdlIGhhdmUgdW5oYW5kbGVkIHNpdHVhdGlvbnMuXG4gICAgICovXG4gICAgbGV0IGNhbmRpZGF0ZVBhdGggPSBwYXRoLmpvaW4od29ya3NwYWNlLCAnYXBwJywgcmVsYXRpdmUpO1xuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVBhdGg7XG4gIH1cblxuICAvLyBUT0RPOiB3aHkgYXJlIHdlIHBhc3NlZCBmaWxlcyB0byBvdGhlciBwcm9qZWN0cz9cbiAgaWYgKCFmaWxlTmFtZS5pbmNsdWRlcyh3b3Jrc3BhY2UpKSB7XG4gICAgcmV0dXJuIGZpbGVOYW1lO1xuICB9XG5cbiAgLy8gRmFsbGJhY2sgdG8gd2hhdCB0aGUgcGx1Z2luIHN5c3RlbSBnaXZlcyB1cy5cbiAgLy8gVGhpcyBtYXkgYmUgd3JvbmcsIGFuZCBpZiB3cm9uZywgcmV2ZWFsc1xuICAvLyB1bmhhbmRsZWQgc2NlbmFyaW9zIHdpdGggdGhlIGZpbGUgbmFtZXMgaW4gdGhlIHBsdWdpbiBpbmZyYVxuICByZXR1cm4gZmlsZU5hbWU7XG59XG4iLCAiaW1wb3J0IHJlY2FzdCBmcm9tICdlbWJlci10ZW1wbGF0ZS1yZWNhc3QnO1xuXG5pbXBvcnQgeyByZW5hbWVDbGFzcyB9IGZyb20gJy4vcmVuYW1lQ2xhc3MuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVQbHVnaW4oeyBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4IH0pIHtcbiAgbGV0IHN0YWNrID0gW107XG4gIC8vIHNjb3BlZC1jbGFzcyBpcyBhIGdsb2JhbCB3ZSBhbGxvdyBpbiBoYnNcbiAgLy8gc2NvcGVkQ2xhc3MgaXMgaW1wb3J0YWJsZSwgYW5kIHdlJ2xsIGVycm9yIGlmIHNvbWVvbmUgdHJpZXMgdG8gcmVuYW1lIGl0XG4gIGxldCBzY29wZWRDbGFzc0NhbmRpZGF0ZXMgPSBbJ3Njb3BlZC1jbGFzcycsICdzY29wZWRDbGFzcyddO1xuXG4gIGZ1bmN0aW9uIGlzU2NvcGVkQ2xhc3Moc3RyKSB7XG4gICAgaWYgKCFzdHIpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBzY29wZWRDbGFzc0NhbmRpZGF0ZXMuc29tZSgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgPT09IHN0cik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIEF0dHJOb2RlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgaWYgKG5vZGUudmFsdWUudHlwZSA9PT0gJ1RleHROb2RlJyAmJiBub2RlLnZhbHVlLmNoYXJzKSB7XG4gICAgICAgICAgY29uc3QgcmVuYW1lZENsYXNzID0gcmVuYW1lQ2xhc3Mobm9kZS52YWx1ZS5jaGFycywgcG9zdGZpeCwgY2xhc3Nlcyk7XG5cbiAgICAgICAgICBub2RlLnZhbHVlLmNoYXJzID0gcmVuYW1lZENsYXNzO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUudHlwZSA9PT0gJ0NvbmNhdFN0YXRlbWVudCcpIHtcbiAgICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIG5vZGUudmFsdWUucGFydHMpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdUZXh0Tm9kZScgJiYgcGFydC5jaGFycykge1xuICAgICAgICAgICAgICBjb25zdCByZW5hbWVkQ2xhc3MgPSByZW5hbWVDbGFzcyhwYXJ0LmNoYXJzLCBwb3N0Zml4LCBjbGFzc2VzKTtcblxuICAgICAgICAgICAgICBwYXJ0LmNoYXJzID0gcmVuYW1lZENsYXNzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09ICdNdXN0YWNoZVN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgICAgcmVjYXN0LnRyYXZlcnNlKHBhcnQsIHtcbiAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmFtZWRDbGFzcyA9IHJlbmFtZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICBub2RlLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwb3N0Zml4LFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgRWxlbWVudE5vZGUobm9kZSkge1xuICAgICAgaWYgKHRhZ3MuaGFzKG5vZGUudGFnKSkge1xuICAgICAgICAvLyBjaGVjayBpZiBjbGFzcyBhdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgY29uc3QgY2xhc3NBdHRyID0gbm9kZS5hdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IGF0dHIubmFtZSA9PT0gJ2NsYXNzJyk7XG5cbiAgICAgICAgaWYgKGNsYXNzQXR0cikge1xuICAgICAgICAgIGNsYXNzQXR0ci52YWx1ZS5jaGFycyArPSAnICcgKyBwb3N0Zml4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHB1c2ggY2xhc3MgYXR0cmlidXRlXG4gICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLnB1c2goXG4gICAgICAgICAgICByZWNhc3QuYnVpbGRlcnMuYXR0cignY2xhc3MnLCByZWNhc3QuYnVpbGRlcnMudGV4dChwb3N0Zml4KSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBBbGw6IHtcbiAgICAgIGVudGVyKG5vZGUpIHtcbiAgICAgICAgc3RhY2sucHVzaChub2RlKTtcbiAgICAgIH0sXG4gICAgICBleGl0KCkge1xuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIE11c3RhY2hlU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgIGxldCBjc3NDbGFzcztcblxuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY3NzQ2xhc3MgPSBub2RlLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aD8ucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGF0aD8ucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXRoPy5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY3NzQ2xhc3MgPSBub2RlLnBhdGgucGFyYW1zWzBdLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3NzQ2xhc3MpIHtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSByZWNhc3QuYnVpbGRlcnMudGV4dChyZW5hbWVDbGFzcyhjc3NDbGFzcywgcG9zdGZpeCkpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAocGFyZW50Py50eXBlID09PSAnQXR0ck5vZGUnKSB7XG4gICAgICAgICAgcGFyZW50LnF1b3RlVHlwZSA9ICdcIic7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGV4dE5vZGU7XG4gICAgICB9XG4gICAgfSxcblxuICAgIFN1YkV4cHJlc3Npb24obm9kZSkge1xuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgY3NzQ2xhc3MgPSBub2RlLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSByZWNhc3QuYnVpbGRlcnMubGl0ZXJhbChcbiAgICAgICAgICAnU3RyaW5nTGl0ZXJhbCcsXG4gICAgICAgICAgcmVuYW1lQ2xhc3MoY3NzQ2xhc3MsIHBvc3RmaXgpLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZShwYXRoKSB7XG4gIGlmICghcGF0aCkgcmV0dXJuO1xuXG4gIGlmICgndmFsdWUnIGluIHBhdGgpIHtcbiAgICByZXR1cm4gcGF0aC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXByZWNhdGVkIGluIGVtYmVyIDUuOStcbiAgICogKHNvIHdlIHVzZSB0aGUgYWJvdmUgZm9yIG5ld2VyIGVtYmVycylcbiAgICovXG4gIHJldHVybiBwYXRoLm9yaWdpbmFsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXdyaXRlSGJzKGhicywgY2xhc3NlcywgdGFncywgcG9zdGZpeCkge1xuICBsZXQgYXN0ID0gcmVjYXN0LnBhcnNlKGhicyk7XG5cbiAgcmVjYXN0LnRyYXZlcnNlKGFzdCwgdGVtcGxhdGVQbHVnaW4oeyBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4IH0pKTtcblxuICBsZXQgcmVzdWx0ID0gcmVjYXN0LnByaW50KGFzdCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICIvKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcG9zdGZpeFxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW2NsYXNzZXNJbkNzc11cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5hbWVDbGFzcyhjbGFzc05hbWUsIHBvc3RmaXgsIGNsYXNzZXNJbkNzcykge1xuICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHJlbmFtZWRDbGFzc2VzID0gY2xhc3Nlc1xuICAgIC5maWx0ZXIoKGMpID0+IGMpXG4gICAgLm1hcCgoYykgPT4gYy50cmltKCkpXG4gICAgLm1hcCgoYykgPT4ge1xuICAgICAgaWYgKCFjbGFzc2VzSW5Dc3MgfHwgY2xhc3Nlc0luQ3NzLmhhcyhjKSkge1xuICAgICAgICBpZiAoYy5lbmRzV2l0aChwb3N0Zml4KSkgcmV0dXJuIGM7XG5cbiAgICAgICAgcmV0dXJuIGMgKyAnXycgKyBwb3N0Zml4O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYztcbiAgICB9KVxuICAgIC5qb2luKCcgJyk7XG5cbiAgY29uc3QgcmVuYW1lZFdpdGhQcmVzZXJ2ZWRTcGFjZXMgPSBjbGFzc05hbWUucmVwbGFjZShcbiAgICBjbGFzc05hbWUudHJpbVN0YXJ0KCkudHJpbUVuZCgpLFxuICAgIHJlbmFtZWRDbGFzc2VzLFxuICApO1xuXG4gIHJldHVybiByZW5hbWVkV2l0aFByZXNlcnZlZFNwYWNlcztcbn1cbiIsICIvKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BnbGltbWVyL3N5bnRheCcpLkFTVFBsdWdpbn0gQVNUUGx1Z2luXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAZ2xpbW1lci9zeW50YXgnKS5BU1RQbHVnaW5FbnZpcm9ubWVudH0gQVNUUGx1Z2luRW52aXJvbm1lbnRcbiAqXG4gKi9cblxuaW1wb3J0IHsgcmV3cml0ZUNzcyB9IGZyb20gJy4uL2xpYi9jc3MvcmV3cml0ZS5qcyc7XG5pbXBvcnQgeyBnZXRDU1NDb250ZW50SW5mbywgZ2V0Q1NTSW5mbyB9IGZyb20gJy4uL2xpYi9jc3MvdXRpbHMuanMnO1xuaW1wb3J0IHsgZml4RmlsZW5hbWUgfSBmcm9tICcuLi9saWIvcGF0aC90ZW1wbGF0ZS10cmFuc2Zvcm0tcGF0aHMuanMnO1xuaW1wb3J0IHtcbiAgYXBwUGF0aCxcbiAgY3NzUGF0aEZvcixcbiAgaGFzaEZyb21Nb2R1bGVQYXRoLFxuICBpc1JlbGV2YW50RmlsZSxcbn0gZnJvbSAnLi4vbGliL3BhdGgvdXRpbHMuanMnO1xuaW1wb3J0IHsgbWFrZVJlcXVlc3QgfSBmcm9tICcuLi9saWIvcmVxdWVzdC5qcyc7XG5pbXBvcnQgeyB0ZW1wbGF0ZVBsdWdpbiB9IGZyb20gJy4uL2xpYi9yZXdyaXRlSGJzLmpzJztcblxuY29uc3Qgbm9vcFBsdWdpbiA9IHtcbiAgbmFtZTogJ2VtYmVyLXNjb3BlZC1jc3M6bm9vcCcsXG4gIHZpc2l0b3I6IHt9LFxufTtcblxuLyoqXG4gKiBAcmV0dXJucyB7QVNUUGx1Z2lufVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGx1Z2luKGNvbmZpZykge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBU1RQbHVnaW5FbnZpcm9ubWVudH0gZW52XG4gICAqL1xuICByZXR1cm4gZnVuY3Rpb24gc2NvcGVkQ3NzKGVudikge1xuICAgIGxldCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGxldCBpc1JlbGV2YW50ID0gaXNSZWxldmFudEZpbGUoZW52LmZpbGVuYW1lLCB7XG4gICAgICBhZGRpdGlvbmFsUm9vdHM6IGNvbmZpZy5hZGRpdGlvbmFsUm9vdHMsXG4gICAgICBjd2QsXG4gICAgfSk7XG5cbiAgICBpZiAoIWlzUmVsZXZhbnQpIHtcbiAgICAgIHJldHVybiBub29wUGx1Z2luO1xuICAgIH1cblxuICAgIGxldCBhYnNvbHV0ZVBhdGggPSBmaXhGaWxlbmFtZShlbnYuZmlsZW5hbWUpO1xuICAgIGxldCBtb2R1bGVQYXRoID0gYXBwUGF0aChhYnNvbHV0ZVBhdGgpO1xuICAgIGxldCBwb3N0Zml4ID0gaGFzaEZyb21Nb2R1bGVQYXRoKG1vZHVsZVBhdGgpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgbmFrZWQgdGFnIHNlbGVjdG9ycyBmb3VuZCBpbiB0aGUgQ1NTXG4gICAgICpcbiAgICAgKiBAdHlwZSB7U2V0PHN0cmluZz59XG4gICAgICovXG4gICAgbGV0IHNjb3BlZFRhZ3MgPSBuZXcgU2V0KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBjbGFzc2VzIGZvdW5kIGluIHRoZSBDU1NcbiAgICAgKlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICAgKi9cbiAgICBsZXQgc2NvcGVkQ2xhc3NlcyA9IG5ldyBTZXQoKTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7eyB0YWdzOiBTZXQ8c3RyaW5nPjsgY2xhc3NlczogU2V0PHN0cmluZz4gfX0gaW5mb1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFkZEluZm8oaW5mbykge1xuICAgICAgZm9yIChsZXQgaXRlbSBvZiBpbmZvLnRhZ3MpIHtcbiAgICAgICAgc2NvcGVkVGFncy5hZGQoaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGl0ZW0gb2YgaW5mby5jbGFzc2VzKSB7XG4gICAgICAgIHNjb3BlZENsYXNzZXMuYWRkKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjc3NQYXRoID0gY3NzUGF0aEZvcihhYnNvbHV0ZVBhdGgpO1xuICAgIGxldCBpbmZvID0gZ2V0Q1NTSW5mbyhjc3NQYXRoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBiZSBmYWxzZXkgaWYgd2UgZG9uJ3QgaGF2ZSBhIGNvLWxvY2F0ZWQgQ1NTIGZpbGUuXG4gICAgICogV2UnbGwgc3RpbGwgd2FudCB0byBjaGVjayBmb3IgZW1iZWRkZWQgPHN0eWxlIHNjb3BlZD4gdGFncyB0aG91Z2guXG4gICAgICovXG4gICAgaWYgKGluZm8pIHtcbiAgICAgIGFkZEluZm8oaW5mbyk7XG5cbiAgICAgIGxldCBsb2NhbENzc1BhdGggPSBjc3NQYXRoLnJlcGxhY2UoY3dkICsgJy8nLCAnJyk7XG4gICAgICBsZXQgc2NvcGVkQ3NzID0gcmV3cml0ZUNzcyhcbiAgICAgICAgaW5mby5jc3MsXG4gICAgICAgIHBvc3RmaXgsXG4gICAgICAgIGxvY2FsQ3NzUGF0aCxcbiAgICAgICAgY29uZmlnLmxheWVyTmFtZSxcbiAgICAgICk7XG5cbiAgICAgIGxldCBjc3NSZXF1ZXN0ID0gbWFrZVJlcXVlc3QocG9zdGZpeCwgaW5mby5pZCwgc2NvcGVkQ3NzKTtcblxuICAgICAgLyoqXG4gICAgICAgKiBXaXRoIHRoaXMgd2UgZG9uJ3QgbmVlZCBhIEpTIHBsdWdpblxuICAgICAgICovXG4gICAgICBlbnYubWV0YS5qc3V0aWxzLmltcG9ydEZvclNpZGVFZmZlY3QoY3NzUmVxdWVzdCk7XG4gICAgfVxuXG4gICAgbGV0IHZpc2l0b3JzID0gdGVtcGxhdGVQbHVnaW4oe1xuICAgICAgY2xhc3Nlczogc2NvcGVkQ2xhc3NlcyxcbiAgICAgIHRhZ3M6IHNjb3BlZFRhZ3MsXG4gICAgICBwb3N0Zml4LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdlbWJlci1zY29wZWQtY3NzOnRlbXBsYXRlLXBsdWdpbicsXG4gICAgICB2aXNpdG9yOiB7XG4gICAgICAgIC8vIFN0YWNrIE1hbmFnZXJcbiAgICAgICAgLi4udmlzaXRvcnMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdlIGhhdmUgdG8gZWFnZXJseSBnZXQgdGhlIDxzdHlsZSBzY29wZWQ+IGNvbnRlbnRzLCBzbyB3ZSBjYW4gcHJlLXBhcnNlXG4gICAgICAgICAqIHRoZSB0YWdzIGFuZCBjbGFzc2VzIHRvIHRoZW4gcGFzcyB0byB0aGUgb3RoZXIgdmlzaXRvcnMgc28gdGhhdCB0aGV5IGNhblxuICAgICAgICAgKiBhcHByb3ByaWF0ZWx5IGNoYW5nZSBtYXRjaGluZyBjbGFzc2VzIC8gdGFncy5cbiAgICAgICAgICovXG4gICAgICAgIFRlbXBsYXRlKG5vZGUpIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBXZSBvbmx5IGFsbG93IGEgc2NvcGVkIDxzdHlsZT4gYXQgdGhlIHJvb3RcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBsZXQgc3R5bGVUYWcgPSBub2RlLmJvZHkuZmluZChcbiAgICAgICAgICAgIChuKSA9PiBuLnR5cGUgPT09ICdFbGVtZW50Tm9kZScgJiYgbi50YWcgPT09ICdzdHlsZScsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChoYXNTY29wZWRBdHRyaWJ1dGUoc3R5bGVUYWcpKSB7XG4gICAgICAgICAgICBsZXQgY3NzID0gdGV4dENvbnRlbnQoc3R5bGVUYWcpO1xuICAgICAgICAgICAgbGV0IGluZm8gPSBnZXRDU1NDb250ZW50SW5mbyhjc3MpO1xuICAgICAgICAgICAgbGV0IGxvY2FsQ3NzUGF0aCA9IGA8aW5saW5lPi9gICsgY3NzUGF0aC5yZXBsYWNlKGN3ZCArICcvJywgJycpO1xuICAgICAgICAgICAgbGV0IHNjb3BlZENzcyA9IHJld3JpdGVDc3MoXG4gICAgICAgICAgICAgIGluZm8uY3NzLFxuICAgICAgICAgICAgICBwb3N0Zml4LFxuICAgICAgICAgICAgICBsb2NhbENzc1BhdGgsXG4gICAgICAgICAgICAgIGNvbmZpZy5sYXllck5hbWUsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBhZGRJbmZvKGluZm8pO1xuXG4gICAgICAgICAgICBsZXQgY3NzUmVxdWVzdCA9IG1ha2VSZXF1ZXN0KHBvc3RmaXgsIGluZm8uaWQsIHNjb3BlZENzcyk7XG5cbiAgICAgICAgICAgIGVudi5tZXRhLmpzdXRpbHMuaW1wb3J0Rm9yU2lkZUVmZmVjdChjc3NSZXF1ZXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVmlzaXRvcnMgYnJva2VuIG91dCBsaWtlIHRoaXMgc28gd2UgY2FuIGNvbmRpdGlvbmFsbHlcbiAgICAgICAgLy8gZGVidWcgYmFzZWQgb24gZmlsZSBwYXRoLlxuICAgICAgICBBdHRyTm9kZSguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3JzLkF0dHJOb2RlKC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICBFbGVtZW50Tm9kZShub2RlLCB3YWxrZXIpIHtcbiAgICAgICAgICAvLyBjbGFzcyBhdHRyaWJ1dGUgaGFuZGxpbmdcbiAgICAgICAgICB2aXNpdG9ycy5FbGVtZW50Tm9kZShub2RlLCB3YWxrZXIpO1xuXG4gICAgICAgICAgaWYgKGhhc1Njb3BlZEF0dHJpYnV0ZShub2RlKSkge1xuICAgICAgICAgICAgaWYgKHdhbGtlci5wYXJlbnQ/Lm5vZGUudHlwZSAhPT0gJ1RlbXBsYXRlJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgJzxzdHlsZSBzY29wZWQ+IHRhZ3MgbXVzdCBiZSBhdCB0aGUgcm9vdCBvZiB0aGUgdGVtcGxhdGUsIHRoZXkgY2Fubm90IGJlIG5lc3RlZCcsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJldHVybmluZyBudWxsIHJlbW92ZXMgdGhlIG5vZGVcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgTXVzdGFjaGVTdGF0ZW1lbnQoLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9ycy5NdXN0YWNoZVN0YXRlbWVudCguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgU3ViRXhwcmVzc2lvbiguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3JzLlN1YkV4cHJlc3Npb24oLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH07XG59XG5cbi8qKlxuICogVGhhbmtzLCBDYXJkU3RhY2sgYW5kIEBlZjQgZm9yIHRoaXMgY29kZS5cbiAqL1xuY29uc3QgU0NPUEVEX0FUVFJJQlVURV9OQU1FID0gJ3Njb3BlZCc7XG5cbmZ1bmN0aW9uIGhhc1Njb3BlZEF0dHJpYnV0ZShub2RlKSB7XG4gIGlmICghbm9kZSkgcmV0dXJuO1xuICBpZiAobm9kZS50YWcgIT09ICdzdHlsZScpIHJldHVybjtcbiAgaWYgKG5vZGUudHlwZSAhPT0gJ0VsZW1lbnROb2RlJykgcmV0dXJuO1xuXG4gIHJldHVybiBub2RlLmF0dHJpYnV0ZXMuc29tZShcbiAgICAoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSA9PT0gU0NPUEVEX0FUVFJJQlVURV9OQU1FLFxuICApO1xufVxuXG5mdW5jdGlvbiB0ZXh0Q29udGVudChub2RlKSB7XG4gIGxldCB0ZXh0Q2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLmZpbHRlcigoYykgPT4gYy50eXBlID09PSAnVGV4dE5vZGUnKTtcblxuICByZXR1cm4gdGV4dENoaWxkcmVuLm1hcCgoYykgPT4gYy5jaGFycykuam9pbignJyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQSx5QkFBbUI7QUFDbkIscUJBQW1DO0FBQ25DLHlCQUE4QjtBQUM5Qix1QkFBaUI7OztBQzJCakIsU0FBUyxRQUFRLEdBQUcsR0FBRztBQUNyQixNQUFJLE9BQU8sSUFBSSxVQUFXLElBQUk7QUFDOUIsTUFBSSxPQUFPLEtBQUssT0FBTyxLQUFLLE9BQU8sT0FBTztBQUUxQyxTQUFRLE9BQU8sS0FBTyxNQUFNO0FBQzlCO0FBU0EsU0FBUyxjQUFjLEtBQUssS0FBSztBQUMvQixTQUFRLE9BQU8sTUFBUSxRQUFTLEtBQUs7QUFDdkM7QUFhQSxTQUFTLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDaEMsU0FBTyxRQUFRLGNBQWMsUUFBUSxRQUFRLEdBQUcsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUMzRTtBQWNBLFNBQVMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQ2xDLFNBQU8sT0FBUSxJQUFJLElBQU0sQ0FBQyxJQUFJLEdBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pEO0FBY0EsU0FBUyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDbEMsU0FBTyxPQUFRLElBQUksSUFBTSxJQUFJLENBQUMsR0FBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakQ7QUFjQSxTQUFTLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztBQUNsQyxTQUFPLE9BQU8sSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3hDO0FBY0EsU0FBUyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDbEMsU0FBTyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzNDO0FBU0EsU0FBUyxRQUFRLEdBQUcsS0FBSztBQUV2QixJQUFFLE9BQU8sQ0FBQyxLQUFLLE9BQVEsTUFBTTtBQUM3QixLQUFLLE1BQU0sT0FBUSxLQUFNLEtBQUssRUFBRSxJQUFJO0FBRXBDLE1BQUk7QUFDSixNQUFJO0FBQ0osTUFBSTtBQUNKLE1BQUk7QUFDSixNQUFJO0FBQ0osTUFBSSxJQUFJO0FBQ1IsTUFBSSxJQUFJO0FBQ1IsTUFBSSxJQUFJO0FBQ1IsTUFBSSxJQUFJO0FBRVIsT0FBSyxJQUFJLEdBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSyxJQUFJO0FBQ2pDLFdBQU87QUFDUCxXQUFPO0FBQ1AsV0FBTztBQUNQLFdBQU87QUFFUCxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDekMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVM7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVM7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE1BQU07QUFDM0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFdBQVc7QUFDaEQsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFNBQVM7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFdBQVc7QUFDaEQsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFVBQVU7QUFFL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVc7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFNBQVM7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzFDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxRQUFRO0FBQzVDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxVQUFVO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTO0FBQzVDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTO0FBQzVDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxXQUFXO0FBRWhELFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPO0FBQzFDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxVQUFVO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxTQUFTO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxXQUFXO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxXQUFXO0FBQ2hELFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxTQUFTO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksVUFBVTtBQUMxQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVTtBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksUUFBUTtBQUM1QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVTtBQUM3QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksVUFBVTtBQUMvQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksU0FBUztBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVTtBQUU5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDekMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFdBQVc7QUFDaEQsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVM7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFFBQVE7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVc7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxN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QUtBLElBQU0sd0JBQXdCO0FBRTlCLFNBQVMsbUJBQW1CLE1BQU07QUFDaEMsTUFBSSxDQUFDLEtBQU07QUFDWCxNQUFJLEtBQUssUUFBUSxRQUFTO0FBQzFCLE1BQUksS0FBSyxTQUFTLGNBQWU7QUFFakMsU0FBTyxLQUFLLFdBQVc7QUFBQSxJQUNyQixDQUFDLGNBQWMsVUFBVSxTQUFTO0FBQUEsRUFDcEM7QUFDRjtBQUVBLFNBQVMsWUFBWSxNQUFNO0FBQ3pCLE1BQUksZUFBZSxLQUFLLFNBQVMsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLFVBQVU7QUFFcEUsU0FBTyxhQUFhLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUNqRDs7O0FaM0xPLElBQU0sZUFBZSw0QkFBa0I7IiwKICAibmFtZXMiOiBbImtleSIsICJoYXNoIiwgInBhdGgiLCAiYXNzZXJ0IiwgImZzU3luYyIsICJwYXRoIiwgImltcG9ydF9ub2RlX3BhdGgiLCAicGF0aCIsICJpbXBvcnRfcG9zdGNzcyIsICJpbXBvcnRfcG9zdGNzc19zZWxlY3Rvcl9wYXJzZXIiLCAiaGFzaCIsICJwb3N0Y3NzIiwgInBhcnNlciIsICJwYXJzZXIiLCAicG9zdGNzcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgInBhdGgiLCAicmVjYXN0IiwgIm5vZGUiLCAicGF0aCIsICJpbmZvIiwgInNjb3BlZENzcyJdCn0K
939
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2luZGV4LmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC91dGlscy5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvbWQ1LmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMiLCAiLi4vLi4vc3JjL2J1aWxkL2JhYmVsLXBsdWdpbi5qcyIsICIuLi8uLi9zcmMvYnVpbGQvc2NvcGVkLWNzcy11bnBsdWdpbi5qcyIsICIuLi8uLi9zcmMvbGliL3JlcXVlc3QuanMiLCAiLi4vLi4vc3JjL2xpYi9jc3MvcmV3cml0ZS5qcyIsICIuLi8uLi9zcmMvbGliL2Nzcy91dGlscy5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvdGVtcGxhdGUtdHJhbnNmb3JtLXBhdGhzLmpzIiwgIi4uLy4uL3NyYy9saWIvcmV3cml0ZUhicy5qcyIsICIuLi8uLi9zcmMvbGliL3JlbmFtZUNsYXNzLmpzIiwgIi4uLy4uL3NyYy9idWlsZC90ZW1wbGF0ZS1wbHVnaW4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IGRlZmF1bHQgYXMgYmFiZWxQbHVnaW4gfSBmcm9tICcuL2JhYmVsLXBsdWdpbi5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHNjb3BlZENzc1VucGx1Z2luIH0gZnJvbSAnLi9zY29wZWQtY3NzLXVucGx1Z2luLmpzJztcbmV4cG9ydCB7IGNyZWF0ZVBsdWdpbiBhcyB0ZW1wbGF0ZVBsdWdpbiB9IGZyb20gJy4vdGVtcGxhdGUtcGx1Z2luLmpzJztcblxuaW1wb3J0IHsgZGVmYXVsdCBhcyBzY29wZWRDc3NVbnBsdWdpbiB9IGZyb20gJy4vc2NvcGVkLWNzcy11bnBsdWdpbi5qcyc7XG5cbmV4cG9ydCBjb25zdCByb2xsdXBQbHVnaW4gPSBzY29wZWRDc3NVbnBsdWdpbi5yb2xsdXA7XG4iLCAiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgZnNTeW5jLCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuaW1wb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5leHBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuZXhwb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5jb25zdCBDT01QT05FTlRfRVhURU5TSU9OUyA9IFsnLmd0cycsICcuZ2pzJywgJy50cycsICcuanMnLCAnLmhicyddO1xuXG4vLyBDSlMgLyBFU00/XG5sZXQgaGVyZSA9IGltcG9ydC5tZXRhLnVybDtcbmxldCBvdXJSZXF1aXJlID0gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gID8gZ2xvYmFsVGhpcy5yZXF1aXJlXG4gIDogaGVyZSAmJiBjcmVhdGVSZXF1aXJlKGhlcmUpO1xuXG5pZiAoIW91clJlcXVpcmUpIHtcbiAgb3VyUmVxdWlyZSA9IHJlcXVpcmU7XG59XG5cbmNvbnN0IElSUkVMRVZBTlRfUEFUSFMgPSBbJ25vZGVfbW9kdWxlcy8ucG5wbScsICdfX3ZpdGUtJ107XG5jb25zdCBVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUyA9IG5ldyBTZXQoWyd0ZXN0cyddKTtcblxuY29uc3QgQ1dEID0gcHJvY2Vzcy5jd2QoKTtcblxuLyoqXG4gKiBSZWdhcmRsZXNzIG9mIHdoYXQgdGhlIGZpbGVQYXRoIGZvcm1hdCBpcyxcbiAqIHRoaXMgd2lsbCB0cnkgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHBvc3RmaXguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaEZyb20oZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBoYXNoRnJvbUFic29sdXRlUGF0aChmaWxlUGF0aCk7XG4gIH1cblxuICByZXR1cm4gaGFzaEZyb21Nb2R1bGVQYXRoKGZpbGVQYXRoKTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzSGFzQXNzb2NpYXRlZENvbXBvbmVudChjc3NQYXRoKSB7XG4gIHJldHVybiBjc3NIYXNTdGFuZGFyZEZpbGUoY3NzUGF0aCkgfHwgY3NzSGFzUG9kc0ZpbGUoY3NzUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGNzc0hhc1N0YW5kYXJkRmlsZShpZCkge1xuICAvKipcbiAgICogTm9ybWFsbHkgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBhIEpTIHBhdGggaGVyZSwgYnV0IHdoZW4gdXNpbmdcbiAgICogZW1icm9pZGVyQDMsIHdlIGhhdmUgYSBcInJld3JpdHRlbiBhcHBcIiwgd2hpY2ggaGFzIGFsbCBvdXIgc291cmNlXG4gICAqIHByZXByb2Nlc3NlZCBhIGJpdCBiZWZvcmUgc2NvcGVkLWNzcyB0cmFuc2Zvcm1hdGlvbnMuXG4gICAqXG4gICAqIChJbiBWaXRlLCB3ZSBvcGVyYXRlIG1vcmUgZGlyZWN0bHkgd2l0aCB0aGUgc291cmNlKVxuICAgKi9cbiAgZm9yIChsZXQgZXh0IG9mIENPTVBPTkVOVF9FWFRFTlNJT05TKSB7XG4gICAgbGV0IGNhbmRpZGF0ZVBhdGggPSBpZC5yZXBsYWNlKC9cXC5jc3MkLywgZXh0KTtcblxuICAgIGlmIChleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNzc0hhc1BvZHNGaWxlKGlkKSB7XG4gIGlmICghaWQuZW5kc1dpdGgoJ3N0eWxlcy5jc3MnKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxseSB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGEgSlMgcGF0aCBoZXJlLCBidXQgd2hlbiB1c2luZ1xuICAgKiBlbWJyb2lkZXJAMywgd2UgaGF2ZSBhIFwicmV3cml0dGVuIGFwcFwiLCB3aGljaCBoYXMgYWxsIG91ciBzb3VyY2VcbiAgICogcHJlcHJvY2Vzc2VkIGEgYml0IGJlZm9yZSBzY29wZWQtY3NzIHRyYW5zZm9ybWF0aW9ucy5cbiAgICpcbiAgICogKEluIFZpdGUsIHdlIG9wZXJhdGUgbW9yZSBkaXJlY3RseSB3aXRoIHRoZSBzb3VyY2UpXG4gICAqL1xuICBmb3IgKGxldCBleHQgb2YgQ09NUE9ORU5UX0VYVEVOU0lPTlMpIHtcbiAgICBsZXQgY2FuZGlkYXRlUGF0aCA9IGlkLnJlcGxhY2UoL3N0eWxlc1xcLmNzcyQvLCBgdGVtcGxhdGUke2V4dH1gKTtcblxuICAgIGlmIChleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQmFzZWQgb24gZW1iZXIncyBjb21wb25lbnQgbG9jYXRpb24gY29udmVudGlvbnMsXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSBhIHBhdGggZm9yIHdoZXJlIHdlXG4gKiBleHBlY3QgdGhlIENTUyB0byBsaXZlLlxuICpcbiAqIEZvciBjby1sb2NhdGVkIHN0cnVjdHVyZTpcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC5oYnNcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC5jc3NcbiAqXG4gKiBGb3IgbmVzdGVkIGNvLWxvY2F0ZWQgc3RydWN0dXJlXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQvZm9vLmhic1xuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50L2Zvby5jc3NcbiAqXG4gKiBGb3IgUG9kcyByb3V0ZXMgc3RydWN0dXJlXG4gKiAgIC0gcm91dGVzL215LXJvdXRlL3RlbXBsYXRlLntoYnMsanN9XG4gKiAgIC0gcm91dGVzL215LXJvdXRlL3N0eWxlcy5jc3NcbiAqXG4gKiBEZWxpYmVyYXRlbHkgbm90IHN1cHBvcnRlZDpcbiAqICAgLSBjb21wb25lbnRzIHcvIHBvZHMgLS0gdGhpcyBpcyBkZXByZWNhdGVkIGluIDUuMTBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWUgLSB0aGUgaGJzLCBqcywgZ2pzLCBndHMgb3Igd2hhdGV2ZXIgY28tbG9jYXRlZCBwYXRoLlxuICogQHJldHVybnMge3N0cmluZ30gLSBleHBlY3RlZCBjc3MgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzUGF0aEZvcihmaWxlTmFtZSkge1xuICBsZXQgd2l0aG91dEV4dCA9IHdpdGhvdXRFeHRlbnNpb24oZmlsZU5hbWUpO1xuICBsZXQgY3NzUGF0aCA9IHdpdGhvdXRFeHQgKyAnLmNzcyc7XG5cbiAgaWYgKGlzUG9kKGZpbGVOYW1lKSkge1xuICAgIGNzc1BhdGggPSBmaWxlTmFtZVxuICAgICAgLnJlcGxhY2UoL3RlbXBsYXRlXFwuanMkLywgJ3N0eWxlcy5jc3MnKVxuICAgICAgLnJlcGxhY2UoL3RlbXBsYXRlXFwuaGJzLywgJ3N0eWxlcy5jc3MnKTtcbiAgfVxuXG4gIHJldHVybiBjc3NQYXRoO1xufVxuXG4vKipcbiAqIE5vdGUgdGhhdCBjb21wb25lbnRzIGluIHRoZSBcInBvZHNcIiBjb252ZW50aW9uIHdpbGxcbiAqIG5ldmVyIGJlIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG9kVGVtcGxhdGUoZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLmluY2x1ZGVzKCcvY29tcG9uZW50cy8nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aCgndGVtcGxhdGUuanMnKSB8fCBmaWxlUGF0aC5lbmRzV2l0aCgndGVtcGxhdGUuaGJzJyk7XG59XG5cbi8qKlxuICogTm90ZSB0aGF0IGNvbXBvbmVudHMgaW4gdGhlIFwicG9kc1wiIGNvbnZlbnRpb24gd2lsbFxuICogbmV2ZXIgYmUgc3VwcG9ydGVkLlxuICpcbiAqIENoZWNrcyBpZiBhIGZpbGUgZW5kcyB3aXRoXG4gKiAtIHRlbXBsYXRlLmpzXG4gKiAtIHRlbXBsYXRlLmhic1xuICogLSBzdHlsZXMuY3NzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BvZChmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoJy9jb21wb25lbnRzLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzUG9kVGVtcGxhdGUoZmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguZW5kc1dpdGgoJ3N0eWxlcy5jc3MnKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKiBAcmV0dXJucyB0aGUgc2FtZSBwYXRoLCBidXQgd2l0aG91dCB0aGUgZXh0ZW5zaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRob3V0RXh0ZW5zaW9uKGZpbGVQYXRoKSB7XG4gIGxldCBwYXJzZWQgPSBwYXRoLnBhcnNlKGZpbGVQYXRoKTtcblxuICByZXR1cm4gcGF0aC5qb2luKHBhcnNlZC5kaXIsIHBhcnNlZC5uYW1lKTtcbn1cblxuLyoqXG4gKiBFeGFtcGxlcyBmb3IgZmlsZU5hbWVcbiAqIC0gYWJzb2x1dGUgb24tZGlzayBwYXRoXG4gKiAtIGluIHdlYnBhY2tcbiAqICAgLSBVUkwtYWJzb2x1dGUgcGF0aCwgc3RhcnRpbmcgd2l0aCAvXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lXG4gKiBAcGFyYW0ge3sgYWRkaXRpb25hbFJvb3RzPzogc3RyaW5nW107IGN3ZDogc3RyaW5nIH19IG9wdGlvbnNcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGV2YW50RmlsZShmaWxlTmFtZSwgeyBhZGRpdGlvbmFsUm9vdHMsIGN3ZCB9KSB7XG4gIC8vIEZha2UgZmlsZSBoYW5kbGVkIGJ5IHRlc3RlbSBzZXJ2ZXIgd2hlbiBpdCBydW5zXG4gIGlmIChmaWxlTmFtZS5zdGFydHNXaXRoKCcvdGVzdGVtJykpIHJldHVybiBmYWxzZTtcbiAgLy8gUHJpdmF0ZSBWaXJ0dWFsIE1vZHVsZXNcbiAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ1xcMCcpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZXNlIGFyZSBub3QgdmFsaWQgdXNlcmxhbmQgbmFtZXMgKG9yIGFyZSBmcm9tIGxpYnJhcmllcylcbiAgaWYgKGZpbGVOYW1lLm1hdGNoKC9eW2EtekEtWl0vKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBFeHRlcm5hbCB0byB1c1xuICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnL0BlbWJyb2lkZXInKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoSVJSRUxFVkFOVF9QQVRIUy5zb21lKChpKSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhpKSkpIHJldHVybiBmYWxzZTtcblxuICBsZXQgd29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoZmlsZU5hbWUpO1xuXG4gIGFzc2VydChjd2QsIGBjd2Qgd2FzIG5vdCBwYXNzZWQgdG8gaXNSZWxldmFudEZpbGVgKTtcblxuICBsZXQgb3VyV29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoY3dkKTtcblxuICBpZiAod29ya3NwYWNlICE9PSBvdXJXb3Jrc3BhY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgbG9jYWwgPSBmaWxlTmFtZS5yZXBsYWNlKHdvcmtzcGFjZSwgJycpO1xuICBsZXQgWywgLi4ucGFydHNdID0gbG9jYWwuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKFVOU1VQUE9SVEVEX0RJUkVDVE9SSUVTLmhhcyhwYXJ0c1swXSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IHBvZHMgc3VwcG9ydC5cbiAgICogZm9sa3MgbmVlZCB0byBvcHQgaW4gdG8gcG9kcyAocm91dGVzKSwgYmVjYXVzZSBldmVyeSBwb2RzIGFwcCBjYW4gYmUgY29uZmlndXJlZCBkaWZmZXJlbnRseVxuICAgKi9cbiAgbGV0IHJvb3RzID0gWycvY29tcG9uZW50cy8nLCAnL3RlbXBsYXRlcy8nLCAuLi4oYWRkaXRpb25hbFJvb3RzIHx8IFtdKV07XG5cbiAgaWYgKCFyb290cy5zb21lKChyb290KSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhyb290KSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHBhY2thZ2VTY29wZWRQYXRoKSB7XG4gIC8qKlxuICAgKiAqQnkgY29udmVudGlvbiosIGBzcmNgIGlzIG9taXR0ZWQgZnJvbSBjb21wb25lbnQgcGF0aHMuXG4gICAqIFdlIGNhbiByZWZsZWN0IHRoZSBzYW1lIGJlaGF2aW9yIGJ5IHJlcGxhY2luZyBzcmMvXG4gICAqIHdpdGggYW4gZW1wdHkgc3RyaW5nLlxuICAgKlxuICAgKiBDU1MgaXNuJ3QgZW1pdHRlZCBhcyBhIGNvLWxvY2F0ZWQgbW9kdWxlLCBidXRcbiAgICogdG8ga2VlcCBjb252ZW50aW9ucyBjb25zaXN0ZW50IGFjcm9zcyBsYW5ndWFnZXMsXG4gICAqIHdlIGNhbiBwcmV0ZW5kIGl0IGlzLlxuICAgKlxuICAgKiBBbnkgY3VzdG9taXphdGlvbiBiZXlvbmQgcmVtb3ZpbmcgYHNyY2AgYW5kIGBhcHBgIGlzIHBvdGVudGlhbGx5IGNvbmZ1c2luZy5cbiAgICogSWYgd2UgbmVlZCBmdXJ0aGVyIGN1c3RvbWl6YXRpb25zLCB3ZSdsbCB3YW50IHRvIG1hdGNoIG9uIGBleHBvcnRzYCBpbiB0aGVcbiAgICogY29ycmVzcG9uZGluZyBwYWNrYWdlLmpzb25cbiAgICovXG4gIGxldCBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlU2NvcGVkUGF0aC5yZXBsYWNlKC9eXFwvc3JjXFwvLywgJy8nKTtcblxuICBsZXQgcGFyc2VkID0gcGF0aC5wYXJzZShwYWNrYWdlUmVsYXRpdmUpO1xuXG4gIGlmIChpc1BvZChwYWNrYWdlUmVsYXRpdmUpKSB7XG4gICAgLyoqXG4gICAgICogRm9yIHBvZHMsIHdlIGNob3Agb2ZmIHRoZSB3aG9sZSBmaWxlLCBhbmQgdXNlIHRoZSBkaXIgbmFtZSBhcyB0aGUgXCJtb2R1bGVQYXRoXCJcbiAgICAgKi9cbiAgICByZXR1cm4gcGFyc2VkLmRpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhbiBleHRlbnNpb24gaXMgcGFzc2VkLCByZW1vdmUgaXQuXG4gICAqIFdoZW4gdXNpbmcgcGFja2FnZXJzLCBmb2xrcyBhcmUgdXNlZCB0byBub3QgaGF2aW5nIHRvIHNwZWNpZnkgZXh0ZW5zaW9ucyBmb3IgZmlsZXMuXG4gICAqIFNpbmNlIHdlIGRvbid0IGV2ZW4gZW1pdCBjc3MgZmlsZXMgY28tbG9jYXRlZCB0byBlYWNoIG1vZHVsZSxcbiAgICogdGhpcyBoZWxwcyB1cyBub3QgY29udmV5IGEgbGllIHRoYXQgYSBmaWxlIG1heSBleGlzdCBpbiBhdCBydW50aW1lLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSBgPG1vZHVsZS1uYW1lPi9jb21wb25lbnRzL2J1dHRvbmAuXG4gICAqIEl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGV4dGVuc2lvbiBpcywgYmVjYXVzZSB5b3UgY2FuIG9ubHkgaGF2ZSBvbmUgY3NzIGZpbGVcbiAgICogZm9yIHRoZSBidXR0b24gbW9kdWxlIGFueXdheS5cbiAgICovXG4gIGxldCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID0gcGF0aC5qb2luKHBhcnNlZC5kaXIsIHBhcnNlZC5uYW1lKTtcblxuICByZXR1cm4gbG9jYWxQYWNrYWdlclN0eWxlUGF0aDtcbn1cblxuLyoqXG4gKiByZXR1cm5zIHRoZSBhcHAtbW9kdWxlIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlXG4gKlxuICogVGhpcyBhc3N1bWVzIG5vcm1hbCBlbWJlciBhcHAgY29udmVudGlvbnNcbiAqXG4gKiB3aGljaCBpcyBgPHBhY2thZ2UuanNvbiNuYW1lPi9wYXRoLXRvLWZpbGVgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBQYXRoKHNvdXJjZVBhdGgpIHtcbiAgbGV0IHdvcmtzcGFjZVBhdGggPSBmaW5kV29ya3NwYWNlUGF0aChzb3VyY2VQYXRoKTtcbiAgbGV0IG5hbWUgPSBtb2R1bGVOYW1lKHNvdXJjZVBhdGgpO1xuXG4gIC8qKlxuICAgKiAgVW5kZXIgZW1icm9pZGVyIGJ1aWxkcywgdGhlIHNwZWMtY29tcGxpYW50IHZlcnNpb24gb2YgdGhlIGFwcFxuICAgKiBoYXMgYWxsIHRoZSBmaWxlcyB1bmRlciBhIGZvbGRlciB3aGljaCByZXByZXNlbnRzIHRoZSBwYWNrYWdlIG5hbWUsXG4gICAqIHJhdGhlciB0aGFuIFwiYXBwXCIuXG4gICAqL1xuICBsZXQgcGFja2FnZVJlbGF0aXZlID0gc291cmNlUGF0aC5yZXBsYWNlKHdvcmtzcGFjZVBhdGgsICcnKTtcblxuICAvKipcbiAgICogQnV0IHdlIGFsc28gZG9uJ3Qgd2FudCAnYXBwJyAtLSB3aGljaCBpcyBwcmVzZW50IGluIHRoZSB2MSBhZGRvbiBwaXBlbGluZVxuICAgKi9cbiAgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVJlbGF0aXZlLnJlcGxhY2UoYC9hcHAvYCwgYC9gKTtcblxuICAvLyBBbnkgb2YgdGhlIGFib3ZlIHJlbHBhY2VtZW50cyBjb3VsZCBhY2NpZGVudGFsbHkgZ2l2ZSB1cyBhbiBleHRyYSAvIChkZXBlbmRpbmcgb24gb3VyIGJ1aWxkIGVudmlyb25tZW50KVxuICBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlUmVsYXRpdmUucmVwbGFjZSgnLy8nLCAnLycpO1xuXG4gIGxldCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID0gcGFja2FnZVNjb3BlZFBhdGhUb01vZHVsZVBhdGgocGFja2FnZVJlbGF0aXZlKTtcblxuICByZXR1cm4gYCR7bmFtZX0ke2xvY2FsUGFja2FnZXJTdHlsZVBhdGh9YDtcbn1cblxuLyoqXG4gKiBUbyBhdm9pZCBoaXR0aW5nIHRoZSBmaWxlc3lzZXRtLCB3ZSdsbCBzdG9yZSBhbGwgZm91bmRcbiAqIHByb2plY3QgcGF0aHMgYmVyZSwgc28gd2UgY2FuLCBpbiBtZW1vcnksXG4gKiBnZXQgdGhlIGZvbGRlciB3aGVyZSBhIHBhY2thZ2UuanNvbiBleGlzdHMsIHJhdGhlciB0aGFuXG4gKiBoaXQgdGhlIGZpbGUgc3lzdGVtIGV2ZXJ5IHRpbWUuXG4gKi9cbmNvbnN0IFNFRU4gPSBuZXcgU2V0KCk7XG5cbmZ1bmN0aW9uIGdldFNlZW4oc291cmNlUGF0aCkge1xuICBpZiAoU0VFTi5oYXMoc291cmNlUGF0aCkpIHJldHVybiBzb3VyY2VQYXRoO1xuXG4gIGxldCBwYXJ0cyA9IHNvdXJjZVBhdGguc3BsaXQoJy8nKTtcblxuICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+IDE7IGktLSkge1xuICAgIGxldCB0b0NoZWNrID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpO1xuXG4gICAgbGV0IHNlZW4gPSBTRUVOLmhhcyh0b0NoZWNrKTtcblxuICAgIGlmIChzZWVuKSB7XG4gICAgICByZXR1cm4gdG9DaGVjaztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgsIG9wdGlvbnMpIHtcbiAgbGV0IGN3ZCA9IG9wdGlvbnM/LmN3ZCA/PyBDV0Q7XG5cbiAgaWYgKHNvdXJjZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gIH1cblxuICBsZXQgc2VlbiA9IGdldFNlZW4oc291cmNlUGF0aCk7XG5cbiAgaWYgKHNlZW4pIHtcbiAgICByZXR1cm4gc2VlbjtcbiAgfVxuXG4gIGxldCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKHNvdXJjZVBhdGgsICdwYWNrYWdlLmpzb24nKTtcblxuICBjb25zdCBpc1dvcmtzcGFjZSA9IGZzU3luYy5leGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpO1xuXG4gIGlmIChpc1dvcmtzcGFjZSkge1xuICAgIHJldHVybiBzb3VyY2VQYXRoO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gZmluZFBhY2thZ2VKc29uVXAoc291cmNlUGF0aCwgeyBjd2QgfSk7XG5cbiAgaWYgKCFwYWNrYWdlSnNvblBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcHJvamVjdCBmb3IgJHtzb3VyY2VQYXRofWApO1xuICB9XG5cbiAgY29uc3Qgd29ya3NwYWNlUGF0aCA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpO1xuXG4gIFNFRU4uYWRkKHdvcmtzcGFjZVBhdGgpO1xuXG4gIHJldHVybiB3b3Jrc3BhY2VQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kUGFja2FnZUpzb25VcChzdGFydFBhdGgsIG9wdGlvbnMpIHtcbiAgbGV0IGN3ZCA9IG9wdGlvbnM/LmN3ZCA/PyBDV0Q7XG4gIGxldCBwYXJ0cyA9IHN0YXJ0UGF0aC5zcGxpdCgnLycpO1xuXG4gIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID4gMTsgaS0tKSB7XG4gICAgbGV0IHRvQ2hlY2sgPSBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7XG5cbiAgICBsZXQgcGFja2FnZUpzb24gPSBwYXRoLmpvaW4odG9DaGVjaywgJ3BhY2thZ2UuanNvbicpO1xuICAgIGxldCBleGlzdHMgPSBmc1N5bmMuZXhpc3RzU3luYyhwYWNrYWdlSnNvbik7XG5cbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICByZXR1cm4gcGFja2FnZUpzb247XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdHJhdmVyc2UgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgb2YgdGhlIGZpbGUgc3lzdGVtLlxuICAgIGlmICh0b0NoZWNrID09PSBjd2QpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBNQU5JRkVTVF9DQUNIRSA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBXaWxsIHJldHVybiB0aGUgcGFja2FnZS5qc29uI25hbWUsIG9yIGNvbmZpZy9lbnZpcm9ubWVudCNtb3VkbGVQcmVmaXggKGlmIHYxIGFwcClcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kdWxlTmFtZShzb3VyY2VQYXRoKSB7XG4gIGNvbnN0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgpO1xuICBjb25zdCBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KHdvcmtzcGFjZSk7XG5cbiAgcmV0dXJuIG1hbmlmZXN0Lm5hbWU7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmtzcGFjZVxuICovXG5mdW5jdGlvbiBnZXRNYW5pZmVzdCh3b3Jrc3BhY2UpIHtcbiAgbGV0IGV4aXN0aW5nID0gTUFOSUZFU1RfQ0FDSEUuZ2V0KHdvcmtzcGFjZSk7XG5cbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG5cbiAgbGV0IGJ1ZmZlciA9IGZzU3luYy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtzcGFjZSwgJ3BhY2thZ2UuanNvbicpKTtcbiAgbGV0IGNvbnRlbnQgPSBidWZmZXIudG9TdHJpbmcoKTtcbiAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuXG4gIE1BTklGRVNUX0NBQ0hFLnNldCh3b3Jrc3BhY2UsIGpzb24pO1xuXG4gIHJldHVybiBqc29uO1xufVxuIiwgIi8qXG4gKiBKYXZhU2NyaXB0IE1ENVxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvSmF2YVNjcmlwdC1NRDVcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogQmFzZWQgb25cbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2VcbiAqIERpZ2VzdCBBbGdvcml0aG0sIGFzIGRlZmluZWQgaW4gUkZDIDEzMjEuXG4gKiBWZXJzaW9uIDIuMiBDb3B5cmlnaHQgKEMpIFBhdWwgSm9obnN0b24gMTk5OSAtIDIwMDlcbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZVxuICogU2VlIGh0dHA6Ly9wYWpob21lLm9yZy51ay9jcnlwdC9tZDUgZm9yIG1vcmUgaW5mby5cbiAqXG4gKiBNb2RpZmljYXRpb25zOlxuICogLSByZW1vdmVkIElJRkUsIGV4cG9ydGVkIG1kNSAodGhpcyBmaWxlIGlzIG5vdyBFU00pXG4gKi9cblxuLyoqXG4gKiBBZGQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeMzIuXG4gKiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnMgaW50ZXJuYWxseSB0byB3b3JrIGFyb3VuZCBidWdzIGluIGludGVycHJldGVycy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0geCBGaXJzdCBpbnRlZ2VyXG4gKiBAcGFyYW0ge251bWJlcn0geSBTZWNvbmQgaW50ZWdlclxuICogQHJldHVybnMge251bWJlcn0gU3VtXG4gKi9cbmZ1bmN0aW9uIHNhZmVBZGQoeCwgeSkge1xuICB2YXIgbHN3ID0gKHggJiAweGZmZmYpICsgKHkgJiAweGZmZmYpO1xuICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG5cbiAgcmV0dXJuIChtc3cgPDwgMTYpIHwgKGxzdyAmIDB4ZmZmZik7XG59XG5cbi8qKlxuICogQml0d2lzZSByb3RhdGUgYSAzMi1iaXQgbnVtYmVyIHRvIHRoZSBsZWZ0LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW0gMzItYml0IG51bWJlclxuICogQHBhcmFtIHtudW1iZXJ9IGNudCBSb3RhdGlvbiBjb3VudFxuICogQHJldHVybnMge251bWJlcn0gUm90YXRlZCBudW1iZXJcbiAqL1xuZnVuY3Rpb24gYml0Um90YXRlTGVmdChudW0sIGNudCkge1xuICByZXR1cm4gKG51bSA8PCBjbnQpIHwgKG51bSA+Pj4gKDMyIC0gY250KSk7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gcSBxXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1Y21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIHNhZmVBZGQoYml0Um90YXRlTGVmdChzYWZlQWRkKHNhZmVBZGQoYSwgcSksIHNhZmVBZGQoeCwgdCkpLCBzKSwgYik7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0gYyBjXG4gKiBAcGFyYW0ge251bWJlcn0gZCBkXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1ZmYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKChiICYgYykgfCAofmIgJiBkKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0gYyBjXG4gKiBAcGFyYW0ge251bWJlcn0gZCBkXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1Z2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKChiICYgZCkgfCAoYyAmIH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0gYyBjXG4gKiBAcGFyYW0ge251bWJlcn0gZCBkXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1aGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbi8qKlxuICogQmFzaWMgb3BlcmF0aW9uIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYiBiXG4gKiBAcGFyYW0ge251bWJlcn0gYyBjXG4gKiBAcGFyYW0ge251bWJlcn0gZCBkXG4gKiBAcGFyYW0ge251bWJlcn0geCB4XG4gKiBAcGFyYW0ge251bWJlcn0gcyBzXG4gKiBAcGFyYW0ge251bWJlcn0gdCB0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXN1bHRcbiAqL1xuZnVuY3Rpb24gbWQ1aWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGMgXiAoYiB8IH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBNRDUgb2YgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcywgYW5kIGEgYml0IGxlbmd0aC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSB4IEFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gQml0IGxlbmd0aFxuICogQHJldHVybnMge0FycmF5PG51bWJlcj59IE1ENSBBcnJheVxuICovXG5mdW5jdGlvbiBiaW5sTUQ1KHgsIGxlbikge1xuICAvKiBhcHBlbmQgcGFkZGluZyAqL1xuICB4W2xlbiA+PiA1XSB8PSAweDgwIDw8IGxlbiAlIDMyO1xuICB4WygoKGxlbiArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNF0gPSBsZW47XG5cbiAgdmFyIGk7XG4gIHZhciBvbGRhO1xuICB2YXIgb2xkYjtcbiAgdmFyIG9sZGM7XG4gIHZhciBvbGRkO1xuICB2YXIgYSA9IDE3MzI1ODQxOTM7XG4gIHZhciBiID0gLTI3MTczMzg3OTtcbiAgdmFyIGMgPSAtMTczMjU4NDE5NDtcbiAgdmFyIGQgPSAyNzE3MzM4Nzg7XG5cbiAgZm9yIChpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgb2xkYSA9IGE7XG4gICAgb2xkYiA9IGI7XG4gICAgb2xkYyA9IGM7XG4gICAgb2xkZCA9IGQ7XG5cbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuXG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA1LCAtMTY1Nzk2NTEwKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNCwgNjQzNzE3NzEzKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpXSwgMjAsIC0zNzM4OTczMDIpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNSwgLTcwMTU1ODY5MSk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTQsIC0xODczNjM5NjEpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMl0sIDksIC01MTQwMzc4NCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcblxuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNCwgLTM3ODU1OCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE2LCAxODM5MDMwNTYyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMV0sIDQsIC0xNTMwOTkyMDYwKTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgNF0sIDExLCAxMjcyODkzMzUzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgN10sIDE2LCAtMTU1NDk3NjMyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTBdLCAyMywgLTEwOTQ3MzA2NDApO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDQsIDY4MTI3OTE3NCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaV0sIDExLCAtMzU4NTM3MjIyKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgM10sIDE2LCAtNzIyNTIxOTc5KTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgNl0sIDIzLCA3NjAyOTE4OSk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDldLCA0LCAtNjQwMzY0NDg3KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgMTJdLCAxMSwgLTQyMTgxNTgzNSk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTYsIDUzMDc0MjUyMCk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDJdLCAyMywgLTk5NTMzODY1MSk7XG5cbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG5cbiAgICBhID0gc2FmZUFkZChhLCBvbGRhKTtcbiAgICBiID0gc2FmZUFkZChiLCBvbGRiKTtcbiAgICBjID0gc2FmZUFkZChjLCBvbGRjKTtcbiAgICBkID0gc2FmZUFkZChkLCBvbGRkKTtcbiAgfVxuXG4gIHJldHVybiBbYSwgYiwgYywgZF07XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzIHRvIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBpbnB1dCBNRDUgQXJyYXlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IE1ENSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gYmlubDJyc3RyKGlucHV0KSB7XG4gIHZhciBpO1xuICB2YXIgb3V0cHV0ID0gJyc7XG4gIHZhciBsZW5ndGgzMiA9IGlucHV0Lmxlbmd0aCAqIDMyO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGgzMjsgaSArPSA4KSB7XG4gICAgb3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGlucHV0W2kgPj4gNV0gPj4+IGkgJSAzMikgJiAweGZmKTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHJhdyBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICogQ2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGlnaC1ieXRlIHNpbGVudGx5IGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IFJhdyBpbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSBBcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gKi9cbmZ1bmN0aW9uIHJzdHIyYmlubChpbnB1dCkge1xuICB2YXIgaTtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBvdXRwdXRbKGlucHV0Lmxlbmd0aCA+PiAyKSAtIDFdID0gdW5kZWZpbmVkO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBvdXRwdXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBvdXRwdXRbaV0gPSAwO1xuICB9XG5cbiAgdmFyIGxlbmd0aDggPSBpbnB1dC5sZW5ndGggKiA4O1xuXG4gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg4OyBpICs9IDgpIHtcbiAgICBvdXRwdXRbaSA+PiA1XSB8PSAoaW5wdXQuY2hhckNvZGVBdChpIC8gOCkgJiAweGZmKSA8PCBpICUgMzI7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgTUQ1IG9mIGEgcmF3IHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzIElucHV0IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gUmF3IE1ENSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gcnN0ck1ENShzKSB7XG4gIHJldHVybiBiaW5sMnJzdHIoYmlubE1ENShyc3RyMmJpbmwocyksIHMubGVuZ3RoICogOCkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIEhNQUMtTUQ1IG9mIGEga2V5IGFuZCBzb21lIGRhdGEgKHJhdyBzdHJpbmdzKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgSE1BQyBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIFJhdyBpbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJhdyBNRDUgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIHJzdHJITUFDTUQ1KGtleSwgZGF0YSkge1xuICB2YXIgaTtcbiAgdmFyIGJrZXkgPSByc3RyMmJpbmwoa2V5KTtcbiAgdmFyIGlwYWQgPSBbXTtcbiAgdmFyIG9wYWQgPSBbXTtcbiAgdmFyIGhhc2g7XG4gIGlwYWRbMTVdID0gb3BhZFsxNV0gPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGJrZXkubGVuZ3RoID4gMTYpIHtcbiAgICBia2V5ID0gYmlubE1ENShia2V5LCBrZXkubGVuZ3RoICogOCk7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkge1xuICAgIGlwYWRbaV0gPSBia2V5W2ldIF4gMHgzNjM2MzYzNjtcbiAgICBvcGFkW2ldID0gYmtleVtpXSBeIDB4NWM1YzVjNWM7XG4gIH1cblxuICBoYXNoID0gYmlubE1ENShpcGFkLmNvbmNhdChyc3RyMmJpbmwoZGF0YSkpLCA1MTIgKyBkYXRhLmxlbmd0aCAqIDgpO1xuXG4gIHJldHVybiBiaW5sMnJzdHIoYmlubE1ENShvcGFkLmNvbmNhdChoYXNoKSwgNTEyICsgMTI4KSk7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHJhdyBzdHJpbmcgdG8gYSBoZXggc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IFJhdyBpbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEhleCBlbmNvZGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiByc3RyMmhleChpbnB1dCkge1xuICB2YXIgaGV4VGFiID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuICB2YXIgb3V0cHV0ID0gJyc7XG4gIHZhciB4O1xuICB2YXIgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB4ID0gaW5wdXQuY2hhckNvZGVBdChpKTtcbiAgICBvdXRwdXQgKz0gaGV4VGFiLmNoYXJBdCgoeCA+Pj4gNCkgJiAweDBmKSArIGhleFRhYi5jaGFyQXQoeCAmIDB4MGYpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBFbmNvZGUgYSBzdHJpbmcgYXMgVVRGLThcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgSW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVVEY4IHN0cmluZ1xuICovXG5mdW5jdGlvbiBzdHIycnN0clVURjgoaW5wdXQpIHtcbiAgcmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCkpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgaW5wdXQgc3RyaW5nIGFzIHJhdyBNRDUgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHMgSW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSYXcgTUQ1IHN0cmluZ1xuICovXG5mdW5jdGlvbiByYXdNRDUocykge1xuICByZXR1cm4gcnN0ck1ENShzdHIycnN0clVURjgocykpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgaW5wdXQgc3RyaW5nIGFzIEhleCBlbmNvZGVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzIElucHV0IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gSGV4IGVuY29kZWQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGhleE1ENShzKSB7XG4gIHJldHVybiByc3RyMmhleChyYXdNRDUocykpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHJhdyBITUFDLU1ENSBmb3IgdGhlIGdpdmVuIGtleSBhbmQgZGF0YVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrIEhNQUMga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gZCBJbnB1dCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJhdyBNRDUgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIHJhd0hNQUNNRDUoaywgZCkge1xuICByZXR1cm4gcnN0ckhNQUNNRDUoc3RyMnJzdHJVVEY4KGspLCBzdHIycnN0clVURjgoZCkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIEhleCBlbmNvZGVkIEhNQUMtTUQ1IGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCBkYXRhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGsgSE1BQyBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBkIElucHV0IHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gUmF3IE1ENSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gaGV4SE1BQ01ENShrLCBkKSB7XG4gIHJldHVybiByc3RyMmhleChyYXdITUFDTUQ1KGssIGQpKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIE1ENSB2YWx1ZSBmb3IgYSBnaXZlbiBzdHJpbmcuXG4gKiBJZiBhIGtleSBpcyBwcm92aWRlZCwgY2FsY3VsYXRlcyB0aGUgSE1BQy1NRDUgdmFsdWUuXG4gKiBSZXR1cm5zIGEgSGV4IGVuY29kZWQgc3RyaW5nIHVubGVzcyB0aGUgcmF3IGFyZ3VtZW50IGlzIGdpdmVuLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgSW5wdXQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gSE1BQyBrZXlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jhd10gUmF3IG91dHB1dCBzd2l0Y2hcbiAqIEByZXR1cm5zIHtzdHJpbmd9IE1ENSBvdXRwdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1kNShzdHJpbmcsIGtleSwgcmF3KSB7XG4gIGlmICgha2V5KSB7XG4gICAgaWYgKCFyYXcpIHtcbiAgICAgIHJldHVybiBoZXhNRDUoc3RyaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmF3TUQ1KHN0cmluZyk7XG4gIH1cblxuICBpZiAoIXJhdykge1xuICAgIHJldHVybiBoZXhITUFDTUQ1KGtleSwgc3RyaW5nKTtcbiAgfVxuXG4gIHJldHVybiByYXdITUFDTUQ1KGtleSwgc3RyaW5nKTtcbn1cbiIsICJpbXBvcnQgeyBtZDUgfSBmcm9tICcuL21kNS5qcyc7XG5cbi8qKlxuICogVGhlIGludGVudCBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGdlbmVyYXRlIHRoZSBzdWZmaXgvcG9zdGZpeCBmb3IgdGhlXG4gKiBjc3MgY2xhc3NlcywgYmFzZWQgb24gdGhlIG1vZHVsZS1zY29wZWQgcGF0aCBuYW1lLlxuICpcbiAqIGZvciBleGFtcGxlLFxuICogICAgaGFzaCgnbXktYXBwL2NvbXBvbmVudHMvZm9vJylcbiAqICBpbnN0ZWFkIG9mXG4gKiAgICBoYXNoKCdhcHAvY29tcG9uZW50cy9mb28nKVxuICpcbiAqICAodW5sZXNzIHlvdXIgYXBwIG5hbWUgaXMgJ2FwcCcpXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZVBhdGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoKG1vZHVsZVBhdGgpIHtcbiAgcmV0dXJuICdlJyArIG1kNShtb2R1bGVQYXRoKS5zdWJzdHJpbmcoMCwgOCk7XG59XG5cblxuZXhwb3J0IGNvbnN0IGhhc2hGcm9tTW9kdWxlUGF0aCA9IGhhc2g7XG4iLCAiaW1wb3J0IHsgaXNSZWxldmFudEZpbGUgfSBmcm9tICcuLi9saWIvcGF0aC91dGlscy5qcyc7XG5cbmZ1bmN0aW9uIF9pc1JlbGV2YW50RmlsZShzdGF0ZSwgY3dkKSB7XG4gIGxldCBmaWxlTmFtZSA9IHN0YXRlLmZpbGUub3B0cy5maWxlbmFtZTtcbiAgbGV0IGFkZGl0aW9uYWxSb290cyA9IHN0YXRlLm9wdHM/LmFkZGl0aW9uYWxSb290cztcblxuICByZXR1cm4gaXNSZWxldmFudEZpbGUoZmlsZU5hbWUsIHtcbiAgICBhZGRpdGlvbmFsUm9vdHMsXG4gICAgY3dkLFxuICB9KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gZW52IC0gYmFiZWwgcGx1Z2luIGVudiwgZW52LnR5cGVzIGlzIG1vc3QgY29tbW9ubHkgdXNlZCAoZXNwIGluIFRTKVxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSB0aGUgb3B0aW9ucyBmb3Igc2NvcGVkLWNzcyAtLSB0aGlzIGlzIGFsc28gYXZhaWxhYmxlIGluIGVhY2ggdmlzaXRvcidzIHN0YXRlLm9wdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JraW5nRGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBkZWZhdWx0IChlbnYsIG9wdGlvbnMsIHdvcmtpbmdEaXJlY3RvcnkpID0+IHtcbiAgLyoqXG4gICAqIFRoaXMgYmFiZWwgcGx1Z2luIGRvZXMgdHdvIHRoaW5nczpcbiAgICogLSByZW1vdmVzIHRoZSBpbXBvcnQgb2Ygc2NvcGVkQ2xhc3MsIGlmIGl0IGV4aXN0c1xuICAgKiAgIC0gaWYgc2NvcGVkQ2xhc3Mgd2FzIGltcG9ydGVkLCBpdCBpcyByZW1vdmVkIGZyb20gYW55IGNvbXBvbmVudCdzIFwic2NvcGUgYmFnXCJcbiAgICogICAgICh0aGUgc2NvcGUgYmFnIGJlaW5nIGEgbG93LWxldmVsIG9iamVjdCB1c2VkIGZvciBwYXNzaW5nIHdoYXQgaXMgXCJpbiBzY29wZVwiIGZvciBhIGNvbXBvbmVudClcbiAgICovXG4gIHJldHVybiB7XG4gICAgdmlzaXRvcjoge1xuICAgICAgUHJvZ3JhbToge1xuICAgICAgICBlbnRlcihwYXRoLCBzdGF0ZSkge1xuICAgICAgICAgIGlmICghX2lzUmVsZXZhbnRGaWxlKHN0YXRlLCB3b3JraW5nRGlyZWN0b3J5KSkge1xuICAgICAgICAgICAgc3RhdGUuY2FuU2tpcCA9IHRydWU7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgSW1wb3J0RGVjbGFyYXRpb24ocGF0aCwgc3RhdGUpIHtcbiAgICAgICAgaWYgKHN0YXRlLmNhblNraXApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0aC5ub2RlLnNvdXJjZS52YWx1ZSA9PT0gJ2VtYmVyLXNjb3BlZC1jc3MnKSB7XG4gICAgICAgICAgbGV0IHNwZWNpZmllciA9IHBhdGgubm9kZS5zcGVjaWZpZXJzLmZpbmQoXG4gICAgICAgICAgICAoeCkgPT4geC5pbXBvcnRlZC5uYW1lID09PSAnc2NvcGVkQ2xhc3MnLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoc3BlY2lmaWVyKSB7XG4gICAgICAgICAgICBzdGF0ZS5maWxlLm9wdHMuaW1wb3J0ZWRTY29wZWRDbGFzcyA9IHNwZWNpZmllci5sb2NhbC5uYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzcGVjaWZpZXIubG9jYWwubmFtZSAhPT0gJ3Njb3BlZENsYXNzJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVGhlIHNjb3BlZENsYXNzIGltcG9ydCBpcyBhIHBzdWVkby1oZWxwZXIsIGFuZCBtYXkgbm90IGJlIHJlbmFtZWQgYXMgaXQgaXMgcmVtb3ZlZCBhdCBidWlsZCB0aW1lLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhdGgucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIE9ubHkgaW4gc3RyaWN0IG1vZGUsIGRvIHdlIGNhcmUgYWJvdXQgcmVtb25pbmcgdGhlIHNjb3BlIGJhZyByZWZlcmVuY2VcbiAgICAgICAqL1xuICAgICAgT2JqZWN0UHJvcGVydHkocGF0aCwgc3RhdGUpIHtcbiAgICAgICAgaWYgKCFzdGF0ZS5maWxlLm9wdHM/LmltcG9ydGVkU2NvcGVkQ2xhc3MpIHJldHVybjtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgcGF0aC5ub2RlLnZhbHVlLnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJlxuICAgICAgICAgIHBhdGgubm9kZS52YWx1ZS5uYW1lID09PSBzdGF0ZS5maWxlLm9wdHM/LmltcG9ydGVkU2NvcGVkQ2xhc3NcbiAgICAgICAgKSB7XG4gICAgICAgICAgcGF0aC5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufTtcbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjcmVhdGVVbnBsdWdpbiB9IGZyb20gJ3VucGx1Z2luJztcblxuaW1wb3J0IHsgZGVjb2RlU2NvcGVkQ1NTUmVxdWVzdCwgaXNTY29wZWRDU1NSZXF1ZXN0IH0gZnJvbSAnLi4vbGliL3JlcXVlc3QuanMnO1xuLyoqXG4gKiBUaGUgcGx1Z2luIHRoYXQgaGFuZGxlcyBDU1MgcmVxdWVzdHMgZnJvbSBvdGhlciB0cmFuc2Zvcm0gKGUuZy46IGJhYmVsKVxuICpcbiAqIFRoaXMgcGx1Z2luIHRha2VzIG5vIG9wdGlvbnMgYmVjYXVzZSB0aGUgQ1NTIHRyYW5zZm9ybSBoYXMgYWxyZWFkeSBoYXBwZW5lZCBieSB0aGUgdGltZVxuICogd2UgaGFuZGxlIGl0IGhlcmUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVVucGx1Z2luKCgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnZW1iZXItc2NvcGVkLWNzcy11bnBsdWdpbicsXG5cbiAgICByZXNvbHZlSWQoaWQsIGltcG9ydGVyKSB7XG4gICAgICBpZiAoaXNTY29wZWRDU1NSZXF1ZXN0KGlkKSkge1xuICAgICAgICBsZXQgcGFyc2VkID0gZGVjb2RlU2NvcGVkQ1NTUmVxdWVzdChpZCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShpbXBvcnRlciksIHBhcnNlZC5wb3N0Zml4ICsgJy5jc3MnKSxcbiAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAnc2NvcGVkLWNzcyc6IHtcbiAgICAgICAgICAgICAgY3NzOiBwYXJzZWQuY3NzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2FkKGlkKSB7XG4gICAgICBsZXQgbWV0YSA9IHRoaXMuZ2V0TW9kdWxlSW5mbyhpZCk/Lm1ldGE/Llsnc2NvcGVkLWNzcyddO1xuXG4gICAgICBpZiAobWV0YSkge1xuICAgICAgICByZXR1cm4gbWV0YS5jc3M7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn0pO1xuIiwgImNvbnN0IGtleSA9ICdzdHlsZXMuZW1iZXItc2NvcGVkLmNzcyc7XG5jb25zdCBzZXBhcmF0b3IgPSAnX19fXyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHJlcXVlc3QpIHtcbiAgbGV0IFtsZWZ0LCBxcHNdID0gcmVxdWVzdC5zcGxpdCgnPycpO1xuICBsZXQgW3JlbGF0aXZlUG9zdGZpeCwgY3NzSWRdID0gbGVmdC5zcGxpdChzZXBhcmF0b3IpO1xuICBsZXQgcG9zdGZpeCA9IHJlbGF0aXZlUG9zdGZpeC5zbGljZSgyKTtcblxuICBsZXQgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxcHMpO1xuXG4gIHJldHVybiB7XG4gICAgZnJvbTogcG9zdGZpeCxcbiAgICBjc3M6IHNlYXJjaC5nZXQoJ2NzcycpLFxuICAgIGNzc0lkLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY29wZWRDU1NSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgbGV0IFssICwgc3R1ZmZdID0gcmVxdWVzdC5zcGxpdChzZXBhcmF0b3IpO1xuXG4gIGlmICghc3R1ZmYpIHJldHVybiBmYWxzZTtcblxuICBsZXQgW2tdID0gc3R1ZmYuc3BsaXQoJz8nKTtcblxuICByZXR1cm4gayA9PT0ga2V5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlU2NvcGVkQ1NTUmVxdWVzdChyZXF1ZXN0KSB7XG4gIGxldCBwYXJhbXMgPSBwYXJzZShyZXF1ZXN0KTtcblxuICByZXR1cm4ge1xuICAgIHBvc3RmaXg6IHBhcmFtcy5mcm9tLFxuICAgIGNzczogcGFyYW1zLmNzcyxcbiAgICBjc3NJZDogcGFyYW1zLmNzc0lkLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJlcXVlc3QocG9zdGZpeCwgY3NzSWQsIGNzc0NvbnRlbnQpIHtcbiAgcmV0dXJuIGAuLyR7cG9zdGZpeH0ke3NlcGFyYXRvcn0ke2Nzc0lkfSR7c2VwYXJhdG9yfSR7a2V5fT9jc3M9JHtlbmNvZGVVUklDb21wb25lbnQoY3NzQ29udGVudCl9YDtcbn1cbiIsICIvKipcbiAqIEltcG9ydGFudCBkb2NzOlxuICogLSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvXG4gKi9cbmltcG9ydCBwb3N0Y3NzIGZyb20gJ3Bvc3Rjc3MnO1xuaW1wb3J0IHBhcnNlciBmcm9tICdwb3N0Y3NzLXNlbGVjdG9yLXBhcnNlcic7XG5cbmltcG9ydCB7IGlzSW5zaWRlR2xvYmFsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmNvbnN0IFNFUCA9ICdfXyc7XG5cbmZ1bmN0aW9uIGlzUnVsZShub2RlKSB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdydWxlJztcbn1cblxuZnVuY3Rpb24gaXNEZWNsYXJhdGlvbihub2RlKSB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdkZWNsJztcbn1cblxuLyoqXG4gKiBOT1RFOiBcImtleWZyYW1lc1wiIGlzIGEgc2luZ3VsYXIgZGVmaW5pdGlvbiwgaW4gdGhhdCBpdCdzIGEgYmxvY2sgY29udGFpbmluZyBrZXlmcmFtZXNcbiAqICAgICAgIHVzaW5nIGBAa2V5ZnJhbWVzIHt9YCB3aXRoIG9ubHkgb25lIHRoaW5nIG9uIHRoZSBpbnNpZGUgZG9lc24ndCBtYWtlIHNlbnNlLlxuICovXG5mdW5jdGlvbiByZXdyaXRlUmVmZXJlbmNhYmxlKG5vZGUsIHBvc3RmaXgpIHtcbiAgbGV0IG9yaWdpbmFsTmFtZSA9IG5vZGUucGFyYW1zO1xuICBsZXQgcG9zdGZpeGVkTmFtZSA9IG5vZGUucGFyYW1zICsgU0VQICsgcG9zdGZpeDtcblxuICBub2RlLnBhcmFtcyA9IHBvc3RmaXhlZE5hbWU7XG5cbiAgcmV0dXJuIHtcbiAgICBvcmlnaW5hbE5hbWUsXG4gICAgcG9zdGZpeGVkTmFtZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmV3cml0ZVNlbGVjdG9yKHNlbCwgcG9zdGZpeCkge1xuICBjb25zdCB0cmFuc2Zvcm0gPSAoc2VsZWN0b3JzKSA9PiB7XG4gICAgc2VsZWN0b3JzLndhbGsoKHNlbGVjdG9yKSA9PiB7XG4gICAgICBpZiAoaXNJbnNpZGVHbG9iYWwoc2VsZWN0b3IpKSByZXR1cm47XG5cbiAgICAgIC8vIFdlIG5ldmVyIHdhbnQgdG8gdG91Y2ggcHN1ZWRvIHNlbGVjdG9ycyBzaW5jZSB3ZSBhbmQgdGhlIHVzZXIgZG9lc24ndCBvd24gdGhlbS5cbiAgICAgIGlmIChzZWxlY3Rvci50eXBlID09PSAncHN1ZWRvJykgcmV0dXJuO1xuXG4gICAgICAvLyA6bnRoLW9mLXR5cGUgaGFzIHNwZWNpYWwgc3ludGF4IHdoZXJlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIG50aC1vZi10eXBlKClcbiAgICAgIC8vIG11c3QgZWl0aGVyIGJlIGV4YWN0bHkgXCJvZGRcIiwgXCJldmVuXCIsIG9yIGEgc2ltcGxlIGZvcm11bGFcbiAgICAgIC8vXG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvOm50aC1vZi10eXBlXG4gICAgICBpZiAoaXNOdGhPZlR5cGUoc2VsZWN0b3IpKSByZXR1cm47XG5cbiAgICAgIGlmIChzZWxlY3Rvci50eXBlID09PSAnY2xhc3MnKSB7XG4gICAgICAgIHNlbGVjdG9yLnZhbHVlICs9ICdfJyArIHBvc3RmaXg7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICd0YWcnKSB7XG4gICAgICAgIHNlbGVjdG9yLnJlcGxhY2VXaXRoKFxuICAgICAgICAgIHBhcnNlci50YWcoeyB2YWx1ZTogc2VsZWN0b3IudmFsdWUgfSksXG4gICAgICAgICAgcGFyc2VyLmNsYXNzTmFtZSh7IHZhbHVlOiBwb3N0Zml4IH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gcmVtb3ZlIDpnbG9iYWxcbiAgICBzZWxlY3RvcnMud2Fsaygoc2VsZWN0b3IpID0+IHtcbiAgICAgIGlmIChzZWxlY3Rvci50eXBlID09PSAncHNldWRvJyAmJiBzZWxlY3Rvci52YWx1ZSA9PT0gJzpnbG9iYWwnKSB7XG4gICAgICAgIHNlbGVjdG9yLnJlcGxhY2VXaXRoKC4uLnNlbGVjdG9yLm5vZGVzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgdHJhbnNmb3JtZWQgPSBwYXJzZXIodHJhbnNmb3JtKS5wcm9jZXNzU3luYyhzZWwpO1xuXG4gIHJldHVybiB0cmFuc2Zvcm1lZDtcbn1cblxuZnVuY3Rpb24gaXNOdGhPZlR5cGUobm9kZSkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gbm9kZS5wYXJlbnQ/LnZhbHVlID09PSAnOm50aC1vZi10eXBlJyB8fCBpc050aE9mVHlwZShub2RlLnBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIGlzSW5zaWRlS2V5ZnJhbWVzKG5vZGUpIHtcbiAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG5cbiAgaWYgKCFwYXJlbnQpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBhcmVudC50eXBlID09PSAnYXRydWxlJyAmJiBwYXJlbnQubmFtZSA9PT0gJ2tleWZyYW1lcycpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBpc0luc2lkZUtleWZyYW1lcyhwYXJlbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmV3cml0ZUNzcyhjc3MsIHBvc3RmaXgsIGZpbGVOYW1lLCBsYXllck5hbWUpIHtcbiAgY29uc3QgbGF5ZXJOYW1lV2l0aERlZmF1bHQgPSBsYXllck5hbWUgPz8gJ2NvbXBvbmVudHMnO1xuICBjb25zdCBhc3QgPSBwb3N0Y3NzLnBhcnNlKGNzcyk7XG4gIC8qKlxuICAgKiBraW5kID0+IG9yaWdpbmFsTmFtZSA9PiBwb3N0Zml4ZWROYW1lXG4gICAqIEB0eXBlIHt7IFtraW5kOiBzdHJpbmddOiB7IFtvcmlnaW5hbE5hbWU6IHN0cmluZ106IHN0cmluZyB9fX1cbiAgICovXG4gIGNvbnN0IHJlZmVyZW5jYWJsZXMgPSB7XG4gICAga2V5ZnJhbWVzOiB7fSxcbiAgICAnY291bnRlci1zdHlsZSc6IHt9LFxuICAgICdwb3NpdGlvbi10cnknOiB7fSxcbiAgICBwcm9wZXJ0eToge30sXG4gIH07XG5cbiAgY29uc3QgYXZhaWxhYmxlUmVmZXJlbmNhYmxlcyA9IG5ldyBTZXQoT2JqZWN0LmtleXMocmVmZXJlbmNhYmxlcykpO1xuXG4gIGZ1bmN0aW9uIGlzUmVmZXJlbmNhYmxlKG5vZGUpIHtcbiAgICBpZiAobm9kZS50eXBlICE9PSAnYXRydWxlJykgcmV0dXJuO1xuXG4gICAgcmV0dXJuIGF2YWlsYWJsZVJlZmVyZW5jYWJsZXMuaGFzKG5vZGUubmFtZSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVEaXJlY3RSZWZlcmVuY2VzKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUudmFsdWUpIHJldHVybjtcblxuICAgIGZvciAobGV0IFssIG1hcF0gb2YgT2JqZWN0LmVudHJpZXMocmVmZXJlbmNhYmxlcykpIHtcbiAgICAgIGlmIChtYXBbbm9kZS52YWx1ZV0pIHtcbiAgICAgICAgbm9kZS52YWx1ZSA9IG1hcFtub2RlLnZhbHVlXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTaG9ydGhhbmRDb250ZW50cyhub2RlKSB7XG4gICAgaWYgKG5vZGUucHJvcCA9PT0gJ2FuaW1hdGlvbicpIHtcbiAgICAgIGxldCBwYXJ0cyA9IG5vZGUudmFsdWUuc3BsaXQoJyAnKTtcbiAgICAgIGxldCBtYXRjaCA9IHBhcnRzLmZpbHRlcigoeCkgPT4gcmVmZXJlbmNhYmxlcy5rZXlmcmFtZXNbeF0pO1xuXG4gICAgICBpZiAobWF0Y2gubGVuZ3RoKSB7XG4gICAgICAgIG1hdGNoLmZvckVhY2goKHgpID0+IHtcbiAgICAgICAgICBsZXQgcmVwbGFjZW1lbnQgPSByZWZlcmVuY2FibGVzLmtleWZyYW1lc1t4XTtcblxuICAgICAgICAgIGlmICghcmVwbGFjZW1lbnQpIHJldHVybjtcblxuICAgICAgICAgIG5vZGUudmFsdWUgPSBub2RlLnZhbHVlLnJlcGxhY2UoeCwgcmVwbGFjZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBbbG9va0ZvciwgcmVwbGFjZVdpdGhdIG9mIE9iamVjdC5lbnRyaWVzKHJlZmVyZW5jYWJsZXMucHJvcGVydHkpKSB7XG4gICAgICBsZXQgbG9va0ZvclZhciA9IGB2YXIoJHtsb29rRm9yfSlgO1xuICAgICAgbGV0IHJlcGxhY2VXaXRoVmFyID0gYHZhcigke3JlcGxhY2VXaXRofSlgO1xuXG4gICAgICBub2RlLnZhbHVlID0gbm9kZS52YWx1ZS5yZXBsYWNlKGxvb2tGb3JWYXIsIHJlcGxhY2VXaXRoVmFyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2UgaGF2ZSB0byBkbyB0d28gcGFzc2VzOlxuICAgKiAxLiBwb3N0Zml4IGFsbCB0aGUgcmVmZXJlbmNhYmxlIHN5bnRheFxuICAgKiAyLiBwb3N0Zml4IGFzIG5vcm1hbCwgYnV0IGFsc28gY2hlY2tpbmcgdmFsdWVzIG9mIENTUyBwcm9wZXJ0aWVzXG4gICAqICAgIHRoYXQgY291bGQgbWF0Y2ggcG9zdGZpeGVkIHJlZmVyZW5jYWJsZXMgZnJvbSBzdGVwIDFcbiAgICovXG5cbiAgLy8gU3RlcCAxOiBmaW5kIHJlZmVyZW5jYWJsZXNcbiAgYXN0LndhbGsoKG5vZGUpID0+IHtcbiAgICAvKipcbiAgICAgKiBAa2V5ZnJhbWVzLCBAY291bnRlci1zdHlsZSwgZXRjXG4gICAgICovXG4gICAgaWYgKGlzUmVmZXJlbmNhYmxlKG5vZGUpKSB7XG4gICAgICBsZXQgbmFtZSA9IG5vZGUubmFtZTtcbiAgICAgIGxldCB7IG9yaWdpbmFsTmFtZSwgcG9zdGZpeGVkTmFtZSB9ID0gcmV3cml0ZVJlZmVyZW5jYWJsZShub2RlLCBwb3N0Zml4KTtcblxuICAgICAgcmVmZXJlbmNhYmxlc1tuYW1lXVtvcmlnaW5hbE5hbWVdID0gcG9zdGZpeGVkTmFtZTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gU3RlcCAyOiBwb3N0Zml4IGFuZCB1cGRhdGUgcmVmZW5jZWQgcmVmZXJlbmNhYmxlc1xuICBhc3Qud2Fsaygobm9kZSkgPT4ge1xuICAgIGlmIChpc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICB1cGRhdGVEaXJlY3RSZWZlcmVuY2VzKG5vZGUpO1xuICAgICAgdXBkYXRlU2hvcnRoYW5kQ29udGVudHMobm9kZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNSdWxlKG5vZGUpKSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBpbm5lci1jb250ZW50cyBvZiBhIGtleWZyYW1lIGFyZSBwZXJjZW50YWdlcywgcmF0aGVyIHRoYW4gc2VsZWN0b3JzXG4gICAgICAgKi9cbiAgICAgIGlmIChpc0luc2lkZUtleWZyYW1lcyhub2RlKSkgcmV0dXJuO1xuXG4gICAgICBub2RlLnNlbGVjdG9yID0gcmV3cml0ZVNlbGVjdG9yKG5vZGUuc2VsZWN0b3IsIHBvc3RmaXgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9KTtcblxuICBjb25zdCByZXdyaXR0ZW5Dc3MgPSBhc3QudG9TdHJpbmcoKTtcblxuICBpZiAoIWxheWVyTmFtZVdpdGhEZWZhdWx0KSB7XG4gICAgcmV0dXJuIGAvKiAke2ZpbGVOYW1lfSAqL1xcbiR7cmV3cml0dGVuQ3NzfVxcbmA7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGAvKiAke2ZpbGVOYW1lfSAqL1xcbkBsYXllciAke2xheWVyTmFtZVdpdGhEZWZhdWx0fSB7XFxuXFxuYCArXG4gICAgcmV3cml0dGVuQ3NzICtcbiAgICAnXFxufVxcbidcbiAgKTtcbn1cbiIsICJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBwYXJzZXIgZnJvbSAncG9zdGNzcy1zZWxlY3Rvci1wYXJzZXInO1xuXG5pbXBvcnQgeyBtZDUgfSBmcm9tICcuLi9wYXRoL21kNS5qcyc7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGNzc1xuICogQHJldHVybiB7c3RyaW5nfSBoYXNoZWQgZG93biB2ZXJzaW9uIG9mIHRoZSBDU1MgZm9yIGRpc2FtYmlndWF0aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoKGNzcykge1xuICByZXR1cm4gYGNzcy0ke21kNShjc3MpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luc2lkZUdsb2JhbChub2RlLCBmdW5jKSB7XG4gIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50O1xuXG4gIGlmICghcGFyZW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChwYXJlbnQudHlwZSA9PT0gJ3BzZXVkbycgJiYgcGFyZW50LnZhbHVlID09PSAnOmdsb2JhbCcpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBpc0luc2lkZUdsb2JhbChwYXJlbnQsIGZ1bmMpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjc3NQYXRoIHBhdGggdG8gYSBDU1MgZmlsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q1NTSW5mbyhjc3NQYXRoKSB7XG4gIGlmICghZXhpc3RzU3luYyhjc3NQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IGNzcyA9IHJlYWRGaWxlU3luYyhjc3NQYXRoLCAndXRmOCcpO1xuXG4gIHJldHVybiBnZXRDU1NDb250ZW50SW5mbyhjc3MpO1xufVxuXG4vKipcbiAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGNoZWNrIGVhY2ggY2xhc3MgdXNlZCBpbiB0aGUgdGVtcGxhdGVcbiAqIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGxlYXZlIGl0IGFsb25lIG9yIHRyYW5zZm9ybSBpdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjc3MgdGhlIENTUydzIGNvbnRlbnRzXG4gKiBAcmV0dXJuIHt7IGNsYXNzZXM6IFNldDxzdHJpbmc+LCB0YWdzOiBTZXQ8c3RyaW5nPiwgY3NzOiBzdHJpbmcsIGlkOiBzdHJpbmcgfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENTU0NvbnRlbnRJbmZvKGNzcykge1xuICBjb25zdCBjbGFzc2VzID0gbmV3IFNldCgpO1xuICBjb25zdCB0YWdzID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0IGFzdCA9IHBvc3Rjc3MucGFyc2UoY3NzKTtcblxuICBhc3Qud2Fsaygobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdydWxlJykge1xuICAgICAgZ2V0Q2xhc3Nlc0FuZFRhZ3Mobm9kZS5zZWxlY3RvciwgY2xhc3NlcywgdGFncyk7XG4gICAgfVxuICB9KTtcblxuICBsZXQgaWQgPSBoYXNoKGNzcyk7XG5cbiAgcmV0dXJuIHsgY2xhc3NlcywgdGFncywgY3NzLCBpZCB9O1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc2VzQW5kVGFncyhzZWwsIGNsYXNzZXMsIHRhZ3MpIHtcbiAgY29uc3QgdHJhbnNmb3JtID0gKHNscykgPT4ge1xuICAgIHNscy53YWxrKChzZWxlY3RvcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdjbGFzcycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBjbGFzc2VzLmFkZChzZWxlY3Rvci52YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICd0YWcnICYmICFpc0luc2lkZUdsb2JhbChzZWxlY3RvcikpIHtcbiAgICAgICAgdGFncy5hZGQoc2VsZWN0b3IudmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHBhcnNlcih0cmFuc2Zvcm0pLnByb2Nlc3NTeW5jKHNlbCk7XG59XG5cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBmaW5kV29ya3NwYWNlUGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vKipcbiAqIHRlbXBsYXRlIHBsdWdpbnMgZG8gbm90IGhhbmQgdXMgdGhlIGNvcnJlY3QgZmlsZSBwYXRoLlxuICogYWRkaXRpb25hbGx5LCB3ZSBtYXkgbm90IGJlIGFibGUgdG8gcmVseSBvbiB0aGlzIGRhdGEgaW4gdGhlIGZ1dHVyZSxcbiAqIHNvIHRoaXMgZnVuY3Rpb25zIGFjdHMgYXMgYSBtZWFucyBvZiBub3JtYWxpemluZyBfd2hhdGV2ZXJfIHdlJ3JlIGdpdmVuXG4gKiBpbiB0aGUgZnV0dXJlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpeEZpbGVuYW1lKGZpbGVuYW1lKSB7XG4gIGxldCBmaWxlTmFtZSA9IGZpbGVuYW1lO1xuICBsZXQgd29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoZmlsZU5hbWUpO1xuXG4gIC8qKlxuICAgKiBlbWJlci1zb3VyY2UgNS44OlxuICAgKiAtIHRoZSBmaWxlbmFtZSBsb29rcyBsaWtlIGFuIGFic29sdXRlIHBhdGgsIGJ1dCBzd2FwcGVkIG91dCB0aGUgJ2FwcCcgcGFydCBvZiB0aGUgcGF0aFxuICAgKiAgIHdpdGggdGhlIG1vZHVsZSBuYW1lLCBzbyB0aGUgZmlsZSBwYXRocyBuZXZlciBleGlzdCBvbiBkaXNrXG4gICAqXG4gICAqIC0gaW4gdml0ZSBhcHBzOlxuICAgKiAgIHRoZSAnYXBwJyBwYXJ0IF9tYXlfIGJlIGBzcmNgLCBzbyB3ZSBhbHNvIG5lZWQgdG8gZW5zdXJlIHRoYXQgYHNyY2AgaXMgZXhjbHVkZWQgYXMgd2VsbFxuICAgKi9cbiAgbGV0IGhhc0FwcERpciA9IGZpbGVOYW1lLmluY2x1ZGVzKHBhdGguam9pbih3b3Jrc3BhY2UsICdhcHAnKSk7XG4gIGxldCBoYXNTcmNEaXIgPSBmaWxlTmFtZS5pbmNsdWRlcyhwYXRoLmpvaW4od29ya3NwYWNlLCAnc3JjJykpO1xuXG4gIGlmIChcbiAgICAhKGhhc0FwcERpciB8fCBoYXNTcmNEaXIpICYmXG4gICAgIWZpbGVOYW1lLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXIvJylcbiAgKSB7XG4gICAgbGV0IG1heWJlTW9kdWxlID0gZmlsZU5hbWUucmVwbGFjZSh3b3Jrc3BhY2UsICcnKTtcbiAgICBsZXQgW21heWJlU2NvcGUsIC4uLnJlc3RdID0gbWF5YmVNb2R1bGUuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IHBhcnRzID0gcmVzdDtcblxuICAgIGlmIChtYXliZVNjb3BlLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgbGV0IFssIC4uLnJlc3Rlcl0gPSByZXN0O1xuXG4gICAgICBwYXJ0cyA9IHJlc3RlcjtcbiAgICB9XG5cbiAgICBsZXQgcmVsYXRpdmUgPSBwYXRoLmpvaW4oLi4ucGFydHMpO1xuXG4gICAgLyoqXG4gICAgICogV2UgZG9uJ3QgYWN0dWFsbHkga25vdyBpZiB0aGlzIGZpbGUgaXMgYW4gYXBwLlxuICAgICAqIGl0IGNvdWxkIGJlIGFuIGFkZG9uICh2MSBvciB2MilcbiAgICAgKlxuICAgICAqIFNvIGhlcmUgd2UgbG9nIHRvIHNlZSBpZiB3ZSBoYXZlIHVuaGFuZGxlZCBzaXR1YXRpb25zLlxuICAgICAqL1xuICAgIGxldCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKHdvcmtzcGFjZSwgJ2FwcCcsIHJlbGF0aXZlKTtcblxuICAgIHJldHVybiBjYW5kaWRhdGVQYXRoO1xuICB9XG5cbiAgLy8gVE9ETzogd2h5IGFyZSB3ZSBwYXNzZWQgZmlsZXMgdG8gb3RoZXIgcHJvamVjdHM/XG4gIGlmICghZmlsZU5hbWUuaW5jbHVkZXMod29ya3NwYWNlKSkge1xuICAgIHJldHVybiBmaWxlTmFtZTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIHdoYXQgdGhlIHBsdWdpbiBzeXN0ZW0gZ2l2ZXMgdXMuXG4gIC8vIFRoaXMgbWF5IGJlIHdyb25nLCBhbmQgaWYgd3JvbmcsIHJldmVhbHNcbiAgLy8gdW5oYW5kbGVkIHNjZW5hcmlvcyB3aXRoIHRoZSBmaWxlIG5hbWVzIGluIHRoZSBwbHVnaW4gaW5mcmFcbiAgcmV0dXJuIGZpbGVOYW1lO1xufVxuIiwgImltcG9ydCByZWNhc3QgZnJvbSAnZW1iZXItdGVtcGxhdGUtcmVjYXN0JztcblxuaW1wb3J0IHsgcmVuYW1lQ2xhc3MgfSBmcm9tICcuL3JlbmFtZUNsYXNzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlUGx1Z2luKHsgY2xhc3NlcywgdGFncywgcG9zdGZpeCB9KSB7XG4gIGxldCBzdGFjayA9IFtdO1xuICAvLyBzY29wZWQtY2xhc3MgaXMgYSBnbG9iYWwgd2UgYWxsb3cgaW4gaGJzXG4gIC8vIHNjb3BlZENsYXNzIGlzIGltcG9ydGFibGUsIGFuZCB3ZSdsbCBlcnJvciBpZiBzb21lb25lIHRyaWVzIHRvIHJlbmFtZSBpdFxuICBsZXQgc2NvcGVkQ2xhc3NDYW5kaWRhdGVzID0gWydzY29wZWQtY2xhc3MnLCAnc2NvcGVkQ2xhc3MnXTtcblxuICBmdW5jdGlvbiBpc1Njb3BlZENsYXNzKHN0cikge1xuICAgIGlmICghc3RyKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gc2NvcGVkQ2xhc3NDYW5kaWRhdGVzLnNvbWUoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlID09PSBzdHIpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBBdHRyTm9kZShub2RlKSB7XG4gICAgICBpZiAobm9kZS5uYW1lID09PSAnY2xhc3MnKSB7XG4gICAgICAgIGlmIChub2RlLnZhbHVlLnR5cGUgPT09ICdUZXh0Tm9kZScgJiYgbm9kZS52YWx1ZS5jaGFycykge1xuICAgICAgICAgIGNvbnN0IHJlbmFtZWRDbGFzcyA9IHJlbmFtZUNsYXNzKG5vZGUudmFsdWUuY2hhcnMsIHBvc3RmaXgsIGNsYXNzZXMpO1xuXG4gICAgICAgICAgbm9kZS52YWx1ZS5jaGFycyA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLnZhbHVlLnR5cGUgPT09ICdDb25jYXRTdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgZm9yIChsZXQgcGFydCBvZiBub2RlLnZhbHVlLnBhcnRzKSB7XG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnVGV4dE5vZGUnICYmIHBhcnQuY2hhcnMpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVuYW1lZENsYXNzID0gcmVuYW1lQ2xhc3MocGFydC5jaGFycywgcG9zdGZpeCwgY2xhc3Nlcyk7XG5cbiAgICAgICAgICAgICAgcGFydC5jaGFycyA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnTXVzdGFjaGVTdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgICAgIHJlY2FzdC50cmF2ZXJzZShwYXJ0LCB7XG4gICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbChub2RlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZW5hbWVkQ2xhc3MgPSByZW5hbWVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgbm9kZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9zdGZpeCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlcyxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIG5vZGUudmFsdWUgPSByZW5hbWVkQ2xhc3M7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIEVsZW1lbnROb2RlKG5vZGUpIHtcbiAgICAgIGlmICh0YWdzLmhhcyhub2RlLnRhZykpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgY2xhc3MgYXR0cmlidXRlIGFscmVhZHkgZXhpc3RzXG4gICAgICAgIGNvbnN0IGNsYXNzQXR0ciA9IG5vZGUuYXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiBhdHRyLm5hbWUgPT09ICdjbGFzcycpO1xuXG4gICAgICAgIGlmIChjbGFzc0F0dHIpIHtcbiAgICAgICAgICBjbGFzc0F0dHIudmFsdWUuY2hhcnMgKz0gJyAnICsgcG9zdGZpeDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwdXNoIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICAgIG5vZGUuYXR0cmlidXRlcy5wdXNoKFxuICAgICAgICAgICAgcmVjYXN0LmJ1aWxkZXJzLmF0dHIoJ2NsYXNzJywgcmVjYXN0LmJ1aWxkZXJzLnRleHQocG9zdGZpeCkpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgQWxsOiB7XG4gICAgICBlbnRlcihub2RlKSB7XG4gICAgICAgIHN0YWNrLnB1c2gobm9kZSk7XG4gICAgICB9LFxuICAgICAgZXhpdCgpIHtcbiAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBNdXN0YWNoZVN0YXRlbWVudChub2RlKSB7XG4gICAgICBsZXQgY3NzQ2xhc3M7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNTY29wZWRDbGFzcyhnZXRWYWx1ZShub2RlLnBhdGgpKSAmJlxuICAgICAgICBub2RlLnBhcmFtcz8ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG5vZGUucGFyYW1zWzBdLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJ1xuICAgICAgKSB7XG4gICAgICAgIGNzc0NsYXNzID0gbm9kZS5wYXJhbXNbMF0udmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNTY29wZWRDbGFzcyhnZXRWYWx1ZShub2RlLnBhdGg/LnBhdGgpKSAmJlxuICAgICAgICBub2RlLnBhdGg/LnBhcmFtcz8ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG5vZGUucGF0aD8ucGFyYW1zWzBdLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJ1xuICAgICAgKSB7XG4gICAgICAgIGNzc0NsYXNzID0gbm9kZS5wYXRoLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNzc0NsYXNzKSB7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gcmVjYXN0LmJ1aWxkZXJzLnRleHQocmVuYW1lQ2xhc3MoY3NzQ2xhc3MsIHBvc3RmaXgpKTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG5cbiAgICAgICAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0F0dHJOb2RlJykge1xuICAgICAgICAgIHBhcmVudC5xdW90ZVR5cGUgPSAnXCInO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRleHROb2RlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBTdWJFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgaXNTY29wZWRDbGFzcyhnZXRWYWx1ZShub2RlLnBhdGgpKSAmJlxuICAgICAgICBub2RlLnBhcmFtcz8ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG5vZGUucGFyYW1zWzBdLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNzc0NsYXNzID0gbm9kZS5wYXJhbXNbMF0udmFsdWU7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gcmVjYXN0LmJ1aWxkZXJzLmxpdGVyYWwoXG4gICAgICAgICAgJ1N0cmluZ0xpdGVyYWwnLFxuICAgICAgICAgIHJlbmFtZUNsYXNzKGNzc0NsYXNzLCBwb3N0Zml4KSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gdGV4dE5vZGU7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUocGF0aCkge1xuICBpZiAoIXBhdGgpIHJldHVybjtcblxuICBpZiAoJ3ZhbHVlJyBpbiBwYXRoKSB7XG4gICAgcmV0dXJuIHBhdGgudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRGVwcmVjYXRlZCBpbiBlbWJlciA1LjkrXG4gICAqIChzbyB3ZSB1c2UgdGhlIGFib3ZlIGZvciBuZXdlciBlbWJlcnMpXG4gICAqL1xuICByZXR1cm4gcGF0aC5vcmlnaW5hbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmV3cml0ZUhicyhoYnMsIGNsYXNzZXMsIHRhZ3MsIHBvc3RmaXgpIHtcbiAgbGV0IGFzdCA9IHJlY2FzdC5wYXJzZShoYnMpO1xuXG4gIHJlY2FzdC50cmF2ZXJzZShhc3QsIHRlbXBsYXRlUGx1Z2luKHsgY2xhc3NlcywgdGFncywgcG9zdGZpeCB9KSk7XG5cbiAgbGV0IHJlc3VsdCA9IHJlY2FzdC5wcmludChhc3QpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCAiLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHBvc3RmaXhcbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IFtjbGFzc2VzSW5Dc3NdXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuYW1lQ2xhc3MoY2xhc3NOYW1lLCBwb3N0Zml4LCBjbGFzc2VzSW5Dc3MpIHtcbiAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCByZW5hbWVkQ2xhc3NlcyA9IGNsYXNzZXNcbiAgICAuZmlsdGVyKChjKSA9PiBjKVxuICAgIC5tYXAoKGMpID0+IGMudHJpbSgpKVxuICAgIC5tYXAoKGMpID0+IHtcbiAgICAgIGlmICghY2xhc3Nlc0luQ3NzIHx8IGNsYXNzZXNJbkNzcy5oYXMoYykpIHtcbiAgICAgICAgaWYgKGMuZW5kc1dpdGgocG9zdGZpeCkpIHJldHVybiBjO1xuXG4gICAgICAgIHJldHVybiBjICsgJ18nICsgcG9zdGZpeDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGM7XG4gICAgfSlcbiAgICAuam9pbignICcpO1xuXG4gIGNvbnN0IHJlbmFtZWRXaXRoUHJlc2VydmVkU3BhY2VzID0gY2xhc3NOYW1lLnJlcGxhY2UoXG4gICAgY2xhc3NOYW1lLnRyaW1TdGFydCgpLnRyaW1FbmQoKSxcbiAgICByZW5hbWVkQ2xhc3NlcyxcbiAgKTtcblxuICByZXR1cm4gcmVuYW1lZFdpdGhQcmVzZXJ2ZWRTcGFjZXM7XG59XG4iLCAiLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAZ2xpbW1lci9zeW50YXgnKS5BU1RQbHVnaW59IEFTVFBsdWdpblxuICogQHR5cGVkZWYge2ltcG9ydCgnQGdsaW1tZXIvc3ludGF4JykuQVNUUGx1Z2luRW52aXJvbm1lbnR9IEFTVFBsdWdpbkVudmlyb25tZW50XG4gKlxuICovXG5cbmltcG9ydCB7IHJld3JpdGVDc3MgfSBmcm9tICcuLi9saWIvY3NzL3Jld3JpdGUuanMnO1xuaW1wb3J0IHsgZ2V0Q1NTQ29udGVudEluZm8sIGdldENTU0luZm8gfSBmcm9tICcuLi9saWIvY3NzL3V0aWxzLmpzJztcbmltcG9ydCB7IGZpeEZpbGVuYW1lIH0gZnJvbSAnLi4vbGliL3BhdGgvdGVtcGxhdGUtdHJhbnNmb3JtLXBhdGhzLmpzJztcbmltcG9ydCB7XG4gIGFwcFBhdGgsXG4gIGNzc1BhdGhGb3IsXG4gIGhhc2hGcm9tTW9kdWxlUGF0aCxcbiAgaXNSZWxldmFudEZpbGUsXG59IGZyb20gJy4uL2xpYi9wYXRoL3V0aWxzLmpzJztcbmltcG9ydCB7IG1ha2VSZXF1ZXN0IH0gZnJvbSAnLi4vbGliL3JlcXVlc3QuanMnO1xuaW1wb3J0IHsgdGVtcGxhdGVQbHVnaW4gfSBmcm9tICcuLi9saWIvcmV3cml0ZUhicy5qcyc7XG5cbmNvbnN0IG5vb3BQbHVnaW4gPSB7XG4gIG5hbWU6ICdlbWJlci1zY29wZWQtY3NzOm5vb3AnLFxuICB2aXNpdG9yOiB7fSxcbn07XG5cbi8qKlxuICogQHJldHVybnMge0FTVFBsdWdpbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBsdWdpbihjb25maWcpIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7QVNUUGx1Z2luRW52aXJvbm1lbnR9IGVudlxuICAgKi9cbiAgcmV0dXJuIGZ1bmN0aW9uIHNjb3BlZENzcyhlbnYpIHtcbiAgICBsZXQgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBsZXQgaXNSZWxldmFudCA9IGlzUmVsZXZhbnRGaWxlKGVudi5maWxlbmFtZSwge1xuICAgICAgYWRkaXRpb25hbFJvb3RzOiBjb25maWcuYWRkaXRpb25hbFJvb3RzLFxuICAgICAgY3dkLFxuICAgIH0pO1xuXG4gICAgaWYgKCFpc1JlbGV2YW50KSB7XG4gICAgICByZXR1cm4gbm9vcFBsdWdpbjtcbiAgICB9XG5cbiAgICBsZXQgYWJzb2x1dGVQYXRoID0gZml4RmlsZW5hbWUoZW52LmZpbGVuYW1lKTtcbiAgICBsZXQgbW9kdWxlUGF0aCA9IGFwcFBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgICBsZXQgcG9zdGZpeCA9IGhhc2hGcm9tTW9kdWxlUGF0aChtb2R1bGVQYXRoKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIG5ha2VkIHRhZyBzZWxlY3RvcnMgZm91bmQgaW4gdGhlIENTU1xuICAgICAqXG4gICAgICogQHR5cGUge1NldDxzdHJpbmc+fVxuICAgICAqL1xuICAgIGxldCBzY29wZWRUYWdzID0gbmV3IFNldCgpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgY2xhc3NlcyBmb3VuZCBpbiB0aGUgQ1NTXG4gICAgICpcbiAgICAgKiBAdHlwZSB7U2V0PHN0cmluZz59XG4gICAgICovXG4gICAgbGV0IHNjb3BlZENsYXNzZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3sgdGFnczogU2V0PHN0cmluZz47IGNsYXNzZXM6IFNldDxzdHJpbmc+IH19IGluZm9cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGRJbmZvKGluZm8pIHtcbiAgICAgIGZvciAobGV0IGl0ZW0gb2YgaW5mby50YWdzKSB7XG4gICAgICAgIHNjb3BlZFRhZ3MuYWRkKGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpdGVtIG9mIGluZm8uY2xhc3Nlcykge1xuICAgICAgICBzY29wZWRDbGFzc2VzLmFkZChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgY3NzUGF0aCA9IGNzc1BhdGhGb3IoYWJzb2x1dGVQYXRoKTtcbiAgICBsZXQgaW5mbyA9IGdldENTU0luZm8oY3NzUGF0aCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHdpbGwgYmUgZmFsc2V5IGlmIHdlIGRvbid0IGhhdmUgYSBjby1sb2NhdGVkIENTUyBmaWxlLlxuICAgICAqIFdlJ2xsIHN0aWxsIHdhbnQgdG8gY2hlY2sgZm9yIGVtYmVkZGVkIDxzdHlsZSBzY29wZWQ+IHRhZ3MgdGhvdWdoLlxuICAgICAqL1xuICAgIGlmIChpbmZvKSB7XG4gICAgICBhZGRJbmZvKGluZm8pO1xuXG4gICAgICBsZXQgbG9jYWxDc3NQYXRoID0gY3NzUGF0aC5yZXBsYWNlKGN3ZCArICcvJywgJycpO1xuICAgICAgbGV0IHNjb3BlZENzcyA9IHJld3JpdGVDc3MoXG4gICAgICAgIGluZm8uY3NzLFxuICAgICAgICBwb3N0Zml4LFxuICAgICAgICBsb2NhbENzc1BhdGgsXG4gICAgICAgIGNvbmZpZy5sYXllck5hbWUsXG4gICAgICApO1xuXG4gICAgICBsZXQgY3NzUmVxdWVzdCA9IG1ha2VSZXF1ZXN0KHBvc3RmaXgsIGluZm8uaWQsIHNjb3BlZENzcyk7XG5cbiAgICAgIC8qKlxuICAgICAgICogV2l0aCB0aGlzIHdlIGRvbid0IG5lZWQgYSBKUyBwbHVnaW5cbiAgICAgICAqL1xuICAgICAgZW52Lm1ldGEuanN1dGlscy5pbXBvcnRGb3JTaWRlRWZmZWN0KGNzc1JlcXVlc3QpO1xuICAgIH1cblxuICAgIGxldCB2aXNpdG9ycyA9IHRlbXBsYXRlUGx1Z2luKHtcbiAgICAgIGNsYXNzZXM6IHNjb3BlZENsYXNzZXMsXG4gICAgICB0YWdzOiBzY29wZWRUYWdzLFxuICAgICAgcG9zdGZpeCxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnZW1iZXItc2NvcGVkLWNzczp0ZW1wbGF0ZS1wbHVnaW4nLFxuICAgICAgdmlzaXRvcjoge1xuICAgICAgICAvLyBTdGFjayBNYW5hZ2VyXG4gICAgICAgIC4uLnZpc2l0b3JzLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXZSBoYXZlIHRvIGVhZ2VybHkgZ2V0IHRoZSA8c3R5bGUgc2NvcGVkPiBjb250ZW50cywgc28gd2UgY2FuIHByZS1wYXJzZVxuICAgICAgICAgKiB0aGUgdGFncyBhbmQgY2xhc3NlcyB0byB0aGVuIHBhc3MgdG8gdGhlIG90aGVyIHZpc2l0b3JzIHNvIHRoYXQgdGhleSBjYW5cbiAgICAgICAgICogYXBwcm9wcmlhdGVseSBjaGFuZ2UgbWF0Y2hpbmcgY2xhc3NlcyAvIHRhZ3MuXG4gICAgICAgICAqL1xuICAgICAgICBUZW1wbGF0ZShub2RlKSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogV2Ugb25seSBhbGxvdyBhIHNjb3BlZCA8c3R5bGU+IGF0IHRoZSByb290XG4gICAgICAgICAgICovXG4gICAgICAgICAgbGV0IHN0eWxlVGFnID0gbm9kZS5ib2R5LmZpbmQoXG4gICAgICAgICAgICAobikgPT4gbi50eXBlID09PSAnRWxlbWVudE5vZGUnICYmIG4udGFnID09PSAnc3R5bGUnLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoaGFzU2NvcGVkQXR0cmlidXRlKHN0eWxlVGFnKSkge1xuICAgICAgICAgICAgbGV0IGNzcyA9IHRleHRDb250ZW50KHN0eWxlVGFnKTtcbiAgICAgICAgICAgIGxldCBpbmZvID0gZ2V0Q1NTQ29udGVudEluZm8oY3NzKTtcbiAgICAgICAgICAgIGxldCBsb2NhbENzc1BhdGggPSBgPGlubGluZT4vYCArIGNzc1BhdGgucmVwbGFjZShjd2QgKyAnLycsICcnKTtcbiAgICAgICAgICAgIGxldCBzY29wZWRDc3MgPSByZXdyaXRlQ3NzKFxuICAgICAgICAgICAgICBpbmZvLmNzcyxcbiAgICAgICAgICAgICAgcG9zdGZpeCxcbiAgICAgICAgICAgICAgbG9jYWxDc3NQYXRoLFxuICAgICAgICAgICAgICBjb25maWcubGF5ZXJOYW1lLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYWRkSW5mbyhpbmZvKTtcblxuICAgICAgICAgICAgbGV0IGNzc1JlcXVlc3QgPSBtYWtlUmVxdWVzdChwb3N0Zml4LCBpbmZvLmlkLCBzY29wZWRDc3MpO1xuXG4gICAgICAgICAgICBlbnYubWV0YS5qc3V0aWxzLmltcG9ydEZvclNpZGVFZmZlY3QoY3NzUmVxdWVzdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFZpc2l0b3JzIGJyb2tlbiBvdXQgbGlrZSB0aGlzIHNvIHdlIGNhbiBjb25kaXRpb25hbGx5XG4gICAgICAgIC8vIGRlYnVnIGJhc2VkIG9uIGZpbGUgcGF0aC5cbiAgICAgICAgQXR0ck5vZGUoLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9ycy5BdHRyTm9kZSguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgRWxlbWVudE5vZGUobm9kZSwgd2Fsa2VyKSB7XG4gICAgICAgICAgLy8gY2xhc3MgYXR0cmlidXRlIGhhbmRsaW5nXG4gICAgICAgICAgdmlzaXRvcnMuRWxlbWVudE5vZGUobm9kZSwgd2Fsa2VyKTtcblxuICAgICAgICAgIGlmIChoYXNTY29wZWRBdHRyaWJ1dGUobm9kZSkpIHtcbiAgICAgICAgICAgIGlmICh3YWxrZXIucGFyZW50Py5ub2RlLnR5cGUgIT09ICdUZW1wbGF0ZScpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICc8c3R5bGUgc2NvcGVkPiB0YWdzIG11c3QgYmUgYXQgdGhlIHJvb3Qgb2YgdGhlIHRlbXBsYXRlLCB0aGV5IGNhbm5vdCBiZSBuZXN0ZWQnLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZXR1cm5pbmcgbnVsbCByZW1vdmVzIHRoZSBub2RlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIE11c3RhY2hlU3RhdGVtZW50KC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvcnMuTXVzdGFjaGVTdGF0ZW1lbnQoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIFN1YkV4cHJlc3Npb24oLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9ycy5TdWJFeHByZXNzaW9uKC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9O1xufVxuXG4vKipcbiAqIFRoYW5rcywgQ2FyZFN0YWNrIGFuZCBAZWY0IGZvciB0aGlzIGNvZGUuXG4gKi9cbmNvbnN0IFNDT1BFRF9BVFRSSUJVVEVfTkFNRSA9ICdzY29wZWQnO1xuXG5mdW5jdGlvbiBoYXNTY29wZWRBdHRyaWJ1dGUobm9kZSkge1xuICBpZiAoIW5vZGUpIHJldHVybjtcbiAgaWYgKG5vZGUudGFnICE9PSAnc3R5bGUnKSByZXR1cm47XG4gIGlmIChub2RlLnR5cGUgIT09ICdFbGVtZW50Tm9kZScpIHJldHVybjtcblxuICByZXR1cm4gbm9kZS5hdHRyaWJ1dGVzLnNvbWUoXG4gICAgKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUgPT09IFNDT1BFRF9BVFRSSUJVVEVfTkFNRSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gdGV4dENvbnRlbnQobm9kZSkge1xuICBsZXQgdGV4dENoaWxkcmVuID0gbm9kZS5jaGlsZHJlbi5maWx0ZXIoKGMpID0+IGMudHlwZSA9PT0gJ1RleHROb2RlJyk7XG5cbiAgcmV0dXJuIHRleHRDaGlsZHJlbi5tYXAoKGMpID0+IGMuY2hhcnMpLmpvaW4oJycpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUEseUJBQW1CO0FBQ25CLHFCQUFtQztBQUNuQyx5QkFBOEI7QUFDOUIsdUJBQWlCOzs7QUMyQmpCLFNBQVMsUUFBUSxHQUFHLEdBQUc7QUFDckIsTUFBSSxPQUFPLElBQUksVUFBVyxJQUFJO0FBQzlCLE1BQUksT0FBTyxLQUFLLE9BQU8sS0FBSyxPQUFPLE9BQU87QUFFMUMsU0FBUSxPQUFPLEtBQU8sTUFBTTtBQUM5QjtBQVNBLFNBQVMsY0FBYyxLQUFLLEtBQUs7QUFDL0IsU0FBUSxPQUFPLE1BQVEsUUFBUyxLQUFLO0FBQ3ZDO0FBYUEsU0FBUyxPQUFPLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQ2hDLFNBQU8sUUFBUSxjQUFjLFFBQVEsUUFBUSxHQUFHLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDM0U7QUFjQSxTQUFTLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztBQUNsQyxTQUFPLE9BQVEsSUFBSSxJQUFNLENBQUMsSUFBSSxHQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqRDtBQWNBLFNBQVMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQ2xDLFNBQU8sT0FBUSxJQUFJLElBQU0sSUFBSSxDQUFDLEdBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pEO0FBY0EsU0FBUyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDbEMsU0FBTyxPQUFPLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN4QztBQWNBLFNBQVMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQ2xDLFNBQU8sT0FBTyxLQUFLLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUMzQztBQVNBLFNBQVMsUUFBUSxHQUFHLEtBQUs7QUFFdkIsSUFBRSxPQUFPLENBQUMsS0FBSyxPQUFRLE1BQU07QUFDN0IsS0FBSyxNQUFNLE9BQVEsS0FBTSxLQUFLLEVBQUUsSUFBSTtBQUVwQyxNQUFJO0FBQ0osTUFBSTtBQUNKLE1BQUk7QUFDSixNQUFJO0FBQ0osTUFBSTtBQUNKLE1BQUksSUFBSTtBQUNSLE1BQUksSUFBSTtBQUNSLE1BQUksSUFBSTtBQUNSLE1BQUksSUFBSTtBQUVSLE9BQUssSUFBSSxHQUFHLElBQUksRUFBRSxRQUFRLEtBQUssSUFBSTtBQUNqQyxXQUFPO0FBQ1AsV0FBTztBQUNQLFdBQU87QUFDUCxXQUFPO0FBRVAsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxVQUFVO0FBQ3pDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxNQUFNO0FBQzNDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxXQUFXO0FBQ2hELFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxTQUFTO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxXQUFXO0FBQ2hELFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxVQUFVO0FBRS9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxXQUFXO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxTQUFTO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksVUFBVTtBQUMxQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVTtBQUM3QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsUUFBUTtBQUM1QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksVUFBVTtBQUMvQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVTtBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUztBQUM1QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsV0FBVztBQUMvQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVTtBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVTtBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsV0FBVztBQUMvQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUztBQUM1QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVTtBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksV0FBVztBQUVoRCxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTztBQUMxQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksV0FBVztBQUMvQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksVUFBVTtBQUMvQyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksU0FBUztBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsV0FBVztBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVTtBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVTtBQUM5QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksV0FBVztBQUNoRCxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsU0FBUztBQUM3QyxRQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFDMUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFFBQVE7QUFDNUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFDN0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFVBQVU7QUFDL0MsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFNBQVM7QUFDOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVU7QUFFOUMsUUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxVQUFVO0FBQ3pDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxXQUFXO0FBQ2hELFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxVQUFVO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxRQUFRO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXO0FBQy9DLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVO0FBQzdDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxTQUFTO0FBQzlDLFFBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXO0FBQy9DLFFBQUks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b0JBQVFBLEtBQUk7QUFFWixnQkFBSSxhQUFhLFlBQVksU0FBU0EsTUFBSyxJQUFJQyxVQUFTO0FBRXhELGdCQUFJLEtBQUssUUFBUSxvQkFBb0IsVUFBVTtBQUFBLFVBQ2pEO0FBQUEsUUFDRjtBQUFBO0FBQUE7QUFBQSxRQUlBLFlBQVksTUFBTTtBQUNoQixpQkFBTyxTQUFTLFNBQVMsR0FBRyxJQUFJO0FBQUEsUUFDbEM7QUFBQSxRQUNBLFlBQVksTUFBTSxRQUFRO0FBRXhCLG1CQUFTLFlBQVksTUFBTSxNQUFNO0FBRWpDLGNBQUksbUJBQW1CLElBQUksR0FBRztBQUM1QixnQkFBSSxPQUFPLFFBQVEsS0FBSyxTQUFTLFlBQVk7QUFDM0Msb0JBQU0sSUFBSTtBQUFBLGdCQUNSO0FBQUEsY0FDRjtBQUFBLFlBQ0Y7QUFHQSxtQkFBTztBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBQUEsUUFDQSxxQkFBcUIsTUFBTTtBQUN6QixpQkFBTyxTQUFTLGtCQUFrQixHQUFHLElBQUk7QUFBQSxRQUMzQztBQUFBLFFBQ0EsaUJBQWlCLE1BQU07QUFDckIsaUJBQU8sU0FBUyxjQUFjLEdBQUcsSUFBSTtBQUFBLFFBQ3ZDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFLQSxJQUFNLHdCQUF3QjtBQUU5QixTQUFTLG1CQUFtQixNQUFNO0FBQ2hDLE1BQUksQ0FBQyxLQUFNO0FBQ1gsTUFBSSxLQUFLLFFBQVEsUUFBUztBQUMxQixNQUFJLEtBQUssU0FBUyxjQUFlO0FBRWpDLFNBQU8sS0FBSyxXQUFXO0FBQUEsSUFDckIsQ0FBQyxjQUFjLFVBQVUsU0FBUztBQUFBLEVBQ3BDO0FBQ0Y7QUFFQSxTQUFTLFlBQVksTUFBTTtBQUN6QixNQUFJLGVBQWUsS0FBSyxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxVQUFVO0FBRXBFLFNBQU8sYUFBYSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDakQ7OztBWjNMTyxJQUFNLGVBQWUsNEJBQWtCOyIsCiAgIm5hbWVzIjogWyJrZXkiLCAiaGFzaCIsICJwYXRoIiwgImFzc2VydCIsICJmc1N5bmMiLCAicGF0aCIsICJpbXBvcnRfbm9kZV9wYXRoIiwgInBhdGgiLCAiaW1wb3J0X3Bvc3Rjc3MiLCAiaW1wb3J0X3Bvc3Rjc3Nfc2VsZWN0b3JfcGFyc2VyIiwgImhhc2giLCAicG9zdGNzcyIsICJwYXJzZXIiLCAicGFyc2VyIiwgInBvc3Rjc3MiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJwYXRoIiwgInJlY2FzdCIsICJub2RlIiwgInBhdGgiLCAiaW5mbyIsICJzY29wZWRDc3MiXQp9Cg==