@angular/localize 19.0.0-next.1 → 19.0.0-next.10

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 (74) hide show
  1. package/LICENSE +21 -0
  2. package/fesm2022/init.mjs +1 -1
  3. package/fesm2022/init.mjs.map +1 -1
  4. package/fesm2022/localize.mjs +2 -2
  5. package/fesm2022/localize.mjs.map +1 -1
  6. package/index.d.ts +1 -1
  7. package/init/index.d.ts +1 -1
  8. package/package.json +3 -8
  9. package/schematics/ng-add/ng_add_bundle.js +6 -5
  10. package/schematics/ng-add/ng_add_bundle.js.map +2 -2
  11. package/schematics/ng-add/schema.json +0 -5
  12. package/tools/bundles/{chunk-IO35W7IH.js → chunk-P52LUQCG.js} +19 -19
  13. package/tools/bundles/{chunk-BXL2U6FQ.js → chunk-P5UMW3G2.js} +19 -19
  14. package/tools/bundles/{chunk-BXL2U6FQ.js.map → chunk-P5UMW3G2.js.map} +1 -1
  15. package/tools/bundles/{chunk-OWGLQY27.js → chunk-YINHXBYF.js} +4 -4
  16. package/tools/bundles/index.js +5 -5
  17. package/tools/bundles/src/extract/cli.js +6 -6
  18. package/tools/bundles/src/migrate/cli.js +6 -6
  19. package/tools/bundles/src/translate/cli.js +12 -12
  20. package/tools/bundles_metadata.json +1 -1
  21. package/tools/index.d.ts +1 -1
  22. package/tools/src/diagnostics.d.ts +1 -1
  23. package/tools/src/extract/cli.d.ts +1 -1
  24. package/tools/src/extract/duplicates.d.ts +1 -1
  25. package/tools/src/extract/extraction.d.ts +1 -1
  26. package/tools/src/extract/index.d.ts +1 -1
  27. package/tools/src/extract/source_files/es2015_extract_plugin.d.ts +1 -1
  28. package/tools/src/extract/source_files/es5_extract_plugin.d.ts +1 -1
  29. package/tools/src/extract/translation_files/arb_translation_serializer.d.ts +1 -1
  30. package/tools/src/extract/translation_files/format_options.d.ts +1 -1
  31. package/tools/src/extract/translation_files/icu_parsing.d.ts +1 -1
  32. package/tools/src/extract/translation_files/json_translation_serializer.d.ts +1 -1
  33. package/tools/src/extract/translation_files/legacy_message_id_migration_serializer.d.ts +1 -1
  34. package/tools/src/extract/translation_files/translation_serializer.d.ts +1 -1
  35. package/tools/src/extract/translation_files/utils.d.ts +1 -1
  36. package/tools/src/extract/translation_files/xliff1_translation_serializer.d.ts +1 -1
  37. package/tools/src/extract/translation_files/xliff2_translation_serializer.d.ts +1 -1
  38. package/tools/src/extract/translation_files/xmb_translation_serializer.d.ts +1 -1
  39. package/tools/src/extract/translation_files/xml_file.d.ts +1 -1
  40. package/tools/src/migrate/cli.d.ts +1 -1
  41. package/tools/src/migrate/index.d.ts +1 -1
  42. package/tools/src/migrate/migrate.d.ts +1 -1
  43. package/tools/src/source_file_utils.d.ts +1 -1
  44. package/tools/src/translate/asset_files/asset_translation_handler.d.ts +1 -1
  45. package/tools/src/translate/output_path.d.ts +1 -1
  46. package/tools/src/translate/source_files/es2015_translate_plugin.d.ts +1 -1
  47. package/tools/src/translate/source_files/es5_translate_plugin.d.ts +1 -1
  48. package/tools/src/translate/source_files/locale_plugin.d.ts +1 -1
  49. package/tools/src/translate/source_files/source_file_translation_handler.d.ts +1 -1
  50. package/tools/src/translate/translation_files/base_visitor.d.ts +1 -1
  51. package/tools/src/translate/translation_files/message_serialization/message_renderer.d.ts +1 -1
  52. package/tools/src/translate/translation_files/message_serialization/message_serializer.d.ts +1 -1
  53. package/tools/src/translate/translation_files/message_serialization/target_message_renderer.d.ts +1 -1
  54. package/tools/src/translate/translation_files/translation_loader.d.ts +1 -1
  55. package/tools/src/translate/translation_files/translation_parsers/arb_translation_parser.d.ts +1 -1
  56. package/tools/src/translate/translation_files/translation_parsers/serialize_translation_message.d.ts +1 -1
  57. package/tools/src/translate/translation_files/translation_parsers/translation_parse_error.d.ts +1 -1
  58. package/tools/src/translate/translation_files/translation_parsers/translation_parser.d.ts +1 -1
  59. package/tools/src/translate/translation_files/translation_parsers/translation_utils.d.ts +1 -1
  60. package/tools/src/translate/translator.d.ts +1 -1
  61. package/esm2022/index.mjs +0 -12
  62. package/esm2022/init/index.mjs +0 -12
  63. package/esm2022/localize.mjs +0 -12
  64. package/esm2022/private.mjs +0 -12
  65. package/esm2022/src/localize/doc_index.mjs +0 -9
  66. package/esm2022/src/localize/index.mjs +0 -9
  67. package/esm2022/src/localize/src/localize.mjs +0 -136
  68. package/esm2022/src/translate.mjs +0 -81
  69. package/esm2022/src/utils/index.mjs +0 -11
  70. package/esm2022/src/utils/src/constants.mjs +0 -58
  71. package/esm2022/src/utils/src/messages.mjs +0 -193
  72. package/esm2022/src/utils/src/translations.mjs +0 -119
  73. /package/tools/bundles/{chunk-IO35W7IH.js.map → chunk-P52LUQCG.js.map} +0 -0
  74. /package/tools/bundles/{chunk-OWGLQY27.js.map → chunk-YINHXBYF.js.map} +0 -0
@@ -1,193 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- // This module specifier is intentionally a relative path to allow bundling the code directly
9
- // into the package.
10
- // @ng_package: ignore-cross-repo-import
11
- import { computeMsgId } from '../../../../compiler/src/i18n/digest';
12
- import { BLOCK_MARKER, ID_SEPARATOR, LEGACY_ID_INDICATOR, MEANING_SEPARATOR } from './constants';
13
- /**
14
- * Re-export this helper function so that users of `@angular/localize` don't need to actively import
15
- * from `@angular/compiler`.
16
- */
17
- export { computeMsgId };
18
- /**
19
- * Parse a `$localize` tagged string into a structure that can be used for translation or
20
- * extraction.
21
- *
22
- * See `ParsedMessage` for an example.
23
- */
24
- export function parseMessage(messageParts, expressions, location, messagePartLocations, expressionLocations = []) {
25
- const substitutions = {};
26
- const substitutionLocations = {};
27
- const associatedMessageIds = {};
28
- const metadata = parseMetadata(messageParts[0], messageParts.raw[0]);
29
- const cleanedMessageParts = [metadata.text];
30
- const placeholderNames = [];
31
- let messageString = metadata.text;
32
- for (let i = 1; i < messageParts.length; i++) {
33
- const { messagePart, placeholderName = computePlaceholderName(i), associatedMessageId, } = parsePlaceholder(messageParts[i], messageParts.raw[i]);
34
- messageString += `{$${placeholderName}}${messagePart}`;
35
- if (expressions !== undefined) {
36
- substitutions[placeholderName] = expressions[i - 1];
37
- substitutionLocations[placeholderName] = expressionLocations[i - 1];
38
- }
39
- placeholderNames.push(placeholderName);
40
- if (associatedMessageId !== undefined) {
41
- associatedMessageIds[placeholderName] = associatedMessageId;
42
- }
43
- cleanedMessageParts.push(messagePart);
44
- }
45
- const messageId = metadata.customId || computeMsgId(messageString, metadata.meaning || '');
46
- const legacyIds = metadata.legacyIds ? metadata.legacyIds.filter((id) => id !== messageId) : [];
47
- return {
48
- id: messageId,
49
- legacyIds,
50
- substitutions,
51
- substitutionLocations,
52
- text: messageString,
53
- customId: metadata.customId,
54
- meaning: metadata.meaning || '',
55
- description: metadata.description || '',
56
- messageParts: cleanedMessageParts,
57
- messagePartLocations,
58
- placeholderNames,
59
- associatedMessageIds,
60
- location,
61
- };
62
- }
63
- /**
64
- * Parse the given message part (`cooked` + `raw`) to extract the message metadata from the text.
65
- *
66
- * If the message part has a metadata block this function will extract the `meaning`,
67
- * `description`, `customId` and `legacyId` (if provided) from the block. These metadata properties
68
- * are serialized in the string delimited by `|`, `@@` and `␟` respectively.
69
- *
70
- * (Note that `␟` is the `LEGACY_ID_INDICATOR` - see `constants.ts`.)
71
- *
72
- * For example:
73
- *
74
- * ```ts
75
- * `:meaning|description@@custom-id:`
76
- * `:meaning|@@custom-id:`
77
- * `:meaning|description:`
78
- * `:description@@custom-id:`
79
- * `:meaning|:`
80
- * `:description:`
81
- * `:@@custom-id:`
82
- * `:meaning|description@@custom-id␟legacy-id-1␟legacy-id-2:`
83
- * ```
84
- *
85
- * @param cooked The cooked version of the message part to parse.
86
- * @param raw The raw version of the message part to parse.
87
- * @returns A object containing any metadata that was parsed from the message part.
88
- */
89
- export function parseMetadata(cooked, raw) {
90
- const { text: messageString, block } = splitBlock(cooked, raw);
91
- if (block === undefined) {
92
- return { text: messageString };
93
- }
94
- else {
95
- const [meaningDescAndId, ...legacyIds] = block.split(LEGACY_ID_INDICATOR);
96
- const [meaningAndDesc, customId] = meaningDescAndId.split(ID_SEPARATOR, 2);
97
- let [meaning, description] = meaningAndDesc.split(MEANING_SEPARATOR, 2);
98
- if (description === undefined) {
99
- description = meaning;
100
- meaning = undefined;
101
- }
102
- if (description === '') {
103
- description = undefined;
104
- }
105
- return { text: messageString, meaning, description, customId, legacyIds };
106
- }
107
- }
108
- /**
109
- * Parse the given message part (`cooked` + `raw`) to extract any placeholder metadata from the
110
- * text.
111
- *
112
- * If the message part has a metadata block this function will extract the `placeholderName` and
113
- * `associatedMessageId` (if provided) from the block.
114
- *
115
- * These metadata properties are serialized in the string delimited by `@@`.
116
- *
117
- * For example:
118
- *
119
- * ```ts
120
- * `:placeholder-name@@associated-id:`
121
- * ```
122
- *
123
- * @param cooked The cooked version of the message part to parse.
124
- * @param raw The raw version of the message part to parse.
125
- * @returns A object containing the metadata (`placeholderName` and `associatedMessageId`) of the
126
- * preceding placeholder, along with the static text that follows.
127
- */
128
- export function parsePlaceholder(cooked, raw) {
129
- const { text: messagePart, block } = splitBlock(cooked, raw);
130
- if (block === undefined) {
131
- return { messagePart };
132
- }
133
- else {
134
- const [placeholderName, associatedMessageId] = block.split(ID_SEPARATOR);
135
- return { messagePart, placeholderName, associatedMessageId };
136
- }
137
- }
138
- /**
139
- * Split a message part (`cooked` + `raw`) into an optional delimited "block" off the front and the
140
- * rest of the text of the message part.
141
- *
142
- * Blocks appear at the start of message parts. They are delimited by a colon `:` character at the
143
- * start and end of the block.
144
- *
145
- * If the block is in the first message part then it will be metadata about the whole message:
146
- * meaning, description, id. Otherwise it will be metadata about the immediately preceding
147
- * substitution: placeholder name.
148
- *
149
- * Since blocks are optional, it is possible that the content of a message block actually starts
150
- * with a block marker. In this case the marker must be escaped `\:`.
151
- *
152
- * @param cooked The cooked version of the message part to parse.
153
- * @param raw The raw version of the message part to parse.
154
- * @returns An object containing the `text` of the message part and the text of the `block`, if it
155
- * exists.
156
- * @throws an error if the `block` is unterminated
157
- */
158
- export function splitBlock(cooked, raw) {
159
- if (raw.charAt(0) !== BLOCK_MARKER) {
160
- return { text: cooked };
161
- }
162
- else {
163
- const endOfBlock = findEndOfBlock(cooked, raw);
164
- return {
165
- block: cooked.substring(1, endOfBlock),
166
- text: cooked.substring(endOfBlock + 1),
167
- };
168
- }
169
- }
170
- function computePlaceholderName(index) {
171
- return index === 1 ? 'PH' : `PH_${index - 1}`;
172
- }
173
- /**
174
- * Find the end of a "marked block" indicated by the first non-escaped colon.
175
- *
176
- * @param cooked The cooked string (where escaped chars have been processed)
177
- * @param raw The raw string (where escape sequences are still in place)
178
- *
179
- * @returns the index of the end of block marker
180
- * @throws an error if the block is unterminated
181
- */
182
- export function findEndOfBlock(cooked, raw) {
183
- for (let cookedIndex = 1, rawIndex = 1; cookedIndex < cooked.length; cookedIndex++, rawIndex++) {
184
- if (raw[rawIndex] === '\\') {
185
- rawIndex++;
186
- }
187
- else if (cooked[cookedIndex] === BLOCK_MARKER) {
188
- return cookedIndex;
189
- }
190
- }
191
- throw new Error(`Unterminated $localize metadata block in "${raw}".`);
192
- }
193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sb2NhbGl6ZS9zcmMvdXRpbHMvc3JjL21lc3NhZ2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILDZGQUE2RjtBQUM3RixvQkFBb0I7QUFDcEIsd0NBQXdDO0FBQ3hDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUVsRSxPQUFPLEVBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvRjs7O0dBR0c7QUFDSCxPQUFPLEVBQUMsWUFBWSxFQUFDLENBQUM7QUFrSnRCOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsWUFBa0MsRUFDbEMsV0FBNEIsRUFDNUIsUUFBeUIsRUFDekIsb0JBQXFELEVBQ3JELHNCQUFzRCxFQUFFO0lBRXhELE1BQU0sYUFBYSxHQUFxQyxFQUFFLENBQUM7SUFDM0QsTUFBTSxxQkFBcUIsR0FBNEQsRUFBRSxDQUFDO0lBQzFGLE1BQU0sb0JBQW9CLEdBQTJDLEVBQUUsQ0FBQztJQUN4RSxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxNQUFNLG1CQUFtQixHQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELE1BQU0sZ0JBQWdCLEdBQWEsRUFBRSxDQUFDO0lBQ3RDLElBQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEVBQ0osV0FB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QUFDLEtBQWE7SUFDM0MsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ2hELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBYyxFQUFFLEdBQVc7SUFDeEQsS0FBSyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDO1FBQy9GLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzNCLFFBQVEsRUFBRSxDQUFDO1FBQ2IsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ2hELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vLyBUaGlzIG1vZHVsZSBzcGVjaWZpZXIgaXMgaW50ZW50aW9uYWxseSBhIHJlbGF0aXZlIHBhdGggdG8gYWxsb3cgYnVuZGxpbmcgdGhlIGNvZGUgZGlyZWN0bHlcbi8vIGludG8gdGhlIHBhY2thZ2UuXG4vLyBAbmdfcGFja2FnZTogaWdub3JlLWNyb3NzLXJlcG8taW1wb3J0XG5pbXBvcnQge2NvbXB1dGVNc2dJZH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcGlsZXIvc3JjL2kxOG4vZGlnZXN0JztcblxuaW1wb3J0IHtCTE9DS19NQVJLRVIsIElEX1NFUEFSQVRPUiwgTEVHQUNZX0lEX0lORElDQVRPUiwgTUVBTklOR19TRVBBUkFUT1J9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBSZS1leHBvcnQgdGhpcyBoZWxwZXIgZnVuY3Rpb24gc28gdGhhdCB1c2VycyBvZiBgQGFuZ3VsYXIvbG9jYWxpemVgIGRvbid0IG5lZWQgdG8gYWN0aXZlbHkgaW1wb3J0XG4gKiBmcm9tIGBAYW5ndWxhci9jb21waWxlcmAuXG4gKi9cbmV4cG9ydCB7Y29tcHV0ZU1zZ0lkfTtcblxuLyoqXG4gKiBBIHN0cmluZyBjb250YWluaW5nIGEgdHJhbnNsYXRpb24gc291cmNlIG1lc3NhZ2UuXG4gKlxuICogSS5FLiB0aGUgbWVzc2FnZSB0aGF0IGluZGljYXRlcyB3aGF0IHdpbGwgYmUgdHJhbnNsYXRlZCBmcm9tLlxuICpcbiAqIFVzZXMgYHskcGxhY2Vob2xkZXItbmFtZX1gIHRvIGluZGljYXRlIGEgcGxhY2Vob2xkZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFNvdXJjZU1lc3NhZ2UgPSBzdHJpbmc7XG5cbi8qKlxuICogQSBzdHJpbmcgY29udGFpbmluZyBhIHRyYW5zbGF0aW9uIHRhcmdldCBtZXNzYWdlLlxuICpcbiAqIEkuRS4gdGhlIG1lc3NhZ2UgdGhhdCBpbmRpY2F0ZXMgd2hhdCB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8uXG4gKlxuICogVXNlcyBgeyRwbGFjZWhvbGRlci1uYW1lfWAgdG8gaW5kaWNhdGUgYSBwbGFjZWhvbGRlci5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCB0eXBlIFRhcmdldE1lc3NhZ2UgPSBzdHJpbmc7XG5cbi8qKlxuICogQSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGEgbWVzc2FnZSwgdG8gYmUgdXNlZCBmb3IgbWF0Y2hpbmcgdHJhbnNsYXRpb25zLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZUlkID0gc3RyaW5nO1xuXG4vKipcbiAqIERlY2xhcmVzIGEgY29weSBvZiB0aGUgYEFic29sdXRlRnNQYXRoYCBicmFuZGVkIHR5cGUgaW4gYEBhbmd1bGFyL2NvbXBpbGVyLWNsaWAgdG8gYXZvaWQgYW5cbiAqIGltcG9ydCBpbnRvIGBAYW5ndWxhci9jb21waWxlci1jbGlgLiBUaGUgY29tcGlsZXItY2xpJ3MgZGVjbGFyYXRpb24gZmlsZXMgYXJlIG5vdCBuZWNlc3NhcmlseVxuICogY29tcGF0aWJsZSB3aXRoIHdlYiBlbnZpcm9ubWVudHMgdGhhdCB1c2UgYEBhbmd1bGFyL2xvY2FsaXplYCwgYW5kIHdvdWxkIGluYWR2ZXJ0ZW50bHkgaW5jbHVkZVxuICogYHR5cGVzY3JpcHRgIGRlY2xhcmF0aW9uIGZpbGVzIGluIGFueSBjb21waWxhdGlvbiB1bml0IHRoYXQgdXNlcyBgQGFuZ3VsYXIvbG9jYWxpemVgICh3aGljaFxuICogaW5jcmVhc2VzIHBhcnNpbmcgdGltZSBhbmQgbWVtb3J5IHVzYWdlIGR1cmluZyBidWlsZHMpIHVzaW5nIGEgZGVmYXVsdCBpbXBvcnQgdGhhdCBvbmx5XG4gKiB0eXBlLWNoZWNrcyB3aGVuIGBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzYCBpcyBlbmFibGVkLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvNDUxNzlcbiAqL1xudHlwZSBBYnNvbHV0ZUZzUGF0aExvY2FsaXplQ29weSA9IHN0cmluZyAmIHtfYnJhbmQ6ICdBYnNvbHV0ZUZzUGF0aCd9O1xuXG4vKipcbiAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgc291cmNlIGZpbGUuXG4gKlxuICogVGhlIGBsaW5lYCBhbmQgYGNvbHVtbmAgdmFsdWVzIGZvciB0aGUgYHN0YXJ0YCBhbmQgYGVuZGAgcHJvcGVydGllcyBhcmUgemVyby1iYXNlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb3VyY2VMb2NhdGlvbiB7XG4gIHN0YXJ0OiB7bGluZTogbnVtYmVyOyBjb2x1bW46IG51bWJlcn07XG4gIGVuZDoge2xpbmU6IG51bWJlcjsgY29sdW1uOiBudW1iZXJ9O1xuICBmaWxlOiBBYnNvbHV0ZUZzUGF0aExvY2FsaXplQ29weTtcbiAgdGV4dD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZU1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIEEgaHVtYW4gcmVhZGFibGUgcmVuZGVyaW5nIG9mIHRoZSBtZXNzYWdlXG4gICAqL1xuICB0ZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMZWdhY3kgbWVzc2FnZSBpZHMsIGlmIHByb3ZpZGVkLlxuICAgKlxuICAgKiBJbiBsZWdhY3kgbWVzc2FnZSBmb3JtYXRzIHRoZSBtZXNzYWdlIGlkIGNhbiBvbmx5IGJlIGNvbXB1dGVkIGRpcmVjdGx5IGZyb20gdGhlIG9yaWdpbmFsXG4gICAqIHRlbXBsYXRlIHNvdXJjZS5cbiAgICpcbiAgICogU2luY2UgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIGAkbG9jYWxpemVgIGNhbGxzLCB0aGUgbGVnYWN5IG1lc3NhZ2UgaWRzIG1heSBiZVxuICAgKiBhdHRhY2hlZCBieSB0aGUgY29tcGlsZXIgdG8gdGhlIGAkbG9jYWxpemVgIG1ldGFibG9jayBzbyBpdCBjYW4gYmUgdXNlZCBpZiBuZWVkZWQgYXQgdGhlIHBvaW50XG4gICAqIG9mIHRyYW5zbGF0aW9uIGlmIHRoZSB0cmFuc2xhdGlvbnMgYXJlIGVuY29kZWQgdXNpbmcgdGhlIGxlZ2FjeSBtZXNzYWdlIGlkLlxuICAgKi9cbiAgbGVnYWN5SWRzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGBtZXNzYWdlYCBpZiBhIGN1c3RvbSBvbmUgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5LlxuICAgKlxuICAgKiBUaGlzIGlkIG92ZXJyaWRlcyBhbnkgY29tcHV0ZWQgb3IgbGVnYWN5IGlkcy5cbiAgICovXG4gIGN1c3RvbUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG1lYW5pbmcgb2YgdGhlIGBtZXNzYWdlYCwgdXNlZCB0byBkaXN0aW5ndWlzaCBpZGVudGljYWwgYG1lc3NhZ2VTdHJpbmdgcy5cbiAgICovXG4gIG1lYW5pbmc/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGBtZXNzYWdlYCwgdXNlZCB0byBhaWQgdHJhbnNsYXRpb24uXG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgc291cmNlLlxuICAgKi9cbiAgbG9jYXRpb24/OiBTb3VyY2VMb2NhdGlvbjtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBwYXJzZWQgZnJvbSBhIGAkbG9jYWxpemVgIHRhZ2dlZCBzdHJpbmcgdGhhdCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSBpdC5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBcbiAqIGNvbnN0IG5hbWUgPSAnSm8gQmxvZ2dzJztcbiAqICRsb2NhbGl6ZWBIZWxsbyAke25hbWV9OnRpdGxlQEBJRDohYDtcbiAqIGBgYFxuICpcbiAqIE1heSBiZSBwYXJzZWQgaW50bzpcbiAqXG4gKiBgYGBcbiAqIHtcbiAqICAgaWQ6ICc2OTk4MTk0NTA3NTk3NzMwNTkxJyxcbiAqICAgc3Vic3RpdHV0aW9uczogeyB0aXRsZTogJ0pvIEJsb2dncycgfSxcbiAqICAgbWVzc2FnZVN0cmluZzogJ0hlbGxvIHskdGl0bGV9IScsXG4gKiAgIHBsYWNlaG9sZGVyTmFtZXM6IFsndGl0bGUnXSxcbiAqICAgYXNzb2NpYXRlZE1lc3NhZ2VJZHM6IHsgdGl0bGU6ICdJRCcgfSxcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlTWV0YWRhdGEge1xuICAvKipcbiAgICogVGhlIGtleSB1c2VkIHRvIGxvb2sgdXAgdGhlIGFwcHJvcHJpYXRlIHRyYW5zbGF0aW9uIHRhcmdldC5cbiAgICovXG4gIGlkOiBNZXNzYWdlSWQ7XG4gIC8qKlxuICAgKiBBIG1hcHBpbmcgb2YgcGxhY2Vob2xkZXIgbmFtZXMgdG8gc3Vic3RpdHV0aW9uIHZhbHVlcy5cbiAgICovXG4gIHN1YnN0aXR1dGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBtYXBwaW5nIG9mIHBsYWNlaG9sZGVyIG5hbWVzIHRvIGFzc29jaWF0ZWQgTWVzc2FnZUlkcy5cbiAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBtYXRjaCBJQ1UgcGxhY2Vob2xkZXJzIHRvIHRoZSBtZXNzYWdlIHRoYXQgY29udGFpbnMgdGhlIElDVS5cbiAgICovXG4gIGFzc29jaWF0ZWRNZXNzYWdlSWRzPzogUmVjb3JkPHN0cmluZywgTWVzc2FnZUlkPjtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIG1hcHBpbmcgb2YgcGxhY2Vob2xkZXIgbmFtZXMgdG8gc291cmNlIGxvY2F0aW9uc1xuICAgKi9cbiAgc3Vic3RpdHV0aW9uTG9jYXRpb25zPzogUmVjb3JkPHN0cmluZywgU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogVGhlIHN0YXRpYyBwYXJ0cyBvZiB0aGUgbWVzc2FnZS5cbiAgICovXG4gIG1lc3NhZ2VQYXJ0czogc3RyaW5nW107XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBtYXBwaW5nIG9mIG1lc3NhZ2UgcGFydHMgdG8gc291cmNlIGxvY2F0aW9uc1xuICAgKi9cbiAgbWVzc2FnZVBhcnRMb2NhdGlvbnM/OiAoU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQpW107XG4gIC8qKlxuICAgKiBUaGUgbmFtZXMgb2YgdGhlIHBsYWNlaG9sZGVycyB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBzdWJzdGl0dXRpb25zLlxuICAgKi9cbiAgcGxhY2Vob2xkZXJOYW1lczogc3RyaW5nW107XG59XG5cbi8qKlxuICogUGFyc2UgYSBgJGxvY2FsaXplYCB0YWdnZWQgc3RyaW5nIGludG8gYSBzdHJ1Y3R1cmUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdHJhbnNsYXRpb24gb3JcbiAqIGV4dHJhY3Rpb24uXG4gKlxuICogU2VlIGBQYXJzZWRNZXNzYWdlYCBmb3IgYW4gZXhhbXBsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWVzc2FnZShcbiAgbWVzc2FnZVBhcnRzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgZXhwcmVzc2lvbnM/OiByZWFkb25seSBhbnlbXSxcbiAgbG9jYXRpb24/OiBTb3VyY2VMb2NhdGlvbixcbiAgbWVzc2FnZVBhcnRMb2NhdGlvbnM/OiAoU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQpW10sXG4gIGV4cHJlc3Npb25Mb2NhdGlvbnM6IChTb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZClbXSA9IFtdLFxuKTogUGFyc2VkTWVzc2FnZSB7XG4gIGNvbnN0IHN1YnN0aXR1dGlvbnM6IHtbcGxhY2Vob2xkZXJOYW1lOiBzdHJpbmddOiBhbnl9ID0ge307XG4gIGNvbnN0IHN1YnN0aXR1dGlvbkxvY2F0aW9uczoge1twbGFjZWhvbGRlck5hbWU6IHN0cmluZ106IFNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkfSA9IHt9O1xuICBjb25zdCBhc3NvY2lhdGVkTWVzc2FnZUlkczoge1twbGFjZWhvbGRlck5hbWU6IHN0cmluZ106IE1lc3NhZ2VJZH0gPSB7fTtcbiAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZU1ldGFkYXRhKG1lc3NhZ2VQYXJ0c1swXSwgbWVzc2FnZVBhcnRzLnJhd1swXSk7XG4gIGNvbnN0IGNsZWFuZWRNZXNzYWdlUGFydHM6IHN0cmluZ1tdID0gW21ldGFkYXRhLnRleHRdO1xuICBjb25zdCBwbGFjZWhvbGRlck5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbWVzc2FnZVN0cmluZyA9IG1ldGFkYXRhLnRleHQ7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbWVzc2FnZVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVzc2FnZVBhcnQsXG4gICAgICBwbGFjZWhvbGRlck5hbWUgPSBjb21wdXRlUGxhY2Vob2xkZXJOYW1lKGkpLFxuICAgICAgYXNzb2NpYXRlZE1lc3NhZ2VJZCxcbiAgICB9ID0gcGFyc2VQbGFjZWhvbGRlcihtZXNzYWdlUGFydHNbaV0sIG1lc3NhZ2VQYXJ0cy5yYXdbaV0pO1xuICAgIG1lc3NhZ2VTdHJpbmcgKz0gYHskJHtwbGFjZWhvbGRlck5hbWV9fSR7bWVzc2FnZVBhcnR9YDtcbiAgICBpZiAoZXhwcmVzc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3Vic3RpdHV0aW9uc1twbGFjZWhvbGRlck5hbWVdID0gZXhwcmVzc2lvbnNbaSAtIDFdO1xuICAgICAgc3Vic3RpdHV0aW9uTG9jYXRpb25zW3BsYWNlaG9sZGVyTmFtZV0gPSBleHByZXNzaW9uTG9jYXRpb25zW2kgLSAxXTtcbiAgICB9XG4gICAgcGxhY2Vob2xkZXJOYW1lcy5wdXNoKHBsYWNlaG9sZGVyTmFtZSk7XG4gICAgaWYgKGFzc29jaWF0ZWRNZXNzYWdlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzb2NpYXRlZE1lc3NhZ2VJZHNbcGxhY2Vob2xkZXJOYW1lXSA9IGFzc29jaWF0ZWRNZXNzYWdlSWQ7XG4gICAgfVxuICAgIGNsZWFuZWRNZXNzYWdlUGFydHMucHVzaChtZXNzYWdlUGFydCk7XG4gIH1cbiAgY29uc3QgbWVzc2FnZUlkID0gbWV0YWRhdGEuY3VzdG9tSWQgfHwgY29tcHV0ZU1zZ0lkKG1lc3NhZ2VTdHJpbmcsIG1ldGFkYXRhLm1lYW5pbmcgfHwgJycpO1xuICBjb25zdCBsZWdhY3lJZHMgPSBtZXRhZGF0YS5sZWdhY3lJZHMgPyBtZXRhZGF0YS5sZWdhY3lJZHMuZmlsdGVyKChpZCkgPT4gaWQgIT09IG1lc3NhZ2VJZCkgOiBbXTtcbiAgcmV0dXJuIHtcbiAgICBpZDogbWVzc2FnZUlkLFxuICAgIGxlZ2FjeUlkcyxcbiAgICBzdWJzdGl0dXRpb25zLFxuICAgIHN1YnN0aXR1dGlvbkxvY2F0aW9ucyxcbiAgICB0ZXh0OiBtZXNzYWdlU3RyaW5nLFxuICAgIGN1c3RvbUlkOiBtZXRhZGF0YS5jdXN0b21JZCxcbiAgICBtZWFuaW5nOiBtZXRhZGF0YS5tZWFuaW5nIHx8ICcnLFxuICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICBtZXNzYWdlUGFydHM6IGNsZWFuZWRNZXNzYWdlUGFydHMsXG4gICAgbWVzc2FnZVBhcnRMb2NhdGlvbnMsXG4gICAgcGxhY2Vob2xkZXJOYW1lcyxcbiAgICBhc3NvY2lhdGVkTWVzc2FnZUlkcyxcbiAgICBsb2NhdGlvbixcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gbWVzc2FnZSBwYXJ0IChgY29va2VkYCArIGByYXdgKSB0byBleHRyYWN0IHRoZSBtZXNzYWdlIG1ldGFkYXRhIGZyb20gdGhlIHRleHQuXG4gKlxuICogSWYgdGhlIG1lc3NhZ2UgcGFydCBoYXMgYSBtZXRhZGF0YSBibG9jayB0aGlzIGZ1bmN0aW9uIHdpbGwgZXh0cmFjdCB0aGUgYG1lYW5pbmdgLFxuICogYGRlc2NyaXB0aW9uYCwgYGN1c3RvbUlkYCBhbmQgYGxlZ2FjeUlkYCAoaWYgcHJvdmlkZWQpIGZyb20gdGhlIGJsb2NrLiBUaGVzZSBtZXRhZGF0YSBwcm9wZXJ0aWVzXG4gKiBhcmUgc2VyaWFsaXplZCBpbiB0aGUgc3RyaW5nIGRlbGltaXRlZCBieSBgfGAsIGBAQGAgYW5kIGDikJ9gIHJlc3BlY3RpdmVseS5cbiAqXG4gKiAoTm90ZSB0aGF0IGDikJ9gIGlzIHRoZSBgTEVHQUNZX0lEX0lORElDQVRPUmAgLSBzZWUgYGNvbnN0YW50cy50c2AuKVxuICpcbiAqIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiBgOm1lYW5pbmd8ZGVzY3JpcHRpb25AQGN1c3RvbS1pZDpgXG4gKiBgOm1lYW5pbmd8QEBjdXN0b20taWQ6YFxuICogYDptZWFuaW5nfGRlc2NyaXB0aW9uOmBcbiAqIGA6ZGVzY3JpcHRpb25AQGN1c3RvbS1pZDpgXG4gKiBgOm1lYW5pbmd8OmBcbiAqIGA6ZGVzY3JpcHRpb246YFxuICogYDpAQGN1c3RvbS1pZDpgXG4gKiBgOm1lYW5pbmd8ZGVzY3JpcHRpb25AQGN1c3RvbS1pZOKQn2xlZ2FjeS1pZC0x4pCfbGVnYWN5LWlkLTI6YFxuICogYGBgXG4gKlxuICogQHBhcmFtIGNvb2tlZCBUaGUgY29va2VkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UgcGFydCB0byBwYXJzZS5cbiAqIEBwYXJhbSByYXcgVGhlIHJhdyB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlIHBhcnQgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBBIG9iamVjdCBjb250YWluaW5nIGFueSBtZXRhZGF0YSB0aGF0IHdhcyBwYXJzZWQgZnJvbSB0aGUgbWVzc2FnZSBwYXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShjb29rZWQ6IHN0cmluZywgcmF3OiBzdHJpbmcpOiBNZXNzYWdlTWV0YWRhdGEge1xuICBjb25zdCB7dGV4dDogbWVzc2FnZVN0cmluZywgYmxvY2t9ID0gc3BsaXRCbG9jayhjb29rZWQsIHJhdyk7XG4gIGlmIChibG9jayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHt0ZXh0OiBtZXNzYWdlU3RyaW5nfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbbWVhbmluZ0Rlc2NBbmRJZCwgLi4ubGVnYWN5SWRzXSA9IGJsb2NrLnNwbGl0KExFR0FDWV9JRF9JTkRJQ0FUT1IpO1xuICAgIGNvbnN0IFttZWFuaW5nQW5kRGVzYywgY3VzdG9tSWRdID0gbWVhbmluZ0Rlc2NBbmRJZC5zcGxpdChJRF9TRVBBUkFUT1IsIDIpO1xuICAgIGxldCBbbWVhbmluZywgZGVzY3JpcHRpb25dOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdID0gbWVhbmluZ0FuZERlc2Muc3BsaXQoTUVBTklOR19TRVBBUkFUT1IsIDIpO1xuICAgIGlmIChkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IG1lYW5pbmc7XG4gICAgICBtZWFuaW5nID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24gPT09ICcnKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHt0ZXh0OiBtZXNzYWdlU3RyaW5nLCBtZWFuaW5nLCBkZXNjcmlwdGlvbiwgY3VzdG9tSWQsIGxlZ2FjeUlkc307XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gbWVzc2FnZSBwYXJ0IChgY29va2VkYCArIGByYXdgKSB0byBleHRyYWN0IGFueSBwbGFjZWhvbGRlciBtZXRhZGF0YSBmcm9tIHRoZVxuICogdGV4dC5cbiAqXG4gKiBJZiB0aGUgbWVzc2FnZSBwYXJ0IGhhcyBhIG1ldGFkYXRhIGJsb2NrIHRoaXMgZnVuY3Rpb24gd2lsbCBleHRyYWN0IHRoZSBgcGxhY2Vob2xkZXJOYW1lYCBhbmRcbiAqIGBhc3NvY2lhdGVkTWVzc2FnZUlkYCAoaWYgcHJvdmlkZWQpIGZyb20gdGhlIGJsb2NrLlxuICpcbiAqIFRoZXNlIG1ldGFkYXRhIHByb3BlcnRpZXMgYXJlIHNlcmlhbGl6ZWQgaW4gdGhlIHN0cmluZyBkZWxpbWl0ZWQgYnkgYEBAYC5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogYDpwbGFjZWhvbGRlci1uYW1lQEBhc3NvY2lhdGVkLWlkOmBcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb29rZWQgVGhlIGNvb2tlZCB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlIHBhcnQgdG8gcGFyc2UuXG4gKiBAcGFyYW0gcmF3IFRoZSByYXcgdmVyc2lvbiBvZiB0aGUgbWVzc2FnZSBwYXJ0IHRvIHBhcnNlLlxuICogQHJldHVybnMgQSBvYmplY3QgY29udGFpbmluZyB0aGUgbWV0YWRhdGEgKGBwbGFjZWhvbGRlck5hbWVgIGFuZCBgYXNzb2NpYXRlZE1lc3NhZ2VJZGApIG9mIHRoZVxuICogICAgIHByZWNlZGluZyBwbGFjZWhvbGRlciwgYWxvbmcgd2l0aCB0aGUgc3RhdGljIHRleHQgdGhhdCBmb2xsb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQbGFjZWhvbGRlcihcbiAgY29va2VkOiBzdHJpbmcsXG4gIHJhdzogc3RyaW5nLFxuKToge21lc3NhZ2VQYXJ0OiBzdHJpbmc7IHBsYWNlaG9sZGVyTmFtZT86IHN0cmluZzsgYXNzb2NpYXRlZE1lc3NhZ2VJZD86IHN0cmluZ30ge1xuICBjb25zdCB7dGV4dDogbWVzc2FnZVBhcnQsIGJsb2NrfSA9IHNwbGl0QmxvY2soY29va2VkLCByYXcpO1xuICBpZiAoYmxvY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7bWVzc2FnZVBhcnR9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtwbGFjZWhvbGRlck5hbWUsIGFzc29jaWF0ZWRNZXNzYWdlSWRdID0gYmxvY2suc3BsaXQoSURfU0VQQVJBVE9SKTtcbiAgICByZXR1cm4ge21lc3NhZ2VQYXJ0LCBwbGFjZWhvbGRlck5hbWUsIGFzc29jaWF0ZWRNZXNzYWdlSWR9O1xuICB9XG59XG5cbi8qKlxuICogU3BsaXQgYSBtZXNzYWdlIHBhcnQgKGBjb29rZWRgICsgYHJhd2ApIGludG8gYW4gb3B0aW9uYWwgZGVsaW1pdGVkIFwiYmxvY2tcIiBvZmYgdGhlIGZyb250IGFuZCB0aGVcbiAqIHJlc3Qgb2YgdGhlIHRleHQgb2YgdGhlIG1lc3NhZ2UgcGFydC5cbiAqXG4gKiBCbG9ja3MgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiBtZXNzYWdlIHBhcnRzLiBUaGV5IGFyZSBkZWxpbWl0ZWQgYnkgYSBjb2xvbiBgOmAgY2hhcmFjdGVyIGF0IHRoZVxuICogc3RhcnQgYW5kIGVuZCBvZiB0aGUgYmxvY2suXG4gKlxuICogSWYgdGhlIGJsb2NrIGlzIGluIHRoZSBmaXJzdCBtZXNzYWdlIHBhcnQgdGhlbiBpdCB3aWxsIGJlIG1ldGFkYXRhIGFib3V0IHRoZSB3aG9sZSBtZXNzYWdlOlxuICogbWVhbmluZywgZGVzY3JpcHRpb24sIGlkLiAgT3RoZXJ3aXNlIGl0IHdpbGwgYmUgbWV0YWRhdGEgYWJvdXQgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZ1xuICogc3Vic3RpdHV0aW9uOiBwbGFjZWhvbGRlciBuYW1lLlxuICpcbiAqIFNpbmNlIGJsb2NrcyBhcmUgb3B0aW9uYWwsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNvbnRlbnQgb2YgYSBtZXNzYWdlIGJsb2NrIGFjdHVhbGx5IHN0YXJ0c1xuICogd2l0aCBhIGJsb2NrIG1hcmtlci4gSW4gdGhpcyBjYXNlIHRoZSBtYXJrZXIgbXVzdCBiZSBlc2NhcGVkIGBcXDpgLlxuICpcbiAqIEBwYXJhbSBjb29rZWQgVGhlIGNvb2tlZCB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlIHBhcnQgdG8gcGFyc2UuXG4gKiBAcGFyYW0gcmF3IFRoZSByYXcgdmVyc2lvbiBvZiB0aGUgbWVzc2FnZSBwYXJ0IHRvIHBhcnNlLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGB0ZXh0YCBvZiB0aGUgbWVzc2FnZSBwYXJ0IGFuZCB0aGUgdGV4dCBvZiB0aGUgYGJsb2NrYCwgaWYgaXRcbiAqIGV4aXN0cy5cbiAqIEB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGBibG9ja2AgaXMgdW50ZXJtaW5hdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJsb2NrKGNvb2tlZDogc3RyaW5nLCByYXc6IHN0cmluZyk6IHt0ZXh0OiBzdHJpbmc7IGJsb2NrPzogc3RyaW5nfSB7XG4gIGlmIChyYXcuY2hhckF0KDApICE9PSBCTE9DS19NQVJLRVIpIHtcbiAgICByZXR1cm4ge3RleHQ6IGNvb2tlZH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZW5kT2ZCbG9jayA9IGZpbmRFbmRPZkJsb2NrKGNvb2tlZCwgcmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgYmxvY2s6IGNvb2tlZC5zdWJzdHJpbmcoMSwgZW5kT2ZCbG9jayksXG4gICAgICB0ZXh0OiBjb29rZWQuc3Vic3RyaW5nKGVuZE9mQmxvY2sgKyAxKSxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVQbGFjZWhvbGRlck5hbWUoaW5kZXg6IG51bWJlcikge1xuICByZXR1cm4gaW5kZXggPT09IDEgPyAnUEgnIDogYFBIXyR7aW5kZXggLSAxfWA7XG59XG5cbi8qKlxuICogRmluZCB0aGUgZW5kIG9mIGEgXCJtYXJrZWQgYmxvY2tcIiBpbmRpY2F0ZWQgYnkgdGhlIGZpcnN0IG5vbi1lc2NhcGVkIGNvbG9uLlxuICpcbiAqIEBwYXJhbSBjb29rZWQgVGhlIGNvb2tlZCBzdHJpbmcgKHdoZXJlIGVzY2FwZWQgY2hhcnMgaGF2ZSBiZWVuIHByb2Nlc3NlZClcbiAqIEBwYXJhbSByYXcgVGhlIHJhdyBzdHJpbmcgKHdoZXJlIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIHN0aWxsIGluIHBsYWNlKVxuICpcbiAqIEByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZW5kIG9mIGJsb2NrIG1hcmtlclxuICogQHRocm93cyBhbiBlcnJvciBpZiB0aGUgYmxvY2sgaXMgdW50ZXJtaW5hdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRW5kT2ZCbG9jayhjb29rZWQ6IHN0cmluZywgcmF3OiBzdHJpbmcpOiBudW1iZXIge1xuICBmb3IgKGxldCBjb29rZWRJbmRleCA9IDEsIHJhd0luZGV4ID0gMTsgY29va2VkSW5kZXggPCBjb29rZWQubGVuZ3RoOyBjb29rZWRJbmRleCsrLCByYXdJbmRleCsrKSB7XG4gICAgaWYgKHJhd1tyYXdJbmRleF0gPT09ICdcXFxcJykge1xuICAgICAgcmF3SW5kZXgrKztcbiAgICB9IGVsc2UgaWYgKGNvb2tlZFtjb29rZWRJbmRleF0gPT09IEJMT0NLX01BUktFUikge1xuICAgICAgcmV0dXJuIGNvb2tlZEluZGV4O1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVudGVybWluYXRlZCAkbG9jYWxpemUgbWV0YWRhdGEgYmxvY2sgaW4gXCIke3Jhd31cIi5gKTtcbn1cbiJdfQ==
@@ -1,119 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import { BLOCK_MARKER } from './constants';
9
- import { parseMessage } from './messages';
10
- export class MissingTranslationError extends Error {
11
- constructor(parsedMessage) {
12
- super(`No translation found for ${describeMessage(parsedMessage)}.`);
13
- this.parsedMessage = parsedMessage;
14
- this.type = 'MissingTranslationError';
15
- }
16
- }
17
- export function isMissingTranslationError(e) {
18
- return e.type === 'MissingTranslationError';
19
- }
20
- /**
21
- * Translate the text of the `$localize` tagged-string (i.e. `messageParts` and
22
- * `substitutions`) using the given `translations`.
23
- *
24
- * The tagged-string is parsed to extract its `messageId` which is used to find an appropriate
25
- * `ParsedTranslation`. If this doesn't match and there are legacy ids then try matching a
26
- * translation using those.
27
- *
28
- * If one is found then it is used to translate the message into a new set of `messageParts` and
29
- * `substitutions`.
30
- * The translation may reorder (or remove) substitutions as appropriate.
31
- *
32
- * If there is no translation with a matching message id then an error is thrown.
33
- * If a translation contains a placeholder that is not found in the message being translated then an
34
- * error is thrown.
35
- */
36
- export function translate(translations, messageParts, substitutions) {
37
- const message = parseMessage(messageParts, substitutions);
38
- // Look up the translation using the messageId, and then the legacyId if available.
39
- let translation = translations[message.id];
40
- // If the messageId did not match a translation, try matching the legacy ids instead
41
- if (message.legacyIds !== undefined) {
42
- for (let i = 0; i < message.legacyIds.length && translation === undefined; i++) {
43
- translation = translations[message.legacyIds[i]];
44
- }
45
- }
46
- if (translation === undefined) {
47
- throw new MissingTranslationError(message);
48
- }
49
- return [
50
- translation.messageParts,
51
- translation.placeholderNames.map((placeholder) => {
52
- if (message.substitutions.hasOwnProperty(placeholder)) {
53
- return message.substitutions[placeholder];
54
- }
55
- else {
56
- throw new Error(`There is a placeholder name mismatch with the translation provided for the message ${describeMessage(message)}.\n` +
57
- `The translation contains a placeholder with name ${placeholder}, which does not exist in the message.`);
58
- }
59
- }),
60
- ];
61
- }
62
- /**
63
- * Parse the `messageParts` and `placeholderNames` out of a target `message`.
64
- *
65
- * Used by `loadTranslations()` to convert target message strings into a structure that is more
66
- * appropriate for doing translation.
67
- *
68
- * @param message the message to be parsed.
69
- */
70
- export function parseTranslation(messageString) {
71
- const parts = messageString.split(/{\$([^}]*)}/);
72
- const messageParts = [parts[0]];
73
- const placeholderNames = [];
74
- for (let i = 1; i < parts.length - 1; i += 2) {
75
- placeholderNames.push(parts[i]);
76
- messageParts.push(`${parts[i + 1]}`);
77
- }
78
- const rawMessageParts = messageParts.map((part) => part.charAt(0) === BLOCK_MARKER ? '\\' + part : part);
79
- return {
80
- text: messageString,
81
- messageParts: makeTemplateObject(messageParts, rawMessageParts),
82
- placeholderNames,
83
- };
84
- }
85
- /**
86
- * Create a `ParsedTranslation` from a set of `messageParts` and `placeholderNames`.
87
- *
88
- * @param messageParts The message parts to appear in the ParsedTranslation.
89
- * @param placeholderNames The names of the placeholders to intersperse between the `messageParts`.
90
- */
91
- export function makeParsedTranslation(messageParts, placeholderNames = []) {
92
- let messageString = messageParts[0];
93
- for (let i = 0; i < placeholderNames.length; i++) {
94
- messageString += `{$${placeholderNames[i]}}${messageParts[i + 1]}`;
95
- }
96
- return {
97
- text: messageString,
98
- messageParts: makeTemplateObject(messageParts, messageParts),
99
- placeholderNames,
100
- };
101
- }
102
- /**
103
- * Create the specialized array that is passed to tagged-string tag functions.
104
- *
105
- * @param cooked The message parts with their escape codes processed.
106
- * @param raw The message parts with their escaped codes as-is.
107
- */
108
- export function makeTemplateObject(cooked, raw) {
109
- Object.defineProperty(cooked, 'raw', { value: raw });
110
- return cooked;
111
- }
112
- function describeMessage(message) {
113
- const meaningString = message.meaning && ` - "${message.meaning}"`;
114
- const legacy = message.legacyIds && message.legacyIds.length > 0
115
- ? ` [${message.legacyIds.map((l) => `"${l}"`).join(', ')}]`
116
- : '';
117
- return `"${message.id}"${legacy} ("${message.text}"${meaningString})`;
118
- }
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbG9jYWxpemUvc3JjL3V0aWxzL3NyYy90cmFuc2xhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQTRDLFlBQVksRUFBZ0IsTUFBTSxZQUFZLENBQUM7QUFlbEcsTUFBTSxPQUFPLHVCQUF3QixTQUFRLEtBQUs7SUFFaEQsWUFBcUIsYUFBNEI7UUFDL0MsS0FBSyxDQUFDLDRCQUE0QixlQUFlLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRGxELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBRGhDLFNBQUksR0FBRyx5QkFBeUIsQ0FBQztJQUdsRCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLFVBQVUseUJBQXlCLENBQUMsQ0FBTTtJQUM5QyxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUsseUJBQXlCLENBQUM7QUFDOUMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3ZCLFlBQStDLEVBQy9DLFlBQWtDLEVBQ2xDLGFBQTZCO0lBRTdCLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDMUQsbUZBQW1GO0lBQ25GLElBQUksV0FBVyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0Msb0ZBQW9GO0lBQ3BGLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFB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QUFDLENBQUM7SUFDbkQsT0FBTyxNQUFhLENBQUM7QUFDdkIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLE9BQXNCO0lBQzdDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUM7SUFDbkUsTUFBTSxNQUFNLEdBQ1YsT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1FBQzNELENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxPQUFPLElBQUksT0FBTyxDQUFDLEVBQUUsSUFBSSxNQUFNLE1BQU0sT0FBTyxDQUFDLElBQUksSUFBSSxhQUFhLEdBQUcsQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQge0JMT0NLX01BUktFUn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtNZXNzYWdlSWQsIE1lc3NhZ2VNZXRhZGF0YSwgUGFyc2VkTWVzc2FnZSwgcGFyc2VNZXNzYWdlLCBUYXJnZXRNZXNzYWdlfSBmcm9tICcuL21lc3NhZ2VzJztcblxuLyoqXG4gKiBBIHRyYW5zbGF0aW9uIG1lc3NhZ2UgdGhhdCBoYXMgYmVlbiBwcm9jZXNzZWQgdG8gZXh0cmFjdCB0aGUgbWVzc2FnZSBwYXJ0cyBhbmQgcGxhY2Vob2xkZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZFRyYW5zbGF0aW9uIGV4dGVuZHMgTWVzc2FnZU1ldGFkYXRhIHtcbiAgbWVzc2FnZVBhcnRzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheTtcbiAgcGxhY2Vob2xkZXJOYW1lczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIGludGVybmFsIHN0cnVjdHVyZSB1c2VkIGJ5IHRoZSBydW50aW1lIGxvY2FsaXphdGlvbiB0byB0cmFuc2xhdGUgbWVzc2FnZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFRyYW5zbGF0aW9ucyA9IFJlY29yZDxNZXNzYWdlSWQsIFBhcnNlZFRyYW5zbGF0aW9uPjtcblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdUcmFuc2xhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGUgPSAnTWlzc2luZ1RyYW5zbGF0aW9uRXJyb3InO1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBwYXJzZWRNZXNzYWdlOiBQYXJzZWRNZXNzYWdlKSB7XG4gICAgc3VwZXIoYE5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciAke2Rlc2NyaWJlTWVzc2FnZShwYXJzZWRNZXNzYWdlKX0uYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWlzc2luZ1RyYW5zbGF0aW9uRXJyb3IoZTogYW55KTogZSBpcyBNaXNzaW5nVHJhbnNsYXRpb25FcnJvciB7XG4gIHJldHVybiBlLnR5cGUgPT09ICdNaXNzaW5nVHJhbnNsYXRpb25FcnJvcic7XG59XG5cbi8qKlxuICogVHJhbnNsYXRlIHRoZSB0ZXh0IG9mIHRoZSBgJGxvY2FsaXplYCB0YWdnZWQtc3RyaW5nIChpLmUuIGBtZXNzYWdlUGFydHNgIGFuZFxuICogYHN1YnN0aXR1dGlvbnNgKSB1c2luZyB0aGUgZ2l2ZW4gYHRyYW5zbGF0aW9uc2AuXG4gKlxuICogVGhlIHRhZ2dlZC1zdHJpbmcgaXMgcGFyc2VkIHRvIGV4dHJhY3QgaXRzIGBtZXNzYWdlSWRgIHdoaWNoIGlzIHVzZWQgdG8gZmluZCBhbiBhcHByb3ByaWF0ZVxuICogYFBhcnNlZFRyYW5zbGF0aW9uYC4gSWYgdGhpcyBkb2Vzbid0IG1hdGNoIGFuZCB0aGVyZSBhcmUgbGVnYWN5IGlkcyB0aGVuIHRyeSBtYXRjaGluZyBhXG4gKiB0cmFuc2xhdGlvbiB1c2luZyB0aG9zZS5cbiAqXG4gKiBJZiBvbmUgaXMgZm91bmQgdGhlbiBpdCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSBpbnRvIGEgbmV3IHNldCBvZiBgbWVzc2FnZVBhcnRzYCBhbmRcbiAqIGBzdWJzdGl0dXRpb25zYC5cbiAqIFRoZSB0cmFuc2xhdGlvbiBtYXkgcmVvcmRlciAob3IgcmVtb3ZlKSBzdWJzdGl0dXRpb25zIGFzIGFwcHJvcHJpYXRlLlxuICpcbiAqIElmIHRoZXJlIGlzIG5vIHRyYW5zbGF0aW9uIHdpdGggYSBtYXRjaGluZyBtZXNzYWdlIGlkIHRoZW4gYW4gZXJyb3IgaXMgdGhyb3duLlxuICogSWYgYSB0cmFuc2xhdGlvbiBjb250YWlucyBhIHBsYWNlaG9sZGVyIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlIGJlaW5nIHRyYW5zbGF0ZWQgdGhlbiBhblxuICogZXJyb3IgaXMgdGhyb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKFxuICB0cmFuc2xhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFRyYW5zbGF0aW9uPixcbiAgbWVzc2FnZVBhcnRzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgc3Vic3RpdHV0aW9uczogcmVhZG9ubHkgYW55W10sXG4pOiBbVGVtcGxhdGVTdHJpbmdzQXJyYXksIHJlYWRvbmx5IGFueVtdXSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBwYXJzZU1lc3NhZ2UobWVzc2FnZVBhcnRzLCBzdWJzdGl0dXRpb25zKTtcbiAgLy8gTG9vayB1cCB0aGUgdHJhbnNsYXRpb24gdXNpbmcgdGhlIG1lc3NhZ2VJZCwgYW5kIHRoZW4gdGhlIGxlZ2FjeUlkIGlmIGF2YWlsYWJsZS5cbiAgbGV0IHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25zW21lc3NhZ2UuaWRdO1xuICAvLyBJZiB0aGUgbWVzc2FnZUlkIGRpZCBub3QgbWF0Y2ggYSB0cmFuc2xhdGlvbiwgdHJ5IG1hdGNoaW5nIHRoZSBsZWdhY3kgaWRzIGluc3RlYWRcbiAgaWYgKG1lc3NhZ2UubGVnYWN5SWRzICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2UubGVnYWN5SWRzLmxlbmd0aCAmJiB0cmFuc2xhdGlvbiA9PT0gdW5kZWZpbmVkOyBpKyspIHtcbiAgICAgIHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25zW21lc3NhZ2UubGVnYWN5SWRzW2ldXTtcbiAgICB9XG4gIH1cbiAgaWYgKHRyYW5zbGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgTWlzc2luZ1RyYW5zbGF0aW9uRXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgcmV0dXJuIFtcbiAgICB0cmFuc2xhdGlvbi5tZXNzYWdlUGFydHMsXG4gICAgdHJhbnNsYXRpb24ucGxhY2Vob2xkZXJOYW1lcy5tYXAoKHBsYWNlaG9sZGVyKSA9PiB7XG4gICAgICBpZiAobWVzc2FnZS5zdWJzdGl0dXRpb25zLmhhc093blByb3BlcnR5KHBsYWNlaG9sZGVyKSkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZS5zdWJzdGl0dXRpb25zW3BsYWNlaG9sZGVyXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlcmUgaXMgYSBwbGFjZWhvbGRlciBuYW1lIG1pc21hdGNoIHdpdGggdGhlIHRyYW5zbGF0aW9uIHByb3ZpZGVkIGZvciB0aGUgbWVzc2FnZSAke2Rlc2NyaWJlTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgKX0uXFxuYCArXG4gICAgICAgICAgICBgVGhlIHRyYW5zbGF0aW9uIGNvbnRhaW5zIGEgcGxhY2Vob2xkZXIgd2l0aCBuYW1lICR7cGxhY2Vob2xkZXJ9LCB3aGljaCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWVzc2FnZS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pLFxuICBdO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBgbWVzc2FnZVBhcnRzYCBhbmQgYHBsYWNlaG9sZGVyTmFtZXNgIG91dCBvZiBhIHRhcmdldCBgbWVzc2FnZWAuXG4gKlxuICogVXNlZCBieSBgbG9hZFRyYW5zbGF0aW9ucygpYCB0byBjb252ZXJ0IHRhcmdldCBtZXNzYWdlIHN0cmluZ3MgaW50byBhIHN0cnVjdHVyZSB0aGF0IGlzIG1vcmVcbiAqIGFwcHJvcHJpYXRlIGZvciBkb2luZyB0cmFuc2xhdGlvbi5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBwYXJzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRyYW5zbGF0aW9uKG1lc3NhZ2VTdHJpbmc6IFRhcmdldE1lc3NhZ2UpOiBQYXJzZWRUcmFuc2xhdGlvbiB7XG4gIGNvbnN0IHBhcnRzID0gbWVzc2FnZVN0cmluZy5zcGxpdCgve1xcJChbXn1dKil9Lyk7XG4gIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IFtwYXJ0c1swXV07XG4gIGNvbnN0IHBsYWNlaG9sZGVyTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgcGxhY2Vob2xkZXJOYW1lcy5wdXNoKHBhcnRzW2ldKTtcbiAgICBtZXNzYWdlUGFydHMucHVzaChgJHtwYXJ0c1tpICsgMV19YCk7XG4gIH1cbiAgY29uc3QgcmF3TWVzc2FnZVBhcnRzID0gbWVzc2FnZVBhcnRzLm1hcCgocGFydCkgPT5cbiAgICBwYXJ0LmNoYXJBdCgwKSA9PT0gQkxPQ0tfTUFSS0VSID8gJ1xcXFwnICsgcGFydCA6IHBhcnQsXG4gICk7XG4gIHJldHVybiB7XG4gICAgdGV4dDogbWVzc2FnZVN0cmluZyxcbiAgICBtZXNzYWdlUGFydHM6IG1ha2VUZW1wbGF0ZU9iamVjdChtZXNzYWdlUGFydHMsIHJhd01lc3NhZ2VQYXJ0cyksXG4gICAgcGxhY2Vob2xkZXJOYW1lcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgUGFyc2VkVHJhbnNsYXRpb25gIGZyb20gYSBzZXQgb2YgYG1lc3NhZ2VQYXJ0c2AgYW5kIGBwbGFjZWhvbGRlck5hbWVzYC5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZVBhcnRzIFRoZSBtZXNzYWdlIHBhcnRzIHRvIGFwcGVhciBpbiB0aGUgUGFyc2VkVHJhbnNsYXRpb24uXG4gKiBAcGFyYW0gcGxhY2Vob2xkZXJOYW1lcyBUaGUgbmFtZXMgb2YgdGhlIHBsYWNlaG9sZGVycyB0byBpbnRlcnNwZXJzZSBiZXR3ZWVuIHRoZSBgbWVzc2FnZVBhcnRzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQYXJzZWRUcmFuc2xhdGlvbihcbiAgbWVzc2FnZVBhcnRzOiBzdHJpbmdbXSxcbiAgcGxhY2Vob2xkZXJOYW1lczogc3RyaW5nW10gPSBbXSxcbik6IFBhcnNlZFRyYW5zbGF0aW9uIHtcbiAgbGV0IG1lc3NhZ2VTdHJpbmcgPSBtZXNzYWdlUGFydHNbMF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2Vob2xkZXJOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgIG1lc3NhZ2VTdHJpbmcgKz0gYHskJHtwbGFjZWhvbGRlck5hbWVzW2ldfX0ke21lc3NhZ2VQYXJ0c1tpICsgMV19YDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRleHQ6IG1lc3NhZ2VTdHJpbmcsXG4gICAgbWVzc2FnZVBhcnRzOiBtYWtlVGVtcGxhdGVPYmplY3QobWVzc2FnZVBhcnRzLCBtZXNzYWdlUGFydHMpLFxuICAgIHBsYWNlaG9sZGVyTmFtZXMsXG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBzcGVjaWFsaXplZCBhcnJheSB0aGF0IGlzIHBhc3NlZCB0byB0YWdnZWQtc3RyaW5nIHRhZyBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIGNvb2tlZCBUaGUgbWVzc2FnZSBwYXJ0cyB3aXRoIHRoZWlyIGVzY2FwZSBjb2RlcyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0gcmF3IFRoZSBtZXNzYWdlIHBhcnRzIHdpdGggdGhlaXIgZXNjYXBlZCBjb2RlcyBhcy1pcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQ6IHN0cmluZ1tdLCByYXc6IHN0cmluZ1tdKTogVGVtcGxhdGVTdHJpbmdzQXJyYXkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCAncmF3Jywge3ZhbHVlOiByYXd9KTtcbiAgcmV0dXJuIGNvb2tlZCBhcyBhbnk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTWVzc2FnZShtZXNzYWdlOiBQYXJzZWRNZXNzYWdlKTogc3RyaW5nIHtcbiAgY29uc3QgbWVhbmluZ1N0cmluZyA9IG1lc3NhZ2UubWVhbmluZyAmJiBgIC0gXCIke21lc3NhZ2UubWVhbmluZ31cImA7XG4gIGNvbnN0IGxlZ2FjeSA9XG4gICAgbWVzc2FnZS5sZWdhY3lJZHMgJiYgbWVzc2FnZS5sZWdhY3lJZHMubGVuZ3RoID4gMFxuICAgICAgPyBgIFske21lc3NhZ2UubGVnYWN5SWRzLm1hcCgobCkgPT4gYFwiJHtsfVwiYCkuam9pbignLCAnKX1dYFxuICAgICAgOiAnJztcbiAgcmV0dXJuIGBcIiR7bWVzc2FnZS5pZH1cIiR7bGVnYWN5fSAoXCIke21lc3NhZ2UudGV4dH1cIiR7bWVhbmluZ1N0cmluZ30pYDtcbn1cbiJdfQ==