@decohere/scaffold 0.0.1-dev.88 → 0.0.1-dev.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commonjs/src/auth0-configure.action.js +30 -0
- package/commonjs/src/auth0-configure.command.js +26 -0
- package/commonjs/src/auth0-login.action.js +30 -0
- package/commonjs/src/auth0-login.command.js +25 -0
- package/commonjs/src/auth0.command.js +24 -0
- package/commonjs/src/auth0.module.js +30 -0
- package/commonjs/src/index.js +13 -1
- package/commonjs/src/program.js +10 -1
- package/commonjs/src/webapi/auth0-commands.js +252 -0
- package/commonjs/src/webapi/authorize-scopes.js +81 -0
- package/commonjs/src/webapi/features/auth.feature.js +3 -30
- package/commonjs/src/webapi/features/auth0-cli.js +41 -2
- package/commonjs/src/webapi/workspace-readme.js +2 -2
- package/es6/src/auth0-configure.action.js +20 -0
- package/es6/src/auth0-configure.command.js +16 -0
- package/es6/src/auth0-login.action.js +20 -0
- package/es6/src/auth0-login.command.js +15 -0
- package/es6/src/auth0.command.js +14 -0
- package/es6/src/auth0.module.js +20 -0
- package/es6/src/index.js +4 -1
- package/es6/src/program.js +10 -1
- package/es6/src/webapi/auth0-commands.js +187 -0
- package/es6/src/webapi/authorize-scopes.js +57 -0
- package/es6/src/webapi/features/auth.feature.js +3 -30
- package/es6/src/webapi/features/auth0-cli.js +36 -3
- package/es6/src/webapi/workspace-readme.js +2 -2
- package/package.json +3 -3
- package/types/src/auth0-configure.action.d.ts +7 -0
- package/types/src/auth0-configure.command.d.ts +6 -0
- package/types/src/auth0-login.action.d.ts +4 -0
- package/types/src/auth0-login.command.d.ts +6 -0
- package/types/src/auth0.command.d.ts +6 -0
- package/types/src/auth0.module.d.ts +18 -0
- package/types/src/index.d.ts +4 -0
- package/types/src/webapi/auth0-commands.d.ts +11 -0
- package/types/src/webapi/authorize-scopes.d.ts +7 -0
- package/types/src/webapi/features/auth0-cli.d.ts +4 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ask, pick } from "../../domain/prompt.js";
|
|
2
2
|
import { WELL_KNOWN_FILES } from "../../models/const.js";
|
|
3
|
+
import { ensureLoggedIn } from "../auth0-commands.js";
|
|
3
4
|
import { AuthConfigModel } from "../models/auth-config.model.js";
|
|
4
5
|
import { ControllerSourceFile } from "../models/controller-source-file.model.js";
|
|
5
6
|
import * as auth0Cli from "./auth0-cli.js";
|
|
@@ -156,35 +157,7 @@ async function getOptions(workspace, cliOptions) {
|
|
|
156
157
|
return getAuth0Options(workspace, cliOptions);
|
|
157
158
|
}
|
|
158
159
|
async function getAuth0Options(workspace, cliOptions) {
|
|
159
|
-
|
|
160
|
-
console.error("\n The Auth0 CLI is required for automated setup.\n" + " Install: brew install auth0/auth0-cli/auth0\n" + " Or visit: https://github.com/auth0/auth0-cli\n");
|
|
161
|
-
process.exit(1);
|
|
162
|
-
}
|
|
163
|
-
process.stdout.write("\n Checking Auth0 credentials...");
|
|
164
|
-
let tenants = auth0Cli.listTenants();
|
|
165
|
-
if (tenants.length === 0) {
|
|
166
|
-
process.stdout.write(" not logged in.\n");
|
|
167
|
-
console.log(" Logging in to Auth0 (your browser will open)...");
|
|
168
|
-
if (!auth0Cli.login()) {
|
|
169
|
-
console.error("\n Auth0 login failed.");
|
|
170
|
-
process.exit(1);
|
|
171
|
-
}
|
|
172
|
-
tenants = auth0Cli.listTenants();
|
|
173
|
-
}
|
|
174
|
-
try {
|
|
175
|
-
auth0Cli.listApis();
|
|
176
|
-
process.stdout.write(" ok.\n");
|
|
177
|
-
} catch (err) {
|
|
178
|
-
if (err instanceof auth0Cli.Auth0AuthError) {
|
|
179
|
-
process.stdout.write(" token expired.\n");
|
|
180
|
-
console.log(" Re-authenticating (your browser will open)...");
|
|
181
|
-
if (!auth0Cli.login()) {
|
|
182
|
-
console.error("\n Auth0 login failed.");
|
|
183
|
-
process.exit(1);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
const active = tenants.find((t)=>t.active) ?? tenants[0];
|
|
160
|
+
const active = ensureLoggedIn();
|
|
188
161
|
const issuerBaseUrl = `https://${active.name}`;
|
|
189
162
|
console.log(`\n ✓ Auth0 tenant: ${issuerBaseUrl}`);
|
|
190
163
|
process.stdout.write("\n Fetching Auth0 APIs...");
|
|
@@ -387,4 +360,4 @@ export const AuthFeature = {
|
|
|
387
360
|
scaffold
|
|
388
361
|
};
|
|
389
362
|
|
|
390
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy93ZWJhcGkvZmVhdHVyZXMvYXV0aC5mZWF0dXJlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFzaywgcGljayB9IGZyb20gXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ1lhbWwgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbmZpZy15YW1sLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnZGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9lbnYtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VTY2FmZm9sZCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcHJvamVjdC5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3NjYWZmb2xkLnNlcnZpY2UuanNcIjtcbmltcG9ydCB7IEF1dGhDb25maWdNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvYXV0aC1jb25maWcubW9kZWwuanNcIjtcbmltcG9ydCB7IENvbnRyb2xsZXJTb3VyY2VGaWxlIH0gZnJvbSBcIi4uL21vZGVscy9jb250cm9sbGVyLXNvdXJjZS1maWxlLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE1haW5Tb3VyY2VGaWxlIH0gZnJvbSBcIi4uL21vZGVscy9tYWluLXNvdXJjZS1maWxlLm1vZGVsLmpzXCI7XG5pbXBvcnQgKiBhcyBhdXRoMENsaSBmcm9tIFwiLi9hdXRoMC1jbGkuanNcIjtcblxuZXhwb3J0IHR5cGUgQXV0aE9wdGlvbnMgPSB7XG5cdGF1dGhQcm92aWRlcj86IFwiYXV0aDBcIiB8IFwibm9uZVwiO1xuXHRpc3N1ZXJCYXNlVXJsPzogc3RyaW5nO1xuXHRhdWRpZW5jZT86IHN0cmluZztcblx0ZGF0YWJhc2VQcm92aWRlcj86IFwibm9uZVwiIHwgXCJwb3N0Z3Jlcy90eXBlb3JtXCI7XG5cdGFkbWluVXNlcm5hbWU/OiBzdHJpbmc7XG5cdGFkbWluUGFzc3dvcmQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBBRE1JTl9ST0xFID0gXCJhZG1pblwiO1xuXG5jb25zdCBVU0VSX0VOVElUWV9UUyA9IGBpbXBvcnQgeyBDb2x1bW4sIEVudGl0eSwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbiB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSBhcyBJRW50aXR5IH0gZnJvbSBcIkBkZWNvaGVyZS9jb2RleFwiO1xuXG5ARW50aXR5KClcbmV4cG9ydCBjbGFzcyBVc2VyRW50aXR5IGltcGxlbWVudHMgSUVudGl0eSB7XG5cXHRAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG5cXHRwdWJsaWMgaWQhOiBudW1iZXI7XG5cblxcdEBDb2x1bW4oeyB1bmlxdWU6IHRydWUgfSlcblxcdHB1YmxpYyBzdWIhOiBzdHJpbmc7XG5cblxcdEBDb2x1bW4oeyB0eXBlOiBcInZhcmNoYXJcIiwgbnVsbGFibGU6IHRydWUgfSlcblxcdHB1YmxpYyBlbWFpbCE6IHN0cmluZyB8IG51bGw7XG5cblxcdEBDb2x1bW4oKVxuXFx0cHVibGljIGRpc3BsYXlOYW1lITogc3RyaW5nO1xuXG5cXHQvKiogQXBwLW93bmVkIHJvbGVzLiBUaGUgXFxgYWRtaW5cXGAgcm9sZSBncmFudHMgQ0FTTCBcXGBtYW5hZ2VcXGAvXFxgYWxsXFxgICh3aWxkY2FyZCkuICovXG5cXHRAQ29sdW1uKHsgdHlwZTogXCJzaW1wbGUtanNvblwiLCBkZWZhdWx0OiBcIltdXCIgfSlcblxcdHB1YmxpYyByb2xlcyE6IHN0cmluZ1tdO1xufVxuYDtcblxuY29uc3QgVVNFUl9SRVBPU0lUT1JZX1RTID0gYGltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tIFwiQGRlY29oZXJlL2NydWNpYmxlL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IGluamVjdFVuaXRPZldvcmsgfSBmcm9tIFwiQGRlY29oZXJlL2NvZGV4XCI7XG5pbXBvcnQgeyBUeXBlT3JtUmVwb3NpdG9yeSwgVHlwZU9ybVVuaXRPZldvcmsgfSBmcm9tIFwiQGRlY29oZXJlL2NvZGV4LXR5cGVvcm1cIjtcbmltcG9ydCB7IFVzZXJFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXRpZXMvdXNlci5lbnRpdHkuanNcIjtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFVzZXJFbnRpdHlSZXBvc2l0b3J5IGV4dGVuZHMgVHlwZU9ybVJlcG9zaXRvcnk8VXNlckVudGl0eT4ge1xuXFx0cHVibGljIGNvbnN0cnVjdG9yKEBpbmplY3RVbml0T2ZXb3JrKCkgdW5pdE9mV29yazogVHlwZU9ybVVuaXRPZldvcmspIHtcblxcdFxcdHN1cGVyKHVuaXRPZldvcmssIFVzZXJFbnRpdHkpO1xuXFx0fVxuXG5cXHRwdWJsaWMgZmluZEJ5U3ViKHN1Yjogc3RyaW5nKTogUHJvbWlzZTxVc2VyRW50aXR5IHwgbnVsbD4ge1xuXFx0XFx0cmV0dXJuIHRoaXMuZmlyc3RPckRlZmF1bHQoeyB3aGVyZTogeyBzdWIgfSB9KTtcblxcdH1cbn1cbmA7XG5cbmNvbnN0IFVTRVJfU0VSVklDRV9UUyA9IGBpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IFByaW5jaXBhbCB9IGZyb20gXCJAZGVjb2hlcmUvY29ydGV4XCI7XG5pbXBvcnQgeyBVc2VyRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0aWVzL3VzZXIuZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBVc2VyRW50aXR5UmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3JpZXMvdXNlci5yZXBvc2l0b3J5LmpzXCI7XG5cbmZ1bmN0aW9uIGNsYWltU3RyaW5nKHByaW5jaXBhbDogUHJpbmNpcGFsIHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cXHRjb25zdCB2YWx1ZSA9IHByaW5jaXBhbD8uW2tleV07XG5cXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLmxlbmd0aCA+IDAgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFVzZXJTZXJ2aWNlIHtcblxcdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHVzZXJzOiBVc2VyRW50aXR5UmVwb3NpdG9yeSkge31cblxuXFx0LyoqXG5cXHQgKiBVcHNlcnQgYSBsb2NhbCBwcm9maWxlIGtleWVkIGJ5IEpXVCBcXGBzdWJcXGAuXG5cXHQgKiBQcm9maWxlIGZpZWxkcyBmcm9tIHRoZSB0b2tlbiBmaWxsIGdhcHM7IHNlZWRlZCByb3dzIGtlZXAgZGlzcGxheU5hbWUvZW1haWwvcm9sZXMuXG5cXHQgKi9cblxcdHB1YmxpYyBhc3luYyBlbnN1cmVGcm9tUHJpbmNpcGFsKHByaW5jaXBhbDogUHJpbmNpcGFsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxVc2VyRW50aXR5PiB7XG5cXHRcXHRjb25zdCBzdWIgPSBwcmluY2lwYWw/LnN1YjtcblxcdFxcdGlmICghc3ViKSB7XG5cXHRcXHRcXHR0aHJvdyBuZXcgRXJyb3IoXCJBdXRoZW50aWNhdGVkIHJlcXVlc3QgaXMgbWlzc2luZyBwcmluY2lwYWwuc3ViXCIpO1xuXFx0XFx0fVxuXG5cXHRcXHRjb25zdCBlbWFpbCA9XG5cXHRcXHRcXHRjbGFpbVN0cmluZyhwcmluY2lwYWwsIFwiZW1haWxcIikgPz8gY2xhaW1TdHJpbmcocHJpbmNpcGFsLCBcInByZWZlcnJlZF91c2VybmFtZVwiKTtcblxcdFxcdGNvbnN0IGRpc3BsYXlGcm9tVG9rZW4gPVxuXFx0XFx0XFx0Y2xhaW1TdHJpbmcocHJpbmNpcGFsLCBcIm5hbWVcIikgPz9cblxcdFxcdFxcdGNsYWltU3RyaW5nKHByaW5jaXBhbCwgXCJuaWNrbmFtZVwiKSA/P1xuXFx0XFx0XFx0ZW1haWw7XG5cblxcdFxcdGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy51c2Vycy5maW5kQnlTdWIoc3ViKTtcblxcdFxcdGlmIChleGlzdGluZykge1xuXFx0XFx0XFx0bGV0IGRpcnR5ID0gZmFsc2U7XG5cXHRcXHRcXHRpZiAoIWV4aXN0aW5nLmVtYWlsICYmIGVtYWlsKSB7XG5cXHRcXHRcXHRcXHRleGlzdGluZy5lbWFpbCA9IGVtYWlsO1xuXFx0XFx0XFx0XFx0ZGlydHkgPSB0cnVlO1xuXFx0XFx0XFx0fVxuXFx0XFx0XFx0aWYgKGV4aXN0aW5nLmRpc3BsYXlOYW1lID09PSBleGlzdGluZy5zdWIgJiYgZGlzcGxheUZyb21Ub2tlbikge1xuXFx0XFx0XFx0XFx0ZXhpc3RpbmcuZGlzcGxheU5hbWUgPSBkaXNwbGF5RnJvbVRva2VuO1xuXFx0XFx0XFx0XFx0ZGlydHkgPSB0cnVlO1xuXFx0XFx0XFx0fVxuXFx0XFx0XFx0cmV0dXJuIGRpcnR5ID8gdGhpcy51c2Vycy5zYXZlKGV4aXN0aW5nKSA6IGV4aXN0aW5nO1xuXFx0XFx0fVxuXG5cXHRcXHRjb25zdCBjcmVhdGVkID0gbmV3IFVzZXJFbnRpdHkoKTtcblxcdFxcdGNyZWF0ZWQuc3ViID0gc3ViO1xuXFx0XFx0Y3JlYXRlZC5lbWFpbCA9IGVtYWlsID8/IG51bGw7XG5cXHRcXHRjcmVhdGVkLmRpc3BsYXlOYW1lID0gZGlzcGxheUZyb21Ub2tlbiA/PyBzdWI7XG5cXHRcXHRjcmVhdGVkLnJvbGVzID0gQXJyYXkuaXNBcnJheShwcmluY2lwYWwucm9sZXMpXG5cXHRcXHRcXHQ/IHByaW5jaXBhbC5yb2xlcy5maWx0ZXIoKHIpOiByIGlzIHN0cmluZyA9PiB0eXBlb2YgciA9PT0gXCJzdHJpbmdcIilcblxcdFxcdFxcdDogW107XG5cXHRcXHRyZXR1cm4gdGhpcy51c2Vycy5zYXZlKGNyZWF0ZWQpO1xuXFx0fVxufVxuYDtcblxuY29uc3QgQUJJTElUWV9GQUNUT1JZX1RTID0gYGltcG9ydCB0eXBlIHsgUHJpbmNpcGFsIH0gZnJvbSBcIkBkZWNvaGVyZS9jb3J0ZXhcIjtcbmltcG9ydCB7XG5cXHRBRE1JTl9ST0xFLFxuXFx0Y3JlYXRlUHJpbmNpcGFsRnJvbVBheWxvYWQsXG5cXHRkZWZpbmVBYmlsaXRpZXNGb3IgYXMgZGVmYXVsdERlZmluZUFiaWxpdGllc0Zvcixcbn0gZnJvbSBcIkBkZWNvaGVyZS9jb3J0ZXhcIjtcblxuLyoqXG4gKiBDdXN0b21pemUgQ0FTTCBhdXRob3JpemF0aW9uIGhlcmUgKHByb2R1Y3Qtc3BlY2lmaWMgcnVsZXMpLlxuICpcbiAqIERlZmF1bHQgZGVsZWdhdGVzIHRvIGNvcnRleDogXFxgYWRtaW5cXGAgcm9sZSDihpIgXFxgbWFuYWdlXFxgL1xcYGFsbFxcYDsgSWRQIHNjb3Blc1xuICogKFxcYGFjdGlvbjpTdWJqZWN0XFxgKSDihpIgYWJpbGl0aWVzLiBSZXBsYWNlIHRoZSBib2R5IHdoZW4geW91IG5lZWQgYXBwIHJ1bGVzXG4gKiBiZXlvbmQgdGhhdCDigJQgdGhpcyBmaWxlIGlzIHRoZSBpbnRlbnRpb25hbCBleHRlbnNpb24gcG9pbnQsIG5vdCBmcmFtZXdvcmtcbiAqIGluZnJhc3RydWN0dXJlIHRvIGNvcHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVBYmlsaXRpZXNGb3IocHJpbmNpcGFsOiBQcmluY2lwYWwpIHtcblxcdHJldHVybiBkZWZhdWx0RGVmaW5lQWJpbGl0aWVzRm9yKHByaW5jaXBhbCk7XG59XG5cbi8qKlxuICogQ3VzdG9taXplIEpXVCDihpIgUHJpbmNpcGFsIG1hcHBpbmcgaGVyZSAoSWRQLXNwZWNpZmljIGNsYWltcykuXG4gKlxuICogRWxldmF0ZXMgXFxgQVVUSDBfQURNSU5fVVNFUl9TVUJcXGAgdG8gdGhlIGFkbWluIHJvbGUgc28gdGhlIHNlZWRlZCBhZG1pbiB3b3Jrc1xuICogYmVmb3JlL3dpdGhvdXQgcm9sZXMgb24gdGhlIGFjY2VzcyB0b2tlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFByaW5jaXBhbChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByaW5jaXBhbCB7XG5cXHRjb25zdCBwcmluY2lwYWwgPSBjcmVhdGVQcmluY2lwYWxGcm9tUGF5bG9hZChwYXlsb2FkKTtcblxcdGNvbnN0IHN1YiA9IHByaW5jaXBhbC5zdWI7XG5cXHRpZiAoc3ViICYmIHN1YiA9PT0gcHJvY2Vzcy5lbnYuQVVUSDBfQURNSU5fVVNFUl9TVUIpIHtcblxcdFxcdHJldHVybiB7XG5cXHRcXHRcXHQuLi5wcmluY2lwYWwsXG5cXHRcXHRcXHRyb2xlczogWy4uLm5ldyBTZXQoW0FETUlOX1JPTEUsIC4uLihwcmluY2lwYWwucm9sZXMgPz8gW10pXSldLFxuXFx0XFx0fTtcblxcdH1cblxcdHJldHVybiBwcmluY2lwYWw7XG59XG5gO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRPcHRpb25zKFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRjbGlPcHRpb25zOiBQYXJ0aWFsPEF1dGhPcHRpb25zPixcbik6IFByb21pc2U8UGFydGlhbDxBdXRoT3B0aW9ucz4+IHtcblx0aWYgKGNsaU9wdGlvbnMuYXV0aFByb3ZpZGVyID09PSBcImF1dGgwXCIgJiYgIWNsaU9wdGlvbnMuaXNzdWVyQmFzZVVybCkge1xuXHRcdHJldHVybiBnZXRBdXRoME9wdGlvbnMod29ya3NwYWNlLCBjbGlPcHRpb25zKTtcblx0fVxuXHRpZiAoY2xpT3B0aW9ucy5hdXRoUHJvdmlkZXIgIT0gbnVsbCkgcmV0dXJuIHt9O1xuXG5cdGNvbnN0IGNob2ljZXMgPSBbeyBsYWJlbDogXCJub25lXCIgYXMgY29uc3QgfSwgeyBsYWJlbDogXCJhdXRoMFwiIGFzIGNvbnN0IH1dO1xuXHRjb25zdCBzZWxlY3RlZCA9IGF3YWl0IHBpY2soXCJcXG4gIEF1dGggcHJvdmlkZXI6IFwiLCBjaG9pY2VzLCAoYykgPT4gYy5sYWJlbCk7XG5cdGNvbnN0IHByb3ZpZGVyID0gc2VsZWN0ZWQ/LmxhYmVsID8/IFwibm9uZVwiO1xuXG5cdGlmIChwcm92aWRlciAhPT0gXCJhdXRoMFwiKSByZXR1cm4geyBhdXRoUHJvdmlkZXI6IFwibm9uZVwiIH07XG5cblx0cmV0dXJuIGdldEF1dGgwT3B0aW9ucyh3b3Jrc3BhY2UsIGNsaU9wdGlvbnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBdXRoME9wdGlvbnMoXG5cdHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdGNsaU9wdGlvbnM6IFBhcnRpYWw8QXV0aE9wdGlvbnM+LFxuKTogUHJvbWlzZTxQYXJ0aWFsPEF1dGhPcHRpb25zPj4ge1xuXHRpZiAoIWF1dGgwQ2xpLmlzSW5zdGFsbGVkKCkpIHtcblx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XCJcXG4gIFRoZSBBdXRoMCBDTEkgaXMgcmVxdWlyZWQgZm9yIGF1dG9tYXRlZCBzZXR1cC5cXG5cIiArXG5cdFx0XHRcdFwiICBJbnN0YWxsOiBicmV3IGluc3RhbGwgYXV0aDAvYXV0aDAtY2xpL2F1dGgwXFxuXCIgK1xuXHRcdFx0XHRcIiAgT3IgdmlzaXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hdXRoMC9hdXRoMC1jbGlcXG5cIixcblx0XHQpO1xuXHRcdHByb2Nlc3MuZXhpdCgxKTtcblx0fVxuXG5cdHByb2Nlc3Muc3Rkb3V0LndyaXRlKFwiXFxuICBDaGVja2luZyBBdXRoMCBjcmVkZW50aWFscy4uLlwiKTtcblx0bGV0IHRlbmFudHMgPSBhdXRoMENsaS5saXN0VGVuYW50cygpO1xuXHRpZiAodGVuYW50cy5sZW5ndGggPT09IDApIHtcblx0XHRwcm9jZXNzLnN0ZG91dC53cml0ZShcIiBub3QgbG9nZ2VkIGluLlxcblwiKTtcblx0XHRjb25zb2xlLmxvZyhcIiAgTG9nZ2luZyBpbiB0byBBdXRoMCAoeW91ciBicm93c2VyIHdpbGwgb3BlbikuLi5cIik7XG5cdFx0aWYgKCFhdXRoMENsaS5sb2dpbigpKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiXFxuICBBdXRoMCBsb2dpbiBmYWlsZWQuXCIpO1xuXHRcdFx0cHJvY2Vzcy5leGl0KDEpO1xuXHRcdH1cblx0XHR0ZW5hbnRzID0gYXV0aDBDbGkubGlzdFRlbmFudHMoKTtcblx0fVxuXG5cdHRyeSB7XG5cdFx0YXV0aDBDbGkubGlzdEFwaXMoKTtcblx0XHRwcm9jZXNzLnN0ZG91dC53cml0ZShcIiBvay5cXG5cIik7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGlmIChlcnIgaW5zdGFuY2VvZiBhdXRoMENsaS5BdXRoMEF1dGhFcnJvcikge1xuXHRcdFx0cHJvY2Vzcy5zdGRvdXQud3JpdGUoXCIgdG9rZW4gZXhwaXJlZC5cXG5cIik7XG5cdFx0XHRjb25zb2xlLmxvZyhcIiAgUmUtYXV0aGVudGljYXRpbmcgKHlvdXIgYnJvd3NlciB3aWxsIG9wZW4pLi4uXCIpO1xuXHRcdFx0aWYgKCFhdXRoMENsaS5sb2dpbigpKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoXCJcXG4gIEF1dGgwIGxvZ2luIGZhaWxlZC5cIik7XG5cdFx0XHRcdHByb2Nlc3MuZXhpdCgxKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjb25zdCBhY3RpdmUgPSB0ZW5hbnRzLmZpbmQoKHQpID0+IHQuYWN0aXZlKSA/PyB0ZW5hbnRzWzBdO1xuXHRjb25zdCBpc3N1ZXJCYXNlVXJsID0gYGh0dHBzOi8vJHthY3RpdmUubmFtZX1gO1xuXHRjb25zb2xlLmxvZyhgXFxuICDinJMgQXV0aDAgdGVuYW50OiAke2lzc3VlckJhc2VVcmx9YCk7XG5cblx0cHJvY2Vzcy5zdGRvdXQud3JpdGUoXCJcXG4gIEZldGNoaW5nIEF1dGgwIEFQSXMuLi5cIik7XG5cdGNvbnN0IHVzZXJBcGlzID0gYXV0aDBDbGkubGlzdEFwaXMoKS5maWx0ZXIoKGEpID0+ICFhLm5hbWUuaW5jbHVkZXMoXCJNYW5hZ2VtZW50IEFQSVwiKSk7XG5cdHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgZm91bmQgJHt1c2VyQXBpcy5sZW5ndGh9LlxcbmApO1xuXG5cdHR5cGUgQXBpQ2hvaWNlID0geyBsYWJlbDogc3RyaW5nOyBleGlzdGluZzogc3RyaW5nIHwgbnVsbCB9O1xuXHRjb25zdCBwcm9qZWN0TmFtZSA9IHdvcmtzcGFjZS5uYW1lO1xuXHRjb25zdCBhcGlDaG9pY2VzOiBBcGlDaG9pY2VbXSA9IFtcblx0XHR7IGxhYmVsOiBgPG5ldz4gaHR0cHM6Ly9hcGkuJHtwcm9qZWN0TmFtZX1gLCBleGlzdGluZzogbnVsbCB9LFxuXHRcdC4uLnVzZXJBcGlzLm1hcCgoYSkgPT4gKHsgbGFiZWw6IGAke2EubmFtZX0g4oCUICR7YS5pZGVudGlmaWVyfWAsIGV4aXN0aW5nOiBhLmlkZW50aWZpZXIgfSkpLFxuXHRdO1xuXG5cdGNvbnN0IGFwaVNlbGVjdGVkID0gYXdhaXQgcGljayhcIlxcbiAgU2VsZWN0IEF1dGgwIEFQSTogXCIsIGFwaUNob2ljZXMsIChjKSA9PiBjLmxhYmVsKTtcblxuXHRsZXQgYXVkaWVuY2U6IHN0cmluZztcblx0aWYgKCFhcGlTZWxlY3RlZCB8fCBhcGlTZWxlY3RlZC5leGlzdGluZyA9PT0gbnVsbCkge1xuXHRcdGNvbnN0IGRlZmF1bHRJZCA9IGBodHRwczovL2FwaS4ke3Byb2plY3ROYW1lfWA7XG5cdFx0YXVkaWVuY2UgPSBhd2FpdCBhc2soYCAgQVBJIElkZW50aWZpZXIgWyR7ZGVmYXVsdElkfV06IGAsIGRlZmF1bHRJZCk7XG5cdFx0Y29uc29sZS5sb2coXCJcXG4gIENyZWF0aW5nIEF1dGgwIEFQSS4uLlwiKTtcblx0XHRhdWRpZW5jZSA9IGF1dGgwQ2xpLmNyZWF0ZUFwaShgJHtwcm9qZWN0TmFtZX0gQVBJYCwgYXVkaWVuY2UpLmlkZW50aWZpZXI7XG5cdFx0Y29uc29sZS5sb2coYCAgXFx1MjcxMyBBUEkgY3JlYXRlZDogJHthdWRpZW5jZX1gKTtcblx0fSBlbHNlIHtcblx0XHRhdWRpZW5jZSA9IGFwaVNlbGVjdGVkLmV4aXN0aW5nO1xuXHRcdGNvbnNvbGUubG9nKGAgIFxcdTI3MTMgU2VsZWN0ZWQ6ICR7YXVkaWVuY2V9YCk7XG5cdFx0dHJ5IHtcblx0XHRcdGF1dGgwQ2xpLnVwZGF0ZUFwaVNjb3BlcyhhdWRpZW5jZSk7XG5cdFx0XHRjb25zb2xlLmxvZyhgICBcXHUyNzEzIEFQSSBzY29wZXMgZW5zdXJlZCAoJHthdXRoMENsaS5IRUxMT19BUElfU0NPUEVTLmpvaW4oXCIsIFwiKX0pYCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRcIiAg4pyXIEZhaWxlZCB0byB1cGRhdGUgQVBJIHNjb3BlcyDigJQgYWRkIEhlbGxvIHNjb3BlcyBpbiB0aGUgQXV0aDAgZGFzaGJvYXJkLlwiLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCB3aXRoTG9jYWxVc2VycyA9IGNsaU9wdGlvbnMuZGF0YWJhc2VQcm92aWRlciA9PT0gXCJwb3N0Z3Jlcy90eXBlb3JtXCI7XG5cdGxldCBhZG1pblVzZXJuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGxldCBhZG1pblBhc3N3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlmICh3aXRoTG9jYWxVc2Vycykge1xuXHRcdGFkbWluVXNlcm5hbWUgPVxuXHRcdFx0Y2xpT3B0aW9ucy5hZG1pblVzZXJuYW1lID8/IChhd2FpdCBhc2soXCJcXG4gIEFkbWluIHVzZXJuYW1lIFthZG1pbl06IFwiLCBcImFkbWluXCIpKTtcblx0XHRhZG1pblBhc3N3b3JkID0gY2xpT3B0aW9ucy5hZG1pblBhc3N3b3JkO1xuXHRcdGlmIChhZG1pblBhc3N3b3JkID09IG51bGwpIHtcblx0XHRcdGFkbWluUGFzc3dvcmQgPSBhd2FpdCBhc2soXCIgIEFkbWluIHBhc3N3b3JkIChsZWF2ZSBibGFuayB0byBnZW5lcmF0ZSk6IFwiKTtcblx0XHRcdGlmICghYWRtaW5QYXNzd29yZCkge1xuXHRcdFx0XHRhZG1pblBhc3N3b3JkID0gYXV0aDBDbGkuZ2VuZXJhdGVBZG1pblBhc3N3b3JkKCk7XG5cdFx0XHRcdGNvbnNvbGUubG9nKGAgIOKckyBHZW5lcmF0ZWQgYWRtaW4gcGFzc3dvcmQgKHdyaXR0ZW4gdG8gLmVudik6ICR7YWRtaW5QYXNzd29yZH1gKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGF1dGhQcm92aWRlcjogXCJhdXRoMFwiLFxuXHRcdGlzc3VlckJhc2VVcmwsXG5cdFx0YXVkaWVuY2UsXG5cdFx0Li4uKHdpdGhMb2NhbFVzZXJzID8geyBhZG1pblVzZXJuYW1lLCBhZG1pblBhc3N3b3JkIH0gOiB7fSksXG5cdH07XG59XG5cbmZ1bmN0aW9uIGFkbWluRW1haWwod29ya3NwYWNlTmFtZTogc3RyaW5nLCB1c2VybmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0aWYgKHVzZXJuYW1lLmluY2x1ZGVzKFwiQFwiKSkgcmV0dXJuIHVzZXJuYW1lO1xuXHRjb25zdCBzbHVnID0gd29ya3NwYWNlTmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05LV0vZywgXCItXCIpO1xuXHRyZXR1cm4gYCR7dXNlcm5hbWV9QCR7c2x1Z30uZXhhbXBsZS5jb21gO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBdXRoMEFkbWluVXNlcihcblx0d29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0b3B0aW9uczogQXV0aE9wdGlvbnMsXG5cdGF1dGhDb25maWc6IEF1dGhDb25maWdNb2RlbCxcbik6IHZvaWQge1xuXHRjb25zdCB1c2VybmFtZSA9IG9wdGlvbnMuYWRtaW5Vc2VybmFtZSA/PyBcImFkbWluXCI7XG5cdGNvbnN0IHBhc3N3b3JkID0gb3B0aW9ucy5hZG1pblBhc3N3b3JkO1xuXHRpZiAoIXBhc3N3b3JkKSByZXR1cm47XG5cblx0Y29uc3QgZW1haWwgPSBhZG1pbkVtYWlsKHdvcmtzcGFjZS5uYW1lLCB1c2VybmFtZSk7XG5cdHRyeSB7XG5cdFx0Y29uc3QgYWRtaW4gPSBhdXRoMENsaS5jcmVhdGVBZG1pbkRhdGFiYXNlVXNlcih7IGVtYWlsLCBwYXNzd29yZCwgdXNlcm5hbWUgfSk7XG5cdFx0YXV0aENvbmZpZy5zZXRBZG1pblVzZXIoe1xuXHRcdFx0c3ViOiBhZG1pbi51c2VyX2lkLFxuXHRcdFx0ZW1haWw6IGFkbWluLmVtYWlsLFxuXHRcdFx0cGFzc3dvcmQ6IGFkbWluLnBhc3N3b3JkLFxuXHRcdFx0dXNlcm5hbWU6IGFkbWluLnVzZXJuYW1lLFxuXHRcdH0pO1xuXHRcdHdvcmtzcGFjZVxuXHRcdFx0LmdldE1vZGVsPEVudkZpbGU+KFdFTExfS05PV05fRklMRVMuRU5WX0ZJTEUpXG5cdFx0XHQ/LmFkZEVudHJ5KFwiQVVUSDBfQURNSU5fVVNFUl9TVUJcIiwgYWRtaW4udXNlcl9pZClcblx0XHRcdC5hZGRFbnRyeShcIkFVVEgwX0FETUlOX1VTRVJfRU1BSUxcIiwgYWRtaW4uZW1haWwpXG5cdFx0XHQuYWRkRW50cnkoXCJBVVRIMF9BRE1JTl9VU0VSX1BBU1NXT1JEXCIsIGFkbWluLnBhc3N3b3JkKVxuXHRcdFx0LmFkZEVudHJ5KFwiQVVUSDBfQURNSU5fVVNFUk5BTUVcIiwgYWRtaW4udXNlcm5hbWUpO1xuXHRcdGNvbnNvbGUubG9nKGAgIOKckyBBdXRoMCBhZG1pbiB1c2VyIHJlYWR5OiAke2FkbWluLmVtYWlsfSAocm9sZTogJHtBRE1JTl9ST0xFfSlgKTtcblx0XHRjb25zb2xlLmxvZyhgICAgIExvZ2luIHdpdGggRU1BSUwgKG5vdCB1c2VybmFtZSk6ICR7YWRtaW4uZW1haWx9YCk7XG5cdFx0Y29uc29sZS5sb2coYCAgICBQYXNzd29yZDogc2VlIEFVVEgwX0FETUlOX1VTRVJfUEFTU1dPUkQgaW4gLmVudmApO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0YCAg4pyXIEZhaWxlZCB0byBlbnN1cmUgQXV0aDAgYWRtaW4gdXNlciAoJHtlbWFpbH0pOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnJ9YCxcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHNjYWZmb2xkTG9jYWxVc2VyUHJvZmlsZSh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkKTogdm9pZCB7XG5cdGZvciAoY29uc3QgcHJvamVjdCBvZiB3b3Jrc3BhY2UuZ2V0UHJvamVjdHMoKSkge1xuXHRcdHByb2plY3Rcblx0XHRcdC5nZXRNb2RlbDxNYWluU291cmNlRmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTKVxuXHRcdFx0Py5hZGRFbnRpdHkoeyBjbGFzc05hbWU6IFwiVXNlckVudGl0eVwiLCBpbXBvcnRQYXRoOiBcIi4vZW50aXRpZXMvdXNlci5lbnRpdHkuanNcIiB9KVxuXHRcdFx0LmFkZFJlcG9zaXRvcnkoe1xuXHRcdFx0XHRjbGFzc05hbWU6IFwiVXNlckVudGl0eVJlcG9zaXRvcnlcIixcblx0XHRcdFx0aW1wb3J0UGF0aDogXCIuL3JlcG9zaXRvcmllcy91c2VyLnJlcG9zaXRvcnkuanNcIixcblx0XHRcdH0pXG5cdFx0XHQuYWRkU2VydmljZSh7XG5cdFx0XHRcdGNsYXNzTmFtZTogXCJVc2VyU2VydmljZVwiLFxuXHRcdFx0XHRpbXBvcnRQYXRoOiBcIi4vc2VydmljZXMvdXNlci5zZXJ2aWNlLmpzXCIsXG5cdFx0XHRcdHNjb3BlOiBcInJlcXVlc3RcIixcblx0XHRcdH0pXG5cdFx0XHQuYWRkSW1wb3J0KFwiZGVmaW5lQWJpbGl0aWVzRm9yXCIsIFwiLi9hdXRoL2FiaWxpdHkuZmFjdG9yeS5qc1wiKVxuXHRcdFx0LmFkZEltcG9ydChcIm1hcFByaW5jaXBhbFwiLCBcIi4vYXV0aC9hYmlsaXR5LmZhY3RvcnkuanNcIilcblx0XHRcdC5zZXRUeXBlT3JtU2VlZChcblx0XHRcdFx0W1xuXHRcdFx0XHRcdFwiY29uc3Qgc3ViID0gcHJvY2Vzcy5lbnYuQVVUSDBfQURNSU5fVVNFUl9TVUI7XCIsXG5cdFx0XHRcdFx0XCJpZiAoIXN1YikgcmV0dXJuO1wiLFxuXHRcdFx0XHRcdFwiY29uc3QgcmVwbyA9IGRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShVc2VyRW50aXR5KTtcIixcblx0XHRcdFx0XHRcImNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVwby5maW5kT25lKHsgd2hlcmU6IHsgc3ViIH0gfSk7XCIsXG5cdFx0XHRcdFx0XCJpZiAoZXhpc3RpbmcpIHJldHVybjtcIixcblx0XHRcdFx0XHRcImF3YWl0IHJlcG8uc2F2ZShyZXBvLmNyZWF0ZSh7XCIsXG5cdFx0XHRcdFx0XCIgIHN1YixcIixcblx0XHRcdFx0XHRcIiAgZW1haWw6IHByb2Nlc3MuZW52LkFVVEgwX0FETUlOX1VTRVJfRU1BSUwgPz8gbnVsbCxcIixcblx0XHRcdFx0XHQnICBkaXNwbGF5TmFtZTogcHJvY2Vzcy5lbnYuQVVUSDBfQURNSU5fVVNFUk5BTUUgPz8gXCJhZG1pblwiLCcsXG5cdFx0XHRcdFx0JyAgcm9sZXM6IFtcImFkbWluXCJdLCcsXG5cdFx0XHRcdFx0XCJ9KSk7XCIsXG5cdFx0XHRcdF0uam9pbihcIiBcIiksXG5cdFx0XHQpO1xuXG5cdFx0cHJvamVjdC5hZGRGaWxlKHtcblx0XHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHRcdHsgZmlsZVBhdGg6IFwic3JjL2VudGl0aWVzL3VzZXIuZW50aXR5LnRzXCIsIGNvbnRlbnQ6IFVTRVJfRU5USVRZX1RTIH0sXG5cdFx0XHRcdHsgZmlsZVBhdGg6IFwic3JjL3JlcG9zaXRvcmllcy91c2VyLnJlcG9zaXRvcnkudHNcIiwgY29udGVudDogVVNFUl9SRVBPU0lUT1JZX1RTIH0sXG5cdFx0XHRcdHsgZmlsZVBhdGg6IFwic3JjL3NlcnZpY2VzL3VzZXIuc2VydmljZS50c1wiLCBjb250ZW50OiBVU0VSX1NFUlZJQ0VfVFMgfSxcblx0XHRcdFx0eyBmaWxlUGF0aDogXCJzcmMvYXV0aC9hYmlsaXR5LmZhY3RvcnkudHNcIiwgY29udGVudDogQUJJTElUWV9GQUNUT1JZX1RTIH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHR9XG5cblx0Zm9yIChjb25zdCBjb250cm9sbGVyIG9mIHdvcmtzcGFjZS5nZXRNb2RlbHMoQ29udHJvbGxlclNvdXJjZUZpbGUpKSB7XG5cdFx0Y29udHJvbGxlclxuXHRcdFx0LmFkZEltcG9ydChcIlVzZXJTZXJ2aWNlXCIsIFwiLi4vc2VydmljZXMvdXNlci5zZXJ2aWNlLmpzXCIpXG5cdFx0XHQuYWRkSW1wb3J0KFwiaW5qZWN0XCIsIFwiQGRlY29oZXJlL2NydWNpYmxlL2RlY29yYXRvcnNcIilcblx0XHRcdC5hZGRDb25zdHJ1Y3RvclBhcmFtKCdAaW5qZWN0KFwiVXNlclNlcnZpY2VcIikgcHJpdmF0ZSByZWFkb25seSB1c2VyczogVXNlclNlcnZpY2UnKTtcblx0XHRjb250cm9sbGVyLmdldE1ldGhvZChcImdldE9uZVwiKS5zZXRBc3luYyh0cnVlKS5zZXRCb2R5KFtcblx0XHRcdFwiY29uc3QgdXNlciA9IGF3YWl0IHRoaXMudXNlcnMuZW5zdXJlRnJvbVByaW5jaXBhbCh0aGlzLnByaW5jaXBhbFByb3ZpZGVyLmN1cnJlbnRQcmluY2lwYWwpO1wiLFxuXHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogdGVtcGxhdGUgbGl0ZXJhbCBpbiBnZW5lcmF0ZWQgY29kZVxuXHRcdFx0XCJyZXR1cm4geyBpZCwgbWVzc2FnZTogYEhlbGxvICR7dXNlci5kaXNwbGF5TmFtZX0hYCwgdXNlcm5hbWU6IHVzZXIuZGlzcGxheU5hbWUgfTtcIixcblx0XHRdKTtcblx0fVxufVxuXG5mdW5jdGlvbiBzY2FmZm9sZCh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBvcHRpb25zOiBBdXRoT3B0aW9ucyk6IHZvaWQge1xuXHRpZiAob3B0aW9ucy5hdXRoUHJvdmlkZXIgIT09IFwiYXV0aDBcIikgcmV0dXJuO1xuXG5cdGNvbnN0IHJlc291cmNlID0gXCJIZWxsb1wiO1xuXHRjb25zdCB3aXRoTG9jYWxVc2VycyA9IG9wdGlvbnMuZGF0YWJhc2VQcm92aWRlciA9PT0gXCJwb3N0Z3Jlcy90eXBlb3JtXCI7XG5cblx0Zm9yIChjb25zdCBjb250cm9sbGVyIG9mIHdvcmtzcGFjZS5nZXRNb2RlbHMoQ29udHJvbGxlclNvdXJjZUZpbGUpKSB7XG5cdFx0Y29udHJvbGxlclxuXHRcdFx0LmFkZERlY29yYXRvcihgQEF1dGhvcml6ZShcInJlYWRcIiwgXCIke3Jlc291cmNlfVwiKWApXG5cdFx0XHQuYWRkQ29ydGV4SW1wb3J0KFwiQWxsb3dBbm9ueW1vdXNcIilcblx0XHRcdC5hZGRDb3J0ZXhJbXBvcnQoXCJBdXRob3JpemVcIilcblx0XHRcdC5hZGRDb3J0ZXhJbXBvcnQoXCJJUHJpbmNpcGFsUHJvdmlkZXJUb2tlblwiKVxuXHRcdFx0LmFkZENvcnRleEltcG9ydChcIklQcmluY2lwYWxQcm92aWRlclwiLCB0cnVlKVxuXHRcdFx0LmFkZEltcG9ydChcImluamVjdFwiLCBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCIpXG5cdFx0XHQuYWRkQ29uc3RydWN0b3JQYXJhbShcblx0XHRcdFx0YEBpbmplY3QoSVByaW5jaXBhbFByb3ZpZGVyVG9rZW4pIHByaXZhdGUgcmVhZG9ubHkgcHJpbmNpcGFsUHJvdmlkZXI6IElQcmluY2lwYWxQcm92aWRlcmAsXG5cdFx0XHQpO1xuXHRcdGNvbnRyb2xsZXIuZ2V0TWV0aG9kKFwiZ2V0QWxsXCIpLmFkZERlY29yYXRvcihcIkBBbGxvd0Fub255bW91cygpXCIpO1xuXHRcdGlmICghd2l0aExvY2FsVXNlcnMpIHtcblx0XHRcdGNvbnRyb2xsZXIuZ2V0TWV0aG9kKFwiZ2V0T25lXCIpLnNldEJvZHkoW1xuXHRcdFx0XHRcImNvbnN0IHByaW5jaXBhbCA9IHRoaXMucHJpbmNpcGFsUHJvdmlkZXIuY3VycmVudFByaW5jaXBhbDtcIixcblx0XHRcdFx0XCJjb25zdCB1c2VybmFtZSA9XCIsXG5cdFx0XHRcdCdcXHQodHlwZW9mIHByaW5jaXBhbD8ubmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwcmluY2lwYWwubmFtZSkgfHwnLFxuXHRcdFx0XHQnXFx0KHR5cGVvZiBwcmluY2lwYWw/Lm5pY2tuYW1lID09PSBcInN0cmluZ1wiICYmIHByaW5jaXBhbC5uaWNrbmFtZSkgfHwnLFxuXHRcdFx0XHQnXFx0KHR5cGVvZiBwcmluY2lwYWw/LmVtYWlsID09PSBcInN0cmluZ1wiICYmIHByaW5jaXBhbC5lbWFpbCkgfHwnLFxuXHRcdFx0XHQnXFx0KHR5cGVvZiBwcmluY2lwYWw/LnByZWZlcnJlZF91c2VybmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwcmluY2lwYWwucHJlZmVycmVkX3VzZXJuYW1lKSB8fCcsXG5cdFx0XHRcdFwiXFx0cHJpbmNpcGFsPy5zdWIgfHxcIixcblx0XHRcdFx0J1xcdFwidW5rbm93blwiOycsXG5cdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IHRlbXBsYXRlIGxpdGVyYWwgaW4gZ2VuZXJhdGVkIGNvZGVcblx0XHRcdFx0XCJyZXR1cm4geyBpZCwgbWVzc2FnZTogYEhlbGxvICR7dXNlcm5hbWV9IWAsIHVzZXJuYW1lIH07XCIsXG5cdFx0XHRdKTtcblx0XHR9XG5cdFx0Y29udHJvbGxlci5nZXRNZXRob2QoXCJjcmVhdGVcIikuYWRkRGVjb3JhdG9yKGBAQXV0aG9yaXplKFwiY3JlYXRlXCIsIFwiJHtyZXNvdXJjZX1cIilgKTtcblx0XHRjb250cm9sbGVyLmdldE1ldGhvZChcInVwZGF0ZVwiKS5hZGREZWNvcmF0b3IoYEBBdXRob3JpemUoXCJ1cGRhdGVcIiwgXCIke3Jlc291cmNlfVwiKWApO1xuXHRcdGNvbnRyb2xsZXIuZ2V0TWV0aG9kKFwicmVtb3ZlXCIpLmFkZERlY29yYXRvcihgQEF1dGhvcml6ZShcImRlbGV0ZVwiLCBcIiR7cmVzb3VyY2V9XCIpYCk7XG5cdH1cblxuXHRmb3IgKGNvbnN0IHByb2plY3Qgb2Ygd29ya3NwYWNlLmdldFByb2plY3RzKCkpIHtcblx0XHRwcm9qZWN0XG5cdFx0XHQuZ2V0TW9kZWw8TWFpblNvdXJjZUZpbGU+KFdFTExfS05PV05fRklMRVMuTUFJTl9UUylcblx0XHRcdD8uYWRkU2lkZUVmZmVjdEltcG9ydChcIkBkZWNvaGVyZS9jb3J0ZXgvYXV0aFwiKTtcblx0fVxuXG5cdGlmICh3aXRoTG9jYWxVc2Vycykge1xuXHRcdHNjYWZmb2xkTG9jYWxVc2VyUHJvZmlsZSh3b3Jrc3BhY2UpO1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiB3b3Jrc3BhY2UuZ2V0UHJvamVjdHMoKSkge1xuXHRcdFx0cHJvamVjdFxuXHRcdFx0XHQuZ2V0TW9kZWw8TWFpblNvdXJjZUZpbGU+KFdFTExfS05PV05fRklMRVMuTUFJTl9UUylcblx0XHRcdFx0Py5hZGRCdWlsZGVyQ2FsbChcIi53aXRoQXV0aChkZWZpbmVBYmlsaXRpZXNGb3IsIHsgcHJpbmNpcGFsTWFwcGVyOiBtYXBQcmluY2lwYWwgfSlcIik7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiB3b3Jrc3BhY2UuZ2V0UHJvamVjdHMoKSkge1xuXHRcdFx0cHJvamVjdFxuXHRcdFx0XHQuZ2V0TW9kZWw8TWFpblNvdXJjZUZpbGU+KFdFTExfS05PV05fRklMRVMuTUFJTl9UUylcblx0XHRcdFx0Py5hZGRCdWlsZGVyQ2FsbChcIi53aXRoQXV0aCgpXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IGludGVudGlvbmFsIFlBTUwgZW52LXZhciBwbGFjZWhvbGRlcnNcblx0Y29uc3QgaXNzdWVyUGxhY2Vob2xkZXIgPSBcIiR7QVVUSDBfSVNTVUVSX0JBU0VfVVJMfVwiO1xuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vVGVtcGxhdGVDdXJseUluU3RyaW5nOiBpbnRlbnRpb25hbCBZQU1MIGVudi12YXIgcGxhY2Vob2xkZXJzXG5cdGNvbnN0IGF1ZFBsYWNlaG9sZGVyID0gXCIke0FVVEgwX0FVRElFTkNFfVwiO1xuXG5cdGNvbnN0IGNvbmZpZ1NlY3Rpb24gPSBgYXV0aDpcXG4gIGRpc2NvdmVyeVVybDogJHtpc3N1ZXJQbGFjZWhvbGRlcn1cXG4gIGF1ZGllbmNlOiAke2F1ZFBsYWNlaG9sZGVyfVxcbmA7XG5cblx0d29ya3NwYWNlLmdldE1vZGVsPENvbmZpZ1lhbWw+KFdFTExfS05PV05fRklMRVMuQ09ORklHX1lBTUwpPy5hZGRTZWN0aW9uKGNvbmZpZ1NlY3Rpb24pO1xuXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxFbnZGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLkVOVl9GSUxFKVxuXHRcdD8uYWRkRW50cnkoXCJBVVRIMF9JU1NVRVJfQkFTRV9VUkxcIiwgb3B0aW9ucy5pc3N1ZXJCYXNlVXJsID8/IFwiXCIpXG5cdFx0LmFkZEVudHJ5KFwiQVVUSDBfQVVESUVOQ0VcIiwgb3B0aW9ucy5hdWRpZW5jZSA/PyBcIlwiKTtcblxuXHRjb25zdCBhdXRoQ29uZmlnID0gbmV3IEF1dGhDb25maWdNb2RlbCh7XG5cdFx0aXNzdWVyQmFzZVVybDogb3B0aW9ucy5pc3N1ZXJCYXNlVXJsID8/IFwiXCIsXG5cdFx0YXVkaWVuY2U6IG9wdGlvbnMuYXVkaWVuY2UgPz8gXCJcIixcblx0fSk7XG5cdHdvcmtzcGFjZS5hZGRNb2RlbChhdXRoQ29uZmlnKTtcblxuXHRpZiAod2l0aExvY2FsVXNlcnMgJiYgb3B0aW9ucy5hZG1pblBhc3N3b3JkKSB7XG5cdFx0Y3JlYXRlQXV0aDBBZG1pblVzZXIod29ya3NwYWNlLCBvcHRpb25zLCBhdXRoQ29uZmlnKTtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgQXV0aEZlYXR1cmU6IEZlYXR1cmU8QXV0aE9wdGlvbnM+ID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCB9O1xuIl0sIm5hbWVzIjpbImFzayIsInBpY2siLCJXRUxMX0tOT1dOX0ZJTEVTIiwiQXV0aENvbmZpZ01vZGVsIiwiQ29udHJvbGxlclNvdXJjZUZpbGUiLCJhdXRoMENsaSIsIkFETUlOX1JPTEUiLCJVU0VSX0VOVElUWV9UUyIsIlVTRVJfUkVQT1NJVE9SWV9UUyIsIlVTRVJfU0VSVklDRV9UUyIsIkFCSUxJVFlfRkFDVE9SWV9UUyIsImdldE9wdGlvbnMiLCJ3b3Jrc3BhY2UiLCJjbGlPcHRpb25zIiwiYXV0aFByb3ZpZGVyIiwiaXNzdWVyQmFzZVVybCIsImdldEF1dGgwT3B0aW9ucyIsImNob2ljZXMiLCJsYWJlbCIsInNlbGVjdGVkIiwiYyIsInByb3ZpZGVyIiwiaXNJbnN0YWxsZWQiLCJjb25zb2xlIiwiZXJyb3IiLCJwcm9jZXNzIiwiZXhpdCIsInN0ZG91dCIsIndyaXRlIiwidGVuYW50cyIsImxpc3RUZW5hbnRzIiwibGVuZ3RoIiwibG9nIiwibG9naW4iLCJsaXN0QXBpcyIsImVyciIsIkF1dGgwQXV0aEVycm9yIiwiYWN0aXZlIiwiZmluZCIsInQiLCJuYW1lIiwidXNlckFwaXMiLCJmaWx0ZXIiLCJhIiwiaW5jbHVkZXMiLCJwcm9qZWN0TmFtZSIsImFwaUNob2ljZXMiLCJleGlzdGluZyIsIm1hcCIsImlkZW50aWZpZXIiLCJhcGlTZWxlY3RlZCIsImF1ZGllbmNlIiwiZGVmYXVsdElkIiwiY3JlYXRlQXBpIiwidXBkYXRlQXBpU2NvcGVzIiwiSEVMTE9fQVBJX1NDT1BFUyIsImpvaW4iLCJ3aXRoTG9jYWxVc2VycyIsImRhdGFiYXNlUHJvdmlkZXIiLCJhZG1pblVzZXJuYW1lIiwiYWRtaW5QYXNzd29yZCIsImdlbmVyYXRlQWRtaW5QYXNzd29yZCIsImFkbWluRW1haWwiLCJ3b3Jrc3BhY2VOYW1lIiwidXNlcm5hbWUiLCJzbHVnIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwiY3JlYXRlQXV0aDBBZG1pblVzZXIiLCJvcHRpb25zIiwiYXV0aENvbmZpZyIsInBhc3N3b3JkIiwiZW1haWwiLCJhZG1pbiIsImNyZWF0ZUFkbWluRGF0YWJhc2VVc2VyIiwic2V0QWRtaW5Vc2VyIiwic3ViIiwidXNlcl9pZCIsImdldE1vZGVsIiwiRU5WX0ZJTEUiLCJhZGRFbnRyeSIsIkVycm9yIiwibWVzc2FnZSIsInNjYWZmb2xkTG9jYWxVc2VyUHJvZmlsZSIsInByb2plY3QiLCJnZXRQcm9qZWN0cyIsIk1BSU5fVFMiLCJhZGRFbnRpdHkiLCJjbGFzc05hbWUiLCJpbXBvcnRQYXRoIiwiYWRkUmVwb3NpdG9yeSIsImFkZFNlcnZpY2UiLCJzY29wZSIsImFkZEltcG9ydCIsInNldFR5cGVPcm1TZWVkIiwiYWRkRmlsZSIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiY29udHJvbGxlciIsImdldE1vZGVscyIsImFkZENvbnN0cnVjdG9yUGFyYW0iLCJnZXRNZXRob2QiLCJzZXRBc3luYyIsInNldEJvZHkiLCJzY2FmZm9sZCIsInJlc291cmNlIiwiYWRkRGVjb3JhdG9yIiwiYWRkQ29ydGV4SW1wb3J0IiwiYWRkU2lkZUVmZmVjdEltcG9ydCIsImFkZEJ1aWxkZXJDYWxsIiwiaXNzdWVyUGxhY2Vob2xkZXIiLCJhdWRQbGFjZWhvbGRlciIsImNvbmZpZ1NlY3Rpb24iLCJDT05GSUdfWUFNTCIsImFkZFNlY3Rpb24iLCJhZGRNb2RlbCIsIkF1dGhGZWF0dXJlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxHQUFHLEVBQUVDLElBQUksUUFBUSx5QkFBeUI7QUFFbkQsU0FBU0MsZ0JBQWdCLFFBQVEsd0JBQXdCO0FBSXpELFNBQVNDLGVBQWUsUUFBUSxpQ0FBaUM7QUFDakUsU0FBU0Msb0JBQW9CLFFBQVEsNENBQTRDO0FBRWpGLFlBQVlDLGNBQWMsaUJBQWlCO0FBVzNDLE1BQU1DLGFBQWE7QUFFbkIsTUFBTUMsaUJBQWlCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCeEIsQ0FBQztBQUVELE1BQU1DLHFCQUFxQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFlNUIsQ0FBQztBQUVELE1BQU1DLGtCQUFrQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUR6QixDQUFDO0FBRUQsTUFBTUMscUJBQXFCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9DNUIsQ0FBQztBQUVELGVBQWVDLFdBQ2RDLFNBQTRCLEVBQzVCQyxVQUFnQztJQUVoQyxJQUFJQSxXQUFXQyxZQUFZLEtBQUssV0FBVyxDQUFDRCxX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
|
|
363
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy93ZWJhcGkvZmVhdHVyZXMvYXV0aC5mZWF0dXJlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFzaywgcGljayB9IGZyb20gXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ1lhbWwgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbmZpZy15YW1sLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnZGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9lbnYtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VTY2FmZm9sZCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcHJvamVjdC5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3NjYWZmb2xkLnNlcnZpY2UuanNcIjtcbmltcG9ydCB7IGVuc3VyZUxvZ2dlZEluIH0gZnJvbSBcIi4uL2F1dGgwLWNvbW1hbmRzLmpzXCI7XG5pbXBvcnQgeyBBdXRoQ29uZmlnTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzL2F1dGgtY29uZmlnLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyU291cmNlRmlsZSB9IGZyb20gXCIuLi9tb2RlbHMvY29udHJvbGxlci1zb3VyY2UtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBNYWluU291cmNlRmlsZSB9IGZyb20gXCIuLi9tb2RlbHMvbWFpbi1zb3VyY2UtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0ICogYXMgYXV0aDBDbGkgZnJvbSBcIi4vYXV0aDAtY2xpLmpzXCI7XG5cbmV4cG9ydCB0eXBlIEF1dGhPcHRpb25zID0ge1xuXHRhdXRoUHJvdmlkZXI/OiBcImF1dGgwXCIgfCBcIm5vbmVcIjtcblx0aXNzdWVyQmFzZVVybD86IHN0cmluZztcblx0YXVkaWVuY2U/OiBzdHJpbmc7XG5cdGRhdGFiYXNlUHJvdmlkZXI/OiBcIm5vbmVcIiB8IFwicG9zdGdyZXMvdHlwZW9ybVwiO1xuXHRhZG1pblVzZXJuYW1lPzogc3RyaW5nO1xuXHRhZG1pblBhc3N3b3JkPzogc3RyaW5nO1xufTtcblxuY29uc3QgQURNSU5fUk9MRSA9IFwiYWRtaW5cIjtcblxuY29uc3QgVVNFUl9FTlRJVFlfVFMgPSBgaW1wb3J0IHsgQ29sdW1uLCBFbnRpdHksIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgYXMgSUVudGl0eSB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcblxuQEVudGl0eSgpXG5leHBvcnQgY2xhc3MgVXNlckVudGl0eSBpbXBsZW1lbnRzIElFbnRpdHkge1xuXFx0QFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuXFx0cHVibGljIGlkITogbnVtYmVyO1xuXG5cXHRAQ29sdW1uKHsgdW5pcXVlOiB0cnVlIH0pXG5cXHRwdWJsaWMgc3ViITogc3RyaW5nO1xuXG5cXHRAQ29sdW1uKHsgdHlwZTogXCJ2YXJjaGFyXCIsIG51bGxhYmxlOiB0cnVlIH0pXG5cXHRwdWJsaWMgZW1haWwhOiBzdHJpbmcgfCBudWxsO1xuXG5cXHRAQ29sdW1uKClcblxcdHB1YmxpYyBkaXNwbGF5TmFtZSE6IHN0cmluZztcblxuXFx0LyoqIEFwcC1vd25lZCByb2xlcy4gVGhlIFxcYGFkbWluXFxgIHJvbGUgZ3JhbnRzIENBU0wgXFxgbWFuYWdlXFxgL1xcYGFsbFxcYCAod2lsZGNhcmQpLiAqL1xuXFx0QENvbHVtbih7IHR5cGU6IFwic2ltcGxlLWpzb25cIiwgZGVmYXVsdDogXCJbXVwiIH0pXG5cXHRwdWJsaWMgcm9sZXMhOiBzdHJpbmdbXTtcbn1cbmA7XG5cbmNvbnN0IFVTRVJfUkVQT1NJVE9SWV9UUyA9IGBpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBpbmplY3RVbml0T2ZXb3JrIH0gZnJvbSBcIkBkZWNvaGVyZS9jb2RleFwiO1xuaW1wb3J0IHsgVHlwZU9ybVJlcG9zaXRvcnksIFR5cGVPcm1Vbml0T2ZXb3JrIH0gZnJvbSBcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCI7XG5pbXBvcnQgeyBVc2VyRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0aWVzL3VzZXIuZW50aXR5LmpzXCI7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBVc2VyRW50aXR5UmVwb3NpdG9yeSBleHRlbmRzIFR5cGVPcm1SZXBvc2l0b3J5PFVzZXJFbnRpdHk+IHtcblxcdHB1YmxpYyBjb25zdHJ1Y3RvcihAaW5qZWN0VW5pdE9mV29yaygpIHVuaXRPZldvcms6IFR5cGVPcm1Vbml0T2ZXb3JrKSB7XG5cXHRcXHRzdXBlcih1bml0T2ZXb3JrLCBVc2VyRW50aXR5KTtcblxcdH1cblxuXFx0cHVibGljIGZpbmRCeVN1YihzdWI6IHN0cmluZyk6IFByb21pc2U8VXNlckVudGl0eSB8IG51bGw+IHtcblxcdFxcdHJldHVybiB0aGlzLmZpcnN0T3JEZWZhdWx0KHsgd2hlcmU6IHsgc3ViIH0gfSk7XG5cXHR9XG59XG5gO1xuXG5jb25zdCBVU0VSX1NFUlZJQ0VfVFMgPSBgaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBQcmluY2lwYWwgfSBmcm9tIFwiQGRlY29oZXJlL2NvcnRleFwiO1xuaW1wb3J0IHsgVXNlckVudGl0eSB9IGZyb20gXCIuLi9lbnRpdGllcy91c2VyLmVudGl0eS5qc1wiO1xuaW1wb3J0IHsgVXNlckVudGl0eVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yaWVzL3VzZXIucmVwb3NpdG9yeS5qc1wiO1xuXG5mdW5jdGlvbiBjbGFpbVN0cmluZyhwcmluY2lwYWw6IFByaW5jaXBhbCB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXFx0Y29uc3QgdmFsdWUgPSBwcmluY2lwYWw/LltrZXldO1xuXFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBVc2VyU2VydmljZSB7XG5cXHRwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB1c2VyczogVXNlckVudGl0eVJlcG9zaXRvcnkpIHt9XG5cblxcdC8qKlxuXFx0ICogVXBzZXJ0IGEgbG9jYWwgcHJvZmlsZSBrZXllZCBieSBKV1QgXFxgc3ViXFxgLlxuXFx0ICogUHJvZmlsZSBmaWVsZHMgZnJvbSB0aGUgdG9rZW4gZmlsbCBnYXBzOyBzZWVkZWQgcm93cyBrZWVwIGRpc3BsYXlOYW1lL2VtYWlsL3JvbGVzLlxuXFx0ICovXG5cXHRwdWJsaWMgYXN5bmMgZW5zdXJlRnJvbVByaW5jaXBhbChwcmluY2lwYWw6IFByaW5jaXBhbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8VXNlckVudGl0eT4ge1xuXFx0XFx0Y29uc3Qgc3ViID0gcHJpbmNpcGFsPy5zdWI7XG5cXHRcXHRpZiAoIXN1Yikge1xuXFx0XFx0XFx0dGhyb3cgbmV3IEVycm9yKFwiQXV0aGVudGljYXRlZCByZXF1ZXN0IGlzIG1pc3NpbmcgcHJpbmNpcGFsLnN1YlwiKTtcblxcdFxcdH1cblxuXFx0XFx0Y29uc3QgZW1haWwgPVxuXFx0XFx0XFx0Y2xhaW1TdHJpbmcocHJpbmNpcGFsLCBcImVtYWlsXCIpID8/IGNsYWltU3RyaW5nKHByaW5jaXBhbCwgXCJwcmVmZXJyZWRfdXNlcm5hbWVcIik7XG5cXHRcXHRjb25zdCBkaXNwbGF5RnJvbVRva2VuID1cblxcdFxcdFxcdGNsYWltU3RyaW5nKHByaW5jaXBhbCwgXCJuYW1lXCIpID8/XG5cXHRcXHRcXHRjbGFpbVN0cmluZyhwcmluY2lwYWwsIFwibmlja25hbWVcIikgPz9cblxcdFxcdFxcdGVtYWlsO1xuXG5cXHRcXHRjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMudXNlcnMuZmluZEJ5U3ViKHN1Yik7XG5cXHRcXHRpZiAoZXhpc3RpbmcpIHtcblxcdFxcdFxcdGxldCBkaXJ0eSA9IGZhbHNlO1xuXFx0XFx0XFx0aWYgKCFleGlzdGluZy5lbWFpbCAmJiBlbWFpbCkge1xuXFx0XFx0XFx0XFx0ZXhpc3RpbmcuZW1haWwgPSBlbWFpbDtcblxcdFxcdFxcdFxcdGRpcnR5ID0gdHJ1ZTtcblxcdFxcdFxcdH1cblxcdFxcdFxcdGlmIChleGlzdGluZy5kaXNwbGF5TmFtZSA9PT0gZXhpc3Rpbmcuc3ViICYmIGRpc3BsYXlGcm9tVG9rZW4pIHtcblxcdFxcdFxcdFxcdGV4aXN0aW5nLmRpc3BsYXlOYW1lID0gZGlzcGxheUZyb21Ub2tlbjtcblxcdFxcdFxcdFxcdGRpcnR5ID0gdHJ1ZTtcblxcdFxcdFxcdH1cblxcdFxcdFxcdHJldHVybiBkaXJ0eSA/IHRoaXMudXNlcnMuc2F2ZShleGlzdGluZykgOiBleGlzdGluZztcblxcdFxcdH1cblxuXFx0XFx0Y29uc3QgY3JlYXRlZCA9IG5ldyBVc2VyRW50aXR5KCk7XG5cXHRcXHRjcmVhdGVkLnN1YiA9IHN1YjtcblxcdFxcdGNyZWF0ZWQuZW1haWwgPSBlbWFpbCA/PyBudWxsO1xuXFx0XFx0Y3JlYXRlZC5kaXNwbGF5TmFtZSA9IGRpc3BsYXlGcm9tVG9rZW4gPz8gc3ViO1xuXFx0XFx0Y3JlYXRlZC5yb2xlcyA9IEFycmF5LmlzQXJyYXkocHJpbmNpcGFsLnJvbGVzKVxuXFx0XFx0XFx0PyBwcmluY2lwYWwucm9sZXMuZmlsdGVyKChyKTogciBpcyBzdHJpbmcgPT4gdHlwZW9mIHIgPT09IFwic3RyaW5nXCIpXG5cXHRcXHRcXHQ6IFtdO1xuXFx0XFx0cmV0dXJuIHRoaXMudXNlcnMuc2F2ZShjcmVhdGVkKTtcblxcdH1cbn1cbmA7XG5cbmNvbnN0IEFCSUxJVFlfRkFDVE9SWV9UUyA9IGBpbXBvcnQgdHlwZSB7IFByaW5jaXBhbCB9IGZyb20gXCJAZGVjb2hlcmUvY29ydGV4XCI7XG5pbXBvcnQge1xuXFx0QURNSU5fUk9MRSxcblxcdGNyZWF0ZVByaW5jaXBhbEZyb21QYXlsb2FkLFxuXFx0ZGVmaW5lQWJpbGl0aWVzRm9yIGFzIGRlZmF1bHREZWZpbmVBYmlsaXRpZXNGb3IsXG59IGZyb20gXCJAZGVjb2hlcmUvY29ydGV4XCI7XG5cbi8qKlxuICogQ3VzdG9taXplIENBU0wgYXV0aG9yaXphdGlvbiBoZXJlIChwcm9kdWN0LXNwZWNpZmljIHJ1bGVzKS5cbiAqXG4gKiBEZWZhdWx0IGRlbGVnYXRlcyB0byBjb3J0ZXg6IFxcYGFkbWluXFxgIHJvbGUg4oaSIFxcYG1hbmFnZVxcYC9cXGBhbGxcXGA7IElkUCBzY29wZXNcbiAqIChcXGBhY3Rpb246U3ViamVjdFxcYCkg4oaSIGFiaWxpdGllcy4gUmVwbGFjZSB0aGUgYm9keSB3aGVuIHlvdSBuZWVkIGFwcCBydWxlc1xuICogYmV5b25kIHRoYXQg4oCUIHRoaXMgZmlsZSBpcyB0aGUgaW50ZW50aW9uYWwgZXh0ZW5zaW9uIHBvaW50LCBub3QgZnJhbWV3b3JrXG4gKiBpbmZyYXN0cnVjdHVyZSB0byBjb3B5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQWJpbGl0aWVzRm9yKHByaW5jaXBhbDogUHJpbmNpcGFsKSB7XG5cXHRyZXR1cm4gZGVmYXVsdERlZmluZUFiaWxpdGllc0ZvcihwcmluY2lwYWwpO1xufVxuXG4vKipcbiAqIEN1c3RvbWl6ZSBKV1Qg4oaSIFByaW5jaXBhbCBtYXBwaW5nIGhlcmUgKElkUC1zcGVjaWZpYyBjbGFpbXMpLlxuICpcbiAqIEVsZXZhdGVzIFxcYEFVVEgwX0FETUlOX1VTRVJfU1VCXFxgIHRvIHRoZSBhZG1pbiByb2xlIHNvIHRoZSBzZWVkZWQgYWRtaW4gd29ya3NcbiAqIGJlZm9yZS93aXRob3V0IHJvbGVzIG9uIHRoZSBhY2Nlc3MgdG9rZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBQcmluY2lwYWwocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcmluY2lwYWwge1xuXFx0Y29uc3QgcHJpbmNpcGFsID0gY3JlYXRlUHJpbmNpcGFsRnJvbVBheWxvYWQocGF5bG9hZCk7XG5cXHRjb25zdCBzdWIgPSBwcmluY2lwYWwuc3ViO1xuXFx0aWYgKHN1YiAmJiBzdWIgPT09IHByb2Nlc3MuZW52LkFVVEgwX0FETUlOX1VTRVJfU1VCKSB7XG5cXHRcXHRyZXR1cm4ge1xuXFx0XFx0XFx0Li4ucHJpbmNpcGFsLFxuXFx0XFx0XFx0cm9sZXM6IFsuLi5uZXcgU2V0KFtBRE1JTl9ST0xFLCAuLi4ocHJpbmNpcGFsLnJvbGVzID8/IFtdKV0pXSxcblxcdFxcdH07XG5cXHR9XG5cXHRyZXR1cm4gcHJpbmNpcGFsO1xufVxuYDtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9ucyhcblx0d29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0Y2xpT3B0aW9uczogUGFydGlhbDxBdXRoT3B0aW9ucz4sXG4pOiBQcm9taXNlPFBhcnRpYWw8QXV0aE9wdGlvbnM+PiB7XG5cdGlmIChjbGlPcHRpb25zLmF1dGhQcm92aWRlciA9PT0gXCJhdXRoMFwiICYmICFjbGlPcHRpb25zLmlzc3VlckJhc2VVcmwpIHtcblx0XHRyZXR1cm4gZ2V0QXV0aDBPcHRpb25zKHdvcmtzcGFjZSwgY2xpT3B0aW9ucyk7XG5cdH1cblx0aWYgKGNsaU9wdGlvbnMuYXV0aFByb3ZpZGVyICE9IG51bGwpIHJldHVybiB7fTtcblxuXHRjb25zdCBjaG9pY2VzID0gW3sgbGFiZWw6IFwibm9uZVwiIGFzIGNvbnN0IH0sIHsgbGFiZWw6IFwiYXV0aDBcIiBhcyBjb25zdCB9XTtcblx0Y29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCBwaWNrKFwiXFxuICBBdXRoIHByb3ZpZGVyOiBcIiwgY2hvaWNlcywgKGMpID0+IGMubGFiZWwpO1xuXHRjb25zdCBwcm92aWRlciA9IHNlbGVjdGVkPy5sYWJlbCA/PyBcIm5vbmVcIjtcblxuXHRpZiAocHJvdmlkZXIgIT09IFwiYXV0aDBcIikgcmV0dXJuIHsgYXV0aFByb3ZpZGVyOiBcIm5vbmVcIiB9O1xuXG5cdHJldHVybiBnZXRBdXRoME9wdGlvbnMod29ya3NwYWNlLCBjbGlPcHRpb25zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aDBPcHRpb25zKFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRjbGlPcHRpb25zOiBQYXJ0aWFsPEF1dGhPcHRpb25zPixcbik6IFByb21pc2U8UGFydGlhbDxBdXRoT3B0aW9ucz4+IHtcblx0Y29uc3QgYWN0aXZlID0gZW5zdXJlTG9nZ2VkSW4oKTtcblx0Y29uc3QgaXNzdWVyQmFzZVVybCA9IGBodHRwczovLyR7YWN0aXZlLm5hbWV9YDtcblx0Y29uc29sZS5sb2coYFxcbiAg4pyTIEF1dGgwIHRlbmFudDogJHtpc3N1ZXJCYXNlVXJsfWApO1xuXG5cdHByb2Nlc3Muc3Rkb3V0LndyaXRlKFwiXFxuICBGZXRjaGluZyBBdXRoMCBBUElzLi4uXCIpO1xuXHRjb25zdCB1c2VyQXBpcyA9IGF1dGgwQ2xpLmxpc3RBcGlzKCkuZmlsdGVyKChhKSA9PiAhYS5uYW1lLmluY2x1ZGVzKFwiTWFuYWdlbWVudCBBUElcIikpO1xuXHRwcm9jZXNzLnN0ZG91dC53cml0ZShgIGZvdW5kICR7dXNlckFwaXMubGVuZ3RofS5cXG5gKTtcblxuXHR0eXBlIEFwaUNob2ljZSA9IHsgbGFiZWw6IHN0cmluZzsgZXhpc3Rpbmc6IHN0cmluZyB8IG51bGwgfTtcblx0Y29uc3QgcHJvamVjdE5hbWUgPSB3b3Jrc3BhY2UubmFtZTtcblx0Y29uc3QgYXBpQ2hvaWNlczogQXBpQ2hvaWNlW10gPSBbXG5cdFx0eyBsYWJlbDogYDxuZXc+IGh0dHBzOi8vYXBpLiR7cHJvamVjdE5hbWV9YCwgZXhpc3Rpbmc6IG51bGwgfSxcblx0XHQuLi51c2VyQXBpcy5tYXAoKGEpID0+ICh7IGxhYmVsOiBgJHthLm5hbWV9IOKAlCAke2EuaWRlbnRpZmllcn1gLCBleGlzdGluZzogYS5pZGVudGlmaWVyIH0pKSxcblx0XTtcblxuXHRjb25zdCBhcGlTZWxlY3RlZCA9IGF3YWl0IHBpY2soXCJcXG4gIFNlbGVjdCBBdXRoMCBBUEk6IFwiLCBhcGlDaG9pY2VzLCAoYykgPT4gYy5sYWJlbCk7XG5cblx0bGV0IGF1ZGllbmNlOiBzdHJpbmc7XG5cdGlmICghYXBpU2VsZWN0ZWQgfHwgYXBpU2VsZWN0ZWQuZXhpc3RpbmcgPT09IG51bGwpIHtcblx0XHRjb25zdCBkZWZhdWx0SWQgPSBgaHR0cHM6Ly9hcGkuJHtwcm9qZWN0TmFtZX1gO1xuXHRcdGF1ZGllbmNlID0gYXdhaXQgYXNrKGAgIEFQSSBJZGVudGlmaWVyIFske2RlZmF1bHRJZH1dOiBgLCBkZWZhdWx0SWQpO1xuXHRcdGNvbnNvbGUubG9nKFwiXFxuICBDcmVhdGluZyBBdXRoMCBBUEkuLi5cIik7XG5cdFx0YXVkaWVuY2UgPSBhdXRoMENsaS5jcmVhdGVBcGkoYCR7cHJvamVjdE5hbWV9IEFQSWAsIGF1ZGllbmNlKS5pZGVudGlmaWVyO1xuXHRcdGNvbnNvbGUubG9nKGAgIFxcdTI3MTMgQVBJIGNyZWF0ZWQ6ICR7YXVkaWVuY2V9YCk7XG5cdH0gZWxzZSB7XG5cdFx0YXVkaWVuY2UgPSBhcGlTZWxlY3RlZC5leGlzdGluZztcblx0XHRjb25zb2xlLmxvZyhgICBcXHUyNzEzIFNlbGVjdGVkOiAke2F1ZGllbmNlfWApO1xuXHRcdHRyeSB7XG5cdFx0XHRhdXRoMENsaS51cGRhdGVBcGlTY29wZXMoYXVkaWVuY2UpO1xuXHRcdFx0Y29uc29sZS5sb2coYCAgXFx1MjcxMyBBUEkgc2NvcGVzIGVuc3VyZWQgKCR7YXV0aDBDbGkuSEVMTE9fQVBJX1NDT1BFUy5qb2luKFwiLCBcIil9KWApO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFx0XCIgIOKclyBGYWlsZWQgdG8gdXBkYXRlIEFQSSBzY29wZXMg4oCUIGFkZCBIZWxsbyBzY29wZXMgaW4gdGhlIEF1dGgwIGRhc2hib2FyZC5cIixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgd2l0aExvY2FsVXNlcnMgPSBjbGlPcHRpb25zLmRhdGFiYXNlUHJvdmlkZXIgPT09IFwicG9zdGdyZXMvdHlwZW9ybVwiO1xuXHRsZXQgYWRtaW5Vc2VybmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRsZXQgYWRtaW5QYXNzd29yZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAod2l0aExvY2FsVXNlcnMpIHtcblx0XHRhZG1pblVzZXJuYW1lID1cblx0XHRcdGNsaU9wdGlvbnMuYWRtaW5Vc2VybmFtZSA/PyAoYXdhaXQgYXNrKFwiXFxuICBBZG1pbiB1c2VybmFtZSBbYWRtaW5dOiBcIiwgXCJhZG1pblwiKSk7XG5cdFx0YWRtaW5QYXNzd29yZCA9IGNsaU9wdGlvbnMuYWRtaW5QYXNzd29yZDtcblx0XHRpZiAoYWRtaW5QYXNzd29yZCA9PSBudWxsKSB7XG5cdFx0XHRhZG1pblBhc3N3b3JkID0gYXdhaXQgYXNrKFwiICBBZG1pbiBwYXNzd29yZCAobGVhdmUgYmxhbmsgdG8gZ2VuZXJhdGUpOiBcIik7XG5cdFx0XHRpZiAoIWFkbWluUGFzc3dvcmQpIHtcblx0XHRcdFx0YWRtaW5QYXNzd29yZCA9IGF1dGgwQ2xpLmdlbmVyYXRlQWRtaW5QYXNzd29yZCgpO1xuXHRcdFx0XHRjb25zb2xlLmxvZyhgICDinJMgR2VuZXJhdGVkIGFkbWluIHBhc3N3b3JkICh3cml0dGVuIHRvIC5lbnYpOiAke2FkbWluUGFzc3dvcmR9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRhdXRoUHJvdmlkZXI6IFwiYXV0aDBcIixcblx0XHRpc3N1ZXJCYXNlVXJsLFxuXHRcdGF1ZGllbmNlLFxuXHRcdC4uLih3aXRoTG9jYWxVc2VycyA/IHsgYWRtaW5Vc2VybmFtZSwgYWRtaW5QYXNzd29yZCB9IDoge30pLFxuXHR9O1xufVxuXG5mdW5jdGlvbiBhZG1pbkVtYWlsKHdvcmtzcGFjZU5hbWU6IHN0cmluZywgdXNlcm5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmICh1c2VybmFtZS5pbmNsdWRlcyhcIkBcIikpIHJldHVybiB1c2VybmFtZTtcblx0Y29uc3Qgc2x1ZyA9IHdvcmtzcGFjZU5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csIFwiLVwiKTtcblx0cmV0dXJuIGAke3VzZXJuYW1lfUAke3NsdWd9LmV4YW1wbGUuY29tYDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXV0aDBBZG1pblVzZXIoXG5cdHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdG9wdGlvbnM6IEF1dGhPcHRpb25zLFxuXHRhdXRoQ29uZmlnOiBBdXRoQ29uZmlnTW9kZWwsXG4pOiB2b2lkIHtcblx0Y29uc3QgdXNlcm5hbWUgPSBvcHRpb25zLmFkbWluVXNlcm5hbWUgPz8gXCJhZG1pblwiO1xuXHRjb25zdCBwYXNzd29yZCA9IG9wdGlvbnMuYWRtaW5QYXNzd29yZDtcblx0aWYgKCFwYXNzd29yZCkgcmV0dXJuO1xuXG5cdGNvbnN0IGVtYWlsID0gYWRtaW5FbWFpbCh3b3Jrc3BhY2UubmFtZSwgdXNlcm5hbWUpO1xuXHR0cnkge1xuXHRcdGNvbnN0IGFkbWluID0gYXV0aDBDbGkuY3JlYXRlQWRtaW5EYXRhYmFzZVVzZXIoeyBlbWFpbCwgcGFzc3dvcmQsIHVzZXJuYW1lIH0pO1xuXHRcdGF1dGhDb25maWcuc2V0QWRtaW5Vc2VyKHtcblx0XHRcdHN1YjogYWRtaW4udXNlcl9pZCxcblx0XHRcdGVtYWlsOiBhZG1pbi5lbWFpbCxcblx0XHRcdHBhc3N3b3JkOiBhZG1pbi5wYXNzd29yZCxcblx0XHRcdHVzZXJuYW1lOiBhZG1pbi51c2VybmFtZSxcblx0XHR9KTtcblx0XHR3b3Jrc3BhY2Vcblx0XHRcdC5nZXRNb2RlbDxFbnZGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLkVOVl9GSUxFKVxuXHRcdFx0Py5hZGRFbnRyeShcIkFVVEgwX0FETUlOX1VTRVJfU1VCXCIsIGFkbWluLnVzZXJfaWQpXG5cdFx0XHQuYWRkRW50cnkoXCJBVVRIMF9BRE1JTl9VU0VSX0VNQUlMXCIsIGFkbWluLmVtYWlsKVxuXHRcdFx0LmFkZEVudHJ5KFwiQVVUSDBfQURNSU5fVVNFUl9QQVNTV09SRFwiLCBhZG1pbi5wYXNzd29yZClcblx0XHRcdC5hZGRFbnRyeShcIkFVVEgwX0FETUlOX1VTRVJOQU1FXCIsIGFkbWluLnVzZXJuYW1lKTtcblx0XHRjb25zb2xlLmxvZyhgICDinJMgQXV0aDAgYWRtaW4gdXNlciByZWFkeTogJHthZG1pbi5lbWFpbH0gKHJvbGU6ICR7QURNSU5fUk9MRX0pYCk7XG5cdFx0Y29uc29sZS5sb2coYCAgICBMb2dpbiB3aXRoIEVNQUlMIChub3QgdXNlcm5hbWUpOiAke2FkbWluLmVtYWlsfWApO1xuXHRcdGNvbnNvbGUubG9nKGAgICAgUGFzc3dvcmQ6IHNlZSBBVVRIMF9BRE1JTl9VU0VSX1BBU1NXT1JEIGluIC5lbnZgKTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdGAgIOKclyBGYWlsZWQgdG8gZW5zdXJlIEF1dGgwIGFkbWluIHVzZXIgKCR7ZW1haWx9KTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyfWAsXG5cdFx0KTtcblx0fVxufVxuXG5mdW5jdGlvbiBzY2FmZm9sZExvY2FsVXNlclByb2ZpbGUod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCk6IHZvaWQge1xuXHRmb3IgKGNvbnN0IHByb2plY3Qgb2Ygd29ya3NwYWNlLmdldFByb2plY3RzKCkpIHtcblx0XHRwcm9qZWN0XG5cdFx0XHQuZ2V0TW9kZWw8TWFpblNvdXJjZUZpbGU+KFdFTExfS05PV05fRklMRVMuTUFJTl9UUylcblx0XHRcdD8uYWRkRW50aXR5KHsgY2xhc3NOYW1lOiBcIlVzZXJFbnRpdHlcIiwgaW1wb3J0UGF0aDogXCIuL2VudGl0aWVzL3VzZXIuZW50aXR5LmpzXCIgfSlcblx0XHRcdC5hZGRSZXBvc2l0b3J5KHtcblx0XHRcdFx0Y2xhc3NOYW1lOiBcIlVzZXJFbnRpdHlSZXBvc2l0b3J5XCIsXG5cdFx0XHRcdGltcG9ydFBhdGg6IFwiLi9yZXBvc2l0b3JpZXMvdXNlci5yZXBvc2l0b3J5LmpzXCIsXG5cdFx0XHR9KVxuXHRcdFx0LmFkZFNlcnZpY2Uoe1xuXHRcdFx0XHRjbGFzc05hbWU6IFwiVXNlclNlcnZpY2VcIixcblx0XHRcdFx0aW1wb3J0UGF0aDogXCIuL3NlcnZpY2VzL3VzZXIuc2VydmljZS5qc1wiLFxuXHRcdFx0XHRzY29wZTogXCJyZXF1ZXN0XCIsXG5cdFx0XHR9KVxuXHRcdFx0LmFkZEltcG9ydChcImRlZmluZUFiaWxpdGllc0ZvclwiLCBcIi4vYXV0aC9hYmlsaXR5LmZhY3RvcnkuanNcIilcblx0XHRcdC5hZGRJbXBvcnQoXCJtYXBQcmluY2lwYWxcIiwgXCIuL2F1dGgvYWJpbGl0eS5mYWN0b3J5LmpzXCIpXG5cdFx0XHQuc2V0VHlwZU9ybVNlZWQoXG5cdFx0XHRcdFtcblx0XHRcdFx0XHRcImNvbnN0IHN1YiA9IHByb2Nlc3MuZW52LkFVVEgwX0FETUlOX1VTRVJfU1VCO1wiLFxuXHRcdFx0XHRcdFwiaWYgKCFzdWIpIHJldHVybjtcIixcblx0XHRcdFx0XHRcImNvbnN0IHJlcG8gPSBkYXRhU291cmNlLmdldFJlcG9zaXRvcnkoVXNlckVudGl0eSk7XCIsXG5cdFx0XHRcdFx0XCJjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlcG8uZmluZE9uZSh7IHdoZXJlOiB7IHN1YiB9IH0pO1wiLFxuXHRcdFx0XHRcdFwiaWYgKGV4aXN0aW5nKSByZXR1cm47XCIsXG5cdFx0XHRcdFx0XCJhd2FpdCByZXBvLnNhdmUocmVwby5jcmVhdGUoe1wiLFxuXHRcdFx0XHRcdFwiICBzdWIsXCIsXG5cdFx0XHRcdFx0XCIgIGVtYWlsOiBwcm9jZXNzLmVudi5BVVRIMF9BRE1JTl9VU0VSX0VNQUlMID8/IG51bGwsXCIsXG5cdFx0XHRcdFx0JyAgZGlzcGxheU5hbWU6IHByb2Nlc3MuZW52LkFVVEgwX0FETUlOX1VTRVJOQU1FID8/IFwiYWRtaW5cIiwnLFxuXHRcdFx0XHRcdCcgIHJvbGVzOiBbXCJhZG1pblwiXSwnLFxuXHRcdFx0XHRcdFwifSkpO1wiLFxuXHRcdFx0XHRdLmpvaW4oXCIgXCIpLFxuXHRcdFx0KTtcblxuXHRcdHByb2plY3QuYWRkRmlsZSh7XG5cdFx0XHRmaWxlczogKCkgPT4gW1xuXHRcdFx0XHR7IGZpbGVQYXRoOiBcInNyYy9lbnRpdGllcy91c2VyLmVudGl0eS50c1wiLCBjb250ZW50OiBVU0VSX0VOVElUWV9UUyB9LFxuXHRcdFx0XHR7IGZpbGVQYXRoOiBcInNyYy9yZXBvc2l0b3JpZXMvdXNlci5yZXBvc2l0b3J5LnRzXCIsIGNvbnRlbnQ6IFVTRVJfUkVQT1NJVE9SWV9UUyB9LFxuXHRcdFx0XHR7IGZpbGVQYXRoOiBcInNyYy9zZXJ2aWNlcy91c2VyLnNlcnZpY2UudHNcIiwgY29udGVudDogVVNFUl9TRVJWSUNFX1RTIH0sXG5cdFx0XHRcdHsgZmlsZVBhdGg6IFwic3JjL2F1dGgvYWJpbGl0eS5mYWN0b3J5LnRzXCIsIGNvbnRlbnQ6IEFCSUxJVFlfRkFDVE9SWV9UUyB9LFxuXHRcdFx0XSxcblx0XHR9KTtcblx0fVxuXG5cdGZvciAoY29uc3QgY29udHJvbGxlciBvZiB3b3Jrc3BhY2UuZ2V0TW9kZWxzKENvbnRyb2xsZXJTb3VyY2VGaWxlKSkge1xuXHRcdGNvbnRyb2xsZXJcblx0XHRcdC5hZGRJbXBvcnQoXCJVc2VyU2VydmljZVwiLCBcIi4uL3NlcnZpY2VzL3VzZXIuc2VydmljZS5qc1wiKVxuXHRcdFx0LmFkZEltcG9ydChcImluamVjdFwiLCBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCIpXG5cdFx0XHQuYWRkQ29uc3RydWN0b3JQYXJhbSgnQGluamVjdChcIlVzZXJTZXJ2aWNlXCIpIHByaXZhdGUgcmVhZG9ubHkgdXNlcnM6IFVzZXJTZXJ2aWNlJyk7XG5cdFx0Y29udHJvbGxlci5nZXRNZXRob2QoXCJnZXRPbmVcIikuc2V0QXN5bmModHJ1ZSkuc2V0Qm9keShbXG5cdFx0XHRcImNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLnVzZXJzLmVuc3VyZUZyb21QcmluY2lwYWwodGhpcy5wcmluY2lwYWxQcm92aWRlci5jdXJyZW50UHJpbmNpcGFsKTtcIixcblx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IHRlbXBsYXRlIGxpdGVyYWwgaW4gZ2VuZXJhdGVkIGNvZGVcblx0XHRcdFwicmV0dXJuIHsgaWQsIG1lc3NhZ2U6IGBIZWxsbyAke3VzZXIuZGlzcGxheU5hbWV9IWAsIHVzZXJuYW1lOiB1c2VyLmRpc3BsYXlOYW1lIH07XCIsXG5cdFx0XSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gc2NhZmZvbGQod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCwgb3B0aW9uczogQXV0aE9wdGlvbnMpOiB2b2lkIHtcblx0aWYgKG9wdGlvbnMuYXV0aFByb3ZpZGVyICE9PSBcImF1dGgwXCIpIHJldHVybjtcblxuXHRjb25zdCByZXNvdXJjZSA9IFwiSGVsbG9cIjtcblx0Y29uc3Qgd2l0aExvY2FsVXNlcnMgPSBvcHRpb25zLmRhdGFiYXNlUHJvdmlkZXIgPT09IFwicG9zdGdyZXMvdHlwZW9ybVwiO1xuXG5cdGZvciAoY29uc3QgY29udHJvbGxlciBvZiB3b3Jrc3BhY2UuZ2V0TW9kZWxzKENvbnRyb2xsZXJTb3VyY2VGaWxlKSkge1xuXHRcdGNvbnRyb2xsZXJcblx0XHRcdC5hZGREZWNvcmF0b3IoYEBBdXRob3JpemUoXCJyZWFkXCIsIFwiJHtyZXNvdXJjZX1cIilgKVxuXHRcdFx0LmFkZENvcnRleEltcG9ydChcIkFsbG93QW5vbnltb3VzXCIpXG5cdFx0XHQuYWRkQ29ydGV4SW1wb3J0KFwiQXV0aG9yaXplXCIpXG5cdFx0XHQuYWRkQ29ydGV4SW1wb3J0KFwiSVByaW5jaXBhbFByb3ZpZGVyVG9rZW5cIilcblx0XHRcdC5hZGRDb3J0ZXhJbXBvcnQoXCJJUHJpbmNpcGFsUHJvdmlkZXJcIiwgdHJ1ZSlcblx0XHRcdC5hZGRJbXBvcnQoXCJpbmplY3RcIiwgXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiKVxuXHRcdFx0LmFkZENvbnN0cnVjdG9yUGFyYW0oXG5cdFx0XHRcdGBAaW5qZWN0KElQcmluY2lwYWxQcm92aWRlclRva2VuKSBwcml2YXRlIHJlYWRvbmx5IHByaW5jaXBhbFByb3ZpZGVyOiBJUHJpbmNpcGFsUHJvdmlkZXJgLFxuXHRcdFx0KTtcblx0XHRjb250cm9sbGVyLmdldE1ldGhvZChcImdldEFsbFwiKS5hZGREZWNvcmF0b3IoXCJAQWxsb3dBbm9ueW1vdXMoKVwiKTtcblx0XHRpZiAoIXdpdGhMb2NhbFVzZXJzKSB7XG5cdFx0XHRjb250cm9sbGVyLmdldE1ldGhvZChcImdldE9uZVwiKS5zZXRCb2R5KFtcblx0XHRcdFx0XCJjb25zdCBwcmluY2lwYWwgPSB0aGlzLnByaW5jaXBhbFByb3ZpZGVyLmN1cnJlbnRQcmluY2lwYWw7XCIsXG5cdFx0XHRcdFwiY29uc3QgdXNlcm5hbWUgPVwiLFxuXHRcdFx0XHQnXFx0KHR5cGVvZiBwcmluY2lwYWw/Lm5hbWUgPT09IFwic3RyaW5nXCIgJiYgcHJpbmNpcGFsLm5hbWUpIHx8Jyxcblx0XHRcdFx0J1xcdCh0eXBlb2YgcHJpbmNpcGFsPy5uaWNrbmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwcmluY2lwYWwubmlja25hbWUpIHx8Jyxcblx0XHRcdFx0J1xcdCh0eXBlb2YgcHJpbmNpcGFsPy5lbWFpbCA9PT0gXCJzdHJpbmdcIiAmJiBwcmluY2lwYWwuZW1haWwpIHx8Jyxcblx0XHRcdFx0J1xcdCh0eXBlb2YgcHJpbmNpcGFsPy5wcmVmZXJyZWRfdXNlcm5hbWUgPT09IFwic3RyaW5nXCIgJiYgcHJpbmNpcGFsLnByZWZlcnJlZF91c2VybmFtZSkgfHwnLFxuXHRcdFx0XHRcIlxcdHByaW5jaXBhbD8uc3ViIHx8XCIsXG5cdFx0XHRcdCdcXHRcInVua25vd25cIjsnLFxuXHRcdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vVGVtcGxhdGVDdXJseUluU3RyaW5nOiB0ZW1wbGF0ZSBsaXRlcmFsIGluIGdlbmVyYXRlZCBjb2RlXG5cdFx0XHRcdFwicmV0dXJuIHsgaWQsIG1lc3NhZ2U6IGBIZWxsbyAke3VzZXJuYW1lfSFgLCB1c2VybmFtZSB9O1wiLFxuXHRcdFx0XSk7XG5cdFx0fVxuXHRcdGNvbnRyb2xsZXIuZ2V0TWV0aG9kKFwiY3JlYXRlXCIpLmFkZERlY29yYXRvcihgQEF1dGhvcml6ZShcImNyZWF0ZVwiLCBcIiR7cmVzb3VyY2V9XCIpYCk7XG5cdFx0Y29udHJvbGxlci5nZXRNZXRob2QoXCJ1cGRhdGVcIikuYWRkRGVjb3JhdG9yKGBAQXV0aG9yaXplKFwidXBkYXRlXCIsIFwiJHtyZXNvdXJjZX1cIilgKTtcblx0XHRjb250cm9sbGVyLmdldE1ldGhvZChcInJlbW92ZVwiKS5hZGREZWNvcmF0b3IoYEBBdXRob3JpemUoXCJkZWxldGVcIiwgXCIke3Jlc291cmNlfVwiKWApO1xuXHR9XG5cblx0Zm9yIChjb25zdCBwcm9qZWN0IG9mIHdvcmtzcGFjZS5nZXRQcm9qZWN0cygpKSB7XG5cdFx0cHJvamVjdFxuXHRcdFx0LmdldE1vZGVsPE1haW5Tb3VyY2VGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLk1BSU5fVFMpXG5cdFx0XHQ/LmFkZFNpZGVFZmZlY3RJbXBvcnQoXCJAZGVjb2hlcmUvY29ydGV4L2F1dGhcIik7XG5cdH1cblxuXHRpZiAod2l0aExvY2FsVXNlcnMpIHtcblx0XHRzY2FmZm9sZExvY2FsVXNlclByb2ZpbGUod29ya3NwYWNlKTtcblx0XHRmb3IgKGNvbnN0IHByb2plY3Qgb2Ygd29ya3NwYWNlLmdldFByb2plY3RzKCkpIHtcblx0XHRcdHByb2plY3Rcblx0XHRcdFx0LmdldE1vZGVsPE1haW5Tb3VyY2VGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLk1BSU5fVFMpXG5cdFx0XHRcdD8uYWRkQnVpbGRlckNhbGwoXCIud2l0aEF1dGgoZGVmaW5lQWJpbGl0aWVzRm9yLCB7IHByaW5jaXBhbE1hcHBlcjogbWFwUHJpbmNpcGFsIH0pXCIpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmb3IgKGNvbnN0IHByb2plY3Qgb2Ygd29ya3NwYWNlLmdldFByb2plY3RzKCkpIHtcblx0XHRcdHByb2plY3Rcblx0XHRcdFx0LmdldE1vZGVsPE1haW5Tb3VyY2VGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLk1BSU5fVFMpXG5cdFx0XHRcdD8uYWRkQnVpbGRlckNhbGwoXCIud2l0aEF1dGgoKVwiKTtcblx0XHR9XG5cdH1cblxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vVGVtcGxhdGVDdXJseUluU3RyaW5nOiBpbnRlbnRpb25hbCBZQU1MIGVudi12YXIgcGxhY2Vob2xkZXJzXG5cdGNvbnN0IGlzc3VlclBsYWNlaG9sZGVyID0gXCIke0FVVEgwX0lTU1VFUl9CQVNFX1VSTH1cIjtcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogaW50ZW50aW9uYWwgWUFNTCBlbnYtdmFyIHBsYWNlaG9sZGVyc1xuXHRjb25zdCBhdWRQbGFjZWhvbGRlciA9IFwiJHtBVVRIMF9BVURJRU5DRX1cIjtcblxuXHRjb25zdCBjb25maWdTZWN0aW9uID0gYGF1dGg6XFxuICBkaXNjb3ZlcnlVcmw6ICR7aXNzdWVyUGxhY2Vob2xkZXJ9XFxuICBhdWRpZW5jZTogJHthdWRQbGFjZWhvbGRlcn1cXG5gO1xuXG5cdHdvcmtzcGFjZS5nZXRNb2RlbDxDb25maWdZYW1sPihXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ZQU1MKT8uYWRkU2VjdGlvbihjb25maWdTZWN0aW9uKTtcblxuXHR3b3Jrc3BhY2Vcblx0XHQuZ2V0TW9kZWw8RW52RmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5FTlZfRklMRSlcblx0XHQ/LmFkZEVudHJ5KFwiQVVUSDBfSVNTVUVSX0JBU0VfVVJMXCIsIG9wdGlvbnMuaXNzdWVyQmFzZVVybCA/PyBcIlwiKVxuXHRcdC5hZGRFbnRyeShcIkFVVEgwX0FVRElFTkNFXCIsIG9wdGlvbnMuYXVkaWVuY2UgPz8gXCJcIik7XG5cblx0Y29uc3QgYXV0aENvbmZpZyA9IG5ldyBBdXRoQ29uZmlnTW9kZWwoe1xuXHRcdGlzc3VlckJhc2VVcmw6IG9wdGlvbnMuaXNzdWVyQmFzZVVybCA/PyBcIlwiLFxuXHRcdGF1ZGllbmNlOiBvcHRpb25zLmF1ZGllbmNlID8/IFwiXCIsXG5cdH0pO1xuXHR3b3Jrc3BhY2UuYWRkTW9kZWwoYXV0aENvbmZpZyk7XG5cblx0aWYgKHdpdGhMb2NhbFVzZXJzICYmIG9wdGlvbnMuYWRtaW5QYXNzd29yZCkge1xuXHRcdGNyZWF0ZUF1dGgwQWRtaW5Vc2VyKHdvcmtzcGFjZSwgb3B0aW9ucywgYXV0aENvbmZpZyk7XG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IEF1dGhGZWF0dXJlOiBGZWF0dXJlPEF1dGhPcHRpb25zPiA9IHsgZ2V0T3B0aW9ucywgc2NhZmZvbGQgfTtcbiJdLCJuYW1lcyI6WyJhc2siLCJwaWNrIiwiV0VMTF9LTk9XTl9GSUxFUyIsImVuc3VyZUxvZ2dlZEluIiwiQXV0aENvbmZpZ01vZGVsIiwiQ29udHJvbGxlclNvdXJjZUZpbGUiLCJhdXRoMENsaSIsIkFETUlOX1JPTEUiLCJVU0VSX0VOVElUWV9UUyIsIlVTRVJfUkVQT1NJVE9SWV9UUyIsIlVTRVJfU0VSVklDRV9UUyIsIkFCSUxJVFlfRkFDVE9SWV9UUyIsImdldE9wdGlvbnMiLCJ3b3Jrc3BhY2UiLCJjbGlPcHRpb25zIiwiYXV0aFByb3ZpZGVyIiwiaXNzdWVyQmFzZVVybCIsImdldEF1dGgwT3B0aW9ucyIsImNob2ljZXMiLCJsYWJlbCIsInNlbGVjdGVkIiwiYyIsInByb3ZpZGVyIiwiYWN0aXZlIiwibmFtZSIsImNvbnNvbGUiLCJsb2ciLCJwcm9jZXNzIiwic3Rkb3V0Iiwid3JpdGUiLCJ1c2VyQXBpcyIsImxpc3RBcGlzIiwiZmlsdGVyIiwiYSIsImluY2x1ZGVzIiwibGVuZ3RoIiwicHJvamVjdE5hbWUiLCJhcGlDaG9pY2VzIiwiZXhpc3RpbmciLCJtYXAiLCJpZGVudGlmaWVyIiwiYXBpU2VsZWN0ZWQiLCJhdWRpZW5jZSIsImRlZmF1bHRJZCIsImNyZWF0ZUFwaSIsInVwZGF0ZUFwaVNjb3BlcyIsIkhFTExPX0FQSV9TQ09QRVMiLCJqb2luIiwiZXJyb3IiLCJ3aXRoTG9jYWxVc2VycyIsImRhdGFiYXNlUHJvdmlkZXIiLCJhZG1pblVzZXJuYW1lIiwiYWRtaW5QYXNzd29yZCIsImdlbmVyYXRlQWRtaW5QYXNzd29yZCIsImFkbWluRW1haWwiLCJ3b3Jrc3BhY2VOYW1lIiwidXNlcm5hbWUiLCJzbHVnIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwiY3JlYXRlQXV0aDBBZG1pblVzZXIiLCJvcHRpb25zIiwiYXV0aENvbmZpZyIsInBhc3N3b3JkIiwiZW1haWwiLCJhZG1pbiIsImNyZWF0ZUFkbWluRGF0YWJhc2VVc2VyIiwic2V0QWRtaW5Vc2VyIiwic3ViIiwidXNlcl9pZCIsImdldE1vZGVsIiwiRU5WX0ZJTEUiLCJhZGRFbnRyeSIsImVyciIsIkVycm9yIiwibWVzc2FnZSIsInNjYWZmb2xkTG9jYWxVc2VyUHJvZmlsZSIsInByb2plY3QiLCJnZXRQcm9qZWN0cyIsIk1BSU5fVFMiLCJhZGRFbnRpdHkiLCJjbGFzc05hbWUiLCJpbXBvcnRQYXRoIiwiYWRkUmVwb3NpdG9yeSIsImFkZFNlcnZpY2UiLCJzY29wZSIsImFkZEltcG9ydCIsInNldFR5cGVPcm1TZWVkIiwiYWRkRmlsZSIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiY29udHJvbGxlciIsImdldE1vZGVscyIsImFkZENvbnN0cnVjdG9yUGFyYW0iLCJnZXRNZXRob2QiLCJzZXRBc3luYyIsInNldEJvZHkiLCJzY2FmZm9sZCIsInJlc291cmNlIiwiYWRkRGVjb3JhdG9yIiwiYWRkQ29ydGV4SW1wb3J0IiwiYWRkU2lkZUVmZmVjdEltcG9ydCIsImFkZEJ1aWxkZXJDYWxsIiwiaXNzdWVyUGxhY2Vob2xkZXIiLCJhdWRQbGFjZWhvbGRlciIsImNvbmZpZ1NlY3Rpb24iLCJDT05GSUdfWUFNTCIsImFkZFNlY3Rpb24iLCJhZGRNb2RlbCIsIkF1dGhGZWF0dXJlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxHQUFHLEVBQUVDLElBQUksUUFBUSx5QkFBeUI7QUFFbkQsU0FBU0MsZ0JBQWdCLFFBQVEsd0JBQXdCO0FBSXpELFNBQVNDLGNBQWMsUUFBUSx1QkFBdUI7QUFDdEQsU0FBU0MsZUFBZSxRQUFRLGlDQUFpQztBQUNqRSxTQUFTQyxvQkFBb0IsUUFBUSw0Q0FBNEM7QUFFakYsWUFBWUMsY0FBYyxpQkFBaUI7QUFXM0MsTUFBTUMsYUFBYTtBQUVuQixNQUFNQyxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJ4QixDQUFDO0FBRUQsTUFBTUMscUJBQXFCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQWU1QixDQUFDO0FBRUQsTUFBTUMsa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1RHpCLENBQUM7QUFFRCxNQUFNQyxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0M1QixDQUFDO0FBRUQsZUFBZUMsV0FDZEMsU0FBNEIsRUFDNUJDLFVBQWdDO0lBRWhDLElBQUlBLFdBQVdDLFlBQVksS0FBSyxXQUFXLENBQUNELFdBQVdFLGFBQWEsRUFBRTtRQUNyRSxPQUFPQyxnQkFBZ0JKLFdBQVdDO0lBQ25DO0lBQ0EsSUFBSUEsV0FBV0MsWUFBWSxJQUFJLE1BQU0sT0FBTyxDQUFDO0lBRTdDLE1BQU1HLFVBQVU7UUFBQztZQUFFQyxPQUFPO1FBQWdCO1FBQUc7WUFBRUEsT0FBTztRQUFpQjtLQUFFO0lBQ3pFLE1BQU1DLFdBQVcsTUFBTW5CLEtBQUssdUJBQXVCaUIsU0FBUyxDQUFDRyxJQUFNQSxFQUFFRixL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
|
|
@@ -88,11 +88,12 @@ export function listTenants() {
|
|
|
88
88
|
return [];
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
-
export function login() {
|
|
91
|
+
/** Device/URL login (`--no-input`) so Docker can print a host-browser URL. */ export function login() {
|
|
92
92
|
const result = spawnSync("auth0", [
|
|
93
93
|
"login",
|
|
94
94
|
"--scopes",
|
|
95
|
-
REQUIRED_SCOPES
|
|
95
|
+
REQUIRED_SCOPES,
|
|
96
|
+
"--no-input"
|
|
96
97
|
], {
|
|
97
98
|
stdio: "inherit"
|
|
98
99
|
});
|
|
@@ -132,6 +133,38 @@ export function createApi(name, identifier, scopes = HELLO_API_SCOPES) {
|
|
|
132
133
|
]);
|
|
133
134
|
return parseJsonOutput(out);
|
|
134
135
|
}
|
|
136
|
+
export function listApiScopes(identifier) {
|
|
137
|
+
try {
|
|
138
|
+
const out = runAuth0([
|
|
139
|
+
"apis",
|
|
140
|
+
"show",
|
|
141
|
+
identifier,
|
|
142
|
+
"--json",
|
|
143
|
+
"--no-input"
|
|
144
|
+
]);
|
|
145
|
+
const api = parseJsonOutput(out);
|
|
146
|
+
return (api.scopes ?? []).map((scope)=>typeof scope === "string" ? scope : scope.value ?? scope.name ?? "").filter((scope)=>scope.length > 0);
|
|
147
|
+
} catch (err) {
|
|
148
|
+
if (err instanceof Auth0AuthError) throw err;
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/** Assign API permissions to a user (Authorization Core). Idempotent when already granted. */ export function assignUserPermissions(userId, audience, permissions) {
|
|
153
|
+
if (permissions.length === 0) return;
|
|
154
|
+
runAuth0([
|
|
155
|
+
"api",
|
|
156
|
+
"post",
|
|
157
|
+
`users/${encodeURIComponent(userId)}/permissions`,
|
|
158
|
+
"--data",
|
|
159
|
+
JSON.stringify({
|
|
160
|
+
permissions: permissions.map((permission_name)=>({
|
|
161
|
+
resource_server_identifier: audience,
|
|
162
|
+
permission_name
|
|
163
|
+
}))
|
|
164
|
+
}),
|
|
165
|
+
"--no-input"
|
|
166
|
+
]);
|
|
167
|
+
}
|
|
135
168
|
/**
|
|
136
169
|
* Replace an API's scopes and enable RBAC policy enforcement.
|
|
137
170
|
* Auth0 CLI `--scopes` replaces the full set.
|
|
@@ -372,4 +405,4 @@ function isUserAlreadyExistsError(err) {
|
|
|
372
405
|
}
|
|
373
406
|
export { REQUIRED_SCOPES };
|
|
374
407
|
|
|
375
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy93ZWJhcGkvZmVhdHVyZXMvYXV0aDAtY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlU3luYywgc3Bhd25TeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuLyoqIE1hbmFnZW1lbnQgQVBJIHNjb3BlcyBuZWVkZWQgZm9yIEFQSSwgU1BBLCBjb25uZWN0aW9ucywgYW5kIGFkbWluIHVzZXJzLiAqL1xuY29uc3QgUkVRVUlSRURfU0NPUEVTID0gW1xuXHRcImNyZWF0ZTpjbGllbnRzXCIsXG5cdFwicmVhZDpjbGllbnRzXCIsXG5cdFwidXBkYXRlOmNsaWVudHNcIixcblx0XCJjcmVhdGU6cmVzb3VyY2Vfc2VydmVyc1wiLFxuXHRcInJlYWQ6cmVzb3VyY2Vfc2VydmVyc1wiLFxuXHRcInVwZGF0ZTpyZXNvdXJjZV9zZXJ2ZXJzXCIsXG5cdFwicmVhZDpjb25uZWN0aW9uc1wiLFxuXHRcInVwZGF0ZTpjb25uZWN0aW9uc1wiLFxuXHRcImNyZWF0ZTp1c2Vyc1wiLFxuXHRcInJlYWQ6dXNlcnNcIixcblx0XCJ1cGRhdGU6dXNlcnNcIixcbl0uam9pbihcIixcIik7XG5cbi8qKiBIYXJkIHRpbWVvdXQgZm9yIGFueSBNYW5hZ2VtZW50IEFQSSBjYWxsLiBQcmV2ZW50cyBpbmRlZmluaXRlIGhhbmdzIG9uIHRva2VuIHJlLWF1dGguICovXG5jb25zdCBBUElfVElNRU9VVF9NUyA9IDhfMDAwO1xuXG4vKiogRGVmYXVsdCBBUEkgc2NvcGVzIG1hdGNoaW5nIEhlbGxvIENBU0wgQXV0aG9yaXplIGRlY29yYXRvcnMuICovXG5leHBvcnQgY29uc3QgSEVMTE9fQVBJX1NDT1BFUyA9IFtcblx0XCJyZWFkOkhlbGxvXCIsXG5cdFwiY3JlYXRlOkhlbGxvXCIsXG5cdFwidXBkYXRlOkhlbGxvXCIsXG5cdFwiZGVsZXRlOkhlbGxvXCIsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgREJfQ09OTkVDVElPTl9OQU1FID0gXCJVc2VybmFtZS1QYXNzd29yZC1BdXRoZW50aWNhdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgQXV0aDBBdXRoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHR0aGlzLm5hbWUgPSBcIkF1dGgwQXV0aEVycm9yXCI7XG5cdH1cbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvciBzdGRlcnIgb3V0cHV0IGxvb2tzIGxpa2UgYW4gZXhwaXJlZC9taXNzaW5nIHRva2VuLiAqL1xuZnVuY3Rpb24gaXNBdXRoRXJyb3IodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0dGV4dC5pbmNsdWRlcyhcInJlbmV3IGFjY2VzcyB0b2tlblwiKSB8fFxuXHRcdHRleHQuaW5jbHVkZXMoXCJsb2cgaW5cIikgfHxcblx0XHR0ZXh0LmluY2x1ZGVzKFwiVW5hdXRob3JpemVkXCIpXG5cdCk7XG59XG5cbi8qKiBTdHJpcCBBdXRoMCBDTEkgYmFubmVyIGxpbmVzIGJlZm9yZSBKU09OLiAqL1xuZnVuY3Rpb24gcGFyc2VKc29uT3V0cHV0PFQ+KHN0ZG91dDogc3RyaW5nKTogVCB7XG5cdGNvbnN0IHN0YXJ0ID0gc3Rkb3V0LmluZGV4T2YoXCJ7XCIpO1xuXHRjb25zdCBhcnJheVN0YXJ0ID0gc3Rkb3V0LmluZGV4T2YoXCJbXCIpO1xuXHRsZXQgaWR4ID0gLTE7XG5cdGlmIChzdGFydCA9PT0gLTEpIGlkeCA9IGFycmF5U3RhcnQ7XG5cdGVsc2UgaWYgKGFycmF5U3RhcnQgPT09IC0xKSBpZHggPSBzdGFydDtcblx0ZWxzZSBpZHggPSBNYXRoLm1pbihzdGFydCwgYXJyYXlTdGFydCk7XG5cdGlmIChpZHggPCAwKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIEpTT04gZnJvbSBhdXRoMCBDTEksIGdvdDogJHtzdGRvdXQuc2xpY2UoMCwgMjAwKX1gKTtcblx0cmV0dXJuIEpTT04ucGFyc2Uoc3Rkb3V0LnNsaWNlKGlkeCkpIGFzIFQ7XG59XG5cbi8qKiBSdW4gYW4gYXV0aDAgQ0xJIGNvbW1hbmQgd2l0aCBhIGhhcmQgdGltZW91dC4gUmV0dXJucyBzdGRvdXQgb24gc3VjY2VzcywgdGhyb3dzIG9uIGZhaWx1cmUuICovXG5mdW5jdGlvbiBydW5BdXRoMChhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhcImF1dGgwXCIsIGFyZ3MsIHtcblx0XHRlbmNvZGluZzogXCJ1dGY4XCIsXG5cdFx0dGltZW91dDogQVBJX1RJTUVPVVRfTVMsXG5cdFx0aW5wdXQ6IFwiXCIsXG5cdFx0c3RkaW86IFwicGlwZVwiLFxuXHR9KTtcblxuXHRpZiAocmVzdWx0LmVycm9yKSB7XG5cdFx0Y29uc3QgbXNnID0gcmVzdWx0LmVycm9yLm1lc3NhZ2U7XG5cdFx0aWYgKGlzQXV0aEVycm9yKG1zZykgfHwgKHJlc3VsdC5lcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09IFwiRVRJTUVET1VUXCIpIHtcblx0XHRcdHRocm93IG5ldyBBdXRoMEF1dGhFcnJvcihtc2cpO1xuXHRcdH1cblx0XHR0aHJvdyByZXN1bHQuZXJyb3I7XG5cdH1cblxuXHRpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuXHRcdGNvbnN0IHN0ZGVyciA9IHJlc3VsdC5zdGRlcnIgPz8gXCJcIjtcblx0XHRpZiAoaXNBdXRoRXJyb3Ioc3RkZXJyKSkgdGhyb3cgbmV3IEF1dGgwQXV0aEVycm9yKHN0ZGVycik7XG5cdFx0dGhyb3cgbmV3IEVycm9yKHN0ZGVyciB8fCBgYXV0aDAgZXhpdGVkIHdpdGggY29kZSAke3Jlc3VsdC5zdGF0dXN9YCk7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0LnN0ZG91dDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRoMFRlbmFudCB7XG5cdG5hbWU6IHN0cmluZztcblx0YWN0aXZlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5zdGFsbGVkKCk6IGJvb2xlYW4ge1xuXHR0cnkge1xuXHRcdGV4ZWNGaWxlU3luYyhcImF1dGgwXCIsIFtcIi0tdmVyc2lvblwiXSwgeyBzdGRpbzogXCJwaXBlXCIgfSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFRlbmFudHMoKTogQXV0aDBUZW5hbnRbXSB7XG5cdHRyeSB7XG5cdFx0Y29uc3Qgb3V0ID0gZXhlY0ZpbGVTeW5jKFwiYXV0aDBcIiwgW1widGVuYW50c1wiLCBcImxpc3RcIiwgXCItLWpzb25cIl0sIHtcblx0XHRcdGVuY29kaW5nOiBcInV0ZjhcIixcblx0XHRcdHN0ZGlvOiBcInBpcGVcIixcblx0XHR9KTtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZShvdXQpIGFzIEF1dGgwVGVuYW50W107XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybiBbXTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9naW4oKTogYm9vbGVhbiB7XG5cdGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhcImF1dGgwXCIsIFtcImxvZ2luXCIsIFwiLS1zY29wZXNcIiwgUkVRVUlSRURfU0NPUEVTXSwge1xuXHRcdHN0ZGlvOiBcImluaGVyaXRcIixcblx0fSk7XG5cdHJldHVybiByZXN1bHQuc3RhdHVzID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdEFwaXMoKTogQXJyYXk8eyBpZGVudGlmaWVyOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PiB7XG5cdHRyeSB7XG5cdFx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1wiYXBpc1wiLCBcImxpc3RcIiwgXCItLWpzb25cIiwgXCItLW5vLWlucHV0XCJdKTtcblx0XHRyZXR1cm4gcGFyc2VKc29uT3V0cHV0KG91dCk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGlmIChlcnIgaW5zdGFuY2VvZiBBdXRoMEF1dGhFcnJvcikgdGhyb3cgZXJyO1xuXHRcdHJldHVybiBbXTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBpKFxuXHRuYW1lOiBzdHJpbmcsXG5cdGlkZW50aWZpZXI6IHN0cmluZyxcblx0c2NvcGVzOiByZWFkb25seSBzdHJpbmdbXSA9IEhFTExPX0FQSV9TQ09QRVMsXG4pOiB7IGlkZW50aWZpZXI6IHN0cmluZyB9IHtcblx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1xuXHRcdFwiYXBpc1wiLFxuXHRcdFwiY3JlYXRlXCIsXG5cdFx0XCItLW5hbWVcIixcblx0XHRuYW1lLFxuXHRcdFwiLS1pZGVudGlmaWVyXCIsXG5cdFx0aWRlbnRpZmllcixcblx0XHRcIi0tc2NvcGVzXCIsXG5cdFx0c2NvcGVzLmpvaW4oXCIsXCIpLFxuXHRcdC8vIFJCQUM6IG9ubHkgcGVybWlzc2lvbnMgYXNzaWduZWQgdG8gdGhlIHVzZXIvcm9sZSBhcHBlYXIgb24gdGhlIHRva2VuLlxuXHRcdFwiLS1lbmZvcmNlLXBvbGljaWVzXCIsXG5cdFx0Ly8gSW5jbHVkZSBBdXRoMCBgcGVybWlzc2lvbnNbXWAgY2xhaW0gKGNvbnN1bWVkIGJ5IHNhbXBsZSBwcmluY2lwYWxNYXBwZXIpLlxuXHRcdFwiLS10b2tlbi1kaWFsZWN0XCIsXG5cdFx0XCJhY2Nlc3NfdG9rZW5fYXV0aHpcIixcblx0XHRcIi0tanNvblwiLFxuXHRcdFwiLS1uby1pbnB1dFwiLFxuXHRdKTtcblx0cmV0dXJuIHBhcnNlSnNvbk91dHB1dChvdXQpO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgYW4gQVBJJ3Mgc2NvcGVzIGFuZCBlbmFibGUgUkJBQyBwb2xpY3kgZW5mb3JjZW1lbnQuXG4gKiBBdXRoMCBDTEkgYC0tc2NvcGVzYCByZXBsYWNlcyB0aGUgZnVsbCBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBcGlTY29wZXMoXG5cdGlkZW50aWZpZXI6IHN0cmluZyxcblx0c2NvcGVzOiByZWFkb25seSBzdHJpbmdbXSA9IEhFTExPX0FQSV9TQ09QRVMsXG4pOiB2b2lkIHtcblx0cnVuQXV0aDAoW1xuXHRcdFwiYXBpc1wiLFxuXHRcdFwidXBkYXRlXCIsXG5cdFx0aWRlbnRpZmllcixcblx0XHRcIi0tc2NvcGVzXCIsXG5cdFx0c2NvcGVzLmpvaW4oXCIsXCIpLFxuXHRcdFwiLS1lbmZvcmNlLXBvbGljaWVzXCIsXG5cdFx0XCItLXRva2VuLWRpYWxlY3RcIixcblx0XHRcImFjY2Vzc190b2tlbl9hdXRoelwiLFxuXHRcdFwiLS1uby1pbnB1dFwiLFxuXHRdKTtcbn1cblxuLyoqIFRydWUgd2hlbiBBdXRoMCByZWZ1c2VzIGNyZWF0ZSBiZWNhdXNlIHRoZSB0ZW5hbnQgaGl0IGl0cyBBcHBsaWNhdGlvbnMgcXVvdGEuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoMEVudGl0eUxpbWl0RXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG5cdGNvbnN0IHRleHQgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG5cdHJldHVybiAvbGltaXQgb2YgZW50aXRpZXN8cmVhY2hlZCB0aGUgbGltaXR8dGVuYW50IGFwcGxpY2F0aW9uIGxpbWl0IHJlYWNoZWQvaS50ZXN0KHRleHQpO1xufVxuXG4vKipcbiAqIEFjdGlvbmFibGUgbWVzc2FnZSB3aGVuIEF1dGgwIHdpbGwgbm90IGNyZWF0ZSBhbm90aGVyIGFwcGxpY2F0aW9uLlxuICogRG9lcyBub3Qgc3VnZ2VzdCByZXVzaW5nIHVucmVsYXRlZCBhcHBzIOKAlCBmcmVlIHRlbmFudHMgbXVzdCBkZWxldGUgdW51c2VkIG9uZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTcGFFbnRpdHlMaW1pdEVycm9yKGFwcE5hbWU6IHN0cmluZywgYXBwczogQXV0aDBBcHBbXSk6IHN0cmluZyB7XG5cdGNvbnN0IGxpc3RlZCA9XG5cdFx0YXBwcy5sZW5ndGggPT09IDBcblx0XHRcdD8gXCJDb3VsZCBub3QgbGlzdCBleGlzdGluZyBhcHBsaWNhdGlvbnMuXCJcblx0XHRcdDogYFRoaXMgdGVuYW50IGFscmVhZHkgaGFzICR7YXBwcy5sZW5ndGh9IGFwcGxpY2F0aW9uKHMpOlxcbiR7YXBwc1xuXHRcdFx0XHRcdC5tYXAoKGEpID0+IGAgIC0gJHthLm5hbWV9ICgke2EuY2xpZW50X2lkfSlgKVxuXHRcdFx0XHRcdC5qb2luKFwiXFxuXCIpfWA7XG5cblx0cmV0dXJuIFtcblx0XHRgQXV0aDAgcmVmdXNlZCB0byBjcmVhdGUgU1BBIFwiJHthcHBOYW1lfVwiOiB0ZW5hbnQgYXBwbGljYXRpb24gbGltaXQgcmVhY2hlZC5gLFxuXHRcdGxpc3RlZCxcblx0XHRcIlwiLFxuXHRcdFwiRml4OiBBdXRoMCBEYXNoYm9hcmQg4oaSIEFwcGxpY2F0aW9ucyDihpIgQXBwbGljYXRpb25zIOKGkiBkZWxldGUgdW51c2VkIGFwcHMsXCIsXG5cdFx0YHRoZW4gcmUtcnVuIHRoZSBzY2FmZm9sZCAob3IgY2hvb3NlIFBvc3RtYW4gXCJub25lXCIgdG8gc2tpcCBTUEEgY3JlYXRpb24pLmAsXG5cdFx0XCJSZS1zY2FmZm9sZCBvZiB0aGUgc2FtZSBwcm9qZWN0IG5hbWUgcmV1c2VzIGFuIGV4YWN0LW5hbWUgbWF0Y2ggd2hlbiBpdCBzdGlsbCBleGlzdHMuXCIsXG5cdF0uam9pbihcIlxcblwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNwYUFwcChcblx0bmFtZTogc3RyaW5nLFxuXHRjYWxsYmFja1VybHM6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogeyBjbGllbnRfaWQ6IHN0cmluZyB9IHtcblx0Y29uc3QgY2FsbGJhY2tzID0gdHlwZW9mIGNhbGxiYWNrVXJscyA9PT0gXCJzdHJpbmdcIiA/IGNhbGxiYWNrVXJscyA6IGNhbGxiYWNrVXJscy5qb2luKFwiLFwiKTtcblx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1xuXHRcdFwiYXBwc1wiLFxuXHRcdFwiY3JlYXRlXCIsXG5cdFx0XCItLW5hbWVcIixcblx0XHRuYW1lLFxuXHRcdFwiLS10eXBlXCIsXG5cdFx0XCJzcGFcIixcblx0XHRcIi0tY2FsbGJhY2tzXCIsXG5cdFx0Y2FsbGJhY2tzLFxuXHRcdFwiLS1qc29uXCIsXG5cdFx0XCItLW5vLWlucHV0XCIsXG5cdF0pO1xuXHRjb25zdCBhcHAgPSBwYXJzZUpzb25PdXRwdXQ8eyBjbGllbnRfaWQ/OiBzdHJpbmc7IGNsaWVudElkPzogc3RyaW5nIH0+KG91dCk7XG5cdGNvbnN0IGNsaWVudElkID0gYXBwLmNsaWVudF9pZCA/PyBhcHAuY2xpZW50SWQ7XG5cdGlmICghY2xpZW50SWQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRgQXV0aDAgY3JlYXRlIFNQQSByZXNwb25zZSBtaXNzaW5nIGNsaWVudF9pZC4gc3Rkb3V0OiAke291dC5zbGljZSgwLCAzMDApfWAsXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4geyBjbGllbnRfaWQ6IGNsaWVudElkIH07XG59XG5cbmV4cG9ydCB0eXBlIEF1dGgwQXBwID0geyBjbGllbnRfaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0QXBwcygpOiBBdXRoMEFwcFtdIHtcblx0dHJ5IHtcblx0XHRjb25zdCBvdXQgPSBydW5BdXRoMChbXCJhcHBzXCIsIFwibGlzdFwiLCBcIi0tanNvblwiLCBcIi0tbm8taW5wdXRcIl0pO1xuXHRcdGNvbnN0IGFwcHMgPVxuXHRcdFx0cGFyc2VKc29uT3V0cHV0PEFycmF5PHsgY2xpZW50X2lkPzogc3RyaW5nOyBjbGllbnRJZD86IHN0cmluZzsgbmFtZT86IHN0cmluZyB9Pj4ob3V0KTtcblx0XHRyZXR1cm4gYXBwc1xuXHRcdFx0Lm1hcCgoYSkgPT4gKHtcblx0XHRcdFx0Y2xpZW50X2lkOiBhLmNsaWVudF9pZCA/PyBhLmNsaWVudElkID8/IFwiXCIsXG5cdFx0XHRcdG5hbWU6IGEubmFtZSA/PyBcIlwiLFxuXHRcdFx0fSkpXG5cdFx0XHQuZmlsdGVyKChhKSA9PiBhLmNsaWVudF9pZCAmJiBhLm5hbWUpO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRpZiAoZXJyIGluc3RhbmNlb2YgQXV0aDBBdXRoRXJyb3IpIHRocm93IGVycjtcblx0XHRyZXR1cm4gW107XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNwYUNhbGxiYWNrcyhcblx0Y2xpZW50SWQ6IHN0cmluZyxcblx0Y2FsbGJhY2tVcmxzOiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSxcbik6IHZvaWQge1xuXHRjb25zdCBjYWxsYmFja3MgPSB0eXBlb2YgY2FsbGJhY2tVcmxzID09PSBcInN0cmluZ1wiID8gY2FsbGJhY2tVcmxzIDogY2FsbGJhY2tVcmxzLmpvaW4oXCIsXCIpO1xuXHRydW5BdXRoMChbXCJhcHBzXCIsIFwidXBkYXRlXCIsIGNsaWVudElkLCBcIi0tY2FsbGJhY2tzXCIsIGNhbGxiYWNrcywgXCItLW5vLWlucHV0XCJdKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBQb3N0bWFuIFNQQSwgb3IgcmV1c2UgYW4gZXhpc3RpbmcgYXBwIHdpdGggdGhlIHNhbWUgbmFtZSAocmUtc2NhZmZvbGQpLlxuICogQWx3YXlzIHJldHVybnMgYSBjbGllbnRfaWQgc3VpdGFibGUgZm9yIFBvc3RtYW4gYXV0aDBDbGllbnRJZC5cbiAqIE9uIEF1dGgwIGFwcGxpY2F0aW9uLXF1b3RhIGVycm9ycywgdGhyb3dzIGEgY2xlYXIgZGVsZXRlLWFwcHMgbWVzc2FnZSAobm8gY3Jvc3MtYXBwIHJldXNlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVNwYUFwcChcblx0bmFtZTogc3RyaW5nLFxuXHRjYWxsYmFja1VybHM6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogeyBjbGllbnRfaWQ6IHN0cmluZzsgcmV1c2VkOiBib29sZWFuIH0ge1xuXHRjb25zdCBhcHBzID0gbGlzdEFwcHMoKTtcblx0Y29uc3QgZXhpc3RpbmcgPSBhcHBzLmZpbmQoKGEpID0+IGEubmFtZSA9PT0gbmFtZSk7XG5cdGlmIChleGlzdGluZykge1xuXHRcdHRyeSB7XG5cdFx0XHR1cGRhdGVTcGFDYWxsYmFja3MoZXhpc3RpbmcuY2xpZW50X2lkLCBjYWxsYmFja1VybHMpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0Ly8gQ2FsbGJhY2tzIG1heSBhbHJlYWR5IG1hdGNoOyBzdGlsbCB1c2FibGUgZm9yIFBvc3RtYW4uXG5cdFx0fVxuXHRcdHJldHVybiB7IGNsaWVudF9pZDogZXhpc3RpbmcuY2xpZW50X2lkLCByZXVzZWQ6IHRydWUgfTtcblx0fVxuXHR0cnkge1xuXHRcdHJldHVybiB7IC4uLmNyZWF0ZVNwYUFwcChuYW1lLCBjYWxsYmFja1VybHMpLCByZXVzZWQ6IGZhbHNlIH07XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGlmIChpc0F1dGgwRW50aXR5TGltaXRFcnJvcihlcnIpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoZm9ybWF0U3BhRW50aXR5TGltaXRFcnJvcihuYW1lLCBhcHBzKSk7XG5cdFx0fVxuXHRcdHRocm93IGVycjtcblx0fVxufVxuXG50eXBlIEF1dGgwQ29ubmVjdGlvbiA9IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzdHJhdGVneTogc3RyaW5nIH07XG5cbi8qKiBFbmFibGUgYSBkYXRhYmFzZSBjb25uZWN0aW9uIGZvciBhbiBhcHBsaWNhdGlvbiAocmVxdWlyZWQgZm9yIHVzZXJuYW1lL3Bhc3N3b3JkIGxvZ2luKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVDb25uZWN0aW9uRm9yQ2xpZW50KGNvbm5lY3Rpb25OYW1lOiBzdHJpbmcsIGNsaWVudElkOiBzdHJpbmcpOiB2b2lkIHtcblx0Y29uc3QgbGlzdE91dCA9IHJ1bkF1dGgwKFtcImFwaVwiLCBcImdldFwiLCBcImNvbm5lY3Rpb25zXCIsIFwiLS1uby1pbnB1dFwiXSk7XG5cdGNvbnN0IGNvbm5lY3Rpb25zID0gcGFyc2VKc29uT3V0cHV0PEF1dGgwQ29ubmVjdGlvbltdPihsaXN0T3V0KTtcblx0Y29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gY29ubmVjdGlvbk5hbWUpO1xuXHRpZiAoIWNvbm5lY3Rpb24pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEF1dGgwIGNvbm5lY3Rpb24gbm90IGZvdW5kOiAke2Nvbm5lY3Rpb25OYW1lfWApO1xuXHR9XG5cblx0Y29uc3QgY2xpZW50c091dCA9IHJ1bkF1dGgwKFtcblx0XHRcImFwaVwiLFxuXHRcdFwiZ2V0XCIsXG5cdFx0YGNvbm5lY3Rpb25zLyR7Y29ubmVjdGlvbi5pZH0vY2xpZW50c2AsXG5cdFx0XCItLW5vLWlucHV0XCIsXG5cdF0pO1xuXHRjb25zdCB7IGNsaWVudHMgfSA9IHBhcnNlSnNvbk91dHB1dDx7IGNsaWVudHM6IEFycmF5PHsgY2xpZW50X2lkOiBzdHJpbmcgfT4gfT4oY2xpZW50c091dCk7XG5cdGlmIChjbGllbnRzLnNvbWUoKGMpID0+IGMuY2xpZW50X2lkID09PSBjbGllbnRJZCkpIHJldHVybjtcblxuXHQvLyBEZWRpY2F0ZWQgZW5hYmxlZC1jbGllbnRzIGVuZHBvaW50IChlbmFibGVkX2NsaWVudHMgb24gY29ubmVjdGlvbiBQQVRDSCBpcyBkZXByZWNhdGVkKS5cblx0cnVuQXV0aDAoW1xuXHRcdFwiYXBpXCIsXG5cdFx0XCJwYXRjaFwiLFxuXHRcdGBjb25uZWN0aW9ucy8ke2Nvbm5lY3Rpb24uaWR9L2NsaWVudHNgLFxuXHRcdFwiLS1kYXRhXCIsXG5cdFx0SlNPTi5zdHJpbmdpZnkoW3sgY2xpZW50X2lkOiBjbGllbnRJZCwgc3RhdHVzOiB0cnVlIH1dKSxcblx0XHRcIi0tbm8taW5wdXRcIixcblx0XSk7XG59XG5cbmV4cG9ydCB0eXBlIEFkbWluRGF0YWJhc2VVc2VyID0ge1xuXHR1c2VyX2lkOiBzdHJpbmc7XG5cdGVtYWlsOiBzdHJpbmc7XG5cdHBhc3N3b3JkOiBzdHJpbmc7XG5cdHVzZXJuYW1lOiBzdHJpbmc7XG59O1xuXG4vKiogU3Ryb25nIGRlZmF1bHQgcGFzc3dvcmQgd2hlbiB0aGUgc2NhZmZvbGRlciBjYWxsZXIgbGVhdmVzIHBhc3N3b3JkIGJsYW5rLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWRtaW5QYXNzd29yZCgpOiBzdHJpbmcge1xuXHRyZXR1cm4gYCR7cmFuZG9tQnl0ZXMoMTIpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpfWFBMSFgO1xufVxuXG5mdW5jdGlvbiBpc1VzZXJBbHJlYWR5RXhpc3RzRXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG5cdGNvbnN0IHRleHQgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG5cdHJldHVybiAvYWxyZWFkeSBleGlzdHN8dXNlciBleGlzdHN8Q29uZmxpY3R8NDA5L2kudGVzdCh0ZXh0KTtcbn1cblxuLyoqIExvb2sgdXAgYSB1c2VyIGJ5IGVtYWlsIChNYW5hZ2VtZW50IEFQSSB1c2Vycy1ieS1lbWFpbCkuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFVzZXJCeUVtYWlsKGVtYWlsOiBzdHJpbmcpOiB7IHVzZXJfaWQ6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9IHwgbnVsbCB7XG5cdGNvbnN0IG91dCA9IHJ1bkF1dGgwKFtcblx0XHRcImFwaVwiLFxuXHRcdFwiZ2V0XCIsXG5cdFx0YHVzZXJzLWJ5LWVtYWlsP2VtYWlsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGVtYWlsKX1gLFxuXHRcdFwiLS1uby1pbnB1dFwiLFxuXHRdKTtcblx0Y29uc3QgdXNlcnMgPSBwYXJzZUpzb25PdXRwdXQ8QXJyYXk8eyB1c2VyX2lkPzogc3RyaW5nOyBlbWFpbD86IHN0cmluZyB9Pj4ob3V0KTtcblx0Y29uc3QgdXNlciA9IHVzZXJzLmZpbmQoKHUpID0+IHUudXNlcl9pZCAmJiB1LmVtYWlsKTtcblx0aWYgKCF1c2VyPy51c2VyX2lkIHx8ICF1c2VyLmVtYWlsKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIHsgdXNlcl9pZDogdXNlci51c2VyX2lkLCBlbWFpbDogdXNlci5lbWFpbCB9O1xufVxuXG4vKiogUmVzZXQgcGFzc3dvcmQgc28gYSByZS1zY2FmZm9sZCBjYW4gd3JpdGUgYSBrbm93biBwYXNzd29yZCB0byAuZW52LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVVzZXJQYXNzd29yZCh1c2VySWQ6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IHZvaWQge1xuXHRydW5BdXRoMChbXG5cdFx0XCJhcGlcIixcblx0XHRcInBhdGNoXCIsXG5cdFx0YHVzZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHVzZXJJZCl9YCxcblx0XHRcIi0tZGF0YVwiLFxuXHRcdEpTT04uc3RyaW5naWZ5KHsgcGFzc3dvcmQsIGNvbm5lY3Rpb246IERCX0NPTk5FQ1RJT05fTkFNRSB9KSxcblx0XHRcIi0tbm8taW5wdXRcIixcblx0XSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgREIgY29ubmVjdGlvbiByb290LWFkbWluIHVzZXIgZm9yIGxvY2FsIC8gUG9zdG1hbiBsb2dpbi5cbiAqIElmIHRoZSB1c2VyIGFscmVhZHkgZXhpc3RzLCBsb29rIHRoZW0gdXAsIHJlc2V0IHBhc3N3b3JkIHRvIGBpbnB1dC5wYXNzd29yZGAsXG4gKiBhbmQgcmV0dXJuIHRoYXQgaWRlbnRpdHkgc28gY2FsbGVycyBjYW4gc3RpbGwgd3JpdGUgLmVudiBjcmVkZW50aWFscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFkbWluRGF0YWJhc2VVc2VyKGlucHV0OiB7XG5cdGVtYWlsOiBzdHJpbmc7XG5cdHBhc3N3b3JkOiBzdHJpbmc7XG5cdHVzZXJuYW1lOiBzdHJpbmc7XG59KTogQWRtaW5EYXRhYmFzZVVzZXIge1xuXHRjb25zdCBib2R5ID0ge1xuXHRcdGVtYWlsOiBpbnB1dC5lbWFpbCxcblx0XHRjb25uZWN0aW9uOiBEQl9DT05ORUNUSU9OX05BTUUsXG5cdFx0cGFzc3dvcmQ6IGlucHV0LnBhc3N3b3JkLFxuXHRcdG5hbWU6IGlucHV0LnVzZXJuYW1lLFxuXHRcdGVtYWlsX3ZlcmlmaWVkOiB0cnVlLFxuXHRcdHZlcmlmeV9lbWFpbDogZmFsc2UsXG5cdFx0YXBwX21ldGFkYXRhOiB7IHJvbGVzOiBbXCJhZG1pblwiXSB9LFxuXHR9O1xuXG5cdHRyeSB7XG5cdFx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1xuXHRcdFx0XCJhcGlcIixcblx0XHRcdFwicG9zdFwiLFxuXHRcdFx0XCJ1c2Vyc1wiLFxuXHRcdFx0XCItLWRhdGFcIixcblx0XHRcdEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuXHRcdFx0XCItLW5vLWlucHV0XCIsXG5cdFx0XSk7XG5cdFx0Y29uc3QgdXNlciA9IHBhcnNlSnNvbk91dHB1dDx7IHVzZXJfaWQ/OiBzdHJpbmc7IGVtYWlsPzogc3RyaW5nIH0+KG91dCk7XG5cdFx0aWYgKCF1c2VyLnVzZXJfaWQgfHwgIXVzZXIuZW1haWwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YEF1dGgwIGNyZWF0ZSB1c2VyIHJlc3BvbnNlIG1pc3NpbmcgdXNlcl9pZC9lbWFpbC4gc3Rkb3V0OiAke291dC5zbGljZSgwLCAzMDApfWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0dXNlcl9pZDogdXNlci51c2VyX2lkLFxuXHRcdFx0ZW1haWw6IHVzZXIuZW1haWwsXG5cdFx0XHRwYXNzd29yZDogaW5wdXQucGFzc3dvcmQsXG5cdFx0XHR1c2VybmFtZTogaW5wdXQudXNlcm5hbWUsXG5cdFx0fTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0aWYgKCFpc1VzZXJBbHJlYWR5RXhpc3RzRXJyb3IoZXJyKSkgdGhyb3cgZXJyO1xuXG5cdFx0Y29uc3QgZXhpc3RpbmcgPSBmaW5kVXNlckJ5RW1haWwoaW5wdXQuZW1haWwpO1xuXHRcdGlmICghZXhpc3RpbmcpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YEF1dGgwIHVzZXIgYWxyZWFkeSBleGlzdHMgZm9yICR7aW5wdXQuZW1haWx9LCBidXQgbG9va3VwIGJ5IGVtYWlsIHJldHVybmVkIG5vIHVzZXIuYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0dXBkYXRlVXNlclBhc3N3b3JkKGV4aXN0aW5nLnVzZXJfaWQsIGlucHV0LnBhc3N3b3JkKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dXNlcl9pZDogZXhpc3RpbmcudXNlcl9pZCxcblx0XHRcdGVtYWlsOiBleGlzdGluZy5lbWFpbCxcblx0XHRcdHBhc3N3b3JkOiBpbnB1dC5wYXNzd29yZCxcblx0XHRcdHVzZXJuYW1lOiBpbnB1dC51c2VybmFtZSxcblx0XHR9O1xuXHR9XG59XG5cbmV4cG9ydCB7IFJFUVVJUkVEX1NDT1BFUyB9O1xuIl0sIm5hbWVzIjpbImV4ZWNGaWxlU3luYyIsInNwYXduU3luYyIsInJhbmRvbUJ5dGVzIiwiUkVRVUlSRURfU0NPUEVTIiwiam9pbiIsIkFQSV9USU1FT1VUX01TIiwiSEVMTE9fQVBJX1NDT1BFUyIsIkRCX0NPTk5FQ1RJT05fTkFNRSIsIkF1dGgwQXV0aEVycm9yIiwiRXJyb3IiLCJtZXNzYWdlIiwibmFtZSIsImlzQXV0aEVycm9yIiwidGV4dCIsImluY2x1ZGVzIiwicGFyc2VKc29uT3V0cHV0Iiwic3Rkb3V0Iiwic3RhcnQiLCJpbmRleE9mIiwiYXJyYXlTdGFydCIsImlkeCIsIk1hdGgiLCJtaW4iLCJzbGljZSIsIkpTT04iLCJwYXJzZSIsInJ1bkF1dGgwIiwiYXJncyIsInJlc3VsdCIsImVuY29kaW5nIiwidGltZW91dCIsImlucHV0Iiwic3RkaW8iLCJlcnJvciIsIm1zZyIsImNvZGUiLCJzdGF0dXMiLCJzdGRlcnIiLCJpc0luc3RhbGxlZCIsImxpc3RUZW5hbnRzIiwib3V0IiwibG9naW4iLCJsaXN0QXBpcyIsImVyciIsImNyZWF0ZUFwaSIsImlkZW50aWZpZXIiLCJzY29wZXMiLCJ1cGRhdGVBcGlTY29wZXMiLCJpc0F1dGgwRW50aXR5TGltaXRFcnJvciIsIlN0cmluZyIsInRlc3QiLCJmb3JtYXRTcGFFbnRpdHlMaW1pdEVycm9yIiwiYXBwTmFtZSIsImFwcHMiLCJsaXN0ZWQiLCJsZW5ndGgiLCJtYXAiLCJhIiwiY2xpZW50X2lkIiwiY3JlYXRlU3BhQXBwIiwiY2FsbGJhY2tVcmxzIiwiY2FsbGJhY2tzIiwiYXBwIiwiY2xpZW50SWQiLCJsaXN0QXBwcyIsImZpbHRlciIsInVwZGF0ZVNwYUNhbGxiYWNrcyIsImVuc3VyZVNwYUFwcCIsImV4aXN0aW5nIiwiZmluZCIsInJldXNlZCIsImVuYWJsZUNvbm5lY3Rpb25Gb3JDbGllbnQiLCJjb25uZWN0aW9uTmFtZSIsImxpc3RPdXQiLCJjb25uZWN0aW9ucyIsImNvbm5lY3Rpb24iLCJjIiwiY2xpZW50c091dCIsImlkIiwiY2xpZW50cyIsInNvbWUiLCJzdHJpbmdpZnkiLCJnZW5lcmF0ZUFkbWluUGFzc3dvcmQiLCJ0b1N0cmluZyIsImlzVXNlckFscmVhZHlFeGlzdHNFcnJvciIsImZpbmRVc2VyQnlFbWFpbCIsImVtYWlsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwidXNlcnMiLCJ1c2VyIiwidSIsInVzZXJfaWQiLCJ1cGRhdGVVc2VyUGFzc3dvcmQiLCJ1c2VySWQiLCJwYXNzd29yZCIsImNyZWF0ZUFkbWluRGF0YWJhc2VVc2VyIiwiYm9keSIsInVzZXJuYW1lIiwiZW1haWxfdmVyaWZpZWQiLCJ2ZXJpZnlfZW1haWwiLCJhcHBfbWV0YWRhdGEiLCJyb2xlcyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsWUFBWSxFQUFFQyxTQUFTLFFBQVEscUJBQXFCO0FBQzdELFNBQVNDLFdBQVcsUUFBUSxjQUFjO0FBRTFDLDZFQUE2RSxHQUM3RSxNQUFNQyxrQkFBa0I7SUFDdkI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtDQUNBLENBQUNDLElBQUksQ0FBQztBQUVQLDBGQUEwRixHQUMxRixNQUFNQyxpQkFB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
|
|
408
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy93ZWJhcGkvZmVhdHVyZXMvYXV0aDAtY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlU3luYywgc3Bhd25TeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuLyoqIE1hbmFnZW1lbnQgQVBJIHNjb3BlcyBuZWVkZWQgZm9yIEFQSSwgU1BBLCBjb25uZWN0aW9ucywgYW5kIGFkbWluIHVzZXJzLiAqL1xuY29uc3QgUkVRVUlSRURfU0NPUEVTID0gW1xuXHRcImNyZWF0ZTpjbGllbnRzXCIsXG5cdFwicmVhZDpjbGllbnRzXCIsXG5cdFwidXBkYXRlOmNsaWVudHNcIixcblx0XCJjcmVhdGU6cmVzb3VyY2Vfc2VydmVyc1wiLFxuXHRcInJlYWQ6cmVzb3VyY2Vfc2VydmVyc1wiLFxuXHRcInVwZGF0ZTpyZXNvdXJjZV9zZXJ2ZXJzXCIsXG5cdFwicmVhZDpjb25uZWN0aW9uc1wiLFxuXHRcInVwZGF0ZTpjb25uZWN0aW9uc1wiLFxuXHRcImNyZWF0ZTp1c2Vyc1wiLFxuXHRcInJlYWQ6dXNlcnNcIixcblx0XCJ1cGRhdGU6dXNlcnNcIixcbl0uam9pbihcIixcIik7XG5cbi8qKiBIYXJkIHRpbWVvdXQgZm9yIGFueSBNYW5hZ2VtZW50IEFQSSBjYWxsLiBQcmV2ZW50cyBpbmRlZmluaXRlIGhhbmdzIG9uIHRva2VuIHJlLWF1dGguICovXG5jb25zdCBBUElfVElNRU9VVF9NUyA9IDhfMDAwO1xuXG4vKiogRGVmYXVsdCBBUEkgc2NvcGVzIG1hdGNoaW5nIEhlbGxvIENBU0wgQXV0aG9yaXplIGRlY29yYXRvcnMuICovXG5leHBvcnQgY29uc3QgSEVMTE9fQVBJX1NDT1BFUyA9IFtcblx0XCJyZWFkOkhlbGxvXCIsXG5cdFwiY3JlYXRlOkhlbGxvXCIsXG5cdFwidXBkYXRlOkhlbGxvXCIsXG5cdFwiZGVsZXRlOkhlbGxvXCIsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgREJfQ09OTkVDVElPTl9OQU1FID0gXCJVc2VybmFtZS1QYXNzd29yZC1BdXRoZW50aWNhdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgQXV0aDBBdXRoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHR0aGlzLm5hbWUgPSBcIkF1dGgwQXV0aEVycm9yXCI7XG5cdH1cbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvciBzdGRlcnIgb3V0cHV0IGxvb2tzIGxpa2UgYW4gZXhwaXJlZC9taXNzaW5nIHRva2VuLiAqL1xuZnVuY3Rpb24gaXNBdXRoRXJyb3IodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0dGV4dC5pbmNsdWRlcyhcInJlbmV3IGFjY2VzcyB0b2tlblwiKSB8fFxuXHRcdHRleHQuaW5jbHVkZXMoXCJsb2cgaW5cIikgfHxcblx0XHR0ZXh0LmluY2x1ZGVzKFwiVW5hdXRob3JpemVkXCIpXG5cdCk7XG59XG5cbi8qKiBTdHJpcCBBdXRoMCBDTEkgYmFubmVyIGxpbmVzIGJlZm9yZSBKU09OLiAqL1xuZnVuY3Rpb24gcGFyc2VKc29uT3V0cHV0PFQ+KHN0ZG91dDogc3RyaW5nKTogVCB7XG5cdGNvbnN0IHN0YXJ0ID0gc3Rkb3V0LmluZGV4T2YoXCJ7XCIpO1xuXHRjb25zdCBhcnJheVN0YXJ0ID0gc3Rkb3V0LmluZGV4T2YoXCJbXCIpO1xuXHRsZXQgaWR4ID0gLTE7XG5cdGlmIChzdGFydCA9PT0gLTEpIGlkeCA9IGFycmF5U3RhcnQ7XG5cdGVsc2UgaWYgKGFycmF5U3RhcnQgPT09IC0xKSBpZHggPSBzdGFydDtcblx0ZWxzZSBpZHggPSBNYXRoLm1pbihzdGFydCwgYXJyYXlTdGFydCk7XG5cdGlmIChpZHggPCAwKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIEpTT04gZnJvbSBhdXRoMCBDTEksIGdvdDogJHtzdGRvdXQuc2xpY2UoMCwgMjAwKX1gKTtcblx0cmV0dXJuIEpTT04ucGFyc2Uoc3Rkb3V0LnNsaWNlKGlkeCkpIGFzIFQ7XG59XG5cbi8qKiBSdW4gYW4gYXV0aDAgQ0xJIGNvbW1hbmQgd2l0aCBhIGhhcmQgdGltZW91dC4gUmV0dXJucyBzdGRvdXQgb24gc3VjY2VzcywgdGhyb3dzIG9uIGZhaWx1cmUuICovXG5mdW5jdGlvbiBydW5BdXRoMChhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhcImF1dGgwXCIsIGFyZ3MsIHtcblx0XHRlbmNvZGluZzogXCJ1dGY4XCIsXG5cdFx0dGltZW91dDogQVBJX1RJTUVPVVRfTVMsXG5cdFx0aW5wdXQ6IFwiXCIsXG5cdFx0c3RkaW86IFwicGlwZVwiLFxuXHR9KTtcblxuXHRpZiAocmVzdWx0LmVycm9yKSB7XG5cdFx0Y29uc3QgbXNnID0gcmVzdWx0LmVycm9yLm1lc3NhZ2U7XG5cdFx0aWYgKGlzQXV0aEVycm9yKG1zZykgfHwgKHJlc3VsdC5lcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09IFwiRVRJTUVET1VUXCIpIHtcblx0XHRcdHRocm93IG5ldyBBdXRoMEF1dGhFcnJvcihtc2cpO1xuXHRcdH1cblx0XHR0aHJvdyByZXN1bHQuZXJyb3I7XG5cdH1cblxuXHRpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuXHRcdGNvbnN0IHN0ZGVyciA9IHJlc3VsdC5zdGRlcnIgPz8gXCJcIjtcblx0XHRpZiAoaXNBdXRoRXJyb3Ioc3RkZXJyKSkgdGhyb3cgbmV3IEF1dGgwQXV0aEVycm9yKHN0ZGVycik7XG5cdFx0dGhyb3cgbmV3IEVycm9yKHN0ZGVyciB8fCBgYXV0aDAgZXhpdGVkIHdpdGggY29kZSAke3Jlc3VsdC5zdGF0dXN9YCk7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0LnN0ZG91dDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRoMFRlbmFudCB7XG5cdG5hbWU6IHN0cmluZztcblx0YWN0aXZlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5zdGFsbGVkKCk6IGJvb2xlYW4ge1xuXHR0cnkge1xuXHRcdGV4ZWNGaWxlU3luYyhcImF1dGgwXCIsIFtcIi0tdmVyc2lvblwiXSwgeyBzdGRpbzogXCJwaXBlXCIgfSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFRlbmFudHMoKTogQXV0aDBUZW5hbnRbXSB7XG5cdHRyeSB7XG5cdFx0Y29uc3Qgb3V0ID0gZXhlY0ZpbGVTeW5jKFwiYXV0aDBcIiwgW1widGVuYW50c1wiLCBcImxpc3RcIiwgXCItLWpzb25cIl0sIHtcblx0XHRcdGVuY29kaW5nOiBcInV0ZjhcIixcblx0XHRcdHN0ZGlvOiBcInBpcGVcIixcblx0XHR9KTtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZShvdXQpIGFzIEF1dGgwVGVuYW50W107XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybiBbXTtcblx0fVxufVxuXG4vKiogRGV2aWNlL1VSTCBsb2dpbiAoYC0tbm8taW5wdXRgKSBzbyBEb2NrZXIgY2FuIHByaW50IGEgaG9zdC1icm93c2VyIFVSTC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dpbigpOiBib29sZWFuIHtcblx0Y29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKFwiYXV0aDBcIiwgW1wibG9naW5cIiwgXCItLXNjb3Blc1wiLCBSRVFVSVJFRF9TQ09QRVMsIFwiLS1uby1pbnB1dFwiXSwge1xuXHRcdHN0ZGlvOiBcImluaGVyaXRcIixcblx0fSk7XG5cdHJldHVybiByZXN1bHQuc3RhdHVzID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdEFwaXMoKTogQXJyYXk8eyBpZGVudGlmaWVyOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PiB7XG5cdHRyeSB7XG5cdFx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1wiYXBpc1wiLCBcImxpc3RcIiwgXCItLWpzb25cIiwgXCItLW5vLWlucHV0XCJdKTtcblx0XHRyZXR1cm4gcGFyc2VKc29uT3V0cHV0KG91dCk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGlmIChlcnIgaW5zdGFuY2VvZiBBdXRoMEF1dGhFcnJvcikgdGhyb3cgZXJyO1xuXHRcdHJldHVybiBbXTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBpKFxuXHRuYW1lOiBzdHJpbmcsXG5cdGlkZW50aWZpZXI6IHN0cmluZyxcblx0c2NvcGVzOiByZWFkb25seSBzdHJpbmdbXSA9IEhFTExPX0FQSV9TQ09QRVMsXG4pOiB7IGlkZW50aWZpZXI6IHN0cmluZyB9IHtcblx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1xuXHRcdFwiYXBpc1wiLFxuXHRcdFwiY3JlYXRlXCIsXG5cdFx0XCItLW5hbWVcIixcblx0XHRuYW1lLFxuXHRcdFwiLS1pZGVudGlmaWVyXCIsXG5cdFx0aWRlbnRpZmllcixcblx0XHRcIi0tc2NvcGVzXCIsXG5cdFx0c2NvcGVzLmpvaW4oXCIsXCIpLFxuXHRcdC8vIFJCQUM6IG9ubHkgcGVybWlzc2lvbnMgYXNzaWduZWQgdG8gdGhlIHVzZXIvcm9sZSBhcHBlYXIgb24gdGhlIHRva2VuLlxuXHRcdFwiLS1lbmZvcmNlLXBvbGljaWVzXCIsXG5cdFx0Ly8gSW5jbHVkZSBBdXRoMCBgcGVybWlzc2lvbnNbXWAgY2xhaW0gKGNvbnN1bWVkIGJ5IHNhbXBsZSBwcmluY2lwYWxNYXBwZXIpLlxuXHRcdFwiLS10b2tlbi1kaWFsZWN0XCIsXG5cdFx0XCJhY2Nlc3NfdG9rZW5fYXV0aHpcIixcblx0XHRcIi0tanNvblwiLFxuXHRcdFwiLS1uby1pbnB1dFwiLFxuXHRdKTtcblx0cmV0dXJuIHBhcnNlSnNvbk91dHB1dChvdXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdEFwaVNjb3BlcyhpZGVudGlmaWVyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdHRyeSB7XG5cdFx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1wiYXBpc1wiLCBcInNob3dcIiwgaWRlbnRpZmllciwgXCItLWpzb25cIiwgXCItLW5vLWlucHV0XCJdKTtcblx0XHRjb25zdCBhcGkgPSBwYXJzZUpzb25PdXRwdXQ8e1xuXHRcdFx0c2NvcGVzPzogQXJyYXk8c3RyaW5nIHwgeyB2YWx1ZT86IHN0cmluZzsgbmFtZT86IHN0cmluZyB9Pjtcblx0XHR9PihvdXQpO1xuXHRcdHJldHVybiAoYXBpLnNjb3BlcyA/PyBbXSlcblx0XHRcdC5tYXAoKHNjb3BlKSA9PiAodHlwZW9mIHNjb3BlID09PSBcInN0cmluZ1wiID8gc2NvcGUgOiAoc2NvcGUudmFsdWUgPz8gc2NvcGUubmFtZSA/PyBcIlwiKSkpXG5cdFx0XHQuZmlsdGVyKChzY29wZSkgPT4gc2NvcGUubGVuZ3RoID4gMCk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGlmIChlcnIgaW5zdGFuY2VvZiBBdXRoMEF1dGhFcnJvcikgdGhyb3cgZXJyO1xuXHRcdHJldHVybiBbXTtcblx0fVxufVxuXG4vKiogQXNzaWduIEFQSSBwZXJtaXNzaW9ucyB0byBhIHVzZXIgKEF1dGhvcml6YXRpb24gQ29yZSkuIElkZW1wb3RlbnQgd2hlbiBhbHJlYWR5IGdyYW50ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduVXNlclBlcm1pc3Npb25zKFxuXHR1c2VySWQ6IHN0cmluZyxcblx0YXVkaWVuY2U6IHN0cmluZyxcblx0cGVybWlzc2lvbnM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogdm9pZCB7XG5cdGlmIChwZXJtaXNzaW9ucy5sZW5ndGggPT09IDApIHJldHVybjtcblx0cnVuQXV0aDAoW1xuXHRcdFwiYXBpXCIsXG5cdFx0XCJwb3N0XCIsXG5cdFx0YHVzZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHVzZXJJZCl9L3Blcm1pc3Npb25zYCxcblx0XHRcIi0tZGF0YVwiLFxuXHRcdEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdHBlcm1pc3Npb25zOiBwZXJtaXNzaW9ucy5tYXAoKHBlcm1pc3Npb25fbmFtZSkgPT4gKHtcblx0XHRcdFx0cmVzb3VyY2Vfc2VydmVyX2lkZW50aWZpZXI6IGF1ZGllbmNlLFxuXHRcdFx0XHRwZXJtaXNzaW9uX25hbWUsXG5cdFx0XHR9KSksXG5cdFx0fSksXG5cdFx0XCItLW5vLWlucHV0XCIsXG5cdF0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgYW4gQVBJJ3Mgc2NvcGVzIGFuZCBlbmFibGUgUkJBQyBwb2xpY3kgZW5mb3JjZW1lbnQuXG4gKiBBdXRoMCBDTEkgYC0tc2NvcGVzYCByZXBsYWNlcyB0aGUgZnVsbCBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBcGlTY29wZXMoXG5cdGlkZW50aWZpZXI6IHN0cmluZyxcblx0c2NvcGVzOiByZWFkb25seSBzdHJpbmdbXSA9IEhFTExPX0FQSV9TQ09QRVMsXG4pOiB2b2lkIHtcblx0cnVuQXV0aDAoW1xuXHRcdFwiYXBpc1wiLFxuXHRcdFwidXBkYXRlXCIsXG5cdFx0aWRlbnRpZmllcixcblx0XHRcIi0tc2NvcGVzXCIsXG5cdFx0c2NvcGVzLmpvaW4oXCIsXCIpLFxuXHRcdFwiLS1lbmZvcmNlLXBvbGljaWVzXCIsXG5cdFx0XCItLXRva2VuLWRpYWxlY3RcIixcblx0XHRcImFjY2Vzc190b2tlbl9hdXRoelwiLFxuXHRcdFwiLS1uby1pbnB1dFwiLFxuXHRdKTtcbn1cblxuLyoqIFRydWUgd2hlbiBBdXRoMCByZWZ1c2VzIGNyZWF0ZSBiZWNhdXNlIHRoZSB0ZW5hbnQgaGl0IGl0cyBBcHBsaWNhdGlvbnMgcXVvdGEuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoMEVudGl0eUxpbWl0RXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG5cdGNvbnN0IHRleHQgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG5cdHJldHVybiAvbGltaXQgb2YgZW50aXRpZXN8cmVhY2hlZCB0aGUgbGltaXR8dGVuYW50IGFwcGxpY2F0aW9uIGxpbWl0IHJlYWNoZWQvaS50ZXN0KHRleHQpO1xufVxuXG4vKipcbiAqIEFjdGlvbmFibGUgbWVzc2FnZSB3aGVuIEF1dGgwIHdpbGwgbm90IGNyZWF0ZSBhbm90aGVyIGFwcGxpY2F0aW9uLlxuICogRG9lcyBub3Qgc3VnZ2VzdCByZXVzaW5nIHVucmVsYXRlZCBhcHBzIOKAlCBmcmVlIHRlbmFudHMgbXVzdCBkZWxldGUgdW51c2VkIG9uZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTcGFFbnRpdHlMaW1pdEVycm9yKGFwcE5hbWU6IHN0cmluZywgYXBwczogQXV0aDBBcHBbXSk6IHN0cmluZyB7XG5cdGNvbnN0IGxpc3RlZCA9XG5cdFx0YXBwcy5sZW5ndGggPT09IDBcblx0XHRcdD8gXCJDb3VsZCBub3QgbGlzdCBleGlzdGluZyBhcHBsaWNhdGlvbnMuXCJcblx0XHRcdDogYFRoaXMgdGVuYW50IGFscmVhZHkgaGFzICR7YXBwcy5sZW5ndGh9IGFwcGxpY2F0aW9uKHMpOlxcbiR7YXBwc1xuXHRcdFx0XHRcdC5tYXAoKGEpID0+IGAgIC0gJHthLm5hbWV9ICgke2EuY2xpZW50X2lkfSlgKVxuXHRcdFx0XHRcdC5qb2luKFwiXFxuXCIpfWA7XG5cblx0cmV0dXJuIFtcblx0XHRgQXV0aDAgcmVmdXNlZCB0byBjcmVhdGUgU1BBIFwiJHthcHBOYW1lfVwiOiB0ZW5hbnQgYXBwbGljYXRpb24gbGltaXQgcmVhY2hlZC5gLFxuXHRcdGxpc3RlZCxcblx0XHRcIlwiLFxuXHRcdFwiRml4OiBBdXRoMCBEYXNoYm9hcmQg4oaSIEFwcGxpY2F0aW9ucyDihpIgQXBwbGljYXRpb25zIOKGkiBkZWxldGUgdW51c2VkIGFwcHMsXCIsXG5cdFx0YHRoZW4gcmUtcnVuIHRoZSBzY2FmZm9sZCAob3IgY2hvb3NlIFBvc3RtYW4gXCJub25lXCIgdG8gc2tpcCBTUEEgY3JlYXRpb24pLmAsXG5cdFx0XCJSZS1zY2FmZm9sZCBvZiB0aGUgc2FtZSBwcm9qZWN0IG5hbWUgcmV1c2VzIGFuIGV4YWN0LW5hbWUgbWF0Y2ggd2hlbiBpdCBzdGlsbCBleGlzdHMuXCIsXG5cdF0uam9pbihcIlxcblwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNwYUFwcChcblx0bmFtZTogc3RyaW5nLFxuXHRjYWxsYmFja1VybHM6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogeyBjbGllbnRfaWQ6IHN0cmluZyB9IHtcblx0Y29uc3QgY2FsbGJhY2tzID0gdHlwZW9mIGNhbGxiYWNrVXJscyA9PT0gXCJzdHJpbmdcIiA/IGNhbGxiYWNrVXJscyA6IGNhbGxiYWNrVXJscy5qb2luKFwiLFwiKTtcblx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1xuXHRcdFwiYXBwc1wiLFxuXHRcdFwiY3JlYXRlXCIsXG5cdFx0XCItLW5hbWVcIixcblx0XHRuYW1lLFxuXHRcdFwiLS10eXBlXCIsXG5cdFx0XCJzcGFcIixcblx0XHRcIi0tY2FsbGJhY2tzXCIsXG5cdFx0Y2FsbGJhY2tzLFxuXHRcdFwiLS1qc29uXCIsXG5cdFx0XCItLW5vLWlucHV0XCIsXG5cdF0pO1xuXHRjb25zdCBhcHAgPSBwYXJzZUpzb25PdXRwdXQ8eyBjbGllbnRfaWQ/OiBzdHJpbmc7IGNsaWVudElkPzogc3RyaW5nIH0+KG91dCk7XG5cdGNvbnN0IGNsaWVudElkID0gYXBwLmNsaWVudF9pZCA/PyBhcHAuY2xpZW50SWQ7XG5cdGlmICghY2xpZW50SWQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRgQXV0aDAgY3JlYXRlIFNQQSByZXNwb25zZSBtaXNzaW5nIGNsaWVudF9pZC4gc3Rkb3V0OiAke291dC5zbGljZSgwLCAzMDApfWAsXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4geyBjbGllbnRfaWQ6IGNsaWVudElkIH07XG59XG5cbmV4cG9ydCB0eXBlIEF1dGgwQXBwID0geyBjbGllbnRfaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0QXBwcygpOiBBdXRoMEFwcFtdIHtcblx0dHJ5IHtcblx0XHRjb25zdCBvdXQgPSBydW5BdXRoMChbXCJhcHBzXCIsIFwibGlzdFwiLCBcIi0tanNvblwiLCBcIi0tbm8taW5wdXRcIl0pO1xuXHRcdGNvbnN0IGFwcHMgPVxuXHRcdFx0cGFyc2VKc29uT3V0cHV0PEFycmF5PHsgY2xpZW50X2lkPzogc3RyaW5nOyBjbGllbnRJZD86IHN0cmluZzsgbmFtZT86IHN0cmluZyB9Pj4ob3V0KTtcblx0XHRyZXR1cm4gYXBwc1xuXHRcdFx0Lm1hcCgoYSkgPT4gKHtcblx0XHRcdFx0Y2xpZW50X2lkOiBhLmNsaWVudF9pZCA/PyBhLmNsaWVudElkID8/IFwiXCIsXG5cdFx0XHRcdG5hbWU6IGEubmFtZSA/PyBcIlwiLFxuXHRcdFx0fSkpXG5cdFx0XHQuZmlsdGVyKChhKSA9PiBhLmNsaWVudF9pZCAmJiBhLm5hbWUpO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRpZiAoZXJyIGluc3RhbmNlb2YgQXV0aDBBdXRoRXJyb3IpIHRocm93IGVycjtcblx0XHRyZXR1cm4gW107XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNwYUNhbGxiYWNrcyhcblx0Y2xpZW50SWQ6IHN0cmluZyxcblx0Y2FsbGJhY2tVcmxzOiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSxcbik6IHZvaWQge1xuXHRjb25zdCBjYWxsYmFja3MgPSB0eXBlb2YgY2FsbGJhY2tVcmxzID09PSBcInN0cmluZ1wiID8gY2FsbGJhY2tVcmxzIDogY2FsbGJhY2tVcmxzLmpvaW4oXCIsXCIpO1xuXHRydW5BdXRoMChbXCJhcHBzXCIsIFwidXBkYXRlXCIsIGNsaWVudElkLCBcIi0tY2FsbGJhY2tzXCIsIGNhbGxiYWNrcywgXCItLW5vLWlucHV0XCJdKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBQb3N0bWFuIFNQQSwgb3IgcmV1c2UgYW4gZXhpc3RpbmcgYXBwIHdpdGggdGhlIHNhbWUgbmFtZSAocmUtc2NhZmZvbGQpLlxuICogQWx3YXlzIHJldHVybnMgYSBjbGllbnRfaWQgc3VpdGFibGUgZm9yIFBvc3RtYW4gYXV0aDBDbGllbnRJZC5cbiAqIE9uIEF1dGgwIGFwcGxpY2F0aW9uLXF1b3RhIGVycm9ycywgdGhyb3dzIGEgY2xlYXIgZGVsZXRlLWFwcHMgbWVzc2FnZSAobm8gY3Jvc3MtYXBwIHJldXNlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVNwYUFwcChcblx0bmFtZTogc3RyaW5nLFxuXHRjYWxsYmFja1VybHM6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogeyBjbGllbnRfaWQ6IHN0cmluZzsgcmV1c2VkOiBib29sZWFuIH0ge1xuXHRjb25zdCBhcHBzID0gbGlzdEFwcHMoKTtcblx0Y29uc3QgZXhpc3RpbmcgPSBhcHBzLmZpbmQoKGEpID0+IGEubmFtZSA9PT0gbmFtZSk7XG5cdGlmIChleGlzdGluZykge1xuXHRcdHRyeSB7XG5cdFx0XHR1cGRhdGVTcGFDYWxsYmFja3MoZXhpc3RpbmcuY2xpZW50X2lkLCBjYWxsYmFja1VybHMpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0Ly8gQ2FsbGJhY2tzIG1heSBhbHJlYWR5IG1hdGNoOyBzdGlsbCB1c2FibGUgZm9yIFBvc3RtYW4uXG5cdFx0fVxuXHRcdHJldHVybiB7IGNsaWVudF9pZDogZXhpc3RpbmcuY2xpZW50X2lkLCByZXVzZWQ6IHRydWUgfTtcblx0fVxuXHR0cnkge1xuXHRcdHJldHVybiB7IC4uLmNyZWF0ZVNwYUFwcChuYW1lLCBjYWxsYmFja1VybHMpLCByZXVzZWQ6IGZhbHNlIH07XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGlmIChpc0F1dGgwRW50aXR5TGltaXRFcnJvcihlcnIpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoZm9ybWF0U3BhRW50aXR5TGltaXRFcnJvcihuYW1lLCBhcHBzKSk7XG5cdFx0fVxuXHRcdHRocm93IGVycjtcblx0fVxufVxuXG50eXBlIEF1dGgwQ29ubmVjdGlvbiA9IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzdHJhdGVneTogc3RyaW5nIH07XG5cbi8qKiBFbmFibGUgYSBkYXRhYmFzZSBjb25uZWN0aW9uIGZvciBhbiBhcHBsaWNhdGlvbiAocmVxdWlyZWQgZm9yIHVzZXJuYW1lL3Bhc3N3b3JkIGxvZ2luKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVDb25uZWN0aW9uRm9yQ2xpZW50KGNvbm5lY3Rpb25OYW1lOiBzdHJpbmcsIGNsaWVudElkOiBzdHJpbmcpOiB2b2lkIHtcblx0Y29uc3QgbGlzdE91dCA9IHJ1bkF1dGgwKFtcImFwaVwiLCBcImdldFwiLCBcImNvbm5lY3Rpb25zXCIsIFwiLS1uby1pbnB1dFwiXSk7XG5cdGNvbnN0IGNvbm5lY3Rpb25zID0gcGFyc2VKc29uT3V0cHV0PEF1dGgwQ29ubmVjdGlvbltdPihsaXN0T3V0KTtcblx0Y29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gY29ubmVjdGlvbk5hbWUpO1xuXHRpZiAoIWNvbm5lY3Rpb24pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEF1dGgwIGNvbm5lY3Rpb24gbm90IGZvdW5kOiAke2Nvbm5lY3Rpb25OYW1lfWApO1xuXHR9XG5cblx0Y29uc3QgY2xpZW50c091dCA9IHJ1bkF1dGgwKFtcblx0XHRcImFwaVwiLFxuXHRcdFwiZ2V0XCIsXG5cdFx0YGNvbm5lY3Rpb25zLyR7Y29ubmVjdGlvbi5pZH0vY2xpZW50c2AsXG5cdFx0XCItLW5vLWlucHV0XCIsXG5cdF0pO1xuXHRjb25zdCB7IGNsaWVudHMgfSA9IHBhcnNlSnNvbk91dHB1dDx7IGNsaWVudHM6IEFycmF5PHsgY2xpZW50X2lkOiBzdHJpbmcgfT4gfT4oY2xpZW50c091dCk7XG5cdGlmIChjbGllbnRzLnNvbWUoKGMpID0+IGMuY2xpZW50X2lkID09PSBjbGllbnRJZCkpIHJldHVybjtcblxuXHQvLyBEZWRpY2F0ZWQgZW5hYmxlZC1jbGllbnRzIGVuZHBvaW50IChlbmFibGVkX2NsaWVudHMgb24gY29ubmVjdGlvbiBQQVRDSCBpcyBkZXByZWNhdGVkKS5cblx0cnVuQXV0aDAoW1xuXHRcdFwiYXBpXCIsXG5cdFx0XCJwYXRjaFwiLFxuXHRcdGBjb25uZWN0aW9ucy8ke2Nvbm5lY3Rpb24uaWR9L2NsaWVudHNgLFxuXHRcdFwiLS1kYXRhXCIsXG5cdFx0SlNPTi5zdHJpbmdpZnkoW3sgY2xpZW50X2lkOiBjbGllbnRJZCwgc3RhdHVzOiB0cnVlIH1dKSxcblx0XHRcIi0tbm8taW5wdXRcIixcblx0XSk7XG59XG5cbmV4cG9ydCB0eXBlIEFkbWluRGF0YWJhc2VVc2VyID0ge1xuXHR1c2VyX2lkOiBzdHJpbmc7XG5cdGVtYWlsOiBzdHJpbmc7XG5cdHBhc3N3b3JkOiBzdHJpbmc7XG5cdHVzZXJuYW1lOiBzdHJpbmc7XG59O1xuXG4vKiogU3Ryb25nIGRlZmF1bHQgcGFzc3dvcmQgd2hlbiB0aGUgc2NhZmZvbGRlciBjYWxsZXIgbGVhdmVzIHBhc3N3b3JkIGJsYW5rLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWRtaW5QYXNzd29yZCgpOiBzdHJpbmcge1xuXHRyZXR1cm4gYCR7cmFuZG9tQnl0ZXMoMTIpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpfWFBMSFgO1xufVxuXG5mdW5jdGlvbiBpc1VzZXJBbHJlYWR5RXhpc3RzRXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG5cdGNvbnN0IHRleHQgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG5cdHJldHVybiAvYWxyZWFkeSBleGlzdHN8dXNlciBleGlzdHN8Q29uZmxpY3R8NDA5L2kudGVzdCh0ZXh0KTtcbn1cblxuLyoqIExvb2sgdXAgYSB1c2VyIGJ5IGVtYWlsIChNYW5hZ2VtZW50IEFQSSB1c2Vycy1ieS1lbWFpbCkuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFVzZXJCeUVtYWlsKGVtYWlsOiBzdHJpbmcpOiB7IHVzZXJfaWQ6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9IHwgbnVsbCB7XG5cdGNvbnN0IG91dCA9IHJ1bkF1dGgwKFtcblx0XHRcImFwaVwiLFxuXHRcdFwiZ2V0XCIsXG5cdFx0YHVzZXJzLWJ5LWVtYWlsP2VtYWlsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGVtYWlsKX1gLFxuXHRcdFwiLS1uby1pbnB1dFwiLFxuXHRdKTtcblx0Y29uc3QgdXNlcnMgPSBwYXJzZUpzb25PdXRwdXQ8QXJyYXk8eyB1c2VyX2lkPzogc3RyaW5nOyBlbWFpbD86IHN0cmluZyB9Pj4ob3V0KTtcblx0Y29uc3QgdXNlciA9IHVzZXJzLmZpbmQoKHUpID0+IHUudXNlcl9pZCAmJiB1LmVtYWlsKTtcblx0aWYgKCF1c2VyPy51c2VyX2lkIHx8ICF1c2VyLmVtYWlsKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIHsgdXNlcl9pZDogdXNlci51c2VyX2lkLCBlbWFpbDogdXNlci5lbWFpbCB9O1xufVxuXG4vKiogUmVzZXQgcGFzc3dvcmQgc28gYSByZS1zY2FmZm9sZCBjYW4gd3JpdGUgYSBrbm93biBwYXNzd29yZCB0byAuZW52LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVVzZXJQYXNzd29yZCh1c2VySWQ6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IHZvaWQge1xuXHRydW5BdXRoMChbXG5cdFx0XCJhcGlcIixcblx0XHRcInBhdGNoXCIsXG5cdFx0YHVzZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHVzZXJJZCl9YCxcblx0XHRcIi0tZGF0YVwiLFxuXHRcdEpTT04uc3RyaW5naWZ5KHsgcGFzc3dvcmQsIGNvbm5lY3Rpb246IERCX0NPTk5FQ1RJT05fTkFNRSB9KSxcblx0XHRcIi0tbm8taW5wdXRcIixcblx0XSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgREIgY29ubmVjdGlvbiByb290LWFkbWluIHVzZXIgZm9yIGxvY2FsIC8gUG9zdG1hbiBsb2dpbi5cbiAqIElmIHRoZSB1c2VyIGFscmVhZHkgZXhpc3RzLCBsb29rIHRoZW0gdXAsIHJlc2V0IHBhc3N3b3JkIHRvIGBpbnB1dC5wYXNzd29yZGAsXG4gKiBhbmQgcmV0dXJuIHRoYXQgaWRlbnRpdHkgc28gY2FsbGVycyBjYW4gc3RpbGwgd3JpdGUgLmVudiBjcmVkZW50aWFscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFkbWluRGF0YWJhc2VVc2VyKGlucHV0OiB7XG5cdGVtYWlsOiBzdHJpbmc7XG5cdHBhc3N3b3JkOiBzdHJpbmc7XG5cdHVzZXJuYW1lOiBzdHJpbmc7XG59KTogQWRtaW5EYXRhYmFzZVVzZXIge1xuXHRjb25zdCBib2R5ID0ge1xuXHRcdGVtYWlsOiBpbnB1dC5lbWFpbCxcblx0XHRjb25uZWN0aW9uOiBEQl9DT05ORUNUSU9OX05BTUUsXG5cdFx0cGFzc3dvcmQ6IGlucHV0LnBhc3N3b3JkLFxuXHRcdG5hbWU6IGlucHV0LnVzZXJuYW1lLFxuXHRcdGVtYWlsX3ZlcmlmaWVkOiB0cnVlLFxuXHRcdHZlcmlmeV9lbWFpbDogZmFsc2UsXG5cdFx0YXBwX21ldGFkYXRhOiB7IHJvbGVzOiBbXCJhZG1pblwiXSB9LFxuXHR9O1xuXG5cdHRyeSB7XG5cdFx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1xuXHRcdFx0XCJhcGlcIixcblx0XHRcdFwicG9zdFwiLFxuXHRcdFx0XCJ1c2Vyc1wiLFxuXHRcdFx0XCItLWRhdGFcIixcblx0XHRcdEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuXHRcdFx0XCItLW5vLWlucHV0XCIsXG5cdFx0XSk7XG5cdFx0Y29uc3QgdXNlciA9IHBhcnNlSnNvbk91dHB1dDx7IHVzZXJfaWQ/OiBzdHJpbmc7IGVtYWlsPzogc3RyaW5nIH0+KG91dCk7XG5cdFx0aWYgKCF1c2VyLnVzZXJfaWQgfHwgIXVzZXIuZW1haWwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YEF1dGgwIGNyZWF0ZSB1c2VyIHJlc3BvbnNlIG1pc3NpbmcgdXNlcl9pZC9lbWFpbC4gc3Rkb3V0OiAke291dC5zbGljZSgwLCAzMDApfWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0dXNlcl9pZDogdXNlci51c2VyX2lkLFxuXHRcdFx0ZW1haWw6IHVzZXIuZW1haWwsXG5cdFx0XHRwYXNzd29yZDogaW5wdXQucGFzc3dvcmQsXG5cdFx0XHR1c2VybmFtZTogaW5wdXQudXNlcm5hbWUsXG5cdFx0fTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0aWYgKCFpc1VzZXJBbHJlYWR5RXhpc3RzRXJyb3IoZXJyKSkgdGhyb3cgZXJyO1xuXG5cdFx0Y29uc3QgZXhpc3RpbmcgPSBmaW5kVXNlckJ5RW1haWwoaW5wdXQuZW1haWwpO1xuXHRcdGlmICghZXhpc3RpbmcpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YEF1dGgwIHVzZXIgYWxyZWFkeSBleGlzdHMgZm9yICR7aW5wdXQuZW1haWx9LCBidXQgbG9va3VwIGJ5IGVtYWlsIHJldHVybmVkIG5vIHVzZXIuYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0dXBkYXRlVXNlclBhc3N3b3JkKGV4aXN0aW5nLnVzZXJfaWQsIGlucHV0LnBhc3N3b3JkKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dXNlcl9pZDogZXhpc3RpbmcudXNlcl9pZCxcblx0XHRcdGVtYWlsOiBleGlzdGluZy5lbWFpbCxcblx0XHRcdHBhc3N3b3JkOiBpbnB1dC5wYXNzd29yZCxcblx0XHRcdHVzZXJuYW1lOiBpbnB1dC51c2VybmFtZSxcblx0XHR9O1xuXHR9XG59XG5cbmV4cG9ydCB7IFJFUVVJUkVEX1NDT1BFUyB9O1xuIl0sIm5hbWVzIjpbImV4ZWNGaWxlU3luYyIsInNwYXduU3luYyIsInJhbmRvbUJ5dGVzIiwiUkVRVUlSRURfU0NPUEVTIiwiam9pbiIsIkFQSV9USU1FT1VUX01TIiwiSEVMTE9fQVBJX1NDT1BFUyIsIkRCX0NPTk5FQ1RJT05fTkFNRSIsIkF1dGgwQXV0aEVycm9yIiwiRXJyb3IiLCJtZXNzYWdlIiwibmFtZSIsImlzQXV0aEVycm9yIiwidGV4dCIsImluY2x1ZGVzIiwicGFyc2VKc29uT3V0cHV0Iiwic3Rkb3V0Iiwic3RhcnQiLCJpbmRleE9mIiwiYXJyYXlTdGFydCIsImlkeCIsIk1hdGgiLCJtaW4iLCJzbGljZSIsIkpTT04iLCJwYXJzZSIsInJ1bkF1dGgwIiwiYXJncyIsInJlc3VsdCIsImVuY29kaW5nIiwidGltZW91dCIsImlucHV0Iiwic3RkaW8iLCJlcnJvciIsIm1zZyIsImNvZGUiLCJzdGF0dXMiLCJzdGRlcnIiLCJpc0luc3RhbGxlZCIsImxpc3RUZW5hbnRzIiwib3V0IiwibG9naW4iLCJsaXN0QXBpcyIsImVyciIsImNyZWF0ZUFwaSIsImlkZW50aWZpZXIiLCJzY29wZXMiLCJsaXN0QXBpU2NvcGVzIiwiYXBpIiwibWFwIiwic2NvcGUiLCJ2YWx1ZSIsImZpbHRlciIsImxlbmd0aCIsImFzc2lnblVzZXJQZXJtaXNzaW9ucyIsInVzZXJJZCIsImF1ZGllbmNlIiwicGVybWlzc2lvbnMiLCJlbmNvZGVVUklDb21wb25lbnQiLCJzdHJpbmdpZnkiLCJwZXJtaXNzaW9uX25hbWUiLCJyZXNvdXJjZV9zZXJ2ZXJfaWRlbnRpZmllciIsInVwZGF0ZUFwaVNjb3BlcyIsImlzQXV0aDBFbnRpdHlMaW1pdEVycm9yIiwiU3RyaW5nIiwidGVzdCIsImZvcm1hdFNwYUVudGl0eUxpbWl0RXJyb3IiLCJhcHBOYW1lIiwiYXBwcyIsImxpc3RlZCIsImEiLCJjbGllbnRfaWQiLCJjcmVhdGVTcGFBcHAiLCJjYWxsYmFja1VybHMiLCJjYWxsYmFja3MiLCJhcHAiLCJjbGllbnRJZCIsImxpc3RBcHBzIiwidXBkYXRlU3BhQ2FsbGJhY2tzIiwiZW5zdXJlU3BhQXBwIiwiZXhpc3RpbmciLCJmaW5kIiwicmV1c2VkIiwiZW5hYmxlQ29ubmVjdGlvbkZvckNsaWVudCIsImNvbm5lY3Rpb25OYW1lIiwibGlzdE91dCIsImNvbm5lY3Rpb25zIiwiY29ubmVjdGlvbiIsImMiLCJjbGllbnRzT3V0IiwiaWQiLCJjbGllbnRzIiwic29tZSIsImdlbmVyYXRlQWRtaW5QYXNzd29yZCIsInRvU3RyaW5nIiwiaXNVc2VyQWxyZWFkeUV4aXN0c0Vycm9yIiwiZmluZFVzZXJCeUVtYWlsIiwiZW1haWwiLCJ1c2VycyIsInVzZXIiLCJ1IiwidXNlcl9pZCIsInVwZGF0ZVVzZXJQYXNzd29yZCIsInBhc3N3b3JkIiwiY3JlYXRlQWRtaW5EYXRhYmFzZVVzZXIiLCJib2R5IiwidXNlcm5hbWUiLCJlbWFpbF92ZXJpZmllZCIsInZlcmlmeV9lbWFpbCIsImFwcF9tZXRhZGF0YSIsInJvbGVzIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxZQUFZLEVBQUVDLFNBQVMsUUFBUSxxQkFBcUI7QUFDN0QsU0FBU0MsV0FBVyxRQUFRLGNBQWM7QUFFMUMsNkVBQTZFLEdBQzdFLE1BQU1DLGtCQUFrQjtJQUN2QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0NBQ0EsQ0FBQ0MsSUFBSSxDQUFDO0FBRVAsMEZBQTBGLEdBQzFGLE1BQU1DLGlCQUFpQjtBQUV2QixpRUFBaUUsR0FDakUsT0FBTyxNQUFNQyxtQkFBbUI7SUFDL0I7SUFDQTtJQUNBO0lBQ0E7Q0FDQSxDQUFVO0FBRVgsT0FBTyxNQUFNQyxxQkFBcUIsbUNBQW1DO0FBRXJFLE9BQU8sTUFBTUMsdUJBQXVCQztJQUNuQyxZQUFtQkMsT0FBZSxDQUFFO1FBQ25DLEtBQUssQ0FBQ0E7UUFDTixJQUFJLENBQUNDLElBQUksR0FBRztJQUNiO0FBQ0Q7QUFFQSxtRkFBbUYsR0FDbkYsU0FBU0MsWUFBWUMsSUFBWTtJQUNoQyxPQUNDQSxLQUFLQyxRQUFRLENBQUMseUJBQ2RELEtBQUtDLFFBQVEsQ0FBQyxhQUNkRCxLQUFLQyxRQUFRLENBQUM7QUFFaEI7QUFFQSw4Q0FBOEMsR0FDOUMsU0FBU0MsZ0JBQW1CQyxNQUFjO0lBQ3pDLE1BQU1DLFFBQVFELE9BQU9FLE9BQU8sQ0FBQztJQUM3QixNQUFNQyxhQUFhSCxPQUFPRSxPQUFPLENBQUM7SUFDbEMsSUFBSUUs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
|
|
@@ -43,7 +43,7 @@ import { apiNameFromProjectDir, listExistingApiNames } from "./api-name.js";
|
|
|
43
43
|
lines.push("## Deploy", "", "PaaS hosts (`docker build` from the repo root) use the scaffolded `Dockerfile`.", "The runtime image installs production dependencies only (`pnpm install --prod`);", "Forge, TypeScript, Biome, and Vitest stay in the build stage.", "", "```bash", `docker build -t ${projectName} .`, "```", "", "Extra APIs: `docker build -f Dockerfile.<name> .`", "");
|
|
44
44
|
lines.push("## Add another API", "", "```bash", "decohere add api <name>", "```", "", "Example: `decohere add api billing`", "");
|
|
45
45
|
if (hasAuth0) {
|
|
46
|
-
lines.push("## Auth0", "", "JWT auth is wired from `.env` (`AUTH0_ISSUER_BASE_URL`, `AUTH0_AUDIENCE`).",
|
|
46
|
+
lines.push("## Auth0", "", "JWT auth is wired from `.env` (`AUTH0_ISSUER_BASE_URL`, `AUTH0_AUDIENCE`).", 'After you add a controller, `@Authorize("read", "Invoice")` becomes the Auth0 permission `read:Invoice`.', "Sync the Auth0 API, admin grants, and Postman token scopes without re-scaffolding:", "", "```bash", "npx @decohere/create auth0 login # once / when the CLI token expires", "npx @decohere/create auth0 configure # after new @Authorize decorators", "```", "");
|
|
47
47
|
}
|
|
48
48
|
if (hasPostman) {
|
|
49
49
|
lines.push("## Postman", "", "Open this **project root** in Postman Local View (Files → Open folder), not the `postman/` subfolder.", "Select the Local environment, then Authorization → Get New Access Token when Auth0 is enabled.", "");
|
|
@@ -86,4 +86,4 @@ function mergeApiNames(existing, added) {
|
|
|
86
86
|
];
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy93ZWJhcGkvd29ya3NwYWNlLXJlYWRtZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4uL21vZGVscy9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnZGaWxlIH0gZnJvbSBcIi4uL21vZGVscy9lbnYtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gXCIuLi9tb2RlbHMvcGFja2FnZS1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBhcGlOYW1lRnJvbVByb2plY3REaXIsIGxpc3RFeGlzdGluZ0FwaU5hbWVzIH0gZnJvbSBcIi4vYXBpLW5hbWUuanNcIjtcblxuZXhwb3J0IHR5cGUgV29ya3NwYWNlUmVhZG1lT3B0aW9ucyA9IHtcblx0YWRkPzogYm9vbGVhbjtcblx0ZGF0YWJhc2VQcm92aWRlcj86IFwibm9uZVwiIHwgXCJwb3N0Z3Jlcy90eXBlb3JtXCI7XG5cdGF1dGhQcm92aWRlcj86IFwiYXV0aDBcIiB8IFwibm9uZVwiO1xuXHRwb3N0bWFuUHJvdmlkZXI/OiBcImFwaVwiIHwgXCJsb2NhbFwiIHwgXCJub25lXCI7XG59O1xuXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VSZWFkbWVJbnB1dCA9IHtcblx0cHJvamVjdE5hbWU6IHN0cmluZztcblx0YXBpTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHRoYXNQb3N0Z3JlczogYm9vbGVhbjtcblx0aGFzQXV0aDA6IGJvb2xlYW47XG5cdGhhc1Bvc3RtYW46IGJvb2xlYW47XG59O1xuXG4vKiogUHVyZSByZW5kZXJlciDigJQga2VlcCBmZWF0dXJlIHNlY3Rpb25zIHNob3J0IGFuZCBjb3B5LXBhc3RlIHJlYWR5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcldvcmtzcGFjZVJlYWRtZShpbnB1dDogV29ya3NwYWNlUmVhZG1lSW5wdXQpOiBzdHJpbmcge1xuXHRjb25zdCB7IHByb2plY3ROYW1lLCBhcGlOYW1lcywgaGFzUG9zdGdyZXMsIGhhc0F1dGgwLCBoYXNQb3N0bWFuIH0gPSBpbnB1dDtcblx0Y29uc3QgYXBpcyA9IGFwaU5hbWVzLmxlbmd0aCA+IDAgPyBhcGlOYW1lcyA6IFtcImFwaVwiXTtcblx0Y29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuXHRcdGAjICR7cHJvamVjdE5hbWV9YCxcblx0XHRcIlwiLFxuXHRcdFwiRGVjb2hlcmUgd2ViIEFQSSB3b3Jrc3BhY2UuIFNjYWZmb2xkZWQgd2l0aCBbYEBkZWNvaGVyZS9jcmVhdGVgXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9AZGVjb2hlcmUvY3JlYXRlKS5cIixcblx0XHRcIlwiLFxuXHRcdFwiIyMgR2V0IHN0YXJ0ZWRcIixcblx0XHRcIlwiLFxuXHRcdFwiMS4gT3BlbiB0aGlzIGZvbGRlciBpbiBWUyBDb2RlIC8gQ3Vyc29yLlwiLFxuXHRcdFwiMi4gKipSZW9wZW4gaW4gQ29udGFpbmVyKiogKG9yIHJlYnVpbGQgdGhlIERldiBDb250YWluZXIpLlwiLFxuXHRcdFwiICAgSG9zdCBgaW5pdGlhbGl6ZS5zaGAgYW5kIGNvbnRhaW5lciBgcG9zdC1zdGFydC5zaGAgYXNrIHkvTiAoVFRZIG9ubHkpIGJlZm9yZSBucG0gYXV0aCBvciBjb2RlYmFzZSBSQUcgTUNQLlwiLFxuXHRcdFwiICAgU2tpcCBvciBkZWNsaW5lOyBtaXNzaW5nIFRUWSBza2lwcy4gUkFHIGNyZWRlbnRpYWxzIGxhbmQgaW4gYC5jdXJzb3IvYCAoZ2l0aWdub3JlZCkuXCIsXG5cdFx0XCIzLiBJbnN0YWxsIGRlcGVuZGVuY2llcyBpZiBuZWVkZWQ6XCIsXG5cdFx0XCJcIixcblx0XHRcImBgYGJhc2hcIixcblx0XHRcInBucG0gaW5zdGFsbFwiLFxuXHRcdFwiYGBgXCIsXG5cdFx0XCJcIixcblx0XHRcIiMjIERldmVsb3BcIixcblx0XHRcIlwiLFxuXHRcdFwiYGBgYmFzaFwiLFxuXHRcdFwicG5wbSBkZXYgICAgICAgICAgICAgICMgRmx1eCBITVIgKGZpcnN0IEFQSSlcIixcblx0XHRcInBucG0gc3RhcnQgICAgICAgICAgICAjIHJ1biB0aGUgY29tcGlsZWQgZmlyc3QgQVBJXCIsXG5cdFx0XCJwbnBtIHJ1biBidWlsZCAgICAgICAgIyBmb3JnZSByZWxlYXNlIGJ1aWxkXCIsXG5cdF07XG5cblx0Zm9yIChjb25zdCBuYW1lIG9mIGFwaXMpIHtcblx0XHRsaW5lcy5wdXNoKGBwbnBtIHJ1biBkZXY6JHtuYW1lfSAgICAgIyBITVIgZm9yICR7bmFtZX1gKTtcblx0XHRsaW5lcy5wdXNoKGBwbnBtIHJ1biBzdGFydDoke25hbWV9ICAgIyBwcm9kdWN0aW9uIGVudHJ5IGZvciAke25hbWV9YCk7XG5cdH1cblxuXHRsaW5lcy5wdXNoKFwiYGBgXCIsIFwiXCIpO1xuXG5cdGxpbmVzLnB1c2goXG5cdFx0XCIjIyBMb2dnaW5nXCIsXG5cdFx0XCJcIixcblx0XHRcIkluIGRldmVsb3BtZW50LCBTY3JpYmUgdXNlcyBwaW5vLXByZXR0eSBhbmQgcm9sbGluZyBmaWxlcyB1bmRlciBgbG9ncy9gIChnaXRpZ25vcmVkKS5cIixcblx0XHRcIldoZW4gYE5PREVfRU5WPXByb2R1Y3Rpb25gLCB0aGUgcHJvY2VzcyB3cml0ZXMgc3RydWN0dXJlZCBKU09OIHRvIHN0ZG91dCBhbmQgZG9lcyBub3Qgcm90YXRlIGZpbGVzLlwiLFxuXHRcdFwiU2hpcCBhbmQgcmV0YWluIHRob3NlIHN0cmVhbXMgb3V0c2lkZSB0aGUgYXBwIChwbGF0Zm9ybSBsb2dzLCBhIHNpZGVjYXIsIG9yIGEgbG9nIGFnZW50KSBzbyBzaGlwcGluZyBjYW4gY2hhbmdlIHdpdGhvdXQgcmVidWlsZGluZy5cIixcblx0XHRcIlwiLFxuXHRcdFwiT3ZlcnJpZGUgcm9sbCBwYXRoIGFuZCByb3RhdGlvbiB3aXRob3V0IGNoYW5naW5nIGFwcCBjb2RlOlwiLFxuXHRcdFwiYFNDUklCRV9MT0dfRklMRWAsIGBTQ1JJQkVfTE9HX1NJWkVgLCBgU0NSSUJFX0xPR19GUkVRVUVOQ1lgLCBgU0NSSUJFX0xPR19LRUVQYC5cIixcblx0XHRcIlwiLFxuXHRcdCdPcHQgaW50byBpbi1wcm9jZXNzIHByZXR0eSBvciByb2xsIGluIHByb2R1Y3Rpb24gb25seSB3aXRoIGB7IHdoZW46IFwiYWx3YXlzXCIgfWAgb24gYHNjcmliZS53aXRoUGlub1ByZXR0eWAgLyBgc2NyaWJlLndpdGhQaW5vUm9sbGAuJyxcblx0XHRcIlwiLFxuXHQpO1xuXG5cdGlmIChoYXNQb3N0Z3Jlcykge1xuXHRcdGxpbmVzLnB1c2goXG5cdFx0XHRcIiMjIERhdGFiYXNlXCIsXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJQb3N0Z3JlcyBydW5zIHZpYSBEZXYgQ29udGFpbmVyIENvbXBvc2U6XCIsXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJgYGBiYXNoXCIsXG5cdFx0XHRcInBucG0gZGI6dXBcIixcblx0XHRcdFwicG5wbSBkYjpkb3duXCIsXG5cdFx0XHRcInBucG0gZGI6cmVzZXRcIixcblx0XHRcdFwiYGBgXCIsXG5cdFx0XHRcIlwiLFxuXHRcdCk7XG5cdH1cblxuXHRsaW5lcy5wdXNoKFxuXHRcdFwiIyMgRGVwbG95XCIsXG5cdFx0XCJcIixcblx0XHRcIlBhYVMgaG9zdHMgKGBkb2NrZXIgYnVpbGRgIGZyb20gdGhlIHJlcG8gcm9vdCkgdXNlIHRoZSBzY2FmZm9sZGVkIGBEb2NrZXJmaWxlYC5cIixcblx0XHRcIlRoZSBydW50aW1lIGltYWdlIGluc3RhbGxzIHByb2R1Y3Rpb24gZGVwZW5kZW5jaWVzIG9ubHkgKGBwbnBtIGluc3RhbGwgLS1wcm9kYCk7XCIsXG5cdFx0XCJGb3JnZSwgVHlwZVNjcmlwdCwgQmlvbWUsIGFuZCBWaXRlc3Qgc3RheSBpbiB0aGUgYnVpbGQgc3RhZ2UuXCIsXG5cdFx0XCJcIixcblx0XHRcImBgYGJhc2hcIixcblx0XHRgZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdE5hbWV9IC5gLFxuXHRcdFwiYGBgXCIsXG5cdFx0XCJcIixcblx0XHRcIkV4dHJhIEFQSXM6IGBkb2NrZXIgYnVpbGQgLWYgRG9ja2VyZmlsZS48bmFtZT4gLmBcIixcblx0XHRcIlwiLFxuXHQpO1xuXG5cdGxpbmVzLnB1c2goXG5cdFx0XCIjIyBBZGQgYW5vdGhlciBBUElcIixcblx0XHRcIlwiLFxuXHRcdFwiYGBgYmFzaFwiLFxuXHRcdFwiZGVjb2hlcmUgYWRkIGFwaSA8bmFtZT5cIixcblx0XHRcImBgYFwiLFxuXHRcdFwiXCIsXG5cdFx0XCJFeGFtcGxlOiBgZGVjb2hlcmUgYWRkIGFwaSBiaWxsaW5nYFwiLFxuXHRcdFwiXCIsXG5cdCk7XG5cblx0aWYgKGhhc0F1dGgwKSB7XG5cdFx0bGluZXMucHVzaChcblx0XHRcdFwiIyMgQXV0aDBcIixcblx0XHRcdFwiXCIsXG5cdFx0XHRcIkpXVCBhdXRoIGlzIHdpcmVkIGZyb20gYC5lbnZgIChgQVVUSDBfSVNTVUVSX0JBU0VfVVJMYCwgYEFVVEgwX0FVRElFTkNFYCkuXCIsXG5cdFx0XHRcIlNldCB0aG9zZSB2YWx1ZXMgKG9yIHJlLXJ1biBzY2FmZm9sZCB3aXRoIGAtLWF1dGggYXV0aDBgKSBiZWZvcmUgY2FsbGluZyBwcm90ZWN0ZWQgcm91dGVzLlwiLFxuXHRcdFx0XCJcIixcblx0XHQpO1xuXHR9XG5cblx0aWYgKGhhc1Bvc3RtYW4pIHtcblx0XHRsaW5lcy5wdXNoKFxuXHRcdFx0XCIjIyBQb3N0bWFuXCIsXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJPcGVuIHRoaXMgKipwcm9qZWN0IHJvb3QqKiBpbiBQb3N0bWFuIExvY2FsIFZpZXcgKEZpbGVzIOKGkiBPcGVuIGZvbGRlciksIG5vdCB0aGUgYHBvc3RtYW4vYCBzdWJmb2xkZXIuXCIsXG5cdFx0XHRcIlNlbGVjdCB0aGUgTG9jYWwgZW52aXJvbm1lbnQsIHRoZW4gQXV0aG9yaXphdGlvbiDihpIgR2V0IE5ldyBBY2Nlc3MgVG9rZW4gd2hlbiBBdXRoMCBpcyBlbmFibGVkLlwiLFxuXHRcdFx0XCJcIixcblx0XHQpO1xuXHR9XG5cblx0bGluZXMucHVzaChcblx0XHRcIiMjIE1vcmVcIixcblx0XHRcIlwiLFxuXHRcdFwiLSBQYWNrYWdlIGRvY3M6IGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0BkZWNvaGVyZS9jcmVhdGVcIixcblx0XHRcIi0gQWZ0ZXIgYGRlY29oZXJlIGFkZCBhcGlgLCB0aGlzIFJFQURNRSBpcyByZWZyZXNoZWQgc28gc2NyaXB0cyBhbmQgQVBJcyBzdGF5IGFjY3VyYXRlLlwiLFxuXHRcdFwiXCIsXG5cdCk7XG5cblx0cmV0dXJuIGAke2xpbmVzLmpvaW4oXCJcXG5cIil9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VSZWFkbWVJbnB1dChcblx0d29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0b3B0aW9uczogV29ya3NwYWNlUmVhZG1lT3B0aW9ucyxcbik6IFdvcmtzcGFjZVJlYWRtZUlucHV0IHtcblx0Y29uc3QgbmV3TmFtZXMgPSB3b3Jrc3BhY2Vcblx0XHQuZ2V0UHJvamVjdHMoKVxuXHRcdC5tYXAoKHByb2plY3QpID0+IGFwaU5hbWVGcm9tUHJvamVjdERpcihwcm9qZWN0LmRpcikpO1xuXHRjb25zdCBhcGlOYW1lcyA9IG9wdGlvbnMuYWRkXG5cdFx0PyBtZXJnZUFwaU5hbWVzKGxpc3RFeGlzdGluZ0FwaU5hbWVzKHdvcmtzcGFjZS50YXJnZXREaXIpLCBuZXdOYW1lcylcblx0XHQ6IG5ld05hbWVzO1xuXG5cdGNvbnN0IHBrZyA9IHdvcmtzcGFjZS5nZXRNb2RlbDxQYWNrYWdlSnNvbj4oV0VMTF9LTk9XTl9GSUxFUy5QQUNLQUdFX0pTT04pO1xuXHRjb25zdCBlbnYgPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8RW52RmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5FTlZfRklMRSk7XG5cblx0Y29uc3QgaGFzUG9zdGdyZXMgPVxuXHRcdG9wdGlvbnMuZGF0YWJhc2VQcm92aWRlciA9PT0gXCJwb3N0Z3Jlcy90eXBlb3JtXCIgfHwgQm9vbGVhbihwa2c/Lmhhc1NjcmlwdChcImRiOnVwXCIpKTtcblx0Y29uc3QgaGFzQXV0aDAgPVxuXHRcdG9wdGlvbnMuYXV0aFByb3ZpZGVyID09PSBcImF1dGgwXCIgfHwgQm9vbGVhbihlbnY/Lmhhc0VudHJ5KFwiQVVUSDBfSVNTVUVSX0JBU0VfVVJMXCIpKTtcblx0Y29uc3QgaGFzUG9zdG1hbiA9XG5cdFx0b3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwibG9jYWxcIiB8fFxuXHRcdG9wdGlvbnMucG9zdG1hblByb3ZpZGVyID09PSBcImFwaVwiIHx8XG5cdFx0ZXhpc3RzU3luYyhqb2luKHdvcmtzcGFjZS50YXJnZXREaXIsIFwicG9zdG1hblwiKSkgfHxcblx0XHRleGlzdHNTeW5jKGpvaW4od29ya3NwYWNlLnRhcmdldERpciwgXCIucG9zdG1hblwiKSk7XG5cblx0cmV0dXJuIHtcblx0XHRwcm9qZWN0TmFtZTogd29ya3NwYWNlLm5hbWUsXG5cdFx0YXBpTmFtZXMsXG5cdFx0aGFzUG9zdGdyZXMsXG5cdFx0aGFzQXV0aDAsXG5cdFx0aGFzUG9zdG1hbixcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlV29ya3NwYWNlUmVhZG1lKFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRvcHRpb25zOiBXb3Jrc3BhY2VSZWFkbWVPcHRpb25zLFxuKTogdm9pZCB7XG5cdGNvbnN0IGNvbnRlbnQgPSByZW5kZXJXb3Jrc3BhY2VSZWFkbWUocmVzb2x2ZVdvcmtzcGFjZVJlYWRtZUlucHV0KHdvcmtzcGFjZSwgb3B0aW9ucykpO1xuXHR3b3Jrc3BhY2UuYWRkRmlsZSh7XG5cdFx0ZmlsZXM6ICgpID0+IFt7IGZpbGVQYXRoOiBcIlJFQURNRS5tZFwiLCBjb250ZW50IH1dLFxuXHR9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VBcGlOYW1lcyhleGlzdGluZzogcmVhZG9ubHkgc3RyaW5nW10sIGFkZGVkOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0Y29uc3Qgc2VlbiA9IG5ldyBTZXQoZXhpc3RpbmcpO1xuXHRyZXR1cm4gWy4uLmV4aXN0aW5nLCAuLi5hZGRlZC5maWx0ZXIoKG5hbWUpID0+ICFzZWVuLmhhcyhuYW1lKSldO1xufVxuIl0sIm5hbWVzIjpbImV4aXN0c1N5bmMiLCJqb2luIiwiV0VMTF9LTk9XTl9GSUxFUyIsImFwaU5hbWVGcm9tUHJvamVjdERpciIsImxpc3RFeGlzdGluZ0FwaU5hbWVzIiwicmVuZGVyV29ya3NwYWNlUmVhZG1lIiwiaW5wdXQiLCJwcm9qZWN0TmFtZSIsImFwaU5hbWVzIiwiaGFzUG9zdGdyZXMiLCJoYXNBdXRoMCIsImhhc1Bvc3RtYW4iLCJhcGlzIiwibGVuZ3RoIiwibGluZXMiLCJuYW1lIiwicHVzaCIsInJlc29sdmVXb3Jrc3BhY2VSZWFkbWVJbnB1dCIsIndvcmtzcGFjZSIsIm9wdGlvbnMiLCJuZXdOYW1lcyIsImdldFByb2plY3RzIiwibWFwIiwicHJvamVjdCIsImRpciIsImFkZCIsIm1lcmdlQXBpTmFtZXMiLCJ0YXJnZXREaXIiLCJwa2ciLCJnZXRNb2RlbCIsIlBBQ0tBR0VfSlNPTiIsImVudiIsIkVOVl9GSUxFIiwiZGF0YWJhc2VQcm92aWRlciIsIkJvb2xlYW4iLCJoYXNTY3JpcHQiLCJhdXRoUHJvdmlkZXIiLCJoYXNFbnRyeSIsInBvc3RtYW5Qcm92aWRlciIsIndyaXRlV29ya3NwYWNlUmVhZG1lIiwiY29udGVudCIsImFkZEZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiZXhpc3RpbmciLCJhZGRlZCIsInNlZW4iLCJTZXQiLCJmaWx0ZXIiLCJoYXMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxVQUFV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
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy93ZWJhcGkvd29ya3NwYWNlLXJlYWRtZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4uL21vZGVscy9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnZGaWxlIH0gZnJvbSBcIi4uL21vZGVscy9lbnYtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gXCIuLi9tb2RlbHMvcGFja2FnZS1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBhcGlOYW1lRnJvbVByb2plY3REaXIsIGxpc3RFeGlzdGluZ0FwaU5hbWVzIH0gZnJvbSBcIi4vYXBpLW5hbWUuanNcIjtcblxuZXhwb3J0IHR5cGUgV29ya3NwYWNlUmVhZG1lT3B0aW9ucyA9IHtcblx0YWRkPzogYm9vbGVhbjtcblx0ZGF0YWJhc2VQcm92aWRlcj86IFwibm9uZVwiIHwgXCJwb3N0Z3Jlcy90eXBlb3JtXCI7XG5cdGF1dGhQcm92aWRlcj86IFwiYXV0aDBcIiB8IFwibm9uZVwiO1xuXHRwb3N0bWFuUHJvdmlkZXI/OiBcImFwaVwiIHwgXCJsb2NhbFwiIHwgXCJub25lXCI7XG59O1xuXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VSZWFkbWVJbnB1dCA9IHtcblx0cHJvamVjdE5hbWU6IHN0cmluZztcblx0YXBpTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHRoYXNQb3N0Z3JlczogYm9vbGVhbjtcblx0aGFzQXV0aDA6IGJvb2xlYW47XG5cdGhhc1Bvc3RtYW46IGJvb2xlYW47XG59O1xuXG4vKiogUHVyZSByZW5kZXJlciDigJQga2VlcCBmZWF0dXJlIHNlY3Rpb25zIHNob3J0IGFuZCBjb3B5LXBhc3RlIHJlYWR5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcldvcmtzcGFjZVJlYWRtZShpbnB1dDogV29ya3NwYWNlUmVhZG1lSW5wdXQpOiBzdHJpbmcge1xuXHRjb25zdCB7IHByb2plY3ROYW1lLCBhcGlOYW1lcywgaGFzUG9zdGdyZXMsIGhhc0F1dGgwLCBoYXNQb3N0bWFuIH0gPSBpbnB1dDtcblx0Y29uc3QgYXBpcyA9IGFwaU5hbWVzLmxlbmd0aCA+IDAgPyBhcGlOYW1lcyA6IFtcImFwaVwiXTtcblx0Y29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuXHRcdGAjICR7cHJvamVjdE5hbWV9YCxcblx0XHRcIlwiLFxuXHRcdFwiRGVjb2hlcmUgd2ViIEFQSSB3b3Jrc3BhY2UuIFNjYWZmb2xkZWQgd2l0aCBbYEBkZWNvaGVyZS9jcmVhdGVgXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9AZGVjb2hlcmUvY3JlYXRlKS5cIixcblx0XHRcIlwiLFxuXHRcdFwiIyMgR2V0IHN0YXJ0ZWRcIixcblx0XHRcIlwiLFxuXHRcdFwiMS4gT3BlbiB0aGlzIGZvbGRlciBpbiBWUyBDb2RlIC8gQ3Vyc29yLlwiLFxuXHRcdFwiMi4gKipSZW9wZW4gaW4gQ29udGFpbmVyKiogKG9yIHJlYnVpbGQgdGhlIERldiBDb250YWluZXIpLlwiLFxuXHRcdFwiICAgSG9zdCBgaW5pdGlhbGl6ZS5zaGAgYW5kIGNvbnRhaW5lciBgcG9zdC1zdGFydC5zaGAgYXNrIHkvTiAoVFRZIG9ubHkpIGJlZm9yZSBucG0gYXV0aCBvciBjb2RlYmFzZSBSQUcgTUNQLlwiLFxuXHRcdFwiICAgU2tpcCBvciBkZWNsaW5lOyBtaXNzaW5nIFRUWSBza2lwcy4gUkFHIGNyZWRlbnRpYWxzIGxhbmQgaW4gYC5jdXJzb3IvYCAoZ2l0aWdub3JlZCkuXCIsXG5cdFx0XCIzLiBJbnN0YWxsIGRlcGVuZGVuY2llcyBpZiBuZWVkZWQ6XCIsXG5cdFx0XCJcIixcblx0XHRcImBgYGJhc2hcIixcblx0XHRcInBucG0gaW5zdGFsbFwiLFxuXHRcdFwiYGBgXCIsXG5cdFx0XCJcIixcblx0XHRcIiMjIERldmVsb3BcIixcblx0XHRcIlwiLFxuXHRcdFwiYGBgYmFzaFwiLFxuXHRcdFwicG5wbSBkZXYgICAgICAgICAgICAgICMgRmx1eCBITVIgKGZpcnN0IEFQSSlcIixcblx0XHRcInBucG0gc3RhcnQgICAgICAgICAgICAjIHJ1biB0aGUgY29tcGlsZWQgZmlyc3QgQVBJXCIsXG5cdFx0XCJwbnBtIHJ1biBidWlsZCAgICAgICAgIyBmb3JnZSByZWxlYXNlIGJ1aWxkXCIsXG5cdF07XG5cblx0Zm9yIChjb25zdCBuYW1lIG9mIGFwaXMpIHtcblx0XHRsaW5lcy5wdXNoKGBwbnBtIHJ1biBkZXY6JHtuYW1lfSAgICAgIyBITVIgZm9yICR7bmFtZX1gKTtcblx0XHRsaW5lcy5wdXNoKGBwbnBtIHJ1biBzdGFydDoke25hbWV9ICAgIyBwcm9kdWN0aW9uIGVudHJ5IGZvciAke25hbWV9YCk7XG5cdH1cblxuXHRsaW5lcy5wdXNoKFwiYGBgXCIsIFwiXCIpO1xuXG5cdGxpbmVzLnB1c2goXG5cdFx0XCIjIyBMb2dnaW5nXCIsXG5cdFx0XCJcIixcblx0XHRcIkluIGRldmVsb3BtZW50LCBTY3JpYmUgdXNlcyBwaW5vLXByZXR0eSBhbmQgcm9sbGluZyBmaWxlcyB1bmRlciBgbG9ncy9gIChnaXRpZ25vcmVkKS5cIixcblx0XHRcIldoZW4gYE5PREVfRU5WPXByb2R1Y3Rpb25gLCB0aGUgcHJvY2VzcyB3cml0ZXMgc3RydWN0dXJlZCBKU09OIHRvIHN0ZG91dCBhbmQgZG9lcyBub3Qgcm90YXRlIGZpbGVzLlwiLFxuXHRcdFwiU2hpcCBhbmQgcmV0YWluIHRob3NlIHN0cmVhbXMgb3V0c2lkZSB0aGUgYXBwIChwbGF0Zm9ybSBsb2dzLCBhIHNpZGVjYXIsIG9yIGEgbG9nIGFnZW50KSBzbyBzaGlwcGluZyBjYW4gY2hhbmdlIHdpdGhvdXQgcmVidWlsZGluZy5cIixcblx0XHRcIlwiLFxuXHRcdFwiT3ZlcnJpZGUgcm9sbCBwYXRoIGFuZCByb3RhdGlvbiB3aXRob3V0IGNoYW5naW5nIGFwcCBjb2RlOlwiLFxuXHRcdFwiYFNDUklCRV9MT0dfRklMRWAsIGBTQ1JJQkVfTE9HX1NJWkVgLCBgU0NSSUJFX0xPR19GUkVRVUVOQ1lgLCBgU0NSSUJFX0xPR19LRUVQYC5cIixcblx0XHRcIlwiLFxuXHRcdCdPcHQgaW50byBpbi1wcm9jZXNzIHByZXR0eSBvciByb2xsIGluIHByb2R1Y3Rpb24gb25seSB3aXRoIGB7IHdoZW46IFwiYWx3YXlzXCIgfWAgb24gYHNjcmliZS53aXRoUGlub1ByZXR0eWAgLyBgc2NyaWJlLndpdGhQaW5vUm9sbGAuJyxcblx0XHRcIlwiLFxuXHQpO1xuXG5cdGlmIChoYXNQb3N0Z3Jlcykge1xuXHRcdGxpbmVzLnB1c2goXG5cdFx0XHRcIiMjIERhdGFiYXNlXCIsXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJQb3N0Z3JlcyBydW5zIHZpYSBEZXYgQ29udGFpbmVyIENvbXBvc2U6XCIsXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJgYGBiYXNoXCIsXG5cdFx0XHRcInBucG0gZGI6dXBcIixcblx0XHRcdFwicG5wbSBkYjpkb3duXCIsXG5cdFx0XHRcInBucG0gZGI6cmVzZXRcIixcblx0XHRcdFwiYGBgXCIsXG5cdFx0XHRcIlwiLFxuXHRcdCk7XG5cdH1cblxuXHRsaW5lcy5wdXNoKFxuXHRcdFwiIyMgRGVwbG95XCIsXG5cdFx0XCJcIixcblx0XHRcIlBhYVMgaG9zdHMgKGBkb2NrZXIgYnVpbGRgIGZyb20gdGhlIHJlcG8gcm9vdCkgdXNlIHRoZSBzY2FmZm9sZGVkIGBEb2NrZXJmaWxlYC5cIixcblx0XHRcIlRoZSBydW50aW1lIGltYWdlIGluc3RhbGxzIHByb2R1Y3Rpb24gZGVwZW5kZW5jaWVzIG9ubHkgKGBwbnBtIGluc3RhbGwgLS1wcm9kYCk7XCIsXG5cdFx0XCJGb3JnZSwgVHlwZVNjcmlwdCwgQmlvbWUsIGFuZCBWaXRlc3Qgc3RheSBpbiB0aGUgYnVpbGQgc3RhZ2UuXCIsXG5cdFx0XCJcIixcblx0XHRcImBgYGJhc2hcIixcblx0XHRgZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdE5hbWV9IC5gLFxuXHRcdFwiYGBgXCIsXG5cdFx0XCJcIixcblx0XHRcIkV4dHJhIEFQSXM6IGBkb2NrZXIgYnVpbGQgLWYgRG9ja2VyZmlsZS48bmFtZT4gLmBcIixcblx0XHRcIlwiLFxuXHQpO1xuXG5cdGxpbmVzLnB1c2goXG5cdFx0XCIjIyBBZGQgYW5vdGhlciBBUElcIixcblx0XHRcIlwiLFxuXHRcdFwiYGBgYmFzaFwiLFxuXHRcdFwiZGVjb2hlcmUgYWRkIGFwaSA8bmFtZT5cIixcblx0XHRcImBgYFwiLFxuXHRcdFwiXCIsXG5cdFx0XCJFeGFtcGxlOiBgZGVjb2hlcmUgYWRkIGFwaSBiaWxsaW5nYFwiLFxuXHRcdFwiXCIsXG5cdCk7XG5cblx0aWYgKGhhc0F1dGgwKSB7XG5cdFx0bGluZXMucHVzaChcblx0XHRcdFwiIyMgQXV0aDBcIixcblx0XHRcdFwiXCIsXG5cdFx0XHRcIkpXVCBhdXRoIGlzIHdpcmVkIGZyb20gYC5lbnZgIChgQVVUSDBfSVNTVUVSX0JBU0VfVVJMYCwgYEFVVEgwX0FVRElFTkNFYCkuXCIsXG5cdFx0XHQnQWZ0ZXIgeW91IGFkZCBhIGNvbnRyb2xsZXIsIGBAQXV0aG9yaXplKFwicmVhZFwiLCBcIkludm9pY2VcIilgIGJlY29tZXMgdGhlIEF1dGgwIHBlcm1pc3Npb24gYHJlYWQ6SW52b2ljZWAuJyxcblx0XHRcdFwiU3luYyB0aGUgQXV0aDAgQVBJLCBhZG1pbiBncmFudHMsIGFuZCBQb3N0bWFuIHRva2VuIHNjb3BlcyB3aXRob3V0IHJlLXNjYWZmb2xkaW5nOlwiLFxuXHRcdFx0XCJcIixcblx0XHRcdFwiYGBgYmFzaFwiLFxuXHRcdFx0XCJucHggQGRlY29oZXJlL2NyZWF0ZSBhdXRoMCBsb2dpbiAgICAgICMgb25jZSAvIHdoZW4gdGhlIENMSSB0b2tlbiBleHBpcmVzXCIsXG5cdFx0XHRcIm5weCBAZGVjb2hlcmUvY3JlYXRlIGF1dGgwIGNvbmZpZ3VyZSAgIyBhZnRlciBuZXcgQEF1dGhvcml6ZSBkZWNvcmF0b3JzXCIsXG5cdFx0XHRcImBgYFwiLFxuXHRcdFx0XCJcIixcblx0XHQpO1xuXHR9XG5cblx0aWYgKGhhc1Bvc3RtYW4pIHtcblx0XHRsaW5lcy5wdXNoKFxuXHRcdFx0XCIjIyBQb3N0bWFuXCIsXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJPcGVuIHRoaXMgKipwcm9qZWN0IHJvb3QqKiBpbiBQb3N0bWFuIExvY2FsIFZpZXcgKEZpbGVzIOKGkiBPcGVuIGZvbGRlciksIG5vdCB0aGUgYHBvc3RtYW4vYCBzdWJmb2xkZXIuXCIsXG5cdFx0XHRcIlNlbGVjdCB0aGUgTG9jYWwgZW52aXJvbm1lbnQsIHRoZW4gQXV0aG9yaXphdGlvbiDihpIgR2V0IE5ldyBBY2Nlc3MgVG9rZW4gd2hlbiBBdXRoMCBpcyBlbmFibGVkLlwiLFxuXHRcdFx0XCJcIixcblx0XHQpO1xuXHR9XG5cblx0bGluZXMucHVzaChcblx0XHRcIiMjIE1vcmVcIixcblx0XHRcIlwiLFxuXHRcdFwiLSBQYWNrYWdlIGRvY3M6IGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0BkZWNvaGVyZS9jcmVhdGVcIixcblx0XHRcIi0gQWZ0ZXIgYGRlY29oZXJlIGFkZCBhcGlgLCB0aGlzIFJFQURNRSBpcyByZWZyZXNoZWQgc28gc2NyaXB0cyBhbmQgQVBJcyBzdGF5IGFjY3VyYXRlLlwiLFxuXHRcdFwiXCIsXG5cdCk7XG5cblx0cmV0dXJuIGAke2xpbmVzLmpvaW4oXCJcXG5cIil9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VSZWFkbWVJbnB1dChcblx0d29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0b3B0aW9uczogV29ya3NwYWNlUmVhZG1lT3B0aW9ucyxcbik6IFdvcmtzcGFjZVJlYWRtZUlucHV0IHtcblx0Y29uc3QgbmV3TmFtZXMgPSB3b3Jrc3BhY2Vcblx0XHQuZ2V0UHJvamVjdHMoKVxuXHRcdC5tYXAoKHByb2plY3QpID0+IGFwaU5hbWVGcm9tUHJvamVjdERpcihwcm9qZWN0LmRpcikpO1xuXHRjb25zdCBhcGlOYW1lcyA9IG9wdGlvbnMuYWRkXG5cdFx0PyBtZXJnZUFwaU5hbWVzKGxpc3RFeGlzdGluZ0FwaU5hbWVzKHdvcmtzcGFjZS50YXJnZXREaXIpLCBuZXdOYW1lcylcblx0XHQ6IG5ld05hbWVzO1xuXG5cdGNvbnN0IHBrZyA9IHdvcmtzcGFjZS5nZXRNb2RlbDxQYWNrYWdlSnNvbj4oV0VMTF9LTk9XTl9GSUxFUy5QQUNLQUdFX0pTT04pO1xuXHRjb25zdCBlbnYgPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8RW52RmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5FTlZfRklMRSk7XG5cblx0Y29uc3QgaGFzUG9zdGdyZXMgPVxuXHRcdG9wdGlvbnMuZGF0YWJhc2VQcm92aWRlciA9PT0gXCJwb3N0Z3Jlcy90eXBlb3JtXCIgfHwgQm9vbGVhbihwa2c/Lmhhc1NjcmlwdChcImRiOnVwXCIpKTtcblx0Y29uc3QgaGFzQXV0aDAgPVxuXHRcdG9wdGlvbnMuYXV0aFByb3ZpZGVyID09PSBcImF1dGgwXCIgfHwgQm9vbGVhbihlbnY/Lmhhc0VudHJ5KFwiQVVUSDBfSVNTVUVSX0JBU0VfVVJMXCIpKTtcblx0Y29uc3QgaGFzUG9zdG1hbiA9XG5cdFx0b3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwibG9jYWxcIiB8fFxuXHRcdG9wdGlvbnMucG9zdG1hblByb3ZpZGVyID09PSBcImFwaVwiIHx8XG5cdFx0ZXhpc3RzU3luYyhqb2luKHdvcmtzcGFjZS50YXJnZXREaXIsIFwicG9zdG1hblwiKSkgfHxcblx0XHRleGlzdHNTeW5jKGpvaW4od29ya3NwYWNlLnRhcmdldERpciwgXCIucG9zdG1hblwiKSk7XG5cblx0cmV0dXJuIHtcblx0XHRwcm9qZWN0TmFtZTogd29ya3NwYWNlLm5hbWUsXG5cdFx0YXBpTmFtZXMsXG5cdFx0aGFzUG9zdGdyZXMsXG5cdFx0aGFzQXV0aDAsXG5cdFx0aGFzUG9zdG1hbixcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlV29ya3NwYWNlUmVhZG1lKFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRvcHRpb25zOiBXb3Jrc3BhY2VSZWFkbWVPcHRpb25zLFxuKTogdm9pZCB7XG5cdGNvbnN0IGNvbnRlbnQgPSByZW5kZXJXb3Jrc3BhY2VSZWFkbWUocmVzb2x2ZVdvcmtzcGFjZVJlYWRtZUlucHV0KHdvcmtzcGFjZSwgb3B0aW9ucykpO1xuXHR3b3Jrc3BhY2UuYWRkRmlsZSh7XG5cdFx0ZmlsZXM6ICgpID0+IFt7IGZpbGVQYXRoOiBcIlJFQURNRS5tZFwiLCBjb250ZW50IH1dLFxuXHR9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VBcGlOYW1lcyhleGlzdGluZzogcmVhZG9ubHkgc3RyaW5nW10sIGFkZGVkOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0Y29uc3Qgc2VlbiA9IG5ldyBTZXQoZXhpc3RpbmcpO1xuXHRyZXR1cm4gWy4uLmV4aXN0aW5nLCAuLi5hZGRlZC5maWx0ZXIoKG5hbWUpID0+ICFzZWVuLmhhcyhuYW1lKSldO1xufVxuIl0sIm5hbWVzIjpbImV4aXN0c1N5bmMiLCJqb2luIiwiV0VMTF9LTk9XTl9GSUxFUyIsImFwaU5hbWVGcm9tUHJvamVjdERpciIsImxpc3RFeGlzdGluZ0FwaU5hbWVzIiwicmVuZGVyV29ya3NwYWNlUmVhZG1lIiwiaW5wdXQiLCJwcm9qZWN0TmFtZSIsImFwaU5hbWVzIiwiaGFzUG9zdGdyZXMiLCJoYXNBdXRoMCIsImhhc1Bvc3RtYW4iLCJhcGlzIiwibGVuZ3RoIiwibGluZXMiLCJuYW1lIiwicHVzaCIsInJlc29sdmVXb3Jrc3BhY2VSZWFkbWVJbnB1dCIsIndvcmtzcGFjZSIsIm9wdGlvbnMiLCJuZXdOYW1lcyIsImdldFByb2plY3RzIiwibWFwIiwicHJvamVjdCIsImRpciIsImFkZCIsIm1lcmdlQXBpTmFtZXMiLCJ0YXJnZXREaXIiLCJwa2ciLCJnZXRNb2RlbCIsIlBBQ0tBR0VfSlNPTiIsImVudiIsIkVOVl9GSUxFIiwiZGF0YWJhc2VQcm92aWRlciIsIkJvb2xlYW4iLCJoYXNTY3JpcHQiLCJhdXRoUHJvdmlkZXIiLCJoYXNFbnRyeSIsInBvc3RtYW5Qcm92aWRlciIsIndyaXRlV29ya3NwYWNlUmVhZG1lIiwiY29udGVudCIsImFkZEZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiZXhpc3RpbmciLCJhZGRlZCIsInNlZW4iLCJTZXQiLCJmaWx0ZXIiLCJoYXMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxVQUFVO0FBQ3JDLFNBQVNDLElBQUksUUFBUSxZQUFZO0FBQ2pDLFNBQVNDLGdCQUFnQixRQUFRLHFCQUFxQjtBQUl0RCxTQUFTQyxxQkFBcUIsRUFBRUMsb0JBQW9CLFFBQVEsZ0JBQWdCO0FBaUI1RSxzRUFBc0UsR0FDdEUsT0FBTyxTQUFTQyxzQkFBc0JDLEtBQTJCO0lBQ2hFLE1BQU0sRUFBRUMsV0FBVyxFQUFFQyxRQUFRLEVBQUVDLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxVQUFVLEVBQUUsR0FBR0w7SUFDckUsTUFBTU0sT0FBT0osU0FBU0ssTUFBTSxHQUFHLElBQUlMLFdBQVc7UUFBQztLQUFNO0lBQ3JELE1BQU1NLFFBQWtCO1FBQ3ZCLENBQUMsRUFBRSxFQUFFUCxhQUFhO1FBQ2xCO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtLQUNBO0lBRUQsS0FBSyxNQUFNUSxRQUFRSCxLQUFNO1FBQ3hCRSxNQUFNRSxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUVELEtBQUssZUFBZSxFQUFFQSxNQUFNO1FBQ3ZERCxNQUFNRSxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUVELEtBQUssMEJB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decohere/scaffold",
|
|
3
|
-
"version": "0.0.1-dev.
|
|
3
|
+
"version": "0.0.1-dev.89",
|
|
4
4
|
"description": "Decohere project scaffolder (runs inside ghcr.io/typesmiths/decohere/create)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"decohere",
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@decohere/crucible": "0.0.1-dev.
|
|
26
|
-
"@decohere/nexus": "0.0.1-dev.
|
|
25
|
+
"@decohere/crucible": "0.0.1-dev.89",
|
|
26
|
+
"@decohere/nexus": "0.0.1-dev.89",
|
|
27
27
|
"commander": "^13.1.0",
|
|
28
28
|
"openapi-to-postmanv2": "^5.0.0"
|
|
29
29
|
},
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Action, ActionResponse } from "@decohere/nexus/cli";
|
|
2
|
+
export type Auth0ConfigureOptions = {
|
|
3
|
+
d?: string;
|
|
4
|
+
};
|
|
5
|
+
export declare class Auth0ConfigureAction implements Action<Auth0ConfigureOptions> {
|
|
6
|
+
run(options: Auth0ConfigureOptions): Promise<ActionResponse>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { DecohereCommand } from "@decohere/nexus/cli";
|
|
2
|
+
import { Auth0ConfigureAction } from "./auth0-configure.action.js";
|
|
3
|
+
export declare class Auth0ConfigureCommand extends DecohereCommand {
|
|
4
|
+
get actions(): (typeof Auth0ConfigureAction)[];
|
|
5
|
+
constructor(name: string);
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Actions } from "@decohere/nexus/cli";
|
|
2
|
+
import { type CommandHandler, type CommandResponse, type CommandType, DecohereCommand } from "@decohere/nexus/cli";
|
|
3
|
+
export declare class Auth0Command extends DecohereCommand {
|
|
4
|
+
constructor(commands: Record<string, CommandType>, handler: CommandHandler);
|
|
5
|
+
run(_actions: Actions, _options: never): Promise<CommandResponse>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ModuleManifest } from "@decohere/nexus/cli";
|
|
2
|
+
import { Auth0Command } from "./auth0.command.js";
|
|
3
|
+
import { Auth0ConfigureAction } from "./auth0-configure.action.js";
|
|
4
|
+
import { Auth0ConfigureCommand } from "./auth0-configure.command.js";
|
|
5
|
+
import { Auth0LoginAction } from "./auth0-login.action.js";
|
|
6
|
+
import { Auth0LoginCommand } from "./auth0-login.command.js";
|
|
7
|
+
export declare class Auth0Module extends ModuleManifest {
|
|
8
|
+
readonly id = "auth0";
|
|
9
|
+
readonly command: typeof Auth0Command;
|
|
10
|
+
readonly commands: {
|
|
11
|
+
login: typeof Auth0LoginCommand;
|
|
12
|
+
configure: typeof Auth0ConfigureCommand;
|
|
13
|
+
};
|
|
14
|
+
readonly actions: {
|
|
15
|
+
login: typeof Auth0LoginAction;
|
|
16
|
+
configure: typeof Auth0ConfigureAction;
|
|
17
|
+
};
|
|
18
|
+
}
|
package/types/src/index.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
export { AddModule } from "./add.module.js";
|
|
2
2
|
export type { AddApiOptions } from "./add-api.action.js";
|
|
3
3
|
export { AddApiAction } from "./add-api.action.js";
|
|
4
|
+
export { Auth0Module } from "./auth0.module.js";
|
|
5
|
+
export type { Auth0ConfigureOptions } from "./auth0-configure.action.js";
|
|
6
|
+
export { Auth0ConfigureAction } from "./auth0-configure.action.js";
|
|
7
|
+
export { Auth0LoginAction } from "./auth0-login.action.js";
|
|
4
8
|
export { CreateModule } from "./create.module.js";
|
|
5
9
|
export { runCli } from "./program.js";
|
|
6
10
|
export type { ApiOptions } from "./webapi/create-api.js";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as auth0Cli from "./features/auth0-cli.js";
|
|
2
|
+
export declare const AUTH0_CLI_INSTALL_MESSAGE: string;
|
|
3
|
+
/** Throw if the `auth0` binary is missing. */
|
|
4
|
+
export declare function requireInstalled(): void;
|
|
5
|
+
/**
|
|
6
|
+
* Log in when there is no tenant session or the Management API token is expired.
|
|
7
|
+
* Returns the active tenant.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensureLoggedIn(): auth0Cli.Auth0Tenant;
|
|
10
|
+
export declare function runAuth0Login(): void;
|
|
11
|
+
export declare function runAuth0Configure(directory?: string): void;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** OIDC scopes requested on the Postman SPA token (not Auth0 API permissions). */
|
|
2
|
+
export declare const OIDC_SCOPES: readonly ["openid", "profile", "email"];
|
|
3
|
+
/** Collect action:Subject scopes from Authorize decorators in each API src tree. */
|
|
4
|
+
export declare function discoverAuthorizeScopes(rootDir: string): string[];
|
|
5
|
+
/** Additive union so Auth0 CLI scope replace does not drop permissions already on the API. */
|
|
6
|
+
export declare function mergeApiScopes(discovered: readonly string[], existing: readonly string[]): string[];
|
|
7
|
+
export declare function postmanRequestedScopes(apiScopes: readonly string[]): string;
|
|
@@ -12,6 +12,7 @@ export interface Auth0Tenant {
|
|
|
12
12
|
}
|
|
13
13
|
export declare function isInstalled(): boolean;
|
|
14
14
|
export declare function listTenants(): Auth0Tenant[];
|
|
15
|
+
/** Device/URL login (`--no-input`) so Docker can print a host-browser URL. */
|
|
15
16
|
export declare function login(): boolean;
|
|
16
17
|
export declare function listApis(): Array<{
|
|
17
18
|
identifier: string;
|
|
@@ -20,6 +21,9 @@ export declare function listApis(): Array<{
|
|
|
20
21
|
export declare function createApi(name: string, identifier: string, scopes?: readonly string[]): {
|
|
21
22
|
identifier: string;
|
|
22
23
|
};
|
|
24
|
+
export declare function listApiScopes(identifier: string): string[];
|
|
25
|
+
/** Assign API permissions to a user (Authorization Core). Idempotent when already granted. */
|
|
26
|
+
export declare function assignUserPermissions(userId: string, audience: string, permissions: readonly string[]): void;
|
|
23
27
|
/**
|
|
24
28
|
* Replace an API's scopes and enable RBAC policy enforcement.
|
|
25
29
|
* Auth0 CLI `--scopes` replaces the full set.
|