@lenne.tech/cli 0.0.89 → 0.0.90
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/build/commands/init/fullstack.js +7 -148
- package/build/commands/init/init.js +166 -0
- package/package.json +1 -1
|
@@ -10,157 +10,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* Fullstack commands
|
|
14
14
|
*/
|
|
15
|
-
|
|
15
|
+
module.exports = {
|
|
16
16
|
name: 'fullstack',
|
|
17
17
|
alias: ['full'],
|
|
18
|
-
description: '
|
|
19
|
-
hidden:
|
|
18
|
+
description: 'Fullstack commands',
|
|
19
|
+
hidden: true,
|
|
20
20
|
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
// Start timer
|
|
24
|
-
const timer = system.startTimer();
|
|
25
|
-
// Info
|
|
26
|
-
info('Create a new fullstack workspace');
|
|
27
|
-
// Check git
|
|
28
|
-
if (!(yield git.gitInstalled())) {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
// Get name of the workspace
|
|
32
|
-
const name = yield helper.getInput(parameters.first, {
|
|
33
|
-
name: 'workspace name',
|
|
34
|
-
showError: true,
|
|
35
|
-
});
|
|
36
|
-
if (!name) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
// Set project directory
|
|
40
|
-
const projectDir = kebabCase(name);
|
|
41
|
-
// Check if directory already exists
|
|
42
|
-
if (filesystem.exists(projectDir)) {
|
|
43
|
-
info(``);
|
|
44
|
-
error(`There's already a folder named "${projectDir}" here.`);
|
|
45
|
-
return undefined;
|
|
46
|
-
}
|
|
47
|
-
let frontend = (yield ask({
|
|
48
|
-
type: 'input',
|
|
49
|
-
name: 'frontend',
|
|
50
|
-
message: 'Angular (a) or Nuxt 3 (n)',
|
|
51
|
-
})).frontend;
|
|
52
|
-
if (frontend === 'a') {
|
|
53
|
-
frontend = 'angular';
|
|
54
|
-
}
|
|
55
|
-
else if (frontend === 'n') {
|
|
56
|
-
frontend = 'nuxt';
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
process.exit();
|
|
60
|
-
}
|
|
61
|
-
let addToGit = false;
|
|
62
|
-
let gitLink;
|
|
63
|
-
if (parameters.third !== 'false') {
|
|
64
|
-
addToGit = parameters.third === 'true' || (yield confirm(`Add workspace to a new git repository?`));
|
|
65
|
-
// Check if git init is active
|
|
66
|
-
if (addToGit) {
|
|
67
|
-
// Get name of the app
|
|
68
|
-
gitLink = yield helper.getInput(null, {
|
|
69
|
-
name: 'git repository link',
|
|
70
|
-
showError: true,
|
|
71
|
-
});
|
|
72
|
-
if (!gitLink) {
|
|
73
|
-
addToGit = false;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
const workspaceSpinner = spin(`Create fullstack workspace with ${frontend} in ${projectDir} with ${name} app`);
|
|
78
|
-
// Clone monorepo
|
|
79
|
-
yield system.run(`git clone https://github.com/lenneTech/lt-monorepo.git ${projectDir}`);
|
|
80
|
-
// Check for directory
|
|
81
|
-
if (!filesystem.isDirectory(`./${projectDir}`)) {
|
|
82
|
-
error(`The directory "${projectDir}" could not be created.`);
|
|
83
|
-
return undefined;
|
|
84
|
-
}
|
|
85
|
-
workspaceSpinner.succeed(`Create fullstack workspace with ${frontend} in ${projectDir} for ${name} created`);
|
|
86
|
-
// Include example app
|
|
87
|
-
const ngBaseSpinner = spin(`Integrate example for ${frontend}`);
|
|
88
|
-
// Remove git folder after clone
|
|
89
|
-
yield system.run(`cd ${projectDir} && rm -rf .git`);
|
|
90
|
-
// Check if git init is active
|
|
91
|
-
if (addToGit) {
|
|
92
|
-
yield system.run(`cd ${projectDir} && git init --initial-branch=dev`);
|
|
93
|
-
yield system.run(`cd ${projectDir} && git remote add origin ${gitLink}`);
|
|
94
|
-
yield system.run(`cd ${projectDir} && git add .`);
|
|
95
|
-
yield system.run(`cd ${projectDir} && git commit -m "Initial commit"`);
|
|
96
|
-
yield system.run(`cd ${projectDir} && git push -u origin dev`);
|
|
97
|
-
}
|
|
98
|
-
if (frontend === 'angular') {
|
|
99
|
-
// Clone ng-base-starter
|
|
100
|
-
yield system.run(`cd ${projectDir}/projects && git clone https://github.com/lenneTech/ng-base-starter.git app`);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
yield system.run(`cd ${projectDir}/projects && npx create-nuxt-base app`);
|
|
104
|
-
}
|
|
105
|
-
// Remove gitkeep file
|
|
106
|
-
yield system.run(`cd ${projectDir}/projects && rm .gitkeep`);
|
|
107
|
-
// Remove git folder after clone
|
|
108
|
-
yield system.run(`cd ${projectDir}/projects/app && rm -rf .git`);
|
|
109
|
-
// Integrate files
|
|
110
|
-
if (filesystem.isDirectory(`./${projectDir}/projects/app`)) {
|
|
111
|
-
// Check if git init is active
|
|
112
|
-
if (addToGit) {
|
|
113
|
-
// Commit changes
|
|
114
|
-
yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: ${frontend} example integrated" && git push`);
|
|
115
|
-
}
|
|
116
|
-
// Angular example integration done
|
|
117
|
-
ngBaseSpinner.succeed(`Example for ${frontend} integrated`);
|
|
118
|
-
// Include files from https://github.com/lenneTech/nest-server-starter
|
|
119
|
-
// Init
|
|
120
|
-
const serverSpinner = spin(`Integrate Nest Server Starter`);
|
|
121
|
-
// Clone api
|
|
122
|
-
yield system.run(`cd ${projectDir}/projects && git clone https://github.com/lenneTech/nest-server-starter api`);
|
|
123
|
-
// Integrate files
|
|
124
|
-
if (filesystem.isDirectory(`./${projectDir}/projects/api`)) {
|
|
125
|
-
// Remove git folder from clone
|
|
126
|
-
yield system.run(`cd ${projectDir}/projects/api && rm -rf .git`);
|
|
127
|
-
// Prepare meta.json in api
|
|
128
|
-
filesystem.write(`./${projectDir}/projects/api/src/meta.json`, {
|
|
129
|
-
name: `${name}-api-server`,
|
|
130
|
-
description: `API for ${name} app`,
|
|
131
|
-
version: '0.0.0',
|
|
132
|
-
});
|
|
133
|
-
// Check if git init is active
|
|
134
|
-
if (addToGit) {
|
|
135
|
-
// Commit changes
|
|
136
|
-
yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: Nest Server Starter integrated" && git push`);
|
|
137
|
-
}
|
|
138
|
-
// Done
|
|
139
|
-
serverSpinner.succeed('Nest Server Starter integrated');
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
serverSpinner.warn('Nest Server Starter not integrated');
|
|
143
|
-
}
|
|
144
|
-
// Install all packages
|
|
145
|
-
const installSpinner = spin('Install all packages');
|
|
146
|
-
yield system.run(`cd ${projectDir} && npm i && npm run init`);
|
|
147
|
-
installSpinner.succeed('Successfull installed all packages');
|
|
148
|
-
// We're done, so show what to do next
|
|
149
|
-
info(``);
|
|
150
|
-
success(`Generated fullstack workspace with ${frontend} in ${projectDir} with ${name} app in ${helper.msToMinutesAndSeconds(timer())}m.`);
|
|
151
|
-
info(``);
|
|
152
|
-
info(`Next:`);
|
|
153
|
-
info(` Run ${name}`);
|
|
154
|
-
info(` $ cd ${projectDir}`);
|
|
155
|
-
info(` $ npm run start`);
|
|
156
|
-
info(``);
|
|
157
|
-
if (!toolbox.parameters.options.fromGluegunMenu) {
|
|
158
|
-
process.exit();
|
|
159
|
-
}
|
|
160
|
-
// For tests
|
|
161
|
-
return `new workspace ${projectDir} with ${name}`;
|
|
162
|
-
}
|
|
21
|
+
yield toolbox.helper.showMenu('fullstack');
|
|
22
|
+
return 'fullstack';
|
|
163
23
|
}),
|
|
164
24
|
};
|
|
165
|
-
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbHN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2luaXQvZnVsbHN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0E7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsSUFBSSxFQUFFLFdBQVc7SUFDakIsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQ2YsV0FBVyxFQUFFLG1DQUFtQztJQUNoRCxNQUFNLEVBQUUsS0FBSztJQUNiLEdBQUcsRUFBRSxDQUFPLE9BQStCLEVBQUUsRUFBRTtRQUM3Qyw2QkFBNkI7UUFDN0IsTUFBTSxFQUNKLFVBQVUsRUFDVixHQUFHLEVBQ0gsTUFBTSxFQUNOLFVBQVUsRUFDVixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFDckMsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUN4QixPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFDdEIsTUFBTSxHQUNQLEdBQUcsT0FBTyxDQUFDO1FBRVosY0FBYztRQUNkLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQyxPQUFPO1FBQ1AsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFFekMsWUFBWTtRQUNaLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUU7WUFDL0IsT0FBTztTQUNSO1FBRUQsNEJBQTRCO1FBQzVCLE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFO1lBQ25ELElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU87U0FDUjtRQUVELHdCQUF3QjtR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
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbHN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2luaXQvZnVsbHN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0dBRUc7QUFDSCxNQUFNLENBQUMsT0FBTyxHQUFHO0lBQ2YsSUFBSSxFQUFFLFdBQVc7SUFDakIsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQ2YsV0FBVyxFQUFFLG9CQUFvQjtJQUNqQyxNQUFNLEVBQUUsSUFBSTtJQUNaLEdBQUcsRUFBRSxDQUFPLE9BQStCLEVBQUUsRUFBRTtRQUM3QyxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUMsQ0FBQTtDQUNGLENBQUMifQ==
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
/**
|
|
13
|
+
* Create a new server
|
|
14
|
+
*/
|
|
15
|
+
const NewCommand = {
|
|
16
|
+
name: 'init',
|
|
17
|
+
alias: ['init'],
|
|
18
|
+
description: 'Creates a new fullstack workspace',
|
|
19
|
+
hidden: false,
|
|
20
|
+
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
+
// Retrieve the tools we need
|
|
22
|
+
const { filesystem, git, helper, parameters, print: { error, info, spin, success }, prompt: { confirm, ask }, strings: { kebabCase }, system, } = toolbox;
|
|
23
|
+
// Start timer
|
|
24
|
+
const timer = system.startTimer();
|
|
25
|
+
// Info
|
|
26
|
+
info('Create a new fullstack workspace');
|
|
27
|
+
// Check git
|
|
28
|
+
if (!(yield git.gitInstalled())) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Get name of the workspace
|
|
32
|
+
const name = yield helper.getInput(parameters.first, {
|
|
33
|
+
name: 'workspace name',
|
|
34
|
+
showError: true,
|
|
35
|
+
});
|
|
36
|
+
if (!name) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Set project directory
|
|
40
|
+
const projectDir = kebabCase(name);
|
|
41
|
+
// Check if directory already exists
|
|
42
|
+
if (filesystem.exists(projectDir)) {
|
|
43
|
+
info(``);
|
|
44
|
+
error(`There's already a folder named "${projectDir}" here.`);
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
let frontend = (yield ask({
|
|
48
|
+
type: 'input',
|
|
49
|
+
name: 'frontend',
|
|
50
|
+
message: 'Angular (a) or Nuxt 3 (n)',
|
|
51
|
+
})).frontend;
|
|
52
|
+
if (frontend === 'a') {
|
|
53
|
+
frontend = 'angular';
|
|
54
|
+
}
|
|
55
|
+
else if (frontend === 'n') {
|
|
56
|
+
frontend = 'nuxt';
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
process.exit();
|
|
60
|
+
}
|
|
61
|
+
let addToGit = false;
|
|
62
|
+
let gitLink;
|
|
63
|
+
if (parameters.third !== 'false') {
|
|
64
|
+
addToGit = parameters.third === 'true' || (yield confirm(`Add workspace to a new git repository?`));
|
|
65
|
+
// Check if git init is active
|
|
66
|
+
if (addToGit) {
|
|
67
|
+
// Get name of the app
|
|
68
|
+
gitLink = yield helper.getInput(null, {
|
|
69
|
+
name: 'git repository link',
|
|
70
|
+
showError: true,
|
|
71
|
+
});
|
|
72
|
+
if (!gitLink) {
|
|
73
|
+
addToGit = false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const workspaceSpinner = spin(`Create fullstack workspace with ${frontend} in ${projectDir} with ${name} app`);
|
|
78
|
+
// Clone monorepo
|
|
79
|
+
yield system.run(`git clone https://github.com/lenneTech/lt-monorepo.git ${projectDir}`);
|
|
80
|
+
// Check for directory
|
|
81
|
+
if (!filesystem.isDirectory(`./${projectDir}`)) {
|
|
82
|
+
error(`The directory "${projectDir}" could not be created.`);
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
workspaceSpinner.succeed(`Create fullstack workspace with ${frontend} in ${projectDir} for ${name} created`);
|
|
86
|
+
// Include example app
|
|
87
|
+
const ngBaseSpinner = spin(`Integrate example for ${frontend}`);
|
|
88
|
+
// Remove git folder after clone
|
|
89
|
+
yield system.run(`cd ${projectDir} && rm -rf .git`);
|
|
90
|
+
// Check if git init is active
|
|
91
|
+
if (addToGit) {
|
|
92
|
+
yield system.run(`cd ${projectDir} && git init --initial-branch=dev`);
|
|
93
|
+
yield system.run(`cd ${projectDir} && git remote add origin ${gitLink}`);
|
|
94
|
+
yield system.run(`cd ${projectDir} && git add .`);
|
|
95
|
+
yield system.run(`cd ${projectDir} && git commit -m "Initial commit"`);
|
|
96
|
+
yield system.run(`cd ${projectDir} && git push -u origin dev`);
|
|
97
|
+
}
|
|
98
|
+
if (frontend === 'angular') {
|
|
99
|
+
// Clone ng-base-starter
|
|
100
|
+
yield system.run(`cd ${projectDir}/projects && git clone https://github.com/lenneTech/ng-base-starter.git app`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
yield system.run(`cd ${projectDir}/projects && npx create-nuxt-base app`);
|
|
104
|
+
}
|
|
105
|
+
// Remove gitkeep file
|
|
106
|
+
yield system.run(`cd ${projectDir}/projects && rm .gitkeep`);
|
|
107
|
+
// Remove git folder after clone
|
|
108
|
+
yield system.run(`cd ${projectDir}/projects/app && rm -rf .git`);
|
|
109
|
+
// Integrate files
|
|
110
|
+
if (filesystem.isDirectory(`./${projectDir}/projects/app`)) {
|
|
111
|
+
// Check if git init is active
|
|
112
|
+
if (addToGit) {
|
|
113
|
+
// Commit changes
|
|
114
|
+
yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: ${frontend} example integrated" && git push`);
|
|
115
|
+
}
|
|
116
|
+
// Angular example integration done
|
|
117
|
+
ngBaseSpinner.succeed(`Example for ${frontend} integrated`);
|
|
118
|
+
// Include files from https://github.com/lenneTech/nest-server-starter
|
|
119
|
+
// Init
|
|
120
|
+
const serverSpinner = spin(`Integrate Nest Server Starter`);
|
|
121
|
+
// Clone api
|
|
122
|
+
yield system.run(`cd ${projectDir}/projects && git clone https://github.com/lenneTech/nest-server-starter api`);
|
|
123
|
+
// Integrate files
|
|
124
|
+
if (filesystem.isDirectory(`./${projectDir}/projects/api`)) {
|
|
125
|
+
// Remove git folder from clone
|
|
126
|
+
yield system.run(`cd ${projectDir}/projects/api && rm -rf .git`);
|
|
127
|
+
// Prepare meta.json in api
|
|
128
|
+
filesystem.write(`./${projectDir}/projects/api/src/meta.json`, {
|
|
129
|
+
name: `${name}-api-server`,
|
|
130
|
+
description: `API for ${name} app`,
|
|
131
|
+
version: '0.0.0',
|
|
132
|
+
});
|
|
133
|
+
// Check if git init is active
|
|
134
|
+
if (addToGit) {
|
|
135
|
+
// Commit changes
|
|
136
|
+
yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: Nest Server Starter integrated" && git push`);
|
|
137
|
+
}
|
|
138
|
+
// Done
|
|
139
|
+
serverSpinner.succeed('Nest Server Starter integrated');
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
serverSpinner.warn('Nest Server Starter not integrated');
|
|
143
|
+
}
|
|
144
|
+
// Install all packages
|
|
145
|
+
const installSpinner = spin('Install all packages');
|
|
146
|
+
yield system.run(`cd ${projectDir} && npm i && npm run init`);
|
|
147
|
+
installSpinner.succeed('Successfull installed all packages');
|
|
148
|
+
// We're done, so show what to do next
|
|
149
|
+
info(``);
|
|
150
|
+
success(`Generated fullstack workspace with ${frontend} in ${projectDir} with ${name} app in ${helper.msToMinutesAndSeconds(timer())}m.`);
|
|
151
|
+
info(``);
|
|
152
|
+
info(`Next:`);
|
|
153
|
+
info(` Run ${name}`);
|
|
154
|
+
info(` $ cd ${projectDir}`);
|
|
155
|
+
info(` $ npm run start`);
|
|
156
|
+
info(``);
|
|
157
|
+
if (!toolbox.parameters.options.fromGluegunMenu) {
|
|
158
|
+
process.exit();
|
|
159
|
+
}
|
|
160
|
+
// For tests
|
|
161
|
+
return `new workspace ${projectDir} with ${name}`;
|
|
162
|
+
}
|
|
163
|
+
}),
|
|
164
|
+
};
|
|
165
|
+
exports.default = NewCommand;
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9pbml0L2luaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFHQTs7R0FFRztBQUNILE1BQU0sVUFBVSxHQUFtQjtJQUNqQyxJQUFJLEVBQUUsTUFBTTtJQUNaLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNmLFdBQVcsRUFBRSxtQ0FBbUM7SUFDaEQsTUFBTSxFQUFFLEtBQUs7SUFDYixHQUFHLEVBQUUsQ0FBTyxPQUErQixFQUFFLEVBQUU7UUFDN0MsNkJBQTZCO1FBQzdCLE1BQU0sRUFDSixVQUFVLEVBQ1YsR0FBRyxFQUNILE1BQU0sRUFDTixVQUFVLEVBQ1YsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQ3JDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFDeEIsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQ3RCLE1BQU0sR0FDUCxHQUFHLE9BQU8sQ0FBQztRQUVaLGNBQWM7UUFDZCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMsT0FBTztRQUNQLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBRXpDLFlBQVk7UUFDWixJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFO1lBQy9CLE9BQU87U0FDUjtRQUVELDRCQUE0QjtRQUM1QixNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRTtZQUNuRCxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPO1NBQ1I7UUFFRCx3QkFBd0I7UUFDeEIsTUFBTSxV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
|