@cartanova/qgrid-cli 1.0.1 → 1.0.3

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.
Files changed (138) hide show
  1. package/bundle/dist/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js +9 -0
  2. package/bundle/dist/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js +6 -0
  3. package/bundle/dist/dist/_virtual/_rolldown/runtime.js +15 -0
  4. package/bundle/dist/dist/application/qgrid/oauth.js +140 -0
  5. package/bundle/dist/dist/application/qgrid/pool.js +100 -0
  6. package/bundle/dist/dist/application/qgrid/qgrid.frame.js +280 -0
  7. package/bundle/dist/dist/application/qgrid/qgrid.types.js +79 -0
  8. package/bundle/dist/dist/application/qgrid/worker.js +183 -0
  9. package/bundle/dist/dist/application/queries.generated.js +31 -0
  10. package/bundle/dist/dist/application/request-log/request-log.model.js +113 -0
  11. package/bundle/dist/dist/application/request-log/request-log.types.js +13 -0
  12. package/bundle/dist/dist/application/sonamu.generated.js +99 -0
  13. package/bundle/dist/dist/application/sonamu.generated.sso.js +34 -0
  14. package/bundle/dist/dist/application/token/token.model.js +157 -0
  15. package/bundle/dist/dist/application/token/token.types.js +22 -0
  16. package/bundle/dist/dist/i18n/en.js +63 -0
  17. package/bundle/dist/dist/i18n/ko.js +62 -0
  18. package/bundle/dist/dist/i18n/sd.generated.js +272 -0
  19. package/bundle/dist/dist/index.js +11 -0
  20. package/bundle/dist/dist/migrations/20260410171405_create__request_logs.js +26 -0
  21. package/bundle/dist/dist/migrations/20260410171406_create__tokens.js +24 -0
  22. package/bundle/dist/dist/migrations/20260411120624_alter_tokens_alter2.js +16 -0
  23. package/bundle/dist/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +155 -0
  24. package/bundle/dist/dist/node_modules/.pnpm/@vitest_expect@4.1.2/node_modules/@vitest/expect/dist/index.js +1484 -0
  25. package/bundle/dist/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js +887 -0
  26. package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/chunk-artifact.js +2746 -0
  27. package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/index.js +8 -0
  28. package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/utils.js +8 -0
  29. package/bundle/dist/dist/node_modules/.pnpm/@vitest_snapshot@4.1.2/node_modules/@vitest/snapshot/dist/index.js +662 -0
  30. package/bundle/dist/dist/node_modules/.pnpm/@vitest_spy@4.1.2/node_modules/@vitest/spy/dist/index.js +386 -0
  31. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +82 -0
  32. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/constants.js +48 -0
  33. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/diff.js +1307 -0
  34. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/display.js +558 -0
  35. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/error.js +33 -0
  36. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/helpers.js +226 -0
  37. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/offset.js +27 -0
  38. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/serialize.js +77 -0
  39. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/source-map.js +374 -0
  40. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js +37 -0
  41. package/bundle/dist/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +2886 -0
  42. package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +10 -0
  43. package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +109 -0
  44. package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +10 -0
  45. package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +10 -0
  46. package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +10 -0
  47. package/bundle/dist/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +1127 -0
  48. package/bundle/dist/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +21 -0
  49. package/bundle/dist/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +432 -0
  50. package/bundle/dist/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +506 -0
  51. package/bundle/dist/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +86 -0
  52. package/bundle/dist/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.9.2_@emnapi_runtime@1.9.2_@types_node@25.0.7_esbuild@0.27.4_jiti@2.6.1_sass@1.98.0_tsx@4.21.0/node_modules/vite/dist/node/module-runner.js +426 -0
  53. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +6 -0
  54. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +41 -0
  55. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +19 -0
  56. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +202 -0
  57. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/index.DOa3dzoN.js +16 -0
  58. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +59 -0
  59. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/test.p_J6dB8a.js +2910 -0
  60. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +44 -0
  61. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/index.js +28 -0
  62. package/bundle/dist/dist/sonamu.config.js +196 -0
  63. package/bundle/dist/dist/testing/fixture.js +8 -0
  64. package/bundle/dist/dist/testing/global.js +9 -0
  65. package/bundle/dist/dist/testing/setup-mocks.js +17 -0
  66. package/bundle/dist/dist/utils/subset-loaders.js +12 -0
  67. package/bundle/src/application/qgrid/oauth.ts +181 -0
  68. package/bundle/src/application/qgrid/pool.ts +132 -0
  69. package/bundle/src/application/qgrid/qgrid.frame.ts +275 -0
  70. package/bundle/src/application/qgrid/qgrid.types.ts +117 -0
  71. package/bundle/src/application/qgrid/worker.ts +234 -0
  72. package/bundle/src/application/queries.generated.ts +59 -0
  73. package/bundle/src/application/request-log/request-log.model.ts +155 -0
  74. package/bundle/src/application/request-log/request-log.types.ts +15 -0
  75. package/bundle/src/application/sonamu.generated.http +187 -0
  76. package/bundle/src/application/sonamu.generated.sso.ts +66 -0
  77. package/bundle/src/application/sonamu.generated.ts +135 -0
  78. package/bundle/src/application/token/token.model.ts +160 -0
  79. package/bundle/src/application/token/token.types.ts +26 -0
  80. package/bundle/src/i18n/en.ts +59 -0
  81. package/bundle/src/i18n/ko.ts +59 -0
  82. package/bundle/src/i18n/sd.generated.ts +384 -0
  83. package/bundle/src/index.ts +6 -0
  84. package/bundle/src/sonamu.config.ts +248 -0
  85. package/bundle/src/src/application/qgrid/oauth.ts +181 -0
  86. package/bundle/src/src/application/qgrid/pool.ts +132 -0
  87. package/bundle/src/src/application/qgrid/qgrid.frame.ts +275 -0
  88. package/bundle/src/src/application/qgrid/qgrid.types.ts +117 -0
  89. package/bundle/src/src/application/qgrid/worker.ts +234 -0
  90. package/bundle/src/src/application/queries.generated.ts +59 -0
  91. package/bundle/src/src/application/request-log/request-log.entity.json +75 -0
  92. package/bundle/src/src/application/request-log/request-log.model.ts +155 -0
  93. package/bundle/src/src/application/request-log/request-log.types.ts +15 -0
  94. package/bundle/src/src/application/sonamu.generated.http +187 -0
  95. package/bundle/src/src/application/sonamu.generated.sso.ts +66 -0
  96. package/bundle/src/src/application/sonamu.generated.ts +135 -0
  97. package/bundle/src/src/application/token/token.entity.json +37 -0
  98. package/bundle/src/src/application/token/token.model.ts +160 -0
  99. package/bundle/src/src/application/token/token.types.ts +26 -0
  100. package/bundle/src/src/i18n/en.ts +59 -0
  101. package/bundle/src/src/i18n/ko.ts +59 -0
  102. package/bundle/src/src/i18n/sd.generated.ts +384 -0
  103. package/bundle/src/src/index.ts +6 -0
  104. package/bundle/src/src/migrations/20260410171405_create__request_logs.ts +23 -0
  105. package/bundle/src/src/migrations/20260410171406_create__tokens.ts +21 -0
  106. package/bundle/src/src/migrations/20260411120624_alter_tokens_alter2.ts +15 -0
  107. package/bundle/src/src/sonamu.config.ts +248 -0
  108. package/bundle/src/src/testing/fixture.ts +6 -0
  109. package/bundle/src/src/testing/global.ts +6 -0
  110. package/bundle/src/src/testing/setup-mocks.ts +44 -0
  111. package/bundle/src/src/typings/fastify.d.ts +8 -0
  112. package/bundle/src/src/typings/sonamu.d.ts +17 -0
  113. package/bundle/src/src/utils/subset-loaders.ts +11 -0
  114. package/bundle/src/testing/fixture.ts +6 -0
  115. package/bundle/src/testing/global.ts +6 -0
  116. package/bundle/src/testing/setup-mocks.ts +44 -0
  117. package/bundle/src/typings/fastify.d.ts +8 -0
  118. package/bundle/src/typings/sonamu.d.ts +17 -0
  119. package/bundle/src/utils/subset-loaders.ts +11 -0
  120. package/bundle/web-dist/web-dist/client/assets/index-DlPchHBY.js +116 -0
  121. package/bundle/web-dist/web-dist/client/assets/index-vZsvyuFn.css +1 -0
  122. package/bundle/web-dist/web-dist/client/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
  123. package/bundle/web-dist/web-dist/client/assets/routes-CagDz23B.js +1 -0
  124. package/bundle/web-dist/web-dist/client/assets/sd.generated-BrQoQXvv.js +47 -0
  125. package/bundle/web-dist/web-dist/client/assets/services.generated-BspO2L0j.js +1 -0
  126. package/bundle/web-dist/web-dist/client/assets/show-aXUGa0gm.js +29 -0
  127. package/bundle/web-dist/web-dist/client/assets/tokens-DRkXtZ3Q.js +1 -0
  128. package/bundle/web-dist/web-dist/client/assets/vendor-react-DH4kUfK2.js +9 -0
  129. package/bundle/web-dist/web-dist/client/assets/vendor-tanstack-CUxlo6YN.js +1 -0
  130. package/bundle/web-dist/web-dist/client/index.html +18 -0
  131. package/bundle/web-dist/web-dist/server/assets/react-dom-CGIzOSuj.js +335 -0
  132. package/bundle/web-dist/web-dist/server/assets/routes-ClzReRep.js +490 -0
  133. package/bundle/web-dist/web-dist/server/assets/sd.generated-BnonqqKr.js +21694 -0
  134. package/bundle/web-dist/web-dist/server/assets/services.generated-D5ABD5fr.js +836 -0
  135. package/bundle/web-dist/web-dist/server/assets/show-C9pcdSxc.js +23364 -0
  136. package/bundle/web-dist/web-dist/server/assets/tokens-JH6FsnWZ.js +860 -0
  137. package/bundle/web-dist/web-dist/server/entry-server.generated.js +44646 -0
  138. package/package.json +11 -10
@@ -0,0 +1,2886 @@
1
+ import { __exportAll } from "../../../../../_virtual/_rolldown/runtime.js";
2
+ //#region ../../node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js
3
+ var chai_exports = /* @__PURE__ */ __exportAll({
4
+ Assertion: () => Assertion,
5
+ AssertionError: () => AssertionError,
6
+ Should: () => Should,
7
+ assert: () => assert,
8
+ config: () => config,
9
+ expect: () => expect,
10
+ should: () => should,
11
+ use: () => use,
12
+ util: () => utils_exports
13
+ });
14
+ var __defProp = Object.defineProperty;
15
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {
16
+ enumerable: true,
17
+ configurable: true,
18
+ writable: true,
19
+ value
20
+ }) : obj[key] = value;
21
+ var __name = (target, value) => __defProp(target, "name", {
22
+ value,
23
+ configurable: true
24
+ });
25
+ var __export = (target, all) => {
26
+ for (var name in all) __defProp(target, name, {
27
+ get: all[name],
28
+ enumerable: true
29
+ });
30
+ };
31
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
32
+ var utils_exports = {};
33
+ __export(utils_exports, {
34
+ addChainableMethod: () => addChainableMethod,
35
+ addLengthGuard: () => addLengthGuard,
36
+ addMethod: () => addMethod,
37
+ addProperty: () => addProperty,
38
+ checkError: () => check_error_exports,
39
+ compareByInspect: () => compareByInspect,
40
+ eql: () => deep_eql_default,
41
+ events: () => events,
42
+ expectTypes: () => expectTypes,
43
+ flag: () => flag,
44
+ getActual: () => getActual,
45
+ getMessage: () => getMessage2,
46
+ getName: () => getName,
47
+ getOperator: () => getOperator,
48
+ getOwnEnumerableProperties: () => getOwnEnumerableProperties,
49
+ getOwnEnumerablePropertySymbols: () => getOwnEnumerablePropertySymbols,
50
+ getPathInfo: () => getPathInfo,
51
+ hasProperty: () => hasProperty,
52
+ inspect: () => inspect2,
53
+ isNaN: () => isNaN2,
54
+ isNumeric: () => isNumeric,
55
+ isProxyEnabled: () => isProxyEnabled,
56
+ isRegExp: () => isRegExp2,
57
+ objDisplay: () => objDisplay,
58
+ overwriteChainableMethod: () => overwriteChainableMethod,
59
+ overwriteMethod: () => overwriteMethod,
60
+ overwriteProperty: () => overwriteProperty,
61
+ proxify: () => proxify,
62
+ test: () => test,
63
+ transferFlags: () => transferFlags,
64
+ type: () => type
65
+ });
66
+ var check_error_exports = {};
67
+ __export(check_error_exports, {
68
+ compatibleConstructor: () => compatibleConstructor,
69
+ compatibleInstance: () => compatibleInstance,
70
+ compatibleMessage: () => compatibleMessage,
71
+ getConstructorName: () => getConstructorName,
72
+ getMessage: () => getMessage
73
+ });
74
+ function isErrorInstance(obj) {
75
+ return obj instanceof Error || Object.prototype.toString.call(obj) === "[object Error]";
76
+ }
77
+ __name(isErrorInstance, "isErrorInstance");
78
+ function isRegExp(obj) {
79
+ return Object.prototype.toString.call(obj) === "[object RegExp]";
80
+ }
81
+ __name(isRegExp, "isRegExp");
82
+ function compatibleInstance(thrown, errorLike) {
83
+ return isErrorInstance(errorLike) && thrown === errorLike;
84
+ }
85
+ __name(compatibleInstance, "compatibleInstance");
86
+ function compatibleConstructor(thrown, errorLike) {
87
+ if (isErrorInstance(errorLike)) return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor;
88
+ else if ((typeof errorLike === "object" || typeof errorLike === "function") && errorLike.prototype) return thrown.constructor === errorLike || thrown instanceof errorLike;
89
+ return false;
90
+ }
91
+ __name(compatibleConstructor, "compatibleConstructor");
92
+ function compatibleMessage(thrown, errMatcher) {
93
+ const comparisonString = typeof thrown === "string" ? thrown : thrown.message;
94
+ if (isRegExp(errMatcher)) return errMatcher.test(comparisonString);
95
+ else if (typeof errMatcher === "string") return comparisonString.indexOf(errMatcher) !== -1;
96
+ return false;
97
+ }
98
+ __name(compatibleMessage, "compatibleMessage");
99
+ function getConstructorName(errorLike) {
100
+ let constructorName = errorLike;
101
+ if (isErrorInstance(errorLike)) constructorName = errorLike.constructor.name;
102
+ else if (typeof errorLike === "function") {
103
+ constructorName = errorLike.name;
104
+ if (constructorName === "") constructorName = new errorLike().name || constructorName;
105
+ }
106
+ return constructorName;
107
+ }
108
+ __name(getConstructorName, "getConstructorName");
109
+ function getMessage(errorLike) {
110
+ let msg = "";
111
+ if (errorLike && errorLike.message) msg = errorLike.message;
112
+ else if (typeof errorLike === "string") msg = errorLike;
113
+ return msg;
114
+ }
115
+ __name(getMessage, "getMessage");
116
+ function flag(obj, key, value) {
117
+ let flags = obj.__flags || (obj.__flags = /* @__PURE__ */ Object.create(null));
118
+ if (arguments.length === 3) flags[key] = value;
119
+ else return flags[key];
120
+ }
121
+ __name(flag, "flag");
122
+ function test(obj, args) {
123
+ let negate = flag(obj, "negate"), expr = args[0];
124
+ return negate ? !expr : expr;
125
+ }
126
+ __name(test, "test");
127
+ function type(obj) {
128
+ if (typeof obj === "undefined") return "undefined";
129
+ if (obj === null) return "null";
130
+ const stringTag = obj[Symbol.toStringTag];
131
+ if (typeof stringTag === "string") return stringTag;
132
+ return Object.prototype.toString.call(obj).slice(8, -1);
133
+ }
134
+ __name(type, "type");
135
+ var canElideFrames = "captureStackTrace" in Error;
136
+ var _AssertionError = class _AssertionError extends Error {
137
+ constructor(message = "Unspecified AssertionError", props, ssf) {
138
+ super(message);
139
+ __publicField(this, "message");
140
+ this.message = message;
141
+ if (canElideFrames) Error.captureStackTrace(this, ssf || _AssertionError);
142
+ for (const key in props) if (!(key in this)) this[key] = props[key];
143
+ }
144
+ get name() {
145
+ return "AssertionError";
146
+ }
147
+ get ok() {
148
+ return false;
149
+ }
150
+ toJSON(stack) {
151
+ return {
152
+ ...this,
153
+ name: this.name,
154
+ message: this.message,
155
+ ok: false,
156
+ stack: stack !== false ? this.stack : void 0
157
+ };
158
+ }
159
+ };
160
+ __name(_AssertionError, "AssertionError");
161
+ var AssertionError = _AssertionError;
162
+ function expectTypes(obj, types) {
163
+ let flagMsg = flag(obj, "message");
164
+ let ssfi = flag(obj, "ssfi");
165
+ flagMsg = flagMsg ? flagMsg + ": " : "";
166
+ obj = flag(obj, "object");
167
+ types = types.map(function(t) {
168
+ return t.toLowerCase();
169
+ });
170
+ types.sort();
171
+ let str = types.map(function(t, index) {
172
+ let art = ~[
173
+ "a",
174
+ "e",
175
+ "i",
176
+ "o",
177
+ "u"
178
+ ].indexOf(t.charAt(0)) ? "an" : "a";
179
+ return (types.length > 1 && index === types.length - 1 ? "or " : "") + art + " " + t;
180
+ }).join(", ");
181
+ let objType = type(obj).toLowerCase();
182
+ if (!types.some(function(expected) {
183
+ return objType === expected;
184
+ })) throw new AssertionError(flagMsg + "object tested must be " + str + ", but " + objType + " given", void 0, ssfi);
185
+ }
186
+ __name(expectTypes, "expectTypes");
187
+ function getActual(obj, args) {
188
+ return args.length > 4 ? args[4] : obj._obj;
189
+ }
190
+ __name(getActual, "getActual");
191
+ var ansiColors = {
192
+ bold: ["1", "22"],
193
+ dim: ["2", "22"],
194
+ italic: ["3", "23"],
195
+ underline: ["4", "24"],
196
+ inverse: ["7", "27"],
197
+ hidden: ["8", "28"],
198
+ strike: ["9", "29"],
199
+ black: ["30", "39"],
200
+ red: ["31", "39"],
201
+ green: ["32", "39"],
202
+ yellow: ["33", "39"],
203
+ blue: ["34", "39"],
204
+ magenta: ["35", "39"],
205
+ cyan: ["36", "39"],
206
+ white: ["37", "39"],
207
+ brightblack: ["30;1", "39"],
208
+ brightred: ["31;1", "39"],
209
+ brightgreen: ["32;1", "39"],
210
+ brightyellow: ["33;1", "39"],
211
+ brightblue: ["34;1", "39"],
212
+ brightmagenta: ["35;1", "39"],
213
+ brightcyan: ["36;1", "39"],
214
+ brightwhite: ["37;1", "39"],
215
+ grey: ["90", "39"]
216
+ };
217
+ var styles = {
218
+ special: "cyan",
219
+ number: "yellow",
220
+ bigint: "yellow",
221
+ boolean: "yellow",
222
+ undefined: "grey",
223
+ null: "bold",
224
+ string: "green",
225
+ symbol: "green",
226
+ date: "magenta",
227
+ regexp: "red"
228
+ };
229
+ var truncator = "…";
230
+ function colorise(value, styleType) {
231
+ const color = ansiColors[styles[styleType]] || ansiColors[styleType] || "";
232
+ if (!color) return String(value);
233
+ return `\x1B[${color[0]}m${String(value)}\x1B[${color[1]}m`;
234
+ }
235
+ __name(colorise, "colorise");
236
+ function normaliseOptions({ showHidden = false, depth = 2, colors = false, customInspect = true, showProxy = false, maxArrayLength = Infinity, breakLength = Infinity, seen = [], truncate: truncate2 = Infinity, stylize = String } = {}, inspect3) {
237
+ const options = {
238
+ showHidden: Boolean(showHidden),
239
+ depth: Number(depth),
240
+ colors: Boolean(colors),
241
+ customInspect: Boolean(customInspect),
242
+ showProxy: Boolean(showProxy),
243
+ maxArrayLength: Number(maxArrayLength),
244
+ breakLength: Number(breakLength),
245
+ truncate: Number(truncate2),
246
+ seen,
247
+ inspect: inspect3,
248
+ stylize
249
+ };
250
+ if (options.colors) options.stylize = colorise;
251
+ return options;
252
+ }
253
+ __name(normaliseOptions, "normaliseOptions");
254
+ function isHighSurrogate(char) {
255
+ return char >= "\ud800" && char <= "\udbff";
256
+ }
257
+ __name(isHighSurrogate, "isHighSurrogate");
258
+ function truncate(string, length, tail = truncator) {
259
+ string = String(string);
260
+ const tailLength = tail.length;
261
+ const stringLength = string.length;
262
+ if (tailLength > length && stringLength > tailLength) return tail;
263
+ if (stringLength > length && stringLength > tailLength) {
264
+ let end = length - tailLength;
265
+ if (end > 0 && isHighSurrogate(string[end - 1])) end = end - 1;
266
+ return `${string.slice(0, end)}${tail}`;
267
+ }
268
+ return string;
269
+ }
270
+ __name(truncate, "truncate");
271
+ function inspectList(list, options, inspectItem, separator = ", ") {
272
+ inspectItem = inspectItem || options.inspect;
273
+ const size = list.length;
274
+ if (size === 0) return "";
275
+ const originalLength = options.truncate;
276
+ let output = "";
277
+ let peek = "";
278
+ let truncated = "";
279
+ for (let i = 0; i < size; i += 1) {
280
+ const last = i + 1 === list.length;
281
+ const secondToLast = i + 2 === list.length;
282
+ truncated = `${truncator}(${list.length - i})`;
283
+ const value = list[i];
284
+ options.truncate = originalLength - output.length - (last ? 0 : separator.length);
285
+ const string = peek || inspectItem(value, options) + (last ? "" : separator);
286
+ const nextLength = output.length + string.length;
287
+ const truncatedLength = nextLength + truncated.length;
288
+ if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) break;
289
+ if (!last && !secondToLast && truncatedLength > originalLength) break;
290
+ peek = last ? "" : inspectItem(list[i + 1], options) + (secondToLast ? "" : separator);
291
+ if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) break;
292
+ output += string;
293
+ if (!last && !secondToLast && nextLength + peek.length >= originalLength) {
294
+ truncated = `${truncator}(${list.length - i - 1})`;
295
+ break;
296
+ }
297
+ truncated = "";
298
+ }
299
+ return `${output}${truncated}`;
300
+ }
301
+ __name(inspectList, "inspectList");
302
+ function quoteComplexKey(key) {
303
+ if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) return key;
304
+ return JSON.stringify(key).replace(/'/g, "\\'").replace(/\\"/g, "\"").replace(/(^"|"$)/g, "'");
305
+ }
306
+ __name(quoteComplexKey, "quoteComplexKey");
307
+ function inspectProperty([key, value], options) {
308
+ options.truncate -= 2;
309
+ if (typeof key === "string") key = quoteComplexKey(key);
310
+ else if (typeof key !== "number") key = `[${options.inspect(key, options)}]`;
311
+ options.truncate -= key.length;
312
+ value = options.inspect(value, options);
313
+ return `${key}: ${value}`;
314
+ }
315
+ __name(inspectProperty, "inspectProperty");
316
+ function inspectArray(array, options) {
317
+ const nonIndexProperties = Object.keys(array).slice(array.length);
318
+ if (!array.length && !nonIndexProperties.length) return "[]";
319
+ options.truncate -= 4;
320
+ const listContents = inspectList(array, options);
321
+ options.truncate -= listContents.length;
322
+ let propertyContents = "";
323
+ if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
324
+ return `[ ${listContents}${propertyContents ? `, ${propertyContents}` : ""} ]`;
325
+ }
326
+ __name(inspectArray, "inspectArray");
327
+ var getArrayName = /* @__PURE__ */ __name((array) => {
328
+ if (typeof Buffer === "function" && array instanceof Buffer) return "Buffer";
329
+ if (array[Symbol.toStringTag]) return array[Symbol.toStringTag];
330
+ return array.constructor.name;
331
+ }, "getArrayName");
332
+ function inspectTypedArray(array, options) {
333
+ const name = getArrayName(array);
334
+ options.truncate -= name.length + 4;
335
+ const nonIndexProperties = Object.keys(array).slice(array.length);
336
+ if (!array.length && !nonIndexProperties.length) return `${name}[]`;
337
+ let output = "";
338
+ for (let i = 0; i < array.length; i++) {
339
+ const string = `${options.stylize(truncate(array[i], options.truncate), "number")}${i === array.length - 1 ? "" : ", "}`;
340
+ options.truncate -= string.length;
341
+ if (array[i] !== array.length && options.truncate <= 3) {
342
+ output += `${truncator}(${array.length - array[i] + 1})`;
343
+ break;
344
+ }
345
+ output += string;
346
+ }
347
+ let propertyContents = "";
348
+ if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
349
+ return `${name}[ ${output}${propertyContents ? `, ${propertyContents}` : ""} ]`;
350
+ }
351
+ __name(inspectTypedArray, "inspectTypedArray");
352
+ function inspectDate(dateObject, options) {
353
+ const stringRepresentation = dateObject.toJSON();
354
+ if (stringRepresentation === null) return "Invalid Date";
355
+ const split = stringRepresentation.split("T");
356
+ const date = split[0];
357
+ return options.stylize(`${date}T${truncate(split[1], options.truncate - date.length - 1)}`, "date");
358
+ }
359
+ __name(inspectDate, "inspectDate");
360
+ function inspectFunction(func, options) {
361
+ const functionType = func[Symbol.toStringTag] || "Function";
362
+ const name = func.name;
363
+ if (!name) return options.stylize(`[${functionType}]`, "special");
364
+ return options.stylize(`[${functionType} ${truncate(name, options.truncate - 11)}]`, "special");
365
+ }
366
+ __name(inspectFunction, "inspectFunction");
367
+ function inspectMapEntry([key, value], options) {
368
+ options.truncate -= 4;
369
+ key = options.inspect(key, options);
370
+ options.truncate -= key.length;
371
+ value = options.inspect(value, options);
372
+ return `${key} => ${value}`;
373
+ }
374
+ __name(inspectMapEntry, "inspectMapEntry");
375
+ function mapToEntries(map) {
376
+ const entries = [];
377
+ map.forEach((value, key) => {
378
+ entries.push([key, value]);
379
+ });
380
+ return entries;
381
+ }
382
+ __name(mapToEntries, "mapToEntries");
383
+ function inspectMap(map, options) {
384
+ if (map.size === 0) return "Map{}";
385
+ options.truncate -= 7;
386
+ return `Map{ ${inspectList(mapToEntries(map), options, inspectMapEntry)} }`;
387
+ }
388
+ __name(inspectMap, "inspectMap");
389
+ var isNaN = Number.isNaN || ((i) => i !== i);
390
+ function inspectNumber(number, options) {
391
+ if (isNaN(number)) return options.stylize("NaN", "number");
392
+ if (number === Infinity) return options.stylize("Infinity", "number");
393
+ if (number === -Infinity) return options.stylize("-Infinity", "number");
394
+ if (number === 0) return options.stylize(1 / number === Infinity ? "+0" : "-0", "number");
395
+ return options.stylize(truncate(String(number), options.truncate), "number");
396
+ }
397
+ __name(inspectNumber, "inspectNumber");
398
+ function inspectBigInt(number, options) {
399
+ let nums = truncate(number.toString(), options.truncate - 1);
400
+ if (nums !== truncator) nums += "n";
401
+ return options.stylize(nums, "bigint");
402
+ }
403
+ __name(inspectBigInt, "inspectBigInt");
404
+ function inspectRegExp(value, options) {
405
+ const flags = value.toString().split("/")[2];
406
+ const sourceLength = options.truncate - (2 + flags.length);
407
+ const source = value.source;
408
+ return options.stylize(`/${truncate(source, sourceLength)}/${flags}`, "regexp");
409
+ }
410
+ __name(inspectRegExp, "inspectRegExp");
411
+ function arrayFromSet(set2) {
412
+ const values = [];
413
+ set2.forEach((value) => {
414
+ values.push(value);
415
+ });
416
+ return values;
417
+ }
418
+ __name(arrayFromSet, "arrayFromSet");
419
+ function inspectSet(set2, options) {
420
+ if (set2.size === 0) return "Set{}";
421
+ options.truncate -= 7;
422
+ return `Set{ ${inspectList(arrayFromSet(set2), options)} }`;
423
+ }
424
+ __name(inspectSet, "inspectSet");
425
+ var stringEscapeChars = /* @__PURE__ */ new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]", "g");
426
+ var escapeCharacters = {
427
+ "\b": "\\b",
428
+ " ": "\\t",
429
+ "\n": "\\n",
430
+ "\f": "\\f",
431
+ "\r": "\\r",
432
+ "'": "\\'",
433
+ "\\": "\\\\"
434
+ };
435
+ var hex = 16;
436
+ var unicodeLength = 4;
437
+ function escape(char) {
438
+ return escapeCharacters[char] || `\\u${`0000${char.charCodeAt(0).toString(hex)}`.slice(-unicodeLength)}`;
439
+ }
440
+ __name(escape, "escape");
441
+ function inspectString(string, options) {
442
+ if (stringEscapeChars.test(string)) string = string.replace(stringEscapeChars, escape);
443
+ return options.stylize(`'${truncate(string, options.truncate - 2)}'`, "string");
444
+ }
445
+ __name(inspectString, "inspectString");
446
+ function inspectSymbol(value) {
447
+ if ("description" in Symbol.prototype) return value.description ? `Symbol(${value.description})` : "Symbol()";
448
+ return value.toString();
449
+ }
450
+ __name(inspectSymbol, "inspectSymbol");
451
+ var promise_default = /* @__PURE__ */ __name(() => "Promise{…}", "getPromiseValue");
452
+ function inspectObject(object, options) {
453
+ const properties = Object.getOwnPropertyNames(object);
454
+ const symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : [];
455
+ if (properties.length === 0 && symbols.length === 0) return "{}";
456
+ options.truncate -= 4;
457
+ options.seen = options.seen || [];
458
+ if (options.seen.includes(object)) return "[Circular]";
459
+ options.seen.push(object);
460
+ const propertyContents = inspectList(properties.map((key) => [key, object[key]]), options, inspectProperty);
461
+ const symbolContents = inspectList(symbols.map((key) => [key, object[key]]), options, inspectProperty);
462
+ options.seen.pop();
463
+ let sep = "";
464
+ if (propertyContents && symbolContents) sep = ", ";
465
+ return `{ ${propertyContents}${sep}${symbolContents} }`;
466
+ }
467
+ __name(inspectObject, "inspectObject");
468
+ var toStringTag = typeof Symbol !== "undefined" && Symbol.toStringTag ? Symbol.toStringTag : false;
469
+ function inspectClass(value, options) {
470
+ let name = "";
471
+ if (toStringTag && toStringTag in value) name = value[toStringTag];
472
+ name = name || value.constructor.name;
473
+ if (!name || name === "_class") name = "<Anonymous Class>";
474
+ options.truncate -= name.length;
475
+ return `${name}${inspectObject(value, options)}`;
476
+ }
477
+ __name(inspectClass, "inspectClass");
478
+ function inspectArguments(args, options) {
479
+ if (args.length === 0) return "Arguments[]";
480
+ options.truncate -= 13;
481
+ return `Arguments[ ${inspectList(args, options)} ]`;
482
+ }
483
+ __name(inspectArguments, "inspectArguments");
484
+ var errorKeys = [
485
+ "stack",
486
+ "line",
487
+ "column",
488
+ "name",
489
+ "message",
490
+ "fileName",
491
+ "lineNumber",
492
+ "columnNumber",
493
+ "number",
494
+ "description",
495
+ "cause"
496
+ ];
497
+ function inspectObject2(error, options) {
498
+ const properties = Object.getOwnPropertyNames(error).filter((key) => errorKeys.indexOf(key) === -1);
499
+ const name = error.name;
500
+ options.truncate -= name.length;
501
+ let message = "";
502
+ if (typeof error.message === "string") message = truncate(error.message, options.truncate);
503
+ else properties.unshift("message");
504
+ message = message ? `: ${message}` : "";
505
+ options.truncate -= message.length + 5;
506
+ options.seen = options.seen || [];
507
+ if (options.seen.includes(error)) return "[Circular]";
508
+ options.seen.push(error);
509
+ const propertyContents = inspectList(properties.map((key) => [key, error[key]]), options, inspectProperty);
510
+ return `${name}${message}${propertyContents ? ` { ${propertyContents} }` : ""}`;
511
+ }
512
+ __name(inspectObject2, "inspectObject");
513
+ function inspectAttribute([key, value], options) {
514
+ options.truncate -= 3;
515
+ if (!value) return `${options.stylize(String(key), "yellow")}`;
516
+ return `${options.stylize(String(key), "yellow")}=${options.stylize(`"${value}"`, "string")}`;
517
+ }
518
+ __name(inspectAttribute, "inspectAttribute");
519
+ function inspectNodeCollection(collection, options) {
520
+ return inspectList(collection, options, inspectNode, "\n");
521
+ }
522
+ __name(inspectNodeCollection, "inspectNodeCollection");
523
+ function inspectNode(node, options) {
524
+ switch (node.nodeType) {
525
+ case 1: return inspectHTML(node, options);
526
+ case 3: return options.inspect(node.data, options);
527
+ default: return options.inspect(node, options);
528
+ }
529
+ }
530
+ __name(inspectNode, "inspectNode");
531
+ function inspectHTML(element, options) {
532
+ const properties = element.getAttributeNames();
533
+ const name = element.tagName.toLowerCase();
534
+ const head = options.stylize(`<${name}`, "special");
535
+ const headClose = options.stylize(`>`, "special");
536
+ const tail = options.stylize(`</${name}>`, "special");
537
+ options.truncate -= name.length * 2 + 5;
538
+ let propertyContents = "";
539
+ if (properties.length > 0) {
540
+ propertyContents += " ";
541
+ propertyContents += inspectList(properties.map((key) => [key, element.getAttribute(key)]), options, inspectAttribute, " ");
542
+ }
543
+ options.truncate -= propertyContents.length;
544
+ const truncate2 = options.truncate;
545
+ let children = inspectNodeCollection(element.children, options);
546
+ if (children && children.length > truncate2) children = `${truncator}(${element.children.length})`;
547
+ return `${head}${propertyContents}${headClose}${children}${tail}`;
548
+ }
549
+ __name(inspectHTML, "inspectHTML");
550
+ var chaiInspect = typeof Symbol === "function" && typeof Symbol.for === "function" ? /* @__PURE__ */ Symbol.for("chai/inspect") : "@@chai/inspect";
551
+ var nodeInspect = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom");
552
+ var constructorMap = /* @__PURE__ */ new WeakMap();
553
+ var stringTagMap = {};
554
+ var baseTypesMap = {
555
+ undefined: /* @__PURE__ */ __name((value, options) => options.stylize("undefined", "undefined"), "undefined"),
556
+ null: /* @__PURE__ */ __name((value, options) => options.stylize("null", "null"), "null"),
557
+ boolean: /* @__PURE__ */ __name((value, options) => options.stylize(String(value), "boolean"), "boolean"),
558
+ Boolean: /* @__PURE__ */ __name((value, options) => options.stylize(String(value), "boolean"), "Boolean"),
559
+ number: inspectNumber,
560
+ Number: inspectNumber,
561
+ bigint: inspectBigInt,
562
+ BigInt: inspectBigInt,
563
+ string: inspectString,
564
+ String: inspectString,
565
+ function: inspectFunction,
566
+ Function: inspectFunction,
567
+ symbol: inspectSymbol,
568
+ Symbol: inspectSymbol,
569
+ Array: inspectArray,
570
+ Date: inspectDate,
571
+ Map: inspectMap,
572
+ Set: inspectSet,
573
+ RegExp: inspectRegExp,
574
+ Promise: promise_default,
575
+ WeakSet: /* @__PURE__ */ __name((value, options) => options.stylize("WeakSet{…}", "special"), "WeakSet"),
576
+ WeakMap: /* @__PURE__ */ __name((value, options) => options.stylize("WeakMap{…}", "special"), "WeakMap"),
577
+ Arguments: inspectArguments,
578
+ Int8Array: inspectTypedArray,
579
+ Uint8Array: inspectTypedArray,
580
+ Uint8ClampedArray: inspectTypedArray,
581
+ Int16Array: inspectTypedArray,
582
+ Uint16Array: inspectTypedArray,
583
+ Int32Array: inspectTypedArray,
584
+ Uint32Array: inspectTypedArray,
585
+ Float32Array: inspectTypedArray,
586
+ Float64Array: inspectTypedArray,
587
+ Generator: /* @__PURE__ */ __name(() => "", "Generator"),
588
+ DataView: /* @__PURE__ */ __name(() => "", "DataView"),
589
+ ArrayBuffer: /* @__PURE__ */ __name(() => "", "ArrayBuffer"),
590
+ Error: inspectObject2,
591
+ HTMLCollection: inspectNodeCollection,
592
+ NodeList: inspectNodeCollection
593
+ };
594
+ var inspectCustom = /* @__PURE__ */ __name((value, options, type3, inspectFn) => {
595
+ if (chaiInspect in value && typeof value[chaiInspect] === "function") return value[chaiInspect](options);
596
+ if (nodeInspect in value && typeof value[nodeInspect] === "function") return value[nodeInspect](options.depth, options, inspectFn);
597
+ if ("inspect" in value && typeof value.inspect === "function") return value.inspect(options.depth, options);
598
+ if ("constructor" in value && constructorMap.has(value.constructor)) return constructorMap.get(value.constructor)(value, options);
599
+ if (stringTagMap[type3]) return stringTagMap[type3](value, options);
600
+ return "";
601
+ }, "inspectCustom");
602
+ var toString = Object.prototype.toString;
603
+ function inspect(value, opts = {}) {
604
+ const options = normaliseOptions(opts, inspect);
605
+ const { customInspect } = options;
606
+ let type3 = value === null ? "null" : typeof value;
607
+ if (type3 === "object") type3 = toString.call(value).slice(8, -1);
608
+ if (type3 in baseTypesMap) return baseTypesMap[type3](value, options);
609
+ if (customInspect && value) {
610
+ const output = inspectCustom(value, options, type3, inspect);
611
+ if (output) {
612
+ if (typeof output === "string") return output;
613
+ return inspect(output, options);
614
+ }
615
+ }
616
+ const proto = value ? Object.getPrototypeOf(value) : false;
617
+ if (proto === Object.prototype || proto === null) return inspectObject(value, options);
618
+ if (value && typeof HTMLElement === "function" && value instanceof HTMLElement) return inspectHTML(value, options);
619
+ if ("constructor" in value) {
620
+ if (value.constructor !== Object) return inspectClass(value, options);
621
+ return inspectObject(value, options);
622
+ }
623
+ if (value === Object(value)) return inspectObject(value, options);
624
+ return options.stylize(String(value), type3);
625
+ }
626
+ __name(inspect, "inspect");
627
+ var config = {
628
+ includeStack: false,
629
+ showDiff: true,
630
+ truncateThreshold: 40,
631
+ useProxy: true,
632
+ proxyExcludedKeys: [
633
+ "then",
634
+ "catch",
635
+ "inspect",
636
+ "toJSON"
637
+ ],
638
+ deepEqual: null
639
+ };
640
+ function inspect2(obj, showHidden, depth, colors) {
641
+ return inspect(obj, {
642
+ colors,
643
+ depth: typeof depth === "undefined" ? 2 : depth,
644
+ showHidden,
645
+ truncate: config.truncateThreshold ? config.truncateThreshold : Infinity
646
+ });
647
+ }
648
+ __name(inspect2, "inspect");
649
+ function objDisplay(obj) {
650
+ let str = inspect2(obj), type3 = Object.prototype.toString.call(obj);
651
+ if (config.truncateThreshold && str.length >= config.truncateThreshold) if (type3 === "[object Function]") return !obj.name || obj.name === "" ? "[Function]" : "[Function: " + obj.name + "]";
652
+ else if (type3 === "[object Array]") return "[ Array(" + obj.length + ") ]";
653
+ else if (type3 === "[object Object]") {
654
+ let keys = Object.keys(obj);
655
+ return "{ Object (" + (keys.length > 2 ? keys.splice(0, 2).join(", ") + ", ..." : keys.join(", ")) + ") }";
656
+ } else return str;
657
+ else return str;
658
+ }
659
+ __name(objDisplay, "objDisplay");
660
+ function getMessage2(obj, args) {
661
+ let negate = flag(obj, "negate");
662
+ let val = flag(obj, "object");
663
+ let expected = args[3];
664
+ let actual = getActual(obj, args);
665
+ let msg = negate ? args[2] : args[1];
666
+ let flagMsg = flag(obj, "message");
667
+ if (typeof msg === "function") msg = msg();
668
+ msg = msg || "";
669
+ msg = msg.replace(/#\{this\}/g, function() {
670
+ return objDisplay(val);
671
+ }).replace(/#\{act\}/g, function() {
672
+ return objDisplay(actual);
673
+ }).replace(/#\{exp\}/g, function() {
674
+ return objDisplay(expected);
675
+ });
676
+ return flagMsg ? flagMsg + ": " + msg : msg;
677
+ }
678
+ __name(getMessage2, "getMessage");
679
+ function transferFlags(assertion, object, includeAll) {
680
+ let flags = assertion.__flags || (assertion.__flags = /* @__PURE__ */ Object.create(null));
681
+ if (!object.__flags) object.__flags = /* @__PURE__ */ Object.create(null);
682
+ includeAll = arguments.length === 3 ? includeAll : true;
683
+ for (let flag3 in flags) if (includeAll || flag3 !== "object" && flag3 !== "ssfi" && flag3 !== "lockSsfi" && flag3 != "message") object.__flags[flag3] = flags[flag3];
684
+ }
685
+ __name(transferFlags, "transferFlags");
686
+ function type2(obj) {
687
+ if (typeof obj === "undefined") return "undefined";
688
+ if (obj === null) return "null";
689
+ const stringTag = obj[Symbol.toStringTag];
690
+ if (typeof stringTag === "string") return stringTag;
691
+ return Object.prototype.toString.call(obj).slice(8, -1);
692
+ }
693
+ __name(type2, "type");
694
+ function FakeMap() {
695
+ this._key = "chai/deep-eql__" + Math.random() + Date.now();
696
+ }
697
+ __name(FakeMap, "FakeMap");
698
+ FakeMap.prototype = {
699
+ get: /* @__PURE__ */ __name(function get(key) {
700
+ return key[this._key];
701
+ }, "get"),
702
+ set: /* @__PURE__ */ __name(function set(key, value) {
703
+ if (Object.isExtensible(key)) Object.defineProperty(key, this._key, {
704
+ value,
705
+ configurable: true
706
+ });
707
+ }, "set")
708
+ };
709
+ var MemoizeMap = typeof WeakMap === "function" ? WeakMap : FakeMap;
710
+ function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) {
711
+ if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) return null;
712
+ var leftHandMap = memoizeMap.get(leftHandOperand);
713
+ if (leftHandMap) {
714
+ var result = leftHandMap.get(rightHandOperand);
715
+ if (typeof result === "boolean") return result;
716
+ }
717
+ return null;
718
+ }
719
+ __name(memoizeCompare, "memoizeCompare");
720
+ function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) {
721
+ if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) return;
722
+ var leftHandMap = memoizeMap.get(leftHandOperand);
723
+ if (leftHandMap) leftHandMap.set(rightHandOperand, result);
724
+ else {
725
+ leftHandMap = new MemoizeMap();
726
+ leftHandMap.set(rightHandOperand, result);
727
+ memoizeMap.set(leftHandOperand, leftHandMap);
728
+ }
729
+ }
730
+ __name(memoizeSet, "memoizeSet");
731
+ var deep_eql_default = deepEqual;
732
+ function deepEqual(leftHandOperand, rightHandOperand, options) {
733
+ if (options && options.comparator) return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
734
+ var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
735
+ if (simpleResult !== null) return simpleResult;
736
+ return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
737
+ }
738
+ __name(deepEqual, "deepEqual");
739
+ function simpleEqual(leftHandOperand, rightHandOperand) {
740
+ if (leftHandOperand === rightHandOperand) return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand;
741
+ if (leftHandOperand !== leftHandOperand && rightHandOperand !== rightHandOperand) return true;
742
+ if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) return false;
743
+ return null;
744
+ }
745
+ __name(simpleEqual, "simpleEqual");
746
+ function extensiveDeepEqual(leftHandOperand, rightHandOperand, options) {
747
+ options = options || {};
748
+ options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap();
749
+ var comparator = options && options.comparator;
750
+ var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize);
751
+ if (memoizeResultLeft !== null) return memoizeResultLeft;
752
+ var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize);
753
+ if (memoizeResultRight !== null) return memoizeResultRight;
754
+ if (comparator) {
755
+ var comparatorResult = comparator(leftHandOperand, rightHandOperand);
756
+ if (comparatorResult === false || comparatorResult === true) {
757
+ memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult);
758
+ return comparatorResult;
759
+ }
760
+ var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
761
+ if (simpleResult !== null) return simpleResult;
762
+ }
763
+ var leftHandType = type2(leftHandOperand);
764
+ if (leftHandType !== type2(rightHandOperand)) {
765
+ memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false);
766
+ return false;
767
+ }
768
+ memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true);
769
+ var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options);
770
+ memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result);
771
+ return result;
772
+ }
773
+ __name(extensiveDeepEqual, "extensiveDeepEqual");
774
+ function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) {
775
+ switch (leftHandType) {
776
+ case "String":
777
+ case "Number":
778
+ case "Boolean":
779
+ case "Date": return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf());
780
+ case "Promise":
781
+ case "Symbol":
782
+ case "function":
783
+ case "WeakMap":
784
+ case "WeakSet": return leftHandOperand === rightHandOperand;
785
+ case "Error": return keysEqual(leftHandOperand, rightHandOperand, [
786
+ "name",
787
+ "message",
788
+ "code"
789
+ ], options);
790
+ case "Arguments":
791
+ case "Int8Array":
792
+ case "Uint8Array":
793
+ case "Uint8ClampedArray":
794
+ case "Int16Array":
795
+ case "Uint16Array":
796
+ case "Int32Array":
797
+ case "Uint32Array":
798
+ case "Float32Array":
799
+ case "Float64Array":
800
+ case "Array": return iterableEqual(leftHandOperand, rightHandOperand, options);
801
+ case "RegExp": return regexpEqual(leftHandOperand, rightHandOperand);
802
+ case "Generator": return generatorEqual(leftHandOperand, rightHandOperand, options);
803
+ case "DataView": return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options);
804
+ case "ArrayBuffer": return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options);
805
+ case "Set": return entriesEqual(leftHandOperand, rightHandOperand, options);
806
+ case "Map": return entriesEqual(leftHandOperand, rightHandOperand, options);
807
+ case "Temporal.PlainDate":
808
+ case "Temporal.PlainTime":
809
+ case "Temporal.PlainDateTime":
810
+ case "Temporal.Instant":
811
+ case "Temporal.ZonedDateTime":
812
+ case "Temporal.PlainYearMonth":
813
+ case "Temporal.PlainMonthDay": return leftHandOperand.equals(rightHandOperand);
814
+ case "Temporal.Duration": return leftHandOperand.total("nanoseconds") === rightHandOperand.total("nanoseconds");
815
+ case "Temporal.TimeZone":
816
+ case "Temporal.Calendar": return leftHandOperand.toString() === rightHandOperand.toString();
817
+ default: return objectEqual(leftHandOperand, rightHandOperand, options);
818
+ }
819
+ }
820
+ __name(extensiveDeepEqualByType, "extensiveDeepEqualByType");
821
+ function regexpEqual(leftHandOperand, rightHandOperand) {
822
+ return leftHandOperand.toString() === rightHandOperand.toString();
823
+ }
824
+ __name(regexpEqual, "regexpEqual");
825
+ function entriesEqual(leftHandOperand, rightHandOperand, options) {
826
+ try {
827
+ if (leftHandOperand.size !== rightHandOperand.size) return false;
828
+ if (leftHandOperand.size === 0) return true;
829
+ } catch (sizeError) {
830
+ return false;
831
+ }
832
+ var leftHandItems = [];
833
+ var rightHandItems = [];
834
+ leftHandOperand.forEach(/* @__PURE__ */ __name(function gatherEntries(key, value) {
835
+ leftHandItems.push([key, value]);
836
+ }, "gatherEntries"));
837
+ rightHandOperand.forEach(/* @__PURE__ */ __name(function gatherEntries(key, value) {
838
+ rightHandItems.push([key, value]);
839
+ }, "gatherEntries"));
840
+ return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options);
841
+ }
842
+ __name(entriesEqual, "entriesEqual");
843
+ function iterableEqual(leftHandOperand, rightHandOperand, options) {
844
+ var length = leftHandOperand.length;
845
+ if (length !== rightHandOperand.length) return false;
846
+ if (length === 0) return true;
847
+ var index = -1;
848
+ while (++index < length) if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) return false;
849
+ return true;
850
+ }
851
+ __name(iterableEqual, "iterableEqual");
852
+ function generatorEqual(leftHandOperand, rightHandOperand, options) {
853
+ return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options);
854
+ }
855
+ __name(generatorEqual, "generatorEqual");
856
+ function hasIteratorFunction(target) {
857
+ return typeof Symbol !== "undefined" && typeof target === "object" && typeof Symbol.iterator !== "undefined" && typeof target[Symbol.iterator] === "function";
858
+ }
859
+ __name(hasIteratorFunction, "hasIteratorFunction");
860
+ function getIteratorEntries(target) {
861
+ if (hasIteratorFunction(target)) try {
862
+ return getGeneratorEntries(target[Symbol.iterator]());
863
+ } catch (iteratorError) {
864
+ return [];
865
+ }
866
+ return [];
867
+ }
868
+ __name(getIteratorEntries, "getIteratorEntries");
869
+ function getGeneratorEntries(generator) {
870
+ var generatorResult = generator.next();
871
+ var accumulator = [generatorResult.value];
872
+ while (generatorResult.done === false) {
873
+ generatorResult = generator.next();
874
+ accumulator.push(generatorResult.value);
875
+ }
876
+ return accumulator;
877
+ }
878
+ __name(getGeneratorEntries, "getGeneratorEntries");
879
+ function getEnumerableKeys(target) {
880
+ var keys = [];
881
+ for (var key in target) keys.push(key);
882
+ return keys;
883
+ }
884
+ __name(getEnumerableKeys, "getEnumerableKeys");
885
+ function getEnumerableSymbols(target) {
886
+ var keys = [];
887
+ var allKeys = Object.getOwnPropertySymbols(target);
888
+ for (var i = 0; i < allKeys.length; i += 1) {
889
+ var key = allKeys[i];
890
+ if (Object.getOwnPropertyDescriptor(target, key).enumerable) keys.push(key);
891
+ }
892
+ return keys;
893
+ }
894
+ __name(getEnumerableSymbols, "getEnumerableSymbols");
895
+ function keysEqual(leftHandOperand, rightHandOperand, keys, options) {
896
+ var length = keys.length;
897
+ if (length === 0) return true;
898
+ for (var i = 0; i < length; i += 1) if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) return false;
899
+ return true;
900
+ }
901
+ __name(keysEqual, "keysEqual");
902
+ function objectEqual(leftHandOperand, rightHandOperand, options) {
903
+ var leftHandKeys = getEnumerableKeys(leftHandOperand);
904
+ var rightHandKeys = getEnumerableKeys(rightHandOperand);
905
+ var leftHandSymbols = getEnumerableSymbols(leftHandOperand);
906
+ var rightHandSymbols = getEnumerableSymbols(rightHandOperand);
907
+ leftHandKeys = leftHandKeys.concat(leftHandSymbols);
908
+ rightHandKeys = rightHandKeys.concat(rightHandSymbols);
909
+ if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) {
910
+ if (iterableEqual(mapSymbols(leftHandKeys).sort(), mapSymbols(rightHandKeys).sort()) === false) return false;
911
+ return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options);
912
+ }
913
+ var leftHandEntries = getIteratorEntries(leftHandOperand);
914
+ var rightHandEntries = getIteratorEntries(rightHandOperand);
915
+ if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) {
916
+ leftHandEntries.sort();
917
+ rightHandEntries.sort();
918
+ return iterableEqual(leftHandEntries, rightHandEntries, options);
919
+ }
920
+ if (leftHandKeys.length === 0 && leftHandEntries.length === 0 && rightHandKeys.length === 0 && rightHandEntries.length === 0) return true;
921
+ return false;
922
+ }
923
+ __name(objectEqual, "objectEqual");
924
+ function isPrimitive(value) {
925
+ return value === null || typeof value !== "object";
926
+ }
927
+ __name(isPrimitive, "isPrimitive");
928
+ function mapSymbols(arr) {
929
+ return arr.map(/* @__PURE__ */ __name(function mapSymbol(entry) {
930
+ if (typeof entry === "symbol") return entry.toString();
931
+ return entry;
932
+ }, "mapSymbol"));
933
+ }
934
+ __name(mapSymbols, "mapSymbols");
935
+ function hasProperty(obj, name) {
936
+ if (typeof obj === "undefined" || obj === null) return false;
937
+ return name in Object(obj);
938
+ }
939
+ __name(hasProperty, "hasProperty");
940
+ function parsePath(path) {
941
+ return path.replace(/([^\\])\[/g, "$1.[").match(/(\\\.|[^.]+?)+/g).map((value) => {
942
+ if (value === "constructor" || value === "__proto__" || value === "prototype") return {};
943
+ const mArr = /^\[(\d+)\]$/.exec(value);
944
+ let parsed = null;
945
+ if (mArr) parsed = { i: parseFloat(mArr[1]) };
946
+ else parsed = { p: value.replace(/\\([.[\]])/g, "$1") };
947
+ return parsed;
948
+ });
949
+ }
950
+ __name(parsePath, "parsePath");
951
+ function internalGetPathValue(obj, parsed, pathDepth) {
952
+ let temporaryValue = obj;
953
+ let res = null;
954
+ pathDepth = typeof pathDepth === "undefined" ? parsed.length : pathDepth;
955
+ for (let i = 0; i < pathDepth; i++) {
956
+ const part = parsed[i];
957
+ if (temporaryValue) {
958
+ if (typeof part.p === "undefined") temporaryValue = temporaryValue[part.i];
959
+ else temporaryValue = temporaryValue[part.p];
960
+ if (i === pathDepth - 1) res = temporaryValue;
961
+ }
962
+ }
963
+ return res;
964
+ }
965
+ __name(internalGetPathValue, "internalGetPathValue");
966
+ function getPathInfo(obj, path) {
967
+ const parsed = parsePath(path);
968
+ const last = parsed[parsed.length - 1];
969
+ const info = {
970
+ parent: parsed.length > 1 ? internalGetPathValue(obj, parsed, parsed.length - 1) : obj,
971
+ name: last.p || last.i,
972
+ value: internalGetPathValue(obj, parsed)
973
+ };
974
+ info.exists = hasProperty(info.parent, info.name);
975
+ return info;
976
+ }
977
+ __name(getPathInfo, "getPathInfo");
978
+ var _Assertion = class _Assertion {
979
+ /**
980
+ * Creates object for chaining.
981
+ * `Assertion` objects contain metadata in the form of flags. Three flags can
982
+ * be assigned during instantiation by passing arguments to this constructor:
983
+ *
984
+ * - `object`: This flag contains the target of the assertion. For example, in
985
+ * the assertion `expect(numKittens).to.equal(7);`, the `object` flag will
986
+ * contain `numKittens` so that the `equal` assertion can reference it when
987
+ * needed.
988
+ *
989
+ * - `message`: This flag contains an optional custom error message to be
990
+ * prepended to the error message that's generated by the assertion when it
991
+ * fails.
992
+ *
993
+ * - `ssfi`: This flag stands for "start stack function indicator". It
994
+ * contains a function reference that serves as the starting point for
995
+ * removing frames from the stack trace of the error that's created by the
996
+ * assertion when it fails. The goal is to provide a cleaner stack trace to
997
+ * end users by removing Chai's internal functions. Note that it only works
998
+ * in environments that support `Error.captureStackTrace`, and only when
999
+ * `Chai.config.includeStack` hasn't been set to `false`.
1000
+ *
1001
+ * - `lockSsfi`: This flag controls whether or not the given `ssfi` flag
1002
+ * should retain its current value, even as assertions are chained off of
1003
+ * this object. This is usually set to `true` when creating a new assertion
1004
+ * from within another assertion. It's also temporarily set to `true` before
1005
+ * an overwritten assertion gets called by the overwriting assertion.
1006
+ *
1007
+ * - `eql`: This flag contains the deepEqual function to be used by the assertion.
1008
+ *
1009
+ * @param {unknown} obj target of the assertion
1010
+ * @param {string} [msg] (optional) custom error message
1011
+ * @param {Function} [ssfi] (optional) starting point for removing stack frames
1012
+ * @param {boolean} [lockSsfi] (optional) whether or not the ssfi flag is locked
1013
+ */
1014
+ constructor(obj, msg, ssfi, lockSsfi) {
1015
+ /** @type {{}} */
1016
+ __publicField(this, "__flags", {});
1017
+ flag(this, "ssfi", ssfi || _Assertion);
1018
+ flag(this, "lockSsfi", lockSsfi);
1019
+ flag(this, "object", obj);
1020
+ flag(this, "message", msg);
1021
+ flag(this, "eql", config.deepEqual || deep_eql_default);
1022
+ return proxify(this);
1023
+ }
1024
+ /** @returns {boolean} */
1025
+ static get includeStack() {
1026
+ console.warn("Assertion.includeStack is deprecated, use chai.config.includeStack instead.");
1027
+ return config.includeStack;
1028
+ }
1029
+ /** @param {boolean} value */
1030
+ static set includeStack(value) {
1031
+ console.warn("Assertion.includeStack is deprecated, use chai.config.includeStack instead.");
1032
+ config.includeStack = value;
1033
+ }
1034
+ /** @returns {boolean} */
1035
+ static get showDiff() {
1036
+ console.warn("Assertion.showDiff is deprecated, use chai.config.showDiff instead.");
1037
+ return config.showDiff;
1038
+ }
1039
+ /** @param {boolean} value */
1040
+ static set showDiff(value) {
1041
+ console.warn("Assertion.showDiff is deprecated, use chai.config.showDiff instead.");
1042
+ config.showDiff = value;
1043
+ }
1044
+ /**
1045
+ * @param {string} name
1046
+ * @param {Function} fn
1047
+ */
1048
+ static addProperty(name, fn) {
1049
+ addProperty(this.prototype, name, fn);
1050
+ }
1051
+ /**
1052
+ * @param {string} name
1053
+ * @param {Function} fn
1054
+ */
1055
+ static addMethod(name, fn) {
1056
+ addMethod(this.prototype, name, fn);
1057
+ }
1058
+ /**
1059
+ * @param {string} name
1060
+ * @param {Function} fn
1061
+ * @param {Function} chainingBehavior
1062
+ */
1063
+ static addChainableMethod(name, fn, chainingBehavior) {
1064
+ addChainableMethod(this.prototype, name, fn, chainingBehavior);
1065
+ }
1066
+ /**
1067
+ * @param {string} name
1068
+ * @param {Function} fn
1069
+ */
1070
+ static overwriteProperty(name, fn) {
1071
+ overwriteProperty(this.prototype, name, fn);
1072
+ }
1073
+ /**
1074
+ * @param {string} name
1075
+ * @param {Function} fn
1076
+ */
1077
+ static overwriteMethod(name, fn) {
1078
+ overwriteMethod(this.prototype, name, fn);
1079
+ }
1080
+ /**
1081
+ * @param {string} name
1082
+ * @param {Function} fn
1083
+ * @param {Function} chainingBehavior
1084
+ */
1085
+ static overwriteChainableMethod(name, fn, chainingBehavior) {
1086
+ overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);
1087
+ }
1088
+ /**
1089
+ * ### .assert(expression, message, negateMessage, expected, actual, showDiff)
1090
+ *
1091
+ * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
1092
+ *
1093
+ * @name assert
1094
+ * @param {unknown} _expr to be tested
1095
+ * @param {string | Function} msg or function that returns message to display if expression fails
1096
+ * @param {string | Function} _negateMsg or function that returns negatedMessage to display if negated expression fails
1097
+ * @param {unknown} expected value (remember to check for negation)
1098
+ * @param {unknown} _actual (optional) will default to `this.obj`
1099
+ * @param {boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails
1100
+ * @returns {void}
1101
+ */
1102
+ assert(_expr, msg, _negateMsg, expected, _actual, showDiff) {
1103
+ const ok = test(this, arguments);
1104
+ if (false !== showDiff) showDiff = true;
1105
+ if (void 0 === expected && void 0 === _actual) showDiff = false;
1106
+ if (true !== config.showDiff) showDiff = false;
1107
+ if (!ok) {
1108
+ msg = getMessage2(this, arguments);
1109
+ const assertionErrorObjectProperties = {
1110
+ actual: getActual(this, arguments),
1111
+ expected,
1112
+ showDiff
1113
+ };
1114
+ const operator = getOperator(this, arguments);
1115
+ if (operator) assertionErrorObjectProperties.operator = operator;
1116
+ throw new AssertionError(msg, assertionErrorObjectProperties, config.includeStack ? this.assert : flag(this, "ssfi"));
1117
+ }
1118
+ }
1119
+ /**
1120
+ * Quick reference to stored `actual` value for plugin developers.
1121
+ *
1122
+ * @returns {unknown}
1123
+ */
1124
+ get _obj() {
1125
+ return flag(this, "object");
1126
+ }
1127
+ /**
1128
+ * Quick reference to stored `actual` value for plugin developers.
1129
+ *
1130
+ * @param {unknown} val
1131
+ */
1132
+ set _obj(val) {
1133
+ flag(this, "object", val);
1134
+ }
1135
+ };
1136
+ __name(_Assertion, "Assertion");
1137
+ var Assertion = _Assertion;
1138
+ var events = new EventTarget();
1139
+ var _PluginEvent = class _PluginEvent extends Event {
1140
+ constructor(type3, name, fn) {
1141
+ super(type3);
1142
+ this.name = String(name);
1143
+ this.fn = fn;
1144
+ }
1145
+ };
1146
+ __name(_PluginEvent, "PluginEvent");
1147
+ var PluginEvent = _PluginEvent;
1148
+ function isProxyEnabled() {
1149
+ return config.useProxy && typeof Proxy !== "undefined" && typeof Reflect !== "undefined";
1150
+ }
1151
+ __name(isProxyEnabled, "isProxyEnabled");
1152
+ function addProperty(ctx, name, getter) {
1153
+ getter = getter === void 0 ? function() {} : getter;
1154
+ Object.defineProperty(ctx, name, {
1155
+ get: /* @__PURE__ */ __name(function propertyGetter() {
1156
+ if (!isProxyEnabled() && !flag(this, "lockSsfi")) flag(this, "ssfi", propertyGetter);
1157
+ let result = getter.call(this);
1158
+ if (result !== void 0) return result;
1159
+ let newAssertion = new Assertion();
1160
+ transferFlags(this, newAssertion);
1161
+ return newAssertion;
1162
+ }, "propertyGetter"),
1163
+ configurable: true
1164
+ });
1165
+ events.dispatchEvent(new PluginEvent("addProperty", name, getter));
1166
+ }
1167
+ __name(addProperty, "addProperty");
1168
+ var fnLengthDesc = Object.getOwnPropertyDescriptor(function() {}, "length");
1169
+ function addLengthGuard(fn, assertionName, isChainable) {
1170
+ if (!fnLengthDesc.configurable) return fn;
1171
+ Object.defineProperty(fn, "length", { get: /* @__PURE__ */ __name(function() {
1172
+ if (isChainable) throw Error("Invalid Chai property: " + assertionName + ".length. Due to a compatibility issue, \"length\" cannot directly follow \"" + assertionName + "\". Use \"" + assertionName + ".lengthOf\" instead.");
1173
+ throw Error("Invalid Chai property: " + assertionName + ".length. See docs for proper usage of \"" + assertionName + "\".");
1174
+ }, "get") });
1175
+ return fn;
1176
+ }
1177
+ __name(addLengthGuard, "addLengthGuard");
1178
+ function getProperties(object) {
1179
+ let result = Object.getOwnPropertyNames(object);
1180
+ function addProperty2(property) {
1181
+ if (result.indexOf(property) === -1) result.push(property);
1182
+ }
1183
+ __name(addProperty2, "addProperty");
1184
+ let proto = Object.getPrototypeOf(object);
1185
+ while (proto !== null) {
1186
+ Object.getOwnPropertyNames(proto).forEach(addProperty2);
1187
+ proto = Object.getPrototypeOf(proto);
1188
+ }
1189
+ return result;
1190
+ }
1191
+ __name(getProperties, "getProperties");
1192
+ var builtins = [
1193
+ "__flags",
1194
+ "__methods",
1195
+ "_obj",
1196
+ "assert"
1197
+ ];
1198
+ function proxify(obj, nonChainableMethodName) {
1199
+ if (!isProxyEnabled()) return obj;
1200
+ return new Proxy(obj, { get: /* @__PURE__ */ __name(function proxyGetter(target, property) {
1201
+ if (typeof property === "string" && config.proxyExcludedKeys.indexOf(property) === -1 && !Reflect.has(target, property)) {
1202
+ if (nonChainableMethodName) throw Error("Invalid Chai property: " + nonChainableMethodName + "." + property + ". See docs for proper usage of \"" + nonChainableMethodName + "\".");
1203
+ let suggestion = null;
1204
+ let suggestionDistance = 4;
1205
+ getProperties(target).forEach(function(prop) {
1206
+ if (!Object.prototype.hasOwnProperty(prop) && builtins.indexOf(prop) === -1) {
1207
+ let dist = stringDistanceCapped(property, prop, suggestionDistance);
1208
+ if (dist < suggestionDistance) {
1209
+ suggestion = prop;
1210
+ suggestionDistance = dist;
1211
+ }
1212
+ }
1213
+ });
1214
+ if (suggestion !== null) throw Error("Invalid Chai property: " + property + ". Did you mean \"" + suggestion + "\"?");
1215
+ else throw Error("Invalid Chai property: " + property);
1216
+ }
1217
+ if (builtins.indexOf(property) === -1 && !flag(target, "lockSsfi")) flag(target, "ssfi", proxyGetter);
1218
+ return Reflect.get(target, property);
1219
+ }, "proxyGetter") });
1220
+ }
1221
+ __name(proxify, "proxify");
1222
+ function stringDistanceCapped(strA, strB, cap) {
1223
+ if (Math.abs(strA.length - strB.length) >= cap) return cap;
1224
+ let memo = [];
1225
+ for (let i = 0; i <= strA.length; i++) {
1226
+ memo[i] = Array(strB.length + 1).fill(0);
1227
+ memo[i][0] = i;
1228
+ }
1229
+ for (let j = 0; j < strB.length; j++) memo[0][j] = j;
1230
+ for (let i = 1; i <= strA.length; i++) {
1231
+ let ch = strA.charCodeAt(i - 1);
1232
+ for (let j = 1; j <= strB.length; j++) {
1233
+ if (Math.abs(i - j) >= cap) {
1234
+ memo[i][j] = cap;
1235
+ continue;
1236
+ }
1237
+ memo[i][j] = Math.min(memo[i - 1][j] + 1, memo[i][j - 1] + 1, memo[i - 1][j - 1] + (ch === strB.charCodeAt(j - 1) ? 0 : 1));
1238
+ }
1239
+ }
1240
+ return memo[strA.length][strB.length];
1241
+ }
1242
+ __name(stringDistanceCapped, "stringDistanceCapped");
1243
+ function addMethod(ctx, name, method) {
1244
+ let methodWrapper = /* @__PURE__ */ __name(function() {
1245
+ if (!flag(this, "lockSsfi")) flag(this, "ssfi", methodWrapper);
1246
+ let result = method.apply(this, arguments);
1247
+ if (result !== void 0) return result;
1248
+ let newAssertion = new Assertion();
1249
+ transferFlags(this, newAssertion);
1250
+ return newAssertion;
1251
+ }, "methodWrapper");
1252
+ addLengthGuard(methodWrapper, name, false);
1253
+ ctx[name] = proxify(methodWrapper, name);
1254
+ events.dispatchEvent(new PluginEvent("addMethod", name, method));
1255
+ }
1256
+ __name(addMethod, "addMethod");
1257
+ function overwriteProperty(ctx, name, getter) {
1258
+ let _get = Object.getOwnPropertyDescriptor(ctx, name), _super = /* @__PURE__ */ __name(function() {}, "_super");
1259
+ if (_get && "function" === typeof _get.get) _super = _get.get;
1260
+ Object.defineProperty(ctx, name, {
1261
+ get: /* @__PURE__ */ __name(function overwritingPropertyGetter() {
1262
+ if (!isProxyEnabled() && !flag(this, "lockSsfi")) flag(this, "ssfi", overwritingPropertyGetter);
1263
+ let origLockSsfi = flag(this, "lockSsfi");
1264
+ flag(this, "lockSsfi", true);
1265
+ let result = getter(_super).call(this);
1266
+ flag(this, "lockSsfi", origLockSsfi);
1267
+ if (result !== void 0) return result;
1268
+ let newAssertion = new Assertion();
1269
+ transferFlags(this, newAssertion);
1270
+ return newAssertion;
1271
+ }, "overwritingPropertyGetter"),
1272
+ configurable: true
1273
+ });
1274
+ }
1275
+ __name(overwriteProperty, "overwriteProperty");
1276
+ function overwriteMethod(ctx, name, method) {
1277
+ let _method = ctx[name], _super = /* @__PURE__ */ __name(function() {
1278
+ throw new Error(name + " is not a function");
1279
+ }, "_super");
1280
+ if (_method && "function" === typeof _method) _super = _method;
1281
+ let overwritingMethodWrapper = /* @__PURE__ */ __name(function() {
1282
+ if (!flag(this, "lockSsfi")) flag(this, "ssfi", overwritingMethodWrapper);
1283
+ let origLockSsfi = flag(this, "lockSsfi");
1284
+ flag(this, "lockSsfi", true);
1285
+ let result = method(_super).apply(this, arguments);
1286
+ flag(this, "lockSsfi", origLockSsfi);
1287
+ if (result !== void 0) return result;
1288
+ let newAssertion = new Assertion();
1289
+ transferFlags(this, newAssertion);
1290
+ return newAssertion;
1291
+ }, "overwritingMethodWrapper");
1292
+ addLengthGuard(overwritingMethodWrapper, name, false);
1293
+ ctx[name] = proxify(overwritingMethodWrapper, name);
1294
+ }
1295
+ __name(overwriteMethod, "overwriteMethod");
1296
+ var canSetPrototype = typeof Object.setPrototypeOf === "function";
1297
+ var testFn = /* @__PURE__ */ __name(function() {}, "testFn");
1298
+ var excludeNames = Object.getOwnPropertyNames(testFn).filter(function(name) {
1299
+ let propDesc = Object.getOwnPropertyDescriptor(testFn, name);
1300
+ if (typeof propDesc !== "object") return true;
1301
+ return !propDesc.configurable;
1302
+ });
1303
+ var call = Function.prototype.call;
1304
+ var apply = Function.prototype.apply;
1305
+ var _PluginAddChainableMethodEvent = class _PluginAddChainableMethodEvent extends PluginEvent {
1306
+ constructor(type3, name, fn, chainingBehavior) {
1307
+ super(type3, name, fn);
1308
+ this.chainingBehavior = chainingBehavior;
1309
+ }
1310
+ };
1311
+ __name(_PluginAddChainableMethodEvent, "PluginAddChainableMethodEvent");
1312
+ var PluginAddChainableMethodEvent = _PluginAddChainableMethodEvent;
1313
+ function addChainableMethod(ctx, name, method, chainingBehavior) {
1314
+ if (typeof chainingBehavior !== "function") chainingBehavior = /* @__PURE__ */ __name(function() {}, "chainingBehavior");
1315
+ let chainableBehavior = {
1316
+ method,
1317
+ chainingBehavior
1318
+ };
1319
+ if (!ctx.__methods) ctx.__methods = {};
1320
+ ctx.__methods[name] = chainableBehavior;
1321
+ Object.defineProperty(ctx, name, {
1322
+ get: /* @__PURE__ */ __name(function chainableMethodGetter() {
1323
+ chainableBehavior.chainingBehavior.call(this);
1324
+ let chainableMethodWrapper = /* @__PURE__ */ __name(function() {
1325
+ if (!flag(this, "lockSsfi")) flag(this, "ssfi", chainableMethodWrapper);
1326
+ let result = chainableBehavior.method.apply(this, arguments);
1327
+ if (result !== void 0) return result;
1328
+ let newAssertion = new Assertion();
1329
+ transferFlags(this, newAssertion);
1330
+ return newAssertion;
1331
+ }, "chainableMethodWrapper");
1332
+ addLengthGuard(chainableMethodWrapper, name, true);
1333
+ if (canSetPrototype) {
1334
+ let prototype = Object.create(this);
1335
+ prototype.call = call;
1336
+ prototype.apply = apply;
1337
+ Object.setPrototypeOf(chainableMethodWrapper, prototype);
1338
+ } else Object.getOwnPropertyNames(ctx).forEach(function(asserterName) {
1339
+ if (excludeNames.indexOf(asserterName) !== -1) return;
1340
+ Object.defineProperty(chainableMethodWrapper, asserterName, Object.getOwnPropertyDescriptor(ctx, asserterName));
1341
+ });
1342
+ transferFlags(this, chainableMethodWrapper);
1343
+ return proxify(chainableMethodWrapper);
1344
+ }, "chainableMethodGetter"),
1345
+ configurable: true
1346
+ });
1347
+ events.dispatchEvent(new PluginAddChainableMethodEvent("addChainableMethod", name, method, chainingBehavior));
1348
+ }
1349
+ __name(addChainableMethod, "addChainableMethod");
1350
+ function overwriteChainableMethod(ctx, name, method, chainingBehavior) {
1351
+ let chainableBehavior = ctx.__methods[name];
1352
+ let _chainingBehavior = chainableBehavior.chainingBehavior;
1353
+ chainableBehavior.chainingBehavior = /* @__PURE__ */ __name(function overwritingChainableMethodGetter() {
1354
+ let result = chainingBehavior(_chainingBehavior).call(this);
1355
+ if (result !== void 0) return result;
1356
+ let newAssertion = new Assertion();
1357
+ transferFlags(this, newAssertion);
1358
+ return newAssertion;
1359
+ }, "overwritingChainableMethodGetter");
1360
+ let _method = chainableBehavior.method;
1361
+ chainableBehavior.method = /* @__PURE__ */ __name(function overwritingChainableMethodWrapper() {
1362
+ let result = method(_method).apply(this, arguments);
1363
+ if (result !== void 0) return result;
1364
+ let newAssertion = new Assertion();
1365
+ transferFlags(this, newAssertion);
1366
+ return newAssertion;
1367
+ }, "overwritingChainableMethodWrapper");
1368
+ }
1369
+ __name(overwriteChainableMethod, "overwriteChainableMethod");
1370
+ function compareByInspect(a, b) {
1371
+ return inspect2(a) < inspect2(b) ? -1 : 1;
1372
+ }
1373
+ __name(compareByInspect, "compareByInspect");
1374
+ function getOwnEnumerablePropertySymbols(obj) {
1375
+ if (typeof Object.getOwnPropertySymbols !== "function") return [];
1376
+ return Object.getOwnPropertySymbols(obj).filter(function(sym) {
1377
+ return Object.getOwnPropertyDescriptor(obj, sym).enumerable;
1378
+ });
1379
+ }
1380
+ __name(getOwnEnumerablePropertySymbols, "getOwnEnumerablePropertySymbols");
1381
+ function getOwnEnumerableProperties(obj) {
1382
+ return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj));
1383
+ }
1384
+ __name(getOwnEnumerableProperties, "getOwnEnumerableProperties");
1385
+ var isNaN2 = Number.isNaN;
1386
+ function isObjectType(obj) {
1387
+ let objectType = type(obj);
1388
+ return [
1389
+ "Array",
1390
+ "Object",
1391
+ "Function"
1392
+ ].indexOf(objectType) !== -1;
1393
+ }
1394
+ __name(isObjectType, "isObjectType");
1395
+ function getOperator(obj, args) {
1396
+ let operator = flag(obj, "operator");
1397
+ let negate = flag(obj, "negate");
1398
+ let expected = args[3];
1399
+ let msg = negate ? args[2] : args[1];
1400
+ if (operator) return operator;
1401
+ if (typeof msg === "function") msg = msg();
1402
+ msg = msg || "";
1403
+ if (!msg) return;
1404
+ if (/\shave\s/.test(msg)) return;
1405
+ let isObject = isObjectType(expected);
1406
+ if (/\snot\s/.test(msg)) return isObject ? "notDeepStrictEqual" : "notStrictEqual";
1407
+ return isObject ? "deepStrictEqual" : "strictEqual";
1408
+ }
1409
+ __name(getOperator, "getOperator");
1410
+ function getName(fn) {
1411
+ return fn.name;
1412
+ }
1413
+ __name(getName, "getName");
1414
+ function isRegExp2(obj) {
1415
+ return Object.prototype.toString.call(obj) === "[object RegExp]";
1416
+ }
1417
+ __name(isRegExp2, "isRegExp");
1418
+ function isNumeric(obj) {
1419
+ return ["Number", "BigInt"].includes(type(obj));
1420
+ }
1421
+ __name(isNumeric, "isNumeric");
1422
+ var { flag: flag2 } = utils_exports;
1423
+ [
1424
+ "to",
1425
+ "be",
1426
+ "been",
1427
+ "is",
1428
+ "and",
1429
+ "has",
1430
+ "have",
1431
+ "with",
1432
+ "that",
1433
+ "which",
1434
+ "at",
1435
+ "of",
1436
+ "same",
1437
+ "but",
1438
+ "does",
1439
+ "still",
1440
+ "also"
1441
+ ].forEach(function(chain) {
1442
+ Assertion.addProperty(chain);
1443
+ });
1444
+ Assertion.addProperty("not", function() {
1445
+ flag2(this, "negate", true);
1446
+ });
1447
+ Assertion.addProperty("deep", function() {
1448
+ flag2(this, "deep", true);
1449
+ });
1450
+ Assertion.addProperty("nested", function() {
1451
+ flag2(this, "nested", true);
1452
+ });
1453
+ Assertion.addProperty("own", function() {
1454
+ flag2(this, "own", true);
1455
+ });
1456
+ Assertion.addProperty("ordered", function() {
1457
+ flag2(this, "ordered", true);
1458
+ });
1459
+ Assertion.addProperty("any", function() {
1460
+ flag2(this, "any", true);
1461
+ flag2(this, "all", false);
1462
+ });
1463
+ Assertion.addProperty("all", function() {
1464
+ flag2(this, "all", true);
1465
+ flag2(this, "any", false);
1466
+ });
1467
+ var functionTypes = {
1468
+ function: [
1469
+ "function",
1470
+ "asyncfunction",
1471
+ "generatorfunction",
1472
+ "asyncgeneratorfunction"
1473
+ ],
1474
+ asyncfunction: ["asyncfunction", "asyncgeneratorfunction"],
1475
+ generatorfunction: ["generatorfunction", "asyncgeneratorfunction"],
1476
+ asyncgeneratorfunction: ["asyncgeneratorfunction"]
1477
+ };
1478
+ function an(type3, msg) {
1479
+ if (msg) flag2(this, "message", msg);
1480
+ type3 = type3.toLowerCase();
1481
+ let obj = flag2(this, "object"), article = ~[
1482
+ "a",
1483
+ "e",
1484
+ "i",
1485
+ "o",
1486
+ "u"
1487
+ ].indexOf(type3.charAt(0)) ? "an " : "a ";
1488
+ const detectedType = type(obj).toLowerCase();
1489
+ if (functionTypes["function"].includes(type3)) this.assert(functionTypes[type3].includes(detectedType), "expected #{this} to be " + article + type3, "expected #{this} not to be " + article + type3);
1490
+ else this.assert(type3 === detectedType, "expected #{this} to be " + article + type3, "expected #{this} not to be " + article + type3);
1491
+ }
1492
+ __name(an, "an");
1493
+ Assertion.addChainableMethod("an", an);
1494
+ Assertion.addChainableMethod("a", an);
1495
+ function SameValueZero(a, b) {
1496
+ return isNaN2(a) && isNaN2(b) || a === b;
1497
+ }
1498
+ __name(SameValueZero, "SameValueZero");
1499
+ function includeChainingBehavior() {
1500
+ flag2(this, "contains", true);
1501
+ }
1502
+ __name(includeChainingBehavior, "includeChainingBehavior");
1503
+ function include(val, msg) {
1504
+ if (msg) flag2(this, "message", msg);
1505
+ let obj = flag2(this, "object"), objType = type(obj).toLowerCase(), flagMsg = flag2(this, "message"), negate = flag2(this, "negate"), ssfi = flag2(this, "ssfi"), isDeep = flag2(this, "deep"), descriptor = isDeep ? "deep " : "", isEql = isDeep ? flag2(this, "eql") : SameValueZero;
1506
+ flagMsg = flagMsg ? flagMsg + ": " : "";
1507
+ let included = false;
1508
+ switch (objType) {
1509
+ case "string":
1510
+ included = obj.indexOf(val) !== -1;
1511
+ break;
1512
+ case "weakset":
1513
+ if (isDeep) throw new AssertionError(flagMsg + "unable to use .deep.include with WeakSet", void 0, ssfi);
1514
+ included = obj.has(val);
1515
+ break;
1516
+ case "map":
1517
+ obj.forEach(function(item) {
1518
+ included = included || isEql(item, val);
1519
+ });
1520
+ break;
1521
+ case "set":
1522
+ if (isDeep) obj.forEach(function(item) {
1523
+ included = included || isEql(item, val);
1524
+ });
1525
+ else included = obj.has(val);
1526
+ break;
1527
+ case "array":
1528
+ if (isDeep) included = obj.some(function(item) {
1529
+ return isEql(item, val);
1530
+ });
1531
+ else included = obj.indexOf(val) !== -1;
1532
+ break;
1533
+ default: {
1534
+ if (val !== Object(val)) throw new AssertionError(flagMsg + "the given combination of arguments (" + objType + " and " + type(val).toLowerCase() + ") is invalid for this assertion. You can use an array, a map, an object, a set, a string, or a weakset instead of a " + type(val).toLowerCase(), void 0, ssfi);
1535
+ let props = Object.keys(val);
1536
+ let firstErr = null;
1537
+ let numErrs = 0;
1538
+ props.forEach(function(prop) {
1539
+ let propAssertion = new Assertion(obj);
1540
+ transferFlags(this, propAssertion, true);
1541
+ flag2(propAssertion, "lockSsfi", true);
1542
+ if (!negate || props.length === 1) {
1543
+ propAssertion.property(prop, val[prop]);
1544
+ return;
1545
+ }
1546
+ try {
1547
+ propAssertion.property(prop, val[prop]);
1548
+ } catch (err) {
1549
+ if (!check_error_exports.compatibleConstructor(err, AssertionError)) throw err;
1550
+ if (firstErr === null) firstErr = err;
1551
+ numErrs++;
1552
+ }
1553
+ }, this);
1554
+ if (negate && props.length > 1 && numErrs === props.length) throw firstErr;
1555
+ return;
1556
+ }
1557
+ }
1558
+ this.assert(included, "expected #{this} to " + descriptor + "include " + inspect2(val), "expected #{this} to not " + descriptor + "include " + inspect2(val));
1559
+ }
1560
+ __name(include, "include");
1561
+ Assertion.addChainableMethod("include", include, includeChainingBehavior);
1562
+ Assertion.addChainableMethod("contain", include, includeChainingBehavior);
1563
+ Assertion.addChainableMethod("contains", include, includeChainingBehavior);
1564
+ Assertion.addChainableMethod("includes", include, includeChainingBehavior);
1565
+ Assertion.addProperty("ok", function() {
1566
+ this.assert(flag2(this, "object"), "expected #{this} to be truthy", "expected #{this} to be falsy");
1567
+ });
1568
+ Assertion.addProperty("true", function() {
1569
+ this.assert(true === flag2(this, "object"), "expected #{this} to be true", "expected #{this} to be false", flag2(this, "negate") ? false : true);
1570
+ });
1571
+ Assertion.addProperty("numeric", function() {
1572
+ const object = flag2(this, "object");
1573
+ this.assert(["Number", "BigInt"].includes(type(object)), "expected #{this} to be numeric", "expected #{this} to not be numeric", flag2(this, "negate") ? false : true);
1574
+ });
1575
+ Assertion.addProperty("callable", function() {
1576
+ const val = flag2(this, "object");
1577
+ const ssfi = flag2(this, "ssfi");
1578
+ const message = flag2(this, "message");
1579
+ const msg = message ? `${message}: ` : "";
1580
+ const negate = flag2(this, "negate");
1581
+ const assertionMessage = negate ? `${msg}expected ${inspect2(val)} not to be a callable function` : `${msg}expected ${inspect2(val)} to be a callable function`;
1582
+ const isCallable = [
1583
+ "Function",
1584
+ "AsyncFunction",
1585
+ "GeneratorFunction",
1586
+ "AsyncGeneratorFunction"
1587
+ ].includes(type(val));
1588
+ if (isCallable && negate || !isCallable && !negate) throw new AssertionError(assertionMessage, void 0, ssfi);
1589
+ });
1590
+ Assertion.addProperty("false", function() {
1591
+ this.assert(false === flag2(this, "object"), "expected #{this} to be false", "expected #{this} to be true", flag2(this, "negate") ? true : false);
1592
+ });
1593
+ Assertion.addProperty("null", function() {
1594
+ this.assert(null === flag2(this, "object"), "expected #{this} to be null", "expected #{this} not to be null");
1595
+ });
1596
+ Assertion.addProperty("undefined", function() {
1597
+ this.assert(void 0 === flag2(this, "object"), "expected #{this} to be undefined", "expected #{this} not to be undefined");
1598
+ });
1599
+ Assertion.addProperty("NaN", function() {
1600
+ this.assert(isNaN2(flag2(this, "object")), "expected #{this} to be NaN", "expected #{this} not to be NaN");
1601
+ });
1602
+ function assertExist() {
1603
+ let val = flag2(this, "object");
1604
+ this.assert(val !== null && val !== void 0, "expected #{this} to exist", "expected #{this} to not exist");
1605
+ }
1606
+ __name(assertExist, "assertExist");
1607
+ Assertion.addProperty("exist", assertExist);
1608
+ Assertion.addProperty("exists", assertExist);
1609
+ Assertion.addProperty("empty", function() {
1610
+ let val = flag2(this, "object"), ssfi = flag2(this, "ssfi"), flagMsg = flag2(this, "message"), itemsCount;
1611
+ flagMsg = flagMsg ? flagMsg + ": " : "";
1612
+ switch (type(val).toLowerCase()) {
1613
+ case "array":
1614
+ case "string":
1615
+ itemsCount = val.length;
1616
+ break;
1617
+ case "map":
1618
+ case "set":
1619
+ itemsCount = val.size;
1620
+ break;
1621
+ case "weakmap":
1622
+ case "weakset": throw new AssertionError(flagMsg + ".empty was passed a weak collection", void 0, ssfi);
1623
+ case "function": throw new AssertionError((flagMsg + ".empty was passed a function " + getName(val)).trim(), void 0, ssfi);
1624
+ default:
1625
+ if (val !== Object(val)) throw new AssertionError(flagMsg + ".empty was passed non-string primitive " + inspect2(val), void 0, ssfi);
1626
+ itemsCount = Object.keys(val).length;
1627
+ }
1628
+ this.assert(0 === itemsCount, "expected #{this} to be empty", "expected #{this} not to be empty");
1629
+ });
1630
+ function checkArguments() {
1631
+ let type3 = type(flag2(this, "object"));
1632
+ this.assert("Arguments" === type3, "expected #{this} to be arguments but got " + type3, "expected #{this} to not be arguments");
1633
+ }
1634
+ __name(checkArguments, "checkArguments");
1635
+ Assertion.addProperty("arguments", checkArguments);
1636
+ Assertion.addProperty("Arguments", checkArguments);
1637
+ function assertEqual(val, msg) {
1638
+ if (msg) flag2(this, "message", msg);
1639
+ let obj = flag2(this, "object");
1640
+ if (flag2(this, "deep")) {
1641
+ let prevLockSsfi = flag2(this, "lockSsfi");
1642
+ flag2(this, "lockSsfi", true);
1643
+ this.eql(val);
1644
+ flag2(this, "lockSsfi", prevLockSsfi);
1645
+ } else this.assert(val === obj, "expected #{this} to equal #{exp}", "expected #{this} to not equal #{exp}", val, this._obj, true);
1646
+ }
1647
+ __name(assertEqual, "assertEqual");
1648
+ Assertion.addMethod("equal", assertEqual);
1649
+ Assertion.addMethod("equals", assertEqual);
1650
+ Assertion.addMethod("eq", assertEqual);
1651
+ function assertEql(obj, msg) {
1652
+ if (msg) flag2(this, "message", msg);
1653
+ let eql = flag2(this, "eql");
1654
+ this.assert(eql(obj, flag2(this, "object")), "expected #{this} to deeply equal #{exp}", "expected #{this} to not deeply equal #{exp}", obj, this._obj, true);
1655
+ }
1656
+ __name(assertEql, "assertEql");
1657
+ Assertion.addMethod("eql", assertEql);
1658
+ Assertion.addMethod("eqls", assertEql);
1659
+ function assertAbove(n, msg) {
1660
+ if (msg) flag2(this, "message", msg);
1661
+ let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase();
1662
+ if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
1663
+ if (!doLength && objType === "date" && nType !== "date") throw new AssertionError(msgPrefix + "the argument to above must be a date", void 0, ssfi);
1664
+ else if (!isNumeric(n) && (doLength || isNumeric(obj))) throw new AssertionError(msgPrefix + "the argument to above must be a number", void 0, ssfi);
1665
+ else if (!doLength && objType !== "date" && !isNumeric(obj)) {
1666
+ let printObj = objType === "string" ? "'" + obj + "'" : obj;
1667
+ throw new AssertionError(msgPrefix + "expected " + printObj + " to be a number or a date", void 0, ssfi);
1668
+ }
1669
+ if (doLength) {
1670
+ let descriptor = "length", itemsCount;
1671
+ if (objType === "map" || objType === "set") {
1672
+ descriptor = "size";
1673
+ itemsCount = obj.size;
1674
+ } else itemsCount = obj.length;
1675
+ this.assert(itemsCount > n, "expected #{this} to have a " + descriptor + " above #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " above #{exp}", n, itemsCount);
1676
+ } else this.assert(obj > n, "expected #{this} to be above #{exp}", "expected #{this} to be at most #{exp}", n);
1677
+ }
1678
+ __name(assertAbove, "assertAbove");
1679
+ Assertion.addMethod("above", assertAbove);
1680
+ Assertion.addMethod("gt", assertAbove);
1681
+ Assertion.addMethod("greaterThan", assertAbove);
1682
+ function assertLeast(n, msg) {
1683
+ if (msg) flag2(this, "message", msg);
1684
+ let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true;
1685
+ if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
1686
+ if (!doLength && objType === "date" && nType !== "date") errorMessage = msgPrefix + "the argument to least must be a date";
1687
+ else if (!isNumeric(n) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the argument to least must be a number";
1688
+ else if (!doLength && objType !== "date" && !isNumeric(obj)) {
1689
+ let printObj = objType === "string" ? "'" + obj + "'" : obj;
1690
+ errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
1691
+ } else shouldThrow = false;
1692
+ if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
1693
+ if (doLength) {
1694
+ let descriptor = "length", itemsCount;
1695
+ if (objType === "map" || objType === "set") {
1696
+ descriptor = "size";
1697
+ itemsCount = obj.size;
1698
+ } else itemsCount = obj.length;
1699
+ this.assert(itemsCount >= n, "expected #{this} to have a " + descriptor + " at least #{exp} but got #{act}", "expected #{this} to have a " + descriptor + " below #{exp}", n, itemsCount);
1700
+ } else this.assert(obj >= n, "expected #{this} to be at least #{exp}", "expected #{this} to be below #{exp}", n);
1701
+ }
1702
+ __name(assertLeast, "assertLeast");
1703
+ Assertion.addMethod("least", assertLeast);
1704
+ Assertion.addMethod("gte", assertLeast);
1705
+ Assertion.addMethod("greaterThanOrEqual", assertLeast);
1706
+ function assertBelow(n, msg) {
1707
+ if (msg) flag2(this, "message", msg);
1708
+ let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true;
1709
+ if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
1710
+ if (!doLength && objType === "date" && nType !== "date") errorMessage = msgPrefix + "the argument to below must be a date";
1711
+ else if (!isNumeric(n) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the argument to below must be a number";
1712
+ else if (!doLength && objType !== "date" && !isNumeric(obj)) {
1713
+ let printObj = objType === "string" ? "'" + obj + "'" : obj;
1714
+ errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
1715
+ } else shouldThrow = false;
1716
+ if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
1717
+ if (doLength) {
1718
+ let descriptor = "length", itemsCount;
1719
+ if (objType === "map" || objType === "set") {
1720
+ descriptor = "size";
1721
+ itemsCount = obj.size;
1722
+ } else itemsCount = obj.length;
1723
+ this.assert(itemsCount < n, "expected #{this} to have a " + descriptor + " below #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " below #{exp}", n, itemsCount);
1724
+ } else this.assert(obj < n, "expected #{this} to be below #{exp}", "expected #{this} to be at least #{exp}", n);
1725
+ }
1726
+ __name(assertBelow, "assertBelow");
1727
+ Assertion.addMethod("below", assertBelow);
1728
+ Assertion.addMethod("lt", assertBelow);
1729
+ Assertion.addMethod("lessThan", assertBelow);
1730
+ function assertMost(n, msg) {
1731
+ if (msg) flag2(this, "message", msg);
1732
+ let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true;
1733
+ if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
1734
+ if (!doLength && objType === "date" && nType !== "date") errorMessage = msgPrefix + "the argument to most must be a date";
1735
+ else if (!isNumeric(n) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the argument to most must be a number";
1736
+ else if (!doLength && objType !== "date" && !isNumeric(obj)) {
1737
+ let printObj = objType === "string" ? "'" + obj + "'" : obj;
1738
+ errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
1739
+ } else shouldThrow = false;
1740
+ if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
1741
+ if (doLength) {
1742
+ let descriptor = "length", itemsCount;
1743
+ if (objType === "map" || objType === "set") {
1744
+ descriptor = "size";
1745
+ itemsCount = obj.size;
1746
+ } else itemsCount = obj.length;
1747
+ this.assert(itemsCount <= n, "expected #{this} to have a " + descriptor + " at most #{exp} but got #{act}", "expected #{this} to have a " + descriptor + " above #{exp}", n, itemsCount);
1748
+ } else this.assert(obj <= n, "expected #{this} to be at most #{exp}", "expected #{this} to be above #{exp}", n);
1749
+ }
1750
+ __name(assertMost, "assertMost");
1751
+ Assertion.addMethod("most", assertMost);
1752
+ Assertion.addMethod("lte", assertMost);
1753
+ Assertion.addMethod("lessThanOrEqual", assertMost);
1754
+ Assertion.addMethod("within", function(start, finish, msg) {
1755
+ if (msg) flag2(this, "message", msg);
1756
+ let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), startType = type(start).toLowerCase(), finishType = type(finish).toLowerCase(), errorMessage, shouldThrow = true, range = startType === "date" && finishType === "date" ? start.toISOString() + ".." + finish.toISOString() : start + ".." + finish;
1757
+ if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
1758
+ if (!doLength && objType === "date" && (startType !== "date" || finishType !== "date")) errorMessage = msgPrefix + "the arguments to within must be dates";
1759
+ else if ((!isNumeric(start) || !isNumeric(finish)) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the arguments to within must be numbers";
1760
+ else if (!doLength && objType !== "date" && !isNumeric(obj)) {
1761
+ let printObj = objType === "string" ? "'" + obj + "'" : obj;
1762
+ errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
1763
+ } else shouldThrow = false;
1764
+ if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
1765
+ if (doLength) {
1766
+ let descriptor = "length", itemsCount;
1767
+ if (objType === "map" || objType === "set") {
1768
+ descriptor = "size";
1769
+ itemsCount = obj.size;
1770
+ } else itemsCount = obj.length;
1771
+ this.assert(itemsCount >= start && itemsCount <= finish, "expected #{this} to have a " + descriptor + " within " + range, "expected #{this} to not have a " + descriptor + " within " + range);
1772
+ } else this.assert(obj >= start && obj <= finish, "expected #{this} to be within " + range, "expected #{this} to not be within " + range);
1773
+ });
1774
+ function assertInstanceOf(constructor, msg) {
1775
+ if (msg) flag2(this, "message", msg);
1776
+ let target = flag2(this, "object");
1777
+ let ssfi = flag2(this, "ssfi");
1778
+ let flagMsg = flag2(this, "message");
1779
+ let isInstanceOf;
1780
+ try {
1781
+ isInstanceOf = target instanceof constructor;
1782
+ } catch (err) {
1783
+ if (err instanceof TypeError) {
1784
+ flagMsg = flagMsg ? flagMsg + ": " : "";
1785
+ throw new AssertionError(flagMsg + "The instanceof assertion needs a constructor but " + type(constructor) + " was given.", void 0, ssfi);
1786
+ }
1787
+ throw err;
1788
+ }
1789
+ let name = getName(constructor);
1790
+ if (name == null) name = "an unnamed constructor";
1791
+ this.assert(isInstanceOf, "expected #{this} to be an instance of " + name, "expected #{this} to not be an instance of " + name);
1792
+ }
1793
+ __name(assertInstanceOf, "assertInstanceOf");
1794
+ Assertion.addMethod("instanceof", assertInstanceOf);
1795
+ Assertion.addMethod("instanceOf", assertInstanceOf);
1796
+ function assertProperty(name, val, msg) {
1797
+ if (msg) flag2(this, "message", msg);
1798
+ let isNested = flag2(this, "nested"), isOwn = flag2(this, "own"), flagMsg = flag2(this, "message"), obj = flag2(this, "object"), ssfi = flag2(this, "ssfi"), nameType = typeof name;
1799
+ flagMsg = flagMsg ? flagMsg + ": " : "";
1800
+ if (isNested) {
1801
+ if (nameType !== "string") throw new AssertionError(flagMsg + "the argument to property must be a string when using nested syntax", void 0, ssfi);
1802
+ } else if (nameType !== "string" && nameType !== "number" && nameType !== "symbol") throw new AssertionError(flagMsg + "the argument to property must be a string, number, or symbol", void 0, ssfi);
1803
+ if (isNested && isOwn) throw new AssertionError(flagMsg + "The \"nested\" and \"own\" flags cannot be combined.", void 0, ssfi);
1804
+ if (obj === null || obj === void 0) throw new AssertionError(flagMsg + "Target cannot be null or undefined.", void 0, ssfi);
1805
+ let isDeep = flag2(this, "deep"), negate = flag2(this, "negate"), pathInfo = isNested ? getPathInfo(obj, name) : null, value = isNested ? pathInfo.value : obj[name], isEql = isDeep ? flag2(this, "eql") : (val1, val2) => val1 === val2;
1806
+ let descriptor = "";
1807
+ if (isDeep) descriptor += "deep ";
1808
+ if (isOwn) descriptor += "own ";
1809
+ if (isNested) descriptor += "nested ";
1810
+ descriptor += "property ";
1811
+ let hasProperty2;
1812
+ if (isOwn) hasProperty2 = Object.prototype.hasOwnProperty.call(obj, name);
1813
+ else if (isNested) hasProperty2 = pathInfo.exists;
1814
+ else hasProperty2 = hasProperty(obj, name);
1815
+ if (!negate || arguments.length === 1) this.assert(hasProperty2, "expected #{this} to have " + descriptor + inspect2(name), "expected #{this} to not have " + descriptor + inspect2(name));
1816
+ if (arguments.length > 1) this.assert(hasProperty2 && isEql(val, value), "expected #{this} to have " + descriptor + inspect2(name) + " of #{exp}, but got #{act}", "expected #{this} to not have " + descriptor + inspect2(name) + " of #{act}", val, value);
1817
+ flag2(this, "object", value);
1818
+ }
1819
+ __name(assertProperty, "assertProperty");
1820
+ Assertion.addMethod("property", assertProperty);
1821
+ function assertOwnProperty(_name, _value, _msg) {
1822
+ flag2(this, "own", true);
1823
+ assertProperty.apply(this, arguments);
1824
+ }
1825
+ __name(assertOwnProperty, "assertOwnProperty");
1826
+ Assertion.addMethod("ownProperty", assertOwnProperty);
1827
+ Assertion.addMethod("haveOwnProperty", assertOwnProperty);
1828
+ function assertOwnPropertyDescriptor(name, descriptor, msg) {
1829
+ if (typeof descriptor === "string") {
1830
+ msg = descriptor;
1831
+ descriptor = null;
1832
+ }
1833
+ if (msg) flag2(this, "message", msg);
1834
+ let obj = flag2(this, "object");
1835
+ let actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);
1836
+ let eql = flag2(this, "eql");
1837
+ if (actualDescriptor && descriptor) this.assert(eql(descriptor, actualDescriptor), "expected the own property descriptor for " + inspect2(name) + " on #{this} to match " + inspect2(descriptor) + ", got " + inspect2(actualDescriptor), "expected the own property descriptor for " + inspect2(name) + " on #{this} to not match " + inspect2(descriptor), descriptor, actualDescriptor, true);
1838
+ else this.assert(actualDescriptor, "expected #{this} to have an own property descriptor for " + inspect2(name), "expected #{this} to not have an own property descriptor for " + inspect2(name));
1839
+ flag2(this, "object", actualDescriptor);
1840
+ }
1841
+ __name(assertOwnPropertyDescriptor, "assertOwnPropertyDescriptor");
1842
+ Assertion.addMethod("ownPropertyDescriptor", assertOwnPropertyDescriptor);
1843
+ Assertion.addMethod("haveOwnPropertyDescriptor", assertOwnPropertyDescriptor);
1844
+ function assertLengthChain() {
1845
+ flag2(this, "doLength", true);
1846
+ }
1847
+ __name(assertLengthChain, "assertLengthChain");
1848
+ function assertLength(n, msg) {
1849
+ if (msg) flag2(this, "message", msg);
1850
+ let obj = flag2(this, "object"), objType = type(obj).toLowerCase(), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"), descriptor = "length", itemsCount;
1851
+ switch (objType) {
1852
+ case "map":
1853
+ case "set":
1854
+ descriptor = "size";
1855
+ itemsCount = obj.size;
1856
+ break;
1857
+ default:
1858
+ new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
1859
+ itemsCount = obj.length;
1860
+ }
1861
+ this.assert(itemsCount == n, "expected #{this} to have a " + descriptor + " of #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " of #{act}", n, itemsCount);
1862
+ }
1863
+ __name(assertLength, "assertLength");
1864
+ Assertion.addChainableMethod("length", assertLength, assertLengthChain);
1865
+ Assertion.addChainableMethod("lengthOf", assertLength, assertLengthChain);
1866
+ function assertMatch(re, msg) {
1867
+ if (msg) flag2(this, "message", msg);
1868
+ let obj = flag2(this, "object");
1869
+ this.assert(re.exec(obj), "expected #{this} to match " + re, "expected #{this} not to match " + re);
1870
+ }
1871
+ __name(assertMatch, "assertMatch");
1872
+ Assertion.addMethod("match", assertMatch);
1873
+ Assertion.addMethod("matches", assertMatch);
1874
+ Assertion.addMethod("string", function(str, msg) {
1875
+ if (msg) flag2(this, "message", msg);
1876
+ let obj = flag2(this, "object");
1877
+ new Assertion(obj, flag2(this, "message"), flag2(this, "ssfi"), true).is.a("string");
1878
+ this.assert(~obj.indexOf(str), "expected #{this} to contain " + inspect2(str), "expected #{this} to not contain " + inspect2(str));
1879
+ });
1880
+ function assertKeys(keys) {
1881
+ let obj = flag2(this, "object"), objType = type(obj), keysType = type(keys), ssfi = flag2(this, "ssfi"), isDeep = flag2(this, "deep"), str, deepStr = "", actual, ok = true, flagMsg = flag2(this, "message");
1882
+ flagMsg = flagMsg ? flagMsg + ": " : "";
1883
+ let mixedArgsMsg = flagMsg + "when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments";
1884
+ if (objType === "Map" || objType === "Set") {
1885
+ deepStr = isDeep ? "deeply " : "";
1886
+ actual = [];
1887
+ obj.forEach(function(val, key) {
1888
+ actual.push(key);
1889
+ });
1890
+ if (keysType !== "Array") keys = Array.prototype.slice.call(arguments);
1891
+ } else {
1892
+ actual = getOwnEnumerableProperties(obj);
1893
+ switch (keysType) {
1894
+ case "Array":
1895
+ if (arguments.length > 1) throw new AssertionError(mixedArgsMsg, void 0, ssfi);
1896
+ break;
1897
+ case "Object":
1898
+ if (arguments.length > 1) throw new AssertionError(mixedArgsMsg, void 0, ssfi);
1899
+ keys = Object.keys(keys);
1900
+ break;
1901
+ default: keys = Array.prototype.slice.call(arguments);
1902
+ }
1903
+ keys = keys.map(function(val) {
1904
+ return typeof val === "symbol" ? val : String(val);
1905
+ });
1906
+ }
1907
+ if (!keys.length) throw new AssertionError(flagMsg + "keys required", void 0, ssfi);
1908
+ let len = keys.length, any = flag2(this, "any"), all = flag2(this, "all"), expected = keys, isEql = isDeep ? flag2(this, "eql") : (val1, val2) => val1 === val2;
1909
+ if (!any && !all) all = true;
1910
+ if (any) ok = expected.some(function(expectedKey) {
1911
+ return actual.some(function(actualKey) {
1912
+ return isEql(expectedKey, actualKey);
1913
+ });
1914
+ });
1915
+ if (all) {
1916
+ ok = expected.every(function(expectedKey) {
1917
+ return actual.some(function(actualKey) {
1918
+ return isEql(expectedKey, actualKey);
1919
+ });
1920
+ });
1921
+ if (!flag2(this, "contains")) ok = ok && keys.length == actual.length;
1922
+ }
1923
+ if (len > 1) {
1924
+ keys = keys.map(function(key) {
1925
+ return inspect2(key);
1926
+ });
1927
+ let last = keys.pop();
1928
+ if (all) str = keys.join(", ") + ", and " + last;
1929
+ if (any) str = keys.join(", ") + ", or " + last;
1930
+ } else str = inspect2(keys[0]);
1931
+ str = (len > 1 ? "keys " : "key ") + str;
1932
+ str = (flag2(this, "contains") ? "contain " : "have ") + str;
1933
+ this.assert(ok, "expected #{this} to " + deepStr + str, "expected #{this} to not " + deepStr + str, expected.slice(0).sort(compareByInspect), actual.sort(compareByInspect), true);
1934
+ }
1935
+ __name(assertKeys, "assertKeys");
1936
+ Assertion.addMethod("keys", assertKeys);
1937
+ Assertion.addMethod("key", assertKeys);
1938
+ function assertThrows(errorLike, errMsgMatcher, msg) {
1939
+ if (msg) flag2(this, "message", msg);
1940
+ let obj = flag2(this, "object"), ssfi = flag2(this, "ssfi"), flagMsg = flag2(this, "message"), negate = flag2(this, "negate") || false;
1941
+ new Assertion(obj, flagMsg, ssfi, true).is.a("function");
1942
+ if (isRegExp2(errorLike) || typeof errorLike === "string") {
1943
+ errMsgMatcher = errorLike;
1944
+ errorLike = null;
1945
+ }
1946
+ let caughtErr;
1947
+ let errorWasThrown = false;
1948
+ try {
1949
+ obj();
1950
+ } catch (err) {
1951
+ errorWasThrown = true;
1952
+ caughtErr = err;
1953
+ }
1954
+ let everyArgIsUndefined = errorLike === void 0 && errMsgMatcher === void 0;
1955
+ let everyArgIsDefined = Boolean(errorLike && errMsgMatcher);
1956
+ let errorLikeFail = false;
1957
+ let errMsgMatcherFail = false;
1958
+ if (everyArgIsUndefined || !everyArgIsUndefined && !negate) {
1959
+ let errorLikeString = "an error";
1960
+ if (errorLike instanceof Error) errorLikeString = "#{exp}";
1961
+ else if (errorLike) errorLikeString = check_error_exports.getConstructorName(errorLike);
1962
+ let actual = caughtErr;
1963
+ if (caughtErr instanceof Error) actual = caughtErr.toString();
1964
+ else if (typeof caughtErr === "string") actual = caughtErr;
1965
+ else if (caughtErr && (typeof caughtErr === "object" || typeof caughtErr === "function")) try {
1966
+ actual = check_error_exports.getConstructorName(caughtErr);
1967
+ } catch (_err) {}
1968
+ this.assert(errorWasThrown, "expected #{this} to throw " + errorLikeString, "expected #{this} to not throw an error but #{act} was thrown", errorLike && errorLike.toString(), actual);
1969
+ }
1970
+ if (errorLike && caughtErr) {
1971
+ if (errorLike instanceof Error) {
1972
+ if (check_error_exports.compatibleInstance(caughtErr, errorLike) === negate) if (everyArgIsDefined && negate) errorLikeFail = true;
1973
+ else this.assert(negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr && !negate ? " but #{act} was thrown" : ""), errorLike.toString(), caughtErr.toString());
1974
+ }
1975
+ if (check_error_exports.compatibleConstructor(caughtErr, errorLike) === negate) if (everyArgIsDefined && negate) errorLikeFail = true;
1976
+ else this.assert(negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr ? " but #{act} was thrown" : ""), errorLike instanceof Error ? errorLike.toString() : errorLike && check_error_exports.getConstructorName(errorLike), caughtErr instanceof Error ? caughtErr.toString() : caughtErr && check_error_exports.getConstructorName(caughtErr));
1977
+ }
1978
+ if (caughtErr && errMsgMatcher !== void 0 && errMsgMatcher !== null) {
1979
+ let placeholder = "including";
1980
+ if (isRegExp2(errMsgMatcher)) placeholder = "matching";
1981
+ if (check_error_exports.compatibleMessage(caughtErr, errMsgMatcher) === negate) if (everyArgIsDefined && negate) errMsgMatcherFail = true;
1982
+ else this.assert(negate, "expected #{this} to throw error " + placeholder + " #{exp} but got #{act}", "expected #{this} to throw error not " + placeholder + " #{exp}", errMsgMatcher, check_error_exports.getMessage(caughtErr));
1983
+ }
1984
+ if (errorLikeFail && errMsgMatcherFail) this.assert(negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr ? " but #{act} was thrown" : ""), errorLike instanceof Error ? errorLike.toString() : errorLike && check_error_exports.getConstructorName(errorLike), caughtErr instanceof Error ? caughtErr.toString() : caughtErr && check_error_exports.getConstructorName(caughtErr));
1985
+ flag2(this, "object", caughtErr);
1986
+ }
1987
+ __name(assertThrows, "assertThrows");
1988
+ Assertion.addMethod("throw", assertThrows);
1989
+ Assertion.addMethod("throws", assertThrows);
1990
+ Assertion.addMethod("Throw", assertThrows);
1991
+ function respondTo(method, msg) {
1992
+ if (msg) flag2(this, "message", msg);
1993
+ let obj = flag2(this, "object"), itself = flag2(this, "itself"), context = "function" === typeof obj && !itself ? obj.prototype[method] : obj[method];
1994
+ this.assert("function" === typeof context, "expected #{this} to respond to " + inspect2(method), "expected #{this} to not respond to " + inspect2(method));
1995
+ }
1996
+ __name(respondTo, "respondTo");
1997
+ Assertion.addMethod("respondTo", respondTo);
1998
+ Assertion.addMethod("respondsTo", respondTo);
1999
+ Assertion.addProperty("itself", function() {
2000
+ flag2(this, "itself", true);
2001
+ });
2002
+ function satisfy(matcher, msg) {
2003
+ if (msg) flag2(this, "message", msg);
2004
+ let result = matcher(flag2(this, "object"));
2005
+ this.assert(result, "expected #{this} to satisfy " + objDisplay(matcher), "expected #{this} to not satisfy" + objDisplay(matcher), flag2(this, "negate") ? false : true, result);
2006
+ }
2007
+ __name(satisfy, "satisfy");
2008
+ Assertion.addMethod("satisfy", satisfy);
2009
+ Assertion.addMethod("satisfies", satisfy);
2010
+ function closeTo(expected, delta, msg) {
2011
+ if (msg) flag2(this, "message", msg);
2012
+ let obj = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
2013
+ new Assertion(obj, flagMsg, ssfi, true).is.numeric;
2014
+ let message = "A `delta` value is required for `closeTo`";
2015
+ if (delta == void 0) throw new AssertionError(flagMsg ? `${flagMsg}: ${message}` : message, void 0, ssfi);
2016
+ new Assertion(delta, flagMsg, ssfi, true).is.numeric;
2017
+ message = "A `expected` value is required for `closeTo`";
2018
+ if (expected == void 0) throw new AssertionError(flagMsg ? `${flagMsg}: ${message}` : message, void 0, ssfi);
2019
+ new Assertion(expected, flagMsg, ssfi, true).is.numeric;
2020
+ const abs = /* @__PURE__ */ __name((x) => x < 0 ? -x : x, "abs");
2021
+ const strip = /* @__PURE__ */ __name((number) => parseFloat(parseFloat(number).toPrecision(12)), "strip");
2022
+ this.assert(strip(abs(obj - expected)) <= delta, "expected #{this} to be close to " + expected + " +/- " + delta, "expected #{this} not to be close to " + expected + " +/- " + delta);
2023
+ }
2024
+ __name(closeTo, "closeTo");
2025
+ Assertion.addMethod("closeTo", closeTo);
2026
+ Assertion.addMethod("approximately", closeTo);
2027
+ function isSubsetOf(_subset, _superset, cmp, contains, ordered) {
2028
+ let superset = Array.from(_superset);
2029
+ let subset = Array.from(_subset);
2030
+ if (!contains) {
2031
+ if (subset.length !== superset.length) return false;
2032
+ superset = superset.slice();
2033
+ }
2034
+ return subset.every(function(elem, idx) {
2035
+ if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx];
2036
+ if (!cmp) {
2037
+ let matchIdx = superset.indexOf(elem);
2038
+ if (matchIdx === -1) return false;
2039
+ if (!contains) superset.splice(matchIdx, 1);
2040
+ return true;
2041
+ }
2042
+ return superset.some(function(elem2, matchIdx) {
2043
+ if (!cmp(elem, elem2)) return false;
2044
+ if (!contains) superset.splice(matchIdx, 1);
2045
+ return true;
2046
+ });
2047
+ });
2048
+ }
2049
+ __name(isSubsetOf, "isSubsetOf");
2050
+ Assertion.addMethod("members", function(subset, msg) {
2051
+ if (msg) flag2(this, "message", msg);
2052
+ let obj = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
2053
+ new Assertion(obj, flagMsg, ssfi, true).to.be.iterable;
2054
+ new Assertion(subset, flagMsg, ssfi, true).to.be.iterable;
2055
+ let contains = flag2(this, "contains");
2056
+ let ordered = flag2(this, "ordered");
2057
+ let subject, failMsg, failNegateMsg;
2058
+ if (contains) {
2059
+ subject = ordered ? "an ordered superset" : "a superset";
2060
+ failMsg = "expected #{this} to be " + subject + " of #{exp}";
2061
+ failNegateMsg = "expected #{this} to not be " + subject + " of #{exp}";
2062
+ } else {
2063
+ subject = ordered ? "ordered members" : "members";
2064
+ failMsg = "expected #{this} to have the same " + subject + " as #{exp}";
2065
+ failNegateMsg = "expected #{this} to not have the same " + subject + " as #{exp}";
2066
+ }
2067
+ let cmp = flag2(this, "deep") ? flag2(this, "eql") : void 0;
2068
+ this.assert(isSubsetOf(subset, obj, cmp, contains, ordered), failMsg, failNegateMsg, subset, obj, true);
2069
+ });
2070
+ Assertion.addProperty("iterable", function(msg) {
2071
+ if (msg) flag2(this, "message", msg);
2072
+ let obj = flag2(this, "object");
2073
+ this.assert(obj != void 0 && obj[Symbol.iterator], "expected #{this} to be an iterable", "expected #{this} to not be an iterable", obj);
2074
+ });
2075
+ function oneOf(list, msg) {
2076
+ if (msg) flag2(this, "message", msg);
2077
+ let expected = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"), contains = flag2(this, "contains"), isDeep = flag2(this, "deep"), eql = flag2(this, "eql");
2078
+ new Assertion(list, flagMsg, ssfi, true).to.be.an("array");
2079
+ if (contains) this.assert(list.some(function(possibility) {
2080
+ return expected.indexOf(possibility) > -1;
2081
+ }), "expected #{this} to contain one of #{exp}", "expected #{this} to not contain one of #{exp}", list, expected);
2082
+ else if (isDeep) this.assert(list.some(function(possibility) {
2083
+ return eql(expected, possibility);
2084
+ }), "expected #{this} to deeply equal one of #{exp}", "expected #{this} to deeply equal one of #{exp}", list, expected);
2085
+ else this.assert(list.indexOf(expected) > -1, "expected #{this} to be one of #{exp}", "expected #{this} to not be one of #{exp}", list, expected);
2086
+ }
2087
+ __name(oneOf, "oneOf");
2088
+ Assertion.addMethod("oneOf", oneOf);
2089
+ function assertChanges(subject, prop, msg) {
2090
+ if (msg) flag2(this, "message", msg);
2091
+ let fn = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
2092
+ new Assertion(fn, flagMsg, ssfi, true).is.a("function");
2093
+ let initial;
2094
+ if (!prop) {
2095
+ new Assertion(subject, flagMsg, ssfi, true).is.a("function");
2096
+ initial = subject();
2097
+ } else {
2098
+ new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
2099
+ initial = subject[prop];
2100
+ }
2101
+ fn();
2102
+ let final = prop === void 0 || prop === null ? subject() : subject[prop];
2103
+ let msgObj = prop === void 0 || prop === null ? initial : "." + prop;
2104
+ flag2(this, "deltaMsgObj", msgObj);
2105
+ flag2(this, "initialDeltaValue", initial);
2106
+ flag2(this, "finalDeltaValue", final);
2107
+ flag2(this, "deltaBehavior", "change");
2108
+ flag2(this, "realDelta", final !== initial);
2109
+ this.assert(initial !== final, "expected " + msgObj + " to change", "expected " + msgObj + " to not change");
2110
+ }
2111
+ __name(assertChanges, "assertChanges");
2112
+ Assertion.addMethod("change", assertChanges);
2113
+ Assertion.addMethod("changes", assertChanges);
2114
+ function assertIncreases(subject, prop, msg) {
2115
+ if (msg) flag2(this, "message", msg);
2116
+ let fn = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
2117
+ new Assertion(fn, flagMsg, ssfi, true).is.a("function");
2118
+ let initial;
2119
+ if (!prop) {
2120
+ new Assertion(subject, flagMsg, ssfi, true).is.a("function");
2121
+ initial = subject();
2122
+ } else {
2123
+ new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
2124
+ initial = subject[prop];
2125
+ }
2126
+ new Assertion(initial, flagMsg, ssfi, true).is.a("number");
2127
+ fn();
2128
+ let final = prop === void 0 || prop === null ? subject() : subject[prop];
2129
+ let msgObj = prop === void 0 || prop === null ? initial : "." + prop;
2130
+ flag2(this, "deltaMsgObj", msgObj);
2131
+ flag2(this, "initialDeltaValue", initial);
2132
+ flag2(this, "finalDeltaValue", final);
2133
+ flag2(this, "deltaBehavior", "increase");
2134
+ flag2(this, "realDelta", final - initial);
2135
+ this.assert(final - initial > 0, "expected " + msgObj + " to increase", "expected " + msgObj + " to not increase");
2136
+ }
2137
+ __name(assertIncreases, "assertIncreases");
2138
+ Assertion.addMethod("increase", assertIncreases);
2139
+ Assertion.addMethod("increases", assertIncreases);
2140
+ function assertDecreases(subject, prop, msg) {
2141
+ if (msg) flag2(this, "message", msg);
2142
+ let fn = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
2143
+ new Assertion(fn, flagMsg, ssfi, true).is.a("function");
2144
+ let initial;
2145
+ if (!prop) {
2146
+ new Assertion(subject, flagMsg, ssfi, true).is.a("function");
2147
+ initial = subject();
2148
+ } else {
2149
+ new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
2150
+ initial = subject[prop];
2151
+ }
2152
+ new Assertion(initial, flagMsg, ssfi, true).is.a("number");
2153
+ fn();
2154
+ let final = prop === void 0 || prop === null ? subject() : subject[prop];
2155
+ let msgObj = prop === void 0 || prop === null ? initial : "." + prop;
2156
+ flag2(this, "deltaMsgObj", msgObj);
2157
+ flag2(this, "initialDeltaValue", initial);
2158
+ flag2(this, "finalDeltaValue", final);
2159
+ flag2(this, "deltaBehavior", "decrease");
2160
+ flag2(this, "realDelta", initial - final);
2161
+ this.assert(final - initial < 0, "expected " + msgObj + " to decrease", "expected " + msgObj + " to not decrease");
2162
+ }
2163
+ __name(assertDecreases, "assertDecreases");
2164
+ Assertion.addMethod("decrease", assertDecreases);
2165
+ Assertion.addMethod("decreases", assertDecreases);
2166
+ function assertDelta(delta, msg) {
2167
+ if (msg) flag2(this, "message", msg);
2168
+ let msgObj = flag2(this, "deltaMsgObj");
2169
+ let initial = flag2(this, "initialDeltaValue");
2170
+ let final = flag2(this, "finalDeltaValue");
2171
+ let behavior = flag2(this, "deltaBehavior");
2172
+ let realDelta = flag2(this, "realDelta");
2173
+ let expression;
2174
+ if (behavior === "change") expression = Math.abs(final - initial) === Math.abs(delta);
2175
+ else expression = realDelta === Math.abs(delta);
2176
+ this.assert(expression, "expected " + msgObj + " to " + behavior + " by " + delta, "expected " + msgObj + " to not " + behavior + " by " + delta);
2177
+ }
2178
+ __name(assertDelta, "assertDelta");
2179
+ Assertion.addMethod("by", assertDelta);
2180
+ Assertion.addProperty("extensible", function() {
2181
+ let obj = flag2(this, "object");
2182
+ let isExtensible = obj === Object(obj) && Object.isExtensible(obj);
2183
+ this.assert(isExtensible, "expected #{this} to be extensible", "expected #{this} to not be extensible");
2184
+ });
2185
+ Assertion.addProperty("sealed", function() {
2186
+ let obj = flag2(this, "object");
2187
+ let isSealed = obj === Object(obj) ? Object.isSealed(obj) : true;
2188
+ this.assert(isSealed, "expected #{this} to be sealed", "expected #{this} to not be sealed");
2189
+ });
2190
+ Assertion.addProperty("frozen", function() {
2191
+ let obj = flag2(this, "object");
2192
+ let isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true;
2193
+ this.assert(isFrozen, "expected #{this} to be frozen", "expected #{this} to not be frozen");
2194
+ });
2195
+ Assertion.addProperty("finite", function(_msg) {
2196
+ let obj = flag2(this, "object");
2197
+ this.assert(typeof obj === "number" && isFinite(obj), "expected #{this} to be a finite number", "expected #{this} to not be a finite number");
2198
+ });
2199
+ function compareSubset(expected, actual) {
2200
+ if (expected === actual) return true;
2201
+ if (typeof actual !== typeof expected) return false;
2202
+ if (typeof expected !== "object" || expected === null) return expected === actual;
2203
+ if (!actual) return false;
2204
+ if (Array.isArray(expected)) {
2205
+ if (!Array.isArray(actual)) return false;
2206
+ return expected.every(function(exp) {
2207
+ return actual.some(function(act) {
2208
+ return compareSubset(exp, act);
2209
+ });
2210
+ });
2211
+ }
2212
+ if (expected instanceof Date) if (actual instanceof Date) return expected.getTime() === actual.getTime();
2213
+ else return false;
2214
+ return Object.keys(expected).every(function(key) {
2215
+ let expectedValue = expected[key];
2216
+ let actualValue = actual[key];
2217
+ if (typeof expectedValue === "object" && expectedValue !== null && actualValue !== null) return compareSubset(expectedValue, actualValue);
2218
+ if (typeof expectedValue === "function") return expectedValue(actualValue);
2219
+ return actualValue === expectedValue;
2220
+ });
2221
+ }
2222
+ __name(compareSubset, "compareSubset");
2223
+ Assertion.addMethod("containSubset", function(expected) {
2224
+ const actual = flag(this, "object");
2225
+ const showDiff = config.showDiff;
2226
+ this.assert(compareSubset(expected, actual), "expected #{act} to contain subset #{exp}", "expected #{act} to not contain subset #{exp}", expected, actual, showDiff);
2227
+ });
2228
+ function expect(val, message) {
2229
+ return new Assertion(val, message);
2230
+ }
2231
+ __name(expect, "expect");
2232
+ expect.fail = function(actual, expected, message, operator) {
2233
+ if (arguments.length < 2) {
2234
+ message = actual;
2235
+ actual = void 0;
2236
+ }
2237
+ message = message || "expect.fail()";
2238
+ throw new AssertionError(message, {
2239
+ actual,
2240
+ expected,
2241
+ operator
2242
+ }, expect.fail);
2243
+ };
2244
+ var should_exports = {};
2245
+ __export(should_exports, {
2246
+ Should: () => Should,
2247
+ should: () => should
2248
+ });
2249
+ function loadShould() {
2250
+ function shouldGetter() {
2251
+ if (this instanceof String || this instanceof Number || this instanceof Boolean || typeof Symbol === "function" && this instanceof Symbol || typeof BigInt === "function" && this instanceof BigInt) return new Assertion(this.valueOf(), null, shouldGetter);
2252
+ return new Assertion(this, null, shouldGetter);
2253
+ }
2254
+ __name(shouldGetter, "shouldGetter");
2255
+ function shouldSetter(value) {
2256
+ Object.defineProperty(this, "should", {
2257
+ value,
2258
+ enumerable: true,
2259
+ configurable: true,
2260
+ writable: true
2261
+ });
2262
+ }
2263
+ __name(shouldSetter, "shouldSetter");
2264
+ Object.defineProperty(Object.prototype, "should", {
2265
+ set: shouldSetter,
2266
+ get: shouldGetter,
2267
+ configurable: true
2268
+ });
2269
+ let should2 = {};
2270
+ should2.fail = function(actual, expected, message, operator) {
2271
+ if (arguments.length < 2) {
2272
+ message = actual;
2273
+ actual = void 0;
2274
+ }
2275
+ message = message || "should.fail()";
2276
+ throw new AssertionError(message, {
2277
+ actual,
2278
+ expected,
2279
+ operator
2280
+ }, should2.fail);
2281
+ };
2282
+ should2.equal = function(actual, expected, message) {
2283
+ new Assertion(actual, message).to.equal(expected);
2284
+ };
2285
+ should2.Throw = function(fn, errt, errs, msg) {
2286
+ new Assertion(fn, msg).to.Throw(errt, errs);
2287
+ };
2288
+ should2.exist = function(val, msg) {
2289
+ new Assertion(val, msg).to.exist;
2290
+ };
2291
+ should2.not = {};
2292
+ should2.not.equal = function(actual, expected, msg) {
2293
+ new Assertion(actual, msg).to.not.equal(expected);
2294
+ };
2295
+ should2.not.Throw = function(fn, errt, errs, msg) {
2296
+ new Assertion(fn, msg).to.not.Throw(errt, errs);
2297
+ };
2298
+ should2.not.exist = function(val, msg) {
2299
+ new Assertion(val, msg).to.not.exist;
2300
+ };
2301
+ should2["throw"] = should2["Throw"];
2302
+ should2.not["throw"] = should2.not["Throw"];
2303
+ return should2;
2304
+ }
2305
+ __name(loadShould, "loadShould");
2306
+ var should = loadShould;
2307
+ var Should = loadShould;
2308
+ function assert(express, errmsg) {
2309
+ new Assertion(null, null, assert, true).assert(express, errmsg, "[ negation message unavailable ]");
2310
+ }
2311
+ __name(assert, "assert");
2312
+ assert.fail = function(actual, expected, message, operator) {
2313
+ if (arguments.length < 2) {
2314
+ message = actual;
2315
+ actual = void 0;
2316
+ }
2317
+ message = message || "assert.fail()";
2318
+ throw new AssertionError(message, {
2319
+ actual,
2320
+ expected,
2321
+ operator
2322
+ }, assert.fail);
2323
+ };
2324
+ assert.isOk = function(val, msg) {
2325
+ new Assertion(val, msg, assert.isOk, true).is.ok;
2326
+ };
2327
+ assert.isNotOk = function(val, msg) {
2328
+ new Assertion(val, msg, assert.isNotOk, true).is.not.ok;
2329
+ };
2330
+ assert.equal = function(act, exp, msg) {
2331
+ let test2 = new Assertion(act, msg, assert.equal, true);
2332
+ test2.assert(exp == flag(test2, "object"), "expected #{this} to equal #{exp}", "expected #{this} to not equal #{act}", exp, act, true);
2333
+ };
2334
+ assert.notEqual = function(act, exp, msg) {
2335
+ let test2 = new Assertion(act, msg, assert.notEqual, true);
2336
+ test2.assert(exp != flag(test2, "object"), "expected #{this} to not equal #{exp}", "expected #{this} to equal #{act}", exp, act, true);
2337
+ };
2338
+ assert.strictEqual = function(act, exp, msg) {
2339
+ new Assertion(act, msg, assert.strictEqual, true).to.equal(exp);
2340
+ };
2341
+ assert.notStrictEqual = function(act, exp, msg) {
2342
+ new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp);
2343
+ };
2344
+ assert.deepEqual = assert.deepStrictEqual = function(act, exp, msg) {
2345
+ new Assertion(act, msg, assert.deepEqual, true).to.eql(exp);
2346
+ };
2347
+ assert.notDeepEqual = function(act, exp, msg) {
2348
+ new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp);
2349
+ };
2350
+ assert.isAbove = function(val, abv, msg) {
2351
+ new Assertion(val, msg, assert.isAbove, true).to.be.above(abv);
2352
+ };
2353
+ assert.isAtLeast = function(val, atlst, msg) {
2354
+ new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst);
2355
+ };
2356
+ assert.isBelow = function(val, blw, msg) {
2357
+ new Assertion(val, msg, assert.isBelow, true).to.be.below(blw);
2358
+ };
2359
+ assert.isAtMost = function(val, atmst, msg) {
2360
+ new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst);
2361
+ };
2362
+ assert.isTrue = function(val, msg) {
2363
+ new Assertion(val, msg, assert.isTrue, true).is["true"];
2364
+ };
2365
+ assert.isNotTrue = function(val, msg) {
2366
+ new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true);
2367
+ };
2368
+ assert.isFalse = function(val, msg) {
2369
+ new Assertion(val, msg, assert.isFalse, true).is["false"];
2370
+ };
2371
+ assert.isNotFalse = function(val, msg) {
2372
+ new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false);
2373
+ };
2374
+ assert.isNull = function(val, msg) {
2375
+ new Assertion(val, msg, assert.isNull, true).to.equal(null);
2376
+ };
2377
+ assert.isNotNull = function(val, msg) {
2378
+ new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null);
2379
+ };
2380
+ assert.isNaN = function(val, msg) {
2381
+ new Assertion(val, msg, assert.isNaN, true).to.be.NaN;
2382
+ };
2383
+ assert.isNotNaN = function(value, message) {
2384
+ new Assertion(value, message, assert.isNotNaN, true).not.to.be.NaN;
2385
+ };
2386
+ assert.exists = function(val, msg) {
2387
+ new Assertion(val, msg, assert.exists, true).to.exist;
2388
+ };
2389
+ assert.notExists = function(val, msg) {
2390
+ new Assertion(val, msg, assert.notExists, true).to.not.exist;
2391
+ };
2392
+ assert.isUndefined = function(val, msg) {
2393
+ new Assertion(val, msg, assert.isUndefined, true).to.equal(void 0);
2394
+ };
2395
+ assert.isDefined = function(val, msg) {
2396
+ new Assertion(val, msg, assert.isDefined, true).to.not.equal(void 0);
2397
+ };
2398
+ assert.isCallable = function(value, message) {
2399
+ new Assertion(value, message, assert.isCallable, true).is.callable;
2400
+ };
2401
+ assert.isNotCallable = function(value, message) {
2402
+ new Assertion(value, message, assert.isNotCallable, true).is.not.callable;
2403
+ };
2404
+ assert.isObject = function(val, msg) {
2405
+ new Assertion(val, msg, assert.isObject, true).to.be.a("object");
2406
+ };
2407
+ assert.isNotObject = function(val, msg) {
2408
+ new Assertion(val, msg, assert.isNotObject, true).to.not.be.a("object");
2409
+ };
2410
+ assert.isArray = function(val, msg) {
2411
+ new Assertion(val, msg, assert.isArray, true).to.be.an("array");
2412
+ };
2413
+ assert.isNotArray = function(val, msg) {
2414
+ new Assertion(val, msg, assert.isNotArray, true).to.not.be.an("array");
2415
+ };
2416
+ assert.isString = function(val, msg) {
2417
+ new Assertion(val, msg, assert.isString, true).to.be.a("string");
2418
+ };
2419
+ assert.isNotString = function(val, msg) {
2420
+ new Assertion(val, msg, assert.isNotString, true).to.not.be.a("string");
2421
+ };
2422
+ assert.isNumber = function(val, msg) {
2423
+ new Assertion(val, msg, assert.isNumber, true).to.be.a("number");
2424
+ };
2425
+ assert.isNotNumber = function(val, msg) {
2426
+ new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a("number");
2427
+ };
2428
+ assert.isNumeric = function(val, msg) {
2429
+ new Assertion(val, msg, assert.isNumeric, true).is.numeric;
2430
+ };
2431
+ assert.isNotNumeric = function(val, msg) {
2432
+ new Assertion(val, msg, assert.isNotNumeric, true).is.not.numeric;
2433
+ };
2434
+ assert.isFinite = function(val, msg) {
2435
+ new Assertion(val, msg, assert.isFinite, true).to.be.finite;
2436
+ };
2437
+ assert.isBoolean = function(val, msg) {
2438
+ new Assertion(val, msg, assert.isBoolean, true).to.be.a("boolean");
2439
+ };
2440
+ assert.isNotBoolean = function(val, msg) {
2441
+ new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a("boolean");
2442
+ };
2443
+ assert.typeOf = function(val, type3, msg) {
2444
+ new Assertion(val, msg, assert.typeOf, true).to.be.a(type3);
2445
+ };
2446
+ assert.notTypeOf = function(value, type3, message) {
2447
+ new Assertion(value, message, assert.notTypeOf, true).to.not.be.a(type3);
2448
+ };
2449
+ assert.instanceOf = function(val, type3, msg) {
2450
+ new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type3);
2451
+ };
2452
+ assert.notInstanceOf = function(val, type3, msg) {
2453
+ new Assertion(val, msg, assert.notInstanceOf, true).to.not.be.instanceOf(type3);
2454
+ };
2455
+ assert.include = function(exp, inc, msg) {
2456
+ new Assertion(exp, msg, assert.include, true).include(inc);
2457
+ };
2458
+ assert.notInclude = function(exp, inc, msg) {
2459
+ new Assertion(exp, msg, assert.notInclude, true).not.include(inc);
2460
+ };
2461
+ assert.deepInclude = function(exp, inc, msg) {
2462
+ new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc);
2463
+ };
2464
+ assert.notDeepInclude = function(exp, inc, msg) {
2465
+ new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc);
2466
+ };
2467
+ assert.nestedInclude = function(exp, inc, msg) {
2468
+ new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc);
2469
+ };
2470
+ assert.notNestedInclude = function(exp, inc, msg) {
2471
+ new Assertion(exp, msg, assert.notNestedInclude, true).not.nested.include(inc);
2472
+ };
2473
+ assert.deepNestedInclude = function(exp, inc, msg) {
2474
+ new Assertion(exp, msg, assert.deepNestedInclude, true).deep.nested.include(inc);
2475
+ };
2476
+ assert.notDeepNestedInclude = function(exp, inc, msg) {
2477
+ new Assertion(exp, msg, assert.notDeepNestedInclude, true).not.deep.nested.include(inc);
2478
+ };
2479
+ assert.ownInclude = function(exp, inc, msg) {
2480
+ new Assertion(exp, msg, assert.ownInclude, true).own.include(inc);
2481
+ };
2482
+ assert.notOwnInclude = function(exp, inc, msg) {
2483
+ new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc);
2484
+ };
2485
+ assert.deepOwnInclude = function(exp, inc, msg) {
2486
+ new Assertion(exp, msg, assert.deepOwnInclude, true).deep.own.include(inc);
2487
+ };
2488
+ assert.notDeepOwnInclude = function(exp, inc, msg) {
2489
+ new Assertion(exp, msg, assert.notDeepOwnInclude, true).not.deep.own.include(inc);
2490
+ };
2491
+ assert.match = function(exp, re, msg) {
2492
+ new Assertion(exp, msg, assert.match, true).to.match(re);
2493
+ };
2494
+ assert.notMatch = function(exp, re, msg) {
2495
+ new Assertion(exp, msg, assert.notMatch, true).to.not.match(re);
2496
+ };
2497
+ assert.property = function(obj, prop, msg) {
2498
+ new Assertion(obj, msg, assert.property, true).to.have.property(prop);
2499
+ };
2500
+ assert.notProperty = function(obj, prop, msg) {
2501
+ new Assertion(obj, msg, assert.notProperty, true).to.not.have.property(prop);
2502
+ };
2503
+ assert.propertyVal = function(obj, prop, val, msg) {
2504
+ new Assertion(obj, msg, assert.propertyVal, true).to.have.property(prop, val);
2505
+ };
2506
+ assert.notPropertyVal = function(obj, prop, val, msg) {
2507
+ new Assertion(obj, msg, assert.notPropertyVal, true).to.not.have.property(prop, val);
2508
+ };
2509
+ assert.deepPropertyVal = function(obj, prop, val, msg) {
2510
+ new Assertion(obj, msg, assert.deepPropertyVal, true).to.have.deep.property(prop, val);
2511
+ };
2512
+ assert.notDeepPropertyVal = function(obj, prop, val, msg) {
2513
+ new Assertion(obj, msg, assert.notDeepPropertyVal, true).to.not.have.deep.property(prop, val);
2514
+ };
2515
+ assert.ownProperty = function(obj, prop, msg) {
2516
+ new Assertion(obj, msg, assert.ownProperty, true).to.have.own.property(prop);
2517
+ };
2518
+ assert.notOwnProperty = function(obj, prop, msg) {
2519
+ new Assertion(obj, msg, assert.notOwnProperty, true).to.not.have.own.property(prop);
2520
+ };
2521
+ assert.ownPropertyVal = function(obj, prop, value, msg) {
2522
+ new Assertion(obj, msg, assert.ownPropertyVal, true).to.have.own.property(prop, value);
2523
+ };
2524
+ assert.notOwnPropertyVal = function(obj, prop, value, msg) {
2525
+ new Assertion(obj, msg, assert.notOwnPropertyVal, true).to.not.have.own.property(prop, value);
2526
+ };
2527
+ assert.deepOwnPropertyVal = function(obj, prop, value, msg) {
2528
+ new Assertion(obj, msg, assert.deepOwnPropertyVal, true).to.have.deep.own.property(prop, value);
2529
+ };
2530
+ assert.notDeepOwnPropertyVal = function(obj, prop, value, msg) {
2531
+ new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true).to.not.have.deep.own.property(prop, value);
2532
+ };
2533
+ assert.nestedProperty = function(obj, prop, msg) {
2534
+ new Assertion(obj, msg, assert.nestedProperty, true).to.have.nested.property(prop);
2535
+ };
2536
+ assert.notNestedProperty = function(obj, prop, msg) {
2537
+ new Assertion(obj, msg, assert.notNestedProperty, true).to.not.have.nested.property(prop);
2538
+ };
2539
+ assert.nestedPropertyVal = function(obj, prop, val, msg) {
2540
+ new Assertion(obj, msg, assert.nestedPropertyVal, true).to.have.nested.property(prop, val);
2541
+ };
2542
+ assert.notNestedPropertyVal = function(obj, prop, val, msg) {
2543
+ new Assertion(obj, msg, assert.notNestedPropertyVal, true).to.not.have.nested.property(prop, val);
2544
+ };
2545
+ assert.deepNestedPropertyVal = function(obj, prop, val, msg) {
2546
+ new Assertion(obj, msg, assert.deepNestedPropertyVal, true).to.have.deep.nested.property(prop, val);
2547
+ };
2548
+ assert.notDeepNestedPropertyVal = function(obj, prop, val, msg) {
2549
+ new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true).to.not.have.deep.nested.property(prop, val);
2550
+ };
2551
+ assert.lengthOf = function(exp, len, msg) {
2552
+ new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len);
2553
+ };
2554
+ assert.hasAnyKeys = function(obj, keys, msg) {
2555
+ new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys);
2556
+ };
2557
+ assert.hasAllKeys = function(obj, keys, msg) {
2558
+ new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys);
2559
+ };
2560
+ assert.containsAllKeys = function(obj, keys, msg) {
2561
+ new Assertion(obj, msg, assert.containsAllKeys, true).to.contain.all.keys(keys);
2562
+ };
2563
+ assert.doesNotHaveAnyKeys = function(obj, keys, msg) {
2564
+ new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true).to.not.have.any.keys(keys);
2565
+ };
2566
+ assert.doesNotHaveAllKeys = function(obj, keys, msg) {
2567
+ new Assertion(obj, msg, assert.doesNotHaveAllKeys, true).to.not.have.all.keys(keys);
2568
+ };
2569
+ assert.hasAnyDeepKeys = function(obj, keys, msg) {
2570
+ new Assertion(obj, msg, assert.hasAnyDeepKeys, true).to.have.any.deep.keys(keys);
2571
+ };
2572
+ assert.hasAllDeepKeys = function(obj, keys, msg) {
2573
+ new Assertion(obj, msg, assert.hasAllDeepKeys, true).to.have.all.deep.keys(keys);
2574
+ };
2575
+ assert.containsAllDeepKeys = function(obj, keys, msg) {
2576
+ new Assertion(obj, msg, assert.containsAllDeepKeys, true).to.contain.all.deep.keys(keys);
2577
+ };
2578
+ assert.doesNotHaveAnyDeepKeys = function(obj, keys, msg) {
2579
+ new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true).to.not.have.any.deep.keys(keys);
2580
+ };
2581
+ assert.doesNotHaveAllDeepKeys = function(obj, keys, msg) {
2582
+ new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true).to.not.have.all.deep.keys(keys);
2583
+ };
2584
+ assert.throws = function(fn, errorLike, errMsgMatcher, msg) {
2585
+ if ("string" === typeof errorLike || errorLike instanceof RegExp) {
2586
+ errMsgMatcher = errorLike;
2587
+ errorLike = null;
2588
+ }
2589
+ return flag(new Assertion(fn, msg, assert.throws, true).to.throw(errorLike, errMsgMatcher), "object");
2590
+ };
2591
+ assert.doesNotThrow = function(fn, errorLike, errMsgMatcher, message) {
2592
+ if ("string" === typeof errorLike || errorLike instanceof RegExp) {
2593
+ errMsgMatcher = errorLike;
2594
+ errorLike = null;
2595
+ }
2596
+ new Assertion(fn, message, assert.doesNotThrow, true).to.not.throw(errorLike, errMsgMatcher);
2597
+ };
2598
+ assert.operator = function(val, operator, val2, msg) {
2599
+ let ok;
2600
+ switch (operator) {
2601
+ case "==":
2602
+ ok = val == val2;
2603
+ break;
2604
+ case "===":
2605
+ ok = val === val2;
2606
+ break;
2607
+ case ">":
2608
+ ok = val > val2;
2609
+ break;
2610
+ case ">=":
2611
+ ok = val >= val2;
2612
+ break;
2613
+ case "<":
2614
+ ok = val < val2;
2615
+ break;
2616
+ case "<=":
2617
+ ok = val <= val2;
2618
+ break;
2619
+ case "!=":
2620
+ ok = val != val2;
2621
+ break;
2622
+ case "!==":
2623
+ ok = val !== val2;
2624
+ break;
2625
+ default:
2626
+ msg = msg ? msg + ": " : msg;
2627
+ throw new AssertionError(msg + "Invalid operator \"" + operator + "\"", void 0, assert.operator);
2628
+ }
2629
+ let test2 = new Assertion(ok, msg, assert.operator, true);
2630
+ test2.assert(true === flag(test2, "object"), "expected " + inspect2(val) + " to be " + operator + " " + inspect2(val2), "expected " + inspect2(val) + " to not be " + operator + " " + inspect2(val2));
2631
+ };
2632
+ assert.closeTo = function(act, exp, delta, msg) {
2633
+ new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta);
2634
+ };
2635
+ assert.approximately = function(act, exp, delta, msg) {
2636
+ new Assertion(act, msg, assert.approximately, true).to.be.approximately(exp, delta);
2637
+ };
2638
+ assert.sameMembers = function(set1, set2, msg) {
2639
+ new Assertion(set1, msg, assert.sameMembers, true).to.have.same.members(set2);
2640
+ };
2641
+ assert.notSameMembers = function(set1, set2, msg) {
2642
+ new Assertion(set1, msg, assert.notSameMembers, true).to.not.have.same.members(set2);
2643
+ };
2644
+ assert.sameDeepMembers = function(set1, set2, msg) {
2645
+ new Assertion(set1, msg, assert.sameDeepMembers, true).to.have.same.deep.members(set2);
2646
+ };
2647
+ assert.notSameDeepMembers = function(set1, set2, msg) {
2648
+ new Assertion(set1, msg, assert.notSameDeepMembers, true).to.not.have.same.deep.members(set2);
2649
+ };
2650
+ assert.sameOrderedMembers = function(set1, set2, msg) {
2651
+ new Assertion(set1, msg, assert.sameOrderedMembers, true).to.have.same.ordered.members(set2);
2652
+ };
2653
+ assert.notSameOrderedMembers = function(set1, set2, msg) {
2654
+ new Assertion(set1, msg, assert.notSameOrderedMembers, true).to.not.have.same.ordered.members(set2);
2655
+ };
2656
+ assert.sameDeepOrderedMembers = function(set1, set2, msg) {
2657
+ new Assertion(set1, msg, assert.sameDeepOrderedMembers, true).to.have.same.deep.ordered.members(set2);
2658
+ };
2659
+ assert.notSameDeepOrderedMembers = function(set1, set2, msg) {
2660
+ new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true).to.not.have.same.deep.ordered.members(set2);
2661
+ };
2662
+ assert.includeMembers = function(superset, subset, msg) {
2663
+ new Assertion(superset, msg, assert.includeMembers, true).to.include.members(subset);
2664
+ };
2665
+ assert.notIncludeMembers = function(superset, subset, msg) {
2666
+ new Assertion(superset, msg, assert.notIncludeMembers, true).to.not.include.members(subset);
2667
+ };
2668
+ assert.includeDeepMembers = function(superset, subset, msg) {
2669
+ new Assertion(superset, msg, assert.includeDeepMembers, true).to.include.deep.members(subset);
2670
+ };
2671
+ assert.notIncludeDeepMembers = function(superset, subset, msg) {
2672
+ new Assertion(superset, msg, assert.notIncludeDeepMembers, true).to.not.include.deep.members(subset);
2673
+ };
2674
+ assert.includeOrderedMembers = function(superset, subset, msg) {
2675
+ new Assertion(superset, msg, assert.includeOrderedMembers, true).to.include.ordered.members(subset);
2676
+ };
2677
+ assert.notIncludeOrderedMembers = function(superset, subset, msg) {
2678
+ new Assertion(superset, msg, assert.notIncludeOrderedMembers, true).to.not.include.ordered.members(subset);
2679
+ };
2680
+ assert.includeDeepOrderedMembers = function(superset, subset, msg) {
2681
+ new Assertion(superset, msg, assert.includeDeepOrderedMembers, true).to.include.deep.ordered.members(subset);
2682
+ };
2683
+ assert.notIncludeDeepOrderedMembers = function(superset, subset, msg) {
2684
+ new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true).to.not.include.deep.ordered.members(subset);
2685
+ };
2686
+ assert.oneOf = function(inList, list, msg) {
2687
+ new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list);
2688
+ };
2689
+ assert.isIterable = function(obj, msg) {
2690
+ if (obj == void 0 || !obj[Symbol.iterator]) {
2691
+ msg = msg ? `${msg} expected ${inspect2(obj)} to be an iterable` : `expected ${inspect2(obj)} to be an iterable`;
2692
+ throw new AssertionError(msg, void 0, assert.isIterable);
2693
+ }
2694
+ };
2695
+ assert.changes = function(fn, obj, prop, msg) {
2696
+ if (arguments.length === 3 && typeof obj === "function") {
2697
+ msg = prop;
2698
+ prop = null;
2699
+ }
2700
+ new Assertion(fn, msg, assert.changes, true).to.change(obj, prop);
2701
+ };
2702
+ assert.changesBy = function(fn, obj, prop, delta, msg) {
2703
+ if (arguments.length === 4 && typeof obj === "function") {
2704
+ let tmpMsg = delta;
2705
+ delta = prop;
2706
+ msg = tmpMsg;
2707
+ } else if (arguments.length === 3) {
2708
+ delta = prop;
2709
+ prop = null;
2710
+ }
2711
+ new Assertion(fn, msg, assert.changesBy, true).to.change(obj, prop).by(delta);
2712
+ };
2713
+ assert.doesNotChange = function(fn, obj, prop, msg) {
2714
+ if (arguments.length === 3 && typeof obj === "function") {
2715
+ msg = prop;
2716
+ prop = null;
2717
+ }
2718
+ return new Assertion(fn, msg, assert.doesNotChange, true).to.not.change(obj, prop);
2719
+ };
2720
+ assert.changesButNotBy = function(fn, obj, prop, delta, msg) {
2721
+ if (arguments.length === 4 && typeof obj === "function") {
2722
+ let tmpMsg = delta;
2723
+ delta = prop;
2724
+ msg = tmpMsg;
2725
+ } else if (arguments.length === 3) {
2726
+ delta = prop;
2727
+ prop = null;
2728
+ }
2729
+ new Assertion(fn, msg, assert.changesButNotBy, true).to.change(obj, prop).but.not.by(delta);
2730
+ };
2731
+ assert.increases = function(fn, obj, prop, msg) {
2732
+ if (arguments.length === 3 && typeof obj === "function") {
2733
+ msg = prop;
2734
+ prop = null;
2735
+ }
2736
+ return new Assertion(fn, msg, assert.increases, true).to.increase(obj, prop);
2737
+ };
2738
+ assert.increasesBy = function(fn, obj, prop, delta, msg) {
2739
+ if (arguments.length === 4 && typeof obj === "function") {
2740
+ let tmpMsg = delta;
2741
+ delta = prop;
2742
+ msg = tmpMsg;
2743
+ } else if (arguments.length === 3) {
2744
+ delta = prop;
2745
+ prop = null;
2746
+ }
2747
+ new Assertion(fn, msg, assert.increasesBy, true).to.increase(obj, prop).by(delta);
2748
+ };
2749
+ assert.doesNotIncrease = function(fn, obj, prop, msg) {
2750
+ if (arguments.length === 3 && typeof obj === "function") {
2751
+ msg = prop;
2752
+ prop = null;
2753
+ }
2754
+ return new Assertion(fn, msg, assert.doesNotIncrease, true).to.not.increase(obj, prop);
2755
+ };
2756
+ assert.increasesButNotBy = function(fn, obj, prop, delta, msg) {
2757
+ if (arguments.length === 4 && typeof obj === "function") {
2758
+ let tmpMsg = delta;
2759
+ delta = prop;
2760
+ msg = tmpMsg;
2761
+ } else if (arguments.length === 3) {
2762
+ delta = prop;
2763
+ prop = null;
2764
+ }
2765
+ new Assertion(fn, msg, assert.increasesButNotBy, true).to.increase(obj, prop).but.not.by(delta);
2766
+ };
2767
+ assert.decreases = function(fn, obj, prop, msg) {
2768
+ if (arguments.length === 3 && typeof obj === "function") {
2769
+ msg = prop;
2770
+ prop = null;
2771
+ }
2772
+ return new Assertion(fn, msg, assert.decreases, true).to.decrease(obj, prop);
2773
+ };
2774
+ assert.decreasesBy = function(fn, obj, prop, delta, msg) {
2775
+ if (arguments.length === 4 && typeof obj === "function") {
2776
+ let tmpMsg = delta;
2777
+ delta = prop;
2778
+ msg = tmpMsg;
2779
+ } else if (arguments.length === 3) {
2780
+ delta = prop;
2781
+ prop = null;
2782
+ }
2783
+ new Assertion(fn, msg, assert.decreasesBy, true).to.decrease(obj, prop).by(delta);
2784
+ };
2785
+ assert.doesNotDecrease = function(fn, obj, prop, msg) {
2786
+ if (arguments.length === 3 && typeof obj === "function") {
2787
+ msg = prop;
2788
+ prop = null;
2789
+ }
2790
+ return new Assertion(fn, msg, assert.doesNotDecrease, true).to.not.decrease(obj, prop);
2791
+ };
2792
+ assert.doesNotDecreaseBy = function(fn, obj, prop, delta, msg) {
2793
+ if (arguments.length === 4 && typeof obj === "function") {
2794
+ let tmpMsg = delta;
2795
+ delta = prop;
2796
+ msg = tmpMsg;
2797
+ } else if (arguments.length === 3) {
2798
+ delta = prop;
2799
+ prop = null;
2800
+ }
2801
+ return new Assertion(fn, msg, assert.doesNotDecreaseBy, true).to.not.decrease(obj, prop).by(delta);
2802
+ };
2803
+ assert.decreasesButNotBy = function(fn, obj, prop, delta, msg) {
2804
+ if (arguments.length === 4 && typeof obj === "function") {
2805
+ let tmpMsg = delta;
2806
+ delta = prop;
2807
+ msg = tmpMsg;
2808
+ } else if (arguments.length === 3) {
2809
+ delta = prop;
2810
+ prop = null;
2811
+ }
2812
+ new Assertion(fn, msg, assert.decreasesButNotBy, true).to.decrease(obj, prop).but.not.by(delta);
2813
+ };
2814
+ assert.ifError = function(val) {
2815
+ if (val) throw val;
2816
+ };
2817
+ assert.isExtensible = function(obj, msg) {
2818
+ new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible;
2819
+ };
2820
+ assert.isNotExtensible = function(obj, msg) {
2821
+ new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible;
2822
+ };
2823
+ assert.isSealed = function(obj, msg) {
2824
+ new Assertion(obj, msg, assert.isSealed, true).to.be.sealed;
2825
+ };
2826
+ assert.isNotSealed = function(obj, msg) {
2827
+ new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed;
2828
+ };
2829
+ assert.isFrozen = function(obj, msg) {
2830
+ new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen;
2831
+ };
2832
+ assert.isNotFrozen = function(obj, msg) {
2833
+ new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen;
2834
+ };
2835
+ assert.isEmpty = function(val, msg) {
2836
+ new Assertion(val, msg, assert.isEmpty, true).to.be.empty;
2837
+ };
2838
+ assert.isNotEmpty = function(val, msg) {
2839
+ new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty;
2840
+ };
2841
+ assert.containsSubset = function(val, exp, msg) {
2842
+ new Assertion(val, msg).to.containSubset(exp);
2843
+ };
2844
+ assert.doesNotContainSubset = function(val, exp, msg) {
2845
+ new Assertion(val, msg).to.not.containSubset(exp);
2846
+ };
2847
+ for (const [name, as] of [
2848
+ ["isOk", "ok"],
2849
+ ["isNotOk", "notOk"],
2850
+ ["throws", "throw"],
2851
+ ["throws", "Throw"],
2852
+ ["isExtensible", "extensible"],
2853
+ ["isNotExtensible", "notExtensible"],
2854
+ ["isSealed", "sealed"],
2855
+ ["isNotSealed", "notSealed"],
2856
+ ["isFrozen", "frozen"],
2857
+ ["isNotFrozen", "notFrozen"],
2858
+ ["isEmpty", "empty"],
2859
+ ["isNotEmpty", "notEmpty"],
2860
+ ["isCallable", "isFunction"],
2861
+ ["isNotCallable", "isNotFunction"],
2862
+ ["containsSubset", "containSubset"]
2863
+ ]) assert[as] = assert[name];
2864
+ var used = [];
2865
+ function use(fn) {
2866
+ const exports = {
2867
+ use,
2868
+ AssertionError,
2869
+ util: utils_exports,
2870
+ config,
2871
+ expect,
2872
+ assert,
2873
+ Assertion,
2874
+ ...should_exports
2875
+ };
2876
+ if (!~used.indexOf(fn)) {
2877
+ fn(exports, utils_exports);
2878
+ used.push(fn);
2879
+ }
2880
+ return exports;
2881
+ }
2882
+ __name(use, "use");
2883
+ //#endregion
2884
+ export { Assertion, assert, chai_exports, expect, should, use, utils_exports };
2885
+
2886
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANi4yLjIvbm9kZV9tb2R1bGVzL2NoYWkvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX25hbWUgPSAodGFyZ2V0LCB2YWx1ZSkgPT4gX19kZWZQcm9wKHRhcmdldCwgXCJuYW1lXCIsIHsgdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbCkgPT4ge1xuICBmb3IgKHZhciBuYW1lIGluIGFsbClcbiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xufTtcbnZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4gX19kZWZOb3JtYWxQcm9wKG9iaiwgdHlwZW9mIGtleSAhPT0gXCJzeW1ib2xcIiA/IGtleSArIFwiXCIgOiBrZXksIHZhbHVlKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvaW5kZXguanNcbnZhciB1dGlsc19leHBvcnRzID0ge307XG5fX2V4cG9ydCh1dGlsc19leHBvcnRzLCB7XG4gIGFkZENoYWluYWJsZU1ldGhvZDogKCkgPT4gYWRkQ2hhaW5hYmxlTWV0aG9kLFxuICBhZGRMZW5ndGhHdWFyZDogKCkgPT4gYWRkTGVuZ3RoR3VhcmQsXG4gIGFkZE1ldGhvZDogKCkgPT4gYWRkTWV0aG9kLFxuICBhZGRQcm9wZXJ0eTogKCkgPT4gYWRkUHJvcGVydHksXG4gIGNoZWNrRXJyb3I6ICgpID0+IGNoZWNrX2Vycm9yX2V4cG9ydHMsXG4gIGNvbXBhcmVCeUluc3BlY3Q6ICgpID0+IGNvbXBhcmVCeUluc3BlY3QsXG4gIGVxbDogKCkgPT4gZGVlcF9lcWxfZGVmYXVsdCxcbiAgZXZlbnRzOiAoKSA9PiBldmVudHMsXG4gIGV4cGVjdFR5cGVzOiAoKSA9PiBleHBlY3RUeXBlcyxcbiAgZmxhZzogKCkgPT4gZmxhZyxcbiAgZ2V0QWN0dWFsOiAoKSA9PiBnZXRBY3R1YWwsXG4gIGdldE1lc3NhZ2U6ICgpID0+IGdldE1lc3NhZ2UyLFxuICBnZXROYW1lOiAoKSA9PiBnZXROYW1lLFxuICBnZXRPcGVyYXRvcjogKCkgPT4gZ2V0T3BlcmF0b3IsXG4gIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzOiAoKSA9PiBnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyxcbiAgZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9sczogKCkgPT4gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyxcbiAgZ2V0UGF0aEluZm86ICgpID0+IGdldFBhdGhJbmZvLFxuICBoYXNQcm9wZXJ0eTogKCkgPT4gaGFzUHJvcGVydHksXG4gIGluc3BlY3Q6ICgpID0+IGluc3BlY3QyLFxuICBpc05hTjogKCkgPT4gaXNOYU4yLFxuICBpc051bWVyaWM6ICgpID0+IGlzTnVtZXJpYyxcbiAgaXNQcm94eUVuYWJsZWQ6ICgpID0+IGlzUHJveHlFbmFibGVkLFxuICBpc1JlZ0V4cDogKCkgPT4gaXNSZWdFeHAyLFxuICBvYmpEaXNwbGF5OiAoKSA9PiBvYmpEaXNwbGF5LFxuICBvdmVyd3JpdGVDaGFpbmFibGVNZXRob2Q6ICgpID0+IG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCxcbiAgb3ZlcndyaXRlTWV0aG9kOiAoKSA9PiBvdmVyd3JpdGVNZXRob2QsXG4gIG92ZXJ3cml0ZVByb3BlcnR5OiAoKSA9PiBvdmVyd3JpdGVQcm9wZXJ0eSxcbiAgcHJveGlmeTogKCkgPT4gcHJveGlmeSxcbiAgdGVzdDogKCkgPT4gdGVzdCxcbiAgdHJhbnNmZXJGbGFnczogKCkgPT4gdHJhbnNmZXJGbGFncyxcbiAgdHlwZTogKCkgPT4gdHlwZVxufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9jaGVjay1lcnJvci9pbmRleC5qc1xudmFyIGNoZWNrX2Vycm9yX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGNoZWNrX2Vycm9yX2V4cG9ydHMsIHtcbiAgY29tcGF0aWJsZUNvbnN0cnVjdG9yOiAoKSA9PiBjb21wYXRpYmxlQ29uc3RydWN0b3IsXG4gIGNvbXBhdGlibGVJbnN0YW5jZTogKCkgPT4gY29tcGF0aWJsZUluc3RhbmNlLFxuICBjb21wYXRpYmxlTWVzc2FnZTogKCkgPT4gY29tcGF0aWJsZU1lc3NhZ2UsXG4gIGdldENvbnN0cnVjdG9yTmFtZTogKCkgPT4gZ2V0Q29uc3RydWN0b3JOYW1lLFxuICBnZXRNZXNzYWdlOiAoKSA9PiBnZXRNZXNzYWdlXG59KTtcbmZ1bmN0aW9uIGlzRXJyb3JJbnN0YW5jZShvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEVycm9yIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgRXJyb3JdXCI7XG59XG5fX25hbWUoaXNFcnJvckluc3RhbmNlLCBcImlzRXJyb3JJbnN0YW5jZVwiKTtcbmZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBSZWdFeHBdXCI7XG59XG5fX25hbWUoaXNSZWdFeHAsIFwiaXNSZWdFeHBcIik7XG5mdW5jdGlvbiBjb21wYXRpYmxlSW5zdGFuY2UodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgcmV0dXJuIGlzRXJyb3JJbnN0YW5jZShlcnJvckxpa2UpICYmIHRocm93biA9PT0gZXJyb3JMaWtlO1xufVxuX19uYW1lKGNvbXBhdGlibGVJbnN0YW5jZSwgXCJjb21wYXRpYmxlSW5zdGFuY2VcIik7XG5mdW5jdGlvbiBjb21wYXRpYmxlQ29uc3RydWN0b3IodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgaWYgKGlzRXJyb3JJbnN0YW5jZShlcnJvckxpa2UpKSB7XG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlLmNvbnN0cnVjdG9yIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZS5jb25zdHJ1Y3RvcjtcbiAgfSBlbHNlIGlmICgodHlwZW9mIGVycm9yTGlrZSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZXJyb3JMaWtlID09PSBcImZ1bmN0aW9uXCIpICYmIGVycm9yTGlrZS5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gdGhyb3duLmNvbnN0cnVjdG9yID09PSBlcnJvckxpa2UgfHwgdGhyb3duIGluc3RhbmNlb2YgZXJyb3JMaWtlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbl9fbmFtZShjb21wYXRpYmxlQ29uc3RydWN0b3IsIFwiY29tcGF0aWJsZUNvbnN0cnVjdG9yXCIpO1xuZnVuY3Rpb24gY29tcGF0aWJsZU1lc3NhZ2UodGhyb3duLCBlcnJNYXRjaGVyKSB7XG4gIGNvbnN0IGNvbXBhcmlzb25TdHJpbmcgPSB0eXBlb2YgdGhyb3duID09PSBcInN0cmluZ1wiID8gdGhyb3duIDogdGhyb3duLm1lc3NhZ2U7XG4gIGlmIChpc1JlZ0V4cChlcnJNYXRjaGVyKSkge1xuICAgIHJldHVybiBlcnJNYXRjaGVyLnRlc3QoY29tcGFyaXNvblN0cmluZyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVyck1hdGNoZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29tcGFyaXNvblN0cmluZy5pbmRleE9mKGVyck1hdGNoZXIpICE9PSAtMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5fX25hbWUoY29tcGF0aWJsZU1lc3NhZ2UsIFwiY29tcGF0aWJsZU1lc3NhZ2VcIik7XG5mdW5jdGlvbiBnZXRDb25zdHJ1Y3Rvck5hbWUoZXJyb3JMaWtlKSB7XG4gIGxldCBjb25zdHJ1Y3Rvck5hbWUgPSBlcnJvckxpa2U7XG4gIGlmIChpc0Vycm9ySW5zdGFuY2UoZXJyb3JMaWtlKSkge1xuICAgIGNvbnN0cnVjdG9yTmFtZSA9IGVycm9yTGlrZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlcnJvckxpa2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0cnVjdG9yTmFtZSA9IGVycm9yTGlrZS5uYW1lO1xuICAgIGlmIChjb25zdHJ1Y3Rvck5hbWUgPT09IFwiXCIpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnN0cnVjdG9yTmFtZSA9IG5ldyBlcnJvckxpa2UoKS5uYW1lO1xuICAgICAgY29uc3RydWN0b3JOYW1lID0gbmV3Q29uc3RydWN0b3JOYW1lIHx8IGNvbnN0cnVjdG9yTmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbn1cbl9fbmFtZShnZXRDb25zdHJ1Y3Rvck5hbWUsIFwiZ2V0Q29uc3RydWN0b3JOYW1lXCIpO1xuZnVuY3Rpb24gZ2V0TWVzc2FnZShlcnJvckxpa2UpIHtcbiAgbGV0IG1zZyA9IFwiXCI7XG4gIGlmIChlcnJvckxpa2UgJiYgZXJyb3JMaWtlLm1lc3NhZ2UpIHtcbiAgICBtc2cgPSBlcnJvckxpa2UubWVzc2FnZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3JMaWtlID09PSBcInN0cmluZ1wiKSB7XG4gICAgbXNnID0gZXJyb3JMaWtlO1xuICB9XG4gIHJldHVybiBtc2c7XG59XG5fX25hbWUoZ2V0TWVzc2FnZSwgXCJnZXRNZXNzYWdlXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9mbGFnLmpzXG5mdW5jdGlvbiBmbGFnKG9iaiwga2V5LCB2YWx1ZSkge1xuICBsZXQgZmxhZ3MgPSBvYmouX19mbGFncyB8fCAob2JqLl9fZmxhZ3MgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZmxhZ3Nba2V5XSA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmbGFnc1trZXldO1xuICB9XG59XG5fX25hbWUoZmxhZywgXCJmbGFnXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy90ZXN0LmpzXG5mdW5jdGlvbiB0ZXN0KG9iaiwgYXJncykge1xuICBsZXQgbmVnYXRlID0gZmxhZyhvYmosIFwibmVnYXRlXCIpLCBleHByID0gYXJnc1swXTtcbiAgcmV0dXJuIG5lZ2F0ZSA/ICFleHByIDogZXhwcjtcbn1cbl9fbmFtZSh0ZXN0LCBcInRlc3RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL3R5cGUtZGV0ZWN0LmpzXG5mdW5jdGlvbiB0eXBlKG9iaikge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICB9XG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIH1cbiAgY29uc3Qgc3RyaW5nVGFnID0gb2JqW1N5bWJvbC50b1N0cmluZ1RhZ107XG4gIGlmICh0eXBlb2Ygc3RyaW5nVGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHN0cmluZ1RhZztcbiAgfVxuICBjb25zdCB0eXBlMyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnNsaWNlKDgsIC0xKTtcbiAgcmV0dXJuIHR5cGUzO1xufVxuX19uYW1lKHR5cGUsIFwidHlwZVwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2Fzc2VydGlvbi1lcnJvci9pbmRleC5qc1xudmFyIGNhbkVsaWRlRnJhbWVzID0gXCJjYXB0dXJlU3RhY2tUcmFjZVwiIGluIEVycm9yO1xudmFyIF9Bc3NlcnRpb25FcnJvciA9IGNsYXNzIF9Bc3NlcnRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9IFwiVW5zcGVjaWZpZWQgQXNzZXJ0aW9uRXJyb3JcIiwgcHJvcHMsIHNzZikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIF9fcHVibGljRmllbGQodGhpcywgXCJtZXNzYWdlXCIpO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgaWYgKGNhbkVsaWRlRnJhbWVzKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBzc2YgfHwgX0Fzc2VydGlvbkVycm9yKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIGlmICghKGtleSBpbiB0aGlzKSkge1xuICAgICAgICB0aGlzW2tleV0gPSBwcm9wc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gXCJBc3NlcnRpb25FcnJvclwiO1xuICB9XG4gIGdldCBvaygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdG9KU09OKHN0YWNrKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBvazogZmFsc2UsXG4gICAgICBzdGFjazogc3RhY2sgIT09IGZhbHNlID8gdGhpcy5zdGFjayA6IHZvaWQgMFxuICAgIH07XG4gIH1cbn07XG5fX25hbWUoX0Fzc2VydGlvbkVycm9yLCBcIkFzc2VydGlvbkVycm9yXCIpO1xudmFyIEFzc2VydGlvbkVycm9yID0gX0Fzc2VydGlvbkVycm9yO1xuXG4vLyBsaWIvY2hhaS91dGlscy9leHBlY3RUeXBlcy5qc1xuZnVuY3Rpb24gZXhwZWN0VHlwZXMob2JqLCB0eXBlcykge1xuICBsZXQgZmxhZ01zZyA9IGZsYWcob2JqLCBcIm1lc3NhZ2VcIik7XG4gIGxldCBzc2ZpID0gZmxhZyhvYmosIFwic3NmaVwiKTtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgb2JqID0gZmxhZyhvYmosIFwib2JqZWN0XCIpO1xuICB0eXBlcyA9IHR5cGVzLm1hcChmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTtcbiAgfSk7XG4gIHR5cGVzLnNvcnQoKTtcbiAgbGV0IHN0ciA9IHR5cGVzLm1hcChmdW5jdGlvbih0LCBpbmRleCkge1xuICAgIGxldCBhcnQgPSB+W1wiYVwiLCBcImVcIiwgXCJpXCIsIFwib1wiLCBcInVcIl0uaW5kZXhPZih0LmNoYXJBdCgwKSkgPyBcImFuXCIgOiBcImFcIjtcbiAgICBsZXQgb3IgPSB0eXBlcy5sZW5ndGggPiAxICYmIGluZGV4ID09PSB0eXBlcy5sZW5ndGggLSAxID8gXCJvciBcIiA6IFwiXCI7XG4gICAgcmV0dXJuIG9yICsgYXJ0ICsgXCIgXCIgKyB0O1xuICB9KS5qb2luKFwiLCBcIik7XG4gIGxldCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghdHlwZXMuc29tZShmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiBvYmpUeXBlID09PSBleHBlY3RlZDtcbiAgfSkpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnICsgXCJvYmplY3QgdGVzdGVkIG11c3QgYmUgXCIgKyBzdHIgKyBcIiwgYnV0IFwiICsgb2JqVHlwZSArIFwiIGdpdmVuXCIsXG4gICAgICB2b2lkIDAsXG4gICAgICBzc2ZpXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGV4cGVjdFR5cGVzLCBcImV4cGVjdFR5cGVzXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9nZXRBY3R1YWwuanNcbmZ1bmN0aW9uIGdldEFjdHVhbChvYmosIGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID4gNCA/IGFyZ3NbNF0gOiBvYmouX29iajtcbn1cbl9fbmFtZShnZXRBY3R1YWwsIFwiZ2V0QWN0dWFsXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2hlbHBlcnMuanNcbnZhciBhbnNpQ29sb3JzID0ge1xuICBib2xkOiBbXCIxXCIsIFwiMjJcIl0sXG4gIGRpbTogW1wiMlwiLCBcIjIyXCJdLFxuICBpdGFsaWM6IFtcIjNcIiwgXCIyM1wiXSxcbiAgdW5kZXJsaW5lOiBbXCI0XCIsIFwiMjRcIl0sXG4gIC8vIDUgJiA2IGFyZSBibGlua2luZ1xuICBpbnZlcnNlOiBbXCI3XCIsIFwiMjdcIl0sXG4gIGhpZGRlbjogW1wiOFwiLCBcIjI4XCJdLFxuICBzdHJpa2U6IFtcIjlcIiwgXCIyOVwiXSxcbiAgLy8gMTAtMjAgYXJlIGZvbnRzXG4gIC8vIDIxLTI5IGFyZSByZXNldHMgZm9yIDEtOVxuICBibGFjazogW1wiMzBcIiwgXCIzOVwiXSxcbiAgcmVkOiBbXCIzMVwiLCBcIjM5XCJdLFxuICBncmVlbjogW1wiMzJcIiwgXCIzOVwiXSxcbiAgeWVsbG93OiBbXCIzM1wiLCBcIjM5XCJdLFxuICBibHVlOiBbXCIzNFwiLCBcIjM5XCJdLFxuICBtYWdlbnRhOiBbXCIzNVwiLCBcIjM5XCJdLFxuICBjeWFuOiBbXCIzNlwiLCBcIjM5XCJdLFxuICB3aGl0ZTogW1wiMzdcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0YmxhY2s6IFtcIjMwOzFcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0cmVkOiBbXCIzMTsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodGdyZWVuOiBbXCIzMjsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodHllbGxvdzogW1wiMzM7MVwiLCBcIjM5XCJdLFxuICBicmlnaHRibHVlOiBbXCIzNDsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodG1hZ2VudGE6IFtcIjM1OzFcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0Y3lhbjogW1wiMzY7MVwiLCBcIjM5XCJdLFxuICBicmlnaHR3aGl0ZTogW1wiMzc7MVwiLCBcIjM5XCJdLFxuICBncmV5OiBbXCI5MFwiLCBcIjM5XCJdXG59O1xudmFyIHN0eWxlcyA9IHtcbiAgc3BlY2lhbDogXCJjeWFuXCIsXG4gIG51bWJlcjogXCJ5ZWxsb3dcIixcbiAgYmlnaW50OiBcInllbGxvd1wiLFxuICBib29sZWFuOiBcInllbGxvd1wiLFxuICB1bmRlZmluZWQ6IFwiZ3JleVwiLFxuICBudWxsOiBcImJvbGRcIixcbiAgc3RyaW5nOiBcImdyZWVuXCIsXG4gIHN5bWJvbDogXCJncmVlblwiLFxuICBkYXRlOiBcIm1hZ2VudGFcIixcbiAgcmVnZXhwOiBcInJlZFwiXG59O1xudmFyIHRydW5jYXRvciA9IFwiXFx1MjAyNlwiO1xuZnVuY3Rpb24gY29sb3Jpc2UodmFsdWUsIHN0eWxlVHlwZSkge1xuICBjb25zdCBjb2xvciA9IGFuc2lDb2xvcnNbc3R5bGVzW3N0eWxlVHlwZV1dIHx8IGFuc2lDb2xvcnNbc3R5bGVUeXBlXSB8fCBcIlwiO1xuICBpZiAoIWNvbG9yKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGBcXHgxQlske2NvbG9yWzBdfW0ke1N0cmluZyh2YWx1ZSl9XFx4MUJbJHtjb2xvclsxXX1tYDtcbn1cbl9fbmFtZShjb2xvcmlzZSwgXCJjb2xvcmlzZVwiKTtcbmZ1bmN0aW9uIG5vcm1hbGlzZU9wdGlvbnMoe1xuICBzaG93SGlkZGVuID0gZmFsc2UsXG4gIGRlcHRoID0gMixcbiAgY29sb3JzID0gZmFsc2UsXG4gIGN1c3RvbUluc3BlY3QgPSB0cnVlLFxuICBzaG93UHJveHkgPSBmYWxzZSxcbiAgbWF4QXJyYXlMZW5ndGggPSBJbmZpbml0eSxcbiAgYnJlYWtMZW5ndGggPSBJbmZpbml0eSxcbiAgc2VlbiA9IFtdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHRydW5jYXRlOiB0cnVuY2F0ZTIgPSBJbmZpbml0eSxcbiAgc3R5bGl6ZSA9IFN0cmluZ1xufSA9IHt9LCBpbnNwZWN0Mykge1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIHNob3dIaWRkZW46IEJvb2xlYW4oc2hvd0hpZGRlbiksXG4gICAgZGVwdGg6IE51bWJlcihkZXB0aCksXG4gICAgY29sb3JzOiBCb29sZWFuKGNvbG9ycyksXG4gICAgY3VzdG9tSW5zcGVjdDogQm9vbGVhbihjdXN0b21JbnNwZWN0KSxcbiAgICBzaG93UHJveHk6IEJvb2xlYW4oc2hvd1Byb3h5KSxcbiAgICBtYXhBcnJheUxlbmd0aDogTnVtYmVyKG1heEFycmF5TGVuZ3RoKSxcbiAgICBicmVha0xlbmd0aDogTnVtYmVyKGJyZWFrTGVuZ3RoKSxcbiAgICB0cnVuY2F0ZTogTnVtYmVyKHRydW5jYXRlMiksXG4gICAgc2VlbixcbiAgICBpbnNwZWN0OiBpbnNwZWN0MyxcbiAgICBzdHlsaXplXG4gIH07XG4gIGlmIChvcHRpb25zLmNvbG9ycykge1xuICAgIG9wdGlvbnMuc3R5bGl6ZSA9IGNvbG9yaXNlO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufVxuX19uYW1lKG5vcm1hbGlzZU9wdGlvbnMsIFwibm9ybWFsaXNlT3B0aW9uc1wiKTtcbmZ1bmN0aW9uIGlzSGlnaFN1cnJvZ2F0ZShjaGFyKSB7XG4gIHJldHVybiBjaGFyID49IFwiXFx1RDgwMFwiICYmIGNoYXIgPD0gXCJcXHVEQkZGXCI7XG59XG5fX25hbWUoaXNIaWdoU3Vycm9nYXRlLCBcImlzSGlnaFN1cnJvZ2F0ZVwiKTtcbmZ1bmN0aW9uIHRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCB0YWlsID0gdHJ1bmNhdG9yKSB7XG4gIHN0cmluZyA9IFN0cmluZyhzdHJpbmcpO1xuICBjb25zdCB0YWlsTGVuZ3RoID0gdGFpbC5sZW5ndGg7XG4gIGNvbnN0IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIGlmICh0YWlsTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICByZXR1cm4gdGFpbDtcbiAgfVxuICBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICBsZXQgZW5kID0gbGVuZ3RoIC0gdGFpbExlbmd0aDtcbiAgICBpZiAoZW5kID4gMCAmJiBpc0hpZ2hTdXJyb2dhdGUoc3RyaW5nW2VuZCAtIDFdKSkge1xuICAgICAgZW5kID0gZW5kIC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGAke3N0cmluZy5zbGljZSgwLCBlbmQpfSR7dGFpbH1gO1xuICB9XG4gIHJldHVybiBzdHJpbmc7XG59XG5fX25hbWUodHJ1bmNhdGUsIFwidHJ1bmNhdGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0TGlzdChsaXN0LCBvcHRpb25zLCBpbnNwZWN0SXRlbSwgc2VwYXJhdG9yID0gXCIsIFwiKSB7XG4gIGluc3BlY3RJdGVtID0gaW5zcGVjdEl0ZW0gfHwgb3B0aW9ucy5pbnNwZWN0O1xuICBjb25zdCBzaXplID0gbGlzdC5sZW5ndGg7XG4gIGlmIChzaXplID09PSAwKVxuICAgIHJldHVybiBcIlwiO1xuICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IG9wdGlvbnMudHJ1bmNhdGU7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBsZXQgcGVlayA9IFwiXCI7XG4gIGxldCB0cnVuY2F0ZWQgPSBcIlwiO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMSkge1xuICAgIGNvbnN0IGxhc3QgPSBpICsgMSA9PT0gbGlzdC5sZW5ndGg7XG4gICAgY29uc3Qgc2Vjb25kVG9MYXN0ID0gaSArIDIgPT09IGxpc3QubGVuZ3RoO1xuICAgIHRydW5jYXRlZCA9IGAke3RydW5jYXRvcn0oJHtsaXN0Lmxlbmd0aCAtIGl9KWA7XG4gICAgY29uc3QgdmFsdWUgPSBsaXN0W2ldO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgPSBvcmlnaW5hbExlbmd0aCAtIG91dHB1dC5sZW5ndGggLSAobGFzdCA/IDAgOiBzZXBhcmF0b3IubGVuZ3RoKTtcbiAgICBjb25zdCBzdHJpbmcgPSBwZWVrIHx8IGluc3BlY3RJdGVtKHZhbHVlLCBvcHRpb25zKSArIChsYXN0ID8gXCJcIiA6IHNlcGFyYXRvcik7XG4gICAgY29uc3QgbmV4dExlbmd0aCA9IG91dHB1dC5sZW5ndGggKyBzdHJpbmcubGVuZ3RoO1xuICAgIGNvbnN0IHRydW5jYXRlZExlbmd0aCA9IG5leHRMZW5ndGggKyB0cnVuY2F0ZWQubGVuZ3RoO1xuICAgIGlmIChsYXN0ICYmIG5leHRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCAmJiBvdXRwdXQubGVuZ3RoICsgdHJ1bmNhdGVkLmxlbmd0aCA8PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIHRydW5jYXRlZExlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcGVlayA9IGxhc3QgPyBcIlwiIDogaW5zcGVjdEl0ZW0obGlzdFtpICsgMV0sIG9wdGlvbnMpICsgKHNlY29uZFRvTGFzdCA/IFwiXCIgOiBzZXBhcmF0b3IpO1xuICAgIGlmICghbGFzdCAmJiBzZWNvbmRUb0xhc3QgJiYgdHJ1bmNhdGVkTGVuZ3RoID4gb3JpZ2luYWxMZW5ndGggJiYgbmV4dExlbmd0aCArIHBlZWsubGVuZ3RoID4gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvdXRwdXQgKz0gc3RyaW5nO1xuICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIG5leHRMZW5ndGggKyBwZWVrLmxlbmd0aCA+PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgdHJ1bmNhdGVkID0gYCR7dHJ1bmNhdG9yfSgke2xpc3QubGVuZ3RoIC0gaSAtIDF9KWA7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdHJ1bmNhdGVkID0gXCJcIjtcbiAgfVxuICByZXR1cm4gYCR7b3V0cHV0fSR7dHJ1bmNhdGVkfWA7XG59XG5fX25hbWUoaW5zcGVjdExpc3QsIFwiaW5zcGVjdExpc3RcIik7XG5mdW5jdGlvbiBxdW90ZUNvbXBsZXhLZXkoa2V5KSB7XG4gIGlmIChrZXkubWF0Y2goL15bYS16QS1aX11bYS16QS1aXzAtOV0qJC8pKSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoa2V5KS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIikucmVwbGFjZSgvXFxcXFwiL2csICdcIicpLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG59XG5fX25hbWUocXVvdGVDb21wbGV4S2V5LCBcInF1b3RlQ29tcGxleEtleVwiKTtcbmZ1bmN0aW9uIGluc3BlY3RQcm9wZXJ0eShba2V5LCB2YWx1ZV0sIG9wdGlvbnMpIHtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSAyO1xuICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGtleSA9IHF1b3RlQ29tcGxleEtleShrZXkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgIT09IFwibnVtYmVyXCIpIHtcbiAgICBrZXkgPSBgWyR7b3B0aW9ucy5pbnNwZWN0KGtleSwgb3B0aW9ucyl9XWA7XG4gIH1cbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBrZXkubGVuZ3RoO1xuICB2YWx1ZSA9IG9wdGlvbnMuaW5zcGVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIHJldHVybiBgJHtrZXl9OiAke3ZhbHVlfWA7XG59XG5fX25hbWUoaW5zcGVjdFByb3BlcnR5LCBcImluc3BlY3RQcm9wZXJ0eVwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9hcnJheS5qc1xuZnVuY3Rpb24gaW5zcGVjdEFycmF5KGFycmF5LCBvcHRpb25zKSB7XG4gIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICBpZiAoIWFycmF5Lmxlbmd0aCAmJiAhbm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aClcbiAgICByZXR1cm4gXCJbXVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDQ7XG4gIGNvbnN0IGxpc3RDb250ZW50cyA9IGluc3BlY3RMaXN0KGFycmF5LCBvcHRpb25zKTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBsaXN0Q29udGVudHMubGVuZ3RoO1xuICBsZXQgcHJvcGVydHlDb250ZW50cyA9IFwiXCI7XG4gIGlmIChub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgcHJvcGVydHlDb250ZW50cyA9IGluc3BlY3RMaXN0KG5vbkluZGV4UHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgYXJyYXlba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICB9XG4gIHJldHVybiBgWyAke2xpc3RDb250ZW50c30ke3Byb3BlcnR5Q29udGVudHMgPyBgLCAke3Byb3BlcnR5Q29udGVudHN9YCA6IFwiXCJ9IF1gO1xufVxuX19uYW1lKGluc3BlY3RBcnJheSwgXCJpbnNwZWN0QXJyYXlcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvdHlwZWRhcnJheS5qc1xudmFyIGdldEFycmF5TmFtZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGFycmF5KSA9PiB7XG4gIGlmICh0eXBlb2YgQnVmZmVyID09PSBcImZ1bmN0aW9uXCIgJiYgYXJyYXkgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gXCJCdWZmZXJcIjtcbiAgfVxuICBpZiAoYXJyYXlbU3ltYm9sLnRvU3RyaW5nVGFnXSkge1xuICAgIHJldHVybiBhcnJheVtTeW1ib2wudG9TdHJpbmdUYWddO1xuICB9XG4gIHJldHVybiBhcnJheS5jb25zdHJ1Y3Rvci5uYW1lO1xufSwgXCJnZXRBcnJheU5hbWVcIik7XG5mdW5jdGlvbiBpbnNwZWN0VHlwZWRBcnJheShhcnJheSwgb3B0aW9ucykge1xuICBjb25zdCBuYW1lID0gZ2V0QXJyYXlOYW1lKGFycmF5KTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aCArIDQ7XG4gIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICBpZiAoIWFycmF5Lmxlbmd0aCAmJiAhbm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aClcbiAgICByZXR1cm4gYCR7bmFtZX1bXWA7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RyaW5nID0gYCR7b3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKGFycmF5W2ldLCBvcHRpb25zLnRydW5jYXRlKSwgXCJudW1iZXJcIil9JHtpID09PSBhcnJheS5sZW5ndGggLSAxID8gXCJcIiA6IFwiLCBcIn1gO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gc3RyaW5nLmxlbmd0aDtcbiAgICBpZiAoYXJyYXlbaV0gIT09IGFycmF5Lmxlbmd0aCAmJiBvcHRpb25zLnRydW5jYXRlIDw9IDMpIHtcbiAgICAgIG91dHB1dCArPSBgJHt0cnVuY2F0b3J9KCR7YXJyYXkubGVuZ3RoIC0gYXJyYXlbaV0gKyAxfSlgO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG91dHB1dCArPSBzdHJpbmc7XG4gIH1cbiAgbGV0IHByb3BlcnR5Q29udGVudHMgPSBcIlwiO1xuICBpZiAobm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgIHByb3BlcnR5Q29udGVudHMgPSBpbnNwZWN0TGlzdChub25JbmRleFByb3BlcnRpZXMubWFwKChrZXkpID0+IFtrZXksIGFycmF5W2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgfVxuICByZXR1cm4gYCR7bmFtZX1bICR7b3V0cHV0fSR7cHJvcGVydHlDb250ZW50cyA/IGAsICR7cHJvcGVydHlDb250ZW50c31gIDogXCJcIn0gXWA7XG59XG5fX25hbWUoaW5zcGVjdFR5cGVkQXJyYXksIFwiaW5zcGVjdFR5cGVkQXJyYXlcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvZGF0ZS5qc1xuZnVuY3Rpb24gaW5zcGVjdERhdGUoZGF0ZU9iamVjdCwgb3B0aW9ucykge1xuICBjb25zdCBzdHJpbmdSZXByZXNlbnRhdGlvbiA9IGRhdGVPYmplY3QudG9KU09OKCk7XG4gIGlmIChzdHJpbmdSZXByZXNlbnRhdGlvbiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIkludmFsaWQgRGF0ZVwiO1xuICB9XG4gIGNvbnN0IHNwbGl0ID0gc3RyaW5nUmVwcmVzZW50YXRpb24uc3BsaXQoXCJUXCIpO1xuICBjb25zdCBkYXRlID0gc3BsaXRbMF07XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUoYCR7ZGF0ZX1UJHt0cnVuY2F0ZShzcGxpdFsxXSwgb3B0aW9ucy50cnVuY2F0ZSAtIGRhdGUubGVuZ3RoIC0gMSl9YCwgXCJkYXRlXCIpO1xufVxuX19uYW1lKGluc3BlY3REYXRlLCBcImluc3BlY3REYXRlXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2Z1bmN0aW9uLmpzXG5mdW5jdGlvbiBpbnNwZWN0RnVuY3Rpb24oZnVuYywgb3B0aW9ucykge1xuICBjb25zdCBmdW5jdGlvblR5cGUgPSBmdW5jW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgXCJGdW5jdGlvblwiO1xuICBjb25zdCBuYW1lID0gZnVuYy5uYW1lO1xuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9XWAsIFwic3BlY2lhbFwiKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9ICR7dHJ1bmNhdGUobmFtZSwgb3B0aW9ucy50cnVuY2F0ZSAtIDExKX1dYCwgXCJzcGVjaWFsXCIpO1xufVxuX19uYW1lKGluc3BlY3RGdW5jdGlvbiwgXCJpbnNwZWN0RnVuY3Rpb25cIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvbWFwLmpzXG5mdW5jdGlvbiBpbnNwZWN0TWFwRW50cnkoW2tleSwgdmFsdWVdLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gNDtcbiAga2V5ID0gb3B0aW9ucy5pbnNwZWN0KGtleSwgb3B0aW9ucyk7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0ga2V5Lmxlbmd0aDtcbiAgdmFsdWUgPSBvcHRpb25zLmluc3BlY3QodmFsdWUsIG9wdGlvbnMpO1xuICByZXR1cm4gYCR7a2V5fSA9PiAke3ZhbHVlfWA7XG59XG5fX25hbWUoaW5zcGVjdE1hcEVudHJ5LCBcImluc3BlY3RNYXBFbnRyeVwiKTtcbmZ1bmN0aW9uIG1hcFRvRW50cmllcyhtYXApIHtcbiAgY29uc3QgZW50cmllcyA9IFtdO1xuICBtYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIGVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9KTtcbiAgcmV0dXJuIGVudHJpZXM7XG59XG5fX25hbWUobWFwVG9FbnRyaWVzLCBcIm1hcFRvRW50cmllc1wiKTtcbmZ1bmN0aW9uIGluc3BlY3RNYXAobWFwLCBvcHRpb25zKSB7XG4gIGlmIChtYXAuc2l6ZSA9PT0gMClcbiAgICByZXR1cm4gXCJNYXB7fVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDc7XG4gIHJldHVybiBgTWFweyAke2luc3BlY3RMaXN0KG1hcFRvRW50cmllcyhtYXApLCBvcHRpb25zLCBpbnNwZWN0TWFwRW50cnkpfSB9YDtcbn1cbl9fbmFtZShpbnNwZWN0TWFwLCBcImluc3BlY3RNYXBcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvbnVtYmVyLmpzXG52YXIgaXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgKChpKSA9PiBpICE9PSBpKTtcbmZ1bmN0aW9uIGluc3BlY3ROdW1iZXIobnVtYmVyLCBvcHRpb25zKSB7XG4gIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShcIk5hTlwiLCBcIm51bWJlclwiKTtcbiAgfVxuICBpZiAobnVtYmVyID09PSBJbmZpbml0eSkge1xuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoXCJJbmZpbml0eVwiLCBcIm51bWJlclwiKTtcbiAgfVxuICBpZiAobnVtYmVyID09PSAtSW5maW5pdHkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKFwiLUluZmluaXR5XCIsIFwibnVtYmVyXCIpO1xuICB9XG4gIGlmIChudW1iZXIgPT09IDApIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKDEgLyBudW1iZXIgPT09IEluZmluaXR5ID8gXCIrMFwiIDogXCItMFwiLCBcIm51bWJlclwiKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKFN0cmluZyhudW1iZXIpLCBvcHRpb25zLnRydW5jYXRlKSwgXCJudW1iZXJcIik7XG59XG5fX25hbWUoaW5zcGVjdE51bWJlciwgXCJpbnNwZWN0TnVtYmVyXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2JpZ2ludC5qc1xuZnVuY3Rpb24gaW5zcGVjdEJpZ0ludChudW1iZXIsIG9wdGlvbnMpIHtcbiAgbGV0IG51bXMgPSB0cnVuY2F0ZShudW1iZXIudG9TdHJpbmcoKSwgb3B0aW9ucy50cnVuY2F0ZSAtIDEpO1xuICBpZiAobnVtcyAhPT0gdHJ1bmNhdG9yKVxuICAgIG51bXMgKz0gXCJuXCI7XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUobnVtcywgXCJiaWdpbnRcIik7XG59XG5fX25hbWUoaW5zcGVjdEJpZ0ludCwgXCJpbnNwZWN0QmlnSW50XCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL3JlZ2V4cC5qc1xuZnVuY3Rpb24gaW5zcGVjdFJlZ0V4cCh2YWx1ZSwgb3B0aW9ucykge1xuICBjb25zdCBmbGFncyA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoXCIvXCIpWzJdO1xuICBjb25zdCBzb3VyY2VMZW5ndGggPSBvcHRpb25zLnRydW5jYXRlIC0gKDIgKyBmbGFncy5sZW5ndGgpO1xuICBjb25zdCBzb3VyY2UgPSB2YWx1ZS5zb3VyY2U7XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUoYC8ke3RydW5jYXRlKHNvdXJjZSwgc291cmNlTGVuZ3RoKX0vJHtmbGFnc31gLCBcInJlZ2V4cFwiKTtcbn1cbl9fbmFtZShpbnNwZWN0UmVnRXhwLCBcImluc3BlY3RSZWdFeHBcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvc2V0LmpzXG5mdW5jdGlvbiBhcnJheUZyb21TZXQoc2V0Mikge1xuICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgc2V0Mi5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiB2YWx1ZXM7XG59XG5fX25hbWUoYXJyYXlGcm9tU2V0LCBcImFycmF5RnJvbVNldFwiKTtcbmZ1bmN0aW9uIGluc3BlY3RTZXQoc2V0Miwgb3B0aW9ucykge1xuICBpZiAoc2V0Mi5zaXplID09PSAwKVxuICAgIHJldHVybiBcIlNldHt9XCI7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gNztcbiAgcmV0dXJuIGBTZXR7ICR7aW5zcGVjdExpc3QoYXJyYXlGcm9tU2V0KHNldDIpLCBvcHRpb25zKX0gfWA7XG59XG5fX25hbWUoaW5zcGVjdFNldCwgXCJpbnNwZWN0U2V0XCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL3N0cmluZy5qc1xudmFyIHN0cmluZ0VzY2FwZUNoYXJzID0gbmV3IFJlZ0V4cChcIlsnXFxcXHUwMDAwLVxcXFx1MDAxZlxcXFx1MDA3Zi1cXFxcdTAwOWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl1cIiwgXCJnXCIpO1xudmFyIGVzY2FwZUNoYXJhY3RlcnMgPSB7XG4gIFwiXFxiXCI6IFwiXFxcXGJcIixcbiAgXCJcdFwiOiBcIlxcXFx0XCIsXG4gIFwiXFxuXCI6IFwiXFxcXG5cIixcbiAgXCJcXGZcIjogXCJcXFxcZlwiLFxuICBcIlxcclwiOiBcIlxcXFxyXCIsXG4gIFwiJ1wiOiBcIlxcXFwnXCIsXG4gIFwiXFxcXFwiOiBcIlxcXFxcXFxcXCJcbn07XG52YXIgaGV4ID0gMTY7XG52YXIgdW5pY29kZUxlbmd0aCA9IDQ7XG5mdW5jdGlvbiBlc2NhcGUoY2hhcikge1xuICByZXR1cm4gZXNjYXBlQ2hhcmFjdGVyc1tjaGFyXSB8fCBgXFxcXHUke2AwMDAwJHtjaGFyLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoaGV4KX1gLnNsaWNlKC11bmljb2RlTGVuZ3RoKX1gO1xufVxuX19uYW1lKGVzY2FwZSwgXCJlc2NhcGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0U3RyaW5nKHN0cmluZywgb3B0aW9ucykge1xuICBpZiAoc3RyaW5nRXNjYXBlQ2hhcnMudGVzdChzdHJpbmcpKSB7XG4gICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2Uoc3RyaW5nRXNjYXBlQ2hhcnMsIGVzY2FwZSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShgJyR7dHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zLnRydW5jYXRlIC0gMil9J2AsIFwic3RyaW5nXCIpO1xufVxuX19uYW1lKGluc3BlY3RTdHJpbmcsIFwiaW5zcGVjdFN0cmluZ1wiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9zeW1ib2wuanNcbmZ1bmN0aW9uIGluc3BlY3RTeW1ib2wodmFsdWUpIHtcbiAgaWYgKFwiZGVzY3JpcHRpb25cIiBpbiBTeW1ib2wucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmRlc2NyaXB0aW9uID8gYFN5bWJvbCgke3ZhbHVlLmRlc2NyaXB0aW9ufSlgIDogXCJTeW1ib2woKVwiO1xuICB9XG4gIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xufVxuX19uYW1lKGluc3BlY3RTeW1ib2wsIFwiaW5zcGVjdFN5bWJvbFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9wcm9taXNlLmpzXG52YXIgZ2V0UHJvbWlzZVZhbHVlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBcIlByb21pc2V7XFx1MjAyNn1cIiwgXCJnZXRQcm9taXNlVmFsdWVcIik7XG52YXIgcHJvbWlzZV9kZWZhdWx0ID0gZ2V0UHJvbWlzZVZhbHVlO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL29iamVjdC5qc1xuZnVuY3Rpb24gaW5zcGVjdE9iamVjdChvYmplY3QsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCk7XG4gIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpIDogW107XG4gIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCAmJiBzeW1ib2xzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcInt9XCI7XG4gIH1cbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSA0O1xuICBvcHRpb25zLnNlZW4gPSBvcHRpb25zLnNlZW4gfHwgW107XG4gIGlmIChvcHRpb25zLnNlZW4uaW5jbHVkZXMob2JqZWN0KSkge1xuICAgIHJldHVybiBcIltDaXJjdWxhcl1cIjtcbiAgfVxuICBvcHRpb25zLnNlZW4ucHVzaChvYmplY3QpO1xuICBjb25zdCBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgb2JqZWN0W2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgY29uc3Qgc3ltYm9sQ29udGVudHMgPSBpbnNwZWN0TGlzdChzeW1ib2xzLm1hcCgoa2V5KSA9PiBba2V5LCBvYmplY3Rba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICBvcHRpb25zLnNlZW4ucG9wKCk7XG4gIGxldCBzZXAgPSBcIlwiO1xuICBpZiAocHJvcGVydHlDb250ZW50cyAmJiBzeW1ib2xDb250ZW50cykge1xuICAgIHNlcCA9IFwiLCBcIjtcbiAgfVxuICByZXR1cm4gYHsgJHtwcm9wZXJ0eUNvbnRlbnRzfSR7c2VwfSR7c3ltYm9sQ29udGVudHN9IH1gO1xufVxuX19uYW1lKGluc3BlY3RPYmplY3QsIFwiaW5zcGVjdE9iamVjdFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9jbGFzcy5qc1xudmFyIHRvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wudG9TdHJpbmdUYWcgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiBmYWxzZTtcbmZ1bmN0aW9uIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucykge1xuICBsZXQgbmFtZSA9IFwiXCI7XG4gIGlmICh0b1N0cmluZ1RhZyAmJiB0b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgIG5hbWUgPSB2YWx1ZVt0b1N0cmluZ1RhZ107XG4gIH1cbiAgbmFtZSA9IG5hbWUgfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKCFuYW1lIHx8IG5hbWUgPT09IFwiX2NsYXNzXCIpIHtcbiAgICBuYW1lID0gXCI8QW5vbnltb3VzIENsYXNzPlwiO1xuICB9XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gbmFtZS5sZW5ndGg7XG4gIHJldHVybiBgJHtuYW1lfSR7aW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyl9YDtcbn1cbl9fbmFtZShpbnNwZWN0Q2xhc3MsIFwiaW5zcGVjdENsYXNzXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2FyZ3VtZW50cy5qc1xuZnVuY3Rpb24gaW5zcGVjdEFyZ3VtZW50cyhhcmdzLCBvcHRpb25zKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gXCJBcmd1bWVudHNbXVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDEzO1xuICByZXR1cm4gYEFyZ3VtZW50c1sgJHtpbnNwZWN0TGlzdChhcmdzLCBvcHRpb25zKX0gXWA7XG59XG5fX25hbWUoaW5zcGVjdEFyZ3VtZW50cywgXCJpbnNwZWN0QXJndW1lbnRzXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2Vycm9yLmpzXG52YXIgZXJyb3JLZXlzID0gW1xuICBcInN0YWNrXCIsXG4gIFwibGluZVwiLFxuICBcImNvbHVtblwiLFxuICBcIm5hbWVcIixcbiAgXCJtZXNzYWdlXCIsXG4gIFwiZmlsZU5hbWVcIixcbiAgXCJsaW5lTnVtYmVyXCIsXG4gIFwiY29sdW1uTnVtYmVyXCIsXG4gIFwibnVtYmVyXCIsXG4gIFwiZGVzY3JpcHRpb25cIixcbiAgXCJjYXVzZVwiXG5dO1xuZnVuY3Rpb24gaW5zcGVjdE9iamVjdDIoZXJyb3IsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKS5maWx0ZXIoKGtleSkgPT4gZXJyb3JLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aDtcbiAgbGV0IG1lc3NhZ2UgPSBcIlwiO1xuICBpZiAodHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICBtZXNzYWdlID0gdHJ1bmNhdGUoZXJyb3IubWVzc2FnZSwgb3B0aW9ucy50cnVuY2F0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvcGVydGllcy51bnNoaWZ0KFwibWVzc2FnZVwiKTtcbiAgfVxuICBtZXNzYWdlID0gbWVzc2FnZSA/IGA6ICR7bWVzc2FnZX1gIDogXCJcIjtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBtZXNzYWdlLmxlbmd0aCArIDU7XG4gIG9wdGlvbnMuc2VlbiA9IG9wdGlvbnMuc2VlbiB8fCBbXTtcbiAgaWYgKG9wdGlvbnMuc2Vlbi5pbmNsdWRlcyhlcnJvcikpIHtcbiAgICByZXR1cm4gXCJbQ2lyY3VsYXJdXCI7XG4gIH1cbiAgb3B0aW9ucy5zZWVuLnB1c2goZXJyb3IpO1xuICBjb25zdCBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgZXJyb3Jba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICByZXR1cm4gYCR7bmFtZX0ke21lc3NhZ2V9JHtwcm9wZXJ0eUNvbnRlbnRzID8gYCB7ICR7cHJvcGVydHlDb250ZW50c30gfWAgOiBcIlwifWA7XG59XG5fX25hbWUoaW5zcGVjdE9iamVjdDIsIFwiaW5zcGVjdE9iamVjdFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9odG1sLmpzXG5mdW5jdGlvbiBpbnNwZWN0QXR0cmlidXRlKFtrZXksIHZhbHVlXSwgb3B0aW9ucykge1xuICBvcHRpb25zLnRydW5jYXRlIC09IDM7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gYCR7b3B0aW9ucy5zdHlsaXplKFN0cmluZyhrZXkpLCBcInllbGxvd1wiKX1gO1xuICB9XG4gIHJldHVybiBgJHtvcHRpb25zLnN0eWxpemUoU3RyaW5nKGtleSksIFwieWVsbG93XCIpfT0ke29wdGlvbnMuc3R5bGl6ZShgXCIke3ZhbHVlfVwiYCwgXCJzdHJpbmdcIil9YDtcbn1cbl9fbmFtZShpbnNwZWN0QXR0cmlidXRlLCBcImluc3BlY3RBdHRyaWJ1dGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24oY29sbGVjdGlvbiwgb3B0aW9ucykge1xuICByZXR1cm4gaW5zcGVjdExpc3QoY29sbGVjdGlvbiwgb3B0aW9ucywgaW5zcGVjdE5vZGUsIFwiXFxuXCIpO1xufVxuX19uYW1lKGluc3BlY3ROb2RlQ29sbGVjdGlvbiwgXCJpbnNwZWN0Tm9kZUNvbGxlY3Rpb25cIik7XG5mdW5jdGlvbiBpbnNwZWN0Tm9kZShub2RlLCBvcHRpb25zKSB7XG4gIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBpbnNwZWN0SFRNTChub2RlLCBvcHRpb25zKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gb3B0aW9ucy5pbnNwZWN0KG5vZGUuZGF0YSwgb3B0aW9ucyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvcHRpb25zLmluc3BlY3Qobm9kZSwgb3B0aW9ucyk7XG4gIH1cbn1cbl9fbmFtZShpbnNwZWN0Tm9kZSwgXCJpbnNwZWN0Tm9kZVwiKTtcbmZ1bmN0aW9uIGluc3BlY3RIVE1MKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKTtcbiAgY29uc3QgbmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoZWFkID0gb3B0aW9ucy5zdHlsaXplKGA8JHtuYW1lfWAsIFwic3BlY2lhbFwiKTtcbiAgY29uc3QgaGVhZENsb3NlID0gb3B0aW9ucy5zdHlsaXplKGA+YCwgXCJzcGVjaWFsXCIpO1xuICBjb25zdCB0YWlsID0gb3B0aW9ucy5zdHlsaXplKGA8LyR7bmFtZX0+YCwgXCJzcGVjaWFsXCIpO1xuICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoICogMiArIDU7XG4gIGxldCBwcm9wZXJ0eUNvbnRlbnRzID0gXCJcIjtcbiAgaWYgKHByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgIHByb3BlcnR5Q29udGVudHMgKz0gXCIgXCI7XG4gICAgcHJvcGVydHlDb250ZW50cyArPSBpbnNwZWN0TGlzdChwcm9wZXJ0aWVzLm1hcCgoa2V5KSA9PiBba2V5LCBlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpXSksIG9wdGlvbnMsIGluc3BlY3RBdHRyaWJ1dGUsIFwiIFwiKTtcbiAgfVxuICBvcHRpb25zLnRydW5jYXRlIC09IHByb3BlcnR5Q29udGVudHMubGVuZ3RoO1xuICBjb25zdCB0cnVuY2F0ZTIgPSBvcHRpb25zLnRydW5jYXRlO1xuICBsZXQgY2hpbGRyZW4gPSBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24oZWxlbWVudC5jaGlsZHJlbiwgb3B0aW9ucyk7XG4gIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiB0cnVuY2F0ZTIpIHtcbiAgICBjaGlsZHJlbiA9IGAke3RydW5jYXRvcn0oJHtlbGVtZW50LmNoaWxkcmVuLmxlbmd0aH0pYDtcbiAgfVxuICByZXR1cm4gYCR7aGVhZH0ke3Byb3BlcnR5Q29udGVudHN9JHtoZWFkQ2xvc2V9JHtjaGlsZHJlbn0ke3RhaWx9YDtcbn1cbl9fbmFtZShpbnNwZWN0SFRNTCwgXCJpbnNwZWN0SFRNTFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9pbmRleC5qc1xudmFyIHN5bWJvbHNTdXBwb3J0ZWQgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5mb3IgPT09IFwiZnVuY3Rpb25cIjtcbnZhciBjaGFpSW5zcGVjdCA9IHN5bWJvbHNTdXBwb3J0ZWQgPyAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcihcImNoYWkvaW5zcGVjdFwiKSA6IFwiQEBjaGFpL2luc3BlY3RcIjtcbnZhciBub2RlSW5zcGVjdCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKFwibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b21cIik7XG52YXIgY29uc3RydWN0b3JNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciBzdHJpbmdUYWdNYXAgPSB7fTtcbnZhciBiYXNlVHlwZXNNYXAgPSB7XG4gIHVuZGVmaW5lZDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZShcInVuZGVmaW5lZFwiLCBcInVuZGVmaW5lZFwiKSwgXCJ1bmRlZmluZWRcIiksXG4gIG51bGw6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlLCBvcHRpb25zKSA9PiBvcHRpb25zLnN0eWxpemUoXCJudWxsXCIsIFwibnVsbFwiKSwgXCJudWxsXCIpLFxuICBib29sZWFuOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksIFwiYm9vbGVhblwiKSwgXCJib29sZWFuXCIpLFxuICBCb29sZWFuOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksIFwiYm9vbGVhblwiKSwgXCJCb29sZWFuXCIpLFxuICBudW1iZXI6IGluc3BlY3ROdW1iZXIsXG4gIE51bWJlcjogaW5zcGVjdE51bWJlcixcbiAgYmlnaW50OiBpbnNwZWN0QmlnSW50LFxuICBCaWdJbnQ6IGluc3BlY3RCaWdJbnQsXG4gIHN0cmluZzogaW5zcGVjdFN0cmluZyxcbiAgU3RyaW5nOiBpbnNwZWN0U3RyaW5nLFxuICBmdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICBGdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICBzeW1ib2w6IGluc3BlY3RTeW1ib2wsXG4gIC8vIEEgU3ltYm9sIHBvbHlmaWxsIHdpbGwgcmV0dXJuIGBTeW1ib2xgIG5vdCBgc3ltYm9sYCBmcm9tIHR5cGVkZXRlY3RcbiAgU3ltYm9sOiBpbnNwZWN0U3ltYm9sLFxuICBBcnJheTogaW5zcGVjdEFycmF5LFxuICBEYXRlOiBpbnNwZWN0RGF0ZSxcbiAgTWFwOiBpbnNwZWN0TWFwLFxuICBTZXQ6IGluc3BlY3RTZXQsXG4gIFJlZ0V4cDogaW5zcGVjdFJlZ0V4cCxcbiAgUHJvbWlzZTogcHJvbWlzZV9kZWZhdWx0LFxuICAvLyBXZWFrU2V0LCBXZWFrTWFwIGFyZSB0b3RhbGx5IG9wYXF1ZSB0byB1c1xuICBXZWFrU2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFwiV2Vha1NldHtcXHUyMDI2fVwiLCBcInNwZWNpYWxcIiksIFwiV2Vha1NldFwiKSxcbiAgV2Vha01hcDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZShcIldlYWtNYXB7XFx1MjAyNn1cIiwgXCJzcGVjaWFsXCIpLCBcIldlYWtNYXBcIiksXG4gIEFyZ3VtZW50czogaW5zcGVjdEFyZ3VtZW50cyxcbiAgSW50OEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgVWludDhBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQ4Q2xhbXBlZEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgSW50MTZBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQxNkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgSW50MzJBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgRmxvYXQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgRmxvYXQ2NEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgR2VuZXJhdG9yOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IFwiXCIsIFwiR2VuZXJhdG9yXCIpLFxuICBEYXRhVmlldzogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBcIlwiLCBcIkRhdGFWaWV3XCIpLFxuICBBcnJheUJ1ZmZlcjogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBcIlwiLCBcIkFycmF5QnVmZmVyXCIpLFxuICBFcnJvcjogaW5zcGVjdE9iamVjdDIsXG4gIEhUTUxDb2xsZWN0aW9uOiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24sXG4gIE5vZGVMaXN0OiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb25cbn07XG52YXIgaW5zcGVjdEN1c3RvbSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlLCBvcHRpb25zLCB0eXBlMywgaW5zcGVjdEZuKSA9PiB7XG4gIGlmIChjaGFpSW5zcGVjdCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbY2hhaUluc3BlY3RdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVbY2hhaUluc3BlY3RdKG9wdGlvbnMpO1xuICB9XG4gIGlmIChub2RlSW5zcGVjdCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbbm9kZUluc3BlY3RdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVbbm9kZUluc3BlY3RdKG9wdGlvbnMuZGVwdGgsIG9wdGlvbnMsIGluc3BlY3RGbik7XG4gIH1cbiAgaWYgKFwiaW5zcGVjdFwiIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pbnNwZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5zcGVjdChvcHRpb25zLmRlcHRoLCBvcHRpb25zKTtcbiAgfVxuICBpZiAoXCJjb25zdHJ1Y3RvclwiIGluIHZhbHVlICYmIGNvbnN0cnVjdG9yTWFwLmhhcyh2YWx1ZS5jb25zdHJ1Y3RvcikpIHtcbiAgICByZXR1cm4gY29uc3RydWN0b3JNYXAuZ2V0KHZhbHVlLmNvbnN0cnVjdG9yKSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKHN0cmluZ1RhZ01hcFt0eXBlM10pIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnTWFwW3R5cGUzXSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59LCBcImluc3BlY3RDdXN0b21cIik7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuZnVuY3Rpb24gaW5zcGVjdCh2YWx1ZSwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBub3JtYWxpc2VPcHRpb25zKG9wdHMsIGluc3BlY3QpO1xuICBjb25zdCB7IGN1c3RvbUluc3BlY3QgfSA9IG9wdGlvbnM7XG4gIGxldCB0eXBlMyA9IHZhbHVlID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgdmFsdWU7XG4gIGlmICh0eXBlMyA9PT0gXCJvYmplY3RcIikge1xuICAgIHR5cGUzID0gdG9TdHJpbmcuY2FsbCh2YWx1ZSkuc2xpY2UoOCwgLTEpO1xuICB9XG4gIGlmICh0eXBlMyBpbiBiYXNlVHlwZXNNYXApIHtcbiAgICByZXR1cm4gYmFzZVR5cGVzTWFwW3R5cGUzXSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGN1c3RvbUluc3BlY3QgJiYgdmFsdWUpIHtcbiAgICBjb25zdCBvdXRwdXQgPSBpbnNwZWN0Q3VzdG9tKHZhbHVlLCBvcHRpb25zLCB0eXBlMywgaW5zcGVjdCk7XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgaWYgKHR5cGVvZiBvdXRwdXQgPT09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICByZXR1cm4gaW5zcGVjdChvdXRwdXQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjb25zdCBwcm90byA9IHZhbHVlID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA6IGZhbHNlO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gaW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gaW5zcGVjdEhUTUwodmFsdWUsIG9wdGlvbnMpO1xuICB9XG4gIGlmIChcImNvbnN0cnVjdG9yXCIgaW4gdmFsdWUpIHtcbiAgICBpZiAodmFsdWUuY29uc3RydWN0b3IgIT09IE9iamVjdCkge1xuICAgICAgcmV0dXJuIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBpbnNwZWN0T2JqZWN0KHZhbHVlLCBvcHRpb25zKTtcbiAgfVxuICBpZiAodmFsdWUgPT09IE9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gaW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShTdHJpbmcodmFsdWUpLCB0eXBlMyk7XG59XG5fX25hbWUoaW5zcGVjdCwgXCJpbnNwZWN0XCIpO1xuXG4vLyBsaWIvY2hhaS9jb25maWcuanNcbnZhciBjb25maWcgPSB7XG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLmluY2x1ZGVTdGFja1xuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgaW5mbHVlbmNlcyB3aGV0aGVyIHN0YWNrIHRyYWNlXG4gICAqIGlzIGluY2x1ZGVkIGluIEFzc2VydGlvbiBlcnJvciBtZXNzYWdlLiBEZWZhdWx0IG9mIGZhbHNlXG4gICAqIHN1cHByZXNzZXMgc3RhY2sgdHJhY2UgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy5pbmNsdWRlU3RhY2sgPSB0cnVlOyAgLy8gZW5hYmxlIHN0YWNrIG9uIGVycm9yXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgaW5jbHVkZVN0YWNrOiBmYWxzZSxcbiAgLyoqXG4gICAqICMjIyBjb25maWcuc2hvd0RpZmZcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGluZmx1ZW5jZXMgd2hldGhlciBvciBub3RcbiAgICogdGhlIGBzaG93RGlmZmAgZmxhZyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93blxuICAgKiBBc3NlcnRpb25FcnJvcnMuIGBmYWxzZWAgd2lsbCBhbHdheXMgYmUgYGZhbHNlYDsgYHRydWVgXG4gICAqIHdpbGwgYmUgdHJ1ZSB3aGVuIHRoZSBhc3NlcnRpb24gaGFzIHJlcXVlc3RlZCBhIGRpZmZcbiAgICogYmUgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2hvd0RpZmY6IHRydWUsXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLnRydW5jYXRlVGhyZXNob2xkXG4gICAqXG4gICAqIFVzZXIgY29uZmlndXJhYmxlIHByb3BlcnR5LCBzZXRzIGxlbmd0aCB0aHJlc2hvbGQgZm9yIGFjdHVhbCBhbmRcbiAgICogZXhwZWN0ZWQgdmFsdWVzIGluIGFzc2VydGlvbiBlcnJvcnMuIElmIHRoaXMgdGhyZXNob2xkIGlzIGV4Y2VlZGVkLCBmb3JcbiAgICogZXhhbXBsZSBmb3IgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzLCB0aGUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmdcbiAgICogbGlrZSBgWyBBcnJheSgzKSBdYCBvciBgeyBPYmplY3QgKHByb3AxLCBwcm9wMikgfWAuXG4gICAqXG4gICAqIFNldCBpdCB0byB6ZXJvIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdHJ1bmNhdGluZyBhbHRvZ2V0aGVyLlxuICAgKlxuICAgKiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlcmZ1bCB3aGVuIGRvaW5nIGFzc2VydGlvbnMgb24gYXJyYXlzOiBoYXZpbmcgdGhpc1xuICAgKiBzZXQgdG8gYSByZWFzb25hYmxlIGxhcmdlIHZhbHVlIG1ha2VzIHRoZSBmYWlsdXJlIG1lc3NhZ2VzIHJlYWRpbHlcbiAgICogaW5zcGVjdGFibGUuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCA9IDA7ICAvLyBkaXNhYmxlIHRydW5jYXRpbmdcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9XG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHRydW5jYXRlVGhyZXNob2xkOiA0MCxcbiAgLyoqXG4gICAqICMjIyBjb25maWcudXNlUHJveHlcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgaWYgY2hhaSB3aWxsIHVzZSBhIFByb3h5IHRvIHRocm93XG4gICAqIGFuIGVycm9yIHdoZW4gYSBub24tZXhpc3RlbnQgcHJvcGVydHkgaXMgcmVhZCwgd2hpY2ggcHJvdGVjdHMgdXNlcnNcbiAgICogZnJvbSB0eXBvcyB3aGVuIHVzaW5nIHByb3BlcnR5LWJhc2VkIGFzc2VydGlvbnMuXG4gICAqXG4gICAqIFNldCBpdCB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS5cbiAgICpcbiAgICogICAgIGNoYWkuY29uZmlnLnVzZVByb3h5ID0gZmFsc2U7ICAvLyBkaXNhYmxlIHVzZSBvZiBQcm94eVxuICAgKlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCByZWdhcmRsZXNzIG9mIHRoaXMgY29uZmlnIHZhbHVlXG4gICAqIGluIGVudmlyb25tZW50cyB0aGF0IGRvbid0IHN1cHBvcnQgcHJveGllcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufVxuICAgKiBAcHVibGljXG4gICAqL1xuICB1c2VQcm94eTogdHJ1ZSxcbiAgLyoqXG4gICAqICMjIyBjb25maWcucHJveHlFeGNsdWRlZEtleXNcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZSBhc3NlcnRpb24uXG4gICAqIFRoaXMgaXMgb25seSBhcHBsaWVkIGlmIHRoZSBlbnZpcm9ubWVudCBDaGFpIGlzIHJ1bm5pbmcgaW4gc3VwcG9ydHMgcHJveGllcyBhbmRcbiAgICogaWYgdGhlIGB1c2VQcm94eWAgY29uZmlndXJhdGlvbiBzZXR0aW5nIGlzIGVuYWJsZWQuXG4gICAqIEJ5IGRlZmF1bHQsIGB0aGVuYCBhbmQgYGluc3BlY3RgIHdpbGwgbm90IHRocm93IGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZVxuICAgKiBhc3NlcnRpb24gb2JqZWN0IGJlY2F1c2UgdGhlIGAuaW5zcGVjdGAgcHJvcGVydHkgaXMgcmVhZCBieSBgdXRpbC5pbnNwZWN0YCAoZm9yIGV4YW1wbGUsIHdoZW5cbiAgICogdXNpbmcgYGNvbnNvbGUubG9nYCBvbiB0aGUgYXNzZXJ0aW9uIG9iamVjdCkgYW5kIGAudGhlbmAgaXMgbmVjZXNzYXJ5IGZvciBwcm9taXNlIHR5cGUtY2hlY2tpbmcuXG4gICAqXG4gICAqICAgICAvLyBCeSBkZWZhdWx0IHRoZXNlIGtleXMgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdGhleSBkbyBub3QgZXhpc3Qgb24gdGhlIGFzc2VydGlvbiBvYmplY3RcbiAgICogICAgIGNoYWkuY29uZmlnLnByb3h5RXhjbHVkZWRLZXlzID0gWyd0aGVuJywgJ2luc3BlY3QnXTtcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcHJveHlFeGNsdWRlZEtleXM6IFtcInRoZW5cIiwgXCJjYXRjaFwiLCBcImluc3BlY3RcIiwgXCJ0b0pTT05cIl0sXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLmRlZXBFcXVhbFxuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgZGVmaW5lcyB3aGljaCBhIGN1c3RvbSBmdW5jdGlvbiB0byB1c2UgZm9yIGRlZXBFcXVhbFxuICAgKiBjb21wYXJpc29ucy5cbiAgICogQnkgZGVmYXVsdCwgdGhlIGZ1bmN0aW9uIHVzZWQgaXMgdGhlIG9uZSBmcm9tIHRoZSBgZGVlcC1lcWxgIHBhY2thZ2Ugd2l0aG91dCBjdXN0b20gY29tcGFyYXRvci5cbiAgICpcbiAgICogICAgIC8vIHVzZSBhIGN1c3RvbSBjb21wYXJhdG9yXG4gICAqICAgICBjaGFpLmNvbmZpZy5kZWVwRXF1YWwgPSAoZXhwZWN0ZWQsIGFjdHVhbCkgPT4ge1xuICAgKiAgICAgICAgIHJldHVybiBjaGFpLnV0aWwuZXFsKGV4cGVjdGVkLCBhY3R1YWwsIHtcbiAgICogICAgICAgICAgICAgY29tcGFyYXRvcjogKGV4cGVjdGVkLCBhY3R1YWwpID0+IHtcbiAgICogICAgICAgICAgICAgICAgIC8vIGZvciBub24gbnVtYmVyIGNvbXBhcmlzb24sIHVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgKiAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGV4cGVjdGVkICE9PSAnbnVtYmVyJykgcmV0dXJuIG51bGw7XG4gICAqICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhIGRpZmZlcmVuY2Ugb2YgMTAgYmV0d2VlbiBjb21wYXJlZCBudW1iZXJzXG4gICAqICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gJ251bWJlcicgJiYgTWF0aC5hYnMoYWN0dWFsIC0gZXhwZWN0ZWQpIDwgMTBcbiAgICogICAgICAgICAgICAgfVxuICAgKiAgICAgICAgIH0pXG4gICAqICAgICB9O1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufVxuICAgKiBAcHVibGljXG4gICAqL1xuICBkZWVwRXF1YWw6IG51bGxcbn07XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2luc3BlY3QuanNcbmZ1bmN0aW9uIGluc3BlY3QyKG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycykge1xuICBsZXQgb3B0aW9ucyA9IHtcbiAgICBjb2xvcnMsXG4gICAgZGVwdGg6IHR5cGVvZiBkZXB0aCA9PT0gXCJ1bmRlZmluZWRcIiA/IDIgOiBkZXB0aCxcbiAgICBzaG93SGlkZGVuLFxuICAgIHRydW5jYXRlOiBjb25maWcudHJ1bmNhdGVUaHJlc2hvbGQgPyBjb25maWcudHJ1bmNhdGVUaHJlc2hvbGQgOiBJbmZpbml0eVxuICB9O1xuICByZXR1cm4gaW5zcGVjdChvYmosIG9wdGlvbnMpO1xufVxuX19uYW1lKGluc3BlY3QyLCBcImluc3BlY3RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL29iakRpc3BsYXkuanNcbmZ1bmN0aW9uIG9iakRpc3BsYXkob2JqKSB7XG4gIGxldCBzdHIgPSBpbnNwZWN0MihvYmopLCB0eXBlMyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xuICBpZiAoY29uZmlnLnRydW5jYXRlVGhyZXNob2xkICYmIHN0ci5sZW5ndGggPj0gY29uZmlnLnRydW5jYXRlVGhyZXNob2xkKSB7XG4gICAgaWYgKHR5cGUzID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIpIHtcbiAgICAgIHJldHVybiAhb2JqLm5hbWUgfHwgb2JqLm5hbWUgPT09IFwiXCIgPyBcIltGdW5jdGlvbl1cIiA6IFwiW0Z1bmN0aW9uOiBcIiArIG9iai5uYW1lICsgXCJdXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlMyA9PT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG4gICAgICByZXR1cm4gXCJbIEFycmF5KFwiICsgb2JqLmxlbmd0aCArIFwiKSBdXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopLCBrc3RyID0ga2V5cy5sZW5ndGggPiAyID8ga2V5cy5zcGxpY2UoMCwgMikuam9pbihcIiwgXCIpICsgXCIsIC4uLlwiIDoga2V5cy5qb2luKFwiLCBcIik7XG4gICAgICByZXR1cm4gXCJ7IE9iamVjdCAoXCIgKyBrc3RyICsgXCIpIH1cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuX19uYW1lKG9iakRpc3BsYXksIFwib2JqRGlzcGxheVwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0TWVzc2FnZS5qc1xuZnVuY3Rpb24gZ2V0TWVzc2FnZTIob2JqLCBhcmdzKSB7XG4gIGxldCBuZWdhdGUgPSBmbGFnKG9iaiwgXCJuZWdhdGVcIik7XG4gIGxldCB2YWwgPSBmbGFnKG9iaiwgXCJvYmplY3RcIik7XG4gIGxldCBleHBlY3RlZCA9IGFyZ3NbM107XG4gIGxldCBhY3R1YWwgPSBnZXRBY3R1YWwob2JqLCBhcmdzKTtcbiAgbGV0IG1zZyA9IG5lZ2F0ZSA/IGFyZ3NbMl0gOiBhcmdzWzFdO1xuICBsZXQgZmxhZ01zZyA9IGZsYWcob2JqLCBcIm1lc3NhZ2VcIik7XG4gIGlmICh0eXBlb2YgbXNnID09PSBcImZ1bmN0aW9uXCIpIG1zZyA9IG1zZygpO1xuICBtc2cgPSBtc2cgfHwgXCJcIjtcbiAgbXNnID0gbXNnLnJlcGxhY2UoLyNcXHt0aGlzXFx9L2csIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvYmpEaXNwbGF5KHZhbCk7XG4gIH0pLnJlcGxhY2UoLyNcXHthY3RcXH0vZywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG9iakRpc3BsYXkoYWN0dWFsKTtcbiAgfSkucmVwbGFjZSgvI1xce2V4cFxcfS9nLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gb2JqRGlzcGxheShleHBlY3RlZCk7XG4gIH0pO1xuICByZXR1cm4gZmxhZ01zZyA/IGZsYWdNc2cgKyBcIjogXCIgKyBtc2cgOiBtc2c7XG59XG5fX25hbWUoZ2V0TWVzc2FnZTIsIFwiZ2V0TWVzc2FnZVwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvdHJhbnNmZXJGbGFncy5qc1xuZnVuY3Rpb24gdHJhbnNmZXJGbGFncyhhc3NlcnRpb24sIG9iamVjdCwgaW5jbHVkZUFsbCkge1xuICBsZXQgZmxhZ3MgPSBhc3NlcnRpb24uX19mbGFncyB8fCAoYXNzZXJ0aW9uLl9fZmxhZ3MgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gIGlmICghb2JqZWN0Ll9fZmxhZ3MpIHtcbiAgICBvYmplY3QuX19mbGFncyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gIGluY2x1ZGVBbGwgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzID8gaW5jbHVkZUFsbCA6IHRydWU7XG4gIGZvciAobGV0IGZsYWczIGluIGZsYWdzKSB7XG4gICAgaWYgKGluY2x1ZGVBbGwgfHwgZmxhZzMgIT09IFwib2JqZWN0XCIgJiYgZmxhZzMgIT09IFwic3NmaVwiICYmIGZsYWczICE9PSBcImxvY2tTc2ZpXCIgJiYgZmxhZzMgIT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgIG9iamVjdC5fX2ZsYWdzW2ZsYWczXSA9IGZsYWdzW2ZsYWczXTtcbiAgICB9XG4gIH1cbn1cbl9fbmFtZSh0cmFuc2ZlckZsYWdzLCBcInRyYW5zZmVyRmxhZ3NcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9kZWVwLWVxbC9pbmRleC5qc1xuZnVuY3Rpb24gdHlwZTIob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gIH1cbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIm51bGxcIjtcbiAgfVxuICBjb25zdCBzdHJpbmdUYWcgPSBvYmpbU3ltYm9sLnRvU3RyaW5nVGFnXTtcbiAgaWYgKHR5cGVvZiBzdHJpbmdUYWcgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnO1xuICB9XG4gIGNvbnN0IHNsaWNlU3RhcnQgPSA4O1xuICBjb25zdCBzbGljZUVuZCA9IC0xO1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikuc2xpY2Uoc2xpY2VTdGFydCwgc2xpY2VFbmQpO1xufVxuX19uYW1lKHR5cGUyLCBcInR5cGVcIik7XG5mdW5jdGlvbiBGYWtlTWFwKCkge1xuICB0aGlzLl9rZXkgPSBcImNoYWkvZGVlcC1lcWxfX1wiICsgTWF0aC5yYW5kb20oKSArIERhdGUubm93KCk7XG59XG5fX25hbWUoRmFrZU1hcCwgXCJGYWtlTWFwXCIpO1xuRmFrZU1hcC5wcm90b3R5cGUgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIGtleVt0aGlzLl9rZXldO1xuICB9LCBcImdldFwiKSxcbiAgc2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgaWYgKE9iamVjdC5pc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGtleSwgdGhpcy5fa2V5LCB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgXCJzZXRcIilcbn07XG52YXIgTWVtb2l6ZU1hcCA9IHR5cGVvZiBXZWFrTWFwID09PSBcImZ1bmN0aW9uXCIgPyBXZWFrTWFwIDogRmFrZU1hcDtcbmZ1bmN0aW9uIG1lbW9pemVDb21wYXJlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbWVtb2l6ZU1hcCkge1xuICBpZiAoIW1lbW9pemVNYXAgfHwgaXNQcmltaXRpdmUobGVmdEhhbmRPcGVyYW5kKSB8fCBpc1ByaW1pdGl2ZShyaWdodEhhbmRPcGVyYW5kKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBsZWZ0SGFuZE1hcCA9IG1lbW9pemVNYXAuZ2V0KGxlZnRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZE1hcCkge1xuICAgIHZhciByZXN1bHQgPSBsZWZ0SGFuZE1hcC5nZXQocmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbl9fbmFtZShtZW1vaXplQ29tcGFyZSwgXCJtZW1vaXplQ29tcGFyZVwiKTtcbmZ1bmN0aW9uIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBtZW1vaXplTWFwLCByZXN1bHQpIHtcbiAgaWYgKCFtZW1vaXplTWFwIHx8IGlzUHJpbWl0aXZlKGxlZnRIYW5kT3BlcmFuZCkgfHwgaXNQcmltaXRpdmUocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGxlZnRIYW5kTWFwID0gbWVtb2l6ZU1hcC5nZXQobGVmdEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kTWFwKSB7XG4gICAgbGVmdEhhbmRNYXAuc2V0KHJpZ2h0SGFuZE9wZXJhbmQsIHJlc3VsdCk7XG4gIH0gZWxzZSB7XG4gICAgbGVmdEhhbmRNYXAgPSBuZXcgTWVtb2l6ZU1hcCgpO1xuICAgIGxlZnRIYW5kTWFwLnNldChyaWdodEhhbmRPcGVyYW5kLCByZXN1bHQpO1xuICAgIG1lbW9pemVNYXAuc2V0KGxlZnRIYW5kT3BlcmFuZCwgbGVmdEhhbmRNYXApO1xuICB9XG59XG5fX25hbWUobWVtb2l6ZVNldCwgXCJtZW1vaXplU2V0XCIpO1xudmFyIGRlZXBfZXFsX2RlZmF1bHQgPSBkZWVwRXF1YWw7XG5mdW5jdGlvbiBkZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgIHJldHVybiBleHRlbnNpdmVEZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgfVxuICB2YXIgc2ltcGxlUmVzdWx0ID0gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgaWYgKHNpbXBsZVJlc3VsdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBzaW1wbGVSZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xufVxuX19uYW1lKGRlZXBFcXVhbCwgXCJkZWVwRXF1YWxcIik7XG5mdW5jdGlvbiBzaW1wbGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgaWYgKGxlZnRIYW5kT3BlcmFuZCA9PT0gcmlnaHRIYW5kT3BlcmFuZCkge1xuICAgIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQgIT09IDAgfHwgMSAvIGxlZnRIYW5kT3BlcmFuZCA9PT0gMSAvIHJpZ2h0SGFuZE9wZXJhbmQ7XG4gIH1cbiAgaWYgKGxlZnRIYW5kT3BlcmFuZCAhPT0gbGVmdEhhbmRPcGVyYW5kICYmIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJpZ2h0SGFuZE9wZXJhbmQgIT09IHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNQcmltaXRpdmUobGVmdEhhbmRPcGVyYW5kKSB8fCBpc1ByaW1pdGl2ZShyaWdodEhhbmRPcGVyYW5kKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbl9fbmFtZShzaW1wbGVFcXVhbCwgXCJzaW1wbGVFcXVhbFwiKTtcbmZ1bmN0aW9uIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMubWVtb2l6ZSA9IG9wdGlvbnMubWVtb2l6ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IG9wdGlvbnMubWVtb2l6ZSB8fCBuZXcgTWVtb2l6ZU1hcCgpO1xuICB2YXIgY29tcGFyYXRvciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb21wYXJhdG9yO1xuICB2YXIgbWVtb2l6ZVJlc3VsdExlZnQgPSBtZW1vaXplQ29tcGFyZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSk7XG4gIGlmIChtZW1vaXplUmVzdWx0TGVmdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBtZW1vaXplUmVzdWx0TGVmdDtcbiAgfVxuICB2YXIgbWVtb2l6ZVJlc3VsdFJpZ2h0ID0gbWVtb2l6ZUNvbXBhcmUocmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUpO1xuICBpZiAobWVtb2l6ZVJlc3VsdFJpZ2h0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIG1lbW9pemVSZXN1bHRSaWdodDtcbiAgfVxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIHZhciBjb21wYXJhdG9yUmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpO1xuICAgIGlmIChjb21wYXJhdG9yUmVzdWx0ID09PSBmYWxzZSB8fCBjb21wYXJhdG9yUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCBjb21wYXJhdG9yUmVzdWx0KTtcbiAgICAgIHJldHVybiBjb21wYXJhdG9yUmVzdWx0O1xuICAgIH1cbiAgICB2YXIgc2ltcGxlUmVzdWx0ID0gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBpZiAoc2ltcGxlUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc2ltcGxlUmVzdWx0O1xuICAgIH1cbiAgfVxuICB2YXIgbGVmdEhhbmRUeXBlID0gdHlwZTIobGVmdEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kVHlwZSAhPT0gdHlwZTIocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCBmYWxzZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUsIHRydWUpO1xuICB2YXIgcmVzdWx0ID0gZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRUeXBlLCBvcHRpb25zKTtcbiAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbl9fbmFtZShleHRlbnNpdmVEZWVwRXF1YWwsIFwiZXh0ZW5zaXZlRGVlcEVxdWFsXCIpO1xuZnVuY3Rpb24gZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRUeXBlLCBvcHRpb25zKSB7XG4gIHN3aXRjaCAobGVmdEhhbmRUeXBlKSB7XG4gICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICBjYXNlIFwiQm9vbGVhblwiOlxuICAgIGNhc2UgXCJEYXRlXCI6XG4gICAgICByZXR1cm4gZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZC52YWx1ZU9mKCksIHJpZ2h0SGFuZE9wZXJhbmQudmFsdWVPZigpKTtcbiAgICBjYXNlIFwiUHJvbWlzZVwiOlxuICAgIGNhc2UgXCJTeW1ib2xcIjpcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICBjYXNlIFwiV2Vha01hcFwiOlxuICAgIGNhc2UgXCJXZWFrU2V0XCI6XG4gICAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kID09PSByaWdodEhhbmRPcGVyYW5kO1xuICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgcmV0dXJuIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIFtcIm5hbWVcIiwgXCJtZXNzYWdlXCIsIFwiY29kZVwiXSwgb3B0aW9ucyk7XG4gICAgY2FzZSBcIkFyZ3VtZW50c1wiOlxuICAgIGNhc2UgXCJJbnQ4QXJyYXlcIjpcbiAgICBjYXNlIFwiVWludDhBcnJheVwiOlxuICAgIGNhc2UgXCJVaW50OENsYW1wZWRBcnJheVwiOlxuICAgIGNhc2UgXCJJbnQxNkFycmF5XCI6XG4gICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgY2FzZSBcIkludDMyQXJyYXlcIjpcbiAgICBjYXNlIFwiVWludDMyQXJyYXlcIjpcbiAgICBjYXNlIFwiRmxvYXQzMkFycmF5XCI6XG4gICAgY2FzZSBcIkZsb2F0NjRBcnJheVwiOlxuICAgIGNhc2UgXCJBcnJheVwiOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiUmVnRXhwXCI6XG4gICAgICByZXR1cm4gcmVnZXhwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBjYXNlIFwiR2VuZXJhdG9yXCI6XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiRGF0YVZpZXdcIjpcbiAgICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKG5ldyBVaW50OEFycmF5KGxlZnRIYW5kT3BlcmFuZC5idWZmZXIpLCBuZXcgVWludDhBcnJheShyaWdodEhhbmRPcGVyYW5kLmJ1ZmZlciksIG9wdGlvbnMpO1xuICAgIGNhc2UgXCJBcnJheUJ1ZmZlclwiOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobmV3IFVpbnQ4QXJyYXkobGVmdEhhbmRPcGVyYW5kKSwgbmV3IFVpbnQ4QXJyYXkocmlnaHRIYW5kT3BlcmFuZCksIG9wdGlvbnMpO1xuICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgIHJldHVybiBlbnRyaWVzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiTWFwXCI6XG4gICAgICByZXR1cm4gZW50cmllc0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgY2FzZSBcIlRlbXBvcmFsLlBsYWluRGF0ZVwiOlxuICAgIGNhc2UgXCJUZW1wb3JhbC5QbGFpblRpbWVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5EYXRlVGltZVwiOlxuICAgIGNhc2UgXCJUZW1wb3JhbC5JbnN0YW50XCI6XG4gICAgY2FzZSBcIlRlbXBvcmFsLlpvbmVkRGF0ZVRpbWVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5ZZWFyTW9udGhcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5Nb250aERheVwiOlxuICAgICAgcmV0dXJuIGxlZnRIYW5kT3BlcmFuZC5lcXVhbHMocmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgY2FzZSBcIlRlbXBvcmFsLkR1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kLnRvdGFsKFwibmFub3NlY29uZHNcIikgPT09IHJpZ2h0SGFuZE9wZXJhbmQudG90YWwoXCJuYW5vc2Vjb25kc1wiKTtcbiAgICBjYXNlIFwiVGVtcG9yYWwuVGltZVpvbmVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuQ2FsZW5kYXJcIjpcbiAgICAgIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQudG9TdHJpbmcoKSA9PT0gcmlnaHRIYW5kT3BlcmFuZC50b1N0cmluZygpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gb2JqZWN0RXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgfVxufVxuX19uYW1lKGV4dGVuc2l2ZURlZXBFcXVhbEJ5VHlwZSwgXCJleHRlbnNpdmVEZWVwRXF1YWxCeVR5cGVcIik7XG5mdW5jdGlvbiByZWdleHBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgcmV0dXJuIGxlZnRIYW5kT3BlcmFuZC50b1N0cmluZygpID09PSByaWdodEhhbmRPcGVyYW5kLnRvU3RyaW5nKCk7XG59XG5fX25hbWUocmVnZXhwRXF1YWwsIFwicmVnZXhwRXF1YWxcIik7XG5mdW5jdGlvbiBlbnRyaWVzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgaWYgKGxlZnRIYW5kT3BlcmFuZC5zaXplICE9PSByaWdodEhhbmRPcGVyYW5kLnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxlZnRIYW5kT3BlcmFuZC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNpemVFcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGVmdEhhbmRJdGVtcyA9IFtdO1xuICB2YXIgcmlnaHRIYW5kSXRlbXMgPSBbXTtcbiAgbGVmdEhhbmRPcGVyYW5kLmZvckVhY2goLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBnYXRoZXJFbnRyaWVzKGtleSwgdmFsdWUpIHtcbiAgICBsZWZ0SGFuZEl0ZW1zLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSwgXCJnYXRoZXJFbnRyaWVzXCIpKTtcbiAgcmlnaHRIYW5kT3BlcmFuZC5mb3JFYWNoKC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gZ2F0aGVyRW50cmllcyhrZXksIHZhbHVlKSB7XG4gICAgcmlnaHRIYW5kSXRlbXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9LCBcImdhdGhlckVudHJpZXNcIikpO1xuICByZXR1cm4gaXRlcmFibGVFcXVhbChsZWZ0SGFuZEl0ZW1zLnNvcnQoKSwgcmlnaHRIYW5kSXRlbXMuc29ydCgpLCBvcHRpb25zKTtcbn1cbl9fbmFtZShlbnRyaWVzRXF1YWwsIFwiZW50cmllc0VxdWFsXCIpO1xuZnVuY3Rpb24gaXRlcmFibGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbmd0aCA9IGxlZnRIYW5kT3BlcmFuZC5sZW5ndGg7XG4gIGlmIChsZW5ndGggIT09IHJpZ2h0SGFuZE9wZXJhbmQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZFtpbmRleF0sIHJpZ2h0SGFuZE9wZXJhbmRbaW5kZXhdLCBvcHRpb25zKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5fX25hbWUoaXRlcmFibGVFcXVhbCwgXCJpdGVyYWJsZUVxdWFsXCIpO1xuZnVuY3Rpb24gZ2VuZXJhdG9yRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIHJldHVybiBpdGVyYWJsZUVxdWFsKGdldEdlbmVyYXRvckVudHJpZXMobGVmdEhhbmRPcGVyYW5kKSwgZ2V0R2VuZXJhdG9yRW50cmllcyhyaWdodEhhbmRPcGVyYW5kKSwgb3B0aW9ucyk7XG59XG5fX25hbWUoZ2VuZXJhdG9yRXF1YWwsIFwiZ2VuZXJhdG9yRXF1YWxcIik7XG5mdW5jdGlvbiBoYXNJdGVyYXRvckZ1bmN0aW9uKHRhcmdldCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdID09PSBcImZ1bmN0aW9uXCI7XG59XG5fX25hbWUoaGFzSXRlcmF0b3JGdW5jdGlvbiwgXCJoYXNJdGVyYXRvckZ1bmN0aW9uXCIpO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JFbnRyaWVzKHRhcmdldCkge1xuICBpZiAoaGFzSXRlcmF0b3JGdW5jdGlvbih0YXJnZXQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBnZXRHZW5lcmF0b3JFbnRyaWVzKHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdKCkpO1xuICAgIH0gY2F0Y2ggKGl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuX19uYW1lKGdldEl0ZXJhdG9yRW50cmllcywgXCJnZXRJdGVyYXRvckVudHJpZXNcIik7XG5mdW5jdGlvbiBnZXRHZW5lcmF0b3JFbnRyaWVzKGdlbmVyYXRvcikge1xuICB2YXIgZ2VuZXJhdG9yUmVzdWx0ID0gZ2VuZXJhdG9yLm5leHQoKTtcbiAgdmFyIGFjY3VtdWxhdG9yID0gW2dlbmVyYXRvclJlc3VsdC52YWx1ZV07XG4gIHdoaWxlIChnZW5lcmF0b3JSZXN1bHQuZG9uZSA9PT0gZmFsc2UpIHtcbiAgICBnZW5lcmF0b3JSZXN1bHQgPSBnZW5lcmF0b3IubmV4dCgpO1xuICAgIGFjY3VtdWxhdG9yLnB1c2goZ2VuZXJhdG9yUmVzdWx0LnZhbHVlKTtcbiAgfVxuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5fX25hbWUoZ2V0R2VuZXJhdG9yRW50cmllcywgXCJnZXRHZW5lcmF0b3JFbnRyaWVzXCIpO1xuZnVuY3Rpb24gZ2V0RW51bWVyYWJsZUtleXModGFyZ2V0KSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiB0YXJnZXQpIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4ga2V5cztcbn1cbl9fbmFtZShnZXRFbnVtZXJhYmxlS2V5cywgXCJnZXRFbnVtZXJhYmxlS2V5c1wiKTtcbmZ1bmN0aW9uIGdldEVudW1lcmFibGVTeW1ib2xzKHRhcmdldCkge1xuICB2YXIga2V5cyA9IFtdO1xuICB2YXIgYWxsS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxLZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGtleSA9IGFsbEtleXNbaV07XG4gICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpLmVudW1lcmFibGUpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2V5cztcbn1cbl9fbmFtZShnZXRFbnVtZXJhYmxlU3ltYm9scywgXCJnZXRFbnVtZXJhYmxlU3ltYm9sc1wiKTtcbmZ1bmN0aW9uIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGtleXMsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChkZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kW2tleXNbaV1dLCByaWdodEhhbmRPcGVyYW5kW2tleXNbaV1dLCBvcHRpb25zKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5fX25hbWUoa2V5c0VxdWFsLCBcImtleXNFcXVhbFwiKTtcbmZ1bmN0aW9uIG9iamVjdEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICB2YXIgbGVmdEhhbmRLZXlzID0gZ2V0RW51bWVyYWJsZUtleXMobGVmdEhhbmRPcGVyYW5kKTtcbiAgdmFyIHJpZ2h0SGFuZEtleXMgPSBnZXRFbnVtZXJhYmxlS2V5cyhyaWdodEhhbmRPcGVyYW5kKTtcbiAgdmFyIGxlZnRIYW5kU3ltYm9scyA9IGdldEVudW1lcmFibGVTeW1ib2xzKGxlZnRIYW5kT3BlcmFuZCk7XG4gIHZhciByaWdodEhhbmRTeW1ib2xzID0gZ2V0RW51bWVyYWJsZVN5bWJvbHMocmlnaHRIYW5kT3BlcmFuZCk7XG4gIGxlZnRIYW5kS2V5cyA9IGxlZnRIYW5kS2V5cy5jb25jYXQobGVmdEhhbmRTeW1ib2xzKTtcbiAgcmlnaHRIYW5kS2V5cyA9IHJpZ2h0SGFuZEtleXMuY29uY2F0KHJpZ2h0SGFuZFN5bWJvbHMpO1xuICBpZiAobGVmdEhhbmRLZXlzLmxlbmd0aCAmJiBsZWZ0SGFuZEtleXMubGVuZ3RoID09PSByaWdodEhhbmRLZXlzLmxlbmd0aCkge1xuICAgIGlmIChpdGVyYWJsZUVxdWFsKG1hcFN5bWJvbHMobGVmdEhhbmRLZXlzKS5zb3J0KCksIG1hcFN5bWJvbHMocmlnaHRIYW5kS2V5cykuc29ydCgpKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kS2V5cywgb3B0aW9ucyk7XG4gIH1cbiAgdmFyIGxlZnRIYW5kRW50cmllcyA9IGdldEl0ZXJhdG9yRW50cmllcyhsZWZ0SGFuZE9wZXJhbmQpO1xuICB2YXIgcmlnaHRIYW5kRW50cmllcyA9IGdldEl0ZXJhdG9yRW50cmllcyhyaWdodEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kRW50cmllcy5sZW5ndGggJiYgbGVmdEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gcmlnaHRIYW5kRW50cmllcy5sZW5ndGgpIHtcbiAgICBsZWZ0SGFuZEVudHJpZXMuc29ydCgpO1xuICAgIHJpZ2h0SGFuZEVudHJpZXMuc29ydCgpO1xuICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKGxlZnRIYW5kRW50cmllcywgcmlnaHRIYW5kRW50cmllcywgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGxlZnRIYW5kS2V5cy5sZW5ndGggPT09IDAgJiYgbGVmdEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gMCAmJiByaWdodEhhbmRLZXlzLmxlbmd0aCA9PT0gMCAmJiByaWdodEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbl9fbmFtZShvYmplY3RFcXVhbCwgXCJvYmplY3RFcXVhbFwiKTtcbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCI7XG59XG5fX25hbWUoaXNQcmltaXRpdmUsIFwiaXNQcmltaXRpdmVcIik7XG5mdW5jdGlvbiBtYXBTeW1ib2xzKGFycikge1xuICByZXR1cm4gYXJyLm1hcCgvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIG1hcFN5bWJvbChlbnRyeSkge1xuICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgIHJldHVybiBlbnRyeS50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH0sIFwibWFwU3ltYm9sXCIpKTtcbn1cbl9fbmFtZShtYXBTeW1ib2xzLCBcIm1hcFN5bWJvbHNcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9wYXRodmFsL2luZGV4LmpzXG5mdW5jdGlvbiBoYXNQcm9wZXJ0eShvYmosIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgfHwgb2JqID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBuYW1lIGluIE9iamVjdChvYmopO1xufVxuX19uYW1lKGhhc1Byb3BlcnR5LCBcImhhc1Byb3BlcnR5XCIpO1xuZnVuY3Rpb24gcGFyc2VQYXRoKHBhdGgpIHtcbiAgY29uc3Qgc3RyID0gcGF0aC5yZXBsYWNlKC8oW15cXFxcXSlcXFsvZywgXCIkMS5bXCIpO1xuICBjb25zdCBwYXJ0cyA9IHN0ci5tYXRjaCgvKFxcXFxcXC58W14uXSs/KSsvZyk7XG4gIHJldHVybiBwYXJ0cy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBcImNvbnN0cnVjdG9yXCIgfHwgdmFsdWUgPT09IFwiX19wcm90b19fXCIgfHwgdmFsdWUgPT09IFwicHJvdG90eXBlXCIpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgcmVnZXhwID0gL15cXFsoXFxkKylcXF0kLztcbiAgICBjb25zdCBtQXJyID0gcmVnZXhwLmV4ZWModmFsdWUpO1xuICAgIGxldCBwYXJzZWQgPSBudWxsO1xuICAgIGlmIChtQXJyKSB7XG4gICAgICBwYXJzZWQgPSB7IGk6IHBhcnNlRmxvYXQobUFyclsxXSkgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VkID0geyBwOiB2YWx1ZS5yZXBsYWNlKC9cXFxcKFsuW1xcXV0pL2csIFwiJDFcIikgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfSk7XG59XG5fX25hbWUocGFyc2VQYXRoLCBcInBhcnNlUGF0aFwiKTtcbmZ1bmN0aW9uIGludGVybmFsR2V0UGF0aFZhbHVlKG9iaiwgcGFyc2VkLCBwYXRoRGVwdGgpIHtcbiAgbGV0IHRlbXBvcmFyeVZhbHVlID0gb2JqO1xuICBsZXQgcmVzID0gbnVsbDtcbiAgcGF0aERlcHRoID0gdHlwZW9mIHBhdGhEZXB0aCA9PT0gXCJ1bmRlZmluZWRcIiA/IHBhcnNlZC5sZW5ndGggOiBwYXRoRGVwdGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aERlcHRoOyBpKyspIHtcbiAgICBjb25zdCBwYXJ0ID0gcGFyc2VkW2ldO1xuICAgIGlmICh0ZW1wb3JhcnlWYWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwYXJ0LnAgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSB0ZW1wb3JhcnlWYWx1ZVtwYXJ0LmldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSB0ZW1wb3JhcnlWYWx1ZVtwYXJ0LnBdO1xuICAgICAgfVxuICAgICAgaWYgKGkgPT09IHBhdGhEZXB0aCAtIDEpIHtcbiAgICAgICAgcmVzID0gdGVtcG9yYXJ5VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5fX25hbWUoaW50ZXJuYWxHZXRQYXRoVmFsdWUsIFwiaW50ZXJuYWxHZXRQYXRoVmFsdWVcIik7XG5mdW5jdGlvbiBnZXRQYXRoSW5mbyhvYmosIHBhdGgpIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VQYXRoKHBhdGgpO1xuICBjb25zdCBsYXN0ID0gcGFyc2VkW3BhcnNlZC5sZW5ndGggLSAxXTtcbiAgY29uc3QgaW5mbyA9IHtcbiAgICBwYXJlbnQ6IHBhcnNlZC5sZW5ndGggPiAxID8gaW50ZXJuYWxHZXRQYXRoVmFsdWUob2JqLCBwYXJzZWQsIHBhcnNlZC5sZW5ndGggLSAxKSA6IG9iaixcbiAgICBuYW1lOiBsYXN0LnAgfHwgbGFzdC5pLFxuICAgIHZhbHVlOiBpbnRlcm5hbEdldFBhdGhWYWx1ZShvYmosIHBhcnNlZClcbiAgfTtcbiAgaW5mby5leGlzdHMgPSBoYXNQcm9wZXJ0eShpbmZvLnBhcmVudCwgaW5mby5uYW1lKTtcbiAgcmV0dXJuIGluZm87XG59XG5fX25hbWUoZ2V0UGF0aEluZm8sIFwiZ2V0UGF0aEluZm9cIik7XG5cbi8vIGxpYi9jaGFpL2Fzc2VydGlvbi5qc1xudmFyIF9Bc3NlcnRpb24gPSBjbGFzcyBfQXNzZXJ0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgb2JqZWN0IGZvciBjaGFpbmluZy5cbiAgICogYEFzc2VydGlvbmAgb2JqZWN0cyBjb250YWluIG1ldGFkYXRhIGluIHRoZSBmb3JtIG9mIGZsYWdzLiBUaHJlZSBmbGFncyBjYW5cbiAgICogYmUgYXNzaWduZWQgZHVyaW5nIGluc3RhbnRpYXRpb24gYnkgcGFzc2luZyBhcmd1bWVudHMgdG8gdGhpcyBjb25zdHJ1Y3RvcjpcbiAgICpcbiAgICogLSBgb2JqZWN0YDogVGhpcyBmbGFnIGNvbnRhaW5zIHRoZSB0YXJnZXQgb2YgdGhlIGFzc2VydGlvbi4gRm9yIGV4YW1wbGUsIGluXG4gICAqIHRoZSBhc3NlcnRpb24gYGV4cGVjdChudW1LaXR0ZW5zKS50by5lcXVhbCg3KTtgLCB0aGUgYG9iamVjdGAgZmxhZyB3aWxsXG4gICAqIGNvbnRhaW4gYG51bUtpdHRlbnNgIHNvIHRoYXQgdGhlIGBlcXVhbGAgYXNzZXJ0aW9uIGNhbiByZWZlcmVuY2UgaXQgd2hlblxuICAgKiBuZWVkZWQuXG4gICAqXG4gICAqIC0gYG1lc3NhZ2VgOiBUaGlzIGZsYWcgY29udGFpbnMgYW4gb3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmVcbiAgICogcHJlcGVuZGVkIHRvIHRoZSBlcnJvciBtZXNzYWdlIHRoYXQncyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VydGlvbiB3aGVuIGl0XG4gICAqIGZhaWxzLlxuICAgKlxuICAgKiAtIGBzc2ZpYDogVGhpcyBmbGFnIHN0YW5kcyBmb3IgXCJzdGFydCBzdGFjayBmdW5jdGlvbiBpbmRpY2F0b3JcIi4gSXRcbiAgICogY29udGFpbnMgYSBmdW5jdGlvbiByZWZlcmVuY2UgdGhhdCBzZXJ2ZXMgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvclxuICAgKiByZW1vdmluZyBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIGVycm9yIHRoYXQncyBjcmVhdGVkIGJ5IHRoZVxuICAgKiBhc3NlcnRpb24gd2hlbiBpdCBmYWlscy4gVGhlIGdvYWwgaXMgdG8gcHJvdmlkZSBhIGNsZWFuZXIgc3RhY2sgdHJhY2UgdG9cbiAgICogZW5kIHVzZXJzIGJ5IHJlbW92aW5nIENoYWkncyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdGUgdGhhdCBpdCBvbmx5IHdvcmtzXG4gICAqIGluIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgYEVycm9yLmNhcHR1cmVTdGFja1RyYWNlYCwgYW5kIG9ubHkgd2hlblxuICAgKiBgQ2hhaS5jb25maWcuaW5jbHVkZVN0YWNrYCBoYXNuJ3QgYmVlbiBzZXQgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogLSBgbG9ja1NzZmlgOiBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIGBzc2ZpYCBmbGFnXG4gICAqIHNob3VsZCByZXRhaW4gaXRzIGN1cnJlbnQgdmFsdWUsIGV2ZW4gYXMgYXNzZXJ0aW9ucyBhcmUgY2hhaW5lZCBvZmYgb2ZcbiAgICogdGhpcyBvYmplY3QuIFRoaXMgaXMgdXN1YWxseSBzZXQgdG8gYHRydWVgIHdoZW4gY3JlYXRpbmcgYSBuZXcgYXNzZXJ0aW9uXG4gICAqIGZyb20gd2l0aGluIGFub3RoZXIgYXNzZXJ0aW9uLiBJdCdzIGFsc28gdGVtcG9yYXJpbHkgc2V0IHRvIGB0cnVlYCBiZWZvcmVcbiAgICogYW4gb3ZlcndyaXR0ZW4gYXNzZXJ0aW9uIGdldHMgY2FsbGVkIGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uXG4gICAqXG4gICAqIC0gYGVxbGA6IFRoaXMgZmxhZyBjb250YWlucyB0aGUgZGVlcEVxdWFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYnkgdGhlIGFzc2VydGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHt1bmtub3dufSBvYmogdGFyZ2V0IG9mIHRoZSBhc3NlcnRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFttc2ddIChvcHRpb25hbCkgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3NzZmldIChvcHRpb25hbCkgc3RhcnRpbmcgcG9pbnQgZm9yIHJlbW92aW5nIHN0YWNrIGZyYW1lc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtsb2NrU3NmaV0gKG9wdGlvbmFsKSB3aGV0aGVyIG9yIG5vdCB0aGUgc3NmaSBmbGFnIGlzIGxvY2tlZFxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqLCBtc2csIHNzZmksIGxvY2tTc2ZpKSB7XG4gICAgLyoqIEB0eXBlIHt7fX0gKi9cbiAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsIFwiX19mbGFnc1wiLCB7fSk7XG4gICAgZmxhZyh0aGlzLCBcInNzZmlcIiwgc3NmaSB8fCBfQXNzZXJ0aW9uKTtcbiAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgbG9ja1NzZmkpO1xuICAgIGZsYWcodGhpcywgXCJvYmplY3RcIiwgb2JqKTtcbiAgICBmbGFnKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICAgIGZsYWcodGhpcywgXCJlcWxcIiwgY29uZmlnLmRlZXBFcXVhbCB8fCBkZWVwX2VxbF9kZWZhdWx0KTtcbiAgICByZXR1cm4gcHJveGlmeSh0aGlzKTtcbiAgfVxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIHN0YXRpYyBnZXQgaW5jbHVkZVN0YWNrKCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiQXNzZXJ0aW9uLmluY2x1ZGVTdGFjayBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuaW5jbHVkZVN0YWNrIGluc3RlYWQuXCJcbiAgICApO1xuICAgIHJldHVybiBjb25maWcuaW5jbHVkZVN0YWNrO1xuICB9XG4gIC8qKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlICovXG4gIHN0YXRpYyBzZXQgaW5jbHVkZVN0YWNrKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJBc3NlcnRpb24uaW5jbHVkZVN0YWNrIGlzIGRlcHJlY2F0ZWQsIHVzZSBjaGFpLmNvbmZpZy5pbmNsdWRlU3RhY2sgaW5zdGVhZC5cIlxuICAgICk7XG4gICAgY29uZmlnLmluY2x1ZGVTdGFjayA9IHZhbHVlO1xuICB9XG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgc3RhdGljIGdldCBzaG93RGlmZigpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIkFzc2VydGlvbi5zaG93RGlmZiBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuc2hvd0RpZmYgaW5zdGVhZC5cIlxuICAgICk7XG4gICAgcmV0dXJuIGNvbmZpZy5zaG93RGlmZjtcbiAgfVxuICAvKiogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAqL1xuICBzdGF0aWMgc2V0IHNob3dEaWZmKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJBc3NlcnRpb24uc2hvd0RpZmYgaXMgZGVwcmVjYXRlZCwgdXNlIGNoYWkuY29uZmlnLnNob3dEaWZmIGluc3RlYWQuXCJcbiAgICApO1xuICAgIGNvbmZpZy5zaG93RGlmZiA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKi9cbiAgc3RhdGljIGFkZFByb3BlcnR5KG5hbWUsIGZuKSB7XG4gICAgYWRkUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICovXG4gIHN0YXRpYyBhZGRNZXRob2QobmFtZSwgZm4pIHtcbiAgICBhZGRNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhaW5pbmdCZWhhdmlvclxuICAgKi9cbiAgc3RhdGljIGFkZENoYWluYWJsZU1ldGhvZChuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIGFkZENoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKi9cbiAgc3RhdGljIG92ZXJ3cml0ZVByb3BlcnR5KG5hbWUsIGZuKSB7XG4gICAgb3ZlcndyaXRlUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICovXG4gIHN0YXRpYyBvdmVyd3JpdGVNZXRob2QobmFtZSwgZm4pIHtcbiAgICBvdmVyd3JpdGVNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhaW5pbmdCZWhhdmlvclxuICAgKi9cbiAgc3RhdGljIG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZChuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICB9XG4gIC8qKlxuICAgKiAjIyMgLmFzc2VydChleHByZXNzaW9uLCBtZXNzYWdlLCBuZWdhdGVNZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsLCBzaG93RGlmZilcbiAgICpcbiAgICogRXhlY3V0ZXMgYW4gZXhwcmVzc2lvbiBhbmQgY2hlY2sgZXhwZWN0YXRpb25zLiBUaHJvd3MgQXNzZXJ0aW9uRXJyb3IgZm9yIHJlcG9ydGluZyBpZiB0ZXN0IGRvZXNuJ3QgcGFzcy5cbiAgICpcbiAgICogQG5hbWUgYXNzZXJ0XG4gICAqIEBwYXJhbSB7dW5rbm93bn0gX2V4cHIgdG8gYmUgdGVzdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgRnVuY3Rpb259IG1zZyBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGV4cHJlc3Npb24gZmFpbHNcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBGdW5jdGlvbn0gX25lZ2F0ZU1zZyBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgbmVnYXRlZE1lc3NhZ2UgdG8gZGlzcGxheSBpZiBuZWdhdGVkIGV4cHJlc3Npb24gZmFpbHNcbiAgICogQHBhcmFtIHt1bmtub3dufSBleHBlY3RlZCB2YWx1ZSAocmVtZW1iZXIgdG8gY2hlY2sgZm9yIG5lZ2F0aW9uKVxuICAgKiBAcGFyYW0ge3Vua25vd259IF9hY3R1YWwgKG9wdGlvbmFsKSB3aWxsIGRlZmF1bHQgdG8gYHRoaXMub2JqYFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dEaWZmIChvcHRpb25hbCkgd2hlbiBzZXQgdG8gYHRydWVgLCBhc3NlcnQgd2lsbCBkaXNwbGF5IGEgZGlmZiBpbiBhZGRpdGlvbiB0byB0aGUgbWVzc2FnZSBpZiBleHByZXNzaW9uIGZhaWxzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXNzZXJ0KF9leHByLCBtc2csIF9uZWdhdGVNc2csIGV4cGVjdGVkLCBfYWN0dWFsLCBzaG93RGlmZikge1xuICAgIGNvbnN0IG9rID0gdGVzdCh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChmYWxzZSAhPT0gc2hvd0RpZmYpIHNob3dEaWZmID0gdHJ1ZTtcbiAgICBpZiAodm9pZCAwID09PSBleHBlY3RlZCAmJiB2b2lkIDAgPT09IF9hY3R1YWwpIHNob3dEaWZmID0gZmFsc2U7XG4gICAgaWYgKHRydWUgIT09IGNvbmZpZy5zaG93RGlmZikgc2hvd0RpZmYgPSBmYWxzZTtcbiAgICBpZiAoIW9rKSB7XG4gICAgICBtc2cgPSBnZXRNZXNzYWdlMih0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgY29uc3QgYWN0dWFsID0gZ2V0QWN0dWFsKHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBjb25zdCBhc3NlcnRpb25FcnJvck9iamVjdFByb3BlcnRpZXMgPSB7XG4gICAgICAgIGFjdHVhbCxcbiAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgIHNob3dEaWZmXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3BlcmF0b3IgPSBnZXRPcGVyYXRvcih0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKG9wZXJhdG9yKSB7XG4gICAgICAgIGFzc2VydGlvbkVycm9yT2JqZWN0UHJvcGVydGllcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBtc2csXG4gICAgICAgIGFzc2VydGlvbkVycm9yT2JqZWN0UHJvcGVydGllcyxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb3Qgc3VyZSB3aGF0IHRvIGRvIGFib3V0IHRoZXNlIHR5cGVzIHlldFxuICAgICAgICBjb25maWcuaW5jbHVkZVN0YWNrID8gdGhpcy5hc3NlcnQgOiBmbGFnKHRoaXMsIFwic3NmaVwiKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFF1aWNrIHJlZmVyZW5jZSB0byBzdG9yZWQgYGFjdHVhbGAgdmFsdWUgZm9yIHBsdWdpbiBkZXZlbG9wZXJzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dW5rbm93bn1cbiAgICovXG4gIGdldCBfb2JqKCkge1xuICAgIHJldHVybiBmbGFnKHRoaXMsIFwib2JqZWN0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBRdWljayByZWZlcmVuY2UgdG8gc3RvcmVkIGBhY3R1YWxgIHZhbHVlIGZvciBwbHVnaW4gZGV2ZWxvcGVycy5cbiAgICpcbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWxcbiAgICovXG4gIHNldCBfb2JqKHZhbCkge1xuICAgIGZsYWcodGhpcywgXCJvYmplY3RcIiwgdmFsKTtcbiAgfVxufTtcbl9fbmFtZShfQXNzZXJ0aW9uLCBcIkFzc2VydGlvblwiKTtcbnZhciBBc3NlcnRpb24gPSBfQXNzZXJ0aW9uO1xuXG4vLyBsaWIvY2hhaS91dGlscy9ldmVudHMuanNcbnZhciBldmVudHMgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbnZhciBfUGx1Z2luRXZlbnQgPSBjbGFzcyBfUGx1Z2luRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIGNvbnN0cnVjdG9yKHR5cGUzLCBuYW1lLCBmbikge1xuICAgIHN1cGVyKHR5cGUzKTtcbiAgICB0aGlzLm5hbWUgPSBTdHJpbmcobmFtZSk7XG4gICAgdGhpcy5mbiA9IGZuO1xuICB9XG59O1xuX19uYW1lKF9QbHVnaW5FdmVudCwgXCJQbHVnaW5FdmVudFwiKTtcbnZhciBQbHVnaW5FdmVudCA9IF9QbHVnaW5FdmVudDtcblxuLy8gbGliL2NoYWkvdXRpbHMvaXNQcm94eUVuYWJsZWQuanNcbmZ1bmN0aW9uIGlzUHJveHlFbmFibGVkKCkge1xuICByZXR1cm4gY29uZmlnLnVzZVByb3h5ICYmIHR5cGVvZiBQcm94eSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIjtcbn1cbl9fbmFtZShpc1Byb3h5RW5hYmxlZCwgXCJpc1Byb3h5RW5hYmxlZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvYWRkUHJvcGVydHkuanNcbmZ1bmN0aW9uIGFkZFByb3BlcnR5KGN0eCwgbmFtZSwgZ2V0dGVyKSB7XG4gIGdldHRlciA9IGdldHRlciA9PT0gdm9pZCAwID8gZnVuY3Rpb24oKSB7XG4gIH0gOiBnZXR0ZXI7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcHJvcGVydHlHZXR0ZXIoKSB7XG4gICAgICBpZiAoIWlzUHJveHlFbmFibGVkKCkgJiYgIWZsYWcodGhpcywgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBwcm9wZXJ0eUdldHRlcik7XG4gICAgICB9XG4gICAgICBsZXQgcmVzdWx0ID0gZ2V0dGVyLmNhbGwodGhpcyk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApIHJldHVybiByZXN1bHQ7XG4gICAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgICB9LCBcInByb3BlcnR5R2V0dGVyXCIpLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgZXZlbnRzLmRpc3BhdGNoRXZlbnQobmV3IFBsdWdpbkV2ZW50KFwiYWRkUHJvcGVydHlcIiwgbmFtZSwgZ2V0dGVyKSk7XG59XG5fX25hbWUoYWRkUHJvcGVydHksIFwiYWRkUHJvcGVydHlcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2FkZExlbmd0aEd1YXJkLmpzXG52YXIgZm5MZW5ndGhEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmdW5jdGlvbigpIHtcbn0sIFwibGVuZ3RoXCIpO1xuZnVuY3Rpb24gYWRkTGVuZ3RoR3VhcmQoZm4sIGFzc2VydGlvbk5hbWUsIGlzQ2hhaW5hYmxlKSB7XG4gIGlmICghZm5MZW5ndGhEZXNjLmNvbmZpZ3VyYWJsZSkgcmV0dXJuIGZuO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIFwibGVuZ3RoXCIsIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoaXNDaGFpbmFibGUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBEdWUgdG8gYSBjb21wYXRpYmlsaXR5IGlzc3VlLCBcImxlbmd0aFwiIGNhbm5vdCBkaXJlY3RseSBmb2xsb3cgXCInICsgYXNzZXJ0aW9uTmFtZSArICdcIi4gVXNlIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnLmxlbmd0aE9mXCIgaW5zdGVhZC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBTZWUgZG9jcyBmb3IgcHJvcGVyIHVzYWdlIG9mIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnXCIuJ1xuICAgICAgKTtcbiAgICB9LCBcImdldFwiKVxuICB9KTtcbiAgcmV0dXJuIGZuO1xufVxuX19uYW1lKGFkZExlbmd0aEd1YXJkLCBcImFkZExlbmd0aEd1YXJkXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9nZXRQcm9wZXJ0aWVzLmpzXG5mdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKG9iamVjdCkge1xuICBsZXQgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KTtcbiAgZnVuY3Rpb24gYWRkUHJvcGVydHkyKHByb3BlcnR5KSB7XG4gICAgaWYgKHJlc3VsdC5pbmRleE9mKHByb3BlcnR5KSA9PT0gLTEpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG4gIH1cbiAgX19uYW1lKGFkZFByb3BlcnR5MiwgXCJhZGRQcm9wZXJ0eVwiKTtcbiAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gIHdoaWxlIChwcm90byAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKS5mb3JFYWNoKGFkZFByb3BlcnR5Mik7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5fX25hbWUoZ2V0UHJvcGVydGllcywgXCJnZXRQcm9wZXJ0aWVzXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9wcm94aWZ5LmpzXG52YXIgYnVpbHRpbnMgPSBbXCJfX2ZsYWdzXCIsIFwiX19tZXRob2RzXCIsIFwiX29ialwiLCBcImFzc2VydFwiXTtcbmZ1bmN0aW9uIHByb3hpZnkob2JqLCBub25DaGFpbmFibGVNZXRob2ROYW1lKSB7XG4gIGlmICghaXNQcm94eUVuYWJsZWQoKSkgcmV0dXJuIG9iajtcbiAgcmV0dXJuIG5ldyBQcm94eShvYmosIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcHJveHlHZXR0ZXIodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIiAmJiBjb25maWcucHJveHlFeGNsdWRlZEtleXMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmICFSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3BlcnR5KSkge1xuICAgICAgICBpZiAobm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgbm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSArIFwiLlwiICsgcHJvcGVydHkgKyAnLiBTZWUgZG9jcyBmb3IgcHJvcGVyIHVzYWdlIG9mIFwiJyArIG5vbkNoYWluYWJsZU1ldGhvZE5hbWUgKyAnXCIuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN1Z2dlc3Rpb24gPSBudWxsO1xuICAgICAgICBsZXQgc3VnZ2VzdGlvbkRpc3RhbmNlID0gNDtcbiAgICAgICAgZ2V0UHJvcGVydGllcyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHdlIGFjdHVhbGx5IG1lYW4gdG8gY2hlY2sgYE9iamVjdC5wcm90b3R5cGVgIGhlcmVcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KHByb3ApICYmIGJ1aWx0aW5zLmluZGV4T2YocHJvcCkgPT09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgZGlzdCA9IHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHByb3BlcnR5LCBwcm9wLCBzdWdnZXN0aW9uRGlzdGFuY2UpO1xuICAgICAgICAgICAgaWYgKGRpc3QgPCBzdWdnZXN0aW9uRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IHByb3A7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25EaXN0YW5jZSA9IGRpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHN1Z2dlc3Rpb24gIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiSW52YWxpZCBDaGFpIHByb3BlcnR5OiBcIiArIHByb3BlcnR5ICsgJy4gRGlkIHlvdSBtZWFuIFwiJyArIHN1Z2dlc3Rpb24gKyAnXCI/J1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgcHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYnVpbHRpbnMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmICFmbGFnKHRhcmdldCwgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICBmbGFnKHRhcmdldCwgXCJzc2ZpXCIsIHByb3h5R2V0dGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICB9LCBcInByb3h5R2V0dGVyXCIpXG4gIH0pO1xufVxuX19uYW1lKHByb3hpZnksIFwicHJveGlmeVwiKTtcbmZ1bmN0aW9uIHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHN0ckEsIHN0ckIsIGNhcCkge1xuICBpZiAoTWF0aC5hYnMoc3RyQS5sZW5ndGggLSBzdHJCLmxlbmd0aCkgPj0gY2FwKSB7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuICBsZXQgbWVtbyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdHJBLmxlbmd0aDsgaSsrKSB7XG4gICAgbWVtb1tpXSA9IEFycmF5KHN0ckIubGVuZ3RoICsgMSkuZmlsbCgwKTtcbiAgICBtZW1vW2ldWzBdID0gaTtcbiAgfVxuICBmb3IgKGxldCBqID0gMDsgaiA8IHN0ckIubGVuZ3RoOyBqKyspIHtcbiAgICBtZW1vWzBdW2pdID0gajtcbiAgfVxuICBmb3IgKGxldCBpID0gMTsgaSA8PSBzdHJBLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGNoID0gc3RyQS5jaGFyQ29kZUF0KGkgLSAxKTtcbiAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBzdHJCLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoaSAtIGopID49IGNhcCkge1xuICAgICAgICBtZW1vW2ldW2pdID0gY2FwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1lbW9baV1bal0gPSBNYXRoLm1pbihcbiAgICAgICAgbWVtb1tpIC0gMV1bal0gKyAxLFxuICAgICAgICBtZW1vW2ldW2ogLSAxXSArIDEsXG4gICAgICAgIG1lbW9baSAtIDFdW2ogLSAxXSArIChjaCA9PT0gc3RyQi5jaGFyQ29kZUF0KGogLSAxKSA/IDAgOiAxKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lbW9bc3RyQS5sZW5ndGhdW3N0ckIubGVuZ3RoXTtcbn1cbl9fbmFtZShzdHJpbmdEaXN0YW5jZUNhcHBlZCwgXCJzdHJpbmdEaXN0YW5jZUNhcHBlZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvYWRkTWV0aG9kLmpzXG5mdW5jdGlvbiBhZGRNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QpIHtcbiAgbGV0IG1ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgIGlmICghZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpKSB7XG4gICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBtZXRob2RXcmFwcGVyKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkgcmV0dXJuIHJlc3VsdDtcbiAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9LCBcIm1ldGhvZFdyYXBwZXJcIik7XG4gIGFkZExlbmd0aEd1YXJkKG1ldGhvZFdyYXBwZXIsIG5hbWUsIGZhbHNlKTtcbiAgY3R4W25hbWVdID0gcHJveGlmeShtZXRob2RXcmFwcGVyLCBuYW1lKTtcbiAgZXZlbnRzLmRpc3BhdGNoRXZlbnQobmV3IFBsdWdpbkV2ZW50KFwiYWRkTWV0aG9kXCIsIG5hbWUsIG1ldGhvZCkpO1xufVxuX19uYW1lKGFkZE1ldGhvZCwgXCJhZGRNZXRob2RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL292ZXJ3cml0ZVByb3BlcnR5LmpzXG5mdW5jdGlvbiBvdmVyd3JpdGVQcm9wZXJ0eShjdHgsIG5hbWUsIGdldHRlcikge1xuICBsZXQgX2dldCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3R4LCBuYW1lKSwgX3N1cGVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHtcbiAgfSwgXCJfc3VwZXJcIik7XG4gIGlmIChfZ2V0ICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9nZXQuZ2V0KSBfc3VwZXIgPSBfZ2V0LmdldDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwgbmFtZSwge1xuICAgIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyKCkge1xuICAgICAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpICYmICFmbGFnKHRoaXMsIFwibG9ja1NzZmlcIikpIHtcbiAgICAgICAgZmxhZyh0aGlzLCBcInNzZmlcIiwgb3ZlcndyaXRpbmdQcm9wZXJ0eUdldHRlcik7XG4gICAgICB9XG4gICAgICBsZXQgb3JpZ0xvY2tTc2ZpID0gZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgICAgZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIsIHRydWUpO1xuICAgICAgbGV0IHJlc3VsdCA9IGdldHRlcihfc3VwZXIpLmNhbGwodGhpcyk7XG4gICAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgb3JpZ0xvY2tTc2ZpKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGV0IG5ld0Fzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24oKTtcbiAgICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgfSwgXCJvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyXCIpLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cbl9fbmFtZShvdmVyd3JpdGVQcm9wZXJ0eSwgXCJvdmVyd3JpdGVQcm9wZXJ0eVwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlTWV0aG9kLmpzXG5mdW5jdGlvbiBvdmVyd3JpdGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QpIHtcbiAgbGV0IF9tZXRob2QgPSBjdHhbbmFtZV0sIF9zdXBlciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgfSwgXCJfc3VwZXJcIik7XG4gIGlmIChfbWV0aG9kICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9tZXRob2QpIF9zdXBlciA9IF9tZXRob2Q7XG4gIGxldCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgIGlmICghZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpKSB7XG4gICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIpO1xuICAgIH1cbiAgICBsZXQgb3JpZ0xvY2tTc2ZpID0gZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgIGZsYWcodGhpcywgXCJsb2NrU3NmaVwiLCB0cnVlKTtcbiAgICBsZXQgcmVzdWx0ID0gbWV0aG9kKF9zdXBlcikuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgb3JpZ0xvY2tTc2ZpKTtcbiAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGxldCBuZXdBc3NlcnRpb24gPSBuZXcgQXNzZXJ0aW9uKCk7XG4gICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gIH0sIFwib3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyXCIpO1xuICBhZGRMZW5ndGhHdWFyZChvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIsIG5hbWUsIGZhbHNlKTtcbiAgY3R4W25hbWVdID0gcHJveGlmeShvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIsIG5hbWUpO1xufVxuX19uYW1lKG92ZXJ3cml0ZU1ldGhvZCwgXCJvdmVyd3JpdGVNZXRob2RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2FkZENoYWluYWJsZU1ldGhvZC5qc1xudmFyIGNhblNldFByb3RvdHlwZSA9IHR5cGVvZiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPT09IFwiZnVuY3Rpb25cIjtcbnZhciB0ZXN0Rm4gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xufSwgXCJ0ZXN0Rm5cIik7XG52YXIgZXhjbHVkZU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdEZuKS5maWx0ZXIoZnVuY3Rpb24obmFtZSkge1xuICBsZXQgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRlc3RGbiwgbmFtZSk7XG4gIGlmICh0eXBlb2YgcHJvcERlc2MgIT09IFwib2JqZWN0XCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIXByb3BEZXNjLmNvbmZpZ3VyYWJsZTtcbn0pO1xudmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcbnZhciBfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQgPSBjbGFzcyBfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQgZXh0ZW5kcyBQbHVnaW5FdmVudCB7XG4gIGNvbnN0cnVjdG9yKHR5cGUzLCBuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIHN1cGVyKHR5cGUzLCBuYW1lLCBmbik7XG4gICAgdGhpcy5jaGFpbmluZ0JlaGF2aW9yID0gY2hhaW5pbmdCZWhhdmlvcjtcbiAgfVxufTtcbl9fbmFtZShfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQsIFwiUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnRcIik7XG52YXIgUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQgPSBfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQ7XG5mdW5jdGlvbiBhZGRDaGFpbmFibGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QsIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgaWYgKHR5cGVvZiBjaGFpbmluZ0JlaGF2aW9yICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjaGFpbmluZ0JlaGF2aW9yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHtcbiAgICB9LCBcImNoYWluaW5nQmVoYXZpb3JcIik7XG4gIH1cbiAgbGV0IGNoYWluYWJsZUJlaGF2aW9yID0ge1xuICAgIG1ldGhvZCxcbiAgICBjaGFpbmluZ0JlaGF2aW9yXG4gIH07XG4gIGlmICghY3R4Ll9fbWV0aG9kcykge1xuICAgIGN0eC5fX21ldGhvZHMgPSB7fTtcbiAgfVxuICBjdHguX19tZXRob2RzW25hbWVdID0gY2hhaW5hYmxlQmVoYXZpb3I7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gY2hhaW5hYmxlTWV0aG9kR2V0dGVyKCkge1xuICAgICAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvci5jYWxsKHRoaXMpO1xuICAgICAgbGV0IGNoYWluYWJsZU1ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIWZsYWcodGhpcywgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICAgIGZsYWcodGhpcywgXCJzc2ZpXCIsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBjaGFpbmFibGVCZWhhdmlvci5tZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICB9LCBcImNoYWluYWJsZU1ldGhvZFdyYXBwZXJcIik7XG4gICAgICBhZGRMZW5ndGhHdWFyZChjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBuYW1lLCB0cnVlKTtcbiAgICAgIGlmIChjYW5TZXRQcm90b3R5cGUpIHtcbiAgICAgICAgbGV0IHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICAgIHByb3RvdHlwZS5jYWxsID0gY2FsbDtcbiAgICAgICAgcHJvdG90eXBlLmFwcGx5ID0gYXBwbHk7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBwcm90b3R5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGFzc2VydGVyTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjdHgpO1xuICAgICAgICBhc3NlcnRlck5hbWVzLmZvckVhY2goZnVuY3Rpb24oYXNzZXJ0ZXJOYW1lKSB7XG4gICAgICAgICAgaWYgKGV4Y2x1ZGVOYW1lcy5pbmRleE9mKGFzc2VydGVyTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3R4LCBhc3NlcnRlck5hbWUpO1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBhc3NlcnRlck5hbWUsIHBkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgcmV0dXJuIHByb3hpZnkoY2hhaW5hYmxlTWV0aG9kV3JhcHBlcik7XG4gICAgfSwgXCJjaGFpbmFibGVNZXRob2RHZXR0ZXJcIiksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBldmVudHMuZGlzcGF0Y2hFdmVudChcbiAgICBuZXcgUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQoXG4gICAgICBcImFkZENoYWluYWJsZU1ldGhvZFwiLFxuICAgICAgbmFtZSxcbiAgICAgIG1ldGhvZCxcbiAgICAgIGNoYWluaW5nQmVoYXZpb3JcbiAgICApXG4gICk7XG59XG5fX25hbWUoYWRkQ2hhaW5hYmxlTWV0aG9kLCBcImFkZENoYWluYWJsZU1ldGhvZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kLmpzXG5mdW5jdGlvbiBvdmVyd3JpdGVDaGFpbmFibGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QsIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgbGV0IGNoYWluYWJsZUJlaGF2aW9yID0gY3R4Ll9fbWV0aG9kc1tuYW1lXTtcbiAgbGV0IF9jaGFpbmluZ0JlaGF2aW9yID0gY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvcjtcbiAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gb3ZlcndyaXRpbmdDaGFpbmFibGVNZXRob2RHZXR0ZXIoKSB7XG4gICAgbGV0IHJlc3VsdCA9IGNoYWluaW5nQmVoYXZpb3IoX2NoYWluaW5nQmVoYXZpb3IpLmNhbGwodGhpcyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9LCBcIm92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kR2V0dGVyXCIpO1xuICBsZXQgX21ldGhvZCA9IGNoYWluYWJsZUJlaGF2aW9yLm1ldGhvZDtcbiAgY2hhaW5hYmxlQmVoYXZpb3IubWV0aG9kID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBvdmVyd3JpdGluZ0NoYWluYWJsZU1ldGhvZFdyYXBwZXIoKSB7XG4gICAgbGV0IHJlc3VsdCA9IG1ldGhvZChfbWV0aG9kKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbGV0IG5ld0Fzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24oKTtcbiAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgfSwgXCJvdmVyd3JpdGluZ0NoYWluYWJsZU1ldGhvZFdyYXBwZXJcIik7XG59XG5fX25hbWUob3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kLCBcIm92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvY29tcGFyZUJ5SW5zcGVjdC5qc1xuZnVuY3Rpb24gY29tcGFyZUJ5SW5zcGVjdChhLCBiKSB7XG4gIHJldHVybiBpbnNwZWN0MihhKSA8IGluc3BlY3QyKGIpID8gLTEgOiAxO1xufVxuX19uYW1lKGNvbXBhcmVCeUluc3BlY3QsIFwiY29tcGFyZUJ5SW5zcGVjdFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scy5qc1xuZnVuY3Rpb24gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmopIHtcbiAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKS5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW0pLmVudW1lcmFibGU7XG4gIH0pO1xufVxuX19uYW1lKGdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMsIFwiZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9sc1wiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXMuanNcbmZ1bmN0aW9uIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5jb25jYXQoZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmopKTtcbn1cbl9fbmFtZShnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcywgXCJnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllc1wiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvaXNOYU4uanNcbnZhciBpc05hTjIgPSBOdW1iZXIuaXNOYU47XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2dldE9wZXJhdG9yLmpzXG5mdW5jdGlvbiBpc09iamVjdFR5cGUob2JqKSB7XG4gIGxldCBvYmplY3RUeXBlID0gdHlwZShvYmopO1xuICBsZXQgb2JqZWN0VHlwZXMgPSBbXCJBcnJheVwiLCBcIk9iamVjdFwiLCBcIkZ1bmN0aW9uXCJdO1xuICByZXR1cm4gb2JqZWN0VHlwZXMuaW5kZXhPZihvYmplY3RUeXBlKSAhPT0gLTE7XG59XG5fX25hbWUoaXNPYmplY3RUeXBlLCBcImlzT2JqZWN0VHlwZVwiKTtcbmZ1bmN0aW9uIGdldE9wZXJhdG9yKG9iaiwgYXJncykge1xuICBsZXQgb3BlcmF0b3IgPSBmbGFnKG9iaiwgXCJvcGVyYXRvclwiKTtcbiAgbGV0IG5lZ2F0ZSA9IGZsYWcob2JqLCBcIm5lZ2F0ZVwiKTtcbiAgbGV0IGV4cGVjdGVkID0gYXJnc1szXTtcbiAgbGV0IG1zZyA9IG5lZ2F0ZSA/IGFyZ3NbMl0gOiBhcmdzWzFdO1xuICBpZiAob3BlcmF0b3IpIHtcbiAgICByZXR1cm4gb3BlcmF0b3I7XG4gIH1cbiAgaWYgKHR5cGVvZiBtc2cgPT09IFwiZnVuY3Rpb25cIikgbXNnID0gbXNnKCk7XG4gIG1zZyA9IG1zZyB8fCBcIlwiO1xuICBpZiAoIW1zZykge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKC9cXHNoYXZlXFxzLy50ZXN0KG1zZykpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGxldCBpc09iamVjdCA9IGlzT2JqZWN0VHlwZShleHBlY3RlZCk7XG4gIGlmICgvXFxzbm90XFxzLy50ZXN0KG1zZykpIHtcbiAgICByZXR1cm4gaXNPYmplY3QgPyBcIm5vdERlZXBTdHJpY3RFcXVhbFwiIDogXCJub3RTdHJpY3RFcXVhbFwiO1xuICB9XG4gIHJldHVybiBpc09iamVjdCA/IFwiZGVlcFN0cmljdEVxdWFsXCIgOiBcInN0cmljdEVxdWFsXCI7XG59XG5fX25hbWUoZ2V0T3BlcmF0b3IsIFwiZ2V0T3BlcmF0b3JcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2luZGV4LmpzXG5mdW5jdGlvbiBnZXROYW1lKGZuKSB7XG4gIHJldHVybiBmbi5uYW1lO1xufVxuX19uYW1lKGdldE5hbWUsIFwiZ2V0TmFtZVwiKTtcbmZ1bmN0aW9uIGlzUmVnRXhwMihvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xufVxuX19uYW1lKGlzUmVnRXhwMiwgXCJpc1JlZ0V4cFwiKTtcbmZ1bmN0aW9uIGlzTnVtZXJpYyhvYmopIHtcbiAgcmV0dXJuIFtcIk51bWJlclwiLCBcIkJpZ0ludFwiXS5pbmNsdWRlcyh0eXBlKG9iaikpO1xufVxuX19uYW1lKGlzTnVtZXJpYywgXCJpc051bWVyaWNcIik7XG5cbi8vIGxpYi9jaGFpL2NvcmUvYXNzZXJ0aW9ucy5qc1xudmFyIHsgZmxhZzogZmxhZzIgfSA9IHV0aWxzX2V4cG9ydHM7XG5bXG4gIFwidG9cIixcbiAgXCJiZVwiLFxuICBcImJlZW5cIixcbiAgXCJpc1wiLFxuICBcImFuZFwiLFxuICBcImhhc1wiLFxuICBcImhhdmVcIixcbiAgXCJ3aXRoXCIsXG4gIFwidGhhdFwiLFxuICBcIndoaWNoXCIsXG4gIFwiYXRcIixcbiAgXCJvZlwiLFxuICBcInNhbWVcIixcbiAgXCJidXRcIixcbiAgXCJkb2VzXCIsXG4gIFwic3RpbGxcIixcbiAgXCJhbHNvXCJcbl0uZm9yRWFjaChmdW5jdGlvbihjaGFpbikge1xuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoY2hhaW4pO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJub3RcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwibmVnYXRlXCIsIHRydWUpO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJkZWVwXCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcImRlZXBcIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm5lc3RlZFwiLCBmdW5jdGlvbigpIHtcbiAgZmxhZzIodGhpcywgXCJuZXN0ZWRcIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm93blwiLCBmdW5jdGlvbigpIHtcbiAgZmxhZzIodGhpcywgXCJvd25cIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm9yZGVyZWRcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwib3JkZXJlZFwiLCB0cnVlKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiYW55XCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcImFueVwiLCB0cnVlKTtcbiAgZmxhZzIodGhpcywgXCJhbGxcIiwgZmFsc2UpO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJhbGxcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwiYWxsXCIsIHRydWUpO1xuICBmbGFnMih0aGlzLCBcImFueVwiLCBmYWxzZSk7XG59KTtcbnZhciBmdW5jdGlvblR5cGVzID0ge1xuICBmdW5jdGlvbjogW1xuICAgIFwiZnVuY3Rpb25cIixcbiAgICBcImFzeW5jZnVuY3Rpb25cIixcbiAgICBcImdlbmVyYXRvcmZ1bmN0aW9uXCIsXG4gICAgXCJhc3luY2dlbmVyYXRvcmZ1bmN0aW9uXCJcbiAgXSxcbiAgYXN5bmNmdW5jdGlvbjogW1wiYXN5bmNmdW5jdGlvblwiLCBcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl0sXG4gIGdlbmVyYXRvcmZ1bmN0aW9uOiBbXCJnZW5lcmF0b3JmdW5jdGlvblwiLCBcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl0sXG4gIGFzeW5jZ2VuZXJhdG9yZnVuY3Rpb246IFtcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl1cbn07XG5mdW5jdGlvbiBhbih0eXBlMywgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB0eXBlMyA9IHR5cGUzLnRvTG93ZXJDYXNlKCk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgYXJ0aWNsZSA9IH5bXCJhXCIsIFwiZVwiLCBcImlcIiwgXCJvXCIsIFwidVwiXS5pbmRleE9mKHR5cGUzLmNoYXJBdCgwKSkgPyBcImFuIFwiIDogXCJhIFwiO1xuICBjb25zdCBkZXRlY3RlZFR5cGUgPSB0eXBlKG9iaikudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGZ1bmN0aW9uVHlwZXNbXCJmdW5jdGlvblwiXS5pbmNsdWRlcyh0eXBlMykpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGZ1bmN0aW9uVHlwZXNbdHlwZTNdLmluY2x1ZGVzKGRldGVjdGVkVHlwZSksXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgXCIgKyBhcnRpY2xlICsgdHlwZTMsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIFwiICsgYXJ0aWNsZSArIHR5cGUzXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIHR5cGUzID09PSBkZXRlY3RlZFR5cGUsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgXCIgKyBhcnRpY2xlICsgdHlwZTMsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIFwiICsgYXJ0aWNsZSArIHR5cGUzXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFuLCBcImFuXCIpO1xuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZChcImFuXCIsIGFuKTtcbkFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoXCJhXCIsIGFuKTtcbmZ1bmN0aW9uIFNhbWVWYWx1ZVplcm8oYSwgYikge1xuICByZXR1cm4gaXNOYU4yKGEpICYmIGlzTmFOMihiKSB8fCBhID09PSBiO1xufVxuX19uYW1lKFNhbWVWYWx1ZVplcm8sIFwiU2FtZVZhbHVlWmVyb1wiKTtcbmZ1bmN0aW9uIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKCkge1xuICBmbGFnMih0aGlzLCBcImNvbnRhaW5zXCIsIHRydWUpO1xufVxuX19uYW1lKGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yLCBcImluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yXCIpO1xuZnVuY3Rpb24gaW5jbHVkZSh2YWwsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG5lZ2F0ZSA9IGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBpc0RlZXAgPSBmbGFnMih0aGlzLCBcImRlZXBcIiksIGRlc2NyaXB0b3IgPSBpc0RlZXAgPyBcImRlZXAgXCIgOiBcIlwiLCBpc0VxbCA9IGlzRGVlcCA/IGZsYWcyKHRoaXMsIFwiZXFsXCIpIDogU2FtZVZhbHVlWmVybztcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgbGV0IGluY2x1ZGVkID0gZmFsc2U7XG4gIHN3aXRjaCAob2JqVHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGluY2x1ZGVkID0gb2JqLmluZGV4T2YodmFsKSAhPT0gLTE7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwid2Vha3NldFwiOlxuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArIFwidW5hYmxlIHRvIHVzZSAuZGVlcC5pbmNsdWRlIHdpdGggV2Vha1NldFwiLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpbmNsdWRlZCA9IG9iai5oYXModmFsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJtYXBcIjpcbiAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgaW5jbHVkZWQgPSBpbmNsdWRlZCB8fCBpc0VxbChpdGVtLCB2YWwpO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwic2V0XCI6XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICBpbmNsdWRlZCA9IGluY2x1ZGVkIHx8IGlzRXFsKGl0ZW0sIHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaGFzKHZhbCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouc29tZShmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGlzRXFsKGl0ZW0sIHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaW5kZXhPZih2YWwpICE9PSAtMTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGlmICh2YWwgIT09IE9iamVjdCh2YWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgICBmbGFnTXNnICsgXCJ0aGUgZ2l2ZW4gY29tYmluYXRpb24gb2YgYXJndW1lbnRzIChcIiArIG9ialR5cGUgKyBcIiBhbmQgXCIgKyB0eXBlKHZhbCkudG9Mb3dlckNhc2UoKSArIFwiKSBpcyBpbnZhbGlkIGZvciB0aGlzIGFzc2VydGlvbi4gWW91IGNhbiB1c2UgYW4gYXJyYXksIGEgbWFwLCBhbiBvYmplY3QsIGEgc2V0LCBhIHN0cmluZywgb3IgYSB3ZWFrc2V0IGluc3RlYWQgb2YgYSBcIiArIHR5cGUodmFsKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgcHJvcHMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgbGV0IGZpcnN0RXJyID0gbnVsbDtcbiAgICAgIGxldCBudW1FcnJzID0gMDtcbiAgICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICBsZXQgcHJvcEFzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24ob2JqKTtcbiAgICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBwcm9wQXNzZXJ0aW9uLCB0cnVlKTtcbiAgICAgICAgZmxhZzIocHJvcEFzc2VydGlvbiwgXCJsb2NrU3NmaVwiLCB0cnVlKTtcbiAgICAgICAgaWYgKCFuZWdhdGUgfHwgcHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcHJvcEFzc2VydGlvbi5wcm9wZXJ0eShwcm9wLCB2YWxbcHJvcF0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHByb3BBc3NlcnRpb24ucHJvcGVydHkocHJvcCwgdmFsW3Byb3BdKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihlcnIsIEFzc2VydGlvbkVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlyc3RFcnIgPT09IG51bGwpIGZpcnN0RXJyID0gZXJyO1xuICAgICAgICAgIG51bUVycnMrKztcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcyk7XG4gICAgICBpZiAobmVnYXRlICYmIHByb3BzLmxlbmd0aCA+IDEgJiYgbnVtRXJycyA9PT0gcHJvcHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IGZpcnN0RXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICB0aGlzLmFzc2VydChcbiAgICBpbmNsdWRlZCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gXCIgKyBkZXNjcmlwdG9yICsgXCJpbmNsdWRlIFwiICsgaW5zcGVjdDIodmFsKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IFwiICsgZGVzY3JpcHRvciArIFwiaW5jbHVkZSBcIiArIGluc3BlY3QyKHZhbClcbiAgKTtcbn1cbl9fbmFtZShpbmNsdWRlLCBcImluY2x1ZGVcIik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiaW5jbHVkZVwiLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiY29udGFpblwiLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiY29udGFpbnNcIiwgaW5jbHVkZSwgaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IpO1xuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZChcImluY2x1ZGVzXCIsIGluY2x1ZGUsIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm9rXCIsIGZ1bmN0aW9uKCkge1xuICB0aGlzLmFzc2VydChcbiAgICBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1dGh5XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGZhbHN5XCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwidHJ1ZVwiLCBmdW5jdGlvbigpIHtcbiAgdGhpcy5hc3NlcnQoXG4gICAgdHJ1ZSA9PT0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIHRydWVcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZmFsc2VcIixcbiAgICBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSA/IGZhbHNlIDogdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJudW1lcmljXCIsIGZ1bmN0aW9uKCkge1xuICBjb25zdCBvYmplY3QgPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgW1wiTnVtYmVyXCIsIFwiQmlnSW50XCJdLmluY2x1ZGVzKHR5cGUob2JqZWN0KSksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIG51bWVyaWNcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIG51bWVyaWNcIixcbiAgICBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSA/IGZhbHNlIDogdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJjYWxsYWJsZVwiLCBmdW5jdGlvbigpIHtcbiAgY29uc3QgdmFsID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGNvbnN0IHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIGNvbnN0IG1lc3NhZ2UgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIik7XG4gIGNvbnN0IG1zZyA9IG1lc3NhZ2UgPyBgJHttZXNzYWdlfTogYCA6IFwiXCI7XG4gIGNvbnN0IG5lZ2F0ZSA9IGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpO1xuICBjb25zdCBhc3NlcnRpb25NZXNzYWdlID0gbmVnYXRlID8gYCR7bXNnfWV4cGVjdGVkICR7aW5zcGVjdDIodmFsKX0gbm90IHRvIGJlIGEgY2FsbGFibGUgZnVuY3Rpb25gIDogYCR7bXNnfWV4cGVjdGVkICR7aW5zcGVjdDIodmFsKX0gdG8gYmUgYSBjYWxsYWJsZSBmdW5jdGlvbmA7XG4gIGNvbnN0IGlzQ2FsbGFibGUgPSBbXG4gICAgXCJGdW5jdGlvblwiLFxuICAgIFwiQXN5bmNGdW5jdGlvblwiLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIixcbiAgICBcIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb25cIlxuICBdLmluY2x1ZGVzKHR5cGUodmFsKSk7XG4gIGlmIChpc0NhbGxhYmxlICYmIG5lZ2F0ZSB8fCAhaXNDYWxsYWJsZSAmJiAhbmVnYXRlKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGFzc2VydGlvbk1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiZmFsc2VcIiwgZnVuY3Rpb24oKSB7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGZhbHNlID09PSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZmFsc2VcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1ZVwiLFxuICAgIGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpID8gdHJ1ZSA6IGZhbHNlXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm51bGxcIiwgZnVuY3Rpb24oKSB7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIG51bGwgPT09IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBudWxsXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBudWxsXCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwidW5kZWZpbmVkXCIsIGZ1bmN0aW9uKCkge1xuICB0aGlzLmFzc2VydChcbiAgICB2b2lkIDAgPT09IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB1bmRlZmluZWRcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIHVuZGVmaW5lZFwiXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIk5hTlwiLCBmdW5jdGlvbigpIHtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNOYU4yKGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgTmFOXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBOYU5cIlxuICApO1xufSk7XG5mdW5jdGlvbiBhc3NlcnRFeGlzdCgpIHtcbiAgbGV0IHZhbCA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICB0aGlzLmFzc2VydChcbiAgICB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB2b2lkIDAsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGV4aXN0XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBleGlzdFwiXG4gICk7XG59XG5fX25hbWUoYXNzZXJ0RXhpc3QsIFwiYXNzZXJ0RXhpc3RcIik7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleGlzdFwiLCBhc3NlcnRFeGlzdCk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleGlzdHNcIiwgYXNzZXJ0RXhpc3QpO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiZW1wdHlcIiwgZnVuY3Rpb24oKSB7XG4gIGxldCB2YWwgPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKSwgaXRlbXNDb3VudDtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgc3dpdGNoICh0eXBlKHZhbCkudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGl0ZW1zQ291bnQgPSB2YWwubGVuZ3RoO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm1hcFwiOlxuICAgIGNhc2UgXCJzZXRcIjpcbiAgICAgIGl0ZW1zQ291bnQgPSB2YWwuc2l6ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ3ZWFrbWFwXCI6XG4gICAgY2FzZSBcIndlYWtzZXRcIjpcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgZmxhZ01zZyArIFwiLmVtcHR5IHdhcyBwYXNzZWQgYSB3ZWFrIGNvbGxlY3Rpb25cIixcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICBjb25zdCBtc2cgPSBmbGFnTXNnICsgXCIuZW1wdHkgd2FzIHBhc3NlZCBhIGZ1bmN0aW9uIFwiICsgZ2V0TmFtZSh2YWwpO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1zZy50cmltKCksIHZvaWQgMCwgc3NmaSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodmFsICE9PSBPYmplY3QodmFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArIFwiLmVtcHR5IHdhcyBwYXNzZWQgbm9uLXN0cmluZyBwcmltaXRpdmUgXCIgKyBpbnNwZWN0Mih2YWwpLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpdGVtc0NvdW50ID0gT2JqZWN0LmtleXModmFsKS5sZW5ndGg7XG4gIH1cbiAgdGhpcy5hc3NlcnQoXG4gICAgMCA9PT0gaXRlbXNDb3VudCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZW1wdHlcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIGVtcHR5XCJcbiAgKTtcbn0pO1xuZnVuY3Rpb24gY2hlY2tBcmd1bWVudHMoKSB7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgdHlwZTMgPSB0eXBlKG9iaik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIFwiQXJndW1lbnRzXCIgPT09IHR5cGUzLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhcmd1bWVudHMgYnV0IGdvdCBcIiArIHR5cGUzLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgYXJndW1lbnRzXCJcbiAgKTtcbn1cbl9fbmFtZShjaGVja0FyZ3VtZW50cywgXCJjaGVja0FyZ3VtZW50c1wiKTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcImFyZ3VtZW50c1wiLCBjaGVja0FyZ3VtZW50cyk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJBcmd1bWVudHNcIiwgY2hlY2tBcmd1bWVudHMpO1xuZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgaWYgKGZsYWcyKHRoaXMsIFwiZGVlcFwiKSkge1xuICAgIGxldCBwcmV2TG9ja1NzZmkgPSBmbGFnMih0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgIGZsYWcyKHRoaXMsIFwibG9ja1NzZmlcIiwgdHJ1ZSk7XG4gICAgdGhpcy5lcWwodmFsKTtcbiAgICBmbGFnMih0aGlzLCBcImxvY2tTc2ZpXCIsIHByZXZMb2NrU3NmaSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICB2YWwgPT09IG9iaixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZXF1YWwgI3tleHB9XCIsXG4gICAgICB2YWwsXG4gICAgICB0aGlzLl9vYmosXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFzc2VydEVxdWFsLCBcImFzc2VydEVxdWFsXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxdWFsXCIsIGFzc2VydEVxdWFsKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJlcXVhbHNcIiwgYXNzZXJ0RXF1YWwpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxXCIsIGFzc2VydEVxdWFsKTtcbmZ1bmN0aW9uIGFzc2VydEVxbChvYmosIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IGVxbCA9IGZsYWcyKHRoaXMsIFwiZXFsXCIpO1xuICB0aGlzLmFzc2VydChcbiAgICBlcWwob2JqLCBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGRlZXBseSBlcXVhbCAje2V4cH1cIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGRlZXBseSBlcXVhbCAje2V4cH1cIixcbiAgICBvYmosXG4gICAgdGhpcy5fb2JqLFxuICAgIHRydWVcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRFcWwsIFwiYXNzZXJ0RXFsXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxbFwiLCBhc3NlcnRFcWwpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxbHNcIiwgYXNzZXJ0RXFsKTtcbmZ1bmN0aW9uIGFzc2VydEFib3ZlKG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwibWFwXCIgJiYgb2JqVHlwZSAhPT0gXCJzZXRcIikge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICB9XG4gIGlmICghZG9MZW5ndGggJiYgb2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgblR5cGUgIT09IFwiZGF0ZVwiKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gYWJvdmUgbXVzdCBiZSBhIGRhdGVcIixcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9IGVsc2UgaWYgKCFpc051bWVyaWMobikgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGFib3ZlIG11c3QgYmUgYSBudW1iZXJcIixcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIixcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIGlmIChkb0xlbmd0aCkge1xuICAgIGxldCBkZXNjcmlwdG9yID0gXCJsZW5ndGhcIiwgaXRlbXNDb3VudDtcbiAgICBpZiAob2JqVHlwZSA9PT0gXCJtYXBcIiB8fCBvYmpUeXBlID09PSBcInNldFwiKSB7XG4gICAgICBkZXNjcmlwdG9yID0gXCJzaXplXCI7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLnNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmoubGVuZ3RoO1xuICAgIH1cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGl0ZW1zQ291bnQgPiBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhYm92ZSAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIGFib3ZlICN7ZXhwfVwiLFxuICAgICAgbixcbiAgICAgIGl0ZW1zQ291bnRcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgb2JqID4gbixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhYm92ZSAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhdCBtb3N0ICN7ZXhwfVwiLFxuICAgICAgblxuICAgICk7XG4gIH1cbn1cbl9fbmFtZShhc3NlcnRBYm92ZSwgXCJhc3NlcnRBYm92ZVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJhYm92ZVwiLCBhc3NlcnRBYm92ZSk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZ3RcIiwgYXNzZXJ0QWJvdmUpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImdyZWF0ZXJUaGFuXCIsIGFzc2VydEFib3ZlKTtcbmZ1bmN0aW9uIGFzc2VydExlYXN0KG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKSwgZXJyb3JNZXNzYWdlLCBzaG91bGRUaHJvdyA9IHRydWU7XG4gIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcIm1hcFwiICYmIG9ialR5cGUgIT09IFwic2V0XCIpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShcImxlbmd0aFwiKTtcbiAgfVxuICBpZiAoIWRvTGVuZ3RoICYmIG9ialR5cGUgPT09IFwiZGF0ZVwiICYmIG5UeXBlICE9PSBcImRhdGVcIikge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBkYXRlXCI7XG4gIH0gZWxzZSBpZiAoIWlzTnVtZXJpYyhuKSAmJiAoZG9MZW5ndGggfHwgaXNOdW1lcmljKG9iaikpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gbGVhc3QgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIjtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICB9XG4gIGlmIChzaG91bGRUaHJvdykge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgbGV0IGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA+PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhdCBsZWFzdCAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgYmVsb3cgI3tleHB9XCIsXG4gICAgICBuLFxuICAgICAgaXRlbXNDb3VudFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBvYmogPj0gbixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhdCBsZWFzdCAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBiZWxvdyAje2V4cH1cIixcbiAgICAgIG5cbiAgICApO1xuICB9XG59XG5fX25hbWUoYXNzZXJ0TGVhc3QsIFwiYXNzZXJ0TGVhc3RcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibGVhc3RcIiwgYXNzZXJ0TGVhc3QpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImd0ZVwiLCBhc3NlcnRMZWFzdCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZ3JlYXRlclRoYW5PckVxdWFsXCIsIGFzc2VydExlYXN0KTtcbmZ1bmN0aW9uIGFzc2VydEJlbG93KG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKSwgZXJyb3JNZXNzYWdlLCBzaG91bGRUaHJvdyA9IHRydWU7XG4gIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcIm1hcFwiICYmIG9ialR5cGUgIT09IFwic2V0XCIpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShcImxlbmd0aFwiKTtcbiAgfVxuICBpZiAoIWRvTGVuZ3RoICYmIG9ialR5cGUgPT09IFwiZGF0ZVwiICYmIG5UeXBlICE9PSBcImRhdGVcIikge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGJlbG93IG11c3QgYmUgYSBkYXRlXCI7XG4gIH0gZWxzZSBpZiAoIWlzTnVtZXJpYyhuKSAmJiAoZG9MZW5ndGggfHwgaXNOdW1lcmljKG9iaikpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gYmVsb3cgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIjtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICB9XG4gIGlmIChzaG91bGRUaHJvdykge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgbGV0IGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA8IG4sXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIGJlbG93ICN7ZXhwfSBidXQgZ290ICN7YWN0fVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgYmVsb3cgI3tleHB9XCIsXG4gICAgICBuLFxuICAgICAgaXRlbXNDb3VudFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBvYmogPCBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGJlbG93ICN7ZXhwfVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IGxlYXN0ICN7ZXhwfVwiLFxuICAgICAgblxuICAgICk7XG4gIH1cbn1cbl9fbmFtZShhc3NlcnRCZWxvdywgXCJhc3NlcnRCZWxvd1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJiZWxvd1wiLCBhc3NlcnRCZWxvdyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibHRcIiwgYXNzZXJ0QmVsb3cpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImxlc3NUaGFuXCIsIGFzc2VydEJlbG93KTtcbmZ1bmN0aW9uIGFzc2VydE1vc3QobiwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGRvTGVuZ3RoID0gZmxhZzIodGhpcywgXCJkb0xlbmd0aFwiKSwgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKSwgbXNnUHJlZml4ID0gZmxhZ01zZyA/IGZsYWdNc2cgKyBcIjogXCIgOiBcIlwiLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIG5UeXBlID0gdHlwZShuKS50b0xvd2VyQ2FzZSgpLCBlcnJvck1lc3NhZ2UsIHNob3VsZFRocm93ID0gdHJ1ZTtcbiAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwibWFwXCIgJiYgb2JqVHlwZSAhPT0gXCJzZXRcIikge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICB9XG4gIGlmICghZG9MZW5ndGggJiYgb2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgblR5cGUgIT09IFwiZGF0ZVwiKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gbW9zdCBtdXN0IGJlIGEgZGF0ZVwiO1xuICB9IGVsc2UgaWYgKCFpc051bWVyaWMobikgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIG1vc3QgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIjtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICB9XG4gIGlmIChzaG91bGRUaHJvdykge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgbGV0IGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA8PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhdCBtb3N0ICN7ZXhwfSBidXQgZ290ICN7YWN0fVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhYm92ZSAje2V4cH1cIixcbiAgICAgIG4sXG4gICAgICBpdGVtc0NvdW50XG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIG9iaiA8PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IG1vc3QgI3tleHB9XCIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYWJvdmUgI3tleHB9XCIsXG4gICAgICBuXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFzc2VydE1vc3QsIFwiYXNzZXJ0TW9zdFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJtb3N0XCIsIGFzc2VydE1vc3QpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImx0ZVwiLCBhc3NlcnRNb3N0KTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJsZXNzVGhhbk9yRXF1YWxcIiwgYXNzZXJ0TW9zdCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwid2l0aGluXCIsIGZ1bmN0aW9uKHN0YXJ0LCBmaW5pc2gsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBzdGFydFR5cGUgPSB0eXBlKHN0YXJ0KS50b0xvd2VyQ2FzZSgpLCBmaW5pc2hUeXBlID0gdHlwZShmaW5pc2gpLnRvTG93ZXJDYXNlKCksIGVycm9yTWVzc2FnZSwgc2hvdWxkVGhyb3cgPSB0cnVlLCByYW5nZSA9IHN0YXJ0VHlwZSA9PT0gXCJkYXRlXCIgJiYgZmluaXNoVHlwZSA9PT0gXCJkYXRlXCIgPyBzdGFydC50b0lTT1N0cmluZygpICsgXCIuLlwiICsgZmluaXNoLnRvSVNPU3RyaW5nKCkgOiBzdGFydCArIFwiLi5cIiArIGZpbmlzaDtcbiAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwibWFwXCIgJiYgb2JqVHlwZSAhPT0gXCJzZXRcIikge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICB9XG4gIGlmICghZG9MZW5ndGggJiYgb2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgKHN0YXJ0VHlwZSAhPT0gXCJkYXRlXCIgfHwgZmluaXNoVHlwZSAhPT0gXCJkYXRlXCIpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnRzIHRvIHdpdGhpbiBtdXN0IGJlIGRhdGVzXCI7XG4gIH0gZWxzZSBpZiAoKCFpc051bWVyaWMoc3RhcnQpIHx8ICFpc051bWVyaWMoZmluaXNoKSkgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50cyB0byB3aXRoaW4gbXVzdCBiZSBudW1iZXJzXCI7XG4gIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwiZGF0ZVwiICYmICFpc051bWVyaWMob2JqKSkge1xuICAgIGxldCBwcmludE9iaiA9IG9ialR5cGUgPT09IFwic3RyaW5nXCIgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwiZXhwZWN0ZWQgXCIgKyBwcmludE9iaiArIFwiIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZVwiO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gIH1cbiAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdm9pZCAwLCBzc2ZpKTtcbiAgfVxuICBpZiAoZG9MZW5ndGgpIHtcbiAgICBsZXQgZGVzY3JpcHRvciA9IFwibGVuZ3RoXCIsIGl0ZW1zQ291bnQ7XG4gICAgaWYgKG9ialR5cGUgPT09IFwibWFwXCIgfHwgb2JqVHlwZSA9PT0gXCJzZXRcIikge1xuICAgICAgZGVzY3JpcHRvciA9IFwic2l6ZVwiO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBpdGVtc0NvdW50ID49IHN0YXJ0ICYmIGl0ZW1zQ291bnQgPD0gZmluaXNoLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiB3aXRoaW4gXCIgKyByYW5nZSxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIHdpdGhpbiBcIiArIHJhbmdlXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIG9iaiA+PSBzdGFydCAmJiBvYmogPD0gZmluaXNoLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIHdpdGhpbiBcIiArIHJhbmdlLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSB3aXRoaW4gXCIgKyByYW5nZVxuICAgICk7XG4gIH1cbn0pO1xuZnVuY3Rpb24gYXNzZXJ0SW5zdGFuY2VPZihjb25zdHJ1Y3RvciwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgdGFyZ2V0ID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBsZXQgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKTtcbiAgbGV0IGlzSW5zdGFuY2VPZjtcbiAgdHJ5IHtcbiAgICBpc0luc3RhbmNlT2YgPSB0YXJnZXQgaW5zdGFuY2VvZiBjb25zdHJ1Y3RvcjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFR5cGVFcnJvcikge1xuICAgICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgZmxhZ01zZyArIFwiVGhlIGluc3RhbmNlb2YgYXNzZXJ0aW9uIG5lZWRzIGEgY29uc3RydWN0b3IgYnV0IFwiICsgdHlwZShjb25zdHJ1Y3RvcikgKyBcIiB3YXMgZ2l2ZW4uXCIsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgc3NmaVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGxldCBuYW1lID0gZ2V0TmFtZShjb25zdHJ1Y3Rvcik7XG4gIGlmIChuYW1lID09IG51bGwpIHtcbiAgICBuYW1lID0gXCJhbiB1bm5hbWVkIGNvbnN0cnVjdG9yXCI7XG4gIH1cbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNJbnN0YW5jZU9mLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhbiBpbnN0YW5jZSBvZiBcIiArIG5hbWUsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBhbiBpbnN0YW5jZSBvZiBcIiArIG5hbWVcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRJbnN0YW5jZU9mLCBcImFzc2VydEluc3RhbmNlT2ZcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiaW5zdGFuY2VvZlwiLCBhc3NlcnRJbnN0YW5jZU9mKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJpbnN0YW5jZU9mXCIsIGFzc2VydEluc3RhbmNlT2YpO1xuZnVuY3Rpb24gYXNzZXJ0UHJvcGVydHkobmFtZSwgdmFsLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBpc05lc3RlZCA9IGZsYWcyKHRoaXMsIFwibmVzdGVkXCIpLCBpc093biA9IGZsYWcyKHRoaXMsIFwib3duXCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgbmFtZVR5cGUgPSB0eXBlb2YgbmFtZTtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgaWYgKGlzTmVzdGVkKSB7XG4gICAgaWYgKG5hbWVUeXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgIGZsYWdNc2cgKyBcInRoZSBhcmd1bWVudCB0byBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nIHdoZW4gdXNpbmcgbmVzdGVkIHN5bnRheFwiLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHNzZmlcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChuYW1lVHlwZSAhPT0gXCJzdHJpbmdcIiAmJiBuYW1lVHlwZSAhPT0gXCJudW1iZXJcIiAmJiBuYW1lVHlwZSAhPT0gXCJzeW1ib2xcIikge1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBmbGFnTXNnICsgXCJ0aGUgYXJndW1lbnQgdG8gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZywgbnVtYmVyLCBvciBzeW1ib2xcIixcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAoaXNOZXN0ZWQgJiYgaXNPd24pIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnICsgJ1RoZSBcIm5lc3RlZFwiIGFuZCBcIm93blwiIGZsYWdzIGNhbm5vdCBiZSBjb21iaW5lZC4nLFxuICAgICAgdm9pZCAwLFxuICAgICAgc3NmaVxuICAgICk7XG4gIH1cbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIGZsYWdNc2cgKyBcIlRhcmdldCBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuXCIsXG4gICAgICB2b2lkIDAsXG4gICAgICBzc2ZpXG4gICAgKTtcbiAgfVxuICBsZXQgaXNEZWVwID0gZmxhZzIodGhpcywgXCJkZWVwXCIpLCBuZWdhdGUgPSBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSwgcGF0aEluZm8gPSBpc05lc3RlZCA/IGdldFBhdGhJbmZvKG9iaiwgbmFtZSkgOiBudWxsLCB2YWx1ZSA9IGlzTmVzdGVkID8gcGF0aEluZm8udmFsdWUgOiBvYmpbbmFtZV0sIGlzRXFsID0gaXNEZWVwID8gZmxhZzIodGhpcywgXCJlcWxcIikgOiAodmFsMSwgdmFsMikgPT4gdmFsMSA9PT0gdmFsMjtcbiAgbGV0IGRlc2NyaXB0b3IgPSBcIlwiO1xuICBpZiAoaXNEZWVwKSBkZXNjcmlwdG9yICs9IFwiZGVlcCBcIjtcbiAgaWYgKGlzT3duKSBkZXNjcmlwdG9yICs9IFwib3duIFwiO1xuICBpZiAoaXNOZXN0ZWQpIGRlc2NyaXB0b3IgKz0gXCJuZXN0ZWQgXCI7XG4gIGRlc2NyaXB0b3IgKz0gXCJwcm9wZXJ0eSBcIjtcbiAgbGV0IGhhc1Byb3BlcnR5MjtcbiAgaWYgKGlzT3duKSBoYXNQcm9wZXJ0eTIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBuYW1lKTtcbiAgZWxzZSBpZiAoaXNOZXN0ZWQpIGhhc1Byb3BlcnR5MiA9IHBhdGhJbmZvLmV4aXN0cztcbiAgZWxzZSBoYXNQcm9wZXJ0eTIgPSBoYXNQcm9wZXJ0eShvYmosIG5hbWUpO1xuICBpZiAoIW5lZ2F0ZSB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBoYXNQcm9wZXJ0eTIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKSxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKVxuICAgICk7XG4gIH1cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBoYXNQcm9wZXJ0eTIgJiYgaXNFcWwodmFsLCB2YWx1ZSksXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9mICN7ZXhwfSwgYnV0IGdvdCAje2FjdH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9mICN7YWN0fVwiLFxuICAgICAgdmFsLFxuICAgICAgdmFsdWVcbiAgICApO1xuICB9XG4gIGZsYWcyKHRoaXMsIFwib2JqZWN0XCIsIHZhbHVlKTtcbn1cbl9fbmFtZShhc3NlcnRQcm9wZXJ0eSwgXCJhc3NlcnRQcm9wZXJ0eVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJwcm9wZXJ0eVwiLCBhc3NlcnRQcm9wZXJ0eSk7XG5mdW5jdGlvbiBhc3NlcnRPd25Qcm9wZXJ0eShfbmFtZSwgX3ZhbHVlLCBfbXNnKSB7XG4gIGZsYWcyKHRoaXMsIFwib3duXCIsIHRydWUpO1xuICBhc3NlcnRQcm9wZXJ0eS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuX19uYW1lKGFzc2VydE93blByb3BlcnR5LCBcImFzc2VydE93blByb3BlcnR5XCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcIm93blByb3BlcnR5XCIsIGFzc2VydE93blByb3BlcnR5KTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJoYXZlT3duUHJvcGVydHlcIiwgYXNzZXJ0T3duUHJvcGVydHkpO1xuZnVuY3Rpb24gYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGRlc2NyaXB0b3IsIG1zZykge1xuICBpZiAodHlwZW9mIGRlc2NyaXB0b3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICBtc2cgPSBkZXNjcmlwdG9yO1xuICAgIGRlc2NyaXB0b3IgPSBudWxsO1xuICB9XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBhY3R1YWxEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qob2JqKSwgbmFtZSk7XG4gIGxldCBlcWwgPSBmbGFnMih0aGlzLCBcImVxbFwiKTtcbiAgaWYgKGFjdHVhbERlc2NyaXB0b3IgJiYgZGVzY3JpcHRvcikge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgZXFsKGRlc2NyaXB0b3IsIGFjdHVhbERlc2NyaXB0b3IpLFxuICAgICAgXCJleHBlY3RlZCB0aGUgb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIFwiICsgaW5zcGVjdDIobmFtZSkgKyBcIiBvbiAje3RoaXN9IHRvIG1hdGNoIFwiICsgaW5zcGVjdDIoZGVzY3JpcHRvcikgKyBcIiwgZ290IFwiICsgaW5zcGVjdDIoYWN0dWFsRGVzY3JpcHRvciksXG4gICAgICBcImV4cGVjdGVkIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgXCIgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9uICN7dGhpc30gdG8gbm90IG1hdGNoIFwiICsgaW5zcGVjdDIoZGVzY3JpcHRvciksXG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgYWN0dWFsRGVzY3JpcHRvcixcbiAgICAgIHRydWVcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgYWN0dWFsRGVzY3JpcHRvcixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGFuIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBcIiArIGluc3BlY3QyKG5hbWUpLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGFuIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBcIiArIGluc3BlY3QyKG5hbWUpXG4gICAgKTtcbiAgfVxuICBmbGFnMih0aGlzLCBcIm9iamVjdFwiLCBhY3R1YWxEZXNjcmlwdG9yKTtcbn1cbl9fbmFtZShhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsIFwiYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcIm93blByb3BlcnR5RGVzY3JpcHRvclwiLCBhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImhhdmVPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKTtcbmZ1bmN0aW9uIGFzc2VydExlbmd0aENoYWluKCkge1xuICBmbGFnMih0aGlzLCBcImRvTGVuZ3RoXCIsIHRydWUpO1xufVxuX19uYW1lKGFzc2VydExlbmd0aENoYWluLCBcImFzc2VydExlbmd0aENoYWluXCIpO1xuZnVuY3Rpb24gYXNzZXJ0TGVuZ3RoKG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICBzd2l0Y2ggKG9ialR5cGUpIHtcbiAgICBjYXNlIFwibWFwXCI6XG4gICAgY2FzZSBcInNldFwiOlxuICAgICAgZGVzY3JpcHRvciA9IFwic2l6ZVwiO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gIH1cbiAgdGhpcy5hc3NlcnQoXG4gICAgaXRlbXNDb3VudCA9PSBuLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgb2YgI3tleHB9IGJ1dCBnb3QgI3thY3R9XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgb2YgI3thY3R9XCIsXG4gICAgbixcbiAgICBpdGVtc0NvdW50XG4gICk7XG59XG5fX25hbWUoYXNzZXJ0TGVuZ3RoLCBcImFzc2VydExlbmd0aFwiKTtcbkFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoXCJsZW5ndGhcIiwgYXNzZXJ0TGVuZ3RoLCBhc3NlcnRMZW5ndGhDaGFpbik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwibGVuZ3RoT2ZcIiwgYXNzZXJ0TGVuZ3RoLCBhc3NlcnRMZW5ndGhDaGFpbik7XG5mdW5jdGlvbiBhc3NlcnRNYXRjaChyZSwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIHJlLmV4ZWMob2JqKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbWF0Y2ggXCIgKyByZSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIG1hdGNoIFwiICsgcmVcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRNYXRjaCwgXCJhc3NlcnRNYXRjaFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJtYXRjaFwiLCBhc3NlcnRNYXRjaCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibWF0Y2hlc1wiLCBhc3NlcnRNYXRjaCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwic3RyaW5nXCIsIGZ1bmN0aW9uKHN0ciwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwic3RyaW5nXCIpO1xuICB0aGlzLmFzc2VydChcbiAgICB+b2JqLmluZGV4T2Yoc3RyKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gY29udGFpbiBcIiArIGluc3BlY3QyKHN0ciksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluIFwiICsgaW5zcGVjdDIoc3RyKVxuICApO1xufSk7XG5mdW5jdGlvbiBhc3NlcnRLZXlzKGtleXMpIHtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLCBrZXlzVHlwZSA9IHR5cGUoa2V5cyksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGlzRGVlcCA9IGZsYWcyKHRoaXMsIFwiZGVlcFwiKSwgc3RyLCBkZWVwU3RyID0gXCJcIiwgYWN0dWFsLCBvayA9IHRydWUsIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIik7XG4gIGZsYWdNc2cgPSBmbGFnTXNnID8gZmxhZ01zZyArIFwiOiBcIiA6IFwiXCI7XG4gIGxldCBtaXhlZEFyZ3NNc2cgPSBmbGFnTXNnICsgXCJ3aGVuIHRlc3Rpbmcga2V5cyBhZ2FpbnN0IGFuIG9iamVjdCBvciBhbiBhcnJheSB5b3UgbXVzdCBnaXZlIGEgc2luZ2xlIEFycmF5fE9iamVjdHxTdHJpbmcgYXJndW1lbnQgb3IgbXVsdGlwbGUgU3RyaW5nIGFyZ3VtZW50c1wiO1xuICBpZiAob2JqVHlwZSA9PT0gXCJNYXBcIiB8fCBvYmpUeXBlID09PSBcIlNldFwiKSB7XG4gICAgZGVlcFN0ciA9IGlzRGVlcCA/IFwiZGVlcGx5IFwiIDogXCJcIjtcbiAgICBhY3R1YWwgPSBbXTtcbiAgICBvYmouZm9yRWFjaChmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgYWN0dWFsLnB1c2goa2V5KTtcbiAgICB9KTtcbiAgICBpZiAoa2V5c1R5cGUgIT09IFwiQXJyYXlcIikge1xuICAgICAga2V5cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFjdHVhbCA9IGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaik7XG4gICAgc3dpdGNoIChrZXlzVHlwZSkge1xuICAgICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXhlZEFyZ3NNc2csIHZvaWQgMCwgc3NmaSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXhlZEFyZ3NNc2csIHZvaWQgMCwgc3NmaSk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGtleXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGtleXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIH1cbiAgICBrZXlzID0ga2V5cy5tYXAoZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gXCJzeW1ib2xcIiA/IHZhbCA6IFN0cmluZyh2YWwpO1xuICAgIH0pO1xuICB9XG4gIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZmxhZ01zZyArIFwia2V5cyByZXF1aXJlZFwiLCB2b2lkIDAsIHNzZmkpO1xuICB9XG4gIGxldCBsZW4gPSBrZXlzLmxlbmd0aCwgYW55ID0gZmxhZzIodGhpcywgXCJhbnlcIiksIGFsbCA9IGZsYWcyKHRoaXMsIFwiYWxsXCIpLCBleHBlY3RlZCA9IGtleXMsIGlzRXFsID0gaXNEZWVwID8gZmxhZzIodGhpcywgXCJlcWxcIikgOiAodmFsMSwgdmFsMikgPT4gdmFsMSA9PT0gdmFsMjtcbiAgaWYgKCFhbnkgJiYgIWFsbCkge1xuICAgIGFsbCA9IHRydWU7XG4gIH1cbiAgaWYgKGFueSkge1xuICAgIG9rID0gZXhwZWN0ZWQuc29tZShmdW5jdGlvbihleHBlY3RlZEtleSkge1xuICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICByZXR1cm4gaXNFcWwoZXhwZWN0ZWRLZXksIGFjdHVhbEtleSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBpZiAoYWxsKSB7XG4gICAgb2sgPSBleHBlY3RlZC5ldmVyeShmdW5jdGlvbihleHBlY3RlZEtleSkge1xuICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICByZXR1cm4gaXNFcWwoZXhwZWN0ZWRLZXksIGFjdHVhbEtleSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAoIWZsYWcyKHRoaXMsIFwiY29udGFpbnNcIikpIHtcbiAgICAgIG9rID0gb2sgJiYga2V5cy5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgaWYgKGxlbiA+IDEpIHtcbiAgICBrZXlzID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gaW5zcGVjdDIoa2V5KTtcbiAgICB9KTtcbiAgICBsZXQgbGFzdCA9IGtleXMucG9wKCk7XG4gICAgaWYgKGFsbCkge1xuICAgICAgc3RyID0ga2V5cy5qb2luKFwiLCBcIikgKyBcIiwgYW5kIFwiICsgbGFzdDtcbiAgICB9XG4gICAgaWYgKGFueSkge1xuICAgICAgc3RyID0ga2V5cy5qb2luKFwiLCBcIikgKyBcIiwgb3IgXCIgKyBsYXN0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdHIgPSBpbnNwZWN0MihrZXlzWzBdKTtcbiAgfVxuICBzdHIgPSAobGVuID4gMSA/IFwia2V5cyBcIiA6IFwia2V5IFwiKSArIHN0cjtcbiAgc3RyID0gKGZsYWcyKHRoaXMsIFwiY29udGFpbnNcIikgPyBcImNvbnRhaW4gXCIgOiBcImhhdmUgXCIpICsgc3RyO1xuICB0aGlzLmFzc2VydChcbiAgICBvayxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gXCIgKyBkZWVwU3RyICsgc3RyLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgXCIgKyBkZWVwU3RyICsgc3RyLFxuICAgIGV4cGVjdGVkLnNsaWNlKDApLnNvcnQoY29tcGFyZUJ5SW5zcGVjdCksXG4gICAgYWN0dWFsLnNvcnQoY29tcGFyZUJ5SW5zcGVjdCksXG4gICAgdHJ1ZVxuICApO1xufVxuX19uYW1lKGFzc2VydEtleXMsIFwiYXNzZXJ0S2V5c1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJrZXlzXCIsIGFzc2VydEtleXMpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImtleVwiLCBhc3NlcnRLZXlzKTtcbmZ1bmN0aW9uIGFzc2VydFRocm93cyhlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBuZWdhdGUgPSBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSB8fCBmYWxzZTtcbiAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgaWYgKGlzUmVnRXhwMihlcnJvckxpa2UpIHx8IHR5cGVvZiBlcnJvckxpa2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICBlcnJNc2dNYXRjaGVyID0gZXJyb3JMaWtlO1xuICAgIGVycm9yTGlrZSA9IG51bGw7XG4gIH1cbiAgbGV0IGNhdWdodEVycjtcbiAgbGV0IGVycm9yV2FzVGhyb3duID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgb2JqKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9yV2FzVGhyb3duID0gdHJ1ZTtcbiAgICBjYXVnaHRFcnIgPSBlcnI7XG4gIH1cbiAgbGV0IGV2ZXJ5QXJnSXNVbmRlZmluZWQgPSBlcnJvckxpa2UgPT09IHZvaWQgMCAmJiBlcnJNc2dNYXRjaGVyID09PSB2b2lkIDA7XG4gIGxldCBldmVyeUFyZ0lzRGVmaW5lZCA9IEJvb2xlYW4oZXJyb3JMaWtlICYmIGVyck1zZ01hdGNoZXIpO1xuICBsZXQgZXJyb3JMaWtlRmFpbCA9IGZhbHNlO1xuICBsZXQgZXJyTXNnTWF0Y2hlckZhaWwgPSBmYWxzZTtcbiAgaWYgKGV2ZXJ5QXJnSXNVbmRlZmluZWQgfHwgIWV2ZXJ5QXJnSXNVbmRlZmluZWQgJiYgIW5lZ2F0ZSkge1xuICAgIGxldCBlcnJvckxpa2VTdHJpbmcgPSBcImFuIGVycm9yXCI7XG4gICAgaWYgKGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBlcnJvckxpa2VTdHJpbmcgPSBcIiN7ZXhwfVwiO1xuICAgIH0gZWxzZSBpZiAoZXJyb3JMaWtlKSB7XG4gICAgICBlcnJvckxpa2VTdHJpbmcgPSBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpO1xuICAgIH1cbiAgICBsZXQgYWN0dWFsID0gY2F1Z2h0RXJyO1xuICAgIGlmIChjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgYWN0dWFsID0gY2F1Z2h0RXJyLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2F1Z2h0RXJyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBhY3R1YWwgPSBjYXVnaHRFcnI7XG4gICAgfSBlbHNlIGlmIChjYXVnaHRFcnIgJiYgKHR5cGVvZiBjYXVnaHRFcnIgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhdWdodEVyciA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0dWFsID0gY2hlY2tfZXJyb3JfZXhwb3J0cy5nZXRDb25zdHJ1Y3Rvck5hbWUoY2F1Z2h0RXJyKTtcbiAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBlcnJvcldhc1Rocm93bixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byB0aHJvdyBcIiArIGVycm9yTGlrZVN0cmluZyxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgYW4gZXJyb3IgYnV0ICN7YWN0fSB3YXMgdGhyb3duXCIsXG4gICAgICBlcnJvckxpa2UgJiYgZXJyb3JMaWtlLnRvU3RyaW5nKCksXG4gICAgICBhY3R1YWxcbiAgICApO1xuICB9XG4gIGlmIChlcnJvckxpa2UgJiYgY2F1Z2h0RXJyKSB7XG4gICAgaWYgKGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBsZXQgaXNDb21wYXRpYmxlSW5zdGFuY2UgPSBjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVJbnN0YW5jZShcbiAgICAgICAgY2F1Z2h0RXJyLFxuICAgICAgICBlcnJvckxpa2VcbiAgICAgICk7XG4gICAgICBpZiAoaXNDb21wYXRpYmxlSW5zdGFuY2UgPT09IG5lZ2F0ZSkge1xuICAgICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgICAgZXJyb3JMaWtlRmFpbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICBuZWdhdGUsXG4gICAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93blwiLFxuICAgICAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH1cIiArIChjYXVnaHRFcnIgJiYgIW5lZ2F0ZSA/IFwiIGJ1dCAje2FjdH0gd2FzIHRocm93blwiIDogXCJcIiksXG4gICAgICAgICAgICBlcnJvckxpa2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGNhdWdodEVyci50b1N0cmluZygpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgaXNDb21wYXRpYmxlQ29uc3RydWN0b3IgPSBjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihcbiAgICAgIGNhdWdodEVycixcbiAgICAgIGVycm9yTGlrZVxuICAgICk7XG4gICAgaWYgKGlzQ29tcGF0aWJsZUNvbnN0cnVjdG9yID09PSBuZWdhdGUpIHtcbiAgICAgIGlmIChldmVyeUFyZ0lzRGVmaW5lZCAmJiBuZWdhdGUpIHtcbiAgICAgICAgZXJyb3JMaWtlRmFpbCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBuZWdhdGUsXG4gICAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIHRocm93ICN7ZXhwfSBidXQgI3thY3R9IHdhcyB0aHJvd25cIixcbiAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IHRocm93ICN7ZXhwfVwiICsgKGNhdWdodEVyciA/IFwiIGJ1dCAje2FjdH0gd2FzIHRocm93blwiIDogXCJcIiksXG4gICAgICAgICAgZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpLFxuICAgICAgICAgIGNhdWdodEVyciBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0RXJyLnRvU3RyaW5nKCkgOiBjYXVnaHRFcnIgJiYgY2hlY2tfZXJyb3JfZXhwb3J0cy5nZXRDb25zdHJ1Y3Rvck5hbWUoY2F1Z2h0RXJyKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY2F1Z2h0RXJyICYmIGVyck1zZ01hdGNoZXIgIT09IHZvaWQgMCAmJiBlcnJNc2dNYXRjaGVyICE9PSBudWxsKSB7XG4gICAgbGV0IHBsYWNlaG9sZGVyID0gXCJpbmNsdWRpbmdcIjtcbiAgICBpZiAoaXNSZWdFeHAyKGVyck1zZ01hdGNoZXIpKSB7XG4gICAgICBwbGFjZWhvbGRlciA9IFwibWF0Y2hpbmdcIjtcbiAgICB9XG4gICAgbGV0IGlzQ29tcGF0aWJsZU1lc3NhZ2UgPSBjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVNZXNzYWdlKFxuICAgICAgY2F1Z2h0RXJyLFxuICAgICAgZXJyTXNnTWF0Y2hlclxuICAgICk7XG4gICAgaWYgKGlzQ29tcGF0aWJsZU1lc3NhZ2UgPT09IG5lZ2F0ZSkge1xuICAgICAgaWYgKGV2ZXJ5QXJnSXNEZWZpbmVkICYmIG5lZ2F0ZSkge1xuICAgICAgICBlcnJNc2dNYXRjaGVyRmFpbCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBuZWdhdGUsXG4gICAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIHRocm93IGVycm9yIFwiICsgcGxhY2Vob2xkZXIgKyBcIiAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgZXJyb3Igbm90IFwiICsgcGxhY2Vob2xkZXIgKyBcIiAje2V4cH1cIixcbiAgICAgICAgICBlcnJNc2dNYXRjaGVyLFxuICAgICAgICAgIGNoZWNrX2Vycm9yX2V4cG9ydHMuZ2V0TWVzc2FnZShjYXVnaHRFcnIpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChlcnJvckxpa2VGYWlsICYmIGVyck1zZ01hdGNoZXJGYWlsKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBuZWdhdGUsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93blwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH1cIiArIChjYXVnaHRFcnIgPyBcIiBidXQgI3thY3R9IHdhcyB0aHJvd25cIiA6IFwiXCIpLFxuICAgICAgZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpLFxuICAgICAgY2F1Z2h0RXJyIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHRFcnIudG9TdHJpbmcoKSA6IGNhdWdodEVyciAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpXG4gICAgKTtcbiAgfVxuICBmbGFnMih0aGlzLCBcIm9iamVjdFwiLCBjYXVnaHRFcnIpO1xufVxuX19uYW1lKGFzc2VydFRocm93cywgXCJhc3NlcnRUaHJvd3NcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwidGhyb3dcIiwgYXNzZXJ0VGhyb3dzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJ0aHJvd3NcIiwgYXNzZXJ0VGhyb3dzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJUaHJvd1wiLCBhc3NlcnRUaHJvd3MpO1xuZnVuY3Rpb24gcmVzcG9uZFRvKG1ldGhvZCwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGl0c2VsZiA9IGZsYWcyKHRoaXMsIFwiaXRzZWxmXCIpLCBjb250ZXh0ID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygb2JqICYmICFpdHNlbGYgPyBvYmoucHJvdG90eXBlW21ldGhvZF0gOiBvYmpbbWV0aG9kXTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gcmVzcG9uZCB0byBcIiArIGluc3BlY3QyKG1ldGhvZCksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCByZXNwb25kIHRvIFwiICsgaW5zcGVjdDIobWV0aG9kKVxuICApO1xufVxuX19uYW1lKHJlc3BvbmRUbywgXCJyZXNwb25kVG9cIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwicmVzcG9uZFRvXCIsIHJlc3BvbmRUbyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwicmVzcG9uZHNUb1wiLCByZXNwb25kVG8pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiaXRzZWxmXCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcIml0c2VsZlwiLCB0cnVlKTtcbn0pO1xuZnVuY3Rpb24gc2F0aXNmeShtYXRjaGVyLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgbGV0IHJlc3VsdCA9IG1hdGNoZXIob2JqKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgcmVzdWx0LFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBzYXRpc2Z5IFwiICsgb2JqRGlzcGxheShtYXRjaGVyKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IHNhdGlzZnlcIiArIG9iakRpc3BsYXkobWF0Y2hlciksXG4gICAgZmxhZzIodGhpcywgXCJuZWdhdGVcIikgPyBmYWxzZSA6IHRydWUsXG4gICAgcmVzdWx0XG4gICk7XG59XG5fX25hbWUoc2F0aXNmeSwgXCJzYXRpc2Z5XCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcInNhdGlzZnlcIiwgc2F0aXNmeSk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwic2F0aXNmaWVzXCIsIHNhdGlzZnkpO1xuZnVuY3Rpb24gY2xvc2VUbyhleHBlY3RlZCwgZGVsdGEsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMubnVtZXJpYztcbiAgbGV0IG1lc3NhZ2UgPSBcIkEgYGRlbHRhYCB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgYGNsb3NlVG9gXCI7XG4gIGlmIChkZWx0YSA9PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnID8gYCR7ZmxhZ01zZ306ICR7bWVzc2FnZX1gIDogbWVzc2FnZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZGVsdGEsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLm51bWVyaWM7XG4gIG1lc3NhZ2UgPSBcIkEgYGV4cGVjdGVkYCB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgYGNsb3NlVG9gXCI7XG4gIGlmIChleHBlY3RlZCA9PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnID8gYCR7ZmxhZ01zZ306ICR7bWVzc2FnZX1gIDogbWVzc2FnZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZXhwZWN0ZWQsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLm51bWVyaWM7XG4gIGNvbnN0IGFicyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHgpID0+IHggPCAwID8gLXggOiB4LCBcImFic1wiKTtcbiAgY29uc3Qgc3RyaXAgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChudW1iZXIpID0+IHBhcnNlRmxvYXQocGFyc2VGbG9hdChudW1iZXIpLnRvUHJlY2lzaW9uKDEyKSksIFwic3RyaXBcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIHN0cmlwKGFicyhvYmogLSBleHBlY3RlZCkpIDw9IGRlbHRhLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBjbG9zZSB0byBcIiArIGV4cGVjdGVkICsgXCIgKy8tIFwiICsgZGVsdGEsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBjbG9zZSB0byBcIiArIGV4cGVjdGVkICsgXCIgKy8tIFwiICsgZGVsdGFcbiAgKTtcbn1cbl9fbmFtZShjbG9zZVRvLCBcImNsb3NlVG9cIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiY2xvc2VUb1wiLCBjbG9zZVRvKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJhcHByb3hpbWF0ZWx5XCIsIGNsb3NlVG8pO1xuZnVuY3Rpb24gaXNTdWJzZXRPZihfc3Vic2V0LCBfc3VwZXJzZXQsIGNtcCwgY29udGFpbnMsIG9yZGVyZWQpIHtcbiAgbGV0IHN1cGVyc2V0ID0gQXJyYXkuZnJvbShfc3VwZXJzZXQpO1xuICBsZXQgc3Vic2V0ID0gQXJyYXkuZnJvbShfc3Vic2V0KTtcbiAgaWYgKCFjb250YWlucykge1xuICAgIGlmIChzdWJzZXQubGVuZ3RoICE9PSBzdXBlcnNldC5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBzdXBlcnNldCA9IHN1cGVyc2V0LnNsaWNlKCk7XG4gIH1cbiAgcmV0dXJuIHN1YnNldC5ldmVyeShmdW5jdGlvbihlbGVtLCBpZHgpIHtcbiAgICBpZiAob3JkZXJlZCkgcmV0dXJuIGNtcCA/IGNtcChlbGVtLCBzdXBlcnNldFtpZHhdKSA6IGVsZW0gPT09IHN1cGVyc2V0W2lkeF07XG4gICAgaWYgKCFjbXApIHtcbiAgICAgIGxldCBtYXRjaElkeCA9IHN1cGVyc2V0LmluZGV4T2YoZWxlbSk7XG4gICAgICBpZiAobWF0Y2hJZHggPT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWNvbnRhaW5zKSBzdXBlcnNldC5zcGxpY2UobWF0Y2hJZHgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBzdXBlcnNldC5zb21lKGZ1bmN0aW9uKGVsZW0yLCBtYXRjaElkeCkge1xuICAgICAgaWYgKCFjbXAoZWxlbSwgZWxlbTIpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWNvbnRhaW5zKSBzdXBlcnNldC5zcGxpY2UobWF0Y2hJZHgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0pO1xufVxuX19uYW1lKGlzU3Vic2V0T2YsIFwiaXNTdWJzZXRPZlwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJtZW1iZXJzXCIsIGZ1bmN0aW9uKHN1YnNldCwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5iZS5pdGVyYWJsZTtcbiAgbmV3IEFzc2VydGlvbihzdWJzZXQsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLml0ZXJhYmxlO1xuICBsZXQgY29udGFpbnMgPSBmbGFnMih0aGlzLCBcImNvbnRhaW5zXCIpO1xuICBsZXQgb3JkZXJlZCA9IGZsYWcyKHRoaXMsIFwib3JkZXJlZFwiKTtcbiAgbGV0IHN1YmplY3QsIGZhaWxNc2csIGZhaWxOZWdhdGVNc2c7XG4gIGlmIChjb250YWlucykge1xuICAgIHN1YmplY3QgPSBvcmRlcmVkID8gXCJhbiBvcmRlcmVkIHN1cGVyc2V0XCIgOiBcImEgc3VwZXJzZXRcIjtcbiAgICBmYWlsTXNnID0gXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIFwiICsgc3ViamVjdCArIFwiIG9mICN7ZXhwfVwiO1xuICAgIGZhaWxOZWdhdGVNc2cgPSBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIFwiICsgc3ViamVjdCArIFwiIG9mICN7ZXhwfVwiO1xuICB9IGVsc2Uge1xuICAgIHN1YmplY3QgPSBvcmRlcmVkID8gXCJvcmRlcmVkIG1lbWJlcnNcIiA6IFwibWVtYmVyc1wiO1xuICAgIGZhaWxNc2cgPSBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSB0aGUgc2FtZSBcIiArIHN1YmplY3QgKyBcIiBhcyAje2V4cH1cIjtcbiAgICBmYWlsTmVnYXRlTXNnID0gXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIHRoZSBzYW1lIFwiICsgc3ViamVjdCArIFwiIGFzICN7ZXhwfVwiO1xuICB9XG4gIGxldCBjbXAgPSBmbGFnMih0aGlzLCBcImRlZXBcIikgPyBmbGFnMih0aGlzLCBcImVxbFwiKSA6IHZvaWQgMDtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNTdWJzZXRPZihzdWJzZXQsIG9iaiwgY21wLCBjb250YWlucywgb3JkZXJlZCksXG4gICAgZmFpbE1zZyxcbiAgICBmYWlsTmVnYXRlTXNnLFxuICAgIHN1YnNldCxcbiAgICBvYmosXG4gICAgdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJpdGVyYWJsZVwiLCBmdW5jdGlvbihtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgb2JqICE9IHZvaWQgMCAmJiBvYmpbU3ltYm9sLml0ZXJhdG9yXSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYW4gaXRlcmFibGVcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGFuIGl0ZXJhYmxlXCIsXG4gICAgb2JqXG4gICk7XG59KTtcbmZ1bmN0aW9uIG9uZU9mKGxpc3QsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IGV4cGVjdGVkID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGNvbnRhaW5zID0gZmxhZzIodGhpcywgXCJjb250YWluc1wiKSwgaXNEZWVwID0gZmxhZzIodGhpcywgXCJkZWVwXCIpLCBlcWwgPSBmbGFnMih0aGlzLCBcImVxbFwiKTtcbiAgbmV3IEFzc2VydGlvbihsaXN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5iZS5hbihcImFycmF5XCIpO1xuICBpZiAoY29udGFpbnMpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGxpc3Quc29tZShmdW5jdGlvbihwb3NzaWJpbGl0eSkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQuaW5kZXhPZihwb3NzaWJpbGl0eSkgPiAtMTtcbiAgICAgIH0pLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGNvbnRhaW4gb25lIG9mICN7ZXhwfVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluIG9uZSBvZiAje2V4cH1cIixcbiAgICAgIGxpc3QsXG4gICAgICBleHBlY3RlZFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRGVlcCkge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGxpc3Quc29tZShmdW5jdGlvbihwb3NzaWJpbGl0eSkge1xuICAgICAgICAgIHJldHVybiBlcWwoZXhwZWN0ZWQsIHBvc3NpYmlsaXR5KTtcbiAgICAgICAgfSksXG4gICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBkZWVwbHkgZXF1YWwgb25lIG9mICN7ZXhwfVwiLFxuICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gZGVlcGx5IGVxdWFsIG9uZSBvZiAje2V4cH1cIixcbiAgICAgICAgbGlzdCxcbiAgICAgICAgZXhwZWN0ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBsaXN0LmluZGV4T2YoZXhwZWN0ZWQpID4gLTEsXG4gICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBvbmUgb2YgI3tleHB9XCIsXG4gICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgb25lIG9mICN7ZXhwfVwiLFxuICAgICAgICBsaXN0LFxuICAgICAgICBleHBlY3RlZFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbl9fbmFtZShvbmVPZiwgXCJvbmVPZlwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJvbmVPZlwiLCBvbmVPZik7XG5mdW5jdGlvbiBhc3NlcnRDaGFuZ2VzKHN1YmplY3QsIHByb3AsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IGZuID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24oZm4sIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgbGV0IGluaXRpYWw7XG4gIGlmICghcHJvcCkge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYShcImZ1bmN0aW9uXCIpO1xuICAgIGluaXRpYWwgPSBzdWJqZWN0KCk7XG4gIH0gZWxzZSB7XG4gICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3ApO1xuICAgIGluaXRpYWwgPSBzdWJqZWN0W3Byb3BdO1xuICB9XG4gIGZuKCk7XG4gIGxldCBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgbGV0IG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImNoYW5nZVwiKTtcbiAgZmxhZzIodGhpcywgXCJyZWFsRGVsdGFcIiwgZmluYWwgIT09IGluaXRpYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBpbml0aWFsICE9PSBmaW5hbCxcbiAgICBcImV4cGVjdGVkIFwiICsgbXNnT2JqICsgXCIgdG8gY2hhbmdlXCIsXG4gICAgXCJleHBlY3RlZCBcIiArIG1zZ09iaiArIFwiIHRvIG5vdCBjaGFuZ2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydENoYW5nZXMsIFwiYXNzZXJ0Q2hhbmdlc1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJjaGFuZ2VcIiwgYXNzZXJ0Q2hhbmdlcyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiY2hhbmdlc1wiLCBhc3NlcnRDaGFuZ2VzKTtcbmZ1bmN0aW9uIGFzc2VydEluY3JlYXNlcyhzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBmbiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBuZXcgQXNzZXJ0aW9uKGZuLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwiZnVuY3Rpb25cIik7XG4gIGxldCBpbml0aWFsO1xuICBpZiAoIXByb3ApIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgICBpbml0aWFsID0gc3ViamVjdCgpO1xuICB9IGVsc2Uge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICBpbml0aWFsID0gc3ViamVjdFtwcm9wXTtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGluaXRpYWwsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJudW1iZXJcIik7XG4gIGZuKCk7XG4gIGxldCBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgbGV0IG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImluY3JlYXNlXCIpO1xuICBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiLCBmaW5hbCAtIGluaXRpYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBmaW5hbCAtIGluaXRpYWwgPiAwLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBpbmNyZWFzZVwiLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgaW5jcmVhc2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydEluY3JlYXNlcywgXCJhc3NlcnRJbmNyZWFzZXNcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiaW5jcmVhc2VcIiwgYXNzZXJ0SW5jcmVhc2VzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJpbmNyZWFzZXNcIiwgYXNzZXJ0SW5jcmVhc2VzKTtcbmZ1bmN0aW9uIGFzc2VydERlY3JlYXNlcyhzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBmbiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBuZXcgQXNzZXJ0aW9uKGZuLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwiZnVuY3Rpb25cIik7XG4gIGxldCBpbml0aWFsO1xuICBpZiAoIXByb3ApIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgICBpbml0aWFsID0gc3ViamVjdCgpO1xuICB9IGVsc2Uge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICBpbml0aWFsID0gc3ViamVjdFtwcm9wXTtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGluaXRpYWwsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJudW1iZXJcIik7XG4gIGZuKCk7XG4gIGxldCBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgbGV0IG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImRlY3JlYXNlXCIpO1xuICBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiLCBpbml0aWFsIC0gZmluYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBmaW5hbCAtIGluaXRpYWwgPCAwLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBkZWNyZWFzZVwiLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgZGVjcmVhc2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydERlY3JlYXNlcywgXCJhc3NlcnREZWNyZWFzZXNcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZGVjcmVhc2VcIiwgYXNzZXJ0RGVjcmVhc2VzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJkZWNyZWFzZXNcIiwgYXNzZXJ0RGVjcmVhc2VzKTtcbmZ1bmN0aW9uIGFzc2VydERlbHRhKGRlbHRhLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBtc2dPYmogPSBmbGFnMih0aGlzLCBcImRlbHRhTXNnT2JqXCIpO1xuICBsZXQgaW5pdGlhbCA9IGZsYWcyKHRoaXMsIFwiaW5pdGlhbERlbHRhVmFsdWVcIik7XG4gIGxldCBmaW5hbCA9IGZsYWcyKHRoaXMsIFwiZmluYWxEZWx0YVZhbHVlXCIpO1xuICBsZXQgYmVoYXZpb3IgPSBmbGFnMih0aGlzLCBcImRlbHRhQmVoYXZpb3JcIik7XG4gIGxldCByZWFsRGVsdGEgPSBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiKTtcbiAgbGV0IGV4cHJlc3Npb247XG4gIGlmIChiZWhhdmlvciA9PT0gXCJjaGFuZ2VcIikge1xuICAgIGV4cHJlc3Npb24gPSBNYXRoLmFicyhmaW5hbCAtIGluaXRpYWwpID09PSBNYXRoLmFicyhkZWx0YSk7XG4gIH0gZWxzZSB7XG4gICAgZXhwcmVzc2lvbiA9IHJlYWxEZWx0YSA9PT0gTWF0aC5hYnMoZGVsdGEpO1xuICB9XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGV4cHJlc3Npb24sXG4gICAgXCJleHBlY3RlZCBcIiArIG1zZ09iaiArIFwiIHRvIFwiICsgYmVoYXZpb3IgKyBcIiBieSBcIiArIGRlbHRhLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgXCIgKyBiZWhhdmlvciArIFwiIGJ5IFwiICsgZGVsdGFcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnREZWx0YSwgXCJhc3NlcnREZWx0YVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJieVwiLCBhc3NlcnREZWx0YSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleHRlbnNpYmxlXCIsIGZ1bmN0aW9uKCkge1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBpc0V4dGVuc2libGUgPSBvYmogPT09IE9iamVjdChvYmopICYmIE9iamVjdC5pc0V4dGVuc2libGUob2JqKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNFeHRlbnNpYmxlLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBleHRlbnNpYmxlXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBleHRlbnNpYmxlXCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwic2VhbGVkXCIsIGZ1bmN0aW9uKCkge1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBpc1NlYWxlZCA9IG9iaiA9PT0gT2JqZWN0KG9iaikgPyBPYmplY3QuaXNTZWFsZWQob2JqKSA6IHRydWU7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGlzU2VhbGVkLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBzZWFsZWRcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIHNlYWxlZFwiXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcImZyb3plblwiLCBmdW5jdGlvbigpIHtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICBsZXQgaXNGcm96ZW4gPSBvYmogPT09IE9iamVjdChvYmopID8gT2JqZWN0LmlzRnJvemVuKG9iaikgOiB0cnVlO1xuICB0aGlzLmFzc2VydChcbiAgICBpc0Zyb3plbixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZnJvemVuXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBmcm96ZW5cIlxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJmaW5pdGVcIiwgZnVuY3Rpb24oX21zZykge1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIHR5cGVvZiBvYmogPT09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUob2JqKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYSBmaW5pdGUgbnVtYmVyXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBhIGZpbml0ZSBudW1iZXJcIlxuICApO1xufSk7XG5mdW5jdGlvbiBjb21wYXJlU3Vic2V0KGV4cGVjdGVkLCBhY3R1YWwpIHtcbiAgaWYgKGV4cGVjdGVkID09PSBhY3R1YWwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIGFjdHVhbCAhPT0gdHlwZW9mIGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgIT09IFwib2JqZWN0XCIgfHwgZXhwZWN0ZWQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQgPT09IGFjdHVhbDtcbiAgfVxuICBpZiAoIWFjdHVhbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWN0dWFsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZXhwZWN0ZWQuZXZlcnkoZnVuY3Rpb24oZXhwKSB7XG4gICAgICByZXR1cm4gYWN0dWFsLnNvbWUoZnVuY3Rpb24oYWN0KSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlU3Vic2V0KGV4cCwgYWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGlmIChleHBlY3RlZCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoYWN0dWFsIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkLmdldFRpbWUoKSA9PT0gYWN0dWFsLmdldFRpbWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMoZXhwZWN0ZWQpLmV2ZXJ5KGZ1bmN0aW9uKGtleSkge1xuICAgIGxldCBleHBlY3RlZFZhbHVlID0gZXhwZWN0ZWRba2V5XTtcbiAgICBsZXQgYWN0dWFsVmFsdWUgPSBhY3R1YWxba2V5XTtcbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwib2JqZWN0XCIgJiYgZXhwZWN0ZWRWYWx1ZSAhPT0gbnVsbCAmJiBhY3R1YWxWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNvbXBhcmVTdWJzZXQoZXhwZWN0ZWRWYWx1ZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkVmFsdWUoYWN0dWFsVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gYWN0dWFsVmFsdWUgPT09IGV4cGVjdGVkVmFsdWU7XG4gIH0pO1xufVxuX19uYW1lKGNvbXBhcmVTdWJzZXQsIFwiY29tcGFyZVN1YnNldFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJjb250YWluU3Vic2V0XCIsIGZ1bmN0aW9uKGV4cGVjdGVkKSB7XG4gIGNvbnN0IGFjdHVhbCA9IGZsYWcodGhpcywgXCJvYmplY3RcIik7XG4gIGNvbnN0IHNob3dEaWZmID0gY29uZmlnLnNob3dEaWZmO1xuICB0aGlzLmFzc2VydChcbiAgICBjb21wYXJlU3Vic2V0KGV4cGVjdGVkLCBhY3R1YWwpLFxuICAgIFwiZXhwZWN0ZWQgI3thY3R9IHRvIGNvbnRhaW4gc3Vic2V0ICN7ZXhwfVwiLFxuICAgIFwiZXhwZWN0ZWQgI3thY3R9IHRvIG5vdCBjb250YWluIHN1YnNldCAje2V4cH1cIixcbiAgICBleHBlY3RlZCxcbiAgICBhY3R1YWwsXG4gICAgc2hvd0RpZmZcbiAgKTtcbn0pO1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2UvZXhwZWN0LmpzXG5mdW5jdGlvbiBleHBlY3QodmFsLCBtZXNzYWdlKSB7XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKHZhbCwgbWVzc2FnZSk7XG59XG5fX25hbWUoZXhwZWN0LCBcImV4cGVjdFwiKTtcbmV4cGVjdC5mYWlsID0gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgbWVzc2FnZSA9IGFjdHVhbDtcbiAgICBhY3R1YWwgPSB2b2lkIDA7XG4gIH1cbiAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgXCJleHBlY3QuZmFpbCgpXCI7XG4gIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICBtZXNzYWdlLFxuICAgIHtcbiAgICAgIGFjdHVhbCxcbiAgICAgIGV4cGVjdGVkLFxuICAgICAgb3BlcmF0b3JcbiAgICB9LFxuICAgIGV4cGVjdC5mYWlsXG4gICk7XG59O1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2Uvc2hvdWxkLmpzXG52YXIgc2hvdWxkX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KHNob3VsZF9leHBvcnRzLCB7XG4gIFNob3VsZDogKCkgPT4gU2hvdWxkLFxuICBzaG91bGQ6ICgpID0+IHNob3VsZFxufSk7XG5mdW5jdGlvbiBsb2FkU2hvdWxkKCkge1xuICBmdW5jdGlvbiBzaG91bGRHZXR0ZXIoKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGhpcyBpbnN0YW5jZW9mIE51bWJlciB8fCB0aGlzIGluc3RhbmNlb2YgQm9vbGVhbiB8fCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdGhpcyBpbnN0YW5jZW9mIFN5bWJvbCB8fCB0eXBlb2YgQmlnSW50ID09PSBcImZ1bmN0aW9uXCIgJiYgdGhpcyBpbnN0YW5jZW9mIEJpZ0ludCkge1xuICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb24odGhpcy52YWx1ZU9mKCksIG51bGwsIHNob3VsZEdldHRlcik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHRoaXMsIG51bGwsIHNob3VsZEdldHRlcik7XG4gIH1cbiAgX19uYW1lKHNob3VsZEdldHRlciwgXCJzaG91bGRHZXR0ZXJcIik7XG4gIGZ1bmN0aW9uIHNob3VsZFNldHRlcih2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNob3VsZFwiLCB7XG4gICAgICB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIF9fbmFtZShzaG91bGRTZXR0ZXIsIFwic2hvdWxkU2V0dGVyXCIpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgXCJzaG91bGRcIiwge1xuICAgIHNldDogc2hvdWxkU2V0dGVyLFxuICAgIGdldDogc2hvdWxkR2V0dGVyLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgbGV0IHNob3VsZDIgPSB7fTtcbiAgc2hvdWxkMi5mYWlsID0gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIG1lc3NhZ2UgPSBhY3R1YWw7XG4gICAgICBhY3R1YWwgPSB2b2lkIDA7XG4gICAgfVxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8IFwic2hvdWxkLmZhaWwoKVwiO1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB7XG4gICAgICAgIGFjdHVhbCxcbiAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgIG9wZXJhdG9yXG4gICAgICB9LFxuICAgICAgc2hvdWxkMi5mYWlsXG4gICAgKTtcbiAgfTtcbiAgc2hvdWxkMi5lcXVhbCA9IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGFjdHVhbCwgbWVzc2FnZSkudG8uZXF1YWwoZXhwZWN0ZWQpO1xuICB9O1xuICBzaG91bGQyLlRocm93ID0gZnVuY3Rpb24oZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZykudG8uVGhyb3coZXJydCwgZXJycyk7XG4gIH07XG4gIHNob3VsZDIuZXhpc3QgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2cpLnRvLmV4aXN0O1xuICB9O1xuICBzaG91bGQyLm5vdCA9IHt9O1xuICBzaG91bGQyLm5vdC5lcXVhbCA9IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0dWFsLCBtc2cpLnRvLm5vdC5lcXVhbChleHBlY3RlZCk7XG4gIH07XG4gIHNob3VsZDIubm90LlRocm93ID0gZnVuY3Rpb24oZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZykudG8ubm90LlRocm93KGVycnQsIGVycnMpO1xuICB9O1xuICBzaG91bGQyLm5vdC5leGlzdCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8ubm90LmV4aXN0O1xuICB9O1xuICBzaG91bGQyW1widGhyb3dcIl0gPSBzaG91bGQyW1wiVGhyb3dcIl07XG4gIHNob3VsZDIubm90W1widGhyb3dcIl0gPSBzaG91bGQyLm5vdFtcIlRocm93XCJdO1xuICByZXR1cm4gc2hvdWxkMjtcbn1cbl9fbmFtZShsb2FkU2hvdWxkLCBcImxvYWRTaG91bGRcIik7XG52YXIgc2hvdWxkID0gbG9hZFNob3VsZDtcbnZhciBTaG91bGQgPSBsb2FkU2hvdWxkO1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2UvYXNzZXJ0LmpzXG5mdW5jdGlvbiBhc3NlcnQoZXhwcmVzcywgZXJybXNnKSB7XG4gIGxldCB0ZXN0MiA9IG5ldyBBc3NlcnRpb24obnVsbCwgbnVsbCwgYXNzZXJ0LCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KGV4cHJlc3MsIGVycm1zZywgXCJbIG5lZ2F0aW9uIG1lc3NhZ2UgdW5hdmFpbGFibGUgXVwiKTtcbn1cbl9fbmFtZShhc3NlcnQsIFwiYXNzZXJ0XCIpO1xuYXNzZXJ0LmZhaWwgPSBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvcikge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICBtZXNzYWdlID0gYWN0dWFsO1xuICAgIGFjdHVhbCA9IHZvaWQgMDtcbiAgfVxuICBtZXNzYWdlID0gbWVzc2FnZSB8fCBcImFzc2VydC5mYWlsKClcIjtcbiAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgIG1lc3NhZ2UsXG4gICAge1xuICAgICAgYWN0dWFsLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgICBvcGVyYXRvclxuICAgIH0sXG4gICAgYXNzZXJ0LmZhaWxcbiAgKTtcbn07XG5hc3NlcnQuaXNPayA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc09rLCB0cnVlKS5pcy5vaztcbn07XG5hc3NlcnQuaXNOb3RPayA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE9rLCB0cnVlKS5pcy5ub3Qub2s7XG59O1xuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24oYWN0LCBleHAsIG1zZykge1xuICBsZXQgdGVzdDIgPSBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuZXF1YWwsIHRydWUpO1xuICB0ZXN0Mi5hc3NlcnQoXG4gICAgZXhwID09IGZsYWcodGVzdDIsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH1cIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7YWN0fVwiLFxuICAgIGV4cCxcbiAgICBhY3QsXG4gICAgdHJ1ZVxuICApO1xufTtcbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uKGFjdCwgZXhwLCBtc2cpIHtcbiAgbGV0IHRlc3QyID0gbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0Lm5vdEVxdWFsLCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KFxuICAgIGV4cCAhPSBmbGFnKHRlc3QyLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7ZXhwfVwiLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2FjdH1cIixcbiAgICBleHAsXG4gICAgYWN0LFxuICAgIHRydWVcbiAgKTtcbn07XG5hc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5zdHJpY3RFcXVhbCwgdHJ1ZSkudG8uZXF1YWwoZXhwKTtcbn07XG5hc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3RTdHJpY3RFcXVhbCwgdHJ1ZSkudG8ubm90LmVxdWFsKGV4cCk7XG59O1xuYXNzZXJ0LmRlZXBFcXVhbCA9IGFzc2VydC5kZWVwU3RyaWN0RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5kZWVwRXF1YWwsIHRydWUpLnRvLmVxbChleHApO1xufTtcbmFzc2VydC5ub3REZWVwRXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3REZWVwRXF1YWwsIHRydWUpLnRvLm5vdC5lcWwoZXhwKTtcbn07XG5hc3NlcnQuaXNBYm92ZSA9IGZ1bmN0aW9uKHZhbCwgYWJ2LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQWJvdmUsIHRydWUpLnRvLmJlLmFib3ZlKGFidik7XG59O1xuYXNzZXJ0LmlzQXRMZWFzdCA9IGZ1bmN0aW9uKHZhbCwgYXRsc3QsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNBdExlYXN0LCB0cnVlKS50by5iZS5sZWFzdChhdGxzdCk7XG59O1xuYXNzZXJ0LmlzQmVsb3cgPSBmdW5jdGlvbih2YWwsIGJsdywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0JlbG93LCB0cnVlKS50by5iZS5iZWxvdyhibHcpO1xufTtcbmFzc2VydC5pc0F0TW9zdCA9IGZ1bmN0aW9uKHZhbCwgYXRtc3QsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNBdE1vc3QsIHRydWUpLnRvLmJlLm1vc3QoYXRtc3QpO1xufTtcbmFzc2VydC5pc1RydWUgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNUcnVlLCB0cnVlKS5pc1tcInRydWVcIl07XG59O1xuYXNzZXJ0LmlzTm90VHJ1ZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdFRydWUsIHRydWUpLnRvLm5vdC5lcXVhbCh0cnVlKTtcbn07XG5hc3NlcnQuaXNGYWxzZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0ZhbHNlLCB0cnVlKS5pc1tcImZhbHNlXCJdO1xufTtcbmFzc2VydC5pc05vdEZhbHNlID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90RmFsc2UsIHRydWUpLnRvLm5vdC5lcXVhbChmYWxzZSk7XG59O1xuYXNzZXJ0LmlzTnVsbCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bGwsIHRydWUpLnRvLmVxdWFsKG51bGwpO1xufTtcbmFzc2VydC5pc05vdE51bGwgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3ROdWxsLCB0cnVlKS50by5ub3QuZXF1YWwobnVsbCk7XG59O1xuYXNzZXJ0LmlzTmFOID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTmFOLCB0cnVlKS50by5iZS5OYU47XG59O1xuYXNzZXJ0LmlzTm90TmFOID0gZnVuY3Rpb24odmFsdWUsIG1lc3NhZ2UpIHtcbiAgbmV3IEFzc2VydGlvbih2YWx1ZSwgbWVzc2FnZSwgYXNzZXJ0LmlzTm90TmFOLCB0cnVlKS5ub3QudG8uYmUuTmFOO1xufTtcbmFzc2VydC5leGlzdHMgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuZXhpc3RzLCB0cnVlKS50by5leGlzdDtcbn07XG5hc3NlcnQubm90RXhpc3RzID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0Lm5vdEV4aXN0cywgdHJ1ZSkudG8ubm90LmV4aXN0O1xufTtcbmFzc2VydC5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc1VuZGVmaW5lZCwgdHJ1ZSkudG8uZXF1YWwodm9pZCAwKTtcbn07XG5hc3NlcnQuaXNEZWZpbmVkID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRGVmaW5lZCwgdHJ1ZSkudG8ubm90LmVxdWFsKHZvaWQgMCk7XG59O1xuYXNzZXJ0LmlzQ2FsbGFibGUgPSBmdW5jdGlvbih2YWx1ZSwgbWVzc2FnZSkge1xuICBuZXcgQXNzZXJ0aW9uKHZhbHVlLCBtZXNzYWdlLCBhc3NlcnQuaXNDYWxsYWJsZSwgdHJ1ZSkuaXMuY2FsbGFibGU7XG59O1xuYXNzZXJ0LmlzTm90Q2FsbGFibGUgPSBmdW5jdGlvbih2YWx1ZSwgbWVzc2FnZSkge1xuICBuZXcgQXNzZXJ0aW9uKHZhbHVlLCBtZXNzYWdlLCBhc3NlcnQuaXNOb3RDYWxsYWJsZSwgdHJ1ZSkuaXMubm90LmNhbGxhYmxlO1xufTtcbmFzc2VydC5pc09iamVjdCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc09iamVjdCwgdHJ1ZSkudG8uYmUuYShcIm9iamVjdFwiKTtcbn07XG5hc3NlcnQuaXNOb3RPYmplY3QgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RPYmplY3QsIHRydWUpLnRvLm5vdC5iZS5hKFwib2JqZWN0XCIpO1xufTtcbmFzc2VydC5pc0FycmF5ID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQXJyYXksIHRydWUpLnRvLmJlLmFuKFwiYXJyYXlcIik7XG59O1xuYXNzZXJ0LmlzTm90QXJyYXkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RBcnJheSwgdHJ1ZSkudG8ubm90LmJlLmFuKFwiYXJyYXlcIik7XG59O1xuYXNzZXJ0LmlzU3RyaW5nID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzU3RyaW5nLCB0cnVlKS50by5iZS5hKFwic3RyaW5nXCIpO1xufTtcbmFzc2VydC5pc05vdFN0cmluZyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdFN0cmluZywgdHJ1ZSkudG8ubm90LmJlLmEoXCJzdHJpbmdcIik7XG59O1xuYXNzZXJ0LmlzTnVtYmVyID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTnVtYmVyLCB0cnVlKS50by5iZS5hKFwibnVtYmVyXCIpO1xufTtcbmFzc2VydC5pc05vdE51bWJlciA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE51bWJlciwgdHJ1ZSkudG8ubm90LmJlLmEoXCJudW1iZXJcIik7XG59O1xuYXNzZXJ0LmlzTnVtZXJpYyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bWVyaWMsIHRydWUpLmlzLm51bWVyaWM7XG59O1xuYXNzZXJ0LmlzTm90TnVtZXJpYyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE51bWVyaWMsIHRydWUpLmlzLm5vdC5udW1lcmljO1xufTtcbmFzc2VydC5pc0Zpbml0ZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0Zpbml0ZSwgdHJ1ZSkudG8uYmUuZmluaXRlO1xufTtcbmFzc2VydC5pc0Jvb2xlYW4gPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNCb29sZWFuLCB0cnVlKS50by5iZS5hKFwiYm9vbGVhblwiKTtcbn07XG5hc3NlcnQuaXNOb3RCb29sZWFuID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90Qm9vbGVhbiwgdHJ1ZSkudG8ubm90LmJlLmEoXCJib29sZWFuXCIpO1xufTtcbmFzc2VydC50eXBlT2YgPSBmdW5jdGlvbih2YWwsIHR5cGUzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LnR5cGVPZiwgdHJ1ZSkudG8uYmUuYSh0eXBlMyk7XG59O1xuYXNzZXJ0Lm5vdFR5cGVPZiA9IGZ1bmN0aW9uKHZhbHVlLCB0eXBlMywgbWVzc2FnZSkge1xuICBuZXcgQXNzZXJ0aW9uKHZhbHVlLCBtZXNzYWdlLCBhc3NlcnQubm90VHlwZU9mLCB0cnVlKS50by5ub3QuYmUuYSh0eXBlMyk7XG59O1xuYXNzZXJ0Lmluc3RhbmNlT2YgPSBmdW5jdGlvbih2YWwsIHR5cGUzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0Lmluc3RhbmNlT2YsIHRydWUpLnRvLmJlLmluc3RhbmNlT2YodHlwZTMpO1xufTtcbmFzc2VydC5ub3RJbnN0YW5jZU9mID0gZnVuY3Rpb24odmFsLCB0eXBlMywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5ub3RJbnN0YW5jZU9mLCB0cnVlKS50by5ub3QuYmUuaW5zdGFuY2VPZihcbiAgICB0eXBlM1xuICApO1xufTtcbmFzc2VydC5pbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuaW5jbHVkZSwgdHJ1ZSkuaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5ub3RJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90SW5jbHVkZSwgdHJ1ZSkubm90LmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQuZGVlcEluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwSW5jbHVkZSwgdHJ1ZSkuZGVlcC5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdERlZXBJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcEluY2x1ZGUsIHRydWUpLm5vdC5kZWVwLmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQubmVzdGVkSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5lc3RlZEluY2x1ZGUsIHRydWUpLm5lc3RlZC5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdE5lc3RlZEluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlLCB0cnVlKS5ub3QubmVzdGVkLmluY2x1ZGUoXG4gICAgaW5jXG4gICk7XG59O1xuYXNzZXJ0LmRlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuZGVlcE5lc3RlZEluY2x1ZGUsIHRydWUpLmRlZXAubmVzdGVkLmluY2x1ZGUoXG4gICAgaW5jXG4gICk7XG59O1xuYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIGV4cCxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlLFxuICAgIHRydWVcbiAgKS5ub3QuZGVlcC5uZXN0ZWQuaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5vd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQub3duSW5jbHVkZSwgdHJ1ZSkub3duLmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQubm90T3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE93bkluY2x1ZGUsIHRydWUpLm5vdC5vd24uaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5kZWVwT3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0LmRlZXBPd25JbmNsdWRlLCB0cnVlKS5kZWVwLm93bi5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdERlZXBPd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcE93bkluY2x1ZGUsIHRydWUpLm5vdC5kZWVwLm93bi5pbmNsdWRlKFxuICAgIGluY1xuICApO1xufTtcbmFzc2VydC5tYXRjaCA9IGZ1bmN0aW9uKGV4cCwgcmUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubWF0Y2gsIHRydWUpLnRvLm1hdGNoKHJlKTtcbn07XG5hc3NlcnQubm90TWF0Y2ggPSBmdW5jdGlvbihleHAsIHJlLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE1hdGNoLCB0cnVlKS50by5ub3QubWF0Y2gocmUpO1xufTtcbmFzc2VydC5wcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5wcm9wZXJ0eSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbn07XG5hc3NlcnQubm90UHJvcGVydHkgPSBmdW5jdGlvbihvYmosIHByb3AsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90UHJvcGVydHksIHRydWUpLnRvLm5vdC5oYXZlLnByb3BlcnR5KHByb3ApO1xufTtcbmFzc2VydC5wcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LnByb3BlcnR5VmFsLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3AsIHZhbCk7XG59O1xuYXNzZXJ0Lm5vdFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90UHJvcGVydHlWYWwsIHRydWUpLnRvLm5vdC5oYXZlLnByb3BlcnR5KFxuICAgIHByb3AsXG4gICAgdmFsXG4gICk7XG59O1xuYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCwgdHJ1ZSkudG8uaGF2ZS5kZWVwLnByb3BlcnR5KFxuICAgIHByb3AsXG4gICAgdmFsXG4gICk7XG59O1xuYXNzZXJ0Lm5vdERlZXBQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBvYmosXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3REZWVwUHJvcGVydHlWYWwsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLmRlZXAucHJvcGVydHkocHJvcCwgdmFsKTtcbn07XG5hc3NlcnQub3duUHJvcGVydHkgPSBmdW5jdGlvbihvYmosIHByb3AsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQub3duUHJvcGVydHksIHRydWUpLnRvLmhhdmUub3duLnByb3BlcnR5KHByb3ApO1xufTtcbmFzc2VydC5ub3RPd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5ub3RPd25Qcm9wZXJ0eSwgdHJ1ZSkudG8ubm90LmhhdmUub3duLnByb3BlcnR5KFxuICAgIHByb3BcbiAgKTtcbn07XG5hc3NlcnQub3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbHVlLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm93blByb3BlcnR5VmFsLCB0cnVlKS50by5oYXZlLm93bi5wcm9wZXJ0eShcbiAgICBwcm9wLFxuICAgIHZhbHVlXG4gICk7XG59O1xuYXNzZXJ0Lm5vdE93blByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90T3duUHJvcGVydHlWYWwsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG59O1xuYXNzZXJ0LmRlZXBPd25Qcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsdWUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0LmRlZXBPd25Qcm9wZXJ0eVZhbCxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5kZWVwLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG59O1xuYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsdWUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCxcbiAgICB0cnVlXG4gICkudG8ubm90LmhhdmUuZGVlcC5vd24ucHJvcGVydHkocHJvcCwgdmFsdWUpO1xufTtcbmFzc2VydC5uZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eSwgdHJ1ZSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoXG4gICAgcHJvcFxuICApO1xufTtcbmFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90TmVzdGVkUHJvcGVydHksXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLm5lc3RlZC5wcm9wZXJ0eShwcm9wKTtcbn07XG5hc3NlcnQubmVzdGVkUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubmVzdGVkUHJvcGVydHlWYWwsXG4gICAgdHJ1ZVxuICApLnRvLmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG59O1xuYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCwgdmFsKTtcbn07XG5hc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0LmRlZXBOZXN0ZWRQcm9wZXJ0eVZhbCxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xufTtcbmFzc2VydC5ub3REZWVwTmVzdGVkUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xufTtcbmFzc2VydC5sZW5ndGhPZiA9IGZ1bmN0aW9uKGV4cCwgbGVuLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lmxlbmd0aE9mLCB0cnVlKS50by5oYXZlLmxlbmd0aE9mKGxlbik7XG59O1xuYXNzZXJ0Lmhhc0FueUtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQW55S2V5cywgdHJ1ZSkudG8uaGF2ZS5hbnkua2V5cyhrZXlzKTtcbn07XG5hc3NlcnQuaGFzQWxsS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5oYXNBbGxLZXlzLCB0cnVlKS50by5oYXZlLmFsbC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5jb250YWluc0FsbEtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuY29udGFpbnNBbGxLZXlzLCB0cnVlKS50by5jb250YWluLmFsbC5rZXlzKFxuICAgIGtleXNcbiAgKTtcbn07XG5hc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmRvZXNOb3RIYXZlQW55S2V5cywgdHJ1ZSkudG8ubm90LmhhdmUuYW55LmtleXMoXG4gICAga2V5c1xuICApO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFsbEtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZG9lc05vdEhhdmVBbGxLZXlzLCB0cnVlKS50by5ub3QuaGF2ZS5hbGwua2V5cyhcbiAgICBrZXlzXG4gICk7XG59O1xuYXNzZXJ0Lmhhc0FueURlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lmhhc0FueURlZXBLZXlzLCB0cnVlKS50by5oYXZlLmFueS5kZWVwLmtleXMoXG4gICAga2V5c1xuICApO1xufTtcbmFzc2VydC5oYXNBbGxEZWVwS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5oYXNBbGxEZWVwS2V5cywgdHJ1ZSkudG8uaGF2ZS5hbGwuZGVlcC5rZXlzKFxuICAgIGtleXNcbiAgKTtcbn07XG5hc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyxcbiAgICB0cnVlXG4gICkudG8uY29udGFpbi5hbGwuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBvYmosXG4gICAgbXNnLFxuICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5hbnkuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBvYmosXG4gICAgbXNnLFxuICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5hbGwuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC50aHJvd3MgPSBmdW5jdGlvbihmbiwgZXJyb3JMaWtlLCBlcnJNc2dNYXRjaGVyLCBtc2cpIHtcbiAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvckxpa2UgfHwgZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgZXJyTXNnTWF0Y2hlciA9IGVycm9yTGlrZTtcbiAgICBlcnJvckxpa2UgPSBudWxsO1xuICB9XG4gIGxldCBhc3NlcnRFcnIgPSBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC50aHJvd3MsIHRydWUpLnRvLnRocm93KFxuICAgIGVycm9yTGlrZSxcbiAgICBlcnJNc2dNYXRjaGVyXG4gICk7XG4gIHJldHVybiBmbGFnKGFzc2VydEVyciwgXCJvYmplY3RcIik7XG59O1xuYXNzZXJ0LmRvZXNOb3RUaHJvdyA9IGZ1bmN0aW9uKGZuLCBlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1lc3NhZ2UpIHtcbiAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvckxpa2UgfHwgZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgZXJyTXNnTWF0Y2hlciA9IGVycm9yTGlrZTtcbiAgICBlcnJvckxpa2UgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1lc3NhZ2UsIGFzc2VydC5kb2VzTm90VGhyb3csIHRydWUpLnRvLm5vdC50aHJvdyhcbiAgICBlcnJvckxpa2UsXG4gICAgZXJyTXNnTWF0Y2hlclxuICApO1xufTtcbmFzc2VydC5vcGVyYXRvciA9IGZ1bmN0aW9uKHZhbCwgb3BlcmF0b3IsIHZhbDIsIG1zZykge1xuICBsZXQgb2s7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlIFwiPT1cIjpcbiAgICAgIG9rID0gdmFsID09IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPT09XCI6XG4gICAgICBvayA9IHZhbCA9PT0gdmFsMjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCI+XCI6XG4gICAgICBvayA9IHZhbCA+IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPj1cIjpcbiAgICAgIG9rID0gdmFsID49IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPFwiOlxuICAgICAgb2sgPSB2YWwgPCB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIjw9XCI6XG4gICAgICBvayA9IHZhbCA8PSB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIiE9XCI6XG4gICAgICBvayA9IHZhbCAhPSB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIiE9PVwiOlxuICAgICAgb2sgPSB2YWwgIT09IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbXNnID0gbXNnID8gbXNnICsgXCI6IFwiIDogbXNnO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBtc2cgKyAnSW52YWxpZCBvcGVyYXRvciBcIicgKyBvcGVyYXRvciArICdcIicsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgYXNzZXJ0Lm9wZXJhdG9yXG4gICAgICApO1xuICB9XG4gIGxldCB0ZXN0MiA9IG5ldyBBc3NlcnRpb24ob2ssIG1zZywgYXNzZXJ0Lm9wZXJhdG9yLCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KFxuICAgIHRydWUgPT09IGZsYWcodGVzdDIsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBpbnNwZWN0Mih2YWwpICsgXCIgdG8gYmUgXCIgKyBvcGVyYXRvciArIFwiIFwiICsgaW5zcGVjdDIodmFsMiksXG4gICAgXCJleHBlY3RlZCBcIiArIGluc3BlY3QyKHZhbCkgKyBcIiB0byBub3QgYmUgXCIgKyBvcGVyYXRvciArIFwiIFwiICsgaW5zcGVjdDIodmFsMilcbiAgKTtcbn07XG5hc3NlcnQuY2xvc2VUbyA9IGZ1bmN0aW9uKGFjdCwgZXhwLCBkZWx0YSwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5jbG9zZVRvLCB0cnVlKS50by5iZS5jbG9zZVRvKGV4cCwgZGVsdGEpO1xufTtcbmFzc2VydC5hcHByb3hpbWF0ZWx5ID0gZnVuY3Rpb24oYWN0LCBleHAsIGRlbHRhLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0LmFwcHJveGltYXRlbHksIHRydWUpLnRvLmJlLmFwcHJveGltYXRlbHkoXG4gICAgZXhwLFxuICAgIGRlbHRhXG4gICk7XG59O1xuYXNzZXJ0LnNhbWVNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQuc2FtZU1lbWJlcnMsIHRydWUpLnRvLmhhdmUuc2FtZS5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5ub3RTYW1lTWVtYmVycyA9IGZ1bmN0aW9uKHNldDEsIHNldDIsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIHNldDEsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RTYW1lTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8ubm90LmhhdmUuc2FtZS5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5zYW1lRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzZXQxLFxuICAgIG1zZyxcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzLFxuICAgIHRydWVcbiAgKS50by5oYXZlLnNhbWUuZGVlcC5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5ub3RTYW1lRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzZXQxLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90U2FtZURlZXBNZW1iZXJzLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5zYW1lLmRlZXAubWVtYmVycyhzZXQyKTtcbn07XG5hc3NlcnQuc2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc2V0MSxcbiAgICBtc2csXG4gICAgYXNzZXJ0LnNhbWVPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5zYW1lLm9yZGVyZWQubWVtYmVycyhzZXQyKTtcbn07XG5hc3NlcnQubm90U2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc2V0MSxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdFNhbWVPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8ubm90LmhhdmUuc2FtZS5vcmRlcmVkLm1lbWJlcnMoc2V0Mik7XG59O1xuYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzZXQxLFxuICAgIG1zZyxcbiAgICBhc3NlcnQuc2FtZURlZXBPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5zYW1lLmRlZXAub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5ub3RTYW1lRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc2V0MSxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLnNhbWUuZGVlcC5vcmRlcmVkLm1lbWJlcnMoc2V0Mik7XG59O1xuYXNzZXJ0LmluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0LmluY2x1ZGVNZW1iZXJzLCB0cnVlKS50by5pbmNsdWRlLm1lbWJlcnMoXG4gICAgc3Vic2V0XG4gICk7XG59O1xuYXNzZXJ0Lm5vdEluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RJbmNsdWRlTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8ubm90LmluY2x1ZGUubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzdXBlcnNldCxcbiAgICBtc2csXG4gICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaW5jbHVkZS5kZWVwLm1lbWJlcnMoc3Vic2V0KTtcbn07XG5hc3NlcnQubm90SW5jbHVkZURlZXBNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RJbmNsdWRlRGVlcE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5pbmNsdWRlLmRlZXAubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzdXBlcnNldCxcbiAgICBtc2csXG4gICAgYXNzZXJ0LmluY2x1ZGVPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaW5jbHVkZS5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbn07XG5hc3NlcnQubm90SW5jbHVkZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RJbmNsdWRlT3JkZXJlZE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5pbmNsdWRlLm9yZGVyZWQubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzLFxuICAgIHRydWVcbiAgKS50by5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG59O1xuYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzdXBlcnNldCxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG59O1xuYXNzZXJ0Lm9uZU9mID0gZnVuY3Rpb24oaW5MaXN0LCBsaXN0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihpbkxpc3QsIG1zZywgYXNzZXJ0Lm9uZU9mLCB0cnVlKS50by5iZS5vbmVPZihsaXN0KTtcbn07XG5hc3NlcnQuaXNJdGVyYWJsZSA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIGlmIChvYmogPT0gdm9pZCAwIHx8ICFvYmpbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgIG1zZyA9IG1zZyA/IGAke21zZ30gZXhwZWN0ZWQgJHtpbnNwZWN0MihvYmopfSB0byBiZSBhbiBpdGVyYWJsZWAgOiBgZXhwZWN0ZWQgJHtpbnNwZWN0MihvYmopfSB0byBiZSBhbiBpdGVyYWJsZWA7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1zZywgdm9pZCAwLCBhc3NlcnQuaXNJdGVyYWJsZSk7XG4gIH1cbn07XG5hc3NlcnQuY2hhbmdlcyA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBtc2cgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmNoYW5nZXMsIHRydWUpLnRvLmNoYW5nZShvYmosIHByb3ApO1xufTtcbmFzc2VydC5jaGFuZ2VzQnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlc0J5LCB0cnVlKS50by5jaGFuZ2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG59O1xuYXNzZXJ0LmRvZXNOb3RDaGFuZ2UgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbXNnID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdENoYW5nZSwgdHJ1ZSkudG8ubm90LmNoYW5nZShcbiAgICBvYmosXG4gICAgcHJvcFxuICApO1xufTtcbmFzc2VydC5jaGFuZ2VzQnV0Tm90QnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlc0J1dE5vdEJ5LCB0cnVlKS50by5jaGFuZ2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuaW5jcmVhc2VzID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1zZyA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmluY3JlYXNlcywgdHJ1ZSkudG8uaW5jcmVhc2Uob2JqLCBwcm9wKTtcbn07XG5hc3NlcnQuaW5jcmVhc2VzQnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnksIHRydWUpLnRvLmluY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xufTtcbmFzc2VydC5kb2VzTm90SW5jcmVhc2UgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbXNnID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdEluY3JlYXNlLCB0cnVlKS50by5ub3QuaW5jcmVhc2UoXG4gICAgb2JqLFxuICAgIHByb3BcbiAgKTtcbn07XG5hc3NlcnQuaW5jcmVhc2VzQnV0Tm90QnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnV0Tm90QnksIHRydWUpLnRvLmluY3JlYXNlKG9iaiwgcHJvcCkuYnV0Lm5vdC5ieShkZWx0YSk7XG59O1xuYXNzZXJ0LmRlY3JlYXNlcyA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBtc2cgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kZWNyZWFzZXMsIHRydWUpLnRvLmRlY3JlYXNlKG9iaiwgcHJvcCk7XG59O1xuYXNzZXJ0LmRlY3JlYXNlc0J5ID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBsZXQgdG1wTXNnID0gZGVsdGE7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIG1zZyA9IHRtcE1zZztcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRlY3JlYXNlc0J5LCB0cnVlKS50by5kZWNyZWFzZShvYmosIHByb3ApLmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuZG9lc05vdERlY3JlYXNlID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1zZyA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZSwgdHJ1ZSkudG8ubm90LmRlY3JlYXNlKFxuICAgIG9iaixcbiAgICBwcm9wXG4gICk7XG59O1xuYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5ID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBsZXQgdG1wTXNnID0gZGVsdGE7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIG1zZyA9IHRtcE1zZztcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kb2VzTm90RGVjcmVhc2VCeSwgdHJ1ZSkudG8ubm90LmRlY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xufTtcbmFzc2VydC5kZWNyZWFzZXNCdXROb3RCeSA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbGV0IHRtcE1zZyA9IGRlbHRhO1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBtc2cgPSB0bXBNc2c7XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kZWNyZWFzZXNCdXROb3RCeSwgdHJ1ZSkudG8uZGVjcmVhc2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuaWZFcnJvciA9IGZ1bmN0aW9uKHZhbCkge1xuICBpZiAodmFsKSB7XG4gICAgdGhyb3cgdmFsO1xuICB9XG59O1xuYXNzZXJ0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc0V4dGVuc2libGUsIHRydWUpLnRvLmJlLmV4dGVuc2libGU7XG59O1xuYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZSA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc05vdEV4dGVuc2libGUsIHRydWUpLnRvLm5vdC5iZS5leHRlbnNpYmxlO1xufTtcbmFzc2VydC5pc1NlYWxlZCA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc1NlYWxlZCwgdHJ1ZSkudG8uYmUuc2VhbGVkO1xufTtcbmFzc2VydC5pc05vdFNlYWxlZCA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc05vdFNlYWxlZCwgdHJ1ZSkudG8ubm90LmJlLnNlYWxlZDtcbn07XG5hc3NlcnQuaXNGcm96ZW4gPSBmdW5jdGlvbihvYmosIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNGcm96ZW4sIHRydWUpLnRvLmJlLmZyb3plbjtcbn07XG5hc3NlcnQuaXNOb3RGcm96ZW4gPSBmdW5jdGlvbihvYmosIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNOb3RGcm96ZW4sIHRydWUpLnRvLm5vdC5iZS5mcm96ZW47XG59O1xuYXNzZXJ0LmlzRW1wdHkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNFbXB0eSwgdHJ1ZSkudG8uYmUuZW1wdHk7XG59O1xuYXNzZXJ0LmlzTm90RW1wdHkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RFbXB0eSwgdHJ1ZSkudG8ubm90LmJlLmVtcHR5O1xufTtcbmFzc2VydC5jb250YWluc1N1YnNldCA9IGZ1bmN0aW9uKHZhbCwgZXhwLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8uY29udGFpblN1YnNldChleHApO1xufTtcbmFzc2VydC5kb2VzTm90Q29udGFpblN1YnNldCA9IGZ1bmN0aW9uKHZhbCwgZXhwLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8ubm90LmNvbnRhaW5TdWJzZXQoZXhwKTtcbn07XG52YXIgYWxpYXNlcyA9IFtcbiAgW1wiaXNPa1wiLCBcIm9rXCJdLFxuICBbXCJpc05vdE9rXCIsIFwibm90T2tcIl0sXG4gIFtcInRocm93c1wiLCBcInRocm93XCJdLFxuICBbXCJ0aHJvd3NcIiwgXCJUaHJvd1wiXSxcbiAgW1wiaXNFeHRlbnNpYmxlXCIsIFwiZXh0ZW5zaWJsZVwiXSxcbiAgW1wiaXNOb3RFeHRlbnNpYmxlXCIsIFwibm90RXh0ZW5zaWJsZVwiXSxcbiAgW1wiaXNTZWFsZWRcIiwgXCJzZWFsZWRcIl0sXG4gIFtcImlzTm90U2VhbGVkXCIsIFwibm90U2VhbGVkXCJdLFxuICBbXCJpc0Zyb3plblwiLCBcImZyb3plblwiXSxcbiAgW1wiaXNOb3RGcm96ZW5cIiwgXCJub3RGcm96ZW5cIl0sXG4gIFtcImlzRW1wdHlcIiwgXCJlbXB0eVwiXSxcbiAgW1wiaXNOb3RFbXB0eVwiLCBcIm5vdEVtcHR5XCJdLFxuICBbXCJpc0NhbGxhYmxlXCIsIFwiaXNGdW5jdGlvblwiXSxcbiAgW1wiaXNOb3RDYWxsYWJsZVwiLCBcImlzTm90RnVuY3Rpb25cIl0sXG4gIFtcImNvbnRhaW5zU3Vic2V0XCIsIFwiY29udGFpblN1YnNldFwiXVxuXTtcbmZvciAoY29uc3QgW25hbWUsIGFzXSBvZiBhbGlhc2VzKSB7XG4gIGFzc2VydFthc10gPSBhc3NlcnRbbmFtZV07XG59XG5cbi8vIGxpYi9jaGFpLmpzXG52YXIgdXNlZCA9IFtdO1xuZnVuY3Rpb24gdXNlKGZuKSB7XG4gIGNvbnN0IGV4cG9ydHMgPSB7XG4gICAgdXNlLFxuICAgIEFzc2VydGlvbkVycm9yLFxuICAgIHV0aWw6IHV0aWxzX2V4cG9ydHMsXG4gICAgY29uZmlnLFxuICAgIGV4cGVjdCxcbiAgICBhc3NlcnQsXG4gICAgQXNzZXJ0aW9uLFxuICAgIC4uLnNob3VsZF9leHBvcnRzXG4gIH07XG4gIGlmICghfnVzZWQuaW5kZXhPZihmbikpIHtcbiAgICBmbihleHBvcnRzLCB1dGlsc19leHBvcnRzKTtcbiAgICB1c2VkLnB1c2goZm4pO1xuICB9XG4gIHJldHVybiBleHBvcnRzO1xufVxuX19uYW1lKHVzZSwgXCJ1c2VcIik7XG5leHBvcnQge1xuICBBc3NlcnRpb24sXG4gIEFzc2VydGlvbkVycm9yLFxuICBTaG91bGQsXG4gIGFzc2VydCxcbiAgY29uZmlnLFxuICBleHBlY3QsXG4gIHNob3VsZCxcbiAgdXNlLFxuICB1dGlsc19leHBvcnRzIGFzIHV0aWxcbn07XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzBdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLElBQUksWUFBWSxPQUFPO0FBQ3ZCLElBQUksbUJBQW1CLEtBQUssS0FBSyxVQUFVLE9BQU8sTUFBTSxVQUFVLEtBQUssS0FBSztDQUFFLFlBQVk7Q0FBTSxjQUFjO0NBQU0sVUFBVTtDQUFNO0NBQU8sQ0FBQyxHQUFHLElBQUksT0FBTztBQUMxSixJQUFJLFVBQVUsUUFBUSxVQUFVLFVBQVUsUUFBUSxRQUFRO0NBQUU7Q0FBTyxjQUFjO0NBQU0sQ0FBQztBQUN4RixJQUFJLFlBQVksUUFBUSxRQUFRO0FBQzlCLE1BQUssSUFBSSxRQUFRLElBQ2YsV0FBVSxRQUFRLE1BQU07RUFBRSxLQUFLLElBQUk7RUFBTyxZQUFZO0VBQU0sQ0FBQzs7QUFFakUsSUFBSSxpQkFBaUIsS0FBSyxLQUFLLFVBQVUsZ0JBQWdCLEtBQUssT0FBTyxRQUFRLFdBQVcsTUFBTSxLQUFLLEtBQUssTUFBTTtBQUc5RyxJQUFJLGdCQUFnQixFQUFFO0FBQ3RCLFNBQVMsZUFBZTtDQUN0QiwwQkFBMEI7Q0FDMUIsc0JBQXNCO0NBQ3RCLGlCQUFpQjtDQUNqQixtQkFBbUI7Q0FDbkIsa0JBQWtCO0NBQ2xCLHdCQUF3QjtDQUN4QixXQUFXO0NBQ1gsY0FBYztDQUNkLG1CQUFtQjtDQUNuQixZQUFZO0NBQ1osaUJBQWlCO0NBQ2pCLGtCQUFrQjtDQUNsQixlQUFlO0NBQ2YsbUJBQW1CO0NBQ25CLGtDQUFrQztDQUNsQyx1Q0FBdUM7Q0FDdkMsbUJBQW1CO0NBQ25CLG1CQUFtQjtDQUNuQixlQUFlO0NBQ2YsYUFBYTtDQUNiLGlCQUFpQjtD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