relion 0.1.1 → 0.3.0

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 (43) hide show
  1. package/dist/cli.js +64 -0
  2. package/dist/index.d.ts +231 -0
  3. package/dist/index.js +652 -0
  4. package/package.json +65 -73
  5. package/CHANGELOG.md +0 -47
  6. package/bin/cli.js +0 -9
  7. package/src/commands.js +0 -190
  8. package/src/defaults.js +0 -68
  9. package/src/index.js +0 -152
  10. package/src/lib/checkpoint.js +0 -23
  11. package/src/lib/configuration.js +0 -35
  12. package/src/lib/detect-package-manager.js +0 -49
  13. package/src/lib/format-commit-message.js +0 -4
  14. package/src/lib/latest-semver-tag.js +0 -34
  15. package/src/lib/lifecycles/bump.js +0 -234
  16. package/src/lib/lifecycles/changelog.js +0 -105
  17. package/src/lib/lifecycles/commit.js +0 -67
  18. package/src/lib/lifecycles/tag.js +0 -59
  19. package/src/lib/print-error.js +0 -15
  20. package/src/lib/run-exec.js +0 -19
  21. package/src/lib/run-execFile.js +0 -19
  22. package/src/lib/run-lifecycle-script.js +0 -18
  23. package/src/lib/stringify-package.js +0 -34
  24. package/src/lib/updaters/index.js +0 -127
  25. package/src/lib/updaters/types/csproj.js +0 -13
  26. package/src/lib/updaters/types/gradle.js +0 -16
  27. package/src/lib/updaters/types/json.js +0 -25
  28. package/src/lib/updaters/types/maven.js +0 -43
  29. package/src/lib/updaters/types/openapi.js +0 -15
  30. package/src/lib/updaters/types/plain-text.js +0 -7
  31. package/src/lib/updaters/types/python.js +0 -30
  32. package/src/lib/updaters/types/yaml.js +0 -15
  33. package/src/lib/write-file.js +0 -6
  34. package/src/preset/constants.js +0 -16
  35. package/src/preset/index.js +0 -19
  36. package/src/preset/parser.js +0 -11
  37. package/src/preset/templates/commit.hbs +0 -19
  38. package/src/preset/templates/footer.hbs +0 -10
  39. package/src/preset/templates/header.hbs +0 -10
  40. package/src/preset/templates/index.js +0 -13
  41. package/src/preset/templates/main.hbs +0 -21
  42. package/src/preset/whatBump.js +0 -32
  43. package/src/preset/writer.js +0 -201
package/dist/cli.js ADDED
@@ -0,0 +1,64 @@
1
+ import { resolve } from "node:path";
2
+ import { pathToFileURL } from "node:url";
3
+ import relion from "./index.js";
4
+ import { cli } from "cleye";
5
+
6
+ //#region src/cli.ts
7
+ let config;
8
+ try {
9
+ const configFileURL = pathToFileURL(resolve(process.cwd(), "relion.config.ts")).href;
10
+ config = (await import(configFileURL)).default;
11
+ } catch (error) {
12
+ throw new Error(`Error loading config: ${error.message}`);
13
+ }
14
+ const argv = cli({
15
+ name: "relion",
16
+ flags: {
17
+ bump: {
18
+ alias: "b",
19
+ type: Boolean,
20
+ description: "Bump the version",
21
+ default: false
22
+ },
23
+ changelog: {
24
+ alias: "l",
25
+ type: Boolean,
26
+ description: "Generate a changelog",
27
+ default: false
28
+ },
29
+ commit: {
30
+ alias: "c",
31
+ type: Boolean,
32
+ description: "Create a commit",
33
+ default: false
34
+ },
35
+ tag: {
36
+ alias: "t",
37
+ type: Boolean,
38
+ description: "Create a tag",
39
+ default: false
40
+ },
41
+ profile: {
42
+ alias: "p",
43
+ type: String,
44
+ description: "Use config profile"
45
+ },
46
+ dryRun: {
47
+ alias: "d",
48
+ type: Boolean,
49
+ description: "Run without making any changes",
50
+ default: false
51
+ }
52
+ }
53
+ });
54
+ if (!argv.flags.bump) config.bump = false;
55
+ if (!argv.flags.changelog) config.changelog = false;
56
+ if (!argv.flags.commit) config.commit = false;
57
+ if (!argv.flags.tag) config.tag = false;
58
+ if (argv.flags.profile) config.profile = argv.flags.profile;
59
+ if (argv.flags.dryRun) config.dryRun = argv.flags.dryRun;
60
+ await relion(config);
61
+
62
+ //#endregion
63
+ export { };
64
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwibmFtZXMiOlsiY29uZmlnOiBVc2VyQ29uZmlnIl0sInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJ1xuaW1wb3J0IHJlbGlvbiBmcm9tICcuL2luZGV4LmpzJ1xuaW1wb3J0IHR5cGUgeyBVc2VyQ29uZmlnIH0gZnJvbSAnQC90eXBlcydcbmltcG9ydCB7IGNsaSB9IGZyb20gJ2NsZXllJ1xuXG5sZXQgY29uZmlnOiBVc2VyQ29uZmlnXG5cbnRyeSB7XG5cdGNvbnN0IGNvbmZpZ0ZpbGVVUkwgPSBwYXRoVG9GaWxlVVJMKHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3JlbGlvbi5jb25maWcudHMnKSkuaHJlZlxuXHRjb25maWcgPSAoKGF3YWl0IGltcG9ydChjb25maWdGaWxlVVJMKSkgYXMgeyBkZWZhdWx0OiBVc2VyQ29uZmlnIH0pLmRlZmF1bHRcbn0gY2F0Y2ggKGVycm9yKSB7XG5cdHRocm93IG5ldyBFcnJvcihgRXJyb3IgbG9hZGluZyBjb25maWc6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApXG59XG5cbmNvbnN0IGFyZ3YgPSBjbGkoe1xuXHRuYW1lOiAncmVsaW9uJyxcblx0ZmxhZ3M6IHtcblx0XHRidW1wOiB7XG5cdFx0XHRhbGlhczogJ2InLFxuXHRcdFx0dHlwZTogQm9vbGVhbixcblx0XHRcdGRlc2NyaXB0aW9uOiAnQnVtcCB0aGUgdmVyc2lvbicsXG5cdFx0XHRkZWZhdWx0OiBmYWxzZSxcblx0XHR9LFxuXHRcdGNoYW5nZWxvZzoge1xuXHRcdFx0YWxpYXM6ICdsJyxcblx0XHRcdHR5cGU6IEJvb2xlYW4sXG5cdFx0XHRkZXNjcmlwdGlvbjogJ0dlbmVyYXRlIGEgY2hhbmdlbG9nJyxcblx0XHRcdGRlZmF1bHQ6IGZhbHNlLFxuXHRcdH0sXG5cdFx0Y29tbWl0OiB7XG5cdFx0XHRhbGlhczogJ2MnLFxuXHRcdFx0dHlwZTogQm9vbGVhbixcblx0XHRcdGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGEgY29tbWl0Jyxcblx0XHRcdGRlZmF1bHQ6IGZhbHNlLFxuXHRcdH0sXG5cdFx0dGFnOiB7XG5cdFx0XHRhbGlhczogJ3QnLFxuXHRcdFx0dHlwZTogQm9vbGVhbixcblx0XHRcdGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGEgdGFnJyxcblx0XHRcdGRlZmF1bHQ6IGZhbHNlLFxuXHRcdH0sXG5cdFx0cHJvZmlsZToge1xuXHRcdFx0YWxpYXM6ICdwJyxcblx0XHRcdHR5cGU6IFN0cmluZyxcblx0XHRcdGRlc2NyaXB0aW9uOiAnVXNlIGNvbmZpZyBwcm9maWxlJyxcblx0XHR9LFxuXHRcdGRyeVJ1bjoge1xuXHRcdFx0YWxpYXM6ICdkJyxcblx0XHRcdHR5cGU6IEJvb2xlYW4sXG5cdFx0XHRkZXNjcmlwdGlvbjogJ1J1biB3aXRob3V0IG1ha2luZyBhbnkgY2hhbmdlcycsXG5cdFx0XHRkZWZhdWx0OiBmYWxzZSxcblx0XHR9LFxuXHR9LFxufSlcblxuaWYgKCFhcmd2LmZsYWdzLmJ1bXApIGNvbmZpZy5idW1wID0gZmFsc2VcbmlmICghYXJndi5mbGFncy5jaGFuZ2Vsb2cpIGNvbmZpZy5jaGFuZ2Vsb2cgPSBmYWxzZVxuaWYgKCFhcmd2LmZsYWdzLmNvbW1pdCkgY29uZmlnLmNvbW1pdCA9IGZhbHNlXG5pZiAoIWFyZ3YuZmxhZ3MudGFnKSBjb25maWcudGFnID0gZmFsc2VcbmlmIChhcmd2LmZsYWdzLnByb2ZpbGUpIGNvbmZpZy5wcm9maWxlID0gYXJndi5mbGFncy5wcm9maWxlXG5pZiAoYXJndi5mbGFncy5kcnlSdW4pIGNvbmZpZy5kcnlSdW4gPSBhcmd2LmZsYWdzLmRyeVJ1blxuXG5hd2FpdCByZWxpb24oY29uZmlnKSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBTUEsSUFBSUE7QUFFSixJQUFJO0NBQ0gsTUFBTSxnQkFBZ0IsY0FBYyxRQUFRLFFBQVEsT0FBTyxxQkFBcUI7QUFDaEYsV0FBVyxNQUFNLE9BQU8sZ0JBQTRDO1NBQzVELE9BQU87QUFDZixPQUFNLElBQUksTUFBTSx5QkFBMEIsTUFBZ0I7O0FBRzNELE1BQU0sT0FBTyxJQUFJO0NBQ2hCLE1BQU07Q0FDTixPQUFPO0VBQ04sTUFBTTtHQUNMLE9BQU87R0FDUCxNQUFNO0dBQ04sYUFBYTtHQUNiLFNBQVM7O0VBRVYsV0FBVztHQUNWLE9BQU87R0FDUCxNQUFNO0dBQ04sYUFBYTtHQUNiLFNBQVM7O0VBRVYsUUFBUTtHQUNQLE9BQU87R0FDUCxNQUFNO0dBQ04sYUFBYTtHQUNiLFNBQVM7O0VBRVYsS0FBSztHQUNKLE9BQU87R0FDUCxNQUFNO0dBQ04sYUFBYTtHQUNiLFNBQVM7O0VBRVYsU0FBUztHQUNSLE9BQU87R0FDUCxNQUFNO0dBQ04sYUFBYTs7RUFFZCxRQUFRO0dBQ1AsT0FBTztHQUNQLE1BQU07R0FDTixhQUFhO0dBQ2IsU0FBUzs7OztBQUtaLElBQUksQ0FBQyxLQUFLLE1BQU0sS0FBTSxRQUFPLE9BQU87QUFDcEMsSUFBSSxDQUFDLEtBQUssTUFBTSxVQUFXLFFBQU8sWUFBWTtBQUM5QyxJQUFJLENBQUMsS0FBSyxNQUFNLE9BQVEsUUFBTyxTQUFTO0FBQ3hDLElBQUksQ0FBQyxLQUFLLE1BQU0sSUFBSyxRQUFPLE1BQU07QUFDbEMsSUFBSSxLQUFLLE1BQU0sUUFBUyxRQUFPLFVBQVUsS0FBSyxNQUFNO0FBQ3BELElBQUksS0FBSyxNQUFNLE9BQVEsUUFBTyxTQUFTLEtBQUssTUFBTTtBQUVsRCxNQUFNLE9BQU8ifQ==
@@ -0,0 +1,231 @@
1
+ import { HelperDeclareSpec } from "handlebars";
2
+
3
+ //#region src/types/config.d.ts
4
+ type FalseOrComplete<T> = false | Required<T>;
5
+ interface UserConfig {
6
+ bump?: boolean | BumpFiles;
7
+ changelog?: boolean | ChangelogOptions;
8
+ commit?: boolean | CommitOptions;
9
+ tag?: boolean | TagOptions;
10
+ newTagFormat?: string;
11
+ versionSourceFile?: string | VersionedFile;
12
+ releaseVersion?: string;
13
+ releaseType?: ReleaseType;
14
+ zeroMajorBreakingIsMinor?: boolean;
15
+ context?: Context;
16
+ commitsParser?: CommitsParser;
17
+ prevReleaseTagPattern?: RegExp;
18
+ dryRun?: boolean;
19
+ profile?: string;
20
+ [profile: `_${string}`]: UserConfig | undefined;
21
+ }
22
+ type OptionalKeys = 'releaseVersion' | 'releaseType' | 'context' | 'profile';
23
+ interface MergedConfig extends Omit<Required<UserConfig>, OptionalKeys>, Pick<UserConfig, OptionalKeys> {
24
+ changelog: FalseOrComplete<ChangelogOptions>;
25
+ commit: FalseOrComplete<CommitOptions>;
26
+ tag: FalseOrComplete<TagOptions>;
27
+ commitsParser: CompleteCommitsParser;
28
+ }
29
+ interface TransformedConfig extends Omit<MergedConfig, 'changelog'> {
30
+ versionSourceFile: VersionedFile;
31
+ bump: FalseOrComplete<VersionedFile[]>;
32
+ changelog: false | ResolvedChangelogOptions;
33
+ }
34
+ interface ContextualConfig extends TransformedConfig {
35
+ context: ResolvedContext;
36
+ }
37
+ type ResolvedConfig = ContextualConfig;
38
+ type BumpFiles = (string | VersionedFile)[];
39
+ interface ChangelogOptions {
40
+ stdout?: boolean;
41
+ outputFile?: string;
42
+ commitRange?: CommitRange;
43
+ sections?: ChangelogSectionDefinition[];
44
+ header?: string;
45
+ prevReleaseHeaderPattern?: RegExp;
46
+ helpers?: HelperDeclareSpec;
47
+ partials?: Record<string, string>;
48
+ }
49
+ type CompleteChangelogOptions = Required<ChangelogOptions>;
50
+ interface ResolvedChangelogOptions extends Omit<CompleteChangelogOptions, 'partials'> {
51
+ compiledPartials: Record<string, HandlebarsTemplateDelegate>;
52
+ }
53
+ interface CommitOptions {
54
+ message?: string;
55
+ signOff?: boolean;
56
+ gpgSign?: boolean;
57
+ stageAll?: boolean;
58
+ extraArgs?: string;
59
+ }
60
+ type CompleteCommitOptions = Required<CommitOptions>;
61
+ interface TagOptions {
62
+ name?: string;
63
+ message?: string;
64
+ gpgSign?: boolean;
65
+ force?: boolean;
66
+ extraArgs?: string;
67
+ }
68
+ type CompleteTagOptions = Required<TagOptions>;
69
+ interface CommitsParser {
70
+ breakingChangesPattern?: RegExp;
71
+ breakingChangeListPattern?: RegExp;
72
+ headerPattern?: RegExp;
73
+ tagPattern?: RegExp;
74
+ coAuthorPattern?: RegExp;
75
+ ghEmailPattern?: RegExp;
76
+ refPattern?: RegExp;
77
+ refActionPattern?: RegExp;
78
+ refLabelPattern?: RegExp;
79
+ remoteUrlPattern?: RegExp;
80
+ signerPattern?: RegExp;
81
+ dateSource?: 'authorDate' | 'committerDate';
82
+ dateFormat?: string;
83
+ }
84
+ type CompleteCommitsParser = Required<CommitsParser>;
85
+ interface RepoInfo {
86
+ host?: string;
87
+ owner?: string;
88
+ name?: string;
89
+ homepage?: string;
90
+ }
91
+ interface Context {
92
+ commits?: Commit[] | RawCommit[];
93
+ currentVersion?: string;
94
+ currentTag?: string;
95
+ newVersion?: string;
96
+ newTag?: string;
97
+ repo?: RepoInfo;
98
+ [key: string]: unknown;
99
+ }
100
+ interface ResolvedContext extends Required<Context> {
101
+ commits: Commit[];
102
+ releases: ReleaseWithGroupedCommits[] | null;
103
+ }
104
+ type CommitRange = 'all' | 'unreleased' | {
105
+ versionTag: string;
106
+ } | {
107
+ from: 'firstCommit' | (string & {});
108
+ } | {
109
+ to: 'HEAD' | (string & {});
110
+ } | {
111
+ from: 'firstCommit' | (string & {});
112
+ to: 'HEAD' | (string & {});
113
+ };
114
+ type ReleaseType = 'major' | 'minor' | 'patch';
115
+ interface VersionedFile {
116
+ filePath: string;
117
+ versionPattern: RegExp;
118
+ }
119
+ interface DefaultVersionedFile extends Omit<VersionedFile, 'filePath'> {
120
+ filePathRegex: RegExp;
121
+ }
122
+ //#endregion
123
+ //#region src/enums.d.ts
124
+ declare enum GpgSigLabel {
125
+ G = "valid",
126
+ B = "bad",
127
+ U = "valid, unknown validity",
128
+ X = "valid, expired",
129
+ Y = "valid, made by expired key",
130
+ R = "valid, made by revoked key",
131
+ E = "cannot check (missing key)",
132
+ N = "no signature",
133
+ }
134
+ declare enum RefType {
135
+ issue = "issue",
136
+ pr = "PR",
137
+ }
138
+ //#endregion
139
+ //#region src/types/commit.d.ts
140
+ type RawCommit = CommitMessageString | {
141
+ hash?: string;
142
+ message: string;
143
+ tagRefs?: string;
144
+ authorName?: string;
145
+ authorEmail?: string;
146
+ authorTs?: string;
147
+ committerName?: string;
148
+ committerEmail?: string;
149
+ committerTs?: string;
150
+ gpgSigCode?: GpgSigCode;
151
+ gpgSigKeyId?: string;
152
+ };
153
+ interface Commit extends CommitMessage {
154
+ hash?: string;
155
+ tags?: string[];
156
+ authors?: Contributor[];
157
+ committer?: Contributor;
158
+ refs?: Reference[];
159
+ gpgSig?: GpgSig;
160
+ date?: string;
161
+ }
162
+ interface CommitMessage {
163
+ type: string;
164
+ scope?: string;
165
+ subject: string;
166
+ body?: string;
167
+ breakingChanges?: string | string[];
168
+ footer?: string;
169
+ }
170
+ type CommitMessageString = string;
171
+ interface Reference {
172
+ action: string;
173
+ type?: RefType;
174
+ owner?: string;
175
+ repo?: string;
176
+ number: string;
177
+ }
178
+ type RefLabel = Pick<Reference, 'owner' | 'repo' | 'number'>;
179
+ interface Contributor {
180
+ name: string;
181
+ email: string;
182
+ hasSignedOff?: boolean;
183
+ ghLogin?: string;
184
+ ghUrl?: string;
185
+ }
186
+ type GithubUserInfo = Pick<Contributor, 'ghLogin' | 'ghUrl'>;
187
+ interface GpgSig {
188
+ code: GpgSigCode;
189
+ label: GpgSigLabel;
190
+ keyId?: string;
191
+ }
192
+ type GpgSigCode = 'G' | 'B' | 'U' | 'X' | 'Y' | 'R' | 'E' | 'N';
193
+ interface RawReference {
194
+ action: string;
195
+ labels: string;
196
+ }
197
+ //#endregion
198
+ //#region src/types/changelog.d.ts
199
+ interface ChangelogSectionDefinition {
200
+ title: string;
201
+ commitType: 'breaking' | '*' | (string & {}) | string[];
202
+ filter?: (commit: Commit) => boolean;
203
+ }
204
+ interface ResolvedChangelogSection {
205
+ title: string;
206
+ commits: Commit[];
207
+ }
208
+ interface ReleaseWithFlatCommits {
209
+ tag: string;
210
+ version?: string;
211
+ date?: string;
212
+ commits: Commit[];
213
+ }
214
+ interface ReleaseWithGroupedCommits extends Omit<ReleaseWithFlatCommits, 'commits'> {
215
+ commitGroups: ResolvedChangelogSection[];
216
+ }
217
+ interface ReleaseContext extends ReleaseWithGroupedCommits, ResolvedContext {
218
+ prevTag?: string;
219
+ prevVersion?: string;
220
+ }
221
+ type ChangelogSectionsMap = Record<string, ChangelogSectionDefinition>;
222
+ interface DefaultChangelogSections extends ChangelogSectionsMap {
223
+ [Symbol.iterator](): Iterator<ChangelogSectionDefinition>;
224
+ }
225
+ //#endregion
226
+ //#region src/relion.d.ts
227
+ declare function relion(userConfig: UserConfig): Promise<void>;
228
+ declare const defineConfig: (config: UserConfig) => UserConfig;
229
+ //#endregion
230
+ export { BumpFiles, ChangelogOptions, ChangelogSectionDefinition, ChangelogSectionsMap, Commit, CommitMessage, CommitOptions, CommitRange, CommitsParser, CompleteChangelogOptions, CompleteCommitOptions, CompleteCommitsParser, CompleteTagOptions, Context, ContextualConfig, Contributor, DefaultChangelogSections, DefaultVersionedFile, FalseOrComplete, GithubUserInfo, GpgSig, GpgSigCode, MergedConfig, RawCommit, RawReference, RefLabel, Reference, ReleaseContext, ReleaseType, ReleaseWithFlatCommits, ReleaseWithGroupedCommits, RepoInfo, ResolvedChangelogOptions, ResolvedChangelogSection, ResolvedConfig, ResolvedContext, TagOptions, TransformedConfig, UserConfig, VersionedFile, relion as default, defineConfig };
231
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMvY29uZmlnLmQudHMiLCIuLi9zcmMvZW51bXMuZC50cyIsIi4uL3NyYy90eXBlcy9jb21taXQuZC50cyIsIi4uL3NyYy90eXBlcy9jaGFuZ2Vsb2cuZC50cyIsIi4uL3NyYy9yZWxpb24uZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbW1pdCwgUmF3Q29tbWl0LCBDaGFuZ2Vsb2dTZWN0aW9uRGVmaW5pdGlvbiwgUmVsZWFzZVdpdGhHcm91cGVkQ29tbWl0cyB9IGZyb20gJ0AvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEhlbHBlckRlY2xhcmVTcGVjIH0gZnJvbSAnaGFuZGxlYmFycydcblxuZXhwb3J0IHR5cGUgRmFsc2VPckNvbXBsZXRlPFQ+ID0gZmFsc2UgfCBSZXF1aXJlZDxUPlxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDb25maWcge1xuXHRidW1wPzogYm9vbGVhbiB8IEJ1bXBGaWxlc1xuXHRjaGFuZ2Vsb2c/OiBib29sZWFuIHwgQ2hhbmdlbG9nT3B0aW9uc1xuXHRjb21taXQ/OiBib29sZWFuIHwgQ29tbWl0T3B0aW9uc1xuXHR0YWc/OiBib29sZWFuIHwgVGFnT3B0aW9uc1xuXHRuZXdUYWdGb3JtYXQ/OiBzdHJpbmdcblx0dmVyc2lvblNvdXJjZUZpbGU/OiBzdHJpbmcgfCBWZXJzaW9uZWRGaWxlXG5cdHJlbGVhc2VWZXJzaW9uPzogc3RyaW5nXG5cdHJlbGVhc2VUeXBlPzogUmVsZWFzZVR5cGVcblx0emVyb01ham9yQnJlYWtpbmdJc01pbm9yPzogYm9vbGVhblxuXHRjb250ZXh0PzogQ29udGV4dFxuXHRjb21taXRzUGFyc2VyPzogQ29tbWl0c1BhcnNlclxuXHRwcmV2UmVsZWFzZVRhZ1BhdHRlcm4/OiBSZWdFeHBcblx0ZHJ5UnVuPzogYm9vbGVhblxuXHRwcm9maWxlPzogc3RyaW5nXG5cdFtwcm9maWxlOiBgXyR7c3RyaW5nfWBdOiBVc2VyQ29uZmlnIHwgdW5kZWZpbmVkXG59XG5cbnR5cGUgT3B0aW9uYWxLZXlzID0gJ3JlbGVhc2VWZXJzaW9uJyB8ICdyZWxlYXNlVHlwZScgfCAnY29udGV4dCcgfCAncHJvZmlsZSdcbmV4cG9ydCBpbnRlcmZhY2UgTWVyZ2VkQ29uZmlnIGV4dGVuZHMgT21pdDxSZXF1aXJlZDxVc2VyQ29uZmlnPiwgT3B0aW9uYWxLZXlzPiwgUGljazxVc2VyQ29uZmlnLCBPcHRpb25hbEtleXM+IHtcblx0Y2hhbmdlbG9nOiBGYWxzZU9yQ29tcGxldGU8Q2hhbmdlbG9nT3B0aW9ucz5cblx0Y29tbWl0OiBGYWxzZU9yQ29tcGxldGU8Q29tbWl0T3B0aW9ucz5cblx0dGFnOiBGYWxzZU9yQ29tcGxldGU8VGFnT3B0aW9ucz5cblx0Y29tbWl0c1BhcnNlcjogQ29tcGxldGVDb21taXRzUGFyc2VyXG59XG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybWVkQ29uZmlnIGV4dGVuZHMgT21pdDxNZXJnZWRDb25maWcsICdjaGFuZ2Vsb2cnPiB7XG5cdHZlcnNpb25Tb3VyY2VGaWxlOiBWZXJzaW9uZWRGaWxlXG5cdGJ1bXA6IEZhbHNlT3JDb21wbGV0ZTxWZXJzaW9uZWRGaWxlW10+XG5cdGNoYW5nZWxvZzogZmFsc2UgfCBSZXNvbHZlZENoYW5nZWxvZ09wdGlvbnNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250ZXh0dWFsQ29uZmlnIGV4dGVuZHMgVHJhbnNmb3JtZWRDb25maWcge1xuXHRjb250ZXh0OiBSZXNvbHZlZENvbnRleHRcbn1cbmV4cG9ydCB0eXBlIFJlc29sdmVkQ29uZmlnID0gQ29udGV4dHVhbENvbmZpZ1xuXG5leHBvcnQgdHlwZSBCdW1wRmlsZXMgPSAoc3RyaW5nIHwgVmVyc2lvbmVkRmlsZSlbXVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYW5nZWxvZ09wdGlvbnMge1xuXHRzdGRvdXQ/OiBib29sZWFuXG5cdG91dHB1dEZpbGU/OiBzdHJpbmdcblx0Y29tbWl0UmFuZ2U/OiBDb21taXRSYW5nZVxuXHRzZWN0aW9ucz86IENoYW5nZWxvZ1NlY3Rpb25EZWZpbml0aW9uW11cblx0aGVhZGVyPzogc3RyaW5nXG5cdHByZXZSZWxlYXNlSGVhZGVyUGF0dGVybj86IFJlZ0V4cFxuXHRoZWxwZXJzPzogSGVscGVyRGVjbGFyZVNwZWNcblx0cGFydGlhbHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5leHBvcnQgdHlwZSBDb21wbGV0ZUNoYW5nZWxvZ09wdGlvbnMgPSBSZXF1aXJlZDxDaGFuZ2Vsb2dPcHRpb25zPlxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZENoYW5nZWxvZ09wdGlvbnMgZXh0ZW5kcyBPbWl0PENvbXBsZXRlQ2hhbmdlbG9nT3B0aW9ucywgJ3BhcnRpYWxzJz4ge1xuXHRjb21waWxlZFBhcnRpYWxzOiBSZWNvcmQ8c3RyaW5nLCBIYW5kbGViYXJzVGVtcGxhdGVEZWxlZ2F0ZT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21taXRPcHRpb25zIHtcblx0bWVzc2FnZT86IHN0cmluZ1xuXHRzaWduT2ZmPzogYm9vbGVhblxuXHRncGdTaWduPzogYm9vbGVhblxuXHRzdGFnZUFsbD86IGJvb2xlYW5cblx0ZXh0cmFBcmdzPzogc3RyaW5nXG59XG5leHBvcnQgdHlwZSBDb21wbGV0ZUNvbW1pdE9wdGlvbnMgPSBSZXF1aXJlZDxDb21taXRPcHRpb25zPlxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ09wdGlvbnMge1xuXHRuYW1lPzogc3RyaW5nXG5cdG1lc3NhZ2U/OiBzdHJpbmdcblx0Z3BnU2lnbj86IGJvb2xlYW5cblx0Zm9yY2U/OiBib29sZWFuXG5cdGV4dHJhQXJncz86IHN0cmluZ1xufVxuZXhwb3J0IHR5cGUgQ29tcGxldGVUYWdPcHRpb25zID0gUmVxdWlyZWQ8VGFnT3B0aW9ucz5cblxuZXhwb3J0IGludGVyZmFjZSBDb21taXRzUGFyc2VyIHtcblx0YnJlYWtpbmdDaGFuZ2VzUGF0dGVybj86IFJlZ0V4cFxuXHRicmVha2luZ0NoYW5nZUxpc3RQYXR0ZXJuPzogUmVnRXhwXG5cdGhlYWRlclBhdHRlcm4/OiBSZWdFeHBcblx0dGFnUGF0dGVybj86IFJlZ0V4cFxuXHRjb0F1dGhvclBhdHRlcm4/OiBSZWdFeHBcblx0Z2hFbWFpbFBhdHRlcm4/OiBSZWdFeHBcblx0cmVmUGF0dGVybj86IFJlZ0V4cFxuXHRyZWZBY3Rpb25QYXR0ZXJuPzogUmVnRXhwXG5cdHJlZkxhYmVsUGF0dGVybj86IFJlZ0V4cFxuXHRyZW1vdGVVcmxQYXR0ZXJuPzogUmVnRXhwXG5cdHNpZ25lclBhdHRlcm4/OiBSZWdFeHBcblx0ZGF0ZVNvdXJjZT86ICdhdXRob3JEYXRlJyB8ICdjb21taXR0ZXJEYXRlJ1xuXHRkYXRlRm9ybWF0Pzogc3RyaW5nXG59XG5leHBvcnQgdHlwZSBDb21wbGV0ZUNvbW1pdHNQYXJzZXIgPSBSZXF1aXJlZDxDb21taXRzUGFyc2VyPlxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9JbmZvIHtcblx0aG9zdD86IHN0cmluZ1xuXHRvd25lcj86IHN0cmluZ1xuXHRuYW1lPzogc3RyaW5nXG5cdGhvbWVwYWdlPzogc3RyaW5nXG59XG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHQge1xuXHRjb21taXRzPzogQ29tbWl0W10gfCBSYXdDb21taXRbXVxuXHRjdXJyZW50VmVyc2lvbj86IHN0cmluZ1xuXHRjdXJyZW50VGFnPzogc3RyaW5nXG5cdG5ld1ZlcnNpb24/OiBzdHJpbmdcblx0bmV3VGFnPzogc3RyaW5nXG5cdHJlcG8/OiBSZXBvSW5mb1xuXHRba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQ29udGV4dCBleHRlbmRzIFJlcXVpcmVkPENvbnRleHQ+IHtcblx0Y29tbWl0czogQ29tbWl0W11cblx0cmVsZWFzZXM6IFJlbGVhc2VXaXRoR3JvdXBlZENvbW1pdHNbXSB8IG51bGxcbn1cblxuZXhwb3J0IHR5cGUgQ29tbWl0UmFuZ2UgPVxuXHR8ICdhbGwnXG5cdHwgJ3VucmVsZWFzZWQnXG5cdHwgeyB2ZXJzaW9uVGFnOiBzdHJpbmcgfVxuXHR8IHsgZnJvbTogJ2ZpcnN0Q29tbWl0JyB8IChzdHJpbmcgJiB7fSkgfVxuXHR8IHsgdG86ICdIRUFEJyB8IChzdHJpbmcgJiB7fSkgfVxuXHR8IHsgZnJvbTogJ2ZpcnN0Q29tbWl0JyB8IChzdHJpbmcgJiB7fSksIHRvOiAnSEVBRCcgfCAoc3RyaW5nICYge30pIH1cblxuZXhwb3J0IHR5cGUgUmVsZWFzZVR5cGUgPSAnbWFqb3InIHwgJ21pbm9yJyB8ICdwYXRjaCdcblxuZXhwb3J0IGludGVyZmFjZSBWZXJzaW9uZWRGaWxlIHtcblx0ZmlsZVBhdGg6IHN0cmluZ1xuXHR2ZXJzaW9uUGF0dGVybjogUmVnRXhwXG59XG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRWZXJzaW9uZWRGaWxlIGV4dGVuZHMgT21pdDxWZXJzaW9uZWRGaWxlLCAnZmlsZVBhdGgnPiB7XG5cdGZpbGVQYXRoUmVnZXg6IFJlZ0V4cFxufSIsImV4cG9ydCBkZWNsYXJlIGVudW0gR3BnU2lnTGFiZWwge1xuICAgIEcgPSBcInZhbGlkXCIsXG4gICAgQiA9IFwiYmFkXCIsXG4gICAgVSA9IFwidmFsaWQsIHVua25vd24gdmFsaWRpdHlcIixcbiAgICBYID0gXCJ2YWxpZCwgZXhwaXJlZFwiLFxuICAgIFkgPSBcInZhbGlkLCBtYWRlIGJ5IGV4cGlyZWQga2V5XCIsXG4gICAgUiA9IFwidmFsaWQsIG1hZGUgYnkgcmV2b2tlZCBrZXlcIixcbiAgICBFID0gXCJjYW5ub3QgY2hlY2sgKG1pc3Npbmcga2V5KVwiLFxuICAgIE4gPSBcIm5vIHNpZ25hdHVyZVwiXG59XG5leHBvcnQgZGVjbGFyZSBlbnVtIFJlZlR5cGUge1xuICAgIGlzc3VlID0gXCJpc3N1ZVwiLFxuICAgIHByID0gXCJQUlwiXG59XG4iLCJpbXBvcnQgdHlwZSB7IEdwZ1NpZ0xhYmVsLCBSZWZUeXBlIH0gZnJvbSAnQC9lbnVtcydcblxuZXhwb3J0IHR5cGUgUmF3Q29tbWl0ID0gQ29tbWl0TWVzc2FnZVN0cmluZyB8IHtcblx0aGFzaD86IHN0cmluZ1xuXHRtZXNzYWdlOiBzdHJpbmdcblx0dGFnUmVmcz86IHN0cmluZ1xuXHRhdXRob3JOYW1lPzogc3RyaW5nXG5cdGF1dGhvckVtYWlsPzogc3RyaW5nXG5cdGF1dGhvclRzPzogc3RyaW5nXG5cdGNvbW1pdHRlck5hbWU/OiBzdHJpbmdcblx0Y29tbWl0dGVyRW1haWw/OiBzdHJpbmdcblx0Y29tbWl0dGVyVHM/OiBzdHJpbmdcblx0Z3BnU2lnQ29kZT86IEdwZ1NpZ0NvZGVcblx0Z3BnU2lnS2V5SWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21taXQgZXh0ZW5kcyBDb21taXRNZXNzYWdlIHtcblx0aGFzaD86IHN0cmluZ1xuXHR0YWdzPzogc3RyaW5nW11cblx0YXV0aG9ycz86IENvbnRyaWJ1dG9yW11cblx0Y29tbWl0dGVyPzogQ29udHJpYnV0b3Jcblx0cmVmcz86IFJlZmVyZW5jZVtdXG5cdGdwZ1NpZz86IEdwZ1NpZ1xuXHRkYXRlPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0TWVzc2FnZSB7XG5cdHR5cGU6IHN0cmluZ1xuXHRzY29wZT86IHN0cmluZ1xuXHRzdWJqZWN0OiBzdHJpbmdcblx0Ym9keT86IHN0cmluZ1xuXHRicmVha2luZ0NoYW5nZXM/OiBzdHJpbmcgfCBzdHJpbmdbXVxuXHRmb290ZXI/OiBzdHJpbmdcbn1cbnR5cGUgQ29tbWl0TWVzc2FnZVN0cmluZyA9IHN0cmluZ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlZmVyZW5jZSB7XG5cdGFjdGlvbjogc3RyaW5nXG5cdHR5cGU/OiBSZWZUeXBlXG5cdG93bmVyPzogc3RyaW5nXG5cdHJlcG8/OiBzdHJpbmdcblx0bnVtYmVyOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgUmVmTGFiZWwgPSBQaWNrPFJlZmVyZW5jZSwgJ293bmVyJyB8ICdyZXBvJyB8ICdudW1iZXInPlxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyaWJ1dG9yIHtcblx0bmFtZTogc3RyaW5nXG5cdGVtYWlsOiBzdHJpbmdcblx0aGFzU2lnbmVkT2ZmPzogYm9vbGVhblxuXHRnaExvZ2luPzogc3RyaW5nXG5cdGdoVXJsPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEdpdGh1YlVzZXJJbmZvID0gUGljazxDb250cmlidXRvciwgJ2doTG9naW4nIHwgJ2doVXJsJz5cblxuZXhwb3J0IGludGVyZmFjZSBHcGdTaWcge1xuXHRjb2RlOiBHcGdTaWdDb2RlXG5cdGxhYmVsOiBHcGdTaWdMYWJlbFxuXHRrZXlJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBHcGdTaWdDb2RlID0gJ0cnIHwgJ0InIHwgJ1UnIHwgJ1gnIHwgJ1knIHwgJ1InIHwgJ0UnIHwgJ04nXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF3UmVmZXJlbmNlIHtcblx0YWN0aW9uOiBzdHJpbmdcblx0bGFiZWxzOiBzdHJpbmdcbn0iLCJpbXBvcnQgdHlwZSB7IENvbW1pdCwgUmVzb2x2ZWRDb250ZXh0IH0gZnJvbSAnQC90eXBlcydcblxuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2Vsb2dTZWN0aW9uRGVmaW5pdGlvbiB7XG5cdHRpdGxlOiBzdHJpbmdcblx0Y29tbWl0VHlwZTogJ2JyZWFraW5nJyB8ICcqJyB8IChzdHJpbmcgJiB7fSkgfCBzdHJpbmdbXVxuXHRmaWx0ZXI/OiAoY29tbWl0OiBDb21taXQpID0+IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZENoYW5nZWxvZ1NlY3Rpb24ge1xuXHR0aXRsZTogc3RyaW5nXG5cdGNvbW1pdHM6IENvbW1pdFtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVsZWFzZVdpdGhGbGF0Q29tbWl0cyB7XG5cdHRhZzogc3RyaW5nXG5cdHZlcnNpb24/OiBzdHJpbmdcblx0ZGF0ZT86IHN0cmluZ1xuXHRjb21taXRzOiBDb21taXRbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGVhc2VXaXRoR3JvdXBlZENvbW1pdHMgZXh0ZW5kcyBPbWl0PFJlbGVhc2VXaXRoRmxhdENvbW1pdHMsICdjb21taXRzJz4ge1xuXHRjb21taXRHcm91cHM6IFJlc29sdmVkQ2hhbmdlbG9nU2VjdGlvbltdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVsZWFzZUNvbnRleHQgZXh0ZW5kcyBSZWxlYXNlV2l0aEdyb3VwZWRDb21taXRzLCBSZXNvbHZlZENvbnRleHQge1xuXHRwcmV2VGFnPzogc3RyaW5nXG5cdHByZXZWZXJzaW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIENoYW5nZWxvZ1NlY3Rpb25zTWFwID0gUmVjb3JkPHN0cmluZywgQ2hhbmdlbG9nU2VjdGlvbkRlZmluaXRpb24+XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdENoYW5nZWxvZ1NlY3Rpb25zIGV4dGVuZHMgQ2hhbmdlbG9nU2VjdGlvbnNNYXAge1xuXHRbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYXRvcjxDaGFuZ2Vsb2dTZWN0aW9uRGVmaW5pdGlvbj5cbn0iLCJpbXBvcnQgdHlwZSB7IFVzZXJDb25maWcgfSBmcm9tICdAL3R5cGVzJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbGlvbih1c2VyQ29uZmlnOiBVc2VyQ29uZmlnKTogUHJvbWlzZTx2b2lkPjtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGRlZmluZUNvbmZpZzogKGNvbmZpZzogVXNlckNvbmZpZykgPT4gVXNlckNvbmZpZztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFHQSxJQUFXLGFBQWE7Q0FBQztPQUFVO09BQWdCO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTs7O0FBRW5ELElBQVcsZUFBZTtDQUFDO09BQUM7T0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTs7QUFDNUIsSUFBVyxvQkFBZTtDQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBOztBQUMxQixJQUFXLG1CQUFtQjtDQUFDO09BQU87T0FBQTs7QUFDdEMsSUFBVyxpQkFBaUIsQ0FBQyxVQUFHO0FBQ2hDLElBQVcsWUFBWSxDQUFDLFVBQUU7QUFDMUIsSUFBVyxtQkFBVTtDQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTs7QUFDckIsSUFBVywyQkFBMkI7Q0FBQztPQUFHO09BQUE7O0FBQzFDLElBQVcsMkJBQVk7Q0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBOztBQUN2QixJQUFXLGdCQUFjLENBQUE7QUFDekIsSUFBVyx3QkFBdUI7Q0FBQTtPQUFBO09BQUE7O0FBQ2xDLElBQVcsYUFBTSxDQUFBO0FBQ2pCLElBQVcscUJBQWtCO0NBQUE7T0FBQTtPQUFBOztBQUM3QixJQUFXLGdCQUFnQjtDQUFDO09BQUU7T0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTs7QUFDOUIsSUFBVyx3QkFBSztDQUFBO09BQUE7T0FBQTs7QUFDaEIsSUFBVyxXQUFLLENBQUE7QUFDaEIsSUFBVyxVQUFVO0NBQUM7T0FBVTtPQUFjO09BQUM7O0FBQy9DLElBQUEsa0JBQUE7Q0FBQTtPQUFBO09BQUE7T0FBQTtPQUFBOzs7QUFFQSxJQUFXLGNBQWMsQ0FBQztBQUMxQixJQUFXLGdCQUFnQixDQUFDLFVBQVU7QUFDdEMsSUFBVyx1QkFBdUI7Q0FBQztPQUFTO09BQUE7T0FBQTs7Ozs7QUN6QjVDLElBQVcsY0FBYyxDQUFDO0FBQzFCLElBQVcsVUFBSSxDQUFBOzs7Ozs7Ozs7QUNDZixJQUFXLFNBQVM7Q0FBQztPQUFVO09BQWU7T0FBQTtPQUFBO09BQUE7O0FBQzlDLElBQVcsZ0JBQUUsQ0FBQTtBQUNiLElBQUksc0JBQVcsQ0FBQTtBQUNmLElBQVcsWUFBSyxDQUFBLFVBQUE7QUFDaEIsSUFBVyxXQUFRO0NBQUE7T0FBQTtPQUFBOztBQUNuQixJQUFXLGNBQVMsQ0FBQTtBQUNwQixJQUFXLGlCQUFNO0NBQUE7T0FBQTtPQUFBOztBQUNqQixJQUFXLFNBQVM7Q0FBQztPQUFDO09BQUE7O0FBQ3RCLElBQVcsYUFBWSxDQUFBO0FBQ3ZCLElBQVcsZUFBUyxDQUFBOzs7OztBQ1RwQixJQUFXLDJCQUEyQixDQUFDLFNBQUs7QUFDNUMsSUFBVyx5QkFBRSxDQUFBLFNBQUE7QUFDYixJQUFXLDRCQUE0QjtDQUFDO09BQVM7T0FBTTtPQUFBOztBQUN2RCxJQUFXLGlCQUFpQjtDQUFDO09BQU87T0FBQTs7QUFDcEMsSUFBQSx1QkFBQTtDQUFBO09BQUE7T0FBQTs7Ozs7Ozs7Ozs7QUNMQSxJQUFJLFNBQVM7Q0FBQztPQUFTO09BQWtCOztBQUN6QyxJQUFXLGVBQWU7Q0FBQztPQUFTO09BQWtCIn0=