cdk-dms-replication 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,402 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.DmsEndpoint = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const cdk = require("aws-cdk-lib");
7
+ const dms = require("aws-cdk-lib/aws-dms");
8
+ const constructs_1 = require("constructs");
9
+ const enums_1 = require("./enums");
10
+ /**
11
+ * A DMS endpoint construct supporting every engine that DMS supports.
12
+ *
13
+ * Set `engine` to the desired {@link EndpointEngine} and supply the
14
+ * matching `*Settings` property. All other `*Settings` properties are
15
+ * ignored at runtime.
16
+ *
17
+ * @example
18
+ * // MySQL source
19
+ * new DmsEndpoint(this, 'Source', {
20
+ * endpointType: EndpointType.SOURCE,
21
+ * engine: EndpointEngine.MYSQL,
22
+ * serverName: 'mysql.example.com',
23
+ * port: 3306,
24
+ * username: 'dms_user',
25
+ * password: cdk.SecretValue.ssmSecure('/dms/mysql/password'),
26
+ * databaseName: 'mydb',
27
+ * });
28
+ */
29
+ class DmsEndpoint extends constructs_1.Construct {
30
+ static validateEngineEndpointType(engine, endpointType) {
31
+ if (endpointType === enums_1.EndpointType.SOURCE &&
32
+ DmsEndpoint.TARGET_ONLY_ENGINES.includes(engine)) {
33
+ throw new Error(`Engine '${engine}' is only supported as a TARGET endpoint, not as a SOURCE.`);
34
+ }
35
+ if (endpointType === enums_1.EndpointType.TARGET &&
36
+ DmsEndpoint.SOURCE_ONLY_ENGINES.includes(engine)) {
37
+ throw new Error(`Engine '${engine}' is only supported as a SOURCE endpoint, not as a TARGET.`);
38
+ }
39
+ }
40
+ constructor(scope, id, props) {
41
+ super(scope, id);
42
+ DmsEndpoint.validateEngineEndpointType(props.engine, props.endpointType);
43
+ const endpointIdentifier = props.endpointIdentifier ??
44
+ cdk.Names.uniqueResourceName(this, { maxLength: 63 }).toLowerCase();
45
+ this.cfnEndpoint = new dms.CfnEndpoint(this, 'Resource', {
46
+ endpointType: props.endpointType,
47
+ engineName: props.engine,
48
+ endpointIdentifier,
49
+ serverName: props.serverName,
50
+ port: props.port,
51
+ username: props.username,
52
+ password: props.password?.unsafeUnwrap(),
53
+ databaseName: props.databaseName,
54
+ extraConnectionAttributes: props.extraConnectionAttributes,
55
+ certificateArn: props.certificateArn,
56
+ sslMode: props.sslMode ?? 'none',
57
+ // Engine-specific settings — only one should be set per endpoint
58
+ mySqlSettings: this.buildMySqlSettings(props),
59
+ postgreSqlSettings: this.buildPostgreSqlSettings(props),
60
+ oracleSettings: this.buildOracleSettings(props),
61
+ microsoftSqlServerSettings: this.buildSqlServerSettings(props),
62
+ sybaseSettings: this.buildSapAseSettings(props),
63
+ ibmDb2Settings: this.buildDb2Settings(props),
64
+ mongoDbSettings: this.buildMongoDbSettings(props),
65
+ s3Settings: this.buildS3Settings(props),
66
+ dynamoDbSettings: this.buildDynamoDbSettings(props),
67
+ redshiftSettings: this.buildRedshiftSettings(props),
68
+ kinesisSettings: this.buildKinesisSettings(props),
69
+ kafkaSettings: this.buildKafkaSettings(props),
70
+ elasticsearchSettings: this.buildOpenSearchSettings(props),
71
+ neptuneSettings: this.buildNeptuneSettings(props),
72
+ redisSettings: this.buildRedisSettings(props),
73
+ docDbSettings: this.buildDocDbSettings(props),
74
+ });
75
+ this.cfnEndpoint.applyRemovalPolicy(props.removalPolicy ?? cdk.RemovalPolicy.DESTROY);
76
+ this.endpointArn = this.cfnEndpoint.ref;
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // Private mapping helpers — translate typed interfaces to CFN property shapes
80
+ // ---------------------------------------------------------------------------
81
+ buildMySqlSettings(props) {
82
+ const s = props.mySqlSettings;
83
+ if (!s)
84
+ return undefined;
85
+ return {
86
+ afterConnectScript: s.afterConnectScript,
87
+ cleanSourceMetadataOnMismatch: s.cleanSourceMetadataOnMismatch,
88
+ eventsPollInterval: s.eventsPollInterval,
89
+ maxFileSize: s.maxFileSize,
90
+ parallelLoadThreads: s.parallelLoadThreads,
91
+ secretsManagerAccessRoleArn: s.secretsManagerAccessRoleArn,
92
+ secretsManagerSecretId: s.secretsManagerSecretId,
93
+ serverTimezone: s.serverTimezone,
94
+ targetDbType: s.targetDbType,
95
+ };
96
+ }
97
+ buildPostgreSqlSettings(props) {
98
+ const s = props.postgreSqlSettings;
99
+ if (!s)
100
+ return undefined;
101
+ return {
102
+ afterConnectScript: s.afterConnectScript,
103
+ captureDdls: s.captureDdls,
104
+ ddlArtifactsSchema: s.ddlArtifactsSchema,
105
+ executeTimeout: s.executeTimeout,
106
+ failTasksOnLobTruncation: s.failTasksOnLobTruncation,
107
+ heartbeatEnable: s.heartbeatEnable,
108
+ heartbeatFrequency: s.heartbeatFrequency,
109
+ heartbeatSchema: s.heartbeatSchema,
110
+ mapBooleanAsBoolean: s.mapBooleanAsBoolean,
111
+ maxFileSize: s.maxFileSize,
112
+ pluginName: s.pluginName,
113
+ secretsManagerAccessRoleArn: s.secretsManagerAccessRoleArn,
114
+ secretsManagerSecretId: s.secretsManagerSecretId,
115
+ slotName: s.slotName,
116
+ };
117
+ }
118
+ buildOracleSettings(props) {
119
+ const s = props.oracleSettings;
120
+ if (!s)
121
+ return undefined;
122
+ return {
123
+ accessAlternateDirectly: s.accessAlternateDirectly,
124
+ addSupplementalLogging: s.addSupplementalLogging,
125
+ additionalArchivedLogDestId: s.additionalArchivedLogDestId,
126
+ allowSelectNestedTables: s.allowSelectNestedTables,
127
+ archivedLogDestId: s.archivedLogDestId,
128
+ archivedLogsOnly: s.archivedLogsOnly,
129
+ asmPassword: s.asmPassword?.unsafeUnwrap(),
130
+ asmServer: s.asmServer,
131
+ asmUser: s.asmUser,
132
+ charLengthSemantics: s.charLengthSemantics,
133
+ directPathNoLog: s.directPathNoLog,
134
+ directPathParallelLoad: s.directPathParallelLoad,
135
+ enableHomogenousTablespace: s.enableHomogenousTablespace,
136
+ extraArchivedLogDestIds: s.extraArchivedLogDestIds,
137
+ failTasksOnLobTruncation: s.failTasksOnLobTruncation,
138
+ numberDatatypeScale: s.numberDatatypeScale,
139
+ oraclePathPrefix: s.oraclePathPrefix,
140
+ parallelAsmReadThreads: s.parallelAsmReadThreads,
141
+ readAheadBlocks: s.readAheadBlocks,
142
+ readTableSpaceName: s.readTableSpaceName,
143
+ retryInterval: s.retryInterval,
144
+ secretsManagerAccessRoleArn: s.secretsManagerAccessRoleArn,
145
+ secretsManagerOracleAsmAccessRoleArn: s.secretsManagerOracleAsmAccessRoleArn,
146
+ secretsManagerOracleAsmSecretId: s.secretsManagerOracleAsmSecretId,
147
+ secretsManagerSecretId: s.secretsManagerSecretId,
148
+ securityDbEncryptionName: s.securityDbEncryptionName,
149
+ useAlternateFolderForOnline: s.useAlternateFolderForOnline,
150
+ useBFile: s.useBFile,
151
+ useDirectPathFullLoad: s.useDirectPathFullLoad,
152
+ useLogminerReader: s.useLogminerReader,
153
+ usePathPrefix: s.usePathPrefix,
154
+ };
155
+ }
156
+ buildSqlServerSettings(props) {
157
+ const s = props.sqlServerSettings;
158
+ if (!s)
159
+ return undefined;
160
+ return {
161
+ bcpPacketSize: s.bcpPacketSize,
162
+ controlTablesFileGroup: s.controlTablesFileGroup,
163
+ querySingleAlwaysOnNode: s.querySingleAlwaysOnNode,
164
+ readBackupOnly: s.readBackupOnly,
165
+ safeguardPolicy: s.safeguardPolicy,
166
+ secretsManagerAccessRoleArn: s.secretsManagerAccessRoleArn,
167
+ secretsManagerSecretId: s.secretsManagerSecretId,
168
+ useBcpFullLoad: s.useBcpFullLoad,
169
+ useThirdPartyBackupDevice: s.useThirdPartyBackupDevice,
170
+ trimSpaceInChar: s.trimSpaceInChar,
171
+ tlogAccessMode: s.tlogAccessMode,
172
+ };
173
+ }
174
+ buildSapAseSettings(props) {
175
+ const s = props.sapAseSettings;
176
+ if (!s)
177
+ return undefined;
178
+ return {
179
+ secretsManagerAccessRoleArn: s.secretsManagerAccessRoleArn,
180
+ secretsManagerSecretId: s.secretsManagerSecretId,
181
+ };
182
+ }
183
+ buildDb2Settings(props) {
184
+ const s = props.db2Settings;
185
+ if (!s)
186
+ return undefined;
187
+ return {
188
+ currentLsn: s.currentLsn,
189
+ maxKBytesPerRead: s.maxKBytesPerRead,
190
+ setDataCaptureChanges: s.setDataCaptureChanges,
191
+ secretsManagerAccessRoleArn: s.secretsManagerAccessRoleArn,
192
+ secretsManagerSecretId: s.secretsManagerSecretId,
193
+ };
194
+ }
195
+ buildMongoDbSettings(props) {
196
+ const s = props.mongoDbSettings;
197
+ if (!s)
198
+ return undefined;
199
+ return {
200
+ authMechanism: s.authMechanism,
201
+ authSource: s.authSource,
202
+ authType: s.authType,
203
+ docsToInvestigate: s.docsToInvestigate?.toString(),
204
+ extractDocId: s.extractDocId?.toString(),
205
+ nestingLevel: s.nestingLevel,
206
+ secretsManagerAccessRoleArn: s.secretsManagerAccessRoleArn,
207
+ secretsManagerSecretId: s.secretsManagerSecretId,
208
+ };
209
+ }
210
+ buildDocDbSettings(props) {
211
+ if (props.engine !== enums_1.EndpointEngine.DOCDB)
212
+ return undefined;
213
+ const s = props.mongoDbSettings;
214
+ if (!s)
215
+ return undefined;
216
+ return {
217
+ docsToInvestigate: s.docsToInvestigate,
218
+ extractDocId: s.extractDocId,
219
+ nestingLevel: s.nestingLevel,
220
+ secretsManagerAccessRoleArn: s.secretsManagerAccessRoleArn,
221
+ secretsManagerSecretId: s.secretsManagerSecretId,
222
+ };
223
+ }
224
+ buildS3Settings(props) {
225
+ const s = props.s3Settings;
226
+ if (!s)
227
+ return undefined;
228
+ return {
229
+ bucketName: s.bucketName,
230
+ bucketFolder: s.bucketFolder,
231
+ serviceAccessRoleArn: s.serviceAccessRoleArn,
232
+ addColumnName: s.addColumnName,
233
+ cdcInsertsAndUpdates: s.cdcInsertsAndUpdates,
234
+ cdcInsertsOnly: s.cdcInsertsOnly,
235
+ cdcMaxBatchInterval: s.cdcMaxBatchInterval,
236
+ cdcMinFileSize: s.cdcMinFileSize,
237
+ cdcPath: s.cdcPath,
238
+ csvDelimiter: s.csvDelimiter,
239
+ csvNoSupValue: s.csvNoSupValue,
240
+ csvNullValue: s.csvNullValue,
241
+ csvRowDelimiter: s.csvRowDelimiter,
242
+ dataFormat: s.dataFormat,
243
+ datePartitionDelimiter: s.datePartitionDelimiter,
244
+ datePartitionEnabled: s.datePartitionEnabled,
245
+ datePartitionSequence: s.datePartitionSequence,
246
+ dictPageSizeLimit: s.dictPageSizeLimit,
247
+ enableStatistics: s.enableStatistics,
248
+ encodingType: s.encodingType,
249
+ encryptionMode: s.encryptionMode,
250
+ externalTableDefinition: s.externalTableDefinition,
251
+ ignoreHeaderRows: s.ignoreHeaderRows,
252
+ includeOpForFullLoad: s.includeOpForFullLoad,
253
+ maxFileSize: s.maxFileSize,
254
+ parquetTimestampInMillisecond: s.parquetTimestampInMillisecond,
255
+ parquetVersion: s.parquetVersion,
256
+ preserveTransactions: s.preserveTransactions,
257
+ rfc4180: s.rfc4180,
258
+ rowGroupLength: s.rowGroupLength,
259
+ serverSideEncryptionKmsKeyId: s.serverSideEncryptionKmsKeyId,
260
+ timestampColumnName: s.timestampColumnName,
261
+ useCsvNoSupValue: s.useCsvNoSupValue,
262
+ useTaskStartTimeForFullLoadTimestamp: s.useTaskStartTimeForFullLoadTimestamp,
263
+ };
264
+ }
265
+ buildDynamoDbSettings(props) {
266
+ const s = props.dynamoDbSettings;
267
+ if (!s)
268
+ return undefined;
269
+ return { serviceAccessRoleArn: s.serviceAccessRoleArn };
270
+ }
271
+ buildRedshiftSettings(props) {
272
+ const s = props.redshiftSettings;
273
+ if (!s)
274
+ return undefined;
275
+ return {
276
+ acceptAnyDate: s.acceptAnyDate,
277
+ afterConnectScript: s.afterConnectScript,
278
+ bucketFolder: s.bucketFolder,
279
+ bucketName: s.bucketName,
280
+ caseSensitiveNames: s.caseSensitiveNames,
281
+ compUpdate: s.compUpdate,
282
+ connectionTimeout: s.connectionTimeout,
283
+ dateFormat: s.dateFormat,
284
+ emptyAsNull: s.emptyAsNull,
285
+ encryptionMode: s.encryptionMode,
286
+ explicitIds: s.explicitIds,
287
+ fileTransferUploadStreams: s.fileTransferUploadStreams,
288
+ loadTimeout: s.loadTimeout,
289
+ maxFileSize: s.maxFileSize,
290
+ removeQuotes: s.removeQuotes,
291
+ replaceInvalidChars: s.replaceInvalidChars,
292
+ replaceChars: s.replaceChars,
293
+ secretsManagerAccessRoleArn: s.secretsManagerAccessRoleArn,
294
+ secretsManagerSecretId: s.secretsManagerSecretId,
295
+ serverSideEncryptionKmsKeyId: s.serverSideEncryptionKmsKeyId,
296
+ serviceAccessRoleArn: s.serviceAccessRoleArn,
297
+ timeFormat: s.timeFormat,
298
+ trimBlanks: s.trimBlanks,
299
+ truncateColumns: s.truncateColumns,
300
+ writeBufferSize: s.writeBufferSize,
301
+ };
302
+ }
303
+ buildKinesisSettings(props) {
304
+ const s = props.kinesisSettings;
305
+ if (!s)
306
+ return undefined;
307
+ return {
308
+ streamArn: s.streamArn,
309
+ serviceAccessRoleArn: s.serviceAccessRoleArn,
310
+ includeControlDetails: s.includeControlDetails,
311
+ includeNullAndEmpty: s.includeNullAndEmpty,
312
+ includePartitionValue: s.includePartitionValue,
313
+ includeTableAlterOperations: s.includeTableAlterOperations,
314
+ includeTransactionDetails: s.includeTransactionDetails,
315
+ messageFormat: s.messageFormat,
316
+ noHexPrefix: s.noHexPrefix,
317
+ partitionIncludeSchemaTable: s.partitionIncludeSchemaTable,
318
+ };
319
+ }
320
+ buildKafkaSettings(props) {
321
+ const s = props.kafkaSettings;
322
+ if (!s)
323
+ return undefined;
324
+ return {
325
+ broker: s.broker,
326
+ topic: s.topic,
327
+ includeControlDetails: s.includeControlDetails,
328
+ includeNullAndEmpty: s.includeNullAndEmpty,
329
+ includePartitionValue: s.includePartitionValue,
330
+ includeTableAlterOperations: s.includeTableAlterOperations,
331
+ includeTransactionDetails: s.includeTransactionDetails,
332
+ messageFormat: s.messageFormat,
333
+ messageMaxBytes: s.messageMaxBytes,
334
+ noHexPrefix: s.noHexPrefix,
335
+ partitionIncludeSchemaTable: s.partitionIncludeSchemaTable,
336
+ securityProtocol: s.securityProtocol,
337
+ saslUserName: s.saslUsername,
338
+ saslPassword: s.saslPassword?.unsafeUnwrap(),
339
+ sslCaCertificateArn: s.sslCaCertificateArn,
340
+ sslClientCertificateArn: s.sslClientCertificateArn,
341
+ sslClientKeyArn: s.sslClientKeyArn,
342
+ sslClientKeyPassword: s.sslClientKeyPassword?.unsafeUnwrap(),
343
+ };
344
+ }
345
+ buildOpenSearchSettings(props) {
346
+ const s = props.openSearchSettings;
347
+ if (!s)
348
+ return undefined;
349
+ return {
350
+ endpointUri: s.endpointUri,
351
+ serviceAccessRoleArn: s.serviceAccessRoleArn,
352
+ errorRetryDuration: s.errorRetryDuration,
353
+ fullLoadErrorPercentage: s.fullLoadErrorPercentage,
354
+ };
355
+ }
356
+ buildNeptuneSettings(props) {
357
+ const s = props.neptuneSettings;
358
+ if (!s)
359
+ return undefined;
360
+ return {
361
+ s3BucketName: s.s3BucketName,
362
+ s3BucketFolder: s.s3BucketFolder,
363
+ serviceAccessRoleArn: s.serviceAccessRoleArn,
364
+ errorRetryDuration: s.errorRetryDuration,
365
+ iamAuthEnabled: s.iamAuthEnabled,
366
+ maxFileSize: s.maxFileSize,
367
+ maxRetryCount: s.maxRetryCount,
368
+ };
369
+ }
370
+ buildRedisSettings(props) {
371
+ const s = props.redisSettings;
372
+ if (!s)
373
+ return undefined;
374
+ return {
375
+ serverName: s.serverName,
376
+ port: s.port ?? 6379,
377
+ sslSecurityProtocol: s.sslSecurityProtocol,
378
+ authType: s.authType,
379
+ authUserName: s.authUserName,
380
+ authPassword: s.authPassword?.unsafeUnwrap(),
381
+ sslCaCertificateArn: s.sslCaCertificateArn,
382
+ };
383
+ }
384
+ }
385
+ exports.DmsEndpoint = DmsEndpoint;
386
+ _a = JSII_RTTI_SYMBOL_1;
387
+ DmsEndpoint[_a] = { fqn: "cdk-dms-replication.DmsEndpoint", version: "0.0.0" };
388
+ // ---------------------------------------------------------------------------
389
+ // Static validation data — declared first to satisfy member-ordering rules
390
+ // ---------------------------------------------------------------------------
391
+ DmsEndpoint.TARGET_ONLY_ENGINES = [
392
+ enums_1.EndpointEngine.DYNAMODB,
393
+ enums_1.EndpointEngine.KINESIS,
394
+ enums_1.EndpointEngine.KAFKA,
395
+ enums_1.EndpointEngine.OPENSEARCH,
396
+ enums_1.EndpointEngine.NEPTUNE,
397
+ enums_1.EndpointEngine.REDIS,
398
+ ];
399
+ DmsEndpoint.SOURCE_ONLY_ENGINES = [
400
+ enums_1.EndpointEngine.IBM_DB2_ZOS,
401
+ ];
402
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW5kcG9pbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBbUM7QUFDbkMsMkNBQTJDO0FBQzNDLDJDQUF1QztBQWtCdkMsbUNBQXVEO0FBbUl2RDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsc0JBQVM7SUFrQmhDLE1BQU0sQ0FBQywwQkFBMEIsQ0FDdkMsTUFBc0IsRUFDdEIsWUFBMEI7UUFFMUIsSUFDRSxZQUFZLEtBQUssb0JBQVksQ0FBQyxNQUFNO1lBQ3BDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQ2hELENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLFdBQVcsTUFBTSw0REFBNEQsQ0FDOUUsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUNFLFlBQVksS0FBSyxvQkFBWSxDQUFDLE1BQU07WUFDcEMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFDaEQsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQ2IsV0FBVyxNQUFNLDREQUE0RCxDQUM5RSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFZRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVCO1FBQy9ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsV0FBVyxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXpFLE1BQU0sa0JBQWtCLEdBQ3RCLEtBQUssQ0FBQyxrQkFBa0I7WUFDeEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV0RSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3ZELFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxVQUFVLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDeEIsa0JBQWtCO1lBQ2xCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRTtZQUN4QyxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLHlCQUF5QjtZQUMxRCxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7WUFDcEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksTUFBTTtZQUVoQyxpRUFBaUU7WUFDakUsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7WUFDN0Msa0JBQWtCLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQztZQUN2RCxjQUFjLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztZQUMvQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDO1lBQzlELGNBQWMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1lBQy9DLGNBQWMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO1lBQzVDLGVBQWUsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDO1lBQ2pELFVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUN2QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDO1lBQ25ELGdCQUFnQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7WUFDbkQsZUFBZSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7WUFDakQsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7WUFDN0MscUJBQXFCLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQztZQUMxRCxlQUFlLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQztZQUNqRCxhQUFhLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQztZQUM3QyxhQUFhLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQztTQUM5QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxhQUFhLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO0lBQzFDLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsOEVBQThFO0lBQzlFLDhFQUE4RTtJQUV0RSxrQkFBa0IsQ0FDeEIsS0FBdUI7UUFFdkIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUM5QixJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3pCLE9BQU87WUFDTCxrQkFBa0IsRUFBRSxDQUFDLENBQUMsa0JBQWtCO1lBQ3hDLDZCQUE2QixFQUFFLENBQUMsQ0FBQyw2QkFBNkI7WUFDOUQsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtZQUN4QyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7WUFDMUIsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQjtZQUMxQywyQkFBMkIsRUFBRSxDQUFDLENBQUMsMkJBQTJCO1lBQzFELHNCQUFzQixFQUFFLENBQUMsQ0FBQyxzQkFBc0I7WUFDaEQsY0FBYyxFQUFFLENBQUMsQ0FBQyxjQUFjO1lBQ2hDLFlBQVksRUFBRSxDQUFDLENBQUMsWUFBWTtTQUM3QixDQUFDO0lBQ0osQ0FBQztJQUVPLHVCQUF1QixDQUM3QixLQUF1QjtRQUV2QixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUM7UUFDbkMsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6QixPQUFPO1lBQ0wsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtZQUN4QyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7WUFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtZQUN4QyxjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWM7WUFDaEMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtZQUNwRCxlQUFlLEVBQUUsQ0FBQyxDQUFDLGVBQWU7WUFDbEMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtZQUN4QyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGVBQWU7WUFDbEMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQjtZQUMxQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7WUFDMUIsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVO1lBQ3hCLDJCQUEyQixFQUFFLENBQUMsQ0FBQywyQkFBMkI7WUFDMUQsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQjtZQUNoRCxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7U0FDckIsQ0FBQztJQUNKLENBQUM7SUFFTyxtQkFBbUIsQ0FDekIsS0FBdUI7UUFFdkIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztRQUMvQixJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3pCLE9BQU87WUFDTCx1QkFBdUIsRUFBRSxDQUFDLENBQUMsdUJBQXVCO1lBQ2xELHNCQUFzQixFQUFFLENBQUMsQ0FBQyxzQkFBc0I7WUFDaEQsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLDJCQUEyQjtZQUMxRCx1QkFBdUIsRUFBRSxDQUFDLENBQUMsdUJBQXVCO1lBQ2xELGlCQUFpQixFQUFFLENBQUMsQ0FBQyxpQkFBaUI7WUFDdEMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjtZQUNwQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUU7WUFDMUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO1lBQ3RCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTztZQUNsQixtQkFBbUIsRUFBRSxDQUFDLENBQUMsbUJBQW1CO1lBQzFDLGVBQWUsRUFBRSxDQUFDLENBQUMsZUFBZTtZQUNsQyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsc0JBQXNCO1lBQ2hELDBCQUEwQixFQUFFLENBQUMsQ0FBQywwQkFBMEI7WUFDeEQsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QjtZQUNsRCx3QkFBd0IsRUFBRSxDQUFDLENBQUMsd0JBQXdCO1lBQ3BELG1CQUFtQixFQUFFLENBQUMsQ0FBQyxtQkFBbUI7WUFDMUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjtZQUNwQyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsc0JBQXNCO1lBQ2hELGVBQWUsRUFBRSxDQUFDLENBQUMsZUFBZTtZQUNsQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsa0JBQWtCO1lBQ3hDLGFBQWEsRUFBRSxDQUFDLENBQUMsYUFBYTtZQUM5QiwyQkFBMkIsRUFBRSxDQUFDLENBQUMsMkJBQTJCO1lBQzFELG9DQUFvQyxFQUFFLENBQUMsQ0FBQyxvQ0FBb0M7WUFDNUUsK0JBQStCLEVBQUUsQ0FBQyxDQUFDLCtCQUErQjtZQUNsRSxzQkFBc0IsRUFBRSxDQUFDLENBQUMsc0JBQXNCO1lBQ2hELHdCQUF3QixFQUFFLENBQUMsQ0FBQyx3QkFBd0I7WUFDcEQsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLDJCQUEyQjtZQUMxRCxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7WUFDcEIscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQjtZQUM5QyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsaUJBQWlCO1lBQ3RDLGFBQWEsRUFBRSxDQUFDLENBQUMsYUFBYTtTQUMvQixDQUFDO0lBQ0osQ0FBQztJQUVPLHNCQUFzQixDQUM1QixLQUF1QjtRQUV2QixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUM7UUFDbEMsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6QixPQUFPO1lBQ0wsYUFBYSxFQUFFLENBQUMsQ0FBQyxhQUFhO1lBQzlCLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxzQkFBc0I7WUFDaEQsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QjtZQUNsRCxjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWM7WUFDaEMsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlO1lBQ2xDLDJCQUEyQixFQUFFLENBQUMsQ0FBQywyQkFBMkI7WUFDMUQsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQjtZQUNoRCxjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWM7WUFDaEMseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QjtZQUN0RCxlQUFlLEVBQUUsQ0FBQyxDQUFDLGVBQWU7WUFDbEMsY0FBYyxFQUFFLENBQUMsQ0FBQyxjQUFjO1NBQ2pDLENBQUM7SUFDSixDQUFDO0lBRU8sbUJBQW1CLENBQ3pCLEtBQXVCO1FBRXZCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDL0IsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6QixPQUFPO1lBQ0wsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLDJCQUEyQjtZQUMxRCxzQkFBc0IsRUFBRSxDQUFDLENBQUMsc0JBQXNCO1NBQ2pELENBQUM7SUFDSixDQUFDO0lBRU8sZ0JBQWdCLENBQ3RCLEtBQXVCO1FBRXZCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDNUIsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6QixPQUFPO1lBQ0wsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVO1lBQ3hCLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7WUFDcEMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQjtZQUM5QywyQkFBMkIsRUFBRSxDQUFDLENBQUMsMkJBQTJCO1lBQzFELHNCQUFzQixFQUFFLENBQUMsQ0FBQyxzQkFBc0I7U0FDakQsQ0FBQztJQUNKLENBQUM7SUFFTyxvQkFBb0IsQ0FDMUIsS0FBdUI7UUFFdkIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUNoQyxJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3pCLE9BQU87WUFDTCxhQUFhLEVBQUUsQ0FBQyxDQUFDLGFBQWE7WUFDOUIsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVO1lBQ3hCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtZQUNwQixpQkFBaUIsRUFBRSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxFQUFFO1lBQ2xELFlBQVksRUFBRSxDQUFDLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRTtZQUN4QyxZQUFZLEVBQUUsQ0FBQyxDQUFDLFlBQVk7WUFDNUIsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLDJCQUEyQjtZQUMxRCxzQkFBc0IsRUFBRSxDQUFDLENBQUMsc0JBQXNCO1NBQ2pELENBQUM7SUFDSixDQUFDO0lBRU8sa0JBQWtCLENBQ3hCLEtBQXVCO1FBRXZCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxzQkFBYyxDQUFDLEtBQUs7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM1RCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDekIsT0FBTztZQUNMLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxpQkFBaUI7WUFDdEMsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZO1lBQzVCLFlBQVksRUFBRSxDQUFDLENBQUMsWUFBWTtZQUM1QiwyQkFBMkIsRUFBRSxDQUFDLENBQUMsMkJBQTJCO1lBQzFELHNCQUFzQixFQUFFLENBQUMsQ0FBQyxzQkFBc0I7U0FDakQsQ0FBQztJQUNKLENBQUM7SUFFTyxlQUFlLENBQ3JCLEtBQXVCO1FBRXZCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDM0IsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6QixPQUFPO1lBQ0wsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVO1lBQ3hCLFlBQVksRUFBRSxDQUFDLENBQUMsWUFBWTtZQUM1QixvQkFBb0IsRUFBRSxDQUFDLENBQUMsb0JBQW9CO1lBQzVDLGFBQWEsRUFBRSxDQUFDLENBQUMsYUFBYTtZQUM5QixvQkFBb0IsRUFBRSxDQUFDLENBQUMsb0JBQW9CO1lBQzVDLGNBQWMsRUFBRSxDQUFDLENBQUMsY0FBYztZQUNoQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsbUJBQW1CO1lBQzFDLGNBQWMsRUFBRSxDQUFDLENBQUMsY0FBYztZQUNoQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87WUFDbEIsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZO1lBQzVCLGFBQWEsRUFBRSxDQUFDLENBQUMsYUFBYTtZQUM5QixZQUFZLEVBQUUsQ0FBQyxDQUFDLFlBQVk7WUFDNUIsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlO1lBQ2xDLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVTtZQUN4QixzQkFBc0IsRUFBRSxDQUFDLENBQUMsc0JBQXNCO1lBQ2hELG9CQUFvQixFQUFFLENBQUMsQ0FBQyxvQkFBb0I7WUFDNUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQjtZQUM5QyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsaUJBQWlCO1lBQ3RDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7WUFDcEMsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZO1lBQzVCLGNBQWMsRUFBRSxDQUFDLENBQUMsY0FBYztZQUNoQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsdUJBQXVCO1lBQ2xELGdCQUFnQixFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7WUFDcEMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQjtZQUM1QyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7WUFDMUIsNkJBQTZCLEVBQUUsQ0FBQyxDQUFDLDZCQUE2QjtZQUM5RCxjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWM7WUFDaEMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQjtZQUM1QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87WUFDbEIsY0FBYyxFQUFFLENBQUMsQ0FBQyxjQUFjO1lBQ2hDLDRCQUE0QixFQUFFLENBQUMsQ0FBQyw0QkFBNEI7WUFDNUQsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQjtZQUMxQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsZ0JBQWdCO1lBQ3BDLG9DQUFvQyxFQUFFLENBQUMsQ0FBQyxvQ0FBb0M7U0FDN0UsQ0FBQztJQUNKLENBQUM7SUFFTyxxQkFBcUIsQ0FDM0IsS0FBdUI7UUFFdkIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDekIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzFELENBQUM7SUFFTyxxQkFBcUIsQ0FDM0IsS0FBdUI7UUFFdkIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDekIsT0FBTztZQUNMLGFBQWEsRUFBRSxDQUFDLENBQUMsYUFBYTtZQUM5QixrQkFBa0IsRUFBRSxDQUFDLENBQUMsa0JBQWtCO1lBQ3hDLFlBQVksRUFBRSxDQUFDLENBQUMsWUFBWTtZQUM1QixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7WUFDeEIsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtZQUN4QyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7WUFDeEIsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQjtZQUN0QyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7WUFDeEIsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXO1lBQzFCLGNBQWMsRUFBRSxDQUFDLENBQUMsY0FBYztZQUNoQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7WUFDMUIseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QjtZQUN0RCxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7WUFDMUIsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXO1lBQzFCLFlBQVksRUFBRSxDQUFDLENBQUMsWUFBWTtZQUM1QixtQkFBbUIsRUFBRSxDQUFDLENBQUMsbUJBQW1CO1lBQzFDLFlBQVksRUFBRSxDQUFDLENBQUMsWUFBWTtZQUM1QiwyQkFBMkIsRUFBRSxDQUFDLENBQUMsMkJBQTJCO1lBQzFELHNCQUFzQixFQUFFLENBQUMsQ0FBQyxzQkFBc0I7WUFDaEQsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QjtZQUM1RCxvQkFBb0IsRUFBRSxDQUFDLENBQUMsb0JBQW9CO1lBQzVDLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVTtZQUN4QixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7WUFDeEIsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlO1lBQ2xDLGVBQWUsRUFBRSxDQUFDLENBQUMsZUFBZTtTQUNuQyxDQUFDO0lBQ0osQ0FBQztJQUVPLG9CQUFvQixDQUMxQixLQUF1QjtRQUV2QixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDekIsT0FBTztZQUNMLFNBQVMsRUFBRSxDQUFDLENBQUMsU0FBUztZQUN0QixvQkFBb0IsRUFBRSxDQUFDLENBQUMsb0JBQW9CO1lBQzVDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxxQkFBcUI7WUFDOUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQjtZQUMxQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMscUJBQXFCO1lBQzlDLDJCQUEyQixFQUFFLENBQUMsQ0FBQywyQkFBMkI7WUFDMUQseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QjtZQUN0RCxhQUFhLEVBQUUsQ0FBQyxDQUFDLGFBQWE7WUFDOUIsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXO1lBQzFCLDJCQUEyQixFQUFFLENBQUMsQ0FBQywyQkFBMkI7U0FDM0QsQ0FBQztJQUNKLENBQUM7SUFFTyxrQkFBa0IsQ0FDeEIsS0FBdUI7UUFFdkIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUM5QixJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3pCLE9BQU87WUFDTCxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO1lBQ2QscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQjtZQUM5QyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsbUJBQW1CO1lBQzFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxxQkFBcUI7WUFDOUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLDJCQUEyQjtZQUMxRCx5QkFBeUIsRUFBRSxDQUFDLENBQUMseUJBQXlCO1lBQ3RELGFBQWEsRUFBRSxDQUFDLENBQUMsYUFBYTtZQUM5QixlQUFlLEVBQUUsQ0FBQyxDQUFDLGVBQWU7WUFDbEMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXO1lBQzFCLDJCQUEyQixFQUFFLENBQUMsQ0FBQywyQkFBMkI7WUFDMUQsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjtZQUNwQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLFlBQVk7WUFDNUIsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFO1lBQzVDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxtQkFBbUI7WUFDMUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QjtZQUNsRCxlQUFlLEVBQUUsQ0FBQyxDQUFDLGVBQWU7WUFDbEMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLFlBQVksRUFBRTtTQUM3RCxDQUFDO0lBQ0osQ0FBQztJQUVPLHVCQUF1QixDQUM3QixLQUF1QjtRQUV2QixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUM7UUFDbkMsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6QixPQUFPO1lBQ0wsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXO1lBQzFCLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxvQkFBb0I7WUFDNUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtZQUN4Qyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsdUJBQXVCO1NBQ25ELENBQUM7SUFDSixDQUFDO0lBRU8sb0JBQW9CLENBQzFCLEtBQXVCO1FBRXZCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7UUFDaEMsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6QixPQUFPO1lBQ0wsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZO1lBQzVCLGNBQWMsRUFBRSxDQUFDLENBQUMsY0FBYztZQUNoQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsb0JBQW9CO1lBQzVDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxrQkFBa0I7WUFDeEMsY0FBYyxFQUFFLENBQUMsQ0FBQyxjQUFjO1lBQ2hDLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVztZQUMxQixhQUFhLEVBQUUsQ0FBQyxDQUFDLGFBQWE7U0FDL0IsQ0FBQztJQUNKLENBQUM7SUFFTyxrQkFBa0IsQ0FDeEIsS0FBdUI7UUFFdkIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUM5QixJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3pCLE9BQU87WUFDTCxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7WUFDeEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSTtZQUNwQixtQkFBbUIsRUFBRSxDQUFDLENBQUMsbUJBQW1CO1lBQzFDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtZQUNwQixZQUFZLEVBQUUsQ0FBQyxDQUFDLFlBQVk7WUFDNUIsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFO1lBQzVDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxtQkFBbUI7U0FDM0MsQ0FBQztJQUNKLENBQUM7O0FBL2FILGtDQWliQzs7O0FBaGJDLDhFQUE4RTtBQUM5RSwyRUFBMkU7QUFDM0UsOEVBQThFO0FBRXRELCtCQUFtQixHQUFxQjtJQUM5RCxzQkFBYyxDQUFDLFFBQVE7SUFDdkIsc0JBQWMsQ0FBQyxPQUFPO0lBQ3RCLHNCQUFjLENBQUMsS0FBSztJQUNwQixzQkFBYyxDQUFDLFVBQVU7SUFDekIsc0JBQWMsQ0FBQyxPQUFPO0lBQ3RCLHNCQUFjLENBQUMsS0FBSztDQUNyQixDQUFDO0FBRXNCLCtCQUFtQixHQUFxQjtJQUM5RCxzQkFBYyxDQUFDLFdBQVc7Q0FDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBkbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWRtcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7XG4gIERiMlNldHRpbmdzLFxuICBEeW5hbW9EYlNldHRpbmdzLFxuICBLYWZrYVNldHRpbmdzLFxuICBLaW5lc2lzU2V0dGluZ3MsXG4gIE1vbmdvRGJTZXR0aW5ncyxcbiAgTXlTcWxTZXR0aW5ncyxcbiAgTmVwdHVuZVNldHRpbmdzLFxuICBPcGVuU2VhcmNoU2V0dGluZ3MsXG4gIE9yYWNsZVNldHRpbmdzLFxuICBQb3N0Z3JlU3FsU2V0dGluZ3MsXG4gIFJlZGlzU2V0dGluZ3MsXG4gIFJlZHNoaWZ0U2V0dGluZ3MsXG4gIFMzU2V0dGluZ3MsXG4gIFNhcEFzZVNldHRpbmdzLFxuICBTcWxTZXJ2ZXJTZXR0aW5ncyxcbn0gZnJvbSAnLi9lbmRwb2ludC1zZXR0aW5ncyc7XG5pbXBvcnQgeyBFbmRwb2ludEVuZ2luZSwgRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi9lbnVtcyc7XG5cbi8qKlxuICogTWluaW1hbCBjb250cmFjdCBmb3IgYSBETVMgZW5kcG9pbnQgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHNvdXJjZSBvciB0YXJnZXRcbiAqIGluIGEge0BsaW5rIERtc1JlcGxpY2F0aW9uVGFza30gb3Ige0BsaW5rIERtc01pZ3JhdGlvblBpcGVsaW5lfS5cbiAqXG4gKiBVc2UgdGhpcyBpbnRlcmZhY2Ugd2hlbiByZWZlcmVuY2luZyBhbiBlbmRwb2ludCBjcmVhdGVkIG91dHNpZGUgb2YgdGhpc1xuICogY29uc3RydWN0IChlLmcuIGJ5IEFSTikuIEZvciBlbmRwb2ludHMgY3JlYXRlZCBieSB0aGlzIGxpYnJhcnksIHVzZSB0aGVcbiAqIGNvbmNyZXRlIHtAbGluayBEbXNFbmRwb2ludH0gY2xhc3MgZGlyZWN0bHkg4oCUIGl0IGV4cG9zZXMgYGNmbkVuZHBvaW50YFxuICogZm9yIEwxIGVzY2FwZS1oYXRjaCBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURtc0VuZHBvaW50IHtcbiAgLyoqIEFSTiBvZiB0aGUgRE1TIGVuZHBvaW50LiAqL1xuICByZWFkb25seSBlbmRwb2ludEFybjogc3RyaW5nO1xufVxuXG4vKiogUHJvcHMgZm9yIHtAbGluayBEbXNFbmRwb2ludH0uICovXG5leHBvcnQgaW50ZXJmYWNlIERtc0VuZHBvaW50UHJvcHMge1xuICAvKiogV2hldGhlciB0aGlzIGlzIGEgc291cmNlIG9yIHRhcmdldCBlbmRwb2ludC4gKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRUeXBlOiBFbmRwb2ludFR5cGU7XG5cbiAgLyoqIERhdGFiYXNlIGVuZ2luZSBmb3IgdGhpcyBlbmRwb2ludC4gKi9cbiAgcmVhZG9ubHkgZW5naW5lOiBFbmRwb2ludEVuZ2luZTtcblxuICAvKipcbiAgICogTG9naWNhbCBpZGVudGlmaWVyIG9mIHRoZSBlbmRwb2ludCAodXNlZCBhcyB0aGUgRE1TIGVuZHBvaW50IGlkZW50aWZpZXIpLlxuICAgKiBBdXRvLWdlbmVyYXRlZCBmcm9tIHRoZSBjb25zdHJ1Y3QgSUQgaWYgbm90IHByb3ZpZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRJZGVudGlmaWVyPzogc3RyaW5nO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ29tbW9uIGNvbm5lY3Rpb24gc2V0dGluZ3MgKHVzZWQgZm9yIG1vc3QgZW5naW5lIHR5cGVzKVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqIERhdGFiYXNlIHNlcnZlciBob3N0bmFtZSBvciBJUCBhZGRyZXNzLiAqL1xuICByZWFkb25seSBzZXJ2ZXJOYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBEYXRhYmFzZSBwb3J0LiAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuXG4gIC8qKiBEYXRhYmFzZSB1c2VyIG5hbWUuIFVzZWQgd2hlbiBub3QgdXNpbmcgU2VjcmV0cyBNYW5hZ2VyLiAqL1xuICByZWFkb25seSB1c2VybmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YWJhc2UgcGFzc3dvcmQuXG4gICAqXG4gICAqIEB3YXJuaW5nIFRoZSByZXNvbHZlZCB2YWx1ZSBpcyBzdG9yZWQgYXMgKipwbGFpbnRleHQqKiBpbiB0aGUgQ2xvdWRGb3JtYXRpb25cbiAgICogdGVtcGxhdGUgYW5kIHN0YXRlIGZpbGUuIEZvciBwcm9kdWN0aW9uIHdvcmtsb2FkcywgdXNlIFNlY3JldHMgTWFuYWdlclxuICAgKiBpbnN0ZWFkOiBzZXQgYHNlY3JldHNNYW5hZ2VyU2VjcmV0SWRgIGFuZCBgc2VjcmV0c01hbmFnZXJBY2Nlc3NSb2xlQXJuYFxuICAgKiBpbiB0aGUgZW5naW5lLXNwZWNpZmljIHNldHRpbmdzIChlLmcuIGBteVNxbFNldHRpbmdzYCwgYHBvc3RncmVTcWxTZXR0aW5nc2ApXG4gICAqIGFuZCBvbWl0IHRoaXMgcHJvcGVydHkgZW50aXJlbHkuXG4gICAqL1xuICByZWFkb25seSBwYXNzd29yZD86IGNkay5TZWNyZXRWYWx1ZTtcblxuICAvKiogRGF0YWJhc2UgbmFtZSBvbiB0aGUgZW5kcG9pbnQuICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRXh0cmEgY29ubmVjdGlvbiBhdHRyaWJ1dGVzIGFzIGEgc2VtaWNvbG9uLXNlcGFyYXRlZCBzdHJpbmcuXG4gICAqIFJlZmVyIHRvIHRoZSBETVMgZG9jdW1lbnRhdGlvbiBmb3IgZW5naW5lLXNwZWNpZmljIGF0dHJpYnV0ZXMuXG4gICAqL1xuICByZWFkb25seSBleHRyYUNvbm5lY3Rpb25BdHRyaWJ1dGVzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBUk4gb2YgdGhlIFNTTCBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgY2VydGlmaWNhdGUuXG4gICAqIFJlcXVpcmVkIHdoZW4gc3NsTW9kZSBpcyAndmVyaWZ5LWNhJyBvciAndmVyaWZ5LWZ1bGwnLlxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNTTCBtb2RlIGZvciB0aGUgY29ubmVjdGlvbi5cbiAgICogQGRlZmF1bHQgXCJub25lXCJcbiAgICovXG4gIHJlYWRvbmx5IHNzbE1vZGU/OiBzdHJpbmc7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBFbmdpbmUtc3BlY2lmaWMgc2V0dGluZ3MgKHNldCBvbmx5IHRoZSBvbmUgbWF0Y2hpbmcgYGVuZ2luZWApXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiogU2V0dGluZ3MgZm9yIE15U1FMIG9yIE1hcmlhREIgZW5kcG9pbnRzLiAqL1xuICByZWFkb25seSBteVNxbFNldHRpbmdzPzogTXlTcWxTZXR0aW5ncztcblxuICAvKiogU2V0dGluZ3MgZm9yIFBvc3RncmVTUUwgb3IgQXVyb3JhIFBvc3RncmVTUUwgZW5kcG9pbnRzLiAqL1xuICByZWFkb25seSBwb3N0Z3JlU3FsU2V0dGluZ3M/OiBQb3N0Z3JlU3FsU2V0dGluZ3M7XG5cbiAgLyoqIFNldHRpbmdzIGZvciBPcmFjbGUgZW5kcG9pbnRzLiAqL1xuICByZWFkb25seSBvcmFjbGVTZXR0aW5ncz86IE9yYWNsZVNldHRpbmdzO1xuXG4gIC8qKiBTZXR0aW5ncyBmb3IgTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgZW5kcG9pbnRzLiAqL1xuICByZWFkb25seSBzcWxTZXJ2ZXJTZXR0aW5ncz86IFNxbFNlcnZlclNldHRpbmdzO1xuXG4gIC8qKiBTZXR0aW5ncyBmb3IgU0FQIEFTRSAoU3liYXNlKSBlbmRwb2ludHMuICovXG4gIHJlYWRvbmx5IHNhcEFzZVNldHRpbmdzPzogU2FwQXNlU2V0dGluZ3M7XG5cbiAgLyoqIFNldHRpbmdzIGZvciBJQk0gRGIyIExVVyBlbmRwb2ludHMuICovXG4gIHJlYWRvbmx5IGRiMlNldHRpbmdzPzogRGIyU2V0dGluZ3M7XG5cbiAgLyoqIFNldHRpbmdzIGZvciBNb25nb0RCIG9yIEFtYXpvbiBEb2N1bWVudERCIGVuZHBvaW50cy4gKi9cbiAgcmVhZG9ubHkgbW9uZ29EYlNldHRpbmdzPzogTW9uZ29EYlNldHRpbmdzO1xuXG4gIC8qKiBTZXR0aW5ncyBmb3IgQW1hem9uIFMzIGVuZHBvaW50cy4gKi9cbiAgcmVhZG9ubHkgczNTZXR0aW5ncz86IFMzU2V0dGluZ3M7XG5cbiAgLyoqIFNldHRpbmdzIGZvciBBbWF6b24gRHluYW1vREIgdGFyZ2V0IGVuZHBvaW50cy4gKi9cbiAgcmVhZG9ubHkgZHluYW1vRGJTZXR0aW5ncz86IER5bmFtb0RiU2V0dGluZ3M7XG5cbiAgLyoqIFNldHRpbmdzIGZvciBBbWF6b24gUmVkc2hpZnQgdGFyZ2V0IGVuZHBvaW50cy4gKi9cbiAgcmVhZG9ubHkgcmVkc2hpZnRTZXR0aW5ncz86IFJlZHNoaWZ0U2V0dGluZ3M7XG5cbiAgLyoqIFNldHRpbmdzIGZvciBBbWF6b24gS2luZXNpcyBEYXRhIFN0cmVhbXMgdGFyZ2V0IGVuZHBvaW50cy4gKi9cbiAgcmVhZG9ubHkga2luZXNpc1NldHRpbmdzPzogS2luZXNpc1NldHRpbmdzO1xuXG4gIC8qKiBTZXR0aW5ncyBmb3IgQXBhY2hlIEthZmthIChhbmQgQW1hem9uIE1TSykgdGFyZ2V0IGVuZHBvaW50cy4gKi9cbiAgcmVhZG9ubHkga2Fma2FTZXR0aW5ncz86IEthZmthU2V0dGluZ3M7XG5cbiAgLyoqIFNldHRpbmdzIGZvciBBbWF6b24gT3BlblNlYXJjaCBTZXJ2aWNlIHRhcmdldCBlbmRwb2ludHMuICovXG4gIHJlYWRvbmx5IG9wZW5TZWFyY2hTZXR0aW5ncz86IE9wZW5TZWFyY2hTZXR0aW5ncztcblxuICAvKiogU2V0dGluZ3MgZm9yIEFtYXpvbiBOZXB0dW5lIHRhcmdldCBlbmRwb2ludHMuICovXG4gIHJlYWRvbmx5IG5lcHR1bmVTZXR0aW5ncz86IE5lcHR1bmVTZXR0aW5ncztcblxuICAvKiogU2V0dGluZ3MgZm9yIEFtYXpvbiBFbGFzdGlDYWNoZSBmb3IgUmVkaXMgdGFyZ2V0IGVuZHBvaW50cy4gKi9cbiAgcmVhZG9ubHkgcmVkaXNTZXR0aW5ncz86IFJlZGlzU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIFJlbW92YWwgcG9saWN5IGZvciB0aGUgZW5kcG9pbnQgcmVzb3VyY2UuXG4gICAqIEBkZWZhdWx0IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBjZGsuUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBBIERNUyBlbmRwb2ludCBjb25zdHJ1Y3Qgc3VwcG9ydGluZyBldmVyeSBlbmdpbmUgdGhhdCBETVMgc3VwcG9ydHMuXG4gKlxuICogU2V0IGBlbmdpbmVgIHRvIHRoZSBkZXNpcmVkIHtAbGluayBFbmRwb2ludEVuZ2luZX0gYW5kIHN1cHBseSB0aGVcbiAqIG1hdGNoaW5nIGAqU2V0dGluZ3NgIHByb3BlcnR5LiBBbGwgb3RoZXIgYCpTZXR0aW5nc2AgcHJvcGVydGllcyBhcmVcbiAqIGlnbm9yZWQgYXQgcnVudGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTXlTUUwgc291cmNlXG4gKiBuZXcgRG1zRW5kcG9pbnQodGhpcywgJ1NvdXJjZScsIHtcbiAqICAgZW5kcG9pbnRUeXBlOiBFbmRwb2ludFR5cGUuU09VUkNFLFxuICogICBlbmdpbmU6IEVuZHBvaW50RW5naW5lLk1ZU1FMLFxuICogICBzZXJ2ZXJOYW1lOiAnbXlzcWwuZXhhbXBsZS5jb20nLFxuICogICBwb3J0OiAzMzA2LFxuICogICB1c2VybmFtZTogJ2Rtc191c2VyJyxcbiAqICAgcGFzc3dvcmQ6IGNkay5TZWNyZXRWYWx1ZS5zc21TZWN1cmUoJy9kbXMvbXlzcWwvcGFzc3dvcmQnKSxcbiAqICAgZGF0YWJhc2VOYW1lOiAnbXlkYicsXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGNsYXNzIERtc0VuZHBvaW50IGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSURtc0VuZHBvaW50IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFN0YXRpYyB2YWxpZGF0aW9uIGRhdGEg4oCUIGRlY2xhcmVkIGZpcnN0IHRvIHNhdGlzZnkgbWVtYmVyLW9yZGVyaW5nIHJ1bGVzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBUkdFVF9PTkxZX0VOR0lORVM6IEVuZHBvaW50RW5naW5lW10gPSBbXG4gICAgRW5kcG9pbnRFbmdpbmUuRFlOQU1PREIsXG4gICAgRW5kcG9pbnRFbmdpbmUuS0lORVNJUyxcbiAgICBFbmRwb2ludEVuZ2luZS5LQUZLQSxcbiAgICBFbmRwb2ludEVuZ2luZS5PUEVOU0VBUkNILFxuICAgIEVuZHBvaW50RW5naW5lLk5FUFRVTkUsXG4gICAgRW5kcG9pbnRFbmdpbmUuUkVESVMsXG4gIF07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU09VUkNFX09OTFlfRU5HSU5FUzogRW5kcG9pbnRFbmdpbmVbXSA9IFtcbiAgICBFbmRwb2ludEVuZ2luZS5JQk1fREIyX1pPUyxcbiAgXTtcblxuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZUVuZ2luZUVuZHBvaW50VHlwZShcbiAgICBlbmdpbmU6IEVuZHBvaW50RW5naW5lLFxuICAgIGVuZHBvaW50VHlwZTogRW5kcG9pbnRUeXBlLFxuICApOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBlbmRwb2ludFR5cGUgPT09IEVuZHBvaW50VHlwZS5TT1VSQ0UgJiZcbiAgICAgIERtc0VuZHBvaW50LlRBUkdFVF9PTkxZX0VOR0lORVMuaW5jbHVkZXMoZW5naW5lKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRW5naW5lICcke2VuZ2luZX0nIGlzIG9ubHkgc3VwcG9ydGVkIGFzIGEgVEFSR0VUIGVuZHBvaW50LCBub3QgYXMgYSBTT1VSQ0UuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGVuZHBvaW50VHlwZSA9PT0gRW5kcG9pbnRUeXBlLlRBUkdFVCAmJlxuICAgICAgRG1zRW5kcG9pbnQuU09VUkNFX09OTFlfRU5HSU5FUy5pbmNsdWRlcyhlbmdpbmUpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFbmdpbmUgJyR7ZW5naW5lfScgaXMgb25seSBzdXBwb3J0ZWQgYXMgYSBTT1VSQ0UgZW5kcG9pbnQsIG5vdCBhcyBhIFRBUkdFVC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gSW5zdGFuY2UgZmllbGRzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKiBUaGUgdW5kZXJseWluZyBDbG91ZEZvcm1hdGlvbiBlbmRwb2ludCByZXNvdXJjZS4gKi9cbiAgcmVhZG9ubHkgY2ZuRW5kcG9pbnQ6IGRtcy5DZm5FbmRwb2ludDtcblxuICAvKiogQVJOIG9mIHRoZSBETVMgZW5kcG9pbnQuICovXG4gIHJlYWRvbmx5IGVuZHBvaW50QXJuOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERtc0VuZHBvaW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgRG1zRW5kcG9pbnQudmFsaWRhdGVFbmdpbmVFbmRwb2ludFR5cGUocHJvcHMuZW5naW5lLCBwcm9wcy5lbmRwb2ludFR5cGUpO1xuXG4gICAgY29uc3QgZW5kcG9pbnRJZGVudGlmaWVyID1cbiAgICAgIHByb3BzLmVuZHBvaW50SWRlbnRpZmllciA/P1xuICAgICAgY2RrLk5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogNjMgfSkudG9Mb3dlckNhc2UoKTtcblxuICAgIHRoaXMuY2ZuRW5kcG9pbnQgPSBuZXcgZG1zLkNmbkVuZHBvaW50KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIGVuZHBvaW50VHlwZTogcHJvcHMuZW5kcG9pbnRUeXBlLFxuICAgICAgZW5naW5lTmFtZTogcHJvcHMuZW5naW5lLFxuICAgICAgZW5kcG9pbnRJZGVudGlmaWVyLFxuICAgICAgc2VydmVyTmFtZTogcHJvcHMuc2VydmVyTmFtZSxcbiAgICAgIHBvcnQ6IHByb3BzLnBvcnQsXG4gICAgICB1c2VybmFtZTogcHJvcHMudXNlcm5hbWUsXG4gICAgICBwYXNzd29yZDogcHJvcHMucGFzc3dvcmQ/LnVuc2FmZVVud3JhcCgpLFxuICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICBleHRyYUNvbm5lY3Rpb25BdHRyaWJ1dGVzOiBwcm9wcy5leHRyYUNvbm5lY3Rpb25BdHRyaWJ1dGVzLFxuICAgICAgY2VydGlmaWNhdGVBcm46IHByb3BzLmNlcnRpZmljYXRlQXJuLFxuICAgICAgc3NsTW9kZTogcHJvcHMuc3NsTW9kZSA/PyAnbm9uZScsXG5cbiAgICAgIC8vIEVuZ2luZS1zcGVjaWZpYyBzZXR0aW5ncyDigJQgb25seSBvbmUgc2hvdWxkIGJlIHNldCBwZXIgZW5kcG9pbnRcbiAgICAgIG15U3FsU2V0dGluZ3M6IHRoaXMuYnVpbGRNeVNxbFNldHRpbmdzKHByb3BzKSxcbiAgICAgIHBvc3RncmVTcWxTZXR0aW5nczogdGhpcy5idWlsZFBvc3RncmVTcWxTZXR0aW5ncyhwcm9wcyksXG4gICAgICBvcmFjbGVTZXR0aW5nczogdGhpcy5idWlsZE9yYWNsZVNldHRpbmdzKHByb3BzKSxcbiAgICAgIG1pY3Jvc29mdFNxbFNlcnZlclNldHRpbmdzOiB0aGlzLmJ1aWxkU3FsU2VydmVyU2V0dGluZ3MocHJvcHMpLFxuICAgICAgc3liYXNlU2V0dGluZ3M6IHRoaXMuYnVpbGRTYXBBc2VTZXR0aW5ncyhwcm9wcyksXG4gICAgICBpYm1EYjJTZXR0aW5nczogdGhpcy5idWlsZERiMlNldHRpbmdzKHByb3BzKSxcbiAgICAgIG1vbmdvRGJTZXR0aW5nczogdGhpcy5idWlsZE1vbmdvRGJTZXR0aW5ncyhwcm9wcyksXG4gICAgICBzM1NldHRpbmdzOiB0aGlzLmJ1aWxkUzNTZXR0aW5ncyhwcm9wcyksXG4gICAgICBkeW5hbW9EYlNldHRpbmdzOiB0aGlzLmJ1aWxkRHluYW1vRGJTZXR0aW5ncyhwcm9wcyksXG4gICAgICByZWRzaGlmdFNldHRpbmdzOiB0aGlzLmJ1aWxkUmVkc2hpZnRTZXR0aW5ncyhwcm9wcyksXG4gICAgICBraW5lc2lzU2V0dGluZ3M6IHRoaXMuYnVpbGRLaW5lc2lzU2V0dGluZ3MocHJvcHMpLFxuICAgICAga2Fma2FTZXR0aW5nczogdGhpcy5idWlsZEthZmthU2V0dGluZ3MocHJvcHMpLFxuICAgICAgZWxhc3RpY3NlYXJjaFNldHRpbmdzOiB0aGlzLmJ1aWxkT3BlblNlYXJjaFNldHRpbmdzKHByb3BzKSxcbiAgICAgIG5lcHR1bmVTZXR0aW5nczogdGhpcy5idWlsZE5lcHR1bmVTZXR0aW5ncyhwcm9wcyksXG4gICAgICByZWRpc1NldHRpbmdzOiB0aGlzLmJ1aWxkUmVkaXNTZXR0aW5ncyhwcm9wcyksXG4gICAgICBkb2NEYlNldHRpbmdzOiB0aGlzLmJ1aWxkRG9jRGJTZXR0aW5ncyhwcm9wcyksXG4gICAgfSk7XG5cbiAgICB0aGlzLmNmbkVuZHBvaW50LmFwcGx5UmVtb3ZhbFBvbGljeShwcm9wcy5yZW1vdmFsUG9saWN5ID8/IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIHRoaXMuZW5kcG9pbnRBcm4gPSB0aGlzLmNmbkVuZHBvaW50LnJlZjtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQcml2YXRlIG1hcHBpbmcgaGVscGVycyDigJQgdHJhbnNsYXRlIHR5cGVkIGludGVyZmFjZXMgdG8gQ0ZOIHByb3BlcnR5IHNoYXBlc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGJ1aWxkTXlTcWxTZXR0aW5ncyhcbiAgICBwcm9wczogRG1zRW5kcG9pbnRQcm9wcyxcbiAgKTogZG1zLkNmbkVuZHBvaW50Lk15U3FsU2V0dGluZ3NQcm9wZXJ0eSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcyA9IHByb3BzLm15U3FsU2V0dGluZ3M7XG4gICAgaWYgKCFzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBhZnRlckNvbm5lY3RTY3JpcHQ6IHMuYWZ0ZXJDb25uZWN0U2NyaXB0LFxuICAgICAgY2xlYW5Tb3VyY2VNZXRhZGF0YU9uTWlzbWF0Y2g6IHMuY2xlYW5Tb3VyY2VNZXRhZGF0YU9uTWlzbWF0Y2gsXG4gICAgICBldmVudHNQb2xsSW50ZXJ2YWw6IHMuZXZlbnRzUG9sbEludGVydmFsLFxuICAgICAgbWF4RmlsZVNpemU6IHMubWF4RmlsZVNpemUsXG4gICAgICBwYXJhbGxlbExvYWRUaHJlYWRzOiBzLnBhcmFsbGVsTG9hZFRocmVhZHMsXG4gICAgICBzZWNyZXRzTWFuYWdlckFjY2Vzc1JvbGVBcm46IHMuc2VjcmV0c01hbmFnZXJBY2Nlc3NSb2xlQXJuLFxuICAgICAgc2VjcmV0c01hbmFnZXJTZWNyZXRJZDogcy5zZWNyZXRzTWFuYWdlclNlY3JldElkLFxuICAgICAgc2VydmVyVGltZXpvbmU6IHMuc2VydmVyVGltZXpvbmUsXG4gICAgICB0YXJnZXREYlR5cGU6IHMudGFyZ2V0RGJUeXBlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUG9zdGdyZVNxbFNldHRpbmdzKFxuICAgIHByb3BzOiBEbXNFbmRwb2ludFByb3BzLFxuICApOiBkbXMuQ2ZuRW5kcG9pbnQuUG9zdGdyZVNxbFNldHRpbmdzUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHMgPSBwcm9wcy5wb3N0Z3JlU3FsU2V0dGluZ3M7XG4gICAgaWYgKCFzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBhZnRlckNvbm5lY3RTY3JpcHQ6IHMuYWZ0ZXJDb25uZWN0U2NyaXB0LFxuICAgICAgY2FwdHVyZURkbHM6IHMuY2FwdHVyZURkbHMsXG4gICAgICBkZGxBcnRpZmFjdHNTY2hlbWE6IHMuZGRsQXJ0aWZhY3RzU2NoZW1hLFxuICAgICAgZXhlY3V0ZVRpbWVvdXQ6IHMuZXhlY3V0ZVRpbWVvdXQsXG4gICAgICBmYWlsVGFza3NPbkxvYlRydW5jYXRpb246IHMuZmFpbFRhc2tzT25Mb2JUcnVuY2F0aW9uLFxuICAgICAgaGVhcnRiZWF0RW5hYmxlOiBzLmhlYXJ0YmVhdEVuYWJsZSxcbiAgICAgIGhlYXJ0YmVhdEZyZXF1ZW5jeTogcy5oZWFydGJlYXRGcmVxdWVuY3ksXG4gICAgICBoZWFydGJlYXRTY2hlbWE6IHMuaGVhcnRiZWF0U2NoZW1hLFxuICAgICAgbWFwQm9vbGVhbkFzQm9vbGVhbjogcy5tYXBCb29sZWFuQXNCb29sZWFuLFxuICAgICAgbWF4RmlsZVNpemU6IHMubWF4RmlsZVNpemUsXG4gICAgICBwbHVnaW5OYW1lOiBzLnBsdWdpbk5hbWUsXG4gICAgICBzZWNyZXRzTWFuYWdlckFjY2Vzc1JvbGVBcm46IHMuc2VjcmV0c01hbmFnZXJBY2Nlc3NSb2xlQXJuLFxuICAgICAgc2VjcmV0c01hbmFnZXJTZWNyZXRJZDogcy5zZWNyZXRzTWFuYWdlclNlY3JldElkLFxuICAgICAgc2xvdE5hbWU6IHMuc2xvdE5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPcmFjbGVTZXR0aW5ncyhcbiAgICBwcm9wczogRG1zRW5kcG9pbnRQcm9wcyxcbiAgKTogZG1zLkNmbkVuZHBvaW50Lk9yYWNsZVNldHRpbmdzUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHMgPSBwcm9wcy5vcmFjbGVTZXR0aW5ncztcbiAgICBpZiAoIXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY2Vzc0FsdGVybmF0ZURpcmVjdGx5OiBzLmFjY2Vzc0FsdGVybmF0ZURpcmVjdGx5LFxuICAgICAgYWRkU3VwcGxlbWVudGFsTG9nZ2luZzogcy5hZGRTdXBwbGVtZW50YWxMb2dnaW5nLFxuICAgICAgYWRkaXRpb25hbEFyY2hpdmVkTG9nRGVzdElkOiBzLmFkZGl0aW9uYWxBcmNoaXZlZExvZ0Rlc3RJZCxcbiAgICAgIGFsbG93U2VsZWN0TmVzdGVkVGFibGVzOiBzLmFsbG93U2VsZWN0TmVzdGVkVGFibGVzLFxuICAgICAgYXJjaGl2ZWRMb2dEZXN0SWQ6IHMuYXJjaGl2ZWRMb2dEZXN0SWQsXG4gICAgICBhcmNoaXZlZExvZ3NPbmx5OiBzLmFyY2hpdmVkTG9nc09ubHksXG4gICAgICBhc21QYXNzd29yZDogcy5hc21QYXNzd29yZD8udW5zYWZlVW53cmFwKCksXG4gICAgICBhc21TZXJ2ZXI6IHMuYXNtU2VydmVyLFxuICAgICAgYXNtVXNlcjogcy5hc21Vc2VyLFxuICAgICAgY2hhckxlbmd0aFNlbWFudGljczogcy5jaGFyTGVuZ3RoU2VtYW50aWNzLFxuICAgICAgZGlyZWN0UGF0aE5vTG9nOiBzLmRpcmVjdFBhdGhOb0xvZyxcbiAgICAgIGRpcmVjdFBhdGhQYXJhbGxlbExvYWQ6IHMuZGlyZWN0UGF0aFBhcmFsbGVsTG9hZCxcbiAgICAgIGVuYWJsZUhvbW9nZW5vdXNUYWJsZXNwYWNlOiBzLmVuYWJsZUhvbW9nZW5vdXNUYWJsZXNwYWNlLFxuICAgICAgZXh0cmFBcmNoaXZlZExvZ0Rlc3RJZHM6IHMuZXh0cmFBcmNoaXZlZExvZ0Rlc3RJZHMsXG4gICAgICBmYWlsVGFza3NPbkxvYlRydW5jYXRpb246IHMuZmFpbFRhc2tzT25Mb2JUcnVuY2F0aW9uLFxuICAgICAgbnVtYmVyRGF0YXR5cGVTY2FsZTogcy5udW1iZXJEYXRhdHlwZVNjYWxlLFxuICAgICAgb3JhY2xlUGF0aFByZWZpeDogcy5vcmFjbGVQYXRoUHJlZml4LFxuICAgICAgcGFyYWxsZWxBc21SZWFkVGhyZWFkczogcy5wYXJhbGxlbEFzbVJlYWRUaHJlYWRzLFxuICAgICAgcmVhZEFoZWFkQmxvY2tzOiBzLnJlYWRBaGVhZEJsb2NrcyxcbiAgICAgIHJlYWRUYWJsZVNwYWNlTmFtZTogcy5yZWFkVGFibGVTcGFjZU5hbWUsXG4gICAgICByZXRyeUludGVydmFsOiBzLnJldHJ5SW50ZXJ2YWwsXG4gICAgICBzZWNyZXRzTWFuYWdlckFjY2Vzc1JvbGVBcm46IHMuc2VjcmV0c01hbmFnZXJBY2Nlc3NSb2xlQXJuLFxuICAgICAgc2VjcmV0c01hbmFnZXJPcmFjbGVBc21BY2Nlc3NSb2xlQXJuOiBzLnNlY3JldHNNYW5hZ2VyT3JhY2xlQXNtQWNjZXNzUm9sZUFybixcbiAgICAgIHNlY3JldHNNYW5hZ2VyT3JhY2xlQXNtU2VjcmV0SWQ6IHMuc2VjcmV0c01hbmFnZXJPcmFjbGVBc21TZWNyZXRJZCxcbiAgICAgIHNlY3JldHNNYW5hZ2VyU2VjcmV0SWQ6IHMuc2VjcmV0c01hbmFnZXJTZWNyZXRJZCxcbiAgICAgIHNlY3VyaXR5RGJFbmNyeXB0aW9uTmFtZTogcy5zZWN1cml0eURiRW5jcnlwdGlvbk5hbWUsXG4gICAgICB1c2VBbHRlcm5hdGVGb2xkZXJGb3JPbmxpbmU6IHMudXNlQWx0ZXJuYXRlRm9sZGVyRm9yT25saW5lLFxuICAgICAgdXNlQkZpbGU6IHMudXNlQkZpbGUsXG4gICAgICB1c2VEaXJlY3RQYXRoRnVsbExvYWQ6IHMudXNlRGlyZWN0UGF0aEZ1bGxMb2FkLFxuICAgICAgdXNlTG9nbWluZXJSZWFkZXI6IHMudXNlTG9nbWluZXJSZWFkZXIsXG4gICAgICB1c2VQYXRoUHJlZml4OiBzLnVzZVBhdGhQcmVmaXgsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTcWxTZXJ2ZXJTZXR0aW5ncyhcbiAgICBwcm9wczogRG1zRW5kcG9pbnRQcm9wcyxcbiAgKTogZG1zLkNmbkVuZHBvaW50Lk1pY3Jvc29mdFNxbFNlcnZlclNldHRpbmdzUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHMgPSBwcm9wcy5zcWxTZXJ2ZXJTZXR0aW5ncztcbiAgICBpZiAoIXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJjcFBhY2tldFNpemU6IHMuYmNwUGFja2V0U2l6ZSxcbiAgICAgIGNvbnRyb2xUYWJsZXNGaWxlR3JvdXA6IHMuY29udHJvbFRhYmxlc0ZpbGVHcm91cCxcbiAgICAgIHF1ZXJ5U2luZ2xlQWx3YXlzT25Ob2RlOiBzLnF1ZXJ5U2luZ2xlQWx3YXlzT25Ob2RlLFxuICAgICAgcmVhZEJhY2t1cE9ubHk6IHMucmVhZEJhY2t1cE9ubHksXG4gICAgICBzYWZlZ3VhcmRQb2xpY3k6IHMuc2FmZWd1YXJkUG9saWN5LFxuICAgICAgc2VjcmV0c01hbmFnZXJBY2Nlc3NSb2xlQXJuOiBzLnNlY3JldHNNYW5hZ2VyQWNjZXNzUm9sZUFybixcbiAgICAgIHNlY3JldHNNYW5hZ2VyU2VjcmV0SWQ6IHMuc2VjcmV0c01hbmFnZXJTZWNyZXRJZCxcbiAgICAgIHVzZUJjcEZ1bGxMb2FkOiBzLnVzZUJjcEZ1bGxMb2FkLFxuICAgICAgdXNlVGhpcmRQYXJ0eUJhY2t1cERldmljZTogcy51c2VUaGlyZFBhcnR5QmFja3VwRGV2aWNlLFxuICAgICAgdHJpbVNwYWNlSW5DaGFyOiBzLnRyaW1TcGFjZUluQ2hhcixcbiAgICAgIHRsb2dBY2Nlc3NNb2RlOiBzLnRsb2dBY2Nlc3NNb2RlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2FwQXNlU2V0dGluZ3MoXG4gICAgcHJvcHM6IERtc0VuZHBvaW50UHJvcHMsXG4gICk6IGRtcy5DZm5FbmRwb2ludC5TeWJhc2VTZXR0aW5nc1Byb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzID0gcHJvcHMuc2FwQXNlU2V0dGluZ3M7XG4gICAgaWYgKCFzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBzZWNyZXRzTWFuYWdlckFjY2Vzc1JvbGVBcm46IHMuc2VjcmV0c01hbmFnZXJBY2Nlc3NSb2xlQXJuLFxuICAgICAgc2VjcmV0c01hbmFnZXJTZWNyZXRJZDogcy5zZWNyZXRzTWFuYWdlclNlY3JldElkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGIyU2V0dGluZ3MoXG4gICAgcHJvcHM6IERtc0VuZHBvaW50UHJvcHMsXG4gICk6IGRtcy5DZm5FbmRwb2ludC5JYm1EYjJTZXR0aW5nc1Byb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzID0gcHJvcHMuZGIyU2V0dGluZ3M7XG4gICAgaWYgKCFzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50THNuOiBzLmN1cnJlbnRMc24sXG4gICAgICBtYXhLQnl0ZXNQZXJSZWFkOiBzLm1heEtCeXRlc1BlclJlYWQsXG4gICAgICBzZXREYXRhQ2FwdHVyZUNoYW5nZXM6IHMuc2V0RGF0YUNhcHR1cmVDaGFuZ2VzLFxuICAgICAgc2VjcmV0c01hbmFnZXJBY2Nlc3NSb2xlQXJuOiBzLnNlY3JldHNNYW5hZ2VyQWNjZXNzUm9sZUFybixcbiAgICAgIHNlY3JldHNNYW5hZ2VyU2VjcmV0SWQ6IHMuc2VjcmV0c01hbmFnZXJTZWNyZXRJZCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE1vbmdvRGJTZXR0aW5ncyhcbiAgICBwcm9wczogRG1zRW5kcG9pbnRQcm9wcyxcbiAgKTogZG1zLkNmbkVuZHBvaW50Lk1vbmdvRGJTZXR0aW5nc1Byb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzID0gcHJvcHMubW9uZ29EYlNldHRpbmdzO1xuICAgIGlmICghcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgYXV0aE1lY2hhbmlzbTogcy5hdXRoTWVjaGFuaXNtLFxuICAgICAgYXV0aFNvdXJjZTogcy5hdXRoU291cmNlLFxuICAgICAgYXV0aFR5cGU6IHMuYXV0aFR5cGUsXG4gICAgICBkb2NzVG9JbnZlc3RpZ2F0ZTogcy5kb2NzVG9JbnZlc3RpZ2F0ZT8udG9TdHJpbmcoKSxcbiAgICAgIGV4dHJhY3REb2NJZDogcy5leHRyYWN0RG9jSWQ/LnRvU3RyaW5nKCksXG4gICAgICBuZXN0aW5nTGV2ZWw6IHMubmVzdGluZ0xldmVsLFxuICAgICAgc2VjcmV0c01hbmFnZXJBY2Nlc3NSb2xlQXJuOiBzLnNlY3JldHNNYW5hZ2VyQWNjZXNzUm9sZUFybixcbiAgICAgIHNlY3JldHNNYW5hZ2VyU2VjcmV0SWQ6IHMuc2VjcmV0c01hbmFnZXJTZWNyZXRJZCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZERvY0RiU2V0dGluZ3MoXG4gICAgcHJvcHM6IERtc0VuZHBvaW50UHJvcHMsXG4gICk6IGRtcy5DZm5FbmRwb2ludC5Eb2NEYlNldHRpbmdzUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9wcy5lbmdpbmUgIT09IEVuZHBvaW50RW5naW5lLkRPQ0RCKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHMgPSBwcm9wcy5tb25nb0RiU2V0dGluZ3M7XG4gICAgaWYgKCFzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBkb2NzVG9JbnZlc3RpZ2F0ZTogcy5kb2NzVG9JbnZlc3RpZ2F0ZSxcbiAgICAgIGV4dHJhY3REb2NJZDogcy5leHRyYWN0RG9jSWQsXG4gICAgICBuZXN0aW5nTGV2ZWw6IHMubmVzdGluZ0xldmVsLFxuICAgICAgc2VjcmV0c01hbmFnZXJBY2Nlc3NSb2xlQXJuOiBzLnNlY3JldHNNYW5hZ2VyQWNjZXNzUm9sZUFybixcbiAgICAgIHNlY3JldHNNYW5hZ2VyU2VjcmV0SWQ6IHMuc2VjcmV0c01hbmFnZXJTZWNyZXRJZCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFMzU2V0dGluZ3MoXG4gICAgcHJvcHM6IERtc0VuZHBvaW50UHJvcHMsXG4gICk6IGRtcy5DZm5FbmRwb2ludC5TM1NldHRpbmdzUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHMgPSBwcm9wcy5zM1NldHRpbmdzO1xuICAgIGlmICghcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgYnVja2V0TmFtZTogcy5idWNrZXROYW1lLFxuICAgICAgYnVja2V0Rm9sZGVyOiBzLmJ1Y2tldEZvbGRlcixcbiAgICAgIHNlcnZpY2VBY2Nlc3NSb2xlQXJuOiBzLnNlcnZpY2VBY2Nlc3NSb2xlQXJuLFxuICAgICAgYWRkQ29sdW1uTmFtZTogcy5hZGRDb2x1bW5OYW1lLFxuICAgICAgY2RjSW5zZXJ0c0FuZFVwZGF0ZXM6IHMuY2RjSW5zZXJ0c0FuZFVwZGF0ZXMsXG4gICAgICBjZGNJbnNlcnRzT25seTogcy5jZGNJbnNlcnRzT25seSxcbiAgICAgIGNkY01heEJhdGNoSW50ZXJ2YWw6IHMuY2RjTWF4QmF0Y2hJbnRlcnZhbCxcbiAgICAgIGNkY01pbkZpbGVTaXplOiBzLmNkY01pbkZpbGVTaXplLFxuICAgICAgY2RjUGF0aDogcy5jZGNQYXRoLFxuICAgICAgY3N2RGVsaW1pdGVyOiBzLmNzdkRlbGltaXRlcixcbiAgICAgIGNzdk5vU3VwVmFsdWU6IHMuY3N2Tm9TdXBWYWx1ZSxcbiAgICAgIGNzdk51bGxWYWx1ZTogcy5jc3ZOdWxsVmFsdWUsXG4gICAgICBjc3ZSb3dEZWxpbWl0ZXI6IHMuY3N2Um93RGVsaW1pdGVyLFxuICAgICAgZGF0YUZvcm1hdDogcy5kYXRhRm9ybWF0LFxuICAgICAgZGF0ZVBhcnRpdGlvbkRlbGltaXRlcjogcy5kYXRlUGFydGl0aW9uRGVsaW1pdGVyLFxuICAgICAgZGF0ZVBhcnRpdGlvbkVuYWJsZWQ6IHMuZGF0ZVBhcnRpdGlvbkVuYWJsZWQsXG4gICAgICBkYXRlUGFydGl0aW9uU2VxdWVuY2U6IHMuZGF0ZVBhcnRpdGlvblNlcXVlbmNlLFxuICAgICAgZGljdFBhZ2VTaXplTGltaXQ6IHMuZGljdFBhZ2VTaXplTGltaXQsXG4gICAgICBlbmFibGVTdGF0aXN0aWNzOiBzLmVuYWJsZVN0YXRpc3RpY3MsXG4gICAgICBlbmNvZGluZ1R5cGU6IHMuZW5jb2RpbmdUeXBlLFxuICAgICAgZW5jcnlwdGlvbk1vZGU6IHMuZW5jcnlwdGlvbk1vZGUsXG4gICAgICBleHRlcm5hbFRhYmxlRGVmaW5pdGlvbjogcy5leHRlcm5hbFRhYmxlRGVmaW5pdGlvbixcbiAgICAgIGlnbm9yZUhlYWRlclJvd3M6IHMuaWdub3JlSGVhZGVyUm93cyxcbiAgICAgIGluY2x1ZGVPcEZvckZ1bGxMb2FkOiBzLmluY2x1ZGVPcEZvckZ1bGxMb2FkLFxuICAgICAgbWF4RmlsZVNpemU6IHMubWF4RmlsZVNpemUsXG4gICAgICBwYXJxdWV0VGltZXN0YW1wSW5NaWxsaXNlY29uZDogcy5wYXJxdWV0VGltZXN0YW1wSW5NaWxsaXNlY29uZCxcbiAgICAgIHBhcnF1ZXRWZXJzaW9uOiBzLnBhcnF1ZXRWZXJzaW9uLFxuICAgICAgcHJlc2VydmVUcmFuc2FjdGlvbnM6IHMucHJlc2VydmVUcmFuc2FjdGlvbnMsXG4gICAgICByZmM0MTgwOiBzLnJmYzQxODAsXG4gICAgICByb3dHcm91cExlbmd0aDogcy5yb3dHcm91cExlbmd0aCxcbiAgICAgIHNlcnZlclNpZGVFbmNyeXB0aW9uS21zS2V5SWQ6IHMuc2VydmVyU2lkZUVuY3J5cHRpb25LbXNLZXlJZCxcbiAgICAgIHRpbWVzdGFtcENvbHVtbk5hbWU6IHMudGltZXN0YW1wQ29sdW1uTmFtZSxcbiAgICAgIHVzZUNzdk5vU3VwVmFsdWU6IHMudXNlQ3N2Tm9TdXBWYWx1ZSxcbiAgICAgIHVzZVRhc2tTdGFydFRpbWVGb3JGdWxsTG9hZFRpbWVzdGFtcDogcy51c2VUYXNrU3RhcnRUaW1lRm9yRnVsbExvYWRUaW1lc3RhbXAsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREeW5hbW9EYlNldHRpbmdzKFxuICAgIHByb3BzOiBEbXNFbmRwb2ludFByb3BzLFxuICApOiBkbXMuQ2ZuRW5kcG9pbnQuRHluYW1vRGJTZXR0aW5nc1Byb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzID0gcHJvcHMuZHluYW1vRGJTZXR0aW5ncztcbiAgICBpZiAoIXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgc2VydmljZUFjY2Vzc1JvbGVBcm46IHMuc2VydmljZUFjY2Vzc1JvbGVBcm4gfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSZWRzaGlmdFNldHRpbmdzKFxuICAgIHByb3BzOiBEbXNFbmRwb2ludFByb3BzLFxuICApOiBkbXMuQ2ZuRW5kcG9pbnQuUmVkc2hpZnRTZXR0aW5nc1Byb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzID0gcHJvcHMucmVkc2hpZnRTZXR0aW5ncztcbiAgICBpZiAoIXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY2VwdEFueURhdGU6IHMuYWNjZXB0QW55RGF0ZSxcbiAgICAgIGFmdGVyQ29ubmVjdFNjcmlwdDogcy5hZnRlckNvbm5lY3RTY3JpcHQsXG4gICAgICBidWNrZXRGb2xkZXI6IHMuYnVja2V0Rm9sZGVyLFxuICAgICAgYnVja2V0TmFtZTogcy5idWNrZXROYW1lLFxuICAgICAgY2FzZVNlbnNpdGl2ZU5hbWVzOiBzLmNhc2VTZW5zaXRpdmVOYW1lcyxcbiAgICAgIGNvbXBVcGRhdGU6IHMuY29tcFVwZGF0ZSxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBzLmNvbm5lY3Rpb25UaW1lb3V0LFxuICAgICAgZGF0ZUZvcm1hdDogcy5kYXRlRm9ybWF0LFxuICAgICAgZW1wdHlBc051bGw6IHMuZW1wdHlBc051bGwsXG4gICAgICBlbmNyeXB0aW9uTW9kZTogcy5lbmNyeXB0aW9uTW9kZSxcbiAgICAgIGV4cGxpY2l0SWRzOiBzLmV4cGxpY2l0SWRzLFxuICAgICAgZmlsZVRyYW5zZmVyVXBsb2FkU3RyZWFtczogcy5maWxlVHJhbnNmZXJVcGxvYWRTdHJlYW1zLFxuICAgICAgbG9hZFRpbWVvdXQ6IHMubG9hZFRpbWVvdXQsXG4gICAgICBtYXhGaWxlU2l6ZTogcy5tYXhGaWxlU2l6ZSxcbiAgICAgIHJlbW92ZVF1b3Rlczogcy5yZW1vdmVRdW90ZXMsXG4gICAgICByZXBsYWNlSW52YWxpZENoYXJzOiBzLnJlcGxhY2VJbnZhbGlkQ2hhcnMsXG4gICAgICByZXBsYWNlQ2hhcnM6IHMucmVwbGFjZUNoYXJzLFxuICAgICAgc2VjcmV0c01hbmFnZXJBY2Nlc3NSb2xlQXJuOiBzLnNlY3JldHNNYW5hZ2VyQWNjZXNzUm9sZUFybixcbiAgICAgIHNlY3JldHNNYW5hZ2VyU2VjcmV0SWQ6IHMuc2VjcmV0c01hbmFnZXJTZWNyZXRJZCxcbiAgICAgIHNlcnZlclNpZGVFbmNyeXB0aW9uS21zS2V5SWQ6IHMuc2VydmVyU2lkZUVuY3J5cHRpb25LbXNLZXlJZCxcbiAgICAgIHNlcnZpY2VBY2Nlc3NSb2xlQXJuOiBzLnNlcnZpY2VBY2Nlc3NSb2xlQXJuLFxuICAgICAgdGltZUZvcm1hdDogcy50aW1lRm9ybWF0LFxuICAgICAgdHJpbUJsYW5rczogcy50cmltQmxhbmtzLFxuICAgICAgdHJ1bmNhdGVDb2x1bW5zOiBzLnRydW5jYXRlQ29sdW1ucyxcbiAgICAgIHdyaXRlQnVmZmVyU2l6ZTogcy53cml0ZUJ1ZmZlclNpemUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRLaW5lc2lzU2V0dGluZ3MoXG4gICAgcHJvcHM6IERtc0VuZHBvaW50UHJvcHMsXG4gICk6IGRtcy5DZm5FbmRwb2ludC5LaW5lc2lzU2V0dGluZ3NQcm9wZXJ0eSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcyA9IHByb3BzLmtpbmVzaXNTZXR0aW5ncztcbiAgICBpZiAoIXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVhbUFybjogcy5zdHJlYW1Bcm4sXG4gICAgICBzZXJ2aWNlQWNjZXNzUm9sZUFybjogcy5zZXJ2aWNlQWNjZXNzUm9sZUFybixcbiAgICAgIGluY2x1ZGVDb250cm9sRGV0YWlsczogcy5pbmNsdWRlQ29udHJvbERldGFpbHMsXG4gICAgICBpbmNsdWRlTnVsbEFuZEVtcHR5OiBzLmluY2x1ZGVOdWxsQW5kRW1wdHksXG4gICAgICBpbmNsdWRlUGFydGl0aW9uVmFsdWU6IHMuaW5jbHVkZVBhcnRpdGlvblZhbHVlLFxuICAgICAgaW5jbHVkZVRhYmxlQWx0ZXJPcGVyYXRpb25zOiBzLmluY2x1ZGVUYWJsZUFsdGVyT3BlcmF0aW9ucyxcbiAgICAgIGluY2x1ZGVUcmFuc2FjdGlvbkRldGFpbHM6IHMuaW5jbHVkZVRyYW5zYWN0aW9uRGV0YWlscyxcbiAgICAgIG1lc3NhZ2VGb3JtYXQ6IHMubWVzc2FnZUZvcm1hdCxcbiAgICAgIG5vSGV4UHJlZml4OiBzLm5vSGV4UHJlZml4LFxuICAgICAgcGFydGl0aW9uSW5jbHVkZVNjaGVtYVRhYmxlOiBzLnBhcnRpdGlvbkluY2x1ZGVTY2hlbWFUYWJsZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEthZmthU2V0dGluZ3MoXG4gICAgcHJvcHM6IERtc0VuZHBvaW50UHJvcHMsXG4gICk6IGRtcy5DZm5FbmRwb2ludC5LYWZrYVNldHRpbmdzUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHMgPSBwcm9wcy5rYWZrYVNldHRpbmdzO1xuICAgIGlmICghcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgYnJva2VyOiBzLmJyb2tlcixcbiAgICAgIHRvcGljOiBzLnRvcGljLFxuICAgICAgaW5jbHVkZUNvbnRyb2xEZXRhaWxzOiBzLmluY2x1ZGVDb250cm9sRGV0YWlscyxcbiAgICAgIGluY2x1ZGVOdWxsQW5kRW1wdHk6IHMuaW5jbHVkZU51bGxBbmRFbXB0eSxcbiAgICAgIGluY2x1ZGVQYXJ0aXRpb25WYWx1ZTogcy5pbmNsdWRlUGFydGl0aW9uVmFsdWUsXG4gICAgICBpbmNsdWRlVGFibGVBbHRlck9wZXJhdGlvbnM6IHMuaW5jbHVkZVRhYmxlQWx0ZXJPcGVyYXRpb25zLFxuICAgICAgaW5jbHVkZVRyYW5zYWN0aW9uRGV0YWlsczogcy5pbmNsdWRlVHJhbnNhY3Rpb25EZXRhaWxzLFxuICAgICAgbWVzc2FnZUZvcm1hdDogcy5tZXNzYWdlRm9ybWF0LFxuICAgICAgbWVzc2FnZU1heEJ5dGVzOiBzLm1lc3NhZ2VNYXhCeXRlcyxcbiAgICAgIG5vSGV4UHJlZml4OiBzLm5vSGV4UHJlZml4LFxuICAgICAgcGFydGl0aW9uSW5jbHVkZVNjaGVtYVRhYmxlOiBzLnBhcnRpdGlvbkluY2x1ZGVTY2hlbWFUYWJsZSxcbiAgICAgIHNlY3VyaXR5UHJvdG9jb2w6IHMuc2VjdXJpdHlQcm90b2NvbCxcbiAgICAgIHNhc2xVc2VyTmFtZTogcy5zYXNsVXNlcm5hbWUsXG4gICAgICBzYXNsUGFzc3dvcmQ6IHMuc2FzbFBhc3N3b3JkPy51bnNhZmVVbndyYXAoKSxcbiAgICAgIHNzbENhQ2VydGlmaWNhdGVBcm46IHMuc3NsQ2FDZXJ0aWZpY2F0ZUFybixcbiAgICAgIHNzbENsaWVudENlcnRpZmljYXRlQXJuOiBzLnNzbENsaWVudENlcnRpZmljYXRlQXJuLFxuICAgICAgc3NsQ2xpZW50S2V5QXJuOiBzLnNzbENsaWVudEtleUFybixcbiAgICAgIHNzbENsaWVudEtleVBhc3N3b3JkOiBzLnNzbENsaWVudEtleVBhc3N3b3JkPy51bnNhZmVVbndyYXAoKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE9wZW5TZWFyY2hTZXR0aW5ncyhcbiAgICBwcm9wczogRG1zRW5kcG9pbnRQcm9wcyxcbiAgKTogZG1zLkNmbkVuZHBvaW50LkVsYXN0aWNzZWFyY2hTZXR0aW5nc1Byb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzID0gcHJvcHMub3BlblNlYXJjaFNldHRpbmdzO1xuICAgIGlmICghcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgZW5kcG9pbnRVcmk6IHMuZW5kcG9pbnRVcmksXG4gICAgICBzZXJ2aWNlQWNjZXNzUm9sZUFybjogcy5zZXJ2aWNlQWNjZXNzUm9sZUFybixcbiAgICAgIGVycm9yUmV0cnlEdXJhdGlvbjogcy5lcnJvclJldHJ5RHVyYXRpb24sXG4gICAgICBmdWxsTG9hZEVycm9yUGVyY2VudGFnZTogcy5mdWxsTG9hZEVycm9yUGVyY2VudGFnZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE5lcHR1bmVTZXR0aW5ncyhcbiAgICBwcm9wczogRG1zRW5kcG9pbnRQcm9wcyxcbiAgKTogZG1zLkNmbkVuZHBvaW50Lk5lcHR1bmVTZXR0aW5nc1Byb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzID0gcHJvcHMubmVwdHVuZVNldHRpbmdzO1xuICAgIGlmICghcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgczNCdWNrZXROYW1lOiBzLnMzQnVja2V0TmFtZSxcbiAgICAgIHMzQnVja2V0Rm9sZGVyOiBzLnMzQnVja2V0Rm9sZGVyLFxuICAgICAgc2VydmljZUFjY2Vzc1JvbGVBcm46IHMuc2VydmljZUFjY2Vzc1JvbGVBcm4sXG4gICAgICBlcnJvclJldHJ5RHVyYXRpb246IHMuZXJyb3JSZXRyeUR1cmF0aW9uLFxuICAgICAgaWFtQXV0aEVuYWJsZWQ6IHMuaWFtQXV0aEVuYWJsZWQsXG4gICAgICBtYXhGaWxlU2l6ZTogcy5tYXhGaWxlU2l6ZSxcbiAgICAgIG1heFJldHJ5Q291bnQ6IHMubWF4UmV0cnlDb3VudCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlZGlzU2V0dGluZ3MoXG4gICAgcHJvcHM6IERtc0VuZHBvaW50UHJvcHMsXG4gICk6IGRtcy5DZm5FbmRwb2ludC5SZWRpc1NldHRpbmdzUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHMgPSBwcm9wcy5yZWRpc1NldHRpbmdzO1xuICAgIGlmICghcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgc2VydmVyTmFtZTogcy5zZXJ2ZXJOYW1lLFxuICAgICAgcG9ydDogcy5wb3J0ID8/IDYzNzksXG4gICAgICBzc2xTZWN1cml0eVByb3RvY29sOiBzLnNzbFNlY3VyaXR5UHJvdG9jb2wsXG4gICAgICBhdXRoVHlwZTogcy5hdXRoVHlwZSxcbiAgICAgIGF1dGhVc2VyTmFtZTogcy5hdXRoVXNlck5hbWUsXG4gICAgICBhdXRoUGFzc3dvcmQ6IHMuYXV0aFBhc3N3b3JkPy51bnNhZmVVbndyYXAoKSxcbiAgICAgIHNzbENhQ2VydGlmaWNhdGVBcm46IHMuc3NsQ2FDZXJ0aWZpY2F0ZUFybixcbiAgICB9O1xuICB9XG5cbn1cbiJdfQ==