@posiwise/admin-module 0.0.176 → 0.0.178
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.
- package/esm2022/lib/components/domain-config/domain-config-details/domain-config-build/domain-config-build.component.mjs +8 -8
- package/esm2022/lib/components/domain-config/domain-config-details/domain-config-interface/domain-config-interface.component.mjs +7 -7
- package/esm2022/lib/components/incidents/add-edit-incident/add-edit-incident.component.mjs +8 -4
- package/esm2022/lib/components/products/product-details/product-details.component.mjs +41 -21
- package/esm2022/lib/components/resources/resources-admin-details/resources-admin-details.component.mjs +7 -6
- package/esm2022/lib/components/subscriptions/subscriptions-list/subscriptions-list.component.mjs +3 -3
- package/esm2022/lib/components/tags/tags-details/tags-details.component.mjs +6 -5
- package/esm2022/lib/shared/interface/admin-module-shared.interface.mjs +1 -1
- package/fesm2022/posiwise-admin-module.mjs +110 -86
- package/fesm2022/posiwise-admin-module.mjs.map +1 -1
- package/lib/components/domain-config/domain-config-details/domain-config-build/domain-config-build.component.d.ts +1 -1
- package/lib/components/domain-config/domain-config-details/domain-config-interface/domain-config-interface.component.d.ts +1 -1
- package/lib/components/products/product-details/product-details.component.d.ts +4 -0
- package/lib/shared/interface/admin-module-shared.interface.d.ts +1 -0
- package/package.json +1 -1
|
@@ -18,10 +18,11 @@ import * as i8 from "@angular/common";
|
|
|
18
18
|
import * as i9 from "@angular/forms";
|
|
19
19
|
import * as i10 from "ngx-ui-switch";
|
|
20
20
|
import * as i11 from "primeng/progressspinner";
|
|
21
|
-
import * as i12 from "@posiwise/
|
|
22
|
-
import * as i13 from "@posiwise/
|
|
23
|
-
import * as i14 from "
|
|
24
|
-
import * as i15 from "
|
|
21
|
+
import * as i12 from "@posiwise/utils";
|
|
22
|
+
import * as i13 from "@posiwise/shared-components";
|
|
23
|
+
import * as i14 from "@posiwise/directives";
|
|
24
|
+
import * as i15 from "ngx-quill";
|
|
25
|
+
import * as i16 from "@jsverse/transloco";
|
|
25
26
|
export class ProductDetailsComponent extends AppBaseComponent {
|
|
26
27
|
constructor(injector, productService, modalService, adminService) {
|
|
27
28
|
super(injector);
|
|
@@ -34,6 +35,8 @@ export class ProductDetailsComponent extends AppBaseComponent {
|
|
|
34
35
|
this.selectedProducts = [];
|
|
35
36
|
this.selectedScopes = [];
|
|
36
37
|
this.selectedPartnerProducts = [];
|
|
38
|
+
this.unsubscribeBehaviors = [];
|
|
39
|
+
this.prorationBehaviors = [];
|
|
37
40
|
this.frequency = [
|
|
38
41
|
{
|
|
39
42
|
label: 'Select',
|
|
@@ -86,6 +89,8 @@ export class ProductDetailsComponent extends AppBaseComponent {
|
|
|
86
89
|
this.getProducts();
|
|
87
90
|
this.getAllTos(1, this.PAGE_SIZE);
|
|
88
91
|
this.getRoles();
|
|
92
|
+
this.getUnsubscribeBehaviors();
|
|
93
|
+
this.getProrationBehaviors();
|
|
89
94
|
}
|
|
90
95
|
get f() {
|
|
91
96
|
return this.form.controls;
|
|
@@ -212,18 +217,11 @@ export class ProductDetailsComponent extends AppBaseComponent {
|
|
|
212
217
|
};
|
|
213
218
|
this.adminService
|
|
214
219
|
.saveProductRoles(this.subscriptionsRolesData)
|
|
215
|
-
.subscribe(
|
|
216
|
-
this.toast.success(this.translation.translate('Admin.Users.UpdatedRole'));
|
|
217
|
-
});
|
|
220
|
+
.subscribe();
|
|
218
221
|
}
|
|
219
222
|
this.back();
|
|
220
|
-
this.toast.success(this.translation.translate('Admin.Products.AddedMessage'));
|
|
221
223
|
}
|
|
222
|
-
|
|
223
|
-
this.toast.error(this.translation.translate('GenericMessage.WentWrong'));
|
|
224
|
-
}
|
|
225
|
-
},
|
|
226
|
-
error: error => this.toast.showToast(error)
|
|
224
|
+
}
|
|
227
225
|
})
|
|
228
226
|
.add(() => {
|
|
229
227
|
this.submitted = false;
|
|
@@ -238,12 +236,8 @@ export class ProductDetailsComponent extends AppBaseComponent {
|
|
|
238
236
|
};
|
|
239
237
|
delete data.roles;
|
|
240
238
|
this.productService.updateProduct(data, this.id).subscribe(response => {
|
|
241
|
-
if (response.error) {
|
|
242
|
-
this.toast.error(this.translation.translate('GenericMessage.WentWrong'));
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
239
|
+
if (!response.error) {
|
|
245
240
|
this.form.patchValue(response);
|
|
246
|
-
this.toast.success(this.translation.translate('Admin.Products.UpdatedMessage'));
|
|
247
241
|
this.back();
|
|
248
242
|
}
|
|
249
243
|
});
|
|
@@ -286,6 +280,32 @@ export class ProductDetailsComponent extends AppBaseComponent {
|
|
|
286
280
|
});
|
|
287
281
|
});
|
|
288
282
|
}
|
|
283
|
+
getUnsubscribeBehaviors() {
|
|
284
|
+
this.productService.getAvailableStripeUnsubscribeBehaviors().subscribe(response => {
|
|
285
|
+
const behaviors = response?.available_stripe_unsubscribe_behaviors || [];
|
|
286
|
+
if (Array.isArray(behaviors) && behaviors.length > 0) {
|
|
287
|
+
this.unsubscribeBehaviors = behaviors.map(item => {
|
|
288
|
+
return {
|
|
289
|
+
label: item,
|
|
290
|
+
value: item
|
|
291
|
+
};
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
getProrationBehaviors() {
|
|
297
|
+
this.productService.getAvailableStripeProrationBehaviors().subscribe(response => {
|
|
298
|
+
const behaviors = response?.available_stripe_proration_behaviors || [];
|
|
299
|
+
if (Array.isArray(behaviors) && behaviors.length > 0) {
|
|
300
|
+
this.prorationBehaviors = behaviors.map(item => {
|
|
301
|
+
return {
|
|
302
|
+
label: item,
|
|
303
|
+
value: item
|
|
304
|
+
};
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
}
|
|
289
309
|
openModal(content) {
|
|
290
310
|
this.modalService.open(content, { centered: true, windowClass: 'modal-holder' });
|
|
291
311
|
}
|
|
@@ -335,7 +355,7 @@ export class ProductDetailsComponent extends AppBaseComponent {
|
|
|
335
355
|
super.ngOnDestroy();
|
|
336
356
|
}
|
|
337
357
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ProductDetailsComponent, deps: [{ token: i0.Injector }, { token: i1.ProductService }, { token: i2.NgbModal }, { token: i3.AdminService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
338
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: ProductDetailsComponent, selector: "pw-product-details", usesInheritance: true, ngImport: i0, template: "<div class=\"container-fluid pw-tab product-form overflow-hidden\">\n <div class=\"dashboard\">\n <div class=\"dashboard-body\">\n <div class=\"me-auto col-xs-6 mt-4\">\n <a aria-label=\"Navigate to Target\" (click)=\"back()\" class=\"previous\"><i class=\"fa fa-arrow-alt-circle-left\"\n aria-hidden=\"true\"></i></a>\n <h3 class=\"\">Product: {{ data?.name ? data?.name : 'Add New' }}</h3>\n </div>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"isLoading\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div class=\"my-4\" *ngIf=\"!isLoading\">\n <div class=\"mb-5\">\n <p-accordion>\n <p-accordionTab [header]=\"'How To'\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\">\n <h4>Product / Feature logic</h4>\n <p> Logic for back-end/front-end permissions binding:\n <br /> * product.category (these are features) => type of product, i.e., seat_pricing or item_pricing\n <br /> * product.feature_key => this describes the main feature\n <br /> * product.permission_key => users can be subscribed to only one product of same permission_key\n <br /> * product.product_key => this is unique to each product, it defines the permission for frontend binding\n <br /> * Example of permission => {{ 'Pages.Product.{permission_key}.{product_key}' }}\n <br /> * If it's a feature associated to an existing project, you can to set the \"dependency product\" accordingly. </p>\n </div>\n <div class=\"col-12 col-md-6\">\n <h4>If it's a Free Product</h4>\n <p> Stripe Plan needs to be nil. <br /> \"Price\" per Unit needs to be set as 0. <br /> \"Trial Days\" needs\n to be something like 99999. <br /> The product should be set as \"visible===false\". </p>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n <div class=\"row\" *ngIf=\"id\">\n <div class=\"col-md-6\">\n <div class=\"text-center mt-5\">\n <div class=\"image-container\">\n <h4 class=\"mb-2\"> {{ 'User.Subscriptions.FullLogo' | transloco }} <span class=\"tooltip-wrap ms-1\"\n [pTooltip]=\"'User.Subscriptions.Tooltip.FullLogo'|transloco\" [appendTo]=\"'body'\"\n [tooltipPosition]=\"'top'\">\n <i class=\"fas fa-info-circle\"></i>\n </span>\n </h4>\n <img [src]=\"fullLogo\" alt=\"Demo Logo\" class=\"image full-logo w-100 h-100\"\n (error)=\"handleImageError($event, 'assets/img/icons/demo_logo1.png')\" />\n <div class=\"overlay mt-2\" (click)=\"openModal(content)\" (keydown.enter)=\"openModal(content)\">\n <div class=\"overlay-text\">\n <a aria-label=\"Navigate to Target\">{{ 'User.Profile.Change' | transloco }}</a>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"text-center mt-5\">\n <div class=\"image-container\">\n <h4 class=\"mb-2\"> {{ 'User.Subscriptions.SquaredLogo' | transloco }} <span class=\"tooltip-wrap ms-1\"\n [pTooltip]=\"'User.Subscriptions.Tooltip.SquaredLogo'|transloco\" [appendTo]=\"'body'\"\n [tooltipPosition]=\"'top'\">\n <i class=\"fas fa-info-circle\"></i>\n </span>\n </h4>\n <img [src]=\"squaredLogo\" alt=\"Company Logo\" width=\"70\" class=\"squared_logo\" height=\"70\"\n (error)=\"handleImageError($event, 'assets/img/icons/company.png')\" />\n <div class=\"overlay mt-2\" (keydown.enter)=\"openModal(squaredLogoContent)\" (click)=\"openModal(squaredLogoContent)\">\n <div class=\"overlay-text\">\n <a aria-label=\"Navigate to Target\">{{ 'User.Profile.Change' | transloco }}</a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <form [formGroup]=\"form\" (ngSubmit)=\"onSave()\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Name' | transloco\"\n [label]=\"'Label.Name' | transloco\" class=\"col-md-6 p-0\" name=\"name\"\n [isLeftTooltip]=\"true\"\n [errorMsg]=\"'Admin.Products.Validation.Name' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"name\"\n [ngClass]=\"{ 'is-invalid': submitted && f['name'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-md-6\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.NickName' | transloco\"\n [label]=\"'Admin.Products.NickName' | transloco\" class=\"col-md-6 p-0\" name=\"nickname\" [errorMsg]=\"\n 'Admin.Products.Validation.NickName' | transloco\n \">\n <input type=\"text\" class=\"form-control\" formControlName=\"nickname\" [ngClass]=\"{\n 'is-invalid': submitted && f['nickname'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"row\">\n <div class=\"mb-3 col-12 col-md-6\">\n <pw-input-container [label]=\"'Admin.Products.MinUnit' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MinUnits' | transloco\" class=\"col-md-6 p-0\" name=\"min_units\"\n [errorMsg]=\"'Admin.Products.Validation.MinUnit' | transloco\">\n <input type=\"number\" min=\"1\" class=\"form-control\" formControlName=\"min_units\" [ngClass]=\"{\n 'is-invalid': submitted && f['min_units'].errors\n }\" />\n </pw-input-container>\n </div>\n <div class=\"mb-3 col-12 col-md-6\">\n <pw-input-container [label]=\"'Admin.Products.MaxUnit' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MaxUnits' | transloco\" class=\"col-md-6 p-0\" name=\"max_units\"\n [errorMsg]=\"'Admin.Products.Validation.MaxUnit' | transloco\">\n <input type=\"number\" min=\"1\" class=\"form-control\" formControlName=\"max_units\" [ngClass]=\"{\n 'is-invalid': submitted && f['max_units'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <label class=\"info-circle\" for=\"productList\"> {{ 'Admin.Products.DependencyProducts' | transloco }}<span\n class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.Products.Tooltip.DependencyProducts' |\n transloco }}</span>\n </label>\n <p-multiSelect [options]=\"productsList\" [(ngModel)]=\"selectedScopes\"\n [ngModelOptions]=\"{ standalone: true }\" (onChange)=\"onSearchCriteria($event)\" [showHeader]=\"false\"\n maxSelectedLabels=\"1\" appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.StripePlan' | transloco\"\n [label]=\"'Admin.Products.StripePlan' | transloco\" class=\"col-md-6 p-0\" name=\"stripe_plan_id\">\n <input type=\"text\" class=\"form-control\" formControlName=\"stripe_plan_id\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Price' | transloco\"\n [isLeftTooltip]=\"true\"\n [label]=\"'Admin.Products.Price' | transloco\" class=\"col-md-6 p-0\" name=\"price_per_unit\"\n [errorMsg]=\"'Admin.Products.Validation.Name' | transloco\">\n <input type=\"text\" numbersOnly class=\"form-control\" formControlName=\"price_per_unit\" [ngClass]=\"{\n 'is-invalid': submitted && f['price_per_unit'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.TrialDays' | transloco\"\n [label]=\"'Admin.Products.TrialDays' | transloco\" class=\"col-md-6 p-0\" name=\"trial_days\"\n [errorMsg]=\"'Admin.Products.Validation.TrialDays' | transloco\">\n <input type=\"number\" min=\"1\" class=\"form-control\" formControlName=\"trial_days\" [ngClass]=\"{\n 'is-invalid': submitted && f['trial_days'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MaxTrialHits' | transloco\"\n [label]=\"'Admin.Products.MaxTrialHits' | transloco\" class=\"col-md-6 p-0\" name=\"max_hits_trial\">\n <input type=\"number\" min=\"0\" class=\"form-control\" formControlName=\"max_hits_trial\" [ngClass]=\"{\n 'is-invalid': submitted && f['max_hits_trial'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.TrialHits' | transloco\"\n [label]=\"'Admin.Products.TrialHits' | transloco\" class=\"col-md-6 p-0\" name=\"max_hits\">\n <input type=\"number\" min=\"0\" class=\"form-control\" formControlName=\"max_hits\"\n [ngClass]=\"{ 'is-invalid': submitted && f['max_hits'].errors }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-12\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Description' | transloco\"\n [label]=\"'Admin.Products.Description' | transloco\" name=\"description\"\n [errorMsg]=\"'Admin.Products.Validation.Description' | transloco\">\n <quill-editor [styles]=\"{ height: '220px' }\" formControlName=\"description\" class=\"quillEditor\" [modules]=\"editorConfig\" id=\"descriptionEditor\"\n [ngClass]=\"{ 'is-invalid': submitted && f['description'].errors, 'quill-container': true}\">\n </quill-editor>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-12\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.SignupInstructions' | transloco\"\n [label]=\"'Admin.Products.SignupInstructions' | transloco\" name=\"signup_instructions\">\n <quill-editor [styles]=\"{ height: '220px' }\" formControlName=\"signup_instructions\" class=\"quillEditor\" [modules]=\"editorConfig\" id=\"signupInstructionsEditor\" [ngClass]=\"{\n 'is-invalid': submitted && f['signup_instructions'].errors, 'quill-container': true\n }\">\n </quill-editor>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-12\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.SignupInstructionEmployees' | transloco\"\n [label]=\"'Admin.Products.SignupInstructionEmployees' | transloco\" name=\"signup_instruction_employees\">\n <quill-editor [styles]=\"{ height: '220px' }\" formControlName=\"signup_instruction_employees\" class=\"quillEditor\" [modules]=\"editorConfig\" id=\"signupEmployeesEditor\" [ngClass]=\"{\n 'is-invalid':\n submitted && f['signup_instruction_employees'].errors, 'quill-container': true\n }\">\n </quill-editor>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.PermissionKey' | transloco\"\n [label]=\"'Admin.Products.PermissionKey' | transloco\" name=\"permission_key\" [errorMsg]=\"\n 'Admin.Products.Validation.PermissionKey' | transloco\n \">\n <input type=\"text\" class=\"form-control\" [ngClass]=\"{\n 'is-invalid': submitted && f['permission_key'].errors\n }\" formControlName=\"permission_key\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.FeatureKey' | transloco\"\n [label]=\"'Admin.Products.FeatureKey' | transloco\" name=\"feature_key\"\n [errorMsg]=\"'Admin.Products.Validation.FeatureKey' | transloco\">\n <input type=\"text\" class=\"form-control\" [ngClass]=\"{\n 'is-invalid': submitted && f['feature_key'].errors\n }\" formControlName=\"feature_key\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [label]=\"'Admin.Products.ProductKey' | transloco\" class=\"col-md-6 p-0\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.Products.Tooltip.PermissionKey' | transloco\n \" name=\"product_key\"\n [errorMsg]=\"'Admin.Products.Validation.ProductKey' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"product_key\" [ngClass]=\"{\n 'is-invalid': submitted && f['product_key'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [label]=\"'Admin.Products.Category' | transloco\" class=\"col-md-6 p-0\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.Products.Tooltip.PermissionKey' | transloco\n \" name=\"category\" [errorMsg]=\"'Admin.Products.Validation.Category' | transloco\">\n <p-dropdown [options]=\"categories\" class=\"dropdown-bg-transparent\" formControlName=\"category\"\n [ngClass]=\"{ 'is-invalid': submitted && f['category'].errors }\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.BillingFrequency' | transloco\"\n [label]=\"'Admin.Products.BillingFrequency' | transloco\" class=\"col-md-6 p-0\" name=\"billing_frequency\">\n <p-dropdown [options]=\"frequency\" class=\"dropdown-bg-transparent\" formControlName=\"billing_frequency\"\n [required]=\"true\" [ngClass]=\"{\n 'is-invalid': submitted && f['billing_frequency'].errors\n }\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.DocumentationUrl' | transloco\"\n [label]=\"'Admin.Products.DocumentationUrl' | transloco\" class=\"col-md-6 p-0\" name=\"documentation_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"documentation_url\" [ngClass]=\"{\n 'is-invalid': submitted && f['documentation_url'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.ProductPrivacyService' | transloco\"\n [label]=\"'Admin.Products.ProductPrivacyService' | transloco\" name=\"product_privacy_service_id\">\n <p-dropdown\n [options]=\"allTos\"\n formControlName=\"product_privacy_service_id\"\n [placeholder]=\"'Select Privacy Service'\"\n optionValue=\"id\"\n optionLabel=\"title\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\" *rbacAllow=\"'SuperAdmin'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MasterProduct' | transloco\"\n [label]=\"'Admin.Products.MasterProduct' | transloco\" name=\"master_product_id\">\n <p-dropdown\n [options]=\"productsList\"\n formControlName=\"master_product_id\"\n [placeholder]=\"'Select Master Product'\"\n optionValue=\"value\"\n optionLabel=\"label\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"mb-3 col-xs-12 col-sm-6 col-md-4\">\n <label class=\"info-circle\" for=\"Roles\">{{ 'Admin.Products.AssignedRoles' | transloco }} <span\n class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.Subscriptions.Tooltip.AssignedRoles' |\n transloco }}</span>\n </label>\n <p-multiSelect [options]=\"allRoles\" formControlName=\"roles\" appendTo=\"body\"></p-multiSelect>\n </div>\n <div class=\"col-12 col-md-4\" *ngIf=\"supportedCurrency$ | async as currency\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Currency' | transloco\"\n [label]=\"'Admin.Products.Currency' | transloco\" name=\"currency\"\n [errorMsg]=\"'Admin.Products.Validation.Currency' | transloco\">\n <p-dropdown\n [options]=\"currency['regions']\"\n formControlName=\"currency\"\n [ngClass]=\"{ 'is-invalid': submitted && f['currency'].errors }\"\n [placeholder]=\"'Select Currency'\"\n [showClear]=\"false\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\" *ngIf=\"supportedRegions$ | async as region\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Region' | transloco\"\n [isLeftTooltip]=\"true\"\n [label]=\"'Admin.Products.Region' | transloco\" name=\"region\"\n [errorMsg]=\"'Admin.Products.Validation.Region' | transloco\">\n <p-dropdown\n [options]=\"region['regions']\"\n formControlName=\"region\"\n [ngClass]=\"{ 'is-invalid': submitted && f['region'].errors }\"\n [placeholder]=\"'Select Region'\"\n [showClear]=\"false\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.GitLabServiceDeskEmail' | transloco\"\n [label]=\"'Admin.Products.GitLabServiceDeskEmail' | transloco\" name=\"gitlab_service_desk_email\">\n <input type=\"text\" class=\"form-control\" formControlName=\"gitlab_service_desk_email\" />\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\" *rbacAllow=\"'Pages.Alpha'\">\n <label class=\"info-circle\" for=\"\"> {{ 'Admin.Products.PartnerProducts' | transloco }}<span\n class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.Products.Tooltip.PartnerProducts' | transloco\n }}</span>\n </label>\n <p-multiSelect [options]=\"productsList\" (onChange)=\"onSearchPartnerProducts($event)\"\n [ngModelOptions]=\"{ standalone: true }\" [showToggleAll]=\"true\" [(ngModel)]=\"selectedPartnerProducts\"\n [showHeader]=\"true\" maxSelectedLabels=\"1\" appendTo=\"body\">\n </p-multiSelect>\n </div>\n <!--start toggles -->\n <div class=\"col-12 row mt-4\">\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.IsActive' | transloco\"\n [label]=\"'Admin.Products.IsActive' | transloco\" name=\"active\">\n <ui-switch class=\"d-block\" formControlName=\"active\" name=\"active\"\n [ngClass]=\"{ 'is-invalid': submitted && f['active'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\" *rbacAllow=\"'SuperAdmin'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MultipleAllowed' | transloco\"\n [label]=\"'Admin.Products.MultipleAllowed' | transloco\" class=\"nowrap\" name=\"multiple_allowed\">\n <ui-switch class=\"d-block\" formControlName=\"multiple_allowed\" name=\"multiple_allowed\" [ngClass]=\"{\n 'is-invalid': submitted && f['multiple_allowed'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.IsVisible' | transloco\"\n [label]=\"'Admin.Products.IsVisible' | transloco\" name=\"visible\">\n <ui-switch class=\"d-block\" formControlName=\"visible\" name=\"visible\"\n [ngClass]=\"{ 'is-invalid': submitted && f['visible'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MembersVisible' | transloco\"\n [label]=\"'Admin.Products.MembersVisible' | transloco\" name=\"members_visible\">\n <ui-switch class=\"d-block\" formControlName=\"members_visible\" name=\"members_visible\" [ngClass]=\"{\n 'is-invalid': submitted && f['members_visible'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.ChatVisible' | transloco\"\n [label]=\"'Admin.Products.ChatVisible' | transloco\" name=\"chat_visible\">\n <ui-switch class=\"d-block\" formControlName=\"chat_visible\" name=\"chat_visible\" [ngClass]=\"{\n 'is-invalid': submitted && f['chat_visible'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\" *rbacAllow=\"'SuperAdmin'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.IsMasterProduct' | transloco\"\n [label]=\"'Admin.Products.IsMasterProduct' | transloco\" name=\"is_master_product\">\n <ui-switch class=\"d-block\" formControlName=\"is_master_product\" name=\"is_master_product\" [ngClass]=\"{\n 'is-invalid': submitted && f['is_master_product'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n </div>\n <!-- end toggles -->\n </div>\n <div class=\"row text-end mt-4\">\n <div class=\"col-12\">\n <button type=\"button\" class=\"btn btn-outline-default me-2\" (click)=\"back()\"> {{ 'Button.Cancel' |\n transloco }} </button>\n <button type=\"submit\" [buttonBusy]=\"submitted\" class=\"btn btn-primary\" *rbacAllow=\"'Pages.Admin.Product.Edit'\"> {{ 'Button.Submit'\n | transloco }} </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n</div>\n<ng-template #content let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'User.Subscriptions.FullLogo' | transloco }}</h3>\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <pw-image-cropper #profile (imageSelectionEvent)=\"onImageSelection($event)\" aspectRatio=\"fullLogo\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n<ng-template #squaredLogoContent let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'User.Subscriptions.SquaredLogo' | transloco }}</h3>\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <pw-image-cropper #profile (imageSelectionEvent)=\"uploadSquaredLogo($event)\" aspectRatio=\"auto\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n", styles: [".nowrap{white-space:nowrap}textarea{height:180px}.full-logo{object-fit:cover;width:280px}\n"], dependencies: [{ kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i5.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i5.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "component", type: i6.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i7.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i9.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i9.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.UiSwitchComponent, selector: "ui-switch", inputs: ["size", "color", "switchOffColor", "switchColor", "defaultBgColor", "defaultBoColor", "checkedLabel", "uncheckedLabel", "checkedTextColor", "uncheckedTextColor", "beforeChange", "ariaLabel", "checked", "disabled", "reverse", "loading"], outputs: ["change", "changeEvent", "valueChange"] }, { kind: "component", type: i11.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i12.ProfileImageCropperComponent, selector: "pw-image-cropper", inputs: ["aspectRatio", "dynamicData"], outputs: ["imageSelectionEvent", "closeEvent", "fileChangeEvent"] }, { kind: "component", type: i12.InputContainerComponent, selector: "pw-input-container", inputs: ["name", "label", "labelClass", "tooltipPosition", "required", "errorMsg", "isReadOnly", "showTooltip", "tooltipText", "showTriangle", "afterLabel", "showAfterLabel", "showTriangleText", "isLeftTooltip"] }, { kind: "directive", type: i13.ButtonBusyDirective, selector: "[buttonBusy]", inputs: ["buttonBusy", "busyText"] }, { kind: "directive", type: i13.NumberDirective, selector: "input[numbersOnly]" }, { kind: "directive", type: i13.LazyImgDirective, selector: "img" }, { kind: "directive", type: i13.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "directive", type: i9.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i9.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i14.QuillEditorComponent, selector: "quill-editor" }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i15.TranslocoPipe, name: "transloco" }] }); }
|
|
358
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: ProductDetailsComponent, selector: "pw-product-details", usesInheritance: true, ngImport: i0, template: "<div class=\"container-fluid pw-tab product-form overflow-hidden\">\n <div class=\"dashboard\">\n <div class=\"dashboard-body\">\n <div class=\"me-auto col-xs-6 mt-4\">\n <a aria-label=\"Navigate to Target\" (click)=\"back()\" class=\"previous\"><i class=\"fa fa-arrow-alt-circle-left\"\n aria-hidden=\"true\"></i></a>\n <h3 class=\"\">Product: {{ data?.name ? data?.name : 'Add New' }}</h3>\n </div>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"isLoading\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div class=\"my-4\" *ngIf=\"!isLoading\">\n <div class=\"mb-5\">\n <p-accordion>\n <p-accordionTab [header]=\"'How To'\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\">\n <h4>Product / Feature logic</h4>\n <p> Logic for back-end/front-end permissions binding:\n <br /> * product.category (these are features) => type of product, i.e., seat_pricing or item_pricing\n <br /> * product.feature_key => this describes the main feature\n <br /> * product.permission_key => users can be subscribed to only one product of same permission_key\n <br /> * product.product_key => this is unique to each product, it defines the permission for frontend binding\n <br /> * Example of permission => {{ 'Pages.Product.{permission_key}.{product_key}' }}\n <br /> * If it's a feature associated to an existing project, you can to set the \"dependency product\" accordingly. </p>\n </div>\n <div class=\"col-12 col-md-6\">\n <h4>If it's a Free Product</h4>\n <p> Stripe Plan needs to be nil. <br /> \"Price\" per Unit needs to be set as 0. <br /> \"Trial Days\" needs\n to be something like 99999. <br /> The product should be set as \"visible===false\". </p>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n <div class=\"row\" *ngIf=\"id\">\n <div class=\"col-md-6\">\n <div class=\"text-center mt-5\">\n <div class=\"image-container\">\n <h4 class=\"mb-2\"> {{ 'User.Subscriptions.FullLogo' | transloco }} <span class=\"tooltip-wrap ms-1\"\n [pTooltip]=\"'User.Subscriptions.Tooltip.FullLogo'|transloco\" [appendTo]=\"'body'\"\n [tooltipPosition]=\"'top'\">\n <i class=\"fas fa-info-circle\"></i>\n </span>\n </h4>\n <img [src]=\"fullLogo\" alt=\"Demo Logo\" class=\"image full-logo w-100 h-100\"\n (error)=\"handleImageError($event, 'assets/img/icons/demo_logo1.png')\" />\n <div class=\"overlay mt-2\" (click)=\"openModal(content)\" (keydown.enter)=\"openModal(content)\">\n <div class=\"overlay-text\">\n <a aria-label=\"Navigate to Target\">{{ 'User.Profile.Change' | transloco }}</a>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"text-center mt-5\">\n <div class=\"image-container\">\n <h4 class=\"mb-2\"> {{ 'User.Subscriptions.SquaredLogo' | transloco }} <span class=\"tooltip-wrap ms-1\"\n [pTooltip]=\"'User.Subscriptions.Tooltip.SquaredLogo'|transloco\" [appendTo]=\"'body'\"\n [tooltipPosition]=\"'top'\">\n <i class=\"fas fa-info-circle\"></i>\n </span>\n </h4>\n <img [src]=\"squaredLogo\" alt=\"Company Logo\" width=\"70\" class=\"squared_logo\" height=\"70\"\n (error)=\"handleImageError($event, 'assets/img/icons/company.png')\" />\n <div class=\"overlay mt-2\" (keydown.enter)=\"openModal(squaredLogoContent)\" (click)=\"openModal(squaredLogoContent)\">\n <div class=\"overlay-text\">\n <a aria-label=\"Navigate to Target\">{{ 'User.Profile.Change' | transloco }}</a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <form [formGroup]=\"form\" (ngSubmit)=\"onSave()\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Name' | transloco\"\n [label]=\"'Label.Name' | transloco\" class=\"col-md-6 p-0\" name=\"name\"\n [isLeftTooltip]=\"true\"\n [errorMsg]=\"'Admin.Products.Validation.Name' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"name\"\n [ngClass]=\"{ 'is-invalid': submitted && f['name'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-md-6\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.NickName' | transloco\"\n [label]=\"'Admin.Products.NickName' | transloco\" class=\"col-md-6 p-0\" name=\"nickname\" [errorMsg]=\"\n 'Admin.Products.Validation.NickName' | transloco\n \">\n <input type=\"text\" class=\"form-control\" formControlName=\"nickname\" [ngClass]=\"{\n 'is-invalid': submitted && f['nickname'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"row\">\n <div class=\"mb-3 col-12 col-md-6\">\n <pw-input-container [label]=\"'Admin.Products.MinUnit' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MinUnits' | transloco\" class=\"col-md-6 p-0\" name=\"min_units\"\n [errorMsg]=\"'Admin.Products.Validation.MinUnit' | transloco\">\n <input type=\"number\" min=\"1\" class=\"form-control\" formControlName=\"min_units\" [ngClass]=\"{\n 'is-invalid': submitted && f['min_units'].errors\n }\" />\n </pw-input-container>\n </div>\n <div class=\"mb-3 col-12 col-md-6\">\n <pw-input-container [label]=\"'Admin.Products.MaxUnit' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MaxUnits' | transloco\" class=\"col-md-6 p-0\" name=\"max_units\"\n [errorMsg]=\"'Admin.Products.Validation.MaxUnit' | transloco\">\n <input type=\"number\" min=\"1\" class=\"form-control\" formControlName=\"max_units\" [ngClass]=\"{\n 'is-invalid': submitted && f['max_units'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <label class=\"info-circle\" for=\"productList\"> {{ 'Admin.Products.DependencyProducts' | transloco }}<span\n class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.Products.Tooltip.DependencyProducts' |\n transloco }}</span>\n </label>\n <p-multiSelect [options]=\"productsList\" [(ngModel)]=\"selectedScopes\"\n [ngModelOptions]=\"{ standalone: true }\" (onChange)=\"onSearchCriteria($event)\" [showHeader]=\"false\"\n maxSelectedLabels=\"1\" appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.StripePlan' | transloco\"\n [label]=\"'Admin.Products.StripePlan' | transloco\" class=\"col-md-6 p-0\" name=\"stripe_plan_id\">\n <input type=\"text\" class=\"form-control\" formControlName=\"stripe_plan_id\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Price' | transloco\"\n [isLeftTooltip]=\"true\"\n [label]=\"'Admin.Products.Price' | transloco\" class=\"col-md-6 p-0\" name=\"price_per_unit\"\n [errorMsg]=\"'Admin.Products.Validation.Name' | transloco\">\n <input type=\"text\" numbersOnly class=\"form-control\" formControlName=\"price_per_unit\" [ngClass]=\"{\n 'is-invalid': submitted && f['price_per_unit'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.TrialDays' | transloco\"\n [label]=\"'Admin.Products.TrialDays' | transloco\" class=\"col-md-6 p-0\" name=\"trial_days\"\n [errorMsg]=\"'Admin.Products.Validation.TrialDays' | transloco\">\n <input type=\"number\" min=\"1\" class=\"form-control\" formControlName=\"trial_days\" [ngClass]=\"{\n 'is-invalid': submitted && f['trial_days'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MaxTrialHits' | transloco\"\n [label]=\"'Admin.Products.MaxTrialHits' | transloco\" class=\"col-md-6 p-0\" name=\"max_hits_trial\">\n <input type=\"number\" min=\"0\" class=\"form-control\" formControlName=\"max_hits_trial\" [ngClass]=\"{\n 'is-invalid': submitted && f['max_hits_trial'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.TrialHits' | transloco\"\n [label]=\"'Admin.Products.TrialHits' | transloco\" class=\"col-md-6 p-0\" name=\"max_hits\">\n <input type=\"number\" min=\"0\" class=\"form-control\" formControlName=\"max_hits\"\n [ngClass]=\"{ 'is-invalid': submitted && f['max_hits'].errors }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-12\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Description' | transloco\"\n [label]=\"'Admin.Products.Description' | transloco\" name=\"description\"\n [errorMsg]=\"'Admin.Products.Validation.Description' | transloco\">\n <quill-editor [styles]=\"{ height: '220px' }\" formControlName=\"description\" class=\"quillEditor\" [modules]=\"editorConfig\" id=\"descriptionEditor\"\n [ngClass]=\"{ 'is-invalid': submitted && f['description'].errors, 'quill-container': true}\">\n </quill-editor>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-12\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.SignupInstructions' | transloco\"\n [label]=\"'Admin.Products.SignupInstructions' | transloco\" name=\"signup_instructions\">\n <quill-editor [styles]=\"{ height: '220px' }\" formControlName=\"signup_instructions\" class=\"quillEditor\" [modules]=\"editorConfig\" id=\"signupInstructionsEditor\" [ngClass]=\"{\n 'is-invalid': submitted && f['signup_instructions'].errors, 'quill-container': true\n }\">\n </quill-editor>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-12\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.SignupInstructionEmployees' | transloco\"\n [label]=\"'Admin.Products.SignupInstructionEmployees' | transloco\" name=\"signup_instruction_employees\">\n <quill-editor [styles]=\"{ height: '220px' }\" formControlName=\"signup_instruction_employees\" class=\"quillEditor\" [modules]=\"editorConfig\" id=\"signupEmployeesEditor\" [ngClass]=\"{\n 'is-invalid':\n submitted && f['signup_instruction_employees'].errors, 'quill-container': true\n }\">\n </quill-editor>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.PermissionKey' | transloco\"\n [label]=\"'Admin.Products.PermissionKey' | transloco\" name=\"permission_key\" [errorMsg]=\"\n 'Admin.Products.Validation.PermissionKey' | transloco\n \">\n <input type=\"text\" class=\"form-control\" [ngClass]=\"{\n 'is-invalid': submitted && f['permission_key'].errors\n }\" formControlName=\"permission_key\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.FeatureKey' | transloco\"\n [label]=\"'Admin.Products.FeatureKey' | transloco\" name=\"feature_key\"\n [errorMsg]=\"'Admin.Products.Validation.FeatureKey' | transloco\">\n <input type=\"text\" class=\"form-control\" [ngClass]=\"{\n 'is-invalid': submitted && f['feature_key'].errors\n }\" formControlName=\"feature_key\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [label]=\"'Admin.Products.ProductKey' | transloco\" class=\"col-md-6 p-0\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.Products.Tooltip.PermissionKey' | transloco\n \" name=\"product_key\"\n [errorMsg]=\"'Admin.Products.Validation.ProductKey' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"product_key\" [ngClass]=\"{\n 'is-invalid': submitted && f['product_key'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [label]=\"'Admin.Products.Category' | transloco\" class=\"col-md-6 p-0\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.Products.Tooltip.PermissionKey' | transloco\n \" name=\"category\" [errorMsg]=\"'Admin.Products.Validation.Category' | transloco\">\n <p-dropdown [options]=\"categories\" class=\"dropdown-bg-transparent\" formControlName=\"category\"\n [ngClass]=\"{ 'is-invalid': submitted && f['category'].errors }\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.BillingFrequency' | transloco\"\n [label]=\"'Admin.Products.BillingFrequency' | transloco\" class=\"col-md-6 p-0\" name=\"billing_frequency\">\n <p-dropdown [options]=\"frequency\" class=\"dropdown-bg-transparent\" formControlName=\"billing_frequency\"\n [required]=\"true\" [ngClass]=\"{\n 'is-invalid': submitted && f['billing_frequency'].errors\n }\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.DocumentationUrl' | transloco\"\n [label]=\"'Admin.Products.DocumentationUrl' | transloco\" class=\"col-md-6 p-0\" name=\"documentation_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"documentation_url\" [ngClass]=\"{\n 'is-invalid': submitted && f['documentation_url'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.ProductPrivacyService' | transloco\"\n [label]=\"'Admin.Products.ProductPrivacyService' | transloco\" name=\"product_privacy_service_id\">\n <p-dropdown\n [options]=\"allTos\"\n formControlName=\"product_privacy_service_id\"\n [placeholder]=\"'Select Privacy Service'\"\n optionValue=\"id\"\n optionLabel=\"title\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\" *rbacAllow=\"'SuperAdmin'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MasterProduct' | transloco\"\n [label]=\"'Admin.Products.MasterProduct' | transloco\" name=\"master_product_id\">\n <p-dropdown\n [options]=\"productsList\"\n formControlName=\"master_product_id\"\n [placeholder]=\"'Select Master Product'\"\n optionValue=\"value\"\n optionLabel=\"label\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"mb-3 col-xs-12 col-sm-6 col-md-4\">\n <label class=\"info-circle\" for=\"Roles\">{{ 'Admin.Products.AssignedRoles' | transloco }} <span\n class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.Subscriptions.Tooltip.AssignedRoles' |\n transloco }}</span>\n </label>\n <p-multiSelect [options]=\"allRoles\" formControlName=\"roles\" appendTo=\"body\"></p-multiSelect>\n </div>\n <div class=\"col-12 col-md-4\" *ngIf=\"supportedCurrency$ | async as currency\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Currency' | transloco\"\n [label]=\"'Admin.Products.Currency' | transloco\" name=\"currency\"\n [errorMsg]=\"'Admin.Products.Validation.Currency' | transloco\">\n <p-dropdown\n [options]=\"currency['regions']\"\n formControlName=\"currency\"\n [ngClass]=\"{ 'is-invalid': submitted && f['currency'].errors }\"\n [placeholder]=\"'Select Currency'\"\n [showClear]=\"false\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\" *ngIf=\"supportedRegions$ | async as region\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Region' | transloco\"\n [isLeftTooltip]=\"true\"\n [label]=\"'Admin.Products.Region' | transloco\" name=\"region\"\n [errorMsg]=\"'Admin.Products.Validation.Region' | transloco\">\n <p-dropdown\n [options]=\"region['regions']\"\n formControlName=\"region\"\n [ngClass]=\"{ 'is-invalid': submitted && f['region'].errors }\"\n [placeholder]=\"'Select Region'\"\n [showClear]=\"false\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.GitLabServiceDeskEmail' | transloco\"\n [label]=\"'Admin.Products.GitLabServiceDeskEmail' | transloco\" name=\"gitlab_service_desk_email\">\n <input type=\"text\" class=\"form-control\" formControlName=\"gitlab_service_desk_email\" />\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\" *rbacAllow=\"'Pages.Alpha'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.PartnerProducts' | transloco\"\n [label]=\"'Admin.Products.PartnerProducts' | transloco\" name=\"partner_products\">\n <p-multiSelect [options]=\"productsList\" (onChange)=\"onSearchPartnerProducts($event)\"\n [ngModelOptions]=\"{ standalone: true }\" [showToggleAll]=\"true\" [(ngModel)]=\"selectedPartnerProducts\"\n [showHeader]=\"true\" maxSelectedLabels=\"1\" appendTo=\"body\">\n </p-multiSelect>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\" *rbacAllow=\"'Pages.Alpha'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.ProrationBehavior' | transloco\"\n [label]=\"'Admin.Products.ProrationBehavior' | transloco\" name=\"proration_behavior\">\n <p-dropdown\n [options]=\"prorationBehaviors\"\n formControlName=\"proration_behavior\"\n [placeholder]=\"'Select Proration Behavior'\"\n optionValue=\"value\"\n optionLabel=\"label\"\n [showClear]=\"true\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\" *rbacAllow=\"'Pages.Alpha'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.UnsubscribeStripeBehavior' | transloco\"\n [label]=\"'Admin.Products.UnsubscribeStripeBehavior' | transloco\" name=\"unsubscribe_stripe_behavior\">\n <p-dropdown\n [options]=\"unsubscribeBehaviors\"\n formControlName=\"unsubscribe_stripe_behavior\"\n [placeholder]=\"'Select Unsubscribe Stripe Behavior'\"\n optionValue=\"value\"\n optionLabel=\"label\"\n [showClear]=\"true\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <!--start toggles -->\n <div class=\"col-12 row mt-4\">\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.IsActive' | transloco\"\n [label]=\"'Admin.Products.IsActive' | transloco\" name=\"active\">\n <ui-switch class=\"d-block\" formControlName=\"active\" name=\"active\"\n [ngClass]=\"{ 'is-invalid': submitted && f['active'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\" *rbacAllow=\"'SuperAdmin'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MultipleAllowed' | transloco\"\n [label]=\"'Admin.Products.MultipleAllowed' | transloco\" class=\"nowrap\" name=\"multiple_allowed\">\n <ui-switch class=\"d-block\" formControlName=\"multiple_allowed\" name=\"multiple_allowed\" [ngClass]=\"{\n 'is-invalid': submitted && f['multiple_allowed'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.IsVisible' | transloco\"\n [label]=\"'Admin.Products.IsVisible' | transloco\" name=\"visible\">\n <ui-switch class=\"d-block\" formControlName=\"visible\" name=\"visible\"\n [ngClass]=\"{ 'is-invalid': submitted && f['visible'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MembersVisible' | transloco\"\n [label]=\"'Admin.Products.MembersVisible' | transloco\" name=\"members_visible\">\n <ui-switch class=\"d-block\" formControlName=\"members_visible\" name=\"members_visible\" [ngClass]=\"{\n 'is-invalid': submitted && f['members_visible'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.ChatVisible' | transloco\"\n [label]=\"'Admin.Products.ChatVisible' | transloco\" name=\"chat_visible\">\n <ui-switch class=\"d-block\" formControlName=\"chat_visible\" name=\"chat_visible\" [ngClass]=\"{\n 'is-invalid': submitted && f['chat_visible'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\" *rbacAllow=\"'SuperAdmin'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.IsMasterProduct' | transloco\"\n [label]=\"'Admin.Products.IsMasterProduct' | transloco\" name=\"is_master_product\">\n <ui-switch class=\"d-block\" formControlName=\"is_master_product\" name=\"is_master_product\" [ngClass]=\"{\n 'is-invalid': submitted && f['is_master_product'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n </div>\n <!-- end toggles -->\n </div>\n <div class=\"row text-end mt-4\">\n <div class=\"col-12\">\n <button type=\"button\" class=\"btn btn-outline-default me-2\" (click)=\"back()\"> {{ 'Button.Cancel' |\n transloco }} </button>\n <button type=\"submit\" [buttonBusy]=\"submitted\" class=\"btn btn-primary\" *rbacAllow=\"'Pages.Admin.Product.Edit'\"> {{ 'Button.Submit'\n | transloco }} </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n</div>\n<ng-template #content let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'User.Subscriptions.FullLogo' | transloco }}</h3>\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <pw-image-cropper #profile (imageSelectionEvent)=\"onImageSelection($event)\" aspectRatio=\"fullLogo\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n<ng-template #squaredLogoContent let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'User.Subscriptions.SquaredLogo' | transloco }}</h3>\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <pw-image-cropper #profile (imageSelectionEvent)=\"uploadSquaredLogo($event)\" aspectRatio=\"auto\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n", styles: [".nowrap{white-space:nowrap}textarea{height:180px}.full-logo{object-fit:cover;width:280px}\n"], dependencies: [{ kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i5.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i5.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "component", type: i6.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i7.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i9.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i9.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.UiSwitchComponent, selector: "ui-switch", inputs: ["size", "color", "switchOffColor", "switchColor", "defaultBgColor", "defaultBoColor", "checkedLabel", "uncheckedLabel", "checkedTextColor", "uncheckedTextColor", "beforeChange", "ariaLabel", "checked", "disabled", "reverse", "loading"], outputs: ["change", "changeEvent", "valueChange"] }, { kind: "component", type: i11.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i12.ProfileImageCropperComponent, selector: "pw-image-cropper", inputs: ["aspectRatio", "dynamicData"], outputs: ["imageSelectionEvent", "closeEvent", "fileChangeEvent"] }, { kind: "component", type: i13.InputContainerComponent, selector: "pw-input-container", inputs: ["name", "label", "labelClass", "tooltipPosition", "required", "errorMsg", "isReadOnly", "showTooltip", "tooltipText", "showTriangle", "afterLabel", "showAfterLabel", "showTriangleText", "isLeftTooltip"] }, { kind: "directive", type: i14.ButtonBusyDirective, selector: "[buttonBusy]", inputs: ["buttonBusy", "busyText"] }, { kind: "directive", type: i14.NumberDirective, selector: "input[numbersOnly]" }, { kind: "directive", type: i14.LazyImgDirective, selector: "img" }, { kind: "directive", type: i14.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "directive", type: i9.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i9.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i15.QuillEditorComponent, selector: "quill-editor" }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i16.TranslocoPipe, name: "transloco" }] }); }
|
|
339
359
|
}
|
|
340
360
|
__decorate([
|
|
341
361
|
ValidateForm('form'),
|
|
@@ -345,6 +365,6 @@ __decorate([
|
|
|
345
365
|
], ProductDetailsComponent.prototype, "onSave", null);
|
|
346
366
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ProductDetailsComponent, decorators: [{
|
|
347
367
|
type: Component,
|
|
348
|
-
args: [{ selector: 'pw-product-details', template: "<div class=\"container-fluid pw-tab product-form overflow-hidden\">\n <div class=\"dashboard\">\n <div class=\"dashboard-body\">\n <div class=\"me-auto col-xs-6 mt-4\">\n <a aria-label=\"Navigate to Target\" (click)=\"back()\" class=\"previous\"><i class=\"fa fa-arrow-alt-circle-left\"\n aria-hidden=\"true\"></i></a>\n <h3 class=\"\">Product: {{ data?.name ? data?.name : 'Add New' }}</h3>\n </div>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"isLoading\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div class=\"my-4\" *ngIf=\"!isLoading\">\n <div class=\"mb-5\">\n <p-accordion>\n <p-accordionTab [header]=\"'How To'\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\">\n <h4>Product / Feature logic</h4>\n <p> Logic for back-end/front-end permissions binding:\n <br /> * product.category (these are features) => type of product, i.e., seat_pricing or item_pricing\n <br /> * product.feature_key => this describes the main feature\n <br /> * product.permission_key => users can be subscribed to only one product of same permission_key\n <br /> * product.product_key => this is unique to each product, it defines the permission for frontend binding\n <br /> * Example of permission => {{ 'Pages.Product.{permission_key}.{product_key}' }}\n <br /> * If it's a feature associated to an existing project, you can to set the \"dependency product\" accordingly. </p>\n </div>\n <div class=\"col-12 col-md-6\">\n <h4>If it's a Free Product</h4>\n <p> Stripe Plan needs to be nil. <br /> \"Price\" per Unit needs to be set as 0. <br /> \"Trial Days\" needs\n to be something like 99999. <br /> The product should be set as \"visible===false\". </p>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n <div class=\"row\" *ngIf=\"id\">\n <div class=\"col-md-6\">\n <div class=\"text-center mt-5\">\n <div class=\"image-container\">\n <h4 class=\"mb-2\"> {{ 'User.Subscriptions.FullLogo' | transloco }} <span class=\"tooltip-wrap ms-1\"\n [pTooltip]=\"'User.Subscriptions.Tooltip.FullLogo'|transloco\" [appendTo]=\"'body'\"\n [tooltipPosition]=\"'top'\">\n <i class=\"fas fa-info-circle\"></i>\n </span>\n </h4>\n <img [src]=\"fullLogo\" alt=\"Demo Logo\" class=\"image full-logo w-100 h-100\"\n (error)=\"handleImageError($event, 'assets/img/icons/demo_logo1.png')\" />\n <div class=\"overlay mt-2\" (click)=\"openModal(content)\" (keydown.enter)=\"openModal(content)\">\n <div class=\"overlay-text\">\n <a aria-label=\"Navigate to Target\">{{ 'User.Profile.Change' | transloco }}</a>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"text-center mt-5\">\n <div class=\"image-container\">\n <h4 class=\"mb-2\"> {{ 'User.Subscriptions.SquaredLogo' | transloco }} <span class=\"tooltip-wrap ms-1\"\n [pTooltip]=\"'User.Subscriptions.Tooltip.SquaredLogo'|transloco\" [appendTo]=\"'body'\"\n [tooltipPosition]=\"'top'\">\n <i class=\"fas fa-info-circle\"></i>\n </span>\n </h4>\n <img [src]=\"squaredLogo\" alt=\"Company Logo\" width=\"70\" class=\"squared_logo\" height=\"70\"\n (error)=\"handleImageError($event, 'assets/img/icons/company.png')\" />\n <div class=\"overlay mt-2\" (keydown.enter)=\"openModal(squaredLogoContent)\" (click)=\"openModal(squaredLogoContent)\">\n <div class=\"overlay-text\">\n <a aria-label=\"Navigate to Target\">{{ 'User.Profile.Change' | transloco }}</a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <form [formGroup]=\"form\" (ngSubmit)=\"onSave()\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Name' | transloco\"\n [label]=\"'Label.Name' | transloco\" class=\"col-md-6 p-0\" name=\"name\"\n [isLeftTooltip]=\"true\"\n [errorMsg]=\"'Admin.Products.Validation.Name' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"name\"\n [ngClass]=\"{ 'is-invalid': submitted && f['name'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-md-6\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.NickName' | transloco\"\n [label]=\"'Admin.Products.NickName' | transloco\" class=\"col-md-6 p-0\" name=\"nickname\" [errorMsg]=\"\n 'Admin.Products.Validation.NickName' | transloco\n \">\n <input type=\"text\" class=\"form-control\" formControlName=\"nickname\" [ngClass]=\"{\n 'is-invalid': submitted && f['nickname'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"row\">\n <div class=\"mb-3 col-12 col-md-6\">\n <pw-input-container [label]=\"'Admin.Products.MinUnit' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MinUnits' | transloco\" class=\"col-md-6 p-0\" name=\"min_units\"\n [errorMsg]=\"'Admin.Products.Validation.MinUnit' | transloco\">\n <input type=\"number\" min=\"1\" class=\"form-control\" formControlName=\"min_units\" [ngClass]=\"{\n 'is-invalid': submitted && f['min_units'].errors\n }\" />\n </pw-input-container>\n </div>\n <div class=\"mb-3 col-12 col-md-6\">\n <pw-input-container [label]=\"'Admin.Products.MaxUnit' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MaxUnits' | transloco\" class=\"col-md-6 p-0\" name=\"max_units\"\n [errorMsg]=\"'Admin.Products.Validation.MaxUnit' | transloco\">\n <input type=\"number\" min=\"1\" class=\"form-control\" formControlName=\"max_units\" [ngClass]=\"{\n 'is-invalid': submitted && f['max_units'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <label class=\"info-circle\" for=\"productList\"> {{ 'Admin.Products.DependencyProducts' | transloco }}<span\n class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.Products.Tooltip.DependencyProducts' |\n transloco }}</span>\n </label>\n <p-multiSelect [options]=\"productsList\" [(ngModel)]=\"selectedScopes\"\n [ngModelOptions]=\"{ standalone: true }\" (onChange)=\"onSearchCriteria($event)\" [showHeader]=\"false\"\n maxSelectedLabels=\"1\" appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.StripePlan' | transloco\"\n [label]=\"'Admin.Products.StripePlan' | transloco\" class=\"col-md-6 p-0\" name=\"stripe_plan_id\">\n <input type=\"text\" class=\"form-control\" formControlName=\"stripe_plan_id\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Price' | transloco\"\n [isLeftTooltip]=\"true\"\n [label]=\"'Admin.Products.Price' | transloco\" class=\"col-md-6 p-0\" name=\"price_per_unit\"\n [errorMsg]=\"'Admin.Products.Validation.Name' | transloco\">\n <input type=\"text\" numbersOnly class=\"form-control\" formControlName=\"price_per_unit\" [ngClass]=\"{\n 'is-invalid': submitted && f['price_per_unit'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.TrialDays' | transloco\"\n [label]=\"'Admin.Products.TrialDays' | transloco\" class=\"col-md-6 p-0\" name=\"trial_days\"\n [errorMsg]=\"'Admin.Products.Validation.TrialDays' | transloco\">\n <input type=\"number\" min=\"1\" class=\"form-control\" formControlName=\"trial_days\" [ngClass]=\"{\n 'is-invalid': submitted && f['trial_days'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MaxTrialHits' | transloco\"\n [label]=\"'Admin.Products.MaxTrialHits' | transloco\" class=\"col-md-6 p-0\" name=\"max_hits_trial\">\n <input type=\"number\" min=\"0\" class=\"form-control\" formControlName=\"max_hits_trial\" [ngClass]=\"{\n 'is-invalid': submitted && f['max_hits_trial'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.TrialHits' | transloco\"\n [label]=\"'Admin.Products.TrialHits' | transloco\" class=\"col-md-6 p-0\" name=\"max_hits\">\n <input type=\"number\" min=\"0\" class=\"form-control\" formControlName=\"max_hits\"\n [ngClass]=\"{ 'is-invalid': submitted && f['max_hits'].errors }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-12\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Description' | transloco\"\n [label]=\"'Admin.Products.Description' | transloco\" name=\"description\"\n [errorMsg]=\"'Admin.Products.Validation.Description' | transloco\">\n <quill-editor [styles]=\"{ height: '220px' }\" formControlName=\"description\" class=\"quillEditor\" [modules]=\"editorConfig\" id=\"descriptionEditor\"\n [ngClass]=\"{ 'is-invalid': submitted && f['description'].errors, 'quill-container': true}\">\n </quill-editor>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-12\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.SignupInstructions' | transloco\"\n [label]=\"'Admin.Products.SignupInstructions' | transloco\" name=\"signup_instructions\">\n <quill-editor [styles]=\"{ height: '220px' }\" formControlName=\"signup_instructions\" class=\"quillEditor\" [modules]=\"editorConfig\" id=\"signupInstructionsEditor\" [ngClass]=\"{\n 'is-invalid': submitted && f['signup_instructions'].errors, 'quill-container': true\n }\">\n </quill-editor>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-12\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.SignupInstructionEmployees' | transloco\"\n [label]=\"'Admin.Products.SignupInstructionEmployees' | transloco\" name=\"signup_instruction_employees\">\n <quill-editor [styles]=\"{ height: '220px' }\" formControlName=\"signup_instruction_employees\" class=\"quillEditor\" [modules]=\"editorConfig\" id=\"signupEmployeesEditor\" [ngClass]=\"{\n 'is-invalid':\n submitted && f['signup_instruction_employees'].errors, 'quill-container': true\n }\">\n </quill-editor>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.PermissionKey' | transloco\"\n [label]=\"'Admin.Products.PermissionKey' | transloco\" name=\"permission_key\" [errorMsg]=\"\n 'Admin.Products.Validation.PermissionKey' | transloco\n \">\n <input type=\"text\" class=\"form-control\" [ngClass]=\"{\n 'is-invalid': submitted && f['permission_key'].errors\n }\" formControlName=\"permission_key\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.FeatureKey' | transloco\"\n [label]=\"'Admin.Products.FeatureKey' | transloco\" name=\"feature_key\"\n [errorMsg]=\"'Admin.Products.Validation.FeatureKey' | transloco\">\n <input type=\"text\" class=\"form-control\" [ngClass]=\"{\n 'is-invalid': submitted && f['feature_key'].errors\n }\" formControlName=\"feature_key\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [label]=\"'Admin.Products.ProductKey' | transloco\" class=\"col-md-6 p-0\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.Products.Tooltip.PermissionKey' | transloco\n \" name=\"product_key\"\n [errorMsg]=\"'Admin.Products.Validation.ProductKey' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"product_key\" [ngClass]=\"{\n 'is-invalid': submitted && f['product_key'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [label]=\"'Admin.Products.Category' | transloco\" class=\"col-md-6 p-0\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.Products.Tooltip.PermissionKey' | transloco\n \" name=\"category\" [errorMsg]=\"'Admin.Products.Validation.Category' | transloco\">\n <p-dropdown [options]=\"categories\" class=\"dropdown-bg-transparent\" formControlName=\"category\"\n [ngClass]=\"{ 'is-invalid': submitted && f['category'].errors }\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.BillingFrequency' | transloco\"\n [label]=\"'Admin.Products.BillingFrequency' | transloco\" class=\"col-md-6 p-0\" name=\"billing_frequency\">\n <p-dropdown [options]=\"frequency\" class=\"dropdown-bg-transparent\" formControlName=\"billing_frequency\"\n [required]=\"true\" [ngClass]=\"{\n 'is-invalid': submitted && f['billing_frequency'].errors\n }\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.DocumentationUrl' | transloco\"\n [label]=\"'Admin.Products.DocumentationUrl' | transloco\" class=\"col-md-6 p-0\" name=\"documentation_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"documentation_url\" [ngClass]=\"{\n 'is-invalid': submitted && f['documentation_url'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.ProductPrivacyService' | transloco\"\n [label]=\"'Admin.Products.ProductPrivacyService' | transloco\" name=\"product_privacy_service_id\">\n <p-dropdown\n [options]=\"allTos\"\n formControlName=\"product_privacy_service_id\"\n [placeholder]=\"'Select Privacy Service'\"\n optionValue=\"id\"\n optionLabel=\"title\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\" *rbacAllow=\"'SuperAdmin'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MasterProduct' | transloco\"\n [label]=\"'Admin.Products.MasterProduct' | transloco\" name=\"master_product_id\">\n <p-dropdown\n [options]=\"productsList\"\n formControlName=\"master_product_id\"\n [placeholder]=\"'Select Master Product'\"\n optionValue=\"value\"\n optionLabel=\"label\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"mb-3 col-xs-12 col-sm-6 col-md-4\">\n <label class=\"info-circle\" for=\"Roles\">{{ 'Admin.Products.AssignedRoles' | transloco }} <span\n class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.Subscriptions.Tooltip.AssignedRoles' |\n transloco }}</span>\n </label>\n <p-multiSelect [options]=\"allRoles\" formControlName=\"roles\" appendTo=\"body\"></p-multiSelect>\n </div>\n <div class=\"col-12 col-md-4\" *ngIf=\"supportedCurrency$ | async as currency\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Currency' | transloco\"\n [label]=\"'Admin.Products.Currency' | transloco\" name=\"currency\"\n [errorMsg]=\"'Admin.Products.Validation.Currency' | transloco\">\n <p-dropdown\n [options]=\"currency['regions']\"\n formControlName=\"currency\"\n [ngClass]=\"{ 'is-invalid': submitted && f['currency'].errors }\"\n [placeholder]=\"'Select Currency'\"\n [showClear]=\"false\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\" *ngIf=\"supportedRegions$ | async as region\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Region' | transloco\"\n [isLeftTooltip]=\"true\"\n [label]=\"'Admin.Products.Region' | transloco\" name=\"region\"\n [errorMsg]=\"'Admin.Products.Validation.Region' | transloco\">\n <p-dropdown\n [options]=\"region['regions']\"\n formControlName=\"region\"\n [ngClass]=\"{ 'is-invalid': submitted && f['region'].errors }\"\n [placeholder]=\"'Select Region'\"\n [showClear]=\"false\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.GitLabServiceDeskEmail' | transloco\"\n [label]=\"'Admin.Products.GitLabServiceDeskEmail' | transloco\" name=\"gitlab_service_desk_email\">\n <input type=\"text\" class=\"form-control\" formControlName=\"gitlab_service_desk_email\" />\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\" *rbacAllow=\"'Pages.Alpha'\">\n <label class=\"info-circle\" for=\"\"> {{ 'Admin.Products.PartnerProducts' | transloco }}<span\n class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.Products.Tooltip.PartnerProducts' | transloco\n }}</span>\n </label>\n <p-multiSelect [options]=\"productsList\" (onChange)=\"onSearchPartnerProducts($event)\"\n [ngModelOptions]=\"{ standalone: true }\" [showToggleAll]=\"true\" [(ngModel)]=\"selectedPartnerProducts\"\n [showHeader]=\"true\" maxSelectedLabels=\"1\" appendTo=\"body\">\n </p-multiSelect>\n </div>\n <!--start toggles -->\n <div class=\"col-12 row mt-4\">\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.IsActive' | transloco\"\n [label]=\"'Admin.Products.IsActive' | transloco\" name=\"active\">\n <ui-switch class=\"d-block\" formControlName=\"active\" name=\"active\"\n [ngClass]=\"{ 'is-invalid': submitted && f['active'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\" *rbacAllow=\"'SuperAdmin'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MultipleAllowed' | transloco\"\n [label]=\"'Admin.Products.MultipleAllowed' | transloco\" class=\"nowrap\" name=\"multiple_allowed\">\n <ui-switch class=\"d-block\" formControlName=\"multiple_allowed\" name=\"multiple_allowed\" [ngClass]=\"{\n 'is-invalid': submitted && f['multiple_allowed'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.IsVisible' | transloco\"\n [label]=\"'Admin.Products.IsVisible' | transloco\" name=\"visible\">\n <ui-switch class=\"d-block\" formControlName=\"visible\" name=\"visible\"\n [ngClass]=\"{ 'is-invalid': submitted && f['visible'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MembersVisible' | transloco\"\n [label]=\"'Admin.Products.MembersVisible' | transloco\" name=\"members_visible\">\n <ui-switch class=\"d-block\" formControlName=\"members_visible\" name=\"members_visible\" [ngClass]=\"{\n 'is-invalid': submitted && f['members_visible'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.ChatVisible' | transloco\"\n [label]=\"'Admin.Products.ChatVisible' | transloco\" name=\"chat_visible\">\n <ui-switch class=\"d-block\" formControlName=\"chat_visible\" name=\"chat_visible\" [ngClass]=\"{\n 'is-invalid': submitted && f['chat_visible'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\" *rbacAllow=\"'SuperAdmin'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.IsMasterProduct' | transloco\"\n [label]=\"'Admin.Products.IsMasterProduct' | transloco\" name=\"is_master_product\">\n <ui-switch class=\"d-block\" formControlName=\"is_master_product\" name=\"is_master_product\" [ngClass]=\"{\n 'is-invalid': submitted && f['is_master_product'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n </div>\n <!-- end toggles -->\n </div>\n <div class=\"row text-end mt-4\">\n <div class=\"col-12\">\n <button type=\"button\" class=\"btn btn-outline-default me-2\" (click)=\"back()\"> {{ 'Button.Cancel' |\n transloco }} </button>\n <button type=\"submit\" [buttonBusy]=\"submitted\" class=\"btn btn-primary\" *rbacAllow=\"'Pages.Admin.Product.Edit'\"> {{ 'Button.Submit'\n | transloco }} </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n</div>\n<ng-template #content let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'User.Subscriptions.FullLogo' | transloco }}</h3>\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <pw-image-cropper #profile (imageSelectionEvent)=\"onImageSelection($event)\" aspectRatio=\"fullLogo\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n<ng-template #squaredLogoContent let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'User.Subscriptions.SquaredLogo' | transloco }}</h3>\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <pw-image-cropper #profile (imageSelectionEvent)=\"uploadSquaredLogo($event)\" aspectRatio=\"auto\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n", styles: [".nowrap{white-space:nowrap}textarea{height:180px}.full-logo{object-fit:cover;width:280px}\n"] }]
|
|
368
|
+
args: [{ selector: 'pw-product-details', template: "<div class=\"container-fluid pw-tab product-form overflow-hidden\">\n <div class=\"dashboard\">\n <div class=\"dashboard-body\">\n <div class=\"me-auto col-xs-6 mt-4\">\n <a aria-label=\"Navigate to Target\" (click)=\"back()\" class=\"previous\"><i class=\"fa fa-arrow-alt-circle-left\"\n aria-hidden=\"true\"></i></a>\n <h3 class=\"\">Product: {{ data?.name ? data?.name : 'Add New' }}</h3>\n </div>\n <div class=\"w-100 text-center mt-3\"\n *ngIf=\"isLoading\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </div>\n <div class=\"my-4\" *ngIf=\"!isLoading\">\n <div class=\"mb-5\">\n <p-accordion>\n <p-accordionTab [header]=\"'How To'\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\">\n <h4>Product / Feature logic</h4>\n <p> Logic for back-end/front-end permissions binding:\n <br /> * product.category (these are features) => type of product, i.e., seat_pricing or item_pricing\n <br /> * product.feature_key => this describes the main feature\n <br /> * product.permission_key => users can be subscribed to only one product of same permission_key\n <br /> * product.product_key => this is unique to each product, it defines the permission for frontend binding\n <br /> * Example of permission => {{ 'Pages.Product.{permission_key}.{product_key}' }}\n <br /> * If it's a feature associated to an existing project, you can to set the \"dependency product\" accordingly. </p>\n </div>\n <div class=\"col-12 col-md-6\">\n <h4>If it's a Free Product</h4>\n <p> Stripe Plan needs to be nil. <br /> \"Price\" per Unit needs to be set as 0. <br /> \"Trial Days\" needs\n to be something like 99999. <br /> The product should be set as \"visible===false\". </p>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n <div class=\"row\" *ngIf=\"id\">\n <div class=\"col-md-6\">\n <div class=\"text-center mt-5\">\n <div class=\"image-container\">\n <h4 class=\"mb-2\"> {{ 'User.Subscriptions.FullLogo' | transloco }} <span class=\"tooltip-wrap ms-1\"\n [pTooltip]=\"'User.Subscriptions.Tooltip.FullLogo'|transloco\" [appendTo]=\"'body'\"\n [tooltipPosition]=\"'top'\">\n <i class=\"fas fa-info-circle\"></i>\n </span>\n </h4>\n <img [src]=\"fullLogo\" alt=\"Demo Logo\" class=\"image full-logo w-100 h-100\"\n (error)=\"handleImageError($event, 'assets/img/icons/demo_logo1.png')\" />\n <div class=\"overlay mt-2\" (click)=\"openModal(content)\" (keydown.enter)=\"openModal(content)\">\n <div class=\"overlay-text\">\n <a aria-label=\"Navigate to Target\">{{ 'User.Profile.Change' | transloco }}</a>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"text-center mt-5\">\n <div class=\"image-container\">\n <h4 class=\"mb-2\"> {{ 'User.Subscriptions.SquaredLogo' | transloco }} <span class=\"tooltip-wrap ms-1\"\n [pTooltip]=\"'User.Subscriptions.Tooltip.SquaredLogo'|transloco\" [appendTo]=\"'body'\"\n [tooltipPosition]=\"'top'\">\n <i class=\"fas fa-info-circle\"></i>\n </span>\n </h4>\n <img [src]=\"squaredLogo\" alt=\"Company Logo\" width=\"70\" class=\"squared_logo\" height=\"70\"\n (error)=\"handleImageError($event, 'assets/img/icons/company.png')\" />\n <div class=\"overlay mt-2\" (keydown.enter)=\"openModal(squaredLogoContent)\" (click)=\"openModal(squaredLogoContent)\">\n <div class=\"overlay-text\">\n <a aria-label=\"Navigate to Target\">{{ 'User.Profile.Change' | transloco }}</a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <form [formGroup]=\"form\" (ngSubmit)=\"onSave()\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Name' | transloco\"\n [label]=\"'Label.Name' | transloco\" class=\"col-md-6 p-0\" name=\"name\"\n [isLeftTooltip]=\"true\"\n [errorMsg]=\"'Admin.Products.Validation.Name' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"name\"\n [ngClass]=\"{ 'is-invalid': submitted && f['name'].errors }\" />\n </pw-input-container>\n </div>\n <div class=\"col-md-6\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.NickName' | transloco\"\n [label]=\"'Admin.Products.NickName' | transloco\" class=\"col-md-6 p-0\" name=\"nickname\" [errorMsg]=\"\n 'Admin.Products.Validation.NickName' | transloco\n \">\n <input type=\"text\" class=\"form-control\" formControlName=\"nickname\" [ngClass]=\"{\n 'is-invalid': submitted && f['nickname'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"row\">\n <div class=\"mb-3 col-12 col-md-6\">\n <pw-input-container [label]=\"'Admin.Products.MinUnit' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MinUnits' | transloco\" class=\"col-md-6 p-0\" name=\"min_units\"\n [errorMsg]=\"'Admin.Products.Validation.MinUnit' | transloco\">\n <input type=\"number\" min=\"1\" class=\"form-control\" formControlName=\"min_units\" [ngClass]=\"{\n 'is-invalid': submitted && f['min_units'].errors\n }\" />\n </pw-input-container>\n </div>\n <div class=\"mb-3 col-12 col-md-6\">\n <pw-input-container [label]=\"'Admin.Products.MaxUnit' | transloco\" [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MaxUnits' | transloco\" class=\"col-md-6 p-0\" name=\"max_units\"\n [errorMsg]=\"'Admin.Products.Validation.MaxUnit' | transloco\">\n <input type=\"number\" min=\"1\" class=\"form-control\" formControlName=\"max_units\" [ngClass]=\"{\n 'is-invalid': submitted && f['max_units'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <label class=\"info-circle\" for=\"productList\"> {{ 'Admin.Products.DependencyProducts' | transloco }}<span\n class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.Products.Tooltip.DependencyProducts' |\n transloco }}</span>\n </label>\n <p-multiSelect [options]=\"productsList\" [(ngModel)]=\"selectedScopes\"\n [ngModelOptions]=\"{ standalone: true }\" (onChange)=\"onSearchCriteria($event)\" [showHeader]=\"false\"\n maxSelectedLabels=\"1\" appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.StripePlan' | transloco\"\n [label]=\"'Admin.Products.StripePlan' | transloco\" class=\"col-md-6 p-0\" name=\"stripe_plan_id\">\n <input type=\"text\" class=\"form-control\" formControlName=\"stripe_plan_id\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Price' | transloco\"\n [isLeftTooltip]=\"true\"\n [label]=\"'Admin.Products.Price' | transloco\" class=\"col-md-6 p-0\" name=\"price_per_unit\"\n [errorMsg]=\"'Admin.Products.Validation.Name' | transloco\">\n <input type=\"text\" numbersOnly class=\"form-control\" formControlName=\"price_per_unit\" [ngClass]=\"{\n 'is-invalid': submitted && f['price_per_unit'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.TrialDays' | transloco\"\n [label]=\"'Admin.Products.TrialDays' | transloco\" class=\"col-md-6 p-0\" name=\"trial_days\"\n [errorMsg]=\"'Admin.Products.Validation.TrialDays' | transloco\">\n <input type=\"number\" min=\"1\" class=\"form-control\" formControlName=\"trial_days\" [ngClass]=\"{\n 'is-invalid': submitted && f['trial_days'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MaxTrialHits' | transloco\"\n [label]=\"'Admin.Products.MaxTrialHits' | transloco\" class=\"col-md-6 p-0\" name=\"max_hits_trial\">\n <input type=\"number\" min=\"0\" class=\"form-control\" formControlName=\"max_hits_trial\" [ngClass]=\"{\n 'is-invalid': submitted && f['max_hits_trial'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-6\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.TrialHits' | transloco\"\n [label]=\"'Admin.Products.TrialHits' | transloco\" class=\"col-md-6 p-0\" name=\"max_hits\">\n <input type=\"number\" min=\"0\" class=\"form-control\" formControlName=\"max_hits\"\n [ngClass]=\"{ 'is-invalid': submitted && f['max_hits'].errors }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-12\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Description' | transloco\"\n [label]=\"'Admin.Products.Description' | transloco\" name=\"description\"\n [errorMsg]=\"'Admin.Products.Validation.Description' | transloco\">\n <quill-editor [styles]=\"{ height: '220px' }\" formControlName=\"description\" class=\"quillEditor\" [modules]=\"editorConfig\" id=\"descriptionEditor\"\n [ngClass]=\"{ 'is-invalid': submitted && f['description'].errors, 'quill-container': true}\">\n </quill-editor>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-12\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.SignupInstructions' | transloco\"\n [label]=\"'Admin.Products.SignupInstructions' | transloco\" name=\"signup_instructions\">\n <quill-editor [styles]=\"{ height: '220px' }\" formControlName=\"signup_instructions\" class=\"quillEditor\" [modules]=\"editorConfig\" id=\"signupInstructionsEditor\" [ngClass]=\"{\n 'is-invalid': submitted && f['signup_instructions'].errors, 'quill-container': true\n }\">\n </quill-editor>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-12\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.SignupInstructionEmployees' | transloco\"\n [label]=\"'Admin.Products.SignupInstructionEmployees' | transloco\" name=\"signup_instruction_employees\">\n <quill-editor [styles]=\"{ height: '220px' }\" formControlName=\"signup_instruction_employees\" class=\"quillEditor\" [modules]=\"editorConfig\" id=\"signupEmployeesEditor\" [ngClass]=\"{\n 'is-invalid':\n submitted && f['signup_instruction_employees'].errors, 'quill-container': true\n }\">\n </quill-editor>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.PermissionKey' | transloco\"\n [label]=\"'Admin.Products.PermissionKey' | transloco\" name=\"permission_key\" [errorMsg]=\"\n 'Admin.Products.Validation.PermissionKey' | transloco\n \">\n <input type=\"text\" class=\"form-control\" [ngClass]=\"{\n 'is-invalid': submitted && f['permission_key'].errors\n }\" formControlName=\"permission_key\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.FeatureKey' | transloco\"\n [label]=\"'Admin.Products.FeatureKey' | transloco\" name=\"feature_key\"\n [errorMsg]=\"'Admin.Products.Validation.FeatureKey' | transloco\">\n <input type=\"text\" class=\"form-control\" [ngClass]=\"{\n 'is-invalid': submitted && f['feature_key'].errors\n }\" formControlName=\"feature_key\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [label]=\"'Admin.Products.ProductKey' | transloco\" class=\"col-md-6 p-0\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.Products.Tooltip.PermissionKey' | transloco\n \" name=\"product_key\"\n [errorMsg]=\"'Admin.Products.Validation.ProductKey' | transloco\">\n <input type=\"text\" class=\"form-control\" formControlName=\"product_key\" [ngClass]=\"{\n 'is-invalid': submitted && f['product_key'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [label]=\"'Admin.Products.Category' | transloco\" class=\"col-md-6 p-0\"\n [showTooltip]=\"true\" [tooltipText]=\"\n 'Admin.Products.Tooltip.PermissionKey' | transloco\n \" name=\"category\" [errorMsg]=\"'Admin.Products.Validation.Category' | transloco\">\n <p-dropdown [options]=\"categories\" class=\"dropdown-bg-transparent\" formControlName=\"category\"\n [ngClass]=\"{ 'is-invalid': submitted && f['category'].errors }\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.BillingFrequency' | transloco\"\n [label]=\"'Admin.Products.BillingFrequency' | transloco\" class=\"col-md-6 p-0\" name=\"billing_frequency\">\n <p-dropdown [options]=\"frequency\" class=\"dropdown-bg-transparent\" formControlName=\"billing_frequency\"\n [required]=\"true\" [ngClass]=\"{\n 'is-invalid': submitted && f['billing_frequency'].errors\n }\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.DocumentationUrl' | transloco\"\n [label]=\"'Admin.Products.DocumentationUrl' | transloco\" class=\"col-md-6 p-0\" name=\"documentation_url\">\n <input type=\"text\" class=\"form-control\" formControlName=\"documentation_url\" [ngClass]=\"{\n 'is-invalid': submitted && f['documentation_url'].errors\n }\" />\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.ProductPrivacyService' | transloco\"\n [label]=\"'Admin.Products.ProductPrivacyService' | transloco\" name=\"product_privacy_service_id\">\n <p-dropdown\n [options]=\"allTos\"\n formControlName=\"product_privacy_service_id\"\n [placeholder]=\"'Select Privacy Service'\"\n optionValue=\"id\"\n optionLabel=\"title\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\" *rbacAllow=\"'SuperAdmin'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MasterProduct' | transloco\"\n [label]=\"'Admin.Products.MasterProduct' | transloco\" name=\"master_product_id\">\n <p-dropdown\n [options]=\"productsList\"\n formControlName=\"master_product_id\"\n [placeholder]=\"'Select Master Product'\"\n optionValue=\"value\"\n optionLabel=\"label\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"mb-3 col-xs-12 col-sm-6 col-md-4\">\n <label class=\"info-circle\" for=\"Roles\">{{ 'Admin.Products.AssignedRoles' | transloco }} <span\n class=\"tooltiptext gradient-custom-branding\">{{ 'Admin.Subscriptions.Tooltip.AssignedRoles' |\n transloco }}</span>\n </label>\n <p-multiSelect [options]=\"allRoles\" formControlName=\"roles\" appendTo=\"body\"></p-multiSelect>\n </div>\n <div class=\"col-12 col-md-4\" *ngIf=\"supportedCurrency$ | async as currency\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Currency' | transloco\"\n [label]=\"'Admin.Products.Currency' | transloco\" name=\"currency\"\n [errorMsg]=\"'Admin.Products.Validation.Currency' | transloco\">\n <p-dropdown\n [options]=\"currency['regions']\"\n formControlName=\"currency\"\n [ngClass]=\"{ 'is-invalid': submitted && f['currency'].errors }\"\n [placeholder]=\"'Select Currency'\"\n [showClear]=\"false\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\" *ngIf=\"supportedRegions$ | async as region\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.Region' | transloco\"\n [isLeftTooltip]=\"true\"\n [label]=\"'Admin.Products.Region' | transloco\" name=\"region\"\n [errorMsg]=\"'Admin.Products.Validation.Region' | transloco\">\n <p-dropdown\n [options]=\"region['regions']\"\n formControlName=\"region\"\n [ngClass]=\"{ 'is-invalid': submitted && f['region'].errors }\"\n [placeholder]=\"'Select Region'\"\n [showClear]=\"false\">\n </p-dropdown>\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.GitLabServiceDeskEmail' | transloco\"\n [label]=\"'Admin.Products.GitLabServiceDeskEmail' | transloco\" name=\"gitlab_service_desk_email\">\n <input type=\"text\" class=\"form-control\" formControlName=\"gitlab_service_desk_email\" />\n </pw-input-container>\n </div>\n <div class=\"col-12 col-md-4\" *rbacAllow=\"'Pages.Alpha'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.PartnerProducts' | transloco\"\n [label]=\"'Admin.Products.PartnerProducts' | transloco\" name=\"partner_products\">\n <p-multiSelect [options]=\"productsList\" (onChange)=\"onSearchPartnerProducts($event)\"\n [ngModelOptions]=\"{ standalone: true }\" [showToggleAll]=\"true\" [(ngModel)]=\"selectedPartnerProducts\"\n [showHeader]=\"true\" maxSelectedLabels=\"1\" appendTo=\"body\">\n </p-multiSelect>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\" *rbacAllow=\"'Pages.Alpha'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.ProrationBehavior' | transloco\"\n [label]=\"'Admin.Products.ProrationBehavior' | transloco\" name=\"proration_behavior\">\n <p-dropdown\n [options]=\"prorationBehaviors\"\n formControlName=\"proration_behavior\"\n [placeholder]=\"'Select Proration Behavior'\"\n optionValue=\"value\"\n optionLabel=\"label\"\n [showClear]=\"true\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col-12 col-md-4\" *rbacAllow=\"'Pages.Alpha'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.UnsubscribeStripeBehavior' | transloco\"\n [label]=\"'Admin.Products.UnsubscribeStripeBehavior' | transloco\" name=\"unsubscribe_stripe_behavior\">\n <p-dropdown\n [options]=\"unsubscribeBehaviors\"\n formControlName=\"unsubscribe_stripe_behavior\"\n [placeholder]=\"'Select Unsubscribe Stripe Behavior'\"\n optionValue=\"value\"\n optionLabel=\"label\"\n [showClear]=\"true\">\n </p-dropdown>\n </pw-input-container>\n </div>\n </div>\n <!--start toggles -->\n <div class=\"col-12 row mt-4\">\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\" [tooltipText]=\"'Admin.Products.Tooltip.IsActive' | transloco\"\n [label]=\"'Admin.Products.IsActive' | transloco\" name=\"active\">\n <ui-switch class=\"d-block\" formControlName=\"active\" name=\"active\"\n [ngClass]=\"{ 'is-invalid': submitted && f['active'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\" *rbacAllow=\"'SuperAdmin'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MultipleAllowed' | transloco\"\n [label]=\"'Admin.Products.MultipleAllowed' | transloco\" class=\"nowrap\" name=\"multiple_allowed\">\n <ui-switch class=\"d-block\" formControlName=\"multiple_allowed\" name=\"multiple_allowed\" [ngClass]=\"{\n 'is-invalid': submitted && f['multiple_allowed'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.IsVisible' | transloco\"\n [label]=\"'Admin.Products.IsVisible' | transloco\" name=\"visible\">\n <ui-switch class=\"d-block\" formControlName=\"visible\" name=\"visible\"\n [ngClass]=\"{ 'is-invalid': submitted && f['visible'].errors }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.MembersVisible' | transloco\"\n [label]=\"'Admin.Products.MembersVisible' | transloco\" name=\"members_visible\">\n <ui-switch class=\"d-block\" formControlName=\"members_visible\" name=\"members_visible\" [ngClass]=\"{\n 'is-invalid': submitted && f['members_visible'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.ChatVisible' | transloco\"\n [label]=\"'Admin.Products.ChatVisible' | transloco\" name=\"chat_visible\">\n <ui-switch class=\"d-block\" formControlName=\"chat_visible\" name=\"chat_visible\" [ngClass]=\"{\n 'is-invalid': submitted && f['chat_visible'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n <div class=\"col\" *rbacAllow=\"'SuperAdmin'\">\n <div class=\"mb-3\">\n <pw-input-container [showTooltip]=\"true\"\n [tooltipText]=\"'Admin.Products.Tooltip.IsMasterProduct' | transloco\"\n [label]=\"'Admin.Products.IsMasterProduct' | transloco\" name=\"is_master_product\">\n <ui-switch class=\"d-block\" formControlName=\"is_master_product\" name=\"is_master_product\" [ngClass]=\"{\n 'is-invalid': submitted && f['is_master_product'].errors\n }\">\n </ui-switch>\n </pw-input-container>\n </div>\n </div>\n </div>\n <!-- end toggles -->\n </div>\n <div class=\"row text-end mt-4\">\n <div class=\"col-12\">\n <button type=\"button\" class=\"btn btn-outline-default me-2\" (click)=\"back()\"> {{ 'Button.Cancel' |\n transloco }} </button>\n <button type=\"submit\" [buttonBusy]=\"submitted\" class=\"btn btn-primary\" *rbacAllow=\"'Pages.Admin.Product.Edit'\"> {{ 'Button.Submit'\n | transloco }} </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n</div>\n<ng-template #content let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'User.Subscriptions.FullLogo' | transloco }}</h3>\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <pw-image-cropper #profile (imageSelectionEvent)=\"onImageSelection($event)\" aspectRatio=\"fullLogo\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n<ng-template #squaredLogoContent let-modal>\n <div class=\"modal-header\">\n <h3 class=\"modal-title mb-0 p-0\">{{ 'User.Subscriptions.SquaredLogo' | transloco }}</h3>\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <small> {{ 'User.Profile.PictureMessage' | transloco }}</small>\n <pw-image-cropper #profile (imageSelectionEvent)=\"uploadSquaredLogo($event)\" aspectRatio=\"auto\"\n (closeEvent)=\"onClose()\">\n </pw-image-cropper>\n </div>\n</ng-template>\n", styles: [".nowrap{white-space:nowrap}textarea{height:180px}.full-logo{object-fit:cover;width:280px}\n"] }]
|
|
349
369
|
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.ProductService }, { type: i2.NgbModal }, { type: i3.AdminService }], propDecorators: { onSave: [] } });
|
|
350
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYWRtaW4tbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcm9kdWN0cy9wcm9kdWN0LWRldGFpbHMvcHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYWRtaW4tbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcm9kdWN0cy9wcm9kdWN0LWRldGFpbHMvcHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxRQUFRLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBR3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTlFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhdEQsTUFBTSxPQUFPLHVCQUNULFNBQVEsZ0JBQWdCO0lBb0R4QixZQUNJLFFBQWtCLEVBQ0QsY0FBOEIsRUFDOUIsWUFBc0IsRUFDdEIsWUFBMEI7UUFFM0MsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBSkMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQ3RCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FB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LENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNULEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRVEsV0FBVztRQUNoQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEIsQ0FBQzsrR0FqWFEsdUJBQXVCO21HQUF2Qix1QkFBdUIsaUZDMUJwQyx5cjVCQWllQTs7QUR0UUk7SUFEQyxZQUFZLENBQUMsTUFBTSxDQUFDOzs7O3FEQW1CcEI7NEZBbk5RLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDSSxvQkFBb0I7NEpBcU05QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEFkbWluU2VydmljZSwgQXBwQWRtaW4gfSBmcm9tICdAcG9zaXdpc2UvYWRtaW4tbW9kdWxlLXV0aWxzJztcbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2UvYXBwLWJhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlLCBQcm9kdWN0U2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tc2VydmljZXMnO1xuaW1wb3J0IHsgUHJvZHVjdCB9IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tdXRpbGl0aWVzJztcbmltcG9ydCB7IEhlbHBlclNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2UvaGVscGVyLXNlcnZpY2UnO1xuaW1wb3J0IHsgUXVpbGxIZWxwZXIsIFZhbGlkYXRlRm9ybSB9IGZyb20gJ0Bwb3Npd2lzZS91dGlscyc7XG5cbmltcG9ydCB7IFNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuXG5pbXBvcnQge1xuICAgIFN1YnNjcmlwdGlvblJvbGUsXG4gICAgU3Vic2NyaXB0aW9uc1JvbGVzRGF0YVxufSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvaW50ZXJmYWNlL2FkbWluLW1vZHVsZS1zaGFyZWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFByaXZhY3lUb3MgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvaW50ZXJmYWNlL3ByaXZhY3ktdG9zLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncHctcHJvZHVjdC1kZXRhaWxzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9wcm9kdWN0LWRldGFpbHMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0RGV0YWlsc0NvbXBvbmVudFxuICAgIGV4dGVuZHMgQXBwQmFzZUNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXRcbntcbiAgICBzdXBwb3J0ZWRDdXJyZW5jeSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICBzdXBwb3J0ZWRSZWdpb25zJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIHM7XG4gICAgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcblxuICAgIHN1Ym1pdHRlZCA9IGZhbHNlO1xuXG4gICAgaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgIGRhdGE6IFByb2R1Y3Q7XG5cbiAgICBwcm9kdWN0c0xpc3Q6IFNlbGVjdEl0ZW1bXTtcbiAgICBjYXRlZ29yaWVzID0gW107XG4gICAgYWxsVG9zOiBQcml2YWN5VG9zW107XG4gICAgYWxsUm9sZXM6IFNlbGVjdEl0ZW1bXTtcbiAgICBwcm9kdWN0Um9sZXM6IFN1YnNjcmlwdGlvblJvbGVbXTtcbiAgICBzZWxlY3RlZFByb2R1Y3RzOiBTZWxlY3RJdGVtW10gPSBbXTtcbiAgICBzZWxlY3RlZFNjb3BlczogU2VsZWN0SXRlbVtdID0gW107XG4gICAgc2VsZWN0ZWRQYXJ0bmVyUHJvZHVjdHM6IFNlbGVjdEl0ZW1bXSA9IFtdO1xuXG4gICAgZnJlcXVlbmN5ID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1NlbGVjdCcsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ01vbnRobHknLFxuICAgICAgICAgICAgdmFsdWU6ICdtb250aCdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdZZWFybHknLFxuICAgICAgICAgICAgdmFsdWU6ICd5ZWFyJ1xuICAgICAgICB9XG4gICAgXTtcblxuICAgIHN1YnNjcmlwdGlvbnNSb2xlc0RhdGE6IFN1YnNjcmlwdGlvbnNSb2xlc0RhdGE7XG5cbiAgICBzbHVnOiBzdHJpbmc7XG5cbiAgICBmdWxsTG9nbyA9ICcnO1xuICAgIHNxdWFyZWRMb2dvID0gJyc7XG5cbiAgICBzdWJzY3JpcHRpb25JZDogbnVtYmVyO1xuICAgIG1hc3RlclByb2R1Y3RJZDogbnVtYmVyO1xuICAgIGlkOiBudW1iZXI7XG4gICAgZHVwbGljYXRlSWQ6IG51bWJlcjtcblxuICAgIGVkaXRvckNvbmZpZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjdFNlcnZpY2U6IFByb2R1Y3RTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWRtaW5TZXJ2aWNlOiBBZG1pblNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xuICAgICAgICBRdWlsbEhlbHBlci5pbml0KCk7XG4gICAgICAgIHRoaXMuZWRpdG9yQ29uZmlnID0gUXVpbGxIZWxwZXIuZ2V0RWRpdG9yQ29uZmlnKCk7XG4gICAgICAgIHRoaXMuZm9ybSA9IEFwcEFkbWluLmdldFByb2R1Y3RzRm9ybSgpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgSGVscGVyU2VydmljZS5zdWJzY3JpYmVUb0VkaXRvckNoYW5nZXModGhpcy5mb3JtLCAnZGVzY3JpcHRpb24nKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zdXBwb3J0ZWRDdXJyZW5jeSQgPSB0aGlzLnByb2R1Y3RTZXJ2aWNlLmdldFN1cHBvcnRlZEN1cnJlbmN5KCk7XG4gICAgICAgIHRoaXMuc3VwcG9ydGVkUmVnaW9ucyQgPSB0aGlzLnByb2R1Y3RTZXJ2aWNlLmdldFN1cHBvcnRlZFJlZ2lvbnMoKTtcbiAgICAgICAgdGhpcy5tYXN0ZXJQcm9kdWN0SWQgPSB0aGlzLmFwcENvbmZpZy5tYXN0ZXJfc3Vic2NyaXB0aW9uLnByb2R1Y3RfaWQ7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSBQZXJtaXNzaW9uU2VydmljZS5zZWxlY3RlZFN1YnNjcmlwdGlvbj8uaWQ7XG4gICAgICAgIHRoaXMuZHVwbGljYXRlSWQgPSBOdW1iZXIodGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1snZHVwbGljYXRlX3Byb2R1Y3RfaWQnXSk7XG4gICAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5pZCA9ICtwYXJhbXNbJ2lkJ10gfHwgMDtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2F0ZWdvcmllcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb2R1Y3REZXRhaWxzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTdWJzY3JpcHRpb25Sb2xlKHRoaXMuaWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuZHVwbGljYXRlSWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RHVwbGljYXRlUHJvZHVjdERldGFpbHMoKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0U3Vic2NyaXB0aW9uUm9sZSh0aGlzLmR1cGxpY2F0ZUlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJTdG9yZSgpLnN1YnNjcmliZSh1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbHVnID0gdXNlci5zbHVnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXRQcm9kdWN0cygpO1xuICAgICAgICB0aGlzLmdldEFsbFRvcygxLCB0aGlzLlBBR0VfU0laRSk7XG4gICAgICAgIHRoaXMuZ2V0Um9sZXMoKTtcbiAgICB9XG5cbiAgICBnZXQgZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5jb250cm9scztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByb2R1Y3RzKCkge1xuICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0UHJvZHVjdHMoe1xuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgICAgICAgICBtYXN0ZXJfcHJvZHVjdF9pZDogdGhpcy5tYXN0ZXJQcm9kdWN0SWRcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3AgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwPy5wcm9kdWN0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHNMaXN0ID0gcmVzcC5wcm9kdWN0cy5tYXAoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlbGVtZW50Lm5hbWUgPz8gJydcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uU2VhcmNoQ3JpdGVyaWEoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByb2R1Y3RzID0gZXZlbnQudmFsdWUubWFwKHggPT4geCk7XG4gICAgfVxuXG4gICAgaGFuZGxlSW1hZ2VFcnJvcihldmVudDogRXZlbnQsIGZhbGxiYWNrUGF0aCk6IHZvaWQge1xuICAgICAgICBIZWxwZXJTZXJ2aWNlLmhhbmRsZUltYWdlRmFsbGJhY2tQYXRoKGV2ZW50LCBmYWxsYmFja1BhdGgpO1xuICAgIH1cblxuICAgIG9uU2VhcmNoUGFydG5lclByb2R1Y3RzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQYXJ0bmVyUHJvZHVjdHMgPSBldmVudC52YWx1ZS5tYXAoeCA9PiB4KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldER1cGxpY2F0ZVByb2R1Y3REZXRhaWxzKCkge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMucHJvZHVjdFNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRQcm9kdWN0QnlJZCh0aGlzLmR1cGxpY2F0ZUlkKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNjb3BlcyA9IHJlc3BvbnNlLmRlcGVuZGVuY3lfcHJvZHVjdHM7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhWydpZCddO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKGRhdGEpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByb2R1Y3REZXRhaWxzKCkge1xuICAgICAgICBpZiAodGhpcy5pZCkge1xuICAgICAgICAgICAgdGhpcy5wcm9kdWN0U2VydmljZS5nZXRQcm9kdWN0QnlJZCh0aGlzLmlkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTY29wZXMgPSByZXNwb25zZS5kZXBlbmRlbmN5X3Byb2R1Y3RzO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBhcnRuZXJQcm9kdWN0cyA9IHJlc3BvbnNlLnBhcnRuZXJfcHJvZHVjdF9pZHM7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmZ1bGxfbG9nbykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bGxMb2dvID0gcmVzcG9uc2UuZnVsbF9sb2dvLnVybDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnNxdWFyZWRfbG9nbykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNxdWFyZWRMb2dvID0gcmVzcG9uc2Uuc3F1YXJlZF9sb2dvLnVybDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2F0ZWdvcmllcygpIHtcbiAgICAgICAgdGhpcy5wcm9kdWN0U2VydmljZS5nZXRQcm9kdWN0Q2F0ZWdvcmllcygpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2U/LmNhdGVnb3JpZXMpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZS5jYXRlZ29yaWVzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZWxlbWVudCA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcmllcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzLnVuc2hpZnQoe1xuICAgICAgICAgICAgbGFiZWw6ICdTZWxlY3QnLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgYWxsIHRvcyAqL1xuICAgIHByaXZhdGUgZ2V0QWxsVG9zKHBhZ2U6IG51bWJlciwgcGFnZV9zaXplOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5hZG1pblNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRBbGxUb3MoeyBwYWdlLCBwYWdlX3NpemUgfSwgdGhpcy5zdWJzY3JpcHRpb25JZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWxsVG9zID0gcmVzcG9uc2UucHJvZHVjdF9wcml2YWN5X3NlcnZpY2VzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQFZhbGlkYXRlRm9ybSgnZm9ybScpXG4gICAgb25TYXZlKCkge1xuICAgICAgICBjb25zdCBlZGl0b3JzID0gW1xuICAgICAgICAgICAgeyBjb250cm9sTmFtZTogJ2Rlc2NyaXB0aW9uJywgc2VsZWN0b3I6ICcjZGVzY3JpcHRpb25FZGl0b3InIH0sXG4gICAgICAgICAgICB7IGNvbnRyb2xOYW1lOiAnc2lnbnVwX2luc3RydWN0aW9ucycsIHNlbGVjdG9yOiAnI3NpZ251cEluc3RydWN0aW9uc0VkaXRvcicgfSxcbiAgICAgICAgICAgIHsgY29udHJvbE5hbWU6ICdzaWdudXBfaW5zdHJ1Y3Rpb25fZW1wbG95ZWVzJywgc2VsZWN0b3I6ICcjc2lnbnVwRW1wbG95ZWVzRWRpdG9yJyB9XG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggZWRpdG9yLCBnZXQgdGhlIHJhdyBIVE1MLCBhbmQgc2V0IGl0IGluIHRoZSBmb3JtIGNvbnRyb2xcbiAgICAgICAgZWRpdG9ycy5mb3JFYWNoKGVkaXRvciA9PiB7XG4gICAgICAgICAgICBjb25zdCByYXdIdG1sID0gSGVscGVyU2VydmljZS5TYXZlUmF3SFRNTChlZGl0b3Iuc2VsZWN0b3IpO1xuICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2VkaXRvci5jb250cm9sTmFtZV0uc2V0VmFsdWUocmF3SHRtbCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmlkKSB7XG4gICAgICAgICAgICB0aGlzLm9uVXBkYXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uQWRkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkFkZCgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuZm9ybS52YWx1ZSxcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgICAgIHBhcnRuZXJfcHJvZHVjdF9pZHM6IHRoaXMuc2VsZWN0ZWRQYXJ0bmVyUHJvZHVjdHNcbiAgICAgICAgfTtcbiAgICAgICAgZGVsZXRlIGRhdGEucm9sZXM7XG4gICAgICAgIHRoaXMucHJvZHVjdFNlcnZpY2VcbiAgICAgICAgICAgIC5hZGRQcm9kdWN0KGRhdGEpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm0udmFsdWUucm9sZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnNSb2xlc0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfcm9sZXM6IHRoaXMuZm9ybS5nZXQoJ3JvbGVzJykudmFsdWU/Lm1hcChyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcm9sZV9pZDogcmVzIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X2lkOiByZXNwb25zZS5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZG1pblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNhdmVQcm9kdWN0Um9sZXModGhpcy5zdWJzY3JpcHRpb25zUm9sZXNEYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnQWRtaW4uVXNlcnMuVXBkYXRlZFJvbGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnQWRtaW4uUHJvZHVjdHMuQWRkZWRNZXNzYWdlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LmVycm9yKHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdHZW5lcmljTWVzc2FnZS5XZW50V3JvbmcnKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciA9PiB0aGlzLnRvYXN0LnNob3dUb2FzdChlcnJvcilcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25VcGRhdGUoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmZvcm0udmFsdWUsXG4gICAgICAgICAgICBkZXBlbmRlbmN5X3Byb2R1Y3RzOiB0aGlzLnNlbGVjdGVkUHJvZHVjdHMsXG4gICAgICAgICAgICBwYXJ0bmVyX3Byb2R1Y3RfaWRzOiB0aGlzLnNlbGVjdGVkUGFydG5lclByb2R1Y3RzLFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uX2lkOiB0aGlzLnN1YnNjcmlwdGlvbklkXG4gICAgICAgIH07XG4gICAgICAgIGRlbGV0ZSBkYXRhLnJvbGVzO1xuXG4gICAgICAgIHRoaXMucHJvZHVjdFNlcnZpY2UudXBkYXRlUHJvZHVjdChkYXRhLCB0aGlzLmlkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5lcnJvcih0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnR2VuZXJpY01lc3NhZ2UuV2VudFdyb25nJykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdBZG1pbi5Qcm9kdWN0cy5VcGRhdGVkTWVzc2FnZScpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1JvbGVzRGF0YSA9IHtcbiAgICAgICAgICAgIHByb2R1Y3Rfcm9sZXM6IHRoaXMuZm9ybS5nZXQoJ3JvbGVzJykudmFsdWU/Lm1hcChyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvbGVfaWQ6IHJlcyB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9kdWN0X2lkOiB0aGlzLmlkXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlXG4gICAgICAgICAgICAuc2F2ZVByb2R1Y3RSb2xlcyh0aGlzLnN1YnNjcmlwdGlvbnNSb2xlc0RhdGEpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3ModGhpcy50cmFuc2xhdGlvbi50cmFuc2xhdGUoJ0FkbWluLlVzZXJzLlVwZGF0ZWRSb2xlJykpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJvbGVzKCkge1xuICAgICAgICB0aGlzLmFkbWluU2VydmljZS5nZXRSb2xlcyh7fSwgdGhpcy5zdWJzY3JpcHRpb25JZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWxsUm9sZXMgPSByZXNwb25zZS5yb2xlcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0uaWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3Vic2NyaXB0aW9uUm9sZShpZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlLmdldFByb2R1Y3RzUm9sZXMoaWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RSb2xlcyA9IHJlc3BvbnNlPy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBpZDogaXRlbS5pZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgcm9sZXM6IHRoaXMucHJvZHVjdFJvbGVzLm1hcCh4ID0+IHguaWQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3Blbk1vZGFsKGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbihjb250ZW50LCB7IGNlbnRlcmVkOiB0cnVlLCB3aW5kb3dDbGFzczogJ21vZGFsLWhvbGRlcicgfSk7XG4gICAgfVxuXG4gICAgb25JbWFnZVNlbGVjdGlvbihldmVudCkge1xuICAgICAgICBjb25zdCBibG9iID0gdGhpcy5kYXRhVVJMdG9CbG9iKGV2ZW50KTtcbiAgICAgICAgY29uc3Qgc2x1ZyA9IHRoaXMuc2x1Zy50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLnBhcnNlKG5ldyBEYXRlKCkudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7c2x1Z31fJHt0aW1lc3RhbXB9LnBuZ2A7XG4gICAgICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBuZXcgRmlsZShbYmxvYl0sIGZpbGVuYW1lKTtcbiAgICAgICAgY29uc3QgZmlsZURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgZmlsZURhdGEuYXBwZW5kKCdmdWxsX2xvZ28nLCBmaWxlKTtcbiAgICAgICAgZmlsZURhdGEuYXBwZW5kKCdzdWJzY3JpcHRpb25faWQnLCBgJHt0aGlzLnN1YnNjcmlwdGlvbklkfWApO1xuICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlLnVwZGF0ZVByb2R1Y3QoZmlsZURhdGEsIHRoaXMuaWQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xuICAgICAgICAgICAgdGhpcy5mdWxsTG9nbyA9IHJlcz8uZnVsbF9sb2dvPy51cmw7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVwbG9hZFNxdWFyZWRMb2dvKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSB0aGlzLmRhdGFVUkx0b0Jsb2IoZXZlbnQpO1xuICAgICAgICBjb25zdCBmaWxlU2x1ZyA9IHRoaXMuc2x1Zy50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBmaWxlVGltZXN0YW1wID0gRGF0ZS5wYXJzZShuZXcgRGF0ZSgpLnRvU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGAke2ZpbGVTbHVnfV8ke2ZpbGVUaW1lc3RhbXB9LnBuZ2A7XG4gICAgICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBuZXcgRmlsZShbYmxvYl0sIGZpbGVuYW1lKTtcbiAgICAgICAgY29uc3QgZmlsZURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgZmlsZURhdGEuYXBwZW5kKCdzcXVhcmVkX2xvZ28nLCBmaWxlKTtcbiAgICAgICAgZmlsZURhdGEuYXBwZW5kKCdzdWJzY3JpcHRpb25faWQnLCBgJHt0aGlzLnN1YnNjcmlwdGlvbklkfWApO1xuICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlLnVwZGF0ZVByb2R1Y3QoZmlsZURhdGEsIHRoaXMuaWQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xuICAgICAgICAgICAgdGhpcy5zcXVhcmVkTG9nbyA9IHJlcz8uc3F1YXJlZF9sb2dvPy51cmw7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcbiAgICB9XG5cbiAgICBkYXRhVVJMdG9CbG9iKGRhdGFVcmw6IHN0cmluZykge1xuICAgICAgICBjb25zdCBhcnIgPSBkYXRhVXJsLnNwbGl0KCcsJyk7XG4gICAgICAgIGNvbnN0IG1pbWUgPSAvXltBLVpdKlthLXpdKjooLio/KTtbQS1aXSovLmV4ZWMoYXJyWzBdKT8uWzFdO1xuICAgICAgICBjb25zdCBiU3RyID0gYXRvYihhcnJbMV0pO1xuICAgICAgICBsZXQgbiA9IGJTdHIubGVuZ3RoO1xuICAgICAgICBjb25zdCB1OGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xuICAgICAgICB3aGlsZSAobi0tKSB7XG4gICAgICAgICAgICB1OGFycltuXSA9IGJTdHIuY2hhckNvZGVBdChuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQmxvYihbdThhcnJdLCB7IHR5cGU6IG1pbWUgfSk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCBwdy10YWIgcHJvZHVjdC1mb3JtIG92ZXJmbG93LWhpZGRlblwiPlxuICA8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkXCI+XG4gICAgPGRpdiBjbGFzcz1cImRhc2hib2FyZC1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWUtYXV0byBjb2wteHMtNiBtdC00XCI+XG4gICAgICAgIDxhIGFyaWEtbGFiZWw9XCJOYXZpZ2F0ZSB0byBUYXJnZXRcIiAoY2xpY2spPVwiYmFjaygpXCIgY2xhc3M9XCJwcmV2aW91c1wiPjxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctYWx0LWNpcmNsZS1sZWZ0XCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9hPlxuICAgICAgICA8aDMgY2xhc3M9XCJcIj5Qcm9kdWN0OiB7eyBkYXRhPy5uYW1lID8gZGF0YT8ubmFtZSA6ICdBZGQgTmV3JyB9fTwvaDM+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIG10LTNcIlxuICAgICAgKm5nSWY9XCJpc0xvYWRpbmdcIj5cbiAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJteS00XCIgKm5nSWY9XCIhaXNMb2FkaW5nXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi01XCI+XG4gICAgICAgICAgPHAtYWNjb3JkaW9uPlxuICAgICAgICAgICAgPHAtYWNjb3JkaW9uVGFiIFtoZWFkZXJdPVwiJ0hvdyBUbydcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxoND5Qcm9kdWN0IC8gRmVhdHVyZSBsb2dpYzwvaDQ+XG4gICAgICAgICAgICAgICAgICA8cD4gTG9naWMgZm9yIGJhY2stZW5kL2Zyb250LWVuZCBwZXJtaXNzaW9ucyBiaW5kaW5nOlxuICAgICAgICAgICAgICAgICAgICA8YnIgLz4gKiBwcm9kdWN0LmNhdGVnb3J5ICh0aGVzZSBhcmUgZmVhdHVyZXMpID0mZ3Q7IHR5cGUgb2YgcHJvZHVjdCwgaS5lLiwgc2VhdF9wcmljaW5nIG9yIGl0ZW1fcHJpY2luZ1xuICAgICAgICAgICAgICAgICAgICA8YnIgLz4gKiBwcm9kdWN0LmZlYXR1cmVfa2V5ID0mZ3Q7IHRoaXMgZGVzY3JpYmVzIHRoZSBtYWluIGZlYXR1cmVcbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+ICogcHJvZHVjdC5wZXJtaXNzaW9uX2tleSA9Jmd0OyB1c2VycyBjYW4gYmUgc3Vic2NyaWJlZCB0byBvbmx5IG9uZSBwcm9kdWN0IG9mIHNhbWUgcGVybWlzc2lvbl9rZXlcbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+ICogcHJvZHVjdC5wcm9kdWN0X2tleSA9Jmd0OyB0aGlzIGlzIHVuaXF1ZSB0byBlYWNoIHByb2R1Y3QsIGl0IGRlZmluZXMgdGhlIHBlcm1pc3Npb24gZm9yIGZyb250ZW5kIGJpbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+ICogRXhhbXBsZSBvZiBwZXJtaXNzaW9uID0mZ3Q7IHt7ICdQYWdlcy5Qcm9kdWN0LntwZXJtaXNzaW9uX2tleX0ue3Byb2R1Y3Rfa2V5fScgfX1cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+ICogSWYgaXQncyBhIGZlYXR1cmUgYXNzb2NpYXRlZCB0byBhbiBleGlzdGluZyBwcm9qZWN0LCB5b3UgY2FuIHRvIHNldCB0aGUgXCJkZXBlbmRlbmN5IHByb2R1Y3RcIiBhY2NvcmRpbmdseS4gPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxoND5JZiBpdCdzIGEgRnJlZSBQcm9kdWN0PC9oND5cbiAgICAgICAgICAgICAgICAgIDxwPiBTdHJpcGUgUGxhbiBuZWVkcyB0byBiZSBuaWwuIDxiciAvPiBcIlByaWNlXCIgcGVyIFVuaXQgbmVlZHMgdG8gYmUgc2V0IGFzIDAuIDxiciAvPiBcIlRyaWFsIERheXNcIiBuZWVkc1xuICAgICAgICAgICAgICAgICAgICB0byBiZSBzb21ldGhpbmcgbGlrZSA5OTk5OS4gPGJyIC8+IFRoZSBwcm9kdWN0IHNob3VsZCBiZSBzZXQgYXMgXCJ2aXNpYmxlPT09ZmFsc2VcIi4gPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG4gICAgICAgICAgPC9wLWFjY29yZGlvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cImlkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgbXQtNVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2UtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibWItMlwiPiB7eyAnVXNlci5TdWJzY3JpcHRpb25zLkZ1bGxMb2dvJyB8IHRyYW5zbG9jbyB9fSA8c3BhbiBjbGFzcz1cInRvb2x0aXAtd3JhcCBtcy0xXCJcbiAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidVc2VyLlN1YnNjcmlwdGlvbnMuVG9vbHRpcC5GdWxsTG9nbyd8dHJhbnNsb2NvXCIgW2FwcGVuZFRvXT1cIidib2R5J1wiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ3RvcCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiZnVsbExvZ29cIiBhbHQ9XCJEZW1vIExvZ29cIiBjbGFzcz1cImltYWdlIGZ1bGwtbG9nbyB3LTEwMCBoLTEwMFwiXG4gICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaGFuZGxlSW1hZ2VFcnJvcigkZXZlbnQsICdhc3NldHMvaW1nL2ljb25zL2RlbW9fbG9nbzEucG5nJylcIiAvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5IG10LTJcIiAoY2xpY2spPVwib3Blbk1vZGFsKGNvbnRlbnQpXCIgKGtleWRvd24uZW50ZXIpPVwib3Blbk1vZGFsKGNvbnRlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGFyaWEtbGFiZWw9XCJOYXZpZ2F0ZSB0byBUYXJnZXRcIj57eyAnVXNlci5Qcm9maWxlLkNoYW5nZScgfCB0cmFuc2xvY28gfX08L2E+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtdC01XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtYi0yXCI+IHt7ICdVc2VyLlN1YnNjcmlwdGlvbnMuU3F1YXJlZExvZ28nIHwgdHJhbnNsb2NvIH19IDxzcGFuIGNsYXNzPVwidG9vbHRpcC13cmFwIG1zLTFcIlxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ1VzZXIuU3Vic2NyaXB0aW9ucy5Ub29sdGlwLlNxdWFyZWRMb2dvJ3x0cmFuc2xvY29cIiBbYXBwZW5kVG9dPVwiJ2JvZHknXCJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCIndG9wJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2g0PlxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJzcXVhcmVkTG9nb1wiIGFsdD1cIkNvbXBhbnkgTG9nb1wiIHdpZHRoPVwiNzBcIiBjbGFzcz1cInNxdWFyZWRfbG9nb1wiIGhlaWdodD1cIjcwXCJcbiAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaGFuZGxlSW1hZ2VFcnJvcigkZXZlbnQsICdhc3NldHMvaW1nL2ljb25zL2NvbXBhbnkucG5nJylcIiAvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5IG10LTJcIiAoa2V5ZG93bi5lbnRlcik9XCJvcGVuTW9kYWwoc3F1YXJlZExvZ29Db250ZW50KVwiIChjbGljayk9XCJvcGVuTW9kYWwoc3F1YXJlZExvZ29Db250ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICA8YSBhcmlhLWxhYmVsPVwiTmF2aWdhdGUgdG8gVGFyZ2V0XCI+e3sgJ1VzZXIuUHJvZmlsZS5DaGFuZ2UnIHwgdHJhbnNsb2NvIH19PC9hPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwib25TYXZlKClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuTmFtZScgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0xhYmVsLk5hbWUnIHwgdHJhbnNsb2NvXCIgY2xhc3M9XCJjb2wtbWQtNiBwLTBcIiBuYW1lPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIFtpc0xlZnRUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbZXJyb3JNc2ddPVwiJ0FkbWluLlByb2R1Y3RzLlZhbGlkYXRpb24uTmFtZScgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ25hbWUnXS5lcnJvcnMgfVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuTmlja05hbWUnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5OaWNrTmFtZScgfCB0cmFuc2xvY29cIiBjbGFzcz1cImNvbC1tZC02IHAtMFwiIG5hbWU9XCJuaWNrbmFtZVwiIFtlcnJvck1zZ109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FkbWluLlByb2R1Y3RzLlZhbGlkYXRpb24uTmlja05hbWUnIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibmlja25hbWVcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWyduaWNrbmFtZSddLmVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuTWluVW5pdCcgfCB0cmFuc2xvY29cIiBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5NaW5Vbml0cycgfCB0cmFuc2xvY29cIiBjbGFzcz1cImNvbC1tZC02IHAtMFwiIG5hbWU9XCJtaW5fdW5pdHNcIlxuICAgICAgICAgICAgICAgICAgICBbZXJyb3JNc2ddPVwiJ0FkbWluLlByb2R1Y3RzLlZhbGlkYXRpb24uTWluVW5pdCcgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIxXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJtaW5fdW5pdHNcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydtaW5fdW5pdHMnXS5lcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5NYXhVbml0JyB8IHRyYW5zbG9jb1wiIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLk1heFVuaXRzJyB8IHRyYW5zbG9jb1wiIGNsYXNzPVwiY29sLW1kLTYgcC0wXCIgbmFtZT1cIm1heF91bml0c1wiXG4gICAgICAgICAgICAgICAgICAgIFtlcnJvck1zZ109XCInQWRtaW4uUHJvZHVjdHMuVmFsaWRhdGlvbi5NYXhVbml0JyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cIm1heF91bml0c1wiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ21heF91bml0cyddLmVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJpbmZvLWNpcmNsZVwiIGZvcj1cInByb2R1Y3RMaXN0XCI+IHt7ICdBZG1pbi5Qcm9kdWN0cy5EZXBlbmRlbmN5UHJvZHVjdHMnIHwgdHJhbnNsb2NvIH19PHNwYW5cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9vbHRpcHRleHQgZ3JhZGllbnQtY3VzdG9tLWJyYW5kaW5nXCI+e3sgJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuRGVwZW5kZW5jeVByb2R1Y3RzJyB8XG4gICAgICAgICAgICAgICAgICB0cmFuc2xvY28gfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IFtvcHRpb25zXT1cInByb2R1Y3RzTGlzdFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRTY29wZXNcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiIChvbkNoYW5nZSk9XCJvblNlYXJjaENyaXRlcmlhKCRldmVudClcIiBbc2hvd0hlYWRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgbWF4U2VsZWN0ZWRMYWJlbHM9XCIxXCIgYXBwZW5kVG89XCJib2R5XCI+XG4gICAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuU3RyaXBlUGxhbicgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5TdHJpcGVQbGFuJyB8IHRyYW5zbG9jb1wiIGNsYXNzPVwiY29sLW1kLTYgcC0wXCIgbmFtZT1cInN0cmlwZV9wbGFuX2lkXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInN0cmlwZV9wbGFuX2lkXCIgLz5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCIgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLlByaWNlJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICBbaXNMZWZ0VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuUHJpY2UnIHwgdHJhbnNsb2NvXCIgY2xhc3M9XCJjb2wtbWQtNiBwLTBcIiBuYW1lPVwicHJpY2VfcGVyX3VuaXRcIlxuICAgICAgICAgICAgICAgICAgW2Vycm9yTXNnXT1cIidBZG1pbi5Qcm9kdWN0cy5WYWxpZGF0aW9uLk5hbWUnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBudW1iZXJzT25seSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInByaWNlX3Blcl91bml0XCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydwcmljZV9wZXJfdW5pdCddLmVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAvPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuVHJpYWxEYXlzJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLlRyaWFsRGF5cycgfCB0cmFuc2xvY29cIiBjbGFzcz1cImNvbC1tZC02IHAtMFwiIG5hbWU9XCJ0cmlhbF9kYXlzXCJcbiAgICAgICAgICAgICAgICAgIFtlcnJvck1zZ109XCInQWRtaW4uUHJvZHVjdHMuVmFsaWRhdGlvbi5UcmlhbERheXMnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInRyaWFsX2RheXNcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ3RyaWFsX2RheXMnXS5lcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5NYXhUcmlhbEhpdHMnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuTWF4VHJpYWxIaXRzJyB8IHRyYW5zbG9jb1wiIGNsYXNzPVwiY29sLW1kLTYgcC0wXCIgbmFtZT1cIm1heF9oaXRzX3RyaWFsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cIm1heF9oaXRzX3RyaWFsXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydtYXhfaGl0c190cmlhbCddLmVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAvPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuVHJpYWxIaXRzJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLlRyaWFsSGl0cycgfCB0cmFuc2xvY29cIiBjbGFzcz1cImNvbC1tZC02IHAtMFwiIG5hbWU9XCJtYXhfaGl0c1wiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJtYXhfaGl0c1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnbWF4X2hpdHMnXS5lcnJvcnMgfVwiIC8+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCIgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLkRlc2NyaXB0aW9uJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5EZXNjcmlwdGlvbicgfCB0cmFuc2xvY29cIiBuYW1lPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgIFtlcnJvck1zZ109XCInQWRtaW4uUHJvZHVjdHMuVmFsaWRhdGlvbi5EZXNjcmlwdGlvbicgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICAgICAgICA8cXVpbGwtZWRpdG9yIFtzdHlsZXNdPVwieyBoZWlnaHQ6ICcyMjBweCcgfVwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCIgY2xhc3M9XCJxdWlsbEVkaXRvclwiIFttb2R1bGVzXT1cImVkaXRvckNvbmZpZ1wiIGlkPVwiZGVzY3JpcHRpb25FZGl0b3JcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydkZXNjcmlwdGlvbiddLmVycm9ycywgJ3F1aWxsLWNvbnRhaW5lcic6IHRydWV9XCI+XG4gICAgICAgICAgICAgICAgPC9xdWlsbC1lZGl0b3I+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuU2lnbnVwSW5zdHJ1Y3Rpb25zJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5TaWdudXBJbnN0cnVjdGlvbnMnIHwgdHJhbnNsb2NvXCIgbmFtZT1cInNpZ251cF9pbnN0cnVjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8cXVpbGwtZWRpdG9yIFtzdHlsZXNdPVwieyBoZWlnaHQ6ICcyMjBweCcgfVwiIGZvcm1Db250cm9sTmFtZT1cInNpZ251cF9pbnN0cnVjdGlvbnNcIiBjbGFzcz1cInF1aWxsRWRpdG9yXCIgW21vZHVsZXNdPVwiZWRpdG9yQ29uZmlnXCIgaWQ9XCJzaWdudXBJbnN0cnVjdGlvbnNFZGl0b3JcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnc2lnbnVwX2luc3RydWN0aW9ucyddLmVycm9ycywgJ3F1aWxsLWNvbnRhaW5lcic6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8L3F1aWxsLWVkaXRvcj5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5TaWdudXBJbnN0cnVjdGlvbkVtcGxveWVlcycgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuU2lnbnVwSW5zdHJ1Y3Rpb25FbXBsb3llZXMnIHwgdHJhbnNsb2NvXCIgbmFtZT1cInNpZ251cF9pbnN0cnVjdGlvbl9lbXBsb3llZXNcIj5cbiAgICAgICAgICAgICAgICA8cXVpbGwtZWRpdG9yIFtzdHlsZXNdPVwieyBoZWlnaHQ6ICcyMjBweCcgfVwiIGZvcm1Db250cm9sTmFtZT1cInNpZ251cF9pbnN0cnVjdGlvbl9lbXBsb3llZXNcIiBjbGFzcz1cInF1aWxsRWRpdG9yXCIgW21vZHVsZXNdPVwiZWRpdG9yQ29uZmlnXCIgaWQ9XCJzaWdudXBFbXBsb3llZXNFZGl0b3JcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXR0ZWQgJiYgZlsnc2lnbnVwX2luc3RydWN0aW9uX2VtcGxveWVlcyddLmVycm9ycywgJ3F1aWxsLWNvbnRhaW5lcic6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8L3F1aWxsLWVkaXRvcj5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5QZXJtaXNzaW9uS2V5JyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLlBlcm1pc3Npb25LZXknIHwgdHJhbnNsb2NvXCIgbmFtZT1cInBlcm1pc3Npb25fa2V5XCIgW2Vycm9yTXNnXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBZG1pbi5Qcm9kdWN0cy5WYWxpZGF0aW9uLlBlcm1pc3Npb25LZXknIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydwZXJtaXNzaW9uX2tleSddLmVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiBmb3JtQ29udHJvbE5hbWU9XCJwZXJtaXNzaW9uX2tleVwiIC8+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC00XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5GZWF0dXJlS2V5JyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLkZlYXR1cmVLZXknIHwgdHJhbnNsb2NvXCIgbmFtZT1cImZlYXR1cmVfa2V5XCJcbiAgICAgICAgICAgICAgICAgIFtlcnJvck1zZ109XCInQWRtaW4uUHJvZHVjdHMuVmFsaWRhdGlvbi5GZWF0dXJlS2V5JyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2ZlYXR1cmVfa2V5J10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIGZvcm1Db250cm9sTmFtZT1cImZlYXR1cmVfa2V5XCIgLz5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuUHJvZHVjdEtleScgfCB0cmFuc2xvY29cIiBjbGFzcz1cImNvbC1tZC02IHAtMFwiXG4gICAgICAgICAgICAgICAgICBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiIFt0b29sdGlwVGV4dF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5QZXJtaXNzaW9uS2V5JyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgbmFtZT1cInByb2R1Y3Rfa2V5XCJcbiAgICAgICAgICAgICAgICAgIFtlcnJvck1zZ109XCInQWRtaW4uUHJvZHVjdHMuVmFsaWRhdGlvbi5Qcm9kdWN0S2V5JyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0X2tleVwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsncHJvZHVjdF9rZXknXS5lcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuQ2F0ZWdvcnknIHwgdHJhbnNsb2NvXCIgY2xhc3M9XCJjb2wtbWQtNiBwLTBcIlxuICAgICAgICAgICAgICAgICAgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuUGVybWlzc2lvbktleScgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIG5hbWU9XCJjYXRlZ29yeVwiIFtlcnJvck1zZ109XCInQWRtaW4uUHJvZHVjdHMuVmFsaWRhdGlvbi5DYXRlZ29yeScgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImNhdGVnb3JpZXNcIiBjbGFzcz1cImRyb3Bkb3duLWJnLXRyYW5zcGFyZW50XCIgZm9ybUNvbnRyb2xOYW1lPVwiY2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2NhdGVnb3J5J10uZXJyb3JzIH1cIj5cbiAgICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5CaWxsaW5nRnJlcXVlbmN5JyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLkJpbGxpbmdGcmVxdWVuY3knIHwgdHJhbnNsb2NvXCIgY2xhc3M9XCJjb2wtbWQtNiBwLTBcIiBuYW1lPVwiYmlsbGluZ19mcmVxdWVuY3lcIj5cbiAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImZyZXF1ZW5jeVwiIGNsYXNzPVwiZHJvcGRvd24tYmctdHJhbnNwYXJlbnRcIiBmb3JtQ29udHJvbE5hbWU9XCJiaWxsaW5nX2ZyZXF1ZW5jeVwiXG4gICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydiaWxsaW5nX2ZyZXF1ZW5jeSddLmVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5Eb2N1bWVudGF0aW9uVXJsJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLkRvY3VtZW50YXRpb25VcmwnIHwgdHJhbnNsb2NvXCIgY2xhc3M9XCJjb2wtbWQtNiBwLTBcIiBuYW1lPVwiZG9jdW1lbnRhdGlvbl91cmxcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiZG9jdW1lbnRhdGlvbl91cmxcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2RvY3VtZW50YXRpb25fdXJsJ10uZXJyb3JzXG4gICAgICAgICAgICAgICAgfVwiIC8+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC00XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuUHJvZHVjdFByaXZhY3lTZXJ2aWNlJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLlByb2R1Y3RQcml2YWN5U2VydmljZScgfCB0cmFuc2xvY29cIiBuYW1lPVwicHJvZHVjdF9wcml2YWN5X3NlcnZpY2VfaWRcIj5cbiAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImFsbFRvc1wiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RfcHJpdmFjeV9zZXJ2aWNlX2lkXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgUHJpdmFjeSBTZXJ2aWNlJ1wiXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwiaWRcIlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cInRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICA8L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC00XCIgKnJiYWNBbGxvdz1cIidTdXBlckFkbWluJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLk1hc3RlclByb2R1Y3QnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuTWFzdGVyUHJvZHVjdCcgfCB0cmFuc2xvY29cIiBuYW1lPVwibWFzdGVyX3Byb2R1Y3RfaWRcIj5cbiAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInByb2R1Y3RzTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1hc3Rlcl9wcm9kdWN0X2lkXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgTWFzdGVyIFByb2R1Y3QnXCJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIGNvbC14cy0xMiBjb2wtc20tNiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJpbmZvLWNpcmNsZVwiIGZvcj1cIlJvbGVzXCI+e3sgJ0FkbWluLlByb2R1Y3RzLkFzc2lnbmVkUm9sZXMnIHwgdHJhbnNsb2NvIH19IDxzcGFuXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRvb2x0aXB0ZXh0IGdyYWRpZW50LWN1c3RvbS1icmFuZGluZ1wiPnt7ICdBZG1pbi5TdWJzY3JpcHRpb25zLlRvb2x0aXAuQXNzaWduZWRSb2xlcycgfFxuICAgICAgICAgICAgICAgICAgdHJhbnNsb2NvIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBbb3B0aW9uc109XCJhbGxSb2xlc1wiIGZvcm1Db250cm9sTmFtZT1cInJvbGVzXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC00XCIgKm5nSWY9XCJzdXBwb3J0ZWRDdXJyZW5jeSQgfCBhc3luYyBhcyBjdXJyZW5jeVwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCIgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLkN1cnJlbmN5JyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5DdXJyZW5jeScgfCB0cmFuc2xvY29cIiBuYW1lPVwiY3VycmVuY3lcIlxuICAgICAgICAgICAgICAgIFtlcnJvck1zZ109XCInQWRtaW4uUHJvZHVjdHMuVmFsaWRhdGlvbi5DdXJyZW5jeScgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiY3VycmVuY3lbJ3JlZ2lvbnMnXVwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjdXJyZW5jeVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2N1cnJlbmN5J10uZXJyb3JzIH1cIlxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgQ3VycmVuY3knXCJcbiAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICA8L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC00XCIgKm5nSWY9XCJzdXBwb3J0ZWRSZWdpb25zJCB8IGFzeW5jIGFzIHJlZ2lvblwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCIgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLlJlZ2lvbicgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgIFtpc0xlZnRUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuUmVnaW9uJyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJyZWdpb25cIlxuICAgICAgICAgICAgICAgIFtlcnJvck1zZ109XCInQWRtaW4uUHJvZHVjdHMuVmFsaWRhdGlvbi5SZWdpb24nIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInJlZ2lvblsncmVnaW9ucyddXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlZ2lvblwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ3JlZ2lvbiddLmVycm9ycyB9XCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IFJlZ2lvbidcIlxuICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLkdpdExhYlNlcnZpY2VEZXNrRW1haWwnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLkdpdExhYlNlcnZpY2VEZXNrRW1haWwnIHwgdHJhbnNsb2NvXCIgbmFtZT1cImdpdGxhYl9zZXJ2aWNlX2Rlc2tfZW1haWxcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImdpdGxhYl9zZXJ2aWNlX2Rlc2tfZW1haWxcIiAvPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNFwiICpyYmFjQWxsb3c9XCInUGFnZXMuQWxwaGEnXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImluZm8tY2lyY2xlXCIgZm9yPVwiXCI+IHt7ICdBZG1pbi5Qcm9kdWN0cy5QYXJ0bmVyUHJvZHVjdHMnIHwgdHJhbnNsb2NvIH19PHNwYW5cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9vbHRpcHRleHQgZ3JhZGllbnQtY3VzdG9tLWJyYW5kaW5nXCI+e3sgJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuUGFydG5lclByb2R1Y3RzJyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IFtvcHRpb25zXT1cInByb2R1Y3RzTGlzdFwiIChvbkNoYW5nZSk9XCJvblNlYXJjaFBhcnRuZXJQcm9kdWN0cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIiBbc2hvd1RvZ2dsZUFsbF09XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFBhcnRuZXJQcm9kdWN0c1wiXG4gICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiIG1heFNlbGVjdGVkTGFiZWxzPVwiMVwiIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS1zdGFydCB0b2dnbGVzIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiByb3cgbXQtNFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuSXNBY3RpdmUnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5Jc0FjdGl2ZScgfCB0cmFuc2xvY29cIiBuYW1lPVwiYWN0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1aS1zd2l0Y2ggY2xhc3M9XCJkLWJsb2NrXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWN0aXZlXCIgbmFtZT1cImFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydhY3RpdmUnXS5lcnJvcnMgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L3VpLXN3aXRjaD5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiICpyYmFjQWxsb3c9XCInU3VwZXJBZG1pbidcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5NdWx0aXBsZUFsbG93ZWQnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5NdWx0aXBsZUFsbG93ZWQnIHwgdHJhbnNsb2NvXCIgY2xhc3M9XCJub3dyYXBcIiBuYW1lPVwibXVsdGlwbGVfYWxsb3dlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8dWktc3dpdGNoIGNsYXNzPVwiZC1ibG9ja1wiIGZvcm1Db250cm9sTmFtZT1cIm11bHRpcGxlX2FsbG93ZWRcIiBuYW1lPVwibXVsdGlwbGVfYWxsb3dlZFwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ211bHRpcGxlX2FsbG93ZWQnXS5lcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L3VpLXN3aXRjaD5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLklzVmlzaWJsZScgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLklzVmlzaWJsZScgfCB0cmFuc2xvY29cIiBuYW1lPVwidmlzaWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dWktc3dpdGNoIGNsYXNzPVwiZC1ibG9ja1wiIGZvcm1Db250cm9sTmFtZT1cInZpc2libGVcIiBuYW1lPVwidmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWyd2aXNpYmxlJ10uZXJyb3JzIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPC91aS1zd2l0Y2g+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5NZW1iZXJzVmlzaWJsZScgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLk1lbWJlcnNWaXNpYmxlJyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJtZW1iZXJzX3Zpc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVpLXN3aXRjaCBjbGFzcz1cImQtYmxvY2tcIiBmb3JtQ29udHJvbE5hbWU9XCJtZW1iZXJzX3Zpc2libGVcIiBuYW1lPVwibWVtYmVyc192aXNpYmxlXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnbWVtYmVyc192aXNpYmxlJ10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPC91aS1zd2l0Y2g+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5DaGF0VmlzaWJsZScgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLkNoYXRWaXNpYmxlJyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJjaGF0X3Zpc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVpLXN3aXRjaCBjbGFzcz1cImQtYmxvY2tcIiBmb3JtQ29udHJvbE5hbWU9XCJjaGF0X3Zpc2libGVcIiBuYW1lPVwiY2hhdF92aXNpYmxlXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnY2hhdF92aXNpYmxlJ10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPC91aS1zd2l0Y2g+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIiAqcmJhY0FsbG93PVwiJ1N1cGVyQWRtaW4nXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuSXNNYXN0ZXJQcm9kdWN0JyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuSXNNYXN0ZXJQcm9kdWN0JyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJpc19tYXN0ZXJfcHJvZHVjdFwiPlxuICAgICAgICAgICAgICAgICAgICA8dWktc3dpdGNoIGNsYXNzPVwiZC1ibG9ja1wiIGZvcm1Db250cm9sTmFtZT1cImlzX21hc3Rlcl9wcm9kdWN0XCIgbmFtZT1cImlzX21hc3Rlcl9wcm9kdWN0XCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnaXNfbWFzdGVyX3Byb2R1Y3QnXS5lcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L3VpLXN3aXRjaD5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBlbmQgdG9nZ2xlcyAtLT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHRleHQtZW5kIG10LTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGVmYXVsdCBtZS0yXCIgKGNsaWNrKT1cImJhY2soKVwiPiB7eyAnQnV0dG9uLkNhbmNlbCcgfFxuICAgICAgICAgICAgICAgIHRyYW5zbG9jbyB9fSA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgW2J1dHRvbkJ1c3ldPVwic3VibWl0dGVkXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAqcmJhY0FsbG93PVwiJ1BhZ2VzLkFkbWluLlByb2R1Y3QuRWRpdCdcIj4ge3sgJ0J1dHRvbi5TdWJtaXQnXG4gICAgICAgICAgICAgICAgfCB0cmFuc2xvY28gfX0gPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48bmctdGVtcGxhdGUgI2NvbnRlbnQgbGV0LW1vZGFsPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPGgzIGNsYXNzPVwibW9kYWwtdGl0bGUgbWItMCBwLTBcIj57eyAnVXNlci5TdWJzY3JpcHRpb25zLkZ1bGxMb2dvJyB8IHRyYW5zbG9jbyB9fTwvaDM+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgZmxvYXQtZW5kXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8c21hbGw+IHt7ICdVc2VyLlByb2ZpbGUuUGljdHVyZU1lc3NhZ2UnIHwgdHJhbnNsb2NvIH19PC9zbWFsbD5cbiAgICA8cHctaW1hZ2UtY3JvcHBlciAjcHJvZmlsZSAoaW1hZ2VTZWxlY3Rpb25FdmVudCk9XCJvbkltYWdlU2VsZWN0aW9uKCRldmVudClcIiBhc3BlY3RSYXRpbz1cImZ1bGxMb2dvXCJcbiAgICAgIChjbG9zZUV2ZW50KT1cIm9uQ2xvc2UoKVwiPlxuICAgIDwvcHctaW1hZ2UtY3JvcHBlcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNzcXVhcmVkTG9nb0NvbnRlbnQgbGV0LW1vZGFsPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPGgzIGNsYXNzPVwibW9kYWwtdGl0bGUgbWItMCBwLTBcIj57eyAnVXNlci5TdWJzY3JpcHRpb25zLlNxdWFyZWRMb2dvJyB8IHRyYW5zbG9jbyB9fTwvaDM+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgZmxvYXQtZW5kXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8c21hbGw+IHt7ICdVc2VyLlByb2ZpbGUuUGljdHVyZU1lc3NhZ2UnIHwgdHJhbnNsb2NvIH19PC9zbWFsbD5cbiAgICA8cHctaW1hZ2UtY3JvcHBlciAjcHJvZmlsZSAoaW1hZ2VTZWxlY3Rpb25FdmVudCk9XCJ1cGxvYWRTcXVhcmVkTG9nbygkZXZlbnQpXCIgYXNwZWN0UmF0aW89XCJhdXRvXCJcbiAgICAgIChjbG9zZUV2ZW50KT1cIm9uQ2xvc2UoKVwiPlxuICAgIDwvcHctaW1hZ2UtY3JvcHBlcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
370
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYWRtaW4tbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcm9kdWN0cy9wcm9kdWN0LWRldGFpbHMvcHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYWRtaW4tbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcm9kdWN0cy9wcm9kdWN0LWRldGFpbHMvcHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxRQUFRLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBR3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTlFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYXRELE1BQU0sT0FBTyx1QkFDVCxTQUFRLGdCQUFnQjtJQXNEeEIsWUFDSSxRQUFrQixFQUNELGNBQThCLEVBQzlCLFlBQXNCLEVBQ3RCLFlBQTBCO1FBRTNDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUpDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQUN0QixpQkFBWSxHQUFaLFlBQVksQ0FBYztR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QjtrQkFMbkMsU0FBUzsrQkFDSSxvQkFBb0I7NEpBeU05QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEFkbWluU2VydmljZSwgQXBwQWRtaW4gfSBmcm9tICdAcG9zaXdpc2UvYWRtaW4tbW9kdWxlLXV0aWxzJztcbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2UvYXBwLWJhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlLCBQcm9kdWN0U2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tc2VydmljZXMnO1xuaW1wb3J0IHsgUHJvZHVjdCB9IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tdXRpbGl0aWVzJztcbmltcG9ydCB7IEhlbHBlclNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2UvaGVscGVyLXNlcnZpY2UnO1xuaW1wb3J0IHsgUXVpbGxIZWxwZXIsIFZhbGlkYXRlRm9ybSB9IGZyb20gJ0Bwb3Npd2lzZS91dGlscyc7XG5cbmltcG9ydCB7IFNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuXG5pbXBvcnQge1xuICAgIFN1YnNjcmlwdGlvblJvbGUsXG4gICAgU3Vic2NyaXB0aW9uc1JvbGVzRGF0YVxufSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvaW50ZXJmYWNlL2FkbWluLW1vZHVsZS1zaGFyZWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFByaXZhY3lUb3MgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvaW50ZXJmYWNlL3ByaXZhY3ktdG9zLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncHctcHJvZHVjdC1kZXRhaWxzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1kZXRhaWxzLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9wcm9kdWN0LWRldGFpbHMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0RGV0YWlsc0NvbXBvbmVudFxuICAgIGV4dGVuZHMgQXBwQmFzZUNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXRcbntcbiAgICBzdXBwb3J0ZWRDdXJyZW5jeSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICBzdXBwb3J0ZWRSZWdpb25zJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIHM7XG4gICAgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcblxuICAgIHN1Ym1pdHRlZCA9IGZhbHNlO1xuXG4gICAgaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgIGRhdGE6IFByb2R1Y3Q7XG5cbiAgICBwcm9kdWN0c0xpc3Q6IFNlbGVjdEl0ZW1bXTtcbiAgICBjYXRlZ29yaWVzID0gW107XG4gICAgYWxsVG9zOiBQcml2YWN5VG9zW107XG4gICAgYWxsUm9sZXM6IFNlbGVjdEl0ZW1bXTtcbiAgICBwcm9kdWN0Um9sZXM6IFN1YnNjcmlwdGlvblJvbGVbXTtcbiAgICBzZWxlY3RlZFByb2R1Y3RzOiBTZWxlY3RJdGVtW10gPSBbXTtcbiAgICBzZWxlY3RlZFNjb3BlczogU2VsZWN0SXRlbVtdID0gW107XG4gICAgc2VsZWN0ZWRQYXJ0bmVyUHJvZHVjdHM6IFNlbGVjdEl0ZW1bXSA9IFtdO1xuICAgIHVuc3Vic2NyaWJlQmVoYXZpb3JzOiBTZWxlY3RJdGVtW10gPSBbXTtcbiAgICBwcm9yYXRpb25CZWhhdmlvcnM6IFNlbGVjdEl0ZW1bXSA9IFtdO1xuXG4gICAgZnJlcXVlbmN5ID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1NlbGVjdCcsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ01vbnRobHknLFxuICAgICAgICAgICAgdmFsdWU6ICdtb250aCdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdZZWFybHknLFxuICAgICAgICAgICAgdmFsdWU6ICd5ZWFyJ1xuICAgICAgICB9XG4gICAgXTtcblxuICAgIHN1YnNjcmlwdGlvbnNSb2xlc0RhdGE6IFN1YnNjcmlwdGlvbnNSb2xlc0RhdGE7XG5cbiAgICBzbHVnOiBzdHJpbmc7XG5cbiAgICBmdWxsTG9nbyA9ICcnO1xuICAgIHNxdWFyZWRMb2dvID0gJyc7XG5cbiAgICBzdWJzY3JpcHRpb25JZDogbnVtYmVyO1xuICAgIG1hc3RlclByb2R1Y3RJZDogbnVtYmVyO1xuICAgIGlkOiBudW1iZXI7XG4gICAgZHVwbGljYXRlSWQ6IG51bWJlcjtcblxuICAgIGVkaXRvckNvbmZpZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjdFNlcnZpY2U6IFByb2R1Y3RTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWRtaW5TZXJ2aWNlOiBBZG1pblNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xuICAgICAgICBRdWlsbEhlbHBlci5pbml0KCk7XG4gICAgICAgIHRoaXMuZWRpdG9yQ29uZmlnID0gUXVpbGxIZWxwZXIuZ2V0RWRpdG9yQ29uZmlnKCk7XG4gICAgICAgIHRoaXMuZm9ybSA9IEFwcEFkbWluLmdldFByb2R1Y3RzRm9ybSgpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgSGVscGVyU2VydmljZS5zdWJzY3JpYmVUb0VkaXRvckNoYW5nZXModGhpcy5mb3JtLCAnZGVzY3JpcHRpb24nKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zdXBwb3J0ZWRDdXJyZW5jeSQgPSB0aGlzLnByb2R1Y3RTZXJ2aWNlLmdldFN1cHBvcnRlZEN1cnJlbmN5KCk7XG4gICAgICAgIHRoaXMuc3VwcG9ydGVkUmVnaW9ucyQgPSB0aGlzLnByb2R1Y3RTZXJ2aWNlLmdldFN1cHBvcnRlZFJlZ2lvbnMoKTtcbiAgICAgICAgdGhpcy5tYXN0ZXJQcm9kdWN0SWQgPSB0aGlzLmFwcENvbmZpZy5tYXN0ZXJfc3Vic2NyaXB0aW9uLnByb2R1Y3RfaWQ7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSBQZXJtaXNzaW9uU2VydmljZS5zZWxlY3RlZFN1YnNjcmlwdGlvbj8uaWQ7XG4gICAgICAgIHRoaXMuZHVwbGljYXRlSWQgPSBOdW1iZXIodGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1snZHVwbGljYXRlX3Byb2R1Y3RfaWQnXSk7XG4gICAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5pZCA9ICtwYXJhbXNbJ2lkJ10gfHwgMDtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2F0ZWdvcmllcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb2R1Y3REZXRhaWxzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTdWJzY3JpcHRpb25Sb2xlKHRoaXMuaWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuZHVwbGljYXRlSWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RHVwbGljYXRlUHJvZHVjdERldGFpbHMoKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0U3Vic2NyaXB0aW9uUm9sZSh0aGlzLmR1cGxpY2F0ZUlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJTdG9yZSgpLnN1YnNjcmliZSh1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbHVnID0gdXNlci5zbHVnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXRQcm9kdWN0cygpO1xuICAgICAgICB0aGlzLmdldEFsbFRvcygxLCB0aGlzLlBBR0VfU0laRSk7XG4gICAgICAgIHRoaXMuZ2V0Um9sZXMoKTtcbiAgICAgICAgdGhpcy5nZXRVbnN1YnNjcmliZUJlaGF2aW9ycygpO1xuICAgICAgICB0aGlzLmdldFByb3JhdGlvbkJlaGF2aW9ycygpO1xuICAgIH1cblxuICAgIGdldCBmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmNvbnRyb2xzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvZHVjdHMoKSB7XG4gICAgICAgIHRoaXMucHJvZHVjdFNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRQcm9kdWN0cyh7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uX2lkOiB0aGlzLnN1YnNjcmlwdGlvbklkLFxuICAgICAgICAgICAgICAgIG1hc3Rlcl9wcm9kdWN0X2lkOiB0aGlzLm1hc3RlclByb2R1Y3RJZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3A/LnByb2R1Y3RzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0c0xpc3QgPSByZXNwLnByb2R1Y3RzLm1hcChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGVsZW1lbnQubmFtZSA/PyAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25TZWFyY2hDcml0ZXJpYShldmVudCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUHJvZHVjdHMgPSBldmVudC52YWx1ZS5tYXAoeCA9PiB4KTtcbiAgICB9XG5cbiAgICBoYW5kbGVJbWFnZUVycm9yKGV2ZW50OiBFdmVudCwgZmFsbGJhY2tQYXRoKTogdm9pZCB7XG4gICAgICAgIEhlbHBlclNlcnZpY2UuaGFuZGxlSW1hZ2VGYWxsYmFja1BhdGgoZXZlbnQsIGZhbGxiYWNrUGF0aCk7XG4gICAgfVxuXG4gICAgb25TZWFyY2hQYXJ0bmVyUHJvZHVjdHMoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBhcnRuZXJQcm9kdWN0cyA9IGV2ZW50LnZhbHVlLm1hcCh4ID0+IHgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RHVwbGljYXRlUHJvZHVjdERldGFpbHMoKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcm9kdWN0U2VydmljZVxuICAgICAgICAgICAgLmdldFByb2R1Y3RCeUlkKHRoaXMuZHVwbGljYXRlSWQpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2NvcGVzID0gcmVzcG9uc2UuZGVwZW5kZW5jeV9wcm9kdWN0cztcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGFbJ2lkJ107XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoZGF0YSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvZHVjdERldGFpbHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmlkKSB7XG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlLmdldFByb2R1Y3RCeUlkKHRoaXMuaWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNjb3BlcyA9IHJlc3BvbnNlLmRlcGVuZGVuY3lfcHJvZHVjdHM7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodGhpcy5kYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGFydG5lclByb2R1Y3RzID0gcmVzcG9uc2UucGFydG5lcl9wcm9kdWN0X2lkcztcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZnVsbF9sb2dvKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnVsbExvZ28gPSByZXNwb25zZS5mdWxsX2xvZ28udXJsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3F1YXJlZF9sb2dvKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3F1YXJlZExvZ28gPSByZXNwb25zZS5zcXVhcmVkX2xvZ28udXJsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDYXRlZ29yaWVzKCkge1xuICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlLmdldFByb2R1Y3RDYXRlZ29yaWVzKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uY2F0ZWdvcmllcykge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNhdGVnb3JpZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlbGVtZW50ID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yaWVzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhdGVnb3JpZXMudW5zaGlmdCh7XG4gICAgICAgICAgICBsYWJlbDogJ1NlbGVjdCcsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdG8gY2FsbCBhbGwgdG9zICovXG4gICAgcHJpdmF0ZSBnZXRBbGxUb3MocGFnZTogbnVtYmVyLCBwYWdlX3NpemU6IG51bWJlcikge1xuICAgICAgICB0aGlzLmFkbWluU2VydmljZVxuICAgICAgICAgICAgLmdldEFsbFRvcyh7IHBhZ2UsIHBhZ2Vfc2l6ZSB9LCB0aGlzLnN1YnNjcmlwdGlvbklkKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxUb3MgPSByZXNwb25zZS5wcm9kdWN0X3ByaXZhY3lfc2VydmljZXM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBAVmFsaWRhdGVGb3JtKCdmb3JtJylcbiAgICBvblNhdmUoKSB7XG4gICAgICAgIGNvbnN0IGVkaXRvcnMgPSBbXG4gICAgICAgICAgICB7IGNvbnRyb2xOYW1lOiAnZGVzY3JpcHRpb24nLCBzZWxlY3RvcjogJyNkZXNjcmlwdGlvbkVkaXRvcicgfSxcbiAgICAgICAgICAgIHsgY29udHJvbE5hbWU6ICdzaWdudXBfaW5zdHJ1Y3Rpb25zJywgc2VsZWN0b3I6ICcjc2lnbnVwSW5zdHJ1Y3Rpb25zRWRpdG9yJyB9LFxuICAgICAgICAgICAgeyBjb250cm9sTmFtZTogJ3NpZ251cF9pbnN0cnVjdGlvbl9lbXBsb3llZXMnLCBzZWxlY3RvcjogJyNzaWdudXBFbXBsb3llZXNFZGl0b3InIH1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBlZGl0b3IsIGdldCB0aGUgcmF3IEhUTUwsIGFuZCBzZXQgaXQgaW4gdGhlIGZvcm0gY29udHJvbFxuICAgICAgICBlZGl0b3JzLmZvckVhY2goZWRpdG9yID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJhd0h0bWwgPSBIZWxwZXJTZXJ2aWNlLlNhdmVSYXdIVE1MKGVkaXRvci5zZWxlY3Rvcik7XG4gICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbZWRpdG9yLmNvbnRyb2xOYW1lXS5zZXRWYWx1ZShyYXdIdG1sKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuaWQpIHtcbiAgICAgICAgICAgIHRoaXMub25VcGRhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25BZGQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQWRkKCkge1xuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgLi4udGhpcy5mb3JtLnZhbHVlLFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uX2lkOiB0aGlzLnN1YnNjcmlwdGlvbklkLFxuICAgICAgICAgICAgcGFydG5lcl9wcm9kdWN0X2lkczogdGhpcy5zZWxlY3RlZFBhcnRuZXJQcm9kdWN0c1xuICAgICAgICB9O1xuICAgICAgICBkZWxldGUgZGF0YS5yb2xlcztcbiAgICAgICAgdGhpcy5wcm9kdWN0U2VydmljZVxuICAgICAgICAgICAgLmFkZFByb2R1Y3QoZGF0YSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybS52YWx1ZS5yb2xlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1JvbGVzRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9yb2xlczogdGhpcy5mb3JtLmdldCgncm9sZXMnKS52YWx1ZT8ubWFwKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyByb2xlX2lkOiByZXMgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RfaWQ6IHJlc3BvbnNlLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkbWluU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2F2ZVByb2R1Y3RSb2xlcyh0aGlzLnN1YnNjcmlwdGlvbnNSb2xlc0RhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblVwZGF0ZSgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuZm9ybS52YWx1ZSxcbiAgICAgICAgICAgIGRlcGVuZGVuY3lfcHJvZHVjdHM6IHRoaXMuc2VsZWN0ZWRQcm9kdWN0cyxcbiAgICAgICAgICAgIHBhcnRuZXJfcHJvZHVjdF9pZHM6IHRoaXMuc2VsZWN0ZWRQYXJ0bmVyUHJvZHVjdHMsXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25faWQ6IHRoaXMuc3Vic2NyaXB0aW9uSWRcbiAgICAgICAgfTtcbiAgICAgICAgZGVsZXRlIGRhdGEucm9sZXM7XG5cbiAgICAgICAgdGhpcy5wcm9kdWN0U2VydmljZS51cGRhdGVQcm9kdWN0KGRhdGEsIHRoaXMuaWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zUm9sZXNEYXRhID0ge1xuICAgICAgICAgICAgcHJvZHVjdF9yb2xlczogdGhpcy5mb3JtLmdldCgncm9sZXMnKS52YWx1ZT8ubWFwKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm9sZV9pZDogcmVzIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2R1Y3RfaWQ6IHRoaXMuaWRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZG1pblNlcnZpY2VcbiAgICAgICAgICAgIC5zYXZlUHJvZHVjdFJvbGVzKHRoaXMuc3Vic2NyaXB0aW9uc1JvbGVzRGF0YSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2Vzcyh0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnQWRtaW4uVXNlcnMuVXBkYXRlZFJvbGUnKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Um9sZXMoKSB7XG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlLmdldFJvbGVzKHt9LCB0aGlzLnN1YnNjcmlwdGlvbklkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGxSb2xlcyA9IHJlc3BvbnNlLnJvbGVzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogaXRlbS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5pZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdWJzY3JpcHRpb25Sb2xlKGlkOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5hZG1pblNlcnZpY2UuZ2V0UHJvZHVjdHNSb2xlcyhpZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdFJvbGVzID0gcmVzcG9uc2U/Lm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpdGVtLmlkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICByb2xlczogdGhpcy5wcm9kdWN0Um9sZXMubWFwKHggPT4geC5pZClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFVuc3Vic2NyaWJlQmVoYXZpb3JzKCkge1xuICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlLmdldEF2YWlsYWJsZVN0cmlwZVVuc3Vic2NyaWJlQmVoYXZpb3JzKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJlaGF2aW9ycyA9IHJlc3BvbnNlPy5hdmFpbGFibGVfc3RyaXBlX3Vuc3Vic2NyaWJlX2JlaGF2aW9ycyB8fCBbXTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJlaGF2aW9ycykgJiYgYmVoYXZpb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlQmVoYXZpb3JzID0gYmVoYXZpb3JzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcm9yYXRpb25CZWhhdmlvcnMoKSB7XG4gICAgICAgIHRoaXMucHJvZHVjdFNlcnZpY2UuZ2V0QXZhaWxhYmxlU3RyaXBlUHJvcmF0aW9uQmVoYXZpb3JzKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJlaGF2aW9ycyA9IHJlc3BvbnNlPy5hdmFpbGFibGVfc3RyaXBlX3Byb3JhdGlvbl9iZWhhdmlvcnMgfHwgW107XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShiZWhhdmlvcnMpICYmIGJlaGF2aW9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9yYXRpb25CZWhhdmlvcnMgPSBiZWhhdmlvcnMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvcGVuTW9kYWwoY29udGVudCkge1xuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKGNvbnRlbnQsIHsgY2VudGVyZWQ6IHRydWUsIHdpbmRvd0NsYXNzOiAnbW9kYWwtaG9sZGVyJyB9KTtcbiAgICB9XG5cbiAgICBvbkltYWdlU2VsZWN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSB0aGlzLmRhdGFVUkx0b0Jsb2IoZXZlbnQpO1xuICAgICAgICBjb25zdCBzbHVnID0gdGhpcy5zbHVnLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUucGFyc2UobmV3IERhdGUoKS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBgJHtzbHVnfV8ke3RpbWVzdGFtcH0ucG5nYDtcbiAgICAgICAgY29uc3QgZmlsZTogRmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZW5hbWUpO1xuICAgICAgICBjb25zdCBmaWxlRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmaWxlRGF0YS5hcHBlbmQoJ2Z1bGxfbG9nbycsIGZpbGUpO1xuICAgICAgICBmaWxlRGF0YS5hcHBlbmQoJ3N1YnNjcmlwdGlvbl9pZCcsIGAke3RoaXMuc3Vic2NyaXB0aW9uSWR9YCk7XG4gICAgICAgIHRoaXMucHJvZHVjdFNlcnZpY2UudXBkYXRlUHJvZHVjdChmaWxlRGF0YSwgdGhpcy5pZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XG4gICAgICAgICAgICB0aGlzLmZ1bGxMb2dvID0gcmVzPy5mdWxsX2xvZ28/LnVybDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXBsb2FkU3F1YXJlZExvZ28oZXZlbnQpIHtcbiAgICAgICAgY29uc3QgYmxvYiA9IHRoaXMuZGF0YVVSTHRvQmxvYihldmVudCk7XG4gICAgICAgIGNvbnN0IGZpbGVTbHVnID0gdGhpcy5zbHVnLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGZpbGVUaW1lc3RhbXAgPSBEYXRlLnBhcnNlKG5ldyBEYXRlKCkudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7ZmlsZVNsdWd9XyR7ZmlsZVRpbWVzdGFtcH0ucG5nYDtcbiAgICAgICAgY29uc3QgZmlsZTogRmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZW5hbWUpO1xuICAgICAgICBjb25zdCBmaWxlRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmaWxlRGF0YS5hcHBlbmQoJ3NxdWFyZWRfbG9nbycsIGZpbGUpO1xuICAgICAgICBmaWxlRGF0YS5hcHBlbmQoJ3N1YnNjcmlwdGlvbl9pZCcsIGAke3RoaXMuc3Vic2NyaXB0aW9uSWR9YCk7XG4gICAgICAgIHRoaXMucHJvZHVjdFNlcnZpY2UudXBkYXRlUHJvZHVjdChmaWxlRGF0YSwgdGhpcy5pZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XG4gICAgICAgICAgICB0aGlzLnNxdWFyZWRMb2dvID0gcmVzPy5zcXVhcmVkX2xvZ28/LnVybDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25DbG9zZSgpIHtcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xuICAgIH1cblxuICAgIGRhdGFVUkx0b0Jsb2IoZGF0YVVybDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IGRhdGFVcmwuc3BsaXQoJywnKTtcbiAgICAgICAgY29uc3QgbWltZSA9IC9eW0EtWl0qW2Etel0qOiguKj8pO1tBLVpdKi8uZXhlYyhhcnJbMF0pPy5bMV07XG4gICAgICAgIGNvbnN0IGJTdHIgPSBhdG9iKGFyclsxXSk7XG4gICAgICAgIGxldCBuID0gYlN0ci5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHU4YXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICAgIHdoaWxlIChuLS0pIHtcbiAgICAgICAgICAgIHU4YXJyW25dID0gYlN0ci5jaGFyQ29kZUF0KG4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFt1OGFycl0sIHsgdHlwZTogbWltZSB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkIHB3LXRhYiBwcm9kdWN0LWZvcm0gb3ZlcmZsb3ctaGlkZGVuXCI+XG4gIDxkaXYgY2xhc3M9XCJkYXNoYm9hcmRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLWJvZHlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtZS1hdXRvIGNvbC14cy02IG10LTRcIj5cbiAgICAgICAgPGEgYXJpYS1sYWJlbD1cIk5hdmlnYXRlIHRvIFRhcmdldFwiIChjbGljayk9XCJiYWNrKClcIiBjbGFzcz1cInByZXZpb3VzXCI+PGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1hbHQtY2lyY2xlLWxlZnRcIlxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2E+XG4gICAgICAgIDxoMyBjbGFzcz1cIlwiPlByb2R1Y3Q6IHt7IGRhdGE/Lm5hbWUgPyBkYXRhPy5uYW1lIDogJ0FkZCBOZXcnIH19PC9oMz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiXG4gICAgICAqbmdJZj1cImlzTG9hZGluZ1wiPlxuICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm15LTRcIiAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTVcIj5cbiAgICAgICAgICA8cC1hY2NvcmRpb24+XG4gICAgICAgICAgICA8cC1hY2NvcmRpb25UYWIgW2hlYWRlcl09XCInSG93IFRvJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgPGg0PlByb2R1Y3QgLyBGZWF0dXJlIGxvZ2ljPC9oND5cbiAgICAgICAgICAgICAgICAgIDxwPiBMb2dpYyBmb3IgYmFjay1lbmQvZnJvbnQtZW5kIHBlcm1pc3Npb25zIGJpbmRpbmc6XG4gICAgICAgICAgICAgICAgICAgIDxiciAvPiAqIHByb2R1Y3QuY2F0ZWdvcnkgKHRoZXNlIGFyZSBmZWF0dXJlcykgPSZndDsgdHlwZSBvZiBwcm9kdWN0LCBpLmUuLCBzZWF0X3ByaWNpbmcgb3IgaXRlbV9wcmljaW5nXG4gICAgICAgICAgICAgICAgICAgIDxiciAvPiAqIHByb2R1Y3QuZmVhdHVyZV9rZXkgPSZndDsgdGhpcyBkZXNjcmliZXMgdGhlIG1haW4gZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgICA8YnIgLz4gKiBwcm9kdWN0LnBlcm1pc3Npb25fa2V5ID0mZ3Q7IHVzZXJzIGNhbiBiZSBzdWJzY3JpYmVkIHRvIG9ubHkgb25lIHByb2R1Y3Qgb2Ygc2FtZSBwZXJtaXNzaW9uX2tleVxuICAgICAgICAgICAgICAgICAgICA8YnIgLz4gKiBwcm9kdWN0LnByb2R1Y3Rfa2V5ID0mZ3Q7IHRoaXMgaXMgdW5pcXVlIHRvIGVhY2ggcHJvZHVjdCwgaXQgZGVmaW5lcyB0aGUgcGVybWlzc2lvbiBmb3IgZnJvbnRlbmQgYmluZGluZ1xuICAgICAgICAgICAgICAgICAgICA8YnIgLz4gKiBFeGFtcGxlIG9mIHBlcm1pc3Npb24gPSZndDsge3sgJ1BhZ2VzLlByb2R1Y3Que3Blcm1pc3Npb25fa2V5fS57cHJvZHVjdF9rZXl9JyB9fVxuICAgICAgICAgICAgICAgICAgICA8YnIgLz4gKiBJZiBpdCdzIGEgZmVhdHVyZSBhc3NvY2lhdGVkIHRvIGFuIGV4aXN0aW5nIHByb2plY3QsIHlvdSBjYW4gdG8gc2V0IHRoZSBcImRlcGVuZGVuY3kgcHJvZHVjdFwiIGFjY29yZGluZ2x5LiA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgPGg0PklmIGl0J3MgYSBGcmVlIFByb2R1Y3Q8L2g0PlxuICAgICAgICAgICAgICAgICAgPHA+IFN0cmlwZSBQbGFuIG5lZWRzIHRvIGJlIG5pbC4gPGJyIC8+IFwiUHJpY2VcIiBwZXIgVW5pdCBuZWVkcyB0byBiZSBzZXQgYXMgMC4gPGJyIC8+IFwiVHJpYWwgRGF5c1wiIG5lZWRzXG4gICAgICAgICAgICAgICAgICAgIHRvIGJlIHNvbWV0aGluZyBsaWtlIDk5OTk5LiA8YnIgLz4gVGhlIHByb2R1Y3Qgc2hvdWxkIGJlIHNldCBhcyBcInZpc2libGU9PT1mYWxzZVwiLiA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cbiAgICAgICAgICA8L3AtYWNjb3JkaW9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0lmPVwiaWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtdC01XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtYi0yXCI+IHt7ICdVc2VyLlN1YnNjcmlwdGlvbnMuRnVsbExvZ28nIHwgdHJhbnNsb2NvIH19IDxzcGFuIGNsYXNzPVwidG9vbHRpcC13cmFwIG1zLTFcIlxuICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ1VzZXIuU3Vic2NyaXB0aW9ucy5Ub29sdGlwLkZ1bGxMb2dvJ3x0cmFuc2xvY29cIiBbYXBwZW5kVG9dPVwiJ2JvZHknXCJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCIndG9wJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2g0PlxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJmdWxsTG9nb1wiIGFsdD1cIkRlbW8gTG9nb1wiIGNsYXNzPVwiaW1hZ2UgZnVsbC1sb2dvIHctMTAwIGgtMTAwXCJcbiAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJoYW5kbGVJbWFnZUVycm9yKCRldmVudCwgJ2Fzc2V0cy9pbWcvaWNvbnMvZGVtb19sb2dvMS5wbmcnKVwiIC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXkgbXQtMlwiIChjbGljayk9XCJvcGVuTW9kYWwoY29udGVudClcIiAoa2V5ZG93bi5lbnRlcik9XCJvcGVuTW9kYWwoY29udGVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5LXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgYXJpYS1sYWJlbD1cIk5hdmlnYXRlIHRvIFRhcmdldFwiPnt7ICdVc2VyLlByb2ZpbGUuQ2hhbmdlJyB8IHRyYW5zbG9jbyB9fTwvYT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG10LTVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1iLTJcIj4ge3sgJ1VzZXIuU3Vic2NyaXB0aW9ucy5TcXVhcmVkTG9nbycgfCB0cmFuc2xvY28gfX0gPHNwYW4gY2xhc3M9XCJ0b29sdGlwLXdyYXAgbXMtMVwiXG4gICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCInVXNlci5TdWJzY3JpcHRpb25zLlRvb2x0aXAuU3F1YXJlZExvZ28nfHRyYW5zbG9jb1wiIFthcHBlbmRUb109XCInYm9keSdcIlxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIid0b3AnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cInNxdWFyZWRMb2dvXCIgYWx0PVwiQ29tcGFueSBMb2dvXCIgd2lkdGg9XCI3MFwiIGNsYXNzPVwic3F1YXJlZF9sb2dvXCIgaGVpZ2h0PVwiNzBcIlxuICAgICAgICAgICAgICAgIChlcnJvcik9XCJoYW5kbGVJbWFnZUVycm9yKCRldmVudCwgJ2Fzc2V0cy9pbWcvaWNvbnMvY29tcGFueS5wbmcnKVwiIC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXkgbXQtMlwiIChrZXlkb3duLmVudGVyKT1cIm9wZW5Nb2RhbChzcXVhcmVkTG9nb0NvbnRlbnQpXCIgKGNsaWNrKT1cIm9wZW5Nb2RhbChzcXVhcmVkTG9nb0NvbnRlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGFyaWEtbGFiZWw9XCJOYXZpZ2F0ZSB0byBUYXJnZXRcIj57eyAnVXNlci5Qcm9maWxlLkNoYW5nZScgfCB0cmFuc2xvY28gfX08L2E+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJvblNhdmUoKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5OYW1lJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInTGFiZWwuTmFtZScgfCB0cmFuc2xvY29cIiBjbGFzcz1cImNvbC1tZC02IHAtMFwiIG5hbWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW2lzTGVmdFRvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtlcnJvck1zZ109XCInQWRtaW4uUHJvZHVjdHMuVmFsaWRhdGlvbi5OYW1lJyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnbmFtZSddLmVycm9ycyB9XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5OaWNrTmFtZScgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLk5pY2tOYW1lJyB8IHRyYW5zbG9jb1wiIGNsYXNzPVwiY29sLW1kLTYgcC0wXCIgbmFtZT1cIm5pY2tuYW1lXCIgW2Vycm9yTXNnXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWRtaW4uUHJvZHVjdHMuVmFsaWRhdGlvbi5OaWNrTmFtZScgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJuaWNrbmFtZVwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ25pY2tuYW1lJ10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBjb2wtMTIgY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5NaW5Vbml0JyB8IHRyYW5zbG9jb1wiIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLk1pblVuaXRzJyB8IHRyYW5zbG9jb1wiIGNsYXNzPVwiY29sLW1kLTYgcC0wXCIgbmFtZT1cIm1pbl91bml0c1wiXG4gICAgICAgICAgICAgICAgICAgIFtlcnJvck1zZ109XCInQWRtaW4uUHJvZHVjdHMuVmFsaWRhdGlvbi5NaW5Vbml0JyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cIm1pbl91bml0c1wiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ21pbl91bml0cyddLmVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIGNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLk1heFVuaXQnIHwgdHJhbnNsb2NvXCIgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuTWF4VW5pdHMnIHwgdHJhbnNsb2NvXCIgY2xhc3M9XCJjb2wtbWQtNiBwLTBcIiBuYW1lPVwibWF4X3VuaXRzXCJcbiAgICAgICAgICAgICAgICAgICAgW2Vycm9yTXNnXT1cIidBZG1pbi5Qcm9kdWN0cy5WYWxpZGF0aW9uLk1heFVuaXQnIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibWF4X3VuaXRzXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnbWF4X3VuaXRzJ10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImluZm8tY2lyY2xlXCIgZm9yPVwicHJvZHVjdExpc3RcIj4ge3sgJ0FkbWluLlByb2R1Y3RzLkRlcGVuZGVuY3lQcm9kdWN0cycgfCB0cmFuc2xvY28gfX08c3BhblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0b29sdGlwdGV4dCBncmFkaWVudC1jdXN0b20tYnJhbmRpbmdcIj57eyAnQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5EZXBlbmRlbmN5UHJvZHVjdHMnIHxcbiAgICAgICAgICAgICAgICAgIHRyYW5zbG9jbyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgW29wdGlvbnNdPVwicHJvZHVjdHNMaXN0XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFNjb3Blc1wiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCIgKG9uQ2hhbmdlKT1cIm9uU2VhcmNoQ3JpdGVyaWEoJGV2ZW50KVwiIFtzaG93SGVhZGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBtYXhTZWxlY3RlZExhYmVscz1cIjFcIiBhcHBlbmRUbz1cImJvZHlcIj5cbiAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5TdHJpcGVQbGFuJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLlN0cmlwZVBsYW4nIHwgdHJhbnNsb2NvXCIgY2xhc3M9XCJjb2wtbWQtNiBwLTBcIiBuYW1lPVwic3RyaXBlX3BsYW5faWRcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RyaXBlX3BsYW5faWRcIiAvPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuUHJpY2UnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgIFtpc0xlZnRUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5QcmljZScgfCB0cmFuc2xvY29cIiBjbGFzcz1cImNvbC1tZC02IHAtMFwiIG5hbWU9XCJwcmljZV9wZXJfdW5pdFwiXG4gICAgICAgICAgICAgICAgICBbZXJyb3JNc2ddPVwiJ0FkbWluLlByb2R1Y3RzLlZhbGlkYXRpb24uTmFtZScgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG51bWJlcnNPbmx5IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwicHJpY2VfcGVyX3VuaXRcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ3ByaWNlX3Blcl91bml0J10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIC8+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5UcmlhbERheXMnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuVHJpYWxEYXlzJyB8IHRyYW5zbG9jb1wiIGNsYXNzPVwiY29sLW1kLTYgcC0wXCIgbmFtZT1cInRyaWFsX2RheXNcIlxuICAgICAgICAgICAgICAgICAgW2Vycm9yTXNnXT1cIidBZG1pbi5Qcm9kdWN0cy5WYWxpZGF0aW9uLlRyaWFsRGF5cycgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwidHJpYWxfZGF5c1wiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsndHJpYWxfZGF5cyddLmVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAvPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLk1heFRyaWFsSGl0cycgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5NYXhUcmlhbEhpdHMnIHwgdHJhbnNsb2NvXCIgY2xhc3M9XCJjb2wtbWQtNiBwLTBcIiBuYW1lPVwibWF4X2hpdHNfdHJpYWxcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibWF4X2hpdHNfdHJpYWxcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ21heF9oaXRzX3RyaWFsJ10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIC8+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5UcmlhbEhpdHMnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuVHJpYWxIaXRzJyB8IHRyYW5zbG9jb1wiIGNsYXNzPVwiY29sLW1kLTYgcC0wXCIgbmFtZT1cIm1heF9oaXRzXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cIm1heF9oaXRzXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydtYXhfaGl0cyddLmVycm9ycyB9XCIgLz5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuRGVzY3JpcHRpb24nIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLkRlc2NyaXB0aW9uJyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgW2Vycm9yTXNnXT1cIidBZG1pbi5Qcm9kdWN0cy5WYWxpZGF0aW9uLkRlc2NyaXB0aW9uJyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgICAgIDxxdWlsbC1lZGl0b3IgW3N0eWxlc109XCJ7IGhlaWdodDogJzIyMHB4JyB9XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cInF1aWxsRWRpdG9yXCIgW21vZHVsZXNdPVwiZWRpdG9yQ29uZmlnXCIgaWQ9XCJkZXNjcmlwdGlvbkVkaXRvclwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2Rlc2NyaXB0aW9uJ10uZXJyb3JzLCAncXVpbGwtY29udGFpbmVyJzogdHJ1ZX1cIj5cbiAgICAgICAgICAgICAgICA8L3F1aWxsLWVkaXRvcj5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5TaWdudXBJbnN0cnVjdGlvbnMnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLlNpZ251cEluc3RydWN0aW9ucycgfCB0cmFuc2xvY29cIiBuYW1lPVwic2lnbnVwX2luc3RydWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxxdWlsbC1lZGl0b3IgW3N0eWxlc109XCJ7IGhlaWdodDogJzIyMHB4JyB9XCIgZm9ybUNvbnRyb2xOYW1lPVwic2lnbnVwX2luc3RydWN0aW9uc1wiIGNsYXNzPVwicXVpbGxFZGl0b3JcIiBbbW9kdWxlc109XCJlZGl0b3JDb25maWdcIiBpZD1cInNpZ251cEluc3RydWN0aW9uc0VkaXRvclwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydzaWdudXBfaW5zdHJ1Y3Rpb25zJ10uZXJyb3JzLCAncXVpbGwtY29udGFpbmVyJzogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDwvcXVpbGwtZWRpdG9yPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLlNpZ251cEluc3RydWN0aW9uRW1wbG95ZWVzJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5TaWdudXBJbnN0cnVjdGlvbkVtcGxveWVlcycgfCB0cmFuc2xvY29cIiBuYW1lPVwic2lnbnVwX2luc3RydWN0aW9uX2VtcGxveWVlc1wiPlxuICAgICAgICAgICAgICAgIDxxdWlsbC1lZGl0b3IgW3N0eWxlc109XCJ7IGhlaWdodDogJzIyMHB4JyB9XCIgZm9ybUNvbnRyb2xOYW1lPVwic2lnbnVwX2luc3RydWN0aW9uX2VtcGxveWVlc1wiIGNsYXNzPVwicXVpbGxFZGl0b3JcIiBbbW9kdWxlc109XCJlZGl0b3JDb25maWdcIiBpZD1cInNpZ251cEVtcGxveWVlc0VkaXRvclwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdHRlZCAmJiBmWydzaWdudXBfaW5zdHJ1Y3Rpb25fZW1wbG95ZWVzJ10uZXJyb3JzLCAncXVpbGwtY29udGFpbmVyJzogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDwvcXVpbGwtZWRpdG9yPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLlBlcm1pc3Npb25LZXknIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuUGVybWlzc2lvbktleScgfCB0cmFuc2xvY29cIiBuYW1lPVwicGVybWlzc2lvbl9rZXlcIiBbZXJyb3JNc2ddPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FkbWluLlByb2R1Y3RzLlZhbGlkYXRpb24uUGVybWlzc2lvbktleScgfCB0cmFuc2xvY29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ3Blcm1pc3Npb25fa2V5J10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIGZvcm1Db250cm9sTmFtZT1cInBlcm1pc3Npb25fa2V5XCIgLz5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCIgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLkZlYXR1cmVLZXknIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuRmVhdHVyZUtleScgfCB0cmFuc2xvY29cIiBuYW1lPVwiZmVhdHVyZV9rZXlcIlxuICAgICAgICAgICAgICAgICAgW2Vycm9yTXNnXT1cIidBZG1pbi5Qcm9kdWN0cy5WYWxpZGF0aW9uLkZlYXR1cmVLZXknIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnZmVhdHVyZV9rZXknXS5lcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgZm9ybUNvbnRyb2xOYW1lPVwiZmVhdHVyZV9rZXlcIiAvPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5Qcm9kdWN0S2V5JyB8IHRyYW5zbG9jb1wiIGNsYXNzPVwiY29sLW1kLTYgcC0wXCJcbiAgICAgICAgICAgICAgICAgIFtzaG93VG9vbHRpcF09XCJ0cnVlXCIgW3Rvb2x0aXBUZXh0XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLlBlcm1pc3Npb25LZXknIHwgdHJhbnNsb2NvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBuYW1lPVwicHJvZHVjdF9rZXlcIlxuICAgICAgICAgICAgICAgICAgW2Vycm9yTXNnXT1cIidBZG1pbi5Qcm9kdWN0cy5WYWxpZGF0aW9uLlByb2R1Y3RLZXknIHwgdHJhbnNsb2NvXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3Rfa2V5XCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydwcm9kdWN0X2tleSddLmVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAvPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5DYXRlZ29yeScgfCB0cmFuc2xvY29cIiBjbGFzcz1cImNvbC1tZC02IHAtMFwiXG4gICAgICAgICAgICAgICAgICBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiIFt0b29sdGlwVGV4dF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5QZXJtaXNzaW9uS2V5JyB8IHRyYW5zbG9jb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgbmFtZT1cImNhdGVnb3J5XCIgW2Vycm9yTXNnXT1cIidBZG1pbi5Qcm9kdWN0cy5WYWxpZGF0aW9uLkNhdGVnb3J5JyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwiY2F0ZWdvcmllc1wiIGNsYXNzPVwiZHJvcGRvd24tYmctdHJhbnNwYXJlbnRcIiBmb3JtQ29udHJvbE5hbWU9XCJjYXRlZ29yeVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnY2F0ZWdvcnknXS5lcnJvcnMgfVwiPlxuICAgICAgICAgICAgICAgICAgPC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLkJpbGxpbmdGcmVxdWVuY3knIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuQmlsbGluZ0ZyZXF1ZW5jeScgfCB0cmFuc2xvY29cIiBjbGFzcz1cImNvbC1tZC02IHAtMFwiIG5hbWU9XCJiaWxsaW5nX2ZyZXF1ZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwiZnJlcXVlbmN5XCIgY2xhc3M9XCJkcm9wZG93bi1iZy10cmFuc3BhcmVudFwiIGZvcm1Db250cm9sTmFtZT1cImJpbGxpbmdfZnJlcXVlbmN5XCJcbiAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ2JpbGxpbmdfZnJlcXVlbmN5J10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgPC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLkRvY3VtZW50YXRpb25VcmwnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuRG9jdW1lbnRhdGlvblVybCcgfCB0cmFuc2xvY29cIiBjbGFzcz1cImNvbC1tZC02IHAtMFwiIG5hbWU9XCJkb2N1bWVudGF0aW9uX3VybFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkb2N1bWVudGF0aW9uX3VybFwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnZG9jdW1lbnRhdGlvbl91cmwnXS5lcnJvcnNcbiAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5Qcm9kdWN0UHJpdmFjeVNlcnZpY2UnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuUHJvZHVjdFByaXZhY3lTZXJ2aWNlJyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJwcm9kdWN0X3ByaXZhY3lfc2VydmljZV9pZFwiPlxuICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiYWxsVG9zXCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdF9wcml2YWN5X3NlcnZpY2VfaWRcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBQcml2YWN5IFNlcnZpY2UnXCJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIiAqcmJhY0FsbG93PVwiJ1N1cGVyQWRtaW4nXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuTWFzdGVyUHJvZHVjdCcgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5NYXN0ZXJQcm9kdWN0JyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJtYXN0ZXJfcHJvZHVjdF9pZFwiPlxuICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwicHJvZHVjdHNMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWFzdGVyX3Byb2R1Y3RfaWRcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBNYXN0ZXIgUHJvZHVjdCdcIlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgPC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgY29sLXhzLTEyIGNvbC1zbS02IGNvbC1tZC00XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImluZm8tY2lyY2xlXCIgZm9yPVwiUm9sZXNcIj57eyAnQWRtaW4uUHJvZHVjdHMuQXNzaWduZWRSb2xlcycgfCB0cmFuc2xvY28gfX0gPHNwYW5cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9vbHRpcHRleHQgZ3JhZGllbnQtY3VzdG9tLWJyYW5kaW5nXCI+e3sgJ0FkbWluLlN1YnNjcmlwdGlvbnMuVG9vbHRpcC5Bc3NpZ25lZFJvbGVzJyB8XG4gICAgICAgICAgICAgICAgICB0cmFuc2xvY28gfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IFtvcHRpb25zXT1cImFsbFJvbGVzXCIgZm9ybUNvbnRyb2xOYW1lPVwicm9sZXNcIiBhcHBlbmRUbz1cImJvZHlcIj48L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIiAqbmdJZj1cInN1cHBvcnRlZEN1cnJlbmN5JCB8IGFzeW5jIGFzIGN1cnJlbmN5XCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuQ3VycmVuY3knIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLkN1cnJlbmN5JyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJjdXJyZW5jeVwiXG4gICAgICAgICAgICAgICAgW2Vycm9yTXNnXT1cIidBZG1pbi5Qcm9kdWN0cy5WYWxpZGF0aW9uLkN1cnJlbmN5JyB8IHRyYW5zbG9jb1wiPlxuICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjdXJyZW5jeVsncmVnaW9ucyddXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImN1cnJlbmN5XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnY3VycmVuY3knXS5lcnJvcnMgfVwiXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBDdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTRcIiAqbmdJZj1cInN1cHBvcnRlZFJlZ2lvbnMkIHwgYXN5bmMgYXMgcmVnaW9uXCI+XG4gICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuUmVnaW9uJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgW2lzTGVmdFRvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5SZWdpb24nIHwgdHJhbnNsb2NvXCIgbmFtZT1cInJlZ2lvblwiXG4gICAgICAgICAgICAgICAgW2Vycm9yTXNnXT1cIidBZG1pbi5Qcm9kdWN0cy5WYWxpZGF0aW9uLlJlZ2lvbicgfCB0cmFuc2xvY29cIj5cbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwicmVnaW9uWydyZWdpb25zJ11cIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVnaW9uXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsncmVnaW9uJ10uZXJyb3JzIH1cIlxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgUmVnaW9uJ1wiXG4gICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgPC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuR2l0TGFiU2VydmljZURlc2tFbWFpbCcgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuR2l0TGFiU2VydmljZURlc2tFbWFpbCcgfCB0cmFuc2xvY29cIiBuYW1lPVwiZ2l0bGFiX3NlcnZpY2VfZGVza19lbWFpbFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiZ2l0bGFiX3NlcnZpY2VfZGVza19lbWFpbFwiIC8+XG4gICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC00XCIgKnJiYWNBbGxvdz1cIidQYWdlcy5BbHBoYSdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5QYXJ0bmVyUHJvZHVjdHMnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuUGFydG5lclByb2R1Y3RzJyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJwYXJ0bmVyX3Byb2R1Y3RzXCI+XG4gICAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBbb3B0aW9uc109XCJwcm9kdWN0c0xpc3RcIiAob25DaGFuZ2UpPVwib25TZWFyY2hQYXJ0bmVyUHJvZHVjdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkUGFydG5lclByb2R1Y3RzXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiIG1heFNlbGVjdGVkTGFiZWxzPVwiMVwiIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNFwiICpyYmFjQWxsb3c9XCInUGFnZXMuQWxwaGEnXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuUHJvcmF0aW9uQmVoYXZpb3InIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuUHJvcmF0aW9uQmVoYXZpb3InIHwgdHJhbnNsb2NvXCIgbmFtZT1cInByb3JhdGlvbl9iZWhhdmlvclwiPlxuICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwicHJvcmF0aW9uQmVoYXZpb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvcmF0aW9uX2JlaGF2aW9yXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgUHJvcmF0aW9uIEJlaGF2aW9yJ1wiXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICA8L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgPC9wdy1pbnB1dC1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC00XCIgKnJiYWNBbGxvdz1cIidQYWdlcy5BbHBoYSdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5VbnN1YnNjcmliZVN0cmlwZUJlaGF2aW9yJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLlVuc3Vic2NyaWJlU3RyaXBlQmVoYXZpb3InIHwgdHJhbnNsb2NvXCIgbmFtZT1cInVuc3Vic2NyaWJlX3N0cmlwZV9iZWhhdmlvclwiPlxuICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwidW5zdWJzY3JpYmVCZWhhdmlvcnNcIlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ1bnN1YnNjcmliZV9zdHJpcGVfYmVoYXZpb3JcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBVbnN1YnNjcmliZSBTdHJpcGUgQmVoYXZpb3InXCJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS1zdGFydCB0b2dnbGVzIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiByb3cgbXQtNFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIiBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuSXNBY3RpdmUnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5Jc0FjdGl2ZScgfCB0cmFuc2xvY29cIiBuYW1lPVwiYWN0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1aS1zd2l0Y2ggY2xhc3M9XCJkLWJsb2NrXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWN0aXZlXCIgbmFtZT1cImFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWydhY3RpdmUnXS5lcnJvcnMgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L3VpLXN3aXRjaD5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiICpyYmFjQWxsb3c9XCInU3VwZXJBZG1pbidcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5NdWx0aXBsZUFsbG93ZWQnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidBZG1pbi5Qcm9kdWN0cy5NdWx0aXBsZUFsbG93ZWQnIHwgdHJhbnNsb2NvXCIgY2xhc3M9XCJub3dyYXBcIiBuYW1lPVwibXVsdGlwbGVfYWxsb3dlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8dWktc3dpdGNoIGNsYXNzPVwiZC1ibG9ja1wiIGZvcm1Db250cm9sTmFtZT1cIm11bHRpcGxlX2FsbG93ZWRcIiBuYW1lPVwibXVsdGlwbGVfYWxsb3dlZFwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1pbnZhbGlkJzogc3VibWl0dGVkICYmIGZbJ211bHRpcGxlX2FsbG93ZWQnXS5lcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L3VpLXN3aXRjaD5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgICA8cHctaW5wdXQtY29udGFpbmVyIFtzaG93VG9vbHRpcF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cIidBZG1pbi5Qcm9kdWN0cy5Ub29sdGlwLklzVmlzaWJsZScgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLklzVmlzaWJsZScgfCB0cmFuc2xvY29cIiBuYW1lPVwidmlzaWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8dWktc3dpdGNoIGNsYXNzPVwiZC1ibG9ja1wiIGZvcm1Db250cm9sTmFtZT1cInZpc2libGVcIiBuYW1lPVwidmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6IHN1Ym1pdHRlZCAmJiBmWyd2aXNpYmxlJ10uZXJyb3JzIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPC91aS1zd2l0Y2g+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5NZW1iZXJzVmlzaWJsZScgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLk1lbWJlcnNWaXNpYmxlJyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJtZW1iZXJzX3Zpc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVpLXN3aXRjaCBjbGFzcz1cImQtYmxvY2tcIiBmb3JtQ29udHJvbE5hbWU9XCJtZW1iZXJzX3Zpc2libGVcIiBuYW1lPVwibWVtYmVyc192aXNpYmxlXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnbWVtYmVyc192aXNpYmxlJ10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPC91aS1zd2l0Y2g+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgPHB3LWlucHV0LWNvbnRhaW5lciBbc2hvd1Rvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCInQWRtaW4uUHJvZHVjdHMuVG9vbHRpcC5DaGF0VmlzaWJsZScgfCB0cmFuc2xvY29cIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0FkbWluLlByb2R1Y3RzLkNoYXRWaXNpYmxlJyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJjaGF0X3Zpc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVpLXN3aXRjaCBjbGFzcz1cImQtYmxvY2tcIiBmb3JtQ29udHJvbE5hbWU9XCJjaGF0X3Zpc2libGVcIiBuYW1lPVwiY2hhdF92aXNpYmxlXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnY2hhdF92aXNpYmxlJ10uZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPC91aS1zd2l0Y2g+XG4gICAgICAgICAgICAgICAgICA8L3B3LWlucHV0LWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIiAqcmJhY0FsbG93PVwiJ1N1cGVyQWRtaW4nXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICAgIDxwdy1pbnB1dC1jb250YWluZXIgW3Nob3dUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcFRleHRdPVwiJ0FkbWluLlByb2R1Y3RzLlRvb2x0aXAuSXNNYXN0ZXJQcm9kdWN0JyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQWRtaW4uUHJvZHVjdHMuSXNNYXN0ZXJQcm9kdWN0JyB8IHRyYW5zbG9jb1wiIG5hbWU9XCJpc19tYXN0ZXJfcHJvZHVjdFwiPlxuICAgICAgICAgICAgICAgICAgICA8dWktc3dpdGNoIGNsYXNzPVwiZC1ibG9ja1wiIGZvcm1Db250cm9sTmFtZT1cImlzX21hc3Rlcl9wcm9kdWN0XCIgbmFtZT1cImlzX21hc3Rlcl9wcm9kdWN0XCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWludmFsaWQnOiBzdWJtaXR0ZWQgJiYgZlsnaXNfbWFzdGVyX3Byb2R1Y3QnXS5lcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L3VpLXN3aXRjaD5cbiAgICAgICAgICAgICAgICAgIDwvcHctaW5wdXQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBlbmQgdG9nZ2xlcyAtLT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHRleHQtZW5kIG10LTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGVmYXVsdCBtZS0yXCIgKGNsaWNrKT1cImJhY2soKVwiPiB7eyAnQnV0dG9uLkNhbmNlbCcgfFxuICAgICAgICAgICAgICAgIHRyYW5zbG9jbyB9fSA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgW2J1dHRvbkJ1c3ldPVwic3VibWl0dGVkXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAqcmJhY0FsbG93PVwiJ1BhZ2VzLkFkbWluLlByb2R1Y3QuRWRpdCdcIj4ge3sgJ0J1dHRvbi5TdWJtaXQnXG4gICAgICAgICAgICAgICAgfCB0cmFuc2xvY28gfX0gPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48bmctdGVtcGxhdGUgI2NvbnRlbnQgbGV0LW1vZGFsPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPGgzIGNsYXNzPVwibW9kYWwtdGl0bGUgbWItMCBwLTBcIj57eyAnVXNlci5TdWJzY3JpcHRpb25zLkZ1bGxMb2dvJyB8IHRyYW5zbG9jbyB9fTwvaDM+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgZmxvYXQtZW5kXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8c21hbGw+IHt7ICdVc2VyLlByb2ZpbGUuUGljdHVyZU1lc3NhZ2UnIHwgdHJhbnNsb2NvIH19PC9zbWFsbD5cbiAgICA8cHctaW1hZ2UtY3JvcHBlciAjcHJvZmlsZSAoaW1hZ2VTZWxlY3Rpb25FdmVudCk9XCJvbkltYWdlU2VsZWN0aW9uKCRldmVudClcIiBhc3BlY3RSYXRpbz1cImZ1bGxMb2dvXCJcbiAgICAgIChjbG9zZUV2ZW50KT1cIm9uQ2xvc2UoKVwiPlxuICAgIDwvcHctaW1hZ2UtY3JvcHBlcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNzcXVhcmVkTG9nb0NvbnRlbnQgbGV0LW1vZGFsPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPGgzIGNsYXNzPVwibW9kYWwtdGl0bGUgbWItMCBwLTBcIj57eyAnVXNlci5TdWJzY3JpcHRpb25zLlNxdWFyZWRMb2dvJyB8IHRyYW5zbG9jbyB9fTwvaDM+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgZmxvYXQtZW5kXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8c21hbGw+IHt7ICdVc2VyLlByb2ZpbGUuUGljdHVyZU1lc3NhZ2UnIHwgdHJhbnNsb2NvIH19PC9zbWFsbD5cbiAgICA8cHctaW1hZ2UtY3JvcHBlciAjcHJvZmlsZSAoaW1hZ2VTZWxlY3Rpb25FdmVudCk9XCJ1cGxvYWRTcXVhcmVkTG9nbygkZXZlbnQpXCIgYXNwZWN0UmF0aW89XCJhdXRvXCJcbiAgICAgIChjbG9zZUV2ZW50KT1cIm9uQ2xvc2UoKVwiPlxuICAgIDwvcHctaW1hZ2UtY3JvcHBlcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|