@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
376 lines • 54.8 kB
JavaScript
import { Injectable } from '@angular/core';
import { DatePipe, gettext } from '@c8y/ngx-components';
import { FormControl, Validators } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components";
export class PlatformConfigurationFormProviderService {
constructor(c8yDatePipe) {
this.c8yDatePipe = c8yDatePipe;
this.lineBreakHint = gettext('Use [Enter] or <br> tag to add a new line');
this.exampleTomorrowDate = (() => {
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
return this.c8yDatePipe.transform(tomorrow, 'yyyy-MM-ddTHH:mm:ssZ');
})();
this.platformConfigurationFormDefinitions = {
'system.password.enforce.strength': {
formId: 'system.password.enforce.strength',
title: gettext('Enforce "green" passwords for all users'),
type: 'boolean',
control: new FormControl('')
},
'system.password.limit.validity': {
formId: 'system.password.limit.validity',
title: gettext('Password validity limit (days)'),
description: gettext('The number of days a password may be valid before it must be reset; minimum value is 0, maximum value is 999999. Leave empty to use the value from the tenant options.'),
type: 'number',
control: new FormControl('', [Validators.min(0), Validators.max(999999)])
},
'system.password.history.size': {
formId: 'system.password.history.size',
title: gettext('Password history size'),
description: gettext('The number of times before the current password can be reused. Minimum value is 0, preset value is 10.'),
type: 'number',
placeholder: `${gettext('e.g. {{ example }}')}`,
placeholderParams: { example: '10' },
control: new FormControl('', [Validators.min(0)])
},
'system.password.green.min-length': {
formId: 'system.password.green.min-length',
title: gettext('Minimal length of "green" password'),
description: gettext('The minimum number of characters which are required for a safe password. Minimum (and preset) value is 8, maximum value is 32. Leave empty to skip this constraint.'),
type: 'number',
control: new FormControl('', [Validators.min(8), Validators.max(32)])
},
'ui.email.protocolAndEncryption': {
formId: 'ui.email.protocolAndEncryption',
title: gettext('Protocol and encryption'),
type: 'select',
options: [
{
value: 'SMTP_PLAIN',
name: gettext('SMTP (no encryption)')
},
{
value: 'SMTP_ENCRYPTED',
name: gettext('SMTP (STARTTLS)')
},
{
value: 'SMTPS_ENCRYPTED',
name: gettext('SMTPS (SSL/TLS)')
}
],
skipOnSave: true,
control: new FormControl('')
},
'email.protocol': {
formId: 'email.protocol',
title: gettext('Protocol'),
type: 'select',
options: [
{
value: 'smtp',
name: 'SMTP'
},
{
value: 'smtps',
name: 'SMTPS'
}
],
control: new FormControl('')
},
'email.connection.encrypted': {
formId: 'email.connection.encrypted',
title: gettext('Connection encrypted'),
type: 'boolean',
control: new FormControl('')
},
'email.host': {
formId: 'email.host',
title: gettext('Host'),
type: 'string',
placeholder: `${gettext('e.g. {{ example }}')}`,
placeholderParams: { example: 'localhost' },
control: new FormControl('')
},
'email.port': {
formId: 'email.port',
title: gettext('Port'),
type: 'number',
placeholder: `${gettext('e.g. {{ example }}')}`,
placeholderParams: { example: '25' },
control: new FormControl('', [Validators.min(1), Validators.max(65535)])
},
'email.username': {
formId: 'email.username',
title: gettext('Username'),
type: 'string',
control: new FormControl('')
},
'credentials.email.password': {
formId: 'credentials.email.password',
title: gettext('Password'),
type: 'password',
control: new FormControl('')
},
'email.from': {
formId: 'email.from',
title: gettext('Sender address'),
type: 'string',
control: new FormControl('', [Validators.email])
},
'passwordReset.sendNotificationToUnknownEmails': {
formId: 'passwordReset.sendNotificationToUnknownEmails',
title: gettext('Send notifications to unknown email addresses'),
type: 'boolean',
control: new FormControl('')
},
'passwordReset.email.subject': {
formId: 'passwordReset.email.subject',
title: gettext('Email subject'),
description: gettext('Subject used for all password reset related emails'),
type: 'string',
control: new FormControl('')
},
'passwordReset.token.email.template': {
formId: 'passwordReset.token.email.template',
title: gettext('Password reset email template (when address is known)'),
description: `${gettext('Placeholders: {tenant-domain}, {host}, {token}, {username}, {email}. Whole link to reset password can be, for example: {tenant-domain}/apps/devicemanagement/index.html?token={token}&email={email}')}`,
type: 'textarea',
control: new FormControl(''),
lineBreakHint: true
},
'passwordReset.user.not.found.email.template': {
formId: 'passwordReset.user.not.found.email.template',
title: gettext('Password reset email template (when address is not known)'),
type: 'textarea',
control: new FormControl(''),
lineBreakHint: true
},
'passwordReset.success.email.template': {
formId: 'passwordReset.success.email.template',
title: gettext('Password change confirmation email template'),
description: `${gettext('Placeholders: {host}, {tenant-domain}, {username}')}`,
type: 'textarea',
control: new FormControl(''),
lineBreakHint: true
},
'passwordReset.invite.template': {
formId: 'passwordReset.invite.template',
title: gettext('Invitation email template'),
description: `${gettext('Placeholders: {tenant-domain}, {host}, {token}, {username}, {email}. Whole link to setup password can be, for example: {tenant-domain}/apps/devicemanagement/index.html?token={token}')}`,
type: 'textarea',
control: new FormControl(''),
lineBreakHint: true
},
'export.data.mail.subject': {
formId: 'export.data.mail.subject',
title: gettext('Email subject'),
description: gettext('Placeholders: {tenant-domain}, {host}, {binaryId}. Whole link to result file is: {tenant-domain}/inventory/binaries/{binaryId}'),
type: 'string',
control: new FormControl('')
},
'export.data.mail.text': {
formId: 'export.data.mail.text',
title: gettext('Email template'),
description: `${gettext('Placeholders: {tenant-domain}, {host}, {binaryId}. Whole link to result file is: {tenant-domain}/inventory/binaries/{binaryId}')}`,
type: 'textarea',
control: new FormControl(''),
lineBreakHint: true
},
'export.data.mail.text.userunauthorized': {
formId: 'export.data.mail.text.userunauthorized',
title: gettext('User unauthorized error message'),
description: gettext('Placeholders: {user}, {exportApi}'),
type: 'string',
control: new FormControl('')
},
'two-factor-authentication.token.sms.template': {
formId: 'two-factor-authentication.token.sms.template',
title: gettext('Verification token SMS template'),
description: gettext('Placeholder: {token} - created token'),
type: 'string',
placeholder: gettext('e.g.: Verification code: {token}'),
control: new FormControl('')
},
'system.support.url': {
formId: 'system.support.url',
title: gettext('URL'),
type: 'string',
description: gettext('Possible values: URL string, "false`KEEP_ORIGINAL`" (hides the link) or leave empty (uses the default). Applications can override this setting by defining "supportUrl`KEEP_ORIGINAL`" application option.'),
control: new FormControl('')
},
'storageLimit.warning.email.subject': {
formId: 'storageLimit.warning.email.subject',
title: gettext('Warning email subject'),
description: gettext('Email which will be sent one day before data is deleted'),
type: 'string',
control: new FormControl('')
},
'storageLimit.warning.email.template': {
formId: 'storageLimit.warning.email.template',
title: gettext('Warning email template'),
description: `${gettext('Email which will be sent one day before data is deleted. Placeholders: {tenant-domain}, {tenant}, {size} - storage usage in %')}`,
type: 'textarea',
control: new FormControl(''),
lineBreakHint: true
},
'storageLimit.process.email.subject': {
formId: 'storageLimit.process.email.subject',
title: gettext('Limit exceeded email subject'),
description: gettext('Email which will be sent after over-limit data has been deleted'),
type: 'string',
control: new FormControl('')
},
'storageLimit.process.email.template': {
formId: 'storageLimit.process.email.template',
title: gettext('Limit exceeded email template'),
description: `${gettext('Email which will be sent after over-limit data has been deleted. Placeholders: {tenant-domain}, {tenant}, {size} - storage usage in %')}`,
type: 'textarea',
control: new FormControl(''),
lineBreakHint: true
},
'tenantSuspend.mail.sendtosuspended': {
formId: 'tenantSuspend.mail.sendtosuspended',
title: gettext("Send email to suspended tenant's administrator"),
type: 'boolean',
control: new FormControl('')
},
'tenantSuspend.mail.additional.address': {
formId: 'tenantSuspend.mail.additional.address',
title: gettext('Tenant suspended email additional receiver'),
type: 'string',
control: new FormControl('', [Validators.email])
},
'tenantSuspend.mail.subject': {
formId: 'tenantSuspend.mail.subject',
title: gettext('Tenant suspended email subject'),
description: gettext("Placeholder: {tenant} - suspended tenant's ID; {tenant-domain} - tenant's domain"),
type: 'string',
control: new FormControl('')
},
'tenantSuspend.mail.text': {
formId: 'tenantSuspend.mail.text',
title: gettext('Tenant suspended email template'),
description: `${gettext("Placeholder: {tenant} - suspended tenant's ID; {tenant-domain} - tenant's domain")}`,
type: 'textarea',
control: new FormControl(''),
lineBreakHint: true
},
'system.support-user.enabled': {
formId: 'system.support-user.enabled',
title: gettext('Activate support user'),
description: gettext('Possible values: "true`KEEP_ORIGINAL`", "false`KEEP_ORIGINAL`", or a specific date until the user should remain active, for example, "{{ exampleDate }}". Leaving it blank, will set the value to "true`KEEP_ORIGINAL`".'),
descriptionTranslateParams: {
exampleDate: this.exampleTomorrowDate
},
type: 'string',
control: new FormControl(''),
placeholder: this.exampleTomorrowDate
},
'system.support-user.validity-limit': {
formId: 'system.support-user.validity-limit',
title: gettext('Validity limit'),
description: gettext('Each support user request from subtenant user will prolong support user access by the given number of hours (default: 24 hours). Leaving it blank, will set the value to "24".'),
type: 'number',
placeholder: `${gettext('e.g. {{ example }}')}`,
placeholderParams: { example: '24' },
control: new FormControl('', [Validators.min(0)])
}
};
this.optionsGroups = [
{
title: gettext('Passwords'),
id: 'passwordsOptions',
items: [
this.platformConfigurationFormDefinitions['system.password.enforce.strength'],
this.platformConfigurationFormDefinitions['system.password.limit.validity'],
this.platformConfigurationFormDefinitions['system.password.history.size'],
this.platformConfigurationFormDefinitions['system.password.green.min-length']
]
},
{
title: gettext('Two-factor authentication'),
id: 'twoFactorAuthenticationOptions',
items: [
this.platformConfigurationFormDefinitions['two-factor-authentication.token.sms.template']
]
},
{
title: gettext('Support link'),
id: 'supportLinkOptions',
items: [this.platformConfigurationFormDefinitions['system.support.url']]
},
{
title: gettext('Password reset'),
id: 'passwordResetOptions',
items: [
this.platformConfigurationFormDefinitions['passwordReset.sendNotificationToUnknownEmails'],
this.platformConfigurationFormDefinitions['passwordReset.token.email.template'],
this.platformConfigurationFormDefinitions['passwordReset.user.not.found.email.template'],
this.platformConfigurationFormDefinitions['passwordReset.email.subject'],
this.platformConfigurationFormDefinitions['passwordReset.success.email.template'],
this.platformConfigurationFormDefinitions['passwordReset.invite.template']
]
},
{
title: gettext('Support user'),
id: 'supportUserOptions',
items: [
this.platformConfigurationFormDefinitions['system.support-user.enabled'],
this.platformConfigurationFormDefinitions['system.support-user.validity-limit']
]
},
{
title: gettext('Email server'),
id: 'emailServerOptions',
items: [
this.platformConfigurationFormDefinitions['ui.email.protocolAndEncryption'],
this.platformConfigurationFormDefinitions['email.host'],
this.platformConfigurationFormDefinitions['email.port'],
this.platformConfigurationFormDefinitions['email.username'],
this.platformConfigurationFormDefinitions['credentials.email.password'],
this.platformConfigurationFormDefinitions['email.from']
]
},
{
title: gettext('Data export'),
id: 'dataExportOptions',
items: [
this.platformConfigurationFormDefinitions['export.data.mail.subject'],
this.platformConfigurationFormDefinitions['export.data.mail.text'],
this.platformConfigurationFormDefinitions['export.data.mail.text.userunauthorized']
]
},
{
title: gettext('Storage limit'),
id: 'storageLimitOptions',
items: [
this.platformConfigurationFormDefinitions['storageLimit.warning.email.subject'],
this.platformConfigurationFormDefinitions['storageLimit.warning.email.template'],
this.platformConfigurationFormDefinitions['storageLimit.process.email.subject'],
this.platformConfigurationFormDefinitions['storageLimit.process.email.template']
]
},
{
title: gettext('Suspending tenants'),
id: 'suspendingTenantsOptions',
items: [
this.platformConfigurationFormDefinitions['tenantSuspend.mail.sendtosuspended'],
this.platformConfigurationFormDefinitions['tenantSuspend.mail.additional.address'],
this.platformConfigurationFormDefinitions['tenantSuspend.mail.subject'],
this.platformConfigurationFormDefinitions['tenantSuspend.mail.text']
]
}
];
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlatformConfigurationFormProviderService, deps: [{ token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlatformConfigurationFormProviderService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlatformConfigurationFormProviderService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.DatePipe }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0tY29uZmlndXJhdGlvbi1mb3JtLXByb3ZpZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbGF0Zm9ybS1jb25maWd1cmF0aW9uL3BsYXRmb3JtLWNvbmZpZ3VyYXRpb24tZm9ybS1wcm92aWRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFLekQsTUFBTSxPQUFPLHdDQUF3QztJQXNZbkQsWUFBb0IsV0FBcUI7UUFBckIsZ0JBQVcsR0FBWCxXQUFXLENBQVU7UUFyWXpDLGtCQUFhLEdBQUcsT0FBTyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFFckUsd0JBQW1CLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1QixRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFTCx5Q0FBb0MsR0FBRztZQUNyQyxrQ0FBa0MsRUFBRTtnQkFDbEMsTUFBTSxFQUFFLGtDQUFrQztnQkFDMUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyx5Q0FBeUMsQ0FBQztnQkFDekQsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQzthQUM3QjtZQUNELGdDQUFnQyxFQUFFO2dCQUNoQyxNQUFNLEVBQUUsZ0NBQWdDO2dCQUN4QyxLQUFLLEVBQUUsT0FBTyxDQUFDLGdDQUFnQyxDQUFDO2dCQUNoRCxXQUFXLEVBQUUsT0FBTyxDQUNsQix3S0FBd0ssQ0FDeks7Z0JBQ0QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQzFFO1lBQ0QsOEJBQThCLEVBQUU7Z0JBQzlCLE1BQU0sRUFBRSw4QkFBOEI7Z0JBQ3RDLEtBQUssRUFBRSxPQUFPLENBQUMsdUJBQXVCLENBQUM7Z0JBQ3ZDLFdBQVcsRUFBRSxPQUFPLENBQ2xCLHdHQUF3RyxDQUN6RztnQkFDRCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRTtnQkFDL0MsaUJBQWlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO2dCQUNwQyxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2xEO1lBQ0Qsa0NBQWtDLEVBQUU7Z0JBQ2xDLE1BQU0sRUFBRSxrQ0FBa0M7Z0JBQzFDLEtBQUssRUFBRSxPQUFPLENBQUMsb0NBQW9DLENBQUM7Z0JBQ3BELFdBQVcsRUFBRSxPQUFPLENBQ2xCLHFLQUFxSyxDQUN0SztnQkFDRCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDdEU7WUFDRCxnQ0FBZ0MsRUFBRTtnQkFDaEMsTUFBTSxFQUFFLGdDQUFnQztnQkFDeEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQztnQkFDekMsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsT0FBTyxFQUFFO29CQUNQO3dCQUNFLEtBQUssRUFBRSxZQUFZO3dCQUNuQixJQUFJLEVBQUUsT0FBTyxDQUFDLHNCQUFzQixDQUFDO3FCQUN0QztvQkFDRDt3QkFDRSxLQUFLLEVBQUUsZ0JBQWdCO3dCQUN2QixJQUFJLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFDO3FCQUNqQztvQkFDRDt3QkFDRSxLQUFLLEVBQUUsaUJBQWlCO3dCQUN4QixJQUFJLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFDO3FCQUNqQztpQkFDRjtnQkFDRCxVQUFVLEVBQUUsSUFBSTtnQkFDaEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQzthQUM3QjtZQUNELGdCQUFnQixFQUFFO2dCQUNoQixNQUFNLEVBQUUsZ0JBQWdCO2dCQUN4QixLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsT0FBTyxFQUFFO29CQUNQO3dCQUNFLEtBQUssRUFBRSxNQUFNO3dCQUNiLElBQUksRUFBRSxNQUFNO3FCQUNiO29CQUNEO3dCQUNFLEtBQUssRUFBRSxPQUFPO3dCQUNkLElBQUksRUFBRSxPQUFPO3FCQUNkO2lCQUNGO2dCQUNELE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7YUFDN0I7WUFDRCw0QkFBNEIsRUFBRTtnQkFDNUIsTUFBTSxFQUFFLDRCQUE0QjtnQkFDcEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztnQkFDdEMsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQzthQUM3QjtZQUNELFlBQVksRUFBRTtnQkFDWixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO2dCQUMvQyxpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUU7Z0JBQzNDLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7YUFDN0I7WUFDRCxZQUFZLEVBQUU7Z0JBQ1osTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUN0QixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRTtnQkFDL0MsaUJBQWlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO2dCQUNwQyxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDekU7WUFDRCxnQkFBZ0IsRUFBRTtnQkFDaEIsTUFBTSxFQUFFLGdCQUFnQjtnQkFDeEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7YUFDN0I7WUFDRCw0QkFBNEIsRUFBRTtnQkFDNUIsTUFBTSxFQUFFLDRCQUE0QjtnQkFDcEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLElBQUksRUFBRSxVQUFVO2dCQUNoQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO2FBQzdCO1lBQ0QsWUFBWSxFQUFFO2dCQUNaLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixLQUFLLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDO2dCQUNoQyxJQUFJLEVBQUUsUUFBUTtnQkFDZCxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2pEO1lBQ0QsK0NBQStDLEVBQUU7Z0JBQy9DLE1BQU0sRUFBRSwrQ0FBK0M7Z0JBQ3ZELEtBQUssRUFBRSxPQUFPLENBQUMsK0NBQStDLENBQUM7Z0JBQy9ELElBQUksRUFBRSxTQUFTO2dCQUNmLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7YUFDN0I7WUFDRCw2QkFBNkIsRUFBRTtnQkFDN0IsTUFBTSxFQUFFLDZCQUE2QjtnQkFDckMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUM7Z0JBQy9CLFdBQVcsRUFBRSxPQUFPLENBQUMsb0RBQW9ELENBQUM7Z0JBQzFFLElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7YUFDN0I7WUFDRCxvQ0FBb0MsRUFBRTtnQkFDcEMsTUFBTSxFQUFFLG9DQUFvQztnQkFDNUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyx1REFBdUQsQ0FBQztnQkFDdkUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUNyQixxTUFBcU0sQ0FDdE0sRUFBRTtnQkFDSCxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsYUFBYSxFQUFFLElBQUk7YUFDcEI7WUFDRCw2Q0FBNkMsRUFBRTtnQkFDN0MsTUFBTSxFQUFFLDZDQUE2QztnQkFDckQsS0FBSyxFQUFFLE9BQU8sQ0FBQywyREFBMkQsQ0FBQztnQkFDM0UsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLGFBQWEsRUFBRSxJQUFJO2FBQ3BCO1lBQ0Qsc0NBQXNDLEVBQUU7Z0JBQ3RDLE1BQU0sRUFBRSxzQ0FBc0M7Z0JBQzlDLEtBQUssRUFBRSxPQUFPLENBQUMsNkNBQTZDLENBQUM7Z0JBQzdELFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxtREFBbUQsQ0FBQyxFQUFFO2dCQUM5RSxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsYUFBYSxFQUFFLElBQUk7YUFDcEI7WUFDRCwrQkFBK0IsRUFBRTtnQkFDL0IsTUFBTSxFQUFFLCtCQUErQjtnQkFDdkMsS0FBSyxFQUFFLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQztnQkFDM0MsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUNyQix1TEFBdUwsQ0FDeEwsRUFBRTtnQkFDSCxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsYUFBYSxFQUFFLElBQUk7YUFDcEI7WUFDRCwwQkFBMEIsRUFBRTtnQkFDMUIsTUFBTSxFQUFFLDBCQUEwQjtnQkFDbEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUM7Z0JBQy9CLFdBQVcsRUFBRSxPQUFPLENBQ2xCLGdJQUFnSSxDQUNqSTtnQkFDRCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO2FBQzdCO1lBQ0QsdUJBQXVCLEVBQUU7Z0JBQ3ZCLE1BQU0sRUFBRSx1QkFBdUI7Z0JBQy9CLEtBQUssRUFBRSxPQUFPLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ2hDLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FDckIsZ0lBQWdJLENBQ2pJLEVBQUU7Z0JBQ0gsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLGFBQWEsRUFBRSxJQUFJO2FBQ3BCO1lBQ0Qsd0NBQXdDLEVBQUU7Z0JBQ3hDLE1BQU0sRUFBRSx3Q0FBd0M7Z0JBQ2hELEtBQUssRUFBRSxPQUFPLENBQUMsaUNBQWlDLENBQUM7Z0JBQ2pELFdBQVcsRUFBRSxPQUFPLENBQUMsbUNBQW1DLENBQUM7Z0JBQ3pELElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7YUFDN0I7WUFDRCw4Q0FBOEMsRUFBRTtnQkFDOUMsTUFBTSxFQUFFLDhDQUE4QztnQkFDdEQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQztnQkFDakQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQztnQkFDNUQsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQztnQkFDeEQsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQzthQUM3QjtZQUNELG9CQUFvQixFQUFFO2dCQUNwQixNQUFNLEVBQUUsb0JBQW9CO2dCQUM1QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDckIsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLE9BQU8sQ0FDbEIsNE1BQTRNLENBQzdNO2dCQUNELE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7YUFDN0I7WUFDRCxvQ0FBb0MsRUFBRTtnQkFDcEMsTUFBTSxFQUFFLG9DQUFvQztnQkFDNUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztnQkFDdkMsV0FBVyxFQUFFLE9BQU8sQ0FBQyx5REFBeUQsQ0FBQztnQkFDL0UsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQzthQUM3QjtZQUNELHFDQUFxQyxFQUFFO2dCQUNyQyxNQUFNLEVBQUUscUNBQXFDO2dCQUM3QyxLQUFLLEVBQUUsT0FBTyxDQUFDLHdCQUF3QixDQUFDO2dCQUN4QyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQ3JCLCtIQUErSCxDQUNoSSxFQUFFO2dCQUNILElBQUksRUFBRSxVQUFVO2dCQUNoQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUM1QixhQUFhLEVBQUUsSUFBSTthQUNwQjtZQUNELG9DQUFvQyxFQUFFO2dCQUNwQyxNQUFNLEVBQUUsb0NBQW9DO2dCQUM1QyxLQUFLLEVBQUUsT0FBTyxDQUFDLDhCQUE4QixDQUFDO2dCQUM5QyxXQUFXLEVBQUUsT0FBTyxDQUFDLGlFQUFpRSxDQUFDO2dCQUN2RixJQUFJLEVBQUUsUUFBUTtnQkFDZCxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO2FBQzdCO1lBQ0QscUNBQXFDLEVBQUU7Z0JBQ3JDLE1BQU0sRUFBRSxxQ0FBcUM7Z0JBQzdDLEtBQUssRUFBRSxPQUFPLENBQUMsK0JBQStCLENBQUM7Z0JBQy9DLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FDckIsdUlBQXVJLENBQ3hJLEVBQUU7Z0JBQ0gsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLGFBQWEsRUFBRSxJQUFJO2FBQ3BCO1lBQ0Qsb0NBQW9DLEVBQUU7Z0JBQ3BDLE1BQU0sRUFBRSxvQ0FBb0M7Z0JBQzVDLEtBQUssRUFBRSxPQUFPLENBQUMsZ0RBQWdELENBQUM7Z0JBQ2hFLElBQUksRUFBRSxTQUFTO2dCQUNmLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7YUFDN0I7WUFDRCx1Q0FBdUMsRUFBRTtnQkFDdkMsTUFBTSxFQUFFLHVDQUF1QztnQkFDL0MsS0FBSyxFQUFFLE9BQU8sQ0FBQyw0Q0FBNEMsQ0FBQztnQkFDNUQsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNqRDtZQUNELDRCQUE0QixFQUFFO2dCQUM1QixNQUFNLEVBQUUsNEJBQTRCO2dCQUNwQyxLQUFLLEVBQUUsT0FBTyxDQUFDLGdDQUFnQyxDQUFDO2dCQUNoRCxXQUFXLEVBQUUsT0FBTyxDQUNsQixrRkFBa0YsQ0FDbkY7Z0JBQ0QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQzthQUM3QjtZQUNELHlCQUF5QixFQUFFO2dCQUN6QixNQUFNLEVBQUUseUJBQXlCO2dCQUNqQyxLQUFLLEVBQUUsT0FBTyxDQUFDLGlDQUFpQyxDQUFDO2dCQUNqRCxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQ3JCLGtGQUFrRixDQUNuRixFQUFFO2dCQUNILElBQUksRUFBRSxVQUFVO2dCQUNoQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUM1QixhQUFhLEVBQUUsSUFBSTthQUNwQjtZQUNELDZCQUE2QixFQUFFO2dCQUM3QixNQUFNLEVBQUUsNkJBQTZCO2dCQUNyQyxLQUFLLEVBQUUsT0FBTyxDQUFDLHVCQUF1QixDQUFDO2dCQUN2QyxXQUFXLEVBQUUsT0FBTyxDQUNsQiwwTkFBME4sQ0FDM047Z0JBQ0QsMEJBQTBCLEVBQUU7b0JBQzFCLFdBQVcsRUFBRSxJQUFJLENBQUMsbUJBQW1CO2lCQUN0QztnQkFDRCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUM1QixXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjthQUN0QztZQUNELG9DQUFvQyxFQUFFO2dCQUNwQyxNQUFNLEVBQUUsb0NBQW9DO2dCQUM1QyxLQUFLLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDO2dCQUNoQyxXQUFXLEVBQUUsT0FBTyxDQUNsQixnTEFBZ0wsQ0FDakw7Z0JBQ0QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEVBQUU7Z0JBQy9DLGlCQUFpQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtnQkFDcEMsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNsRDtTQUNGLENBQUM7UUFFRixrQkFBYSxHQUFHO1lBQ2Q7Z0JBQ0UsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQzNCLEVBQUUsRUFBRSxrQkFBa0I7Z0JBQ3RCLEtBQUssRUFBRTtvQkFDTCxJQUFJLENBQUMsb0NBQW9DLENBQUMsa0NBQWtDLENBQUM7b0JBQzdFLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxnQ0FBZ0MsQ0FBQztvQkFDM0UsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLDhCQUE4QixDQUFDO29CQUN6RSxJQUFJLENBQUMsb0NBQW9DLENBQUMsa0NBQWtDLENBQUM7aUJBQzlFO2FBQ0Y7WUFDRDtnQkFDRSxLQUFLLEVBQUUsT0FBTyxDQUFDLDJCQUEyQixDQUFDO2dCQUMzQyxFQUFFLEVBQUUsZ0NBQWdDO2dCQUNwQyxLQUFLLEVBQUU7b0JBQ0wsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLDhDQUE4QyxDQUFDO2lCQUMxRjthQUNGO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUM7Z0JBQzlCLEVBQUUsRUFBRSxvQkFBb0I7Z0JBQ3hCLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2FBQ3pFO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDaEMsRUFBRSxFQUFFLHNCQUFzQjtnQkFDMUIsS0FBSyxFQUFFO29CQUNMLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQywrQ0FBK0MsQ0FBQztvQkFDMUYsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLG9DQUFvQyxDQUFDO29CQUMvRSxJQUFJLENBQUMsb0NBQW9DLENBQUMsNkNBQTZDLENBQUM7b0JBQ3hGLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyw2QkFBNkIsQ0FBQztvQkFDeEUsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLHNDQUFzQyxDQUFDO29CQUNqRixJQUFJLENBQUMsb0NBQW9DLENBQUMsK0JBQStCLENBQUM7aUJBQzNFO2FBQ0Y7WUFDRDtnQkFDRSxLQUFLLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQztnQkFDOUIsRUFBRSxFQUFFLG9CQUFvQjtnQkFDeEIsS0FBSyxFQUFFO29CQUNMLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyw2QkFBNkIsQ0FBQztvQkFDeEUsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLG9DQUFvQyxDQUFDO2lCQUNoRjthQUNGO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUM7Z0JBQzlCLEVBQUUsRUFBRSxvQkFBb0I7Z0JBQ3hCLEtBQUssRUFBRTtvQkFDTCxJQUFJLENBQUMsb0NBQW9DLENBQUMsZ0NBQWdDLENBQUM7b0JBQzNFLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZELElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZELElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDM0QsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLDRCQUE0QixDQUFDO29CQUN2RSxJQUFJLENBQUMsb0NBQW9DLENBQUMsWUFBWSxDQUFDO2lCQUN4RDthQUNGO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUM7Z0JBQzdCLEVBQUUsRUFBRSxtQkFBbUI7Z0JBQ3ZCLEtBQUssRUFBRTtvQkFDTCxJQUFJLENBQUMsb0NBQW9DLENBQUMsMEJBQTBCLENBQUM7b0JBQ3JFLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDbEUsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLHdDQUF3QyxDQUFDO2lCQUNwRjthQUNGO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUM7Z0JBQy9CLEVBQUUsRUFBRSxxQkFBcUI7Z0JBQ3pCLEtBQUssRUFBRTtvQkFDTCxJQUFJLENBQUMsb0NBQW9DLENBQUMsb0NBQW9DLENBQUM7b0JBQy9FLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxxQ0FBcUMsQ0FBQztvQkFDaEYsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLG9DQUFvQyxDQUFDO29CQUMvRSxJQUFJLENBQUMsb0NBQW9DLENBQUMscUNBQXFDLENBQUM7aUJBQ2pGO2FBQ0Y7WUFDRDtnQkFDRSxLQUFLLEVBQUUsT0FBTyxDQUFDLG9CQUFvQixDQUFDO2dCQUNwQyxFQUFFLEVBQUUsMEJBQTBCO2dCQUM5QixLQUFLLEVBQUU7b0JBQ0wsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLG9DQUFvQyxDQUFDO29CQUMvRSxJQUFJLENBQUMsb0NBQW9DLENBQUMsdUNBQXVDLENBQUM7b0JBQ2xGLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyw0QkFBNEIsQ0FBQztvQkFDdkUsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLHlCQUF5QixDQUFDO2lCQUNyRTthQUNGO1NBQ0YsQ0FBQztJQUUwQyxDQUFDOytHQXRZbEMsd0NBQXdDO21IQUF4Qyx3Q0FBd0MsY0FGdkMsTUFBTTs7NEZBRVAsd0NBQXdDO2tCQUhwRCxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGVQaXBlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGxhdGZvcm1Db25maWd1cmF0aW9uRm9ybVByb3ZpZGVyU2VydmljZSB7XG4gIGxpbmVCcmVha0hpbnQgPSBnZXR0ZXh0KCdVc2UgW0VudGVyXSBvciA8YnI+IHRhZyB0byBhZGQgYSBuZXcgbGluZScpO1xuXG4gIGV4YW1wbGVUb21vcnJvd0RhdGUgPSAoKCkgPT4ge1xuICAgIGNvbnN0IHRvbW9ycm93ID0gbmV3IERhdGUoKTtcbiAgICB0b21vcnJvdy5zZXREYXRlKHRvbW9ycm93LmdldERhdGUoKSArIDEpO1xuICAgIHJldHVybiB0aGlzLmM4eURhdGVQaXBlLnRyYW5zZm9ybSh0b21vcnJvdywgJ3l5eXktTU0tZGRUSEg6bW06c3NaJyk7XG4gIH0pKCk7XG5cbiAgcGxhdGZvcm1Db25maWd1cmF0aW9uRm9ybURlZmluaXRpb25zID0ge1xuICAgICdzeXN0ZW0ucGFzc3dvcmQuZW5mb3JjZS5zdHJlbmd0aCc6IHtcbiAgICAgIGZvcm1JZDogJ3N5c3RlbS5wYXNzd29yZC5lbmZvcmNlLnN0cmVuZ3RoJyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdFbmZvcmNlIFwiZ3JlZW5cIiBwYXNzd29yZHMgZm9yIGFsbCB1c2VycycpLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgY29udHJvbDogbmV3IEZvcm1Db250cm9sKCcnKVxuICAgIH0sXG4gICAgJ3N5c3RlbS5wYXNzd29yZC5saW1pdC52YWxpZGl0eSc6IHtcbiAgICAgIGZvcm1JZDogJ3N5c3RlbS5wYXNzd29yZC5saW1pdC52YWxpZGl0eScsXG4gICAgICB0aXRsZTogZ2V0dGV4dCgnUGFzc3dvcmQgdmFsaWRpdHkgbGltaXQgKGRheXMpJyksXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0dGV4dChcbiAgICAgICAgJ1RoZSBudW1iZXIgb2YgZGF5cyBhIHBhc3N3b3JkIG1heSBiZSB2YWxpZCBiZWZvcmUgaXQgbXVzdCBiZSByZXNldDsgbWluaW11bSB2YWx1ZSBpcyAwLCBtYXhpbXVtIHZhbHVlIGlzIDk5OTk5OS4gTGVhdmUgZW1wdHkgdG8gdXNlIHRoZSB2YWx1ZSBmcm9tIHRoZSB0ZW5hbnQgb3B0aW9ucy4nXG4gICAgICApLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLm1pbigwKSwgVmFsaWRhdG9ycy5tYXgoOTk5OTk5KV0pXG4gICAgfSxcbiAgICAnc3lzdGVtLnBhc3N3b3JkLmhpc3Rvcnkuc2l6ZSc6IHtcbiAgICAgIGZvcm1JZDogJ3N5c3RlbS5wYXNzd29yZC5oaXN0b3J5LnNpemUnLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ1Bhc3N3b3JkIGhpc3Rvcnkgc2l6ZScpLFxuICAgICAgZGVzY3JpcHRpb246IGdldHRleHQoXG4gICAgICAgICdUaGUgbnVtYmVyIG9mIHRpbWVzIGJlZm9yZSB0aGUgY3VycmVudCBwYXNzd29yZCBjYW4gYmUgcmV1c2VkLiBNaW5pbXVtIHZhbHVlIGlzIDAsIHByZXNldCB2YWx1ZSBpcyAxMC4nXG4gICAgICApLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBwbGFjZWhvbGRlcjogYCR7Z2V0dGV4dCgnZS5nLiB7eyBleGFtcGxlIH19Jyl9YCxcbiAgICAgIHBsYWNlaG9sZGVyUGFyYW1zOiB7IGV4YW1wbGU6ICcxMCcgfSxcbiAgICAgIGNvbnRyb2w6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMubWluKDApXSlcbiAgICB9LFxuICAgICdzeXN0ZW0ucGFzc3dvcmQuZ3JlZW4ubWluLWxlbmd0aCc6IHtcbiAgICAgIGZvcm1JZDogJ3N5c3RlbS5wYXNzd29yZC5ncmVlbi5taW4tbGVuZ3RoJyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdNaW5pbWFsIGxlbmd0aCBvZiBcImdyZWVuXCIgcGFzc3dvcmQnKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KFxuICAgICAgICAnVGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggYXJlIHJlcXVpcmVkIGZvciBhIHNhZmUgcGFzc3dvcmQuIE1pbmltdW0gKGFuZCBwcmVzZXQpIHZhbHVlIGlzIDgsIG1heGltdW0gdmFsdWUgaXMgMzIuIExlYXZlIGVtcHR5IHRvIHNraXAgdGhpcyBjb25zdHJhaW50LidcbiAgICAgICksXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGNvbnRyb2w6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMubWluKDgpLCBWYWxpZGF0b3JzLm1heCgzMildKVxuICAgIH0sXG4gICAgJ3VpLmVtYWlsLnByb3RvY29sQW5kRW5jcnlwdGlvbic6IHtcbiAgICAgIGZvcm1JZDogJ3VpLmVtYWlsLnByb3RvY29sQW5kRW5jcnlwdGlvbicsXG4gICAgICB0aXRsZTogZ2V0dGV4dCgnUHJvdG9jb2wgYW5kIGVuY3J5cHRpb24nKSxcbiAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6ICdTTVRQX1BMQUlOJyxcbiAgICAgICAgICBuYW1lOiBnZXR0ZXh0KCdTTVRQIChubyBlbmNyeXB0aW9uKScpXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogJ1NNVFBfRU5DUllQVEVEJyxcbiAgICAgICAgICBuYW1lOiBnZXR0ZXh0KCdTTVRQIChTVEFSVFRMUyknKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6ICdTTVRQU19FTkNSWVBURUQnLFxuICAgICAgICAgIG5hbWU6IGdldHRleHQoJ1NNVFBTIChTU0wvVExTKScpXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBza2lwT25TYXZlOiB0cnVlLFxuICAgICAgY29udHJvbDogbmV3IEZvcm1Db250cm9sKCcnKVxuICAgIH0sXG4gICAgJ2VtYWlsLnByb3RvY29sJzoge1xuICAgICAgZm9ybUlkOiAnZW1haWwucHJvdG9jb2wnLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ1Byb3RvY29sJyksXG4gICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiAnc210cCcsXG4gICAgICAgICAgbmFtZTogJ1NNVFAnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogJ3NtdHBzJyxcbiAgICAgICAgICBuYW1lOiAnU01UUFMnXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycpXG4gICAgfSxcbiAgICAnZW1haWwuY29ubmVjdGlvbi5lbmNyeXB0ZWQnOiB7XG4gICAgICBmb3JtSWQ6ICdlbWFpbC5jb25uZWN0aW9uLmVuY3J5cHRlZCcsXG4gICAgICB0aXRsZTogZ2V0dGV4dCgnQ29ubmVjdGlvbiBlbmNyeXB0ZWQnKSxcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgIGNvbnRyb2w6IG5ldyBGb3JtQ29udHJvbCgnJylcbiAgICB9LFxuICAgICdlbWFpbC5ob3N0Jzoge1xuICAgICAgZm9ybUlkOiAnZW1haWwuaG9zdCcsXG4gICAgICB0aXRsZTogZ2V0dGV4dCgnSG9zdCcpLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBwbGFjZWhvbGRlcjogYCR7Z2V0dGV4dCgnZS5nLiB7eyBleGFtcGxlIH19Jyl9YCxcbiAgICAgIHBsYWNlaG9sZGVyUGFyYW1zOiB7IGV4YW1wbGU6ICdsb2NhbGhvc3QnIH0sXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycpXG4gICAgfSxcbiAgICAnZW1haWwucG9ydCc6IHtcbiAgICAgIGZvcm1JZDogJ2VtYWlsLnBvcnQnLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ1BvcnQnKSxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgcGxhY2Vob2xkZXI6IGAke2dldHRleHQoJ2UuZy4ge3sgZXhhbXBsZSB9fScpfWAsXG4gICAgICBwbGFjZWhvbGRlclBhcmFtczogeyBleGFtcGxlOiAnMjUnIH0sXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLm1pbigxKSwgVmFsaWRhdG9ycy5tYXgoNjU1MzUpXSlcbiAgICB9LFxuICAgICdlbWFpbC51c2VybmFtZSc6IHtcbiAgICAgIGZvcm1JZDogJ2VtYWlsLnVzZXJuYW1lJyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdVc2VybmFtZScpLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycpXG4gICAgfSxcbiAgICAnY3JlZGVudGlhbHMuZW1haWwucGFzc3dvcmQnOiB7XG4gICAgICBmb3JtSWQ6ICdjcmVkZW50aWFscy5lbWFpbC5wYXNzd29yZCcsXG4gICAgICB0aXRsZTogZ2V0dGV4dCgnUGFzc3dvcmQnKSxcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycpXG4gICAgfSxcbiAgICAnZW1haWwuZnJvbSc6IHtcbiAgICAgIGZvcm1JZDogJ2VtYWlsLmZyb20nLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ1NlbmRlciBhZGRyZXNzJyksXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGNvbnRyb2w6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMuZW1haWxdKVxuICAgIH0sXG4gICAgJ3Bhc3N3b3JkUmVzZXQuc2VuZE5vdGlmaWNhdGlvblRvVW5rbm93bkVtYWlscyc6IHtcbiAgICAgIGZvcm1JZDogJ3Bhc3N3b3JkUmVzZXQuc2VuZE5vdGlmaWNhdGlvblRvVW5rbm93bkVtYWlscycsXG4gICAgICB0aXRsZTogZ2V0dGV4dCgnU2VuZCBub3RpZmljYXRpb25zIHRvIHVua25vd24gZW1haWwgYWRkcmVzc2VzJyksXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycpXG4gICAgfSxcbiAgICAncGFzc3dvcmRSZXNldC5lbWFpbC5zdWJqZWN0Jzoge1xuICAgICAgZm9ybUlkOiAncGFzc3dvcmRSZXNldC5lbWFpbC5zdWJqZWN0JyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdFbWFpbCBzdWJqZWN0JyksXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0dGV4dCgnU3ViamVjdCB1c2VkIGZvciBhbGwgcGFzc3dvcmQgcmVzZXQgcmVsYXRlZCBlbWFpbHMnKSxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgY29udHJvbDogbmV3IEZvcm1Db250cm9sKCcnKVxuICAgIH0sXG4gICAgJ3Bhc3N3b3JkUmVzZXQudG9rZW4uZW1haWwudGVtcGxhdGUnOiB7XG4gICAgICBmb3JtSWQ6ICdwYXNzd29yZFJlc2V0LnRva2VuLmVtYWlsLnRlbXBsYXRlJyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdQYXNzd29yZCByZXNldCBlbWFpbCB0ZW1wbGF0ZSAod2hlbiBhZGRyZXNzIGlzIGtub3duKScpLFxuICAgICAgZGVzY3JpcHRpb246IGAke2dldHRleHQoXG4gICAgICAgICdQbGFjZWhvbGRlcnM6IHt0ZW5hbnQtZG9tYWlufSwge2hvc3R9LCB7dG9rZW59LCB7dXNlcm5hbWV9LCB7ZW1haWx9LiBXaG9sZSBsaW5rIHRvIHJlc2V0IHBhc3N3b3JkIGNhbiBiZSwgZm9yIGV4YW1wbGU6IHt0ZW5hbnQtZG9tYWlufS9hcHBzL2RldmljZW1hbmFnZW1lbnQvaW5kZXguaHRtbD90b2tlbj17dG9rZW59JmVtYWlsPXtlbWFpbH0nXG4gICAgICApfWAsXG4gICAgICB0eXBlOiAndGV4dGFyZWEnLFxuICAgICAgY29udHJvbDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIGxpbmVCcmVha0hpbnQ6IHRydWVcbiAgICB9LFxuICAgICdwYXNzd29yZFJlc2V0LnVzZXIubm90LmZvdW5kLmVtYWlsLnRlbXBsYXRlJzoge1xuICAgICAgZm9ybUlkOiAncGFzc3dvcmRSZXNldC51c2VyLm5vdC5mb3VuZC5lbWFpbC50ZW1wbGF0ZScsXG4gICAgICB0aXRsZTogZ2V0dGV4dCgnUGFzc3dvcmQgcmVzZXQgZW1haWwgdGVtcGxhdGUgKHdoZW4gYWRkcmVzcyBpcyBub3Qga25vd24pJyksXG4gICAgICB0eXBlOiAndGV4dGFyZWEnLFxuICAgICAgY29udHJvbDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIGxpbmVCcmVha0hpbnQ6IHRydWVcbiAgICB9LFxuICAgICdwYXNzd29yZFJlc2V0LnN1Y2Nlc3MuZW1haWwudGVtcGxhdGUnOiB7XG4gICAgICBmb3JtSWQ6ICdwYXNzd29yZFJlc2V0LnN1Y2Nlc3MuZW1haWwudGVtcGxhdGUnLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ1Bhc3N3b3JkIGNoYW5nZSBjb25maXJtYXRpb24gZW1haWwgdGVtcGxhdGUnKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgJHtnZXR0ZXh0KCdQbGFjZWhvbGRlcnM6IHtob3N0fSwge3RlbmFudC1kb21haW59LCB7dXNlcm5hbWV9Jyl9YCxcbiAgICAgIHR5cGU6ICd0ZXh0YXJlYScsXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgbGluZUJyZWFrSGludDogdHJ1ZVxuICAgIH0sXG4gICAgJ3Bhc3N3b3JkUmVzZXQuaW52aXRlLnRlbXBsYXRlJzoge1xuICAgICAgZm9ybUlkOiAncGFzc3dvcmRSZXNldC5pbnZpdGUudGVtcGxhdGUnLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ0ludml0YXRpb24gZW1haWwgdGVtcGxhdGUnKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgJHtnZXR0ZXh0KFxuICAgICAgICAnUGxhY2Vob2xkZXJzOiB7dGVuYW50LWRvbWFpbn0sIHtob3N0fSwge3Rva2VufSwge3VzZXJuYW1lfSwge2VtYWlsfS4gV2hvbGUgbGluayB0byBzZXR1cCBwYXNzd29yZCBjYW4gYmUsIGZvciBleGFtcGxlOiB7dGVuYW50LWRvbWFpbn0vYXBwcy9kZXZpY2VtYW5hZ2VtZW50L2luZGV4Lmh0bWw/dG9rZW49e3Rva2VufSdcbiAgICAgICl9YCxcbiAgICAgIHR5cGU6ICd0ZXh0YXJlYScsXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgbGluZUJyZWFrSGludDogdHJ1ZVxuICAgIH0sXG4gICAgJ2V4cG9ydC5kYXRhLm1haWwuc3ViamVjdCc6IHtcbiAgICAgIGZvcm1JZDogJ2V4cG9ydC5kYXRhLm1haWwuc3ViamVjdCcsXG4gICAgICB0aXRsZTogZ2V0dGV4dCgnRW1haWwgc3ViamVjdCcpLFxuICAgICAgZGVzY3JpcHRpb246IGdldHRleHQoXG4gICAgICAgICdQbGFjZWhvbGRlcnM6IHt0ZW5hbnQtZG9tYWlufSwge2hvc3R9LCB7YmluYXJ5SWR9LiBXaG9sZSBsaW5rIHRvIHJlc3VsdCBmaWxlIGlzOiB7dGVuYW50LWRvbWFpbn0vaW52ZW50b3J5L2JpbmFyaWVzL3tiaW5hcnlJZH0nXG4gICAgICApLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycpXG4gICAgfSxcbiAgICAnZXhwb3J0LmRhdGEubWFpbC50ZXh0Jzoge1xuICAgICAgZm9ybUlkOiAnZXhwb3J0LmRhdGEubWFpbC50ZXh0JyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdFbWFpbCB0ZW1wbGF0ZScpLFxuICAgICAgZGVzY3JpcHRpb246IGAke2dldHRleHQoXG4gICAgICAgICdQbGFjZWhvbGRlcnM6IHt0ZW5hbnQtZG9tYWlufSwge2hvc3R9LCB7YmluYXJ5SWR9LiBXaG9sZSBsaW5rIHRvIHJlc3VsdCBmaWxlIGlzOiB7dGVuYW50LWRvbWFpbn0vaW52ZW50b3J5L2JpbmFyaWVzL3tiaW5hcnlJZH0nXG4gICAgICApfWAsXG4gICAgICB0eXBlOiAndGV4dGFyZWEnLFxuICAgICAgY29udHJvbDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIGxpbmVCcmVha0hpbnQ6IHRydWVcbiAgICB9LFxuICAgICdleHBvcnQuZGF0YS5tYWlsLnRleHQudXNlcnVuYXV0aG9yaXplZCc6IHtcbiAgICAgIGZvcm1JZDogJ2V4cG9ydC5kYXRhLm1haWwudGV4dC51c2VydW5hdXRob3JpemVkJyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdVc2VyIHVuYXV0aG9yaXplZCBlcnJvciBtZXNzYWdlJyksXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0dGV4dCgnUGxhY2Vob2xkZXJzOiB7dXNlcn0sIHtleHBvcnRBcGl9JyksXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGNvbnRyb2w6IG5ldyBGb3JtQ29udHJvbCgnJylcbiAgICB9LFxuICAgICd0d28tZmFjdG9yLWF1dGhlbnRpY2F0aW9uLnRva2VuLnNtcy50ZW1wbGF0ZSc6IHtcbiAgICAgIGZvcm1JZDogJ3R3by1mYWN0b3ItYXV0aGVudGljYXRpb24udG9rZW4uc21zLnRlbXBsYXRlJyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdWZXJpZmljYXRpb24gdG9rZW4gU01TIHRlbXBsYXRlJyksXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0dGV4dCgnUGxhY2Vob2xkZXI6IHt0b2tlbn0gLSBjcmVhdGVkIHRva2VuJyksXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIHBsYWNlaG9sZGVyOiBnZXR0ZXh0KCdlLmcuOiBWZXJpZmljYXRpb24gY29kZToge3Rva2VufScpLFxuICAgICAgY29udHJvbDogbmV3IEZvcm1Db250cm9sKCcnKVxuICAgIH0sXG4gICAgJ3N5c3RlbS5zdXBwb3J0LnVybCc6IHtcbiAgICAgIGZvcm1JZDogJ3N5c3RlbS5zdXBwb3J0LnVybCcsXG4gICAgICB0aXRsZTogZ2V0dGV4dCgnVVJMJyksXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KFxuICAgICAgICAnUG9zc2libGUgdmFsdWVzOiBVUkwgc3RyaW5nLCBcImZhbHNlYEtFRVBfT1JJR0lOQUxgXCIgKGhpZGVzIHRoZSBsaW5rKSBvciBsZWF2ZSBlbXB0eSAodXNlcyB0aGUgZGVmYXVsdCkuIEFwcGxpY2F0aW9ucyBjYW4gb3ZlcnJpZGUgdGhpcyBzZXR0aW5nIGJ5IGRlZmluaW5nIFwic3VwcG9ydFVybGBLRUVQX09SSUdJTkFMYFwiIGFwcGxpY2F0aW9uIG9wdGlvbi4nXG4gICAgICApLFxuICAgICAgY29udHJvbDogbmV3IEZvcm1Db250cm9sKCcnKVxuICAgIH0sXG4gICAgJ3N0b3JhZ2VMaW1pdC53YXJuaW5nLmVtYWlsLnN1YmplY3QnOiB7XG4gICAgICBmb3JtSWQ6ICdzdG9yYWdlTGltaXQud2FybmluZy5lbWFpbC5zdWJqZWN0JyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdXYXJuaW5nIGVtYWlsIHN1YmplY3QnKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdFbWFpbCB3aGljaCB3aWxsIGJlIHNlbnQgb25lIGRheSBiZWZvcmUgZGF0YSBpcyBkZWxldGVkJyksXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGNvbnRyb2w6IG5ldyBGb3JtQ29udHJvbCgnJylcbiAgICB9LFxuICAgICdzdG9yYWdlTGltaXQud2FybmluZy5lbWFpbC50ZW1wbGF0ZSc6IHtcbiAgICAgIGZvcm1JZDogJ3N0b3JhZ2VMaW1pdC53YXJuaW5nLmVtYWlsLnRlbXBsYXRlJyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdXYXJuaW5nIGVtYWlsIHRlbXBsYXRlJyksXG4gICAgICBkZXNjcmlwdGlvbjogYCR7Z2V0dGV4dChcbiAgICAgICAgJ0VtYWlsIHdoaWNoIHdpbGwgYmUgc2VudCBvbmUgZGF5IGJlZm9yZSBkYXRhIGlzIGRlbGV0ZWQuIFBsYWNlaG9sZGVyczoge3RlbmFudC1kb21haW59LCB7dGVuYW50fSwge3NpemV9IC0gc3RvcmFnZSB1c2FnZSBpbiAlJ1xuICAgICAgKX1gLFxuICAgICAgdHlwZTogJ3RleHRhcmVhJyxcbiAgICAgIGNvbnRyb2w6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICBsaW5lQnJlYWtIaW50OiB0cnVlXG4gICAgfSxcbiAgICAnc3RvcmFnZUxpbWl0LnByb2Nlc3MuZW1haWwuc3ViamVjdCc6IHtcbiAgICAgIGZvcm1JZDogJ3N0b3JhZ2VMaW1pdC5wcm9jZXNzLmVtYWlsLnN1YmplY3QnLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ0xpbWl0IGV4Y2VlZGVkIGVtYWlsIHN1YmplY3QnKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdFbWFpbCB3aGljaCB3aWxsIGJlIHNlbnQgYWZ0ZXIgb3Zlci1saW1pdCBkYXRhIGhhcyBiZWVuIGRlbGV0ZWQnKSxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgY29udHJvbDogbmV3IEZvcm1Db250cm9sKCcnKVxuICAgIH0sXG4gICAgJ3N0b3JhZ2VMaW1pdC5wcm9jZXNzLmVtYWlsLnRlbXBsYXRlJzoge1xuICAgICAgZm9ybUlkOiAnc3RvcmFnZUxpbWl0LnByb2Nlc3MuZW1haWwudGVtcGxhdGUnLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ0xpbWl0IGV4Y2VlZGVkIGVtYWlsIHRlbXBsYXRlJyksXG4gICAgICBkZXNjcmlwdGlvbjogYCR7Z2V0dGV4dChcbiAgICAgICAgJ0VtYWlsIHdoaWNoIHdpbGwgYmUgc2VudCBhZnRlciBvdmVyLWxpbWl0IGRhdGEgaGFzIGJlZW4gZGVsZXRlZC4gUGxhY2Vob2xkZXJzOiB7dGVuYW50LWRvbWFpbn0sIHt0ZW5hbnR9LCB7c2l6ZX0gLSBzdG9yYWdlIHVzYWdlIGluICUnXG4gICAgICApfWAsXG4gICAgICB0eXBlOiAndGV4dGFyZWEnLFxuICAgICAgY29udHJvbDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIGxpbmVCcmVha0hpbnQ6IHRydWVcbiAgICB9LFxuICAgICd0ZW5hbnRTdXNwZW5kLm1haWwuc2VuZHRvc3VzcGVuZGVkJzoge1xuICAgICAgZm9ybUlkOiAndGVuYW50U3VzcGVuZC5tYWlsLnNlbmR0b3N1c3BlbmRlZCcsXG4gICAgICB0aXRsZTogZ2V0dGV4dChcIlNlbmQgZW1haWwgdG8gc3VzcGVuZGVkIHRlbmFudCdzIGFkbWluaXN0cmF0b3JcIiksXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycpXG4gICAgfSxcbiAgICAndGVuYW50U3VzcGVuZC5tYWlsLmFkZGl0aW9uYWwuYWRkcmVzcyc6IHtcbiAgICAgIGZvcm1JZDogJ3RlbmFudFN1c3BlbmQubWFpbC5hZGRpdGlvbmFsLmFkZHJlc3MnLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ1RlbmFudCBzdXNwZW5kZWQgZW1haWwgYWRkaXRpb25hbCByZWNlaXZlcicpLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLmVtYWlsXSlcbiAgICB9LFxuICAgICd0ZW5hbnRTdXNwZW5kLm1haWwuc3ViamVjdCc6IHtcbiAgICAgIGZvcm1JZDogJ3RlbmFudFN1c3BlbmQubWFpbC5zdWJqZWN0JyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdUZW5hbnQgc3VzcGVuZGVkIGVtYWlsIHN1YmplY3QnKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KFxuICAgICAgICBcIlBsYWNlaG9sZGVyOiB7dGVuYW50fSAtIHN1c3BlbmRlZCB0ZW5hbnQncyBJRDsge3RlbmFudC1kb21haW59IC0gdGVuYW50J3MgZG9tYWluXCJcbiAgICAgICksXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGNvbnRyb2w6IG5ldyBGb3JtQ29udHJvbCgnJylcbiAgICB9LFxuICAgICd0ZW5hbnRTdXNwZW5kLm1haWwudGV4dCc6IHtcbiAgICAgIGZvcm1JZDogJ3RlbmFudFN1c3BlbmQubWFpbC50ZXh0JyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdUZW5hbnQgc3VzcGVuZGVkIGVtYWlsIHRlbXBsYXRlJyksXG4gICAgICBkZXNjcmlwdGlvbjogYCR7Z2V0dGV4dChcbiAgICAgICAgXCJQbGFjZWhvbGRlcjoge3RlbmFudH0gLSBzdXNwZW5kZWQgdGVuYW50J3MgSUQ7IHt0ZW5hbnQtZG9tYWlufSAtIHRlbmFudCdzIGRvbWFpblwiXG4gICAgICApfWAsXG4gICAgICB0eXBlOiAndGV4dGFyZWEnLFxuICAgICAgY29udHJvbDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIGxpbmVCcmVha0hpbnQ6IHRydWVcbiAgICB9LFxuICAgICdzeXN0ZW0uc3VwcG9ydC11c2VyLmVuYWJsZWQnOiB7XG4gICAgICBmb3JtSWQ6ICdzeXN0ZW0uc3VwcG9ydC11c2VyLmVuYWJsZWQnLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ0FjdGl2YXRlIHN1cHBvcnQgdXNlcicpLFxuICAgICAgZGVzY3JpcHRpb246IGdldHRleHQoXG4gICAgICAgICdQb3NzaWJsZSB2YWx1ZXM6IFwidHJ1ZWBLRUVQX09SSUdJTkFMYFwiLCBcImZhbHNlYEtFRVBfT1JJR0lOQUxgXCIsIG9yIGEgc3BlY2lmaWMgZGF0ZSB1bnRpbCB0aGUgdXNlciBzaG91bGQgcmVtYWluIGFjdGl2ZSwgZm9yIGV4YW1wbGUsIFwie3sgZXhhbXBsZURhdGUgfX1cIi4gTGVhdmluZyBpdCBibGFuaywgd2lsbCBzZXQgdGhlIHZhbHVlIHRvIFwidHJ1ZWBLRUVQX09SSUdJTkFMYFwiLidcbiAgICAgICksXG4gICAgICBkZXNjcmlwdGlvblRyYW5zbGF0ZVBhcmFtczoge1xuICAgICAgICBleGFtcGxlRGF0ZTogdGhpcy5leGFtcGxlVG9tb3Jyb3dEYXRlXG4gICAgICB9LFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBjb250cm9sOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMuZXhhbXBsZVRvbW9ycm93RGF0ZVxuICAgIH0sXG4gICAgJ3N5c3RlbS5zdXBwb3J0LXVzZXIudmFsaWRpdHktbGltaXQnOiB7XG4gICAgICBmb3JtSWQ6ICdzeXN0ZW0uc3VwcG9ydC11c2VyLnZhbGlkaXR5LWxpbWl0JyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdWYWxpZGl0eSBsaW1pdCcpLFxuICAgICAgZGVzY3JpcHRpb246IGdldHRleHQoXG4gICAgICAgICdFYWNoIHN1cHBvcnQgdXNlciByZXF1ZXN0IGZyb20gc3VidGVuYW50IHVzZXIgd2lsbCBwcm9sb25nIHN1cHBvcnQgdXNlciBhY2Nlc3MgYnkgdGhlIGdpdmVuIG51bWJlciBvZiBob3VycyAoZGVmYXVsdDogMjQgaG91cnMpLiBMZWF2aW5nIGl0IGJsYW5rLCB3aWxsIHNldCB0aGUgdmFsdWUgdG8gXCIyNFwiLidcbiAgICAgICksXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIHBsYWNlaG9sZGVyOiBgJHtnZXR0ZXh0KCdlLmcuIHt7IGV4YW1wbGUgfX0nKX1gLFxuICAgICAgcGxhY2Vob2xkZXJQYXJhbXM6IHsgZXhhbXBsZTogJzI0JyB9LFxuICAgICAgY29udHJvbDogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5taW4oMCldKVxuICAgIH1cbiAgfTtcblxuICBvcHRpb25zR3JvdXBzID0gW1xuICAgIHtcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdQYXNzd29yZHMnKSxcbiAgICAgIGlkOiAncGFzc3dvcmRzT3B0aW9ucycsXG4gICAgICBpdGVtczogW1xuICAgICAgICB0aGlzLnBsYXRmb3JtQ29uZm