sonamu 0.7.4 → 0.7.6

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 (137) hide show
  1. package/dist/api/config.d.ts +1 -4
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/api/sonamu.d.ts +2 -0
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +19 -47
  7. package/dist/bin/cli.js +6 -6
  8. package/dist/database/base-model.d.ts +1 -1
  9. package/dist/database/base-model.d.ts.map +1 -1
  10. package/dist/database/base-model.js +15 -4
  11. package/dist/database/code-generator.d.ts.map +1 -1
  12. package/dist/database/code-generator.js +3 -3
  13. package/dist/database/db.d.ts.map +1 -1
  14. package/dist/database/db.js +1 -1
  15. package/dist/database/puri-wrapper.d.ts +11 -11
  16. package/dist/database/puri-wrapper.d.ts.map +1 -1
  17. package/dist/database/puri-wrapper.js +7 -11
  18. package/dist/database/puri.d.ts +36 -17
  19. package/dist/database/puri.d.ts.map +1 -1
  20. package/dist/database/puri.js +54 -7
  21. package/dist/database/puri.types.d.ts +54 -17
  22. package/dist/database/puri.types.d.ts.map +1 -1
  23. package/dist/database/puri.types.js +2 -4
  24. package/dist/database/puri.types.test-d.js +129 -0
  25. package/dist/database/upsert-builder.d.ts +16 -10
  26. package/dist/database/upsert-builder.d.ts.map +1 -1
  27. package/dist/database/upsert-builder.js +10 -19
  28. package/dist/entity/entity-manager.d.ts +113 -22
  29. package/dist/entity/entity-manager.d.ts.map +1 -1
  30. package/dist/entity/entity-manager.js +1 -1
  31. package/dist/entity/entity.d.ts +34 -0
  32. package/dist/entity/entity.d.ts.map +1 -1
  33. package/dist/entity/entity.js +110 -37
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +8 -2
  37. package/dist/migration/code-generation.d.ts.map +1 -1
  38. package/dist/migration/code-generation.js +341 -149
  39. package/dist/migration/migration-set.d.ts.map +1 -1
  40. package/dist/migration/migration-set.js +21 -5
  41. package/dist/migration/migrator.d.ts.map +1 -1
  42. package/dist/migration/migrator.js +7 -1
  43. package/dist/migration/postgresql-schema-reader.d.ts +11 -1
  44. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  45. package/dist/migration/postgresql-schema-reader.js +111 -10
  46. package/dist/syncer/syncer.d.ts.map +1 -1
  47. package/dist/syncer/syncer.js +7 -4
  48. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  49. package/dist/template/implementations/generated.template.js +12 -2
  50. package/dist/template/implementations/generated_sso.template.d.ts +3 -3
  51. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  52. package/dist/template/implementations/generated_sso.template.js +50 -2
  53. package/dist/template/implementations/model.template.d.ts.map +1 -1
  54. package/dist/template/implementations/model.template.js +20 -15
  55. package/dist/template/implementations/model_test.template.js +4 -4
  56. package/dist/template/implementations/service.template.d.ts.map +1 -1
  57. package/dist/template/implementations/service.template.js +2 -2
  58. package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
  59. package/dist/template/implementations/view_enums_select.template.js +2 -2
  60. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  61. package/dist/template/implementations/view_form.template.js +12 -9
  62. package/dist/template/implementations/view_id_async_select.template.js +4 -4
  63. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  64. package/dist/template/implementations/view_list.template.js +12 -9
  65. package/dist/template/implementations/view_search_input.template.js +2 -2
  66. package/dist/template/template.js +2 -2
  67. package/dist/template/zod-converter.d.ts.map +1 -1
  68. package/dist/template/zod-converter.js +17 -2
  69. package/dist/testing/fixture-manager.d.ts +2 -1
  70. package/dist/testing/fixture-manager.d.ts.map +1 -1
  71. package/dist/testing/fixture-manager.js +29 -29
  72. package/dist/types/types.d.ts +593 -68
  73. package/dist/types/types.d.ts.map +1 -1
  74. package/dist/types/types.js +113 -9
  75. package/dist/vector/chunking.d.ts +25 -0
  76. package/dist/vector/chunking.d.ts.map +1 -0
  77. package/dist/vector/chunking.js +97 -0
  78. package/dist/vector/config.d.ts +12 -0
  79. package/dist/vector/config.d.ts.map +1 -0
  80. package/dist/vector/config.js +83 -0
  81. package/dist/vector/embedding.d.ts +42 -0
  82. package/dist/vector/embedding.d.ts.map +1 -0
  83. package/dist/vector/embedding.js +147 -0
  84. package/dist/vector/types.d.ts +105 -0
  85. package/dist/vector/types.d.ts.map +1 -0
  86. package/dist/vector/types.js +5 -0
  87. package/dist/vector/vector-search.d.ts +47 -0
  88. package/dist/vector/vector-search.d.ts.map +1 -0
  89. package/dist/vector/vector-search.js +176 -0
  90. package/package.json +9 -8
  91. package/src/api/config.ts +0 -4
  92. package/src/api/sonamu.ts +21 -36
  93. package/src/bin/cli.ts +5 -5
  94. package/src/database/base-model.ts +20 -11
  95. package/src/database/code-generator.ts +6 -2
  96. package/src/database/db.ts +1 -0
  97. package/src/database/puri-wrapper.ts +22 -16
  98. package/src/database/puri.ts +150 -27
  99. package/src/database/puri.types.test-d.ts +457 -0
  100. package/src/database/puri.types.ts +231 -33
  101. package/src/database/upsert-builder.ts +43 -34
  102. package/src/entity/entity-manager.ts +2 -2
  103. package/src/entity/entity.ts +134 -44
  104. package/src/index.ts +6 -0
  105. package/src/migration/code-generation.ts +377 -174
  106. package/src/migration/migration-set.ts +22 -3
  107. package/src/migration/migrator.ts +6 -0
  108. package/src/migration/postgresql-schema-reader.ts +121 -21
  109. package/src/syncer/syncer.ts +6 -3
  110. package/src/template/implementations/generated.template.ts +51 -9
  111. package/src/template/implementations/generated_sso.template.ts +71 -2
  112. package/src/template/implementations/model.template.ts +25 -15
  113. package/src/template/implementations/model_test.template.ts +3 -3
  114. package/src/template/implementations/service.template.ts +5 -1
  115. package/src/template/implementations/view_enums_dropdown.template.ts +1 -1
  116. package/src/template/implementations/view_enums_select.template.ts +1 -1
  117. package/src/template/implementations/view_form.template.ts +11 -8
  118. package/src/template/implementations/view_id_async_select.template.ts +3 -3
  119. package/src/template/implementations/view_list.template.ts +11 -8
  120. package/src/template/implementations/view_search_input.template.ts +1 -1
  121. package/src/template/template.ts +1 -1
  122. package/src/template/zod-converter.ts +20 -0
  123. package/src/testing/fixture-manager.ts +31 -30
  124. package/src/types/types.ts +226 -48
  125. package/src/vector/chunking.ts +115 -0
  126. package/src/vector/config.ts +68 -0
  127. package/src/vector/embedding.ts +193 -0
  128. package/src/vector/types.ts +122 -0
  129. package/src/vector/vector-search.ts +261 -0
  130. package/dist/template/implementations/view_enums_buttonset.template.d.ts +0 -17
  131. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +0 -1
  132. package/dist/template/implementations/view_enums_buttonset.template.js +0 -31
  133. package/dist/template/implementations/view_list_columns.template.d.ts +0 -17
  134. package/dist/template/implementations/view_list_columns.template.d.ts.map +0 -1
  135. package/dist/template/implementations/view_list_columns.template.js +0 -49
  136. package/src/template/implementations/view_enums_buttonset.template.ts +0 -34
  137. package/src/template/implementations/view_list_columns.template.ts +0 -53
@@ -17,13 +17,36 @@ class PostgreSQLSchemaReaderClass {
17
17
  console.error(e);
18
18
  return null;
19
19
  }
20
+ // vector 컬럼의 dimensions 조회
21
+ const vectorDimensions = await this.getVectorDimensions(compareDB, table);
20
22
  const columns = dbColumns.map((dbColumn)=>{
21
23
  const dbColType = this.resolveDBColType(dbColumn);
24
+ // vector 타입인 경우 dimensions 설정
25
+ if (dbColType.type === "vector") {
26
+ dbColType.dimensions = vectorDimensions[dbColumn.column_name] ?? 0;
27
+ }
22
28
  return {
23
29
  name: dbColumn.column_name,
24
30
  nullable: dbColumn.is_nullable === "YES",
25
31
  ...dbColType,
32
+ // Generated Column 처리
33
+ ...(()=>{
34
+ if (dbColumn.is_generated === "s" || dbColumn.is_generated === "v") {
35
+ return {
36
+ generated: {
37
+ type: dbColumn.is_generated === "s" ? "STORED" : "VIRTUAL",
38
+ expression: dbColumn.generation_expression ?? ""
39
+ }
40
+ };
41
+ }
42
+ return {};
43
+ })(),
44
+ // Default 값 처리 (Generated Column이 아닌 경우만)
26
45
  ...(()=>{
46
+ // Generated Column은 default 값이 없음
47
+ if (dbColumn.is_generated === "s" || dbColumn.is_generated === "v") {
48
+ return {};
49
+ }
27
50
  if (dbColumn.column_default !== null) {
28
51
  // PostgreSQL default 값 정리 (nextval, CURRENT_TIMESTAMP 등)
29
52
  let defaultValue = dbColumn.column_default;
@@ -33,9 +56,9 @@ class PostgreSQLSchemaReaderClass {
33
56
  }
34
57
  // 타입 캐스팅 제거 (예: '1'::integer → 1)
35
58
  defaultValue = defaultValue.replace(/::[\w\s]+$/g, "");
36
- // 따옴표 제거가 필요한 경우
59
+ // 따옴표가 single quote인 경우 double quote로 변환
37
60
  if (defaultValue.startsWith("'") && defaultValue.endsWith("'")) {
38
- defaultValue = defaultValue.slice(1, -1);
61
+ defaultValue = defaultValue.replaceAll("'", '"');
39
62
  }
40
63
  return {
41
64
  defaultTo: defaultValue
@@ -56,7 +79,12 @@ class PostgreSQLSchemaReaderClass {
56
79
  return {
57
80
  type,
58
81
  name: indexName,
59
- columns: currentIndexes.map((idx)=>idx.column_name)
82
+ columns: currentIndexes.map((idx)=>({
83
+ name: idx.column_name,
84
+ nullsFirst: idx.nulls_first,
85
+ sortOrder: idx.sort_order
86
+ })),
87
+ nullsNotDistinct: firstIndex.nulls_not_distinct
60
88
  };
61
89
  });
62
90
  // foreigns 처리
@@ -92,10 +120,32 @@ class PostgreSQLSchemaReaderClass {
92
120
  /**
93
121
  * 기존 테이블 읽어서 cols, indexes, foreigns 반환
94
122
  */ async readTable(compareDB, tableName) {
95
- // Columns 조회
96
- const columns = await compareDB.select("column_name", "data_type", "udt_name", "character_maximum_length", "numeric_precision", "numeric_scale", "is_nullable", "column_default").from("information_schema.columns").where({
97
- table_name: tableName
98
- }).orderBy("ordinal_position");
123
+ // Columns 조회 (Generated Column 정보 포함)
124
+ const columnsQuery = `
125
+ SELECT
126
+ c.column_name,
127
+ c.data_type,
128
+ c.udt_name,
129
+ c.character_maximum_length,
130
+ c.numeric_precision,
131
+ c.numeric_scale,
132
+ c.is_nullable,
133
+ c.column_default,
134
+ COALESCE(a.attgenerated, '') as is_generated,
135
+ c.generation_expression
136
+ FROM information_schema.columns c
137
+ LEFT JOIN pg_attribute a ON a.attname = c.column_name
138
+ AND a.attrelid = (
139
+ SELECT oid FROM pg_class WHERE relname = c.table_name
140
+ AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = c.table_schema)
141
+ )
142
+ WHERE c.table_name = ?
143
+ AND c.table_schema = 'public'
144
+ ORDER BY c.ordinal_position
145
+ `;
146
+ const columns = (await compareDB.raw(columnsQuery, [
147
+ tableName
148
+ ])).rows;
99
149
  if (columns.length === 0) {
100
150
  throw new Error(`Table not found: ${tableName}`);
101
151
  }
@@ -106,12 +156,23 @@ class PostgreSQLSchemaReaderClass {
106
156
  a.attname as column_name,
107
157
  ix.indisunique as is_unique,
108
158
  ix.indisprimary as is_primary,
109
- am.amname as index_type
159
+ am.amname as index_type,
160
+ -- NULLS FIRST/LAST 확인 (비트 연산)
161
+ (opt & 2) = 2 AS nulls_first,
162
+ -- ASC/DESC 확인
163
+ CASE
164
+ WHEN (opt & 1) = 1 THEN 'DESC'
165
+ ELSE 'ASC'
166
+ END AS sort_order,
167
+ ix.indnullsnotdistinct AS nulls_not_distinct
110
168
  FROM pg_class t
111
169
  JOIN pg_index ix ON t.oid = ix.indrelid
112
170
  JOIN pg_class i ON i.oid = ix.indexrelid
113
- JOIN pg_attribute a ON a.attrelid = t.oid
114
171
  JOIN pg_am am ON i.relam = am.oid
172
+ JOIN LATERAL unnest(ix.indkey, ix.indoption)
173
+ WITH ORDINALITY AS u(attnum, opt, ord) ON true
174
+ -- unnest에서 나온 attnum으로 직접 조인
175
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = u.attnum
115
176
  WHERE t.relname = ?
116
177
  AND a.attnum = ANY(ix.indkey)
117
178
  ORDER BY i.relname, array_position(ix.indkey, a.attnum)
@@ -151,6 +212,31 @@ class PostgreSQLSchemaReaderClass {
151
212
  ];
152
213
  }
153
214
  /**
215
+ * vector 컬럼의 dimensions를 조회합니다.
216
+ * pg_attribute의 atttypmod에서 차원 수를 추출합니다.
217
+ */ async getVectorDimensions(compareDB, tableName) {
218
+ const query = `
219
+ SELECT
220
+ a.attname as column_name,
221
+ a.atttypmod as dimensions
222
+ FROM pg_attribute a
223
+ JOIN pg_class c ON a.attrelid = c.oid
224
+ JOIN pg_type t ON a.atttypid = t.oid
225
+ WHERE c.relname = ?
226
+ AND t.typname = 'vector'
227
+ AND a.attnum > 0
228
+ `;
229
+ const result = await compareDB.raw(query, [
230
+ tableName
231
+ ]);
232
+ const dimensions = {};
233
+ for (const row of result.rows){
234
+ // atttypmod에서 실제 dimensions 값 추출
235
+ dimensions[row.column_name] = row.dimensions > 0 ? row.dimensions : 0;
236
+ }
237
+ return dimensions;
238
+ }
239
+ /**
154
240
  * PostgreSQL 컬럼 타입을 분석하여 MigrationColumn 객체로 변환합니다.
155
241
  */ resolveDBColType(dbColumn) {
156
242
  const { udt_name: _udt_name, character_maximum_length, numeric_precision, numeric_scale } = dbColumn;
@@ -238,9 +324,24 @@ class PostgreSQLSchemaReaderClass {
238
324
  type: "json"
239
325
  };
240
326
  }
327
+ // Vector (pgvector)
328
+ if (udt_name === "vector") {
329
+ // vector 타입의 차원 수는 column_default나 별도 쿼리로 확인해야 함
330
+ // 현재는 기본값 0으로 설정 (실제 dimensions는 getMigrationSetFromDB에서 별도 쿼리로 확인)
331
+ return {
332
+ type: `vector${singleOrArray}`,
333
+ dimensions: 0
334
+ };
335
+ }
336
+ // tsvector (PostgreSQL 전문 검색용 타입)
337
+ if (udt_name === "tsvector") {
338
+ return {
339
+ type: "tsvector"
340
+ };
341
+ }
241
342
  throw new Error(`resolve 불가능한 PostgreSQL 컬럼 타입: ${udt_name}`);
242
343
  }
243
344
  }
244
345
  export const PostgreSQLSchemaReader = new PostgreSQLSchemaReaderClass();
245
346
 
246
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGdyb3VwIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHtcbiAgTWlncmF0aW9uQ29sdW1uLFxuICBNaWdyYXRpb25Gb3JlaWduLFxuICBNaWdyYXRpb25JbmRleCxcbiAgTWlncmF0aW9uU2V0LFxuICBSZWxhdGlvbk9uLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgUGdDb2x1bW4gPSB7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGRhdGFfdHlwZTogc3RyaW5nO1xuICB1ZHRfbmFtZTogc3RyaW5nO1xuICBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGg6IG51bWJlciB8IG51bGw7XG4gIG51bWVyaWNfcHJlY2lzaW9uOiBudW1iZXIgfCBudWxsO1xuICBudW1lcmljX3NjYWxlOiBudW1iZXIgfCBudWxsO1xuICBpc19udWxsYWJsZTogc3RyaW5nO1xuICBjb2x1bW5fZGVmYXVsdDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbnR5cGUgUGdJbmRleCA9IHtcbiAgaW5kZXhfbmFtZTogc3RyaW5nO1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBpc191bmlxdWU6IGJvb2xlYW47XG4gIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gIGluZGV4X3R5cGU6IHN0cmluZztcbn07XG5cbnR5cGUgUGdGb3JlaWduID0ge1xuICBjb25zdHJhaW50X25hbWU6IHN0cmluZztcbiAgY29sdW1uX25hbWU6IHN0cmluZztcbiAgZm9yZWlnbl90YWJsZV9uYW1lOiBzdHJpbmc7XG4gIGZvcmVpZ25fY29sdW1uX25hbWU6IHN0cmluZztcbiAgdXBkYXRlX3J1bGU6IHN0cmluZztcbiAgZGVsZXRlX3J1bGU6IHN0cmluZztcbn07XG5cbmNsYXNzIFBvc3RncmVTUUxTY2hlbWFSZWFkZXJDbGFzcyB7XG4gIC8qKlxuICAgKiBEQuyXkOyEnCDthYzsnbTruJQg7KCV67O066W8IOydveyWtOyEnCBNaWdyYXRpb25TZXTsnYQg66eM65Ok7Ja07Ji164uI64ukLlxuICAgKiBAcGFyYW0gY29tcGFyZURCIEtuZXgg7J247Iqk7YS07IqkXG4gICAqIEBwYXJhbSB0YWJsZSDthYzsnbTruJQg7J2066aEXG4gICAqIEByZXR1cm5zIE1pZ3JhdGlvblNldCDqsJ3ssrRcbiAgICovXG4gIGFzeW5jIGdldE1pZ3JhdGlvblNldEZyb21EQihjb21wYXJlREI6IEtuZXgsIHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPE1pZ3JhdGlvblNldCB8IG51bGw+IHtcbiAgICBsZXQgZGJDb2x1bW5zOiBQZ0NvbHVtbltdLCBkYkluZGV4ZXM6IFBnSW5kZXhbXSwgZGJGb3JlaWduczogUGdGb3JlaWduW107XG4gICAgdHJ5IHtcbiAgICAgIFtkYkNvbHVtbnMsIGRiSW5kZXhlcywgZGJGb3JlaWduc10gPSBhd2FpdCB0aGlzLnJlYWRUYWJsZShjb21wYXJlREIsIHRhYmxlKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZS5pbmNsdWRlcyhcIlRhYmxlIG5vdCBmb3VuZFwiKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSA9IGRiQ29sdW1ucy5tYXAoKGRiQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBkYkNvbFR5cGUgPSB0aGlzLnJlc29sdmVEQkNvbFR5cGUoZGJDb2x1bW4pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZGJDb2x1bW4uY29sdW1uX25hbWUsXG4gICAgICAgIG51bGxhYmxlOiBkYkNvbHVtbi5pc19udWxsYWJsZSA9PT0gXCJZRVNcIixcbiAgICAgICAgLi4uZGJDb2xUeXBlLFxuICAgICAgICAuLi4oKCkgPT4ge1xuICAgICAgICAgIGlmIChkYkNvbHVtbi5jb2x1bW5fZGVmYXVsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUG9zdGdyZVNRTCBkZWZhdWx0IOqwkiDsoJXrpqwgKG5leHR2YWwsIENVUlJFTlRfVElNRVNUQU1QIOuTsSlcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSBkYkNvbHVtbi5jb2x1bW5fZGVmYXVsdDtcblxuICAgICAgICAgICAgLy8gbmV4dHZhbCDsoJzqsbAgKFNFUklBTCDtg4DsnoUpXG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlLnN0YXJ0c1dpdGgoXCJuZXh0dmFsKFwiKSkge1xuICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2DgOyehSDsupDsiqTtjIUg7KCc6rGwICjsmIg6ICcxJzo6aW50ZWdlciDihpIgMSlcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZS5yZXBsYWNlKC86OltcXHdcXHNdKyQvZywgXCJcIik7XG5cbiAgICAgICAgICAgIC8vIOuUsOyYtO2RnCDsoJzqsbDqsIAg7ZWE7JqU7ZWcIOqyveyasFxuICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSAmJiBkZWZhdWx0VmFsdWUuZW5kc1dpdGgoXCInXCIpKSB7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZS5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRlZmF1bHRUbzogZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KSgpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFBSSU1BUlkgS0VZ7JmAIGZvcmVpZ24ga2V57JqpIOyduOuNseyKpCDsoJzsmbhcbiAgICBjb25zdCBkYkluZGV4ZXNHcm91cCA9IGdyb3VwKFxuICAgICAgZGJJbmRleGVzLmZpbHRlcihcbiAgICAgICAgKGRiSW5kZXgpID0+XG4gICAgICAgICAgIWRiSW5kZXguaXNfcHJpbWFyeSAmJlxuICAgICAgICAgICFkYkZvcmVpZ25zLmZpbmQoKGRiRm9yZWlnbikgPT4gZGJJbmRleC5pbmRleF9uYW1lLmluY2x1ZGVzKGRiRm9yZWlnbi5jb25zdHJhaW50X25hbWUpKSxcbiAgICAgICksXG4gICAgICAoZGJJbmRleCkgPT4gZGJJbmRleC5pbmRleF9uYW1lLFxuICAgICk7XG5cbiAgICAvLyBpbmRleGVzIOyymOumrFxuICAgIGNvbnN0IGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10gPSBPYmplY3Qua2V5cyhkYkluZGV4ZXNHcm91cCkubWFwKChpbmRleE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleGVzID0gZGJJbmRleGVzR3JvdXBbaW5kZXhOYW1lXTtcbiAgICAgIGFzc2VydChjdXJyZW50SW5kZXhlcyk7XG5cbiAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBjdXJyZW50SW5kZXhlc1swXTtcbiAgICAgIGNvbnN0IHR5cGUgPSBmaXJzdEluZGV4LmlzX3VuaXF1ZSA/IFwidW5pcXVlXCIgOiBcImluZGV4XCI7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIG5hbWU6IGluZGV4TmFtZSxcbiAgICAgICAgY29sdW1uczogY3VycmVudEluZGV4ZXMubWFwKChpZHgpID0+IGlkeC5jb2x1bW5fbmFtZSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gZm9yZWlnbnMg7LKY66asXG4gICAgY29uc3QgZm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSA9IGRiRm9yZWlnbnMubWFwKChkYkZvcmVpZ24pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbnM6IFtkYkZvcmVpZ24uY29sdW1uX25hbWVdLFxuICAgICAgICB0bzogYCR7ZGJGb3JlaWduLmZvcmVpZ25fdGFibGVfbmFtZX0uJHtkYkZvcmVpZ24uZm9yZWlnbl9jb2x1bW5fbmFtZX1gLFxuICAgICAgICBvblVwZGF0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKGRiRm9yZWlnbi51cGRhdGVfcnVsZSksXG4gICAgICAgIG9uRGVsZXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24oZGJGb3JlaWduLmRlbGV0ZV9ydWxlKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFibGUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgaW5kZXhlcyxcbiAgICAgIGZvcmVpZ25zLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUG9zdGdyZVNRTOydmCBjb25zdHJhaW50IGFjdGlvbuydhCBLbmV4IO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgbWFwQ29uc3RyYWludEFjdGlvbihhY3Rpb246IHN0cmluZyk6IFJlbGF0aW9uT24ge1xuICAgIGNvbnN0IGFjdGlvbk1hcDogUmVjb3JkPHN0cmluZywgUmVsYXRpb25Pbj4gPSB7XG4gICAgICBcIk5PIEFDVElPTlwiOiBcIk5PIEFDVElPTlwiLFxuICAgICAgUkVTVFJJQ1Q6IFwiUkVTVFJJQ1RcIixcbiAgICAgIENBU0NBREU6IFwiQ0FTQ0FERVwiLFxuICAgICAgXCJTRVQgTlVMTFwiOiBcIlNFVCBOVUxMXCIsXG4gICAgICBcIlNFVCBERUZBVUxUXCI6IFwiU0VUIERFRkFVTFRcIixcbiAgICB9O1xuICAgIHJldHVybiBhY3Rpb25NYXBbYWN0aW9uXSA/PyBcIk5PIEFDVElPTlwiO1xuICB9XG5cbiAgLyoqXG4gICAqIOq4sOyhtCDthYzsnbTruJQg7J297Ja07IScIGNvbHMsIGluZGV4ZXMsIGZvcmVpZ25zIOuwmO2ZmFxuICAgKi9cbiAgYXN5bmMgcmVhZFRhYmxlKFxuICAgIGNvbXBhcmVEQjogS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxbUGdDb2x1bW5bXSwgUGdJbmRleFtdLCBQZ0ZvcmVpZ25bXV0+IHtcbiAgICAvLyBDb2x1bW5zIOyhsO2ajFxuICAgIGNvbnN0IGNvbHVtbnMgPSBhd2FpdCBjb21wYXJlREJcbiAgICAgIC5zZWxlY3QoXG4gICAgICAgIFwiY29sdW1uX25hbWVcIixcbiAgICAgICAgXCJkYXRhX3R5cGVcIixcbiAgICAgICAgXCJ1ZHRfbmFtZVwiLFxuICAgICAgICBcImNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aFwiLFxuICAgICAgICBcIm51bWVyaWNfcHJlY2lzaW9uXCIsXG4gICAgICAgIFwibnVtZXJpY19zY2FsZVwiLFxuICAgICAgICBcImlzX251bGxhYmxlXCIsXG4gICAgICAgIFwiY29sdW1uX2RlZmF1bHRcIixcbiAgICAgIClcbiAgICAgIC5mcm9tKFwiaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnNcIilcbiAgICAgIC53aGVyZSh7IHRhYmxlX25hbWU6IHRhYmxlTmFtZSB9KVxuICAgICAgLm9yZGVyQnkoXCJvcmRpbmFsX3Bvc2l0aW9uXCIpO1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBub3QgZm91bmQ6ICR7dGFibGVOYW1lfWApO1xuICAgIH1cblxuICAgIC8vIEluZGV4ZXMg7KGw7ZqMXG4gICAgY29uc3QgaW5kZXhlc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIGkucmVsbmFtZSBhcyBpbmRleF9uYW1lLFxuICAgICAgICBhLmF0dG5hbWUgYXMgY29sdW1uX25hbWUsXG4gICAgICAgIGl4LmluZGlzdW5pcXVlIGFzIGlzX3VuaXF1ZSxcbiAgICAgICAgaXguaW5kaXNwcmltYXJ5IGFzIGlzX3ByaW1hcnksXG4gICAgICAgIGFtLmFtbmFtZSBhcyBpbmRleF90eXBlXG4gICAgICBGUk9NIHBnX2NsYXNzIHRcbiAgICAgIEpPSU4gcGdfaW5kZXggaXggT04gdC5vaWQgPSBpeC5pbmRyZWxpZFxuICAgICAgSk9JTiBwZ19jbGFzcyBpIE9OIGkub2lkID0gaXguaW5kZXhyZWxpZFxuICAgICAgSk9JTiBwZ19hdHRyaWJ1dGUgYSBPTiBhLmF0dHJlbGlkID0gdC5vaWRcbiAgICAgIEpPSU4gcGdfYW0gYW0gT04gaS5yZWxhbSA9IGFtLm9pZFxuICAgICAgV0hFUkUgdC5yZWxuYW1lID0gP1xuICAgICAgICBBTkQgYS5hdHRudW0gPSBBTlkoaXguaW5ka2V5KVxuICAgICAgT1JERVIgQlkgaS5yZWxuYW1lLCBhcnJheV9wb3NpdGlvbihpeC5pbmRrZXksIGEuYXR0bnVtKVxuICAgIGA7XG4gICAgY29uc3QgaW5kZXhlcyA9IChhd2FpdCBjb21wYXJlREIucmF3KGluZGV4ZXNRdWVyeSwgW3RhYmxlTmFtZV0pKS5yb3dzO1xuXG4gICAgLy8gRm9yZWlnbiBLZXlzIOyhsO2ajFxuICAgIGNvbnN0IGZvcmVpZ25zUXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgdGMuY29uc3RyYWludF9uYW1lLFxuICAgICAgICBrY3UuY29sdW1uX25hbWUsXG4gICAgICAgIGNjdS50YWJsZV9uYW1lIEFTIGZvcmVpZ25fdGFibGVfbmFtZSxcbiAgICAgICAgY2N1LmNvbHVtbl9uYW1lIEFTIGZvcmVpZ25fY29sdW1uX25hbWUsXG4gICAgICAgIHJjLnVwZGF0ZV9ydWxlLFxuICAgICAgICByYy5kZWxldGVfcnVsZVxuICAgICAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVfY29uc3RyYWludHMgQVMgdGNcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLmtleV9jb2x1bW5fdXNhZ2UgQVMga2N1XG4gICAgICAgIE9OIHRjLmNvbnN0cmFpbnRfbmFtZSA9IGtjdS5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIHRjLnRhYmxlX3NjaGVtYSA9IGtjdS50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLmNvbnN0cmFpbnRfY29sdW1uX3VzYWdlIEFTIGNjdVxuICAgICAgICBPTiBjY3UuY29uc3RyYWludF9uYW1lID0gdGMuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCBjY3UudGFibGVfc2NoZW1hID0gdGMudGFibGVfc2NoZW1hXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5yZWZlcmVudGlhbF9jb25zdHJhaW50cyBBUyByY1xuICAgICAgICBPTiByYy5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIHJjLmNvbnN0cmFpbnRfc2NoZW1hID0gdGMudGFibGVfc2NoZW1hXG4gICAgICBXSEVSRSB0Yy5jb25zdHJhaW50X3R5cGUgPSAnRk9SRUlHTiBLRVknXG4gICAgICAgIEFORCB0Yy50YWJsZV9uYW1lID0gP1xuICAgIGA7XG4gICAgY29uc3QgZm9yZWlnbnMgPSAoYXdhaXQgY29tcGFyZURCLnJhdyhmb3JlaWduc1F1ZXJ5LCBbdGFibGVOYW1lXSkpLnJvd3M7XG5cbiAgICByZXR1cm4gW2NvbHVtbnMsIGluZGV4ZXMsIGZvcmVpZ25zXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0Z3JlU1FMIOy7rOufvCDtg4DsnoXsnYQg67aE7ISd7ZWY7JesIE1pZ3JhdGlvbkNvbHVtbiDqsJ3ssrTroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgcmVzb2x2ZURCQ29sVHlwZShcbiAgICBkYkNvbHVtbjogUGdDb2x1bW4sXG4gICk6IFBpY2s8TWlncmF0aW9uQ29sdW1uLCBcInR5cGVcIiB8IFwibGVuZ3RoXCIgfCBcInByZWNpc2lvblwiIHwgXCJzY2FsZVwiIHwgXCJudW1iZXJUeXBlXCI+IHtcbiAgICBjb25zdCB7XG4gICAgICB1ZHRfbmFtZTogX3VkdF9uYW1lLFxuICAgICAgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLFxuICAgICAgbnVtZXJpY19wcmVjaXNpb24sXG4gICAgICBudW1lcmljX3NjYWxlLFxuICAgIH0gPSBkYkNvbHVtbjtcblxuICAgIGNvbnN0IHsgdWR0X25hbWUsIHNpbmdsZU9yQXJyYXkgfSA9ICgoKSA9PiB7XG4gICAgICBpZiAoX3VkdF9uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdWR0X25hbWU6IF91ZHRfbmFtZS5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgc2luZ2xlT3JBcnJheTogXCJbXVwiIGFzIGNvbnN0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdWR0X25hbWU6IF91ZHRfbmFtZSxcbiAgICAgICAgc2luZ2xlT3JBcnJheTogXCJcIiBhcyBjb25zdCxcbiAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIC8vIFVVSURcbiAgICBpZiAodWR0X25hbWUgPT09IFwidXVpZFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgdXVpZCR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuXG4gICAgLy8gSW50ZWdlciB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJpbnQ0XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBpbnRlZ2VyJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcImludDhcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGJpZ0ludGVnZXIke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIFN0cmluZyB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ2YXJjaGFyXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBzdHJpbmcke3NpbmdsZU9yQXJyYXl9YCxcbiAgICAgICAgLi4uKGNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCAmJiB7XG4gICAgICAgICAgbGVuZ3RoOiBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcInRleHRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYHN0cmluZyR7c2luZ2xlT3JBcnJheX1gIH07IC8vIFN0cmluZ1Byb3Agd2l0aG91dCBsZW5ndGhcbiAgICB9XG5cbiAgICAvLyBOdW1iZXJPck51bWVyaWMgdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwibnVtZXJpY1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBgbnVtYmVyT3JOdW1lcmljJHtzaW5nbGVPckFycmF5fWAsXG4gICAgICAgIG51bWJlclR5cGU6IFwibnVtZXJpY1wiLFxuICAgICAgICAuLi4obnVtZXJpY19wcmVjaXNpb24gIT09IG51bGwgJiZcbiAgICAgICAgICBudW1lcmljX3NjYWxlICE9PSBudWxsICYmIHtcbiAgICAgICAgICAgIHByZWNpc2lvbjogbnVtZXJpY19wcmVjaXNpb24sXG4gICAgICAgICAgICBzY2FsZTogbnVtZXJpY19zY2FsZSxcbiAgICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJmbG9hdDRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYG51bWJlck9yTnVtZXJpYyR7c2luZ2xlT3JBcnJheX1gLCBudW1iZXJUeXBlOiBcInJlYWxcIiB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiZmxvYXQ4XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCwgbnVtYmVyVHlwZTogXCJkb3VibGUgcHJlY2lzaW9uXCIgfTtcbiAgICB9XG5cbiAgICAvLyBCb29sZWFuXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImJvb2xcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGJvb2xlYW4ke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIFRpbWVzdGFtcHogdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwidGltZXN0YW1wdHpcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGRhdGUke3NpbmdsZU9yQXJyYXl9YCB9OyAvLyBEYXRlUHJvcCDihpIgdGltZXN0YW1wdHpcbiAgICB9XG5cbiAgICAvLyBKU09OXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImpzb25cIiB8fCB1ZHRfbmFtZSA9PT0gXCJqc29uYlwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImpzb25cIiB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgcmVzb2x2ZSDrtojqsIDriqXtlZwgUG9zdGdyZVNRTCDsu6zrn7wg7YOA7J6FOiAke3VkdF9uYW1lfWApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyID0gbmV3IFBvc3RncmVTUUxTY2hlbWFSZWFkZXJDbGFzcygpO1xuIl0sIm5hbWVzIjpbImFzc2VydCIsImdyb3VwIiwiUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzIiwiZ2V0TWlncmF0aW9uU2V0RnJvbURCIiwiY29tcGFyZURCIiwidGFibGUiLCJkYkNvbHVtbnMiLCJkYkluZGV4ZXMiLCJkYkZvcmVpZ25zIiwicmVhZFRhYmxlIiwiZSIsIkVycm9yIiwibWVzc2FnZSIsImluY2x1ZGVzIiwiY29uc29sZSIsImVycm9yIiwiY29sdW1ucyIsIm1hcCIsImRiQ29sdW1uIiwiZGJDb2xUeXBlIiwicmVzb2x2ZURCQ29sVHlwZSIsIm5hbWUiLCJjb2x1bW5fbmFtZSIsIm51bGxhYmxlIiwiaXNfbnVsbGFibGUiLCJjb2x1bW5fZGVmYXVsdCIsImRlZmF1bHRWYWx1ZSIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwiZW5kc1dpdGgiLCJzbGljZSIsImRlZmF1bHRUbyIsImRiSW5kZXhlc0dyb3VwIiwiZmlsdGVyIiwiZGJJbmRleCIsImlzX3ByaW1hcnkiLCJmaW5kIiwiZGJGb3JlaWduIiwiaW5kZXhfbmFtZSIsImNvbnN0cmFpbnRfbmFtZSIsImluZGV4ZXMiLCJPYmplY3QiLCJrZXlzIiwiaW5kZXhOYW1lIiwiY3VycmVudEluZGV4ZXMiLCJmaXJzdEluZGV4IiwidHlwZSIsImlzX3VuaXF1ZSIsImlkeCIsImZvcmVpZ25zIiwidG8iLCJmb3JlaWduX3RhYmxlX25hbWUiLCJmb3JlaWduX2NvbHVtbl9uYW1lIiwib25VcGRhdGUiLCJtYXBDb25zdHJhaW50QWN0aW9uIiwidXBkYXRlX3J1bGUiLCJvbkRlbGV0ZSIsImRlbGV0ZV9ydWxlIiwiYWN0aW9uIiwiYWN0aW9uTWFwIiwiUkVTVFJJQ1QiLCJDQVNDQURFIiwidGFibGVOYW1lIiwic2VsZWN0IiwiZnJvbSIsIndoZXJlIiwidGFibGVfbmFtZSIsIm9yZGVyQnkiLCJsZW5ndGgiLCJpbmRleGVzUXVlcnkiLCJyYXciLCJyb3dzIiwiZm9yZWlnbnNRdWVyeSIsInVkdF9uYW1lIiwiX3VkdF9uYW1lIiwiY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoIiwibnVtZXJpY19wcmVjaXNpb24iLCJudW1lcmljX3NjYWxlIiwic2luZ2xlT3JBcnJheSIsInN1YnN0cmluZyIsIm51bWJlclR5cGUiLCJwcmVjaXNpb24iLCJzY2FsZSIsIlBvc3RncmVTUUxTY2hlbWFSZWFkZXIiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVksU0FBUztBQUU1QixTQUFTQyxLQUFLLFFBQVEsVUFBVTtBQXFDaEMsTUFBTUM7SUFDSjs7Ozs7R0FLQyxHQUNELE1BQU1DLHNCQUFzQkMsU0FBZSxFQUFFQyxLQUFhLEVBQWdDO1FBQ3hGLElBQUlDLFdBQXVCQyxXQUFzQkM7UUFDakQsSUFBSTtZQUNGLENBQUNGLFdBQVdDLFdBQVdDLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQ0MsU0FBUyxDQUFDTCxXQUFXQztRQUN2RSxFQUFFLE9BQU9LLEdBQVk7WUFDbkIsSUFBSUEsYUFBYUMsU0FBU0QsRUFBRUUsT0FBTyxDQUFDQyxRQUFRLENBQUMsb0JBQW9CO2dCQUMv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
347
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGdyb3VwIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHtcbiAgTWlncmF0aW9uQ29sdW1uLFxuICBNaWdyYXRpb25Gb3JlaWduLFxuICBNaWdyYXRpb25JbmRleCxcbiAgTWlncmF0aW9uU2V0LFxuICBSZWxhdGlvbk9uLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgUGdDb2x1bW4gPSB7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGRhdGFfdHlwZTogc3RyaW5nO1xuICB1ZHRfbmFtZTogc3RyaW5nO1xuICBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGg6IG51bWJlciB8IG51bGw7XG4gIG51bWVyaWNfcHJlY2lzaW9uOiBudW1iZXIgfCBudWxsO1xuICBudW1lcmljX3NjYWxlOiBudW1iZXIgfCBudWxsO1xuICBpc19udWxsYWJsZTogc3RyaW5nO1xuICBjb2x1bW5fZGVmYXVsdDogc3RyaW5nIHwgbnVsbDtcbiAgaXNfZ2VuZXJhdGVkOiBzdHJpbmc7IC8vICdzJyA9IFNUT1JFRCwgJ3YnID0gVklSVFVBTCwgJycgPSBub25lXG4gIGdlbmVyYXRpb25fZXhwcmVzc2lvbjogc3RyaW5nIHwgbnVsbDtcbn07XG5cbnR5cGUgUGdJbmRleCA9IHtcbiAgaW5kZXhfbmFtZTogc3RyaW5nO1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBpc191bmlxdWU6IGJvb2xlYW47XG4gIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gIGluZGV4X3R5cGU6IHN0cmluZztcbiAgbnVsbHNfZmlyc3Q6IGJvb2xlYW47XG4gIHNvcnRfb3JkZXI6IFwiQVNDXCIgfCBcIkRFU0NcIjtcbiAgbnVsbHNfbm90X2Rpc3RpbmN0OiBib29sZWFuO1xufTtcblxudHlwZSBQZ0ZvcmVpZ24gPSB7XG4gIGNvbnN0cmFpbnRfbmFtZTogc3RyaW5nO1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBmb3JlaWduX3RhYmxlX25hbWU6IHN0cmluZztcbiAgZm9yZWlnbl9jb2x1bW5fbmFtZTogc3RyaW5nO1xuICB1cGRhdGVfcnVsZTogc3RyaW5nO1xuICBkZWxldGVfcnVsZTogc3RyaW5nO1xufTtcblxuY2xhc3MgUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzIHtcbiAgLyoqXG4gICAqIERC7JeQ7IScIO2FjOydtOu4lCDsoJXrs7Trpbwg7J297Ja07IScIE1pZ3JhdGlvblNldOydhCDrp4zrk6TslrTsmLXri4jri6QuXG4gICAqIEBwYXJhbSBjb21wYXJlREIgS25leCDsnbjsiqTthLTsiqRcbiAgICogQHBhcmFtIHRhYmxlIO2FjOydtOu4lCDsnbTrpoRcbiAgICogQHJldHVybnMgTWlncmF0aW9uU2V0IOqwneyytFxuICAgKi9cbiAgYXN5bmMgZ2V0TWlncmF0aW9uU2V0RnJvbURCKGNvbXBhcmVEQjogS25leCwgdGFibGU6IHN0cmluZyk6IFByb21pc2U8TWlncmF0aW9uU2V0IHwgbnVsbD4ge1xuICAgIGxldCBkYkNvbHVtbnM6IFBnQ29sdW1uW10sIGRiSW5kZXhlczogUGdJbmRleFtdLCBkYkZvcmVpZ25zOiBQZ0ZvcmVpZ25bXTtcbiAgICB0cnkge1xuICAgICAgW2RiQ29sdW1ucywgZGJJbmRleGVzLCBkYkZvcmVpZ25zXSA9IGF3YWl0IHRoaXMucmVhZFRhYmxlKGNvbXBhcmVEQiwgdGFibGUpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKFwiVGFibGUgbm90IGZvdW5kXCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHZlY3RvciDsu6zrn7zsnZggZGltZW5zaW9ucyDsobDtmoxcbiAgICBjb25zdCB2ZWN0b3JEaW1lbnNpb25zID0gYXdhaXQgdGhpcy5nZXRWZWN0b3JEaW1lbnNpb25zKGNvbXBhcmVEQiwgdGFibGUpO1xuXG4gICAgY29uc3QgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBkYkNvbHVtbnMubWFwKChkYkNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgZGJDb2xUeXBlID0gdGhpcy5yZXNvbHZlREJDb2xUeXBlKGRiQ29sdW1uKTtcblxuICAgICAgLy8gdmVjdG9yIO2DgOyeheyduCDqsr3smrAgZGltZW5zaW9ucyDshKTsoJVcbiAgICAgIGlmIChkYkNvbFR5cGUudHlwZSA9PT0gXCJ2ZWN0b3JcIikge1xuICAgICAgICBkYkNvbFR5cGUuZGltZW5zaW9ucyA9IHZlY3RvckRpbWVuc2lvbnNbZGJDb2x1bW4uY29sdW1uX25hbWVdID8/IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGRiQ29sdW1uLmNvbHVtbl9uYW1lLFxuICAgICAgICBudWxsYWJsZTogZGJDb2x1bW4uaXNfbnVsbGFibGUgPT09IFwiWUVTXCIsXG4gICAgICAgIC4uLmRiQ29sVHlwZSxcbiAgICAgICAgLy8gR2VuZXJhdGVkIENvbHVtbiDsspjrpqxcbiAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICBpZiAoZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInNcIiB8fCBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwidlwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiID8gXCJTVE9SRURcIiA6IFwiVklSVFVBTFwiLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGRiQ29sdW1uLmdlbmVyYXRpb25fZXhwcmVzc2lvbiA/PyBcIlwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KSgpLFxuICAgICAgICAvLyBEZWZhdWx0IOqwkiDsspjrpqwgKEdlbmVyYXRlZCBDb2x1bW7snbQg7JWE64uMIOqyveyasOunjClcbiAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICAvLyBHZW5lcmF0ZWQgQ29sdW1u7J2AIGRlZmF1bHQg6rCS7J20IOyXhuydjFxuICAgICAgICAgIGlmIChkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiIHx8IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJ2XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGJDb2x1bW4uY29sdW1uX2RlZmF1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFBvc3RncmVTUUwgZGVmYXVsdCDqsJIg7KCV66asIChuZXh0dmFsLCBDVVJSRU5UX1RJTUVTVEFNUCDrk7EpXG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gZGJDb2x1bW4uY29sdW1uX2RlZmF1bHQ7XG5cbiAgICAgICAgICAgIC8vIG5leHR2YWwg7KCc6rGwIChTRVJJQUwg7YOA7J6FKVxuICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZS5zdGFydHNXaXRoKFwibmV4dHZhbChcIikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDtg4DsnoUg7LqQ7Iqk7YyFIOygnOqxsCAo7JiIOiAnMSc6OmludGVnZXIg4oaSIDEpXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUucmVwbGFjZSgvOjpbXFx3XFxzXSskL2csIFwiXCIpO1xuXG4gICAgICAgICAgICAvLyDrlLDsmLTtkZzqsIAgc2luZ2xlIHF1b3Rl7J24IOqyveyasCBkb3VibGUgcXVvdGXroZwg67OA7ZmYXG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpICYmIGRlZmF1bHRWYWx1ZS5lbmRzV2l0aChcIidcIikpIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlLnJlcGxhY2VBbGwoXCInXCIsICdcIicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkZWZhdWx0VG86IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSkoKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBQUklNQVJZIEtFWeyZgCBmb3JlaWduIGtleeyaqSDsnbjrjbHsiqQg7KCc7Jm4XG4gICAgY29uc3QgZGJJbmRleGVzR3JvdXAgPSBncm91cChcbiAgICAgIGRiSW5kZXhlcy5maWx0ZXIoXG4gICAgICAgIChkYkluZGV4KSA9PlxuICAgICAgICAgICFkYkluZGV4LmlzX3ByaW1hcnkgJiZcbiAgICAgICAgICAhZGJGb3JlaWducy5maW5kKChkYkZvcmVpZ24pID0+IGRiSW5kZXguaW5kZXhfbmFtZS5pbmNsdWRlcyhkYkZvcmVpZ24uY29uc3RyYWludF9uYW1lKSksXG4gICAgICApLFxuICAgICAgKGRiSW5kZXgpID0+IGRiSW5kZXguaW5kZXhfbmFtZSxcbiAgICApO1xuXG4gICAgLy8gaW5kZXhlcyDsspjrpqxcbiAgICBjb25zdCBpbmRleGVzOiBNaWdyYXRpb25JbmRleFtdID0gT2JqZWN0LmtleXMoZGJJbmRleGVzR3JvdXApLm1hcCgoaW5kZXhOYW1lKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXhlcyA9IGRiSW5kZXhlc0dyb3VwW2luZGV4TmFtZV07XG4gICAgICBhc3NlcnQoY3VycmVudEluZGV4ZXMpO1xuXG4gICAgICBjb25zdCBmaXJzdEluZGV4ID0gY3VycmVudEluZGV4ZXNbMF07XG4gICAgICBjb25zdCB0eXBlID0gZmlyc3RJbmRleC5pc191bmlxdWUgPyBcInVuaXF1ZVwiIDogXCJpbmRleFwiO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBuYW1lOiBpbmRleE5hbWUsXG4gICAgICAgIGNvbHVtbnM6IGN1cnJlbnRJbmRleGVzLm1hcCgoaWR4KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGlkeC5jb2x1bW5fbmFtZSxcbiAgICAgICAgICBudWxsc0ZpcnN0OiBpZHgubnVsbHNfZmlyc3QsXG4gICAgICAgICAgc29ydE9yZGVyOiBpZHguc29ydF9vcmRlcixcbiAgICAgICAgfSkpLFxuICAgICAgICBudWxsc05vdERpc3RpbmN0OiBmaXJzdEluZGV4Lm51bGxzX25vdF9kaXN0aW5jdCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBmb3JlaWducyDsspjrpqxcbiAgICBjb25zdCBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdID0gZGJGb3JlaWducy5tYXAoKGRiRm9yZWlnbikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uczogW2RiRm9yZWlnbi5jb2x1bW5fbmFtZV0sXG4gICAgICAgIHRvOiBgJHtkYkZvcmVpZ24uZm9yZWlnbl90YWJsZV9uYW1lfS4ke2RiRm9yZWlnbi5mb3JlaWduX2NvbHVtbl9uYW1lfWAsXG4gICAgICAgIG9uVXBkYXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24oZGJGb3JlaWduLnVwZGF0ZV9ydWxlKSxcbiAgICAgICAgb25EZWxldGU6IHRoaXMubWFwQ29uc3RyYWludEFjdGlvbihkYkZvcmVpZ24uZGVsZXRlX3J1bGUpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICB0YWJsZSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBpbmRleGVzLFxuICAgICAgZm9yZWlnbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0Z3JlU1FM7J2YIGNvbnN0cmFpbnQgYWN0aW9u7J2EIEtuZXgg7ZiV7Iud7Jy866GcIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBtYXBDb25zdHJhaW50QWN0aW9uKGFjdGlvbjogc3RyaW5nKTogUmVsYXRpb25PbiB7XG4gICAgY29uc3QgYWN0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBSZWxhdGlvbk9uPiA9IHtcbiAgICAgIFwiTk8gQUNUSU9OXCI6IFwiTk8gQUNUSU9OXCIsXG4gICAgICBSRVNUUklDVDogXCJSRVNUUklDVFwiLFxuICAgICAgQ0FTQ0FERTogXCJDQVNDQURFXCIsXG4gICAgICBcIlNFVCBOVUxMXCI6IFwiU0VUIE5VTExcIixcbiAgICAgIFwiU0VUIERFRkFVTFRcIjogXCJTRVQgREVGQVVMVFwiLFxuICAgIH07XG4gICAgcmV0dXJuIGFjdGlvbk1hcFthY3Rpb25dID8/IFwiTk8gQUNUSU9OXCI7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IO2FjOydtOu4lCDsnb3slrTshJwgY29scywgaW5kZXhlcywgZm9yZWlnbnMg67CY7ZmYXG4gICAqL1xuICBhc3luYyByZWFkVGFibGUoXG4gICAgY29tcGFyZURCOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFtQZ0NvbHVtbltdLCBQZ0luZGV4W10sIFBnRm9yZWlnbltdXT4ge1xuICAgIC8vIENvbHVtbnMg7KGw7ZqMIChHZW5lcmF0ZWQgQ29sdW1uIOygleuztCDtj6ztlagpXG4gICAgY29uc3QgY29sdW1uc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIGMuY29sdW1uX25hbWUsXG4gICAgICAgIGMuZGF0YV90eXBlLFxuICAgICAgICBjLnVkdF9uYW1lLFxuICAgICAgICBjLmNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCxcbiAgICAgICAgYy5udW1lcmljX3ByZWNpc2lvbixcbiAgICAgICAgYy5udW1lcmljX3NjYWxlLFxuICAgICAgICBjLmlzX251bGxhYmxlLFxuICAgICAgICBjLmNvbHVtbl9kZWZhdWx0LFxuICAgICAgICBDT0FMRVNDRShhLmF0dGdlbmVyYXRlZCwgJycpIGFzIGlzX2dlbmVyYXRlZCxcbiAgICAgICAgYy5nZW5lcmF0aW9uX2V4cHJlc3Npb25cbiAgICAgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgY1xuICAgICAgTEVGVCBKT0lOIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0bmFtZSA9IGMuY29sdW1uX25hbWVcbiAgICAgICAgQU5EIGEuYXR0cmVsaWQgPSAoXG4gICAgICAgICAgU0VMRUNUIG9pZCBGUk9NIHBnX2NsYXNzIFdIRVJFIHJlbG5hbWUgPSBjLnRhYmxlX25hbWVcbiAgICAgICAgICBBTkQgcmVsbmFtZXNwYWNlID0gKFNFTEVDVCBvaWQgRlJPTSBwZ19uYW1lc3BhY2UgV0hFUkUgbnNwbmFtZSA9IGMudGFibGVfc2NoZW1hKVxuICAgICAgICApXG4gICAgICBXSEVSRSBjLnRhYmxlX25hbWUgPSA/XG4gICAgICAgIEFORCBjLnRhYmxlX3NjaGVtYSA9ICdwdWJsaWMnXG4gICAgICBPUkRFUiBCWSBjLm9yZGluYWxfcG9zaXRpb25cbiAgICBgO1xuICAgIGNvbnN0IGNvbHVtbnMgPSAoYXdhaXQgY29tcGFyZURCLnJhdyhjb2x1bW5zUXVlcnksIFt0YWJsZU5hbWVdKSkucm93cyBhcyBQZ0NvbHVtbltdO1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBub3QgZm91bmQ6ICR7dGFibGVOYW1lfWApO1xuICAgIH1cblxuICAgIC8vIEluZGV4ZXMg7KGw7ZqMXG4gICAgY29uc3QgaW5kZXhlc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIGkucmVsbmFtZSBhcyBpbmRleF9uYW1lLFxuICAgICAgICBhLmF0dG5hbWUgYXMgY29sdW1uX25hbWUsXG4gICAgICAgIGl4LmluZGlzdW5pcXVlIGFzIGlzX3VuaXF1ZSxcbiAgICAgICAgaXguaW5kaXNwcmltYXJ5IGFzIGlzX3ByaW1hcnksXG4gICAgICAgIGFtLmFtbmFtZSBhcyBpbmRleF90eXBlLFxuICAgICAgICAtLSBOVUxMUyBGSVJTVC9MQVNUIO2ZleyduCAo67mE7Yq4IOyXsOyCsClcbiAgICAgICAgKG9wdCAmIDIpID0gMiBBUyBudWxsc19maXJzdCxcbiAgICAgICAgLS0gQVNDL0RFU0Mg7ZmV7J24XG4gICAgICAgIENBU0UgXG4gICAgICAgICAgICBXSEVOIChvcHQgJiAxKSA9IDEgVEhFTiAnREVTQydcbiAgICAgICAgICAgIEVMU0UgJ0FTQydcbiAgICAgICAgRU5EIEFTIHNvcnRfb3JkZXIsXG4gICAgICAgIGl4LmluZG51bGxzbm90ZGlzdGluY3QgQVMgbnVsbHNfbm90X2Rpc3RpbmN0XG4gICAgICBGUk9NIHBnX2NsYXNzIHRcbiAgICAgIEpPSU4gcGdfaW5kZXggaXggT04gdC5vaWQgPSBpeC5pbmRyZWxpZFxuICAgICAgSk9JTiBwZ19jbGFzcyBpIE9OIGkub2lkID0gaXguaW5kZXhyZWxpZFxuICAgICAgSk9JTiBwZ19hbSBhbSBPTiBpLnJlbGFtID0gYW0ub2lkXG4gICAgICAgIEpPSU4gTEFURVJBTCB1bm5lc3QoaXguaW5ka2V5LCBpeC5pbmRvcHRpb24pXG4gICAgICAgICAgICBXSVRIIE9SRElOQUxJVFkgQVMgdShhdHRudW0sIG9wdCwgb3JkKSBPTiB0cnVlXG4gICAgICAgIC0tIHVubmVzdOyXkOyEnCDrgpjsmKggYXR0bnVt7Jy866GcIOyngeygkSDsobDsnbhcbiAgICAgIEpPSU4gcGdfYXR0cmlidXRlIGEgT04gYS5hdHRyZWxpZCA9IHQub2lkIEFORCBhLmF0dG51bSA9IHUuYXR0bnVtXG4gICAgICBXSEVSRSB0LnJlbG5hbWUgPSA/XG4gICAgICAgIEFORCBhLmF0dG51bSA9IEFOWShpeC5pbmRrZXkpXG4gICAgICBPUkRFUiBCWSBpLnJlbG5hbWUsIGFycmF5X3Bvc2l0aW9uKGl4LmluZGtleSwgYS5hdHRudW0pXG4gICAgYDtcbiAgICBjb25zdCBpbmRleGVzID0gKGF3YWl0IGNvbXBhcmVEQi5yYXcoaW5kZXhlc1F1ZXJ5LCBbdGFibGVOYW1lXSkpLnJvd3M7XG5cbiAgICAvLyBGb3JlaWduIEtleXMg7KGw7ZqMXG4gICAgY29uc3QgZm9yZWlnbnNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICB0Yy5jb25zdHJhaW50X25hbWUsXG4gICAgICAgIGtjdS5jb2x1bW5fbmFtZSxcbiAgICAgICAgY2N1LnRhYmxlX25hbWUgQVMgZm9yZWlnbl90YWJsZV9uYW1lLFxuICAgICAgICBjY3UuY29sdW1uX25hbWUgQVMgZm9yZWlnbl9jb2x1bW5fbmFtZSxcbiAgICAgICAgcmMudXBkYXRlX3J1bGUsXG4gICAgICAgIHJjLmRlbGV0ZV9ydWxlXG4gICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZV9jb25zdHJhaW50cyBBUyB0Y1xuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEua2V5X2NvbHVtbl91c2FnZSBBUyBrY3VcbiAgICAgICAgT04gdGMuY29uc3RyYWludF9uYW1lID0ga2N1LmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgdGMudGFibGVfc2NoZW1hID0ga2N1LnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEuY29uc3RyYWludF9jb2x1bW5fdXNhZ2UgQVMgY2N1XG4gICAgICAgIE9OIGNjdS5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIGNjdS50YWJsZV9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLnJlZmVyZW50aWFsX2NvbnN0cmFpbnRzIEFTIHJjXG4gICAgICAgIE9OIHJjLmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgcmMuY29uc3RyYWludF9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIFdIRVJFIHRjLmNvbnN0cmFpbnRfdHlwZSA9ICdGT1JFSUdOIEtFWSdcbiAgICAgICAgQU5EIHRjLnRhYmxlX25hbWUgPSA/XG4gICAgYDtcbiAgICBjb25zdCBmb3JlaWducyA9IChhd2FpdCBjb21wYXJlREIucmF3KGZvcmVpZ25zUXVlcnksIFt0YWJsZU5hbWVdKSkucm93cztcblxuICAgIHJldHVybiBbY29sdW1ucywgaW5kZXhlcywgZm9yZWlnbnNdO1xuICB9XG5cbiAgLyoqXG4gICAqIHZlY3RvciDsu6zrn7zsnZggZGltZW5zaW9uc+ulvCDsobDtmoztlanri4jri6QuXG4gICAqIHBnX2F0dHJpYnV0ZeydmCBhdHR0eXBtb2Tsl5DshJwg7LCo7JuQIOyImOulvCDstpTstpztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFZlY3RvckRpbWVuc2lvbnMoXG4gICAgY29tcGFyZURCOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICBhLmF0dG5hbWUgYXMgY29sdW1uX25hbWUsXG4gICAgICAgIGEuYXR0dHlwbW9kIGFzIGRpbWVuc2lvbnNcbiAgICAgIEZST00gcGdfYXR0cmlidXRlIGFcbiAgICAgIEpPSU4gcGdfY2xhc3MgYyBPTiBhLmF0dHJlbGlkID0gYy5vaWRcbiAgICAgIEpPSU4gcGdfdHlwZSB0IE9OIGEuYXR0dHlwaWQgPSB0Lm9pZFxuICAgICAgV0hFUkUgYy5yZWxuYW1lID0gP1xuICAgICAgICBBTkQgdC50eXBuYW1lID0gJ3ZlY3RvcidcbiAgICAgICAgQU5EIGEuYXR0bnVtID4gMFxuICAgIGA7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29tcGFyZURCLnJhdyhxdWVyeSwgW3RhYmxlTmFtZV0pO1xuICAgIGNvbnN0IGRpbWVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXN1bHQucm93cykge1xuICAgICAgLy8gYXR0dHlwbW9k7JeQ7IScIOyLpOygnCBkaW1lbnNpb25zIOqwkiDstpTstpxcbiAgICAgIGRpbWVuc2lvbnNbcm93LmNvbHVtbl9uYW1lXSA9IHJvdy5kaW1lbnNpb25zID4gMCA/IHJvdy5kaW1lbnNpb25zIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIGRpbWVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogUG9zdGdyZVNRTCDsu6zrn7wg7YOA7J6F7J2EIOu2hOyEne2VmOyXrCBNaWdyYXRpb25Db2x1bW4g6rCd7LK066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHJlc29sdmVEQkNvbFR5cGUoXG4gICAgZGJDb2x1bW46IFBnQ29sdW1uLFxuICApOiBQaWNrPFxuICAgIE1pZ3JhdGlvbkNvbHVtbixcbiAgICBcInR5cGVcIiB8IFwibGVuZ3RoXCIgfCBcInByZWNpc2lvblwiIHwgXCJzY2FsZVwiIHwgXCJudW1iZXJUeXBlXCIgfCBcImRpbWVuc2lvbnNcIlxuICA+IHtcbiAgICBjb25zdCB7XG4gICAgICB1ZHRfbmFtZTogX3VkdF9uYW1lLFxuICAgICAgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLFxuICAgICAgbnVtZXJpY19wcmVjaXNpb24sXG4gICAgICBudW1lcmljX3NjYWxlLFxuICAgIH0gPSBkYkNvbHVtbjtcblxuICAgIGNvbnN0IHsgdWR0X25hbWUsIHNpbmdsZU9yQXJyYXkgfSA9ICgoKSA9PiB7XG4gICAgICBpZiAoX3VkdF9uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdWR0X25hbWU6IF91ZHRfbmFtZS5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgc2luZ2xlT3JBcnJheTogXCJbXVwiIGFzIGNvbnN0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdWR0X25hbWU6IF91ZHRfbmFtZSxcbiAgICAgICAgc2luZ2xlT3JBcnJheTogXCJcIiBhcyBjb25zdCxcbiAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIC8vIFVVSURcbiAgICBpZiAodWR0X25hbWUgPT09IFwidXVpZFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgdXVpZCR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuXG4gICAgLy8gSW50ZWdlciB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJpbnQ0XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBpbnRlZ2VyJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcImludDhcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGJpZ0ludGVnZXIke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIFN0cmluZyB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ2YXJjaGFyXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBzdHJpbmcke3NpbmdsZU9yQXJyYXl9YCxcbiAgICAgICAgLi4uKGNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCAmJiB7XG4gICAgICAgICAgbGVuZ3RoOiBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcInRleHRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYHN0cmluZyR7c2luZ2xlT3JBcnJheX1gIH07IC8vIFN0cmluZ1Byb3Agd2l0aG91dCBsZW5ndGhcbiAgICB9XG5cbiAgICAvLyBOdW1iZXJPck51bWVyaWMgdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwibnVtZXJpY1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBgbnVtYmVyT3JOdW1lcmljJHtzaW5nbGVPckFycmF5fWAsXG4gICAgICAgIG51bWJlclR5cGU6IFwibnVtZXJpY1wiLFxuICAgICAgICAuLi4obnVtZXJpY19wcmVjaXNpb24gIT09IG51bGwgJiZcbiAgICAgICAgICBudW1lcmljX3NjYWxlICE9PSBudWxsICYmIHtcbiAgICAgICAgICAgIHByZWNpc2lvbjogbnVtZXJpY19wcmVjaXNpb24sXG4gICAgICAgICAgICBzY2FsZTogbnVtZXJpY19zY2FsZSxcbiAgICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJmbG9hdDRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYG51bWJlck9yTnVtZXJpYyR7c2luZ2xlT3JBcnJheX1gLCBudW1iZXJUeXBlOiBcInJlYWxcIiB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiZmxvYXQ4XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCwgbnVtYmVyVHlwZTogXCJkb3VibGUgcHJlY2lzaW9uXCIgfTtcbiAgICB9XG5cbiAgICAvLyBCb29sZWFuXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImJvb2xcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGJvb2xlYW4ke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIFRpbWVzdGFtcHogdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwidGltZXN0YW1wdHpcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGRhdGUke3NpbmdsZU9yQXJyYXl9YCB9OyAvLyBEYXRlUHJvcCDihpIgdGltZXN0YW1wdHpcbiAgICB9XG5cbiAgICAvLyBKU09OXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImpzb25cIiB8fCB1ZHRfbmFtZSA9PT0gXCJqc29uYlwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImpzb25cIiB9O1xuICAgIH1cblxuICAgIC8vIFZlY3RvciAocGd2ZWN0b3IpXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInZlY3RvclwiKSB7XG4gICAgICAvLyB2ZWN0b3Ig7YOA7J6F7J2YIOywqOybkCDsiJjripQgY29sdW1uX2RlZmF1bHTrgpgg67OE64+EIOy/vOumrOuhnCDtmZXsnbjtlbTslbwg7ZWoXG4gICAgICAvLyDtmITsnqzripQg6riw67O46rCSIDDsnLzroZwg7ISk7KCVICjsi6TsoJwgZGltZW5zaW9uc+uKlCBnZXRNaWdyYXRpb25TZXRGcm9tRELsl5DshJwg67OE64+EIOy/vOumrOuhnCDtmZXsnbgpXG4gICAgICByZXR1cm4geyB0eXBlOiBgdmVjdG9yJHtzaW5nbGVPckFycmF5fWAsIGRpbWVuc2lvbnM6IDAgfTtcbiAgICB9XG5cbiAgICAvLyB0c3ZlY3RvciAoUG9zdGdyZVNRTCDsoITrrLgg6rKA7IOJ7JqpIO2DgOyehSlcbiAgICBpZiAodWR0X25hbWUgPT09IFwidHN2ZWN0b3JcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0c3ZlY3RvclwiIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGByZXNvbHZlIOu2iOqwgOuKpe2VnCBQb3N0Z3JlU1FMIOy7rOufvCDtg4DsnoU6ICR7dWR0X25hbWV9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgPSBuZXcgUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzKCk7XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiZ3JvdXAiLCJQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyQ2xhc3MiLCJnZXRNaWdyYXRpb25TZXRGcm9tREIiLCJjb21wYXJlREIiLCJ0YWJsZSIsImRiQ29sdW1ucyIsImRiSW5kZXhlcyIsImRiRm9yZWlnbnMiLCJyZWFkVGFibGUiLCJlIiwiRXJyb3IiLCJtZXNzYWdlIiwiaW5jbHVkZXMiLCJjb25zb2xlIiwiZXJyb3IiLCJ2ZWN0b3JEaW1lbnNpb25zIiwiZ2V0VmVjdG9yRGltZW5zaW9ucyIsImNvbHVtbnMiLCJtYXAiLCJkYkNvbHVtbiIsImRiQ29sVHlwZSIsInJlc29sdmVEQkNvbFR5cGUiLCJ0eXBlIiwiZGltZW5zaW9ucyIsImNvbHVtbl9uYW1lIiwibmFtZSIsIm51bGxhYmxlIiwiaXNfbnVsbGFibGUiLCJpc19nZW5lcmF0ZWQiLCJnZW5lcmF0ZWQiLCJleHByZXNzaW9uIiwiZ2VuZXJhdGlvbl9leHByZXNzaW9uIiwiY29sdW1uX2RlZmF1bHQiLCJkZWZhdWx0VmFsdWUiLCJzdGFydHNXaXRoIiwicmVwbGFjZSIsImVuZHNXaXRoIiwicmVwbGFjZUFsbCIsImRlZmF1bHRUbyIsImRiSW5kZXhlc0dyb3VwIiwiZmlsdGVyIiwiZGJJbmRleCIsImlzX3ByaW1hcnkiLCJmaW5kIiwiZGJGb3JlaWduIiwiaW5kZXhfbmFtZSIsImNvbnN0cmFpbnRfbmFtZSIsImluZGV4ZXMiLCJPYmplY3QiLCJrZXlzIiwiaW5kZXhOYW1lIiwiY3VycmVudEluZGV4ZXMiLCJmaXJzdEluZGV4IiwiaXNfdW5pcXVlIiwiaWR4IiwibnVsbHNGaXJzdCIsIm51bGxzX2ZpcnN0Iiwic29ydE9yZGVyIiwic29ydF9vcmRlciIsIm51bGxzTm90RGlzdGluY3QiLCJudWxsc19ub3RfZGlzdGluY3QiLCJmb3JlaWducyIsInRvIiwiZm9yZWlnbl90YWJsZV9uYW1lIiwiZm9yZWlnbl9jb2x1bW5fbmFtZSIsIm9uVXBkYXRlIiwibWFwQ29uc3RyYWludEFjdGlvbiIsInVwZGF0ZV9ydWxlIiwib25EZWxldGUiLCJkZWxldGVfcnVsZSIsImFjdGlvbiIsImFjdGlvbk1hcCIsIlJFU1RSSUNUIiwiQ0FTQ0FERSIsInRhYmxlTmFtZSIsImNvbHVtbnNRdWVyeSIsInJhdyIsInJvd3MiLCJsZW5ndGgiLCJpbmRleGVzUXVlcnkiLCJmb3JlaWduc1F1ZXJ5IiwicXVlcnkiLCJyZXN1bHQiLCJyb3ciLCJ1ZHRfbmFtZSIsIl91ZHRfbmFtZSIsImNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCIsIm51bWVyaWNfcHJlY2lzaW9uIiwibnVtZXJpY19zY2FsZSIsInNpbmdsZU9yQXJyYXkiLCJzdWJzdHJpbmciLCJudW1iZXJUeXBlIiwicHJl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
@@ -1 +1 @@
1
- {"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGjF,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,OAAO,EAAE,KAAK,QAAQ,EAAyC,MAAM,iBAAiB,CAAC;AACvF,OAAO,EACL,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAIjB,MAAM,iBAAiB,CAAC;AAEzB,KAAK,UAAU,GAAG;KACf,GAAG,IAAI,QAAQ,GAAG,YAAY,EAAE;CAClC,CAAC;AAEF,qBAAa,MAAM;IACjB,IAAI,EAAE,UAAU,CAAM;IACtB,KAAK,EAAE,WAAW,CAAM;IACxB,MAAM,EAAE,YAAY,CAAM;IAC1B,SAAS,EAAE,OAAO,CAAS;IAE3B;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B3B;;;;;OAKG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAkD/E,+BAA+B,CAC7B,eAAe,EAAE,YAAY,GAC5B,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE;IAc9B,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCrD,aAAa;IAIb,cAAc;IAId,YAAY;IAIlB;;;;;OAKG;IACG,aAAa,CAAC,aAAa,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAmCpF,mBAAmB,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,UAAU;IAOpD,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B9E,uCAAuC,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmBpF,wBAAwB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA2C/D,gBAAgB;IAYtB;;;OAGG;IACG,qBAAqB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAWtD;;;;OAIG;IACG,sBAAsB,CAC1B,WAAW,EAAE;QACX,WAAW,EAAE,iBAAiB,CAAC;KAChC,EAAE,GACF,OAAO,CAAC,MAAM,EAAE,CAAC;IAepB;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,YAAY,CAAC;IAUlD;;;;OAIG;IACG,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YA6B5D,+BAA+B;IAc7C;;;;;;OAMG;IACG,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EACxB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IAepE;;;;;OAKG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;KACtE,GACA,OAAO,CAAC,MAAM,CAAC,GAAG,WAAW,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;IAqCtD,MAAM;IAUN;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC,QAAQ,CAAC;IAIlD;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAIlE;;OAEG;IACG,gBAAgB,CAAC,CAAC,SAAS,WAAW,EAC1C,GAAG,EAAE,CAAC,EACN,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,EACnC,gBAAgB,CAAC,EAAE,eAAe,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC;IAI1B;;OAEG;IACG,cAAc,CAAC,CAAC,SAAS,MAAM,eAAe,EAClD,GAAG,EAAE,CAAC,EACN,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC,WAAW,EAAE,CAAC;IAIzB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtC"}
@@ -2,6 +2,7 @@ import { hot } from "@sonamu-kit/hmr-hook";
2
2
  import assert from "assert";
3
3
  import chalk from "chalk";
4
4
  import { mkdir, readFile, writeFile } from "node:fs/promises";
5
+ import inflection from "inflection";
5
6
  import { minimatch } from "minimatch";
6
7
  import path, { dirname } from "path";
7
8
  import { group, unique } from "radashi";
@@ -249,11 +250,13 @@ export class Syncer {
249
250
  namesRecord: EntityManager.getNamesFromId(entityId)
250
251
  };
251
252
  }
252
- if (modelPath.endsWith("frame.ts")) {
253
- const [, frameName] = modelPath.match(/.+\/(.+)\.frame.js$/) ?? [];
253
+ if (modelPath.endsWith(".frame.ts")) {
254
+ const [, frameName] = modelPath.match(/.+\/(.+)\.frame\.ts$/) ?? [];
254
255
  assert(frameName);
256
+ // frameName을 PascalCase로 변환 (dashboard -> Dashboard)
257
+ const frameId = inflection.camelize(frameName);
255
258
  return {
256
- namesRecord: EntityManager.getNamesFromId(frameName)
259
+ namesRecord: EntityManager.getNamesFromId(frameId)
257
260
  };
258
261
  }
259
262
  throw new Error("not reachable");
@@ -419,4 +422,4 @@ export class Syncer {
419
422
  }
420
423
  }
421
424
 
422
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgbWluaW1hdGNoIH0gZnJvbSBcIm1pbmltYXRjaFwiO1xuaW1wb3J0IHBhdGgsIHsgZGlybmFtZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGFyZUZpbGVzU2FtZSwgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLCByZW5ld0NoZWNrc3VtcyB9IGZyb20gXCIuL2NoZWNrc3VtXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlLCByZW5kZXJUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHksIGRlbEVudGl0eSB9IGZyb20gXCIuL2VudGl0eS1vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlLCBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBMb2FkZWRBcGlzLFxuICB0eXBlIExvYWRlZE1vZGVscyxcbiAgdHlwZSBMb2FkZWRUeXBlcyxcbiAgbG9hZEFwaXMsXG4gIGxvYWRNb2RlbHMsXG4gIGxvYWRUeXBlcyxcbn0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICBpc1N5bmNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOuLpOunjCBzb25hbXUuc2hhcmVkLnRz64qUIOyytO2BrOyErCDruYTqtZAg7JeG7J20IOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVkLnRz64qUIOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0cyk7XG5cbiAgICAvLyDqt7gg64uk7J2M67aA7YSw64qUIOuzgOqyveuQnCDtjIzsnbzsnYQg7LC+7JWE7IScIOuPmeq4sO2ZlCDsnpHsl4XsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IGF3YWl0IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpO1xuICAgIGlmIChjaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQoXCJBbGwgZmlsZXMgYXJlIHN5bmNlZCFcIikpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDrp4zslb0g7Iux7YGsIOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Jy866m0IOq8rOyXrOuyhOumrOq4sCDrlYzrrLjsl5AsXG4gICAgLy8g7Iuc6re464SQ7JeQ64+EIOyeoOyLnCDrsoTti7gg7IiYIOyeiOuKlCDtmZjqsr0g7IaN7JeQ7IScIOyLse2BrOulvCDsi6Ttlontlanri4jri6QuXG4gICAgYXdhaXQgcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOyWmOqwgCDsi7Htgawg7J6R7JeFIOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhjaGFuZ2VkRmlsZXMpO1xuXG4gICAgICAgIC8vIOyLse2BrCDslaHshZjsnbQg64Gd64KY66m0IO2VreyDgSDssrTtgazshKzsnYQg64uk7IucIOqwseyLoO2VqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH0sXG4gICAgICB7IHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsIHdhaXRGb3JVcFRvOiAyMDAwMCB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCDqsJDsp4DtlZwg7YyM7J28IOuzgOqyvSDsgqztla3sl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyjvOyWtOynhCDrs4Dqsr0g7YyM7J2865OkIOykkSDssrTtgazshKwg6rSA66asIOuMgOyDgeyduCDqsoPrk6Trp4wg6rCA7KC464uk6rCAIOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyytO2BrOyErCDtjIzsnbwg7JeF642w7J207Yq464qUIOyXrOq4sOyXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLiDtmLjstpzsnpDqsIAg7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRoIC0g67OA6rK9IO2MjOydvOuTpC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCBcInNyYy9cIiDrmJDripQgXCJkaXN0L1wi66GcIOyLnOyeke2VmOuKlCDsg4HrjIAg6rK966Gc7J6F64uI64ukLiDsmIjsi5w6IFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gICAqL1xuICBhc3luYyBzeW5jRnJvbVdhdGNoZXIoZXZlbnQ6IHN0cmluZywgZGlmZkZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIgJiYgZXZlbnQgIT09IFwidW5saW5rXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDsnbzri6gg67OA6rK965CcIO2MjOydvOqzvCBkZXBlbmRlbnQg7YyM7J2865Ok7J2EIGludmFsaWRhdGUg7ZWp64uI64ukLlxuICAgIC8vIO2VnCDrsogg7J207IOBIGltcG9ydOuQnCDsuZzqtazrk6Tsl5Ag64yA7ZW07ISc66eMIOyLpOygnCDsnpHsl4XsnbQg7J287Ja064Kp64uI64ukLlxuICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzripQgaG90LmludmFsaWRhdGVGaWxl7IucIOy0iOq4sCDsl5Drn6zqsIAg67Cc7IOd7ZWY6riwIOuVjOusuOyXkCBpbnZhbGlkYXRlIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9IChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCkpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gICAgICBpZiAoaW52YWxpZGF0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYPCflIQgSW52YWxpZGF0ZWQ6YCkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZWRQYXRoIG9mIGludmFsaWRhdGVkUGF0aHMpIHtcbiAgICAgICAgICAvLyDrp4zslb0gbW9kZWwudHMg7YyM7J287J20IOuzgOqyvShpbnZhbGlkYXRlKeuQmOyXiOuLpD8g6re465+s66m0IHJlZ2lzdGVyZWRBcGlzIOykkeyXkOyEnCDsnbQg66qo64247JeQIO2VtOuLue2VmOuKlCBhcGnrk6TsnYAg7KeA7JuM7KSY7JqULlxuICAgICAgICAgIC8vIHJlZ2lzdGVyZWRBcGlz64qUIO2GteycvOuhnCDri6Qg64Kg66Ck67KE66a0IOyImCDsl4bsirXri4jri6QuIHJlZ2lzdGVyZWRBcGlz7JeQIOyYrOudvOyYpOuKlCDsuZzqtazrk6TsnYAg7LSI6riwIOuhnOuTnOyLnCDrmJDripQgSE1S7Iuc7JeQ66eMIOuTseuhneuQmOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgICAgICAgLy8g65Sw65287IScIG1vZGVsLnRzIO2MjOydvOydmCDrs4Dqsr3snLzroZwg64uk7J2M67KIIOyDiOuhnOyatCBldmFs7J20IOyYiOyDgeuQmOuKlCDsnbQg7Iuc7KCQ7JeQ7ISc66eMLCDsnbQg66qo64247JeQ7IScIOuCmOyYqCByZWdpc3RlcmVkQXBpc+uTpOydhCDsp4Dsm4zspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgICBjb25zdCByZW1vdmVkQXBpcyA9IHRoaXMucmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhpbnZhbGlkYXRlZFBhdGgpO1xuICAgICAgICAgIGlmIChyZW1vdmVkQXBpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApLFxuICAgICAgICAgICAgICBjaGFsay5ncmF5KGAod2l0aCAke3JlbW92ZWRBcGlzLmxlbmd0aH0gQVBJcylgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNJbkNoZWNrUGF0dGVybkdyb3VwID0gT2JqZWN0LnZhbHVlcyhnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCkpLnNvbWUoXG4gICAgICAocGF0dGVybikgPT4gbWluaW1hdGNoKGRpZmZGaWxlUGF0aCwgcGF0dGVybiksXG4gICAgKTtcblxuICAgIC8vIO2VoCDsnbwoc3luYynsnbQg7J6I7Jy866m0IO2VqeuLiOuLpC5cbiAgICBpZiAoaXNJbkNoZWNrUGF0dGVybkdyb3VwKSB7XG4gICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoW2RpZmZGaWxlUGF0aF0pO1xuICAgIH1cblxuICAgIC8vIOyLse2BrCDsnpHsl4XsnbQg64Gd64KY66m0IOuqqOuToCDrqqjrk4jsnYQg66Gc65Oc7ZWp64uI64ukLlxuICAgIC8vIGhtci1ob29r7JeQIOydmO2VtCBpbnZhbGlkYXRl65CcIOu2gOu2hOuTpOydtCDslYTri4jrnbzrqbQg7LqQ7IucIOq3uOuMgOuhnCDsnKDsp4Dtlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICB0aGlzLnN5bmNVSSgpO1xuICB9XG5cbiAgcmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhcbiAgICBpbnZhbGlkYXRlZFBhdGg6IEFic29sdXRlUGF0aCxcbiAgKTogKHR5cGVvZiByZWdpc3RlcmVkQXBpcylbbnVtYmVyXVtdIHtcbiAgICBpZiAoIWludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiIC8q7IaM7IqkIOy9lOuTnOulvCDri6Tro6jripQg7IOB7Zmp7J2064uIIC50cyDqsr3roZzroZwg67SF64uI64ukLiovKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGludmFsaWRhdGVkUGF0aCk7XG4gICAgY29uc3QgdG9SZW1vdmUgPSByZWdpc3RlcmVkQXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gYCR7ZW50aXR5SWR9TW9kZWxgKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiB0b1JlbW92ZSkge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMuc3BsaWNlKHJlZ2lzdGVyZWRBcGlzLmluZGV4T2YoYXBpKSwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvUmVtb3ZlO1xuICB9XG5cbiAgYXN5bmMgY29weVNoYXJlZFRvVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIC8vIOyngOq4iCDqsIDsoLjqsIDroKTripQg7J20IO2MjOydvOydgCBTb25hbXUg7L2U65Oc67Kg7J207Iqk7J2YIOydvOu2gOyeheuLiOuLpC5cbiAgICAgIC8vIOq3uOufsOuNsCBkaXN0IOyGjSDruYzrk5zrkJwg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnbQg7ZWE7JqU7ZWcIOqyg+ydtCDslYTri4jqs6AsIHNyY+yXkOunjCDsnojripQg7YWN7Iqk7Yq4IO2MjOydvOydtCDtlYTsmpTtlanri4jri6QuXG4gICAgICAvLyDrlLDrnbzshJwgL3NyYy/sl5DshJwg7LC+7Iq164uI64ukLlxuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICAgIGAuLi9zaGFyZWQvJHt0YXJnZXR9LnNoYXJlZC50cy50eHRgLFxuICAgICAgKTtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNQYXRoKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCkpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRyaWVkIHRvIGNvcHkgc29uYW11LnNoYXJlZC50cyB0byB0YXJnZXQgJyR7dGFyZ2V0fScgYnV0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgY2hlY2sgeW91ciBwcm9qZWN0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8g7J206rG0IO2UhOuhnOygne2KuOyXkCAudHMg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWY64qUIOqyg+ydtOuvgOuhnCBzcmPsnZggLnRzIOqyveuhnOuhnCDqsJHri4jri6QuXG4gICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCIuL3NyYy9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkLnRzXCIpO1xuXG4gICAgICAvLyDsoJXrp5Ag7Zi57Iuc64KY7KeA66eMIHRhcmdldCDrlJTroInthqDrpqzripQg7J6I7Ja064+EIHNyYy9zZXJ2aWNlcyDrlJTroInthqDrpqzripQg7JeG7J2EIOyImCDsnojsnLzrr4DroZwg66+466asIOyDneyEse2VtOykjeuLiOuLpC5cbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmRpcm5hbWUoZGVzdFBhdGgpKSkpIHtcbiAgICAgICAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ3JlYXRlZCBkaXJlY3RvcnkgJyR7cGF0aC5kaXJuYW1lKGRlc3RQYXRoKX0nIGJlY2F1c2UgaXQgZGlkIG5vdCBleGlzdC5gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGFyZUZpbGVzU2FtZShzcmNQYXRoLCBkZXN0UGF0aCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZGVzdFBhdGgsIGF3YWl0IHJlYWRGaWxlKHNyY1BhdGgpKTtcblxuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUocGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIGRlc3RQYXRoKSksXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRUeXBlcygpIHtcbiAgICB0aGlzLnR5cGVzID0gYXdhaXQgbG9hZFR5cGVzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZE1vZGVscygpIHtcbiAgICB0aGlzLm1vZGVscyA9IGF3YWl0IGxvYWRNb2RlbHMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkQXBpcygpIHtcbiAgICB0aGlzLmFwaXMgPSBhd2FpdCBsb2FkQXBpcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCDsi7Htgazrpbwg7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICog67OA6rK965CcIO2MjOydvOuTpOydhCDtg4DsnoXrs4TroZwg67aE66WY7ZWY6rOgIOqwgSDtg4DsnoXsl5Ag66ee64qUIOyVoeyFmOydhCDsi6Ttlontlanri4jri6QuXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGhzIC0g67OA6rK965CcIO2MjOydvOuTpOydmCDsoIjrjIAg6rK966GcIOuqqeuhnVxuICAgKiBAcmV0dXJucyBkaWZmVHlwZXMgLSDrs4Dqsr3rkJwg7YyM7J287J2YIO2DgOyehSDrqqnroZ0gKGVudGl0eSwgdHlwZXMsIG1vZGVsIOuTsSlcbiAgICovXG4gIGFzeW5jIGRvU3luY0FjdGlvbnMoZGlmZkZpbGVQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHsgZGlmZlR5cGVzOiBzdHJpbmdbXSB9PiB7XG4gICAgY29uc3QgZGlmZkdyb3VwcyA9IHRoaXMuY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZVBhdGhzKTtcbiAgICBjb25zdCBkaWZmVHlwZXMgPSBPYmplY3Qua2V5cyhkaWZmR3JvdXBzKTtcblxuICAgIC8vIO2KuOumrOqxsDogZW50aXR5LCB0eXBlc1xuICAgIC8vIOyVoeyFmDog7Iqk7YKk66eIIOyDneyEsVxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJlbnRpdHlcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRW50aXR5Q2hhbmdlKGRpZmZHcm91cHMsIGRpZmZUeXBlcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiB0eXBlcywgZW51bXMsIGdlbmVyYXRlZCDrs4Dqsr3si5xcbiAgICAvLyDslaHshZg6IO2MjOydvCDsi7HtgawgdHlwZXMsIGVudW1zLCBnZW5lcmF0ZWRcbiAgICBpZiAoXG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJ0eXBlc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnVuY3Rpb25zXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJnZW5lcmF0ZWRcIilcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogbW9kZWxcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwibW9kZWxcIikgfHwgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnJhbWVcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogY29uZmlnXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImNvbmZpZ1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5hY3Rpb25TeW5jQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpZmZUeXBlcyxcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZXM6IEFic29sdXRlUGF0aFtdKTogRGlmZkdyb3VwcyB7XG4gICAgcmV0dXJuIGdyb3VwKGRpZmZGaWxlcywgKHIpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSByLm1hdGNoKC9cXC4obW9kZWx8dHlwZXN8ZnVuY3Rpb25zfGVudGl0eXxnZW5lcmF0ZWR8ZnJhbWV8Y29uZmlnKVxcLlt0al1zLyk7XG4gICAgICByZXR1cm4gbWF0Y2hlZD8uWzFdID8/IFwidW5rbm93blwiO1xuICAgIH0pIGFzIHVua25vd24gYXMgRGlmZkdyb3VwcztcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUVudGl0eUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzLCBkaWZmVHlwZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUVudGl0eUNoYW5nZVwiLCB7IGRpZmZHcm91cHMsIGRpZmZUeXBlcyB9KTtcblxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAvLyB0eXBlcyDsg53shLEoZW50aXR5IOyDiOuhnCDstpTqsIDrkJwg6rK97JqwKVxuICAgIC8vIHBhcmVudElk6rCAIOyXhuqzoCwgdHlwZXPqsIAg7JeG64qUIOqyveyasOyXkOunjCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChkaWZmR3JvdXBzLmVudGl0eT8uWzBdKTtcblxuICAgIGlmIChlbnRpdHlJZCkge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgLy8g7ZSE66Gc7KCd7Yq47JeQIOyDneyEseuQmOyWtOyVvCDtlZjripQgLnRzIO2MjOydvOydmCDqsr3roZzsnoXri4jri6QuXG4gICAgICBjb25zdCB0eXBlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5mc30vJHtlbnRpdHkubmFtZXMuZnN9LnR5cGVzLnRzYCxcbiAgICAgICk7XG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBleGlzdHModHlwZUZpbGVQYXRoKSkpIHtcbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImluaXRfdHlwZXNcIiwgeyBlbnRpdHlJZCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2NoZW1hcygpO1xuXG4gICAgZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICAgIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQudHNcIikgYXMgQWJzb2x1dGVQYXRoLFxuICAgIF0pO1xuICAgIGRpZmZUeXBlcy5wdXNoKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPEZpbGVUeXBlW10+IHtcbiAgICBjb25zdCB0c1BhdGhzID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmZ1bmN0aW9ucyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzIH0pO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIHR5cGVzL2Z1bmN0aW9ucy9nZW5lcmF0ZWQgY2hhbmdlczogJHt0c1BhdGhzLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzKTtcblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZVwiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgbWVyZ2VkR3JvdXAgPSBbLi4uKGRpZmZHcm91cHMubW9kZWwgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mcmFtZSA/PyBbXSldO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIG1vZGVsL2ZyYW1lIGNoYW5nZXM6ICR7bWVyZ2VkR3JvdXAubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIC8vIGdlbmVyYXRlZF9odHRwLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci50eXBlc+ulvCDslIHri4jri6QuXG4gICAgLy8gc2VydmljZS50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIuYXBpc+ulvCDslIHri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICBjb25zdCBwYXJhbXM6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10gPSBtZXJnZWRHcm91cC5tYXAoKG1vZGVsUGF0aCkgPT4ge1xuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChtb2RlbFBhdGgpO1xuICAgICAgICBhc3NlcnQoZW50aXR5SWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCJmcmFtZS50c1wiKSkge1xuICAgICAgICBjb25zdCBbLCBmcmFtZU5hbWVdID0gbW9kZWxQYXRoLm1hdGNoKC8uK1xcLyguKylcXC5mcmFtZS5qcyQvKSA/PyBbXTtcbiAgICAgICAgYXNzZXJ0KGZyYW1lTmFtZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZnJhbWVOYW1lKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCByZWFjaGFibGVcIik7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2VydmljZXMocGFyYW1zKTtcbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlSHR0cHMoKTtcbiAgfVxuXG4gIC8vIHdlYi8uc29uYW11LmVudiDsl5Ag7ZiE7J6sIOyEpOygleqwkiDsoIDsnqVcbiAgYXN5bmMgYWN0aW9uU3luY0NvbmZpZygpIHtcbiAgICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IFNvbmFtdS5jb25maWcuc2VydmVyLmxpc3RlbiA/PyB7fTtcbiAgICBjb25zdCBjb250ZW50ID0gYEFQSV9IT1NUPSR7aG9zdCA/PyBcImxvY2FsaG9zdFwifVxcbkFQSV9QT1JUPSR7cG9ydCA/PyAzMDAwfWA7XG5cbiAgICBOYWl0ZS50KFwiYWN0aW9uU3luY0NvbmZpZ1wiLCB7IGNvbnRlbnQgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBTb25hbXUuY29uZmlnLnN5bmMudGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcIi5zb25hbXUuZW52XCIpLCBjb250ZW50KTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogc29uYW11LmdlbmVyYXRlZC50c+yZgCBzb25hbXUuZ2VuZXJhdGVkLnNzby50c+ulvCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlU2NoZW1hcygpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcImdlbmVyYXRlZF9zc29cIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICAgIF0pXG4gICAgKVxuICAgICAgLmZsYXQoKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAqLnNlcnZpY2UudHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gcGFyYW1zQXJyYXlcbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyhcbiAgICBwYXJhbXNBcnJheToge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSxcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIE5haXRlLnQoXCJhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzXCIsIHBhcmFtc0FycmF5KTtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHBhcmFtc0FycmF5Lm1hcChhc3luYyAocGFyYW1zKSA9PlxuICAgICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJzZXJ2aWNlXCIsIHBhcmFtcyBhcyBUZW1wbGF0ZU9wdGlvbnNbXCJzZXJ2aWNlXCJdLCB7XG4gICAgICAgICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApXG4gICAgKVxuICAgICAgLmZsYXQoKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUuZ2VuZXJhdGVkLmh0dHDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlSHR0cHMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGg+IHtcbiAgICBjb25zdCBbcmVzXSA9IGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXG4gICAgICBcImdlbmVyYXRlZF9odHRwXCIsXG4gICAgICB7IGVudGl0eUlkOiBcImR1bW15XCIgfSxcbiAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH0sXG4gICAgKTtcbiAgICBhc3NlcnQocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqICoudHlwZXMudHMsICouZnVuY3Rpb25zLnRzLCAqLmdlbmVyYXRlZC50c+ulvCDtg4Dqsp8g65SU66CJ7Yag66as7JeQIOuzteyCrO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIHRzUGF0aHNcbiAgICogQHJldHVybnMg67O17IKs65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHM6IEFic29sdXRlUGF0aFtdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgIGNvbnN0IHsgZGlyOiBhcGlEaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PlxuICAgICAgICAgIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgdHNQYXRocy5tYXAoYXN5bmMgKHJlYWxTcmMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZHN0ID0gcmVhbFNyY1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGAvJHthcGlEaXJ9L2AsIGAvJHt0YXJnZXR9L2ApXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIvYXBwbGljYXRpb24vXCIsIFwiL3NlcnZpY2VzL1wiKTtcbiAgICAgICAgICAgICAgY29uc3QgZGlyID0gZGlybmFtZShkc3QpO1xuICAgICAgICAgICAgICBpZiAoIShhd2FpdCBleGlzdHMoZGlyKSkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShkc3QucmVwbGFjZShgJHtTb25hbXUuYXBwUm9vdFBhdGh9L2AsIFwiXCIpKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQocmVhbFNyYywgZHN0KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRzdDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApXG4gICAgKS5mbGF0KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQoZnJvbVBhdGg6IHN0cmluZywgdG9QYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMoZnJvbVBhdGgpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZEZpbGVDb250ZW50ID0gKGF3YWl0IHJlYWRGaWxlKGZyb21QYXRoKSkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IG5ld0ZpbGVDb250ZW50ID0gKCgpID0+IHtcbiAgICAgIGNvbnN0IG5mYyA9IG9sZEZpbGVDb250ZW50LnJlcGxhY2UoL2Zyb20gXCJzb25hbXVcIi9nLCBgZnJvbSBcIi4vc29uYW11LnNoYXJlZFwiYCk7XG4gICAgICByZXR1cm4gbmZjO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIHdyaXRlRmlsZSh0b1BhdGgsIG5ld0ZpbGVDb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIO2FnO2UjOumvyDtgqTsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIHRlbXBsYXRlS2V5IO2FnO2UjOumvyDtgqRcbiAgICogQHBhcmFtIGVudW1JZCDsl7TqsbDtmJUgSURcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0c0dlbkNvZGUoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICB0ZW1wbGF0ZUtleTogVGVtcGxhdGVLZXksXG4gICAgZW51bUlkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgc3ViUGF0aDogc3RyaW5nOyBmdWxsUGF0aDogc3RyaW5nOyBpc0V4aXN0czogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IGdlblBhdGggfSA9IFRlbXBsYXRlTWFuYWdlci5nZXQodGVtcGxhdGVLZXkpLmdldFRhcmdldEFuZFBhdGgoXG4gICAgICBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgIGVudW1JZCxcbiAgICApO1xuXG4gICAgY29uc3Qgc3ViUGF0aCA9IHBhdGguam9pbih0YXJnZXQsIGdlblBhdGgpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgc3ViUGF0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1YlBhdGgsXG4gICAgICBmdWxsUGF0aCxcbiAgICAgIGlzRXhpc3RzOiBhd2FpdCBleGlzdHMoZnVsbFBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDsl7TqsbDtmJXsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIGVudW1zIOyXtOqxsO2YlSDroIjsnbTruJRcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0cyhcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGVudW1zOiB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4+PjtcbiAgICB9LFxuICApOiBQcm9taXNlPFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPj4ge1xuICAgIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBUZW1wbGF0ZUtleS5vcHRpb25zO1xuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG4gICAgY29uc3QgZW51bXNLZXlzID0gT2JqZWN0LmtleXMoZW51bXMpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gbmFtZXMuY29uc3RhbnQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHJlZHVjZUFzeW5jKFxuICAgICAga2V5cyxcbiAgICAgIGFzeW5jIChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCB0cGwgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChcInZpZXdfZW51bXNcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyhlbnVtc0tleXMsIGFzeW5jIChjb21wb25lbnRJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzLCBjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHtjb21wb25lbnRJZH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQucmVwbGFjZShcIjp0YXJnZXRcIiwgdCksIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+LFxuICAgICk7XG4gIH1cblxuICBzeW5jVUkoKSB7XG4gICAgY29uc3QgdWlQb3J0ID0gU29uYW11LmNvbmZpZy51aT8ucG9ydCA/PyA1NzAwMDtcblxuICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgIGZldGNoKGBodHRwOi8vMTI3LjAuMC4xOiR7dWlQb3J0fS9hcGkvcmVsb2FkYCwge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB9KS5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coY2hhbGsuZGltKGBGYWlsZWQgdG8gcmVsb2FkIFNvbmFtdSBVSTogJHtlLm1lc3NhZ2V9YCkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRpdHkoZm9ybTogVGVtcGxhdGVPcHRpb25zW1wiZW50aXR5XCJdKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUVudGl0eShmb3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGRlbEVudGl0eShlbnRpdHlJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRlbFBhdGhzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGRlbEVudGl0eShlbnRpdHlJZCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlPFQgZXh0ZW5kcyBUZW1wbGF0ZUtleT4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICAgIF9nZW5lcmF0ZU9wdGlvbnM/OiBHZW5lcmF0ZU9wdGlvbnMsXG4gICk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucywgX2dlbmVyYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZTxUIGV4dGVuZHMga2V5b2YgVGVtcGxhdGVPcHRpb25zPihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICk6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICAgIHJldHVybiBhd2FpdCByZW5kZXJUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImhvdCIsImFzc2VydCIsImNoYWxrIiwibWtkaXIiLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsIm1pbmltYXRjaCIsInBhdGgiLCJkaXJuYW1lIiwiZ3JvdXAiLCJ1bmlxdWUiLCJyZWdpc3RlcmVkQXBpcyIsIlNvbmFtdSIsIkVudGl0eU1hbmFnZXIiLCJOYWl0ZSIsIlRlbXBsYXRlTWFuYWdlciIsIlRlbXBsYXRlS2V5IiwibWFwQXN5bmMiLCJyZWR1Y2VBc3luYyIsImNlbnRlclRleHQiLCJpc1Rlc3QiLCJleGlzdHMiLCJydW5XaXRoR3JhY2VmdWxTaHV0ZG93biIsImFyZUZpbGVzU2FtZSIsImZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcyIsInJlbmV3Q2hlY2tzdW1zIiwiZ2VuZXJhdGVUZW1wbGF0ZSIsInJlbmRlclRlbXBsYXRlIiwiY3JlYXRlRW50aXR5IiwiZGVsRW50aXR5IiwiZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCIsImxvYWRBcGlzIiwibG9hZE1vZGVscyIsImxvYWRUeXBlcyIsIlN5bmNlciIsImFwaXMiLCJ0eXBlcyIsIm1vZGVscyIsImlzU3luY2luZyIsInN5bmMiLCJ0YXJnZXRzIiwiY29uZmlnIiwiY29weVNoYXJlZFRvVGFyZ2V0cyIsImNoYW5nZWRGaWxlcyIsImxlbmd0aCIsImNvbnNvbGUiLCJsb2ciLCJibGFjayIsImJnR3JlZW4iLCJkb1N5bmNBY3Rpb25zIiwid2hlblRoaXNIYXBwZW5zIiwid2FpdEZvclVwVG8iLCJzeW5jRnJvbVdhdGNoZXIiLCJldmVudCIsImRpZmZGaWxlUGF0aCIsImludmFsaWRhdGVkUGF0aHMiLCJpbnZhbGlkYXRlRmlsZSIsImJvbGQiLCJpbnZhbGlkYXRlZFBhdGgiLCJyZW1vdmVkQXBpcyIsInJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMiLCJibHVlIiwicmVsYXRpdmUiLCJhcGlSb290UGF0aCIsImdyYXkiLCJpc0luQ2hlY2tQYXR0ZXJuR3JvdXAiLCJPYmplY3QiLCJ2YWx1ZXMiLCJzb21lIiwicGF0dGVybiIsImF1dG9sb2FkVHlwZXMiLCJhdXRvbG9hZE1vZGVscyIsImF1dG9sb2FkQXBpcyIsInN5bmNVSSIsImVuZHNXaXRoIiwiZW50aXR5SWQiLCJnZXRFbnRpdHlJZEZyb21QYXRoIiwidG9SZW1vdmUiLCJmaWx0ZXIiLCJhcGkiLCJtb2RlbE5hbWUiLCJzcGxpY2UiLCJpbmRleE9mIiwidGFyZ2V0Iiwic3JjUGF0aCIsImpvaW4iLCJyZXBsYWNlIiwiYXBwUm9vdFBhdGgiLCJFcnJvciIsImRlc3RQYXRoIiwicmVjdXJzaXZlIiwid2FybiIsImRpZmZGaWxlUGF0aHMiLCJkaWZmR3JvdXBzIiwiY2FsY3VsYXRlRGlmZkdyb3VwcyIsImRpZmZUeXBlcyIsImtleXMiLCJpbmNsdWRlcyIsImhhbmRsZUVudGl0eUNoYW5nZSIsImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZSIsImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZSIsImFjdGlvblN5bmNDb25maWciLCJkaWZmRmlsZXMiLCJyIiwibWF0Y2hlZCIsIm1hdGNoIiwidCIsInJlbG9hZCIsImVudGl0eSIsImdldCIsInR5cGVGaWxlUGF0aCIsIm5hbWVzIiwiZnMiLCJwYXJlbnRJZCIsInVuZGVmaW5lZCIsImFjdGlvbkdlbmVyYXRlU2NoZW1hcyIsImdlbmVyYXRlZCIsInB1c2giLCJ0c1BhdGhzIiwiZnVuY3Rpb25zIiwiYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzIiwibWVyZ2VkR3JvdXAiLCJtb2RlbCIsImZyYW1lIiwicGFyYW1zIiwibWFwIiwibW9kZWxQYXRoIiwibmFtZXNSZWNvcmQiLCJnZXROYW1lc0Zyb21JZCIsImZyYW1lTmFtZSIsImFjdGlvbkdlbmVyYXRlU2VydmljZXMiLCJhY3Rpb25HZW5lcmF0ZUh0dHBzIiwiaG9zdCIsInBvcnQiLCJzZXJ2ZXIiLCJsaXN0ZW4iLCJjb250ZW50IiwiUHJvbWlzZSIsImFsbCIsIm92ZXJ3cml0ZSIsImZsYXQiLCJwYXJhbXNBcnJheSIsInJlcyIsImRpciIsImFwaURpciIsInJlYWxTcmMiLCJkc3QiLCJjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkIiwiZnJvbVBhdGgiLCJ0b1BhdGgiLCJvbGRGaWxlQ29udGVudCIsInRvU3RyaW5nIiwibmV3RmlsZUNvbnRlbnQiLCJuZmMiLCJjaGVja0V4aXN0c0dlbkNvZGUiLCJ0ZW1wbGF0ZUtleSIsImVudW1JZCIsImdlblBhdGgiLCJnZXRUYXJnZXRBbmRQYXRoIiwic3ViUGF0aCIsImZ1bGxQYXRoIiwiaXNFeGlzdHMiLCJjaGVja0V4aXN0cyIsImVudW1zIiwib3B0aW9ucyIsImVudW1zS2V5cyIsIm5hbWUiLCJjb25zdGFudCIsInJlc3VsdCIsImtleSIsInRwbCIsInN0YXJ0c1dpdGgiLCJjb21wb25lbnRJZCIsInAiLCJ1aVBvcnQiLCJ1aSIsImZldGNoIiwibWV0aG9kIiwiY2F0Y2giLCJlIiwiZGltIiwibWVzc2FnZSIsImZvcm0iLCJ0ZW1wbGF0ZU9wdGlvbnMiLCJfZ2VuZXJhdGVPcHRpb25zIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxHQUFHLFFBQVEsdUJBQXVCO0FBQzNDLE9BQU9DLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsS0FBSyxFQUFFQyxRQUFRLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUN6RCxTQUFTQyxTQUFTLFFBQVEsWUFBWTtBQUN0QyxPQUFPQyxRQUFRQyxPQUFPLFFBQVEsT0FBTztBQUNyQyxTQUFTQyxLQUFLLEVBQUVDLE1BQU0sUUFBUSxVQUFVO0FBRXhDLFNBQVNDLGNBQWMsUUFBUSx1QkFBb0I7QUFDbkQsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUN2QyxTQUFTQyxhQUFhLFFBQWdDLDhCQUEyQjtBQUNqRixTQUFTQyxLQUFLLFFBQVEsb0JB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
425
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyByZWdpc3RlcmVkQXBpcyB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIsIHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVPcHRpb25zLCBQYXRoQW5kQ29kZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGVLZXksIHR5cGUgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBtYXBBc3luYywgcmVkdWNlQXN5bmMgfSBmcm9tIFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGNlbnRlclRleHQgfSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW5XaXRoR3JhY2VmdWxTaHV0ZG93biB9IGZyb20gXCIuLi91dGlscy9wcm9jZXNzLXV0aWxzXCI7XG5pbXBvcnQgeyBhcmVGaWxlc1NhbWUsIGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBGaWxlVHlwZSwgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCB9IGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcbmltcG9ydCB7XG4gIHR5cGUgTG9hZGVkQXBpcyxcbiAgdHlwZSBMb2FkZWRNb2RlbHMsXG4gIHR5cGUgTG9hZGVkVHlwZXMsXG4gIGxvYWRBcGlzLFxuICBsb2FkTW9kZWxzLFxuICBsb2FkVHlwZXMsXG59IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcblxudHlwZSBEaWZmR3JvdXBzID0ge1xuICBba2V5IGluIEZpbGVUeXBlXTogQWJzb2x1dGVQYXRoW107XG59O1xuXG5leHBvcnQgY2xhc3MgU3luY2VyIHtcbiAgYXBpczogTG9hZGVkQXBpcyA9IFtdO1xuICB0eXBlczogTG9hZGVkVHlwZXMgPSB7fTtcbiAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcbiAgaXNTeW5jaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIOyytO2BrOyErOydtCDrs4Dqsr3rkJwg67aA67aE7JeQIOuMgO2VtCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiDri6Trp4wgc29uYW11LnNoYXJlZC50c+uKlCDssrTtgazshKwg67mE6rWQIOyXhuydtCDrrLTsobDqsbQg7Iux7YGsKOuzteyCrCntlanri4jri6QuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuXG4gICAgLy8gc29uYW11LnNoYXJlZC50c+uKlCDrrLTsobDqsbQg7Iux7YGsKOuzteyCrCntlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5jb3B5U2hhcmVkVG9UYXJnZXRzKHRhcmdldHMpO1xuXG4gICAgLy8g6re4IOuLpOydjOu2gO2EsOuKlCDrs4Dqsr3rkJwg7YyM7J287J2EIOywvuyVhOyEnCDrj5nquLDtmZQg7J6R7JeF7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICBjb25zdCBjaGFuZ2VkRmlsZXMgPSBhd2FpdCBmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMoKTtcbiAgICBpZiAoY2hhbmdlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KFwiQWxsIGZpbGVzIGFyZSBzeW5jZWQhXCIpKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g66eM7JW9IOyLse2BrCDspJHsl5Ag7ZSE66Gc7IS47Iqk6rCAIOyjveycvOuptCDqvKzsl6zrsoTrpqzquLAg65WM66y47JeQLFxuICAgIC8vIOyLnOq3uOuEkOyXkOuPhCDsnqDsi5wg67KE7Yu4IOyImCDsnojripQg7ZmY6rK9IOyGjeyXkOyEnCDsi7Htgazrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGF3YWl0IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyDslpjqsIAg7Iux7YGsIOyekeyXhSDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoY2hhbmdlZEZpbGVzKTtcblxuICAgICAgICAvLyDsi7Htgawg7JWh7IWY7J20IOuBneuCmOuptCDtla3sg4Eg7LK07YGs7ISs7J2EIOuLpOyLnCDqsLHsi6Dtlanri4jri6QuXG4gICAgICAgIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gICAgICB9LFxuICAgICAgeyB3aGVuVGhpc0hhcHBlbnM6IFwiU0lHVVNSMlwiLCB3YWl0Rm9yVXBUbzogMjAwMDAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXLqsIAg6rCQ7KeA7ZWcIO2MjOydvCDrs4Dqsr0g7IKs7ZWt7JeQIOuMgO2VtCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiDso7zslrTsp4Qg67OA6rK9IO2MjOydvOuTpCDspJEg7LK07YGs7ISsIOq0gOumrCDrjIDsg4Hsnbgg6rKD65Ok66eMIOqwgOyguOuLpOqwgCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiDssrTtgazshKwg7YyM7J28IOyXheuNsOydtO2KuOuKlCDsl6zquLDsl5DshJwg7ZWY7KeAIOyViuyKteuLiOuLpC4g7Zi47Lac7J6Q6rCAIO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aCAtIOuzgOqyvSDtjIzsnbzrk6QuIO2UhOuhnOygne2KuCDro6jtirjrtoDthLAgXCJzcmMvXCIg65iQ64qUIFwiZGlzdC9cIuuhnCDsi5zsnpHtlZjripQg7IOB64yAIOqyveuhnOyeheuLiOuLpC4g7JiI7IucOiBcInNyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIlxuICAgKi9cbiAgYXN5bmMgc3luY0Zyb21XYXRjaGVyKGV2ZW50OiBzdHJpbmcsIGRpZmZGaWxlUGF0aDogQWJzb2x1dGVQYXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGV2ZW50ICE9PSBcImNoYW5nZVwiICYmIGV2ZW50ICE9PSBcImFkZFwiICYmIGV2ZW50ICE9PSBcInVubGlua1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7J2864uoIOuzgOqyveuQnCDtjIzsnbzqs7wgZGVwZW5kZW50IO2MjOydvOuTpOydhCBpbnZhbGlkYXRlIO2VqeuLiOuLpC5cbiAgICAvLyDtlZwg67KIIOydtOyDgSBpbXBvcnTrkJwg7Lmc6rWs65Ok7JeQIOuMgO2VtOyEnOunjCDsi6TsoJwg7J6R7JeF7J20IOydvOyWtOuCqeuLiOuLpC5cbiAgICAvLyDqt7jrn6zri4gg7JWI7Ius7ZWY6rOgIGludmFsaWRhdGUg7ZW064+EIOuQqeuLiOuLpC5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIGhvdC5pbnZhbGlkYXRlRmlsZeyLnCDstIjquLAg7JeQ65+s6rCAIOuwnOyDne2VmOq4sCDrlYzrrLjsl5AgaW52YWxpZGF0ZSDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgIGNvbnN0IGludmFsaWRhdGVkUGF0aHMgPSAoYXdhaXQgaG90LmludmFsaWRhdGVGaWxlKGRpZmZGaWxlUGF0aCwgZXZlbnQpKSBhcyBBYnNvbHV0ZVBhdGhbXTtcblxuICAgICAgaWYgKGludmFsaWRhdGVkUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGDwn5SEIEludmFsaWRhdGVkOmApKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGludmFsaWRhdGVkUGF0aCBvZiBpbnZhbGlkYXRlZFBhdGhzKSB7XG4gICAgICAgICAgLy8g66eM7JW9IG1vZGVsLnRzIO2MjOydvOydtCDrs4Dqsr0oaW52YWxpZGF0ZSnrkJjsl4jri6Q/IOq3uOufrOuptCByZWdpc3RlcmVkQXBpcyDspJHsl5DshJwg7J20IOuqqOuNuOyXkCDtlbTri7ntlZjripQgYXBp65Ok7J2AIOyngOybjOykmOyalC5cbiAgICAgICAgICAvLyByZWdpc3RlcmVkQXBpc+uKlCDthrXsnLzroZwg64ukIOuCoOugpOuyhOumtCDsiJgg7JeG7Iq164uI64ukLiByZWdpc3RlcmVkQXBpc+yXkCDsmKzrnbzsmKTripQg7Lmc6rWs65Ok7J2AIOy0iOq4sCDroZzrk5zsi5wg65iQ64qUIEhNUuyLnOyXkOunjCDrk7HroZ3rkJjquLAg65WM66y47J6F64uI64ukLlxuICAgICAgICAgIC8vIOuUsOudvOyEnCBtb2RlbC50cyDtjIzsnbzsnZgg67OA6rK97Jy866GcIOuLpOydjOuyiCDsg4jroZzsmrQgZXZhbOydtCDsmIjsg4HrkJjripQg7J20IOyLnOygkOyXkOyEnOunjCwg7J20IOuqqOuNuOyXkOyEnCDrgpjsmKggcmVnaXN0ZXJlZEFwaXPrk6TsnYQg7KeA7JuM7KSEIOyImCDsnojsirXri4jri6QuXG4gICAgICAgICAgY29uc3QgcmVtb3ZlZEFwaXMgPSB0aGlzLnJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICAgICAgICBpZiAocmVtb3ZlZEFwaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSxcbiAgICAgICAgICAgICAgY2hhbGsuZ3JheShgKHdpdGggJHtyZW1vdmVkQXBpcy5sZW5ndGh9IEFQSXMpYCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzSW5DaGVja1BhdHRlcm5Hcm91cCA9IE9iamVjdC52YWx1ZXMoZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCgpKS5zb21lKFxuICAgICAgKHBhdHRlcm4pID0+IG1pbmltYXRjaChkaWZmRmlsZVBhdGgsIHBhdHRlcm4pLFxuICAgICk7XG5cbiAgICAvLyDtlaAg7J28KHN5bmMp7J20IOyeiOycvOuptCDtlanri4jri6QuXG4gICAgaWYgKGlzSW5DaGVja1BhdHRlcm5Hcm91cCkge1xuICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKFtkaWZmRmlsZVBhdGhdKTtcbiAgICB9XG5cbiAgICAvLyDsi7Htgawg7J6R7JeF7J20IOuBneuCmOuptCDrqqjrk6Ag66qo65OI7J2EIOuhnOuTnO2VqeuLiOuLpC5cbiAgICAvLyBobXItaG9va+yXkCDsnZjtlbQgaW52YWxpZGF0ZeuQnCDrtoDrtoTrk6TsnbQg7JWE64uI652866m0IOy6kOyLnCDqt7jrjIDroZwg7Jyg7KeA7ZWp64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuXG4gICAgdGhpcy5zeW5jVUkoKTtcbiAgfVxuXG4gIHJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoXG4gICAgaW52YWxpZGF0ZWRQYXRoOiBBYnNvbHV0ZVBhdGgsXG4gICk6ICh0eXBlb2YgcmVnaXN0ZXJlZEFwaXMpW251bWJlcl1bXSB7XG4gICAgaWYgKCFpbnZhbGlkYXRlZFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIiAvKuyGjOyKpCDsvZTrk5zrpbwg64uk66Oo64qUIOyDge2ZqeydtOuLiCAudHMg6rK966Gc66GcIOu0heuLiOuLpC4qLykpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChpbnZhbGlkYXRlZFBhdGgpO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IGAke2VudGl0eUlkfU1vZGVsYCk7XG4gICAgZm9yIChjb25zdCBhcGkgb2YgdG9SZW1vdmUpIHtcbiAgICAgIHJlZ2lzdGVyZWRBcGlzLnNwbGljZShyZWdpc3RlcmVkQXBpcy5pbmRleE9mKGFwaSksIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB0b1JlbW92ZTtcbiAgfVxuXG4gIGFzeW5jIGNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAvLyDsp4DquIgg6rCA7KC46rCA66Ck64qUIOydtCDtjIzsnbzsnYAgU29uYW11IOy9lOuTnOuyoOydtOyKpOydmCDsnbzrtoDsnoXri4jri6QuXG4gICAgICAvLyDqt7jrn7DrjbAgZGlzdCDsho0g67mM65Oc65CcIOyGjOyKpCDsvZTrk5wg7YyM7J287J20IO2VhOyalO2VnCDqsoPsnbQg7JWE64uI6rOgLCBzcmPsl5Drp4wg7J6I64qUIO2FjeyKpO2KuCDtjIzsnbzsnbQg7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgLy8g65Sw65287IScIC9zcmMv7JeQ7IScIOywvuyKteuLiOuLpC5cbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUucmVwbGFjZShcIi9kaXN0L1wiLCBcIi9zcmMvXCIpLFxuICAgICAgICBgLi4vc2hhcmVkLyR7dGFyZ2V0fS5zaGFyZWQudHMudHh0YCxcbiAgICAgICk7XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMoc3JjUGF0aCkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQpKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUcmllZCB0byBjb3B5IHNvbmFtdS5zaGFyZWQudHMgdG8gdGFyZ2V0ICcke3RhcmdldH0nIGJ1dCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIGNoZWNrIHlvdXIgcHJvamVjdCBkaXJlY3Rvcnkgc3RydWN0dXJlLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIOydtOqxtCDtlITroZzsoJ3tirjsl5AgLnRzIOyGjOyKpCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VmOuKlCDqsoPsnbTrr4DroZwgc3Jj7J2YIC50cyDqsr3roZzroZwg6rCR64uI64ukLlxuICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwiLi9zcmMvc2VydmljZXMvc29uYW11LnNoYXJlZC50c1wiKTtcblxuICAgICAgLy8g7KCV66eQIO2YueyLnOuCmOyngOunjCB0YXJnZXQg65SU66CJ7Yag66as64qUIOyeiOyWtOuPhCBzcmMvc2VydmljZXMg65SU66CJ7Yag66as64qUIOyXhuydhCDsiJgg7J6I7Jy866+A66GcIOuvuOumrCDsg53shLHtlbTspI3ri4jri6QuXG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSkpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZShkZXN0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLndhcm4oYENyZWF0ZWQgZGlyZWN0b3J5ICcke3BhdGguZGlybmFtZShkZXN0UGF0aCl9JyBiZWNhdXNlIGl0IGRpZCBub3QgZXhpc3QuYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBhcmVGaWxlc1NhbWUoc3JjUGF0aCwgZGVzdFBhdGgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgd3JpdGVGaWxlKGRlc3RQYXRoLCBhd2FpdCByZWFkRmlsZShzcmNQYXRoKSk7XG5cbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKHBhdGgucmVsYXRpdmUoU29uYW11LmFwcFJvb3RQYXRoLCBkZXN0UGF0aCkpLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkVHlwZXMoKSB7XG4gICAgdGhpcy50eXBlcyA9IGF3YWl0IGxvYWRUeXBlcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRNb2RlbHMoKSB7XG4gICAgdGhpcy5tb2RlbHMgPSBhd2FpdCBsb2FkTW9kZWxzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZEFwaXMoKSB7XG4gICAgdGhpcy5hcGlzID0gYXdhaXQgbG9hZEFwaXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsi6TsoJwg7Iux7YGs66W8IOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAqIOuzgOqyveuQnCDtjIzsnbzrk6TsnYQg7YOA7J6F67OE66GcIOu2hOulmO2VmOqzoCDqsIEg7YOA7J6F7JeQIOunnuuKlCDslaHshZjsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRocyAtIOuzgOqyveuQnCDtjIzsnbzrk6TsnZgg7KCI64yAIOqyveuhnCDrqqnroZ1cbiAgICogQHJldHVybnMgZGlmZlR5cGVzIC0g67OA6rK965CcIO2MjOydvOydmCDtg4DsnoUg66qp66GdIChlbnRpdHksIHR5cGVzLCBtb2RlbCDrk7EpXG4gICAqL1xuICBhc3luYyBkb1N5bmNBY3Rpb25zKGRpZmZGaWxlUGF0aHM6IEFic29sdXRlUGF0aFtdKTogUHJvbWlzZTx7IGRpZmZUeXBlczogc3RyaW5nW10gfT4ge1xuICAgIGNvbnN0IGRpZmZHcm91cHMgPSB0aGlzLmNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVQYXRocyk7XG4gICAgY29uc3QgZGlmZlR5cGVzID0gT2JqZWN0LmtleXMoZGlmZkdyb3Vwcyk7XG5cbiAgICAvLyDtirjrpqzqsbA6IGVudGl0eSwgdHlwZXNcbiAgICAvLyDslaHshZg6IOyKpO2CpOuniCDsg53shLFcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwiZW50aXR5XCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUVudGl0eUNoYW5nZShkaWZmR3JvdXBzLCBkaWZmVHlwZXMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogdHlwZXMsIGVudW1zLCBnZW5lcmF0ZWQg67OA6rK97IucXG4gICAgLy8g7JWh7IWYOiDtjIzsnbwg7Iux7YGsIHR5cGVzLCBlbnVtcywgZ2VuZXJhdGVkXG4gICAgaWYgKFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwidHlwZXNcIikgfHxcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImZ1bmN0aW9uc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZ2VuZXJhdGVkXCIpXG4gICAgKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZShkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IG1vZGVsXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcIm1vZGVsXCIpIHx8IGRpZmZUeXBlcy5pbmNsdWRlcyhcImZyYW1lXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZShkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IGNvbmZpZ1xuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJjb25maWdcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWN0aW9uU3luY0NvbmZpZygpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaWZmVHlwZXMsXG4gICAgfTtcbiAgfVxuXG4gIGNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVzOiBBYnNvbHV0ZVBhdGhbXSk6IERpZmZHcm91cHMge1xuICAgIHJldHVybiBncm91cChkaWZmRmlsZXMsIChyKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGVkID0gci5tYXRjaCgvXFwuKG1vZGVsfHR5cGVzfGZ1bmN0aW9uc3xlbnRpdHl8Z2VuZXJhdGVkfGZyYW1lfGNvbmZpZylcXC5bdGpdcy8pO1xuICAgICAgcmV0dXJuIG1hdGNoZWQ/LlsxXSA/PyBcInVua25vd25cIjtcbiAgICB9KSBhcyB1bmtub3duIGFzIERpZmZHcm91cHM7XG4gIH1cblxuICBhc3luYyBoYW5kbGVFbnRpdHlDaGFuZ2UoZGlmZkdyb3VwczogRGlmZkdyb3VwcywgZGlmZlR5cGVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVFbnRpdHlDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzLCBkaWZmVHlwZXMgfSk7XG5cbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlbG9hZCgpO1xuXG4gICAgLy8gdHlwZXMg7IOd7ISxKGVudGl0eSDsg4jroZwg7LaU6rCA65CcIOqyveyasClcbiAgICAvLyBwYXJlbnRJZOqwgCDsl4bqs6AsIHR5cGVz6rCAIOyXhuuKlCDqsr3smrDsl5Drp4wg7IOd7ISxXG4gICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoZGlmZkdyb3Vwcy5lbnRpdHk/LlswXSk7XG5cbiAgICBpZiAoZW50aXR5SWQpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgIC8vIO2UhOuhnOygne2KuOyXkCDsg53shLHrkJjslrTslbwg7ZWY64qUIC50cyDtjIzsnbzsnZgg6rK966Gc7J6F64uI64ukLlxuICAgICAgY29uc3QgdHlwZUZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICAgIGBzcmMvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMuZnN9LyR7ZW50aXR5Lm5hbWVzLmZzfS50eXBlcy50c2AsXG4gICAgICApO1xuICAgICAgaWYgKGVudGl0eS5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkICYmICEoYXdhaXQgZXhpc3RzKHR5cGVGaWxlUGF0aCkpKSB7XG4gICAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJpbml0X3R5cGVzXCIsIHsgZW50aXR5SWQgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTtcblxuICAgIGRpZmZHcm91cHMuZ2VuZXJhdGVkID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLmdlbmVyYXRlZCA/PyBbXSksXG4gICAgICBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyYy9hcHBsaWNhdGlvbi9zb25hbXUuZ2VuZXJhdGVkLnRzXCIpIGFzIEFic29sdXRlUGF0aCxcbiAgICBdKTtcbiAgICBkaWZmVHlwZXMucHVzaChcImdlbmVyYXRlZFwiKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTxGaWxlVHlwZVtdPiB7XG4gICAgY29uc3QgdHNQYXRocyA9IHVuaXF1ZShbXG4gICAgICAuLi4oZGlmZkdyb3Vwcy50eXBlcyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5mdW5jdGlvbnMgPz8gW10pLFxuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICBdKTtcbiAgICBOYWl0ZS50KFwiaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlXCIsIHsgZGlmZkdyb3VwcyB9KTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgY2hhbGsuZ3JheShcbiAgICAvLyAgICAgYFtQcm9jZXNzaW5nXSBIYW5kbGluZyB0eXBlcy9mdW5jdGlvbnMvZ2VuZXJhdGVkIGNoYW5nZXM6ICR7dHNQYXRocy5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBwKSkuam9pbihcIiwgXCIpfWBcbiAgICAvLyAgIClcbiAgICAvLyApO1xuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHNQYXRocyk7XG5cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBhc3luYyBoYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2UoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzIH0pO1xuICAgIGNvbnN0IG1lcmdlZEdyb3VwID0gWy4uLihkaWZmR3JvdXBzLm1vZGVsID8/IFtdKSwgLi4uKGRpZmZHcm91cHMuZnJhbWUgPz8gW10pXTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgY2hhbGsuZ3JheShcbiAgICAvLyAgICAgYFtQcm9jZXNzaW5nXSBIYW5kbGluZyBtb2RlbC9mcmFtZSBjaGFuZ2VzOiAke21lcmdlZEdyb3VwLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICAvLyBnZW5lcmF0ZWRfaHR0cC50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIudHlwZXPrpbwg7JSB64uI64ukLlxuICAgIC8vIHNlcnZpY2UudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLmFwaXPrpbwg7JSB64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuXG4gICAgY29uc3QgcGFyYW1zOiB7XG4gICAgICBuYW1lc1JlY29yZDogRW50aXR5TmFtZXNSZWNvcmQ7XG4gICAgfVtdID0gbWVyZ2VkR3JvdXAubWFwKChtb2RlbFBhdGgpID0+IHtcbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIikpIHtcbiAgICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgobW9kZWxQYXRoKTtcbiAgICAgICAgYXNzZXJ0KGVudGl0eUlkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLmZyYW1lLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IFssIGZyYW1lTmFtZV0gPSBtb2RlbFBhdGgubWF0Y2goLy4rXFwvKC4rKVxcLmZyYW1lXFwudHMkLykgPz8gW107XG4gICAgICAgIGFzc2VydChmcmFtZU5hbWUpO1xuICAgICAgICAvLyBmcmFtZU5hbWXsnYQgUGFzY2FsQ2FzZeuhnCDrs4DtmZggKGRhc2hib2FyZCAtPiBEYXNoYm9hcmQpXG4gICAgICAgIGNvbnN0IGZyYW1lSWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGZyYW1lTmFtZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZnJhbWVJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgcmVhY2hhYmxlXCIpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKHBhcmFtcyk7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZUh0dHBzKCk7XG4gIH1cblxuICAvLyB3ZWIvLnNvbmFtdS5lbnYg7JeQIO2YhOyerCDshKTsoJXqsJIg7KCA7J6lXG4gIGFzeW5jIGFjdGlvblN5bmNDb25maWcoKSB7XG4gICAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSBTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4gPz8ge307XG4gICAgY29uc3QgY29udGVudCA9IGBBUElfSE9TVD0ke2hvc3QgPz8gXCJsb2NhbGhvc3RcIn1cXG5BUElfUE9SVD0ke3BvcnQgPz8gMzAwMH1gO1xuXG4gICAgTmFpdGUudChcImFjdGlvblN5bmNDb25maWdcIiwgeyBjb250ZW50IH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCIuc29uYW11LmVudlwiKSwgY29udGVudCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5nZW5lcmF0ZWQudHPsmYAgc29uYW11LmdlbmVyYXRlZC5zc28udHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRfc3NvXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcImdlbmVyYXRlZFwiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICBdKVxuICAgIClcbiAgICAgIC5mbGF0KClcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICAvKipcbiAgICogKi5zZXJ2aWNlLnRz66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHBhcmFtIHBhcmFtc0FycmF5XG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlU2VydmljZXMoXG4gICAgcGFyYW1zQXJyYXk6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10sXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBOYWl0ZS50KFwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlc1wiLCBwYXJhbXNBcnJheSk7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBwYXJhbXNBcnJheS5tYXAoYXN5bmMgKHBhcmFtcykgPT5cbiAgICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwic2VydmljZVwiLCBwYXJhbXMgYXMgVGVtcGxhdGVPcHRpb25zW1wic2VydmljZVwiXSwge1xuICAgICAgICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKVxuICAgIClcbiAgICAgIC5mbGF0KClcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICAvKipcbiAgICogc29uYW11LmdlbmVyYXRlZC5odHRw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZUh0dHBzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoPiB7XG4gICAgY29uc3QgW3Jlc10gPSBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFxuICAgICAgXCJnZW5lcmF0ZWRfaHR0cFwiLFxuICAgICAgeyBlbnRpdHlJZDogXCJkdW1teVwiIH0sXG4gICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9LFxuICAgICk7XG4gICAgYXNzZXJ0KHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiAqLnR5cGVzLnRzLCAqLmZ1bmN0aW9ucy50cywgKi5nZW5lcmF0ZWQudHPrpbwg7YOA6rKfIOuUlOugie2GoOumrOyXkCDrs7Xsgqztlanri4jri6QuXG4gICAqIEBwYXJhbSB0c1BhdGhzXG4gICAqIEByZXR1cm5zIOuzteyCrOuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICBjb25zdCB7IGRpcjogYXBpRGlyIH0gPSBTb25hbXUuY29uZmlnLmFwaTtcblxuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT5cbiAgICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHRzUGF0aHMubWFwKGFzeW5jIChyZWFsU3JjKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGRzdCA9IHJlYWxTcmNcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgLyR7YXBpRGlyfS9gLCBgLyR7dGFyZ2V0fS9gKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiL2FwcGxpY2F0aW9uL1wiLCBcIi9zZXJ2aWNlcy9cIik7XG4gICAgICAgICAgICAgIGNvbnN0IGRpciA9IGRpcm5hbWUoZHN0KTtcbiAgICAgICAgICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUoZHN0LnJlcGxhY2UoYCR7U29uYW11LmFwcFJvb3RQYXRofS9gLCBcIlwiKSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkKHJlYWxTcmMsIGRzdCk7XG4gICAgICAgICAgICAgIHJldHVybiBkc3Q7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKVxuICAgICkuZmxhdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkKGZyb21QYXRoOiBzdHJpbmcsIHRvUGF0aDogc3RyaW5nKSB7XG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKGZyb21QYXRoKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRGaWxlQ29udGVudCA9IChhd2FpdCByZWFkRmlsZShmcm9tUGF0aCkpLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9ICgoKSA9PiB7XG4gICAgICBjb25zdCBuZmMgPSBvbGRGaWxlQ29udGVudC5yZXBsYWNlKC9mcm9tIFwic29uYW11XCIvZywgYGZyb20gXCIuL3NvbmFtdS5zaGFyZWRcImApO1xuICAgICAgcmV0dXJuIG5mYztcbiAgICB9KSgpO1xuICAgIHJldHVybiB3cml0ZUZpbGUodG9QYXRoLCBuZXdGaWxlQ29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDthZztlIzrpr8g7YKk7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZUtleSDthZztlIzrpr8g7YKkXG4gICAqIEBwYXJhbSBlbnVtSWQg7Je06rGw7ZiVIElEXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHNHZW5Db2RlKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVLZXk6IFRlbXBsYXRlS2V5LFxuICAgIGVudW1JZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IHN1YlBhdGg6IHN0cmluZzsgZnVsbFBhdGg6IHN0cmluZzsgaXNFeGlzdHM6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBnZW5QYXRoIH0gPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KHRlbXBsYXRlS2V5KS5nZXRUYXJnZXRBbmRQYXRoKFxuICAgICAgRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICBlbnVtSWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHN1YlBhdGggPSBwYXRoLmpvaW4odGFyZ2V0LCBnZW5QYXRoKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHN1YlBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWJQYXRoLFxuICAgICAgZnVsbFBhdGgsXG4gICAgICBpc0V4aXN0czogYXdhaXQgZXhpc3RzKGZ1bGxQYXRoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7Je06rGw7ZiV7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSBlbnVtcyDsl7TqsbDtmJUg66CI7J2067iUXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHMoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICBlbnVtczoge1xuICAgICAgW25hbWU6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+Pj47XG4gICAgfSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8YCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCwgYm9vbGVhbj4+IHtcbiAgICBjb25zdCBrZXlzOiBUZW1wbGF0ZUtleVtdID0gVGVtcGxhdGVLZXkub3B0aW9ucztcbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudW1zS2V5cyA9IE9iamVjdC5rZXlzKGVudW1zKS5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IG5hbWVzLmNvbnN0YW50KTtcblxuICAgIHJldHVybiBhd2FpdCByZWR1Y2VBc3luYyhcbiAgICAgIGtleXMsXG4gICAgICBhc3luYyAocmVzdWx0LCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdHBsID0gVGVtcGxhdGVNYW5hZ2VyLmdldChrZXkpO1xuICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJ2aWV3X2VudW1zXCIpKSB7XG4gICAgICAgICAgYXdhaXQgbWFwQXN5bmMoZW51bXNLZXlzLCBhc3luYyAoY29tcG9uZW50SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcywgY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7Y29tcG9uZW50SWR9YF0gPSBhd2FpdCBleGlzdHMoXG4gICAgICAgICAgICAgIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMpO1xuICAgICAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICAgICAgaWYgKHRhcmdldC5pbmNsdWRlcyhcIjp0YXJnZXRcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyh0YXJnZXRzLCBhc3luYyAodCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7dH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LnJlcGxhY2UoXCI6dGFyZ2V0XCIsIHQpLCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPixcbiAgICApO1xuICB9XG5cbiAgc3luY1VJKCkge1xuICAgIGNvbnN0IHVpUG9ydCA9IFNvbmFtdS5jb25maWcudWk/LnBvcnQgPz8gNTcwMDA7XG5cbiAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICBmZXRjaChgaHR0cDovLzEyNy4wLjAuMToke3VpUG9ydH0vYXBpL3JlbG9hZGAsIHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgfSkuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGNoYWxrLmRpbShgRmFpbGVkIHRvIHJlbG9hZCBTb25hbXUgVUk6ICR7ZS5tZXNzYWdlfWApKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50aXR5KGZvcm06IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVFbnRpdHkoZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBkZWxFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8eyBkZWxQYXRoczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiBhd2FpdCBkZWxFbnRpdHkoZW50aXR5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMsIF9nZW5lcmF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGU8VCBleHRlbmRzIGtleW9mIFRlbXBsYXRlT3B0aW9ucz4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICApOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJob3QiLCJhc3NlcnQiLCJjaGFsayIsIm1rZGlyIiwicmVhZEZpbGUiLCJ3cml0ZUZpbGUiLCJpbmZsZWN0aW9uIiwibWluaW1hdGNoIiwicGF0aCIsImRpcm5hbWUiLCJncm91cCIsInVuaXF1ZSIsInJlZ2lzdGVyZWRBcGlzIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiVGVtcGxhdGVNYW5hZ2VyIiwiVGVtcGxhdGVLZXkiLCJtYXBBc3luYyIsInJlZHVjZUFzeW5jIiwiY2VudGVyVGV4dCIsImlzVGVzdCIsImV4aXN0cyIsInJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIiwiYXJlRmlsZXNTYW1lIiwiZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zIiwicmVuZXdDaGVja3N1bXMiLCJnZW5lcmF0ZVRlbXBsYXRlIiwicmVuZGVyVGVtcGxhdGUiLCJjcmVhdGVFbnRpdHkiLCJkZWxFbnRpdHkiLCJnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIiwibG9hZEFwaXMiLCJsb2FkTW9kZWxzIiwibG9hZFR5cGVzIiwiU3luY2VyIiwiYXBpcyIsInR5cGVzIiwibW9kZWxzIiwiaXNTeW5jaW5nIiwic3luYyIsInRhcmdldHMiLCJjb25maWciLCJjb3B5U2hhcmVkVG9UYXJnZXRzIiwiY2hhbmdlZEZpbGVzIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsImJsYWNrIiwiYmdHcmVlbiIsImRvU3luY0FjdGlvbnMiLCJ3aGVuVGhpc0hhcHBlbnMiLCJ3YWl0Rm9yVXBUbyIsInN5bmNGcm9tV2F0Y2hlciIsImV2ZW50IiwiZGlmZkZpbGVQYXRoIiwiaW52YWxpZGF0ZWRQYXRocyIsImludmFsaWRhdGVGaWxlIiwiYm9sZCIsImludmFsaWRhdGVkUGF0aCIsInJlbW92ZWRBcGlzIiwicmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyIsImJsdWUiLCJyZWxhdGl2ZSIsImFwaVJvb3RQYXRoIiwiZ3JheSIsImlzSW5DaGVja1BhdHRlcm5Hcm91cCIsIk9iamVjdCIsInZhbHVlcyIsInNvbWUiLCJwYXR0ZXJuIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwic3luY1VJIiwiZW5kc1dpdGgiLCJlbnRpdHlJZCIsImdldEVudGl0eUlkRnJvbVBhdGgiLCJ0b1JlbW92ZSIsImZpbHRlciIsImFwaSIsIm1vZGVsTmFtZSIsInNwbGljZSIsImluZGV4T2YiLCJ0YXJnZXQiLCJzcmNQYXRoIiwiam9pbiIsInJlcGxhY2UiLCJhcHBSb290UGF0aCIsIkVycm9yIiwiZGVzdFBhdGgiLCJyZWN1cnNpdmUiLCJ3YXJuIiwiZGlmZkZpbGVQYXRocyIsImRpZmZHcm91cHMiLCJjYWxjdWxhdGVEaWZmR3JvdXBzIiwiZGlmZlR5cGVzIiwia2V5cyIsImluY2x1ZGVzIiwiaGFuZGxlRW50aXR5Q2hhbmdlIiwiaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlIiwiaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlIiwiYWN0aW9uU3luY0NvbmZpZyIsImRpZmZGaWxlcyIsInIiLCJtYXRjaGVkIiwibWF0Y2giLCJ0IiwicmVsb2FkIiwiZW50aXR5IiwiZ2V0IiwidHlwZUZpbGVQYXRoIiwibmFtZXMiLCJmcyIsInBhcmVudElkIiwidW5kZWZpbmVkIiwiYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiZ2VuZXJhdGVkIiwicHVzaCIsInRzUGF0aHMiLCJmdW5jdGlvbnMiLCJhY3Rpb25TeW5jRmlsZXNUb1RhcmdldHMiLCJtZXJnZWRHcm91cCIsIm1vZGVsIiwiZnJhbWUiLCJwYXJhbXMiLCJtYXAiLCJtb2RlbFBhdGgiLCJuYW1lc1JlY29yZCIsImdldE5hbWVzRnJvbUlkIiwiZnJhbWVOYW1lIiwiZnJhbWVJZCIsImNhbWVsaXplIiwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyIsImFjdGlvbkdlbmVyYXRlSHR0cHMiLCJob3N0IiwicG9ydCIsInNlcnZlciIsImxpc3RlbiIsImNvbnRlbnQiLCJQcm9taXNlIiwiYWxsIiwib3ZlcndyaXRlIiwiZmxhdCIsInBhcmFtc0FycmF5IiwicmVzIiwiZGlyIiwiYXBpRGlyIiwicmVhbFNyYyIsImRzdCIsImNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQiLCJmcm9tUGF0aCIsInRvUGF0aCIsIm9sZEZpbGVDb250ZW50IiwidG9TdHJpbmciLCJuZXdGaWxlQ29udGVudCIsIm5mYyIsImNoZWNrRXhpc3RzR2VuQ29kZSIsInRlbXBsYXRlS2V5IiwiZW51bUlkIiwiZ2VuUGF0aCIsImdldFRhcmdldEFuZFBhdGgiLCJzdWJQYXRoIiwiZnVsbFBhdGgiLCJpc0V4aXN0cyIsImNoZWNrRXhpc3RzIiwiZW51bXMiLCJvcHRpb25zIiwiZW51bXNLZXlzIiwibmFtZSIsImNvbnN0YW50IiwicmVzdWx0Iiwia2V5IiwidHBsIiwic3RhcnRzV2l0aCIsImNvbXBvbmVudElkIiwicCIsInVpUG9ydCIsInVpIiwiZmV0Y2giLCJtZXRob2QiLCJjYXRjaCIsImUiLCJkaW0iLCJtZXNzYWdlIiwiZm9ybSIsInRlbXBsYXRlT3B0aW9ucyIsIl9nZW5lcmF0ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLEdBQUcsUUFBUSx1QkFBdUI7QUFDM0MsT0FBT0MsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ3pELE9BQU9DLGdCQUFnQixhQUFhO0FBQ3BDLFNBQVNDLFNBQVMsUUFBUSxZQUFZO0FBQ3RDLE9BQU9DLFFBQVFDLE9BQU8sUUFBUSxPQUFPO0FBQ3JDLFNBQVNDLEtBQUssRUFBRUMsTUFBTSxRQUFRLFVBQVU7QUFFeEMsU0FBU0MsY0FBYyxRQUFRLHVCQUFvQjtBQUNuRCxTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBQ3ZDLFNBQVNDLGFBQWEsUUFBZ0MsOEJBQTJCO0FBQ2pGLFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFDdkMsU0FBU0MsZUFBZSxRQUFRLGtDQUErQjtBQUUvRCxTQUFTQyxXQUFXLFFBQThCLG9CQUFpQjtBQUNuRSxTQUFTQyxRQUFRLEVBQUVDLFdBQVcsUUFBUSwwQkFBdUI7QUFDN0QsU0FBU0MsVUFBVSxRQUFRLDJCQUF3QjtBQUNuRCxTQUFTQyxNQUFNLFFBQVEseUJBQXNCO0FBQzdDLFNBQVNDLE1BQU0sUUFBUSx1QkFBb0I7QUFFM0MsU0FBU0MsdUJBQXVCLFFBQVEsNEJBQXlCO0FBQ2pFLFNBQVNDLFlBQVksRUFBRUMsOEJBQThCLEVBQUVDLGNBQWMsUUFBUSxnQkFBYTtBQUMxRixTQUFTQyxnQkFBZ0IsRUFBRUMsY0FBYyxRQUFRLHNCQUFtQjtBQUNwRSxTQUFTQyxZQUFZLEVBQUVDLFNBQVMsUUFBUSx5QkFBc0I7QUFDOUQsU0FBd0JDLHFDQUFxQyxRQUFRLHFCQUFrQjtBQUN2RixTQUlFQyxRQUFRLEVBQ1JDLFVBQVUsRUFDVkMsU0FBUyxRQUNKLHFCQUFrQjtBQU16QixPQUFPLE1BQU1DO0lBQ1hDLE9BQW1CLEVBQUUsQ0FBQztJQUN0QkMsUUFBcUIsQ0FBQyxFQUFFO0lBQ3hCQyxTQUF1QixDQUFDLEVBQUU7SUFDMUJDLFlBQXFCLE1BQU07SUFFM0I7Ozs7R0FJQyxHQUNELE1BQU1DLE9BQXNCO1FBQzFCLE1BQU0sRUFBRUMsT0FBTyxFQUFFLEdBQUc1QixPQUFPNkIsTUFBTSxDQUFDRixJQUFJO1FBRXRDLG1DQUFtQztRQUNuQyxNQUFNLElBQUksQ0FBQ0csbUJBQW1CLENBQUNGO1FBRS9CLHFDQUFxQztRQUNyQyxNQUFNRyxlQUFlLE1BQU1uQjtRQUMzQixJQUFJbUIsYUFBYUMsTUFBTSxLQUFLLEdBQUc7WUFDN0JDLFFBQVFDLEdBQUcsQ0FBQzdDLE1BQU04QyxLQUFLLENBQUNDLE9BQU8sQ0FBQzdCLFdBQVc7WUFDM0M7UUFDRjtRQUVBLGdDQUFnQztRQUNoQyxxQ0FBcUM7UUFDckMsTUFBTUcsd0JBQ0o7WUFDRSx1QkFBdUI7WUFDdkIsTUFBTSxJQUFJLENBQUMyQixhQUFhLENBQUNOO1lBRXpCLCtCQUErQjtZQUMvQixNQUFNbEI7UUFDUixHQUNBO1lBQUV5QixpQkFBaUI7WUFBV0MsYUFBYTtRQUFNO0lBRXJEO0lBRUE7Ozs7O0dBS0MsR0FDRCxNQUFNQyxnQkFBZ0JDLEtBQWEsRUFBRUMsWUFBMEIsRUFBaUI7UUFDOUUsSUFBSUQsVUFBVSxZQUFZQSxVQUFVLFNBQVNBLFVBQVUsVUFBVTtZQUMvRDtRQUNGO1FBRUEsNENBQTRDO1FBQzVDLHlDQUF5QztRQUN6Qyw4QkFBOEI7UUFDOUIsb0VBQW9FO1FBQ3BFLElBQUksQ0FBQ2pDLFVBQVU7WUFDYixNQUFNbUMsbUJBQW9CLE1BQU14RCxJQUFJeUQsY0FBYyxDQUFDRixjQUFjRDtZQUVqRSxJQUFJRSxpQkFBaUJYLE1BQU0sR0FBRyxHQUFHO2dCQUMvQkMsUUFBUUMsR0FBRyxDQUFDN0MsTUFBTXdELElBQUksQ0FBQyxDQUFDLGVBQWUsQ0FBQztnQkFFeEMsS0FBSyxNQUFNQyxtQkFBbUJILGlCQUFrQjtvQkFDOUMsbUZBQW1GO29CQUNuRiw0RkFBNEY7b0JBQzVGLDJGQUEyRjtvQkFDM0YsTUFBTUksY0FBYyxJQUFJLENBQUNDLCtCQUErQixDQUFDRjtvQkFDekQsSUFBSUMsWUFBWWYsTUFBTSxHQUFHLEdBQUc7d0JBQzFCQyxRQUFRQyxHQUFHLENBQ1Q3QyxNQUFNNEQsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFdEQsS0FBS3VELFFBQVEsQ0FBQ2xELE9BQU9tRCxXQUFXLEVBQUVMLGtCQUFrQixHQUNwRXpELE1BQU0rRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUVMLFlBQVlmLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBRWxELE9BQU87d0JBQ0xDLFFBQVFDLEdBQUcsQ0FBQzdDLE1BQU00RCxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUV0RCxLQUFLdUQsUUFBUSxDQUFDbEQsT0FBT21ELFdBQVcsRUFBRUwsa0JBQWtCO29CQUNsRjtnQkFDRjtZQUNGO1FBQ0Y7UUFFQSxNQUFNTyx3QkFBd0JDLE9BQU9DLE1BQU0sQ0FBQ3JDLHlDQUF5Q3NDLElBQUksQ0FDdkYsQ0FBQ0MsVUFBWS9ELFVBQVVnRCxjQUFjZTtRQUd2QyxzQkFBc0I7UUFDdEIsSUFBSUosdUJBQXVCO1lBQ3pCLE1BQU0sSUFBSSxDQUFDaEIsYUFBYSxDQUFDO2dCQUFDSzthQUFhO1FBQ3pDO1FBRUEsMkJBQTJCO1FBQzNCLG1EQUFtRDtRQUNuRCxNQUFNLElBQUksQ0FBQ2dCLGFBQWE7UUFDeEIsTUFBTSxJQUFJLENBQUNDLGNBQWM7UUFDekIsTUFBTSxJQUFJLENBQUNDLFlBQVk7UUFFdkIsSUFBSSxDQUFDQyxNQUFNO0lBQ2I7SUFFQWIsZ0NBQ0VGLGVBQTZCLEVBQ007UUFDbkMsSUFBSSxDQUFDQSxnQkFBZ0JnQixRQUFRLENBQUMsWUFBWSw4QkFBOEIsTUFBSztZQUMzRSxPQUFPLEVBQUU7UUFDWDtRQUVBLE1BQU1DLFdBQVc5RCxjQUFjK0QsbUJBQW1CLENBQUNsQjtRQUNuRCxNQUFNbUIsV0FBV2xFLGVBQWVtRSxNQUFNLENBQUMsQ0FBQ0MsTUFBUUEsSUFBSUMsU0FBUyxLQUFLLEdBQUdMLFNBQVMsS0FBSyxDQUFDO1FBQ3BGLEtBQUssTUFBTUksT0FBT0YsU0FBVTtZQUMxQmxFLGVBQWVzRSxNQUFNLENBQUN0RSxlQUFldUUsT0FBTyxDQUFDSCxNQUFNO1FBQ3JEO1FBRUEsT0FBT0Y7SUFDVDtJQUVBLE1BQU1uQyxvQkFBb0JGLE9BQWlCLEVBQWlCO1FBQzFELEtBQUssTUFBTTJDLFVBQVUzQyxRQUFTO1lBQzVCLHNDQUFzQztZQUN0QywrREFBK0Q7WUFDL0Qsb0JBQW9CO1lBQ3BCLE1BQU00QyxVQUFVN0UsS0FBSzhFLElBQUksQ0FDdkIsWUFBWTdFLE9BQU8sQ0FBQzhFLE9BQU8sQ0FBQyxVQUFVLFVBQ3RDLENBQUMsVUFBVSxFQUFFSCxPQUFPLGNBQWMsQ0FBQztZQUVyQyxJQUFJLENBQUUsTUFBTTlELE9BQU8rRCxVQUFXO2dCQUM1QjtZQUNGO1lBQ0EsSUFBSSxDQUFFLE1BQU0vRCxPQUFPZCxLQUFLOEUsSUFBSSxDQUFDekUsT0FBTzJFLFdBQVcsRUFBRUosVUFBVztnQkFDMUQsTUFBTSxJQUFJSyxNQUNSLENBQUMsMENBQTBDLEVBQUVMLE9BQU8seUZBQXlGLENBQUM7WUFFbEo7WUFFQSxxREFBcUQ7WUFDckQsTUFBTU0sV0FBV2xGLEtBQUs4RSxJQUFJLENBQUN6RSxPQUFPMkUsV0FBVyxFQUFFSixRQUFRO1lBRXZELG9FQUFvRTtZQUNwRSxJQUFJLENBQUUsTUFBTTlELE9BQU9kLEtBQUtDLE9BQU8sQ0FBQ2lGLFlBQWE7Z0JBQzNDLE1BQU12RixNQUFNSyxLQUFLQyxPQUFPLENBQUNpRixXQUFXO29CQUFFQyxXQUFXO2dCQUFLO2dCQUN0RDdDLFFBQVE4QyxJQUFJLENBQUMsQ0FBQyxtQkFBbUIsRUFBRXBGLEtBQUtDLE9BQU8sQ0FBQ2lGLFVBQVUsMkJBQTJCLENBQUM7WUFDeEY7WUFFQSxJQUFJLE1BQU1sRSxhQUFhNkQsU0FBU0ssV0FBVztnQkFDekM7WUFDRjtZQUVBLE1BQU1yRixVQUFVcUYsVUFBVSxNQUFNdEYsU0FBU2lGO1lBRXpDLENBQUNoRSxZQUNDeUIsUUFBUUMsR0FBRyxDQUNUN0MsTUFBTXdELElBQUksQ0FBQyxjQUFjeEQsTUFBTTRELElBQUksQ0FBQ3RELEtBQUt1RCxRQUFRLENBQUNsRCxPQUFPMkUsV0FBVyxFQUFFRTtRQUU1RTtJQUNGO0lBRUEsTUFBTW5CLGdCQUFnQjtRQUNwQixJQUFJLENBQUNsQyxLQUFLLEdBQUcsTUFBTUg7SUFDckI7SUFFQSxNQUFNc0MsaUJBQWlCO1FBQ3JCLElBQUksQ0FBQ2xDLE1BQU0sR0FBRyxNQUFNTDtJQUN0QjtJQUVBLE1BQU13QyxlQUFlO1FBQ25CLElBQUksQ0FBQ3JDLElBQUksR0FBRyxNQUFNSjtJQUNwQjtJQUVBOzs7OztHQUtDLEdBQ0QsTUFBTWtCLGNBQWMyQyxhQUE2QixFQUFvQztRQUNuRixNQUFNQyxhQUFhLElBQUksQ0FBQ0MsbUJBQW1CLENBQUNGO1FBQzVDLE1BQU1HLFlBQVk3QixPQUFPOEIsSUFBSSxDQUFDSDtRQUU5QixxQkFBcUI7UUFDckIsYUFBYTtRQUNiLElBQUlFLFVBQVVFLFFBQVEsQ0FBQyxXQUFXO1lBQ2hDLE1BQU0sSUFBSSxDQUFDQyxrQkFBa0IsQ0FBQ0wsWUFBWUU7UUFDNUM7UUFFQSxtQ0FBbUM7UUFDbkMsb0NBQW9DO1FBQ3BDLElBQ0VBLFVBQVVFLFFBQVEsQ0FBQyxZQUNuQkYsVUFBVUUsUUFBUSxDQUFDLGdCQUNuQkYsVUFBVUUsUUFBUSxDQUFDLGNBQ25CO1lBQ0EsTUFBTSxJQUFJLENBQUNFLHVDQUF1QyxDQUFDTjtRQUNyRDtRQUVBLGFBQWE7UUFDYixJQUFJRSxVQUFVRSxRQUFRLENBQUMsWUFBWUYsVUFBVUUsUUFBUSxDQUFDLFVBQVU7WUFDOUQsTUFBTSxJQUFJLENBQUNHLHdCQUF3QixDQUFDUDtRQUN0QztRQUVBLGNBQWM7UUFDZCxJQUFJRSxVQUFVRSxRQUFRLENBQUMsV0FBVztZQUNoQyxNQUFNLElBQUksQ0FBQ0ksZ0JBQWdCO1FBQzdCO1FBRUEsT0FBTztZQUNMTjtRQUNGO0lBQ0Y7SUFFQUQsb0JBQW9CUSxTQUF5QixFQUFjO1FBQ3pELE9BQU83RixNQUFNNkYsV0FBVyxDQUFDQztZQUN2QixNQUFNQyxVQUFVRCxFQUFFRSxLQUFLLENBQUM7WUFDeEIsT0FBT0QsU0FBUyxDQUFDLEVBQUUsSUFBSTtRQUN6QjtJQUNGO0lBRUEsTUFBTU4sbUJBQW1CTCxVQUFzQixFQUFFRSxTQUFtQixFQUFpQjtRQUNuRmpGLE1BQU00RixDQUFDLENBQUMsc0JBQXNCO1lBQUViO1lBQVlFO1FBQVU7UUFFdEQsTUFBTWxGLGNBQWM4RixNQUFNO1FBRTFCLDZCQUE2QjtRQUM3QixrQ0FBa0M7UUFDbEMsTUFBTWhDLFdBQVc5RCxjQUFjK0QsbUJBQW1CLENBQUNpQixXQUFXZSxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBRXpFLElBQUlqQyxVQUFVO1lBQ1osTUFBTWlDLFNBQVMvRixjQUFjZ0csR0FBRyxDQUFDbEM7WUFDakMsZ0NBQWdDO1lBQ2hDLE1BQU1tQyxlQUFldkcsS0FBSzhFLElBQUksQ0FDNUJ6RSxPQUFPbUQsV0FBVyxFQUNsQixDQUFDLGdCQUFnQixFQUFFNkMsT0FBT0csS0FBSyxDQUFDQyxFQUFFLENBQUMsQ0FBQyxFQUFFSixPQUFPRyxLQUFLLENBQUNDLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFFbEUsSUFBSUosT0FBT0ssUUFBUSxLQUFLQyxhQUFhLENBQUUsTUFBTTdGLE9BQU95RixlQUFnQjtnQkFDbEUsTUFBTXBGLGlCQUFpQixjQUFjO29CQUFFaUQ7Z0JBQVM7WUFDbEQ7UUFDRjtRQUVBLE1BQU0sSUFBSSxDQUFDd0MscUJBQXFCO1FBRWhDdEIsV0FBV3VCLFNBQVMsR0FBRzFHLE9BQU87ZUFDeEJtRixXQUFXdUIsU0FBUyxJQUFJLEVBQUU7WUFDOUI3RyxLQUFLOEUsSUFBSSxDQUFDekUsT0FBT21ELFdBQVcsRUFBRTtTQUMvQjtRQUNEZ0MsVUFBVXNCLElBQUksQ0FBQztJQUNqQjtJQUVBLE1BQU1sQix3Q0FBd0NOLFVBQXNCLEVBQXVCO1FBQ3pGLE1BQU15QixVQUFVNUcsT0FBTztlQUNqQm1GLFdBQVd6RCxLQUFLLElBQUksRUFBRTtlQUN0QnlELFdBQVcwQixTQUFTLElBQUksRUFBRTtlQUMxQjFCLFdBQVd1QixTQUFTLElBQUksRUFBRTtTQUMvQjtRQUNEdEcsTUFBTTRGLENBQUMsQ0FBQywyQ0FBMkM7WUFBRWI7UUFBVztRQUVoRSxlQUFlO1FBQ2YsZ0JBQWdCO1FBQ2hCLHdJQUF3STtRQUN4SSxNQUFNO1FBQ04sS0FBSztRQUVMLE1BQU0sSUFBSSxDQUFDMkIsd0JBQXdCLENBQUNGO1FBRXBDLE9BQU8sRUFBRTtJQUNYO0lBRUEsTUFBTWxCLHlCQUF5QlAsVUFBc0IsRUFBaUI7UUFDcEUvRSxNQUFNNEYsQ0FBQyxDQUFDLDRCQUE0QjtZQUFFYjtRQUFXO1FBQ2pELE1BQU00QixjQUFjO2VBQUs1QixXQUFXNkIsS0FBSyxJQUFJLEVBQUU7ZUFBTzdCLFdBQVc4QixLQUFLLElBQUksRUFBRTtTQUFFO1FBRTlFLGVBQWU7UUFDZixnQkFBZ0I7UUFDaEIsOEhBQThIO1FBQzlILE1BQU07UUFDTixLQUFLO1FBRUwsa0RBQWtEO1FBQ2xELDBDQUEwQztRQUMxQyxNQUFNLElBQUksQ0FBQ3BELGNBQWM7UUFDekIsTUFBTSxJQUFJLENBQUNELGFBQWE7UUFDeEIsTUFBTSxJQUFJLENBQUNFLFlBQVk7UUFFdkIsTUFBTW9ELFNBRUFILFlBQVlJLEdBQUcsQ0FBQyxDQUFDQztZQUNyQixJQUFJQSxVQUFVcEQsUUFBUSxDQUFDLGNBQWM7Z0JBQ25DLE1BQU1DLFdBQVc5RCxjQUFjK0QsbUJBQW1CLENBQUNrRDtnQkFDbkQ5SCxPQUFPMkU7Z0JBQ1AsT0FBTztvQkFDTG9ELGFBQWFsSCxjQUFjbUgsY0FBYyxDQUFDckQ7Z0JBQzVDO1lBQ0Y7WUFDQSxJQUFJbUQsVUFBVXBELFFBQVEsQ0FBQyxjQUFjO2dCQUNuQyxNQUFNLEdBQUd1RCxVQUFVLEdBQUdILFVBQVVyQixLQUFLLENBQUMsMkJBQTJCLEVBQUU7Z0JBQ25FekcsT0FBT2lJO2dCQUNQLHFEQUFxRDtnQkFDckQsTUFBTUMsVUFBVTdILFdBQVc4SCxRQUFRLENBQUNGO2dCQUNwQyxPQUFPO29CQUNMRixhQUFhbEgsY0FBY21ILGNBQWMsQ0FBQ0U7Z0JBQzVDO1lBQ0Y7WUFDQSxNQUFNLElBQUkxQyxNQUFNO1FBQ2xCO1FBRUEsTUFBTSxJQUFJLENBQUM0QyxzQkFBc0IsQ0FBQ1I7UUFDbEMsTUFBTSxJQUFJLENBQUNTLG1CQUFtQjtJQUNoQztJQUVBLDhCQUE4QjtJQUM5QixNQUFNaEMsbUJBQW1CO1FBQ3ZCLE1BQU0sRUFBRWlDLElBQUksRUFBRUMsSUFBSSxFQUFFLEdBQUczSCxPQUFPNkIsTUFBTSxDQUFDK0YsTUFBTSxDQUFDQyxNQUFNLElBQUksQ0FBQztRQUN2RCxNQUFNQyxVQUFVLENBQUMsU0FBUyxFQUFFSixRQUFRLFlBQVksV0FBVyxFQUFFQyxRQUFRLE1BQU07UUFFM0V6SCxNQUFNNEYsQ0FBQyxDQUFDLG9CQUFvQjtZQUFFZ0M7UUFBUTtRQUN0QyxNQUFNQyxRQUFRQyxHQUFHLENBQ2ZoSSxPQUFPNkIsTUFBTSxDQUFDRixJQUFJLENBQUNDLE9BQU8sQ0FBQ3FGLEdBQUcsQ0FBQyxPQUFPMUM7WUFDcEMsTUFBTS9FLFVBQVVHLEtBQUs4RSxJQUFJLENBQUN6RSxPQUFPMkUsV0FBVyxFQUFFSixRQUFRLGdCQUFnQnVEO1FBQ3hFO0lBRUo7SUFFQTs7O0dBR0MsR0FDRCxNQUFNdkIsd0JBQWlEO1FBQ3JELE9BQU8sQUFDTCxDQUFBLE1BQU13QixRQUFRQyxHQUFHLENBQUM7WUFDaEJsSCxpQkFBaUIsaUJBQWlCLENBQUMsR0FBRztnQkFBRW1ILFdBQVc7WUFBSztZQUN4RG5ILGlCQUFpQixhQUFhLENBQUMsR0FBRztnQkFBRW1ILFdBQVc7WUFBSztTQUNyRCxDQUFBLEVBRUFDLElBQUksR0FDSkEsSUFBSTtJQUNUO0lBRUE7Ozs7R0FJQyxHQUNELE1BQU1WLHVCQUNKVyxXQUVHLEVBQ2dCO1FBQ25CakksTUFBTTRGLENBQUMsQ0FBQywwQkFBMEJxQztRQUNsQyxPQUFPLEFBQ0wsQ0FBQSxNQUFNSixRQUFRQyxHQUFHLENBQ2ZHLFlBQVlsQixHQUFHLENBQUMsT0FBT0QsU0FDckJsRyxpQkFBaUIsV0FBV2tHLFFBQXNDO2dCQUNoRWlCLFdBQVc7WUFDYixJQUVKLEVBRUNDLElBQUksR0FDSkEsSUFBSTtJQUNUO0lBRUE7OztHQUdDLEdBQ0QsTUFBTVQsc0JBQTZDO1FBQ2pELE1BQU0sQ0FBQ1csSUFBSSxHQUFHLE1BQU10SCxpQkFDbEIsa0JBQ0E7WUFBRWlELFVBQVU7UUFBUSxHQUNwQjtZQUFFa0UsV0FBVztRQUFLO1FBRXBCN0ksT0FBT2dKO1FBQ1AsT0FBT0E7SUFDVDtJQUVBOzs7O0dBSUMsR0FDRCxNQUFNeEIseUJBQXlCRixPQUF1QixFQUFxQjtRQUN6RSxNQUFNLEVBQUU5RSxPQUFPLEVBQUUsR0FBRzVCLE9BQU82QixNQUFNLENBQUNGLElBQUk7UUFDdEMsTUFBTSxFQUFFMEcsS0FBS0MsTUFBTSxFQUFFLEdBQUd0SSxPQUFPNkIsTUFBTSxDQUFDc0MsR0FBRztRQUV6QyxPQUFPLEFBQ0wsQ0FBQSxNQUFNNEQsUUFBUUMsR0FBRyxDQUNmcEcsUUFBUXFGLEdBQUcsQ0FBQyxPQUFPMUMsU0FDakJ3RCxRQUFRQyxHQUFHLENBQ1R0QixRQUFRTyxHQUFHLENBQUMsT0FBT3NCO2dCQUNqQixNQUFNQyxNQUFNRCxRQUNUN0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFNEQsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRS9ELE9BQU8sQ0FBQyxDQUFDLEVBQ3BDRyxPQUFPLENBQUMsaUJBQWlCO2dCQUM1QixNQUFNMkQsTUFBTXpJLFFBQVE0STtnQkFDcEIsSUFBSSxDQUFFLE1BQU0vSCxPQUFPNEgsTUFBTztvQkFDeEIsTUFBTS9JLE1BQU0rSSxLQUFLO3dCQUFFdkQsV0FBVztvQkFBSztnQkFDckM7Z0JBQ0EsQ0FBQ3RFLFlBQ0N5QixRQUFRQyxHQUFHLENBQ1Q3QyxNQUFNd0QsSUFBSSxDQUFDLGNBQWN4RCxNQUFNNEQsSUFBSSxDQUFDdUYsSUFBSTlELE9BQU8sQ0FBQyxHQUFHMUUsT0FBTzJFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFFOUUsTUFBTSxJQUFJLENBQUM4RCwrQkFBK0IsQ0FBQ0YsU0FBU0M7Z0JBQ3BELE9BQU9BO1lBQ1QsS0FHTixFQUNBTixJQUFJO0lBQ1I7SUFFQSxNQUFjTyxnQ0FBZ0NDLFFBQWdCLEVBQUVDLE1BQWMsRUFBRTtRQUM5RSxJQUFJLENBQUUsTUFBTWxJLE9BQU9pSSxXQUFZO1lBQzdCO1FBQ0Y7UUFFQSxNQUFNRSxpQkFBaUIsQUFBQyxDQUFBLE1BQU1ySixTQUFTbUosU0FBUSxFQUFHRyxRQUFRO1FBRTFELE1BQU1DLGlCQUFpQixBQUFDLENBQUE7WUFDdEIsTUFBTUMsTUFBTUgsZUFBZWxFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0IsQ0FBQztZQUM3RSxPQUFPcUU7UUFDVCxDQUFBO1FBQ0EsT0FBT3ZKLFVBQVVtSixRQUFRRztJQUMzQjtJQUVBOzs7Ozs7R0FNQyxHQUNELE1BQU1FLG1CQUNKakYsUUFBZ0IsRUFDaEJrRixXQUF3QixFQUN4QkMsTUFBZSxFQUNvRDtRQUNuRSxNQUFNLEVBQUUzRSxNQUFNLEVBQUU1RSxNQUFNd0osT0FBTyxFQUFFLEdBQUdoSixnQkFBZ0I4RixHQUFHLENBQUNnRCxhQUFhRyxnQkFBZ0IsQ0FDakZuSixjQUFjbUgsY0FBYyxDQUFDckQsV0FDN0JtRjtRQUdGLE1BQU1HLFVBQVUxSixLQUFLOEUsSUFBSSxDQUFDRixRQUFRNEU7UUFDbEMsTUFBTUcsV0FBVzNKLEtBQUs4RSxJQUFJLENBQUN6RSxPQUFPMkUsV0FBVyxFQUFFMEU7UUFDL0MsT0FBTztZQUNMQTtZQUNBQztZQUNBQyxVQUFVLE1BQU05SSxPQUFPNkk7UUFDekI7SUFDRjtJQUVBOzs7OztHQUtDLEdBQ0QsTUFBTUUsWUFDSnpGLFFBQWdCLEVBQ2hCMEYsS0FFQyxFQUNvRDtRQUNyRCxNQUFNckUsT0FBc0JoRixZQUFZc0osT0FBTztRQUMvQyxNQUFNdkQsUUFBUWxHLGNBQWNtSCxjQUFjLENBQUNyRDtRQUMzQyxNQUFNNEYsWUFBWXJHLE9BQU84QixJQUFJLENBQUNxRSxPQUFPdkYsTUFBTSxDQUFDLENBQUMwRixPQUFTQSxTQUFTekQsTUFBTTBELFFBQVE7UUFFN0UsT0FBTyxNQUFNdkosWUFDWDhFLE1BQ0EsT0FBTzBFLFFBQVFDO1lBQ2IsTUFBTUMsTUFBTTdKLGdCQUFnQjhGLEdBQUcsQ0FBQzhEO1lBQ2hDLElBQUlBLElBQUlFLFVBQVUsQ0FBQyxlQUFlO2dCQUNoQyxNQUFNNUosU0FBU3NKLFdBQVcsT0FBT087b0JBQy9CLE1BQU0sRUFBRTNGLE1BQU0sRUFBRTVFLE1BQU13SyxDQUFDLEVBQUUsR0FBR0gsSUFBSVosZ0JBQWdCLENBQUNqRCxPQUFPK0Q7b0JBQ3hESixNQUFNLENBQUMsR0FBR0MsSUFBSSxFQUFFLEVBQUVHLGFBQWEsQ0FBQyxHQUFHLE1BQU16SixPQUN2Q2QsS0FBSzhFLElBQUksQ0FBQ3pFLE9BQU8yRSxXQUFXLEVBQUVKLFFBQVE0RjtnQkFFMUM7Z0JBQ0EsT0FBT0w7WUFDVDtZQUVBLE1BQU0sRUFBRXZGLE1BQU0sRUFBRTVFLE1BQU13SyxDQUFDLEVBQUUsR0FBR0gsSUFBSVosZ0JBQWdCLENBQUNqRDtZQUNqRCxNQUFNLEVBQUV2RSxPQUFPLEVBQUUsR0FBRzVCLE9BQU82QixNQUFNLENBQUNGLElBQUk7WUFDdEMsSUFBSTRDLE9BQU9jLFFBQVEsQ0FBQyxZQUFZO2dCQUM5QixNQUFNaEYsU0FBU3VCLFNBQVMsT0FBT2tFO29CQUM3QmdFLE1BQU0sQ0FBQyxHQUFHQyxJQUFJLEVBQUUsRUFBRWpFLEdBQUcsQ0FBQyxHQUFHLE1BQU1yRixPQUM3QmQsS0FBSzhFLElBQUksQ0FBQ3pFLE9BQU8yRSxXQUFXLEVBQUVKLE9BQU9HLE9BQU8sQ0FBQyxXQUFXb0IsSUFBSXFFO2dCQUVoRTtZQUNGLE9BQU87Z0JBQ0xMLE1BQU0sQ0FBQ0MsSUFBSSxHQUFHLE1BQU10SixPQUFPZCxLQUFLOEUsSUFBSSxDQUFDekUsT0FBTzJFLFdBQVcsRUFBRUosUUFBUTRGO1lBQ25FO1lBRUEsT0FBT0w7UUFDVCxHQUNBLENBQUM7SUFFTDtJQUVBakcsU0FBUztRQUNQLE1BQU11RyxTQUFTcEssT0FBTzZCLE1BQU0sQ0FBQ3dJLEVBQUUsRUFBRTFDLFFBQVE7UUFFekMsSUFBSSxDQUFDbkgsVUFBVTtZQUNiOEosTUFBTSxDQUFDLGlCQUFpQixFQUFFRixPQUFPLFdBQVcsQ0FBQyxFQUFFO2dCQUM3Q0csUUFBUTtZQUNWLEdBQUdDLEtBQUssQ0FBQyxDQUFDQyxJQUFNeEksUUFBUUMsR0FBRyxDQUFDN0MsTUFBTXFMLEdBQUcsQ0FBQyxDQUFDLDRCQUE0QixFQUFFRCxFQUFFRSxPQUFPLEVBQUU7UUFDbEY7SUFDRjtJQUVBOztHQUVDLEdBQ0QsTUFBTTNKLGFBQWE0SixJQUErQixFQUFFO1FBQ2xELE9BQU8sTUFBTTVKLGFBQWE0SjtJQUM1QjtJQUVBOztHQUVDLEdBQ0QsTUFBTTNKLFVBQVU4QyxRQUFnQixFQUFtQztRQUNqRSxPQUFPLE1BQU05QyxVQUFVOEM7SUFDekI7SUFFQTs7R0FFQyxHQUNELE1BQU1qRCxpQkFDSmlKLEdBQU0sRUFDTmMsZUFBbUMsRUFDbkNDLGdCQUFrQyxFQUNUO1FBQ3pCLE9BQU8sTUFBTWhLLGlCQUFpQmlKLEtBQUtjLGlCQUFpQkM7SUFDdEQ7SUFFQTs7R0FFQyxHQUNELE1BQU0vSixlQUNKZ0osR0FBTSxFQUNOYyxlQUFtQyxFQUNYO1FBQ3hCLE9BQU8sTUFBTTlKLGVBQWVnSixLQUFLYztJQUNuQztJQUVBOztHQUVDLEdBQ0QsTUFBTWhLLGlCQUFnQztRQUNwQyxPQUFPLE1BQU1BO0lBQ2Y7QUFDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"generated.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/generated.template.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AACF,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB;;;;IAOhB,MAAM;;;;;;;IAmGN,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAqBrD,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,UAAU;IAsD9E,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAiD9D,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;CA8CvD"}
1
+ {"version":3,"file":"generated.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/generated.template.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AACF,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB;;;;IAOhB,MAAM;;;;;;;IAmGN,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAqBrD,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,UAAU;IAgG9E,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAiD9D,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;CA8CvD"}