tango-app-ui-manage-billing 3.3.7 → 3.3.9
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/billing-groups/billing-group-form/billing-group-form.component.mjs +95 -9
- package/esm2022/lib/components/brand-invoices/brand-invoices.component.mjs +34 -12
- package/esm2022/lib/components/brands-billing/brands-billing.component.mjs +72 -1
- package/esm2022/lib/components/invoice-preview/invoice-preview.component.mjs +75 -6
- package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +2 -2
- package/esm2022/lib/components/services/billing.service.mjs +13 -1
- package/esm2022/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.mjs +9 -3
- package/esm2022/lib/components/tango-manage-billing/payment-statuschange/payment-statuschange.component.mjs +85 -7
- package/esm2022/lib/components/tango-manage-billing/tango-manage-billing.component.mjs +418 -34
- package/fesm2022/tango-app-ui-manage-billing.mjs +2362 -1642
- package/fesm2022/tango-app-ui-manage-billing.mjs.map +1 -1
- package/lib/components/billing-groups/billing-group-form/billing-group-form.component.d.ts +8 -1
- package/lib/components/brand-invoices/brand-invoices.component.d.ts +2 -0
- package/lib/components/brands-billing/brands-billing.component.d.ts +3 -0
- package/lib/components/invoice-preview/invoice-preview.component.d.ts +5 -0
- package/lib/components/services/billing.service.d.ts +9 -0
- package/lib/components/tango-manage-billing/payment-statuschange/payment-statuschange.component.d.ts +21 -3
- package/lib/components/tango-manage-billing/tango-manage-billing.component.d.ts +34 -0
- package/package.json +1 -1
package/esm2022/lib/components/billing-groups/billing-group-form/billing-group-form.component.mjs
CHANGED
|
@@ -31,6 +31,17 @@ export class BillingGroupFormComponent {
|
|
|
31
31
|
subscribedStoresApiState = new BehaviorSubject('initial');
|
|
32
32
|
subscribedProducts = [];
|
|
33
33
|
destroy$ = new Subject();
|
|
34
|
+
// GSTIN lookup state per billing-group row, keyed by FormArray index.
|
|
35
|
+
// 'idle' = no lookup yet (or GSTIN too short to trigger one).
|
|
36
|
+
// 'loading' = request in flight.
|
|
37
|
+
// 'found' = backend returned an address, fields auto-filled.
|
|
38
|
+
// 'notfound' = backend returned 404 / unknown GSTIN.
|
|
39
|
+
// 'error' = network or unexpected error.
|
|
40
|
+
gstLookupState = {};
|
|
41
|
+
// Track the last GSTIN we successfully looked up per row so re-typing the
|
|
42
|
+
// same value doesn't refire the request (and avoid clobbering manual edits
|
|
43
|
+
// the user may have made after the auto-fill).
|
|
44
|
+
lastLookedUpGstin = {};
|
|
34
45
|
groupTagOptions = [
|
|
35
46
|
{ value: 'store', label: 'Store' },
|
|
36
47
|
{ value: 'gst', label: 'GST' }
|
|
@@ -41,6 +52,13 @@ export class BillingGroupFormComponent {
|
|
|
41
52
|
{ value: 'singaporedollar', label: 'Singapore Dollar (S$)' },
|
|
42
53
|
{ value: 'euro', label: 'Euro (€)' },
|
|
43
54
|
];
|
|
55
|
+
// Drives whether the backend will calculate GST/IGST on invoices for this
|
|
56
|
+
// group. 'international' skips taxes entirely so the totalAmount equals
|
|
57
|
+
// the subtotal. See gstinLookup → invoiceController.createInvoice.
|
|
58
|
+
taxCalculationTypeOptions = [
|
|
59
|
+
{ value: 'domestic', label: 'Domestic' },
|
|
60
|
+
{ value: 'international', label: 'International' },
|
|
61
|
+
];
|
|
44
62
|
paymentCycleOptions = [
|
|
45
63
|
{ value: 'monthly', label: 'Monthly' },
|
|
46
64
|
{ value: 'quarter', label: 'Quarterly' },
|
|
@@ -120,7 +138,7 @@ export class BillingGroupFormComponent {
|
|
|
120
138
|
}
|
|
121
139
|
});
|
|
122
140
|
}
|
|
123
|
-
patchFormItem({ groupName, groupTag, registeredCompanyName, gst, addressLineOne, addressLineTwo, city, state, country, pinCode, placeOfSupply, po, stores, proRata, paymentCategory, currency, isInstallationOneTime, installationFee, paymentCycle, paymentTerm, generateInvoiceTo, attachAnnexure, isPrimary, advanceInvoice, products, _id }) {
|
|
141
|
+
patchFormItem({ groupName, groupTag, registeredCompanyName, gst, addressLineOne, addressLineTwo, city, state, country, pinCode, placeOfSupply, po, stores, proRata, paymentCategory, currency, taxCalculationType, isInstallationOneTime, installationFee, paymentCycle, paymentTerm, generateInvoiceTo, attachAnnexure, isPrimary, advanceInvoice, products, _id }) {
|
|
124
142
|
const item = this.fb.group({
|
|
125
143
|
groupName: [groupName || '', [Validators.required]],
|
|
126
144
|
groupTag: [groupTag || 'store', [Validators.required]],
|
|
@@ -135,9 +153,14 @@ export class BillingGroupFormComponent {
|
|
|
135
153
|
placeOfSupply: [placeOfSupply || ''],
|
|
136
154
|
po: [po || ''],
|
|
137
155
|
stores: [stores || []],
|
|
138
|
-
|
|
156
|
+
// Pricing method: 'prorate' (actual working days) or 'flat' (full
|
|
157
|
+
// month). Default to 'prorate' for records without a value.
|
|
158
|
+
proRata: [proRata === 'flat' ? 'flat' : 'prorate'],
|
|
139
159
|
paymentCategory: [paymentCategory || 'post'],
|
|
140
160
|
currency: [currency || 'dollar'],
|
|
161
|
+
// Default to 'domestic' so existing records (which won't have this
|
|
162
|
+
// field) behave exactly as today — GST/IGST still applied for INR.
|
|
163
|
+
taxCalculationType: [taxCalculationType || 'domestic'],
|
|
141
164
|
isInstallationOneTime: [isInstallationOneTime || false],
|
|
142
165
|
installationFee: [{ value: installationFee || '', disabled: true }],
|
|
143
166
|
paymentCycle: [paymentCycle || 'monthly'],
|
|
@@ -168,9 +191,13 @@ export class BillingGroupFormComponent {
|
|
|
168
191
|
placeOfSupply: [''],
|
|
169
192
|
po: [''],
|
|
170
193
|
stores: [[]],
|
|
171
|
-
|
|
194
|
+
// New records always start with 'prorate'; flat is opt-in.
|
|
195
|
+
proRata: ['prorate'],
|
|
172
196
|
paymentCategory: ['post'],
|
|
173
197
|
currency: ['dollar'],
|
|
198
|
+
// Default 'domestic' so the existing GST/IGST logic still applies
|
|
199
|
+
// unless the user explicitly switches to international.
|
|
200
|
+
taxCalculationType: ['domestic'],
|
|
174
201
|
isInstallationOneTime: [false],
|
|
175
202
|
installationFee: [{ value: '', disabled: true }],
|
|
176
203
|
paymentCycle: ['monthly'],
|
|
@@ -538,22 +565,81 @@ export class BillingGroupFormComponent {
|
|
|
538
565
|
const placeOfSupplyCtrl = this.billingGroups.at(formArrayIndex).get('placeOfSupply');
|
|
539
566
|
if (gst.length < 2) {
|
|
540
567
|
placeOfSupplyCtrl?.setValue('');
|
|
568
|
+
this.gstLookupState[formArrayIndex] = 'idle';
|
|
541
569
|
return;
|
|
542
570
|
}
|
|
543
571
|
const code = gst.substring(0, 2);
|
|
544
572
|
const stateName = this.gstStateCodeMap[code];
|
|
545
|
-
if (
|
|
573
|
+
if (stateName) {
|
|
574
|
+
placeOfSupplyCtrl?.setValue(`${stateName} (${code})`);
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
546
577
|
placeOfSupplyCtrl?.setValue('');
|
|
547
|
-
return;
|
|
548
578
|
}
|
|
549
|
-
|
|
579
|
+
// Full GSTIN is 15 chars (15-char alphanumeric). Trigger the address
|
|
580
|
+
// lookup once the user has typed all 15. Skip if we already looked this
|
|
581
|
+
// exact value up for this row — otherwise the (input) event would refire
|
|
582
|
+
// on focus/blur and clobber any manual tweaks the user made.
|
|
583
|
+
if (gst.length === 15 && this.lastLookedUpGstin[formArrayIndex] !== gst) {
|
|
584
|
+
this.lookupAndFillAddress(formArrayIndex, gst);
|
|
585
|
+
}
|
|
586
|
+
else if (gst.length < 15) {
|
|
587
|
+
// Reset state so a previous "found" indicator doesn't stick around
|
|
588
|
+
// while the user is editing the number to a new value.
|
|
589
|
+
this.gstLookupState[formArrayIndex] = 'idle';
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
lookupAndFillAddress(formArrayIndex, gst) {
|
|
593
|
+
this.gstLookupState[formArrayIndex] = 'loading';
|
|
594
|
+
this.billingService.lookupGstin(gst).pipe(takeUntil(this.destroy$)).subscribe({
|
|
595
|
+
next: (res) => {
|
|
596
|
+
// Backend wrap: { code, status, data: <payload> }. Payload itself
|
|
597
|
+
// may also be nested under `data` if the response middleware double-
|
|
598
|
+
// wraps it; handle both shapes to be safe.
|
|
599
|
+
const payload = res?.data?.data || res?.data || {};
|
|
600
|
+
if (!payload || !payload.gstin) {
|
|
601
|
+
this.gstLookupState[formArrayIndex] = 'notfound';
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
const group = this.billingGroups.at(formArrayIndex);
|
|
605
|
+
// Patch only the address-related fields. Don't overwrite groupName,
|
|
606
|
+
// groupTag, stores, currency, paymentTerm — those are user choices,
|
|
607
|
+
// not derived from GSTIN.
|
|
608
|
+
const patch = {};
|
|
609
|
+
if (payload.legalName)
|
|
610
|
+
patch['registeredCompanyName'] = String(payload.legalName).toUpperCase();
|
|
611
|
+
if (payload.addressLineOne)
|
|
612
|
+
patch['addressLineOne'] = payload.addressLineOne;
|
|
613
|
+
if (payload.addressLineTwo)
|
|
614
|
+
patch['addressLineTwo'] = payload.addressLineTwo;
|
|
615
|
+
if (payload.city)
|
|
616
|
+
patch['city'] = payload.city;
|
|
617
|
+
if (payload.state)
|
|
618
|
+
patch['state'] = payload.state;
|
|
619
|
+
if (payload.country)
|
|
620
|
+
patch['country'] = payload.country;
|
|
621
|
+
if (payload.pinCode)
|
|
622
|
+
patch['pinCode'] = payload.pinCode;
|
|
623
|
+
if (payload.placeOfSupply)
|
|
624
|
+
patch['placeOfSupply'] = payload.placeOfSupply;
|
|
625
|
+
group.patchValue(patch);
|
|
626
|
+
this.lastLookedUpGstin[formArrayIndex] = gst;
|
|
627
|
+
this.gstLookupState[formArrayIndex] = 'found';
|
|
628
|
+
},
|
|
629
|
+
error: (err) => {
|
|
630
|
+
// 404 = unknown GSTIN; everything else surfaces as an error so the
|
|
631
|
+
// user knows the auto-fill didn't happen and they should enter
|
|
632
|
+
// manually.
|
|
633
|
+
this.gstLookupState[formArrayIndex] = err?.status === 404 ? 'notfound' : 'error';
|
|
634
|
+
}
|
|
635
|
+
});
|
|
550
636
|
}
|
|
551
637
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingGroupFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BillingService }, { token: i3.NgbActiveModal }, { token: i4.ToastService }], target: i0.ɵɵFactoryTarget.Component });
|
|
552
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingGroupFormComponent, selector: "lib-billing-group-form", inputs: { clientId: "clientId", groupId: "groupId", currentTab: "currentTab" }, viewQueries: [{ propertyName: "accordion", first: true, predicate: NgbAccordionDirective, descendants: true }], ngImport: i0, template: "<div class=\"modal-body\">\r\n<div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <div class=\"header\">\r\n Update Billing Information\r\n </div>\r\n <div>\r\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\r\n class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>Add Billing Group</button>\r\n </div>\r\n</div>\r\n\r\n\r\n<form [formGroup]=\"billingForm\">\r\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\r\n [closeOthers]=\"true\">\r\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\r\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\r\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\r\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\r\n class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\r\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\r\n <div class=\"tab row row-cols-3 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\r\n class=\"item\">Basic Info</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'store-selection')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\r\n class=\"item\">Store Selection</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\r\n class=\"item\">Settings</div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\r\n formControlName=\"groupName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\r\n Group name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"groupTagOptions\" [label]=\"'Group Tag*'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\r\n Group tag is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n style=\"text-transform: uppercase;\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n GST is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\r\n formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\" readonly\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\r\n <div class=\"row\">\r\n <div class=\"col-10\">\r\n <div class=\"search-input\">\r\n <span class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\r\n fill=\"black\" fill-opacity=\"0.54\" />\r\n </svg>\r\n </span>\r\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\r\n placeholder=\"Search Store\" autocomplete=\"off\" />\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-2\">\r\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\r\n <div class=\"table-responsive store-table\">\r\n <table class=\"table bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onSelectAllStores($event, i)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Store Name</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th>Store Id\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\r\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th>Products</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscribedStoreList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <div class=\"store-name\">\r\n {{data?.storeName}}\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"products\">\r\n <ng-container *ngFor=\"let product of data?.product\">\r\n <span *ngIf=\"product === 'tangoTraffic'\"\r\n class=\"chip me-2 mb-2\">Traffic</span>\r\n <span *ngIf=\"product === 'tangoZone'\"\r\n class=\"chip me-2 mb-2\">Zone</span>\r\n <span *ngIf=\"product === 'tangoTrax'\"\r\n class=\"chip me-2 mb-2\">Trax</span>\r\n </ng-container>\r\n\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\"\r\n src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"after15\" value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoice_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoice_' + i\">\r\n Generate for next month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-sm bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\r\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container>\r\n <div class=\"tab row row-cols-2 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\r\n Basic\r\n Info</div>\r\n </div>\r\n\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\r\n Settings\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n style=\"text-transform: uppercase;\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\" readonly\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\" id=\"after15\"\r\n value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoiceSingle_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoiceSingle_' + i\">\r\n Generate for next month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-sm bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n</form>\r\n</div>", styles: [":host{display:block}.modal-body{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i3.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i3.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i3.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i3.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i3.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i3.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: i4.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i4.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "component", type: i6.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "label", "data"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] });
|
|
638
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingGroupFormComponent, selector: "lib-billing-group-form", inputs: { clientId: "clientId", groupId: "groupId", currentTab: "currentTab" }, viewQueries: [{ propertyName: "accordion", first: true, predicate: NgbAccordionDirective, descendants: true }], ngImport: i0, template: "<div class=\"modal-body\">\r\n<div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <div class=\"header\">\r\n Update Billing Information\r\n </div>\r\n <div>\r\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\r\n class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>Add Billing Group</button>\r\n </div>\r\n</div>\r\n\r\n\r\n<form [formGroup]=\"billingForm\">\r\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\r\n [closeOthers]=\"true\">\r\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\r\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\r\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\r\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\r\n class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\r\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\r\n <div class=\"tab row row-cols-3 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\r\n class=\"item\">Basic Info</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'store-selection')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\r\n class=\"item\">Store Selection</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\r\n class=\"item\">Settings</div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\r\n formControlName=\"groupName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\r\n Group name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"groupTagOptions\" [label]=\"'Group Tag*'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\r\n Group tag is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n style=\"text-transform: uppercase;\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n GST is required.\r\n </small>\r\n <!-- GSTIN address-lookup feedback. State machine driven by lookupAndFillAddress(). -->\r\n <small class=\"gst-lookup-msg text-muted\" *ngIf=\"gstLookupState[i] === 'loading'\">\r\n Looking up registered address\u2026\r\n </small>\r\n <small class=\"gst-lookup-msg text-success\" *ngIf=\"gstLookupState[i] === 'found'\">\r\n Registered address auto-filled. Edit if needed.\r\n </small>\r\n <small class=\"gst-lookup-msg text-warning\" *ngIf=\"gstLookupState[i] === 'notfound'\">\r\n No registered address found for this GSTIN. Enter manually.\r\n </small>\r\n <small class=\"gst-lookup-msg text-danger\" *ngIf=\"gstLookupState[i] === 'error'\">\r\n Address lookup failed. Enter manually.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\r\n formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\" readonly\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\r\n <div class=\"row\">\r\n <div class=\"col-10\">\r\n <div class=\"search-input\">\r\n <span class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\r\n fill=\"black\" fill-opacity=\"0.54\" />\r\n </svg>\r\n </span>\r\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\r\n placeholder=\"Search Store\" autocomplete=\"off\" />\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-2\">\r\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\r\n <div class=\"table-responsive store-table\">\r\n <table class=\"table bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onSelectAllStores($event, i)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Store Name</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th>Store Id\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\r\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th>Products</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscribedStoreList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <div class=\"store-name\">\r\n {{data?.storeName}}\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"products\">\r\n <ng-container *ngFor=\"let product of data?.product\">\r\n <span *ngIf=\"product === 'tangoTraffic'\"\r\n class=\"chip me-2 mb-2\">Traffic</span>\r\n <span *ngIf=\"product === 'tangoZone'\"\r\n class=\"chip me-2 mb-2\">Zone</span>\r\n <span *ngIf=\"product === 'tangoTrax'\"\r\n class=\"chip me-2 mb-2\">Trax</span>\r\n </ng-container>\r\n\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\"\r\n src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Method</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'prorate-' + i\" value=\"prorate\">\r\n <label class=\"form-check-label me-2\" [for]=\"'prorate-' + i\">\r\n Prorate \u2014 bill for actual working days\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'flat-' + i\" value=\"flat\">\r\n <label class=\"form-check-label me-2\" [for]=\"'flat-' + i\">\r\n Flat \u2014 bill for the whole month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoice_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoice_' + i\">\r\n Generate for next month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <!-- Note: no .table-responsive wrapper here. Its overflow-x:auto\r\n clips the Billing Method dropdown options panel. The table\r\n only has two columns, so horizontal scroll isn't needed. -->\r\n <table class=\"table table-sm bottom-border billing-method-table\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"taxCalculationType\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"taxCalculationTypeOptions\" [label]=\"'Tax Calculation'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\r\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container>\r\n <div class=\"tab row row-cols-2 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\r\n Basic\r\n Info</div>\r\n </div>\r\n\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\r\n Settings\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n style=\"text-transform: uppercase;\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n <small class=\"gst-lookup-msg text-muted\" *ngIf=\"gstLookupState[i] === 'loading'\">\r\n Looking up registered address\u2026\r\n </small>\r\n <small class=\"gst-lookup-msg text-success\" *ngIf=\"gstLookupState[i] === 'found'\">\r\n Registered address auto-filled. Edit if needed.\r\n </small>\r\n <small class=\"gst-lookup-msg text-warning\" *ngIf=\"gstLookupState[i] === 'notfound'\">\r\n No registered address found for this GSTIN. Enter manually.\r\n </small>\r\n <small class=\"gst-lookup-msg text-danger\" *ngIf=\"gstLookupState[i] === 'error'\">\r\n Address lookup failed. Enter manually.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\" readonly\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Method</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'prorate-edit-' + i\" value=\"prorate\">\r\n <label class=\"form-check-label me-2\" [for]=\"'prorate-edit-' + i\">\r\n Prorate \u2014 bill for actual working days\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'flat-edit-' + i\" value=\"flat\">\r\n <label class=\"form-check-label me-2\" [for]=\"'flat-edit-' + i\">\r\n Flat \u2014 bill for the whole month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoiceSingle_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoiceSingle_' + i\">\r\n Generate for next month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-sm bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"taxCalculationType\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"taxCalculationTypeOptions\" [label]=\"'Tax Calculation'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n</form>\r\n</div>", styles: [":host{display:block}.modal-body{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i3.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i3.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i3.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i3.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i3.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i3.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: i4.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i4.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "component", type: i6.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "label", "data"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] });
|
|
553
639
|
}
|
|
554
640
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingGroupFormComponent, decorators: [{
|
|
555
641
|
type: Component,
|
|
556
|
-
args: [{ selector: 'lib-billing-group-form', template: "<div class=\"modal-body\">\r\n<div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <div class=\"header\">\r\n Update Billing Information\r\n </div>\r\n <div>\r\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\r\n class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>Add Billing Group</button>\r\n </div>\r\n</div>\r\n\r\n\r\n<form [formGroup]=\"billingForm\">\r\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\r\n [closeOthers]=\"true\">\r\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\r\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\r\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\r\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\r\n class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\r\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\r\n <div class=\"tab row row-cols-3 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\r\n class=\"item\">Basic Info</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'store-selection')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\r\n class=\"item\">Store Selection</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\r\n class=\"item\">Settings</div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\r\n formControlName=\"groupName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\r\n Group name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"groupTagOptions\" [label]=\"'Group Tag*'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\r\n Group tag is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n style=\"text-transform: uppercase;\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n GST is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\r\n formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\" readonly\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\r\n <div class=\"row\">\r\n <div class=\"col-10\">\r\n <div class=\"search-input\">\r\n <span class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\r\n fill=\"black\" fill-opacity=\"0.54\" />\r\n </svg>\r\n </span>\r\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\r\n placeholder=\"Search Store\" autocomplete=\"off\" />\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-2\">\r\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\r\n <div class=\"table-responsive store-table\">\r\n <table class=\"table bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onSelectAllStores($event, i)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Store Name</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th>Store Id\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\r\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th>Products</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscribedStoreList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <div class=\"store-name\">\r\n {{data?.storeName}}\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"products\">\r\n <ng-container *ngFor=\"let product of data?.product\">\r\n <span *ngIf=\"product === 'tangoTraffic'\"\r\n class=\"chip me-2 mb-2\">Traffic</span>\r\n <span *ngIf=\"product === 'tangoZone'\"\r\n class=\"chip me-2 mb-2\">Zone</span>\r\n <span *ngIf=\"product === 'tangoTrax'\"\r\n class=\"chip me-2 mb-2\">Trax</span>\r\n </ng-container>\r\n\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\"\r\n src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"after15\" value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoice_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoice_' + i\">\r\n Generate for next month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-sm bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\r\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container>\r\n <div class=\"tab row row-cols-2 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\r\n Basic\r\n Info</div>\r\n </div>\r\n\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\r\n Settings\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n style=\"text-transform: uppercase;\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\" readonly\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\" id=\"after15\"\r\n value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoiceSingle_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoiceSingle_' + i\">\r\n Generate for next month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-sm bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n</form>\r\n</div>", styles: [":host{display:block}.modal-body{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"] }]
|
|
642
|
+
args: [{ selector: 'lib-billing-group-form', template: "<div class=\"modal-body\">\r\n<div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <div class=\"header\">\r\n Update Billing Information\r\n </div>\r\n <div>\r\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\r\n class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>Add Billing Group</button>\r\n </div>\r\n</div>\r\n\r\n\r\n<form [formGroup]=\"billingForm\">\r\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\r\n [closeOthers]=\"true\">\r\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\r\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\r\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\r\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\r\n class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\r\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\r\n <div class=\"tab row row-cols-3 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\r\n class=\"item\">Basic Info</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'store-selection')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\r\n class=\"item\">Store Selection</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\r\n class=\"item\">Settings</div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\r\n formControlName=\"groupName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\r\n Group name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"groupTagOptions\" [label]=\"'Group Tag*'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\r\n Group tag is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n style=\"text-transform: uppercase;\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n GST is required.\r\n </small>\r\n <!-- GSTIN address-lookup feedback. State machine driven by lookupAndFillAddress(). -->\r\n <small class=\"gst-lookup-msg text-muted\" *ngIf=\"gstLookupState[i] === 'loading'\">\r\n Looking up registered address\u2026\r\n </small>\r\n <small class=\"gst-lookup-msg text-success\" *ngIf=\"gstLookupState[i] === 'found'\">\r\n Registered address auto-filled. Edit if needed.\r\n </small>\r\n <small class=\"gst-lookup-msg text-warning\" *ngIf=\"gstLookupState[i] === 'notfound'\">\r\n No registered address found for this GSTIN. Enter manually.\r\n </small>\r\n <small class=\"gst-lookup-msg text-danger\" *ngIf=\"gstLookupState[i] === 'error'\">\r\n Address lookup failed. Enter manually.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\r\n formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\" readonly\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\r\n <div class=\"row\">\r\n <div class=\"col-10\">\r\n <div class=\"search-input\">\r\n <span class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\r\n fill=\"black\" fill-opacity=\"0.54\" />\r\n </svg>\r\n </span>\r\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\r\n placeholder=\"Search Store\" autocomplete=\"off\" />\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-2\">\r\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\r\n <div class=\"table-responsive store-table\">\r\n <table class=\"table bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onSelectAllStores($event, i)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Store Name</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th>Store Id\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\r\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th>Products</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscribedStoreList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <div class=\"store-name\">\r\n {{data?.storeName}}\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"products\">\r\n <ng-container *ngFor=\"let product of data?.product\">\r\n <span *ngIf=\"product === 'tangoTraffic'\"\r\n class=\"chip me-2 mb-2\">Traffic</span>\r\n <span *ngIf=\"product === 'tangoZone'\"\r\n class=\"chip me-2 mb-2\">Zone</span>\r\n <span *ngIf=\"product === 'tangoTrax'\"\r\n class=\"chip me-2 mb-2\">Trax</span>\r\n </ng-container>\r\n\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\"\r\n src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Method</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'prorate-' + i\" value=\"prorate\">\r\n <label class=\"form-check-label me-2\" [for]=\"'prorate-' + i\">\r\n Prorate \u2014 bill for actual working days\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'flat-' + i\" value=\"flat\">\r\n <label class=\"form-check-label me-2\" [for]=\"'flat-' + i\">\r\n Flat \u2014 bill for the whole month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoice_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoice_' + i\">\r\n Generate for next month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <!-- Note: no .table-responsive wrapper here. Its overflow-x:auto\r\n clips the Billing Method dropdown options panel. The table\r\n only has two columns, so horizontal scroll isn't needed. -->\r\n <table class=\"table table-sm bottom-border billing-method-table\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"taxCalculationType\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"taxCalculationTypeOptions\" [label]=\"'Tax Calculation'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\r\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container>\r\n <div class=\"tab row row-cols-2 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\r\n Basic\r\n Info</div>\r\n </div>\r\n\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\r\n Settings\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"forceUppercase($event, i)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n style=\"text-transform: uppercase;\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (input)=\"onGstChange(i, $any($event.target).value)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n <small class=\"gst-lookup-msg text-muted\" *ngIf=\"gstLookupState[i] === 'loading'\">\r\n Looking up registered address\u2026\r\n </small>\r\n <small class=\"gst-lookup-msg text-success\" *ngIf=\"gstLookupState[i] === 'found'\">\r\n Registered address auto-filled. Edit if needed.\r\n </small>\r\n <small class=\"gst-lookup-msg text-warning\" *ngIf=\"gstLookupState[i] === 'notfound'\">\r\n No registered address found for this GSTIN. Enter manually.\r\n </small>\r\n <small class=\"gst-lookup-msg text-danger\" *ngIf=\"gstLookupState[i] === 'error'\">\r\n Address lookup failed. Enter manually.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\" readonly\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Pricing Method</label>\r\n <div class=\"mt-3\">\r\n <div class=\"mb-3\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'prorate-edit-' + i\" value=\"prorate\">\r\n <label class=\"form-check-label me-2\" [for]=\"'prorate-edit-' + i\">\r\n Prorate \u2014 bill for actual working days\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n [id]=\"'flat-edit-' + i\" value=\"flat\">\r\n <label class=\"form-check-label me-2\" [for]=\"'flat-edit-' + i\">\r\n Flat \u2014 bill for the whole month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label class=\"form-check-label\">Advance Invoice</label>\r\n <span class=\"ms-1\" ngbTooltip=\"Creates an invoice for the next month automatically upon saving\" placement=\"top\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path d=\"M7 13C10.3137 13 13 10.3137 13 7C13 3.68629 10.3137 1 7 1C3.68629 1 1 3.68629 1 7C1 10.3137 3.68629 13 7 13Z\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M7 9.4V7M7 4.6H7.006\" stroke=\"#667085\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\"\r\n [id]=\"'advanceInvoiceSingle_' + i\"\r\n formControlName=\"advanceInvoice\">\r\n <label class=\"form-check-label\" [for]=\"'advanceInvoiceSingle_' + i\">\r\n Generate for next month\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 mb-5\" *ngIf=\"subscribedProducts.length\">\r\n <label class=\"form-check-label mb-3\">Product Billing Method</label>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-sm bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Product</th>\r\n <th>Billing Method</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let prod of subscribedProducts\">\r\n <td>\r\n <span class=\"badge badge-light-primary\">{{ formatProductName(prod.productName) }}</span>\r\n </td>\r\n <td>\r\n <lib-reactive-select\r\n [ngModel]=\"getProductBillingMethod(i, prod.productName)\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onBillingMethodSelectChange(i, prod.productName, $event)\"\r\n [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"billingMethodOptions\">\r\n </lib-reactive-select>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"currencyOptions\" [label]=\"'Currency'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"taxCalculationType\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"taxCalculationTypeOptions\" [label]=\"'Tax Calculation'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentCycleOptions\" [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"paymentTermOptions\" [label]=\"'Payment Term'\"></lib-reactive-select>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n</form>\r\n</div>", styles: [":host{display:block}.modal-body{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"] }]
|
|
557
643
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.BillingService }, { type: i3.NgbActiveModal }, { type: i4.ToastService }], propDecorators: { clientId: [{
|
|
558
644
|
type: Input
|
|
559
645
|
}], groupId: [{
|
|
@@ -564,4 +650,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
564
650
|
type: ViewChild,
|
|
565
651
|
args: [NgbAccordionDirective]
|
|
566
652
|
}] } });
|
|
567
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3VwLWZvcm0vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3VwLWZvcm0vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBMEIsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0YsT0FBTyxFQUFFLHFCQUFxQixFQUFrQixNQUFNLDRCQUE0QixDQUFDOzs7Ozs7OztBQVNuRixNQUFNLE9BQU8seUJBQXlCO0lBdUQxQjtJQUNBO0lBQ0Q7SUFDQztJQXhERCxRQUFRLENBQVM7SUFDakIsT0FBTyxDQUFTO0lBQ2hCLFVBQVUsQ0FBUztJQUM1QixXQUFXLENBQVk7SUFDdkIsU0FBUyxDQUFVO0lBQ25CLFVBQVUsR0FBMEIsRUFBRSxDQUFDO0lBQ3ZDLG1CQUFtQixHQUFVLEVBQUUsQ0FBQztJQUNoQyxlQUFlLEdBQVUsRUFBRSxDQUFDO0lBQzVCLFlBQVksR0FBVSxFQUFFLENBQUM7SUFDekIsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUN6QixX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QUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDckYsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNsQixpQkFBaUIsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMsT0FBTztTQUNSO1FBQ0QsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLE9BQU87U0FDUjtRQUNELGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxHQUFHLFNBQVMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELENBQUM7d0dBbGtCVSx5QkFBeUI7NEZBQXpCLHlCQUF5Qix5TEE4Q3pCLHFCQUFxQixnREMxRGxDLHk3dkRBNnZCTTs7NEZEanZCTyx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0Usd0JBQXdCO3FLQU16QixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQTBDNEIsU0FBUztzQkFBMUMsU0FBUzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCB0YWtlVW50aWwsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5nYkFjY29yZGlvbkRpcmVjdGl2ZSwgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJpbGxpbmctZ3JvdXAtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9iaWxsaW5nLWdyb3VwLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQmlsbGluZ0dyb3VwRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0IHtcblxuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nO1xuICBASW5wdXQoKSBncm91cElkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGN1cnJlbnRUYWI6IHN0cmluZztcbiAgYmlsbGluZ0Zvcm06IEZvcm1Hcm91cDtcbiAgc3VibWl0dGVkOiBib29sZWFuO1xuICBmaWx0ZXJEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10gPSBbXTtcbiAgc3Vic2NyaWJlZFN0b3JlTGlzdDogYW55W10gPSBbXTtcbiAgZmlsdGVyQ291bnRyaWVzOiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJTdGF0ZXM6IGFueVtdID0gW107XG4gIGZpbHRlckNpdGllczogYW55W10gPSBbXTtcbiAgc2VhcmNoSW5wdXQgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICBzZWFyY2hUZXJtOiBzdHJpbmc7XG4gIHNvcnRlZENvbHVtbjogc3RyaW5nO1xuICBzb3J0RGlyZWN0aW9uOiBudW1iZXI7XG4gIHN1YnNjcmliZWRTdG9yZXNBcGlTdGF0ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8J2luaXRpYWwnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCc+KCdpbml0aWFsJyk7XG4gIHN1YnNjcmliZWRQcm9kdWN0czogYW55W10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgZ3JvdXBUYWdPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdzdG9yZScsIGxhYmVsOiAnU3RvcmUnIH0sXG4gICAgeyB2YWx1ZTogJ2dzdCcsIGxhYmVsOiAnR1NUJyB9XG4gIF07XG4gIGN1cnJlbmN5T3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAnZG9sbGFyJywgbGFiZWw6ICdEb2xsYXIgKCQpJyB9LFxuICAgIHsgdmFsdWU6ICdpbnInLCBsYWJlbDogJ0lOUiAo4oK5KScgfSxcbiAgICB7IHZhbHVlOiAnc2luZ2Fwb3JlZG9sbGFyJywgbGFiZWw6ICdTaW5nYXBvcmUgRG9sbGFyIChTJCknIH0sXG4gICAgeyB2YWx1ZTogJ2V1cm8nLCBsYWJlbDogJ0V1cm8gKOKCrCknIH0sXG4gIF07XG4gIHBheW1lbnRDeWNsZU9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ21vbnRobHknLCBsYWJlbDogJ01vbnRobHknIH0sXG4gICAgeyB2YWx1ZTogJ3F1YXJ0ZXInLCBsYWJlbDogJ1F1YXJ0ZXJseScgfSxcbiAgICB7IHZhbHVlOiAnaGFsZlllYXJseScsIGxhYmVsOiAnSGFsZiB5ZWFybHknIH0sXG4gICAgeyB2YWx1ZTogJ3llYXJseScsIGxhYmVsOiAnWWVhcmx5JyB9XG4gIF07XG4gIHBheW1lbnRUZXJtT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAzMCwgbGFiZWw6ICczMCcgfSxcbiAgICB7IHZhbHVlOiA0NSwgbGFiZWw6ICc0NScgfSxcbiAgICB7IHZhbHVlOiA2MCwgbGFiZWw6ICc2MCcgfSxcbiAgICB7IHZhbHVlOiA5MCwgbGFiZWw6ICc5MCcgfVxuICBdO1xuICBiaWxsaW5nTWV0aG9kT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAnZWFjaFN0b3JlJywgbGFiZWw6ICdTdG9yZSBXaXNlJyB9LFxuICAgIHsgdmFsdWU6ICdvdmVyYWxsU3RvcmUnLCBsYWJlbDogJ0JyYW5kIFdpc2UnIH1cbiAgXTtcbiAgQFZpZXdDaGlsZChOZ2JBY2NvcmRpb25EaXJlY3RpdmUpIGFjY29yZGlvbjogTmdiQWNjb3JkaW9uRGlyZWN0aXZlO1xuXG4gIGl0ZW1zUGVyUGFnZSA9IDEwO1xuICBjdXJyZW50UGFnZSA9IDE7XG4gIHRvdGFsSXRlbXMgPSAwO1xuICBwYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMF07XG4gIHBhZ2VTaXplID0gMTA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsXG4gICAgcHVibGljIG1vZGFsUmVmOiBOZ2JBY3RpdmVNb2RhbCxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5nZXRCaWxsaW5nR3JvdXBzKCk7XG4gICAgdGhpcy5nZXRDbGllbnRQcm9kdWN0cygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7IGdldEZpbHRlcnM6IHRydWUgfSk7XG5cbiAgICB0aGlzLnNlYXJjaElucHV0LnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgZGVib3VuY2VUaW1lKDEwMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICkuc3Vic2NyaWJlKCh2YWwpID0+IHtcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgIHRoaXMuc2VhcmNoVGVybSA9IHZhbDtcbiAgICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgY3JlYXRlRm9ybSgpIHtcbiAgICB0aGlzLmJpbGxpbmdGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBncm91cHM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0QmlsbGluZ0dyb3VwcygpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEFsbEJpbGxpbmdHcm91cHModGhpcy5jbGllbnRJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcz8uZGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmVzLmRhdGEuZm9yRWFjaCgoZ3JvdXA6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXRjaEZvcm1JdGVtKHsgLi4uZ3JvdXAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cElkKSB7XG4gICAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sLCBpZHgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5nZXQoJ19pZCcpPy52YWx1ZSA9PT0gdGhpcy5ncm91cElkKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFjY29yZGlvbi50b2dnbGUoaWR4LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFRhYikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUodGhpcy5jdXJyZW50VGFiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFiID0gJyc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwSWQgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZGF0YS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZSgnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwYXRjaEZvcm1JdGVtKHsgZ3JvdXBOYW1lLCBncm91cFRhZywgcmVnaXN0ZXJlZENvbXBhbnlOYW1lLCBnc3QsIGFkZHJlc3NMaW5lT25lLCBhZGRyZXNzTGluZVR3bywgY2l0eSwgc3RhdGUsIGNvdW50cnksXG4gICAgcGluQ29kZSwgcGxhY2VPZlN1cHBseSwgcG8sIHN0b3JlcywgcHJvUmF0YSwgcGF5bWVudENhdGVnb3J5LCBjdXJyZW5jeSwgaXNJbnN0YWxsYXRpb25PbmVUaW1lLCBpbnN0YWxsYXRpb25GZWUsIHBheW1lbnRDeWNsZSxcbiAgICBwYXltZW50VGVybSwgZ2VuZXJhdGVJbnZvaWNlVG8sIGF0dGFjaEFubmV4dXJlLCBpc1ByaW1hcnksIGFkdmFuY2VJbnZvaWNlLCBwcm9kdWN0cywgX2lkIH06IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBncm91cE5hbWU6IFtncm91cE5hbWUgfHwgJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBncm91cFRhZzogW2dyb3VwVGFnIHx8ICdzdG9yZScsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICByZWdpc3RlcmVkQ29tcGFueU5hbWU6IFsocmVnaXN0ZXJlZENvbXBhbnlOYW1lIHx8ICcnKS50b1VwcGVyQ2FzZSgpLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZ3N0OiBbZ3N0IHx8ICcnXSxcbiAgICAgIGFkZHJlc3NMaW5lT25lOiBbYWRkcmVzc0xpbmVPbmUgfHwgJyddLFxuICAgICAgYWRkcmVzc0xpbmVUd286IFthZGRyZXNzTGluZVR3byB8fCAnJ10sXG4gICAgICBjaXR5OiBbY2l0eSB8fCAnJ10sXG4gICAgICBzdGF0ZTogW3N0YXRlIHx8ICcnXSxcbiAgICAgIGNvdW50cnk6IFtjb3VudHJ5IHx8ICcnXSxcbiAgICAgIHBpbkNvZGU6IFtwaW5Db2RlIHx8ICcnXSxcbiAgICAgIHBsYWNlT2ZTdXBwbHk6IFtwbGFjZU9mU3VwcGx5IHx8ICcnXSxcbiAgICAgIHBvOiBbcG8gfHwgJyddLFxuICAgICAgc3RvcmVzOiBbc3RvcmVzIHx8IFtdXSxcbiAgICAgIHByb1JhdGE6IFtwcm9SYXRhIHx8ICdiZWZvcmUxNSddLFxuICAgICAgcGF5bWVudENhdGVnb3J5OiBbcGF5bWVudENhdGVnb3J5IHx8ICdwb3N0J10sXG4gICAgICBjdXJyZW5jeTogW2N1cnJlbmN5IHx8ICdkb2xsYXInXSxcbiAgICAgIGlzSW5zdGFsbGF0aW9uT25lVGltZTogW2lzSW5zdGFsbGF0aW9uT25lVGltZSB8fCBmYWxzZV0sXG4gICAgICBpbnN0YWxsYXRpb25GZWU6IFt7IHZhbHVlOiBpbnN0YWxsYXRpb25GZWUgfHwgJycsIGRpc2FibGVkOiB0cnVlIH1dLFxuICAgICAgcGF5bWVudEN5Y2xlOiBbcGF5bWVudEN5Y2xlIHx8ICdtb250aGx5J10sXG4gICAgICBwYXltZW50VGVybTogW3BheW1lbnRUZXJtIHx8IDMwXSxcbiAgICAgIGdlbmVyYXRlSW52b2ljZVRvOiBbZ2VuZXJhdGVJbnZvaWNlVG8gfHwgW11dLFxuICAgICAgYXR0YWNoQW5uZXh1cmU6IFthdHRhY2hBbm5leHVyZSB8fCBmYWxzZV0sXG4gICAgICBpc1ByaW1hcnk6IFtpc1ByaW1hcnkgfHwgZmFsc2VdLFxuICAgICAgYWR2YW5jZUludm9pY2U6IFthZHZhbmNlSW52b2ljZSB8fCBmYWxzZV0sXG4gICAgICBwcm9kdWN0czogW3Byb2R1Y3RzIHx8IFtdXSxcbiAgICAgIGN1cnJlbnRUYWI6IFsnYmFzaWMtaW5mbyddLFxuICAgICAgY2xpZW50SWQ6IFt0aGlzLmNsaWVudElkXSxcbiAgICAgIF9pZDogW19pZF1cbiAgICB9KTtcbiAgICB0aGlzLmJpbGxpbmdHcm91cHMucHVzaChpdGVtKTtcbiAgfVxuXG4gIGFkZEZvcm1JdGVtKHsgaXNQcmltYXJ5LCBncm91cE5hbWUgfTogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHN0cmluZz4pIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBncm91cE5hbWU6IFtncm91cE5hbWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBncm91cFRhZzogWydzdG9yZScsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICByZWdpc3RlcmVkQ29tcGFueU5hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGdzdDogWycnXSxcbiAgICAgIGFkZHJlc3NMaW5lT25lOiBbJyddLFxuICAgICAgYWRkcmVzc0xpbmVUd286IFsnJ10sXG4gICAgICBjaXR5OiBbJyddLFxuICAgICAgc3RhdGU6IFsnJ10sXG4gICAgICBjb3VudHJ5OiBbJyddLFxuICAgICAgcGluQ29kZTogWycnXSxcbiAgICAgIHBsYWNlT2ZTdXBwbHk6IFsnJ10sXG4gICAgICBwbzogWycnXSxcbiAgICAgIHN0b3JlczogW1tdXSxcbiAgICAgIHByb1JhdGE6IFsnYmVmb3JlMTUnXSxcbiAgICAgIHBheW1lbnRDYXRlZ29yeTogWydwb3N0J10sXG4gICAgICBjdXJyZW5jeTogWydkb2xsYXInXSxcbiAgICAgIGlzSW5zdGFsbGF0aW9uT25lVGltZTogW2ZhbHNlXSxcbiAgICAgIGluc3RhbGxhdGlvbkZlZTogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcbiAgICAgIHBheW1lbnRDeWNsZTogWydtb250aGx5J10sXG4gICAgICBwYXltZW50VGVybTogWzMwXSxcbiAgICAgIGdlbmVyYXRlSW52b2ljZVRvOiBbW11dLFxuICAgICAgYXR0YWNoQW5uZXh1cmU6IFtmYWxzZV0sXG4gICAgICBpc1ByaW1hcnk6IFtpc1ByaW1hcnldLFxuICAgICAgYWR2YW5jZUludm9pY2U6IFtmYWxzZV0sXG4gICAgICBwcm9kdWN0czogW1tdXSxcbiAgICAgIGN1cnJlbnRUYWI6IFsnYmFzaWMtaW5mbyddLFxuICAgICAgY2xpZW50SWQ6IFt0aGlzLmNsaWVudElkXVxuICAgIH0pO1xuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5wdXNoKGl0ZW0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5hY2NvcmRpb24udG9nZ2xlKGAke3RoaXMuYmlsbGluZ0dyb3Vwcy5sZW5ndGggLSAxfWApO1xuICAgIH0sIDApO1xuICB9XG5cbiAgZ2V0IGJpbGxpbmdHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmlsbGluZ0Zvcm0uZ2V0KCdncm91cHMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBvblRhYkNoYW5nZShpZHg6IG51bWJlciwgdmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUodmFsKTtcbiAgfVxuXG4gIG9uRGVsZXRlR3JvdXAoaWR4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdfaWQnKT8udmFsdWUpIHtcbiAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZGVsZXRlQmlsbGluZ0dyb3VwKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnX2lkJyk/LnZhbHVlKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzPy5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICAgIGlmIChncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGdyb3VwLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi5ncm91cC5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgLi4udGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdzdG9yZXMnKT8udmFsdWVdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMucmVtb3ZlQXQoaWR4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgIGlmIChncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSkge1xuICAgICAgICAgIGdyb3VwLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi5ncm91cC5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgLi4udGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdzdG9yZXMnKT8udmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMucmVtb3ZlQXQoaWR4KTtcbiAgICB9XG4gIH1cblxuICBnZXRTdWJzY3JpYmVkU3RvcmVzKHsgZ2V0RmlsdGVycyB9OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPikge1xuICAgIHRoaXMuc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlLm5leHQoJ2xvYWRpbmcnKTtcbiAgICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgbGltaXQ6IHRoaXMucGFnZVNpemUsXG4gICAgICBvZmZzZXQ6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcbiAgICAgIHNvcnRDb2x1bW46IHRoaXMuc29ydGVkQ29sdW1uLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnREaXJlY3Rpb24sXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5zZWFyY2hUZXJtLFxuICAgICAgY291bnRyeTogdGhpcy5maWx0ZXJDb3VudHJpZXMsXG4gICAgICBzdGF0ZTogdGhpcy5maWx0ZXJTdGF0ZXMsXG4gICAgICBjaXR5OiB0aGlzLmZpbHRlckNpdGllcyxcbiAgICAgIGdldEZpbHRlcnM6IGdldEZpbHRlcnNcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAoZGF0YVtrZXldID09PSB1bmRlZmluZWQgfHwgZGF0YVtrZXldID09PSAnJykgZGVsZXRlIGRhdGFba2V5XTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSAmJiAhZGF0YVtrZXldLmxlbmd0aCkgZGVsZXRlIGRhdGFba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldFN1YnNjcmliZWRTdG9yZXMoZGF0YSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVkU3RvcmVzQXBpU3RhdGUubmV4dCgnbG9hZGVkJyk7XG4gICAgICAgIGlmIChnZXRGaWx0ZXJzKSB7XG4gICAgICAgICAgaWYgKHJlcz8uZGF0YT8uY291bnRyaWVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YS5wdXNoKHsgRGVzY3JpcHRpb246ICdDb3VudHJ5JywgSXNzdWVzOiByZXMuZGF0YS5jb3VudHJpZXMubWFwKCh2YWw6IGFueSkgPT4gKHsgdGV4dDogdmFsLl9pZCwgaWQ6IHZhbC5faWQgfSkpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzPy5kYXRhPy5zdGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJEYXRhLnB1c2goeyBEZXNjcmlwdGlvbjogJ1N0YXRlJywgSXNzdWVzOiByZXMuZGF0YS5zdGF0ZXMubWFwKCh2YWw6IGFueSkgPT4gKHsgdGV4dDogdmFsLl9pZCwgaWQ6IHZhbC5faWQgfSkpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzPy5kYXRhPy5jaXRpZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJEYXRhLnB1c2goeyBEZXNjcmlwdGlvbjogJ0NpdHknLCBJc3N1ZXM6IHJlcy5kYXRhLmNpdGllcy5tYXAoKHZhbDogYW55KSA9PiAoeyB0ZXh0OiB2YWwuX2lkLCBpZDogdmFsLl9pZCB9KSkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHJlcz8uZGF0YT8ucGFnZUluZm8/LmNvdW50IHx8IDA7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdCA9IHJlcz8uZGF0YT8uZGF0YSB8fCBbXTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uU3RvcmVDaGVjayhldmVudDogYW55LCBmb3JtQXJyYXlJbmRleDogbnVtYmVyLCBzdG9yZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS5nZXQoJ3N0b3JlcycpPy52YWx1ZS5pbmNsdWRlcyhzdG9yZUlkKSkge1xuICAgICAgICAgIGl0ZW0uZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoaXRlbS5nZXQoJ3N0b3JlcycpPy52YWx1ZS5maWx0ZXIoKHZhbDogc3RyaW5nKSA9PiB2YWwgIT09IHN0b3JlSWQpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi50aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLCBzdG9yZUlkXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoXG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICE9PSBzdG9yZUlkKVxuICAgICAgKTtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSkge1xuICAgICAgICAgIGl0ZW0uZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoWy4uLml0ZW0uZ2V0KCdzdG9yZXMnKT8udmFsdWUsIHN0b3JlSWRdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25TZWxlY3RBbGxTdG9yZXMoZXZlbnQ6IGFueSwgZm9ybUFycmF5SW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHN1YnNjcmliZWRTdG9yZUlkcyA9IHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdC5tYXAoaXRlbSA9PiBpdGVtLnN0b3JlSWQpO1xuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICAgIGdyb3VwLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZvckVhY2goKHN0b3JlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoc3Vic2NyaWJlZFN0b3JlSWRzLmluY2x1ZGVzKHN0b3JlKSkge1xuICAgICAgICAgICAgZ3JvdXAuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoZ3JvdXAuZ2V0KCdzdG9yZXMnKT8udmFsdWUuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09IHN0b3JlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4udGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgLi4uc3Vic2NyaWJlZFN0b3JlSWRzXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoXG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUuZmlsdGVyKChpdGVtOiBhbnkpID0+ICFzdWJzY3JpYmVkU3RvcmVJZHMuaW5jbHVkZXMoaXRlbSkpXG4gICAgICApO1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlKSB7XG4gICAgICAgICAgaXRlbS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4uaXRlbS5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgLi4uc3Vic2NyaWJlZFN0b3JlSWRzXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlzU3RvcmVTZWxlY3RlZEluR3JvdXAoZm9ybUFycmF5SW5kZXg6IG51bWJlciwgc3RvcmVJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUuaW5jbHVkZXMoc3RvcmVJZCk7XG4gIH1cblxuICBpc0FsbFN0b3Jlc1NlbGVjdGVkSW5Hcm91cChmb3JtQXJyYXlJbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdC5ldmVyeShpdGVtID0+IHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUuaW5jbHVkZXMoaXRlbS5zdG9yZUlkKSkgJiYgdGhpcy5zdWJzY3JpYmVkU3RvcmVMaXN0Lmxlbmd0aDtcbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShldmVudDogbnVtYmVyKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IGV2ZW50O1xuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSk7XG4gIH1cblxuICBvblBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLnBhZ2VTaXplID0gZXZlbnQ7XG4gICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBldmVudDtcbiAgICB0aGlzLmdldFN1YnNjcmliZWRTdG9yZXMoe30pO1xuICB9XG5cbiAgb21pdF9zcGVjaWFsX2NoYXIoZXZlbnQ6IGFueSkge1xuICAgIHZhciBrID0gZXZlbnQuY2hhckNvZGU7XG4gICAgcmV0dXJuIChrID09IDggfHwgayA9PSAzMiB8fCAoayA+PSA0OCAmJiBrIDw9IDU3KSk7XG4gIH1cblxuICBmb3JjZVVwcGVyY2FzZShldmVudDogYW55LCBpZHg6IG51bWJlcikge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdXBwZXIgPSBpbnB1dC52YWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChpbnB1dC52YWx1ZSAhPT0gdXBwZXIpIHtcbiAgICAgIGNvbnN0IGNhcmV0ID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICBpbnB1dC52YWx1ZSA9IHVwcGVyO1xuICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcbiAgICB9XG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uc2V0VmFsdWUodXBwZXIsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVycyhldmVudDogYW55KSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgZXZlbnQuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgICAgIGlmICh2YWwuRGVzY3JpcHRpb24gPT09ICdDb3VudHJ5JykgdGhpcy5maWx0ZXJDb3VudHJpZXMgPSB2YWwuSXNzdWVzLm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmlkKTtcbiAgICAgIGlmICh2YWwuRGVzY3JpcHRpb24gPT09ICdTdGF0ZScpIHRoaXMuZmlsdGVyU3RhdGVzID0gdmFsLklzc3Vlcy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCk7XG4gICAgICBpZiAodmFsLkRlc2NyaXB0aW9uID09PSAnQ2l0eScpIHRoaXMuZmlsdGVyQ2l0aWVzID0gdmFsLklzc3Vlcy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCk7XG4gICAgfSk7XG4gICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KTtcbiAgfVxuXG4gIG9uRW1haWxLZXlEb3duKGV2ZW50OiBhbnksIGZvcm1BcnJheUluZGV4OiBudW1iZXIpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoZXZlbnQuY29kZSA9PSAnQmFja3NwYWNlJyAmJiBldmVudC50YXJnZXQudmFsdWUgPT0gJycpIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy5zZXRWYWx1ZShcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlLnNsaWNlKDAsIC0xKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmNvZGUgPT0gJ0VudGVyJykge1xuICAgICAgY29uc3QgZW1haWxSZWdleCA9IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLztcbiAgICAgIGlmIChlbWFpbFJlZ2V4LnRlc3QoZXZlbnQudGFyZ2V0LnZhbHVlKSkge1xuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8uc2V0VmFsdWUoXG4gICAgICAgICAgWy4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZSwgZXZlbnQudGFyZ2V0LnZhbHVlXVxuICAgICAgICApO1xuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVFbWFpbENoaXAoZW1haWw6IHN0cmluZywgZm9ybUFycmF5SW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy5zZXRWYWx1ZShcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZS5maWx0ZXIoKHZhbDogc3RyaW5nKSA9PiB2YWwgIT09IGVtYWlsKVxuICAgICk7XG4gIH1cblxuICBvblNvcnQoY29sdW1uOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5zb3J0ZWRDb2x1bW4gPT09IGNvbHVtbikge1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gdGhpcy5zb3J0RGlyZWN0aW9uID09PSAxID8gLTEgOiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvcnRlZENvbHVtbiA9IGNvbHVtbjtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IDE7XG4gICAgfVxuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSk7XG4gIH1cblxuICBuYXZpZ2F0ZShmb3JtQXJyYXlJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKCdzZXR0aW5ncycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJykge1xuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnc3RvcmUtc2VsZWN0aW9uJyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc3RvcmUtc2VsZWN0aW9uJykge1xuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnc2V0dGluZ3MnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRCaWxsaW5nR3JvdXAoKSB7XG4gICAgdGhpcy5hZGRGb3JtSXRlbSh7IGdyb3VwTmFtZTogYEdyb3VwICR7dGhpcy5iaWxsaW5nR3JvdXBzLmxlbmd0aCArIDF9YCwgaXNQcmltYXJ5OiBmYWxzZSB9KTtcbiAgfVxuXG4gIG9uU3VibWl0KGZvcm1WYWx1ZXM6IGFueSwgaWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaW52YWxpZCkge1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKCdiYXNpYy1pbmZvJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgZW1haWwgaW4gR2VuZXJhdGUgSW52b2ljZSBUbycpO1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKCdzZXR0aW5ncycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRlbGV0ZSBmb3JtVmFsdWVzLmN1cnJlbnRUYWI7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtVmFsdWVzKSB7XG4gICAgICBpZiAoZm9ybVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmIChmb3JtVmFsdWVzW2tleV0gPT09IHVuZGVmaW5lZCkgZGVsZXRlIGZvcm1WYWx1ZXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZm9ybVZhbHVlcy5faWQpIHtcbiAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UudXBkYXRlQmlsbGluZ0dyb3VwKGZvcm1WYWx1ZXMpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXM/LmRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMubW9kYWxSZWYuY2xvc2UoJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFByaW1hcnlUb2FzdCgnQmlsbGluZyBncm91cCB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChlcnIuZXJyb3I/LmNvZGUgPT09IDQwMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChlcnIuZXJyb3IuZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gdXBkYXRlIGJpbGxpbmcgZ3JvdXAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmNyZWF0ZUJpbGxpbmdHcm91cChmb3JtVmFsdWVzKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzPy5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGFsUmVmLmNsb3NlKCdzdWNjZXNzJyk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRQcmltYXJ5VG9hc3QoJ0JpbGxpbmcgZ3JvdXAgY3JlYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZXJyLmVycm9yPy5jb2RlID09PSA0MDApIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyLmVycm9yLmVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGNyZWF0ZSBiaWxsaW5nIGdyb3VwJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRDbGllbnRQcm9kdWN0cygpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldENsaWVudFByb2R1Y3RzKHRoaXMuY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXM/LmRhdGE/LnBsYW5EZXRhaWxzPy5wcm9kdWN0Py5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnN1YnNjcmliZWRQcm9kdWN0cyA9IHJlcy5kYXRhLnBsYW5EZXRhaWxzLnByb2R1Y3QuZmlsdGVyKChwOiBhbnkpID0+IHAuc3RhdHVzID09PSAnbGl2ZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbkNhbmNlbChpZHg6IG51bWJlcikge1xuICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZShpZHgudG9TdHJpbmcoKSk7XG4gIH1cblxuICBwcmV2ZW50RW50ZXIoZXZlbnQ6IGFueSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBnZXRQcm9kdWN0QmlsbGluZ01ldGhvZChmb3JtQXJyYXlJbmRleDogbnVtYmVyLCBwcm9kdWN0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm9kdWN0cyA9IHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdwcm9kdWN0cycpPy52YWx1ZSB8fCBbXTtcbiAgICBjb25zdCBmb3VuZCA9IHByb2R1Y3RzLmZpbmQoKHA6IGFueSkgPT4gcC5wcm9kdWN0TmFtZSA9PT0gcHJvZHVjdE5hbWUpO1xuICAgIHJldHVybiBmb3VuZD8uYmlsbGluZ01ldGhvZCB8fCAnb3ZlcmFsbFN0b3JlJztcbiAgfVxuXG4gIG9uQmlsbGluZ01ldGhvZENoYW5nZShmb3JtQXJyYXlJbmRleDogbnVtYmVyLCBwcm9kdWN0TmFtZTogc3RyaW5nLCBldmVudDogYW55KSB7XG4gICAgY29uc3QgcHJvZHVjdHMgPSB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgncHJvZHVjdHMnKT8udmFsdWUgfHwgW107XG4gICAgY29uc3QgZXhpc3RpbmcgPSBwcm9kdWN0cy5maW5kKChwOiBhbnkpID0+IHAucHJvZHVjdE5hbWUgPT09IHByb2R1Y3ROYW1lKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGV4aXN0aW5nLmJpbGxpbmdNZXRob2QgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2R1Y3RzLnB1c2goeyBwcm9kdWN0TmFtZSwgYmlsbGluZ01ldGhvZDogZXZlbnQudGFyZ2V0LnZhbHVlIH0pO1xuICAgIH1cbiAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgncHJvZHVjdHMnKT8uc2V0VmFsdWUoWy4uLnByb2R1Y3RzXSk7XG4gIH1cblxuICBvbkJpbGxpbmdNZXRob2RTZWxlY3RDaGFuZ2UoZm9ybUFycmF5SW5kZXg6IG51bWJlciwgcHJvZHVjdE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IHByb2R1Y3RzID0gdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3Byb2R1Y3RzJyk/LnZhbHVlIHx8IFtdO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gcHJvZHVjdHMuZmluZCgocDogYW55KSA9PiBwLnByb2R1Y3ROYW1lID09PSBwcm9kdWN0TmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy5iaWxsaW5nTWV0aG9kID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2R1Y3RzLnB1c2goeyBwcm9kdWN0TmFtZSwgYmlsbGluZ01ldGhvZDogdmFsdWUgfSk7XG4gICAgfVxuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdwcm9kdWN0cycpPy5zZXRWYWx1ZShbLi4ucHJvZHVjdHNdKTtcbiAgfVxuXG4gIGZvcm1hdFByb2R1Y3ROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxICQyJylcbiAgICAgIC5yZXBsYWNlKC9eLi8sIChzdHIpID0+IHN0ci50b1VwcGVyQ2FzZSgpKTtcbiAgfVxuXG4gIC8vIEdTVElOIHN0YXRlLWNvZGUgcHJlZml4IOKGkiBTdGF0ZSAoUGxhY2Ugb2YgU3VwcGx5KVxuICBwcml2YXRlIHJlYWRvbmx5IGdzdFN0YXRlQ29kZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnMDEnOiAnSmFtbXUgYW5kIEthc2htaXInLFxuICAgICcwMic6ICdIaW1hY2hhbCBQcmFkZXNoJyxcbiAgICAnMDMnOiAnUHVuamFiJyxcbiAgICAnMDQnOiAnQ2hhbmRpZ2FyaCcsXG4gICAgJzA1JzogJ1V0dGFyYWtoYW5kJyxcbiAgICAnMDYnOiAnSGFyeWFuYScsXG4gICAgJzA3JzogJ0RlbGhpJyxcbiAgICAnMDgnOiAnUmFqYXN0aGFuJyxcbiAgICAnMDknOiAnVXR0YXIgUHJhZGVzaCcsXG4gICAgJzEwJzogJ0JpaGFyJyxcbiAgICAnMTEnOiAnU2lra2ltJyxcbiAgICAnMTInOiAnQXJ1bmFjaGFsIFByYWRlc2gnLFxuICAgICcxMyc6ICdOYWdhbGFuZCcsXG4gICAgJzE0JzogJ01hbmlwdXInLFxuICAgICcxNSc6ICdNaXpvcmFtJyxcbiAgICAnMTYnOiAnVHJpcHVyYScsXG4gICAgJzE3JzogJ01lZ2hhbGF5YScsXG4gICAgJzE4JzogJ0Fzc2FtJyxcbiAgICAnMTknOiAnV2VzdCBCZW5nYWwnLFxuICAgICcyMCc6ICdKaGFya2hhbmQnLFxuICAgICcyMSc6ICdPZGlzaGEnLFxuICAgICcyMic6ICdDaGhhdHRpc2dhcmgnLFxuICAgICcyMyc6ICdNYWRoeWEgUHJhZGVzaCcsXG4gICAgJzI0JzogJ0d1amFyYXQnLFxuICAgICcyNSc6ICdEYW1hbiBhbmQgRGl1JyxcbiAgICAnMjYnOiAnRGFkcmEgYW5kIE5hZ2FyIEhhdmVsaSBhbmQgRGFtYW4gYW5kIERpdScsXG4gICAgJzI3JzogJ01haGFyYXNodHJhJyxcbiAgICAnMjgnOiAnQW5kaHJhIFByYWRlc2ggKE9sZCknLFxuICAgICcyOSc6ICdLYXJuYXRha2EnLFxuICAgICczMCc6ICdHb2EnLFxuICAgICczMSc6ICdMYWtzaGFkd2VlcCcsXG4gICAgJzMyJzogJ0tlcmFsYScsXG4gICAgJzMzJzogJ1RhbWlsIE5hZHUnLFxuICAgICczNCc6ICdQdWR1Y2hlcnJ5JyxcbiAgICAnMzUnOiAnQW5kYW1hbiBhbmQgTmljb2JhciBJc2xhbmRzJyxcbiAgICAnMzYnOiAnVGVsYW5nYW5hJyxcbiAgICAnMzcnOiAnQW5kaHJhIFByYWRlc2gnLFxuICAgICczOCc6ICdMYWRha2gnLFxuICAgICc5Nyc6ICdPdGhlciBUZXJyaXRvcnknLFxuICAgICc5OSc6ICdDZW50cmUgSnVyaXNkaWN0aW9uJ1xuICB9O1xuXG4gIG9uR3N0Q2hhbmdlKGZvcm1BcnJheUluZGV4OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBnc3QgPSAodmFsdWUgfHwgJycpLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IHBsYWNlT2ZTdXBwbHlDdHJsID0gdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3BsYWNlT2ZTdXBwbHknKTtcbiAgICBpZiAoZ3N0Lmxlbmd0aCA8IDIpIHtcbiAgICAgIHBsYWNlT2ZTdXBwbHlDdHJsPy5zZXRWYWx1ZSgnJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvZGUgPSBnc3Quc3Vic3RyaW5nKDAsIDIpO1xuICAgIGNvbnN0IHN0YXRlTmFtZSA9IHRoaXMuZ3N0U3RhdGVDb2RlTWFwW2NvZGVdO1xuICAgIGlmICghc3RhdGVOYW1lKSB7XG4gICAgICBwbGFjZU9mU3VwcGx5Q3RybD8uc2V0VmFsdWUoJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwbGFjZU9mU3VwcGx5Q3RybD8uc2V0VmFsdWUoYCR7c3RhdGVOYW1lfSAoJHtjb2RlfSlgKTtcbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbjxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cclxuICAgICAgICBVcGRhdGUgQmlsbGluZyBJbmZvcm1hdGlvblxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2PlxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImFkZEJpbGxpbmdHcm91cCgpXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLW91dGxpbmUgYnRuIGFsaWduLWl0ZW1zLWVuZCBuZWVkaGVscFwiPjxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1lLTJcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAuMDAxMyA0LjE2NjAyVjE1LjgzMjdNNC4xNjc5NyA5Ljk5OTM1SDE1LjgzNDZcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPkFkZCBCaWxsaW5nIEdyb3VwPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG5cclxuPGZvcm0gW2Zvcm1Hcm91cF09XCJiaWxsaW5nRm9ybVwiPlxyXG4gICAgPGRpdiAqbmdJZj1cImJpbGxpbmdHcm91cHMubGVuZ3RoID4gMVwiIGZvcm1BcnJheU5hbWU9XCJncm91cHNcIiBuZ2JBY2NvcmRpb24gYWNjb3JkaW9uPVwiTmdiQWNjb3JkaW9uXCJcclxuICAgICAgICBbY2xvc2VPdGhlcnNdPVwidHJ1ZVwiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGJpbGxpbmdHcm91cHMuY29udHJvbHM7IGxldCBpID0gaW5kZXg7XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXHJcbiAgICAgICAgICAgIFtuZ2JBY2NvcmRpb25JdGVtXT1cImkudG9TdHJpbmcoKVwiIGNsYXNzPVwibWItNVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYWluaGVhZGluZyBwLTBcIiBuZ2JBY2NvcmRpb25CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0yXCI+e3tncm91cC5nZXQoJ2dyb3VwTmFtZScpPy52YWx1ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWVcIiBjbGFzcz1cInByaW1hcnktYmFkZ2VcIj5QcmltYXJ5PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWdyb3VwLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgb25EZWxldGVHcm91cChpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMi41IDQuOTk5MzVINC4xNjY2N000LjE2NjY3IDQuOTk5MzVMMTcuNSA0Ljk5OTM1TTQuMTY2NjcgNC45OTkzNUw0LjE2NjY3IDE2LjY2NkM0LjE2NjY3IDE3LjEwOCA0LjM0MjI2IDE3LjUzMiA0LjY1NDgyIDE3Ljg0NDVDNC45NjczOCAxOC4xNTcxIDUuMzkxMzEgMTguMzMyNyA1LjgzMzMzIDE4LjMzMjdIMTQuMTY2N0MxNC42MDg3IDE4LjMzMjcgMTUuMDMyNiAxOC4xNTcxIDE1LjM0NTIgMTcuODQ0NUMxNS42NTc3IDE3LjUzMiAxNS44MzMzIDE3LjEwOCAxNS44MzMzIDE2LjY2NkwxNS44MzMzIDQuOTk5MzVMNC4xNjY2NyA0Ljk5OTM1Wk02LjY2NjY3IDQuOTk5MzVWMy4zMzI2OEM2LjY2NjY3IDIuODkwNjUgNi44NDIyNiAyLjQ2NjczIDcuMTU0ODIgMi4xNTQxN0M3LjQ2NzM4IDEuODQxNjEgNy44OTEzMSAxLjY2NjAyIDguMzMzMzMgMS42NjYwMkwxMS42NjY3IDEuNjY2MDJDMTIuMTA4NyAxLjY2NjAyIDEyLjUzMjYgMS44NDE2MSAxMi44NDUyIDIuMTU0MTdDMTMuMTU3NyAyLjQ2NjczIDEzLjMzMzMgMi44OTA2NSAxMy4zMzMzIDMuMzMyNjhWNC45OTkzNU04LjMzMzMzIDkuMTY2MDJMOC4zMzMzMyAxNC4xNjZNMTEuNjY2NyA5LjE2NjAyVjE0LjE2NlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keSBjbGFzcz1cInBzLTAgcGUtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUgPyAncm93LWNvbHMtMicgOiAnJ1wiIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWIgcm93IHJvdy1jb2xzLTMgIGctMCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKGksICdiYXNpYy1pbmZvJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nID8gJ3NlbGVjdGVkJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW1cIj5CYXNpYyBJbmZvPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvblRhYkNoYW5nZShpLCAnc3RvcmUtc2VsZWN0aW9uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3N0b3JlLXNlbGVjdGlvbicgPyAnc2VsZWN0ZWQnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbVwiPlN0b3JlIFNlbGVjdGlvbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ3NldHRpbmdzJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3NldHRpbmdzJyA/ICdzZWxlY3RlZCcgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtXCI+U2V0dGluZ3M8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdiYXNpYy1pbmZvJyA/ICdkLW5vbmUnIDogJydcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJncm91cE5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Hcm91cCBOYW1lKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJncm91cE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImdyb3VwTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnZ3JvdXBOYW1lJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdncm91cE5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdncm91cE5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnZ3JvdXBOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImdyb3VwVGFnXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImdyb3VwVGFnT3B0aW9uc1wiIFtsYWJlbF09XCInR3JvdXAgVGFnKidcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dyb3VwVGFnJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2dyb3VwVGFnJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgdGFnIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlJlZ2lzdGVyZWQgQ29tcGFueSBOYW1lKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiAoaW5wdXQpPVwiZm9yY2VVcHBlcmNhc2UoJGV2ZW50LCBpKVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIGNvbXBhbnkgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJnc3RcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5HU1Q8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGlucHV0KT1cIm9uR3N0Q2hhbmdlKGksICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZ3N0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZ3N0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdnc3QnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2dzdCcpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dzdCcpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdnc3QnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1QgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01IHN1Yi1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgRGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWRkcmVzc0xpbmVPbmVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5BZGRyZXNzIGxpbmUgMTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzTGluZU9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0xpbmVPbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzTGluZVR3b1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFkZHJlc3MgbGluZSAyPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NMaW5lVHdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzTGluZVR3b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNpdHlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5DaXR5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNpdHlcIiBmb3JtQ29udHJvbE5hbWU9XCJjaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjaXR5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjaXR5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY2l0eScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjaXR5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2l0eSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGF0ZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0YXRlL3Byb3ZpbmNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInN0YXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnc3RhdGUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnc3RhdGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnc3RhdGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb3VudHJ5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Q291bnRyeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY291bnRyeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRyeSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaW5Db2RlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGluIGNvZGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwaW5Db2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwaW5Db2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGluQ29kZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGluIGNvZGUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGxhY2VPZlN1cHBseVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBsYWNlIG9mIFN1cHBseTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwbGFjZU9mU3VwcGx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwbGFjZU9mU3VwcGx5XCIgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Ugb2Ygc3VwcGx5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBvXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UE88L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicG9cIiBmb3JtQ29udHJvbE5hbWU9XCJwb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncG8nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncG8nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXJjaGFzZSBvcmRlciBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ3N0b3JlLXNlbGVjdGlvbicgPyAnZC1ub25lJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjUgMTBMMTEuNDMgMTAuNzNDMTIuNDEgOS41OSAxMyA4LjExIDEzIDYuNUMxMyAyLjkxIDEwLjA5IDAgNi41IDBDMi45MSAwIDAgMi45MSAwIDYuNUMwIDEwLjA5IDIuOTEgMTMgNi41IDEzQzguMTEgMTMgOS41OSAxMi40MSAxMC43MyAxMS40M0wxMC4yNzYyIDExLjcxTDE2IDE3LjQ5TDE3LjQ5IDE2TDExLjUgMTBaTTYuNSAxMUM0LjAxIDExIDIgOC45OSAyIDYuNUMyIDQuMDEgNC4wMSAyIDYuNSAyQzguOTkgMiAxMSA0LjAxIDExIDYuNUMxMSA4Ljk5IDguOTkgMTEgNi41IDExWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJibGFja1wiIGZpbGwtb3BhY2l0eT1cIjAuNTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgW2Zvcm1Db250cm9sXT1cInNlYXJjaElucHV0XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFN0b3JlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItZmlsdGVycyAqbmdJZj1cImZpbHRlckRhdGEubGVuZ3RoXCIgY2xhc3M9XCJtZS0yXCIgW2RhdGFPYmplY3RdPVwiZmlsdGVyRGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBsaWVkRmlsdGVycyk9XCJhcHBseUZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGVkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1YnNjcmliZWRTdG9yZUxpc3Q/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIHN0b3JlLXRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYm90dG9tLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cImlzQWxsU3RvcmVzU2VsZWN0ZWRJbkdyb3VwKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3RBbGxTdG9yZXMoJGV2ZW50LCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyIG1lLTRcIiB0eXBlPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RvcmUgTmFtZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdG9yZU5hbWUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnc3RvcmVOYW1lJyAmJiBzb3J0RGlyZWN0aW9uID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TdG9yZSBJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdG9yZUlkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnc3RvcmVJZCcgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlByb2R1Y3RzPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBzdWJzY3JpYmVkU3RvcmVMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cImlzU3RvcmVTZWxlY3RlZEluR3JvdXAoaSwgZGF0YT8uc3RvcmVJZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblN0b3JlQ2hlY2soJGV2ZW50LCBpLCBkYXRhPy5zdG9yZUlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyIG1lLTRcIiB0eXBlPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkYXRhPy5zdG9yZU5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmUtaWRcIj5JRCA6IHt7ZGF0YT8uc3RvcmVJZH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgZGF0YT8ucHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdCA9PT0gJ3RhbmdvVHJhZmZpYydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoaXAgbWUtMiBtYi0yXCI+VHJhZmZpYzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2R1Y3QgPT09ICd0YW5nb1pvbmUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGlwIG1lLTIgbWItMlwiPlpvbmU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwcm9kdWN0ID09PSAndGFuZ29UcmF4J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hpcCBtZS0yIG1iLTJcIj5UcmF4PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJzY3JpYmVkU3RvcmVMaXN0Lmxlbmd0aFwiIGNsYXNzPVwibXktM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcGFnaW5hdGlvbiBbaXRlbXNQZXJQYWdlXT1cIml0ZW1zUGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXN1YnNjcmliZWRTdG9yZUxpc3Q/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjIHctMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGluZydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyLWNhcmQgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdzZXR0aW5ncycgPyAnZC1ub25lJyA6ICcnXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+UHJpY2luZyBNZXRob2RzIChQcm8gUmF0YSk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicHJvUmF0YVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYmVmb3JlMTVcIiB2YWx1ZT1cImJlZm9yZTE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cImJlZm9yZTE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWZvcmUgMTV0aCBvZiBNb250aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9SYXRhXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhZnRlcjE1XCIgdmFsdWU9XCJhZnRlcjE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cImFmdGVyMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFmdGVyIDE1dGggb2YgTW9udGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+QWR2YW5jZSBJbnZvaWNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMVwiIG5nYlRvb2x0aXA9XCJDcmVhdGVzIGFuIGludm9pY2UgZm9yIHRoZSBuZXh0IG1vbnRoIGF1dG9tYXRpY2FsbHkgdXBvbiBzYXZpbmdcIiBwbGFjZW1lbnQ9XCJ0b3BcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDEzQzEwLjMxMzcgMTMgMTMgMTAuMzEzNyAxMyA3QzEzIDMuNjg2MjkgMTAuMzEzNyAxIDcgMUMzLjY4NjI5IDEgMSAzLjY4NjI5IDEgN0MxIDEwLjMxMzcgMy42ODYyOSAxMyA3IDEzWlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA5LjRWN003IDQuNkg3LjAwNlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidhZHZhbmNlSW52b2ljZV8nICsgaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZHZhbmNlSW52b2ljZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2Zvcl09XCInYWR2YW5jZUludm9pY2VfJyArIGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGZvciBuZXh0IG1vbnRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbWItNVwiICpuZ0lmPVwic3Vic2NyaWJlZFByb2R1Y3RzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtYi0zXCI+UHJvZHVjdCBCaWxsaW5nIE1ldGhvZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXNtIGJvdHRvbS1ib3JkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Qcm9kdWN0PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+QmlsbGluZyBNZXRob2Q8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBwcm9kIG9mIHN1YnNjcmliZWRQcm9kdWN0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1wcmltYXJ5XCI+e3sgZm9ybWF0UHJvZHVjdE5hbWUocHJvZC5wcm9kdWN0TmFtZSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRQcm9kdWN0QmlsbGluZ01ldGhvZChpLCBwcm9kLnByb2R1Y3ROYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQmlsbGluZ01ldGhvZFNlbGVjdENoYW5nZShpLCBwcm9kLnByb2R1Y3ROYW1lLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiYmlsbGluZ01ldGhvZE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY3VycmVuY3lcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiY3VycmVuY3lPcHRpb25zXCIgW2xhYmVsXT1cIidDdXJyZW5jeSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRDeWNsZVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJwYXltZW50Q3ljbGVPcHRpb25zXCIgW2xhYmVsXT1cIidQYXltZW50IEN5Y2xlJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudFRlcm1cIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwicGF5bWVudFRlcm1PcHRpb25zXCIgW2xhYmVsXT1cIidQYXltZW50IFRlcm0nXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ2VtYWlsJyArIGlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5HZW5lcmF0ZSBJbnZvaWNlIFRvKiA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkXCI+PC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0ZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWNvbnRhaW5lciBmb3JtLWNvbnRyb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZW1haWwgb2YgZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0zXCI+e3sgZW1haWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cInJlbW92ZUVtYWlsQ2hpcChlbWFpbCwgaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBzdHlsZT1cIm1pbi1oZWlnaHQ6IDQ0cHg7XCIgKGtleWRvd24pPVwib25FbWFpbEtleURvd24oJGV2ZW50LCBpKVwiIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZW1haWxWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWlucFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiAhZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZvaWNlIGVtYWlsIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5TdG9yZSBMaXN0IEFubmV4dXJlIEF0dGFjaGVkIFdpdGggSW52b2ljZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJhdHRhY2hBbm5leHVyZVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCIgaWQ9XCJ5ZXNcIiBbdmFsdWVdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cInllc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJhdHRhY2hBbm5leHVyZVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCIgaWQ9XCJub1wiIFt2YWx1ZV09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cIm5vXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1lbmQganVzdGlmeS1jb250ZW50LWVuZCBtdC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25DYW5jZWwoaSlcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMFwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJyB8fCBncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzdG9yZS1zZWxlY3Rpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJuYXZpZ2F0ZShpKVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwXCI+TmV4dDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3NldHRpbmdzJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25TdWJtaXQoZ3JvdXAudmFsdWUsIGkpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDBcIj5TYXZlIENoYW5nZXM8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJiaWxsaW5nR3JvdXBzLmxlbmd0aCA9PT0gMVwiIGZvcm1BcnJheU5hbWU9XCJncm91cHNcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBiaWxsaW5nR3JvdXBzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4O1wiIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWIgcm93IHJvdy1jb2xzLTIgZy0wIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKGksICdiYXNpYy1pbmZvJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycgPyAnc2VsZWN0ZWQnIDogJydcIiBjbGFzcz1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ3NldHRpbmdzJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnID8gJ3NlbGVjdGVkJyA6ICcnXCIgY2xhc3M9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdiYXNpYy1pbmZvJyA/ICdkLW5vbmUnIDogJydcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UmVnaXN0ZXJlZCBDb21wYW55IE5hbWUqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGlucHV0KT1cImZvcmNlVXBwZXJjYXNlKCRldmVudCwgaSlcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwidGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZCBjb21wYW55IG5hbWUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJnc3RcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5HU1Q8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiAoaW5wdXQpPVwib25Hc3RDaGFuZ2UoaSwgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJnc3RcIiBmb3JtQ29udHJvbE5hbWU9XCJnc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnZ3N0Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdnc3QnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnZ3N0Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2dzdCcpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZCBjb21wYW55IG5hbWUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01IHN1Yi1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBEZXRhaWxzXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzTGluZU9uZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFkZHJlc3MgbGluZSAxPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiYWRkcmVzc0xpbmVPbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0xpbmVPbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWRkcmVzc0xpbmVUd29cIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5BZGRyZXNzIGxpbmUgMjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NMaW5lVHdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NMaW5lVHdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNpdHlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5DaXR5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY2l0eVwiIGZvcm1Db250cm9sTmFtZT1cImNpdHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnY2l0eScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnY2l0eScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdjaXR5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2NpdHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpdHkgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGF0ZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0YXRlL3Byb3ZpbmNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdzdGF0ZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnc3RhdGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnc3RhdGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnc3RhdGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY291bnRyeVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNvdW50cnk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvdW50cnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnY291bnRyeScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnY291bnRyeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2NvdW50cnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cnkgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaW5Db2RlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGluIGNvZGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiAoa2V5cHJlc3MpPVwib21pdF9zcGVjaWFsX2NoYXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBpbkNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGluQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3BpbkNvZGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncGluQ29kZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGluIGNvZGUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwbGFjZU9mU3VwcGx5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGxhY2Ugb2YgU3VwcGx5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicGxhY2VPZlN1cHBseVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwbGFjZU9mU3VwcGx5XCIgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFjZSBvZiBzdXBwbHkgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwb1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBPPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicG9cIiBmb3JtQ29udHJvbE5hbWU9XCJwb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwbycpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgncG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncG8nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1cmNoYXNlIG9yZGVyIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdzZXR0aW5ncycgPyAnZC1ub25lJyA6ICcnXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlByaWNpbmcgTWV0aG9kcyAoUHJvIFJhdGEpPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cInByb1JhdGFcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiIHR5cGU9XCJyYWRpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYmVmb3JlMTVcIiB2YWx1ZT1cImJlZm9yZTE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwiYmVmb3JlMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVmb3JlIDE1dGggb2YgTW9udGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9SYXRhXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIiBpZD1cImFmdGVyMTVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cImFmdGVyMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJhZnRlcjE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFmdGVyIDE1dGggb2YgTW9udGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+QWR2YW5jZSBJbnZvaWNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgbmdiVG9vbHRpcD1cIkNyZWF0ZXMgYW4gaW52b2ljZSBmb3IgdGhlIG5leHQgbW9udGggYXV0b21hdGljYWxseSB1cG9uIHNhdmluZ1wiIHBsYWNlbWVudD1cInRvcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDEzQzEwLjMxMzcgMTMgMTMgMTAuMzEzNyAxMyA3QzEzIDMuNjg2MjkgMTAuMzEzNyAxIDcgMUMzLjY4NjI5IDEgMSAzLjY4NjI5IDEgN0MxIDEwLjMxMzcgMy42ODYyOSAxMyA3IDEzWlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDkuNFY3TTcgNC42SDcuMDA2XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2FkdmFuY2VJbnZvaWNlU2luZ2xlXycgKyBpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWR2YW5jZUludm9pY2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2Zvcl09XCInYWR2YW5jZUludm9pY2VTaW5nbGVfJyArIGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgZm9yIG5leHQgbW9udGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbWItNVwiICpuZ0lmPVwic3Vic2NyaWJlZFByb2R1Y3RzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1iLTNcIj5Qcm9kdWN0IEJpbGxpbmcgTWV0aG9kPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXNtIGJvdHRvbS1ib3JkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Qcm9kdWN0PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5CaWxsaW5nIE1ldGhvZDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcHJvZCBvZiBzdWJzY3JpYmVkUHJvZHVjdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LXByaW1hcnlcIj57eyBmb3JtYXRQcm9kdWN0TmFtZShwcm9kLnByb2R1Y3ROYW1lKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0UHJvZHVjdEJpbGxpbmdNZXRob2QoaSwgcHJvZC5wcm9kdWN0TmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25CaWxsaW5nTWV0aG9kU2VsZWN0Q2hhbmdlKGksIHByb2QucHJvZHVjdE5hbWUsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiYmlsbGluZ01ldGhvZE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY3VycmVuY3lcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiY3VycmVuY3lPcHRpb25zXCIgW2xhYmVsXT1cIidDdXJyZW5jeSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRDeWNsZVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJwYXltZW50Q3ljbGVPcHRpb25zXCIgW2xhYmVsXT1cIidQYXltZW50IEN5Y2xlJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudFRlcm1cIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwicGF5bWVudFRlcm1PcHRpb25zXCIgW2xhYmVsXT1cIidQYXltZW50IFRlcm0nXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTEyIGNvbC14bC0xMiBjb2wteHhsLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ2VtYWlsJyArIGlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5HZW5lcmF0ZSBJbnZvaWNlIFRvKiA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWRcIj48L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm91dGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWNvbnRhaW5lciBmb3JtLWNvbnRyb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbWFpbCBvZiBncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0zXCI+e3sgZW1haWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwicmVtb3ZlRW1haWxDaGlwKGVtYWlsLCBpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIHN0eWxlPVwibWluLWhlaWdodDogNDRweDtcIiAoa2V5ZG93bik9XCJvbkVtYWlsS2V5RG93bigkZXZlbnQsIGkpXCIgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVtYWlsVmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1pbnBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgIWdyb3VwLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52b2ljZSBlbWFpbCBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlN0b3JlIExpc3QgQW5uZXh1cmUgQXR0YWNoZWQgV2l0aCBJbnZvaWNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJhdHRhY2hBbm5leHVyZVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIiBpZD1cInllc1wiIFt2YWx1ZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJ5ZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImF0dGFjaEFubmV4dXJlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiIGlkPVwibm9cIiBbdmFsdWVdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cIm5vXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1lbmQganVzdGlmeS1jb250ZW50LWVuZCBtdC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm1vZGFsUmVmLmNsb3NlKClcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMFwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJyB8fCBncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzdG9yZS1zZWxlY3Rpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm5hdmlnYXRlKGkpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDBcIj5OZXh0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3NldHRpbmdzJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvblN1Ym1pdChncm91cC52YWx1ZSwgaSlcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMFwiPlNhdmUgQ2hhbmdlczwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuPC9mb3JtPlxyXG48L2Rpdj4iXX0=
|
|
653
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3VwLWZvcm0vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3VwLWZvcm0vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBMEIsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0YsT0FBTyxFQUFFLHFCQUFxQixFQUFrQixNQUFNLDRCQUE0QixDQUFDOzs7Ozs7OztBQVNuRixNQUFNLE9BQU8seUJBQXlCO0lBMEUxQjtJQUNBO0lBQ0Q7SUFDQztJQTNFRCxRQUFRLENBQVM7SUFDakIsT0FBTyxDQUFTO0lBQ2hCLFVBQVUsQ0FBUztJQUM1QixXQUFXLENBQVk7SUFDdkIsU0FBUyxDQUFVO0lBQ25CLFVBQVUsR0FBMEIsRUFBRSxDQUFDO0lBQ3ZDLG1CQUFtQixHQUFVLEVBQUUsQ0FBQztJQUNoQyxlQUFlLEdBQVUsRUFBRSxDQUFDO0lBQzVCLFlBQVksR0FBVSxFQUFFLENBQUM7SUFDekIsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUN6QixXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEMsVUFBVSxDQUFTO0lBQ25CLFlBQVksQ0FBUztJQUNyQixhQUFhLENBQVM7SUFDdEIsd0JBQXdCLEdBQUcsSUFBSSxlQUFlLENBQW1DLFNBQVMsQ0FBQyxDQUFDO0lBQzVGLGtCQUFrQixHQUFVLEVBQUUsQ0FBQztJQUNkLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRTFDLHNFQUFzRTtJQUN0RSw4REFBOEQ7SUFDOUQsaUNBQWlDO0lBQ2pDLDZEQUE2RDtJQUM3RCxxREFBcUQ7SUFDckQseUNBQXlDO0lBQ3pDLGNBQWMsR0FBd0UsRUFBRSxDQUFDO0lBQ3pGLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsK0NBQStDO0lBQ3ZDLGlCQUFpQixHQUEyQixFQUFFLENBQUM7SUFFdkQsZUFBZSxHQUFHO1FBQ2hCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO1FBQ2xDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0tBQy9CLENBQUM7SUFDRixlQUFlLEdBQUc7UUFDaEIsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUU7UUFDeEMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDbEMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFO1FBQzVELEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO0tBQ3JDLENBQUM7SUFDRiwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLG1FQUFtRTtJQUNuRSx5QkFBeUIsR0FBRztRQUMxQixFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtRQUN4QyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtLQUNuRCxDQUFDO0lBQ0YsbUJBQW1CLEdBQUc7UUFDcEIsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDdEMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7UUFDeEMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7UUFDN0MsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7S0FDckMsQ0FBQztJQUNGLGtCQUFrQixHQUFHO1FBQ25CLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1FBQzFCLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1FBQzFCLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1FBQzFCLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0tBQzNCLENBQUM7SUFDRixvQkFBb0IsR0FBRztRQUNyQixFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtRQUMzQyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtLQUMvQyxDQUFDO0lBQ2dDLFNBQVMsQ0FBd0I7SUFFbkUsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUNsQixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDZixlQUFlLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFFZCxZQUNVLEVBQWUsRUFDZixjQUE4QixFQUMvQixRQUF3QixFQUN2QixZQUEwQjtRQUgxQixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQy9CLGFBQVEsR0FBUixRQUFRLENBQWdCO1FBQ3ZCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBRWxDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUNoQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixZQUFZLENBQUMsSUFBSSxDQUFDLEVBQ2xCLG9CQUFvQixFQUFFLENBQ3ZCLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTO2dCQUFFLE9BQU87WUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7WUFDdEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5RixJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtvQkFDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTt3QkFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztvQkFDbkMsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDZCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7NEJBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRTtnQ0FDbkQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFO29DQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztvQ0FDdEMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO3dDQUNuQixJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzt3Q0FDeEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7cUNBQ3RCO29DQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2lDQUNuQjs0QkFDSCxDQUFDLENBQUMsQ0FBQzt5QkFDSjs2QkFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7eUJBQzVCO29CQUNILENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDUDtZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFDbkgsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQ2hKLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUF1QjtRQUMvRyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN6QixTQUFTLEVBQUUsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25ELFFBQVEsRUFBRSxDQUFDLFFBQVEsSUFBSSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEQscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQixJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNGLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDaEIsY0FBYyxFQUFFLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxjQUFjLEVBQUUsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1lBQ3RDLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsS0FBSyxFQUFFLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNwQixPQUFPLEVBQUUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDeEIsYUFBYSxFQUFFLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztZQUNwQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2QsTUFBTSxFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUN0QixrRUFBa0U7WUFDbEUsNERBQTREO1lBQzVELE9BQU8sRUFBRSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUM7WUFDNUMsUUFBUSxFQUFFLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQztZQUNoQyxtRUFBbUU7WUFDbkUsbUVBQW1FO1lBQ25FLGtCQUFrQixFQUFFLENBQUMsa0JBQWtCLElBQUksVUFBVSxDQUFDO1lBQ3RELHFCQUFxQixFQUFFLENBQUMscUJBQXFCLElBQUksS0FBSyxDQUFDO1lBQ3ZELGVBQWUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLGVBQWUsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ25FLFlBQVksRUFBRSxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUM7WUFDekMsV0FBVyxFQUFFLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztZQUNoQyxpQkFBaUIsRUFBRSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztZQUM1QyxjQUFjLEVBQUUsQ0FBQyxjQUFjLElBQUksS0FBSyxDQUFDO1lBQ3pDLFNBQVMsRUFBRSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7WUFDL0IsY0FBYyxFQUFFLENBQUMsY0FBYyxJQUFJLEtBQUssQ0FBQztZQUN6QyxRQUFRLEVBQUUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQzFCLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUMxQixRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3pCLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztTQUNYLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFvQztRQUNwRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN6QixTQUFTLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0MsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLHFCQUFxQixFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNULGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNwQixjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDcEIsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ1YsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2IsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2IsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ25CLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNSLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNaLDJEQUEyRDtZQUMzRCxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3pCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixrRUFBa0U7WUFDbEUsd0RBQXdEO1lBQ3hELGtCQUFrQixFQUFFLENBQUMsVUFBVSxDQUFDO1lBQ2hDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxDQUFDO1lBQzlCLGVBQWUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDaEQsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNqQixpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2QixjQUFjLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDdkIsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3RCLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN2QixRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDZCxVQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDMUIsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUMxQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBYyxDQUFDO0lBQ3JELENBQUM7SUFFRCxXQUFXLENBQUMsR0FBVyxFQUFFLEdBQVc7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQVc7UUFDdkIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFO1lBQ2hELElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDN0YsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7b0JBQ2pCLElBQUksR0FBRyxFQUFFLElBQUksRUFBRTt3QkFDYixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7NEJBQzFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUU7Z0NBQ2pDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDOzZCQUNwSDt3QkFDSCxDQUFDLENBQUMsQ0FBQzt3QkFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDbEM7Z0JBQ0gsQ0FBQzthQUNGLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUU7b0JBQ2pDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUNwSDtZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsRUFBRSxVQUFVLEVBQTJCO1FBQ3pELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQXdCO1lBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDeEIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDMUIsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzVCLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZTtZQUM3QixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDeEIsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ3ZCLFVBQVUsRUFBRSxVQUFVO1NBQ3ZCLENBQUM7UUFFRixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtZQUN0QixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRTtvQkFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU07b0JBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDckU7U0FDRjtRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDckYsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdDLElBQUksVUFBVSxFQUFFO29CQUNkLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFO3dCQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztxQkFDbEk7b0JBQ0QsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7d0JBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUM3SDtvQkFDRCxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRTt3QkFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQzVIO2lCQUNGO2dCQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNuRCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUU7Z0JBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBVSxFQUFFLGNBQXNCLEVBQUUsT0FBZTtRQUM5RCxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDekMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQ2xHO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDekk7YUFBTTtZQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLENBQ3BHLENBQUM7WUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3pDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUN2RTtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsS0FBVSxFQUFFLGNBQXNCO1FBQ2xELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUM1QyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRTtvQkFDbkQsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ3RDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7cUJBQ3BHO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1NBQ3ZKO2FBQU07WUFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUMzRCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDckgsQ0FBQztZQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDekMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRTtvQkFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2lCQUNyRjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsY0FBc0IsRUFBRSxPQUFlO1FBQzVELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELDBCQUEwQixDQUFDLGNBQXNCO1FBQy9DLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7SUFDdEssQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFhO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQVU7UUFDMUIsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUN2QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQVUsRUFBRSxHQUFXO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUEwQixDQUFDO1FBQy9DLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssRUFBRTtZQUN6QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQ25DLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFVO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUN6QixJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssU0FBUztnQkFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakcsSUFBSSxHQUFHLENBQUMsV0FBVyxLQUFLLE9BQU87Z0JBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVGLElBQUksR0FBRyxDQUFDLFdBQVcsS0FBSyxNQUFNO2dCQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3RixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQVUsRUFBRSxjQUFzQjtRQUMvQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLFdBQVcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQUU7WUFDekQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsUUFBUSxDQUN0RSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNuRixDQUFDO1NBQ0g7UUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksT0FBTyxFQUFFO1lBQ3pCLE1BQU0sVUFBVSxHQUFHLGtEQUFrRCxDQUFDO1lBQ3RFLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxRQUFRLENBQ3RFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDL0YsQ0FBQztnQkFDRixLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7YUFDekI7U0FDRjtJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsS0FBYSxFQUFFLGNBQXNCO1FBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLFFBQVEsQ0FDdEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUM3RyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFjO1FBQ25CLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxNQUFNLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN4RDthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7WUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7U0FDeEI7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFFBQVEsQ0FBQyxjQUFzQjtRQUM3QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUU7WUFDakUsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxLQUFLLFlBQVksRUFBRTtnQkFDbkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUMvRTtTQUNGO2FBQU07WUFDTCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLEtBQUssWUFBWSxFQUFFO2dCQUNuRixJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDdEY7aUJBQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxLQUFLLGlCQUFpQixFQUFFO2dCQUMvRixJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQy9FO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsUUFBUSxDQUFDLFVBQWUsRUFBRSxHQUFXO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsT0FBTyxFQUFFO1lBQ3BFLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckUsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDdEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUN4RixJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25FLE9BQU87U0FDUjtRQUVELE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUU3QixLQUFLLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRTtZQUM1QixJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2xDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVM7b0JBQUUsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDM0Q7U0FDRjtRQUVELElBQUksVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNsQixJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDM0QsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7b0JBQ2pCLElBQUksR0FBRyxFQUFFLElBQUksRUFBRTt3QkFDYixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsb0NBQW9DLENBQUMsQ0FBQztxQkFDekU7Z0JBQ0gsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDbEIsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUU7d0JBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ2xEO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7cUJBQ25FO2dCQUNILENBQUM7YUFDRixDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzNELElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO29CQUNqQixJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUU7d0JBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7cUJBQ3pFO2dCQUNILENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7b0JBQ2xCLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFO3dCQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUNsRDt5QkFBTTt3QkFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO3FCQUNuRTtnQkFDSCxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDNUYsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRTtvQkFDM0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUM7aUJBQ2hHO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxRQUFRLENBQUMsR0FBVztRQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQVU7UUFDckIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxjQUFzQixFQUFFLFdBQW1CO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BGLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUM7UUFDdkUsT0FBTyxLQUFLLEVBQUUsYUFBYSxJQUFJLGNBQWMsQ0FBQztJQUNoRCxDQUFDO0lBRUQscUJBQXFCLENBQUMsY0FBc0IsRUFBRSxXQUFtQixFQUFFLEtBQVU7UUFDM0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDcEYsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUMsQ0FBQztRQUMxRSxJQUFJLFFBQVEsRUFBRTtZQUNaLFFBQVEsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDN0M7YUFBTTtZQUNMLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNuRTtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELDJCQUEyQixDQUFDLGNBQXNCLEVBQUUsV0FBbUIsRUFBRSxLQUFhO1FBQ3BGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUM7UUFDMUUsSUFBSSxRQUFRLEVBQUU7WUFDWixRQUFRLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztTQUNoQzthQUFNO1lBQ0wsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN0RDtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQVk7UUFDNUIsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDO2FBQzVDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxvREFBb0Q7SUFDbkMsZUFBZSxHQUEyQjtRQUN6RCxJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsSUFBSSxFQUFFLFFBQVE7UUFDZCxJQUFJLEVBQUUsWUFBWTtRQUNsQixJQUFJLEVBQUUsYUFBYTtRQUNuQixJQUFJLEVBQUUsU0FBUztRQUNmLElBQUksRUFBRSxPQUFPO1FBQ2IsSUFBSSxFQUFFLFdBQVc7UUFDakIsSUFBSSxFQUFFLGVBQWU7UUFDckIsSUFBSSxFQUFFLE9BQU87UUFDYixJQUFJLEVBQUUsUUFBUTtRQUNkLElBQUksRUFBRSxtQkFBbUI7UUFDekIsSUFBSSxFQUFFLFVBQVU7UUFDaEIsSUFBSSxFQUFFLFNBQVM7UUFDZixJQUFJLEVBQUUsU0FBUztRQUNmLElBQUksRUFBRSxTQUFTO1FBQ2YsSUFBSSxFQUFFLFdBQVc7UUFDakIsSUFBSSxFQUFFLE9BQU87UUFDYixJQUFJLEVBQUUsYUFBYTtRQUNuQixJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJLEVBQUUsUUFBUTtRQUNkLElBQUksRUFBRSxjQUFjO1FBQ3BCLElBQUksRUFBRSxnQkFBZ0I7UUFDdEIsSUFBSSxFQUFFLFNBQVM7UUFDZixJQUFJLEVBQUUsZUFBZTtRQUNyQixJQUFJLEVBQUUsMENBQTBDO1FBQ2hELElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSxzQkFBc0I7UUFDNUIsSUFBSSxFQUFFLFdBQVc7UUFDakIsSUFBSSxFQUFFLEtBQUs7UUFDWCxJQUFJLEVBQUUsYUFBYTtRQUNuQixJQUFJLEVBQUUsUUFBUTtRQUNkLElBQUksRUFBRSxZQUFZO1FBQ2xCLElBQUksRUFBRSxZQUFZO1FBQ2xCLElBQUksRUFBRSw2QkFBNkI7UUFDbkMsSUFBSSxFQUFFLFdBQVc7UUFDakIsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixJQUFJLEVBQUUsUUFBUTtRQUNkLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsSUFBSSxFQUFFLHFCQUFxQjtLQUM1QixDQUFDO0lBRUYsV0FBVyxDQUFDLGNBQXNCLEVBQUUsS0FBYTtRQUMvQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRixJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2xCLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUM3QyxPQUFPO1NBQ1I7UUFDRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksU0FBUyxFQUFFO1lBQ2IsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLEdBQUcsU0FBUyxLQUFLLElBQUksR0FBRyxDQUFDLENBQUM7U0FDdkQ7YUFBTTtZQUNMLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNqQztRQUVELHFFQUFxRTtRQUNyRSx3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLDZEQUE2RDtRQUM3RCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLEVBQUU7WUFDdkUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNoRDthQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7WUFDMUIsbUVBQW1FO1lBQ25FLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztTQUM5QztJQUNILENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxjQUFzQixFQUFFLEdBQVc7UUFDOUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDaEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDNUUsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLGtFQUFrRTtnQkFDbEUscUVBQXFFO2dCQUNyRSwyQ0FBMkM7Z0JBQzNDLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNuRCxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtvQkFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxVQUFVLENBQUM7b0JBQ2pELE9BQU87aUJBQ1I7Z0JBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3BELG9FQUFvRTtnQkFDcEUsb0VBQW9FO2dCQUNwRSwwQkFBMEI7Z0JBQzFCLE1BQU0sS0FBSyxHQUF3QixFQUFFLENBQUM7Z0JBQ3RDLElBQUksT0FBTyxDQUFDLFNBQVM7b0JBQUUsS0FBSyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDaEcsSUFBSSxPQUFPLENBQUMsY0FBYztvQkFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO2dCQUM3RSxJQUFJLE9BQU8sQ0FBQyxjQUFjO29CQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7Z0JBQzdFLElBQUksT0FBTyxDQUFDLElBQUk7b0JBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQy9DLElBQUksT0FBTyxDQUFDLEtBQUs7b0JBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ2xELElBQUksT0FBTyxDQUFDLE9BQU87b0JBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ3hELElBQUksT0FBTyxDQUFDLE9BQU87b0JBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ3hELElBQUksT0FBTyxDQUFDLGFBQWE7b0JBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7Z0JBQzFFLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ2hELENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDbEIsbUVBQW1FO2dCQUNuRSwrREFBK0Q7Z0JBQy9ELFlBQVk7Z0JBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxHQUFHLEVBQUUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbkYsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBanBCVSx5QkFBeUI7NEZBQXpCLHlCQUF5Qix5TEFpRXpCLHFCQUFxQixnREM3RWxDLGt1MURBNnhCTTs7NEZEanhCTyx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0Usd0JBQXdCO3FLQU16QixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQTZENEIsU0FBUztzQkFBMUMsU0FBUzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCB0YWtlVW50aWwsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5nYkFjY29yZGlvbkRpcmVjdGl2ZSwgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJpbGxpbmctZ3JvdXAtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9iaWxsaW5nLWdyb3VwLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQmlsbGluZ0dyb3VwRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0IHtcblxuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nO1xuICBASW5wdXQoKSBncm91cElkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGN1cnJlbnRUYWI6IHN0cmluZztcbiAgYmlsbGluZ0Zvcm06IEZvcm1Hcm91cDtcbiAgc3VibWl0dGVkOiBib29sZWFuO1xuICBmaWx0ZXJEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10gPSBbXTtcbiAgc3Vic2NyaWJlZFN0b3JlTGlzdDogYW55W10gPSBbXTtcbiAgZmlsdGVyQ291bnRyaWVzOiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJTdGF0ZXM6IGFueVtdID0gW107XG4gIGZpbHRlckNpdGllczogYW55W10gPSBbXTtcbiAgc2VhcmNoSW5wdXQgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICBzZWFyY2hUZXJtOiBzdHJpbmc7XG4gIHNvcnRlZENvbHVtbjogc3RyaW5nO1xuICBzb3J0RGlyZWN0aW9uOiBudW1iZXI7XG4gIHN1YnNjcmliZWRTdG9yZXNBcGlTdGF0ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8J2luaXRpYWwnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCc+KCdpbml0aWFsJyk7XG4gIHN1YnNjcmliZWRQcm9kdWN0czogYW55W10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgLy8gR1NUSU4gbG9va3VwIHN0YXRlIHBlciBiaWxsaW5nLWdyb3VwIHJvdywga2V5ZWQgYnkgRm9ybUFycmF5IGluZGV4LlxuICAvLyAnaWRsZScgPSBubyBsb29rdXAgeWV0IChvciBHU1RJTiB0b28gc2hvcnQgdG8gdHJpZ2dlciBvbmUpLlxuICAvLyAnbG9hZGluZycgPSByZXF1ZXN0IGluIGZsaWdodC5cbiAgLy8gJ2ZvdW5kJyA9IGJhY2tlbmQgcmV0dXJuZWQgYW4gYWRkcmVzcywgZmllbGRzIGF1dG8tZmlsbGVkLlxuICAvLyAnbm90Zm91bmQnID0gYmFja2VuZCByZXR1cm5lZCA0MDQgLyB1bmtub3duIEdTVElOLlxuICAvLyAnZXJyb3InID0gbmV0d29yayBvciB1bmV4cGVjdGVkIGVycm9yLlxuICBnc3RMb29rdXBTdGF0ZTogUmVjb3JkPG51bWJlciwgJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ2ZvdW5kJyB8ICdub3Rmb3VuZCcgfCAnZXJyb3InPiA9IHt9O1xuICAvLyBUcmFjayB0aGUgbGFzdCBHU1RJTiB3ZSBzdWNjZXNzZnVsbHkgbG9va2VkIHVwIHBlciByb3cgc28gcmUtdHlwaW5nIHRoZVxuICAvLyBzYW1lIHZhbHVlIGRvZXNuJ3QgcmVmaXJlIHRoZSByZXF1ZXN0IChhbmQgYXZvaWQgY2xvYmJlcmluZyBtYW51YWwgZWRpdHNcbiAgLy8gdGhlIHVzZXIgbWF5IGhhdmUgbWFkZSBhZnRlciB0aGUgYXV0by1maWxsKS5cbiAgcHJpdmF0ZSBsYXN0TG9va2VkVXBHc3RpbjogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHt9O1xuXG4gIGdyb3VwVGFnT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAnc3RvcmUnLCBsYWJlbDogJ1N0b3JlJyB9LFxuICAgIHsgdmFsdWU6ICdnc3QnLCBsYWJlbDogJ0dTVCcgfVxuICBdO1xuICBjdXJyZW5jeU9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ2RvbGxhcicsIGxhYmVsOiAnRG9sbGFyICgkKScgfSxcbiAgICB7IHZhbHVlOiAnaW5yJywgbGFiZWw6ICdJTlIgKOKCuSknIH0sXG4gICAgeyB2YWx1ZTogJ3NpbmdhcG9yZWRvbGxhcicsIGxhYmVsOiAnU2luZ2Fwb3JlIERvbGxhciAoUyQpJyB9LFxuICAgIHsgdmFsdWU6ICdldXJvJywgbGFiZWw6ICdFdXJvICjigqwpJyB9LFxuICBdO1xuICAvLyBEcml2ZXMgd2hldGhlciB0aGUgYmFja2VuZCB3aWxsIGNhbGN1bGF0ZSBHU1QvSUdTVCBvbiBpbnZvaWNlcyBmb3IgdGhpc1xuICAvLyBncm91cC4gJ2ludGVybmF0aW9uYWwnIHNraXBzIHRheGVzIGVudGlyZWx5IHNvIHRoZSB0b3RhbEFtb3VudCBlcXVhbHNcbiAgLy8gdGhlIHN1YnRvdGFsLiBTZWUgZ3N0aW5Mb29rdXAg4oaSIGludm9pY2VDb250cm9sbGVyLmNyZWF0ZUludm9pY2UuXG4gIHRheENhbGN1bGF0aW9uVHlwZU9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ2RvbWVzdGljJywgbGFiZWw6ICdEb21lc3RpYycgfSxcbiAgICB7IHZhbHVlOiAnaW50ZXJuYXRpb25hbCcsIGxhYmVsOiAnSW50ZXJuYXRpb25hbCcgfSxcbiAgXTtcbiAgcGF5bWVudEN5Y2xlT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAnbW9udGhseScsIGxhYmVsOiAnTW9udGhseScgfSxcbiAgICB7IHZhbHVlOiAncXVhcnRlcicsIGxhYmVsOiAnUXVhcnRlcmx5JyB9LFxuICAgIHsgdmFsdWU6ICdoYWxmWWVhcmx5JywgbGFiZWw6ICdIYWxmIHllYXJseScgfSxcbiAgICB7IHZhbHVlOiAneWVhcmx5JywgbGFiZWw6ICdZZWFybHknIH1cbiAgXTtcbiAgcGF5bWVudFRlcm1PcHRpb25zID0gW1xuICAgIHsgdmFsdWU6IDMwLCBsYWJlbDogJzMwJyB9LFxuICAgIHsgdmFsdWU6IDQ1LCBsYWJlbDogJzQ1JyB9LFxuICAgIHsgdmFsdWU6IDYwLCBsYWJlbDogJzYwJyB9LFxuICAgIHsgdmFsdWU6IDkwLCBsYWJlbDogJzkwJyB9XG4gIF07XG4gIGJpbGxpbmdNZXRob2RPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdlYWNoU3RvcmUnLCBsYWJlbDogJ1N0b3JlIFdpc2UnIH0sXG4gICAgeyB2YWx1ZTogJ292ZXJhbGxTdG9yZScsIGxhYmVsOiAnQnJhbmQgV2lzZScgfVxuICBdO1xuICBAVmlld0NoaWxkKE5nYkFjY29yZGlvbkRpcmVjdGl2ZSkgYWNjb3JkaW9uOiBOZ2JBY2NvcmRpb25EaXJlY3RpdmU7XG5cbiAgaXRlbXNQZXJQYWdlID0gMTA7XG4gIGN1cnJlbnRQYWdlID0gMTtcbiAgdG90YWxJdGVtcyA9IDA7XG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcbiAgcGFnZVNpemUgPSAxMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGJpbGxpbmdTZXJ2aWNlOiBCaWxsaW5nU2VydmljZSxcbiAgICBwdWJsaWMgbW9kYWxSZWY6IE5nYkFjdGl2ZU1vZGFsLFxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5jcmVhdGVGb3JtKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmdldEJpbGxpbmdHcm91cHMoKTtcbiAgICB0aGlzLmdldENsaWVudFByb2R1Y3RzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHsgZ2V0RmlsdGVyczogdHJ1ZSB9KTtcblxuICAgIHRoaXMuc2VhcmNoSW5wdXQudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICBkZWJvdW5jZVRpbWUoMTAwMCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKS5zdWJzY3JpYmUoKHZhbCkgPT4ge1xuICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgdGhpcy5zZWFyY2hUZXJtID0gdmFsO1xuICAgICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBjcmVhdGVGb3JtKCkge1xuICAgIHRoaXMuYmlsbGluZ0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGdyb3VwczogdGhpcy5mYi5hcnJheShbXSksXG4gICAgfSk7XG4gIH1cblxuICBnZXRCaWxsaW5nR3JvdXBzKCkge1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0QWxsQmlsbGluZ0dyb3Vwcyh0aGlzLmNsaWVudElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzPy5kYXRhPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXMuZGF0YS5mb3JFYWNoKChncm91cDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhdGNoRm9ybUl0ZW0oeyAuLi5ncm91cCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmdldCgnX2lkJyk/LnZhbHVlID09PSB0aGlzLmdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZShpZHgudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VGFiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSh0aGlzLmN1cnJlbnRUYWIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIgPSAnJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBJZCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5kYXRhLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5hY2NvcmRpb24udG9nZ2xlKCcwJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHBhdGNoRm9ybUl0ZW0oeyBncm91cE5hbWUsIGdyb3VwVGFnLCByZWdpc3RlcmVkQ29tcGFueU5hbWUsIGdzdCwgYWRkcmVzc0xpbmVPbmUsIGFkZHJlc3NMaW5lVHdvLCBjaXR5LCBzdGF0ZSwgY291bnRyeSxcbiAgICBwaW5Db2RlLCBwbGFjZU9mU3VwcGx5LCBwbywgc3RvcmVzLCBwcm9SYXRhLCBwYXltZW50Q2F0ZWdvcnksIGN1cnJlbmN5LCB0YXhDYWxjdWxhdGlvblR5cGUsIGlzSW5zdGFsbGF0aW9uT25lVGltZSwgaW5zdGFsbGF0aW9uRmVlLCBwYXltZW50Q3ljbGUsXG4gICAgcGF5bWVudFRlcm0sIGdlbmVyYXRlSW52b2ljZVRvLCBhdHRhY2hBbm5leHVyZSwgaXNQcmltYXJ5LCBhZHZhbmNlSW52b2ljZSwgcHJvZHVjdHMsIF9pZCB9OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZ3JvdXBOYW1lOiBbZ3JvdXBOYW1lIHx8ICcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZ3JvdXBUYWc6IFtncm91cFRhZyB8fCAnc3RvcmUnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgcmVnaXN0ZXJlZENvbXBhbnlOYW1lOiBbKHJlZ2lzdGVyZWRDb21wYW55TmFtZSB8fCAnJykudG9VcHBlckNhc2UoKSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGdzdDogW2dzdCB8fCAnJ10sXG4gICAgICBhZGRyZXNzTGluZU9uZTogW2FkZHJlc3NMaW5lT25lIHx8ICcnXSxcbiAgICAgIGFkZHJlc3NMaW5lVHdvOiBbYWRkcmVzc0xpbmVUd28gfHwgJyddLFxuICAgICAgY2l0eTogW2NpdHkgfHwgJyddLFxuICAgICAgc3RhdGU6IFtzdGF0ZSB8fCAnJ10sXG4gICAgICBjb3VudHJ5OiBbY291bnRyeSB8fCAnJ10sXG4gICAgICBwaW5Db2RlOiBbcGluQ29kZSB8fCAnJ10sXG4gICAgICBwbGFjZU9mU3VwcGx5OiBbcGxhY2VPZlN1cHBseSB8fCAnJ10sXG4gICAgICBwbzogW3BvIHx8ICcnXSxcbiAgICAgIHN0b3JlczogW3N0b3JlcyB8fCBbXV0sXG4gICAgICAvLyBQcmljaW5nIG1ldGhvZDogJ3Byb3JhdGUnIChhY3R1YWwgd29ya2luZyBkYXlzKSBvciAnZmxhdCcgKGZ1bGxcbiAgICAgIC8vIG1vbnRoKS4gRGVmYXVsdCB0byAncHJvcmF0ZScgZm9yIHJlY29yZHMgd2l0aG91dCBhIHZhbHVlLlxuICAgICAgcHJvUmF0YTogW3Byb1JhdGEgPT09ICdmbGF0JyA/ICdmbGF0JyA6ICdwcm9yYXRlJ10sXG4gICAgICBwYXltZW50Q2F0ZWdvcnk6IFtwYXltZW50Q2F0ZWdvcnkgfHwgJ3Bvc3QnXSxcbiAgICAgIGN1cnJlbmN5OiBbY3VycmVuY3kgfHwgJ2RvbGxhciddLFxuICAgICAgLy8gRGVmYXVsdCB0byAnZG9tZXN0aWMnIHNvIGV4aXN0aW5nIHJlY29yZHMgKHdoaWNoIHdvbid0IGhhdmUgdGhpc1xuICAgICAgLy8gZmllbGQpIGJlaGF2ZSBleGFjdGx5IGFzIHRvZGF5IOKAlCBHU1QvSUdTVCBzdGlsbCBhcHBsaWVkIGZvciBJTlIuXG4gICAgICB0YXhDYWxjdWxhdGlvblR5cGU6IFt0YXhDYWxjdWxhdGlvblR5cGUgfHwgJ2RvbWVzdGljJ10sXG4gICAgICBpc0luc3RhbGxhdGlvbk9uZVRpbWU6IFtpc0luc3RhbGxhdGlvbk9uZVRpbWUgfHwgZmFsc2VdLFxuICAgICAgaW5zdGFsbGF0aW9uRmVlOiBbeyB2YWx1ZTogaW5zdGFsbGF0aW9uRmVlIHx8ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcbiAgICAgIHBheW1lbnRDeWNsZTogW3BheW1lbnRDeWNsZSB8fCAnbW9udGhseSddLFxuICAgICAgcGF5bWVudFRlcm06IFtwYXltZW50VGVybSB8fCAzMF0sXG4gICAgICBnZW5lcmF0ZUludm9pY2VUbzogW2dlbmVyYXRlSW52b2ljZVRvIHx8IFtdXSxcbiAgICAgIGF0dGFjaEFubmV4dXJlOiBbYXR0YWNoQW5uZXh1cmUgfHwgZmFsc2VdLFxuICAgICAgaXNQcmltYXJ5OiBbaXNQcmltYXJ5IHx8IGZhbHNlXSxcbiAgICAgIGFkdmFuY2VJbnZvaWNlOiBbYWR2YW5jZUludm9pY2UgfHwgZmFsc2VdLFxuICAgICAgcHJvZHVjdHM6IFtwcm9kdWN0cyB8fCBbXV0sXG4gICAgICBjdXJyZW50VGFiOiBbJ2Jhc2ljLWluZm8nXSxcbiAgICAgIGNsaWVudElkOiBbdGhpcy5jbGllbnRJZF0sXG4gICAgICBfaWQ6IFtfaWRdXG4gICAgfSk7XG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLnB1c2goaXRlbSk7XG4gIH1cblxuICBhZGRGb3JtSXRlbSh7IGlzUHJpbWFyeSwgZ3JvdXBOYW1lIH06IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCBzdHJpbmc+KSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZ3JvdXBOYW1lOiBbZ3JvdXBOYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgZ3JvdXBUYWc6IFsnc3RvcmUnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgcmVnaXN0ZXJlZENvbXBhbnlOYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBnc3Q6IFsnJ10sXG4gICAgICBhZGRyZXNzTGluZU9uZTogWycnXSxcbiAgICAgIGFkZHJlc3NMaW5lVHdvOiBbJyddLFxuICAgICAgY2l0eTogWycnXSxcbiAgICAgIHN0YXRlOiBbJyddLFxuICAgICAgY291bnRyeTogWycnXSxcbiAgICAgIHBpbkNvZGU6IFsnJ10sXG4gICAgICBwbGFjZU9mU3VwcGx5OiBbJyddLFxuICAgICAgcG86IFsnJ10sXG4gICAgICBzdG9yZXM6IFtbXV0sXG4gICAgICAvLyBOZXcgcmVjb3JkcyBhbHdheXMgc3RhcnQgd2l0aCAncHJvcmF0ZSc7IGZsYXQgaXMgb3B0LWluLlxuICAgICAgcHJvUmF0YTogWydwcm9yYXRlJ10sXG4gICAgICBwYXltZW50Q2F0ZWdvcnk6IFsncG9zdCddLFxuICAgICAgY3VycmVuY3k6IFsnZG9sbGFyJ10sXG4gICAgICAvLyBEZWZhdWx0ICdkb21lc3RpYycgc28gdGhlIGV4aXN0aW5nIEdTVC9JR1NUIGxvZ2ljIHN0aWxsIGFwcGxpZXNcbiAgICAgIC8vIHVubGVzcyB0aGUgdXNlciBleHBsaWNpdGx5IHN3aXRjaGVzIHRvIGludGVybmF0aW9uYWwuXG4gICAgICB0YXhDYWxjdWxhdGlvblR5cGU6IFsnZG9tZXN0aWMnXSxcbiAgICAgIGlzSW5zdGFsbGF0aW9uT25lVGltZTogW2ZhbHNlXSxcbiAgICAgIGluc3RhbGxhdGlvbkZlZTogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcbiAgICAgIHBheW1lbnRDeWNsZTogWydtb250aGx5J10sXG4gICAgICBwYXltZW50VGVybTogWzMwXSxcbiAgICAgIGdlbmVyYXRlSW52b2ljZVRvOiBbW11dLFxuICAgICAgYXR0YWNoQW5uZXh1cmU6IFtmYWxzZV0sXG4gICAgICBpc1ByaW1hcnk6IFtpc1ByaW1hcnldLFxuICAgICAgYWR2YW5jZUludm9pY2U6IFtmYWxzZV0sXG4gICAgICBwcm9kdWN0czogW1tdXSxcbiAgICAgIGN1cnJlbnRUYWI6IFsnYmFzaWMtaW5mbyddLFxuICAgICAgY2xpZW50SWQ6IFt0aGlzLmNsaWVudElkXVxuICAgIH0pO1xuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5wdXNoKGl0ZW0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5hY2NvcmRpb24udG9nZ2xlKGAke3RoaXMuYmlsbGluZ0dyb3Vwcy5sZW5ndGggLSAxfWApO1xuICAgIH0sIDApO1xuICB9XG5cbiAgZ2V0IGJpbGxpbmdHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmlsbGluZ0Zvcm0uZ2V0KCdncm91cHMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBvblRhYkNoYW5nZShpZHg6IG51bWJlciwgdmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUodmFsKTtcbiAgfVxuXG4gIG9uRGVsZXRlR3JvdXAoaWR4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdfaWQnKT8udmFsdWUpIHtcbiAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZGVsZXRlQmlsbGluZ0dyb3VwKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnX2lkJyk/LnZhbHVlKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzPy5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICAgIGlmIChncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGdyb3VwLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi5ncm91cC5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgLi4udGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdzdG9yZXMnKT8udmFsdWVdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMucmVtb3ZlQXQoaWR4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgIGlmIChncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSkge1xuICAgICAgICAgIGdyb3VwLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi5ncm91cC5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgLi4udGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdzdG9yZXMnKT8udmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMucmVtb3ZlQXQoaWR4KTtcbiAgICB9XG4gIH1cblxuICBnZXRTdWJzY3JpYmVkU3RvcmVzKHsgZ2V0RmlsdGVycyB9OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPikge1xuICAgIHRoaXMuc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlLm5leHQoJ2xvYWRpbmcnKTtcbiAgICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgbGltaXQ6IHRoaXMucGFnZVNpemUsXG4gICAgICBvZmZzZXQ6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcbiAgICAgIHNvcnRDb2x1bW46IHRoaXMuc29ydGVkQ29sdW1uLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnREaXJlY3Rpb24sXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5zZWFyY2hUZXJtLFxuICAgICAgY291bnRyeTogdGhpcy5maWx0ZXJDb3VudHJpZXMsXG4gICAgICBzdGF0ZTogdGhpcy5maWx0ZXJTdGF0ZXMsXG4gICAgICBjaXR5OiB0aGlzLmZpbHRlckNpdGllcyxcbiAgICAgIGdldEZpbHRlcnM6IGdldEZpbHRlcnNcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAoZGF0YVtrZXldID09PSB1bmRlZmluZWQgfHwgZGF0YVtrZXldID09PSAnJykgZGVsZXRlIGRhdGFba2V5XTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSAmJiAhZGF0YVtrZXldLmxlbmd0aCkgZGVsZXRlIGRhdGFba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldFN1YnNjcmliZWRTdG9yZXMoZGF0YSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVkU3RvcmVzQXBpU3RhdGUubmV4dCgnbG9hZGVkJyk7XG4gICAgICAgIGlmIChnZXRGaWx0ZXJzKSB7XG4gICAgICAgICAgaWYgKHJlcz8uZGF0YT8uY291bnRyaWVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YS5wdXNoKHsgRGVzY3JpcHRpb246ICdDb3VudHJ5JywgSXNzdWVzOiByZXMuZGF0YS5jb3VudHJpZXMubWFwKCh2YWw6IGFueSkgPT4gKHsgdGV4dDogdmFsLl9pZCwgaWQ6IHZhbC5faWQgfSkpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzPy5kYXRhPy5zdGF0ZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJEYXRhLnB1c2goeyBEZXNjcmlwdGlvbjogJ1N0YXRlJywgSXNzdWVzOiByZXMuZGF0YS5zdGF0ZXMubWFwKCh2YWw6IGFueSkgPT4gKHsgdGV4dDogdmFsLl9pZCwgaWQ6IHZhbC5faWQgfSkpIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzPy5kYXRhPy5jaXRpZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJEYXRhLnB1c2goeyBEZXNjcmlwdGlvbjogJ0NpdHknLCBJc3N1ZXM6IHJlcy5kYXRhLmNpdGllcy5tYXAoKHZhbDogYW55KSA9PiAoeyB0ZXh0OiB2YWwuX2lkLCBpZDogdmFsLl9pZCB9KSkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHJlcz8uZGF0YT8ucGFnZUluZm8/LmNvdW50IHx8IDA7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdCA9IHJlcz8uZGF0YT8uZGF0YSB8fCBbXTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uU3RvcmVDaGVjayhldmVudDogYW55LCBmb3JtQXJyYXlJbmRleDogbnVtYmVyLCBzdG9yZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS5nZXQoJ3N0b3JlcycpPy52YWx1ZS5pbmNsdWRlcyhzdG9yZUlkKSkge1xuICAgICAgICAgIGl0ZW0uZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoaXRlbS5nZXQoJ3N0b3JlcycpPy52YWx1ZS5maWx0ZXIoKHZhbDogc3RyaW5nKSA9PiB2YWwgIT09IHN0b3JlSWQpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi50aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLCBzdG9yZUlkXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoXG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICE9PSBzdG9yZUlkKVxuICAgICAgKTtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSkge1xuICAgICAgICAgIGl0ZW0uZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoWy4uLml0ZW0uZ2V0KCdzdG9yZXMnKT8udmFsdWUsIHN0b3JlSWRdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25TZWxlY3RBbGxTdG9yZXMoZXZlbnQ6IGFueSwgZm9ybUFycmF5SW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHN1YnNjcmliZWRTdG9yZUlkcyA9IHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdC5tYXAoaXRlbSA9PiBpdGVtLnN0b3JlSWQpO1xuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICAgIGdyb3VwLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZvckVhY2goKHN0b3JlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoc3Vic2NyaWJlZFN0b3JlSWRzLmluY2x1ZGVzKHN0b3JlKSkge1xuICAgICAgICAgICAgZ3JvdXAuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoZ3JvdXAuZ2V0KCdzdG9yZXMnKT8udmFsdWUuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09IHN0b3JlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4udGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgLi4uc3Vic2NyaWJlZFN0b3JlSWRzXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoXG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUuZmlsdGVyKChpdGVtOiBhbnkpID0+ICFzdWJzY3JpYmVkU3RvcmVJZHMuaW5jbHVkZXMoaXRlbSkpXG4gICAgICApO1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlKSB7XG4gICAgICAgICAgaXRlbS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4uaXRlbS5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgLi4uc3Vic2NyaWJlZFN0b3JlSWRzXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlzU3RvcmVTZWxlY3RlZEluR3JvdXAoZm9ybUFycmF5SW5kZXg6IG51bWJlciwgc3RvcmVJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUuaW5jbHVkZXMoc3RvcmVJZCk7XG4gIH1cblxuICBpc0FsbFN0b3Jlc1NlbGVjdGVkSW5Hcm91cChmb3JtQXJyYXlJbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdC5ldmVyeShpdGVtID0+IHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUuaW5jbHVkZXMoaXRlbS5zdG9yZUlkKSkgJiYgdGhpcy5zdWJzY3JpYmVkU3RvcmVMaXN0Lmxlbmd0aDtcbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShldmVudDogbnVtYmVyKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IGV2ZW50O1xuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSk7XG4gIH1cblxuICBvblBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLnBhZ2VTaXplID0gZXZlbnQ7XG4gICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBldmVudDtcbiAgICB0aGlzLmdldFN1YnNjcmliZWRTdG9yZXMoe30pO1xuICB9XG5cbiAgb21pdF9zcGVjaWFsX2NoYXIoZXZlbnQ6IGFueSkge1xuICAgIHZhciBrID0gZXZlbnQuY2hhckNvZGU7XG4gICAgcmV0dXJuIChrID09IDggfHwgayA9PSAzMiB8fCAoayA+PSA0OCAmJiBrIDw9IDU3KSk7XG4gIH1cblxuICBmb3JjZVVwcGVyY2FzZShldmVudDogYW55LCBpZHg6IG51bWJlcikge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdXBwZXIgPSBpbnB1dC52YWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChpbnB1dC52YWx1ZSAhPT0gdXBwZXIpIHtcbiAgICAgIGNvbnN0IGNhcmV0ID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICBpbnB1dC52YWx1ZSA9IHVwcGVyO1xuICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXQsIGNhcmV0KTtcbiAgICB9XG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uc2V0VmFsdWUodXBwZXIsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVycyhldmVudDogYW55KSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgZXZlbnQuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgICAgIGlmICh2YWwuRGVzY3JpcHRpb24gPT09ICdDb3VudHJ5JykgdGhpcy5maWx0ZXJDb3VudHJpZXMgPSB2YWwuSXNzdWVzLm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmlkKTtcbiAgICAgIGlmICh2YWwuRGVzY3JpcHRpb24gPT09ICdTdGF0ZScpIHRoaXMuZmlsdGVyU3RhdGVzID0gdmFsLklzc3Vlcy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCk7XG4gICAgICBpZiAodmFsLkRlc2NyaXB0aW9uID09PSAnQ2l0eScpIHRoaXMuZmlsdGVyQ2l0aWVzID0gdmFsLklzc3Vlcy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCk7XG4gICAgfSk7XG4gICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KTtcbiAgfVxuXG4gIG9uRW1haWxLZXlEb3duKGV2ZW50OiBhbnksIGZvcm1BcnJheUluZGV4OiBudW1iZXIpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoZXZlbnQuY29kZSA9PSAnQmFja3NwYWNlJyAmJiBldmVudC50YXJnZXQudmFsdWUgPT0gJycpIHtcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy5zZXRWYWx1ZShcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlLnNsaWNlKDAsIC0xKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmNvZGUgPT0gJ0VudGVyJykge1xuICAgICAgY29uc3QgZW1haWxSZWdleCA9IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLztcbiAgICAgIGlmIChlbWFpbFJlZ2V4LnRlc3QoZXZlbnQudGFyZ2V0LnZhbHVlKSkge1xuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8uc2V0VmFsdWUoXG4gICAgICAgICAgWy4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZSwgZXZlbnQudGFyZ2V0LnZhbHVlXVxuICAgICAgICApO1xuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVFbWFpbENoaXAoZW1haWw6IHN0cmluZywgZm9ybUFycmF5SW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy5zZXRWYWx1ZShcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZS5maWx0ZXIoKHZhbDogc3RyaW5nKSA9PiB2YWwgIT09IGVtYWlsKVxuICAgICk7XG4gIH1cblxuICBvblNvcnQoY29sdW1uOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5zb3J0ZWRDb2x1bW4gPT09IGNvbHVtbikge1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gdGhpcy5zb3J0RGlyZWN0aW9uID09PSAxID8gLTEgOiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvcnRlZENvbHVtbiA9IGNvbHVtbjtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IDE7XG4gICAgfVxuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSk7XG4gIH1cblxuICBuYXZpZ2F0ZShmb3JtQXJyYXlJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKCdzZXR0aW5ncycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJykge1xuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnc3RvcmUtc2VsZWN0aW9uJyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc3RvcmUtc2VsZWN0aW9uJykge1xuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnc2V0dGluZ3MnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRCaWxsaW5nR3JvdXAoKSB7XG4gICAgdGhpcy5hZGRGb3JtSXRlbSh7IGdyb3VwTmFtZTogYEdyb3VwICR7dGhpcy5iaWxsaW5nR3JvdXBzLmxlbmd0aCArIDF9YCwgaXNQcmltYXJ5OiBmYWxzZSB9KTtcbiAgfVxuXG4gIG9uU3VibWl0KGZvcm1WYWx1ZXM6IGFueSwgaWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaW52YWxpZCkge1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKCdiYXNpYy1pbmZvJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgZW1haWwgaW4gR2VuZXJhdGUgSW52b2ljZSBUbycpO1xuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKCdzZXR0aW5ncycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRlbGV0ZSBmb3JtVmFsdWVzLmN1cnJlbnRUYWI7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtVmFsdWVzKSB7XG4gICAgICBpZiAoZm9ybVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmIChmb3JtVmFsdWVzW2tleV0gPT09IHVuZGVmaW5lZCkgZGVsZXRlIGZvcm1WYWx1ZXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZm9ybVZhbHVlcy5faWQpIHtcbiAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UudXBkYXRlQmlsbGluZ0dyb3VwKGZvcm1WYWx1ZXMpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXM/LmRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMubW9kYWxSZWYuY2xvc2UoJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFByaW1hcnlUb2FzdCgnQmlsbGluZyBncm91cCB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChlcnIuZXJyb3I/LmNvZGUgPT09IDQwMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChlcnIuZXJyb3IuZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gdXBkYXRlIGJpbGxpbmcgZ3JvdXAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmNyZWF0ZUJpbGxpbmdHcm91cChmb3JtVmFsdWVzKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzPy5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGFsUmVmLmNsb3NlKCdzdWNjZXNzJyk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRQcmltYXJ5VG9hc3QoJ0JpbGxpbmcgZ3JvdXAgY3JlYXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZXJyLmVycm9yPy5jb2RlID09PSA0MDApIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyLmVycm9yLmVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGNyZWF0ZSBiaWxsaW5nIGdyb3VwJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRDbGllbnRQcm9kdWN0cygpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldENsaWVudFByb2R1Y3RzKHRoaXMuY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXM/LmRhdGE/LnBsYW5EZXRhaWxzPy5wcm9kdWN0Py5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnN1YnNjcmliZWRQcm9kdWN0cyA9IHJlcy5kYXRhLnBsYW5EZXRhaWxzLnByb2R1Y3QuZmlsdGVyKChwOiBhbnkpID0+IHAuc3RhdHVzID09PSAnbGl2ZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbkNhbmNlbChpZHg6IG51bWJlcikge1xuICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZShpZHgudG9TdHJpbmcoKSk7XG4gIH1cblxuICBwcmV2ZW50RW50ZXIoZXZlbnQ6IGFueSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBnZXRQcm9kdWN0QmlsbGluZ01ldGhvZChmb3JtQXJyYXlJbmRleDogbnVtYmVyLCBwcm9kdWN0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm9kdWN0cyA9IHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdwcm9kdWN0cycpPy52YWx1ZSB8fCBbXTtcbiAgICBjb25zdCBmb3VuZCA9IHByb2R1Y3RzLmZpbmQoKHA6IGFueSkgPT4gcC5wcm9kdWN0TmFtZSA9PT0gcHJvZHVjdE5hbWUpO1xuICAgIHJldHVybiBmb3VuZD8uYmlsbGluZ01ldGhvZCB8fCAnb3ZlcmFsbFN0b3JlJztcbiAgfVxuXG4gIG9uQmlsbGluZ01ldGhvZENoYW5nZShmb3JtQXJyYXlJbmRleDogbnVtYmVyLCBwcm9kdWN0TmFtZTogc3RyaW5nLCBldmVudDogYW55KSB7XG4gICAgY29uc3QgcHJvZHVjdHMgPSB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgncHJvZHVjdHMnKT8udmFsdWUgfHwgW107XG4gICAgY29uc3QgZXhpc3RpbmcgPSBwcm9kdWN0cy5maW5kKChwOiBhbnkpID0+IHAucHJvZHVjdE5hbWUgPT09IHByb2R1Y3ROYW1lKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGV4aXN0aW5nLmJpbGxpbmdNZXRob2QgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2R1Y3RzLnB1c2goeyBwcm9kdWN0TmFtZSwgYmlsbGluZ01ldGhvZDogZXZlbnQudGFyZ2V0LnZhbHVlIH0pO1xuICAgIH1cbiAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgncHJvZHVjdHMnKT8uc2V0VmFsdWUoWy4uLnByb2R1Y3RzXSk7XG4gIH1cblxuICBvbkJpbGxpbmdNZXRob2RTZWxlY3RDaGFuZ2UoZm9ybUFycmF5SW5kZXg6IG51bWJlciwgcHJvZHVjdE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IHByb2R1Y3RzID0gdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3Byb2R1Y3RzJyk/LnZhbHVlIHx8IFtdO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gcHJvZHVjdHMuZmluZCgocDogYW55KSA9PiBwLnByb2R1Y3ROYW1lID09PSBwcm9kdWN0TmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy5iaWxsaW5nTWV0aG9kID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2R1Y3RzLnB1c2goeyBwcm9kdWN0TmFtZSwgYmlsbGluZ01ldGhvZDogdmFsdWUgfSk7XG4gICAgfVxuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdwcm9kdWN0cycpPy5zZXRWYWx1ZShbLi4ucHJvZHVjdHNdKTtcbiAgfVxuXG4gIGZvcm1hdFByb2R1Y3ROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxICQyJylcbiAgICAgIC5yZXBsYWNlKC9eLi8sIChzdHIpID0+IHN0ci50b1VwcGVyQ2FzZSgpKTtcbiAgfVxuXG4gIC8vIEdTVElOIHN0YXRlLWNvZGUgcHJlZml4IOKGkiBTdGF0ZSAoUGxhY2Ugb2YgU3VwcGx5KVxuICBwcml2YXRlIHJlYWRvbmx5IGdzdFN0YXRlQ29kZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnMDEnOiAnSmFtbXUgYW5kIEthc2htaXInLFxuICAgICcwMic6ICdIaW1hY2hhbCBQcmFkZXNoJyxcbiAgICAnMDMnOiAnUHVuamFiJyxcbiAgICAnMDQnOiAnQ2hhbmRpZ2FyaCcsXG4gICAgJzA1JzogJ1V0dGFyYWtoYW5kJyxcbiAgICAnMDYnOiAnSGFyeWFuYScsXG4gICAgJzA3JzogJ0RlbGhpJyxcbiAgICAnMDgnOiAnUmFqYXN0aGFuJyxcbiAgICAnMDknOiAnVXR0YXIgUHJhZGVzaCcsXG4gICAgJzEwJzogJ0JpaGFyJyxcbiAgICAnMTEnOiAnU2lra2ltJyxcbiAgICAnMTInOiAnQXJ1bmFjaGFsIFByYWRlc2gnLFxuICAgICcxMyc6ICdOYWdhbGFuZCcsXG4gICAgJzE0JzogJ01hbmlwdXInLFxuICAgICcxNSc6ICdNaXpvcmFtJyxcbiAgICAnMTYnOiAnVHJpcHVyYScsXG4gICAgJzE3JzogJ01lZ2hhbGF5YScsXG4gICAgJzE4JzogJ0Fzc2FtJyxcbiAgICAnMTknOiAnV2VzdCBCZW5nYWwnLFxuICAgICcyMCc6ICdKaGFya2hhbmQnLFxuICAgICcyMSc6ICdPZGlzaGEnLFxuICAgICcyMic6ICdDaGhhdHRpc2dhcmgnLFxuICAgICcyMyc6ICdNYWRoeWEgUHJhZGVzaCcsXG4gICAgJzI0JzogJ0d1amFyYXQnLFxuICAgICcyNSc6ICdEYW1hbiBhbmQgRGl1JyxcbiAgICAnMjYnOiAnRGFkcmEgYW5kIE5hZ2FyIEhhdmVsaSBhbmQgRGFtYW4gYW5kIERpdScsXG4gICAgJzI3JzogJ01haGFyYXNodHJhJyxcbiAgICAnMjgnOiAnQW5kaHJhIFByYWRlc2ggKE9sZCknLFxuICAgICcyOSc6ICdLYXJuYXRha2EnLFxuICAgICczMCc6ICdHb2EnLFxuICAgICczMSc6ICdMYWtzaGFkd2VlcCcsXG4gICAgJzMyJzogJ0tlcmFsYScsXG4gICAgJzMzJzogJ1RhbWlsIE5hZHUnLFxuICAgICczNCc6ICdQdWR1Y2hlcnJ5JyxcbiAgICAnMzUnOiAnQW5kYW1hbiBhbmQgTmljb2JhciBJc2xhbmRzJyxcbiAgICAnMzYnOiAnVGVsYW5nYW5hJyxcbiAgICAnMzcnOiAnQW5kaHJhIFByYWRlc2gnLFxuICAgICczOCc6ICdMYWRha2gnLFxuICAgICc5Nyc6ICdPdGhlciBUZXJyaXRvcnknLFxuICAgICc5OSc6ICdDZW50cmUgSnVyaXNkaWN0aW9uJ1xuICB9O1xuXG4gIG9uR3N0Q2hhbmdlKGZvcm1BcnJheUluZGV4OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBnc3QgPSAodmFsdWUgfHwgJycpLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IHBsYWNlT2ZTdXBwbHlDdHJsID0gdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3BsYWNlT2ZTdXBwbHknKTtcbiAgICBpZiAoZ3N0Lmxlbmd0aCA8IDIpIHtcbiAgICAgIHBsYWNlT2ZTdXBwbHlDdHJsPy5zZXRWYWx1ZSgnJyk7XG4gICAgICB0aGlzLmdzdExvb2t1cFN0YXRlW2Zvcm1BcnJheUluZGV4XSA9ICdpZGxlJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29kZSA9IGdzdC5zdWJzdHJpbmcoMCwgMik7XG4gICAgY29uc3Qgc3RhdGVOYW1lID0gdGhpcy5nc3RTdGF0ZUNvZGVNYXBbY29kZV07XG4gICAgaWYgKHN0YXRlTmFtZSkge1xuICAgICAgcGxhY2VPZlN1cHBseUN0cmw/LnNldFZhbHVlKGAke3N0YXRlTmFtZX0gKCR7Y29kZX0pYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBsYWNlT2ZTdXBwbHlDdHJsPy5zZXRWYWx1ZSgnJyk7XG4gICAgfVxuXG4gICAgLy8gRnVsbCBHU1RJTiBpcyAxNSBjaGFycyAoMTUtY2hhciBhbHBoYW51bWVyaWMpLiBUcmlnZ2VyIHRoZSBhZGRyZXNzXG4gICAgLy8gbG9va3VwIG9uY2UgdGhlIHVzZXIgaGFzIHR5cGVkIGFsbCAxNS4gU2tpcCBpZiB3ZSBhbHJlYWR5IGxvb2tlZCB0aGlzXG4gICAgLy8gZXhhY3QgdmFsdWUgdXAgZm9yIHRoaXMgcm93IOKAlCBvdGhlcndpc2UgdGhlIChpbnB1dCkgZXZlbnQgd291bGQgcmVmaXJlXG4gICAgLy8gb24gZm9jdXMvYmx1ciBhbmQgY2xvYmJlciBhbnkgbWFudWFsIHR3ZWFrcyB0aGUgdXNlciBtYWRlLlxuICAgIGlmIChnc3QubGVuZ3RoID09PSAxNSAmJiB0aGlzLmxhc3RMb29rZWRVcEdzdGluW2Zvcm1BcnJheUluZGV4XSAhPT0gZ3N0KSB7XG4gICAgICB0aGlzLmxvb2t1cEFuZEZpbGxBZGRyZXNzKGZvcm1BcnJheUluZGV4LCBnc3QpO1xuICAgIH0gZWxzZSBpZiAoZ3N0Lmxlbmd0aCA8IDE1KSB7XG4gICAgICAvLyBSZXNldCBzdGF0ZSBzbyBhIHByZXZpb3VzIFwiZm91bmRcIiBpbmRpY2F0b3IgZG9lc24ndCBzdGljayBhcm91bmRcbiAgICAgIC8vIHdoaWxlIHRoZSB1c2VyIGlzIGVkaXRpbmcgdGhlIG51bWJlciB0byBhIG5ldyB2YWx1ZS5cbiAgICAgIHRoaXMuZ3N0TG9va3VwU3RhdGVbZm9ybUFycmF5SW5kZXhdID0gJ2lkbGUnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9va3VwQW5kRmlsbEFkZHJlc3MoZm9ybUFycmF5SW5kZXg6IG51bWJlciwgZ3N0OiBzdHJpbmcpIHtcbiAgICB0aGlzLmdzdExvb2t1cFN0YXRlW2Zvcm1BcnJheUluZGV4XSA9ICdsb2FkaW5nJztcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmxvb2t1cEdzdGluKGdzdCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8gQmFja2VuZCB3cmFwOiB7IGNvZGUsIHN0YXR1cywgZGF0YTogPHBheWxvYWQ+IH0uIFBheWxvYWQgaXRzZWxmXG4gICAgICAgIC8vIG1heSBhbHNvIGJlIG5lc3RlZCB1bmRlciBgZGF0YWAgaWYgdGhlIHJlc3BvbnNlIG1pZGRsZXdhcmUgZG91YmxlLVxuICAgICAgICAvLyB3cmFwcyBpdDsgaGFuZGxlIGJvdGggc2hhcGVzIHRvIGJlIHNhZmUuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSByZXM/LmRhdGE/LmRhdGEgfHwgcmVzPy5kYXRhIHx8IHt9O1xuICAgICAgICBpZiAoIXBheWxvYWQgfHwgIXBheWxvYWQuZ3N0aW4pIHtcbiAgICAgICAgICB0aGlzLmdzdExvb2t1cFN0YXRlW2Zvcm1BcnJheUluZGV4XSA9ICdub3Rmb3VuZCc7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KTtcbiAgICAgICAgLy8gUGF0Y2ggb25seSB0aGUgYWRkcmVzcy1yZWxhdGVkIGZpZWxkcy4gRG9uJ3Qgb3ZlcndyaXRlIGdyb3VwTmFtZSxcbiAgICAgICAgLy8gZ3JvdXBUYWcsIHN0b3JlcywgY3VycmVuY3ksIHBheW1lbnRUZXJtIOKAlCB0aG9zZSBhcmUgdXNlciBjaG9pY2VzLFxuICAgICAgICAvLyBub3QgZGVyaXZlZCBmcm9tIEdTVElOLlxuICAgICAgICBjb25zdCBwYXRjaDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgICBpZiAocGF5bG9hZC5sZWdhbE5hbWUpIHBhdGNoWydyZWdpc3RlcmVkQ29tcGFueU5hbWUnXSA9IFN0cmluZyhwYXlsb2FkLmxlZ2FsTmFtZSkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKHBheWxvYWQuYWRkcmVzc0xpbmVPbmUpIHBhdGNoWydhZGRyZXNzTGluZU9uZSddID0gcGF5bG9hZC5hZGRyZXNzTGluZU9uZTtcbiAgICAgICAgaWYgKHBheWxvYWQuYWRkcmVzc0xpbmVUd28pIHBhdGNoWydhZGRyZXNzTGluZVR3byddID0gcGF5bG9hZC5hZGRyZXNzTGluZVR3bztcbiAgICAgICAgaWYgKHBheWxvYWQuY2l0eSkgcGF0Y2hbJ2NpdHknXSA9IHBheWxvYWQuY2l0eTtcbiAgICAgICAgaWYgKHBheWxvYWQuc3RhdGUpIHBhdGNoWydzdGF0ZSddID0gcGF5bG9hZC5zdGF0ZTtcbiAgICAgICAgaWYgKHBheWxvYWQuY291bnRyeSkgcGF0Y2hbJ2NvdW50cnknXSA9IHBheWxvYWQuY291bnRyeTtcbiAgICAgICAgaWYgKHBheWxvYWQucGluQ29kZSkgcGF0Y2hbJ3BpbkNvZGUnXSA9IHBheWxvYWQucGluQ29kZTtcbiAgICAgICAgaWYgKHBheWxvYWQucGxhY2VPZlN1cHBseSkgcGF0Y2hbJ3BsYWNlT2ZTdXBwbHknXSA9IHBheWxvYWQucGxhY2VPZlN1cHBseTtcbiAgICAgICAgZ3JvdXAucGF0Y2hWYWx1ZShwYXRjaCk7XG4gICAgICAgIHRoaXMubGFzdExvb2tlZFVwR3N0aW5bZm9ybUFycmF5SW5kZXhdID0gZ3N0O1xuICAgICAgICB0aGlzLmdzdExvb2t1cFN0YXRlW2Zvcm1BcnJheUluZGV4XSA9ICdmb3VuZCc7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAvLyA0MDQgPSB1bmtub3duIEdTVElOOyBldmVyeXRoaW5nIGVsc2Ugc3VyZmFjZXMgYXMgYW4gZXJyb3Igc28gdGhlXG4gICAgICAgIC8vIHVzZXIga25vd3MgdGhlIGF1dG8tZmlsbCBkaWRuJ3QgaGFwcGVuIGFuZCB0aGV5IHNob3VsZCBlbnRlclxuICAgICAgICAvLyBtYW51YWxseS5cbiAgICAgICAgdGhpcy5nc3RMb29rdXBTdGF0ZVtmb3JtQXJyYXlJbmRleF0gPSBlcnI/LnN0YXR1cyA9PT0gNDA0ID8gJ25vdGZvdW5kJyA6ICdlcnJvcic7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG48ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi01XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgVXBkYXRlIEJpbGxpbmcgSW5mb3JtYXRpb25cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdj5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhZGRCaWxsaW5nR3JvdXAoKVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgbmVlZGhlbHBcIj48c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjAwMTMgNC4xNjYwMlYxNS44MzI3TTQuMTY3OTcgOS45OTkzNUgxNS44MzQ2XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5BZGQgQmlsbGluZyBHcm91cDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjxmb3JtIFtmb3JtR3JvdXBdPVwiYmlsbGluZ0Zvcm1cIj5cclxuICAgIDxkaXYgKm5nSWY9XCJiaWxsaW5nR3JvdXBzLmxlbmd0aCA+IDFcIiBmb3JtQXJyYXlOYW1lPVwiZ3JvdXBzXCIgbmdiQWNjb3JkaW9uIGFjY29yZGlvbj1cIk5nYkFjY29yZGlvblwiXHJcbiAgICAgICAgW2Nsb3NlT3RoZXJzXT1cInRydWVcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBncm91cCBvZiBiaWxsaW5nR3JvdXBzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4O1wiIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxyXG4gICAgICAgICAgICBbbmdiQWNjb3JkaW9uSXRlbV09XCJpLnRvU3RyaW5nKClcIiBjbGFzcz1cIm1iLTVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWFpbmhlYWRpbmcgcC0wXCIgbmdiQWNjb3JkaW9uQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiPnt7Z3JvdXAuZ2V0KCdncm91cE5hbWUnKT8udmFsdWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdyb3VwLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlXCIgY2xhc3M9XCJwcmltYXJ5LWJhZGdlXCI+UHJpbWFyeTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IG9uRGVsZXRlR3JvdXAoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIuNSA0Ljk5OTM1SDQuMTY2NjdNNC4xNjY2NyA0Ljk5OTM1TDE3LjUgNC45OTkzNU00LjE2NjY3IDQuOTk5MzVMNC4xNjY2NyAxNi42NjZDNC4xNjY2NyAxNy4xMDggNC4zNDIyNiAxNy41MzIgNC42NTQ4MiAxNy44NDQ1QzQuOTY3MzggMTguMTU3MSA1LjM5MTMxIDE4LjMzMjcgNS44MzMzMyAxOC4zMzI3SDE0LjE2NjdDMTQuNjA4NyAxOC4zMzI3IDE1LjAzMjYgMTguMTU3MSAxNS4zNDUyIDE3Ljg0NDVDMTUuNjU3NyAxNy41MzIgMTUuODMzMyAxNy4xMDggMTUuODMzMyAxNi42NjZMMTUuODMzMyA0Ljk5OTM1TDQuMTY2NjcgNC45OTkzNVpNNi42NjY2NyA0Ljk5OTM1VjMuMzMyNjhDNi42NjY2NyAyLjg5MDY1IDYuODQyMjYgMi40NjY3MyA3LjE1NDgyIDIuMTU0MTdDNy40NjczOCAxLjg0MTYxIDcuODkxMzEgMS42NjYwMiA4LjMzMzMzIDEuNjY2MDJMMTEuNjY2NyAxLjY2NjAyQzEyLjEwODcgMS42NjYwMiAxMi41MzI2IDEuODQxNjEgMTIuODQ1MiAyLjE1NDE3QzEzLjE1NzcgMi40NjY3MyAxMy4zMzMzIDIuODkwNjUgMTMuMzMzMyAzLjMzMjY4VjQuOTk5MzVNOC4zMzMzMyA5LjE2NjAyTDguMzMzMzMgMTQuMTY2TTExLjY2NjcgOS4xNjYwMlYxNC4xNjZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHkgY2xhc3M9XCJwcy0wIHBlLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlID8gJ3Jvdy1jb2xzLTInIDogJydcIiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiIHJvdyByb3ctY29scy0zICBnLTAgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvblRhYkNoYW5nZShpLCAnYmFzaWMtaW5mbycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJyA/ICdzZWxlY3RlZCcgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtXCI+QmFzaWMgSW5mbzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ3N0b3JlLXNlbGVjdGlvbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzdG9yZS1zZWxlY3Rpb24nID8gJ3NlbGVjdGVkJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW1cIj5TdG9yZSBTZWxlY3Rpb248L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKGksICdzZXR0aW5ncycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzZXR0aW5ncycgPyAnc2VsZWN0ZWQnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbVwiPlNldHRpbmdzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlICE9PSAnYmFzaWMtaW5mbycgPyAnZC1ub25lJyA6ICcnXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ3JvdXBOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+R3JvdXAgTmFtZSo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZ3JvdXBOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJncm91cE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2dyb3VwTmFtZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnZ3JvdXBOYW1lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnZ3JvdXBOYW1lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2dyb3VwTmFtZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwIG5hbWUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJncm91cFRhZ1wiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJncm91cFRhZ09wdGlvbnNcIiBbbGFiZWxdPVwiJ0dyb3VwIFRhZyonXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdncm91cFRhZycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdncm91cFRhZycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwIHRhZyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5SZWdpc3RlcmVkIENvbXBhbnkgTmFtZSo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGlucHV0KT1cImZvcmNlVXBwZXJjYXNlKCRldmVudCwgaSlcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZCBjb21wYW55IG5hbWUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ3N0XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+R1NUPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIChpbnB1dCk9XCJvbkdzdENoYW5nZShpLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImdzdFwiIGZvcm1Db250cm9sTmFtZT1cImdzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnZ3N0Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdnc3QnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdnc3QnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnZ3N0Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NUIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gR1NUSU4gYWRkcmVzcy1sb29rdXAgZmVlZGJhY2suIFN0YXRlIG1hY2hpbmUgZHJpdmVuIGJ5IGxvb2t1cEFuZEZpbGxBZGRyZXNzKCkuIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC1tdXRlZFwiICpuZ0lmPVwiZ3N0TG9va3VwU3RhdGVbaV0gPT09ICdsb2FkaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb2tpbmcgdXAgcmVnaXN0ZXJlZCBhZGRyZXNz4oCmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC1zdWNjZXNzXCIgKm5nSWY9XCJnc3RMb29rdXBTdGF0ZVtpXSA9PT0gJ2ZvdW5kJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWQgYWRkcmVzcyBhdXRvLWZpbGxlZC4gRWRpdCBpZiBuZWVkZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC13YXJuaW5nXCIgKm5nSWY9XCJnc3RMb29rdXBTdGF0ZVtpXSA9PT0gJ25vdGZvdW5kJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIHJlZ2lzdGVyZWQgYWRkcmVzcyBmb3VuZCBmb3IgdGhpcyBHU1RJTi4gRW50ZXIgbWFudWFsbHkuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC1kYW5nZXJcIiAqbmdJZj1cImdzdExvb2t1cFN0YXRlW2ldID09PSAnZXJyb3InXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBsb29rdXAgZmFpbGVkLiBFbnRlciBtYW51YWxseS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTUgc3ViLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBEZXRhaWxzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzTGluZU9uZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFkZHJlc3MgbGluZSAxPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NMaW5lT25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzTGluZU9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NMaW5lVHdvXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QWRkcmVzcyBsaW5lIDI8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiYWRkcmVzc0xpbmVUd29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NMaW5lVHdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2l0eVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNpdHk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY2l0eVwiIGZvcm1Db250cm9sTmFtZT1cImNpdHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2NpdHknKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2NpdHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdjaXR5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2NpdHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXR5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0YXRlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3RhdGUvcHJvdmluY2U8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN0YXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdzdGF0ZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnc3RhdGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdzdGF0ZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdzdGF0ZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvdW50cnlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Db3VudHJ5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNvdW50cnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvdW50cnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2NvdW50cnknKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2NvdW50cnknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2NvdW50cnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHJ5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpbkNvZGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5QaW4gY29kZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiAoa2V5cHJlc3MpPVwib21pdF9zcGVjaWFsX2NoYXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBpbkNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBpbkNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3BpbkNvZGUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BpbkNvZGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3BpbkNvZGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW4gY29kZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwbGFjZU9mU3VwcGx5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGxhY2Ugb2YgU3VwcGx5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBsYWNlT2ZTdXBwbHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBsYWNlT2ZTdXBwbHlcIiByZWFkb25seVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFjZSBvZiBzdXBwbHkgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicG9cIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5QTzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwb1wiIGZvcm1Db250cm9sTmFtZT1cInBvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwbycpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgncG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwbycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwbycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1cmNoYXNlIG9yZGVyIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlICE9PSAnc3RvcmUtc2VsZWN0aW9uJyA/ICdkLW5vbmUnIDogJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEuNSAxMEwxMS40MyAxMC43M0MxMi40MSA5LjU5IDEzIDguMTEgMTMgNi41QzEzIDIuOTEgMTAuMDkgMCA2LjUgMEMyLjkxIDAgMCAyLjkxIDAgNi41QzAgMTAuMDkgMi45MSAxMyA2LjUgMTNDOC4xMSAxMyA5LjU5IDEyLjQxIDEwLjczIDExLjQzTDEwLjI3NjIgMTEuNzFMMTYgMTcuNDlMMTcuNDkgMTZMMTEuNSAxMFpNNi41IDExQzQuMDEgMTEgMiA4Ljk5IDIgNi41QzIgNC4wMSA0LjAxIDIgNi41IDJDOC45OSAyIDExIDQuMDEgMTEgNi41QzExIDguOTkgOC45OSAxMSA2LjUgMTFaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImJsYWNrXCIgZmlsbC1vcGFjaXR5PVwiMC41NFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBbZm9ybUNvbnRyb2xdPVwic2VhcmNoSW5wdXRcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBzLTE0IG1lLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggU3RvcmVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1maWx0ZXJzICpuZ0lmPVwiZmlsdGVyRGF0YS5sZW5ndGhcIiBjbGFzcz1cIm1lLTJcIiBbZGF0YU9iamVjdF09XCJmaWx0ZXJEYXRhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFwcGxpZWRGaWx0ZXJzKT1cImFwcGx5RmlsdGVycygkZXZlbnQpXCI+PC9saWItZmlsdGVycz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihzdWJzY3JpYmVkU3RvcmVzQXBpU3RhdGUgfCBhc3luYykgPT09ICdsb2FkZWQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3Vic2NyaWJlZFN0b3JlTGlzdD8ubGVuZ3RoXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmUgc3RvcmUtdGFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBib3R0b20tYm9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW2NoZWNrZWRdPVwiaXNBbGxTdG9yZXNTZWxlY3RlZEluR3JvdXAoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdEFsbFN0b3JlcygkZXZlbnQsIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXIgbWUtNFwiIHR5cGU9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0RlZmF1bHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TdG9yZSBOYW1lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvblNvcnQoJ3N0b3JlTmFtZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzb3J0ZWRDb2x1bW4gPT09ICdzdG9yZU5hbWUnICYmIHNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlN0b3JlIElkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvblNvcnQoJ3N0b3JlSWQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzb3J0ZWRDb2x1bW4gPT09ICdzdG9yZUlkJyAmJiBzb3J0RGlyZWN0aW9uID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UHJvZHVjdHM8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBkYXRhIG9mIHN1YnNjcmliZWRTdG9yZUxpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW2NoZWNrZWRdPVwiaXNTdG9yZVNlbGVjdGVkSW5Hcm91cChpLCBkYXRhPy5zdG9yZUlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdyb3VwLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU3RvcmVDaGVjaygkZXZlbnQsIGksIGRhdGE/LnN0b3JlSWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXIgbWUtNFwiIHR5cGU9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2RhdGE/LnN0b3JlTmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1pZFwiPklEIDoge3tkYXRhPy5zdG9yZUlkfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBkYXRhPy5wcm9kdWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwcm9kdWN0ID09PSAndGFuZ29UcmFmZmljJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hpcCBtZS0yIG1iLTJcIj5UcmFmZmljPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdCA9PT0gJ3RhbmdvWm9uZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoaXAgbWUtMiBtYi0yXCI+Wm9uZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2R1Y3QgPT09ICd0YW5nb1RyYXgnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGlwIG1lLTIgbWItMlwiPlRyYXg8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN1YnNjcmliZWRTdG9yZUxpc3QubGVuZ3RoXCIgY2xhc3M9XCJteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwiaXRlbXNQZXJQYWdlXCIgW2N1cnJlbnRQYWdlXT1cImN1cnJlbnRQYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwidG90YWxJdGVtc1wiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc3Vic2NyaWJlZFN0b3JlTGlzdD8ubGVuZ3RoXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmMgdy0yNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihzdWJzY3JpYmVkU3RvcmVzQXBpU3RhdGUgfCBhc3luYykgPT09ICdsb2FkaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXItY2FyZCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyICBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ3NldHRpbmdzJyA/ICdkLW5vbmUnIDogJydcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5QcmljaW5nIE1ldGhvZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9SYXRhXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidwcm9yYXRlLScgKyBpXCIgdmFsdWU9XCJwcm9yYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIFtmb3JdPVwiJ3Byb3JhdGUtJyArIGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3JhdGUg4oCUIGJpbGwgZm9yIGFjdHVhbCB3b3JraW5nIGRheXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicHJvUmF0YVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCInZmxhdC0nICsgaVwiIHZhbHVlPVwiZmxhdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBbZm9yXT1cIidmbGF0LScgKyBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGF0IOKAlCBiaWxsIGZvciB0aGUgd2hvbGUgbW9udGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+QWR2YW5jZSBJbnZvaWNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMVwiIG5nYlRvb2x0aXA9XCJDcmVhdGVzIGFuIGludm9pY2UgZm9yIHRoZSBuZXh0IG1vbnRoIGF1dG9tYXRpY2FsbHkgdXBvbiBzYXZpbmdcIiBwbGFjZW1lbnQ9XCJ0b3BcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDEzQzEwLjMxMzcgMTMgMTMgMTAuMzEzNyAxMyA3QzEzIDMuNjg2MjkgMTAuMzEzNyAxIDcgMUMzLjY4NjI5IDEgMSAzLjY4NjI5IDEgN0MxIDEwLjMxMzcgMy42ODYyOSAxMyA3IDEzWlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA5LjRWN003IDQuNkg3LjAwNlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidhZHZhbmNlSW52b2ljZV8nICsgaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZHZhbmNlSW52b2ljZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2Zvcl09XCInYWR2YW5jZUludm9pY2VfJyArIGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGZvciBuZXh0IG1vbnRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbWItNVwiICpuZ0lmPVwic3Vic2NyaWJlZFByb2R1Y3RzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtYi0zXCI+UHJvZHVjdCBCaWxsaW5nIE1ldGhvZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vdGU6IG5vIC50YWJsZS1yZXNwb25zaXZlIHdyYXBwZXIgaGVyZS4gSXRzIG92ZXJmbG93LXg6YXV0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcyB0aGUgQmlsbGluZyBNZXRob2QgZHJvcGRvd24gb3B0aW9ucyBwYW5lbC4gVGhlIHRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgaGFzIHR3byBjb2x1bW5zLCBzbyBob3Jpem9udGFsIHNjcm9sbCBpc24ndCBuZWVkZWQuIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc20gYm90dG9tLWJvcmRlciBiaWxsaW5nLW1ldGhvZC10YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlByb2R1Y3Q8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkJpbGxpbmcgTWV0aG9kPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBwcm9kIG9mIHN1YnNjcmliZWRQcm9kdWN0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtcHJpbWFyeVwiPnt7IGZvcm1hdFByb2R1Y3ROYW1lKHByb2QucHJvZHVjdE5hbWUpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRQcm9kdWN0QmlsbGluZ01ldGhvZChpLCBwcm9kLnByb2R1Y3ROYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkJpbGxpbmdNZXRob2RTZWxlY3RDaGFuZ2UoaSwgcHJvZC5wcm9kdWN0TmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJiaWxsaW5nTWV0aG9kT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImN1cnJlbmN5XCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImN1cnJlbmN5T3B0aW9uc1wiIFtsYWJlbF09XCInQ3VycmVuY3knXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ0YXhDYWxjdWxhdGlvblR5cGVcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwidGF4Q2FsY3VsYXRpb25UeXBlT3B0aW9uc1wiIFtsYWJlbF09XCInVGF4IENhbGN1bGF0aW9uJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudEN5Y2xlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cInBheW1lbnRDeWNsZU9wdGlvbnNcIiBbbGFiZWxdPVwiJ1BheW1lbnQgQ3ljbGUnXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJwYXltZW50VGVybVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJwYXltZW50VGVybU9wdGlvbnNcIiBbbGFiZWxdPVwiJ1BheW1lbnQgVGVybSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBjb2wteGwtMTIgY29sLXh4bC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInZW1haWwnICsgaVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdlbmVyYXRlIEludm9pY2UgVG8qIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWRcIj48L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdXRlci1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyIGZvcm0tY29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbWFpbCBvZiBncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoaXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTNcIj57eyBlbWFpbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwicmVtb3ZlRW1haWxDaGlwKGVtYWlsLCBpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIHN0eWxlPVwibWluLWhlaWdodDogNDRweDtcIiAoa2V5ZG93bik9XCJvbkVtYWlsS2V5RG93bigkZXZlbnQsIGkpXCIgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlbWFpbFZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtaW5wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmICFncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9pY2UgZW1haWwgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlN0b3JlIExpc3QgQW5uZXh1cmUgQXR0YWNoZWQgV2l0aCBJbnZvaWNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImF0dGFjaEFubmV4dXJlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIiBpZD1cInllc1wiIFt2YWx1ZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwieWVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImF0dGFjaEFubmV4dXJlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIiBpZD1cIm5vXCIgW3ZhbHVlXT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwibm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWVuZCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG10LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvbkNhbmNlbChpKVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nIHx8IGdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3N0b3JlLXNlbGVjdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm5hdmlnYXRlKGkpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDBcIj5OZXh0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvblN1Ym1pdChncm91cC52YWx1ZSwgaSlcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMFwiPlNhdmUgQ2hhbmdlczwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJpbGxpbmdHcm91cHMubGVuZ3RoID09PSAxXCIgZm9ybUFycmF5TmFtZT1cImdyb3Vwc1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGJpbGxpbmdHcm91cHMuY29udHJvbHM7IGxldCBpID0gaW5kZXg7XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYiByb3cgcm93LWNvbHMtMiBnLTAgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ2Jhc2ljLWluZm8nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJyA/ICdzZWxlY3RlZCcgOiAnJ1wiIGNsYXNzPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm88L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvblRhYkNoYW5nZShpLCAnc2V0dGluZ3MnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzZXR0aW5ncycgPyAnc2VsZWN0ZWQnIDogJydcIiBjbGFzcz1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ2Jhc2ljLWluZm8nID8gJ2Qtbm9uZScgOiAnJ1wiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5SZWdpc3RlcmVkIENvbXBhbnkgTmFtZSo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiAoaW5wdXQpPVwiZm9yY2VVcHBlcmNhc2UoJGV2ZW50LCBpKVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIGNvbXBhbnkgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdzdFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdTVDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIChpbnB1dCk9XCJvbkdzdENoYW5nZShpLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImdzdFwiIGZvcm1Db250cm9sTmFtZT1cImdzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdnc3QnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2dzdCcpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdnc3QnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnZ3N0Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIGNvbXBhbnkgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC1tdXRlZFwiICpuZ0lmPVwiZ3N0TG9va3VwU3RhdGVbaV0gPT09ICdsb2FkaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9va2luZyB1cCByZWdpc3RlcmVkIGFkZHJlc3PigKZcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC1zdWNjZXNzXCIgKm5nSWY9XCJnc3RMb29rdXBTdGF0ZVtpXSA9PT0gJ2ZvdW5kJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZCBhZGRyZXNzIGF1dG8tZmlsbGVkLiBFZGl0IGlmIG5lZWRlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC13YXJuaW5nXCIgKm5nSWY9XCJnc3RMb29rdXBTdGF0ZVtpXSA9PT0gJ25vdGZvdW5kJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gcmVnaXN0ZXJlZCBhZGRyZXNzIGZvdW5kIGZvciB0aGlzIEdTVElOLiBFbnRlciBtYW51YWxseS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZ3N0LWxvb2t1cC1tc2cgdGV4dC1kYW5nZXJcIiAqbmdJZj1cImdzdExvb2t1cFN0YXRlW2ldID09PSAnZXJyb3InXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGxvb2t1cCBmYWlsZWQuIEVudGVyIG1hbnVhbGx5LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNSBzdWItaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgRGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWRkcmVzc0xpbmVPbmVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5BZGRyZXNzIGxpbmUgMTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NMaW5lT25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NMaW5lT25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NMaW5lVHdvXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QWRkcmVzcyBsaW5lIDI8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzTGluZVR3b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzTGluZVR3b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjaXR5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Q2l0eTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNpdHlcIiBmb3JtQ29udHJvbE5hbWU9XCJjaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2NpdHknKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2NpdHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY2l0eScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjaXR5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXR5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic3RhdGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5TdGF0ZS9wcm92aW5jZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInN0YXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnc3RhdGUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3N0YXRlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvdW50cnlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Db3VudHJ5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY291bnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2NvdW50cnknKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2NvdW50cnknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY291bnRyeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHJ5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGluQ29kZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpbiBjb2RlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwaW5Db2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBpbkNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncGluQ29kZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgncGluQ29kZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3BpbkNvZGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbiBjb2RlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGxhY2VPZlN1cHBseVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBsYWNlIG9mIFN1cHBseTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBsYWNlT2ZTdXBwbHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGxhY2VPZlN1cHBseVwiIHJlYWRvbmx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Ugb2Ygc3VwcGx5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicG9cIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5QTzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBvXCIgZm9ybUNvbnRyb2xOYW1lPVwicG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncG8nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3BvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3BvJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXJjaGFzZSBvcmRlciBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlICE9PSAnc2V0dGluZ3MnID8gJ2Qtbm9uZScgOiAnJ1wiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5QcmljaW5nIE1ldGhvZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9SYXRhXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ3Byb3JhdGUtZWRpdC0nICsgaVwiIHZhbHVlPVwicHJvcmF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIFtmb3JdPVwiJ3Byb3JhdGUtZWRpdC0nICsgaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9yYXRlIOKAlCBiaWxsIGZvciBhY3R1YWwgd29ya2luZyBkYXlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicHJvUmF0YVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidmbGF0LWVkaXQtJyArIGlcIiB2YWx1ZT1cImZsYXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBbZm9yXT1cIidmbGF0LWVkaXQtJyArIGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhdCDigJQgYmlsbCBmb3IgdGhlIHdob2xlIG1vbnRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPkFkdmFuY2UgSW52b2ljZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMVwiIG5nYlRvb2x0aXA9XCJDcmVhdGVzIGFuIGludm9pY2UgZm9yIHRoZSBuZXh0IG1vbnRoIGF1dG9tYXRpY2FsbHkgdXBvbiBzYXZpbmdcIiBwbGFjZW1lbnQ9XCJ0b3BcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyAxM0MxMC4zMTM3IDEzIDEzIDEwLjMxMzcgMTMgN0MxMyAzLjY4NjI5IDEwLjMxMzcgMSA3IDFDMy42ODYyOSAxIDEgMy42ODYyOSAxIDdDMSAxMC4zMTM3IDMuNjg2MjkgMTMgNyAxM1pcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA5LjRWN003IDQuNkg3LjAwNlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidhZHZhbmNlSW52b2ljZVNpbmdsZV8nICsgaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkdmFuY2VJbnZvaWNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIFtmb3JdPVwiJ2FkdmFuY2VJbnZvaWNlU2luZ2xlXycgKyBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGZvciBuZXh0IG1vbnRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIG1iLTVcIiAqbmdJZj1cInN1YnNjcmliZWRQcm9kdWN0cy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtYi0zXCI+UHJvZHVjdCBCaWxsaW5nIE1ldGhvZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zbSBib3R0b20tYm9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UHJvZHVjdDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+QmlsbGluZyBNZXRob2Q8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHByb2Qgb2Ygc3Vic2NyaWJlZFByb2R1Y3RzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1wcmltYXJ5XCI+e3sgZm9ybWF0UHJvZHVjdE5hbWUocHJvZC5wcm9kdWN0TmFtZSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFByb2R1Y3RCaWxsaW5nTWV0aG9kKGksIHByb2QucHJvZHVjdE5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQmlsbGluZ01ldGhvZFNlbGVjdENoYW5nZShpLCBwcm9kLnByb2R1Y3ROYW1lLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cImJpbGxpbmdNZXRob2RPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImN1cnJlbmN5XCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImN1cnJlbmN5T3B0aW9uc1wiIFtsYWJlbF09XCInQ3VycmVuY3knXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ0YXhDYWxjdWxhdGlvblR5cGVcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwidGF4Q2FsY3VsYXRpb25UeXBlT3B0aW9uc1wiIFtsYWJlbF09XCInVGF4IENhbGN1bGF0aW9uJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudEN5Y2xlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cInBheW1lbnRDeWNsZU9wdGlvbnNcIiBbbGFiZWxdPVwiJ1BheW1lbnQgQ3ljbGUnXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJwYXltZW50VGVybVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJwYXltZW50VGVybU9wdGlvbnNcIiBbbGFiZWxdPVwiJ1BheW1lbnQgVGVybSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInZW1haWwnICsgaVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdlbmVyYXRlIEludm9pY2UgVG8qIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydC1yZXF1aXJlZFwiPjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0ZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyIGZvcm0tY29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVtYWlsIG9mIGdyb3VwLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTNcIj57eyBlbWFpbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJyZW1vdmVFbWFpbENoaXAoZW1haWwsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAzTDMgOU0zIDNMOSA5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgc3R5bGU9XCJtaW4taGVpZ2h0OiA0NHB4O1wiIChrZXlkb3duKT1cIm9uRW1haWxLZXlEb3duKCRldmVudCwgaSlcIiB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZW1haWxWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWlucFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiAhZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZvaWNlIGVtYWlsIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+U3RvcmUgTGlzdCBBbm5leHVyZSBBdHRhY2hlZCBXaXRoIEludm9pY2U8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImF0dGFjaEFubmV4dXJlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiIGlkPVwieWVzXCIgW3ZhbHVlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cInllc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYXR0YWNoQW5uZXh1cmVcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCIgaWQ9XCJub1wiIFt2YWx1ZV09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwibm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWVuZCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG10LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibW9kYWxSZWYuY2xvc2UoKVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nIHx8IGdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3N0b3JlLXNlbGVjdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibmF2aWdhdGUoaSlcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMFwiPk5leHQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU3VibWl0KGdyb3VwLnZhbHVlLCBpKVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwXCI+U2F2ZSBDaGFuZ2VzPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG48L2Zvcm0+XHJcbjwvZGl2PiJdfQ==
|