@checkdigit/eslint-plugin 7.6.0-PR.75-4751 → 7.6.0-PR.97-af5e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist-mjs/index.mjs +8 -156
  2. package/dist-mjs/no-status-code-assert.mjs +63 -0
  3. package/dist-mjs/require-resolve-full-response.mjs +5 -5
  4. package/dist-types/no-status-code-assert.d.ts +5 -0
  5. package/package.json +1 -1
  6. package/src/index.ts +4 -152
  7. package/src/no-status-code-assert.ts +85 -0
  8. package/src/require-resolve-full-response.ts +4 -4
  9. package/dist-mjs/agent/add-assert-import.mjs +0 -58
  10. package/dist-mjs/agent/add-base-path-const.mjs +0 -65
  11. package/dist-mjs/agent/add-base-path-import.mjs +0 -60
  12. package/dist-mjs/agent/add-url-domain.mjs +0 -61
  13. package/dist-mjs/agent/agent-test-wiring.mjs +0 -221
  14. package/dist-mjs/agent/fetch-response-body-json.mjs +0 -146
  15. package/dist-mjs/agent/fetch-response-header-getter.mjs +0 -117
  16. package/dist-mjs/agent/fetch-response-status.mjs +0 -76
  17. package/dist-mjs/agent/fetch-then.mjs +0 -205
  18. package/dist-mjs/agent/fetch.mjs +0 -48
  19. package/dist-mjs/agent/file.mjs +0 -43
  20. package/dist-mjs/agent/fix-function-call-arguments.mjs +0 -153
  21. package/dist-mjs/agent/no-fixture.mjs +0 -383
  22. package/dist-mjs/agent/no-mapped-response.mjs +0 -75
  23. package/dist-mjs/agent/no-service-wrapper.mjs +0 -185
  24. package/dist-mjs/agent/no-status-code.mjs +0 -59
  25. package/dist-mjs/agent/no-supertest.mjs +0 -332
  26. package/dist-mjs/agent/no-unused-function-argument.mjs +0 -79
  27. package/dist-mjs/agent/no-unused-imports.mjs +0 -81
  28. package/dist-mjs/agent/no-unused-service-variable.mjs +0 -74
  29. package/dist-mjs/agent/response-reference.mjs +0 -75
  30. package/dist-mjs/agent/supertest-then.mjs +0 -170
  31. package/dist-mjs/agent/url.mjs +0 -32
  32. package/dist-types/agent/add-assert-import.d.ts +0 -4
  33. package/dist-types/agent/add-base-path-const.d.ts +0 -4
  34. package/dist-types/agent/add-base-path-import.d.ts +0 -4
  35. package/dist-types/agent/add-url-domain.d.ts +0 -4
  36. package/dist-types/agent/agent-test-wiring.d.ts +0 -4
  37. package/dist-types/agent/fetch-response-body-json.d.ts +0 -4
  38. package/dist-types/agent/fetch-response-header-getter.d.ts +0 -4
  39. package/dist-types/agent/fetch-response-status.d.ts +0 -4
  40. package/dist-types/agent/fetch-then.d.ts +0 -4
  41. package/dist-types/agent/fetch.d.ts +0 -8
  42. package/dist-types/agent/file.d.ts +0 -7
  43. package/dist-types/agent/fix-function-call-arguments.d.ts +0 -9
  44. package/dist-types/agent/no-fixture.d.ts +0 -4
  45. package/dist-types/agent/no-mapped-response.d.ts +0 -4
  46. package/dist-types/agent/no-service-wrapper.d.ts +0 -4
  47. package/dist-types/agent/no-status-code.d.ts +0 -4
  48. package/dist-types/agent/no-supertest.d.ts +0 -4
  49. package/dist-types/agent/no-unused-function-argument.d.ts +0 -4
  50. package/dist-types/agent/no-unused-imports.d.ts +0 -4
  51. package/dist-types/agent/no-unused-service-variable.d.ts +0 -4
  52. package/dist-types/agent/response-reference.d.ts +0 -16
  53. package/dist-types/agent/supertest-then.d.ts +0 -4
  54. package/dist-types/agent/url.d.ts +0 -4
  55. package/src/agent/add-assert-import.ts +0 -74
  56. package/src/agent/add-base-path-const.ts +0 -81
  57. package/src/agent/add-base-path-import.ts +0 -69
  58. package/src/agent/add-url-domain.ts +0 -76
  59. package/src/agent/agent-test-wiring.ts +0 -273
  60. package/src/agent/fetch-response-body-json.ts +0 -194
  61. package/src/agent/fetch-response-header-getter.ts +0 -148
  62. package/src/agent/fetch-response-status.ts +0 -100
  63. package/src/agent/fetch-then.ts +0 -358
  64. package/src/agent/fetch.ts +0 -69
  65. package/src/agent/file.ts +0 -42
  66. package/src/agent/fix-function-call-arguments.ts +0 -200
  67. package/src/agent/no-fixture.ts +0 -581
  68. package/src/agent/no-mapped-response.ts +0 -84
  69. package/src/agent/no-service-wrapper.ts +0 -241
  70. package/src/agent/no-status-code.ts +0 -69
  71. package/src/agent/no-supertest.ts +0 -517
  72. package/src/agent/no-unused-function-argument.ts +0 -98
  73. package/src/agent/no-unused-imports.ts +0 -103
  74. package/src/agent/no-unused-service-variable.ts +0 -93
  75. package/src/agent/response-reference.ts +0 -153
  76. package/src/agent/supertest-then.ts +0 -230
  77. package/src/agent/url.ts +0 -32
@@ -1,43 +0,0 @@
1
- // src/agent/file.ts
2
- import fs from "node:fs";
3
- import path from "node:path";
4
- function isApiIndexFile(filename) {
5
- return /.*\/src\/api\/v\d+\/index.ts/u.test(filename);
6
- }
7
- function getProjectRootFolder(indexFilename) {
8
- return indexFilename.substring(0, indexFilename.lastIndexOf("/src/"));
9
- }
10
- function getSwaggerPathByIndexFile(indexFilename) {
11
- return indexFilename.replace(/index\.ts$/u, "swagger.yml");
12
- }
13
- function loadSwagger(filename) {
14
- return fs.readFileSync(filename, "utf8");
15
- }
16
- function loadPackageJson(projectRoot) {
17
- return fs.readFileSync(`${projectRoot}/package.json`, "utf8");
18
- }
19
- function getApiFolder(folder) {
20
- if (/^\/?(?<absolutePath>(?:[^/]+\/)*)src\/api\/v\d+$/u.test(folder)) {
21
- return folder;
22
- }
23
- const upperFolder = folder.substring(0, folder.lastIndexOf("/"));
24
- return upperFolder.trim() === "" ? void 0 : getApiFolder(upperFolder);
25
- }
26
- function getApiIndexPathByFilename(filename) {
27
- const apiFolder = getApiFolder(filename);
28
- if (apiFolder === void 0) {
29
- return void 0;
30
- }
31
- const relativePath = path.relative(path.dirname(filename), `${apiFolder}/index`);
32
- return relativePath.startsWith("../") ? relativePath : `./${relativePath}`;
33
- }
34
- export {
35
- getApiFolder,
36
- getApiIndexPathByFilename,
37
- getProjectRootFolder,
38
- getSwaggerPathByIndexFile,
39
- isApiIndexFile,
40
- loadPackageJson,
41
- loadSwagger
42
- };
43
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2ZpbGUudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBRUEsT0FBTyxRQUFRO0FBQ2YsT0FBTyxVQUFVO0FBRVYsU0FBUyxlQUFlLFVBQTJCO0FBQ3hELFNBQU8sZ0NBQWdDLEtBQUssUUFBUTtBQUN0RDtBQUVPLFNBQVMscUJBQXFCLGVBQStCO0FBQ2xFLFNBQU8sY0FBYyxVQUFVLEdBQUcsY0FBYyxZQUFZLE9BQU8sQ0FBQztBQUN0RTtBQUVPLFNBQVMsMEJBQTBCLGVBQStCO0FBQ3ZFLFNBQU8sY0FBYyxRQUFRLGVBQWUsYUFBYTtBQUMzRDtBQUVPLFNBQVMsWUFBWSxVQUEwQjtBQUNwRCxTQUFPLEdBQUcsYUFBYSxVQUFVLE1BQU07QUFDekM7QUFFTyxTQUFTLGdCQUFnQixhQUE2QjtBQUMzRCxTQUFPLEdBQUcsYUFBYSxHQUFHLFdBQVcsaUJBQWlCLE1BQU07QUFDOUQ7QUFFTyxTQUFTLGFBQWEsUUFBb0M7QUFDL0QsTUFBSSxvREFBb0QsS0FBSyxNQUFNLEdBQUc7QUFDcEUsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLGNBQWMsT0FBTyxVQUFVLEdBQUcsT0FBTyxZQUFZLEdBQUcsQ0FBQztBQUMvRCxTQUFPLFlBQVksS0FBSyxNQUFNLEtBQUssU0FBWSxhQUFhLFdBQVc7QUFDekU7QUFFTyxTQUFTLDBCQUEwQixVQUFzQztBQUM5RSxRQUFNLFlBQVksYUFBYSxRQUFRO0FBQ3ZDLE1BQUksY0FBYyxRQUFXO0FBQzNCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxlQUFlLEtBQUssU0FBUyxLQUFLLFFBQVEsUUFBUSxHQUFHLEdBQUcsU0FBUyxRQUFRO0FBQy9FLFNBQU8sYUFBYSxXQUFXLEtBQUssSUFBSSxlQUFlLEtBQUssWUFBWTtBQUMxRTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -1,153 +0,0 @@
1
- // src/agent/fix-function-call-arguments.ts
2
- import { strict as assert } from "node:assert";
3
- import { ESLintUtils } from "@typescript-eslint/utils";
4
- import debug from "debug";
5
- import getDocumentationUrl from "../get-documentation-url.mjs";
6
- var ruleId = "fix-function-call-arguments";
7
- var DEFAULT_OPTIONS = {
8
- typesToCheck: [
9
- "Configuration<ResolvedServices>",
10
- "Fixture<ResolvedServices>",
11
- "InboundContext",
12
- "{ get: () => string; }",
13
- "Api"
14
- ]
15
- };
16
- var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
17
- var log = debug("eslint-plugin:fix-function-call-arguments");
18
- var rule = createRule({
19
- name: ruleId,
20
- meta: {
21
- type: "suggestion",
22
- docs: {
23
- description: "Remove incompatible function arguments."
24
- },
25
- messages: {
26
- removeIncompatibleFunctionArguments: "Removing incompatible function arguments.",
27
- unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
28
- },
29
- fixable: "code",
30
- schema: [
31
- {
32
- type: "object",
33
- properties: {
34
- typesToCheck: {
35
- description: "Text representation of the types of which the function call parameters will be examine",
36
- type: "array",
37
- items: {
38
- type: "string"
39
- }
40
- }
41
- },
42
- additionalProperties: false
43
- }
44
- ]
45
- },
46
- defaultOptions: [DEFAULT_OPTIONS],
47
- create(context) {
48
- const { typesToCheck } = context.options[0] ?? DEFAULT_OPTIONS;
49
- const parserServices = ESLintUtils.getParserServices(context);
50
- const typeChecker = parserServices.program.getTypeChecker();
51
- const sourceCode = context.sourceCode;
52
- return {
53
- CallExpression(callExpression) {
54
- log("===== file name:", context.filename);
55
- log("callExpression:", sourceCode.getText(callExpression));
56
- try {
57
- const actualParameters = callExpression.arguments;
58
- if (!actualParameters.some((actualParameter) => {
59
- const actualType = typeChecker.getTypeAtLocation(
60
- parserServices.esTreeNodeToTSNodeMap.get(actualParameter)
61
- );
62
- const actualTypeString = typeChecker.typeToString(actualType);
63
- return typesToCheck.includes(actualTypeString) || actualTypeString.endsWith("RequestType");
64
- })) {
65
- return;
66
- }
67
- const calleeTsNode = parserServices.esTreeNodeToTSNodeMap.get(callExpression.callee);
68
- const calleeType = typeChecker.getTypeAtLocation(calleeTsNode);
69
- const signatures = calleeType.getCallSignatures();
70
- if (signatures.length > 1) {
71
- return;
72
- }
73
- const signature = signatures[0];
74
- assert(signature);
75
- log("signature:", signature.getDeclaration().getText());
76
- const expectedParameters = signature.getParameters();
77
- log(
78
- "expected parameters:",
79
- expectedParameters.map(
80
- (expectedParameter) => typeChecker.typeToString(typeChecker.getTypeOfSymbol(expectedParameter))
81
- )
82
- );
83
- const expectedParametersCount = expectedParameters.length;
84
- const actualParametersCount = actualParameters.length;
85
- if (actualParametersCount === 0) {
86
- return;
87
- }
88
- const parametersToKeep = [];
89
- let expectedParameterIndex = 0;
90
- for (const [actualParameterIndex, actualParameter] of actualParameters.entries()) {
91
- if (expectedParameterIndex >= expectedParametersCount) {
92
- break;
93
- }
94
- const expectedParameter = expectedParameters[expectedParameterIndex];
95
- assert.ok(expectedParameter, "Expected parameter not found.");
96
- const expectedType = typeChecker.getTypeOfSymbol(expectedParameter);
97
- const actualType = typeChecker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(actualParameter));
98
- const actualTypeString = typeChecker.typeToString(actualType);
99
- log(
100
- "expected type: #",
101
- expectedParameterIndex,
102
- expectedParameter.escapedName,
103
- typeChecker.typeToString(expectedType)
104
- );
105
- log("actual type: #", actualParameterIndex, sourceCode.getText(actualParameter), actualTypeString);
106
- if ((typesToCheck.includes(actualTypeString) || actualTypeString.endsWith("RequestType")) && !typeChecker.isTypeAssignableTo(actualType, expectedType)) {
107
- log("removing un-matched parameter", sourceCode.getText(actualParameter));
108
- continue;
109
- }
110
- parametersToKeep.push(actualParameter);
111
- expectedParameterIndex++;
112
- }
113
- if (parametersToKeep.length === actualParametersCount) {
114
- return;
115
- }
116
- const firstParameter = actualParameters[0];
117
- const lastParameter = actualParameters.at(-1);
118
- assert.ok(firstParameter !== void 0 && lastParameter !== void 0);
119
- const tokenAfterParameters = sourceCode.getTokenAfter(lastParameter);
120
- context.report({
121
- node: callExpression,
122
- messageId: "removeIncompatibleFunctionArguments",
123
- fix(fixer) {
124
- return fixer.replaceTextRange(
125
- [
126
- firstParameter.range[0],
127
- tokenAfterParameters?.value === "," ? tokenAfterParameters.range[1] : lastParameter.range[1]
128
- ],
129
- parametersToKeep.map((arg) => sourceCode.getText(arg)).join(", ")
130
- );
131
- }
132
- });
133
- } catch (error) {
134
- console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
135
- context.report({
136
- node: callExpression,
137
- messageId: "unknownError",
138
- data: {
139
- fileName: context.filename,
140
- error: error instanceof Error ? error.toString() : JSON.stringify(error)
141
- }
142
- });
143
- }
144
- }
145
- };
146
- }
147
- });
148
- var fix_function_call_arguments_default = rule;
149
- export {
150
- fix_function_call_arguments_default as default,
151
- ruleId
152
- };
153
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L2ZpeC1mdW5jdGlvbi1jYWxsLWFyZ3VtZW50cy50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLFVBQVUsY0FBYztBQUNqQyxTQUFTLG1CQUE2QjtBQUN0QyxPQUFPLFdBQVc7QUFDbEIsT0FBTyx5QkFBeUI7QUFFekIsSUFBTSxTQUFTO0FBS3RCLElBQU0sa0JBQWtCO0FBQUEsRUFDdEIsY0FBYztBQUFBLElBQ1o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGO0FBRUEsSUFBTSxhQUFhLFlBQVksWUFBWSxDQUFDLFNBQVMsb0JBQW9CLElBQUksQ0FBQztBQUM5RSxJQUFNLE1BQU0sTUFBTSwyQ0FBMkM7QUFFN0QsSUFBTSxPQUdGLFdBQVc7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQSxVQUFVO0FBQUEsTUFDUixxQ0FBcUM7QUFBQSxNQUNyQyxjQUFjO0FBQUEsSUFDaEI7QUFBQSxJQUNBLFNBQVM7QUFBQSxJQUNULFFBQVE7QUFBQSxNQUNOO0FBQUEsUUFDRSxNQUFNO0FBQUEsUUFDTixZQUFZO0FBQUEsVUFDVixjQUFjO0FBQUEsWUFDWixhQUFhO0FBQUEsWUFDYixNQUFNO0FBQUEsWUFDTixPQUFPO0FBQUEsY0FDTCxNQUFNO0FBQUEsWUFDUjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsUUFDQSxzQkFBc0I7QUFBQSxNQUN4QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQyxlQUFlO0FBQUEsRUFDaEMsT0FBTyxTQUFTO0FBRWQsVUFBTSxFQUFFLGFBQWEsSUFBSSxRQUFRLFFBQVEsQ0FBQyxLQUFLO0FBQy9DLFVBQU0saUJBQWlCLFlBQVksa0JBQWtCLE9BQU87QUFDNUQsVUFBTSxjQUFjLGVB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
@@ -1,383 +0,0 @@
1
- // src/agent/no-fixture.ts
2
- import { strict as assert } from "node:assert";
3
- import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
4
- import {
5
- getEnclosingFunction,
6
- getEnclosingScopeNode,
7
- getEnclosingStatement,
8
- getParent,
9
- isUsedInArrayOrAsArgument
10
- } from "../library/ts-tree.mjs";
11
- import getDocumentationUrl from "../get-documentation-url.mjs";
12
- import { getIndentation } from "../library/format.mjs";
13
- import { isValidPropertyName } from "../library/variable.mjs";
14
- import { analyzeResponseReferences } from "./response-reference.mjs";
15
- import {
16
- getResponseBodyRetrievalText,
17
- getResponseHeadersRetrievalText,
18
- getResponseStatusRetrievalText,
19
- hasAssertions
20
- } from "./fetch.mjs";
21
- import { replaceEndpointUrlPrefixWithBasePath } from "./url.mjs";
22
- var ruleId = "no-fixture";
23
- function analyzeFixtureCall(call, results, sourceCode) {
24
- const parent = getParent(call);
25
- assert.ok(parent, "parent should exist for fixture/supertest call node");
26
- let nextCall;
27
- if (parent.type === AST_NODE_TYPES.ReturnStatement) {
28
- results.fixtureNode = call;
29
- results.rootNode = parent;
30
- } else if (parent.type === AST_NODE_TYPES.ArrayExpression || parent.type === AST_NODE_TYPES.CallExpression || parent.type === AST_NODE_TYPES.ArrowFunctionExpression) {
31
- results.fixtureNode = call;
32
- results.rootNode = call;
33
- } else if (parent.type === AST_NODE_TYPES.AwaitExpression) {
34
- results.fixtureNode = call;
35
- const enclosingStatement = getEnclosingStatement(parent);
36
- assert.ok(enclosingStatement);
37
- const awaitParent = getParent(parent);
38
- if (awaitParent?.type === AST_NODE_TYPES.MemberExpression) {
39
- results.rootNode = parent;
40
- results.inlineStatementNode = enclosingStatement;
41
- if (awaitParent.property.type === AST_NODE_TYPES.Identifier && awaitParent.property.name === "body") {
42
- results.inlineBodyReference = awaitParent;
43
- }
44
- if (awaitParent.property.type === AST_NODE_TYPES.Identifier && (awaitParent.property.name === "status" || awaitParent.property.name === "statusCode")) {
45
- results.inlineStatusReference = awaitParent;
46
- }
47
- if (awaitParent.property.type === AST_NODE_TYPES.Identifier && (awaitParent.property.name === "header" || awaitParent.property.name === "headers")) {
48
- results.inlineHeadersReference = awaitParent;
49
- }
50
- } else if (enclosingStatement.type === AST_NODE_TYPES.VariableDeclaration) {
51
- results.variableDeclaration = enclosingStatement;
52
- results.rootNode = enclosingStatement;
53
- } else if (enclosingStatement.type === AST_NODE_TYPES.ExpressionStatement && enclosingStatement.expression.type === AST_NODE_TYPES.AssignmentExpression) {
54
- results.variableAssignment = enclosingStatement;
55
- results.rootNode = enclosingStatement;
56
- } else {
57
- results.rootNode = parent;
58
- }
59
- } else if (parent.type === AST_NODE_TYPES.MemberExpression && parent.property.type === AST_NODE_TYPES.Identifier) {
60
- if (parent.property.name === "expect") {
61
- const assertionCall = getParent(parent);
62
- assert.ok(assertionCall && assertionCall.type === AST_NODE_TYPES.CallExpression);
63
- results.assertions = [...results.assertions ?? [], assertionCall.arguments];
64
- nextCall = assertionCall;
65
- } else if (parent.property.name === "send") {
66
- const sendRequestBodyCall = getParent(parent);
67
- assert.ok(sendRequestBodyCall && sendRequestBodyCall.type === AST_NODE_TYPES.CallExpression);
68
- results.requestBody = sendRequestBodyCall.arguments[0];
69
- nextCall = sendRequestBodyCall;
70
- } else if (parent.property.name === "set") {
71
- const setRequestHeaderCall = getParent(parent);
72
- assert.ok(setRequestHeaderCall && setRequestHeaderCall.type === AST_NODE_TYPES.CallExpression);
73
- const [arg1, arg2] = setRequestHeaderCall.arguments;
74
- if (arg1.type === AST_NODE_TYPES.ObjectExpression) {
75
- results.requestHeadersObjectLiteral = arg1;
76
- } else {
77
- results.requestHeaders = [...results.requestHeaders ?? [], { name: arg1, value: arg2 }];
78
- }
79
- nextCall = setRequestHeaderCall;
80
- }
81
- } else {
82
- throw new Error(`Unexpected expression in fixture/supertest call ${sourceCode.getText(parent)}.`);
83
- }
84
- if (nextCall) {
85
- analyzeFixtureCall(nextCall, results, sourceCode);
86
- }
87
- }
88
- function createResponseAssertions(fixtureCallInformation, sourceCode, responseVariableName, destructuringResponseHeadersVariable) {
89
- let statusAssertion;
90
- const nonStatusAssertions = [];
91
- for (const expectArguments of fixtureCallInformation.assertions ?? []) {
92
- if (expectArguments.length === 1) {
93
- const [assertionArgument] = expectArguments;
94
- assert.ok(assertionArgument);
95
- if (assertionArgument.type === AST_NODE_TYPES.MemberExpression && assertionArgument.object.type === AST_NODE_TYPES.Identifier && assertionArgument.object.name === "StatusCodes" || assertionArgument.type === AST_NODE_TYPES.Literal || sourceCode.getText(assertionArgument).includes("StatusCodes.")) {
96
- statusAssertion = `assert.equal(${responseVariableName}.status, ${sourceCode.getText(assertionArgument)})`;
97
- } else if (assertionArgument.type === AST_NODE_TYPES.ArrowFunctionExpression) {
98
- let functionBody = sourceCode.getText(assertionArgument.body);
99
- const [originalResponseArgument] = assertionArgument.params;
100
- assert.ok(originalResponseArgument?.type === AST_NODE_TYPES.Identifier);
101
- const originalResponseArgumentName = originalResponseArgument.name;
102
- if (originalResponseArgumentName !== responseVariableName) {
103
- functionBody = functionBody.replace(
104
- new RegExp(`\\b${originalResponseArgumentName}\\b`, "ug"),
105
- responseVariableName
106
- );
107
- }
108
- nonStatusAssertions.push(`assert.doesNotThrow(()=>${functionBody})`);
109
- } else if (assertionArgument.type === AST_NODE_TYPES.Identifier) {
110
- nonStatusAssertions.push(
111
- `assert.doesNotThrow(()=>${sourceCode.getText(assertionArgument)}(${responseVariableName}))`
112
- );
113
- } else if (assertionArgument.type === AST_NODE_TYPES.ObjectExpression || assertionArgument.type === AST_NODE_TYPES.CallExpression) {
114
- nonStatusAssertions.push(
115
- `assert.deepEqual(await ${responseVariableName}.json(), ${sourceCode.getText(assertionArgument)})`
116
- );
117
- } else {
118
- throw new Error(`Unexpected Supertest assertion argument: ".expect(${sourceCode.getText(assertionArgument)})`);
119
- }
120
- } else if (expectArguments.length === 2) {
121
- const [headerName, headerValue] = expectArguments;
122
- assert.ok(headerName && headerValue);
123
- const headersReference = destructuringResponseHeadersVariable !== void 0 ? destructuringResponseHeadersVariable.name : `${responseVariableName}.headers`;
124
- if (headerValue.type === AST_NODE_TYPES.Literal && headerValue.value instanceof RegExp) {
125
- nonStatusAssertions.push(
126
- `assert.ok(${headersReference}.get(${sourceCode.getText(headerName)}).match(${sourceCode.getText(headerValue)}))`
127
- );
128
- } else {
129
- nonStatusAssertions.push(
130
- `assert.equal(${headersReference}.get(${sourceCode.getText(headerName)}), ${sourceCode.getText(headerValue)})`
131
- );
132
- }
133
- }
134
- }
135
- return {
136
- statusAssertion,
137
- nonStatusAssertions
138
- };
139
- }
140
- function getResponseVariableNameToUse(methodName, urlArgumentNode, originalUrlArgumentText, scopeManager, fixtureCallInformation, scopeVariablesMap) {
141
- if (fixtureCallInformation.variableAssignment) {
142
- assert.ok(
143
- fixtureCallInformation.variableAssignment.expression.type === AST_NODE_TYPES.AssignmentExpression && fixtureCallInformation.variableAssignment.expression.left.type === AST_NODE_TYPES.Identifier
144
- );
145
- return fixtureCallInformation.variableAssignment.expression.left.name;
146
- }
147
- if (fixtureCallInformation.variableDeclaration) {
148
- const firstDeclaration = fixtureCallInformation.variableDeclaration.declarations[0];
149
- if (firstDeclaration !== void 0 && firstDeclaration.id.type === AST_NODE_TYPES.Identifier) {
150
- return firstDeclaration.id.name;
151
- }
152
- }
153
- const enclosingScopeNode = getEnclosingScopeNode(fixtureCallInformation.rootNode);
154
- scopeManager.getDeclaredVariables(fixtureCallInformation.rootNode);
155
- assert.ok(enclosingScopeNode);
156
- const scope = scopeManager.acquire(enclosingScopeNode);
157
- assert.ok(scope !== null);
158
- let scopeVariables = scopeVariablesMap.get(scope);
159
- if (!scopeVariables) {
160
- scopeVariables = [...scope.set.keys()];
161
- scopeVariablesMap.set(scope, scopeVariables);
162
- }
163
- let responseVariableNameBase = "response";
164
- if (urlArgumentNode.type === AST_NODE_TYPES.Literal || urlArgumentNode.type === AST_NODE_TYPES.TemplateLiteral) {
165
- const urlWithoutQuotes = originalUrlArgumentText.replace(/['"`]/gu, "");
166
- const urlWithoutQuery = urlWithoutQuotes.includes("?") ? urlWithoutQuotes.slice(0, urlWithoutQuotes.indexOf("?")) : urlWithoutQuotes;
167
- const parts = urlWithoutQuery.startsWith("${") ? urlWithoutQuery.split("/").slice(1) : (
168
- // eslint-disable-next-line no-magic-numbers
169
- urlWithoutQuery.split("/").slice(3)
170
- );
171
- responseVariableNameBase = [...parts.filter((part) => part !== "tenant"), methodName.toLocaleLowerCase()].map((part) => part.split(/[-]/u)).flat().filter((part) => part.trim() !== "" && !/\$\{.*\}/u.test(part)).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join("");
172
- responseVariableNameBase = `${responseVariableNameBase[0]?.toLowerCase() ?? ""}${responseVariableNameBase.slice(1)}Response`;
173
- }
174
- let responseVariableCounter = 0;
175
- let responseVariableNameToUse;
176
- while (responseVariableNameToUse === void 0) {
177
- responseVariableNameToUse = `${responseVariableNameBase}${responseVariableCounter === 0 ? "" : responseVariableCounter.toString()}`;
178
- if (scopeVariables.includes(responseVariableNameToUse)) {
179
- responseVariableNameToUse = void 0;
180
- }
181
- responseVariableCounter++;
182
- }
183
- scopeVariables.push(responseVariableNameToUse);
184
- return responseVariableNameToUse;
185
- }
186
- function isResponseBodyRedefinition(responseBodyReference) {
187
- const parent = getParent(responseBodyReference);
188
- return parent?.type === AST_NODE_TYPES.VariableDeclarator && parent.id.type === AST_NODE_TYPES.Identifier;
189
- }
190
- var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
191
- var rule = createRule({
192
- name: ruleId,
193
- meta: {
194
- type: "suggestion",
195
- docs: {
196
- description: "Prefer native fetch API over customized fixture API.",
197
- url: getDocumentationUrl(ruleId)
198
- },
199
- messages: {
200
- preferNativeFetch: "Prefer native fetch API over customized fixture API.",
201
- unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
202
- },
203
- fixable: "code",
204
- schema: []
205
- },
206
- defaultOptions: [],
207
- // eslint-disable-next-line max-lines-per-function
208
- create(context) {
209
- const sourceCode = context.sourceCode;
210
- const scopeManager = sourceCode.scopeManager;
211
- assert.ok(scopeManager !== null);
212
- const scopeVariablesMap = /* @__PURE__ */ new Map();
213
- return {
214
- // eslint-disable-next-line max-lines-per-function
215
- 'CallExpression[callee.object.object.name="fixture"][callee.object.property.name="api"]': (fixtureCall) => {
216
- try {
217
- if (hasAssertions(fixtureCall) && (isUsedInArrayOrAsArgument(fixtureCall) || getEnclosingFunction(fixtureCall)?.async === false)) {
218
- return;
219
- }
220
- const fixtureFunction = fixtureCall.callee;
221
- assert.ok(fixtureFunction.type === AST_NODE_TYPES.MemberExpression);
222
- const indentation = getIndentation(fixtureCall, sourceCode);
223
- const [urlArgumentNode] = fixtureCall.arguments;
224
- assert.ok(urlArgumentNode !== void 0);
225
- const fixtureCallInformation = {};
226
- analyzeFixtureCall(fixtureCall, fixtureCallInformation, sourceCode);
227
- const {
228
- variable: responseVariable,
229
- bodyReferences: responseBodyReferences,
230
- // headersReferences: responseHeadersReferences,
231
- statusReferences: responseStatusReferences,
232
- destructuringBodyVariable: destructuringResponseBodyVariable,
233
- destructuringStatusVariable: destructuringResponseStatusVariable,
234
- destructuringHeadersVariable: destructuringResponseHeadersVariable
235
- } = analyzeResponseReferences(fixtureCallInformation.variableDeclaration, scopeManager);
236
- const originalUrlArgumentText = sourceCode.getText(urlArgumentNode);
237
- const fetchUrlArgumentText = replaceEndpointUrlPrefixWithBasePath(originalUrlArgumentText);
238
- const methodNode = fixtureFunction.property;
239
- assert.ok(methodNode.type === AST_NODE_TYPES.Identifier);
240
- const methodName = methodNode.name.toUpperCase();
241
- const methodNameToUse = methodName === "DEL" ? "DELETE" : methodName;
242
- const fetchRequestArgumentLines = [
243
- "{",
244
- ` method: '${methodNameToUse}',`,
245
- ...fixtureCallInformation.requestBody ? [` body: JSON.stringify(${sourceCode.getText(fixtureCallInformation.requestBody)}),`] : [],
246
- // eslint-disable-next-line no-nested-ternary
247
- ...fixtureCallInformation.requestHeadersObjectLiteral ? [` headers: ${sourceCode.getText(fixtureCallInformation.requestHeadersObjectLiteral)},`] : fixtureCallInformation.requestHeaders ? [
248
- ` headers: {`,
249
- ...fixtureCallInformation.requestHeaders.map(
250
- ({ name, value }) => (
251
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions, no-nested-ternary, sonarjs/no-nested-template-literals
252
- ` ${name.type === AST_NODE_TYPES.Literal ? isValidPropertyName(name.value) ? name.value : `'${name.value}'` : `[${sourceCode.getText(name)}]`}: ${sourceCode.getText(value)},`
253
- )
254
- ),
255
- ` },`
256
- ] : [],
257
- "}"
258
- ].join(`
259
- ${indentation}`);
260
- const responseVariableNameToUse = getResponseVariableNameToUse(
261
- methodNameToUse,
262
- urlArgumentNode,
263
- originalUrlArgumentText,
264
- scopeManager,
265
- fixtureCallInformation,
266
- scopeVariablesMap
267
- );
268
- const isResponseBodyVariableRedefinitionNeeded = destructuringResponseBodyVariable !== void 0 || fixtureCallInformation.inlineBodyReference !== void 0 || responseBodyReferences.length > 0 && !responseBodyReferences.some(isResponseBodyRedefinition);
269
- const redefineResponseBodyVariableName = `${responseVariableNameToUse}Body`;
270
- const isResponseStatusVariableRedefinitionNeeded = destructuringResponseStatusVariable !== void 0 || fixtureCallInformation.inlineStatusReference !== void 0;
271
- const redefineResponseStatusVariableName = `${responseVariableNameToUse}Status`;
272
- const isResponseHeadersVariableRedefinitionNeeded = destructuringResponseHeadersVariable !== void 0 && // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
273
- destructuringResponseHeadersVariable.type === AST_NODE_TYPES.ObjectPattern || fixtureCallInformation.inlineHeadersReference !== void 0;
274
- const redefineResponseHeadersVariableName = `${responseVariableNameToUse}Headers`;
275
- const isResponseVariableRedefinitionNeeded = fixtureCallInformation.variableAssignment === void 0 && responseVariable === void 0 && fixtureCallInformation.assertions !== void 0 || isResponseBodyVariableRedefinitionNeeded || isResponseStatusVariableRedefinitionNeeded || isResponseHeadersVariableRedefinitionNeeded;
276
- const responseBodyHeadersVariableRedefineLines = isResponseVariableRedefinitionNeeded ? [
277
- // eslint-disable-next-line no-nested-ternary
278
- ...destructuringResponseBodyVariable ? [
279
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
280
- `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseBodyVariable.type === AST_NODE_TYPES.ObjectPattern ? sourceCode.getText(destructuringResponseBodyVariable) : destructuringResponseBodyVariable.name} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`
281
- ] : isResponseBodyVariableRedefinitionNeeded ? [
282
- `const ${redefineResponseBodyVariableName} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`
283
- ] : [],
284
- // eslint-disable-next-line no-nested-ternary
285
- ...destructuringResponseStatusVariable ? [
286
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
287
- `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseStatusVariable.type === AST_NODE_TYPES.ObjectPattern ? sourceCode.getText(destructuringResponseStatusVariable) : destructuringResponseStatusVariable.name} = ${getResponseStatusRetrievalText(responseVariableNameToUse)}`
288
- ] : isResponseStatusVariableRedefinitionNeeded ? [
289
- `const ${redefineResponseStatusVariableName} = ${getResponseStatusRetrievalText(responseVariableNameToUse)}`
290
- ] : [],
291
- // eslint-disable-next-line no-nested-ternary
292
- ...destructuringResponseHeadersVariable ? (
293
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
294
- destructuringResponseHeadersVariable.type === AST_NODE_TYPES.ObjectPattern ? destructuringResponseHeadersVariable.properties.map((property) => {
295
- assert.ok(property.type === AST_NODE_TYPES.Property);
296
- assert.equal(property.value.type, AST_NODE_TYPES.Identifier);
297
- return `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${property.value.name} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}.get(${property.key.type === AST_NODE_TYPES.Literal ? sourceCode.getText(property.key) : `'${sourceCode.getText(property.key)}'`})`;
298
- }) : [
299
- `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${destructuringResponseHeadersVariable.name} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}`
300
- ]
301
- ) : isResponseHeadersVariableRedefinitionNeeded ? [
302
- `const ${redefineResponseHeadersVariableName} = ${getResponseHeadersRetrievalText(responseVariableNameToUse)}`
303
- ] : []
304
- ] : [];
305
- const { statusAssertion, nonStatusAssertions } = createResponseAssertions(
306
- fixtureCallInformation,
307
- sourceCode,
308
- responseVariableNameToUse,
309
- destructuringResponseHeadersVariable
310
- );
311
- const fetchCallText = `fetch(${fetchUrlArgumentText}, ${fetchRequestArgumentLines})`;
312
- const fetchStatementText = !isResponseVariableRedefinitionNeeded ? fetchCallText : `${fixtureCallInformation.variableDeclaration?.kind ?? "const"} ${responseVariableNameToUse} = await ${fetchCallText}`;
313
- const nodeToReplace = isResponseVariableRedefinitionNeeded ? fixtureCallInformation.rootNode : fixtureCallInformation.fixtureNode;
314
- const appendingAssignmentAndAssertionText = [
315
- "",
316
- ...statusAssertion !== void 0 ? [statusAssertion] : [],
317
- ...responseBodyHeadersVariableRedefineLines,
318
- ...nonStatusAssertions
319
- ].join(`;
320
- ${indentation}`);
321
- context.report({
322
- node: fixtureCall,
323
- messageId: "preferNativeFetch",
324
- *fix(fixer) {
325
- if (fixtureCallInformation.inlineStatementNode) {
326
- const preInlineDeclaration = [
327
- fetchStatementText,
328
- `${appendingAssignmentAndAssertionText};
329
- ${indentation}`
330
- ].join(``);
331
- yield fixer.insertTextBefore(fixtureCallInformation.inlineStatementNode, preInlineDeclaration);
332
- } else {
333
- yield fixer.replaceText(nodeToReplace, fetchStatementText);
334
- const needEndingSemiColon = sourceCode.getText(nodeToReplace).endsWith(";");
335
- yield fixer.insertTextAfter(
336
- nodeToReplace,
337
- needEndingSemiColon ? `${appendingAssignmentAndAssertionText};` : appendingAssignmentAndAssertionText
338
- );
339
- }
340
- for (const responseBodyReference of responseBodyReferences) {
341
- yield fixer.replaceText(
342
- responseBodyReference,
343
- isResponseBodyVariableRedefinitionNeeded || !isResponseBodyRedefinition(responseBodyReference) ? redefineResponseBodyVariableName : getResponseBodyRetrievalText(responseVariableNameToUse)
344
- );
345
- }
346
- if (fixtureCallInformation.inlineBodyReference) {
347
- yield fixer.replaceText(fixtureCallInformation.inlineBodyReference, redefineResponseBodyVariableName);
348
- }
349
- for (const responseStatusReference of responseStatusReferences) {
350
- if (responseStatusReference.property.type === AST_NODE_TYPES.Identifier && responseStatusReference.property.name === "statusCode") {
351
- yield fixer.replaceText(responseStatusReference.property, `status`);
352
- }
353
- }
354
- if (fixtureCallInformation.rootNode.type === AST_NODE_TYPES.ReturnStatement && fixtureCallInformation.assertions !== void 0) {
355
- yield fixer.insertTextAfter(
356
- fixtureCallInformation.rootNode,
357
- `
358
- ${indentation}return ${responseVariableNameToUse};`
359
- );
360
- }
361
- }
362
- });
363
- } catch (error) {
364
- console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
365
- context.report({
366
- node: fixtureCall,
367
- messageId: "unknownError",
368
- data: {
369
- fileName: context.filename,
370
- error: error instanceof Error ? error.toString() : JSON.stringify(error)
371
- }
372
- });
373
- }
374
- }
375
- };
376
- }
377
- });
378
- var no_fixture_default = rule;
379
- export {
380
- no_fixture_default as default,
381
- ruleId
382
- };
383
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FnZW50L25vLWZpeHR1cmUudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxVQUFVLGNBQWM7QUFFakMsU0FBUyxnQkFBZ0IsbUJBQTZCO0FBSXREO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyx5QkFBeUI7QUFDaEMsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyxpQ0FBaUM7QUFDMUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsNENBQTRDO0FBRTlDLElBQU0sU0FBUztBQXdCdEIsU0FBUyxtQkFBbUIsTUFBK0IsU0FBaUMsWUFBd0I7QUFDbEgsUUFBTSxTQUFTLFVBQVUsSUFBSTtBQUM3QixTQUFPLEdBQUcsUUFBUSxxREFBcUQ7QUFFdkUsTUFBSTtBQUNKLE1BQUksT0FBTyxTQUFTLGVBQWUsaUJBQWlCO0FBRWxELFlBQVEsY0FBYztBQUN0QixZQUFRLFdBQVc7QUFBQSxFQUNyQixXQUNFLE9BQU8sU0FBUyxlQUFlLG1CQUMvQixPQUFPLFNBQVMsZUFBZSxrQkFDL0IsT0FBTyxTQUFTLGVBQWUseUJBQy9CO0FBRUEsWUFBUSxjQUFjO0FBQ3RCLFlBQVEsV0FBVztBQUFBLEVBQ3JCLFdBQVcsT0FBTyxTQUFTLGVBQWUsaUJBQWlCO0FBQ3pELFlBQVEsY0FBYztBQUN0QixVQUFNLHFCQUFxQixzQkFBc0IsTUFBTTtBQUN2RCxXQUFPLEdBQUcsa0JBQWtCO0FBQzVCLFVBQU0sY0FBYyxVQUFVLE1BQU07QUFDcEMsUUFBSSxhQUFhLFNBQVMsZUFBZSxrQkFBa0I7QUFDekQsY0FBUSxXQUFXO0FBQ25CLGNBQVEsc0JBQXNCO0FBQzlCLFVBQUksWUFBWSxTQUFTLFNBQVMsZUFBZSxjQUFjLFlBQVksU0FBUyxTQUFTLFFBQVE7QUFDbkcsZ0JBQVEsc0JBQXNCO0FBQUEsTUFDaEM7QUFDQSxVQUNFLFlBQVksU0FBUyxTQUFTLGVBQWUsZUFDNUMsWUFBWSxTQUFTLFNBQVMsWUFBWSxZQUFZLFNBQVMsU0FBUyxlQUN6RTtBQUNBLGdCQUFRLHdCQUF3QjtBQUFBLE1BQ2xDO0FBQ0EsVUFDRSxZQUFZLFNBQVMsU0FBUyxlQUFlLGVBQzVDLFlBQVksU0FBUyxTQUFTLFlBQVksWUFBWSxTQUFTLFNBQVMsWUFDekU7QUFDQSxnQkFBUSx5QkFBeUI7QUFBQSxNQUNuQztBQUFBLElBQ0YsV0FBVyxtQkFBbUIsU0FBUyxlQUFlLHFCQUFxQjtBQUN6RSxjQUFRLHNCQUFzQjtBQUM5QixjQUFRLFdBQVc7QUFBQSxJQUNyQixXQUNFLG1CQUFtQixTQUFTLGVBQWUsdUJBQzNDLG1CQUFtQixXQUFXLFNBQVMsZUFBZSxzQkFDdEQ7QUFDQSxjQUFRLHFCQUFxQjtBQUM3QixjQUFRLFdBQVc7QUFBQSxJQUNyQixPQUFPO0FBQ0wsY0FBUSxXQUFXO0FBQUEsSUFDckI7QUFBQSxFQUNGLFdBQVcsT0FBTyxTQUFTLGVBQWUsb0JBQW9CLE9BQU8sU0FBUyxTQUFTLGVBQWUsWUFBWTtBQUNoSCxRQUFJLE9BQU8sU0FBUyxTQUFTLFVBQVU7QUFFckMsWUFBTSxnQkFBZ0IsVUFBVSxNQUFNO0FBQ3RDLGFBQU8sR0FBRyxpQkFBaUIsY0FBYyxTQUFTLGVBQWUsY0FBYztBQUMvRSxjQUFRLGFBQWEsQ0FBQyxHQUFJLFFBQVEsY0FBYyxDQUFDLEdBQUksY0FBYyxTQUFrQztBQUNyRyxpQkFBVztBQUFBLElBQ2IsV0FBVyxPQUFPLFNBQVMsU0FBUyxRQUFRO0FBRTFDLFlBQU0sc0JBQXNCLFVBQVUsTUFBTTtBQUM1QyxhQUFPLEdBQUcsdUJBQXVCLG9CQUFvQixTQUFTLGVBQWUsY0FBYztBQUMzRixjQUFRLGNBQWMsb0JBQW9CLFVBQVUsQ0FBQztBQUNyRCxpQkFBVztBQUFBLElBQ2IsV0FBVyxPQUFPLFNBQVMsU0FBUyxPQUFPO0FBRXpDLFlBQU0sdUJBQXVCLFVBQVUsTUFBTTtBQUM3QyxhQUFPLEdBQUcsd0JBQXdCLHFCQUFxQixTQUFTLGVBQWUsY0FBYztBQUM3RixZQUFNLENBQUMsTUFBTSxJQUFJLElBQUkscUJBQXFCO0FBQzFDLFVBQUksS0FBSyxTQUFTLGVBQWUsa0JBQWtCO0FBQ2pELGdCQUFRLDhCQUE4QjtBQUFBLE1BQ3hDLE9BQU87QUFDTCxnQkFBUSxpQkFBaUIsQ0FBQyxHQUFJLFFBQVEsa0JBQWtCLENBQUMsR0FBSSxFQUFFLE1BQU0sTUFBTSxPQUFPLEtBQUssQ0FBQztBQUFBLE1BQzFGO0FBQ0EsaUJBQVc7QUFBQSxJQUNiO0FBQUEsRUFDRixPQUFPO0FBQ0wsVUFBTSxJQUFJLE1BQU0sbURBQW1ELFdBQVcsUUFBUSxNQUFNLENBQUMsR0FBRztBQUFBLEVBQ2xHO0FBQ0EsTUFBSSxVQUFVO0FBQ1osdUJBQW1CLFVBQVUsU0FBUyxVQUFVO0FBQUEsRUFDbEQ7QUFDRjtBQUdBLFNBQVMseUJBQ1Asd0JBQ0EsWUFDQSxzQkFDQSxzQ0FDQTtBQUNBLE1BQUk7QUFDSixRQUFNLHNCQUFnQyxDQUFDO0FBQ3ZDLGFBQVcsbUJBQW1CLHVCQUF1QixjQUFjLENBQUMsR0FBRztBQUNyRSxRQUFJLGdCQUFnQixXQUFXLEdBQUc7QUFDaEMsWUFBTSxDQUFDLGlCQUFpQixJQUFJO0FBQzVCLGFBQU8sR0FBRyxpQkFBaUI7QUFDM0IsVUFDRyxrQkFBa0IsU0FBUyxlQUFlLG9CQUN6QyxrQkFBa0IsT0FBTyxTQUFTLGVBQWUsY0FDakQsa0JBQWtCLE9BQU8sU0FBUyxpQkFDcEMsa0JBQWtCLFNBQVMsZUFBZSxXQUMxQyxXQUFXLFFBQVEsaUJBQWtDLEVBQUUsU0FBUyxjQUFjLEdBQzlFO0FBRUEsMEJBQWtCLGdCQUFnQixvQkFBb0IsWUFBWSxXQUFXLFFBQVEsaUJBQWlCLENBQUM7QUFBQSxNQUN6RyxXQUFXLGtCQUFrQixTQUFTLGVBQWUseUJBQXlCO0FBRTVFLFlBQUksZUFBZSxXQUFXLFFBQVEsa0JBQWtCLElBQUk7QUFFNUQsY0FBTSxDQUFDLHdCQUF3QixJQUFJLGtCQUFrQjtBQUNyRCxlQUFPLEdBQUcsMEJBQTBCLFNBQVMsZUFBZSxVQUFVO0FBQ3RFLGNBQU0sK0JBQStCLHlCQUF5QjtBQUM5RCxZQUFJLGlDQUFpQyxzQkFBc0I7QUFDekQseUJBQWUsYUFBYTtBQUFBLFlBQzFCLElBQUksT0FBTyxNQUFNLDRCQUE0QixPQUFPLElBQUk7QUFBQSxZQUN4RDtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQ0EsNEJBQW9CLEtBQUssMkJBQTJCLFlBQVksR0FBRztBQUFBLE1BQ3JFLFdBQVcsa0JBQWtCLFNBQVMsZUFBZSxZQUFZO0FBRS9ELDRCQUFvQjtBQUFBLFVBQ2xCLDJCQUEyQixXQUFXLFFBQVEsaUJBQWlCLENBQUMsSUFBSSxvQkFBb0I7QUFBQSxRQUMxRjtBQUFBLE1BQ0YsV0FDRSxrQkFBa0IsU0FBUyxlQUFlLG9CQUMxQyxrQkFBa0IsU0FBUyxlQUFlLGdCQUMxQztBQUVBLDRCQUFvQjtBQUFBLFVBQ2xCLDBCQUEwQixvQkFBb0IsWUFBWSxXQUFXLFFBQVEsaUJBQWlCLENBQUM7QUFBQSxRQUNqRztBQUFBLE1BQ0YsT0FBTztBQUNMLGNBQU0sSUFBSSxNQUFNLHFEQUFxRCxXQUFXLFFBQVEsaUJBQWlCLENBQUMsR0FBRztBQUFBLE1BQy9HO0FBQUEsSUFDRixXQUFXLGdCQUFnQixXQUFXLEdBQUc7QUFFdkMsWUFBTSxDQUFDLFlBQVksV0FBVyxJQUFJO0FBQ2xDLGFBQU8sR0FBRyxjQUFjLFdBQVc7QUFDbkMsWUFBTSxtQkFDSix5Q0FBeUMsU0FDckMscUNBQXFDLE9BQ3JDLEdBQUcsb0JBQW9CO0FBQzdCLFVBQUksWUFBWSxTQUFTLGVBQWUsV0FBVyxZQUFZLGlCQUFpQixRQUFRO0FBQ3RGLDRCQUFvQjtBQUFBLFVBQ2xCLGFBQWEsZ0JBQWdCLFFBQVEsV0FBVyxRQUFRLFVBQVUsQ0FBQyxXQUFXLFdBQVcsUUFBUSxXQUFXLENBQUM7QUFBQSxRQUMvRztBQUFBLE1BQ0YsT0FBTztBQUNMLDRCQUFvQjtBQUFBLFVBQ2xCLGdCQUFnQixnQkFBZ0IsUUFBUSxXQUFXLFFBQVEsVUFBVSxDQUFDLE1BQU0sV0FBVyxRQUFRLFdBQVcsQ0FBQztBQUFBLFFBQzdHO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyw2QkFDUCxZQUNBLGlCQUNBLHlCQUNBLGNBQ0Esd0JBQ0EsbUJBQ0E7QUFDQSxNQUFJLHVCQUF1QixvQkFBb0I7QUFDN0MsV0FBTztBQUFBLE1BQ0wsdUJBQXVCLG1CQUFtQixXQUFXLFNBQVMsZUFBZSx3QkFDM0UsdUJBQXVCLG1CQUFtQixXQUFXLEtBQUssU0FBUyxlQUFlO0FBQUEsSUFDdEY7QUFDQSxXQUFPLHVCQUF1QixtQkFBbUIsV0FBVyxLQUFLO0FBQUEsRUFDbkU7QUFFQSxNQUFJLHVCQUF1QixxQkFBcUI7QUFDOUMsVUFBTSxtQkFBbUIsdUJBQXVCLG9CQUFvQixhQUFhLENBQUM7QUFFbEYsUUFBSSxxQkFBcUIsVUFBYSxpQkFBaUIsR0FBRyxTQUFTLGVBQWUsWUFBWTtBQUM1RixhQUFPLGlCQUFpQixHQUFHO0FBQUEsSUFDN0I7QUFBQSxFQUNGO0FBRUEsUUFBTSxxQkFBcUIsc0JBQXNCLHVCQUF1QixRQUFRO0FBQ2hGLGVBQWEscUJBQXFCLHVCQUF1QixRQUFRO0FBQ2pFLFNBQU8sR0FBRyxrQkFBa0I7QUFDNUIsUUFBTSxRQUFRLGFBQWEsUUFBUSxrQkFBa0I7QUFDckQsU0FBTyxHQUFHLFVBQVUsSUFBSTtBQUN4QixNQUFJLGlCQUFpQixrQkFBa0IsSUFBSSxLQUFLO0FBQ2hELE1BQUksQ0FBQyxnQkFBZ0I7QUFDbkIscUJBQWlCLENBQUMsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDO0FBQ3JDLHNCQUFrQixJQUFJLE9BQU8sY0FBYztBQUFBLEVBQzdDO0FBRUEsTUFBSSwyQkFBMkI7QUFDL0IsTUFBSSxnQkFBZ0IsU0FBUyxlQUFlLFdBQVcsZ0JBQWdCLFNBQVMsZUFBZSxpQkFBaUI7QUFDOUcsVUFBTSxtQkFBbUIsd0JBQXdCLFFBQVEsV0FBVyxFQUFFO0FBQ3RFLFVBQU0sa0JBQWtCLGlCQUFpQixTQUFTLEdBQUcsSUFDakQsaUJBQWlCLE1BQU0sR0FBRyxpQkFBaUIsUUFBUSxHQUFHLENBQUMsSUFDdkQ7QUFDSixVQUFNLFFBQVEsZ0JBQWdCLFdBQVcsSUFBSSxJQUN6QyxnQkFBZ0IsTUFBTSxHQUFHLEVBQUUsTUFBTSxDQUFDO0FBQUE7QUFBQSxNQUVsQyxnQkFBZ0IsTUFBTSxHQUFHLEVBQUUsTUFBTSxDQUFDO0FBQUE7QUFFdEMsK0JBQTJCLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLFNBQVMsUUFBUSxHQUFHLFdBQVcsa0JBQWtCLENBQUMsRUFDckcsSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLE1BQU0sQ0FBQyxFQUNoQyxLQUFLLEVBQ0wsT0FBTyxDQUFDLFNBQVMsS0FBSyxLQUFLLE1BQU0sTUFBTSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsRUFDOUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRyxZQUFZLEtBQUssRUFBRSxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxFQUMvRCxLQUFLLEVBQUU7QUFDViwrQkFBMkIsR0FBRyx5QkFBeUIsQ0FBQyxHQUFHLFlBQVksS0FBSyxFQUFFLEdBQUcseUJBQXlCLE1BQU0sQ0FBQyxDQUFDO0FBQUEsRUFDcEg7QUFFQSxNQUFJLDBCQUEwQjtBQUM5QixNQUFJO0FBQ0osU0FBTyw4QkFBOEIsUUFBVztBQUM5QyxnQ0FBNEIsR0FBRyx3QkFBd0IsR0FBRyw0QkFBNEIsSUFBSSxLQUFLLHdCQUF3QixTQUFTLENBQUM7QUFDakksUUFBSSxlQUFlLFNBQVMseUJBQXlCLEdBQUc7QUFDdEQsa0NBQTRCO0FBQUEsSUFDOUI7QUFDQTtBQUFBLEVBQ0Y7QUFDQSxpQkFBZSxLQUFLLHlCQUF5QjtBQUM3QyxTQUFPO0FBQ1Q7QUFFQSxTQUFTLDJCQUEyQix1QkFBMkQ7QUFDN0YsUUFBTSxTQUFTLFVBQVUscUJBQXFCO0FBQzlDLFNBQU8sUUFBUSxTQUFTLGVBQWUsc0JBQXNCLE9BQU8sR0FBRyxTQUFTLGVBQWU7QUFDakc7QUFFQSxJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxvQkFBb0IsSUFBSSxDQUFDO0FBRTlFLElBQU0sT0FBcUUsV0FBVztBQUFBLEVBQ3BGLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxNQUNiLEtBQUssb0JBQW9CLE1BQU07QUFBQSxJQUNqQztBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsbUJBQW1CO0FBQUEsTUFDbkIsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBO0FBQUEsRUFFakIsT0FBTyxTQUFTO0FBQ2QsVUFBTSxhQUFhLFFBQVE7QUFDM0IsVUFBTSxlQUFlLFdBQVc7QUFDaEMsV0FBTyxHQUFHLGlCQUFpQixJQUFJO0FBQy9CLFVBQU0sb0JBQW9CLG9CQUFJLElBQXFCO0FBRW5ELFdBQU87QUFBQTtBQUFBLE1BRUwsMEZBQTBGLENBQ3hGLGdCQUVHO0FBQ0gsWUFBSTtBQUNGLGNBQ0UsY0FBYyxXQUFXLE1BQ3hCLDBCQUEwQixXQUFXLEtBQUsscUJBQXFCLFdBQVcsR0FBRyxVQUFVLFFBQ3hGO0FBRUE7QUFBQSxVQUNGO0FBRUEsZ0JBQU0sa0JBQWtCLFlBQVk7QUFDcEMsaUJBQU8sR0FBRyxnQkFBZ0IsU0FBUyxlQUFlLGdCQUFnQjtBQUNsRSxnQkFBTSxjQUFjLGVBQWUsYUFBYSxVQUFVO0FBRTFELGdCQUFNLENBQUMsZUFBZSxJQUFJLFlBQVk7QUFDdEMsaUJBQU8sR0FBRyxvQkFBb0IsTUFBUztBQUV2QyxnQkFBTSx5QkFBeUIsQ0FBQztBQUNoQyw2QkFBbUIsYUFBYSx3QkFBd0IsVUFBVTtBQUVsRSxnQkFBTTtBQUFBLFlBQ0osVUFBVTtBQUFBLFlBQ1YsZ0JBQWdCO0FBQUE7QUFBQSxZQUVoQixrQkFBa0I7QUFBQSxZQUNsQiwyQkFBMkI7QUFBQSxZQUMzQiw2QkFBNkI7QUFBQSxZQUM3Qiw4QkFBOEI7QUFBQSxVQUNoQyxJQUFJLDBCQUEwQix1QkFBdUIscUJBQXFCLFlBQVk7QUFHdEYsZ0JBQU0sMEJBQTBCLFdBQVcsUUFBUSxlQUFlO0FBQ2xFLGdCQUFNLHVCQUF1QixxQ0FBcUMsdUJBQXVCO0FBR3pGLGdCQUFNLGFBQWEsZ0JBQWdCO0FBQ25DLGlCQUFPLEdBQUcsV0FBVyxTQUFTLGVBQWUsVUFBVTtBQUN2RCxnQkFBTSxhQUFhLFdBQVcsS0FBSyxZQUFZO0FBQy9DLGdCQUFNLGtCQUFrQixlQUFlLFFBQVEsV0FBVztBQUUxRCxnQkFBTSw0QkFBNEI7QUFBQSxZQUNoQztBQUFBLFlBQ0EsY0FBYyxlQUFlO0FBQUEsWUFDN0IsR0FBSSx1QkFBdUIsY0FDdkIsQ0FBQywwQkFBMEIsV0FBVyxRQUFRLHVCQUF1QixXQUFXLENBQUMsSUFBSSxJQUNyRixDQUFDO0FBQUE7QUFBQSxZQUVMLEdBQUksdUJBQXVCLDhCQUN2QixDQUFDLGNBQWMsV0FBVyxRQUFRLHVCQUF1QiwyQkFBMkIsQ0FBQyxHQUFHLElBQ3hGLHVCQUF1QixpQkFDckI7QUFBQSxjQUNFO0FBQUEsY0FDQSxHQUFHLHVCQUF1QixlQUFlO0FBQUEsZ0JBQ3ZDLENBQUMsRUFBRSxNQUFNLE1BQU07QUFBQTtBQUFBLGtCQUViLE9BQU8sS0FBSyxTQUFTLGVBQWUsVUFBVyxvQkFBb0IsS0FBSyxLQUFLLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLE1BQU8sSUFBSSxXQUFXLFFBQVEsSUFBSSxDQUFDLEdBQUcsS0FBSyxXQUFXLFFBQVEsS0FBSyxDQUFDO0FBQUE7QUFBQSxjQUNwTDtBQUFBLGNBQ0E7QUFBQSxZQUNGLElBQ0EsQ0FBQztBQUFBLFlBQ1A7QUFBQSxVQUNGLEVBQUUsS0FBSztBQUFBLEVBQUssV0FBVyxFQUFFO0FBRXpCLGdCQUFNLDRCQUE0QjtBQUFBLFlBQ2hDO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGO0FBRUEsZ0JBQU0sMkNBQ0osc0NBQXNDLFVBQ3RDLHVCQUF1Qix3QkFBd0IsVUFDOUMsdUJBQXVCLFNBQVMsS0FBSyxDQUFDLHVCQUF1QixLQUFLLDBCQUEwQjtBQUMvRixnQkFBTSxtQ0FBbUMsR0FBRyx5QkFBeUI7QUFFckUsZ0JBQU0sNkNBQ0osd0NBQXdDLFVBQ3hDLHVCQUF1QiwwQkFBMEI7QUFDbkQsZ0JBQU0scUNBQXFDLEdBQUcseUJBQXlCO0FBRXZFLGdCQUFNLDhDQUNILHlDQUF5QztBQUFBLFVBRXZDLHFDQUFnRSxTQUFTLGVBQWUsaUJBQzNGLHVCQUF1QiwyQkFBMkI7QUFDcEQsZ0JBQU0sc0NBQXNDLEdBQUcseUJBQXlCO0FBRXhFLGdCQUFNLHVDQUNILHVCQUF1Qix1QkFBdUIsVUFDN0MscUJBQXFCLFVBQ3JCLHVCQUF1QixlQUFlLFVBQ3hDLDRDQUNBLDhDQUNBO0FBRUYsZ0JBQU0sMkNBQTJDLHVDQUM3QztBQUFBO0FBQUEsWUFFRSxHQUFJLG9DQUNBO0FBQUE7QUFBQSxjQUVFLEdBQUcsdUJBQXVCLHFCQUFxQixRQUFRLE9BQU8sSUFBSyxrQ0FBNkQsU0FBUyxlQUFlLGdCQUFnQixXQUFXLFFBQVEsaUNBQTJELElBQUssa0NBQStDLElBQUksTUFBTSw2QkFBNkIseUJBQXlCLENBQUM7QUFBQSxZQUM3VyxJQUNBLDJDQUNFO0FBQUEsY0FDRSxTQUFTLGdDQUFnQyxNQUFNLDZCQUE2Qix5QkFBeUIsQ0FBQztBQUFBLFlBQ3hHLElBQ0EsQ0FBQztBQUFBO0FBQUEsWUFFUCxHQUFJLHNDQUNBO0FBQUE7QUFBQSxjQUVFLEdBQUcsdUJBQXVCLHFCQUFxQixRQUFRLE9BQU8sSUFBSyxvQ0FBK0QsU0FBUyxlQUFlLGdCQUFnQixXQUFXLFFBQVEsbUNBQTZELElBQUssb0NBQWlELElBQUksTUFBTSwrQkFBK0IseUJBQXlCLENBQUM7QUFBQSxZQUNyWCxJQUNBLDZDQUNFO0FBQUEsY0FDRSxTQUFTLGtDQUFrQyxNQUFNLCtCQUErQix5QkFBeUIsQ0FBQztBQUFBLFlBQzVHLElBQ0EsQ0FBQztBQUFBO0FBQUEsWUFFUCxHQUFJO0FBQUE7QUFBQSxjQUVDLHFDQUFnRSxTQUNqRSxlQUFlLGdCQUNaLHFDQUFnRSxXQUFXLElBQUksQ0FBQyxhQUFhO0FBQzVGLHVCQUFPLEdBQUcsU0FBUyxTQUFTLGVBQWUsUUFBUTtBQUNuRCx1QkFBTyxNQUFNLFNBQVMsTUFBTSxNQUFNLGVBQWUsVUFBVTtBQUUzRCx1QkFBTyxHQUFHLHVCQUF1QixxQkFBcUIsUUFBUSxPQUFPLElBQUksU0FBUyxNQUFNLElBQUksTUFBTSxnQ0FBZ0MseUJBQXlCLENBQUMsUUFBUSxTQUFTLElBQUksU0FBUyxlQUFlLFVBQVUsV0FBVyxRQUFRLFNBQVMsR0FBRyxJQUFJLElBQUksV0FBVyxRQUFRLFNBQVMsR0FBRyxDQUFDLEdBQUc7QUFBQSxjQUMvUixDQUFDLElBQ0Q7QUFBQSxnQkFDRSxHQUFHLHVCQUF1QixxQkFBcUIsUUFBUSxPQUFPLElBQUsscUNBQWtELElBQUksTUFBTSxnQ0FBZ0MseUJBQXlCLENBQUM7QUFBQSxjQUMzTDtBQUFBLGdCQUNGLDhDQUNFO0FBQUEsY0FDRSxTQUFTLG1DQUFtQyxNQUFNLGdDQUFnQyx5QkFBeUIsQ0FBQztBQUFBLFlBQzlHLElBQ0EsQ0FBQztBQUFBLFVBQ1QsSUFDQSxDQUFDO0FBRUwsZ0JBQU0sRUFBRSxpQkFBaUIsb0JBQW9CLElBQUk7QUFBQSxZQUMvQztBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0Y7QUFHQSxnQkFBTSxnQkFBZ0IsU0FBUyxvQkFBb0IsS0FBSyx5QkFBeUI7QUFDakYsZ0JBQU0scUJBQXFCLENBQUMsdUNBQ3hCLGdCQUNBLEdBQUcsdUJBQXVCLHFCQUFxQixRQUFRLE9BQU8sSUFBSSx5QkFBeUIsWUFBWSxhQUFhO0FBRXhILGdCQUFNLGdCQUFnQix1Q0FDbEIsdUJBQXVCLFdBQ3ZCLHVCQUF1QjtBQUMzQixnQkFBTSxzQ0FBc0M7QUFBQSxZQUMxQztBQUFBLFlBQ0EsR0FBSSxvQkFBb0IsU0FBWSxDQUFDLGVBQWUsSUFBSSxDQUFDO0FBQUEsWUFDekQsR0FBRztBQUFBLFlBQ0gsR0FBRztBQUFBLFVBQ0wsRUFBRSxLQUFLO0FBQUEsRUFBTSxXQUFXLEVBQUU7QUFFMUIsa0JBQVEsT0FBTztBQUFBLFlBQ2IsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFlBRVgsQ0FBQyxJQUFJLE9BQU87QUFDVixrQkFBSSx1QkFBdUIscUJBQXFCO0FBQzlDLHNCQUFNLHVCQUF1QjtBQUFBLGtCQUMzQjtBQUFBLGtCQUNBLEdBQUcsbUNBQW1DO0FBQUEsRUFBTSxXQUFXO0FBQUEsZ0JBQ3pELEVBQUUsS0FBSyxFQUFFO0FBQ1Qsc0JBQU0sTUFBTSxpQkFBaUIsdUJBQXVCLHFCQUFxQixvQkFBb0I7QUFBQSxjQUMvRixPQUFPO0FBQ0wsc0JBQU0sTUFBTSxZQUFZLGVBQWUsa0JBQWtCO0FBRXpELHNCQUFNLHNCQUFzQixXQUFXLFFBQVEsYUFBYSxFQUFFLFNBQVMsR0FBRztBQUMxRSxzQkFBTSxNQUFNO0FBQUEsa0JBQ1Y7QUFBQSxrQkFDQSxzQkFBc0IsR0FBRyxtQ0FBbUMsTUFBTTtBQUFBLGdCQUNwRTtBQUFBLGNBQ0Y7QUFHQSx5QkFBVyx5QkFBeUIsd0JBQXdCO0FBQzFELHNCQUFNLE1BQU07QUFBQSxrQkFDVjtBQUFBLGtCQUNBLDRDQUE0QyxDQUFDLDJCQUEyQixxQkFBcUIsSUFDekYsbUNBQ0EsNkJBQTZCLHlCQUF5QjtBQUFBLGdCQUM1RDtBQUFBLGNBQ0Y7QUFDQSxrQkFBSSx1QkFBdUIscUJBQXFCO0FBQzlDLHNCQUFNLE1BQU0sWUFBWSx1QkFBdUIscUJBQXFCLGdDQUFnQztBQUFBLGNBQ3RHO0FBcUJBLHlCQUFXLDJCQUEyQiwwQkFBMEI7QUFDOUQsb0JBQ0Usd0JBQXdCLFNBQVMsU0FBUyxlQUFlLGNBQ3pELHdCQUF3QixTQUFTLFNBQVMsY0FDMUM7QUFDQSx3QkFBTSxNQUFNLFlBQVksd0JBQXdCLFVBQVUsUUFBUTtBQUFBLGdCQUNwRTtBQUFBLGNBQ0Y7QUFHQSxrQkFDRSx1QkFBdUIsU0FBUyxTQUFTLGVBQWUsbUJBQ3hELHVCQUF1QixlQUFlLFFBQ3RDO0FBQ0Esc0JBQU0sTUFBTTtBQUFBLGtCQUNWLHVCQUF1QjtBQUFBLGtCQUN2QjtBQUFBLEVBQUssV0FBVyxVQUFVLHlCQUF5QjtBQUFBLGdCQUNyRDtBQUFBLGNBQ0Y7QUFBQSxZQUNGO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSCxTQUFTLE9BQU87QUFFZCxrQkFBUSxNQUFNLG1CQUFtQixNQUFNLG1CQUFtQixRQUFRLFFBQVEsTUFBTSxLQUFLO0FBQ3JGLGtCQUFRLE9BQU87QUFBQSxZQUNiLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxjQUNKLFVBQVUsUUFBUTtBQUFBLGNBQ2xCLE9BQU8saUJBQWlCLFFBQVEsTUFBTSxTQUFTLElBQUksS0FBSyxVQUFVLEtBQUs7QUFBQSxZQUN6RTtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDO0FBRUQsSUFBTyxxQkFBUTsiLAogICJuYW1lcyI6IFtdCn0K