@merchi/product-form 1.19.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/README.md +272 -0
  2. package/lib/actions/jobs.d.ts +3 -0
  3. package/lib/actions/jobs.js +80 -0
  4. package/lib/actions/leads.d.ts +7 -0
  5. package/lib/actions/leads.js +67 -0
  6. package/lib/components/AlertVariationSellerEditable.d.ts +6 -0
  7. package/lib/components/AlertVariationSellerEditable.js +46 -0
  8. package/lib/components/Collapse.d.ts +3 -0
  9. package/lib/components/Collapse.js +34 -0
  10. package/lib/components/DateCountdown.d.ts +44 -0
  11. package/lib/components/DateCountdown.js +188 -0
  12. package/lib/components/DropzoneInput.d.ts +10 -0
  13. package/lib/components/DropzoneInput.js +169 -0
  14. package/lib/components/DynamicVariationInput.d.ts +9 -0
  15. package/lib/components/DynamicVariationInput.js +71 -0
  16. package/lib/components/FormLead.d.ts +10 -0
  17. package/lib/components/FormLead.js +215 -0
  18. package/lib/components/GroupInventory.d.ts +6 -0
  19. package/lib/components/GroupInventory.js +16 -0
  20. package/lib/components/InputGroupQuantity.d.ts +8 -0
  21. package/lib/components/InputGroupQuantity.js +117 -0
  22. package/lib/components/InputHiddenStatic.d.ts +8 -0
  23. package/lib/components/InputHiddenStatic.js +24 -0
  24. package/lib/components/InputProductQuantity.d.ts +7 -0
  25. package/lib/components/InputProductQuantity.js +102 -0
  26. package/lib/components/InventoryStatus.d.ts +7 -0
  27. package/lib/components/InventoryStatus.js +67 -0
  28. package/lib/components/MerchiProductForm.d.ts +62 -0
  29. package/lib/components/MerchiProductForm.js +51 -0
  30. package/lib/components/PriceMatrix.d.ts +27 -0
  31. package/lib/components/PriceMatrix.js +106 -0
  32. package/lib/components/ProductButtonsSubmit.d.ts +3 -0
  33. package/lib/components/ProductButtonsSubmit.js +52 -0
  34. package/lib/components/ProductFeatureDeadline.d.ts +3 -0
  35. package/lib/components/ProductFeatureDeadline.js +25 -0
  36. package/lib/components/ProductGroupBuyStatus.d.ts +3 -0
  37. package/lib/components/ProductGroupBuyStatus.js +47 -0
  38. package/lib/components/ProductPriceMatrix.d.ts +3 -0
  39. package/lib/components/ProductPriceMatrix.js +51 -0
  40. package/lib/components/ProductTitle.d.ts +3 -0
  41. package/lib/components/ProductTitle.js +36 -0
  42. package/lib/components/ProductTotalCost.d.ts +3 -0
  43. package/lib/components/ProductTotalCost.js +74 -0
  44. package/lib/components/ProductUnitPrice.d.ts +7 -0
  45. package/lib/components/ProductUnitPrice.js +51 -0
  46. package/lib/components/TooltipElement.d.ts +9 -0
  47. package/lib/components/TooltipElement.js +35 -0
  48. package/lib/components/VariationAreaInput.d.ts +8 -0
  49. package/lib/components/VariationAreaInput.js +219 -0
  50. package/lib/components/VariationCheckBoxOrRadioOption.d.ts +10 -0
  51. package/lib/components/VariationCheckBoxOrRadioOption.js +82 -0
  52. package/lib/components/VariationCheckboxRadio.d.ts +17 -0
  53. package/lib/components/VariationCheckboxRadio.js +57 -0
  54. package/lib/components/VariationColourExtractInput.d.ts +8 -0
  55. package/lib/components/VariationColourExtractInput.js +395 -0
  56. package/lib/components/VariationError.d.ts +7 -0
  57. package/lib/components/VariationError.js +52 -0
  58. package/lib/components/VariationFieldInputInstructions.d.ts +10 -0
  59. package/lib/components/VariationFieldInputInstructions.js +50 -0
  60. package/lib/components/VariationFieldInstructions.d.ts +3 -0
  61. package/lib/components/VariationFieldInstructions.js +22 -0
  62. package/lib/components/VariationFieldNameAndCostInputs.d.ts +7 -0
  63. package/lib/components/VariationFieldNameAndCostInputs.js +34 -0
  64. package/lib/components/VariationFieldOptionDefaultInputs.d.ts +7 -0
  65. package/lib/components/VariationFieldOptionDefaultInputs.js +48 -0
  66. package/lib/components/VariationFieldStaticValues.d.ts +8 -0
  67. package/lib/components/VariationFieldStaticValues.js +57 -0
  68. package/lib/components/VariationFileInput.d.ts +8 -0
  69. package/lib/components/VariationFileInput.js +229 -0
  70. package/lib/components/VariationInput.d.ts +11 -0
  71. package/lib/components/VariationInput.js +97 -0
  72. package/lib/components/VariationLabel.d.ts +11 -0
  73. package/lib/components/VariationLabel.js +85 -0
  74. package/lib/components/VariationOptionColour.d.ts +8 -0
  75. package/lib/components/VariationOptionColour.js +50 -0
  76. package/lib/components/VariationOptionImage.d.ts +8 -0
  77. package/lib/components/VariationOptionImage.js +52 -0
  78. package/lib/components/VariationSelect.d.ts +8 -0
  79. package/lib/components/VariationSelect.js +66 -0
  80. package/lib/components/VariationSelectElements.d.ts +16 -0
  81. package/lib/components/VariationSelectElements.js +141 -0
  82. package/lib/components/VariationTurnaroundTime.d.ts +9 -0
  83. package/lib/components/VariationTurnaroundTime.js +156 -0
  84. package/lib/components/Variations.d.ts +9 -0
  85. package/lib/components/Variations.js +109 -0
  86. package/lib/components/VariationsGroups.d.ts +8 -0
  87. package/lib/components/VariationsGroups.js +79 -0
  88. package/lib/components/buttons/ButtonAddGroup.d.ts +7 -0
  89. package/lib/components/buttons/ButtonAddGroup.js +38 -0
  90. package/lib/components/buttons/ButtonProductSubmit.d.ts +7 -0
  91. package/lib/components/buttons/ButtonProductSubmit.js +33 -0
  92. package/lib/components/buttons/ButtonRemoveGroup.d.ts +8 -0
  93. package/lib/components/buttons/ButtonRemoveGroup.js +25 -0
  94. package/lib/components/buttons/index.d.ts +4 -0
  95. package/lib/components/buttons/index.js +5 -0
  96. package/lib/components/cost.d.ts +11 -0
  97. package/lib/components/cost.js +44 -0
  98. package/lib/components/currency.d.ts +16 -0
  99. package/lib/components/currency.js +184 -0
  100. package/lib/components/drafts/DraftApprovePanel.d.ts +6 -0
  101. package/lib/components/drafts/DraftApprovePanel.js +315 -0
  102. package/lib/components/drafts/DraftCanvas.d.ts +13 -0
  103. package/lib/components/drafts/DraftCanvas.js +496 -0
  104. package/lib/components/drafts/DraftDesignerSheet.d.ts +9 -0
  105. package/lib/components/drafts/DraftDesignerSheet.js +685 -0
  106. package/lib/components/drafts/ProductDraftsHost.d.ts +3 -0
  107. package/lib/components/drafts/ProductDraftsHost.js +207 -0
  108. package/lib/components/drafts/useHtmlImage.d.ts +1 -0
  109. package/lib/components/drafts/useHtmlImage.js +45 -0
  110. package/lib/components/icons/IconChecked.d.ts +3 -0
  111. package/lib/components/icons/IconChecked.js +10 -0
  112. package/lib/components/icons/IconCheckedOrNoStock.d.ts +7 -0
  113. package/lib/components/icons/IconCheckedOrNoStock.js +13 -0
  114. package/lib/components/icons/IconCountryFlag.d.ts +8 -0
  115. package/lib/components/icons/IconCountryFlag.js +27 -0
  116. package/lib/components/icons/IconFile.d.ts +7 -0
  117. package/lib/components/icons/IconFile.js +41 -0
  118. package/lib/components/icons/IconNoStock.d.ts +3 -0
  119. package/lib/components/icons/IconNoStock.js +12 -0
  120. package/lib/components/icons/index.d.ts +5 -0
  121. package/lib/components/icons/index.js +6 -0
  122. package/lib/components/quoteAfterFieldChange.d.ts +7 -0
  123. package/lib/components/quoteAfterFieldChange.js +11 -0
  124. package/lib/components/quoteAfterFieldChange.test.js +58 -0
  125. package/lib/components/utils.d.ts +26 -0
  126. package/lib/components/utils.js +500 -0
  127. package/lib/context/MerchiProductFormProvider.d.ts +177 -0
  128. package/lib/context/MerchiProductFormProvider.js +1020 -0
  129. package/lib/images/product-not-found.png +0 -0
  130. package/lib/index.d.ts +42 -0
  131. package/lib/index.js +41 -0
  132. package/lib/styles/globals.css +1590 -0
  133. package/lib/styles/globals.css.map +1 -0
  134. package/lib/styles/globals.scss +1698 -0
  135. package/lib/utils/area.d.ts +77 -0
  136. package/lib/utils/area.js +298 -0
  137. package/lib/utils/cleanFormVariationJson.d.ts +5 -0
  138. package/lib/utils/cleanFormVariationJson.js +39 -0
  139. package/lib/utils/cleanFormVariationJson.test.js +54 -0
  140. package/lib/utils/countries.d.ts +7 -0
  141. package/lib/utils/countries.js +290 -0
  142. package/lib/utils/currency.d.ts +2 -0
  143. package/lib/utils/currency.js +188 -0
  144. package/lib/utils/draftExport.d.ts +21 -0
  145. package/lib/utils/draftExport.js +481 -0
  146. package/lib/utils/draftExport.test.js +78 -0
  147. package/lib/utils/draftFonts.d.ts +55 -0
  148. package/lib/utils/draftFonts.js +68 -0
  149. package/lib/utils/draftStorage.d.ts +25 -0
  150. package/lib/utils/draftStorage.js +148 -0
  151. package/lib/utils/draftStorage.test.js +125 -0
  152. package/lib/utils/draftTemplates.d.ts +87 -0
  153. package/lib/utils/draftTemplates.js +579 -0
  154. package/lib/utils/draftTemplates.test.js +476 -0
  155. package/lib/utils/formErrors.d.ts +2 -0
  156. package/lib/utils/formErrors.js +29 -0
  157. package/lib/utils/index.d.ts +3 -0
  158. package/lib/utils/index.js +4 -0
  159. package/lib/utils/priceMatrix.d.ts +57 -0
  160. package/lib/utils/priceMatrix.js +82 -0
  161. package/lib/utils/priceMatrix.test.js +200 -0
  162. package/lib/utils/products.d.ts +40 -0
  163. package/lib/utils/products.js +68 -0
  164. package/lib/utils/quantity.d.ts +7 -0
  165. package/lib/utils/quantity.js +19 -0
  166. package/lib/utils/quantity.test.js +42 -0
  167. package/lib/utils/reconcileVariations.d.ts +25 -0
  168. package/lib/utils/reconcileVariations.js +246 -0
  169. package/lib/utils/reconcileVariations.test.js +239 -0
  170. package/lib/utils/selectedVariationCosts.d.ts +6 -0
  171. package/lib/utils/selectedVariationCosts.js +59 -0
  172. package/lib/utils/selectedVariationCosts.test.js +66 -0
  173. package/lib/utils/selections.d.ts +23 -0
  174. package/lib/utils/selections.js +76 -0
  175. package/lib/utils/selections.test.js +159 -0
  176. package/lib/utils/singleOptionVariation.d.ts +2 -0
  177. package/lib/utils/singleOptionVariation.js +22 -0
  178. package/lib/utils/singleOptionVariation.test.js +59 -0
  179. package/lib/utils/supportedNumbers.d.ts +1 -0
  180. package/lib/utils/supportedNumbers.js +27 -0
  181. package/lib/utils/types.d.ts +114 -0
  182. package/lib/utils/types.js +50 -0
  183. package/lib/utils/url.d.ts +3 -0
  184. package/lib/utils/url.js +65 -0
  185. package/lib/utils/variationFields.d.ts +5 -0
  186. package/lib/utils/variationFields.js +116 -0
  187. package/lib/utils/variationFields.test.js +108 -0
  188. package/package.json +93 -0
@@ -0,0 +1,579 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
8
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
10
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
11
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
12
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
13
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
14
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
15
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
16
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
17
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
18
+ import { BLANK_TEMPLATE_ID, DEFAULT_ARTBOARD, FieldType } from './types';
19
+ import { DEFAULT_DRAFT_FONT, cssFontFamily } from './draftFonts';
20
+ import { productHasGroups } from './products';
21
+ export function productHasDraftTemplates(product) {
22
+ return Array.isArray(product === null || product === void 0 ? void 0 : product.draftTemplates) && product.draftTemplates.length > 0;
23
+ }
24
+ export function productAllowsClientDesign(product) {
25
+ return Boolean((product === null || product === void 0 ? void 0 : product.needsDrafting) && (product === null || product === void 0 ? void 0 : product.allowClientDraftContribution) && productHasDraftTemplates(product));
26
+ }
27
+ export function productHasVariationGroups(product) {
28
+ return productHasGroups(product);
29
+ }
30
+ export function designGroupCount(product, formValues) {
31
+ if (!productHasVariationGroups(product)) return 1;
32
+ var groups = formValues === null || formValues === void 0 ? void 0 : formValues.variationsGroups;
33
+ return Array.isArray(groups) && groups.length > 0 ? groups.length : 1;
34
+ }
35
+ export function parseSelectedOptionIds(value) {
36
+ if (value === undefined || value === null || value === '') return [];
37
+ return String(value).split(',').map(function (s) {
38
+ return parseInt(s.trim(), 10);
39
+ }).filter(function (n) {
40
+ return !isNaN(n);
41
+ });
42
+ }
43
+ export function selectedOptionIdsFromVariations(variations) {
44
+ var ids = new Set();
45
+ var _iterator = _createForOfIteratorHelper(variations || []),
46
+ _step;
47
+ try {
48
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
49
+ var variation = _step.value;
50
+ var _iterator2 = _createForOfIteratorHelper(parseSelectedOptionIds(variation === null || variation === void 0 ? void 0 : variation.value)),
51
+ _step2;
52
+ try {
53
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
54
+ var id = _step2.value;
55
+ ids.add(id);
56
+ }
57
+ } catch (err) {
58
+ _iterator2.e(err);
59
+ } finally {
60
+ _iterator2.f();
61
+ }
62
+ }
63
+ } catch (err) {
64
+ _iterator.e(err);
65
+ } finally {
66
+ _iterator.f();
67
+ }
68
+ return ids;
69
+ }
70
+ export function isTemplateVisible(template, selectedOptionIds) {
71
+ var required = template === null || template === void 0 ? void 0 : template.selectedByVariationFieldOptions;
72
+ if (!Array.isArray(required) || required.length === 0) return true;
73
+ return required.every(function (opt) {
74
+ return (opt === null || opt === void 0 ? void 0 : opt.id) && selectedOptionIds.has(opt.id);
75
+ });
76
+ }
77
+ export function visibleTemplatesForGroup(product, independentVariations, groupVariations) {
78
+ var selected = selectedOptionIdsFromVariations([].concat(_toConsumableArray(independentVariations || []), _toConsumableArray(groupVariations || [])));
79
+ return ((product === null || product === void 0 ? void 0 : product.draftTemplates) || []).filter(function (template) {
80
+ return isTemplateVisible(template, selected);
81
+ });
82
+ }
83
+ export function blankTemplate(product) {
84
+ var _product$draftTemplat, _product$featureImage, _product$draftTemplat2, _product$featureImage2;
85
+ var fromProduct = Number(product === null || product === void 0 || (_product$draftTemplat = product.draftTemplates) === null || _product$draftTemplat === void 0 || (_product$draftTemplat = _product$draftTemplat[0]) === null || _product$draftTemplat === void 0 ? void 0 : _product$draftTemplat.width) || Number(product === null || product === void 0 || (_product$featureImage = product.featureImage) === null || _product$featureImage === void 0 ? void 0 : _product$featureImage.width) || DEFAULT_ARTBOARD.width;
86
+ var height = Number(product === null || product === void 0 || (_product$draftTemplat2 = product.draftTemplates) === null || _product$draftTemplat2 === void 0 || (_product$draftTemplat2 = _product$draftTemplat2[0]) === null || _product$draftTemplat2 === void 0 ? void 0 : _product$draftTemplat2.height) || Number(product === null || product === void 0 || (_product$featureImage2 = product.featureImage) === null || _product$featureImage2 === void 0 ? void 0 : _product$featureImage2.height) || DEFAULT_ARTBOARD.height;
87
+ return {
88
+ id: BLANK_TEMPLATE_ID,
89
+ name: 'Artwork',
90
+ width: fromProduct,
91
+ height: height,
92
+ file: null,
93
+ editedByVariationFields: [],
94
+ selectedByVariationFieldOptions: []
95
+ };
96
+ }
97
+ export function templatesForGroup(product, independentVariations, groupVariations) {
98
+ var visible = visibleTemplatesForGroup(product, independentVariations, groupVariations);
99
+ return visible.length ? visible : [blankTemplate(product)];
100
+ }
101
+ export function canvasKindForFieldType(fieldType) {
102
+ switch (parseInt(String(fieldType), 10)) {
103
+ case FieldType.TEXT_INPUT:
104
+ case FieldType.TEXT_AREA:
105
+ case FieldType.NUMBER_INPUT:
106
+ case FieldType.SELECT:
107
+ case FieldType.RADIO:
108
+ case FieldType.CHECKBOX:
109
+ return 'text';
110
+ case FieldType.FILE_UPLOAD:
111
+ case FieldType.IMAGE_SELECT:
112
+ return 'image';
113
+ case FieldType.COLOUR_PICKER:
114
+ case FieldType.COLOUR_SELECT:
115
+ case FieldType.COLOUR_EXTRACT:
116
+ return 'rect';
117
+ default:
118
+ return null;
119
+ }
120
+ }
121
+ function optionById(variation, id) {
122
+ var _variation$variationF;
123
+ var fromSelectable = ((variation === null || variation === void 0 ? void 0 : variation.selectableOptions) || []).find(function (option) {
124
+ return option.optionId === id || option.id === id;
125
+ });
126
+ if (fromSelectable) return fromSelectable;
127
+ return ((variation === null || variation === void 0 || (_variation$variationF = variation.variationField) === null || _variation$variationF === void 0 ? void 0 : _variation$variationF.options) || []).find(function (option) {
128
+ return option.id === id || option.optionId === id;
129
+ });
130
+ }
131
+ export function variationCanvasContent(variation) {
132
+ var field = variation === null || variation === void 0 ? void 0 : variation.variationField;
133
+ var kind = canvasKindForFieldType(field === null || field === void 0 ? void 0 : field.fieldType);
134
+ if (!kind) return {
135
+ kind: null
136
+ };
137
+ var type = parseInt(String(field.fieldType), 10);
138
+ if (kind === 'text') {
139
+ if (type === FieldType.SELECT || type === FieldType.RADIO || type === FieldType.CHECKBOX) {
140
+ var names = parseSelectedOptionIds(variation.value).map(function (id) {
141
+ var _optionById;
142
+ return (_optionById = optionById(variation, id)) === null || _optionById === void 0 ? void 0 : _optionById.value;
143
+ }).filter(Boolean);
144
+ return {
145
+ kind: kind,
146
+ text: names.join(', ')
147
+ };
148
+ }
149
+ return {
150
+ kind: kind,
151
+ text: (variation === null || variation === void 0 ? void 0 : variation.value) != null && variation.value !== '' ? String(variation.value) : ''
152
+ };
153
+ }
154
+ if (kind === 'image') {
155
+ if (type === FieldType.FILE_UPLOAD) {
156
+ var _file = ((variation === null || variation === void 0 ? void 0 : variation.variationFiles) || [])[0];
157
+ return {
158
+ kind: kind,
159
+ src: (_file === null || _file === void 0 ? void 0 : _file.viewUrl) || (_file === null || _file === void 0 ? void 0 : _file.cachedViewUrl) || ''
160
+ };
161
+ }
162
+ var _ids = parseSelectedOptionIds(variation.value);
163
+ var _option = _ids.length ? optionById(variation, _ids[0]) : null;
164
+ var file = _option === null || _option === void 0 ? void 0 : _option.linkedFile;
165
+ return {
166
+ kind: kind,
167
+ src: (file === null || file === void 0 ? void 0 : file.viewUrl) || (file === null || file === void 0 ? void 0 : file.cachedViewUrl) || ''
168
+ };
169
+ }
170
+ if (type === FieldType.COLOUR_PICKER) {
171
+ return {
172
+ kind: kind,
173
+ fill: normaliseCssColour(variation === null || variation === void 0 ? void 0 : variation.value) || '#000000'
174
+ };
175
+ }
176
+ var ids = parseSelectedOptionIds(variation.value);
177
+ var option = ids.length ? optionById(variation, ids[0]) : null;
178
+ var selected = ((variation === null || variation === void 0 ? void 0 : variation.selectedOptions) || [])[0];
179
+ return {
180
+ kind: kind,
181
+ fill: normaliseCssColour(option === null || option === void 0 ? void 0 : option.colour, selected === null || selected === void 0 ? void 0 : selected.colour, option === null || option === void 0 ? void 0 : option.value, selected === null || selected === void 0 ? void 0 : selected.value, variation === null || variation === void 0 ? void 0 : variation.value)
182
+ };
183
+ }
184
+ var HEX_COLOUR = /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
185
+ var CSS_FUNCTION_COLOUR = /^(rgba?|hsla?)\(/i;
186
+ export function normaliseCssColour() {
187
+ for (var _len = arguments.length, candidates = new Array(_len), _key = 0; _key < _len; _key++) {
188
+ candidates[_key] = arguments[_key];
189
+ }
190
+ for (var _i = 0, _candidates = candidates; _i < _candidates.length; _i++) {
191
+ var value = _candidates[_i];
192
+ if (value == null || value === '') continue;
193
+ var raw = String(value).trim();
194
+ if (!raw || /^\d+$/.test(raw)) continue;
195
+ if (HEX_COLOUR.test(raw)) {
196
+ if (raw.length === 4) {
197
+ return "#".concat(raw[1]).concat(raw[1]).concat(raw[2]).concat(raw[2]).concat(raw[3]).concat(raw[3]);
198
+ }
199
+ return raw;
200
+ }
201
+ if (CSS_FUNCTION_COLOUR.test(raw)) return raw;
202
+ if (/^[a-z][a-z\s-]{2,}$/i.test(raw)) return raw;
203
+ }
204
+ return undefined;
205
+ }
206
+ export function linkedVariationsForTemplate(template, variations) {
207
+ var linkedIds = new Set(((template === null || template === void 0 ? void 0 : template.editedByVariationFields) || []).map(function (field) {
208
+ return field === null || field === void 0 ? void 0 : field.id;
209
+ }).filter(function (id) {
210
+ return id != null;
211
+ }));
212
+ if (!linkedIds.size) return [];
213
+ return (variations || []).filter(function (variation) {
214
+ var _variation$variationF2;
215
+ return linkedIds.has(variation === null || variation === void 0 || (_variation$variationF2 = variation.variationField) === null || _variation$variationF2 === void 0 ? void 0 : _variation$variationF2.id);
216
+ });
217
+ }
218
+ export function variationsForGroup(formValues, groupIndex) {
219
+ var _formValues$variation;
220
+ var independent = (formValues === null || formValues === void 0 ? void 0 : formValues.variations) || [];
221
+ var group = (formValues === null || formValues === void 0 || (_formValues$variation = formValues.variationsGroups) === null || _formValues$variation === void 0 || (_formValues$variation = _formValues$variation[groupIndex]) === null || _formValues$variation === void 0 ? void 0 : _formValues$variation.variations) || [];
222
+ return [].concat(_toConsumableArray(independent), _toConsumableArray(group));
223
+ }
224
+ function isValidBbox(bbox) {
225
+ if (!Array.isArray(bbox) || bbox.length !== 4) return false;
226
+ var _bbox$map = bbox.map(Number),
227
+ _bbox$map2 = _slicedToArray(_bbox$map, 4),
228
+ x = _bbox$map2[0],
229
+ y = _bbox$map2[1],
230
+ w = _bbox$map2[2],
231
+ h = _bbox$map2[3];
232
+ return w > 0 && h > 0 && x >= 0 && x <= 1 && y >= 0 && y <= 1;
233
+ }
234
+ export function regionsForRole(customisationMap, role) {
235
+ var regions = customisationMap === null || customisationMap === void 0 ? void 0 : customisationMap.regions;
236
+ if (!Array.isArray(regions)) return [];
237
+ return regions.filter(function (region) {
238
+ return (region === null || region === void 0 ? void 0 : region.role) === role && isValidBbox(region.bbox);
239
+ }).map(function (region) {
240
+ return region.bbox.map(Number);
241
+ });
242
+ }
243
+ export function bboxToPixels(bbox, width, height) {
244
+ var _bbox = _slicedToArray(bbox, 4),
245
+ x = _bbox[0],
246
+ y = _bbox[1],
247
+ w = _bbox[2],
248
+ h = _bbox[3];
249
+ return {
250
+ x: x * width,
251
+ y: y * height,
252
+ width: w * width,
253
+ height: h * height
254
+ };
255
+ }
256
+ export function fieldBindingsFrom(template) {
257
+ var _template$customisati;
258
+ var raw = template === null || template === void 0 || (_template$customisati = template.customisationMap) === null || _template$customisati === void 0 ? void 0 : _template$customisati.fieldBindings;
259
+ if (!Array.isArray(raw)) return [];
260
+ return raw.filter(function (item) {
261
+ return item && item.fieldId != null;
262
+ });
263
+ }
264
+ export function bindingForField(bindings, fieldId) {
265
+ var id = Number(fieldId);
266
+ return bindings.find(function (item) {
267
+ return Number(item.fieldId) === id;
268
+ });
269
+ }
270
+ function fieldName(field) {
271
+ return String((field === null || field === void 0 ? void 0 : field.name) || '').toLowerCase();
272
+ }
273
+ function isColourKind(kind) {
274
+ return kind === 'rect';
275
+ }
276
+ export function inferArtworkRole(field) {
277
+ var linkedFields = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
278
+ var kind = canvasKindForFieldType(field === null || field === void 0 ? void 0 : field.fieldType);
279
+ if (kind === 'image') return 'image';
280
+ if (kind === 'text') return 'text';
281
+ if (!isColourKind(kind)) return 'auto';
282
+ var name = fieldName(field);
283
+ if (/(text|font|letter|copy)/.test(name)) return 'text_fill';
284
+ if (/(wrist|band|base|body|ground|blank)/.test(name)) return 'body_colour_fill';
285
+ var hasText = linkedFields.some(function (item) {
286
+ return canvasKindForFieldType(item === null || item === void 0 ? void 0 : item.fieldType) === 'text';
287
+ });
288
+ return hasText ? 'text_fill' : 'body_colour_fill';
289
+ }
290
+ export function resolveArtworkRole(field, template) {
291
+ var linkedFields = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
292
+ var inferred = inferArtworkRole(field, linkedFields);
293
+ if (inferred === 'body_colour_fill') return 'body_colour_fill';
294
+ var binding = bindingForField(fieldBindingsFrom(template), field === null || field === void 0 ? void 0 : field.id);
295
+ if (binding !== null && binding !== void 0 && binding.role && binding.role !== 'auto') return binding.role;
296
+ return inferred;
297
+ }
298
+ export function inferTextTargetFieldId(field, template) {
299
+ var linkedFields = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
300
+ var binding = bindingForField(fieldBindingsFrom(template), field === null || field === void 0 ? void 0 : field.id);
301
+ if ((binding === null || binding === void 0 ? void 0 : binding.targetFieldId) != null) return Number(binding.targetFieldId);
302
+ var textField = linkedFields.find(function (item) {
303
+ return canvasKindForFieldType(item === null || item === void 0 ? void 0 : item.fieldType) === 'text' && (item === null || item === void 0 ? void 0 : item.id) != null;
304
+ });
305
+ return (textField === null || textField === void 0 ? void 0 : textField.id) != null ? Number(textField.id) : undefined;
306
+ }
307
+ export function fitInside(box, contentWidth, contentHeight) {
308
+ var lockAspectRatio = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
309
+ if (!lockAspectRatio || !(contentWidth > 0) || !(contentHeight > 0) || !(box.width > 0) || !(box.height > 0)) {
310
+ return _objectSpread({}, box);
311
+ }
312
+ var scale = Math.min(box.width / contentWidth, box.height / contentHeight);
313
+ var width = contentWidth * scale;
314
+ var height = contentHeight * scale;
315
+ return {
316
+ x: box.x + (box.width - width) / 2,
317
+ y: box.y + (box.height - height) / 2,
318
+ width: width,
319
+ height: height
320
+ };
321
+ }
322
+ export function shouldLockImageAspect(field, template) {
323
+ var binding = bindingForField(fieldBindingsFrom(template), field === null || field === void 0 ? void 0 : field.id);
324
+ if (typeof (binding === null || binding === void 0 ? void 0 : binding.lockAspectRatio) === 'boolean') return binding.lockAspectRatio;
325
+ if (typeof (field === null || field === void 0 ? void 0 : field.aspectRatioLock) === 'boolean') return field.aspectRatioLock;
326
+ return true;
327
+ }
328
+ export function isBackgroundFill(obj) {
329
+ return (obj === null || obj === void 0 ? void 0 : obj.type) === 'rect';
330
+ }
331
+ export function isFullArtboardFill(obj, artWidth, artHeight) {
332
+ return Number(obj.width) >= artWidth * 0.9 && Number(obj.height) >= artHeight * 0.9 && Number(obj.x) <= artWidth * 0.05 && Number(obj.y) <= artHeight * 0.05;
333
+ }
334
+ export function measureDraftText(text) {
335
+ var fontSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 48;
336
+ var fontFamily = arguments.length > 2 ? arguments[2] : undefined;
337
+ var lines = String(text || 'Text').split('\n');
338
+ var size = Math.max(12, Number(fontSize) || 48);
339
+ var width = 0;
340
+ if (typeof document !== 'undefined') {
341
+ var canvas = document.createElement('canvas');
342
+ var ctx = canvas.getContext('2d');
343
+ if (ctx) {
344
+ ctx.font = "".concat(size, "px ").concat(cssFontFamily(fontFamily));
345
+ width = Math.max.apply(Math, _toConsumableArray(lines.map(function (line) {
346
+ return ctx.measureText(line || ' ').width;
347
+ })).concat([0]));
348
+ }
349
+ }
350
+ if (!(width > 0)) {
351
+ width = Math.max.apply(Math, _toConsumableArray(lines.map(function (line) {
352
+ return (line || ' ').length;
353
+ })).concat([1])) * size * 0.62;
354
+ }
355
+ return {
356
+ width: Math.ceil(width + size * 0.16),
357
+ height: Math.ceil(Math.max(1, lines.length) * size * 1.15)
358
+ };
359
+ }
360
+ export function fitTextBox(obj) {
361
+ var measured = measureDraftText(obj.text || 'Text', obj.fontSize, obj.fontFamily);
362
+ var width = Math.max(24, measured.width);
363
+ var height = Math.max(20, measured.height);
364
+ var prevW = Number(obj.width) > 0 ? Number(obj.width) : width;
365
+ var prevH = Number(obj.height) > 0 ? Number(obj.height) : height;
366
+ return {
367
+ width: width,
368
+ height: height,
369
+ x: (Number(obj.x) || 0) + (prevW - width) / 2,
370
+ y: (Number(obj.y) || 0) + (prevH - height) / 2
371
+ };
372
+ }
373
+ function placementBoxes(role, kind, template) {
374
+ if (role === 'body_colour_fill' || kind === 'rect') {
375
+ var body = regionsForRole(template === null || template === void 0 ? void 0 : template.customisationMap, 'body_colour_fill');
376
+ if (body.length) return body;
377
+ var print = regionsForRole(template === null || template === void 0 ? void 0 : template.customisationMap, 'print_area');
378
+ if (print.length) return print;
379
+ return [[0, 0, 1, 1]];
380
+ }
381
+ if (kind === 'text') {
382
+ var placeholders = regionsForRole(template === null || template === void 0 ? void 0 : template.customisationMap, 'text_placeholder');
383
+ if (placeholders.length) return placeholders;
384
+ return regionsForRole(template === null || template === void 0 ? void 0 : template.customisationMap, 'print_area');
385
+ }
386
+ return regionsForRole(template === null || template === void 0 ? void 0 : template.customisationMap, 'print_area');
387
+ }
388
+ export function defaultPlacement(kind, index, artWidth, artHeight) {
389
+ var pad = Math.max(24, artWidth * 0.04);
390
+ if (kind === 'image') {
391
+ return {
392
+ x: artWidth * 0.2,
393
+ y: artHeight * 0.2,
394
+ width: artWidth * 0.6,
395
+ height: artHeight * 0.6
396
+ };
397
+ }
398
+ if (kind === 'rect') {
399
+ return {
400
+ x: 0,
401
+ y: 0,
402
+ width: artWidth,
403
+ height: artHeight
404
+ };
405
+ }
406
+ return {
407
+ x: pad,
408
+ y: pad + index * Math.max(64, artHeight * 0.08),
409
+ width: artWidth - pad * 2,
410
+ height: Math.max(56, artHeight * 0.07)
411
+ };
412
+ }
413
+ export function createObjectId() {
414
+ return "obj-".concat(Date.now(), "-").concat(Math.random().toString(36).slice(2, 8));
415
+ }
416
+ export function seedOrSyncCanvas(existing, template, variations) {
417
+ var width = Number(template === null || template === void 0 ? void 0 : template.width) || DEFAULT_ARTBOARD.width;
418
+ var height = Number(template === null || template === void 0 ? void 0 : template.height) || DEFAULT_ARTBOARD.height;
419
+ var objects = ((existing === null || existing === void 0 ? void 0 : existing.objects) || []).map(function (obj) {
420
+ return obj.type === 'text' ? _objectSpread(_objectSpread({}, obj), fitTextBox(obj)) : _objectSpread({}, obj);
421
+ });
422
+ var detached = new Set((existing === null || existing === void 0 ? void 0 : existing.detachedFieldIds) || []);
423
+ var linked = linkedVariationsForTemplate(template, variations);
424
+ var linkedFields = linked.map(function (variation) {
425
+ return variation === null || variation === void 0 ? void 0 : variation.variationField;
426
+ }).filter(Boolean);
427
+ var usedRegions = {};
428
+ var _iterator3 = _createForOfIteratorHelper(linked),
429
+ _step3;
430
+ try {
431
+ var _loop = function _loop() {
432
+ var variation = _step3.value;
433
+ var field = variation === null || variation === void 0 ? void 0 : variation.variationField;
434
+ if (resolveArtworkRole(field, template, linkedFields) !== 'text_fill') return 1; // continue
435
+ var index = objects.findIndex(function (obj) {
436
+ return obj.merchiFieldId === (field === null || field === void 0 ? void 0 : field.id) && obj.type === 'rect';
437
+ });
438
+ if (index >= 0) objects.splice(index, 1);
439
+ };
440
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
441
+ if (_loop()) continue;
442
+ }
443
+ } catch (err) {
444
+ _iterator3.e(err);
445
+ } finally {
446
+ _iterator3.f();
447
+ }
448
+ var applyColourToText = function applyColourToText(targetFieldId, fill, colourFieldId) {
449
+ if (!fill || targetFieldId == null) return false;
450
+ var textObj = objects.find(function (obj) {
451
+ return obj.merchiFieldId === targetFieldId && obj.type === 'text';
452
+ });
453
+ if (!textObj) return false;
454
+ textObj.fill = fill;
455
+ textObj.colourFieldId = colourFieldId;
456
+ return true;
457
+ };
458
+ var placeObject = function placeObject(kind, role, field, fieldId, content) {
459
+ var boxes = placementBoxes(role, kind, template);
460
+ var key = "".concat(role, ":").concat(kind);
461
+ var regionIndex = usedRegions[key] || 0;
462
+ usedRegions[key] = regionIndex + 1;
463
+ var box = boxes[regionIndex] || boxes[0];
464
+ var place = box ? bboxToPixels(box, width, height) : defaultPlacement(kind, objects.length, width, height);
465
+ var lockAspectRatio = kind === 'image' ? shouldLockImageAspect(field, template) : undefined;
466
+ var next = _objectSpread(_objectSpread({
467
+ id: createObjectId(),
468
+ type: kind,
469
+ merchiFieldId: fieldId,
470
+ artworkRole: role,
471
+ locked: kind === 'rect',
472
+ rotation: 0,
473
+ scaleX: 1,
474
+ scaleY: 1,
475
+ lockAspectRatio: lockAspectRatio
476
+ }, place), {}, {
477
+ text: content.text,
478
+ src: content.src,
479
+ fill: content.fill || (kind === 'text' ? '#111111' : undefined),
480
+ fontFamily: kind === 'text' ? DEFAULT_DRAFT_FONT : undefined,
481
+ fontSize: Math.max(28, Math.round(place.height * 0.62))
482
+ });
483
+ if (kind === 'text') Object.assign(next, fitTextBox(next));
484
+ if (kind === 'rect') objects.unshift(next);else objects.push(next);
485
+ };
486
+ var _iterator4 = _createForOfIteratorHelper(linked),
487
+ _step4;
488
+ try {
489
+ var _loop2 = function _loop2() {
490
+ var variation = _step4.value;
491
+ var field = variation === null || variation === void 0 ? void 0 : variation.variationField;
492
+ var fieldId = field === null || field === void 0 ? void 0 : field.id;
493
+ var content = variationCanvasContent(variation);
494
+ if (!content.kind || fieldId == null || detached.has(fieldId)) return 0; // continue
495
+ var role = resolveArtworkRole(field, template, linkedFields);
496
+ if (role === 'text_fill') return 0; // continue
497
+ var found = objects.find(function (obj) {
498
+ return obj.merchiFieldId === fieldId;
499
+ });
500
+ if (found) {
501
+ if (content.kind === 'text' && content.text != null) {
502
+ found.text = content.text;
503
+ Object.assign(found, fitTextBox(found));
504
+ }
505
+ if (content.kind === 'image' && content.src) found.src = content.src;
506
+ if (content.kind === 'rect' && content.fill) found.fill = content.fill;
507
+ if (found.type === 'image') {
508
+ found.lockAspectRatio = shouldLockImageAspect(field, template);
509
+ }
510
+ if (found.type === 'rect') {
511
+ found.locked = true;
512
+ found.artworkRole = role;
513
+ }
514
+ return 0; // continue
515
+ }
516
+ if (content.kind === 'text' && !content.text) return 0; // continue
517
+ if (content.kind === 'image' && !content.src) return 0; // continue
518
+ if (content.kind === 'rect' && !content.fill) return 0; // continue
519
+ placeObject(content.kind, role, field, fieldId, content);
520
+ },
521
+ _ret;
522
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
523
+ _ret = _loop2();
524
+ if (_ret === 0) continue;
525
+ }
526
+ } catch (err) {
527
+ _iterator4.e(err);
528
+ } finally {
529
+ _iterator4.f();
530
+ }
531
+ var _iterator5 = _createForOfIteratorHelper(linked),
532
+ _step5;
533
+ try {
534
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
535
+ var variation = _step5.value;
536
+ var field = variation === null || variation === void 0 ? void 0 : variation.variationField;
537
+ var fieldId = field === null || field === void 0 ? void 0 : field.id;
538
+ var content = variationCanvasContent(variation);
539
+ if (fieldId == null || detached.has(fieldId) || !content.fill) continue;
540
+ var role = resolveArtworkRole(field, template, linkedFields);
541
+ if (role !== 'text_fill') continue;
542
+ var targetId = inferTextTargetFieldId(field, template, linkedFields);
543
+ applyColourToText(targetId, content.fill, fieldId);
544
+ }
545
+ } catch (err) {
546
+ _iterator5.e(err);
547
+ } finally {
548
+ _iterator5.f();
549
+ }
550
+ return {
551
+ width: width,
552
+ height: height,
553
+ objects: objects,
554
+ detachedFieldIds: Array.from(detached)
555
+ };
556
+ }
557
+ export function detachField(state, objectId) {
558
+ var target = state.objects.find(function (obj) {
559
+ return obj.id === objectId;
560
+ });
561
+ var detachedFieldIds = _toConsumableArray(state.detachedFieldIds || []);
562
+ if ((target === null || target === void 0 ? void 0 : target.merchiFieldId) != null && !detachedFieldIds.includes(target.merchiFieldId)) {
563
+ detachedFieldIds.push(target.merchiFieldId);
564
+ }
565
+ return _objectSpread(_objectSpread({}, state), {}, {
566
+ objects: state.objects.filter(function (obj) {
567
+ return obj.id !== objectId;
568
+ }),
569
+ detachedFieldIds: detachedFieldIds
570
+ });
571
+ }
572
+ export function printAreaGuides(template) {
573
+ var width = Number(template === null || template === void 0 ? void 0 : template.width) || DEFAULT_ARTBOARD.width;
574
+ var height = Number(template === null || template === void 0 ? void 0 : template.height) || DEFAULT_ARTBOARD.height;
575
+ return regionsForRole(template === null || template === void 0 ? void 0 : template.customisationMap, 'print_area').map(function (bbox) {
576
+ return bboxToPixels(bbox, width, height);
577
+ });
578
+ }
579
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCTEFOS19URU1QTEFURV9JRCIsIkRFRkFVTFRfQVJUQk9BUkQiLCJGaWVsZFR5cGUiLCJERUZBVUxUX0RSQUZUX0ZPTlQiLCJjc3NGb250RmFtaWx5IiwicHJvZHVjdEhhc0dyb3VwcyIsInByb2R1Y3RIYXNEcmFmdFRlbXBsYXRlcyIsInByb2R1Y3QiLCJBcnJheSIsImlzQXJyYXkiLCJkcmFmdFRlbXBsYXRlcyIsImxlbmd0aCIsInByb2R1Y3RBbGxvd3NDbGllbnREZXNpZ24iLCJCb29sZWFuIiwibmVlZHNEcmFmdGluZyIsImFsbG93Q2xpZW50RHJhZnRDb250cmlidXRpb24iLCJwcm9kdWN0SGFzVmFyaWF0aW9uR3JvdXBzIiwiZGVzaWduR3JvdXBDb3VudCIsImZvcm1WYWx1ZXMiLCJncm91cHMiLCJ2YXJpYXRpb25zR3JvdXBzIiwicGFyc2VTZWxlY3RlZE9wdGlvbklkcyIsInZhbHVlIiwidW5kZWZpbmVkIiwiU3RyaW5nIiwic3BsaXQiLCJtYXAiLCJzIiwicGFyc2VJbnQiLCJ0cmltIiwiZmlsdGVyIiwibiIsImlzTmFOIiwic2VsZWN0ZWRPcHRpb25JZHNGcm9tVmFyaWF0aW9ucyIsInZhcmlhdGlvbnMiLCJpZHMiLCJTZXQiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwiZG9uZSIsInZhcmlhdGlvbiIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJpZCIsImFkZCIsImVyciIsImUiLCJmIiwiaXNUZW1wbGF0ZVZpc2libGUiLCJ0ZW1wbGF0ZSIsInNlbGVjdGVkT3B0aW9uSWRzIiwicmVxdWlyZWQiLCJzZWxlY3RlZEJ5VmFyaWF0aW9uRmllbGRPcHRpb25zIiwiZXZlcnkiLCJvcHQiLCJoYXMiLCJ2aXNpYmxlVGVtcGxhdGVzRm9yR3JvdXAiLCJpbmRlcGVuZGVudFZhcmlhdGlvbnMiLCJncm91cFZhcmlhdGlvbnMiLCJzZWxlY3RlZCIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheSIsImJsYW5rVGVtcGxhdGUiLCJfcHJvZHVjdCRkcmFmdFRlbXBsYXQiLCJfcHJvZHVjdCRmZWF0dXJlSW1hZ2UiLCJfcHJvZHVjdCRkcmFmdFRlbXBsYXQyIiwiX3Byb2R1Y3QkZmVhdHVyZUltYWdlMiIsImZyb21Qcm9kdWN0IiwiTnVtYmVyIiwid2lkdGgiLCJmZWF0dXJlSW1hZ2UiLCJoZWlnaHQiLCJuYW1lIiwiZmlsZSIsImVkaXRlZEJ5VmFyaWF0aW9uRmllbGRzIiwidGVtcGxhdGVzRm9yR3JvdXAiLCJ2aXNpYmxlIiwiY2FudmFzS2luZEZvckZpZWxkVHlwZSIsImZpZWxkVHlwZSIsIlRFWFRfSU5QVVQiLCJURVhUX0FSRUEiLCJOVU1CRVJfSU5QVVQiLCJTRUxFQ1QiLCJSQURJTyIsIkNIRUNLQk9YIiwiRklMRV9VUExPQUQiLCJJTUFHRV9TRUxFQ1QiLCJDT0xPVVJfUElDS0VSIiwiQ09MT1VSX1NFTEVDVCIsIkNPTE9VUl9FWFRSQUNUIiwib3B0aW9uQnlJZCIsIl92YXJpYXRpb24kdmFyaWF0aW9uRiIsImZyb21TZWxlY3RhYmxlIiwic2VsZWN0YWJsZU9wdGlvbnMiLCJmaW5kIiwib3B0aW9uIiwib3B0aW9uSWQiLCJ2YXJpYXRpb25GaWVsZCIsIm9wdGlvbnMiLCJ2YXJpYXRpb25DYW52YXNDb250ZW50IiwiZmllbGQiLCJraW5kIiwidHlwZSIsIm5hbWVzIiwiX29wdGlvbkJ5SWQiLCJ0ZXh0Iiwiam9pbiIsInZhcmlhdGlvbkZpbGVzIiwic3JjIiwidmlld1VybCIsImNhY2hlZFZpZXdVcmwiLCJsaW5rZWRGaWxlIiwiZmlsbCIsIm5vcm1hbGlzZUNzc0NvbG91ciIsInNlbGVjdGVkT3B0aW9ucyIsImNvbG91ciIsIkhFWF9DT0xPVVIiLCJDU1NfRlVOQ1RJT05fQ09MT1VSIiwiX2xlbiIsImFyZ3VtZW50cyIsImNhbmRpZGF0ZXMiLCJfa2V5IiwiX2kiLCJfY2FuZGlkYXRlcyIsInJhdyIsInRlc3QiLCJsaW5rZWRWYXJpYXRpb25zRm9yVGVtcGxhdGUiLCJsaW5rZWRJZHMiLCJzaXplIiwiX3ZhcmlhdGlvbiR2YXJpYXRpb25GMiIsInZhcmlhdGlvbnNGb3JHcm91cCIsImdyb3VwSW5kZXgiLCJfZm9ybVZhbHVlcyR2YXJpYXRpb24iLCJpbmRlcGVuZGVudCIsImdyb3VwIiwiaXNWYWxpZEJib3giLCJiYm94IiwiX2Jib3gkbWFwIiwiX2Jib3gkbWFwMiIsIl9zbGljZWRUb0FycmF5IiwieCIsInkiLCJ3IiwiaCIsInJlZ2lvbnNGb3JSb2xlIiwiY3VzdG9taXNhdGlvbk1hcCIsInJvbGUiLCJyZWdpb25zIiwicmVnaW9uIiwiYmJveFRvUGl4ZWxzIiwiX2Jib3giLCJmaWVsZEJpbmRpbmdzRnJvbSIsIl90ZW1wbGF0ZSRjdXN0b21pc2F0aSIsImZpZWxkQmluZGluZ3MiLCJpdGVtIiwiZmllbGRJZCIsImJpbmRpbmdGb3JGaWVsZCIsImJpbmRpbmdzIiwiZmllbGROYW1lIiwidG9Mb3dlckNhc2UiLCJpc0NvbG91cktpbmQiLCJpbmZlckFydHdvcmtSb2xlIiwibGlua2VkRmllbGRzIiwiaGFzVGV4dCIsInNvbWUiLCJyZXNvbHZlQXJ0d29ya1JvbGUiLCJpbmZlcnJlZCIsImJpbmRpbmciLCJpbmZlclRleHRUYXJnZXRGaWVsZElkIiwidGFyZ2V0RmllbGRJZCIsInRleHRGaWVsZCIsImZpdEluc2lkZSIsImJveCIsImNvbnRlbnRXaWR0aCIsImNvbnRlbnRIZWlnaHQiLCJsb2NrQXNwZWN0UmF0aW8iLCJfb2JqZWN0U3ByZWFkIiwic2NhbGUiLCJNYXRoIiwibWluIiwic2hvdWxkTG9ja0ltYWdlQXNwZWN0IiwiYXNwZWN0UmF0aW9Mb2NrIiwiaXNCYWNrZ3JvdW5kRmlsbCIsIm9iaiIsImlzRnVsbEFydGJvYXJkRmlsbCIsImFydFdpZHRoIiwiYXJ0SGVpZ2h0IiwibWVhc3VyZURyYWZ0VGV4dCIsImZvbnRTaXplIiwiZm9udEZhbWlseSIsImxpbmVzIiwibWF4IiwiZG9jdW1lbnQiLCJjYW52YXMiLCJjcmVhdGVFbGVtZW50IiwiY3R4IiwiZ2V0Q29udGV4dCIsImZvbnQiLCJhcHBseSIsImxpbmUiLCJtZWFzdXJlVGV4dCIsImNlaWwiLCJmaXRUZXh0Qm94IiwibWVhc3VyZWQiLCJwcmV2VyIsInByZXZIIiwicGxhY2VtZW50Qm94ZXMiLCJib2R5IiwicHJpbnQiLCJwbGFjZWhvbGRlcnMiLCJkZWZhdWx0UGxhY2VtZW50IiwiaW5kZXgiLCJwYWQiLCJjcmVhdGVPYmplY3RJZCIsIkRhdGUiLCJub3ciLCJyYW5kb20iLCJ0b1N0cmluZyIsInNsaWNlIiwic2VlZE9yU3luY0NhbnZhcyIsImV4aXN0aW5nIiwib2JqZWN0cyIsImRldGFjaGVkIiwiZGV0YWNoZWRGaWVsZElkcyIsImxpbmtlZCIsInVzZWRSZWdpb25zIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsIl9sb29wIiwiZmluZEluZGV4IiwibWVyY2hpRmllbGRJZCIsInNwbGljZSIsImFwcGx5Q29sb3VyVG9UZXh0IiwiY29sb3VyRmllbGRJZCIsInRleHRPYmoiLCJwbGFjZU9iamVjdCIsImNvbnRlbnQiLCJib3hlcyIsImtleSIsInJlZ2lvbkluZGV4IiwicGxhY2UiLCJuZXh0IiwiYXJ0d29ya1JvbGUiLCJsb2NrZWQiLCJyb3RhdGlvbiIsInNjYWxlWCIsInNjYWxlWSIsInJvdW5kIiwiT2JqZWN0IiwiYXNzaWduIiwidW5zaGlmdCIsInB1c2giLCJfaXRlcmF0b3I0IiwiX3N0ZXA0IiwiX2xvb3AyIiwiZm91bmQiLCJfcmV0IiwiX2l0ZXJhdG9yNSIsIl9zdGVwNSIsInRhcmdldElkIiwiZnJvbSIsImRldGFjaEZpZWxkIiwic3RhdGUiLCJvYmplY3RJZCIsInRhcmdldCIsImluY2x1ZGVzIiwicHJpbnRBcmVhR3VpZGVzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2RyYWZ0VGVtcGxhdGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJMQU5LX1RFTVBMQVRFX0lELFxuICBERUZBVUxUX0FSVEJPQVJELFxuICBEcmFmdEFydHdvcmtSb2xlLFxuICBEcmFmdENhbnZhc09iamVjdCxcbiAgRHJhZnRDYW52YXNPYmplY3RUeXBlLFxuICBEcmFmdENhbnZhc1N0YXRlLFxuICBEcmFmdEZpZWxkQmluZGluZyxcbiAgRmllbGRUeXBlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfRFJBRlRfRk9OVCwgY3NzRm9udEZhbWlseSB9IGZyb20gJy4vZHJhZnRGb250cyc7XG5pbXBvcnQgeyBwcm9kdWN0SGFzR3JvdXBzIH0gZnJvbSAnLi9wcm9kdWN0cyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9kdWN0SGFzRHJhZnRUZW1wbGF0ZXMocHJvZHVjdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHByb2R1Y3Q/LmRyYWZ0VGVtcGxhdGVzKSAmJiBwcm9kdWN0LmRyYWZ0VGVtcGxhdGVzLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9kdWN0QWxsb3dzQ2xpZW50RGVzaWduKHByb2R1Y3Q6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICBwcm9kdWN0Py5uZWVkc0RyYWZ0aW5nXG4gICAgJiYgcHJvZHVjdD8uYWxsb3dDbGllbnREcmFmdENvbnRyaWJ1dGlvblxuICAgICYmIHByb2R1Y3RIYXNEcmFmdFRlbXBsYXRlcyhwcm9kdWN0KSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2R1Y3RIYXNWYXJpYXRpb25Hcm91cHMocHJvZHVjdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9kdWN0SGFzR3JvdXBzKHByb2R1Y3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzaWduR3JvdXBDb3VudChwcm9kdWN0OiBhbnksIGZvcm1WYWx1ZXM6IGFueSk6IG51bWJlciB7XG4gIGlmICghcHJvZHVjdEhhc1ZhcmlhdGlvbkdyb3Vwcyhwcm9kdWN0KSkgcmV0dXJuIDE7XG4gIGNvbnN0IGdyb3VwcyA9IGZvcm1WYWx1ZXM/LnZhcmlhdGlvbnNHcm91cHM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGdyb3VwcykgJiYgZ3JvdXBzLmxlbmd0aCA+IDAgPyBncm91cHMubGVuZ3RoIDogMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VsZWN0ZWRPcHRpb25JZHModmFsdWU6IGFueSk6IG51bWJlcltdIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gW107XG4gIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgLnNwbGl0KCcsJylcbiAgICAubWFwKChzKSA9PiBwYXJzZUludChzLnRyaW0oKSwgMTApKVxuICAgIC5maWx0ZXIoKG4pID0+ICFpc05hTihuKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RlZE9wdGlvbklkc0Zyb21WYXJpYXRpb25zKHZhcmlhdGlvbnM6IGFueVtdKTogU2V0PG51bWJlcj4ge1xuICBjb25zdCBpZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCB2YXJpYXRpb24gb2YgdmFyaWF0aW9ucyB8fCBbXSkge1xuICAgIGZvciAoY29uc3QgaWQgb2YgcGFyc2VTZWxlY3RlZE9wdGlvbklkcyh2YXJpYXRpb24/LnZhbHVlKSkge1xuICAgICAgaWRzLmFkZChpZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpZHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RlbXBsYXRlVmlzaWJsZShcbiAgdGVtcGxhdGU6IGFueSxcbiAgc2VsZWN0ZWRPcHRpb25JZHM6IFNldDxudW1iZXI+LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlcXVpcmVkID0gdGVtcGxhdGU/LnNlbGVjdGVkQnlWYXJpYXRpb25GaWVsZE9wdGlvbnM7XG4gIGlmICghQXJyYXkuaXNBcnJheShyZXF1aXJlZCkgfHwgcmVxdWlyZWQubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHJlcXVpcmVkLmV2ZXJ5KChvcHQ6IGFueSkgPT4gb3B0Py5pZCAmJiBzZWxlY3RlZE9wdGlvbklkcy5oYXMob3B0LmlkKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpYmxlVGVtcGxhdGVzRm9yR3JvdXAoXG4gIHByb2R1Y3Q6IGFueSxcbiAgaW5kZXBlbmRlbnRWYXJpYXRpb25zOiBhbnlbXSxcbiAgZ3JvdXBWYXJpYXRpb25zOiBhbnlbXSxcbik6IGFueVtdIHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBzZWxlY3RlZE9wdGlvbklkc0Zyb21WYXJpYXRpb25zKFtcbiAgICAuLi4oaW5kZXBlbmRlbnRWYXJpYXRpb25zIHx8IFtdKSxcbiAgICAuLi4oZ3JvdXBWYXJpYXRpb25zIHx8IFtdKSxcbiAgXSk7XG4gIHJldHVybiAocHJvZHVjdD8uZHJhZnRUZW1wbGF0ZXMgfHwgW10pLmZpbHRlcigodGVtcGxhdGU6IGFueSkgPT5cbiAgICBpc1RlbXBsYXRlVmlzaWJsZSh0ZW1wbGF0ZSwgc2VsZWN0ZWQpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBibGFua1RlbXBsYXRlKHByb2R1Y3Q/OiBhbnkpIHtcbiAgY29uc3QgZnJvbVByb2R1Y3QgPSBOdW1iZXIocHJvZHVjdD8uZHJhZnRUZW1wbGF0ZXM/LlswXT8ud2lkdGgpXG4gICAgfHwgTnVtYmVyKHByb2R1Y3Q/LmZlYXR1cmVJbWFnZT8ud2lkdGgpXG4gICAgfHwgREVGQVVMVF9BUlRCT0FSRC53aWR0aDtcbiAgY29uc3QgaGVpZ2h0ID0gTnVtYmVyKHByb2R1Y3Q/LmRyYWZ0VGVtcGxhdGVzPy5bMF0/LmhlaWdodClcbiAgICB8fCBOdW1iZXIocHJvZHVjdD8uZmVhdHVyZUltYWdlPy5oZWlnaHQpXG4gICAgfHwgREVGQVVMVF9BUlRCT0FSRC5oZWlnaHQ7XG4gIHJldHVybiB7XG4gICAgaWQ6IEJMQU5LX1RFTVBMQVRFX0lELFxuICAgIG5hbWU6ICdBcnR3b3JrJyxcbiAgICB3aWR0aDogZnJvbVByb2R1Y3QsXG4gICAgaGVpZ2h0LFxuICAgIGZpbGU6IG51bGwsXG4gICAgZWRpdGVkQnlWYXJpYXRpb25GaWVsZHM6IFtdLFxuICAgIHNlbGVjdGVkQnlWYXJpYXRpb25GaWVsZE9wdGlvbnM6IFtdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVzRm9yR3JvdXAoXG4gIHByb2R1Y3Q6IGFueSxcbiAgaW5kZXBlbmRlbnRWYXJpYXRpb25zOiBhbnlbXSxcbiAgZ3JvdXBWYXJpYXRpb25zOiBhbnlbXSxcbik6IGFueVtdIHtcbiAgY29uc3QgdmlzaWJsZSA9IHZpc2libGVUZW1wbGF0ZXNGb3JHcm91cChcbiAgICBwcm9kdWN0LFxuICAgIGluZGVwZW5kZW50VmFyaWF0aW9ucyxcbiAgICBncm91cFZhcmlhdGlvbnMsXG4gICk7XG4gIHJldHVybiB2aXNpYmxlLmxlbmd0aCA/IHZpc2libGUgOiBbYmxhbmtUZW1wbGF0ZShwcm9kdWN0KV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYW52YXNLaW5kRm9yRmllbGRUeXBlKFxuICBmaWVsZFR5cGU6IGFueSxcbik6IERyYWZ0Q2FudmFzT2JqZWN0VHlwZSB8IG51bGwge1xuICBzd2l0Y2ggKHBhcnNlSW50KFN0cmluZyhmaWVsZFR5cGUpLCAxMCkpIHtcbiAgICBjYXNlIEZpZWxkVHlwZS5URVhUX0lOUFVUOlxuICAgIGNhc2UgRmllbGRUeXBlLlRFWFRfQVJFQTpcbiAgICBjYXNlIEZpZWxkVHlwZS5OVU1CRVJfSU5QVVQ6XG4gICAgY2FzZSBGaWVsZFR5cGUuU0VMRUNUOlxuICAgIGNhc2UgRmllbGRUeXBlLlJBRElPOlxuICAgIGNhc2UgRmllbGRUeXBlLkNIRUNLQk9YOlxuICAgICAgcmV0dXJuICd0ZXh0JztcbiAgICBjYXNlIEZpZWxkVHlwZS5GSUxFX1VQTE9BRDpcbiAgICBjYXNlIEZpZWxkVHlwZS5JTUFHRV9TRUxFQ1Q6XG4gICAgICByZXR1cm4gJ2ltYWdlJztcbiAgICBjYXNlIEZpZWxkVHlwZS5DT0xPVVJfUElDS0VSOlxuICAgIGNhc2UgRmllbGRUeXBlLkNPTE9VUl9TRUxFQ1Q6XG4gICAgY2FzZSBGaWVsZFR5cGUuQ09MT1VSX0VYVFJBQ1Q6XG4gICAgICByZXR1cm4gJ3JlY3QnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpb25CeUlkKHZhcmlhdGlvbjogYW55LCBpZDogbnVtYmVyKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZnJvbVNlbGVjdGFibGUgPSAodmFyaWF0aW9uPy5zZWxlY3RhYmxlT3B0aW9ucyB8fCBbXSkuZmluZChcbiAgICAob3B0aW9uOiBhbnkpID0+IG9wdGlvbi5vcHRpb25JZCA9PT0gaWQgfHwgb3B0aW9uLmlkID09PSBpZFxuICApO1xuICBpZiAoZnJvbVNlbGVjdGFibGUpIHJldHVybiBmcm9tU2VsZWN0YWJsZTtcbiAgcmV0dXJuICh2YXJpYXRpb24/LnZhcmlhdGlvbkZpZWxkPy5vcHRpb25zIHx8IFtdKS5maW5kKFxuICAgIChvcHRpb246IGFueSkgPT4gb3B0aW9uLmlkID09PSBpZCB8fCBvcHRpb24ub3B0aW9uSWQgPT09IGlkXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YXJpYXRpb25DYW52YXNDb250ZW50KHZhcmlhdGlvbjogYW55KToge1xuICBraW5kOiBEcmFmdENhbnZhc09iamVjdFR5cGUgfCBudWxsO1xuICB0ZXh0Pzogc3RyaW5nO1xuICBzcmM/OiBzdHJpbmc7XG4gIGZpbGw/OiBzdHJpbmc7XG59IHtcbiAgY29uc3QgZmllbGQgPSB2YXJpYXRpb24/LnZhcmlhdGlvbkZpZWxkO1xuICBjb25zdCBraW5kID0gY2FudmFzS2luZEZvckZpZWxkVHlwZShmaWVsZD8uZmllbGRUeXBlKTtcbiAgaWYgKCFraW5kKSByZXR1cm4geyBraW5kOiBudWxsIH07XG5cbiAgY29uc3QgdHlwZSA9IHBhcnNlSW50KFN0cmluZyhmaWVsZC5maWVsZFR5cGUpLCAxMCk7XG5cbiAgaWYgKGtpbmQgPT09ICd0ZXh0Jykge1xuICAgIGlmIChcbiAgICAgIHR5cGUgPT09IEZpZWxkVHlwZS5TRUxFQ1RcbiAgICAgIHx8IHR5cGUgPT09IEZpZWxkVHlwZS5SQURJT1xuICAgICAgfHwgdHlwZSA9PT0gRmllbGRUeXBlLkNIRUNLQk9YXG4gICAgKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IHBhcnNlU2VsZWN0ZWRPcHRpb25JZHModmFyaWF0aW9uLnZhbHVlKVxuICAgICAgICAubWFwKChpZCkgPT4gb3B0aW9uQnlJZCh2YXJpYXRpb24sIGlkKT8udmFsdWUpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICByZXR1cm4geyBraW5kLCB0ZXh0OiBuYW1lcy5qb2luKCcsICcpIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBraW5kLFxuICAgICAgdGV4dDogdmFyaWF0aW9uPy52YWx1ZSAhPSBudWxsICYmIHZhcmlhdGlvbi52YWx1ZSAhPT0gJydcbiAgICAgICAgPyBTdHJpbmcodmFyaWF0aW9uLnZhbHVlKVxuICAgICAgICA6ICcnLFxuICAgIH07XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ2ltYWdlJykge1xuICAgIGlmICh0eXBlID09PSBGaWVsZFR5cGUuRklMRV9VUExPQUQpIHtcbiAgICAgIGNvbnN0IGZpbGUgPSAodmFyaWF0aW9uPy52YXJpYXRpb25GaWxlcyB8fCBbXSlbMF07XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kLFxuICAgICAgICBzcmM6IGZpbGU/LnZpZXdVcmwgfHwgZmlsZT8uY2FjaGVkVmlld1VybCB8fCAnJyxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGlkcyA9IHBhcnNlU2VsZWN0ZWRPcHRpb25JZHModmFyaWF0aW9uLnZhbHVlKTtcbiAgICBjb25zdCBvcHRpb24gPSBpZHMubGVuZ3RoID8gb3B0aW9uQnlJZCh2YXJpYXRpb24sIGlkc1swXSkgOiBudWxsO1xuICAgIGNvbnN0IGZpbGUgPSBvcHRpb24/LmxpbmtlZEZpbGU7XG4gICAgcmV0dXJuIHsga2luZCwgc3JjOiBmaWxlPy52aWV3VXJsIHx8IGZpbGU/LmNhY2hlZFZpZXdVcmwgfHwgJycgfTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBGaWVsZFR5cGUuQ09MT1VSX1BJQ0tFUikge1xuICAgIHJldHVybiB7IGtpbmQsIGZpbGw6IG5vcm1hbGlzZUNzc0NvbG91cih2YXJpYXRpb24/LnZhbHVlKSB8fCAnIzAwMDAwMCcgfTtcbiAgfVxuICBjb25zdCBpZHMgPSBwYXJzZVNlbGVjdGVkT3B0aW9uSWRzKHZhcmlhdGlvbi52YWx1ZSk7XG4gIGNvbnN0IG9wdGlvbiA9IGlkcy5sZW5ndGggPyBvcHRpb25CeUlkKHZhcmlhdGlvbiwgaWRzWzBdKSA6IG51bGw7XG4gIGNvbnN0IHNlbGVjdGVkID0gKHZhcmlhdGlvbj8uc2VsZWN0ZWRPcHRpb25zIHx8IFtdKVswXTtcbiAgcmV0dXJuIHtcbiAgICBraW5kLFxuICAgIGZpbGw6IG5vcm1hbGlzZUNzc0NvbG91cihcbiAgICAgIG9wdGlvbj8uY29sb3VyLFxuICAgICAgc2VsZWN0ZWQ/LmNvbG91cixcbiAgICAgIG9wdGlvbj8udmFsdWUsXG4gICAgICBzZWxlY3RlZD8udmFsdWUsXG4gICAgICB2YXJpYXRpb24/LnZhbHVlLFxuICAgICksXG4gIH07XG59XG5cbmNvbnN0IEhFWF9DT0xPVVIgPSAvXiMoWzAtOWEtZl17M318WzAtOWEtZl17Nn18WzAtOWEtZl17OH0pJC9pO1xuY29uc3QgQ1NTX0ZVTkNUSU9OX0NPTE9VUiA9IC9eKHJnYmE/fGhzbGE/KVxcKC9pO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXNlQ3NzQ29sb3VyKC4uLmNhbmRpZGF0ZXM6IGFueVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSBjb250aW51ZTtcbiAgICBjb25zdCByYXcgPSBTdHJpbmcodmFsdWUpLnRyaW0oKTtcbiAgICBpZiAoIXJhdyB8fCAvXlxcZCskLy50ZXN0KHJhdykpIGNvbnRpbnVlO1xuICAgIGlmIChIRVhfQ09MT1VSLnRlc3QocmF3KSkge1xuICAgICAgaWYgKHJhdy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgcmV0dXJuIGAjJHtyYXdbMV19JHtyYXdbMV19JHtyYXdbMl19JHtyYXdbMl19JHtyYXdbM119JHtyYXdbM119YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByYXc7XG4gICAgfVxuICAgIGlmIChDU1NfRlVOQ1RJT05fQ09MT1VSLnRlc3QocmF3KSkgcmV0dXJuIHJhdztcbiAgICBpZiAoL15bYS16XVthLXpcXHMtXXsyLH0kL2kudGVzdChyYXcpKSByZXR1cm4gcmF3O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5rZWRWYXJpYXRpb25zRm9yVGVtcGxhdGUoXG4gIHRlbXBsYXRlOiBhbnksXG4gIHZhcmlhdGlvbnM6IGFueVtdLFxuKTogYW55W10ge1xuICBjb25zdCBsaW5rZWRJZHMgPSBuZXcgU2V0KFxuICAgICh0ZW1wbGF0ZT8uZWRpdGVkQnlWYXJpYXRpb25GaWVsZHMgfHwgW10pXG4gICAgICAubWFwKChmaWVsZDogYW55KSA9PiBmaWVsZD8uaWQpXG4gICAgICAuZmlsdGVyKChpZDogYW55KSA9PiBpZCAhPSBudWxsKVxuICApO1xuICBpZiAoIWxpbmtlZElkcy5zaXplKSByZXR1cm4gW107XG4gIHJldHVybiAodmFyaWF0aW9ucyB8fCBbXSkuZmlsdGVyKCh2YXJpYXRpb24pID0+XG4gICAgbGlua2VkSWRzLmhhcyh2YXJpYXRpb24/LnZhcmlhdGlvbkZpZWxkPy5pZClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhdGlvbnNGb3JHcm91cChcbiAgZm9ybVZhbHVlczogYW55LFxuICBncm91cEluZGV4OiBudW1iZXIsXG4pOiBhbnlbXSB7XG4gIGNvbnN0IGluZGVwZW5kZW50ID0gZm9ybVZhbHVlcz8udmFyaWF0aW9ucyB8fCBbXTtcbiAgY29uc3QgZ3JvdXAgPSBmb3JtVmFsdWVzPy52YXJpYXRpb25zR3JvdXBzPy5bZ3JvdXBJbmRleF0/LnZhcmlhdGlvbnMgfHwgW107XG4gIHJldHVybiBbLi4uaW5kZXBlbmRlbnQsIC4uLmdyb3VwXTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEJib3goYmJveDogYW55KTogYmJveCBpcyBudW1iZXJbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShiYm94KSB8fCBiYm94Lmxlbmd0aCAhPT0gNCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBbeCwgeSwgdywgaF0gPSBiYm94Lm1hcChOdW1iZXIpO1xuICByZXR1cm4gdyA+IDAgJiYgaCA+IDAgJiYgeCA+PSAwICYmIHggPD0gMSAmJiB5ID49IDAgJiYgeSA8PSAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uc0ZvclJvbGUoY3VzdG9taXNhdGlvbk1hcDogYW55LCByb2xlOiBzdHJpbmcpOiBudW1iZXJbXVtdIHtcbiAgY29uc3QgcmVnaW9ucyA9IGN1c3RvbWlzYXRpb25NYXA/LnJlZ2lvbnM7XG4gIGlmICghQXJyYXkuaXNBcnJheShyZWdpb25zKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gcmVnaW9uc1xuICAgIC5maWx0ZXIoKHJlZ2lvbjogYW55KSA9PiByZWdpb24/LnJvbGUgPT09IHJvbGUgJiYgaXNWYWxpZEJib3gocmVnaW9uLmJib3gpKVxuICAgIC5tYXAoKHJlZ2lvbjogYW55KSA9PiByZWdpb24uYmJveC5tYXAoTnVtYmVyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYm94VG9QaXhlbHMoXG4gIGJib3g6IG51bWJlcltdLFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICBjb25zdCBbeCwgeSwgdywgaF0gPSBiYm94O1xuICByZXR1cm4ge1xuICAgIHg6IHggKiB3aWR0aCxcbiAgICB5OiB5ICogaGVpZ2h0LFxuICAgIHdpZHRoOiB3ICogd2lkdGgsXG4gICAgaGVpZ2h0OiBoICogaGVpZ2h0LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmllbGRCaW5kaW5nc0Zyb20odGVtcGxhdGU6IGFueSk6IERyYWZ0RmllbGRCaW5kaW5nW10ge1xuICBjb25zdCByYXcgPSB0ZW1wbGF0ZT8uY3VzdG9taXNhdGlvbk1hcD8uZmllbGRCaW5kaW5ncztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJhdykpIHJldHVybiBbXTtcbiAgcmV0dXJuIHJhdy5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbSAmJiBpdGVtLmZpZWxkSWQgIT0gbnVsbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kaW5nRm9yRmllbGQoXG4gIGJpbmRpbmdzOiBEcmFmdEZpZWxkQmluZGluZ1tdLFxuICBmaWVsZElkOiBhbnksXG4pOiBEcmFmdEZpZWxkQmluZGluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGlkID0gTnVtYmVyKGZpZWxkSWQpO1xuICByZXR1cm4gYmluZGluZ3MuZmluZCgoaXRlbSkgPT4gTnVtYmVyKGl0ZW0uZmllbGRJZCkgPT09IGlkKTtcbn1cblxuZnVuY3Rpb24gZmllbGROYW1lKGZpZWxkOiBhbnkpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nKGZpZWxkPy5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBpc0NvbG91cktpbmQoa2luZDogRHJhZnRDYW52YXNPYmplY3RUeXBlIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4ga2luZCA9PT0gJ3JlY3QnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5mZXJBcnR3b3JrUm9sZShcbiAgZmllbGQ6IGFueSxcbiAgbGlua2VkRmllbGRzOiBhbnlbXSA9IFtdLFxuKTogRHJhZnRBcnR3b3JrUm9sZSB7XG4gIGNvbnN0IGtpbmQgPSBjYW52YXNLaW5kRm9yRmllbGRUeXBlKGZpZWxkPy5maWVsZFR5cGUpO1xuICBpZiAoa2luZCA9PT0gJ2ltYWdlJykgcmV0dXJuICdpbWFnZSc7XG4gIGlmIChraW5kID09PSAndGV4dCcpIHJldHVybiAndGV4dCc7XG4gIGlmICghaXNDb2xvdXJLaW5kKGtpbmQpKSByZXR1cm4gJ2F1dG8nO1xuICBjb25zdCBuYW1lID0gZmllbGROYW1lKGZpZWxkKTtcbiAgaWYgKC8odGV4dHxmb250fGxldHRlcnxjb3B5KS8udGVzdChuYW1lKSkgcmV0dXJuICd0ZXh0X2ZpbGwnO1xuICBpZiAoLyh3cmlzdHxiYW5kfGJhc2V8Ym9keXxncm91bmR8YmxhbmspLy50ZXN0KG5hbWUpKSByZXR1cm4gJ2JvZHlfY29sb3VyX2ZpbGwnO1xuICBjb25zdCBoYXNUZXh0ID0gbGlua2VkRmllbGRzLnNvbWUoXG4gICAgKGl0ZW0pID0+IGNhbnZhc0tpbmRGb3JGaWVsZFR5cGUoaXRlbT8uZmllbGRUeXBlKSA9PT0gJ3RleHQnXG4gICk7XG4gIHJldHVybiBoYXNUZXh0ID8gJ3RleHRfZmlsbCcgOiAnYm9keV9jb2xvdXJfZmlsbCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXJ0d29ya1JvbGUoXG4gIGZpZWxkOiBhbnksXG4gIHRlbXBsYXRlOiBhbnksXG4gIGxpbmtlZEZpZWxkczogYW55W10gPSBbXSxcbik6IERyYWZ0QXJ0d29ya1JvbGUge1xuICBjb25zdCBpbmZlcnJlZCA9IGluZmVyQXJ0d29ya1JvbGUoZmllbGQsIGxpbmtlZEZpZWxkcyk7XG4gIGlmIChpbmZlcnJlZCA9PT0gJ2JvZHlfY29sb3VyX2ZpbGwnKSByZXR1cm4gJ2JvZHlfY29sb3VyX2ZpbGwnO1xuICBjb25zdCBiaW5kaW5nID0gYmluZGluZ0ZvckZpZWxkKGZpZWxkQmluZGluZ3NGcm9tKHRlbXBsYXRlKSwgZmllbGQ/LmlkKTtcbiAgaWYgKGJpbmRpbmc/LnJvbGUgJiYgYmluZGluZy5yb2xlICE9PSAnYXV0bycpIHJldHVybiBiaW5kaW5nLnJvbGU7XG4gIHJldHVybiBpbmZlcnJlZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZmVyVGV4dFRhcmdldEZpZWxkSWQoXG4gIGZpZWxkOiBhbnksXG4gIHRlbXBsYXRlOiBhbnksXG4gIGxpbmtlZEZpZWxkczogYW55W10gPSBbXSxcbik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGJpbmRpbmcgPSBiaW5kaW5nRm9yRmllbGQoZmllbGRCaW5kaW5nc0Zyb20odGVtcGxhdGUpLCBmaWVsZD8uaWQpO1xuICBpZiAoYmluZGluZz8udGFyZ2V0RmllbGRJZCAhPSBudWxsKSByZXR1cm4gTnVtYmVyKGJpbmRpbmcudGFyZ2V0RmllbGRJZCk7XG4gIGNvbnN0IHRleHRGaWVsZCA9IGxpbmtlZEZpZWxkcy5maW5kKFxuICAgIChpdGVtKSA9PiBjYW52YXNLaW5kRm9yRmllbGRUeXBlKGl0ZW0/LmZpZWxkVHlwZSkgPT09ICd0ZXh0JyAmJiBpdGVtPy5pZCAhPSBudWxsXG4gICk7XG4gIHJldHVybiB0ZXh0RmllbGQ/LmlkICE9IG51bGwgPyBOdW1iZXIodGV4dEZpZWxkLmlkKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpdEluc2lkZShcbiAgYm94OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9LFxuICBjb250ZW50V2lkdGg6IG51bWJlcixcbiAgY29udGVudEhlaWdodDogbnVtYmVyLFxuICBsb2NrQXNwZWN0UmF0aW8gPSB0cnVlLFxuKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gIGlmIChcbiAgICAhbG9ja0FzcGVjdFJhdGlvXG4gICAgfHwgIShjb250ZW50V2lkdGggPiAwKVxuICAgIHx8ICEoY29udGVudEhlaWdodCA+IDApXG4gICAgfHwgIShib3gud2lkdGggPiAwKVxuICAgIHx8ICEoYm94LmhlaWdodCA+IDApXG4gICkge1xuICAgIHJldHVybiB7IC4uLmJveCB9O1xuICB9XG4gIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oYm94LndpZHRoIC8gY29udGVudFdpZHRoLCBib3guaGVpZ2h0IC8gY29udGVudEhlaWdodCk7XG4gIGNvbnN0IHdpZHRoID0gY29udGVudFdpZHRoICogc2NhbGU7XG4gIGNvbnN0IGhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKiBzY2FsZTtcbiAgcmV0dXJuIHtcbiAgICB4OiBib3gueCArIChib3gud2lkdGggLSB3aWR0aCkgLyAyLFxuICAgIHk6IGJveC55ICsgKGJveC5oZWlnaHQgLSBoZWlnaHQpIC8gMixcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRMb2NrSW1hZ2VBc3BlY3QoZmllbGQ6IGFueSwgdGVtcGxhdGU/OiBhbnkpOiBib29sZWFuIHtcbiAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdGb3JGaWVsZChmaWVsZEJpbmRpbmdzRnJvbSh0ZW1wbGF0ZSksIGZpZWxkPy5pZCk7XG4gIGlmICh0eXBlb2YgYmluZGluZz8ubG9ja0FzcGVjdFJhdGlvID09PSAnYm9vbGVhbicpIHJldHVybiBiaW5kaW5nLmxvY2tBc3BlY3RSYXRpbztcbiAgaWYgKHR5cGVvZiBmaWVsZD8uYXNwZWN0UmF0aW9Mb2NrID09PSAnYm9vbGVhbicpIHJldHVybiBmaWVsZC5hc3BlY3RSYXRpb0xvY2s7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCYWNrZ3JvdW5kRmlsbChvYmo6IHsgdHlwZT86IHN0cmluZyB9KTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmo/LnR5cGUgPT09ICdyZWN0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVsbEFydGJvYXJkRmlsbChcbiAgb2JqOiB7IHg/OiBudW1iZXI7IHk/OiBudW1iZXI7IHdpZHRoPzogbnVtYmVyOyBoZWlnaHQ/OiBudW1iZXIgfSxcbiAgYXJ0V2lkdGg6IG51bWJlcixcbiAgYXJ0SGVpZ2h0OiBudW1iZXIsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBOdW1iZXIob2JqLndpZHRoKSA+PSBhcnRXaWR0aCAqIDAuOVxuICAgICYmIE51bWJlcihvYmouaGVpZ2h0KSA+PSBhcnRIZWlnaHQgKiAwLjlcbiAgICAmJiBOdW1iZXIob2JqLngpIDw9IGFydFdpZHRoICogMC4wNVxuICAgICYmIE51bWJlcihvYmoueSkgPD0gYXJ0SGVpZ2h0ICogMC4wNVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVhc3VyZURyYWZ0VGV4dChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250U2l6ZSA9IDQ4LFxuICBmb250RmFtaWx5Pzogc3RyaW5nLFxuKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgY29uc3QgbGluZXMgPSBTdHJpbmcodGV4dCB8fCAnVGV4dCcpLnNwbGl0KCdcXG4nKTtcbiAgY29uc3Qgc2l6ZSA9IE1hdGgubWF4KDEyLCBOdW1iZXIoZm9udFNpemUpIHx8IDQ4KTtcbiAgbGV0IHdpZHRoID0gMDtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHguZm9udCA9IGAke3NpemV9cHggJHtjc3NGb250RmFtaWx5KGZvbnRGYW1pbHkpfWA7XG4gICAgICB3aWR0aCA9IE1hdGgubWF4KC4uLmxpbmVzLm1hcCgobGluZSkgPT4gY3R4Lm1lYXN1cmVUZXh0KGxpbmUgfHwgJyAnKS53aWR0aCksIDApO1xuICAgIH1cbiAgfVxuICBpZiAoISh3aWR0aCA+IDApKSB7XG4gICAgd2lkdGggPSBNYXRoLm1heCguLi5saW5lcy5tYXAoKGxpbmUpID0+IChsaW5lIHx8ICcgJykubGVuZ3RoKSwgMSkgKiBzaXplICogMC42MjtcbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoOiBNYXRoLmNlaWwod2lkdGggKyBzaXplICogMC4xNiksXG4gICAgaGVpZ2h0OiBNYXRoLmNlaWwoTWF0aC5tYXgoMSwgbGluZXMubGVuZ3RoKSAqIHNpemUgKiAxLjE1KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpdFRleHRCb3goXG4gIG9iajogUGljazxEcmFmdENhbnZhc09iamVjdCwgJ3gnIHwgJ3knIHwgJ3dpZHRoJyB8ICdoZWlnaHQnIHwgJ3RleHQnIHwgJ2ZvbnRTaXplJyB8ICdmb250RmFtaWx5Jz4sXG4pOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgY29uc3QgbWVhc3VyZWQgPSBtZWFzdXJlRHJhZnRUZXh0KG9iai50ZXh0IHx8ICdUZXh0Jywgb2JqLmZvbnRTaXplLCBvYmouZm9udEZhbWlseSk7XG4gIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMjQsIG1lYXN1cmVkLndpZHRoKTtcbiAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMjAsIG1lYXN1cmVkLmhlaWdodCk7XG4gIGNvbnN0IHByZXZXID0gTnVtYmVyKG9iai53aWR0aCkgPiAwID8gTnVtYmVyKG9iai53aWR0aCkgOiB3aWR0aDtcbiAgY29uc3QgcHJldkggPSBOdW1iZXIob2JqLmhlaWdodCkgPiAwID8gTnVtYmVyKG9iai5oZWlnaHQpIDogaGVpZ2h0O1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4OiAoTnVtYmVyKG9iai54KSB8fCAwKSArIChwcmV2VyAtIHdpZHRoKSAvIDIsXG4gICAgeTogKE51bWJlcihvYmoueSkgfHwgMCkgKyAocHJldkggLSBoZWlnaHQpIC8gMixcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGxhY2VtZW50Qm94ZXMoXG4gIHJvbGU6IERyYWZ0QXJ0d29ya1JvbGUsXG4gIGtpbmQ6IERyYWZ0Q2FudmFzT2JqZWN0VHlwZSxcbiAgdGVtcGxhdGU6IGFueSxcbik6IG51bWJlcltdW10ge1xuICBpZiAocm9sZSA9PT0gJ2JvZHlfY29sb3VyX2ZpbGwnIHx8IGtpbmQgPT09ICdyZWN0Jykge1xuICAgIGNvbnN0IGJvZHkgPSByZWdpb25zRm9yUm9sZSh0ZW1wbGF0ZT8uY3VzdG9taXNhdGlvbk1hcCwgJ2JvZHlfY29sb3VyX2ZpbGwnKTtcbiAgICBpZiAoYm9keS5sZW5ndGgpIHJldHVybiBib2R5O1xuICAgIGNvbnN0IHByaW50ID0gcmVnaW9uc0ZvclJvbGUodGVtcGxhdGU/LmN1c3RvbWlzYXRpb25NYXAsICdwcmludF9hcmVhJyk7XG4gICAgaWYgKHByaW50Lmxlbmd0aCkgcmV0dXJuIHByaW50O1xuICAgIHJldHVybiBbWzAsIDAsIDEsIDFdXTtcbiAgfVxuICBpZiAoa2luZCA9PT0gJ3RleHQnKSB7XG4gICAgY29uc3QgcGxhY2Vob2xkZXJzID0gcmVnaW9uc0ZvclJvbGUodGVtcGxhdGU/LmN1c3RvbWlzYXRpb25NYXAsICd0ZXh0X3BsYWNlaG9sZGVyJyk7XG4gICAgaWYgKHBsYWNlaG9sZGVycy5sZW5ndGgpIHJldHVybiBwbGFjZWhvbGRlcnM7XG4gICAgcmV0dXJuIHJlZ2lvbnNGb3JSb2xlKHRlbXBsYXRlPy5jdXN0b21pc2F0aW9uTWFwLCAncHJpbnRfYXJlYScpO1xuICB9XG4gIHJldHVybiByZWdpb25zRm9yUm9sZSh0ZW1wbGF0ZT8uY3VzdG9taXNhdGlvbk1hcCwgJ3ByaW50X2FyZWEnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRQbGFjZW1lbnQoXG4gIGtpbmQ6IERyYWZ0Q2FudmFzT2JqZWN0VHlwZSxcbiAgaW5kZXg6IG51bWJlcixcbiAgYXJ0V2lkdGg6IG51bWJlcixcbiAgYXJ0SGVpZ2h0OiBudW1iZXIsXG4pOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgY29uc3QgcGFkID0gTWF0aC5tYXgoMjQsIGFydFdpZHRoICogMC4wNCk7XG4gIGlmIChraW5kID09PSAnaW1hZ2UnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGFydFdpZHRoICogMC4yLFxuICAgICAgeTogYXJ0SGVpZ2h0ICogMC4yLFxuICAgICAgd2lkdGg6IGFydFdpZHRoICogMC42LFxuICAgICAgaGVpZ2h0OiBhcnRIZWlnaHQgKiAwLjYsXG4gICAgfTtcbiAgfVxuICBpZiAoa2luZCA9PT0gJ3JlY3QnKSB7XG4gICAgcmV0dXJuIHsgeDogMCwgeTogMCwgd2lkdGg6IGFydFdpZHRoLCBoZWlnaHQ6IGFydEhlaWdodCB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogcGFkLFxuICAgIHk6IHBhZCArIGluZGV4ICogTWF0aC5tYXgoNjQsIGFydEhlaWdodCAqIDAuMDgpLFxuICAgIHdpZHRoOiBhcnRXaWR0aCAtIHBhZCAqIDIsXG4gICAgaGVpZ2h0OiBNYXRoLm1heCg1NiwgYXJ0SGVpZ2h0ICogMC4wNyksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPYmplY3RJZCgpOiBzdHJpbmcge1xuICByZXR1cm4gYG9iai0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlZWRPclN5bmNDYW52YXMoXG4gIGV4aXN0aW5nOiBEcmFmdENhbnZhc1N0YXRlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdGVtcGxhdGU6IGFueSxcbiAgdmFyaWF0aW9uczogYW55W10sXG4pOiBEcmFmdENhbnZhc1N0YXRlIHtcbiAgY29uc3Qgd2lkdGggPSBOdW1iZXIodGVtcGxhdGU/LndpZHRoKSB8fCBERUZBVUxUX0FSVEJPQVJELndpZHRoO1xuICBjb25zdCBoZWlnaHQgPSBOdW1iZXIodGVtcGxhdGU/LmhlaWdodCkgfHwgREVGQVVMVF9BUlRCT0FSRC5oZWlnaHQ7XG4gIGNvbnN0IG9iamVjdHM6IERyYWZ0Q2FudmFzT2JqZWN0W10gPSAoZXhpc3Rpbmc/Lm9iamVjdHMgfHwgW10pLm1hcCgob2JqKSA9PiAoXG4gICAgb2JqLnR5cGUgPT09ICd0ZXh0JyA/IHsgLi4ub2JqLCAuLi5maXRUZXh0Qm94KG9iaikgfSA6IHsgLi4ub2JqIH1cbiAgKSk7XG4gIGNvbnN0IGRldGFjaGVkID0gbmV3IFNldChleGlzdGluZz8uZGV0YWNoZWRGaWVsZElkcyB8fCBbXSk7XG4gIGNvbnN0IGxpbmtlZCA9IGxpbmtlZFZhcmlhdGlvbnNGb3JUZW1wbGF0ZSh0ZW1wbGF0ZSwgdmFyaWF0aW9ucyk7XG4gIGNvbnN0IGxpbmtlZEZpZWxkcyA9IGxpbmtlZC5tYXAoKHZhcmlhdGlvbikgPT4gdmFyaWF0aW9uPy52YXJpYXRpb25GaWVsZCkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCB1c2VkUmVnaW9uczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgdmFyaWF0aW9uIG9mIGxpbmtlZCkge1xuICAgIGNvbnN0IGZpZWxkID0gdmFyaWF0aW9uPy52YXJpYXRpb25GaWVsZDtcbiAgICBpZiAocmVzb2x2ZUFydHdvcmtSb2xlKGZpZWxkLCB0ZW1wbGF0ZSwgbGlua2VkRmllbGRzKSAhPT0gJ3RleHRfZmlsbCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGluZGV4ID0gb2JqZWN0cy5maW5kSW5kZXgoXG4gICAgICAob2JqKSA9PiBvYmoubWVyY2hpRmllbGRJZCA9PT0gZmllbGQ/LmlkICYmIG9iai50eXBlID09PSAncmVjdCdcbiAgICApO1xuICAgIGlmIChpbmRleCA+PSAwKSBvYmplY3RzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICBjb25zdCBhcHBseUNvbG91clRvVGV4dCA9ICh0YXJnZXRGaWVsZElkOiBudW1iZXIgfCB1bmRlZmluZWQsIGZpbGw/OiBzdHJpbmcsIGNvbG91ckZpZWxkSWQ/OiBudW1iZXIpID0+IHtcbiAgICBpZiAoIWZpbGwgfHwgdGFyZ2V0RmllbGRJZCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdGV4dE9iaiA9IG9iamVjdHMuZmluZCgob2JqKSA9PiBvYmoubWVyY2hpRmllbGRJZCA9PT0gdGFyZ2V0RmllbGRJZCAmJiBvYmoudHlwZSA9PT0gJ3RleHQnKTtcbiAgICBpZiAoIXRleHRPYmopIHJldHVybiBmYWxzZTtcbiAgICB0ZXh0T2JqLmZpbGwgPSBmaWxsO1xuICAgIHRleHRPYmouY29sb3VyRmllbGRJZCA9IGNvbG91ckZpZWxkSWQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgcGxhY2VPYmplY3QgPSAoXG4gICAga2luZDogRHJhZnRDYW52YXNPYmplY3RUeXBlLFxuICAgIHJvbGU6IERyYWZ0QXJ0d29ya1JvbGUsXG4gICAgZmllbGQ6IGFueSxcbiAgICBmaWVsZElkOiBudW1iZXIsXG4gICAgY29udGVudDogUmV0dXJuVHlwZTx0eXBlb2YgdmFyaWF0aW9uQ2FudmFzQ29udGVudD4sXG4gICkgPT4ge1xuICAgIGNvbnN0IGJveGVzID0gcGxhY2VtZW50Qm94ZXMocm9sZSwga2luZCwgdGVtcGxhdGUpO1xuICAgIGNvbnN0IGtleSA9IGAke3JvbGV9OiR7a2luZH1gO1xuICAgIGNvbnN0IHJlZ2lvbkluZGV4ID0gdXNlZFJlZ2lvbnNba2V5XSB8fCAwO1xuICAgIHVzZWRSZWdpb25zW2tleV0gPSByZWdpb25JbmRleCArIDE7XG4gICAgY29uc3QgYm94ID0gYm94ZXNbcmVnaW9uSW5kZXhdIHx8IGJveGVzWzBdO1xuICAgIGNvbnN0IHBsYWNlID0gYm94XG4gICAgICA/IGJib3hUb1BpeGVscyhib3gsIHdpZHRoLCBoZWlnaHQpXG4gICAgICA6IGRlZmF1bHRQbGFjZW1lbnQoa2luZCwgb2JqZWN0cy5sZW5ndGgsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnN0IGxvY2tBc3BlY3RSYXRpbyA9IGtpbmQgPT09ICdpbWFnZScgPyBzaG91bGRMb2NrSW1hZ2VBc3BlY3QoZmllbGQsIHRlbXBsYXRlKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBuZXh0OiBEcmFmdENhbnZhc09iamVjdCA9IHtcbiAgICAgIGlkOiBjcmVhdGVPYmplY3RJZCgpLFxuICAgICAgdHlwZToga2luZCxcbiAgICAgIG1lcmNoaUZpZWxkSWQ6IGZpZWxkSWQsXG4gICAgICBhcnR3b3JrUm9sZTogcm9sZSxcbiAgICAgIGxvY2tlZDoga2luZCA9PT0gJ3JlY3QnLFxuICAgICAgcm90YXRpb246IDAsXG4gICAgICBzY2FsZVg6IDEsXG4gICAgICBzY2FsZVk6IDEsXG4gICAgICBsb2NrQXNwZWN0UmF0aW8sXG4gICAgICAuLi5wbGFjZSxcbiAgICAgIHRleHQ6IGNvbnRlbnQudGV4dCxcbiAgICAgIHNyYzogY29udGVudC5zcmMsXG4gICAgICBmaWxsOiBjb250ZW50LmZpbGwgfHwgKGtpbmQgPT09ICd0ZXh0JyA/ICcjMTExMTExJyA6IHVuZGVmaW5lZCksXG4gICAgICBmb250RmFtaWx5OiBraW5kID09PSAndGV4dCcgPyBERUZBVUxUX0RSQUZUX0ZPTlQgOiB1bmRlZmluZWQsXG4gICAgICBmb250U2l6ZTogTWF0aC5tYXgoMjgsIE1hdGgucm91bmQocGxhY2UuaGVpZ2h0ICogMC42MikpLFxuICAgIH07XG4gICAgaWYgKGtpbmQgPT09ICd0ZXh0JykgT2JqZWN0LmFzc2lnbihuZXh0LCBmaXRUZXh0Qm94KG5leHQpKTtcbiAgICBpZiAoa2luZCA9PT0gJ3JlY3QnKSBvYmplY3RzLnVuc2hpZnQobmV4dCk7XG4gICAgZWxzZSBvYmplY3RzLnB1c2gobmV4dCk7XG4gIH07XG5cbiAgZm9yIChjb25zdCB2YXJpYXRpb24gb2YgbGlua2VkKSB7XG4gICAgY29uc3QgZmllbGQgPSB2YXJpYXRpb24/LnZhcmlhdGlvbkZpZWxkO1xuICAgIGNvbnN0IGZpZWxkSWQgPSBmaWVsZD8uaWQ7XG4gICAgY29uc3QgY29udGVudCA9IHZhcmlhdGlvbkNhbnZhc0NvbnRlbnQodmFyaWF0aW9uKTtcbiAgICBpZiAoIWNvbnRlbnQua2luZCB8fCBmaWVsZElkID09IG51bGwgfHwgZGV0YWNoZWQuaGFzKGZpZWxkSWQpKSBjb250aW51ZTtcbiAgICBjb25zdCByb2xlID0gcmVzb2x2ZUFydHdvcmtSb2xlKGZpZWxkLCB0ZW1wbGF0ZSwgbGlua2VkRmllbGRzKTtcbiAgICBpZiAocm9sZSA9PT0gJ3RleHRfZmlsbCcpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZm91bmQgPSBvYmplY3RzLmZpbmQoKG9iaikgPT4gb2JqLm1lcmNoaUZpZWxkSWQgPT09IGZpZWxkSWQpO1xuICAgIGlmIChmb3VuZCkge1xuICAgICAgaWYgKGNvbnRlbnQua2luZCA9PT0gJ3RleHQnICYmIGNvbnRlbnQudGV4dCAhPSBudWxsKSB7XG4gICAgICAgIGZvdW5kLnRleHQgPSBjb250ZW50LnRleHQ7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZm91bmQsIGZpdFRleHRCb3goZm91bmQpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZW50LmtpbmQgPT09ICdpbWFnZScgJiYgY29udGVudC5zcmMpIGZvdW5kLnNyYyA9IGNvbnRlbnQuc3JjO1xuICAgICAgaWYgKGNvbnRlbnQua2luZCA9PT0gJ3JlY3QnICYmIGNvbnRlbnQuZmlsbCkgZm91bmQuZmlsbCA9IGNvbnRlbnQuZmlsbDtcbiAgICAgIGlmIChmb3VuZC50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgICAgIGZvdW5kLmxvY2tBc3BlY3RSYXRpbyA9IHNob3VsZExvY2tJbWFnZUFzcGVjdChmaWVsZCwgdGVtcGxhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKGZvdW5kLnR5cGUgPT09ICdyZWN0Jykge1xuICAgICAgICBmb3VuZC5sb2NrZWQgPSB0cnVlO1xuICAgICAgICBmb3VuZC5hcnR3b3JrUm9sZSA9IHJvbGU7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY29udGVudC5raW5kID09PSAndGV4dCcgJiYgIWNvbnRlbnQudGV4dCkgY29udGludWU7XG4gICAgaWYgKGNvbnRlbnQua2luZCA9PT0gJ2ltYWdlJyAmJiAhY29udGVudC5zcmMpIGNvbnRpbnVlO1xuICAgIGlmIChjb250ZW50LmtpbmQgPT09ICdyZWN0JyAmJiAhY29udGVudC5maWxsKSBjb250aW51ZTtcbiAgICBwbGFjZU9iamVjdChjb250ZW50LmtpbmQsIHJvbGUsIGZpZWxkLCBmaWVsZElkLCBjb250ZW50KTtcbiAgfVxuXG4gIGZvciAoY29uc3QgdmFyaWF0aW9uIG9mIGxpbmtlZCkge1xuICAgIGNvbnN0IGZpZWxkID0gdmFyaWF0aW9uPy52YXJpYXRpb25GaWVsZDtcbiAgICBjb25zdCBmaWVsZElkID0gZmllbGQ/LmlkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSB2YXJpYXRpb25DYW52YXNDb250ZW50KHZhcmlhdGlvbik7XG4gICAgaWYgKGZpZWxkSWQgPT0gbnVsbCB8fCBkZXRhY2hlZC5oYXMoZmllbGRJZCkgfHwgIWNvbnRlbnQuZmlsbCkgY29udGludWU7XG4gICAgY29uc3Qgcm9sZSA9IHJlc29sdmVBcnR3b3JrUm9sZShmaWVsZCwgdGVtcGxhdGUsIGxpbmtlZEZpZWxkcyk7XG4gICAgaWYgKHJvbGUgIT09ICd0ZXh0X2ZpbGwnKSBjb250aW51ZTtcbiAgICBjb25zdCB0YXJnZXRJZCA9IGluZmVyVGV4dFRhcmdldEZpZWxkSWQoZmllbGQsIHRlbXBsYXRlLCBsaW5rZWRGaWVsZHMpO1xuICAgIGFwcGx5Q29sb3VyVG9UZXh0KHRhcmdldElkLCBjb250ZW50LmZpbGwsIGZpZWxkSWQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgb2JqZWN0cyxcbiAgICBkZXRhY2hlZEZpZWxkSWRzOiBBcnJheS5mcm9tKGRldGFjaGVkKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGFjaEZpZWxkKFxuICBzdGF0ZTogRHJhZnRDYW52YXNTdGF0ZSxcbiAgb2JqZWN0SWQ6IHN0cmluZyxcbik6IERyYWZ0Q2FudmFzU3RhdGUge1xuICBjb25zdCB0YXJnZXQgPSBzdGF0ZS5vYmplY3RzLmZpbmQoKG9iaikgPT4gb2JqLmlkID09PSBvYmplY3RJZCk7XG4gIGNvbnN0IGRldGFjaGVkRmllbGRJZHMgPSBbLi4uKHN0YXRlLmRldGFjaGVkRmllbGRJZHMgfHwgW10pXTtcbiAgaWYgKHRhcmdldD8ubWVyY2hpRmllbGRJZCAhPSBudWxsICYmICFkZXRhY2hlZEZpZWxkSWRzLmluY2x1ZGVzKHRhcmdldC5tZXJjaGlGaWVsZElkKSkge1xuICAgIGRldGFjaGVkRmllbGRJZHMucHVzaCh0YXJnZXQubWVyY2hpRmllbGRJZCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBvYmplY3RzOiBzdGF0ZS5vYmplY3RzLmZpbHRlcigob2JqKSA9PiBvYmouaWQgIT09IG9iamVjdElkKSxcbiAgICBkZXRhY2hlZEZpZWxkSWRzLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRBcmVhR3VpZGVzKHRlbXBsYXRlOiBhbnkpOiBBcnJheTx7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn0+IHtcbiAgY29uc3Qgd2lkdGggPSBOdW1iZXIodGVtcGxhdGU/LndpZHRoKSB8fCBERUZBVUxUX0FSVEJPQVJELndpZHRoO1xuICBjb25zdCBoZWlnaHQgPSBOdW1iZXIodGVtcGxhdGU/LmhlaWdodCkgfHwgREVGQVVMVF9BUlRCT0FSRC5oZWlnaHQ7XG4gIHJldHVybiByZWdpb25zRm9yUm9sZSh0ZW1wbGF0ZT8uY3VzdG9taXNhdGlvbk1hcCwgJ3ByaW50X2FyZWEnKS5tYXAoKGJib3gpID0+XG4gICAgYmJveFRvUGl4ZWxzKGJib3gsIHdpZHRoLCBoZWlnaHQpXG4gICk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FDRUEsaUJBQWlCLEVBQ2pCQyxnQkFBZ0IsRUFNaEJDLFNBQVMsUUFDSixTQUFTO0FBQ2hCLFNBQVNDLGtCQUFrQixFQUFFQyxhQUFhLFFBQVEsY0FBYztBQUNoRSxTQUFTQyxnQkFBZ0IsUUFBUSxZQUFZO0FBRTdDLE9BQU8sU0FBU0Msd0JBQXdCQSxDQUFDQyxPQUFZLEVBQVc7RUFDOUQsT0FBT0MsS0FBSyxDQUFDQyxPQUFPLENBQUNGLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFRyxjQUFjLENB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QUFRO0VBQ3ZDLENBQUM7QUFDSDtBQUVBLE9BQU8sU0FBU3VDLFdBQVdBLENBQ3pCQyxLQUF1QixFQUN2QkMsUUFBZ0IsRUFDRTtFQUNsQixJQUFNQyxNQUFNLEdBQUdGLEtBQUssQ0FBQ3pDLE9BQU8sQ0FBQy9ILElBQUksQ0FBQyxVQUFDeUYsR0FBRztJQUFBLE9BQUtBLEdBQUcsQ0FBQzVJLEVBQUUsS0FBSzROLFFBQVE7RUFBQSxFQUFDO0VBQy9ELElBQU14QyxnQkFBZ0IsR0FBQWxLLGtCQUFBLENBQVF5TSxLQUFLLENBQUN2QyxnQkFBZ0IsSUFBSSxFQUFFLENBQUU7RUFDNUQsSUFBSSxDQUFBeUMsTUFBTSxhQUFOQSxNQUFNLHVCQUFOQSxNQUFNLENBQUVsQyxhQUFhLEtBQUksSUFBSSxJQUFJLENBQUNQLGdCQUFnQixDQUFDMEMsUUFBUSxDQUFDRCxNQUFNLENBQUNsQyxhQUFhLENBQUMsRUFBRTtJQUNyRlAsZ0JBQWdCLENBQUM0QixJQUFJLENBQUNhLE1BQU0sQ0FBQ2xDLGFBQWEsQ0FBQztFQUM3QztFQUNBLE9BQUF0RCxhQUFBLENBQUFBLGFBQUEsS0FDS3NGLEtBQUs7SUFDUnpDLE9BQU8sRUFBRXlDLEtBQUssQ0FBQ3pDLE9BQU8sQ0FBQ2hNLE1BQU0sQ0FBQyxVQUFDMEosR0FBRztNQUFBLE9BQUtBLEdBQUcsQ0FBQzVJLEVBQUUsS0FBSzROLFFBQVE7SUFBQSxFQUFDO0lBQzNEeEMsZ0JBQWdCLEVBQWhCQTtFQUFnQjtBQUVwQjtBQUVBLE9BQU8sU0FBUzJDLGVBQWVBLENBQUN6TixRQUFhLEVBSzFDO0VBQ0QsSUFBTW9CLEtBQUssR0FBR0QsTUFBTSxDQUFDbkIsUUFBUSxhQUFSQSxRQUFRLHVCQUFSQSxRQUFRLENBQUVvQixLQUFLLENBQUMsSUFBSXJFLGdCQUFnQixDQUFDcUUsS0FBSztFQUMvRCxJQUFNRSxNQUFNLEdBQUdILE1BQU0sQ0FBQ25CLFFBQVEsYUFBUkEsUUFBUSx1QkFBUkEsUUFBUSxDQUFFc0IsTUFBTSxDQUFDLElBQUl2RSxnQkFBZ0IsQ0FBQ3VFLE1BQU07RUFDbEUsT0FBT3lFLGNBQWMsQ0FBQy9GLFFBQVEsYUFBUkEsUUFBUSx1QkFBUkEsUUFBUSxDQUFFZ0csZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUN4SCxHQUFHLENBQUMsVUFBQytHLElBQUk7SUFBQSxPQUN2RWEsWUFBWSxDQUFDYixJQUFJLEVBQUVuRSxLQUFLLEVBQUVFLE1BQU0sQ0FBQztFQUFBLENBQ25DLENBQUM7QUFDSCIsImlnbm9yZUxpc3QiOltdfQ==